[
  {
    "path": ".gitignore",
    "content": "*.VC.db\n*.VC.opendb\n*.sdf\n*.pdb\n*.ilk\n*.iobj\n*.ipdb\n*.swp\nunity_decoder/Debug/\n/Debug/\n/Debug/string_literal.txt\n/Debug/global-metadata.dat\n/Debug/global-metadata.dat-ios\n/Debug/global-metadata.dat-win\n/Debug/method_name.txt\n/unity_decoder/global-metadata.dat\nunity_decoder/Release/\n.vs/\nco.sh\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "README.md",
    "content": "# unity_metadata_loader\n\nThis project will load strings and method/class names in global-metadata.dat to IDA.\n\n## Introduction\n\nAs most game hackers may know, if you use IL2CPP to compile an Unity game, all the strings used in your original source code will be stored separately in another file call `global-metadata.dat` so that you are not able to find any strings when you load the game binary to IDA. Moreover, as the game is compiled to native assembly, all the symbols like class names or function names are removed from the binary. This significantly makes the static analysis of these games more difficult and is usually considered to be un-hackable. However, with this IDA plugin, you are able to recover all the class names, method names and string constants and mapping them to IDA. Hacking unity games becomes incredibly easy.\n\nPlease refer to these two blogs for detailed information:\n\n[还原使用IL2CPP编译的unity游戏的symbol（一）](https://www.nevermoe.com/?p=572)\n\n[还原使用IL2CPP编译的unity游戏的symbol（二 ）](https://www.nevermoe.com/?p=597)\n\n\n## Installation & Usage\n\n**It's difficult to make a stable auto load funcition, so instead, I provide two helper function `LocateMethodPointers()` and `LocateStringLiterals()` to help you locate the address of g_MethodPointers and g_MetadataUsages. But you have to decide by yourself which adresses are the true addresses from the provided candidate**\n\n1. Copy Release/unity_decoder.exe to the same directory as your binary to be analyzed.\n2. Copy unity_loader.py to any directory. (I recommned to copy it to the same directory as your binary to be analyzed.)\n3. Copy global-metadata.dat to the same directory as your binary to be analyzed. It's located in Data/Managed/Metadata/global-metadata.dat in the ipa file or apk file.\n4. Double click `unity_decoder.exe` and you will get two files: `method_name.txt` and `string_literal.txt` \n5. Load unity_loader.py using File->Script File.\n6. Enter `LocateMethodPointers()` in IDA console. This function will give you several possible candidate location of method pointers like this:\n```\ncandidate: 0x6f00b0, candidate end: 0x6f1fd4, method numbers: 1993\ncandidate: 0x70ae4c, candidate end: 0x70b224, method numbers: 246\ncandidate: 0x70bee8, candidate end: 0x717e60, method numbers: 12254\n```\nOpen the `method_name.txt` file generated at step 4, the first line is the method pointers' numbers. Find the closest number to the suggested candidate. Sometimes the method pointers are seperated to multiple candidates, then you have to add them up.\n  \n7. Navigate to the candidate address you believe to be the true address and enter `LoadMethods()` in IDA console.\n\n8. To Load string literals, similar to loading method pointers, enter `LocateStringLiterals()` and then `LoadStringLiterals()`.\n\n## Demo\n\nNote: The v24's binary layout is different to the following picture.\n\nBefore recovering the symbols:\n![before](https://www.nevermoe.com/wp-content/uploads/2016/09/before.png)\n\nAfter recovering the symbols:\n![after](https://www.nevermoe.com/wp-content/uploads/2016/09/after.png)\n\n## Notice\n\nNow you are able to compile this project directly because I added libil2cpp header files.\n\nThis branch \"v24\" now only support 32bit Android build.\n\nFor metadata v23 support, see this fork: [https://github.com/kenjiaiko/unity_metadata_loader](https://github.com/kenjiaiko/unity_metadata_loader)\n"
  },
  {
    "path": "unity_decoder/core.h",
    "content": "#pragma once\n\n#include <cstdint>\n\n"
  },
  {
    "path": "unity_decoder/libil2cpp/CMakeLists.txt",
    "content": "#This CMake project file for libil2cpp only exists as a convenience for working on the .cpp and .h files\n#for people who like to use CLion as their IDE. this is not used by il2cpp itself\ncmake_minimum_required(VERSION 3.4)\nproject(libil2cpp)\n\nfile(GLOB_RECURSE LIBIL2CPP_FILES {PROJECT_SOURCE_DIR} *.cpp *.h)\nset(BOEHMGC_FILES \"../external/boehmgc/extra/gc.c\")\ninclude_directories(\".\" \"../external/boehmgc/include\")\nadd_library(libil2cpp ${LIBIL2CPP_FILES} ${BOEHMGC_FILES})\n"
  },
  {
    "path": "unity_decoder/libil2cpp/UnityAdsStubs.cpp",
    "content": "#if defined(__ANDROID__)\n\n#include <cstddef>\n\n#define DONTSTRIP __attribute__((used))\n#define EXPORT __attribute__((visibility(\"default\")))\n\nextern \"C\"\n{\ntypedef void (*UnityAdsReadyCallback)(const char * placementId);\ntypedef void (*UnityAdsDidErrorCallback)(long rawError, const char * message);\ntypedef void (*UnityAdsDidStartCallback)(const char * placementId);\ntypedef void (*UnityAdsDidFinishCallback)(const char * placementId, long rawFinishState);\n\nEXPORT DONTSTRIP void UnityAdsEngineInitialize(const char * gameId, bool testMode) {}\nEXPORT DONTSTRIP void UnityAdsEngineShow(const char * placementId) {}\nEXPORT DONTSTRIP bool UnityAdsEngineGetDebugMode() { return false; }\nEXPORT DONTSTRIP void UnityAdsEngineSetDebugMode(bool debugMode) {}\nEXPORT DONTSTRIP bool UnityAdsEngineIsSupported() { return false; }\nEXPORT DONTSTRIP bool UnityAdsEngineIsReady(const char * placementId) { return false; }\nEXPORT DONTSTRIP long UnityAdsEngineGetPlacementState(const char * placementId) { return -1; }\nEXPORT DONTSTRIP const char * UnityAdsEngineGetVersion() { return NULL; }\nEXPORT DONTSTRIP bool UnityAdsEngineIsInitialized() { return false; }\nEXPORT DONTSTRIP void UnityAdsEngineSetMetaData(const char * category, const char * data) {}\nEXPORT DONTSTRIP void UnityAdsEngineSetReadyCallback(UnityAdsReadyCallback callback) {}\nEXPORT DONTSTRIP void UnityAdsEngineSetDidErrorCallback(UnityAdsDidErrorCallback callback) {}\nEXPORT DONTSTRIP void UnityAdsEngineSetDidStartCallback(UnityAdsDidStartCallback callback) {}\nEXPORT DONTSTRIP void UnityAdsEngineSetDidFinishCallback(UnityAdsDidFinishCallback callback) {}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/blob.h",
    "content": "#pragma once\n\n// Corresponds to element type signatures\n// See ECMA-335, II.23.1.16\n\nenum Il2CppTypeEnum\n{\n    IL2CPP_TYPE_END        = 0x00,       /* End of List */\n    IL2CPP_TYPE_VOID       = 0x01,\n    IL2CPP_TYPE_BOOLEAN    = 0x02,\n    IL2CPP_TYPE_CHAR       = 0x03,\n    IL2CPP_TYPE_I1         = 0x04,\n    IL2CPP_TYPE_U1         = 0x05,\n    IL2CPP_TYPE_I2         = 0x06,\n    IL2CPP_TYPE_U2         = 0x07,\n    IL2CPP_TYPE_I4         = 0x08,\n    IL2CPP_TYPE_U4         = 0x09,\n    IL2CPP_TYPE_I8         = 0x0a,\n    IL2CPP_TYPE_U8         = 0x0b,\n    IL2CPP_TYPE_R4         = 0x0c,\n    IL2CPP_TYPE_R8         = 0x0d,\n    IL2CPP_TYPE_STRING     = 0x0e,\n    IL2CPP_TYPE_PTR        = 0x0f,       /* arg: <type> token */\n    IL2CPP_TYPE_BYREF      = 0x10,       /* arg: <type> token */\n    IL2CPP_TYPE_VALUETYPE  = 0x11,       /* arg: <type> token */\n    IL2CPP_TYPE_CLASS      = 0x12,       /* arg: <type> token */\n    IL2CPP_TYPE_VAR        = 0x13,       /* Generic parameter in a generic type definition, represented as number (compressed unsigned integer) number */\n    IL2CPP_TYPE_ARRAY      = 0x14,       /* type, rank, boundsCount, bound1, loCount, lo1 */\n    IL2CPP_TYPE_GENERICINST = 0x15,     /* <type> <type-arg-count> <type-1> \\x{2026} <type-n> */\n    IL2CPP_TYPE_TYPEDBYREF = 0x16,\n    IL2CPP_TYPE_I          = 0x18,\n    IL2CPP_TYPE_U          = 0x19,\n    IL2CPP_TYPE_FNPTR      = 0x1b,        /* arg: full method signature */\n    IL2CPP_TYPE_OBJECT     = 0x1c,\n    IL2CPP_TYPE_SZARRAY    = 0x1d,       /* 0-based one-dim-array */\n    IL2CPP_TYPE_MVAR       = 0x1e,       /* Generic parameter in a generic method definition, represented as number (compressed unsigned integer)  */\n    IL2CPP_TYPE_CMOD_REQD  = 0x1f,       /* arg: typedef or typeref token */\n    IL2CPP_TYPE_CMOD_OPT   = 0x20,       /* optional arg: typedef or typref token */\n    IL2CPP_TYPE_INTERNAL   = 0x21,       /* CLR internal type */\n\n    IL2CPP_TYPE_MODIFIER   = 0x40,       /* Or with the following types */\n    IL2CPP_TYPE_SENTINEL   = 0x41,       /* Sentinel for varargs method signature */\n    IL2CPP_TYPE_PINNED     = 0x45,       /* Local var that points to pinned object */\n\n    IL2CPP_TYPE_ENUM       = 0x55        /* an enumeration */\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/char-conversions.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"char-conversions.h\"\n\nuint8_t const CategoryData_v4[] =\n{\n    /* Page 0, 0 indirect uses */\n    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n    11, 24, 24, 24, 26, 24, 24, 24, 20, 21, 24, 25, 24, 19, 24, 24,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 24, 24, 25, 25, 25, 24,\n    24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 24, 21, 27, 18,\n    27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 25, 21, 25, 14,\n    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n    11, 24, 26, 26, 26, 26, 28, 28, 27, 28, 1, 22, 25, 19, 28, 27,\n    28, 25, 10, 10, 27, 1, 28, 24, 27, 10, 1, 23, 10, 10, 10, 24,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 25, 1, 1, 1, 1, 1, 1, 1, 1,\n    /* Page 1, 0 indirect uses */\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0,\n    1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1,\n    1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0,\n    0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0,\n    0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0,\n    1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 4, 0, 1, 1, 1,\n    4, 4, 4, 4, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 0,\n    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    1, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,\n    /* Page 2, 0 indirect uses */\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1,\n    1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 27, 27, 27, 27, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,\n    3, 3, 3, 3, 3, 27, 27, 27, 27, 27, 27, 27, 3, 27, 3, 27,\n    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,\n    /* Page 3, 0 indirect uses */\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    0, 1, 0, 1, 3, 27, 0, 1, 29, 29, 3, 1, 1, 1, 24, 29,\n    29, 29, 29, 29, 27, 27, 0, 24, 0, 0, 0, 29, 0, 29, 0, 0,\n    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,\n    1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    1, 1, 1, 1, 0, 1, 25, 0, 1, 0, 0, 1, 1, 0, 0, 0,\n    /* Page 4, 0 indirect uses */\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 28, 5, 5, 5, 5, 5, 7, 7, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    /* Page 5, 0 indirect uses */\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 29, 29, 3, 24, 24, 24, 24, 24, 24,\n    29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 29, 24, 19, 29, 29, 29, 29, 29,\n    29, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 19, 5,\n    24, 5, 5, 24, 5, 5, 24, 5, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29,\n    4, 4, 4, 24, 24, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 6, 0 indirect uses */\n    15, 15, 15, 15, 29, 29, 25, 25, 25, 24, 24, 26, 24, 24, 28, 28,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 24, 29, 29, 24, 24,\n    29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 29,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 24, 24, 24, 24, 4, 4,\n    5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 24, 4, 5, 5, 5, 5, 5, 5, 5, 15, 7, 5,\n    5, 5, 5, 5, 5, 3, 3, 5, 5, 28, 5, 5, 5, 5, 4, 4,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 28, 28, 4,\n    /* Page 7, 0 indirect uses */\n    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 29, 15,\n    4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 29, 29, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 3, 3, 28, 24, 24, 24, 3, 29, 29, 29, 29, 29,\n    /*\n     * Page 8, 3390 indirect uses:\n     *  10500-107FF (astral_index),\n     *  10B00-11FFF (astral_index),\n     *  12500-1CFFF (astral_index),\n     *  1D800-1EFFF (astral_index),\n     *  1F100-1FFFF (astral_index),\n     *  2A700-2F7FF (astral_index),\n     *  2FB00-DFFFF (astral_index),\n     *  E0200-EFFFF (astral_index)\n     */\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 9, 0 indirect uses */\n    29, 5, 5, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 5, 4, 6, 6,\n    6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 29, 29,\n    4, 5, 5, 5, 5, 29, 29, 29, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 5, 5, 24, 24, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    24, 3, 4, 29, 29, 29, 29, 29, 29, 29, 29, 4, 4, 4, 4, 4,\n    29, 5, 6, 6, 29, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 4,\n    4, 29, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4,\n    4, 29, 4, 29, 29, 29, 4, 4, 4, 4, 29, 29, 5, 4, 6, 6,\n    6, 5, 5, 5, 5, 29, 29, 6, 6, 29, 29, 6, 6, 5, 4, 29,\n    29, 29, 29, 29, 29, 29, 29, 6, 29, 29, 29, 29, 4, 4, 29, 4,\n    4, 4, 5, 5, 29, 29, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    4, 4, 26, 26, 10, 10, 10, 10, 10, 10, 28, 29, 29, 29, 29, 29,\n    /* Page 10, 0 indirect uses */\n    29, 5, 5, 6, 29, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 4,\n    4, 29, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4,\n    4, 29, 4, 4, 29, 4, 4, 29, 4, 4, 29, 29, 5, 29, 6, 6,\n    6, 5, 5, 29, 29, 29, 29, 5, 5, 29, 29, 5, 5, 5, 29, 29,\n    29, 5, 29, 29, 29, 29, 29, 29, 29, 4, 4, 4, 4, 29, 4, 29,\n    29, 29, 29, 29, 29, 29, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    5, 5, 4, 4, 4, 5, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 5, 5, 6, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4,\n    4, 4, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4,\n    4, 29, 4, 4, 29, 4, 4, 4, 4, 4, 29, 29, 5, 4, 6, 6,\n    6, 5, 5, 5, 5, 5, 29, 5, 5, 6, 29, 6, 6, 5, 29, 29,\n    4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 5, 5, 29, 29, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    29, 26, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 11, 0 indirect uses */\n    29, 5, 6, 6, 29, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 4,\n    4, 29, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4,\n    4, 29, 4, 4, 29, 4, 4, 4, 4, 4, 29, 29, 5, 4, 6, 5,\n    6, 5, 5, 5, 5, 29, 29, 6, 6, 29, 29, 6, 6, 5, 29, 29,\n    29, 29, 29, 29, 29, 29, 5, 6, 29, 29, 29, 29, 4, 4, 29, 4,\n    4, 4, 5, 5, 29, 29, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    28, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 5, 4, 29, 4, 4, 4, 4, 4, 4, 29, 29, 29, 4, 4,\n    4, 29, 4, 4, 4, 4, 29, 29, 29, 4, 4, 29, 4, 29, 4, 4,\n    29, 29, 29, 4, 4, 29, 29, 29, 4, 4, 4, 29, 29, 29, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 6, 6,\n    5, 6, 6, 29, 29, 29, 6, 6, 6, 29, 6, 6, 6, 5, 29, 29,\n    4, 29, 29, 29, 29, 29, 29, 6, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    10, 10, 10, 28, 28, 28, 28, 28, 28, 26, 28, 29, 29, 29, 29, 29,\n    /* Page 12, 0 indirect uses */\n    29, 6, 6, 6, 29, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4,\n    4, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 29, 29, 29, 4, 5, 5,\n    5, 6, 6, 6, 6, 29, 5, 5, 5, 29, 5, 5, 5, 5, 29, 29,\n    29, 29, 29, 29, 29, 5, 5, 29, 4, 4, 29, 29, 29, 29, 29, 29,\n    4, 4, 5, 5, 29, 29, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    29, 29, 29, 29, 29, 29, 29, 29, 10, 10, 10, 10, 10, 10, 10, 28,\n    29, 29, 6, 6, 29, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4,\n    4, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 29, 29, 5, 4, 6, 5,\n    6, 6, 6, 6, 6, 29, 5, 6, 6, 29, 6, 6, 5, 5, 29, 29,\n    29, 29, 29, 29, 29, 6, 6, 29, 29, 29, 29, 29, 29, 29, 4, 29,\n    4, 4, 5, 5, 29, 29, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    29, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 13, 0 indirect uses */\n    29, 29, 6, 6, 29, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4,\n    4, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 4, 6, 6,\n    6, 5, 5, 5, 5, 29, 6, 6, 6, 29, 6, 6, 6, 5, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 6, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 5, 5, 29, 29, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    10, 10, 10, 10, 10, 10, 29, 29, 29, 28, 4, 4, 4, 4, 4, 4,\n    29, 29, 6, 6, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 5, 29, 29, 29, 29, 6,\n    6, 6, 5, 5, 5, 29, 5, 29, 6, 6, 6, 6, 6, 6, 6, 6,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 6, 6, 24, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 14, 0 indirect uses */\n    29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 5, 4, 4, 5, 5, 5, 5, 5, 5, 5, 29, 29, 29, 29, 26,\n    4, 4, 4, 4, 4, 4, 3, 5, 5, 5, 5, 5, 5, 5, 5, 24,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 24, 24, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 4, 4, 29, 4, 29, 29, 4, 4, 29, 4, 29, 29, 4, 29, 29,\n    29, 29, 29, 29, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4, 4,\n    29, 4, 4, 4, 29, 4, 29, 4, 29, 29, 4, 4, 29, 4, 4, 4,\n    4, 5, 4, 4, 5, 5, 5, 5, 5, 5, 29, 5, 5, 4, 29, 29,\n    4, 4, 4, 4, 4, 29, 3, 29, 5, 5, 5, 5, 5, 5, 29, 29,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 29, 29, 4, 4, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 15, 0 indirect uses */\n    4, 28, 28, 28, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n    24, 24, 24, 28, 28, 28, 28, 28, 5, 5, 28, 28, 28, 28, 28, 28,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 28, 5, 28, 5, 28, 5, 20, 21, 20, 21, 6, 6,\n    4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29,\n    29, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,\n    5, 5, 5, 5, 5, 24, 5, 5, 4, 4, 4, 4, 29, 29, 29, 29,\n    5, 5, 5, 5, 5, 5, 5, 5, 29, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 29, 28, 28,\n    28, 28, 28, 28, 28, 28, 5, 28, 28, 28, 28, 28, 28, 29, 28, 28,\n    24, 24, 24, 24, 24, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 16, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 5, 5, 5,\n    5, 6, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 6, 5, 5, 4,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 24, 24, 24, 24, 24, 24,\n    4, 4, 4, 4, 4, 4, 6, 6, 5, 5, 4, 4, 4, 4, 5, 5,\n    5, 4, 6, 6, 6, 4, 4, 6, 6, 6, 6, 6, 6, 6, 4, 4,\n    4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 5, 6, 6, 5, 5, 6, 6, 6, 6, 6, 6, 5, 4, 6,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 29, 29, 29, 29, 28, 28,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24, 3, 29, 29, 29,\n    /* Page 17, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 29, 29, 29, 29, 29, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29,\n    /* Page 18, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 29, 4, 29, 4, 4, 4, 4, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 29, 4, 4, 4, 4, 29, 29, 4, 4, 4, 4, 4, 4, 4, 29,\n    4, 29, 4, 4, 4, 4, 29, 29, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 19, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 29, 4, 4, 4, 4, 29, 29, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 5,\n    28, 24, 24, 24, 24, 24, 24, 24, 24, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 20, 0 indirect uses */\n    29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /*\n     * Page 21, 171 indirect uses:\n     *  12000-122FF (astral_index),\n     *  20000-2A5FF (astral_index),\n     *  2F800-2F9FF (astral_index)\n     */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 22, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24, 24, 4,\n    4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    11, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 20, 21, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24, 24, 24, 9, 9,\n    9, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 23, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4,\n    4, 4, 5, 5, 5, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 5, 5, 5, 24, 24, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 5, 5, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4,\n    4, 29, 5, 5, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 15, 15, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6,\n    6, 6, 6, 6, 6, 6, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 24, 24, 24, 3, 24, 24, 24, 26, 4, 5, 29, 29,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 29, 29, 29, 29, 29, 29,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 29, 29, 29, 29, 29, 29,\n    /* Page 24, 0 indirect uses */\n    24, 24, 24, 24, 24, 24, 19, 24, 24, 24, 24, 5, 5, 5, 11, 29,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 25, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29,\n    5, 5, 5, 6, 6, 6, 6, 5, 5, 6, 6, 6, 29, 29, 29, 29,\n    6, 6, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 29, 29, 29, 29,\n    28, 29, 29, 29, 24, 24, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29,\n    4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29,\n    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n    6, 4, 4, 4, 4, 4, 4, 4, 6, 6, 29, 29, 29, 29, 29, 29,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 29, 29, 29, 29, 24, 24,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    /* Page 26, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 29, 29, 24, 24,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 27, 0 indirect uses */\n    5, 5, 5, 5, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 5, 6, 5, 5, 5, 5, 5, 6, 5, 6, 6, 6,\n    6, 6, 5, 6, 6, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 24, 24, 24, 24, 24, 24,\n    24, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29,\n    5, 5, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 6, 5, 5, 5, 5, 6, 6, 5, 5, 6, 29, 29, 29, 4, 4,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 28, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5,\n    5, 5, 5, 5, 6, 6, 5, 5, 29, 29, 29, 24, 24, 24, 24, 24,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 29, 29, 29, 4, 4, 4,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 24, 24,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 29, 0 indirect uses */\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 5, 5,\n    /* Page 30, 0 indirect uses */\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    /* Page 31, 0 indirect uses */\n    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\n    1, 1, 1, 1, 1, 1, 29, 29, 0, 0, 0, 0, 0, 0, 29, 29,\n    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\n    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\n    1, 1, 1, 1, 1, 1, 29, 29, 0, 0, 0, 0, 0, 0, 29, 29,\n    1, 1, 1, 1, 1, 1, 1, 1, 29, 0, 29, 0, 29, 0, 29, 0,\n    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 29, 29,\n    1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,\n    1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,\n    1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,\n    1, 1, 1, 1, 1, 29, 1, 1, 0, 0, 0, 0, 2, 27, 1, 27,\n    27, 27, 1, 1, 1, 29, 1, 1, 0, 0, 0, 0, 2, 27, 27, 27,\n    1, 1, 1, 1, 29, 29, 1, 1, 0, 0, 0, 0, 29, 27, 27, 27,\n    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 27, 27, 27,\n    29, 29, 1, 1, 1, 29, 1, 1, 0, 0, 0, 0, 2, 27, 27, 29,\n    /* Page 32, 0 indirect uses */\n    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 15, 15, 15, 15, 15,\n    19, 19, 19, 19, 19, 19, 24, 24, 22, 23, 20, 22, 22, 23, 20, 22,\n    24, 24, 24, 24, 24, 24, 24, 24, 12, 13, 15, 15, 15, 15, 15, 11,\n    24, 24, 24, 24, 24, 24, 24, 24, 24, 22, 23, 24, 24, 24, 24, 18,\n    18, 24, 24, 24, 25, 20, 21, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n    24, 24, 25, 24, 18, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 11,\n    15, 15, 15, 15, 15, 29, 29, 29, 29, 29, 15, 15, 15, 15, 15, 15,\n    10, 1, 29, 29, 10, 10, 10, 10, 10, 10, 25, 25, 25, 20, 21, 1,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 25, 25, 25, 20, 21, 29,\n    3, 3, 3, 3, 3, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,\n    26, 26, 26, 26, 26, 26, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7,\n    7, 5, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 33, 0 indirect uses */\n    28, 28, 0, 28, 28, 28, 28, 0, 28, 28, 1, 0, 0, 0, 1, 1,\n    0, 0, 0, 1, 28, 0, 28, 28, 28, 0, 0, 0, 0, 0, 28, 28,\n    28, 28, 28, 28, 0, 28, 0, 28, 0, 28, 0, 0, 0, 0, 28, 1,\n    0, 0, 0, 0, 1, 4, 4, 4, 4, 1, 28, 28, 1, 1, 0, 0,\n    25, 25, 25, 25, 25, 0, 1, 1, 1, 1, 28, 25, 28, 28, 1, 28,\n    29, 29, 29, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n    9, 9, 9, 0, 1, 9, 9, 9, 9, 29, 29, 29, 29, 29, 29, 29,\n    25, 25, 25, 25, 25, 28, 28, 28, 28, 28, 25, 25, 28, 28, 28, 28,\n    25, 28, 28, 25, 28, 28, 25, 28, 28, 28, 28, 28, 28, 28, 25, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 25, 25,\n    28, 28, 25, 28, 25, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    /* Page 34, 0 indirect uses */\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    /* Page 35, 0 indirect uses */\n    28, 28, 28, 28, 28, 28, 28, 28, 25, 25, 25, 25, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    25, 25, 28, 28, 28, 28, 28, 28, 28, 20, 21, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 25, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 25, 25, 25, 25,\n    25, 25, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 36, 0 indirect uses */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    /* Page 37, 0 indirect uses */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 25, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 25, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 25, 25, 25, 25, 25, 25, 25, 25,\n    /* Page 38, 0 indirect uses */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 25,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29,\n    28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 39, 0 indirect uses */\n    29, 28, 28, 28, 28, 29, 28, 28, 28, 28, 29, 29, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 29, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 28, 29, 28,\n    28, 28, 28, 29, 29, 29, 28, 29, 28, 28, 28, 28, 28, 28, 28, 29,\n    29, 28, 28, 28, 28, 28, 28, 28, 20, 21, 20, 21, 20, 21, 20, 21,\n    20, 21, 20, 21, 20, 21, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 28, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    29, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29,\n    25, 25, 25, 25, 25, 20, 21, 25, 25, 25, 25, 29, 25, 29, 29, 29,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 20, 21, 20, 21, 20, 21, 20, 21, 20, 21,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    /* Page 40, 0 indirect uses */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    /* Page 41, 0 indirect uses */\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 20, 21, 20, 21, 20, 21, 20, 21, 20, 21, 20, 21, 20,\n    21, 20, 21, 20, 21, 20, 21, 20, 21, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 20, 21, 20, 21, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 21, 25, 25,\n    /* Page 42, 0 indirect uses */\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    /* Page 43, 0 indirect uses */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 28, 28, 25, 25, 25, 25, 25, 25, 29, 29, 29,\n    28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 44, 0 indirect uses */\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 29,\n    0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0,\n    29, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 3, 29, 29,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 1, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 24, 24, 24, 24, 10, 24, 24,\n    /* Page 45, 0 indirect uses */\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 3,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4, 4, 29,\n    4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4, 4, 29,\n    4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4, 4, 29,\n    4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4, 4, 29,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    /* Page 46, 0 indirect uses */\n    24, 24, 22, 23, 22, 23, 24, 24, 24, 22, 23, 24, 22, 23, 24, 24,\n    24, 24, 24, 24, 24, 24, 24, 19, 24, 24, 19, 24, 22, 23, 24, 24,\n    22, 23, 20, 21, 20, 21, 20, 21, 20, 21, 24, 24, 24, 24, 24, 3,\n    24, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 47, 0 indirect uses */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29,\n    /* Page 48, 0 indirect uses */\n    11, 24, 24, 24, 28, 3, 4, 9, 20, 21, 20, 21, 20, 21, 20, 21,\n    20, 21, 28, 28, 20, 21, 20, 21, 20, 21, 20, 21, 19, 20, 21, 21,\n    28, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5,\n    19, 3, 3, 3, 3, 3, 28, 28, 9, 9, 9, 3, 4, 24, 28, 28,\n    29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 29, 29, 5, 5, 27, 27, 3, 3, 4,\n    19, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24, 3, 3, 3, 4,\n    /* Page 49, 0 indirect uses */\n    29, 29, 29, 29, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29,\n    29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29,\n    28, 28, 10, 10, 10, 10, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 50, 0 indirect uses */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    28, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29,\n    /* Page 51, 0 indirect uses */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    /* Page 52, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 53, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 54, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 55, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 56, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 57, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 58, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 59, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 60, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 61, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 62, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 63, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 64, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 65, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 66, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 67, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 68, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 69, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 70, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 71, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 72, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 73, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 74, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 75, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 76, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 77, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    /* Page 78, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 79, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 80, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 81, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 82, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 83, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 84, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 85, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 86, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 87, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 88, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 89, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 90, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 91, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 92, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 93, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 94, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 95, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 96, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 97, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 98, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 99, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 100, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 101, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 102, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 103, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 104, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 105, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 106, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 107, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 108, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 109, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 110, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 111, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 112, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 113, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 114, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 115, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 116, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 117, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 118, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 119, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 120, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 121, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 122, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 123, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 124, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 125, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 126, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 127, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 128, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 129, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 130, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 131, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 132, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 133, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 134, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 135, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 136, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 137, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 138, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 139, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 140, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 141, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 142, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 143, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 144, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 145, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 146, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 147, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 148, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 149, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 150, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 151, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 152, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 153, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 154, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 155, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 156, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 157, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 158, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 159, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 160, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 161, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 162, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 163, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 164, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 165, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 166, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 24, 24, 24,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    29, 29, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 4, 5,\n    7, 7, 7, 24, 29, 29, 29, 29, 29, 29, 29, 29, 5, 5, 24, 3,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 167, 0 indirect uses */\n    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,\n    27, 27, 27, 27, 27, 27, 27, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    27, 27, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n    3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1,\n    0, 1, 0, 1, 0, 1, 0, 1, 3, 27, 27, 0, 1, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 4, 4, 4, 4, 4,\n    /* Page 168, 0 indirect uses */\n    4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 5, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 6, 6, 5, 5, 6, 28, 28, 28, 28, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 24, 24, 24, 24, 29, 29, 29, 29, 29, 29, 29, 29,\n    6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n    6, 6, 6, 6, 5, 29, 29, 29, 29, 29, 29, 29, 29, 29, 24, 24,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 169, 0 indirect uses */\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 24, 24,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 6, 6, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 24,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 170, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6,\n    6, 5, 5, 6, 6, 5, 5, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 29, 29,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 29, 29, 24, 24, 24, 24,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 171, 0 indirect uses */\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 172, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 173, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 174, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 175, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 176, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 177, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 178, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 179, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 180, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 181, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 182, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 183, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 184, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 185, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 186, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 187, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 188, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 189, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 190, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 191, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 192, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 193, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 194, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 195, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 196, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 197, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 198, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 199, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 200, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 201, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 202, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 203, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 204, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 205, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 206, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 207, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 208, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 209, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 210, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 211, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 212, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 213, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 214, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 215, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 216, 0 indirect uses */\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    /* Page 217, 0 indirect uses */\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    /* Page 218, 0 indirect uses */\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    /* Page 219, 0 indirect uses */\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    /* Page 220, 0 indirect uses */\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    /* Page 221, 0 indirect uses */\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    /* Page 222, 0 indirect uses */\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    /* Page 223, 0 indirect uses */\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    /*\n     * Page 224, 510 indirect uses:\n     *  F0000-FFEFF (astral_index),\n     *  100000-10FEFF (astral_index)\n     */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 225, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 226, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 227, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 228, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 229, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 230, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 231, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 232, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 233, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 234, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 235, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 236, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 237, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 238, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 239, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 240, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 241, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 242, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 243, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 244, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 245, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 246, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 247, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 248, 0 indirect uses */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    /* Page 249, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 250, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 251, 0 indirect uses */\n    1, 1, 1, 1, 1, 1, 1, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 1, 1, 1, 1, 1, 29, 29, 29, 29, 29, 4, 5, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 25, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 29, 4, 29,\n    4, 4, 29, 4, 4, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 252, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    /* Page 253, 0 indirect uses */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 20, 21,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    29, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 26, 28, 29, 29,\n    /* Page 254, 0 indirect uses */\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    24, 24, 24, 24, 24, 24, 24, 20, 21, 24, 29, 29, 29, 29, 29, 29,\n    5, 5, 5, 5, 5, 5, 5, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    24, 19, 19, 18, 18, 20, 21, 20, 21, 20, 21, 20, 21, 20, 21, 20,\n    21, 20, 21, 20, 21, 24, 24, 20, 21, 24, 24, 24, 24, 18, 18, 18,\n    24, 24, 24, 29, 24, 24, 24, 24, 19, 20, 21, 20, 21, 20, 21, 24,\n    24, 24, 25, 19, 25, 25, 25, 29, 24, 26, 24, 24, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 15,\n    /* Page 255, 0 indirect uses */\n    29, 24, 24, 24, 26, 24, 24, 24, 20, 21, 24, 25, 24, 19, 24, 24,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 24, 24, 25, 25, 25, 24,\n    24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 24, 21, 27, 18,\n    27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 25, 21, 25, 20,\n    21, 24, 20, 21, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29,\n    29, 29, 4, 4, 4, 4, 4, 4, 29, 29, 4, 4, 4, 4, 4, 4,\n    29, 29, 4, 4, 4, 4, 4, 4, 29, 29, 4, 4, 4, 29, 29, 29,\n    26, 26, 25, 27, 28, 26, 26, 29, 28, 25, 25, 25, 25, 28, 28, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 15, 15, 15, 28, 28, 29, 29,\n    /* Page 256, 1 indirect use: 10000-100FF (astral_index) */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 4, 4, 29, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29,\n    /* Page 257, 1 indirect use: 10100-101FF (astral_index) */\n    24, 24, 28, 29, 29, 29, 29, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n    9, 9, 9, 9, 9, 10, 10, 10, 10, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 10, 29, 29, 29, 29, 29,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 5, 29, 29,\n    /* Page 258, 1 indirect use: 10200-102FF (astral_index) */\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 259, 1 indirect use: 10300-103FF (astral_index) */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29,\n    10, 10, 10, 10, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 9, 4, 4, 4, 4, 4, 4, 4, 4, 9, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 24,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 29, 29, 29, 29, 4, 4, 4, 4, 4, 4, 4, 4,\n    24, 9, 9, 9, 9, 9, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 260, 1 indirect use: 10400-104FF (astral_index) */\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 261, 1 indirect use: 10800-108FF (astral_index) */\n    4, 4, 4, 4, 4, 4, 29, 29, 4, 29, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 29, 4, 4, 29, 29, 29, 4, 29, 29, 4,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 262, 1 indirect use: 10900-109FF (astral_index) */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 29, 29, 29, 29, 29, 24,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 24,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 263, 1 indirect use: 10A00-10AFF (astral_index) */\n    4, 5, 5, 5, 29, 5, 5, 29, 29, 29, 29, 29, 5, 5, 5, 5,\n    4, 4, 4, 4, 29, 4, 4, 4, 29, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 29, 29, 29, 29, 5, 5, 5, 29, 29, 29, 29, 5,\n    10, 10, 10, 10, 10, 10, 10, 10, 29, 29, 29, 29, 29, 29, 29, 29,\n    24, 24, 24, 24, 24, 24, 24, 24, 24, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 264, 1 indirect use: 12300-123FF (astral_index) */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 265, 1 indirect use: 12400-124FF (astral_index) */\n    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n    9, 9, 9, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    24, 24, 24, 24, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 266, 1 indirect use: 1D000-1D0FF (astral_index) */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 267, 1 indirect use: 1D100-1D1FF (astral_index) */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 29, 29, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 6, 6, 5, 5, 5, 28, 28, 28, 6, 6, 6,\n    6, 6, 6, 15, 15, 15, 15, 15, 15, 15, 15, 5, 5, 5, 5, 5,\n    5, 5, 5, 28, 28, 5, 5, 5, 5, 5, 5, 5, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 5, 5, 5, 5, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 268, 1 indirect use: 1D200-1D2FF (astral_index) */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 5, 5, 5, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 269, 1 indirect use: 1D300-1D3FF (astral_index) */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 270, 1 indirect use: 1D400-1D4FF (astral_index) */\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,\n    1, 1, 1, 1, 1, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 29, 0, 0,\n    29, 29, 0, 29, 29, 0, 0, 29, 29, 0, 0, 0, 0, 29, 0, 0,\n    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 29, 1, 29, 1, 1, 1,\n    1, 1, 1, 1, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    /* Page 271, 1 indirect use: 1D500-1D5FF (astral_index) */\n    1, 1, 1, 1, 0, 0, 29, 0, 0, 0, 0, 29, 29, 0, 0, 0,\n    0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 29, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 29, 0, 0, 0, 0, 29,\n    0, 0, 0, 0, 0, 29, 0, 29, 29, 29, 0, 0, 0, 0, 0, 0,\n    0, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    /* Page 272, 1 indirect use: 1D600-1D6FF (astral_index) */\n    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 29, 29, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 25, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 1, 1, 1, 1,\n    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 1, 1, 1, 1,\n    /* Page 273, 1 indirect use: 1D700-1D7FF (astral_index) */\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 25, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 25, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25,\n    1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 1, 1, 1, 1, 1, 1,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 25, 1, 1, 1, 1, 1, 1, 0, 1, 29, 29, 8, 8,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n    /* Page 274, 1 indirect use: 1F000-1F0FF (astral_index) */\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 275, 1 indirect use: 2A600-2A6FF (astral_index) */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 276, 1 indirect use: 2FA00-2FAFF (astral_index) */\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 277, 1 indirect use: E0000-E00FF (astral_index) */\n    29, 15, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /* Page 278, 1 indirect use: E0100-E01FF (astral_index) */\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    /*\n     * Page 279, 2 indirect uses:\n     *  FFF00-FFFFF (astral_index),\n     *  10FF00-10FFFF (astral_index)\n     */\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 29, 29\n};\n\nconst uint8_t NumericData[] =\n{\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1,\n    2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 3, 57, 57, 57, 57, 57, 1, 57, 57, 44, 33, 45, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 1, 2,\n    3, 4, 57, 16, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 1, 2, 3,\n    4, 5, 6, 7, 8, 9, 10, 28, 30, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7,\n    8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 33, 34, 35, 36, 37, 38, 39, 40, 41, 56, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 21, 22, 23, 24, 25, 26, 27, 28, 32, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 17, 18, 19, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 0, 57, 57, 57, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 42, 43, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 1, 1, 2, 3, 4, 5, 6,\n    7, 8, 9, 10, 11, 12, 23, 28, 29, 30, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 23, 28, 29, 30, 30, 31, 32, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,\n    19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    0, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 1, 2, 3, 4, 5, 6, 7, 8, 9, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 10, 20, 21, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 1, 2, 3, 4, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,\n    57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\n};\n\nconst double NumericDataValues[] =\n{\n    0,  1,   2,  3,  4,  5,  6,  7,  8,  9,\n    10, 11, 12, 13, 14, 15, 16, 17, 18, 19,\n    20, 30, 40, 50, 60, 70, 80, 90, 100, 500,\n    1000, 5000, 10000, 1 / 2, 3 / 2, 5 / 2, 7 / 2, 9 / 2, 11 / 2, 13 / 2,\n    15 / 2, 17 / 2, 1 / 3, 2 / 3, 1 / 4, 3 / 4, 1 / 5, 2 / 5, 3 / 5, 4 / 5,\n    1 / 6, 5 / 6, 1 / 8, 3 / 8, 5 / 8, 7 / 8, -1 / 2, -1\n};\n\nconst Il2CppChar ToLowerDataLow[] =\n{\n    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,\n    50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92, 93, 94, 95, 96, 97, 98, 99,\n    100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,\n    150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 224, 225, 226, 227, 228, 229, 230, 231,\n    232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 215, 248, 249, 250, 251, 252, 253, 254, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249,\n    250, 251, 252, 253, 254, 255, 257, 257, 259, 259, 261, 261, 263, 263, 265, 265, 267, 267, 269, 269, 271, 271, 273, 273, 275, 275, 277, 277, 279, 279, 281, 281, 283, 283, 285, 285, 287, 287, 289, 289, 291, 291, 293, 293, 295, 295, 297, 297, 299, 299,\n    301, 301, 303, 303, 304, 305, 307, 307, 309, 309, 311, 311, 312, 314, 314, 316, 316, 318, 318, 320, 320, 322, 322, 324, 324, 326, 326, 328, 328, 329, 331, 331, 333, 333, 335, 335, 337, 337, 339, 339, 341, 341, 343, 343, 345, 345, 347, 347, 349, 349,\n    351, 351, 353, 353, 355, 355, 357, 357, 359, 359, 361, 361, 363, 363, 365, 365, 367, 367, 369, 369, 371, 371, 373, 373, 375, 375, 255, 378, 378, 380, 380, 382, 382, 383, 384, 595, 387, 387, 389, 389, 596, 392, 392, 598, 599, 396, 396, 397, 477, 601,\n    603, 402, 402, 608, 611, 405, 617, 616, 409, 409, 410, 411, 623, 626, 414, 629, 417, 417, 419, 419, 421, 421, 422, 424, 424, 643, 426, 427, 429, 429, 648, 432, 432, 650, 651, 436, 436, 438, 438, 658, 441, 441, 442, 443, 445, 445, 446, 447, 448, 449,\n    450, 451, 454, 453, 454, 457, 456, 457, 460, 459, 460, 462, 462, 464, 464, 466, 466, 468, 468, 470, 470, 472, 472, 474, 474, 476, 476, 477, 479, 479, 481, 481, 483, 483, 485, 485, 487, 487, 489, 489, 491, 491, 493, 493, 495, 495, 496, 499, 498, 499,\n    501, 501, 502, 503, 504, 505, 507, 507, 509, 509, 511, 511, 513, 513, 515, 515, 517, 517, 519, 519, 521, 521, 523, 523, 525, 525, 527, 527, 529, 529, 531, 531, 533, 533, 535, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549,\n    550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599,\n    600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649,\n    650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699,\n    700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749,\n    750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799,\n    800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849,\n    850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899,\n    900, 901, 940, 903, 941, 942, 943, 907, 972, 909, 973, 974, 912, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 930, 963, 964, 965, 966, 967, 968, 969, 970, 971, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949,\n    950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 995, 995, 997, 997, 999, 999,\n    1001, 1001, 1003, 1003, 1005, 1005, 1007, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1037, 1118, 1119, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081,\n    1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099,\n    1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1121, 1121, 1123, 1123, 1125, 1125, 1127, 1127, 1129, 1129, 1131, 1131, 1133, 1133, 1135, 1135, 1137, 1137, 1139, 1139, 1141, 1141, 1143, 1143, 1145, 1145, 1147, 1147, 1149, 1149,\n    1151, 1151, 1153, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1169, 1169, 1171, 1171, 1173, 1173, 1175, 1175, 1177, 1177, 1179, 1179, 1181, 1181, 1183, 1183, 1185, 1185, 1187, 1187, 1189, 1189, 1191, 1191, 1193, 1193, 1195, 1195, 1197, 1197, 1199, 1199,\n    1201, 1201, 1203, 1203, 1205, 1205, 1207, 1207, 1209, 1209, 1211, 1211, 1213, 1213, 1215, 1215, 1216, 1218, 1218, 1220, 1220, 1221, 1222, 1224, 1224, 1225, 1226, 1228, 1228, 1229, 1230, 1231, 1233, 1233, 1235, 1235, 1237, 1237, 1239, 1239, 1241, 1241, 1243, 1243, 1245, 1245, 1247, 1247, 1249, 1249,\n    1251, 1251, 1253, 1253, 1255, 1255, 1257, 1257, 1259, 1259, 1260, 1261, 1263, 1263, 1265, 1265, 1267, 1267, 1269, 1269, 1270, 1271, 1273, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299,\n    1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397,\n    1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399,\n    1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449,\n    1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499,\n    1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549,\n    1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599,\n    1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649,\n    1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699,\n    1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749,\n    1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799,\n    1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849,\n    1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899,\n    1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949,\n    1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049,\n    2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099,\n    2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149,\n    2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199,\n    2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249,\n    2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299,\n    2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349,\n    2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399,\n    2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449,\n    2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499,\n    2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549,\n    2550, 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599,\n    2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649,\n    2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699,\n    2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749,\n    2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799,\n    2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849,\n    2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899,\n    2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949,\n    2950, 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999,\n    3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049,\n    3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, 3097, 3098, 3099,\n    3100, 3101, 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, 3145, 3146, 3147, 3148, 3149,\n    3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, 3199,\n    3200, 3201, 3202, 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, 3249,\n    3250, 3251, 3252, 3253, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299,\n    3300, 3301, 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349,\n    3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399,\n    3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, 3439, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449,\n    3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, 3499,\n    3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549,\n    3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599,\n    3600, 3601, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649,\n    3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, 3699,\n    3700, 3701, 3702, 3703, 3704, 3705, 3706, 3707, 3708, 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, 3717, 3718, 3719, 3720, 3721, 3722, 3723, 3724, 3725, 3726, 3727, 3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, 3748, 3749,\n    3750, 3751, 3752, 3753, 3754, 3755, 3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763, 3764, 3765, 3766, 3767, 3768, 3769, 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3783, 3784, 3785, 3786, 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799,\n    3800, 3801, 3802, 3803, 3804, 3805, 3806, 3807, 3808, 3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, 3828, 3829, 3830, 3831, 3832, 3833, 3834, 3835, 3836, 3837, 3838, 3839, 3840, 3841, 3842, 3843, 3844, 3845, 3846, 3847, 3848, 3849,\n    3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3859, 3860, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882, 3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890, 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, 3899,\n    3900, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3909, 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949,\n    3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, 3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 3999,\n    4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013, 4014, 4015, 4016, 4017, 4018, 4019, 4020, 4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, 4049,\n    4050, 4051, 4052, 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, 4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085, 4086, 4087, 4088, 4089, 4090, 4091, 4092, 4093, 4094, 4095, 4096, 4097, 4098, 4099,\n    4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110, 4111, 4112, 4113, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149,\n    4150, 4151, 4152, 4153, 4154, 4155, 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4175, 4176, 4177, 4178, 4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186, 4187, 4188, 4189, 4190, 4191, 4192, 4193, 4194, 4195, 4196, 4197, 4198, 4199,\n    4200, 4201, 4202, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4210, 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218, 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, 4240, 4241, 4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249,\n    4250, 4251, 4252, 4253, 4254, 4255, 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4294, 4295, 4296, 4297, 4298, 4299,\n    4300, 4301, 4302, 4303, 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349,\n    4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, 4380, 4381, 4382, 4383, 4384, 4385, 4386, 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, 4398, 4399,\n    4400, 4401, 4402, 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444, 4445, 4446, 4447, 4448, 4449,\n    4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489, 4490, 4491, 4492, 4493, 4494, 4495, 4496, 4497, 4498, 4499,\n    4500, 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4519, 4520, 4521, 4522, 4523, 4524, 4525, 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, 4535, 4536, 4537, 4538, 4539, 4540, 4541, 4542, 4543, 4544, 4545, 4546, 4547, 4548, 4549,\n    4550, 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, 4568, 4569, 4570, 4571, 4572, 4573, 4574, 4575, 4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591, 4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599,\n    4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639, 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647, 4648, 4649,\n    4650, 4651, 4652, 4653, 4654, 4655, 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, 4664, 4665, 4666, 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674, 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695, 4696, 4697, 4698, 4699,\n    4700, 4701, 4702, 4703, 4704, 4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, 4714, 4715, 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, 4724, 4725, 4726, 4727, 4728, 4729, 4730, 4731, 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739, 4740, 4741, 4742, 4743, 4744, 4745, 4746, 4747, 4748, 4749,\n    4750, 4751, 4752, 4753, 4754, 4755, 4756, 4757, 4758, 4759, 4760, 4761, 4762, 4763, 4764, 4765, 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, 4783, 4784, 4785, 4786, 4787, 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, 4799,\n    4800, 4801, 4802, 4803, 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827, 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835, 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, 4844, 4845, 4846, 4847, 4848, 4849,\n    4850, 4851, 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859, 4860, 4861, 4862, 4863, 4864, 4865, 4866, 4867, 4868, 4869, 4870, 4871, 4872, 4873, 4874, 4875, 4876, 4877, 4878, 4879, 4880, 4881, 4882, 4883, 4884, 4885, 4886, 4887, 4888, 4889, 4890, 4891, 4892, 4893, 4894, 4895, 4896, 4897, 4898, 4899,\n    4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, 4923, 4924, 4925, 4926, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4936, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, 4948, 4949,\n    4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984, 4985, 4986, 4987, 4988, 4989, 4990, 4991, 4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999,\n    5000, 5001, 5002, 5003, 5004, 5005, 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5020, 5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028, 5029, 5030, 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042, 5043, 5044, 5045, 5046, 5047, 5048, 5049,\n    5050, 5051, 5052, 5053, 5054, 5055, 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5074, 5075, 5076, 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099,\n    5100, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, 5113, 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5129, 5130, 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 5140, 5141, 5142, 5143, 5144, 5145, 5146, 5147, 5148, 5149,\n    5150, 5151, 5152, 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160, 5161, 5162, 5163, 5164, 5165, 5166, 5167, 5168, 5169, 5170, 5171, 5172, 5173, 5174, 5175, 5176, 5177, 5178, 5179, 5180, 5181, 5182, 5183, 5184, 5185, 5186, 5187, 5188, 5189, 5190, 5191, 5192, 5193, 5194, 5195, 5196, 5197, 5198, 5199,\n    5200, 5201, 5202, 5203, 5204, 5205, 5206, 5207, 5208, 5209, 5210, 5211, 5212, 5213, 5214, 5215, 5216, 5217, 5218, 5219, 5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227, 5228, 5229, 5230, 5231, 5232, 5233, 5234, 5235, 5236, 5237, 5238, 5239, 5240, 5241, 5242, 5243, 5244, 5245, 5246, 5247, 5248, 5249,\n    5250, 5251, 5252, 5253, 5254, 5255, 5256, 5257, 5258, 5259, 5260, 5261, 5262, 5263, 5264, 5265, 5266, 5267, 5268, 5269, 5270, 5271, 5272, 5273, 5274, 5275, 5276, 5277, 5278, 5279, 5280, 5281, 5282, 5283, 5284, 5285, 5286, 5287, 5288, 5289, 5290, 5291, 5292, 5293, 5294, 5295, 5296, 5297, 5298, 5299,\n    5300, 5301, 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, 5312, 5313, 5314, 5315, 5316, 5317, 5318, 5319, 5320, 5321, 5322, 5323, 5324, 5325, 5326, 5327, 5328, 5329, 5330, 5331, 5332, 5333, 5334, 5335, 5336, 5337, 5338, 5339, 5340, 5341, 5342, 5343, 5344, 5345, 5346, 5347, 5348, 5349,\n    5350, 5351, 5352, 5353, 5354, 5355, 5356, 5357, 5358, 5359, 5360, 5361, 5362, 5363, 5364, 5365, 5366, 5367, 5368, 5369, 5370, 5371, 5372, 5373, 5374, 5375, 5376, 5377, 5378, 5379, 5380, 5381, 5382, 5383, 5384, 5385, 5386, 5387, 5388, 5389, 5390, 5391, 5392, 5393, 5394, 5395, 5396, 5397, 5398, 5399,\n    5400, 5401, 5402, 5403, 5404, 5405, 5406, 5407, 5408, 5409, 5410, 5411, 5412, 5413, 5414, 5415, 5416, 5417, 5418, 5419, 5420, 5421, 5422, 5423, 5424, 5425, 5426, 5427, 5428, 5429, 5430, 5431, 5432, 5433, 5434, 5435, 5436, 5437, 5438, 5439, 5440, 5441, 5442, 5443, 5444, 5445, 5446, 5447, 5448, 5449,\n    5450, 5451, 5452, 5453, 5454, 5455, 5456, 5457, 5458, 5459, 5460, 5461, 5462, 5463, 5464, 5465, 5466, 5467, 5468, 5469, 5470, 5471, 5472, 5473, 5474, 5475, 5476, 5477, 5478, 5479, 5480, 5481, 5482, 5483, 5484, 5485, 5486, 5487, 5488, 5489, 5490, 5491, 5492, 5493, 5494, 5495, 5496, 5497, 5498, 5499,\n    5500, 5501, 5502, 5503, 5504, 5505, 5506, 5507, 5508, 5509, 5510, 5511, 5512, 5513, 5514, 5515, 5516, 5517, 5518, 5519, 5520, 5521, 5522, 5523, 5524, 5525, 5526, 5527, 5528, 5529, 5530, 5531, 5532, 5533, 5534, 5535, 5536, 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544, 5545, 5546, 5547, 5548, 5549,\n    5550, 5551, 5552, 5553, 5554, 5555, 5556, 5557, 5558, 5559, 5560, 5561, 5562, 5563, 5564, 5565, 5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573, 5574, 5575, 5576, 5577, 5578, 5579, 5580, 5581, 5582, 5583, 5584, 5585, 5586, 5587, 5588, 5589, 5590, 5591, 5592, 5593, 5594, 5595, 5596, 5597, 5598, 5599,\n    5600, 5601, 5602, 5603, 5604, 5605, 5606, 5607, 5608, 5609, 5610, 5611, 5612, 5613, 5614, 5615, 5616, 5617, 5618, 5619, 5620, 5621, 5622, 5623, 5624, 5625, 5626, 5627, 5628, 5629, 5630, 5631, 5632, 5633, 5634, 5635, 5636, 5637, 5638, 5639, 5640, 5641, 5642, 5643, 5644, 5645, 5646, 5647, 5648, 5649,\n    5650, 5651, 5652, 5653, 5654, 5655, 5656, 5657, 5658, 5659, 5660, 5661, 5662, 5663, 5664, 5665, 5666, 5667, 5668, 5669, 5670, 5671, 5672, 5673, 5674, 5675, 5676, 5677, 5678, 5679, 5680, 5681, 5682, 5683, 5684, 5685, 5686, 5687, 5688, 5689, 5690, 5691, 5692, 5693, 5694, 5695, 5696, 5697, 5698, 5699,\n    5700, 5701, 5702, 5703, 5704, 5705, 5706, 5707, 5708, 5709, 5710, 5711, 5712, 5713, 5714, 5715, 5716, 5717, 5718, 5719, 5720, 5721, 5722, 5723, 5724, 5725, 5726, 5727, 5728, 5729, 5730, 5731, 5732, 5733, 5734, 5735, 5736, 5737, 5738, 5739, 5740, 5741, 5742, 5743, 5744, 5745, 5746, 5747, 5748, 5749,\n    5750, 5751, 5752, 5753, 5754, 5755, 5756, 5757, 5758, 5759, 5760, 5761, 5762, 5763, 5764, 5765, 5766, 5767, 5768, 5769, 5770, 5771, 5772, 5773, 5774, 5775, 5776, 5777, 5778, 5779, 5780, 5781, 5782, 5783, 5784, 5785, 5786, 5787, 5788, 5789, 5790, 5791, 5792, 5793, 5794, 5795, 5796, 5797, 5798, 5799,\n    5800, 5801, 5802, 5803, 5804, 5805, 5806, 5807, 5808, 5809, 5810, 5811, 5812, 5813, 5814, 5815, 5816, 5817, 5818, 5819, 5820, 5821, 5822, 5823, 5824, 5825, 5826, 5827, 5828, 5829, 5830, 5831, 5832, 5833, 5834, 5835, 5836, 5837, 5838, 5839, 5840, 5841, 5842, 5843, 5844, 5845, 5846, 5847, 5848, 5849,\n    5850, 5851, 5852, 5853, 5854, 5855, 5856, 5857, 5858, 5859, 5860, 5861, 5862, 5863, 5864, 5865, 5866, 5867, 5868, 5869, 5870, 5871, 5872, 5873, 5874, 5875, 5876, 5877, 5878, 5879, 5880, 5881, 5882, 5883, 5884, 5885, 5886, 5887, 5888, 5889, 5890, 5891, 5892, 5893, 5894, 5895, 5896, 5897, 5898, 5899,\n    5900, 5901, 5902, 5903, 5904, 5905, 5906, 5907, 5908, 5909, 5910, 5911, 5912, 5913, 5914, 5915, 5916, 5917, 5918, 5919, 5920, 5921, 5922, 5923, 5924, 5925, 5926, 5927, 5928, 5929, 5930, 5931, 5932, 5933, 5934, 5935, 5936, 5937, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 5945, 5946, 5947, 5948, 5949,\n    5950, 5951, 5952, 5953, 5954, 5955, 5956, 5957, 5958, 5959, 5960, 5961, 5962, 5963, 5964, 5965, 5966, 5967, 5968, 5969, 5970, 5971, 5972, 5973, 5974, 5975, 5976, 5977, 5978, 5979, 5980, 5981, 5982, 5983, 5984, 5985, 5986, 5987, 5988, 5989, 5990, 5991, 5992, 5993, 5994, 5995, 5996, 5997, 5998, 5999,\n    6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007, 6008, 6009, 6010, 6011, 6012, 6013, 6014, 6015, 6016, 6017, 6018, 6019, 6020, 6021, 6022, 6023, 6024, 6025, 6026, 6027, 6028, 6029, 6030, 6031, 6032, 6033, 6034, 6035, 6036, 6037, 6038, 6039, 6040, 6041, 6042, 6043, 6044, 6045, 6046, 6047, 6048, 6049,\n    6050, 6051, 6052, 6053, 6054, 6055, 6056, 6057, 6058, 6059, 6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069, 6070, 6071, 6072, 6073, 6074, 6075, 6076, 6077, 6078, 6079, 6080, 6081, 6082, 6083, 6084, 6085, 6086, 6087, 6088, 6089, 6090, 6091, 6092, 6093, 6094, 6095, 6096, 6097, 6098, 6099,\n    6100, 6101, 6102, 6103, 6104, 6105, 6106, 6107, 6108, 6109, 6110, 6111, 6112, 6113, 6114, 6115, 6116, 6117, 6118, 6119, 6120, 6121, 6122, 6123, 6124, 6125, 6126, 6127, 6128, 6129, 6130, 6131, 6132, 6133, 6134, 6135, 6136, 6137, 6138, 6139, 6140, 6141, 6142, 6143, 6144, 6145, 6146, 6147, 6148, 6149,\n    6150, 6151, 6152, 6153, 6154, 6155, 6156, 6157, 6158, 6159, 6160, 6161, 6162, 6163, 6164, 6165, 6166, 6167, 6168, 6169, 6170, 6171, 6172, 6173, 6174, 6175, 6176, 6177, 6178, 6179, 6180, 6181, 6182, 6183, 6184, 6185, 6186, 6187, 6188, 6189, 6190, 6191, 6192, 6193, 6194, 6195, 6196, 6197, 6198, 6199,\n    6200, 6201, 6202, 6203, 6204, 6205, 6206, 6207, 6208, 6209, 6210, 6211, 6212, 6213, 6214, 6215, 6216, 6217, 6218, 6219, 6220, 6221, 6222, 6223, 6224, 6225, 6226, 6227, 6228, 6229, 6230, 6231, 6232, 6233, 6234, 6235, 6236, 6237, 6238, 6239, 6240, 6241, 6242, 6243, 6244, 6245, 6246, 6247, 6248, 6249,\n    6250, 6251, 6252, 6253, 6254, 6255, 6256, 6257, 6258, 6259, 6260, 6261, 6262, 6263, 6264, 6265, 6266, 6267, 6268, 6269, 6270, 6271, 6272, 6273, 6274, 6275, 6276, 6277, 6278, 6279, 6280, 6281, 6282, 6283, 6284, 6285, 6286, 6287, 6288, 6289, 6290, 6291, 6292, 6293, 6294, 6295, 6296, 6297, 6298, 6299,\n    6300, 6301, 6302, 6303, 6304, 6305, 6306, 6307, 6308, 6309, 6310, 6311, 6312, 6313, 6314, 6315, 6316, 6317, 6318, 6319, 6320, 6321, 6322, 6323, 6324, 6325, 6326, 6327, 6328, 6329, 6330, 6331, 6332, 6333, 6334, 6335, 6336, 6337, 6338, 6339, 6340, 6341, 6342, 6343, 6344, 6345, 6346, 6347, 6348, 6349,\n    6350, 6351, 6352, 6353, 6354, 6355, 6356, 6357, 6358, 6359, 6360, 6361, 6362, 6363, 6364, 6365, 6366, 6367, 6368, 6369, 6370, 6371, 6372, 6373, 6374, 6375, 6376, 6377, 6378, 6379, 6380, 6381, 6382, 6383, 6384, 6385, 6386, 6387, 6388, 6389, 6390, 6391, 6392, 6393, 6394, 6395, 6396, 6397, 6398, 6399,\n    6400, 6401, 6402, 6403, 6404, 6405, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413, 6414, 6415, 6416, 6417, 6418, 6419, 6420, 6421, 6422, 6423, 6424, 6425, 6426, 6427, 6428, 6429, 6430, 6431, 6432, 6433, 6434, 6435, 6436, 6437, 6438, 6439, 6440, 6441, 6442, 6443, 6444, 6445, 6446, 6447, 6448, 6449,\n    6450, 6451, 6452, 6453, 6454, 6455, 6456, 6457, 6458, 6459, 6460, 6461, 6462, 6463, 6464, 6465, 6466, 6467, 6468, 6469, 6470, 6471, 6472, 6473, 6474, 6475, 6476, 6477, 6478, 6479, 6480, 6481, 6482, 6483, 6484, 6485, 6486, 6487, 6488, 6489, 6490, 6491, 6492, 6493, 6494, 6495, 6496, 6497, 6498, 6499,\n    6500, 6501, 6502, 6503, 6504, 6505, 6506, 6507, 6508, 6509, 6510, 6511, 6512, 6513, 6514, 6515, 6516, 6517, 6518, 6519, 6520, 6521, 6522, 6523, 6524, 6525, 6526, 6527, 6528, 6529, 6530, 6531, 6532, 6533, 6534, 6535, 6536, 6537, 6538, 6539, 6540, 6541, 6542, 6543, 6544, 6545, 6546, 6547, 6548, 6549,\n    6550, 6551, 6552, 6553, 6554, 6555, 6556, 6557, 6558, 6559, 6560, 6561, 6562, 6563, 6564, 6565, 6566, 6567, 6568, 6569, 6570, 6571, 6572, 6573, 6574, 6575, 6576, 6577, 6578, 6579, 6580, 6581, 6582, 6583, 6584, 6585, 6586, 6587, 6588, 6589, 6590, 6591, 6592, 6593, 6594, 6595, 6596, 6597, 6598, 6599,\n    6600, 6601, 6602, 6603, 6604, 6605, 6606, 6607, 6608, 6609, 6610, 6611, 6612, 6613, 6614, 6615, 6616, 6617, 6618, 6619, 6620, 6621, 6622, 6623, 6624, 6625, 6626, 6627, 6628, 6629, 6630, 6631, 6632, 6633, 6634, 6635, 6636, 6637, 6638, 6639, 6640, 6641, 6642, 6643, 6644, 6645, 6646, 6647, 6648, 6649,\n    6650, 6651, 6652, 6653, 6654, 6655, 6656, 6657, 6658, 6659, 6660, 6661, 6662, 6663, 6664, 6665, 6666, 6667, 6668, 6669, 6670, 6671, 6672, 6673, 6674, 6675, 6676, 6677, 6678, 6679, 6680, 6681, 6682, 6683, 6684, 6685, 6686, 6687, 6688, 6689, 6690, 6691, 6692, 6693, 6694, 6695, 6696, 6697, 6698, 6699,\n    6700, 6701, 6702, 6703, 6704, 6705, 6706, 6707, 6708, 6709, 6710, 6711, 6712, 6713, 6714, 6715, 6716, 6717, 6718, 6719, 6720, 6721, 6722, 6723, 6724, 6725, 6726, 6727, 6728, 6729, 6730, 6731, 6732, 6733, 6734, 6735, 6736, 6737, 6738, 6739, 6740, 6741, 6742, 6743, 6744, 6745, 6746, 6747, 6748, 6749,\n    6750, 6751, 6752, 6753, 6754, 6755, 6756, 6757, 6758, 6759, 6760, 6761, 6762, 6763, 6764, 6765, 6766, 6767, 6768, 6769, 6770, 6771, 6772, 6773, 6774, 6775, 6776, 6777, 6778, 6779, 6780, 6781, 6782, 6783, 6784, 6785, 6786, 6787, 6788, 6789, 6790, 6791, 6792, 6793, 6794, 6795, 6796, 6797, 6798, 6799,\n    6800, 6801, 6802, 6803, 6804, 6805, 6806, 6807, 6808, 6809, 6810, 6811, 6812, 6813, 6814, 6815, 6816, 6817, 6818, 6819, 6820, 6821, 6822, 6823, 6824, 6825, 6826, 6827, 6828, 6829, 6830, 6831, 6832, 6833, 6834, 6835, 6836, 6837, 6838, 6839, 6840, 6841, 6842, 6843, 6844, 6845, 6846, 6847, 6848, 6849,\n    6850, 6851, 6852, 6853, 6854, 6855, 6856, 6857, 6858, 6859, 6860, 6861, 6862, 6863, 6864, 6865, 6866, 6867, 6868, 6869, 6870, 6871, 6872, 6873, 6874, 6875, 6876, 6877, 6878, 6879, 6880, 6881, 6882, 6883, 6884, 6885, 6886, 6887, 6888, 6889, 6890, 6891, 6892, 6893, 6894, 6895, 6896, 6897, 6898, 6899,\n    6900, 6901, 6902, 6903, 6904, 6905, 6906, 6907, 6908, 6909, 6910, 6911, 6912, 6913, 6914, 6915, 6916, 6917, 6918, 6919, 6920, 6921, 6922, 6923, 6924, 6925, 6926, 6927, 6928, 6929, 6930, 6931, 6932, 6933, 6934, 6935, 6936, 6937, 6938, 6939, 6940, 6941, 6942, 6943, 6944, 6945, 6946, 6947, 6948, 6949,\n    6950, 6951, 6952, 6953, 6954, 6955, 6956, 6957, 6958, 6959, 6960, 6961, 6962, 6963, 6964, 6965, 6966, 6967, 6968, 6969, 6970, 6971, 6972, 6973, 6974, 6975, 6976, 6977, 6978, 6979, 6980, 6981, 6982, 6983, 6984, 6985, 6986, 6987, 6988, 6989, 6990, 6991, 6992, 6993, 6994, 6995, 6996, 6997, 6998, 6999,\n    7000, 7001, 7002, 7003, 7004, 7005, 7006, 7007, 7008, 7009, 7010, 7011, 7012, 7013, 7014, 7015, 7016, 7017, 7018, 7019, 7020, 7021, 7022, 7023, 7024, 7025, 7026, 7027, 7028, 7029, 7030, 7031, 7032, 7033, 7034, 7035, 7036, 7037, 7038, 7039, 7040, 7041, 7042, 7043, 7044, 7045, 7046, 7047, 7048, 7049,\n    7050, 7051, 7052, 7053, 7054, 7055, 7056, 7057, 7058, 7059, 7060, 7061, 7062, 7063, 7064, 7065, 7066, 7067, 7068, 7069, 7070, 7071, 7072, 7073, 7074, 7075, 7076, 7077, 7078, 7079, 7080, 7081, 7082, 7083, 7084, 7085, 7086, 7087, 7088, 7089, 7090, 7091, 7092, 7093, 7094, 7095, 7096, 7097, 7098, 7099,\n    7100, 7101, 7102, 7103, 7104, 7105, 7106, 7107, 7108, 7109, 7110, 7111, 7112, 7113, 7114, 7115, 7116, 7117, 7118, 7119, 7120, 7121, 7122, 7123, 7124, 7125, 7126, 7127, 7128, 7129, 7130, 7131, 7132, 7133, 7134, 7135, 7136, 7137, 7138, 7139, 7140, 7141, 7142, 7143, 7144, 7145, 7146, 7147, 7148, 7149,\n    7150, 7151, 7152, 7153, 7154, 7155, 7156, 7157, 7158, 7159, 7160, 7161, 7162, 7163, 7164, 7165, 7166, 7167, 7168, 7169, 7170, 7171, 7172, 7173, 7174, 7175, 7176, 7177, 7178, 7179, 7180, 7181, 7182, 7183, 7184, 7185, 7186, 7187, 7188, 7189, 7190, 7191, 7192, 7193, 7194, 7195, 7196, 7197, 7198, 7199,\n    7200, 7201, 7202, 7203, 7204, 7205, 7206, 7207, 7208, 7209, 7210, 7211, 7212, 7213, 7214, 7215, 7216, 7217, 7218, 7219, 7220, 7221, 7222, 7223, 7224, 7225, 7226, 7227, 7228, 7229, 7230, 7231, 7232, 7233, 7234, 7235, 7236, 7237, 7238, 7239, 7240, 7241, 7242, 7243, 7244, 7245, 7246, 7247, 7248, 7249,\n    7250, 7251, 7252, 7253, 7254, 7255, 7256, 7257, 7258, 7259, 7260, 7261, 7262, 7263, 7264, 7265, 7266, 7267, 7268, 7269, 7270, 7271, 7272, 7273, 7274, 7275, 7276, 7277, 7278, 7279, 7280, 7281, 7282, 7283, 7284, 7285, 7286, 7287, 7288, 7289, 7290, 7291, 7292, 7293, 7294, 7295, 7296, 7297, 7298, 7299,\n    7300, 7301, 7302, 7303, 7304, 7305, 7306, 7307, 7308, 7309, 7310, 7311, 7312, 7313, 7314, 7315, 7316, 7317, 7318, 7319, 7320, 7321, 7322, 7323, 7324, 7325, 7326, 7327, 7328, 7329, 7330, 7331, 7332, 7333, 7334, 7335, 7336, 7337, 7338, 7339, 7340, 7341, 7342, 7343, 7344, 7345, 7346, 7347, 7348, 7349,\n    7350, 7351, 7352, 7353, 7354, 7355, 7356, 7357, 7358, 7359, 7360, 7361, 7362, 7363, 7364, 7365, 7366, 7367, 7368, 7369, 7370, 7371, 7372, 7373, 7374, 7375, 7376, 7377, 7378, 7379, 7380, 7381, 7382, 7383, 7384, 7385, 7386, 7387, 7388, 7389, 7390, 7391, 7392, 7393, 7394, 7395, 7396, 7397, 7398, 7399,\n    7400, 7401, 7402, 7403, 7404, 7405, 7406, 7407, 7408, 7409, 7410, 7411, 7412, 7413, 7414, 7415, 7416, 7417, 7418, 7419, 7420, 7421, 7422, 7423, 7424, 7425, 7426, 7427, 7428, 7429, 7430, 7431, 7432, 7433, 7434, 7435, 7436, 7437, 7438, 7439, 7440, 7441, 7442, 7443, 7444, 7445, 7446, 7447, 7448, 7449,\n    7450, 7451, 7452, 7453, 7454, 7455, 7456, 7457, 7458, 7459, 7460, 7461, 7462, 7463, 7464, 7465, 7466, 7467, 7468, 7469, 7470, 7471, 7472, 7473, 7474, 7475, 7476, 7477, 7478, 7479, 7480, 7481, 7482, 7483, 7484, 7485, 7486, 7487, 7488, 7489, 7490, 7491, 7492, 7493, 7494, 7495, 7496, 7497, 7498, 7499,\n    7500, 7501, 7502, 7503, 7504, 7505, 7506, 7507, 7508, 7509, 7510, 7511, 7512, 7513, 7514, 7515, 7516, 7517, 7518, 7519, 7520, 7521, 7522, 7523, 7524, 7525, 7526, 7527, 7528, 7529, 7530, 7531, 7532, 7533, 7534, 7535, 7536, 7537, 7538, 7539, 7540, 7541, 7542, 7543, 7544, 7545, 7546, 7547, 7548, 7549,\n    7550, 7551, 7552, 7553, 7554, 7555, 7556, 7557, 7558, 7559, 7560, 7561, 7562, 7563, 7564, 7565, 7566, 7567, 7568, 7569, 7570, 7571, 7572, 7573, 7574, 7575, 7576, 7577, 7578, 7579, 7580, 7581, 7582, 7583, 7584, 7585, 7586, 7587, 7588, 7589, 7590, 7591, 7592, 7593, 7594, 7595, 7596, 7597, 7598, 7599,\n    7600, 7601, 7602, 7603, 7604, 7605, 7606, 7607, 7608, 7609, 7610, 7611, 7612, 7613, 7614, 7615, 7616, 7617, 7618, 7619, 7620, 7621, 7622, 7623, 7624, 7625, 7626, 7627, 7628, 7629, 7630, 7631, 7632, 7633, 7634, 7635, 7636, 7637, 7638, 7639, 7640, 7641, 7642, 7643, 7644, 7645, 7646, 7647, 7648, 7649,\n    7650, 7651, 7652, 7653, 7654, 7655, 7656, 7657, 7658, 7659, 7660, 7661, 7662, 7663, 7664, 7665, 7666, 7667, 7668, 7669, 7670, 7671, 7672, 7673, 7674, 7675, 7676, 7677, 7678, 7679, 7681, 7681, 7683, 7683, 7685, 7685, 7687, 7687, 7689, 7689, 7691, 7691, 7693, 7693, 7695, 7695, 7697, 7697, 7699, 7699,\n    7701, 7701, 7703, 7703, 7705, 7705, 7707, 7707, 7709, 7709, 7711, 7711, 7713, 7713, 7715, 7715, 7717, 7717, 7719, 7719, 7721, 7721, 7723, 7723, 7725, 7725, 7727, 7727, 7729, 7729, 7731, 7731, 7733, 7733, 7735, 7735, 7737, 7737, 7739, 7739, 7741, 7741, 7743, 7743, 7745, 7745, 7747, 7747, 7749, 7749,\n    7751, 7751, 7753, 7753, 7755, 7755, 7757, 7757, 7759, 7759, 7761, 7761, 7763, 7763, 7765, 7765, 7767, 7767, 7769, 7769, 7771, 7771, 7773, 7773, 7775, 7775, 7777, 7777, 7779, 7779, 7781, 7781, 7783, 7783, 7785, 7785, 7787, 7787, 7789, 7789, 7791, 7791, 7793, 7793, 7795, 7795, 7797, 7797, 7799, 7799,\n    7801, 7801, 7803, 7803, 7805, 7805, 7807, 7807, 7809, 7809, 7811, 7811, 7813, 7813, 7815, 7815, 7817, 7817, 7819, 7819, 7821, 7821, 7823, 7823, 7825, 7825, 7827, 7827, 7829, 7829, 7830, 7831, 7832, 7833, 7834, 7835, 7836, 7837, 7838, 7839, 7841, 7841, 7843, 7843, 7845, 7845, 7847, 7847, 7849, 7849,\n    7851, 7851, 7853, 7853, 7855, 7855, 7857, 7857, 7859, 7859, 7861, 7861, 7863, 7863, 7865, 7865, 7867, 7867, 7869, 7869, 7871, 7871, 7873, 7873, 7875, 7875, 7877, 7877, 7879, 7879, 7881, 7881, 7883, 7883, 7885, 7885, 7887, 7887, 7889, 7889, 7891, 7891, 7893, 7893, 7895, 7895, 7897, 7897, 7899, 7899,\n    7901, 7901, 7903, 7903, 7905, 7905, 7907, 7907, 7909, 7909, 7911, 7911, 7913, 7913, 7915, 7915, 7917, 7917, 7919, 7919, 7921, 7921, 7923, 7923, 7925, 7925, 7927, 7927, 7929, 7929, 7930, 7931, 7932, 7933, 7934, 7935, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7936, 7937, 7938, 7939, 7940, 7941,\n    7942, 7943, 7952, 7953, 7954, 7955, 7956, 7957, 7958, 7959, 7952, 7953, 7954, 7955, 7956, 7957, 7966, 7967, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991,\n    8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8000, 8001, 8002, 8003, 8004, 8005, 8014, 8015, 8016, 8017, 8018, 8019, 8020, 8021, 8022, 8023, 8024, 8017, 8026, 8019, 8028, 8021, 8030, 8023, 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039, 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039, 8048, 8049,\n    8050, 8051, 8052, 8053, 8054, 8055, 8056, 8057, 8058, 8059, 8060, 8061, 8062, 8063, 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099,\n    8100, 8101, 8102, 8103, 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112, 8113, 8114, 8115, 8116, 8117, 8118, 8119, 8112, 8113, 8048, 8049, 8124, 8125, 8126, 8127, 8128, 8129, 8130, 8131, 8132, 8133, 8134, 8135, 8050, 8051, 8052, 8053, 8140, 8141, 8142, 8143, 8144, 8145, 8146, 8147, 8148, 8149,\n    8150, 8151, 8144, 8145, 8054, 8055, 8156, 8157, 8158, 8159, 8160, 8161, 8162, 8163, 8164, 8165, 8166, 8167, 8160, 8161, 8058, 8059, 8165, 8173, 8174, 8175, 8176, 8177, 8178, 8179, 8180, 8181, 8182, 8183, 8056, 8057, 8060, 8061, 8188, 8189, 8190, 8191, 8192, 8193, 8194, 8195, 8196, 8197, 8198, 8199,\n    8200, 8201, 8202, 8203, 8204, 8205, 8206, 8207, 8208, 8209, 8210, 8211, 8212, 8213, 8214, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8223, 8224, 8225, 8226, 8227, 8228, 8229, 8230, 8231, 8232, 8233, 8234, 8235, 8236, 8237, 8238, 8239, 8240, 8241, 8242, 8243, 8244, 8245, 8246, 8247, 8248, 8249,\n    8250, 8251, 8252, 8253, 8254, 8255, 8256, 8257, 8258, 8259, 8260, 8261, 8262, 8263, 8264, 8265, 8266, 8267, 8268, 8269, 8270, 8271, 8272, 8273, 8274, 8275, 8276, 8277, 8278, 8279, 8280, 8281, 8282, 8283, 8284, 8285, 8286, 8287, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 8295, 8296, 8297, 8298, 8299,\n    8300, 8301, 8302, 8303, 8304, 8305, 8306, 8307, 8308, 8309, 8310, 8311, 8312, 8313, 8314, 8315, 8316, 8317, 8318, 8319, 8320, 8321, 8322, 8323, 8324, 8325, 8326, 8327, 8328, 8329, 8330, 8331, 8332, 8333, 8334, 8335, 8336, 8337, 8338, 8339, 8340, 8341, 8342, 8343, 8344, 8345, 8346, 8347, 8348, 8349,\n    8350, 8351, 8352, 8353, 8354, 8355, 8356, 8357, 8358, 8359, 8360, 8361, 8362, 8363, 8364, 8365, 8366, 8367, 8368, 8369, 8370, 8371, 8372, 8373, 8374, 8375, 8376, 8377, 8378, 8379, 8380, 8381, 8382, 8383, 8384, 8385, 8386, 8387, 8388, 8389, 8390, 8391, 8392, 8393, 8394, 8395, 8396, 8397, 8398, 8399,\n    8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 8410, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, 8422, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 8433, 8434, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 8442, 8443, 8444, 8445, 8446, 8447, 8448, 8449,\n    8450, 8451, 8452, 8453, 8454, 8455, 8456, 8457, 8458, 8459, 8460, 8461, 8462, 8463, 8464, 8465, 8466, 8467, 8468, 8469, 8470, 8471, 8472, 8473, 8474, 8475, 8476, 8477, 8478, 8479, 8480, 8481, 8482, 8483, 8484, 8485, 8486, 8487, 8488, 8489, 8490, 8491, 8492, 8493, 8494, 8495, 8496, 8497, 8498, 8499,\n    8500, 8501, 8502, 8503, 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511, 8512, 8513, 8514, 8515, 8516, 8517, 8518, 8519, 8520, 8521, 8522, 8523, 8524, 8525, 8526, 8527, 8528, 8529, 8530, 8531, 8532, 8533, 8534, 8535, 8536, 8537, 8538, 8539, 8540, 8541, 8542, 8543, 8560, 8561, 8562, 8563, 8564, 8565,\n    8566, 8567, 8568, 8569, 8570, 8571, 8572, 8573, 8574, 8575, 8560, 8561, 8562, 8563, 8564, 8565, 8566, 8567, 8568, 8569, 8570, 8571, 8572, 8573, 8574, 8575, 8576, 8577, 8578, 8579, 8580, 8581, 8582, 8583, 8584, 8585, 8586, 8587, 8588, 8589, 8590, 8591, 8592, 8593, 8594, 8595, 8596, 8597, 8598, 8599,\n    8600, 8601, 8602, 8603, 8604, 8605, 8606, 8607, 8608, 8609, 8610, 8611, 8612, 8613, 8614, 8615, 8616, 8617, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8625, 8626, 8627, 8628, 8629, 8630, 8631, 8632, 8633, 8634, 8635, 8636, 8637, 8638, 8639, 8640, 8641, 8642, 8643, 8644, 8645, 8646, 8647, 8648, 8649,\n    8650, 8651, 8652, 8653, 8654, 8655, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8687, 8688, 8689, 8690, 8691, 8692, 8693, 8694, 8695, 8696, 8697, 8698, 8699,\n    8700, 8701, 8702, 8703, 8704, 8705, 8706, 8707, 8708, 8709, 8710, 8711, 8712, 8713, 8714, 8715, 8716, 8717, 8718, 8719, 8720, 8721, 8722, 8723, 8724, 8725, 8726, 8727, 8728, 8729, 8730, 8731, 8732, 8733, 8734, 8735, 8736, 8737, 8738, 8739, 8740, 8741, 8742, 8743, 8744, 8745, 8746, 8747, 8748, 8749,\n    8750, 8751, 8752, 8753, 8754, 8755, 8756, 8757, 8758, 8759, 8760, 8761, 8762, 8763, 8764, 8765, 8766, 8767, 8768, 8769, 8770, 8771, 8772, 8773, 8774, 8775, 8776, 8777, 8778, 8779, 8780, 8781, 8782, 8783, 8784, 8785, 8786, 8787, 8788, 8789, 8790, 8791, 8792, 8793, 8794, 8795, 8796, 8797, 8798, 8799,\n    8800, 8801, 8802, 8803, 8804, 8805, 8806, 8807, 8808, 8809, 8810, 8811, 8812, 8813, 8814, 8815, 8816, 8817, 8818, 8819, 8820, 8821, 8822, 8823, 8824, 8825, 8826, 8827, 8828, 8829, 8830, 8831, 8832, 8833, 8834, 8835, 8836, 8837, 8838, 8839, 8840, 8841, 8842, 8843, 8844, 8845, 8846, 8847, 8848, 8849,\n    8850, 8851, 8852, 8853, 8854, 8855, 8856, 8857, 8858, 8859, 8860, 8861, 8862, 8863, 8864, 8865, 8866, 8867, 8868, 8869, 8870, 8871, 8872, 8873, 8874, 8875, 8876, 8877, 8878, 8879, 8880, 8881, 8882, 8883, 8884, 8885, 8886, 8887, 8888, 8889, 8890, 8891, 8892, 8893, 8894, 8895, 8896, 8897, 8898, 8899,\n    8900, 8901, 8902, 8903, 8904, 8905, 8906, 8907, 8908, 8909, 8910, 8911, 8912, 8913, 8914, 8915, 8916, 8917, 8918, 8919, 8920, 8921, 8922, 8923, 8924, 8925, 8926, 8927, 8928, 8929, 8930, 8931, 8932, 8933, 8934, 8935, 8936, 8937, 8938, 8939, 8940, 8941, 8942, 8943, 8944, 8945, 8946, 8947, 8948, 8949,\n    8950, 8951, 8952, 8953, 8954, 8955, 8956, 8957, 8958, 8959, 8960, 8961, 8962, 8963, 8964, 8965, 8966, 8967, 8968, 8969, 8970, 8971, 8972, 8973, 8974, 8975, 8976, 8977, 8978, 8979, 8980, 8981, 8982, 8983, 8984, 8985, 8986, 8987, 8988, 8989, 8990, 8991, 8992, 8993, 8994, 8995, 8996, 8997, 8998, 8999,\n    9000, 9001, 9002, 9003, 9004, 9005, 9006, 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 9015, 9016, 9017, 9018, 9019, 9020, 9021, 9022, 9023, 9024, 9025, 9026, 9027, 9028, 9029, 9030, 9031, 9032, 9033, 9034, 9035, 9036, 9037, 9038, 9039, 9040, 9041, 9042, 9043, 9044, 9045, 9046, 9047, 9048, 9049,\n    9050, 9051, 9052, 9053, 9054, 9055, 9056, 9057, 9058, 9059, 9060, 9061, 9062, 9063, 9064, 9065, 9066, 9067, 9068, 9069, 9070, 9071, 9072, 9073, 9074, 9075, 9076, 9077, 9078, 9079, 9080, 9081, 9082, 9083, 9084, 9085, 9086, 9087, 9088, 9089, 9090, 9091, 9092, 9093, 9094, 9095, 9096, 9097, 9098, 9099,\n    9100, 9101, 9102, 9103, 9104, 9105, 9106, 9107, 9108, 9109, 9110, 9111, 9112, 9113, 9114, 9115, 9116, 9117, 9118, 9119, 9120, 9121, 9122, 9123, 9124, 9125, 9126, 9127, 9128, 9129, 9130, 9131, 9132, 9133, 9134, 9135, 9136, 9137, 9138, 9139, 9140, 9141, 9142, 9143, 9144, 9145, 9146, 9147, 9148, 9149,\n    9150, 9151, 9152, 9153, 9154, 9155, 9156, 9157, 9158, 9159, 9160, 9161, 9162, 9163, 9164, 9165, 9166, 9167, 9168, 9169, 9170, 9171, 9172, 9173, 9174, 9175, 9176, 9177, 9178, 9179, 9180, 9181, 9182, 9183, 9184, 9185, 9186, 9187, 9188, 9189, 9190, 9191, 9192, 9193, 9194, 9195, 9196, 9197, 9198, 9199,\n    9200, 9201, 9202, 9203, 9204, 9205, 9206, 9207, 9208, 9209, 9210, 9211, 9212, 9213, 9214, 9215, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223, 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, 9234, 9235, 9236, 9237, 9238, 9239, 9240, 9241, 9242, 9243, 9244, 9245, 9246, 9247, 9248, 9249,\n    9250, 9251, 9252, 9253, 9254, 9255, 9256, 9257, 9258, 9259, 9260, 9261, 9262, 9263, 9264, 9265, 9266, 9267, 9268, 9269, 9270, 9271, 9272, 9273, 9274, 9275, 9276, 9277, 9278, 9279, 9280, 9281, 9282, 9283, 9284, 9285, 9286, 9287, 9288, 9289, 9290, 9291, 9292, 9293, 9294, 9295, 9296, 9297, 9298, 9299,\n    9300, 9301, 9302, 9303, 9304, 9305, 9306, 9307, 9308, 9309, 9310, 9311, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, 9340, 9341, 9342, 9343, 9344, 9345, 9346, 9347, 9348, 9349,\n    9350, 9351, 9352, 9353, 9354, 9355, 9356, 9357, 9358, 9359, 9360, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, 9369, 9370, 9371, 9372, 9373, 9374, 9375, 9376, 9377, 9378, 9379, 9380, 9381, 9382, 9383, 9384, 9385, 9386, 9387, 9388, 9389, 9390, 9391, 9392, 9393, 9394, 9395, 9396, 9397, 9424, 9425,\n    9426, 9427, 9428, 9429, 9430, 9431, 9432, 9433, 9434, 9435, 9436, 9437, 9438, 9439, 9440, 9441, 9442, 9443, 9444, 9445, 9446, 9447, 9448, 9449\n};\n\nconst Il2CppChar ToLowerDataHigh[] =\n{\n    65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, 65365, 65366, 65367, 65368, 65369, 65370, 65339, 65340, 65341, 65342, 65343, 65344, 65345, 65346, 65347, 65348, 65349,\n    65350, 65351, 65352, 65353, 65354, 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, 65373, 65374, 65375, 65376, 65377, 65378, 65379, 65380, 65381, 65382, 65383, 65384, 65385, 65386, 65387, 65388, 65389, 65390, 65391, 65392, 65393, 65394, 65395, 65396, 65397, 65398, 65399,\n    65400, 65401, 65402, 65403, 65404, 65405, 65406, 65407, 65408, 65409, 65410, 65411, 65412, 65413, 65414, 65415, 65416, 65417, 65418, 65419, 65420, 65421, 65422, 65423, 65424, 65425, 65426, 65427, 65428, 65429, 65430, 65431, 65432, 65433, 65434, 65435, 65436, 65437, 65438, 65439, 65440, 65441, 65442, 65443, 65444, 65445, 65446, 65447, 65448, 65449,\n    65450, 65451, 65452, 65453, 65454, 65455, 65456, 65457, 65458, 65459, 65460, 65461, 65462, 65463, 65464, 65465, 65466, 65467, 65468, 65469, 65470, 65471, 65472, 65473, 65474, 65475, 65476, 65477, 65478, 65479, 65480, 65481, 65482, 65483, 65484, 65485, 65486, 65487, 65488, 65489, 65490, 65491, 65492, 65493, 65494, 65495, 65496, 65497, 65498, 65499,\n    65500, 65501, 65502, 65503, 65504, 65505, 65506, 65507, 65508, 65509, 65510, 65511, 65512, 65513, 65514, 65515, 65516, 65517, 65518, 65519, 65520, 65521, 65522, 65523, 65524, 65525, 65526, 65527, 65528, 65529, 65530, 65531, 65532, 65533, 65534, 65535\n};\n\nconst Il2CppChar ToUpperDataLow[] =\n{\n    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,\n    50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 65, 66, 67,\n    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,\n    150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,\n    200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 247, 216, 217,\n    218, 219, 220, 221, 222, 376, 256, 256, 258, 258, 260, 260, 262, 262, 264, 264, 266, 266, 268, 268, 270, 270, 272, 272, 274, 274, 276, 276, 278, 278, 280, 280, 282, 282, 284, 284, 286, 286, 288, 288, 290, 290, 292, 292, 294, 294, 296, 296, 298, 298,\n    300, 300, 302, 302, 304, 305, 306, 306, 308, 308, 310, 310, 312, 313, 313, 315, 315, 317, 317, 319, 319, 321, 321, 323, 323, 325, 325, 327, 327, 329, 330, 330, 332, 332, 334, 334, 336, 336, 338, 338, 340, 340, 342, 342, 344, 344, 346, 346, 348, 348,\n    350, 350, 352, 352, 354, 354, 356, 356, 358, 358, 360, 360, 362, 362, 364, 364, 366, 366, 368, 368, 370, 370, 372, 372, 374, 374, 376, 377, 377, 379, 379, 381, 381, 383, 384, 385, 386, 386, 388, 388, 390, 391, 391, 393, 394, 395, 395, 397, 398, 399,\n    400, 401, 401, 403, 404, 405, 406, 407, 408, 408, 410, 411, 412, 413, 414, 415, 416, 416, 418, 418, 420, 420, 422, 423, 423, 425, 426, 427, 428, 428, 430, 431, 431, 433, 434, 435, 435, 437, 437, 439, 440, 440, 442, 443, 444, 444, 446, 447, 448, 449,\n    450, 451, 452, 453, 452, 455, 456, 455, 458, 459, 458, 461, 461, 463, 463, 465, 465, 467, 467, 469, 469, 471, 471, 473, 473, 475, 475, 398, 478, 478, 480, 480, 482, 482, 484, 484, 486, 486, 488, 488, 490, 490, 492, 492, 494, 494, 496, 497, 498, 497,\n    500, 500, 502, 503, 504, 505, 506, 506, 508, 508, 510, 510, 512, 512, 514, 514, 516, 516, 518, 518, 520, 520, 522, 522, 524, 524, 526, 526, 528, 528, 530, 530, 532, 532, 534, 534, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549,\n    550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 385, 390, 597, 393, 394,\n    600, 399, 602, 400, 604, 605, 606, 607, 403, 609, 610, 404, 612, 613, 614, 615, 407, 406, 618, 619, 620, 621, 622, 412, 624, 625, 413, 627, 628, 415, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 425, 644, 645, 646, 647, 430, 649,\n    433, 434, 652, 653, 654, 655, 656, 657, 439, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699,\n    700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749,\n    750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799,\n    800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849,\n    850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899,\n    900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 902, 904, 905, 906, 944, 913, 914, 915, 916, 917,\n    918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 931, 932, 933, 934, 935, 936, 937, 938, 939, 908, 910, 911, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 994, 996, 996, 998, 998,\n    1000, 1000, 1002, 1002, 1004, 1004, 1006, 1006, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049,\n    1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067,\n    1068, 1069, 1070, 1071, 1104, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1117, 1038, 1039, 1120, 1120, 1122, 1122, 1124, 1124, 1126, 1126, 1128, 1128, 1130, 1130, 1132, 1132, 1134, 1134, 1136, 1136, 1138, 1138, 1140, 1140, 1142, 1142, 1144, 1144, 1146, 1146, 1148, 1148,\n    1150, 1150, 1152, 1152, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1168, 1170, 1170, 1172, 1172, 1174, 1174, 1176, 1176, 1178, 1178, 1180, 1180, 1182, 1182, 1184, 1184, 1186, 1186, 1188, 1188, 1190, 1190, 1192, 1192, 1194, 1194, 1196, 1196, 1198, 1198,\n    1200, 1200, 1202, 1202, 1204, 1204, 1206, 1206, 1208, 1208, 1210, 1210, 1212, 1212, 1214, 1214, 1216, 1217, 1217, 1219, 1219, 1221, 1222, 1223, 1223, 1225, 1226, 1227, 1227, 1229, 1230, 1231, 1232, 1232, 1234, 1234, 1236, 1236, 1238, 1238, 1240, 1240, 1242, 1242, 1244, 1244, 1246, 1246, 1248, 1248,\n    1250, 1250, 1252, 1252, 1254, 1254, 1256, 1256, 1258, 1258, 1260, 1261, 1262, 1262, 1264, 1264, 1266, 1266, 1268, 1268, 1270, 1271, 1272, 1272, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299,\n    1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349,\n    1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351,\n    1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449,\n    1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499,\n    1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549,\n    1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599,\n    1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649,\n    1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699,\n    1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749,\n    1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799,\n    1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849,\n    1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899,\n    1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949,\n    1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049,\n    2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099,\n    2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149,\n    2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199,\n    2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249,\n    2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299,\n    2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349,\n    2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399,\n    2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449,\n    2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499,\n    2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549,\n    2550, 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599,\n    2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649,\n    2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699,\n    2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749,\n    2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799,\n    2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849,\n    2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899,\n    2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949,\n    2950, 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999,\n    3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049,\n    3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, 3097, 3098, 3099,\n    3100, 3101, 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, 3145, 3146, 3147, 3148, 3149,\n    3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, 3199,\n    3200, 3201, 3202, 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, 3249,\n    3250, 3251, 3252, 3253, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299,\n    3300, 3301, 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349,\n    3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399,\n    3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, 3439, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449,\n    3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, 3499,\n    3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549,\n    3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599,\n    3600, 3601, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649,\n    3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, 3699,\n    3700, 3701, 3702, 3703, 3704, 3705, 3706, 3707, 3708, 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, 3717, 3718, 3719, 3720, 3721, 3722, 3723, 3724, 3725, 3726, 3727, 3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, 3748, 3749,\n    3750, 3751, 3752, 3753, 3754, 3755, 3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763, 3764, 3765, 3766, 3767, 3768, 3769, 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3783, 3784, 3785, 3786, 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799,\n    3800, 3801, 3802, 3803, 3804, 3805, 3806, 3807, 3808, 3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, 3828, 3829, 3830, 3831, 3832, 3833, 3834, 3835, 3836, 3837, 3838, 3839, 3840, 3841, 3842, 3843, 3844, 3845, 3846, 3847, 3848, 3849,\n    3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3859, 3860, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882, 3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890, 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, 3899,\n    3900, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3909, 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949,\n    3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, 3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 3999,\n    4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013, 4014, 4015, 4016, 4017, 4018, 4019, 4020, 4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, 4049,\n    4050, 4051, 4052, 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, 4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085, 4086, 4087, 4088, 4089, 4090, 4091, 4092, 4093, 4094, 4095, 4096, 4097, 4098, 4099,\n    4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110, 4111, 4112, 4113, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149,\n    4150, 4151, 4152, 4153, 4154, 4155, 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4175, 4176, 4177, 4178, 4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186, 4187, 4188, 4189, 4190, 4191, 4192, 4193, 4194, 4195, 4196, 4197, 4198, 4199,\n    4200, 4201, 4202, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4210, 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218, 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, 4240, 4241, 4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249,\n    4250, 4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293, 4294, 4295, 4296, 4297, 4298, 4299,\n    4300, 4301, 4302, 4303, 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349,\n    4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, 4380, 4381, 4382, 4383, 4384, 4385, 4386, 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, 4398, 4399,\n    4400, 4401, 4402, 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444, 4445, 4446, 4447, 4448, 4449,\n    4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489, 4490, 4491, 4492, 4493, 4494, 4495, 4496, 4497, 4498, 4499,\n    4500, 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4519, 4520, 4521, 4522, 4523, 4524, 4525, 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, 4535, 4536, 4537, 4538, 4539, 4540, 4541, 4542, 4543, 4544, 4545, 4546, 4547, 4548, 4549,\n    4550, 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, 4568, 4569, 4570, 4571, 4572, 4573, 4574, 4575, 4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591, 4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599,\n    4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639, 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647, 4648, 4649,\n    4650, 4651, 4652, 4653, 4654, 4655, 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, 4664, 4665, 4666, 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674, 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695, 4696, 4697, 4698, 4699,\n    4700, 4701, 4702, 4703, 4704, 4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, 4714, 4715, 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, 4724, 4725, 4726, 4727, 4728, 4729, 4730, 4731, 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739, 4740, 4741, 4742, 4743, 4744, 4745, 4746, 4747, 4748, 4749,\n    4750, 4751, 4752, 4753, 4754, 4755, 4756, 4757, 4758, 4759, 4760, 4761, 4762, 4763, 4764, 4765, 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, 4783, 4784, 4785, 4786, 4787, 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, 4799,\n    4800, 4801, 4802, 4803, 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827, 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835, 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, 4844, 4845, 4846, 4847, 4848, 4849,\n    4850, 4851, 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859, 4860, 4861, 4862, 4863, 4864, 4865, 4866, 4867, 4868, 4869, 4870, 4871, 4872, 4873, 4874, 4875, 4876, 4877, 4878, 4879, 4880, 4881, 4882, 4883, 4884, 4885, 4886, 4887, 4888, 4889, 4890, 4891, 4892, 4893, 4894, 4895, 4896, 4897, 4898, 4899,\n    4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, 4923, 4924, 4925, 4926, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4936, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, 4948, 4949,\n    4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984, 4985, 4986, 4987, 4988, 4989, 4990, 4991, 4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999,\n    5000, 5001, 5002, 5003, 5004, 5005, 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5020, 5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028, 5029, 5030, 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042, 5043, 5044, 5045, 5046, 5047, 5048, 5049,\n    5050, 5051, 5052, 5053, 5054, 5055, 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5074, 5075, 5076, 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099,\n    5100, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, 5113, 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5129, 5130, 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 5140, 5141, 5142, 5143, 5144, 5145, 5146, 5147, 5148, 5149,\n    5150, 5151, 5152, 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160, 5161, 5162, 5163, 5164, 5165, 5166, 5167, 5168, 5169, 5170, 5171, 5172, 5173, 5174, 5175, 5176, 5177, 5178, 5179, 5180, 5181, 5182, 5183, 5184, 5185, 5186, 5187, 5188, 5189, 5190, 5191, 5192, 5193, 5194, 5195, 5196, 5197, 5198, 5199,\n    5200, 5201, 5202, 5203, 5204, 5205, 5206, 5207, 5208, 5209, 5210, 5211, 5212, 5213, 5214, 5215, 5216, 5217, 5218, 5219, 5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227, 5228, 5229, 5230, 5231, 5232, 5233, 5234, 5235, 5236, 5237, 5238, 5239, 5240, 5241, 5242, 5243, 5244, 5245, 5246, 5247, 5248, 5249,\n    5250, 5251, 5252, 5253, 5254, 5255, 5256, 5257, 5258, 5259, 5260, 5261, 5262, 5263, 5264, 5265, 5266, 5267, 5268, 5269, 5270, 5271, 5272, 5273, 5274, 5275, 5276, 5277, 5278, 5279, 5280, 5281, 5282, 5283, 5284, 5285, 5286, 5287, 5288, 5289, 5290, 5291, 5292, 5293, 5294, 5295, 5296, 5297, 5298, 5299,\n    5300, 5301, 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, 5312, 5313, 5314, 5315, 5316, 5317, 5318, 5319, 5320, 5321, 5322, 5323, 5324, 5325, 5326, 5327, 5328, 5329, 5330, 5331, 5332, 5333, 5334, 5335, 5336, 5337, 5338, 5339, 5340, 5341, 5342, 5343, 5344, 5345, 5346, 5347, 5348, 5349,\n    5350, 5351, 5352, 5353, 5354, 5355, 5356, 5357, 5358, 5359, 5360, 5361, 5362, 5363, 5364, 5365, 5366, 5367, 5368, 5369, 5370, 5371, 5372, 5373, 5374, 5375, 5376, 5377, 5378, 5379, 5380, 5381, 5382, 5383, 5384, 5385, 5386, 5387, 5388, 5389, 5390, 5391, 5392, 5393, 5394, 5395, 5396, 5397, 5398, 5399,\n    5400, 5401, 5402, 5403, 5404, 5405, 5406, 5407, 5408, 5409, 5410, 5411, 5412, 5413, 5414, 5415, 5416, 5417, 5418, 5419, 5420, 5421, 5422, 5423, 5424, 5425, 5426, 5427, 5428, 5429, 5430, 5431, 5432, 5433, 5434, 5435, 5436, 5437, 5438, 5439, 5440, 5441, 5442, 5443, 5444, 5445, 5446, 5447, 5448, 5449,\n    5450, 5451, 5452, 5453, 5454, 5455, 5456, 5457, 5458, 5459, 5460, 5461, 5462, 5463, 5464, 5465, 5466, 5467, 5468, 5469, 5470, 5471, 5472, 5473, 5474, 5475, 5476, 5477, 5478, 5479, 5480, 5481, 5482, 5483, 5484, 5485, 5486, 5487, 5488, 5489, 5490, 5491, 5492, 5493, 5494, 5495, 5496, 5497, 5498, 5499,\n    5500, 5501, 5502, 5503, 5504, 5505, 5506, 5507, 5508, 5509, 5510, 5511, 5512, 5513, 5514, 5515, 5516, 5517, 5518, 5519, 5520, 5521, 5522, 5523, 5524, 5525, 5526, 5527, 5528, 5529, 5530, 5531, 5532, 5533, 5534, 5535, 5536, 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544, 5545, 5546, 5547, 5548, 5549,\n    5550, 5551, 5552, 5553, 5554, 5555, 5556, 5557, 5558, 5559, 5560, 5561, 5562, 5563, 5564, 5565, 5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573, 5574, 5575, 5576, 5577, 5578, 5579, 5580, 5581, 5582, 5583, 5584, 5585, 5586, 5587, 5588, 5589, 5590, 5591, 5592, 5593, 5594, 5595, 5596, 5597, 5598, 5599,\n    5600, 5601, 5602, 5603, 5604, 5605, 5606, 5607, 5608, 5609, 5610, 5611, 5612, 5613, 5614, 5615, 5616, 5617, 5618, 5619, 5620, 5621, 5622, 5623, 5624, 5625, 5626, 5627, 5628, 5629, 5630, 5631, 5632, 5633, 5634, 5635, 5636, 5637, 5638, 5639, 5640, 5641, 5642, 5643, 5644, 5645, 5646, 5647, 5648, 5649,\n    5650, 5651, 5652, 5653, 5654, 5655, 5656, 5657, 5658, 5659, 5660, 5661, 5662, 5663, 5664, 5665, 5666, 5667, 5668, 5669, 5670, 5671, 5672, 5673, 5674, 5675, 5676, 5677, 5678, 5679, 5680, 5681, 5682, 5683, 5684, 5685, 5686, 5687, 5688, 5689, 5690, 5691, 5692, 5693, 5694, 5695, 5696, 5697, 5698, 5699,\n    5700, 5701, 5702, 5703, 5704, 5705, 5706, 5707, 5708, 5709, 5710, 5711, 5712, 5713, 5714, 5715, 5716, 5717, 5718, 5719, 5720, 5721, 5722, 5723, 5724, 5725, 5726, 5727, 5728, 5729, 5730, 5731, 5732, 5733, 5734, 5735, 5736, 5737, 5738, 5739, 5740, 5741, 5742, 5743, 5744, 5745, 5746, 5747, 5748, 5749,\n    5750, 5751, 5752, 5753, 5754, 5755, 5756, 5757, 5758, 5759, 5760, 5761, 5762, 5763, 5764, 5765, 5766, 5767, 5768, 5769, 5770, 5771, 5772, 5773, 5774, 5775, 5776, 5777, 5778, 5779, 5780, 5781, 5782, 5783, 5784, 5785, 5786, 5787, 5788, 5789, 5790, 5791, 5792, 5793, 5794, 5795, 5796, 5797, 5798, 5799,\n    5800, 5801, 5802, 5803, 5804, 5805, 5806, 5807, 5808, 5809, 5810, 5811, 5812, 5813, 5814, 5815, 5816, 5817, 5818, 5819, 5820, 5821, 5822, 5823, 5824, 5825, 5826, 5827, 5828, 5829, 5830, 5831, 5832, 5833, 5834, 5835, 5836, 5837, 5838, 5839, 5840, 5841, 5842, 5843, 5844, 5845, 5846, 5847, 5848, 5849,\n    5850, 5851, 5852, 5853, 5854, 5855, 5856, 5857, 5858, 5859, 5860, 5861, 5862, 5863, 5864, 5865, 5866, 5867, 5868, 5869, 5870, 5871, 5872, 5873, 5874, 5875, 5876, 5877, 5878, 5879, 5880, 5881, 5882, 5883, 5884, 5885, 5886, 5887, 5888, 5889, 5890, 5891, 5892, 5893, 5894, 5895, 5896, 5897, 5898, 5899,\n    5900, 5901, 5902, 5903, 5904, 5905, 5906, 5907, 5908, 5909, 5910, 5911, 5912, 5913, 5914, 5915, 5916, 5917, 5918, 5919, 5920, 5921, 5922, 5923, 5924, 5925, 5926, 5927, 5928, 5929, 5930, 5931, 5932, 5933, 5934, 5935, 5936, 5937, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 5945, 5946, 5947, 5948, 5949,\n    5950, 5951, 5952, 5953, 5954, 5955, 5956, 5957, 5958, 5959, 5960, 5961, 5962, 5963, 5964, 5965, 5966, 5967, 5968, 5969, 5970, 5971, 5972, 5973, 5974, 5975, 5976, 5977, 5978, 5979, 5980, 5981, 5982, 5983, 5984, 5985, 5986, 5987, 5988, 5989, 5990, 5991, 5992, 5993, 5994, 5995, 5996, 5997, 5998, 5999,\n    6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007, 6008, 6009, 6010, 6011, 6012, 6013, 6014, 6015, 6016, 6017, 6018, 6019, 6020, 6021, 6022, 6023, 6024, 6025, 6026, 6027, 6028, 6029, 6030, 6031, 6032, 6033, 6034, 6035, 6036, 6037, 6038, 6039, 6040, 6041, 6042, 6043, 6044, 6045, 6046, 6047, 6048, 6049,\n    6050, 6051, 6052, 6053, 6054, 6055, 6056, 6057, 6058, 6059, 6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069, 6070, 6071, 6072, 6073, 6074, 6075, 6076, 6077, 6078, 6079, 6080, 6081, 6082, 6083, 6084, 6085, 6086, 6087, 6088, 6089, 6090, 6091, 6092, 6093, 6094, 6095, 6096, 6097, 6098, 6099,\n    6100, 6101, 6102, 6103, 6104, 6105, 6106, 6107, 6108, 6109, 6110, 6111, 6112, 6113, 6114, 6115, 6116, 6117, 6118, 6119, 6120, 6121, 6122, 6123, 6124, 6125, 6126, 6127, 6128, 6129, 6130, 6131, 6132, 6133, 6134, 6135, 6136, 6137, 6138, 6139, 6140, 6141, 6142, 6143, 6144, 6145, 6146, 6147, 6148, 6149,\n    6150, 6151, 6152, 6153, 6154, 6155, 6156, 6157, 6158, 6159, 6160, 6161, 6162, 6163, 6164, 6165, 6166, 6167, 6168, 6169, 6170, 6171, 6172, 6173, 6174, 6175, 6176, 6177, 6178, 6179, 6180, 6181, 6182, 6183, 6184, 6185, 6186, 6187, 6188, 6189, 6190, 6191, 6192, 6193, 6194, 6195, 6196, 6197, 6198, 6199,\n    6200, 6201, 6202, 6203, 6204, 6205, 6206, 6207, 6208, 6209, 6210, 6211, 6212, 6213, 6214, 6215, 6216, 6217, 6218, 6219, 6220, 6221, 6222, 6223, 6224, 6225, 6226, 6227, 6228, 6229, 6230, 6231, 6232, 6233, 6234, 6235, 6236, 6237, 6238, 6239, 6240, 6241, 6242, 6243, 6244, 6245, 6246, 6247, 6248, 6249,\n    6250, 6251, 6252, 6253, 6254, 6255, 6256, 6257, 6258, 6259, 6260, 6261, 6262, 6263, 6264, 6265, 6266, 6267, 6268, 6269, 6270, 6271, 6272, 6273, 6274, 6275, 6276, 6277, 6278, 6279, 6280, 6281, 6282, 6283, 6284, 6285, 6286, 6287, 6288, 6289, 6290, 6291, 6292, 6293, 6294, 6295, 6296, 6297, 6298, 6299,\n    6300, 6301, 6302, 6303, 6304, 6305, 6306, 6307, 6308, 6309, 6310, 6311, 6312, 6313, 6314, 6315, 6316, 6317, 6318, 6319, 6320, 6321, 6322, 6323, 6324, 6325, 6326, 6327, 6328, 6329, 6330, 6331, 6332, 6333, 6334, 6335, 6336, 6337, 6338, 6339, 6340, 6341, 6342, 6343, 6344, 6345, 6346, 6347, 6348, 6349,\n    6350, 6351, 6352, 6353, 6354, 6355, 6356, 6357, 6358, 6359, 6360, 6361, 6362, 6363, 6364, 6365, 6366, 6367, 6368, 6369, 6370, 6371, 6372, 6373, 6374, 6375, 6376, 6377, 6378, 6379, 6380, 6381, 6382, 6383, 6384, 6385, 6386, 6387, 6388, 6389, 6390, 6391, 6392, 6393, 6394, 6395, 6396, 6397, 6398, 6399,\n    6400, 6401, 6402, 6403, 6404, 6405, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413, 6414, 6415, 6416, 6417, 6418, 6419, 6420, 6421, 6422, 6423, 6424, 6425, 6426, 6427, 6428, 6429, 6430, 6431, 6432, 6433, 6434, 6435, 6436, 6437, 6438, 6439, 6440, 6441, 6442, 6443, 6444, 6445, 6446, 6447, 6448, 6449,\n    6450, 6451, 6452, 6453, 6454, 6455, 6456, 6457, 6458, 6459, 6460, 6461, 6462, 6463, 6464, 6465, 6466, 6467, 6468, 6469, 6470, 6471, 6472, 6473, 6474, 6475, 6476, 6477, 6478, 6479, 6480, 6481, 6482, 6483, 6484, 6485, 6486, 6487, 6488, 6489, 6490, 6491, 6492, 6493, 6494, 6495, 6496, 6497, 6498, 6499,\n    6500, 6501, 6502, 6503, 6504, 6505, 6506, 6507, 6508, 6509, 6510, 6511, 6512, 6513, 6514, 6515, 6516, 6517, 6518, 6519, 6520, 6521, 6522, 6523, 6524, 6525, 6526, 6527, 6528, 6529, 6530, 6531, 6532, 6533, 6534, 6535, 6536, 6537, 6538, 6539, 6540, 6541, 6542, 6543, 6544, 6545, 6546, 6547, 6548, 6549,\n    6550, 6551, 6552, 6553, 6554, 6555, 6556, 6557, 6558, 6559, 6560, 6561, 6562, 6563, 6564, 6565, 6566, 6567, 6568, 6569, 6570, 6571, 6572, 6573, 6574, 6575, 6576, 6577, 6578, 6579, 6580, 6581, 6582, 6583, 6584, 6585, 6586, 6587, 6588, 6589, 6590, 6591, 6592, 6593, 6594, 6595, 6596, 6597, 6598, 6599,\n    6600, 6601, 6602, 6603, 6604, 6605, 6606, 6607, 6608, 6609, 6610, 6611, 6612, 6613, 6614, 6615, 6616, 6617, 6618, 6619, 6620, 6621, 6622, 6623, 6624, 6625, 6626, 6627, 6628, 6629, 6630, 6631, 6632, 6633, 6634, 6635, 6636, 6637, 6638, 6639, 6640, 6641, 6642, 6643, 6644, 6645, 6646, 6647, 6648, 6649,\n    6650, 6651, 6652, 6653, 6654, 6655, 6656, 6657, 6658, 6659, 6660, 6661, 6662, 6663, 6664, 6665, 6666, 6667, 6668, 6669, 6670, 6671, 6672, 6673, 6674, 6675, 6676, 6677, 6678, 6679, 6680, 6681, 6682, 6683, 6684, 6685, 6686, 6687, 6688, 6689, 6690, 6691, 6692, 6693, 6694, 6695, 6696, 6697, 6698, 6699,\n    6700, 6701, 6702, 6703, 6704, 6705, 6706, 6707, 6708, 6709, 6710, 6711, 6712, 6713, 6714, 6715, 6716, 6717, 6718, 6719, 6720, 6721, 6722, 6723, 6724, 6725, 6726, 6727, 6728, 6729, 6730, 6731, 6732, 6733, 6734, 6735, 6736, 6737, 6738, 6739, 6740, 6741, 6742, 6743, 6744, 6745, 6746, 6747, 6748, 6749,\n    6750, 6751, 6752, 6753, 6754, 6755, 6756, 6757, 6758, 6759, 6760, 6761, 6762, 6763, 6764, 6765, 6766, 6767, 6768, 6769, 6770, 6771, 6772, 6773, 6774, 6775, 6776, 6777, 6778, 6779, 6780, 6781, 6782, 6783, 6784, 6785, 6786, 6787, 6788, 6789, 6790, 6791, 6792, 6793, 6794, 6795, 6796, 6797, 6798, 6799,\n    6800, 6801, 6802, 6803, 6804, 6805, 6806, 6807, 6808, 6809, 6810, 6811, 6812, 6813, 6814, 6815, 6816, 6817, 6818, 6819, 6820, 6821, 6822, 6823, 6824, 6825, 6826, 6827, 6828, 6829, 6830, 6831, 6832, 6833, 6834, 6835, 6836, 6837, 6838, 6839, 6840, 6841, 6842, 6843, 6844, 6845, 6846, 6847, 6848, 6849,\n    6850, 6851, 6852, 6853, 6854, 6855, 6856, 6857, 6858, 6859, 6860, 6861, 6862, 6863, 6864, 6865, 6866, 6867, 6868, 6869, 6870, 6871, 6872, 6873, 6874, 6875, 6876, 6877, 6878, 6879, 6880, 6881, 6882, 6883, 6884, 6885, 6886, 6887, 6888, 6889, 6890, 6891, 6892, 6893, 6894, 6895, 6896, 6897, 6898, 6899,\n    6900, 6901, 6902, 6903, 6904, 6905, 6906, 6907, 6908, 6909, 6910, 6911, 6912, 6913, 6914, 6915, 6916, 6917, 6918, 6919, 6920, 6921, 6922, 6923, 6924, 6925, 6926, 6927, 6928, 6929, 6930, 6931, 6932, 6933, 6934, 6935, 6936, 6937, 6938, 6939, 6940, 6941, 6942, 6943, 6944, 6945, 6946, 6947, 6948, 6949,\n    6950, 6951, 6952, 6953, 6954, 6955, 6956, 6957, 6958, 6959, 6960, 6961, 6962, 6963, 6964, 6965, 6966, 6967, 6968, 6969, 6970, 6971, 6972, 6973, 6974, 6975, 6976, 6977, 6978, 6979, 6980, 6981, 6982, 6983, 6984, 6985, 6986, 6987, 6988, 6989, 6990, 6991, 6992, 6993, 6994, 6995, 6996, 6997, 6998, 6999,\n    7000, 7001, 7002, 7003, 7004, 7005, 7006, 7007, 7008, 7009, 7010, 7011, 7012, 7013, 7014, 7015, 7016, 7017, 7018, 7019, 7020, 7021, 7022, 7023, 7024, 7025, 7026, 7027, 7028, 7029, 7030, 7031, 7032, 7033, 7034, 7035, 7036, 7037, 7038, 7039, 7040, 7041, 7042, 7043, 7044, 7045, 7046, 7047, 7048, 7049,\n    7050, 7051, 7052, 7053, 7054, 7055, 7056, 7057, 7058, 7059, 7060, 7061, 7062, 7063, 7064, 7065, 7066, 7067, 7068, 7069, 7070, 7071, 7072, 7073, 7074, 7075, 7076, 7077, 7078, 7079, 7080, 7081, 7082, 7083, 7084, 7085, 7086, 7087, 7088, 7089, 7090, 7091, 7092, 7093, 7094, 7095, 7096, 7097, 7098, 7099,\n    7100, 7101, 7102, 7103, 7104, 7105, 7106, 7107, 7108, 7109, 7110, 7111, 7112, 7113, 7114, 7115, 7116, 7117, 7118, 7119, 7120, 7121, 7122, 7123, 7124, 7125, 7126, 7127, 7128, 7129, 7130, 7131, 7132, 7133, 7134, 7135, 7136, 7137, 7138, 7139, 7140, 7141, 7142, 7143, 7144, 7145, 7146, 7147, 7148, 7149,\n    7150, 7151, 7152, 7153, 7154, 7155, 7156, 7157, 7158, 7159, 7160, 7161, 7162, 7163, 7164, 7165, 7166, 7167, 7168, 7169, 7170, 7171, 7172, 7173, 7174, 7175, 7176, 7177, 7178, 7179, 7180, 7181, 7182, 7183, 7184, 7185, 7186, 7187, 7188, 7189, 7190, 7191, 7192, 7193, 7194, 7195, 7196, 7197, 7198, 7199,\n    7200, 7201, 7202, 7203, 7204, 7205, 7206, 7207, 7208, 7209, 7210, 7211, 7212, 7213, 7214, 7215, 7216, 7217, 7218, 7219, 7220, 7221, 7222, 7223, 7224, 7225, 7226, 7227, 7228, 7229, 7230, 7231, 7232, 7233, 7234, 7235, 7236, 7237, 7238, 7239, 7240, 7241, 7242, 7243, 7244, 7245, 7246, 7247, 7248, 7249,\n    7250, 7251, 7252, 7253, 7254, 7255, 7256, 7257, 7258, 7259, 7260, 7261, 7262, 7263, 7264, 7265, 7266, 7267, 7268, 7269, 7270, 7271, 7272, 7273, 7274, 7275, 7276, 7277, 7278, 7279, 7280, 7281, 7282, 7283, 7284, 7285, 7286, 7287, 7288, 7289, 7290, 7291, 7292, 7293, 7294, 7295, 7296, 7297, 7298, 7299,\n    7300, 7301, 7302, 7303, 7304, 7305, 7306, 7307, 7308, 7309, 7310, 7311, 7312, 7313, 7314, 7315, 7316, 7317, 7318, 7319, 7320, 7321, 7322, 7323, 7324, 7325, 7326, 7327, 7328, 7329, 7330, 7331, 7332, 7333, 7334, 7335, 7336, 7337, 7338, 7339, 7340, 7341, 7342, 7343, 7344, 7345, 7346, 7347, 7348, 7349,\n    7350, 7351, 7352, 7353, 7354, 7355, 7356, 7357, 7358, 7359, 7360, 7361, 7362, 7363, 7364, 7365, 7366, 7367, 7368, 7369, 7370, 7371, 7372, 7373, 7374, 7375, 7376, 7377, 7378, 7379, 7380, 7381, 7382, 7383, 7384, 7385, 7386, 7387, 7388, 7389, 7390, 7391, 7392, 7393, 7394, 7395, 7396, 7397, 7398, 7399,\n    7400, 7401, 7402, 7403, 7404, 7405, 7406, 7407, 7408, 7409, 7410, 7411, 7412, 7413, 7414, 7415, 7416, 7417, 7418, 7419, 7420, 7421, 7422, 7423, 7424, 7425, 7426, 7427, 7428, 7429, 7430, 7431, 7432, 7433, 7434, 7435, 7436, 7437, 7438, 7439, 7440, 7441, 7442, 7443, 7444, 7445, 7446, 7447, 7448, 7449,\n    7450, 7451, 7452, 7453, 7454, 7455, 7456, 7457, 7458, 7459, 7460, 7461, 7462, 7463, 7464, 7465, 7466, 7467, 7468, 7469, 7470, 7471, 7472, 7473, 7474, 7475, 7476, 7477, 7478, 7479, 7480, 7481, 7482, 7483, 7484, 7485, 7486, 7487, 7488, 7489, 7490, 7491, 7492, 7493, 7494, 7495, 7496, 7497, 7498, 7499,\n    7500, 7501, 7502, 7503, 7504, 7505, 7506, 7507, 7508, 7509, 7510, 7511, 7512, 7513, 7514, 7515, 7516, 7517, 7518, 7519, 7520, 7521, 7522, 7523, 7524, 7525, 7526, 7527, 7528, 7529, 7530, 7531, 7532, 7533, 7534, 7535, 7536, 7537, 7538, 7539, 7540, 7541, 7542, 7543, 7544, 7545, 7546, 7547, 7548, 7549,\n    7550, 7551, 7552, 7553, 7554, 7555, 7556, 7557, 7558, 7559, 7560, 7561, 7562, 7563, 7564, 7565, 7566, 7567, 7568, 7569, 7570, 7571, 7572, 7573, 7574, 7575, 7576, 7577, 7578, 7579, 7580, 7581, 7582, 7583, 7584, 7585, 7586, 7587, 7588, 7589, 7590, 7591, 7592, 7593, 7594, 7595, 7596, 7597, 7598, 7599,\n    7600, 7601, 7602, 7603, 7604, 7605, 7606, 7607, 7608, 7609, 7610, 7611, 7612, 7613, 7614, 7615, 7616, 7617, 7618, 7619, 7620, 7621, 7622, 7623, 7624, 7625, 7626, 7627, 7628, 7629, 7630, 7631, 7632, 7633, 7634, 7635, 7636, 7637, 7638, 7639, 7640, 7641, 7642, 7643, 7644, 7645, 7646, 7647, 7648, 7649,\n    7650, 7651, 7652, 7653, 7654, 7655, 7656, 7657, 7658, 7659, 7660, 7661, 7662, 7663, 7664, 7665, 7666, 7667, 7668, 7669, 7670, 7671, 7672, 7673, 7674, 7675, 7676, 7677, 7678, 7679, 7680, 7680, 7682, 7682, 7684, 7684, 7686, 7686, 7688, 7688, 7690, 7690, 7692, 7692, 7694, 7694, 7696, 7696, 7698, 7698,\n    7700, 7700, 7702, 7702, 7704, 7704, 7706, 7706, 7708, 7708, 7710, 7710, 7712, 7712, 7714, 7714, 7716, 7716, 7718, 7718, 7720, 7720, 7722, 7722, 7724, 7724, 7726, 7726, 7728, 7728, 7730, 7730, 7732, 7732, 7734, 7734, 7736, 7736, 7738, 7738, 7740, 7740, 7742, 7742, 7744, 7744, 7746, 7746, 7748, 7748,\n    7750, 7750, 7752, 7752, 7754, 7754, 7756, 7756, 7758, 7758, 7760, 7760, 7762, 7762, 7764, 7764, 7766, 7766, 7768, 7768, 7770, 7770, 7772, 7772, 7774, 7774, 7776, 7776, 7778, 7778, 7780, 7780, 7782, 7782, 7784, 7784, 7786, 7786, 7788, 7788, 7790, 7790, 7792, 7792, 7794, 7794, 7796, 7796, 7798, 7798,\n    7800, 7800, 7802, 7802, 7804, 7804, 7806, 7806, 7808, 7808, 7810, 7810, 7812, 7812, 7814, 7814, 7816, 7816, 7818, 7818, 7820, 7820, 7822, 7822, 7824, 7824, 7826, 7826, 7828, 7828, 7830, 7831, 7832, 7833, 7834, 7835, 7836, 7837, 7838, 7839, 7840, 7840, 7842, 7842, 7844, 7844, 7846, 7846, 7848, 7848,\n    7850, 7850, 7852, 7852, 7854, 7854, 7856, 7856, 7858, 7858, 7860, 7860, 7862, 7862, 7864, 7864, 7866, 7866, 7868, 7868, 7870, 7870, 7872, 7872, 7874, 7874, 7876, 7876, 7878, 7878, 7880, 7880, 7882, 7882, 7884, 7884, 7886, 7886, 7888, 7888, 7890, 7890, 7892, 7892, 7894, 7894, 7896, 7896, 7898, 7898,\n    7900, 7900, 7902, 7902, 7904, 7904, 7906, 7906, 7908, 7908, 7910, 7910, 7912, 7912, 7914, 7914, 7916, 7916, 7918, 7918, 7920, 7920, 7922, 7922, 7924, 7924, 7926, 7926, 7928, 7928, 7930, 7931, 7932, 7933, 7934, 7935, 7944, 7945, 7946, 7947, 7948, 7949, 7950, 7951, 7944, 7945, 7946, 7947, 7948, 7949,\n    7950, 7951, 7960, 7961, 7962, 7963, 7964, 7965, 7958, 7959, 7960, 7961, 7962, 7963, 7964, 7965, 7966, 7967, 7976, 7977, 7978, 7979, 7980, 7981, 7982, 7983, 7976, 7977, 7978, 7979, 7980, 7981, 7982, 7983, 7992, 7993, 7994, 7995, 7996, 7997, 7998, 7999, 7992, 7993, 7994, 7995, 7996, 7997, 7998, 7999,\n    8008, 8009, 8010, 8011, 8012, 8013, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016, 8025, 8018, 8027, 8020, 8029, 8022, 8031, 8024, 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8047, 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8047, 8122, 8123,\n    8136, 8137, 8138, 8139, 8154, 8155, 8184, 8185, 8170, 8171, 8186, 8187, 8062, 8063, 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099,\n    8100, 8101, 8102, 8103, 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8120, 8121, 8114, 8115, 8116, 8117, 8118, 8119, 8120, 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128, 8129, 8130, 8131, 8132, 8133, 8134, 8135, 8136, 8137, 8138, 8139, 8140, 8141, 8142, 8143, 8152, 8153, 8146, 8147, 8148, 8149,\n    8150, 8151, 8152, 8153, 8154, 8155, 8156, 8157, 8158, 8159, 8168, 8169, 8162, 8163, 8164, 8172, 8166, 8167, 8168, 8169, 8170, 8171, 8172, 8173, 8174, 8175, 8176, 8177, 8178, 8179, 8180, 8181, 8182, 8183, 8184, 8185, 8186, 8187, 8188, 8189, 8190, 8191, 8192, 8193, 8194, 8195, 8196, 8197, 8198, 8199,\n    8200, 8201, 8202, 8203, 8204, 8205, 8206, 8207, 8208, 8209, 8210, 8211, 8212, 8213, 8214, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8223, 8224, 8225, 8226, 8227, 8228, 8229, 8230, 8231, 8232, 8233, 8234, 8235, 8236, 8237, 8238, 8239, 8240, 8241, 8242, 8243, 8244, 8245, 8246, 8247, 8248, 8249,\n    8250, 8251, 8252, 8253, 8254, 8255, 8256, 8257, 8258, 8259, 8260, 8261, 8262, 8263, 8264, 8265, 8266, 8267, 8268, 8269, 8270, 8271, 8272, 8273, 8274, 8275, 8276, 8277, 8278, 8279, 8280, 8281, 8282, 8283, 8284, 8285, 8286, 8287, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 8295, 8296, 8297, 8298, 8299,\n    8300, 8301, 8302, 8303, 8304, 8305, 8306, 8307, 8308, 8309, 8310, 8311, 8312, 8313, 8314, 8315, 8316, 8317, 8318, 8319, 8320, 8321, 8322, 8323, 8324, 8325, 8326, 8327, 8328, 8329, 8330, 8331, 8332, 8333, 8334, 8335, 8336, 8337, 8338, 8339, 8340, 8341, 8342, 8343, 8344, 8345, 8346, 8347, 8348, 8349,\n    8350, 8351, 8352, 8353, 8354, 8355, 8356, 8357, 8358, 8359, 8360, 8361, 8362, 8363, 8364, 8365, 8366, 8367, 8368, 8369, 8370, 8371, 8372, 8373, 8374, 8375, 8376, 8377, 8378, 8379, 8380, 8381, 8382, 8383, 8384, 8385, 8386, 8387, 8388, 8389, 8390, 8391, 8392, 8393, 8394, 8395, 8396, 8397, 8398, 8399,\n    8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 8410, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, 8422, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 8433, 8434, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 8442, 8443, 8444, 8445, 8446, 8447, 8448, 8449,\n    8450, 8451, 8452, 8453, 8454, 8455, 8456, 8457, 8458, 8459, 8460, 8461, 8462, 8463, 8464, 8465, 8466, 8467, 8468, 8469, 8470, 8471, 8472, 8473, 8474, 8475, 8476, 8477, 8478, 8479, 8480, 8481, 8482, 8483, 8484, 8485, 8486, 8487, 8488, 8489, 8490, 8491, 8492, 8493, 8494, 8495, 8496, 8497, 8498, 8499,\n    8500, 8501, 8502, 8503, 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511, 8512, 8513, 8514, 8515, 8516, 8517, 8518, 8519, 8520, 8521, 8522, 8523, 8524, 8525, 8526, 8527, 8528, 8529, 8530, 8531, 8532, 8533, 8534, 8535, 8536, 8537, 8538, 8539, 8540, 8541, 8542, 8543, 8544, 8545, 8546, 8547, 8548, 8549,\n    8550, 8551, 8552, 8553, 8554, 8555, 8556, 8557, 8558, 8559, 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 8554, 8555, 8556, 8557, 8558, 8559, 8576, 8577, 8578, 8579, 8580, 8581, 8582, 8583, 8584, 8585, 8586, 8587, 8588, 8589, 8590, 8591, 8592, 8593, 8594, 8595, 8596, 8597, 8598, 8599,\n    8600, 8601, 8602, 8603, 8604, 8605, 8606, 8607, 8608, 8609, 8610, 8611, 8612, 8613, 8614, 8615, 8616, 8617, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8625, 8626, 8627, 8628, 8629, 8630, 8631, 8632, 8633, 8634, 8635, 8636, 8637, 8638, 8639, 8640, 8641, 8642, 8643, 8644, 8645, 8646, 8647, 8648, 8649,\n    8650, 8651, 8652, 8653, 8654, 8655, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8687, 8688, 8689, 8690, 8691, 8692, 8693, 8694, 8695, 8696, 8697, 8698, 8699,\n    8700, 8701, 8702, 8703, 8704, 8705, 8706, 8707, 8708, 8709, 8710, 8711, 8712, 8713, 8714, 8715, 8716, 8717, 8718, 8719, 8720, 8721, 8722, 8723, 8724, 8725, 8726, 8727, 8728, 8729, 8730, 8731, 8732, 8733, 8734, 8735, 8736, 8737, 8738, 8739, 8740, 8741, 8742, 8743, 8744, 8745, 8746, 8747, 8748, 8749,\n    8750, 8751, 8752, 8753, 8754, 8755, 8756, 8757, 8758, 8759, 8760, 8761, 8762, 8763, 8764, 8765, 8766, 8767, 8768, 8769, 8770, 8771, 8772, 8773, 8774, 8775, 8776, 8777, 8778, 8779, 8780, 8781, 8782, 8783, 8784, 8785, 8786, 8787, 8788, 8789, 8790, 8791, 8792, 8793, 8794, 8795, 8796, 8797, 8798, 8799,\n    8800, 8801, 8802, 8803, 8804, 8805, 8806, 8807, 8808, 8809, 8810, 8811, 8812, 8813, 8814, 8815, 8816, 8817, 8818, 8819, 8820, 8821, 8822, 8823, 8824, 8825, 8826, 8827, 8828, 8829, 8830, 8831, 8832, 8833, 8834, 8835, 8836, 8837, 8838, 8839, 8840, 8841, 8842, 8843, 8844, 8845, 8846, 8847, 8848, 8849,\n    8850, 8851, 8852, 8853, 8854, 8855, 8856, 8857, 8858, 8859, 8860, 8861, 8862, 8863, 8864, 8865, 8866, 8867, 8868, 8869, 8870, 8871, 8872, 8873, 8874, 8875, 8876, 8877, 8878, 8879, 8880, 8881, 8882, 8883, 8884, 8885, 8886, 8887, 8888, 8889, 8890, 8891, 8892, 8893, 8894, 8895, 8896, 8897, 8898, 8899,\n    8900, 8901, 8902, 8903, 8904, 8905, 8906, 8907, 8908, 8909, 8910, 8911, 8912, 8913, 8914, 8915, 8916, 8917, 8918, 8919, 8920, 8921, 8922, 8923, 8924, 8925, 8926, 8927, 8928, 8929, 8930, 8931, 8932, 8933, 8934, 8935, 8936, 8937, 8938, 8939, 8940, 8941, 8942, 8943, 8944, 8945, 8946, 8947, 8948, 8949,\n    8950, 8951, 8952, 8953, 8954, 8955, 8956, 8957, 8958, 8959, 8960, 8961, 8962, 8963, 8964, 8965, 8966, 8967, 8968, 8969, 8970, 8971, 8972, 8973, 8974, 8975, 8976, 8977, 8978, 8979, 8980, 8981, 8982, 8983, 8984, 8985, 8986, 8987, 8988, 8989, 8990, 8991, 8992, 8993, 8994, 8995, 8996, 8997, 8998, 8999,\n    9000, 9001, 9002, 9003, 9004, 9005, 9006, 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 9015, 9016, 9017, 9018, 9019, 9020, 9021, 9022, 9023, 9024, 9025, 9026, 9027, 9028, 9029, 9030, 9031, 9032, 9033, 9034, 9035, 9036, 9037, 9038, 9039, 9040, 9041, 9042, 9043, 9044, 9045, 9046, 9047, 9048, 9049,\n    9050, 9051, 9052, 9053, 9054, 9055, 9056, 9057, 9058, 9059, 9060, 9061, 9062, 9063, 9064, 9065, 9066, 9067, 9068, 9069, 9070, 9071, 9072, 9073, 9074, 9075, 9076, 9077, 9078, 9079, 9080, 9081, 9082, 9083, 9084, 9085, 9086, 9087, 9088, 9089, 9090, 9091, 9092, 9093, 9094, 9095, 9096, 9097, 9098, 9099,\n    9100, 9101, 9102, 9103, 9104, 9105, 9106, 9107, 9108, 9109, 9110, 9111, 9112, 9113, 9114, 9115, 9116, 9117, 9118, 9119, 9120, 9121, 9122, 9123, 9124, 9125, 9126, 9127, 9128, 9129, 9130, 9131, 9132, 9133, 9134, 9135, 9136, 9137, 9138, 9139, 9140, 9141, 9142, 9143, 9144, 9145, 9146, 9147, 9148, 9149,\n    9150, 9151, 9152, 9153, 9154, 9155, 9156, 9157, 9158, 9159, 9160, 9161, 9162, 9163, 9164, 9165, 9166, 9167, 9168, 9169, 9170, 9171, 9172, 9173, 9174, 9175, 9176, 9177, 9178, 9179, 9180, 9181, 9182, 9183, 9184, 9185, 9186, 9187, 9188, 9189, 9190, 9191, 9192, 9193, 9194, 9195, 9196, 9197, 9198, 9199,\n    9200, 9201, 9202, 9203, 9204, 9205, 9206, 9207, 9208, 9209, 9210, 9211, 9212, 9213, 9214, 9215, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223, 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, 9234, 9235, 9236, 9237, 9238, 9239, 9240, 9241, 9242, 9243, 9244, 9245, 9246, 9247, 9248, 9249,\n    9250, 9251, 9252, 9253, 9254, 9255, 9256, 9257, 9258, 9259, 9260, 9261, 9262, 9263, 9264, 9265, 9266, 9267, 9268, 9269, 9270, 9271, 9272, 9273, 9274, 9275, 9276, 9277, 9278, 9279, 9280, 9281, 9282, 9283, 9284, 9285, 9286, 9287, 9288, 9289, 9290, 9291, 9292, 9293, 9294, 9295, 9296, 9297, 9298, 9299,\n    9300, 9301, 9302, 9303, 9304, 9305, 9306, 9307, 9308, 9309, 9310, 9311, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, 9340, 9341, 9342, 9343, 9344, 9345, 9346, 9347, 9348, 9349,\n    9350, 9351, 9352, 9353, 9354, 9355, 9356, 9357, 9358, 9359, 9360, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, 9369, 9370, 9371, 9372, 9373, 9374, 9375, 9376, 9377, 9378, 9379, 9380, 9381, 9382, 9383, 9384, 9385, 9386, 9387, 9388, 9389, 9390, 9391, 9392, 9393, 9394, 9395, 9396, 9397, 9398, 9399,\n    9400, 9401, 9402, 9403, 9404, 9405, 9406, 9407, 9408, 9409, 9410, 9411, 9412, 9413, 9414, 9415, 9416, 9417, 9418, 9419, 9420, 9421, 9422, 9423, 9398, 9399, 9400, 9401, 9402, 9403, 9404, 9405, 9406, 9407, 9408, 9409, 9410, 9411, 9412, 9413, 9414, 9415, 9416, 9417, 9418, 9419, 9420, 9421, 9422, 9423\n};\n\nconst Il2CppChar ToUpperDataHigh[] =\n{\n    65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324,\n    65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, 65333, 65334, 65335, 65336,\n    65337, 65338, 65339, 65340, 65341, 65342, 65343, 65344, 65313, 65314, 65315, 65316,\n    65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, 65325, 65326, 65327, 65328,\n    65329, 65330, 65331, 65332, 65333, 65334, 65335, 65336, 65337, 65338, 65371, 65372,\n    65373, 65374, 65375, 65376, 65377, 65378, 65379, 65380, 65381, 65382, 65383, 65384,\n    65385, 65386, 65387, 65388, 65389, 65390, 65391, 65392, 65393, 65394, 65395, 65396,\n    65397, 65398, 65399, 65400, 65401, 65402, 65403, 65404, 65405, 65406, 65407, 65408,\n    65409, 65410, 65411, 65412, 65413, 65414, 65415, 65416, 65417, 65418, 65419, 65420,\n    65421, 65422, 65423, 65424, 65425, 65426, 65427, 65428, 65429, 65430, 65431, 65432,\n    65433, 65434, 65435, 65436, 65437, 65438, 65439, 65440, 65441, 65442, 65443, 65444,\n    65445, 65446, 65447, 65448, 65449, 65450, 65451, 65452, 65453, 65454, 65455, 65456,\n    65457, 65458, 65459, 65460, 65461, 65462, 65463, 65464, 65465, 65466, 65467, 65468,\n    65469, 65470, 65471, 65472, 65473, 65474, 65475, 65476, 65477, 65478, 65479, 65480,\n    65481, 65482, 65483, 65484, 65485, 65486, 65487, 65488, 65489, 65490, 65491, 65492,\n    65493, 65494, 65495, 65496, 65497, 65498, 65499, 65500, 65501, 65502, 65503, 65504,\n    65505, 65506, 65507, 65508, 65509, 65510, 65511, 65512, 65513, 65514, 65515, 65516,\n    65517, 65518, 65519, 65520, 65521, 65522, 65523, 65524, 65525, 65526, 65527, 65528,\n    65529, 65530, 65531, 65532, 65533, 65534, 65535\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/char-conversions.h",
    "content": "#pragma once\n\nextern const uint8_t CategoryData_v4[71680];\nextern const uint8_t NumericData[12938];\nextern const double NumericDataValues[58];\nextern const Il2CppChar ToLowerDataLow[9424];\nextern const Il2CppChar ToLowerDataHigh[223];\nextern const Il2CppChar ToUpperDataLow[9450];\nextern const Il2CppChar ToUpperDataHigh[223];\n"
  },
  {
    "path": "unity_decoder/libil2cpp/class-internals.cpp",
    "content": "#include \"class-internals.h\"\n\nIl2CppRuntimeStats il2cpp_runtime_stats = { 0 };\n"
  },
  {
    "path": "unity_decoder/libil2cpp/class-internals.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include <stdint.h>\n#include \"metadata.h\"\n#include \"il2cpp-metadata.h\"\n\n#define IL2CPP_CLASS_IS_ARRAY(c) ((c)->rank)\n\nstruct Il2CppClass;\nstruct Il2CppGuid;\nstruct Il2CppImage;\nstruct Il2CppAssembly;\nstruct Il2CppAppDomain;\nstruct Il2CppAppDomainSetup;\nstruct Il2CppDelegate;\nstruct Il2CppAppContext;\nstruct Il2CppNameToTypeDefinitionIndexHashTable;\n\nstruct VirtualInvokeData\n{\n    Il2CppMethodPointer methodPtr;\n#if RUNTIME_MONO\n    const MonoMethod* method;\n#else\n    const MethodInfo* method;\n#endif\n};\n\nenum Il2CppTypeNameFormat\n{\n    IL2CPP_TYPE_NAME_FORMAT_IL,\n    IL2CPP_TYPE_NAME_FORMAT_REFLECTION,\n    IL2CPP_TYPE_NAME_FORMAT_FULL_NAME,\n    IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED\n};\n\nextern bool g_il2cpp_is_fully_initialized;\n\ntypedef struct\n{\n    Il2CppImage *corlib;\n    Il2CppClass *object_class;\n    Il2CppClass *byte_class;\n    Il2CppClass *void_class;\n    Il2CppClass *boolean_class;\n    Il2CppClass *sbyte_class;\n    Il2CppClass *int16_class;\n    Il2CppClass *uint16_class;\n    Il2CppClass *int32_class;\n    Il2CppClass *uint32_class;\n    Il2CppClass *int_class;\n    Il2CppClass *uint_class;\n    Il2CppClass *int64_class;\n    Il2CppClass *uint64_class;\n    Il2CppClass *single_class;\n    Il2CppClass *double_class;\n    Il2CppClass *char_class;\n    Il2CppClass *string_class;\n    Il2CppClass *enum_class;\n    Il2CppClass *array_class;\n    Il2CppClass *delegate_class;\n    Il2CppClass *multicastdelegate_class;\n    Il2CppClass *asyncresult_class;\n    Il2CppClass *manualresetevent_class;\n    Il2CppClass *typehandle_class;\n    Il2CppClass *fieldhandle_class;\n    Il2CppClass *methodhandle_class;\n    Il2CppClass *systemtype_class;\n    Il2CppClass *monotype_class;\n    Il2CppClass *exception_class;\n    Il2CppClass *threadabortexception_class;\n    Il2CppClass *thread_class;\n#if NET_4_0\n    Il2CppClass *internal_thread_class;\n#endif\n    /*Il2CppClass *transparent_proxy_class;\n    Il2CppClass *real_proxy_class;\n    Il2CppClass *mono_method_message_class;*/\n    Il2CppClass *appdomain_class;\n    Il2CppClass *appdomain_setup_class;\n    Il2CppClass *field_info_class;\n    Il2CppClass *method_info_class;\n    Il2CppClass *property_info_class;\n    Il2CppClass *event_info_class;\n    Il2CppClass *mono_event_info_class;\n    Il2CppClass *stringbuilder_class;\n    /*Il2CppClass *math_class;*/\n    Il2CppClass *stack_frame_class;\n    Il2CppClass *stack_trace_class;\n    Il2CppClass *marshal_class;\n    /*Il2CppClass *iserializeable_class;\n    Il2CppClass *serializationinfo_class;\n    Il2CppClass *streamingcontext_class;*/\n    Il2CppClass *typed_reference_class;\n    /*Il2CppClass *argumenthandle_class;*/\n    Il2CppClass *marshalbyrefobject_class;\n    /*Il2CppClass *monitor_class;\n    Il2CppClass *iremotingtypeinfo_class;\n    Il2CppClass *runtimesecurityframe_class;\n    Il2CppClass *executioncontext_class;\n    Il2CppClass *internals_visible_class;*/\n    Il2CppClass *generic_ilist_class;\n    Il2CppClass *generic_icollection_class;\n    Il2CppClass *generic_ienumerable_class;\n#if NET_4_0\n    Il2CppClass *generic_ireadonlylist_class;\n    Il2CppClass *generic_ireadonlycollection_class;\n    Il2CppClass *runtimetype_class;\n#endif\n    Il2CppClass *generic_nullable_class;\n    /*Il2CppClass *variant_class;\n    Il2CppClass *com_object_class;*/\n    Il2CppClass *il2cpp_com_object_class;\n    /*Il2CppClass *com_interop_proxy_class;\n    Il2CppClass *iunknown_class;\n    Il2CppClass *idispatch_class;\n    Il2CppClass *safehandle_class;\n    Il2CppClass *handleref_class;\n    Il2CppClass *attribute_class;*/\n    Il2CppClass *customattribute_data_class;\n    //Il2CppClass *critical_finalizer_object;\n    Il2CppClass *version;\n    Il2CppClass *culture_info;\n    Il2CppClass *async_call_class;\n    Il2CppClass *assembly_class;\n#if NET_4_0\n    Il2CppClass *mono_assembly_class;\n#endif\n    Il2CppClass *assembly_name_class;\n#if !NET_4_0\n    Il2CppClass *enum_info_class;\n#endif\n    Il2CppClass *mono_field_class;\n    Il2CppClass *mono_method_class;\n    Il2CppClass *mono_method_info_class;\n    Il2CppClass *mono_property_info_class;\n    Il2CppClass *parameter_info_class;\n#if NET_4_0\n    Il2CppClass *mono_parameter_info_class;\n#endif\n    Il2CppClass *module_class;\n    Il2CppClass *pointer_class;\n    Il2CppClass *system_exception_class;\n    Il2CppClass *argument_exception_class;\n    Il2CppClass *wait_handle_class;\n    Il2CppClass *safe_handle_class;\n    Il2CppClass *sort_key_class;\n    Il2CppClass *dbnull_class;\n    Il2CppClass *error_wrapper_class;\n    Il2CppClass *missing_class;\n    Il2CppClass *value_type_class;\n\n#if NET_4_0\n    // Stuff used by the mono code\n    Il2CppClass *threadpool_wait_callback_class;\n    MethodInfo *threadpool_perform_wait_callback_method;\n    Il2CppClass *mono_method_message_class;\n#endif\n\n    // Windows.Foundation.IReference`1<T>\n    Il2CppClass* ireference_class;\n    // Windows.Foundation.Collections.IKeyValuePair`2<K, V>\n    Il2CppClass* ikey_value_pair_class;\n    // System.Collections.Generic.KeyValuePair`2<K, V>\n    Il2CppClass* key_value_pair_class;\n    // Windows.Foundation.Uri\n    Il2CppClass* windows_foundation_uri_class;\n    // Windows.Foundation.IUriRuntimeClass\n    Il2CppClass* windows_foundation_iuri_runtime_class_class;\n    // System.Uri\n    Il2CppClass* system_uri_class;\n} Il2CppDefaults;\n\nextern LIBIL2CPP_CODEGEN_API Il2CppDefaults il2cpp_defaults;\n\nstruct Il2CppClass;\nstruct MethodInfo;\nstruct FieldInfo;\nstruct Il2CppObject;\nstruct MemberInfo;\n\nstruct CustomAttributesCache\n{\n    int count;\n    Il2CppObject** attributes;\n};\n\nstruct CustomAttributeTypeCache\n{\n    int count;\n    Il2CppClass** attributeTypes;\n};\n\ntypedef void (*CustomAttributesCacheGenerator)(CustomAttributesCache*);\n\nconst int THREAD_STATIC_FIELD_OFFSET = -1;\n\nstruct FieldInfo\n{\n    const char* name;\n    const Il2CppType* type;\n    Il2CppClass *parent;\n    int32_t offset; // If offset is -1, then it's thread static\n    CustomAttributeIndex customAttributeIndex;\n    uint32_t token;\n};\n\nstruct PropertyInfo\n{\n    Il2CppClass *parent;\n    const char *name;\n    const MethodInfo *get;\n    const MethodInfo *set;\n    uint32_t attrs;\n    CustomAttributeIndex customAttributeIndex;\n    uint32_t token;\n};\n\nstruct EventInfo\n{\n    const char* name;\n    const Il2CppType* eventType;\n    Il2CppClass* parent;\n    const MethodInfo* add;\n    const MethodInfo* remove;\n    const MethodInfo* raise;\n    CustomAttributeIndex customAttributeIndex;\n    uint32_t token;\n};\n\nstruct ParameterInfo\n{\n    const char* name;\n    int32_t position;\n    uint32_t token;\n    CustomAttributeIndex customAttributeIndex;\n    const Il2CppType* parameter_type;\n};\n\n#if RUNTIME_MONO\ntypedef void* (*InvokerMethod)(Il2CppMethodPointer, const MonoMethod*, void*, void**);\n#else\ntypedef void* (*InvokerMethod)(Il2CppMethodPointer, const MethodInfo*, void*, void**);\n#endif\n\n#if IL2CPP_DEBUGGER_ENABLED\nstruct Il2CppDebugDocument\n{\n    const char *directory;\n    const char *filename;\n};\n\nstruct Il2CppDebugTypeInfo\n{\n    const Il2CppDebugDocument *document;\n};\n\nstruct Il2CppDebugLocalsInfo\n{\n    Il2CppClass *type;\n    const char *name;\n    uint32_t start_offset;\n    uint32_t end_offset;\n};\n\nstruct SequencePointRecord\n{\n    int32_t start_offset;\n    int32_t end_offset;\n    void *user_data;\n};\n\nstruct Il2CppDebugMethodInfo\n{\n    const Il2CppDebugDocument *document;\n    // Table of [offset -> lineno] mapping.\n    // Ends with {-1,-1}\n    const int32_t *offsets_table;\n    const size_t code_size;\n    const Il2CppDebugLocalsInfo **locals;\n\n    int32_t sequence_points_count;\n    int32_t breakpoints_count;// incremented atomically\n    SequencePointRecord *sequence_points;\n};\n#endif\n\nunion Il2CppRGCTXData\n{\n    void* rgctxDataDummy;\n    const MethodInfo* method;\n    const Il2CppType* type;\n    Il2CppClass* klass;\n};\n\nstruct MethodInfo\n{\n    Il2CppMethodPointer methodPointer;\n    InvokerMethod invoker_method;\n    const char* name;\n    Il2CppClass *declaring_type;\n    const Il2CppType *return_type;\n    const ParameterInfo* parameters;\n\n    union\n    {\n        const Il2CppRGCTXData* rgctx_data; /* is_inflated is true and is_generic is false, i.e. a generic instance method */\n        const Il2CppMethodDefinition* methodDefinition;\n    };\n\n    /* note, when is_generic == true and is_inflated == true the method represents an uninflated generic method on an inflated type. */\n    union\n    {\n        const Il2CppGenericMethod* genericMethod; /* is_inflated is true */\n        const Il2CppGenericContainer* genericContainer; /* is_inflated is false and is_generic is true */\n    };\n\n    CustomAttributeIndex customAttributeIndex;\n    uint32_t token;\n    uint16_t flags;\n    uint16_t iflags;\n    uint16_t slot;\n    uint8_t parameters_count;\n    uint8_t is_generic : 1; /* true if method is a generic method definition */\n    uint8_t is_inflated : 1; /* true if declaring_type is a generic instance or if method is a generic instance*/\n\n#if IL2CPP_DEBUGGER_ENABLED\n    const Il2CppDebugMethodInfo *debug_info;\n#endif\n};\n\nstruct Il2CppRuntimeInterfaceOffsetPair\n{\n    Il2CppClass* interfaceType;\n    int32_t offset;\n};\n\ntypedef void (*PInvokeMarshalToNativeFunc)(void* managedStructure, void* marshaledStructure);\ntypedef void (*PInvokeMarshalFromNativeFunc)(void* marshaledStructure, void* managedStructure);\ntypedef void (*PInvokeMarshalCleanupFunc)(void* marshaledStructure);\ntypedef struct Il2CppIUnknown* (*CreateCCWFunc)(Il2CppObject* obj);\n\n#if RUNTIME_MONO\n#include \"il2cpp-mapping.h\"\n#endif\n\nstruct Il2CppInteropData\n{\n    Il2CppMethodPointer delegatePInvokeWrapperFunction;\n    PInvokeMarshalToNativeFunc pinvokeMarshalToNativeFunction;\n    PInvokeMarshalFromNativeFunc pinvokeMarshalFromNativeFunction;\n    PInvokeMarshalCleanupFunc pinvokeMarshalCleanupFunction;\n    CreateCCWFunc createCCWFunction;\n    const Il2CppGuid* guid;\n#if RUNTIME_MONO\n    MonoMetadataToken typeToken;\n    uint64_t hash;\n#else\n    const Il2CppType* type;\n#endif\n};\n\n#if IL2CPP_COMPILER_MSVC\n#pragma warning( push )\n#pragma warning( disable : 4200 )\n#elif defined(__clang__)\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Winvalid-offsetof\"\n#endif\n\nstruct Il2CppClass\n{\n    // The following fields are always valid for a Il2CppClass structure\n    const Il2CppImage* image;\n    void* gc_desc;\n    const char* name;\n    const char* namespaze;\n    const Il2CppType* byval_arg;\n    const Il2CppType* this_arg;\n    Il2CppClass* element_class;\n    Il2CppClass* castClass;\n    Il2CppClass* declaringType;\n    Il2CppClass* parent;\n    Il2CppGenericClass *generic_class;\n    const Il2CppTypeDefinition* typeDefinition; // non-NULL for Il2CppClass's constructed from type defintions\n    const Il2CppInteropData* interopData;\n    // End always valid fields\n\n    // The following fields need initialized before access. This can be done per field or as an aggregate via a call to Class::Init\n    FieldInfo* fields; // Initialized in SetupFields\n    const EventInfo* events; // Initialized in SetupEvents\n    const PropertyInfo* properties; // Initialized in SetupProperties\n    const MethodInfo** methods; // Initialized in SetupMethods\n    Il2CppClass** nestedTypes; // Initialized in SetupNestedTypes\n    Il2CppClass** implementedInterfaces; // Initialized in SetupInterfaces\n    Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; // Initialized in Init\n    void* static_fields; // Initialized in Init\n    const Il2CppRGCTXData* rgctx_data; // Initialized in Init\n    // used for fast parent checks\n    Il2CppClass** typeHierarchy; // Initialized in SetupTypeHierachy\n    // End initialization required fields\n\n#if IL2CPP_DEBUGGER_ENABLED\n    const Il2CppDebugTypeInfo *debug_info;\n#endif\n\n    uint32_t cctor_started;\n    uint32_t cctor_finished;\n    ALIGN_TYPE(8) uint64_t cctor_thread;\n\n    // Remaining fields are always valid except where noted\n    GenericContainerIndex genericContainerIndex;\n    CustomAttributeIndex customAttributeIndex;\n    uint32_t instance_size;\n    uint32_t actualSize;\n    uint32_t element_size;\n    int32_t native_size;\n    uint32_t static_fields_size;\n    uint32_t thread_static_fields_size;\n    int32_t thread_static_fields_offset;\n    uint32_t flags;\n    uint32_t token;\n\n    uint16_t method_count; // lazily calculated for arrays, i.e. when rank > 0\n    uint16_t property_count;\n    uint16_t field_count;\n    uint16_t event_count;\n    uint16_t nested_type_count;\n    uint16_t vtable_count; // lazily calculated for arrays, i.e. when rank > 0\n    uint16_t interfaces_count;\n    uint16_t interface_offsets_count; // lazily calculated for arrays, i.e. when rank > 0\n\n    uint8_t typeHierarchyDepth; // Initialized in SetupTypeHierachy\n    uint8_t genericRecursionDepth;\n    uint8_t rank;\n    uint8_t minimumAlignment;\n    uint8_t packingSize;\n\n    uint8_t valuetype : 1;\n    uint8_t initialized : 1;\n    uint8_t enumtype : 1;\n    uint8_t is_generic : 1;\n    uint8_t has_references : 1;\n    uint8_t init_pending : 1;\n    uint8_t size_inited : 1;\n    uint8_t has_finalize : 1;\n    uint8_t has_cctor : 1;\n    uint8_t is_blittable : 1;\n    uint8_t is_import_or_windows_runtime : 1;\n    uint8_t is_vtable_initialized : 1;\n    VirtualInvokeData vtable[IL2CPP_ZERO_LEN_ARRAY];\n};\n\n#if IL2CPP_COMPILER_MSVC\n#pragma warning( pop )\n#elif defined(__clang__)\n#pragma clang diagnostic pop\n#endif\n\n// compiler calcualted values\nstruct Il2CppTypeDefinitionSizes\n{\n    uint32_t instance_size;\n    int32_t native_size;\n    uint32_t static_fields_size;\n    uint32_t thread_static_fields_size;\n};\n\nstruct Il2CppDomain\n{\n    Il2CppAppDomain* domain;\n    Il2CppAppDomainSetup* setup;\n    Il2CppAppContext* default_context;\n    const char* friendly_name;\n    uint32_t domain_id;\n\n#if NET_4_0\n    volatile int threadpool_jobs;\n#endif\n};\n\nstruct Il2CppImage\n{\n    const char* name;\n    const char* nameNoExt;\n    AssemblyIndex assemblyIndex;\n\n    TypeDefinitionIndex typeStart;\n    uint32_t typeCount;\n\n    TypeDefinitionIndex exportedTypeStart;\n    uint32_t exportedTypeCount;\n\n    MethodIndex entryPointIndex;\n\n    mutable Il2CppNameToTypeDefinitionIndexHashTable* nameToClassHashTable;\n\n    uint32_t token;\n};\n\nstruct Il2CppCodeGenOptions\n{\n    bool enablePrimitiveValueTypeGenericSharing;\n};\n\nstruct Il2CppCodeRegistration\n{\n    uint32_t methodPointersCount;\n    const Il2CppMethodPointer* methodPointers;\n    uint32_t reversePInvokeWrapperCount;\n    const Il2CppMethodPointer* reversePInvokeWrappers;\n    uint32_t genericMethodPointersCount;\n    const Il2CppMethodPointer* genericMethodPointers;\n    uint32_t invokerPointersCount;\n    const InvokerMethod* invokerPointers;\n    CustomAttributeIndex customAttributeCount;\n    const CustomAttributesCacheGenerator* customAttributeGenerators;\n    uint32_t unresolvedVirtualCallCount;\n    const Il2CppMethodPointer* unresolvedVirtualCallPointers;\n    uint32_t interopDataCount;\n    Il2CppInteropData* interopData;\n};\n\nstruct Il2CppMetadataRegistration\n{\n    int32_t genericClassesCount;\n    Il2CppGenericClass* const * genericClasses;\n    int32_t genericInstsCount;\n    const Il2CppGenericInst* const * genericInsts;\n    int32_t genericMethodTableCount;\n    const Il2CppGenericMethodFunctionsDefinitions* genericMethodTable;\n    int32_t typesCount;\n    const Il2CppType* const * types;\n    int32_t methodSpecsCount;\n    const Il2CppMethodSpec* methodSpecs;\n\n    FieldIndex fieldOffsetsCount;\n    const int32_t** fieldOffsets;\n\n    TypeDefinitionIndex typeDefinitionsSizesCount;\n    const Il2CppTypeDefinitionSizes** typeDefinitionsSizes;\n    const size_t metadataUsagesCount;\n    void** const* metadataUsages;\n};\n\nstruct Il2CppRuntimeStats\n{\n    uint64_t new_object_count;\n    uint64_t initialized_class_count;\n    // uint64_t generic_vtable_count;\n    // uint64_t used_class_count;\n    uint64_t method_count;\n    // uint64_t class_vtable_size;\n    uint64_t class_static_data_size;\n    uint64_t generic_instance_count;\n    uint64_t generic_class_count;\n    uint64_t inflated_method_count;\n    uint64_t inflated_type_count;\n    // uint64_t delegate_creations;\n    // uint64_t minor_gc_count;\n    // uint64_t major_gc_count;\n    // uint64_t minor_gc_time_usecs;\n    // uint64_t major_gc_time_usecs;\n    bool enabled;\n};\n\nextern Il2CppRuntimeStats il2cpp_runtime_stats;\n\n/*\n* new structure to hold performance counters values that are exported\n* to managed code.\n* Note: never remove fields from this structure and only add them to the end.\n* Size of fields and type should not be changed as well.\n*/\nstruct Il2CppPerfCounters\n{\n    /* JIT category */\n    uint32_t jit_methods;\n    uint32_t jit_bytes;\n    uint32_t jit_time;\n    uint32_t jit_failures;\n    /* Exceptions category */\n    uint32_t exceptions_thrown;\n    uint32_t exceptions_filters;\n    uint32_t exceptions_finallys;\n    uint32_t exceptions_depth;\n    uint32_t aspnet_requests_queued;\n    uint32_t aspnet_requests;\n    /* Memory category */\n    uint32_t gc_collections0;\n    uint32_t gc_collections1;\n    uint32_t gc_collections2;\n    uint32_t gc_promotions0;\n    uint32_t gc_promotions1;\n    uint32_t gc_promotion_finalizers;\n    uint32_t gc_gen0size;\n    uint32_t gc_gen1size;\n    uint32_t gc_gen2size;\n    uint32_t gc_lossize;\n    uint32_t gc_fin_survivors;\n    uint32_t gc_num_handles;\n    uint32_t gc_allocated;\n    uint32_t gc_induced;\n    uint32_t gc_time;\n    uint32_t gc_total_bytes;\n    uint32_t gc_committed_bytes;\n    uint32_t gc_reserved_bytes;\n    uint32_t gc_num_pinned;\n    uint32_t gc_sync_blocks;\n    /* Remoting category */\n    uint32_t remoting_calls;\n    uint32_t remoting_channels;\n    uint32_t remoting_proxies;\n    uint32_t remoting_classes;\n    uint32_t remoting_objects;\n    uint32_t remoting_contexts;\n    /* Loader category */\n    uint32_t loader_classes;\n    uint32_t loader_total_classes;\n    uint32_t loader_appdomains;\n    uint32_t loader_total_appdomains;\n    uint32_t loader_assemblies;\n    uint32_t loader_total_assemblies;\n    uint32_t loader_failures;\n    uint32_t loader_bytes;\n    uint32_t loader_appdomains_uloaded;\n    /* Threads and Locks category  */\n    uint32_t thread_contentions;\n    uint32_t thread_queue_len;\n    uint32_t thread_queue_max;\n    uint32_t thread_num_logical;\n    uint32_t thread_num_physical;\n    uint32_t thread_cur_recognized;\n    uint32_t thread_num_recognized;\n    /* Interop category */\n    uint32_t interop_num_ccw;\n    uint32_t interop_num_stubs;\n    uint32_t interop_num_marshals;\n    /* Security category */\n    uint32_t security_num_checks;\n    uint32_t security_num_link_checks;\n    uint32_t security_time;\n    uint32_t security_depth;\n    uint32_t unused;\n    /* Threadpool */\n    uint64_t threadpool_workitems;\n    uint64_t threadpool_ioworkitems;\n    unsigned int threadpool_threads;\n    unsigned int threadpool_iothreads;\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/codegen/il2cpp-codegen-common.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\n#include <cassert>\n#include <cstdlib>\n#include <limits>\n#include <string>\n#include <math.h>\n#include <vector>\n\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"tabledefs.h\"\n#include \"icallincludes.h\"\n\n#include \"vm/PlatformInvoke.h\"\n#include \"vm/StackTrace.h\"\n#include \"vm/PlatformInvoke.h\"\n#include \"vm/StackTrace.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/StringView.h\"\n#include \"utils/Exception.h\"\n#include \"utils/Output.h\"\n#include \"utils/Runtime.h\"\n\n#ifdef _MSC_VER\n#define IL2CPP_DEBUG_BREAK() __debugbreak()\n#else\n#define IL2CPP_DEBUG_BREAK()\n#endif\n\n// This function exists to help with generation of callstacks for exceptions\n// on iOS and MacOS x64 with clang 6.0 (newer versions of clang don't have this\n// problem on x64). There we call the backtrace function, which does not play nicely\n// with NORETURN, since the compiler eliminates the method prologue code setting up\n// the address of the return frame (which makes sense). So on iOS we need to make\n// the NORETURN define do nothing, then we use this dummy method which has the\n// attribute for clang on iOS defined to prevent clang compiler errors for\n// method that end by throwing a managed exception.\nREAL_NORETURN IL2CPP_NO_INLINE static void il2cpp_codegen_no_return()\n{\n    IL2CPP_UNREACHABLE;\n}\n\n#if IL2CPP_COMPILER_MSVC\n#define STDCALL __stdcall\n#define CDECL __cdecl\n#define DEFAULT_CALL STDCALL\n#else\n#define STDCALL\n#define CDECL\n#define DEFAULT_CALL\n#endif\n\n#if defined(__ARMCC_VERSION)\ninline double bankers_round(double x)\n{\n    return __builtin_round(x);\n}\n\ninline float bankers_roundf(float x)\n{\n    return __builtin_roundf(x);\n}\n\n#else\ninline double bankers_round(double x)\n{\n    double integerPart;\n    if (x >= 0.0)\n    {\n        if (modf(x, &integerPart) == 0.5)\n            return (int64_t)integerPart % 2 == 0 ? integerPart : integerPart + 1.0;\n        return floor(x + 0.5);\n    }\n    else\n    {\n        if (modf(x, &integerPart) == -0.5)\n            return (int64_t)integerPart % 2 == 0 ? integerPart : integerPart - 1.0;\n        return ceil(x - 0.5);\n    }\n}\n\ninline float bankers_roundf(float x)\n{\n    double integerPart;\n    if (x >= 0.0f)\n    {\n        if (modf(x, &integerPart) == 0.5)\n            return (int64_t)integerPart % 2 == 0 ? (float)integerPart : (float)integerPart + 1.0f;\n        return floorf(x + 0.5f);\n    }\n    else\n    {\n        if (modf(x, &integerPart) == -0.5)\n            return (int64_t)integerPart % 2 == 0 ? (float)integerPart : (float)integerPart - 1.0f;\n        return ceilf(x - 0.5f);\n    }\n}\n\n#endif\n\n// returns true if overflow occurs\ninline bool il2cpp_codegen_check_mul_overflow_i64(int64_t a, int64_t b, int64_t imin, int64_t imax)\n{\n    // TODO: use a better algorithm without division\n    uint64_t ua = (uint64_t)llabs(a);\n    uint64_t ub = (uint64_t)llabs(b);\n\n    uint64_t c;\n    if ((a > 0 && b > 0) || (a <= 0 && b <= 0))\n        c = (uint64_t)llabs(imax);\n    else\n        c = (uint64_t)llabs(imin);\n\n    return ua != 0 && ub > c / ua;\n}\n\ninline int32_t il2cpp_codegen_abs(uint32_t value)\n{\n    return abs(static_cast<int32_t>(value));\n}\n\ninline int32_t il2cpp_codegen_abs(int32_t value)\n{\n    return abs(value);\n}\n\ninline int64_t il2cpp_codegen_abs(uint64_t value)\n{\n    return llabs(static_cast<int64_t>(value));\n}\n\ninline int64_t il2cpp_codegen_abs(int64_t value)\n{\n    return llabs(value);\n}\n\n// Exception support macros\n#define IL2CPP_LEAVE(Offset, Target) \\\n    __leave_target = Offset; \\\n    goto Target;\n\n#define IL2CPP_END_FINALLY(Id) \\\n    goto __CLEANUP_ ## Id;\n\n#define IL2CPP_CLEANUP(Id) \\\n    __CLEANUP_ ## Id:\n\n#define IL2CPP_RETHROW_IF_UNHANDLED(ExcType) \\\n    if(__last_unhandled_exception) { \\\n        ExcType _tmp_exception_local = __last_unhandled_exception; \\\n        __last_unhandled_exception = 0; \\\n        il2cpp_codegen_raise_exception(_tmp_exception_local); \\\n        }\n\n#define IL2CPP_JUMP_TBL(Offset, Target) \\\n    if(__leave_target == Offset) { \\\n        __leave_target = 0; \\\n        goto Target; \\\n        }\n\n#define IL2CPP_END_CLEANUP(Offset, Target) \\\n    if(__leave_target == Offset) \\\n        goto Target;\n\n#define IL2CPP_RAISE_MANAGED_EXCEPTION(message) \\\n    do {\\\n        il2cpp_codegen_raise_exception((Il2CppCodeGenException*)message);\\\n        il2cpp_codegen_no_return();\\\n    } while (0)\n\n\ntemplate<typename T>\ninline void Il2CppCodeGenWriteBarrier(T** targetAddress, T* object)\n{\n    // TODO\n}\n\nvoid il2cpp_codegen_memory_barrier();\n\ntemplate<typename T>\ninline T VolatileRead(T* location)\n{\n    T result = *location;\n    il2cpp_codegen_memory_barrier();\n    return result;\n}\n\ntemplate<typename T>\ninline void VolatileWrite(T* location, T value)\n{\n    il2cpp_codegen_memory_barrier();\n    *location = value;\n}\n\ninline void il2cpp_codegen_write_to_stdout(const char* str)\n{\n    il2cpp::utils::Output::WriteToStdout(str);\n}\n\ninline void il2cpp_codegen_write_to_stderr(const char* str)\n{\n    il2cpp::utils::Output::WriteToStderr(str);\n}\n\ninline REAL_NORETURN void il2cpp_codegen_abort()\n{\n    il2cpp::utils::Runtime::Abort();\n    il2cpp_codegen_no_return();\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/codegen/il2cpp-codegen-il2cpp.h",
    "content": "#pragma once\n\n#include \"il2cpp-codegen-common.h\"\n#include \"utils/Il2CppHStringReference.h\"\n#include \"utils/RegisterRuntimeInitializeAndCleanup.h\"\n\n#include \"metadata/GenericMethod.h\"\n#include \"vm/Array.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/Atomic.h\"\n#include \"vm/CCW.h\"\n#include \"vm/Class.h\"\n#include \"vm/COM.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Exception.h\"\n#include \"vm/InternalCalls.h\"\n#include \"vm/LastError.h\"\n#include \"vm/MarshalAlloc.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Method.h\"\n#include \"vm/Object.h\"\n#include \"vm/Profiler.h\"\n#include \"vm/RCW.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/String.h\"\n#include \"vm/Thread.h\"\n#include \"vm/ThreadPool.h\"\n#include \"vm/Type.h\"\n#include \"vm/WindowsRuntime.h\"\n#include \"vm/ThreadPoolMs.h\"\n\n#ifdef _MSC_VER\n#define IL2CPP_DISABLE_OPTIMIZATIONS __pragma(optimize(\"\", off))\n#define IL2CPP_ENABLE_OPTIMIZATIONS __pragma(optimize(\"\", on))\n#else\n#define IL2CPP_DISABLE_OPTIMIZATIONS\n#define IL2CPP_ENABLE_OPTIMIZATIONS\n#endif\n\nstruct ProfilerMethodSentry\n{\n    ProfilerMethodSentry(const RuntimeMethod* method)\n#if IL2CPP_ENABLE_PROFILER\n        : m_method(method)\n#endif\n    {\n#if IL2CPP_ENABLE_PROFILER\n        il2cpp::vm::Profiler::MethodEnter(m_method);\n#endif\n    }\n\n    ~ProfilerMethodSentry()\n    {\n#if IL2CPP_ENABLE_PROFILER\n        il2cpp::vm::Profiler::MethodExit(m_method);\n#endif\n    }\n\nprivate:\n    const RuntimeMethod* m_method;\n};\n\nstruct StackTraceSentry\n{\n    StackTraceSentry(const RuntimeMethod* method) : m_method(method)\n    {\n        Il2CppStackFrameInfo frame_info;\n\n        frame_info.method = method;\n\n#if IL2CPP_DEBUGGER_ENABLED\n        frame_info.id = -1;\n        frame_info.il_offset = 0;\n        frame_info.type = FRAME_TYPE_MANAGED;\n#endif\n        il2cpp::vm::StackTrace::PushFrame(frame_info);\n    }\n\n#if IL2CPP_DEBUGGER_ENABLED\n    StackTraceSentry(const RuntimeMethod* method, void* this_ptr, void **params, int32_t params_count, void **locals, int32_t locals_count) : m_method(method)\n    {\n        Il2CppStackFrameInfo frame_info;\n\n        frame_info.id = -1;\n        frame_info.this_ptr = this_ptr;\n        frame_info.method = method;\n        frame_info.il_offset = 0;\n        frame_info.type = FRAME_TYPE_MANAGED;\n        frame_info.params = params;\n        frame_info.params_count = params_count;\n        frame_info.locals = locals;\n        frame_info.locals_count = locals_count;\n        il2cpp::vm::StackTrace::PushFrame(frame_info);\n    }\n\n#endif\n\n    ~StackTraceSentry()\n    {\n        il2cpp::vm::StackTrace::PopFrame();\n    }\n\nprivate:\n    const RuntimeMethod* m_method;\n};\n\ntemplate<typename T>\nstruct Il2CppFakeBox : RuntimeObject\n{\n    T m_Value;\n\n    Il2CppFakeBox(RuntimeClass* boxedType, T* value)\n    {\n        klass = boxedType;\n        monitor = NULL;\n        m_Value = *value;\n    }\n};\n\n// TODO: This file should contain all the functions and type declarations needed for the generated code.\n// Hopefully, we stop including everything in the generated code and know exactly what dependencies we have.\n// Note that all parameter and return types should match the generated types not the runtime types.\n\ninline void il2cpp_codegen_register(const Il2CppCodeRegistration* const codeRegistration, const Il2CppMetadataRegistration* const metadataRegistration, const Il2CppCodeGenOptions* const codeGenOptions)\n{\n    il2cpp::vm::MetadataCache::Register(codeRegistration, metadataRegistration, codeGenOptions);\n}\n\n#include \"GeneratedCodeGen.h\"\n\n// type registration\n\ninline void* il2cpp_codegen_get_thread_static_data(RuntimeClass* klass)\n{\n    return il2cpp::vm::Thread::GetThreadStaticData(klass->thread_static_fields_offset);\n}\n\ninline Il2CppCodeGenString* il2cpp_codegen_string_new_wrapper(const char* str)\n{\n    return (Il2CppCodeGenString*)il2cpp::vm::String::NewWrapper(str);\n}\n\ninline Il2CppCodeGenString* il2cpp_codegen_string_new_utf16(const il2cpp::utils::StringView<Il2CppChar>& str)\n{\n    return (Il2CppCodeGenString*)il2cpp::vm::String::NewUtf16(str.Str(), static_cast<int32_t>(str.Length()));\n}\n\ninline Il2CppCodeGenType* il2cpp_codegen_type_get_object(const RuntimeType* type)\n{\n    return (Il2CppCodeGenType*)il2cpp::vm::Reflection::GetTypeObject(type);\n}\n\ninline NORETURN void il2cpp_codegen_raise_exception(Il2CppCodeGenException *ex)\n{\n    il2cpp::vm::Exception::Raise((RuntimeException*)ex);\n}\n\ninline void il2cpp_codegen_raise_execution_engine_exception_if_method_is_not_found(const RuntimeMethod* method)\n{\n    il2cpp::vm::Runtime::RaiseExecutionEngineExceptionIfMethodIsNotFound(method);\n}\n\ninline void il2cpp_codegen_raise_execution_engine_exception(const RuntimeMethod* method)\n{\n    il2cpp::vm::Runtime::AlwaysRaiseExecutionEngineException(method);\n}\n\ninline void il2cpp_codegen_raise_out_of_memory_exception()\n{\n    il2cpp::vm::Exception::RaiseOutOfMemoryException();\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_argument_exception(const char* param, const char* msg)\n{\n    return (Il2CppCodeGenException*)il2cpp::vm::Exception::GetArgumentException(param, msg);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_argument_null_exception(const char* param)\n{\n    return (Il2CppCodeGenException*)il2cpp::vm::Exception::GetArgumentNullException(param);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_overflow_exception()\n{\n    return (Il2CppCodeGenException*)il2cpp::vm::Exception::GetOverflowException(\"Arithmetic operation resulted in an overflow.\");\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_not_supported_exception(const char* msg)\n{\n    return (Il2CppCodeGenException*)il2cpp::vm::Exception::GetNotSupportedException(msg);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_array_type_mismatch_exception()\n{\n    return (Il2CppCodeGenException*)il2cpp::vm::Exception::GetArrayTypeMismatchException();\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_invalid_cast_exception(const char* msg)\n{\n    return (Il2CppCodeGenException*)il2cpp::vm::Exception::GetInvalidCastException(msg);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_invalid_operation_exception(const char* msg)\n{\n    return (Il2CppCodeGenException*)il2cpp::vm::Exception::GetInvalidOperationException(msg);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_marshal_directive_exception(const char* msg)\n{\n    return (Il2CppCodeGenException*)il2cpp::vm::Exception::GetMarshalDirectiveException(msg);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_missing_method_exception(const char* msg)\n{\n    return (Il2CppCodeGenException*)il2cpp::vm::Exception::GetMissingMethodException(msg);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_maximum_nested_generics_exception()\n{\n    return (Il2CppCodeGenException*)il2cpp::vm::Exception::GetMaxmimumNestedGenericsException();\n}\n\ninline RuntimeClass* il2cpp_codegen_object_class(RuntimeObject* obj)\n{\n    return obj->klass;\n}\n\n// OpCode.IsInst\n\ninline RuntimeObject* IsInst(RuntimeObject *obj, RuntimeClass* targetType)\n{\n    return il2cpp::vm::Object::IsInst(obj, targetType);\n}\n\ninline RuntimeObject* IsInstSealed(RuntimeObject *obj, RuntimeClass* targetType)\n{\n#if IL2CPP_DEBUG\n    IL2CPP_ASSERT((targetType->flags & TYPE_ATTRIBUTE_SEALED) != 0);\n    IL2CPP_ASSERT((targetType->flags & TYPE_ATTRIBUTE_INTERFACE) == 0);\n#endif\n    if (!obj)\n        return NULL;\n\n    // optimized version to compare sealed classes\n    return (obj->klass == targetType ? obj : NULL);\n}\n\ninline RuntimeObject* IsInstClass(RuntimeObject *obj, RuntimeClass* targetType)\n{\n#if IL2CPP_DEBUG\n    IL2CPP_ASSERT((targetType->flags & TYPE_ATTRIBUTE_INTERFACE) == 0);\n#endif\n    if (!obj)\n        return NULL;\n\n    // optimized version to compare classes\n    return il2cpp::vm::Class::HasParentUnsafe(obj->klass, targetType) ? obj : NULL;\n}\n\n// OpCode.Castclass\n\nNORETURN inline void RaiseInvalidCastException(RuntimeObject* obj, RuntimeClass* targetType)\n{\n    std::string exceptionMessage = il2cpp::utils::Exception::FormatInvalidCastException(obj->klass->element_class, targetType);\n    RuntimeException* exception = il2cpp::vm::Exception::GetInvalidCastException(exceptionMessage.c_str());\n    il2cpp::vm::Exception::Raise(exception);\n}\n\ninline RuntimeObject* Castclass(RuntimeObject *obj, RuntimeClass* targetType)\n{\n    if (!obj)\n        return NULL;\n\n    RuntimeObject* result = il2cpp::vm::Object::IsInst(obj, targetType);\n    if (result)\n        return result;\n\n    RaiseInvalidCastException(obj, targetType);\n    return NULL;\n}\n\ninline RuntimeObject* CastclassSealed(RuntimeObject *obj, RuntimeClass* targetType)\n{\n    if (!obj)\n        return NULL;\n\n    RuntimeObject* result = IsInstSealed(obj, targetType);\n    if (result)\n        return result;\n\n    RaiseInvalidCastException(obj, targetType);\n    return NULL;\n}\n\ninline RuntimeObject* CastclassClass(RuntimeObject *obj, RuntimeClass* targetType)\n{\n    if (!obj)\n        return NULL;\n\n    RuntimeObject* result = IsInstClass(obj, targetType);\n    if (result)\n        return result;\n\n    RaiseInvalidCastException(obj, targetType);\n    return NULL;\n}\n\ninline void NullCheck(void* this_ptr)\n{\n    if (this_ptr != NULL)\n        return;\n\n    il2cpp::vm::Exception::RaiseNullReferenceException();\n#if !IL2CPP_TARGET_IOS\n    il2cpp_codegen_no_return();\n#endif\n}\n\n// OpCode.Box\n\ninline RuntimeObject* Box(RuntimeClass* type, void* data)\n{\n    return il2cpp::vm::Object::Box(type, data);\n}\n\n// OpCode.UnBox\n\ninline void* UnBox(RuntimeObject* obj)\n{\n    NullCheck(obj);\n    return il2cpp::vm::Object::Unbox(obj);\n}\n\ninline void* UnBox(RuntimeObject* obj, RuntimeClass* expectedBoxedClass)\n{\n    NullCheck(obj);\n\n    if (obj->klass->element_class == expectedBoxedClass->element_class)\n        return il2cpp::vm::Object::Unbox(obj);\n\n    RaiseInvalidCastException(obj, expectedBoxedClass);\n    return NULL;\n}\n\ninline void UnBoxNullable(RuntimeObject* obj, RuntimeClass* expectedBoxedClass, void* storage)\n{\n    // We only need to do type checks if obj is not null\n    // Unboxing null nullable is perfectly valid and returns an instance that has no value\n    if (obj != NULL)\n    {\n        if (obj->klass->element_class != expectedBoxedClass->element_class)\n            RaiseInvalidCastException(obj, expectedBoxedClass);\n    }\n\n    il2cpp::vm::Object::UnboxNullable(obj, expectedBoxedClass, storage);\n}\n\ninline uint32_t il2cpp_codegen_sizeof(RuntimeClass* klass)\n{\n    if (!klass->valuetype)\n    {\n        return sizeof(void*);\n    }\n\n    return il2cpp::vm::Class::GetInstanceSize(klass) - sizeof(RuntimeObject);\n}\n\nFORCE_INLINE const VirtualInvokeData& il2cpp_codegen_get_virtual_invoke_data(Il2CppMethodSlot slot, const RuntimeObject* obj)\n{\n    Assert(slot != 65535 && \"il2cpp_codegen_get_virtual_invoke_data got called on a non-virtual method\");\n    return obj->klass->vtable[slot];\n}\n\nFORCE_INLINE const VirtualInvokeData& il2cpp_codegen_get_interface_invoke_data(Il2CppMethodSlot slot, const RuntimeObject* obj, const RuntimeClass* declaringInterface)\n{\n    Assert(slot != 65535 && \"il2cpp_codegen_get_interface_invoke_data got called on a non-virtual method\");\n    return il2cpp::vm::Class::GetInterfaceInvokeDataFromVTable(obj, declaringInterface, slot);\n}\n\nFORCE_INLINE const RuntimeMethod* il2cpp_codegen_get_generic_virtual_method(const RuntimeMethod* method, const RuntimeObject* obj)\n{\n    uint16_t slot = method->slot;\n    const RuntimeMethod* methodDefinition = obj->klass->vtable[slot].method;\n    return il2cpp::vm::Runtime::GetGenericVirtualMethod(methodDefinition, method);\n}\n\nFORCE_INLINE void il2cpp_codegen_get_generic_virtual_invoke_data(const RuntimeMethod* method, const RuntimeObject* obj, VirtualInvokeData* invokeData)\n{\n    const RuntimeMethod* targetRuntimeMethod = il2cpp_codegen_get_generic_virtual_method(method, obj);\n#if IL2CPP_DEBUG\n    IL2CPP_ASSERT(targetRuntimeMethod);\n#endif\n\n    invokeData->methodPtr = targetRuntimeMethod->methodPointer;\n    invokeData->method = targetRuntimeMethod;\n}\n\nFORCE_INLINE const RuntimeMethod* il2cpp_codegen_get_generic_interface_method(const RuntimeMethod* method, const RuntimeObject* obj)\n{\n    const RuntimeMethod* methodDefinition = il2cpp::vm::Class::GetInterfaceInvokeDataFromVTable(obj, method->declaring_type, method->slot).method;\n    return il2cpp::vm::Runtime::GetGenericVirtualMethod(methodDefinition, method);\n}\n\nFORCE_INLINE void il2cpp_codegen_get_generic_interface_invoke_data(const RuntimeMethod* method, const RuntimeObject* obj, VirtualInvokeData* invokeData)\n{\n    const RuntimeMethod* targetRuntimeMethod = il2cpp_codegen_get_generic_interface_method(method, obj);\n\n#if IL2CPP_DEBUG\n    IL2CPP_ASSERT(targetRuntimeMethod);\n#endif\n\n    invokeData->methodPtr = targetRuntimeMethod->methodPointer;\n    invokeData->method = targetRuntimeMethod;\n}\n\n#include \"GeneratedVirtualInvokers.h\"\n#include \"GeneratedInterfaceInvokers.h\"\n#include \"GeneratedGenericVirtualInvokers.h\"\n#include \"GeneratedGenericInterfaceInvokers.h\"\n\n// OpCode.Ldtoken\n\ninline Il2CppCodeGenRuntimeTypeHandle LoadTypeToken(const RuntimeType* ptr)\n{\n    Il2CppCodeGenIntPtr intptr;\n    intptr.set_m_value_0(const_cast<RuntimeType*>(ptr));\n\n    Il2CppCodeGenRuntimeTypeHandle handle;\n    handle.set_value_0(intptr);\n\n    return handle;\n}\n\ninline Il2CppCodeGenRuntimeFieldHandle LoadFieldToken(void* ptr)\n{\n    Il2CppCodeGenIntPtr intptr;\n    intptr.set_m_value_0(ptr);\n\n    Il2CppCodeGenRuntimeFieldHandle handle;\n    handle.set_value_0(intptr);\n\n    return handle;\n}\n\ninline Il2CppCodeGenRuntimeArgumentHandle LoadArgList()\n{\n    Il2CppCodeGenIntPtr intptr;\n    intptr.set_m_value_0(NULL);\n\n    Il2CppCodeGenRuntimeArgumentHandle handle;\n    handle.set_args_0(intptr);\n\n    IL2CPP_ASSERT(false && \"__arglist usage not supported.\");\n    return handle;\n}\n\ninline Il2CppCodeGenRuntimeMethodHandle LoadMethodToken(const RuntimeMethod* ptr)\n{\n    Il2CppCodeGenIntPtr intptr;\n    intptr.set_m_value_0(const_cast<RuntimeMethod*>(ptr));\n\n    Il2CppCodeGenRuntimeMethodHandle handle;\n    handle.set_value_0(intptr);\n\n    return handle;\n}\n\ninline RuntimeClass* InitializedTypeInfo(RuntimeClass* klass)\n{\n    il2cpp::vm::Class::Init(klass);\n    return klass;\n}\n\ninline RuntimeClass* il2cpp_codegen_class_from_type(const RuntimeType *type)\n{\n    return InitializedTypeInfo(il2cpp::vm::Class::FromIl2CppType(type));\n}\n\ninline void* InterlockedExchangeImplRef(void** location, void* value)\n{\n    return il2cpp::icalls::mscorlib::System::Threading::Interlocked::ExchangePointer(location, value);\n}\n\ntemplate<typename T>\ninline T InterlockedCompareExchangeImpl(T* location, T value, T comparand)\n{\n    return (T)il2cpp::icalls::mscorlib::System::Threading::Interlocked::CompareExchange_T((void**)location, value, comparand);\n}\n\ntemplate<typename T>\ninline T InterlockedExchangeImpl(T* location, T value)\n{\n    return (T)InterlockedExchangeImplRef((void**)location, value);\n}\n\ninline void il2cpp_codegen_memory_barrier()\n{\n    il2cpp::vm::Thread::MemoryBarrier();\n}\n\ninline void ArrayGetGenericValueImpl(RuntimeArray* thisPtr, int32_t pos, void* value)\n{\n    memcpy(value, ((uint8_t*)thisPtr) + sizeof(RuntimeArray) + pos * thisPtr->klass->element_size, thisPtr->klass->element_size);\n}\n\ninline void ArraySetGenericValueImpl(RuntimeArray * thisPtr, int32_t pos, void* value)\n{\n    memcpy(((uint8_t*)thisPtr) + sizeof(RuntimeArray) + pos * thisPtr->klass->element_size, value, thisPtr->klass->element_size);\n}\n\ninline RuntimeArray* SZArrayNew(RuntimeClass* arrayType, uint32_t length)\n{\n    il2cpp::vm::Class::Init(arrayType);\n    return il2cpp::vm::Array::NewSpecific(arrayType, length);\n}\n\ninline RuntimeArray* GenArrayNew(RuntimeClass* arrayType, il2cpp_array_size_t* dimensions)\n{\n    return il2cpp::vm::Array::NewFull(arrayType, dimensions, NULL);\n}\n\n// Performance optimization as detailed here: http://blogs.msdn.com/b/clrcodegeneration/archive/2009/08/13/array-bounds-check-elimination-in-the-clr.aspx\n// Since array size is a signed int32_t, a single unsigned check can be performed to determine if index is less than array size.\n// Negative indices will map to a unsigned number greater than or equal to 2^31 which is larger than allowed for a valid array.\n#define IL2CPP_ARRAY_BOUNDS_CHECK(index, length) \\\n    do { \\\n        if (((uint32_t)(index)) >= ((uint32_t)length)) il2cpp::vm::Exception::Raise (il2cpp::vm::Exception::GetIndexOutOfRangeException()); \\\n    } while (0)\n\ninline bool il2cpp_codegen_class_is_assignable_from(RuntimeClass *klass, RuntimeClass *oklass)\n{\n    return il2cpp::vm::Class::IsAssignableFrom(klass, oklass);\n}\n\ninline RuntimeObject* il2cpp_codegen_object_new(RuntimeClass *klass)\n{\n    return il2cpp::vm::Object::New(klass);\n}\n\ninline Il2CppMethodPointer il2cpp_codegen_resolve_icall(const char* name)\n{\n    Il2CppMethodPointer method = il2cpp::vm::InternalCalls::Resolve(name);\n    if (!method)\n    {\n        il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetMissingMethodException(name));\n    }\n    return method;\n}\n\ntemplate<typename FunctionPointerType, size_t dynamicLibraryLength, size_t entryPointLength>\ninline FunctionPointerType il2cpp_codegen_resolve_pinvoke(const Il2CppNativeChar(&nativeDynamicLibrary)[dynamicLibraryLength], const char(&entryPoint)[entryPointLength],\n    Il2CppCallConvention callingConvention, Il2CppCharSet charSet, int parameterSize, bool isNoMangle)\n{\n    const PInvokeArguments pinvokeArgs =\n    {\n        il2cpp::utils::StringView<Il2CppNativeChar>(nativeDynamicLibrary),\n        il2cpp::utils::StringView<char>(entryPoint),\n        callingConvention,\n        charSet,\n        parameterSize,\n        isNoMangle\n    };\n\n    return reinterpret_cast<FunctionPointerType>(il2cpp::vm::PlatformInvoke::Resolve(pinvokeArgs));\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_marshal_allocate_array(size_t length)\n{\n    return static_cast<T*>(il2cpp::vm::MarshalAlloc::Allocate((il2cpp_array_size_t)(sizeof(T) * length)));\n}\n\ninline char* il2cpp_codegen_marshal_string(Il2CppCodeGenString* il2CppString)\n{\n    return il2cpp::vm::PlatformInvoke::MarshalCSharpStringToCppString((Il2CppString*)il2CppString);\n}\n\ninline void il2cpp_codegen_marshal_string_fixed(Il2CppCodeGenString* il2CppString, char* buffer, int numberOfCharacters)\n{\n    return il2cpp::vm::PlatformInvoke::MarshalCSharpStringToCppStringFixed((Il2CppString*)il2CppString, buffer, numberOfCharacters);\n}\n\ninline Il2CppChar* il2cpp_codegen_marshal_wstring(Il2CppCodeGenString* il2CppString)\n{\n    return il2cpp::vm::PlatformInvoke::MarshalCSharpStringToCppWString((Il2CppString*)il2CppString);\n}\n\ninline void il2cpp_codegen_marshal_wstring_fixed(Il2CppCodeGenString* il2CppString, Il2CppChar* buffer, int numberOfCharacters)\n{\n    return il2cpp::vm::PlatformInvoke::MarshalCSharpStringToCppWStringFixed((Il2CppString*)il2CppString, buffer, numberOfCharacters);\n}\n\ninline Il2CppChar* il2cpp_codegen_marshal_bstring(Il2CppCodeGenString* il2CppString)\n{\n    return il2cpp::vm::PlatformInvoke::MarshalCSharpStringToCppBString((Il2CppString*)il2CppString);\n}\n\ninline Il2CppCodeGenString* il2cpp_codegen_marshal_string_result(const char* value)\n{\n    return (Il2CppCodeGenString*)il2cpp::vm::PlatformInvoke::MarshalCppStringToCSharpStringResult(value);\n}\n\ninline Il2CppCodeGenString* il2cpp_codegen_marshal_wstring_result(const Il2CppChar* value)\n{\n    return (Il2CppCodeGenString*)il2cpp::vm::PlatformInvoke::MarshalCppWStringToCSharpStringResult(value);\n}\n\ninline Il2CppCodeGenString* il2cpp_codegen_marshal_bstring_result(const Il2CppChar* value)\n{\n    return (Il2CppCodeGenString*)il2cpp::vm::PlatformInvoke::MarshalCppBStringToCSharpStringResult(value);\n}\n\ninline void il2cpp_codegen_marshal_free_bstring(Il2CppChar* value)\n{\n    il2cpp::vm::PlatformInvoke::MarshalFreeBString(value);\n}\n\ninline char* il2cpp_codegen_marshal_string_builder(Il2CppCodeGenStringBuilder* stringBuilder)\n{\n    return il2cpp::vm::PlatformInvoke::MarshalStringBuilder((Il2CppStringBuilder*)stringBuilder);\n}\n\ninline Il2CppChar* il2cpp_codegen_marshal_wstring_builder(Il2CppCodeGenStringBuilder* stringBuilder)\n{\n    return il2cpp::vm::PlatformInvoke::MarshalWStringBuilder((Il2CppStringBuilder*)stringBuilder);\n}\n\ninline void il2cpp_codegen_marshal_string_builder_result(Il2CppCodeGenStringBuilder* stringBuilder, char* buffer)\n{\n    il2cpp::vm::PlatformInvoke::MarshalStringBuilderResult((Il2CppStringBuilder*)stringBuilder, buffer);\n}\n\ninline void il2cpp_codegen_marshal_wstring_builder_result(Il2CppCodeGenStringBuilder* stringBuilder, Il2CppChar* buffer)\n{\n    il2cpp::vm::PlatformInvoke::MarshalWStringBuilderResult((Il2CppStringBuilder*)stringBuilder, buffer);\n}\n\ninline Il2CppHString il2cpp_codegen_create_hstring(Il2CppCodeGenString* str)\n{\n    return il2cpp::vm::WindowsRuntime::CreateHString(reinterpret_cast<Il2CppString*>(str));\n}\n\ninline Il2CppCodeGenString* il2cpp_codegen_marshal_hstring_result(Il2CppHString hstring)\n{\n    return reinterpret_cast<Il2CppCodeGenString*>(il2cpp::vm::WindowsRuntime::HStringToManagedString(hstring));\n}\n\ninline void il2cpp_codegen_marshal_free_hstring(Il2CppHString hstring)\n{\n    il2cpp::vm::WindowsRuntime::DeleteHString(hstring);\n}\n\ninline void il2cpp_codegen_marshal_free(void* ptr)\n{\n    il2cpp::vm::PlatformInvoke::MarshalFree(ptr);\n}\n\ninline Il2CppMethodPointer il2cpp_codegen_marshal_delegate(Il2CppCodeGenMulticastDelegate* d)\n{\n    return (Il2CppMethodPointer)il2cpp::vm::PlatformInvoke::MarshalDelegate((Il2CppDelegate*)d).m_value;\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_marshal_function_ptr_to_delegate(Il2CppMethodPointer functionPtr, RuntimeClass* delegateType)\n{\n    return (T*)il2cpp::vm::PlatformInvoke::MarshalFunctionPointerToDelegate(reinterpret_cast<void*>(functionPtr), delegateType);\n}\n\ninline void il2cpp_codegen_marshal_store_last_error()\n{\n    il2cpp::vm::LastError::StoreLastError();\n}\n\nclass il2cpp_native_wrapper_vm_thread_attacher\n{\npublic:\n    il2cpp_native_wrapper_vm_thread_attacher() :\n        _threadWasAttached(false)\n    {\n        if (il2cpp::vm::Thread::Current() == NULL)\n        {\n            il2cpp::vm::Thread::Attach(il2cpp::vm::Domain::GetRoot());\n            _threadWasAttached = true;\n        }\n    }\n\n    ~il2cpp_native_wrapper_vm_thread_attacher()\n    {\n        if (_threadWasAttached)\n            il2cpp::vm::Thread::Detach(il2cpp::vm::Thread::Current());\n    }\n\nprivate:\n    bool _threadWasAttached;\n};\n\n#if _DEBUG\nstruct ScopedMarshallingAllocationFrame\n{\n    ScopedMarshallingAllocationFrame()\n    {\n        il2cpp::vm::MarshalAlloc::PushAllocationFrame();\n    }\n\n    ~ScopedMarshallingAllocationFrame()\n    {\n        il2cpp::vm::MarshalAlloc::PopAllocationFrame();\n    }\n};\n\nstruct ScopedMarshallingAllocationCheck\n{\n    ~ScopedMarshallingAllocationCheck()\n    {\n        if (il2cpp::vm::MarshalAlloc::HasUnfreedAllocations())\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetInvalidOperationException(\"Error in marshaling allocation. Some memory has been leaked.\"));\n    }\n\nprivate:\n    ScopedMarshallingAllocationFrame m_AllocationFrame;\n};\n\nstruct ScopedMarshalingAllocationClearer\n{\n    ~ScopedMarshalingAllocationClearer()\n    {\n        il2cpp::vm::MarshalAlloc::ClearAllTrackedAllocations();\n    }\n\nprivate:\n    ScopedMarshallingAllocationFrame m_AllocationFrame;\n};\n\n#endif\n\ninline void DivideByZeroCheck(int64_t denominator)\n{\n    if (denominator != 0)\n        return;\n\n    il2cpp::vm::Exception::RaiseDivideByZeroException();\n#if !IL2CPP_TARGET_IOS\n    il2cpp_codegen_no_return();\n#endif\n}\n\ninline void Initobj(RuntimeClass* type, void* data)\n{\n    if (type->valuetype)\n        memset(data, 0, type->instance_size - sizeof(RuntimeObject));\n    else\n        *static_cast<RuntimeObject**>(data) = NULL;\n}\n\ninline bool MethodIsStatic(const RuntimeMethod* method)\n{\n    return !il2cpp::vm::Method::IsInstance(method);\n}\n\ninline bool MethodHasParameters(const RuntimeMethod* method)\n{\n    return il2cpp::vm::Method::GetParamCount(method) != 0;\n}\n\n#define IL2CPP_RUNTIME_CLASS_INIT(klass) do { if((klass)->has_cctor && !(klass)->cctor_finished) il2cpp::vm::Runtime::ClassInit ((klass)); } while (0)\n\n// generic sharing\n#define IL2CPP_RGCTX_DATA(rgctxVar, index) (InitializedTypeInfo(rgctxVar[index].klass))\n#define IL2CPP_RGCTX_SIZEOF(rgctxVar, index) (il2cpp_codegen_sizeof(IL2CPP_RGCTX_DATA(rgctxVar, index)))\n#define IL2CPP_RGCTX_TYPE(rgctxVar, index) (rgctxVar[index].type)\n#define IL2CPP_RGCTX_METHOD_INFO(rgctxVar, index) (rgctxVar[index].method)\n#define IL2CPP_RGCTX_FIELD_INFO(klass, index) ((klass)->fields+index)\n\ninline void ArrayElementTypeCheck(RuntimeArray* array, void* value)\n{\n    if (value != NULL && il2cpp::vm::Object::IsInst((RuntimeObject*)value, array->klass->element_class) == NULL)\n        il2cpp_codegen_raise_exception(il2cpp_codegen_get_array_type_mismatch_exception());\n}\n\ninline const RuntimeMethod* GetVirtualMethodInfo(RuntimeObject* pThis, Il2CppMethodSlot slot)\n{\n    if (!pThis)\n        il2cpp::vm::Exception::RaiseNullReferenceException();\n\n    return pThis->klass->vtable[slot].method;\n}\n\ninline const RuntimeMethod* GetInterfaceMethodInfo(RuntimeObject* pThis, Il2CppMethodSlot slot, RuntimeClass* declaringInterface)\n{\n    if (!pThis)\n        il2cpp::vm::Exception::RaiseNullReferenceException();\n\n    return il2cpp::vm::Class::GetInterfaceInvokeDataFromVTable(pThis, declaringInterface, slot).method;\n}\n\ninline void il2cpp_codegen_initialize_method(uint32_t index)\n{\n    il2cpp::vm::MetadataCache::InitializeMethodMetadata(index);\n}\n\ninline bool il2cpp_codegen_type_implements_virtual_method(RuntimeClass* type, const RuntimeMethod* method)\n{\n    IL2CPP_ASSERT(il2cpp::vm::Class::IsValuetype(type));\n    return method->declaring_type == type;\n}\n\ninline Il2CppCodeGenMethodBase* il2cpp_codegen_get_method_object(const RuntimeMethod* method)\n{\n    if (method->is_inflated)\n        method = il2cpp::vm::MetadataCache::GetGenericMethodDefinition(method);\n    return (Il2CppCodeGenMethodBase*)il2cpp::vm::Reflection::GetMethodObject(method, method->declaring_type);\n}\n\ninline Il2CppCodeGenType* il2cpp_codegen_get_type(Il2CppMethodPointer getTypeFunction, Il2CppCodeGenString* typeName, const char* assemblyName)\n{\n    typedef Il2CppCodeGenType* (*getTypeFuncType)(RuntimeObject*, Il2CppCodeGenString*, const RuntimeMethod*);\n    Il2CppString* assemblyQualifiedTypeName = il2cpp::vm::Type::AppendAssemblyNameIfNecessary((Il2CppString*)typeName, assemblyName);\n\n    // Try to find the type using a hint about about calling assembly. If it is not found, fall back to calling GetType without the hint.\n    Il2CppCodeGenType* type = ((getTypeFuncType)getTypeFunction)(NULL, (Il2CppCodeGenString*)assemblyQualifiedTypeName, NULL);\n    if (type == NULL)\n        return ((getTypeFuncType)getTypeFunction)(NULL, typeName, NULL);\n    return type;\n}\n\ninline Il2CppCodeGenType* il2cpp_codegen_get_type(Il2CppMethodPointer getTypeFunction, Il2CppCodeGenString* typeName, bool throwOnError, const char* assemblyName)\n{\n    typedef Il2CppCodeGenType* (*getTypeFuncType)(RuntimeObject*, Il2CppCodeGenString*, bool, const RuntimeMethod*);\n    Il2CppString* assemblyQualifiedTypeName = il2cpp::vm::Type::AppendAssemblyNameIfNecessary((Il2CppString*)typeName, assemblyName);\n\n    // Try to find the type using a hint about about calling assembly. If it is not found, fall back to calling GetType without the hint.\n    Il2CppCodeGenType* type = ((getTypeFuncType)getTypeFunction)(NULL, (Il2CppCodeGenString*)assemblyQualifiedTypeName, throwOnError, NULL);\n    if (type == NULL)\n        return ((getTypeFuncType)getTypeFunction)(NULL, typeName, throwOnError, NULL);\n    return type;\n}\n\ninline Il2CppCodeGenType* il2cpp_codegen_get_type(Il2CppMethodPointer getTypeFunction, Il2CppCodeGenString* typeName, bool throwOnError, bool ignoreCase, const char* assemblyName)\n{\n    typedef Il2CppCodeGenType* (*getTypeFuncType)(RuntimeObject*, Il2CppCodeGenString*, bool, bool, const RuntimeMethod*);\n    Il2CppString* assemblyQualifiedTypeName = il2cpp::vm::Type::AppendAssemblyNameIfNecessary((Il2CppString*)typeName, assemblyName);\n    // Try to find the type using a hint about about calling assembly. If it is not found, fall back to calling GetType without the hint.\n\n    Il2CppCodeGenType* type = ((getTypeFuncType)getTypeFunction)(NULL, (Il2CppCodeGenString*)assemblyQualifiedTypeName, throwOnError, ignoreCase, NULL);\n    if (type == NULL)\n        return ((getTypeFuncType)getTypeFunction)(NULL, typeName, throwOnError, ignoreCase, NULL);\n    return type;\n}\n\ninline Il2CppCodeGenAssembly* il2cpp_codegen_get_executing_assembly(const RuntimeMethod* method)\n{\n    return (Il2CppCodeGenAssembly*)il2cpp::vm::Reflection::GetAssemblyObject(il2cpp::vm::MetadataCache::GetAssemblyFromIndex(method->declaring_type->image->assemblyIndex));\n}\n\n// Atomic\n\ninline void* il2cpp_codegen_atomic_compare_exchange_pointer(void* volatile* dest, void* exchange, void* comparand)\n{\n    return il2cpp::vm::Atomic::CompareExchangePointer(dest, exchange, comparand);\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_atomic_compare_exchange_pointer(T* volatile* dest, T* newValue, T* oldValue)\n{\n    return il2cpp::vm::Atomic::CompareExchangePointer(dest, newValue, oldValue);\n}\n\n// COM\n\ninline void il2cpp_codegen_com_marshal_variant(RuntimeObject* obj, Il2CppVariant* variant)\n{\n    il2cpp::vm::COM::MarshalVariant(obj, variant);\n}\n\ninline RuntimeObject* il2cpp_codegen_com_marshal_variant_result(const Il2CppVariant* variant)\n{\n    return il2cpp::vm::COM::MarshalVariantResult(variant);\n}\n\ninline void il2cpp_codegen_com_destroy_variant(Il2CppVariant* variant)\n{\n    il2cpp::vm::COM::DestroyVariant(variant);\n}\n\ninline Il2CppSafeArray* il2cpp_codegen_com_marshal_safe_array(Il2CppChar type, RuntimeArray* managedArray)\n{\n    return il2cpp::vm::COM::MarshalSafeArray(type, managedArray);\n}\n\ninline RuntimeArray* il2cpp_codegen_com_marshal_safe_array_result(Il2CppChar variantType, RuntimeClass* type, Il2CppSafeArray* safeArray)\n{\n    return il2cpp::vm::COM::MarshalSafeArrayResult(variantType, type, safeArray);\n}\n\ninline Il2CppSafeArray* il2cpp_codegen_com_marshal_safe_array_bstring(RuntimeArray* managedArray)\n{\n    return il2cpp::vm::COM::MarshalSafeArrayBString(managedArray);\n}\n\ninline RuntimeArray* il2cpp_codegen_com_marshal_safe_array_bstring_result(RuntimeClass* type, Il2CppSafeArray* safeArray)\n{\n    return il2cpp::vm::COM::MarshalSafeArrayBStringResult(type, safeArray);\n}\n\ninline void il2cpp_codegen_com_destroy_safe_array(Il2CppSafeArray* safeArray)\n{\n    il2cpp::vm::COM::DestroySafeArray(safeArray);\n}\n\ninline void il2cpp_codegen_com_create_instance(const Il2CppGuid& clsid, Il2CppIUnknown** identity)\n{\n    il2cpp::vm::COM::CreateInstance(clsid, identity);\n}\n\ninline void il2cpp_codegen_com_register_rcw(Il2CppComObject* rcw)\n{\n    il2cpp::vm::RCW::Register(rcw);\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_com_get_or_create_rcw_from_iunknown(Il2CppIUnknown* unknown, RuntimeClass* fallbackClass)\n{\n    return static_cast<T*>(il2cpp::vm::RCW::GetOrCreateFromIUnknown(unknown, fallbackClass));\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_com_get_or_create_rcw_from_iinspectable(Il2CppIInspectable* unknown, RuntimeClass* fallbackClass)\n{\n    return static_cast<T*>(il2cpp::vm::RCW::GetOrCreateFromIInspectable(unknown, fallbackClass));\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_com_get_or_create_rcw_for_sealed_class(Il2CppIUnknown* unknown, RuntimeClass* objectClass)\n{\n    return static_cast<T*>(il2cpp::vm::RCW::GetOrCreateForSealedClass(unknown, objectClass));\n}\n\ninline void il2cpp_codegen_il2cpp_com_object_cleanup(Il2CppComObject* rcw)\n{\n    il2cpp::vm::RCW::Cleanup(rcw);\n}\n\ntemplate<typename InterfaceType>\ninline InterfaceType* il2cpp_codegen_com_get_or_create_ccw(RuntimeObject* obj)\n{\n    return static_cast<InterfaceType*>(il2cpp::vm::CCW::GetOrCreate(obj, InterfaceType::IID));\n}\n\ninline Il2CppCodeGenIntPtr il2cpp_codegen_com_get_iunknown_for_object(RuntimeObject* obj)\n{\n    Il2CppCodeGenIntPtr result;\n    result.set_m_value_0(il2cpp::vm::CCW::GetOrCreate(obj, Il2CppIUnknown::IID));\n    return result;\n}\n\ninline void il2cpp_codegen_com_raise_exception_if_failed(il2cpp_hresult_t hr, bool defaultToCOMException)\n{\n    il2cpp::vm::Exception::RaiseIfFailed(hr, defaultToCOMException);\n}\n\ninline RuntimeException* il2cpp_codegen_com_get_exception(il2cpp_hresult_t hr, bool defaultToCOMException)\n{\n    return il2cpp::vm::Exception::Get(hr, defaultToCOMException);\n}\n\ninline RuntimeException* il2cpp_codegen_com_get_exception_for_invalid_iproperty_cast(RuntimeObject* value, const char* a, const char* b)\n{\n    return il2cpp::vm::CCW::GetIPropertyValueInvalidCast(value, a, b);\n}\n\ninline void il2cpp_codegen_store_exception_info(RuntimeException* ex, Il2CppCodeGenString* exceptionString)\n{\n    il2cpp::vm::Exception::StoreExceptionInfo(ex, reinterpret_cast<Il2CppString*>(exceptionString));\n}\n\ninline Il2CppIActivationFactory* il2cpp_codegen_windows_runtime_get_activation_factory(const il2cpp::utils::StringView<Il2CppNativeChar>& runtimeClassName)\n{\n    return il2cpp::vm::WindowsRuntime::GetActivationFactory(runtimeClassName);\n}\n\n// delegate\n\ninline Il2CppAsyncResult* il2cpp_codegen_delegate_begin_invoke(Il2CppDelegate* delegate, void** params, Il2CppDelegate* asyncCallback, RuntimeObject* state)\n{\n#if NET_4_0\n    return il2cpp::vm::ThreadPoolMs::DelegateBeginInvoke(delegate, params, asyncCallback, state);\n#else\n    return il2cpp::vm::ThreadPool::Queue(delegate, params, asyncCallback, state);\n#endif\n}\n\ninline RuntimeObject* il2cpp_codegen_delegate_end_invoke(Il2CppAsyncResult* asyncResult, void **out_args)\n{\n#if NET_4_0\n    return il2cpp::vm::ThreadPoolMs::DelegateEndInvoke(asyncResult, out_args);\n#else\n    return il2cpp::vm::ThreadPool::Wait(asyncResult, out_args);\n#endif\n}\n\ninline const Il2CppGenericInst* il2cpp_codegen_get_generic_class_inst(RuntimeClass* genericClass)\n{\n    IL2CPP_ASSERT(genericClass->generic_class);\n    return genericClass->generic_class->context.class_inst;\n}\n\ninline RuntimeClass* il2cpp_codegen_inflate_generic_class(RuntimeClass* genericClassDefinition, const Il2CppGenericInst* genericInst)\n{\n    return il2cpp::vm::Class::GetInflatedGenericInstanceClass(genericClassDefinition, genericInst);\n}\n\ninline void* il2cpp_codegen_static_fields_for(RuntimeClass* klass)\n{\n    return klass->static_fields;\n}\n\ninline Il2CppMethodPointer il2cpp_codegen_get_method_pointer(const RuntimeMethod* method)\n{\n    return method->methodPointer;\n}\n\ninline const RuntimeType* il2cpp_codegen_method_return_type(const RuntimeMethod* method)\n{\n    return method->return_type;\n}\n\ninline bool il2cpp_codegen_is_import_or_windows_runtime(const RuntimeObject *object)\n{\n    return object->klass->is_import_or_windows_runtime;\n}\n\ninline std::string il2cpp_codegen_format_exception(const RuntimeException* ex)\n{\n    return il2cpp::utils::Exception::FormatException(ex);\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/codegen/il2cpp-codegen-mono.h",
    "content": "#pragma once\n\n#include \"il2cpp-codegen-common.h\"\n#include \"il2cpp-mono-support.h\"\n#include \"mono-api.h\"\n\n\nstruct ProfilerMethodSentry\n{\n    ProfilerMethodSentry(const RuntimeMethod* method)\n#if IL2CPP_ENABLE_PROFILER\n        : m_method(method)\n#endif\n    {\n        NOT_IMPLEMENTED(\"Unity profiler hooks are not implemented yet for the libmonoruntime backend.\");\n    }\n\n    ~ProfilerMethodSentry()\n    {\n        NOT_IMPLEMENTED(\"Unity profiler hooks are not implemented yet for the libmonoruntime backend.\");\n    }\n\nprivate:\n    const RuntimeMethod* m_method;\n};\n\nstruct StackTraceSentry\n{\n    StackTraceSentry(RuntimeMethod* method) : m_method(method)\n    {\n        MonoStackFrameInfo frame_info;\n\n        frame_info.method = method;\n        frame_info.actual_method = method;\n        frame_info.type = MONO_FRAME_TYPE_MANAGED;\n        frame_info.managed = 1;\n        frame_info.il_offset = 0;\n        frame_info.native_offset = 0;\n        frame_info.ji = (void*)-1;\n\n        mono::vm::StackTrace::PushFrame(frame_info);\n    }\n\n#if IL2CPP_DEBUGGER_ENABLED\n    StackTraceSentry(const RuntimeMethod* method, void* this_ptr, void **params, int32_t params_count, void **locals, int32_t locals_count) : m_method(method)\n    {\n    }\n\n#endif\n\n    ~StackTraceSentry()\n    {\n        mono::vm::StackTrace::PopFrame();\n    }\n\nprivate:\n    const RuntimeMethod* m_method;\n};\n\ntemplate<typename T>\nstruct Il2CppFakeBox : RuntimeObject\n{\n    T m_Value;\n\n    Il2CppFakeBox(RuntimeClass* boxedType, T* value)\n    {\n        vtable = mono_class_vtable(mono_domain_get(), boxedType);\n        synchronisation = NULL;\n        m_Value = *value;\n    }\n};\n\n// TODO: This file should contain all the functions and type declarations needed for the generated code.\n// Hopefully, we stop including everything in the generated code and know exactly what dependencies we have.\n// Note that all parameter and return types should match the generated types not the runtime types.\n\n#include \"GeneratedCodeGen.h\"\n\n// type registration\n\ninline Il2CppCodeGenString* il2cpp_codegen_string_new_utf16(const il2cpp::utils::StringView<Il2CppChar>& str)\n{\n    return (Il2CppCodeGenString*)mono_string_new_utf16(mono_domain_get(), (uint16_t*)str.Str(), (int32_t)str.Length());\n}\n\ninline NORETURN void il2cpp_codegen_raise_exception(Il2CppCodeGenException *ex)\n{\n    mono_raise_exception((RuntimeException*)ex);\n    il2cpp_codegen_no_return();\n}\n\ninline void il2cpp_codegen_raise_execution_engine_exception_if_method_is_not_found(const RuntimeMethod* method)\n{\n    il2cpp_mono_raise_execution_engine_exception_if_method_is_not_found(const_cast<RuntimeMethod*>(method));\n}\n\ninline void il2cpp_codegen_raise_execution_engine_exception(const RuntimeMethod* method)\n{\n    mono_raise_exception(mono_get_exception_execution_engine(mono_unity_method_get_name(method)));\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_argument_exception(const char* param, const char* msg)\n{\n    return (Il2CppCodeGenException*)mono_get_exception_argument(param, msg);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_argument_null_exception(const char* param)\n{\n    return (Il2CppCodeGenException*)mono_get_exception_argument_null(param);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_overflow_exception()\n{\n    return (Il2CppCodeGenException*)mono_get_exception_overflow();\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_not_supported_exception(const char* msg)\n{\n    return (Il2CppCodeGenException*)mono_get_exception_not_supported(msg);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_array_type_mismatch_exception()\n{\n    return (Il2CppCodeGenException*)mono_get_exception_array_type_mismatch();\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_invalid_operation_exception(const char* msg)\n{\n    return (Il2CppCodeGenException*)mono_get_exception_invalid_operation(msg);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_marshal_directive_exception(const char* msg)\n{\n    return (Il2CppCodeGenException*)mono_unity_exception_get_marshal_directive(msg);\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_missing_method_exception(const char* msg)\n{\n    return (Il2CppCodeGenException*)mono_get_exception_missing_method(msg, \"ctor\");\n}\n\ninline Il2CppCodeGenException* il2cpp_codegen_get_maximum_nested_generics_exception()\n{\n    return (Il2CppCodeGenException*)mono_get_exception_not_supported(MAXIMUM_NESTED_GENERICS_EXCEPTION_MESSAGE);\n}\n\ninline RuntimeClass* il2cpp_codegen_object_class(RuntimeObject* obj)\n{\n    return mono_object_get_class(obj);\n}\n\n// OpCode.IsInst\n\ninline RuntimeObject* IsInst(RuntimeObject *obj, RuntimeClass* targetType)\n{\n    return mono_object_isinst(obj, targetType);\n}\n\ninline RuntimeObject* IsInstSealed(RuntimeObject *obj, RuntimeClass* targetType)\n{\n    if (!obj)\n        return NULL;\n\n    // optimized version to compare sealed classes\n    return mono_unity_object_isinst_sealed(obj, targetType);\n}\n\ninline RuntimeObject* IsInstClass(RuntimeObject *obj, RuntimeClass* targetType)\n{\n    if (!obj)\n        return NULL;\n\n    return mono_unity_class_has_parent_unsafe(mono_object_get_class(obj), targetType) ? obj : NULL;\n}\n\n// OpCode.Castclass\n\ninline RuntimeObject* Castclass(RuntimeObject *obj, RuntimeClass* targetType)\n{\n    if (!obj)\n        return NULL;\n\n    RuntimeObject* result = mono_object_isinst(obj, targetType);\n    if (result)\n        return result;\n\n    mono_raise_exception(mono_get_exception_invalid_cast());\n    return NULL;\n}\n\ninline RuntimeObject* CastclassSealed(RuntimeObject *obj, RuntimeClass* targetType)\n{\n    if (!obj)\n        return NULL;\n\n    RuntimeObject* result = IsInstSealed(obj, targetType);\n    if (result)\n        return result;\n\n    mono_raise_exception(mono_get_exception_invalid_cast());\n    return NULL;\n}\n\ninline RuntimeObject* CastclassClass(RuntimeObject *obj, RuntimeClass* targetType)\n{\n    if (!obj)\n        return NULL;\n\n    RuntimeObject* result = IsInstClass(obj, targetType);\n    if (result)\n        return result;\n\n    mono_raise_exception(mono_get_exception_invalid_cast());\n    return NULL;\n}\n\n// OpCode.Box\n\ninline RuntimeObject* Box(RuntimeClass* type, void* data)\n{\n    return mono_value_box(mono_domain_get(), type, data);\n}\n\n// OpCode.UnBox\n\ninline void* UnBox(RuntimeObject* obj)\n{\n    if (!obj)\n    {\n        mono_raise_exception(mono_get_exception_null_reference());\n        il2cpp_codegen_no_return();\n    }\n\n    return mono_object_unbox(obj);\n}\n\ninline void* UnBox(RuntimeObject* obj, RuntimeClass* klass)\n{\n    if (!obj)\n    {\n        mono_raise_exception(mono_get_exception_null_reference());\n        il2cpp_codegen_no_return();\n    }\n\n    if (!mono_unity_object_check_box_cast(obj, klass))\n    {\n        mono_raise_exception(mono_get_exception_invalid_cast());\n        il2cpp_codegen_no_return();\n    }\n\n    return mono_object_unbox(obj);\n}\n\ninline void UnBoxNullable(RuntimeObject* obj, RuntimeClass* klass, void* storage)\n{\n    mono_unity_object_unbox_nullable(obj, klass, storage);\n}\n\ninline uint32_t il2cpp_codegen_sizeof(RuntimeClass* klass)\n{\n    if (!mono_class_is_valuetype(klass))\n        return sizeof(void*);\n\n    return mono_class_instance_size(klass) - sizeof(RuntimeObject);\n}\n\nFORCE_INLINE const VirtualInvokeData il2cpp_codegen_get_virtual_invoke_data(RuntimeMethod* method, void* obj)\n{\n    VirtualInvokeData invokeData;\n    il2cpp_mono_get_virtual_invoke_data(method, obj, &invokeData);\n    return invokeData;\n}\n\nFORCE_INLINE const VirtualInvokeData il2cpp_codegen_get_interface_invoke_data(RuntimeMethod* method, void* obj, RuntimeClass* declaringInterface)\n{\n    VirtualInvokeData invokeData;\n    il2cpp_mono_get_interface_invoke_data(method, obj, &invokeData);\n    return invokeData;\n}\n\nFORCE_INLINE const RuntimeMethod* il2cpp_codegen_get_generic_virtual_method(const RuntimeMethod* method, const RuntimeObject* obj)\n{\n    return il2cpp_mono_get_virtual_target_method(const_cast<RuntimeMethod*>(method), const_cast<RuntimeObject*>(obj));\n}\n\nFORCE_INLINE void il2cpp_codegen_get_generic_virtual_invoke_data(const RuntimeMethod* method, void* obj, VirtualInvokeData* invokeData)\n{\n    il2cpp_mono_get_invoke_data(const_cast<RuntimeMethod*>(method), obj, invokeData);\n}\n\nFORCE_INLINE const RuntimeMethod* il2cpp_codegen_get_generic_interface_method(const RuntimeMethod* method, const RuntimeObject* obj)\n{\n    return il2cpp_mono_get_virtual_target_method(const_cast<RuntimeMethod*>(method), const_cast<RuntimeObject*>(obj));\n}\n\nFORCE_INLINE void il2cpp_codegen_get_generic_interface_invoke_data(RuntimeMethod* method, void* obj, VirtualInvokeData* invokeData)\n{\n    il2cpp_mono_get_invoke_data(method, obj, invokeData);\n}\n\nFORCE_INLINE void il2cpp_codegen_get_generic_interface_invoke_data(const RuntimeMethod* method, void* obj, VirtualInvokeData* invokeData)\n{\n    il2cpp_codegen_get_generic_interface_invoke_data(const_cast<RuntimeMethod*>(method), obj, invokeData);\n}\n\n#include \"GeneratedVirtualInvokers.h\"\n#include \"GeneratedInterfaceInvokers.h\"\n#include \"GeneratedGenericVirtualInvokers.h\"\n#include \"GeneratedGenericInterfaceInvokers.h\"\n\n// OpCode.Ldtoken\n\ninline Il2CppCodeGenRuntimeTypeHandle LoadTypeToken(const RuntimeType* ptr)\n{\n    Il2CppCodeGenIntPtr intptr;\n    intptr.set_m_value_0(const_cast<RuntimeType*>(ptr));\n\n    Il2CppCodeGenRuntimeTypeHandle handle;\n    handle.set_value_0(intptr);\n\n    return handle;\n}\n\ninline Il2CppCodeGenRuntimeFieldHandle LoadFieldToken(void* ptr)\n{\n    Il2CppCodeGenIntPtr intptr;\n    intptr.set_m_value_0(ptr);\n\n    Il2CppCodeGenRuntimeFieldHandle handle;\n    handle.set_value_0(intptr);\n\n    return handle;\n}\n\ninline Il2CppCodeGenRuntimeArgumentHandle LoadArgList()\n{\n    Il2CppCodeGenIntPtr intptr;\n    intptr.set_m_value_0(NULL);\n\n    Il2CppCodeGenRuntimeArgumentHandle handle;\n    handle.set_args_0(intptr);\n\n    assert(0 && false && \"__arglist usage not supported.\");\n    return handle;\n}\n\ninline Il2CppCodeGenRuntimeMethodHandle LoadMethodToken(const RuntimeMethod* ptr)\n{\n    Il2CppCodeGenIntPtr intptr;\n    intptr.set_m_value_0((void*)ptr);\n\n    Il2CppCodeGenRuntimeMethodHandle handle;\n    handle.set_value_0(intptr);\n\n    return handle;\n}\n\ninline RuntimeClass* il2cpp_codegen_class_from_type(RuntimeType* type)\n{\n    return mono_class_from_mono_type(type);\n}\n\ninline RuntimeClass* il2cpp_codegen_class_from_type(const RuntimeType *type)\n{\n    return il2cpp_codegen_class_from_type(const_cast<RuntimeType*>(type));\n}\n\ntemplate<typename T>\ninline T InterlockedCompareExchangeImpl(T* location, T value, T comparand)\n{\n    return (T)mono_unity_object_compare_exchange((RuntimeObject**)location, (RuntimeObject*)value, (RuntimeObject*)comparand);\n}\n\ntemplate<typename T>\ninline T InterlockedExchangeImpl(T* location, T value)\n{\n    return (T)mono_unity_object_exchange((RuntimeObject**)location, (RuntimeObject*)value);\n}\n\ninline void ArrayGetGenericValueImpl(RuntimeArray* __this, int32_t pos, void* value)\n{\n    int elementSize = mono_unity_array_get_element_size(__this);\n    memcpy(value, mono_array_addr_with_size(__this, elementSize, pos), elementSize);\n}\n\ninline void ArraySetGenericValueImpl(RuntimeArray * __this, int32_t pos, void* value)\n{\n    int elementSize = mono_unity_array_get_element_size(__this);\n    memcpy(mono_array_addr_with_size(__this, elementSize, pos), value, elementSize);\n}\n\ninline RuntimeArray* SZArrayNew(RuntimeClass* arrayType, uint32_t length)\n{\n    mono_class_init(arrayType);\n\n    MonoError error;\n    RuntimeArray *retVal = mono_array_new_specific_checked(mono_class_vtable(mono_domain_get(), arrayType), length, &error);\n    RuntimeException *exc = mono_error_convert_to_exception(&error);\n    if (exc)\n        mono_raise_exception(exc);\n\n    return retVal;\n}\n\ninline RuntimeArray* GenArrayNew(RuntimeClass* arrayType, il2cpp_array_size_t* dimensions)\n{\n    // We need to convert to the platform-sized integer type Mono uses. This doesn't look nice, maybe we should change this.\n    std::vector<uintptr_t> monoDimensions = il2cpp_to_mono_array_dimensions(dimensions, mono_class_get_rank(arrayType));\n\n    MonoError error;\n    RuntimeArray *retVal = mono_array_new_full_checked(mono_domain_get(), arrayType, &monoDimensions[0], NULL, &error);\n    RuntimeException *exc = mono_error_convert_to_exception(&error);\n    if (exc)\n        mono_raise_exception(exc);\n\n    return retVal;\n}\n\n// Performance optimization as detailed here: http://blogs.msdn.com/b/clrcodegeneration/archive/2009/08/13/array-bounds-check-elimination-in-the-clr.aspx\n// Since array size is a signed int32_t, a single unsigned check can be performed to determine if index is less than array size.\n// Negative indices will map to a unsigned number greater than or equal to 2^31 which is larger than allowed for a valid array.\n#define IL2CPP_ARRAY_BOUNDS_CHECK(index, length) \\\n    do { \\\n        if (((uint32_t)(index)) >= ((uint32_t)length)) mono_raise_exception(mono_get_exception_index_out_of_range()); \\\n    } while (0)\n\ninline bool il2cpp_codegen_class_is_assignable_from(RuntimeClass *klass, RuntimeClass *oklass)\n{\n    return mono_class_is_assignable_from(klass, oklass);\n}\n\ninline RuntimeObject* il2cpp_codegen_object_new(RuntimeClass *klass)\n{\n    return mono_object_new(mono_domain_get(), klass);\n}\n\ninline Il2CppMethodPointer il2cpp_codegen_resolve_icall(const RuntimeMethod* icallMethod)\n{\n    return (Il2CppMethodPointer)mono_lookup_internal_call(const_cast<RuntimeMethod*>(icallMethod));\n}\n\ntemplate<typename FunctionPointerType>\ninline FunctionPointerType il2cpp_codegen_resolve_pinvoke(const RuntimeMethod* pinvokeMethod)\n{\n    const char *exc_class, *exc_arg;\n    FunctionPointerType result = reinterpret_cast<FunctionPointerType>(mono_lookup_pinvoke_call(const_cast<RuntimeMethod*>(pinvokeMethod), &exc_class, &exc_arg));\n    if (exc_class)\n    {\n        mono_raise_exception(mono_exception_from_name_msg(mono_unity_image_get_mscorlib(), \"System\", exc_class, exc_arg));\n        il2cpp_codegen_no_return();\n    }\n\n    return result;\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_marshal_allocate_array(size_t length)\n{\n    MonoError unused;\n    return (T*)mono_marshal_alloc((il2cpp_array_size_t)(sizeof(T) * length), &unused);\n}\n\ninline char* il2cpp_codegen_marshal_string(Il2CppCodeGenString* il2CppString)\n{\n    return mono::vm::PlatformInvoke::MarshalCSharpStringToCppString((Il2CppString*)il2CppString);\n}\n\ninline void il2cpp_codegen_marshal_string_fixed(Il2CppCodeGenString* il2CppString, char* buffer, int numberOfCharacters)\n{\n    return mono::vm::PlatformInvoke::MarshalCSharpStringToCppStringFixed((Il2CppString*)il2CppString, buffer, numberOfCharacters);\n}\n\ninline Il2CppChar* il2cpp_codegen_marshal_wstring(Il2CppCodeGenString* il2CppString)\n{\n    return mono::vm::PlatformInvoke::MarshalCSharpStringToCppWString((Il2CppString*)il2CppString);\n}\n\ninline void il2cpp_codegen_marshal_wstring_fixed(Il2CppCodeGenString* il2CppString, Il2CppChar* buffer, int numberOfCharacters)\n{\n    return mono::vm::PlatformInvoke::MarshalCSharpStringToCppWStringFixed((Il2CppString*)il2CppString, buffer, numberOfCharacters);\n}\n\ninline Il2CppChar* il2cpp_codegen_marshal_bstring(Il2CppCodeGenString* il2CppString)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline Il2CppCodeGenString* il2cpp_codegen_marshal_string_result(const char* value)\n{\n    return (Il2CppCodeGenString*)mono::vm::PlatformInvoke::MarshalCppStringToCSharpStringResult(value);\n}\n\ninline Il2CppCodeGenString* il2cpp_codegen_marshal_wstring_result(const Il2CppChar* value)\n{\n    return (Il2CppCodeGenString*)mono::vm::PlatformInvoke::MarshalCppWStringToCSharpStringResult(value);\n}\n\ninline Il2CppCodeGenString* il2cpp_codegen_marshal_bstring_result(const Il2CppChar* value)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline void il2cpp_codegen_marshal_free_bstring(Il2CppChar* value)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n}\n\ninline char* il2cpp_codegen_marshal_string_builder(Il2CppCodeGenStringBuilder* stringBuilder)\n{\n    return mono::vm::PlatformInvoke::MarshalStringBuilder((Il2CppStringBuilder*)stringBuilder);\n}\n\ninline Il2CppChar* il2cpp_codegen_marshal_wstring_builder(Il2CppCodeGenStringBuilder* stringBuilder)\n{\n    return mono::vm::PlatformInvoke::MarshalWStringBuilder((Il2CppStringBuilder*)stringBuilder);\n}\n\ninline void il2cpp_codegen_marshal_string_builder_result(Il2CppCodeGenStringBuilder* stringBuilder, char* buffer)\n{\n    mono::vm::PlatformInvoke::MarshalStringBuilderResult((Il2CppStringBuilder*)stringBuilder, buffer);\n}\n\ninline void il2cpp_codegen_marshal_wstring_builder_result(Il2CppCodeGenStringBuilder* stringBuilder, Il2CppChar* buffer)\n{\n    mono::vm::PlatformInvoke::MarshalWStringBuilderResult((Il2CppStringBuilder*)stringBuilder, buffer);\n}\n\ninline Il2CppHString il2cpp_codegen_create_hstring(Il2CppCodeGenString* str)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline Il2CppCodeGenString* il2cpp_codegen_marshal_hstring_result(Il2CppHString hstring)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline void il2cpp_codegen_marshal_free_hstring(Il2CppHString hstring)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n}\n\ninline void il2cpp_codegen_marshal_free(void* ptr)\n{\n    mono_marshal_free(ptr);\n}\n\ninline Il2CppMethodPointer il2cpp_codegen_marshal_delegate(Il2CppCodeGenMulticastDelegate* d)\n{\n    return (Il2CppMethodPointer)mono::vm::PlatformInvoke::MarshalDelegate((Il2CppDelegate*)d).m_value;\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_marshal_function_ptr_to_delegate(Il2CppMethodPointer functionPtr, RuntimeClass* delegateType)\n{\n    return (T*)mono::vm::PlatformInvoke::MarshalFunctionPointerToDelegate(reinterpret_cast<void*>(functionPtr), delegateType);\n}\n\ninline void il2cpp_codegen_marshal_store_last_error()\n{\n    mono_marshal_set_last_error();\n}\n\nclass il2cpp_native_wrapper_vm_thread_attacher\n{\npublic:\n    il2cpp_native_wrapper_vm_thread_attacher() :\n        _threadWasAttached(false)\n    {\n        if (!mono_thread_is_attached())\n        {\n            mono_thread_attach(mono_get_root_domain());\n            _threadWasAttached = true;\n        }\n    }\n\n    ~il2cpp_native_wrapper_vm_thread_attacher()\n    {\n        if (_threadWasAttached)\n            mono_thread_detach(mono_thread_current());\n    }\n\nprivate:\n    bool _threadWasAttached;\n\n    bool mono_thread_is_attached()\n    {\n        return mono_domain_get() != NULL;\n    }\n};\n\n#if _DEBUG\nstruct ScopedMarshallingAllocationCheck\n{\n};\n\nstruct ScopedMarshalingAllocationClearer\n{\n};\n#endif\n\ninline void NullCheck(void* this_ptr)\n{\n    if (this_ptr != NULL)\n        return;\n\n    mono_raise_exception(mono_get_exception_null_reference());\n#if !IL2CPP_TARGET_IOS\n    il2cpp_codegen_no_return();\n#endif\n}\n\ninline void DivideByZeroCheck(int64_t denominator)\n{\n    if (denominator != 0)\n        return;\n\n    mono_raise_exception(mono_get_exception_divide_by_zero());\n#if !IL2CPP_TARGET_IOS\n    il2cpp_codegen_no_return();\n#endif\n}\n\ninline void Initobj(RuntimeClass* type, void* data)\n{\n    mono_unity_object_init(data, type);\n}\n\ninline bool MethodIsStatic(const RuntimeMethod* method)\n{\n    return mono_unity_method_is_static(const_cast<RuntimeMethod*>(method));\n}\n\ninline bool MethodHasParameters(const RuntimeMethod* method)\n{\n    return mono_signature_get_param_count(mono_method_signature(const_cast<RuntimeMethod*>(method))) != 0;\n}\n\n//#define IL2CPP_RUNTIME_CLASS_INIT(klass) do { if((klass)->has_cctor && !(klass)->cctor_finished) il2cpp::vm::Runtime::ClassInit ((klass)); } while (0)\n#define IL2CPP_RUNTIME_CLASS_INIT(klass) RuntimeInit(klass)\n\ninline void* il2cpp_codegen_mono_class_rgctx(RuntimeClass* klass, Il2CppRGCTXDataType rgctxType, int rgctxIndex, bool useSharedVersion)\n{\n    return il2cpp_mono_class_rgctx(klass, rgctxType, rgctxIndex, useSharedVersion);\n}\n\ninline void* il2cpp_codegen_mono_method_rgctx(RuntimeMethod* method, Il2CppRGCTXDataType rgctxType, int rgctxIndex, bool useSharedVersion)\n{\n    return il2cpp_mono_method_rgctx(method, rgctxType, rgctxIndex, useSharedVersion);\n}\n\ninline void ArrayElementTypeCheck(RuntimeArray* array, void* value)\n{\n    if (!value)\n        return;\n\n    RuntimeClass *aclass = mono_unity_array_get_class(array);\n    RuntimeClass *eclass = mono_unity_class_get_element_class(aclass);\n    RuntimeClass *oclass = mono_unity_object_get_class((RuntimeObject*)value);\n\n    if (!mono_class_is_assignable_from(eclass, oclass))\n        mono_raise_exception(mono_get_exception_array_type_mismatch());\n}\n\ninline const RuntimeMethod* GetVirtualMethodInfo(RuntimeObject* pThis, const RuntimeMethod* method)\n{\n    if (!pThis)\n        mono_raise_exception(mono_get_exception_null_reference());\n\n    return mono_object_get_virtual_method(pThis, const_cast<RuntimeMethod*>(method));\n}\n\ninline const RuntimeMethod* GetInterfaceMethodInfo(RuntimeObject* pThis, RuntimeMethod *slot, RuntimeClass* declaringInterface)\n{\n    if (!pThis)\n        mono_raise_exception(mono_get_exception_null_reference());\n\n    return mono_object_get_virtual_method(pThis, slot);\n}\n\ninline void il2cpp_codegen_memory_barrier()\n{\n    mono_unity_memory_barrier();\n}\n\ninline void il2cpp_codegen_initialize_method(uint32_t index)\n{\n    il2cpp_mono_initialize_method_metadata(index);\n}\n\ninline bool il2cpp_codegen_type_implements_virtual_method(RuntimeClass* type, RuntimeMethod *slot)\n{\n    return mono_unity_method_get_class(slot) == type;\n}\n\ninline Il2CppCodeGenMethodBase* il2cpp_codegen_get_method_object(const RuntimeMethod* method)\n{\n    if (unity_mono_method_is_inflated(const_cast<RuntimeMethod*>(method)))\n        method = mono_unity_method_get_generic_definition(const_cast<RuntimeMethod*>(method));\n\n    return (Il2CppCodeGenMethodBase*)mono_unity_method_get_object(const_cast<RuntimeMethod*>(method));\n}\n\ninline Il2CppCodeGenType* il2cpp_codegen_get_type(Il2CppMethodPointer getTypeFunction, Il2CppCodeGenString* typeName, const char* assemblyName)\n{\n    typedef Il2CppCodeGenType* (*getTypeFuncType)(RuntimeObject*, Il2CppCodeGenString*, const RuntimeMethod*);\n    MonoString* assemblyQualifiedTypeName = mono_unity_string_append_assembly_name_if_necessary((MonoString*)typeName, assemblyName);\n\n    // Try to find the type using a hint about about calling assembly. If it is not found, fall back to calling GetType without the hint.\n    Il2CppCodeGenType* type = ((getTypeFuncType)getTypeFunction)(NULL, (Il2CppCodeGenString*)assemblyQualifiedTypeName, NULL);\n    if (type == NULL)\n        return ((getTypeFuncType)getTypeFunction)(NULL, typeName, NULL);\n    return type;\n}\n\ninline Il2CppCodeGenType* il2cpp_codegen_get_type(Il2CppMethodPointer getTypeFunction, Il2CppCodeGenString* typeName, bool throwOnError, const char* assemblyName)\n{\n    typedef Il2CppCodeGenType* (*getTypeFuncType)(RuntimeObject*, Il2CppCodeGenString*, bool, const RuntimeMethod*);\n    MonoString* assemblyQualifiedTypeName = mono_unity_string_append_assembly_name_if_necessary((MonoString*)typeName, assemblyName);\n\n    // Try to find the type using a hint about about calling assembly. If it is not found, fall back to calling GetType without the hint.\n    Il2CppCodeGenType* type = ((getTypeFuncType)getTypeFunction)(NULL, (Il2CppCodeGenString*)assemblyQualifiedTypeName, throwOnError, NULL);\n    if (type == NULL)\n        return ((getTypeFuncType)getTypeFunction)(NULL, typeName, throwOnError, NULL);\n    return type;\n}\n\ninline Il2CppCodeGenType* il2cpp_codegen_get_type(Il2CppMethodPointer getTypeFunction, Il2CppCodeGenString* typeName, bool throwOnError, bool ignoreCase, const char* assemblyName)\n{\n    typedef Il2CppCodeGenType* (*getTypeFuncType)(RuntimeObject*, Il2CppCodeGenString*, bool, bool, const RuntimeMethod*);\n    MonoString* assemblyQualifiedTypeName = mono_unity_string_append_assembly_name_if_necessary((MonoString*)typeName, assemblyName);\n\n    // Try to find the type using a hint about about calling assembly. If it is not found, fall back to calling GetType without the hint.\n    Il2CppCodeGenType* type = ((getTypeFuncType)getTypeFunction)(NULL, (Il2CppCodeGenString*)assemblyQualifiedTypeName, throwOnError, ignoreCase, NULL);\n    if (type == NULL)\n        return ((getTypeFuncType)getTypeFunction)(NULL, typeName, throwOnError, ignoreCase, NULL);\n    return type;\n}\n\ninline Il2CppCodeGenAssembly* il2cpp_codegen_get_executing_assembly(const RuntimeMethod* method)\n{\n    return (Il2CppCodeGenAssembly*)mono_assembly_get_object(mono_domain_get(), mono_unity_class_get_assembly(mono_unity_method_get_class(method)));\n}\n\n// Atomic\n\ninline void* il2cpp_codegen_atomic_compare_exchange_pointer(void* volatile* dest, void* exchange, void* comparand)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_atomic_compare_exchange_pointer(T* volatile* dest, T* newValue, T* oldValue)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\n// COM\n\ninline void il2cpp_codegen_com_marshal_variant(RuntimeObject* obj, Il2CppVariant* variant)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n}\n\ninline RuntimeObject* il2cpp_codegen_com_marshal_variant_result(Il2CppVariant* variant)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline void il2cpp_codegen_com_destroy_variant(Il2CppVariant* variant)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n}\n\ninline Il2CppSafeArray* il2cpp_codegen_com_marshal_safe_array(Il2CppChar type, RuntimeArray* managedArray)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline RuntimeArray* il2cpp_codegen_com_marshal_safe_array_result(Il2CppChar variantType, RuntimeClass* type, Il2CppSafeArray* safeArray)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline Il2CppSafeArray* il2cpp_codegen_com_marshal_safe_array_bstring(RuntimeArray* managedArray)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline RuntimeArray* il2cpp_codegen_com_marshal_safe_array_bstring_result(RuntimeClass* type, Il2CppSafeArray* safeArray)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline void il2cpp_codegen_com_destroy_safe_array(Il2CppSafeArray* safeArray)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n}\n\ninline void il2cpp_codegen_com_create_instance(const Il2CppGuid& clsid, Il2CppIUnknown** identity)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n}\n\ninline void il2cpp_codegen_com_register_rcw(Il2CppComObject* rcw)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_com_get_or_create_rcw_from_iunknown(Il2CppIUnknown* unknown, RuntimeClass* fallbackClass)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_com_get_or_create_rcw_from_iinspectable(Il2CppIInspectable* unknown, RuntimeClass* fallbackClass)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ntemplate<typename T>\ninline T* il2cpp_codegen_com_get_or_create_rcw_for_sealed_class(Il2CppIUnknown* unknown, RuntimeClass* objectClass)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline void il2cpp_codegen_il2cpp_com_object_cleanup(Il2CppComObject* rcw)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n}\n\ntemplate<typename InterfaceType>\ninline InterfaceType* il2cpp_codegen_com_get_or_create_ccw(RuntimeObject* obj)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline Il2CppCodeGenIntPtr il2cpp_codegen_com_get_iunknown_for_object(RuntimeObject* obj)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return Il2CppCodeGenIntPtr();\n}\n\ninline void il2cpp_codegen_com_raise_exception(il2cpp_hresult_t hr)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n}\n\ninline void il2cpp_codegen_com_raise_exception_if_failed(il2cpp_hresult_t hr, bool defaultToCOMException)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n}\n\ninline RuntimeException* il2cpp_codegen_com_get_exception(il2cpp_hresult_t hr, bool defaultToCOMException)\n{\n    NOT_IMPLEMENTED(\"Not implemented yet.\");\n}\n\ninline RuntimeException* il2cpp_codegen_com_get_exception_for_invalid_iproperty_cast(RuntimeObject* value, const char* a, const char* b)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n}\n\ninline Il2CppIActivationFactory* il2cpp_codegen_windows_runtime_get_activation_factory(const il2cpp::utils::StringView<Il2CppNativeChar>& runtimeClassName)\n{\n    NOT_IMPLEMENTED(\"COM is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\n// delegate\n\ninline Il2CppAsyncResult* il2cpp_codegen_delegate_begin_invoke(Il2CppDelegate* delegate, void** params, Il2CppDelegate* asyncCallback, RuntimeObject* state)\n{\n    return il2cpp_mono_delegate_begin_invoke(delegate, params, asyncCallback, state);\n}\n\ninline RuntimeObject* il2cpp_codegen_delegate_end_invoke(Il2CppAsyncResult* asyncResult, void **out_args)\n{\n    return il2cpp_mono_delegate_end_invoke(asyncResult, out_args);\n}\n\ninline const Il2CppGenericInst* il2cpp_codegen_get_generic_class_inst(RuntimeClass* genericClass)\n{\n    NOT_IMPLEMENTED(\"Windows runtime is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline RuntimeClass* il2cpp_codegen_inflate_generic_class(RuntimeClass* genericClassDefinition, const Il2CppGenericInst* genericInst)\n{\n    //return il2cpp::vm::Class::GetInflatedGenericInstanceClass(genericClassDefinition, genericInst);\n    NOT_IMPLEMENTED(\"Windows runtime is not yet supported with the libmonoruntime backend.\");\n    return NULL;\n}\n\ninline RuntimeAssembly* il2cpp_codegen_mono_corlib()\n{\n    return mono_unity_assembly_get_mscorlib();\n}\n\ninline RuntimeClass* il2cpp_codegen_mono_class(AssemblyIndex assemblyIndex, uint32_t classToken)\n{\n    return mono_class_get(mono_assembly_get_image(il2cpp_mono_assembly_from_index(assemblyIndex)), classToken);\n}\n\ninline RuntimeClass* il2cpp_codegen_mono_class(RuntimeAssembly* assembly, uint32_t classToken)\n{\n    return mono_class_get(mono_assembly_get_image(assembly), classToken);\n}\n\ninline RuntimeMethod* il2cpp_codegen_mono_method(AssemblyIndex index, uint32_t methodToken)\n{\n    return mono_get_method(mono_assembly_get_image(il2cpp_mono_assembly_from_index(index)), methodToken, NULL);\n}\n\ninline RuntimeMethod* il2cpp_codegen_mono_method(RuntimeAssembly* assembly, uint32_t methodToken)\n{\n    return mono_get_method(mono_assembly_get_image(assembly), methodToken, NULL);\n}\n\ninline void il2cpp_codegen_mono_set_static_field(RuntimeClass* klass, RuntimeField* field, void* value)\n{\n    mono_field_static_set_value(mono_class_vtable(mono_domain_get(), klass), field, value);\n}\n\ninline void il2cpp_codegen_mono_get_static_field(RuntimeClass* klass, RuntimeField* field, void* value)\n{\n    mono_field_static_get_value(mono_class_vtable(mono_domain_get(), klass), field, value);\n}\n\ninline void* il2cpp_codegen_mono_get_static_field_address(RuntimeClass* klass, RuntimeField* field)\n{\n    return mono_unity_get_field_address(NULL, mono_class_vtable(mono_domain_get(), klass), field);\n}\n\ninline RuntimeField* il2cpp_codegen_mono_class_get_field(RuntimeClass* klass, uint32_t fieldToken)\n{\n    return mono_class_get_field(klass, fieldToken);\n}\n\ninline Il2CppMethodPointer il2cpp_codegen_get_method_pointer(const RuntimeMethod* method)\n{\n    MonoError unused;\n    il2cpp_mono_method_initialize_function_pointers(const_cast<RuntimeMethod*>(method), &unused);\n    return (Il2CppMethodPointer)mono_unity_method_get_method_pointer(const_cast<RuntimeMethod*>(method));\n}\n\ninline RuntimeType* il2cpp_codegen_method_return_type(const RuntimeMethod* method)\n{\n    return mono_signature_get_return_type(mono_method_signature(const_cast<RuntimeMethod*>(method)));\n}\n\ntemplate<class T>\nT il2cpp_mono_cast_nullable_method_param(const RuntimeMethod *method, int index, void *value)\n{\n    if (value)\n        return *((T*)value);\n\n    T retVal;\n    RuntimeClass *klass = mono_unity_signature_get_class_for_param(mono_method_signature(const_cast<RuntimeMethod*>(method)), index);\n    mono_nullable_init((uint8_t*)&retVal, NULL, klass);\n    return retVal;\n}\n\ninline const RuntimeMethod* il2cpp_codegen_vtable_slot_method(const RuntimeClass* klass, RuntimeMethod* slot)\n{\n    return slot;\n}\n\ninline Il2CppMethodPointer il2cpp_codegen_vtable_slot_method_pointer(const RuntimeClass* klass, RuntimeMethod* slot)\n{\n    MonoError unused;\n    il2cpp_mono_method_initialize_function_pointers(slot, &unused);\n    return (Il2CppMethodPointer)mono_unity_method_get_method_pointer(slot);\n}\n\ninline bool il2cpp_codegen_is_import_or_windows_runtime(const RuntimeObject *object)\n{\n    assert(0 && \"Not implemented yet.\");\n    return false;\n}\n\ninline std::string il2cpp_codegen_format_exception(const RuntimeException* ex)\n{\n    return il2cpp_mono_format_exception(ex);\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/codegen/il2cpp-codegen.h",
    "content": "#pragma once\n\n#if RUNTIME_MONO\ntypedef MonoClass RuntimeClass;\ntypedef MonoMethod RuntimeMethod;\ntypedef MonoClassField RuntimeField;\ntypedef MonoType RuntimeType;\ntypedef MonoObject RuntimeObject;\ntypedef MonoImage RuntimeImage;\ntypedef MonoException RuntimeException;\ntypedef MonoArray RuntimeArray;\ntypedef MonoAssembly RuntimeAssembly;\n#include \"il2cpp-codegen-mono.h\"\n\n\n#else\nstruct TypeInfo;\nstruct MethodInfo;\nstruct FieldInfo;\nstruct Il2CppType;\ntypedef Il2CppClass RuntimeClass;\ntypedef MethodInfo RuntimeMethod;\ntypedef FieldInfo RuntimeField;\ntypedef Il2CppType RuntimeType;\ntypedef Il2CppObject RuntimeObject;\ntypedef Il2CppImage RuntimeImage;\ntypedef Il2CppException RuntimeException;\ntypedef Il2CppArray RuntimeArray;\ntypedef Il2CppAssembly RuntimeAssembly;\n#include \"il2cpp-codegen-il2cpp.h\"\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/agent.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"agent.h\"\n\n#include \"id-bank.h\"\n#include \"transport-tcp.h\"\n#include \"protocol/protocol.h\"\n#include \"protocol/events.h\"\n#include \"protocol/commands/event.h\"\n\n#include \"../os/Atomic.h\"\n#include \"../os/Thread.h\"\n\n#include \"../il2cpp-api.h\"\n#include \"../class-internals.h\"\n#include \"../il2cpp-api-types.h\"\n#include <algorithm>\n\nusing namespace il2cpp::debugger;\n\nbool is_debugger_thread()\n{\n    return Agent::instance().IsDebuggerThread();\n}\n\nAgentConfig AgentConfig::Default;\n\nconst char* default_host = \"localhost\";\nint32_t default_port = 9876;\n\nAgentConfig::AgentConfig() :\n    server(true),\n    host(default_host),\n    port(default_port)\n{\n}\n\nAgentConfig::AgentConfig(const char *host, int32_t port) :\n    server(true),\n    host(host),\n    port(port)\n{\n}\n\nAgent Agent::_instance;\n\n#if IL2CPP_UNIT_TESTS_ENABLED\nIl2CppApiTestForwarder Agent::TestForwarder;\n#endif // IL2CPP_UNIT_TESTS_ENABLED\n\nAgent::Agent() :\n    _thread(0),\n    _managed_debugger_thread(0),\n    _event_req_list(*this, true),\n    _transport(0),\n    _is_notifying_pending_events(false),\n    _ss_data(0),\n    _notify_pending_events_on_first_invoke(false),\n    _is_initialized(false),\n    _currently_invoking_method(false)\n{\n}\n\nAgent::~Agent()\n{\n    _managed_debugger_thread = 0;\n\n    if (_thread != 0)\n    {\n        delete _thread;\n        _thread = 0;\n    }\n\n    if (_transport != 0)\n    {\n        delete _transport;\n        _transport = 0;\n    }\n}\n\nvoid Agent::Initialize(const AgentConfig &config)\n{\n    std::stringstream message;\n    message << \"Listening on \" << config.host << \":\" << config.port;\n    LOG(message.str());\n\n    _config = config;\n\n    _transport = new TCPDataTransport(_config.host, _config.port);\n    _transport->Setup();\n\n    // The only implemented mode right now is 'server'\n    // if(config.server)\n    _transport->WaitForClient();\n\n    // Protocol should take care of buffering the events until a client is connected\n    _protocol.Setup(_transport);\n\n    if (!_protocol.Handshake())\n    {\n        LOG(\"handshake was not successfull\");\n        return; // false\n    }\n\n    _is_initialized = true;\n}\n\nbool Agent::IsInitialized()\n{\n    return _is_initialized;\n}\n\nvoid Agent::InvalidateBreakpointData()\n{\n    std::list<BreakpointData*>::iterator it = _bp_data.begin();\n    while (it != _bp_data.end())\n    {\n        INVALIDATE_BREAKPOINT_DATA(*it);\n        ++it;\n    }\n}\n\nvoid Agent::ClearBreakpointData()\n{\n    std::list<BreakpointData*>::iterator it = _bp_data.begin();\n    while (it != _bp_data.end())\n    {\n        delete *it;\n        ++it;\n    }\n\n    _bp_data.clear();\n}\n\nvoid Agent::ClearSingleStepData()\n{\n    if (_ss_data != 0)\n    {\n        delete _ss_data;\n        _ss_data = 0;\n    }\n}\n\nSingleStepData *Agent::PrepareSingleStepData(EventRequest *request, Il2CppThread *thread, StepSizeKind size, StepDepthKind depth)\n{\n    SingleStepData *data = new SingleStepData();\n    data->size = size;\n    data->depth = depth;\n    data->thread = thread;\n    data->request = request;\n    data->last_line = -1;\n    data->last_method = 0;\n    data->stack_depth = -1;\n\n    IL2CPP_ASSERT(size == kStepSizeKindLine && \"Only kStepSizeKindLine is supported for single stepping for now.\");\n\n    Il2CppStackFrameInfo top_frame;\n\n    if (!il2cpp_thread_get_top_frame(thread, top_frame))\n        return data;\n\n    if (size == kStepSizeKindLine)\n    {\n        data->last_method = top_frame.method;\n        data->stack_depth = il2cpp_thread_get_stack_depth(thread);\n\n        const Il2CppDebugMethodInfo *debug_method = top_frame.method->debug_info;\n\n        if (debug_method != 0)\n        {\n            const int32_t *offset_table = il2cpp_debug_method_get_offset_table(debug_method);\n\n            // An offset_table might be empty. In case it is, we skip the lineno.\n            // Same thing for the il_offset.\n            if (offset_table[0] != -1 && top_frame.il_offset != -1)\n            {\n                int32_t i;\n                const int32_t il_offset = top_frame.il_offset;\n\n                for (i = 2; offset_table[i] >= 0; i += 2)\n                {\n                    const int32_t start = offset_table[i - 2];\n                    const int32_t end = offset_table[i];\n\n                    if (start <= il_offset && end > il_offset)\n                    {\n                        data->last_line = offset_table[i - 1];\n                        break;\n                    }\n                }\n\n                if (data->last_line == -1)\n                {\n                    const int32_t last_offset = offset_table[i - 2];\n                    if (il_offset <= debug_method->code_size && il_offset >= last_offset)\n                        data->last_line = offset_table[i - 1];\n                }\n            }\n        }\n    }\n\n    if (depth == kStepDepthKindOver)\n    {\n        if (top_frame.il_offset != -1)\n        {\n            //  if (ss_req->depth == STEP_DEPTH_OVER) {\n            //  frame_index = 1;\n            //  /*\n            //   * Find the first sequence point in the current or in a previous frame which\n            //   * is not the last in its method.\n            //   */\n            //  while (sp && sp->next_len == 0) {\n            //      sp = NULL;\n            //      if (tls && frame_index < tls->frame_count) {\n            //          StackFrame *frame = tls->frames [frame_index];\n\n            //          method = frame->method;\n            //          if (frame->il_offset != -1) {\n            //              sp = find_seq_point (frame->domain, frame->method, frame->il_offset, &info);\n            //          }\n            //          frame_index ++;\n            //      }\n            //  }\n\n            //  if (sp && sp->next_len > 0) {\n            //      use_bp = TRUE;\n            //      for (i = 0; i < sp->next_len; ++i) {\n            //          next_sp = &info->seq_points [sp->next [i]];\n\n            //          bp = set_breakpoint (method, next_sp->il_offset, ss_req->req);\n            //          ss_req->bps = g_slist_append (ss_req->bps, bp);\n            //      }\n            //  }\n            //}\n        }\n    }\n\n    //if (ss_req->depth == STEP_DEPTH_OVER) {\n    //  StackFrame *frame;\n\n    //  compute_frame_info (thread, tls);\n\n    //  IL2CPP_ASSERT(tls->frame_count);\n    //  frame = tls->frames [0];\n\n    //  if (frame->il_offset != -1) {\n    //      /* FIXME: Sort the table and use a binary search */\n    //      sp = find_seq_point (frame->domain, frame->method, frame->il_offset, &info);\n    //      if (!sp) return ERR_NOT_IMPLEMENTED; // This can happen with exceptions when stepping\n    //      method = frame->method;\n    //  }\n    //}\n\n    return data;\n}\n\nvoid Agent::Dispose()\n{\n    LOG(\"Disposing debugger agent\");\n\n    StopListeningThread();\n\n    _protocol.Dispose();\n\n    delete _transport;\n    _transport = 0;\n\n    _event_req_list.ClearAllRequests();\n\n    ClearSingleStepData();\n    ClearBreakpointData();\n\n    _is_initialized = false;\n}\n\nbool Agent::IsDebuggerThread()\n{\n    if (_thread == 0)\n        return false;\n\n    return _thread->Id() == os::Thread::CurrentThreadId();\n}\n\nvoid Agent::NotifyVmStart()\n{\n    LOG(\"Notifying VM Start\");\n\n    VmStartEvent vm_start(il2cpp_thread_current());\n    NotifyEvent(vm_start, _event_req_list);\n\n    // NotifyAllPendingEvents();\n\n    LOG(\"VM Start notified\");\n}\n\nvoid Agent::NotifyVmDeath()\n{\n    LOG(\"Notifying VM Death\");\n\n    VmDeathEvent vm_death(il2cpp_thread_current());\n    NotifyEvent(vm_death, _event_req_list);\n\n    LOG(\"VM Death notified\");\n\n    StopListeningThread();\n}\n\nvoid Agent::NotifyUserBreak()\n{\n    LOG(\"Notifying User Break\");\n\n    UserBreakEvent user_break(il2cpp_thread_current());\n    NotifyEvent(user_break, _event_req_list);\n\n    LOG(\"User Break notified\");\n}\n\nvoid Agent::NotifyBreakPointHit(const MethodInfo *method, uint64_t offset, BreakpointData &bp_data)\n{\n    LOG(\"Notifying Break Point hit\");\n\n    EventRequestList request_list(*this, false);\n\n    // TODO: there might be multiple requests matching a given breakpoint in case of multiple\n    // threads running the same method. Need to deal with that.\n    request_list.AddEventRequest(bp_data.request);\n\n    BreakPointEvent breakpoint_event(il2cpp_thread_current());\n    breakpoint_event.method((MethodInfo*)method);\n    breakpoint_event.il_offset(offset);\n    NotifyEvent(breakpoint_event, request_list);\n\n    LOG(\"Break Point hit notified\");\n}\n\nvoid Agent::NotifyStepHit(const MethodInfo *method, uint64_t offset, SingleStepData &ss_data)\n{\n    LOG(\"Notifying Step event\");\n\n    EventRequestList request_list(*this, false);\n\n    request_list.AddEventRequest(ss_data.request);\n\n    StepEvent step_event(il2cpp_thread_current());\n    step_event.method((MethodInfo*)method);\n    step_event.il_offset(offset);\n    NotifyEvent(step_event, request_list);\n\n    LOG(\"Step event notified\");\n}\n\nvoid Agent::NotifyAppDomainCreate(Il2CppDomain *domain)\n{\n    LOG(\"Notifying AppDomainCreate \" << (uintptr_t)domain);\n\n    AppDomainCreateEvent create_event(il2cpp_thread_current());\n    create_event.domain(domain);\n\n    NotifyEvent(create_event, _event_req_list);\n\n    LOG(\"Done notifying AppDomainCreate \" << (uintptr_t)domain);\n}\n\nvoid Agent::NotifyAssemblyLoad(const Il2CppAssembly *assembly)\n{\n    LOG(\"Notifying AssemblyLoad \" << (uintptr_t)assembly);\n\n    AssemblyLoadEvent load_event(il2cpp_thread_current());\n    load_event.assembly(const_cast<Il2CppAssembly*>(assembly));\n\n    NotifyEvent(load_event, _event_req_list);\n\n    LOG(\"Done notifying AssemblyLoad \" << (uintptr_t)assembly);\n}\n\nvoid Agent::NotifyTypeLoad(Il2CppClass *type)\n{\n    LOG(\"Notifying TypeLoad \" << il2cpp_class_get_namespace(type) << \".\" << il2cpp_class_get_name(type));\n\n    TypeLoadEvent load_event(il2cpp_thread_current());\n    load_event.type(type);\n\n    NotifyEvent(load_event, _event_req_list);\n\n    LOG(\"Done notifying TypeLoad \" << il2cpp_class_get_namespace(type) << \".\" << il2cpp_class_get_name(type));\n}\n\nvoid Agent::NotifyThreadStart(Il2CppThread *thread)\n{\n    LOG(\"Notifying ThreadStart \" << (uintptr_t)thread);\n\n    ThreadStartEvent thread_start_event(thread);\n    NotifyEvent(thread_start_event, _event_req_list);\n\n    LOG(\"Done notifying ThreadStart \" << (uintptr_t)thread);\n}\n\nvoid Agent::NotifyThreadDeath(Il2CppThread *thread)\n{\n    LOG(\"Notifying ThreadDeath \" << (uintptr_t)thread);\n\n    ThreadDeathEvent thread_death_event(thread);\n    NotifyEvent(thread_death_event, _event_req_list);\n\n    LOG(\"Done notifying ThreadDeath \" << (uintptr_t)thread);\n}\n\nvoid Agent::OnEventSkipped(const Event &evt)\n{\n    if (_is_notifying_pending_events)\n        return;\n\n    // The event has been skipped. Based on the type, let's record it to be sent later\n    switch (evt.kind())\n    {\n        case kEventKindAppDomainCreate:\n            _pending_domains.insert(((const AppDomainCreateEvent&)evt).domain());\n            break;\n\n        case kEventKindAssemblyLoad:\n            _pending_assemblies.insert(((const AssemblyLoadEvent&)evt).assembly());\n            break;\n\n        case kEventKindTypeLoad:\n            _pending_types.insert(((const TypeLoadEvent&)evt).type());\n            break;\n\n        case kEventKindAppDomainUnload:\n            LOG(\"OnEventSkipped: kEventKindAppDomainUnload not implemented\");\n            break;\n\n        case kEventKindAssemblyUnload:\n            LOG(\"OnEventSkipped: kEventKindAssemblyUnload not implemented\");\n            break;\n\n        case kEventKindThreadStart:\n            _pending_threads.insert(evt.thread());\n            break;\n\n        case kEventKindThreadDeath:\n        {\n            // If a thread dies while events are still pending, we can get rid of it\n            std::set<Il2CppThread*>::const_iterator it = _pending_threads.find(evt.thread());\n            if (it != _pending_threads.end())\n                _pending_threads.erase(it);\n        }\n        break;\n\n        case kEventKindVmStart:\n        case kEventKindVmDeath:\n        case kEventKindMethodEntry:\n        case kEventKindMethodExit:\n        case kEventKindBreakpoint:\n        case kEventKindStep:\n        case kEventKindException:\n        case kEventKindKeepAlive:\n        case kEventKindUserBreak:\n        case kEventKindUserLog:\n            break;\n    }\n}\n\nvoid Agent::NotifyAllPendingEvents()\n{\n    LOG(\"NotifyAllPendingEvents\");\n\n    NotifyAppDomainCreatePendingEvents();\n    NotifyThreadStartPendingEvents();\n    NotifyAssemblyLoadPendingEvents();\n    NotifyTypeLoadPendingEvents();\n}\n\nvoid Agent::NotifyAppDomainCreatePendingEvents()\n{\n    LOG(\"Notifying pending AppDomainCreate events\");\n\n    _is_notifying_pending_events = true;\n\n    std::set<Il2CppDomain*>::const_iterator dit = _pending_domains.begin();\n\n    while (dit != _pending_domains.end())\n    {\n        NotifyAppDomainCreate(*dit);\n        ++dit;\n    }\n\n    _pending_domains.clear();\n\n    _is_notifying_pending_events = false;\n\n    LOG(\"Done notifying pending AppDomainCreate events\");\n}\n\nvoid Agent::NotifyAssemblyLoadPendingEvents()\n{\n    LOG(\"Notifying pending AssemblyLoad events\");\n\n    _is_notifying_pending_events = true;\n\n    std::set<Il2CppAssembly*>::const_iterator dit = _pending_assemblies.begin();\n\n    while (dit != _pending_assemblies.end())\n    {\n        NotifyAssemblyLoad(*dit);\n        ++dit;\n    }\n\n    _pending_assemblies.clear();\n\n    _is_notifying_pending_events = false;\n\n    LOG(\"Done notifying pending AssemblyLoad events\");\n}\n\nvoid Agent::NotifyTypeLoadPendingEvents()\n{\n    LOG(\"Notifying pending TypeLoad events\");\n\n    _is_notifying_pending_events = true;\n\n    std::set<Il2CppClass*>::const_iterator dit = _pending_types.begin();\n\n    while (dit != _pending_types.end())\n    {\n        NotifyTypeLoad(*dit);\n        ++dit;\n    }\n\n    _pending_types.clear();\n\n    _is_notifying_pending_events = false;\n\n    LOG(\"Done notifying pending TypeLoad events\");\n}\n\nvoid Agent::NotifyThreadStartPendingEvents()\n{\n    LOG(\"Notifying pending ThreadStart events\");\n\n    _is_notifying_pending_events = true;\n\n    std::set<Il2CppThread*>::const_iterator dit = _pending_threads.begin();\n\n    while (dit != _pending_threads.end())\n    {\n        NotifyThreadStart(*dit);\n        ++dit;\n    }\n\n    _pending_threads.clear();\n\n    _is_notifying_pending_events = false;\n\n    LOG(\"Done notifying pending ThreadStart events\");\n}\n\nvoid Agent::NotifyPendingEventsOfKind(EventKind kind)\n{\n    switch (kind)\n    {\n        case kEventKindAppDomainCreate:\n            NotifyAppDomainCreatePendingEvents();\n            break;\n\n        case kEventKindAssemblyLoad:\n            NotifyAssemblyLoadPendingEvents();\n            break;\n\n        case kEventKindTypeLoad:\n            NotifyTypeLoadPendingEvents();\n            break;\n\n        case kEventKindAppDomainUnload:\n            LOG(\"NotifyPendingEventsOfKind: kEventKindAppDomainUnload not implemented\");\n            break;\n\n        case kEventKindAssemblyUnload:\n            LOG(\"NotifyPendingEventsOfKind: kEventKindAssemblyUnload not implemented\");\n            break;\n\n        case kEventKindThreadStart:\n            NotifyThreadStartPendingEvents();\n            break;\n\n        case kEventKindThreadDeath:\n        case kEventKindVmStart:\n        case kEventKindVmDeath:\n        case kEventKindMethodEntry:\n        case kEventKindMethodExit:\n        case kEventKindBreakpoint:\n        case kEventKindStep:\n        case kEventKindException:\n        case kEventKindKeepAlive:\n        case kEventKindUserBreak:\n        case kEventKindUserLog:\n            break;\n    }\n}\n\nbool Agent::ShouldSendPendingEventsOnFirstMethodEntry()\n{\n    return _notify_pending_events_on_first_invoke;\n}\n\nvoid Agent::NotifyEvent(const Event &evt, EventRequestList &event_reqs)\n{\n    if (!_event_req_list.IsClientInterested(evt))\n    {\n        LOG(\"Skipping event, client not interested!\");\n        OnEventSkipped(evt);\n        return;\n    }\n\n    IL2CPP_ASSERT(evt.thread() != 0 && \"A debugger event is being sent with a NULL thread_id, which is not allowed (aka: something very bad happened).\");\n\n    EventRequestList::FilterInfo filter_info;\n\n    filter_info.exception = 0;\n    filter_info.klass = 0;\n\n    std::vector<int32_t> ids;\n    event_reqs.RequestIdsFor(ids, evt, filter_info);\n\n    SuspendPolicy suspend_policy = kSuspendPolicyNone;\n\n    std::vector<int32_t>::iterator it = ids.begin();\n    while (it != ids.end())\n    {\n        const EventRequest *req = event_reqs.GetEventRequestById(*it);\n        if (req != NULL)\n            suspend_policy = std::max(suspend_policy, req->suspend_policy());\n        ++it;\n    }\n\n    EventCompositeCommand command;\n\n    it = ids.begin();\n    while (it != ids.end())\n    {\n        command.AddEvent(*it, &evt);\n        ++it;\n    }\n\n    if (evt.kind() == kEventKindVmStart)\n    {\n        IL2CPP_ASSERT(!IsDebuggerThread() && \"Unexpected VmStart event sent from the debugger thread. Only VM threads are allowed to send it.\");\n\n        // TODO: move this somewhere else, or split the NotifyEvent logic if needed\n\n        // (suspend=y)\n        suspend_policy = kSuspendPolicyAll;\n        StartListeningThread();\n    }\n    else\n    {\n        if (IsDebuggerThread())\n        {\n            LOG(\"The event is being sent from the debugger thread. Disabling suspend.\");\n\n            suspend_policy = kSuspendPolicyNone;\n        }\n    }\n\n    // We always suspend in case a Step Event is fired\n    if (evt.kind() == kEventKindStep)\n        suspend_policy = kSuspendPolicyAll;\n\n    if (suspend_policy == kSuspendPolicyAll)\n        RequestSuspend();\n\n    command.suspend_policy(suspend_policy);\n\n    _protocol.SendCommand(&command);\n\n    if (!IsDebuggerThread())\n        SuspendCurrentThreadIfNeeded();\n}\n\nvoid Agent::OnMethodEntry(const Il2CppStackFrameInfo &info)\n{\n    if (ShouldSendPendingEventsOnFirstMethodEntry())\n    {\n        NotifyAllPendingEvents();\n\n        _notify_pending_events_on_first_invoke = false;\n    }\n}\n\nvoid Agent::OnMethodExit(const Il2CppStackFrameInfo &info)\n{\n}\n\nvoid Agent::OnThreadAttach(Il2CppThread *thread)\n{\n    if (IsDebuggerThread())\n        return;\n\n    _thread_data.NotifyThreadAttach(thread);\n\n    NotifyThreadStart(thread);\n\n    SuspendCurrentThreadIfNeeded();\n}\n\nvoid Agent::OnThreadDetach(Il2CppThread *thread)\n{\n    if (IsDebuggerThread())\n        return;\n\n    NotifyThreadDeath(thread);\n\n    _thread_data.NotifyThreadDetach(thread);\n}\n\nbool Agent::IsSuspended()\n{\n    return il2cpp::os::Atomic::CompareExchange(&suspend_count, suspend_count, 0) != 0;\n}\n\nvoid Agent::RequestSuspend()\n{\n    LOG(\"Requesting VM suspend\");\n\n    il2cpp::os::Atomic::Increment(&suspend_count);\n}\n\nvoid Agent::WaitForSuspend()\n{\n    LOG(\"Waiting for all the managed threads to be suspended.\");\n\n    LOG(\"Agent::WaitForSuspend has a dummy implementation for now.\");\n\n    suspend_semaphore.Wait();\n\n    LOG(\"VM suspended\");\n}\n\nvoid Agent::RequestResume()\n{\n    LOG(\"Requesting VM resume\");\n\n    il2cpp::os::Atomic::Decrement(&suspend_count);\n\n    IL2CPP_ASSERT(suspend_count >= 0 && \"RequestResume has been invoked more times than RequestSuspend!\");\n}\n\nvoid Agent::SuspendCurrentThreadIfNeeded()\n{\n    IL2CPP_ASSERT(!IsDebuggerThread() && \"The debugger thread cannot be suspended!\");\n\n    if (il2cpp::os::Atomic::CompareExchange(&suspend_count, suspend_count, 0) == 0)\n        return;\n\n    LOG(\"Suspending current thread\");\n\n    suspend_semaphore.Post(1, NULL);\n\n    ThreadData* current_thread_data = _thread_data.ThreadDataFor(CALL_IL2CPP_API(il2cpp_thread_current)());\n\n    while (il2cpp::os::Atomic::CompareExchange(&suspend_count, suspend_count, 0) != 0)\n    {\n        il2cpp::os::Thread::Sleep(1);\n        InvokeMethodIfOneIsReady(current_thread_data);\n    }\n\n    current_thread_data->InvalidateFramesCache();\n\n    LOG(\"Resuming current thread\");\n}\n\nvoid Agent::SequencePointHit(int64_t uid, int32_t offset)\n{\n    // Note: SequencePointHit locks in case a breakpoint or a single step is hit, and returns only when the VM is resumed.\n\n    // LOG(\"Sequence point hit (uid: \" << uid << \", offset: \" << std::uppercase << std::hex << offset << std::dec << std::nouppercase << \")\");\n\n    if (_currently_invoking_method)\n        return;\n\n    il2cpp_debug_update_frame_il_offset(offset);\n\n    SuspendCurrentThreadIfNeeded();\n\n    BreakpointData *bp_data = BreakpointDataAt(uid, offset);\n\n    if (IS_BREAKPOINT_DATA_INVALID(bp_data))\n    {\n        LOG(\"Breakpoint hit (request id: \" << bp_data->request->id() << \")\");\n\n        ClearSingleStepData();\n\n        NotifyBreakPointHit(bp_data->method, offset, *bp_data);\n    }\n    else\n    {\n        // TODO: we probably need to do something different in case there\n        // were both a bp and a single step at the same line.\n        ProcessSingleStepIfNeeded(uid, offset);\n    }\n}\n\nBreakpointData *Agent::BreakpointDataAt(int64_t uid, int32_t offset)\n{\n    Il2CppStackFrameInfo frame;\n\n    if (!il2cpp_current_thread_get_top_frame(frame))\n    {\n        IL2CPP_ASSERT(0 && \"Not implemented\");\n    }\n\n    const Il2CppDebugMethodInfo *info = il2cpp_debug_get_method_info(frame.method);\n\n    return (BreakpointData*)il2cpp_debug_method_get_breakpoint_data_at(info, uid, offset);\n}\n\nbool Agent::ShouldProcessStepRequest(Il2CppThread *current_thread, const Il2CppStackFrameInfo *top_frame, int32_t stack_depth, bool *can_break_at_the_same_line)\n{\n    if (_ss_data == 0)\n        return false;\n\n    *can_break_at_the_same_line = true;\n\n    switch (_ss_data->depth)\n    {\n        case kStepDepthKindInto:\n        {\n            if (_ss_data->last_method != top_frame->method)\n            {\n                Il2CppStackFrameInfo second_top_frame;\n                if (!il2cpp_thread_get_frame_at(current_thread, -1, second_top_frame))\n                    return false;\n\n                if (_ss_data->last_method != second_top_frame.method)\n                    return false;\n            }\n            else\n            {\n                // In this case, we perform a simple step over.\n                return true;\n            }\n        }\n        break;\n\n        case kStepDepthKindOver:\n            *can_break_at_the_same_line = false;\n\n            if (_ss_data->last_method != top_frame->method)\n            {\n                if (stack_depth < _ss_data->stack_depth)\n                {\n                    // We stepped over the last sequence point of a function invocation.\n                    // In this case, we perform a step out.\n                    return true;\n                }\n                else\n                {\n                    return false;\n                }\n            }\n            else\n            {\n                if (stack_depth == _ss_data->stack_depth)\n                {\n                    // Regular step over.\n                    return true;\n                }\n                else if (stack_depth < _ss_data->stack_depth)\n                {\n                    // We stepped over the last sequence point of a recursive function invocation.\n                    // In this case, we perform a step out.\n                    // In this case, we might also be at the last instruction of a recursive function: this\n                    // means that, after the simulation of the step out, we end up on the same line we were before.\n                    // In this case, we should still allow the agent to break.\n                    *can_break_at_the_same_line = true;\n                    return true;\n                }\n                else\n                {\n                    // We are inside a recursive function. In this case we need to skip the step.\n                    return false;\n                }\n            }\n\n            break;\n\n        case kStepDepthKindOut:\n            if (_ss_data->last_method == top_frame->method)\n            {\n                if (stack_depth >= _ss_data->stack_depth)\n                    return false;\n\n                // In this case, we are probably stepping out of a recursive function. In this case\n                // we can proceed simulating a step over.\n                return true;\n            }\n\n            if (stack_depth >= _ss_data->stack_depth)\n                return false;\n\n            IL2CPP_ASSERT((_ss_data->stack_depth - stack_depth) == 1 && \"Stepping out jumped more than one stack frame: not supported yet (probably hitting a native stack frame)\");\n            break;\n    }\n\n    return true;\n}\n\nbool Agent::ProcessSingleStepIfNeeded(int64_t uid, int32_t offset)\n{\n    if (_ss_data == 0)\n        return false;\n\n    Il2CppThread *current_thread = il2cpp_thread_current();\n\n    if (_ss_data->thread != current_thread)\n        return false;\n\n    IL2CPP_ASSERT(_ss_data->size == kStepSizeKindLine && \"Only line stepping is supported for now\");\n\n    Il2CppStackFrameInfo top_frame;\n\n    if (!il2cpp_current_thread_get_top_frame(top_frame))\n        return false;\n\n    if (top_frame.il_offset == -1)\n        return false;\n\n    bool can_break_at_the_same_line = true;\n    const int32_t stack_depth = il2cpp_current_thread_get_stack_depth();\n\n    if (!ShouldProcessStepRequest(current_thread, &top_frame, stack_depth, &can_break_at_the_same_line))\n        return false;\n\n    const Il2CppDebugMethodInfo *debug_method = top_frame.method->debug_info;\n\n    if (debug_method == 0)\n        return false;\n\n    _ss_data->stack_depth = stack_depth;\n    _ss_data->last_method = top_frame.method;\n\n    int32_t lineno = -1;\n    const int32_t *offset_table = il2cpp_debug_method_get_offset_table(debug_method);\n\n    // An offset_table might be empty. In case it is, we skip the lineno.\n    // Same thing for the il_offset.\n    if (offset_table[0] != -1 && top_frame.il_offset != -1)\n    {\n        int32_t i;\n        const int32_t il_offset = top_frame.il_offset;\n\n        for (i = 2; offset_table[i] >= 0; i += 2)\n        {\n            const int32_t start = offset_table[i - 2];\n            const int32_t end = offset_table[i];\n\n            if (start <= il_offset && end > il_offset)\n            {\n                lineno = offset_table[i - 1];\n                break;\n            }\n        }\n\n        if (lineno == -1)\n        {\n            const int32_t last_offset = offset_table[i - 2];\n            if (il_offset <= debug_method->code_size && il_offset >= last_offset)\n                lineno = offset_table[i - 1];\n        }\n    }\n\n    if (lineno == -1 || (lineno == _ss_data->last_line && !can_break_at_the_same_line))\n        return false;\n\n    SingleStepData ss_data_copy = *_ss_data;\n\n    ss_data_copy.last_line = lineno;\n\n    ClearSingleStepData();\n\n    NotifyStepHit(ss_data_copy.last_method, offset, ss_data_copy);\n\n    return true;\n}\n\nstatic void start_debugger_agent_thread(void *data)\n{\n    Agent *agent = (Agent*)data;\n    agent->ListenForClientMessages();\n}\n\nvoid Agent::StartListeningThread()\n{\n    IL2CPP_ASSERT(_thread == 0 && \"Listening thread is already running!\");\n\n    _thread = new os::Thread();\n    _thread->Run(start_debugger_agent_thread, this);\n}\n\nvoid Agent::StopListeningThread()\n{\n    if (_thread == 0)\n        return;\n\n    _protocol.Dispose();\n\n    _thread->Join();\n\n    delete _thread;\n    _thread = 0;\n}\n\n#define DELETE_LOCAL(v) \\\n    if(v != 0) \\\n        delete v; \\\n    v = 0;\n\nvoid Agent::ListenForClientMessages()\n{\n    LOG(\"Listening for incoming messages.\");\n\n    // Attach the thread where the debugger is running so that the GC will work\n    // correctly with managed objects used in the debugger thread.\n    _managed_debugger_thread = il2cpp_thread_attach(il2cpp_domain_get());\n\n    while (true)\n    {\n        const Command *command = _protocol.WaitForCommand();\n\n        if (command == NULL)\n        {\n            LOG(\"The socket was shut down while reading the header\");\n            break;\n        }\n\n        const Reply *reply = Process(command);\n\n        if (reply != NULL)\n        {\n            if (!_protocol.SendReply(reply))\n            {\n                DELETE_LOCAL(reply);\n                DELETE_LOCAL(command);\n\n                LOG(\"The socket was shut down while sending the reply\");\n                break;\n            }\n        }\n\n        if (command->is(kCommandSetVm, kCommandSetVmDispose))\n        {\n            DELETE_LOCAL(reply);\n            DELETE_LOCAL(command);\n            break;\n        }\n\n        DELETE_LOCAL(reply);\n        DELETE_LOCAL(command);\n    }\n\n    LOG(\"Debugger thread is being stopped\");\n\n    _protocol.Dispose();\n\n    il2cpp_thread_detach(il2cpp_thread_current());\n}\n\nvoid Agent::InvokeMethodIfOneIsReady(ThreadData* thread_data)\n{\n    const MethodInfo* method = thread_data->GetMethodToInvoke();\n    if (method)\n    {\n        CurrentlyInvokingMethodHelper helper(_currently_invoking_method);\n        thread_data->SetReturnValueOfMethodToInvoke(CALL_IL2CPP_API(il2cpp_runtime_invoke)(method, NULL, NULL, NULL));\n        thread_data->ClearMethodToInvoke();\n        thread_data->SignalMethodInvokeComplete();\n    }\n}\n\n#define PROCESS_COMMAND(s, c) \\\n    if(command->is(kCommandSet ## s, kCommandSet ## s ## c)) \\\n        return Process((const s ## c ## Command*)command)\n\nconst Reply *Agent::Process(const Command *command)\n{\n    PROCESS_COMMAND(StackFrame, GetValues);\n    PROCESS_COMMAND(StackFrame, SetValues);\n    PROCESS_COMMAND(StackFrame, GetThis);\n    PROCESS_COMMAND(Assembly, GetObject);\n    PROCESS_COMMAND(Assembly, GetEntryPoint);\n    PROCESS_COMMAND(Assembly, GetManifestModule);\n    PROCESS_COMMAND(Assembly, GetName);\n    PROCESS_COMMAND(Assembly, GetLocation);\n    PROCESS_COMMAND(Assembly, GetType);\n    PROCESS_COMMAND(InternalError, NotImplemented);\n    PROCESS_COMMAND(Vm, SetProtocolVersion);\n    PROCESS_COMMAND(Vm, Suspend);\n    PROCESS_COMMAND(Vm, AllThreads);\n    PROCESS_COMMAND(Vm, Version);\n    PROCESS_COMMAND(Vm, Dispose);\n    PROCESS_COMMAND(Vm, AbortInvoke);\n    PROCESS_COMMAND(Vm, Resume);\n    PROCESS_COMMAND(Vm, Exit);\n    PROCESS_COMMAND(Vm, InvokeMethod);\n    PROCESS_COMMAND(StringRef, GetValue);\n    PROCESS_COMMAND(ObjectRef, GetType);\n    PROCESS_COMMAND(ObjectRef, GetDomain);\n    PROCESS_COMMAND(ObjectRef, IsCollected);\n    PROCESS_COMMAND(ObjectRef, SetValues);\n    PROCESS_COMMAND(ObjectRef, GetAddress);\n    PROCESS_COMMAND(ObjectRef, GetValues);\n    PROCESS_COMMAND(Type, GetProperties);\n    PROCESS_COMMAND(Type, GetSourceFiles2);\n    PROCESS_COMMAND(Type, GetPropertyCAttrs);\n    PROCESS_COMMAND(Type, GetFieldCAttrs);\n    PROCESS_COMMAND(Type, GetInfo);\n    PROCESS_COMMAND(Type, IsAssignableFrom);\n    PROCESS_COMMAND(Type, GetCAttrs);\n    PROCESS_COMMAND(Type, GetSourceFiles);\n    PROCESS_COMMAND(Type, GetValues);\n    PROCESS_COMMAND(Type, GetObject);\n    PROCESS_COMMAND(Type, GetFields);\n    PROCESS_COMMAND(Type, SetValues);\n    PROCESS_COMMAND(Type, GetMethods);\n    PROCESS_COMMAND(Thread, GetName);\n    PROCESS_COMMAND(Thread, GetFrameInfo);\n    PROCESS_COMMAND(Thread, GetInfo);\n    PROCESS_COMMAND(Thread, GetState);\n    PROCESS_COMMAND(Thread, GetId);\n    PROCESS_COMMAND(ArrayRef, GetValues);\n    PROCESS_COMMAND(ArrayRef, GetLength);\n    PROCESS_COMMAND(ArrayRef, SetValues);\n    PROCESS_COMMAND(EventRequest, Clear);\n    PROCESS_COMMAND(EventRequest, ClearAllBreakpoints);\n    PROCESS_COMMAND(EventRequest, Set);\n    PROCESS_COMMAND(AppDomain, GetFriendlyName);\n    PROCESS_COMMAND(AppDomain, CreateString);\n    PROCESS_COMMAND(AppDomain, GetEntryAssembly);\n    PROCESS_COMMAND(AppDomain, GetRootDomain);\n    PROCESS_COMMAND(AppDomain, CreateBoxedValue);\n    PROCESS_COMMAND(AppDomain, GetAssemblies);\n    PROCESS_COMMAND(AppDomain, GetCorlib);\n    PROCESS_COMMAND(Method, GetParamInfo);\n    PROCESS_COMMAND(Method, GetName);\n    PROCESS_COMMAND(Method, GetDeclaringType);\n    PROCESS_COMMAND(Method, GetLocalsInfo);\n    PROCESS_COMMAND(Method, GetInfo);\n    PROCESS_COMMAND(Method, GetDebugInfo);\n    PROCESS_COMMAND(Method, ResolveToken);\n    PROCESS_COMMAND(Method, GetBody);\n    PROCESS_COMMAND(Module, GetInfo);\n    PROCESS_COMMAND(Event, Composite);\n\n    return NULL;\n}\n\nconst Protocol& Agent::GetProtocol()\n{\n    return _protocol;\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/agent.h",
    "content": "#pragma once\n\n#include <set>\n#include <list>\n\n#include \"common.h\"\n#include \"thread-data.h\"\n#include \"protocol/protocol.h\"\n#include \"event-request.h\"\n#include \"il2cpp-api-test-forwarder.h\"\n\n#include \"../os/Thread.h\"\n#include \"../os/Semaphore.h\"\n\nstruct Il2CppStackFrameInfo;\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    class Event;\n    class Reply;\n    class Command;\n    class IDataTransport;\n\n    struct StackFrameGetValuesCommand;\n    struct StackFrameSetValuesCommand;\n    struct StackFrameGetThisCommand;\n    struct AssemblyGetObjectCommand;\n    struct AssemblyGetEntryPointCommand;\n    struct AssemblyGetManifestModuleCommand;\n    struct AssemblyGetNameCommand;\n    struct AssemblyGetLocationCommand;\n    struct AssemblyGetTypeCommand;\n    struct InternalErrorNotImplementedCommand;\n    struct InternalErrorInvalidCommand;\n    struct VmSetProtocolVersionCommand;\n    struct VmSuspendCommand;\n    struct VmAllThreadsCommand;\n    struct VmVersionCommand;\n    struct VmDisposeCommand;\n    struct VmAbortInvokeCommand;\n    struct VmResumeCommand;\n    struct VmExitCommand;\n    struct VmInvokeMethodCommand;\n    struct StringRefGetValueCommand;\n    struct ObjectRefGetTypeCommand;\n    struct ObjectRefGetDomainCommand;\n    struct ObjectRefIsCollectedCommand;\n    struct ObjectRefSetValuesCommand;\n    struct ObjectRefGetAddressCommand;\n    struct ObjectRefGetValuesCommand;\n    struct TypeGetPropertiesCommand;\n    struct TypeGetSourceFiles2Command;\n    struct TypeGetPropertyCAttrsCommand;\n    struct TypeGetFieldCAttrsCommand;\n    struct TypeGetInfoCommand;\n    struct TypeIsAssignableFromCommand;\n    struct TypeGetCAttrsCommand;\n    struct TypeGetSourceFilesCommand;\n    struct TypeGetValuesCommand;\n    struct TypeGetObjectCommand;\n    struct TypeGetFieldsCommand;\n    struct TypeSetValuesCommand;\n    struct TypeGetMethodsCommand;\n    struct ThreadGetNameCommand;\n    struct ThreadGetFrameInfoCommand;\n    struct ThreadGetInfoCommand;\n    struct ThreadGetStateCommand;\n    struct ThreadGetIdCommand;\n    struct ArrayRefGetValuesCommand;\n    struct ArrayRefGetLengthCommand;\n    struct ArrayRefSetValuesCommand;\n    struct EventRequestClearCommand;\n    struct EventRequestClearAllBreakpointsCommand;\n    struct EventRequestSetCommand;\n    struct AppDomainGetFriendlyNameCommand;\n    struct AppDomainCreateStringCommand;\n    struct AppDomainGetEntryAssemblyCommand;\n    struct AppDomainGetRootDomainCommand;\n    struct AppDomainCreateBoxedValueCommand;\n    struct AppDomainGetAssembliesCommand;\n    struct AppDomainGetCorlibCommand;\n    struct MethodGetParamInfoCommand;\n    struct MethodGetNameCommand;\n    struct MethodGetDeclaringTypeCommand;\n    struct MethodGetLocalsInfoCommand;\n    struct MethodGetInfoCommand;\n    struct MethodGetDebugInfoCommand;\n    struct MethodResolveTokenCommand;\n    struct MethodGetBodyCommand;\n    struct ModuleGetInfoCommand;\n    class EventCompositeCommand;\n\n    struct AgentConfig\n    {\n        bool server;\n        const char *host;\n        int32_t port;\n\n        AgentConfig();\n        AgentConfig(const char *host, int32_t port);\n\n        static AgentConfig Default;\n    };\n\n    static int32_t suspend_count = 0;\n    static os::Semaphore suspend_semaphore = 0;\n\n#define INVALIDATE_BREAKPOINT_DATA(bp)  \\\n    (bp)->method = (MethodInfo*)0xCAFFECAFFE\n\n#define IS_BREAKPOINT_DATA_INVALID(bp)  \\\n    ((bp) != 0 && (bp)->method != (MethodInfo*)0xCAFFECAFFE)\n\n    struct BreakpointData\n    {\n        const MethodInfo *method;\n        const EventRequest *request;\n        uint64_t location;\n    };\n\n    struct SingleStepData\n    {\n        StepSizeKind size;\n        StepDepthKind depth;\n        const Il2CppThread *thread;\n        const EventRequest *request;\n        const MethodInfo *last_method;\n        int32_t last_line;\n        int32_t stack_depth;\n    };\n\n    class Agent\n    {\n    public:\n\n        inline static Agent &instance()\n        {\n            return Agent::_instance;\n        }\n\n        void Initialize(const AgentConfig &config);\n        void Dispose();\n        bool IsInitialized();\n\n        void ListenForClientMessages();\n        void SequencePointHit(int64_t uid, int32_t offset);\n        void NotifyVmStart();\n        void NotifyVmDeath();\n        void NotifyUserBreak();\n        void NotifyBreakPointHit(const MethodInfo *method, uint64_t offset, BreakpointData &bp_data);\n        void NotifyStepHit(const MethodInfo *method, uint64_t offset, SingleStepData &ss_data);\n        void NotifyAppDomainCreate(Il2CppDomain *domain);\n        void NotifyAssemblyLoad(const Il2CppAssembly *assembly);\n        void NotifyTypeLoad(Il2CppClass *type);\n        void NotifyThreadStart(Il2CppThread *thread);\n        void NotifyThreadDeath(Il2CppThread *thread);\n\n        void OnMethodEntry(const Il2CppStackFrameInfo &info);\n        void OnMethodExit(const Il2CppStackFrameInfo &info);\n\n        void OnThreadAttach(Il2CppThread *thread);\n        void OnThreadDetach(Il2CppThread *thread);\n\n        bool IsDebuggerThread();\n\n        const Reply *Process(const Command *command);\n        const Protocol& GetProtocol();\n\n        bool IsSuspended();\n        void RequestSuspend();\n        void RequestResume();\n        void SuspendCurrentThreadIfNeeded();\n\n#if IL2CPP_UNIT_TESTS_ENABLED\n        static Il2CppApiTestForwarder TestForwarder;\n#endif // IL2CPP_UNIT_TESTS_ENABLED\n\n    private:\n\n        static Agent _instance;\n\n        Agent();\n        ~Agent();\n\n        void InvalidateBreakpointData();\n        void ClearBreakpointData();\n        void ClearSingleStepData();\n\n        void StartListeningThread();\n        void StopListeningThread();\n\n        void WaitForSuspend();\n        bool ProcessSingleStepIfNeeded(int64_t uid, int32_t offset);\n        bool ShouldProcessStepRequest(Il2CppThread *current_thread, const Il2CppStackFrameInfo *top_frame, int32_t stack_depth, bool *can_break_at_the_same_line);\n        BreakpointData *BreakpointDataAt(int64_t uid, int32_t offset);\n\n        void NotifyAllPendingEvents();\n        void NotifyAppDomainCreatePendingEvents();\n        void NotifyAssemblyLoadPendingEvents();\n        void NotifyTypeLoadPendingEvents();\n        void NotifyThreadStartPendingEvents();\n        void NotifyPendingEventsOfKind(EventKind kind);\n\n        void NotifyEvent(const Event &evt, EventRequestList &event_reqs);\n        void OnEventSkipped(const Event &evt);\n\n        void InvokeMethodIfOneIsReady(ThreadData* current_thread_data);\n\n        SingleStepData *PrepareSingleStepData(EventRequest *request, Il2CppThread *thread, StepSizeKind size, StepDepthKind depth);\n\n        bool ShouldSendPendingEventsOnFirstMethodEntry();\n\n        const Reply *Process(const StackFrameGetValuesCommand *command);\n        const Reply *Process(const StackFrameSetValuesCommand *command);\n        const Reply *Process(const StackFrameGetThisCommand *command);\n        const Reply *Process(const AssemblyGetObjectCommand *command);\n        const Reply *Process(const AssemblyGetEntryPointCommand *command);\n        const Reply *Process(const AssemblyGetManifestModuleCommand *command);\n        const Reply *Process(const AssemblyGetNameCommand *command);\n        const Reply *Process(const AssemblyGetLocationCommand *command);\n        const Reply *Process(const AssemblyGetTypeCommand *command);\n        const Reply *Process(const InternalErrorNotImplementedCommand *command);\n        const Reply *Process(const VmSetProtocolVersionCommand *command);\n        const Reply *Process(const VmSuspendCommand *command);\n        const Reply *Process(const VmAllThreadsCommand *command);\n        const Reply *Process(const VmVersionCommand *command);\n        const Reply *Process(const VmDisposeCommand *command);\n        const Reply *Process(const VmAbortInvokeCommand *command);\n        const Reply *Process(const VmResumeCommand *command);\n        const Reply *Process(const VmExitCommand *command);\n        const Reply *Process(const VmInvokeMethodCommand *command);\n        const Reply *Process(const StringRefGetValueCommand *command);\n        const Reply *Process(const ObjectRefGetTypeCommand *command);\n        const Reply *Process(const ObjectRefGetDomainCommand *command);\n        const Reply *Process(const ObjectRefIsCollectedCommand *command);\n        const Reply *Process(const ObjectRefSetValuesCommand *command);\n        const Reply *Process(const ObjectRefGetAddressCommand *command);\n        const Reply *Process(const ObjectRefGetValuesCommand *command);\n        const Reply *Process(const TypeGetPropertiesCommand *command);\n        const Reply *Process(const TypeGetSourceFiles2Command *command);\n        const Reply *Process(const TypeGetPropertyCAttrsCommand *command);\n        const Reply *Process(const TypeGetFieldCAttrsCommand *command);\n        const Reply *Process(const TypeGetInfoCommand *command);\n        const Reply *Process(const TypeIsAssignableFromCommand *command);\n        const Reply *Process(const TypeGetCAttrsCommand *command);\n        const Reply *Process(const TypeGetSourceFilesCommand *command);\n        const Reply *Process(const TypeGetValuesCommand *command);\n        const Reply *Process(const TypeGetObjectCommand *command);\n        const Reply *Process(const TypeGetFieldsCommand *command);\n        const Reply *Process(const TypeSetValuesCommand *command);\n        const Reply *Process(const TypeGetMethodsCommand *command);\n        const Reply *Process(const ThreadGetNameCommand *command);\n        const Reply *Process(const ThreadGetFrameInfoCommand *command);\n        const Reply *Process(const ThreadGetInfoCommand *command);\n        const Reply *Process(const ThreadGetStateCommand *command);\n        const Reply *Process(const ThreadGetIdCommand *command);\n        const Reply *Process(const ArrayRefGetValuesCommand *command);\n        const Reply *Process(const ArrayRefGetLengthCommand *command);\n        const Reply *Process(const ArrayRefSetValuesCommand *command);\n        const Reply *Process(const EventRequestClearCommand *command);\n        const Reply *Process(const EventRequestClearAllBreakpointsCommand *command);\n        const Reply *Process(const EventRequestSetCommand *command);\n        const Reply *Process(const AppDomainGetFriendlyNameCommand *command);\n        const Reply *Process(const AppDomainCreateStringCommand *command);\n        const Reply *Process(const AppDomainGetEntryAssemblyCommand *command);\n        const Reply *Process(const AppDomainGetRootDomainCommand *command);\n        const Reply *Process(const AppDomainCreateBoxedValueCommand *command);\n        const Reply *Process(const AppDomainGetAssembliesCommand *command);\n        const Reply *Process(const AppDomainGetCorlibCommand *command);\n        const Reply *Process(const MethodGetParamInfoCommand *command);\n        const Reply *Process(const MethodGetNameCommand *command);\n        const Reply *Process(const MethodGetDeclaringTypeCommand *command);\n        const Reply *Process(const MethodGetLocalsInfoCommand *command);\n        const Reply *Process(const MethodGetInfoCommand *command);\n        const Reply *Process(const MethodGetDebugInfoCommand *command);\n        const Reply *Process(const MethodResolveTokenCommand *command);\n        const Reply *Process(const MethodGetBodyCommand *command);\n        const Reply *Process(const ModuleGetInfoCommand *command);\n        const Reply *Process(const EventCompositeCommand *command);\n\n        AgentConfig _config;\n        Protocol _protocol;\n        os::Thread *_thread;\n        Il2CppThread *_managed_debugger_thread;\n        EventRequestList _event_req_list;\n        IDataTransport *_transport;\n        bool _is_notifying_pending_events;\n        std::list<BreakpointData*> _bp_data;\n        SingleStepData *_ss_data;\n        bool _notify_pending_events_on_first_invoke;\n        bool _is_initialized;\n        bool _currently_invoking_method;\n\n        std::set<Il2CppClass*> _pending_types;\n        std::set<Il2CppThread*> _pending_threads;\n        std::set<Il2CppDomain*> _pending_domains;\n        std::set<Il2CppAssembly*> _pending_assemblies;\n\n        ThreadDataMap _thread_data;\n\n        DISALLOW_COPY(Agent);\n    };\n\n    class CurrentlyInvokingMethodHelper\n    {\n    public:\n        CurrentlyInvokingMethodHelper(bool& currently_invoking_method) :\n            _currently_invoking_method(currently_invoking_method)\n        {\n            _currently_invoking_method = true;\n        }\n\n        ~CurrentlyInvokingMethodHelper()\n        {\n            _currently_invoking_method = false;\n        }\n\n    private:\n        bool& _currently_invoking_method;\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/command-line-parser.cpp",
    "content": "#include <cstring>\n#include <cstring>\n#include <stdlib.h>\n#include <string.h>\n#include \"command-line-parser.h\"\n\nusing namespace il2cpp::debugger;\n\nbool CommandLineParser::Parse(int argc, char* argv[], CommandLineOptions* options)\n{\n    options->print_help = false;\n\n    bool hostFound = false;\n    bool portFound = false;\n\n    int i = 1;\n    while (i < argc)\n    {\n        if (strcmp(argv[i], debugger_host_option) == 0)\n        {\n            options->host = argv[i + 1];\n            hostFound = true;\n            i += 2;\n        }\n        else if (strcmp(argv[i], debugger_port_option) == 0)\n        {\n            options->port = atoi(argv[i + 1]);\n            portFound = true;\n            i += 2;\n        }\n        else if (strcmp(argv[i], debugger_help_option) == 0)\n        {\n            options->print_help = true;\n            i += 1;\n        }\n        else\n        {\n            i += 1;\n        }\n    }\n\n    return !options->print_help && hostFound && portFound;\n}\n\nvoid CommandLineParser::PrintUsage(std::ostream& out)\n{\n    out << \"Usage: --debugger-host <host> (optional) --debugger-port <port> (optional) --help (optional)\";\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/command-line-parser.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <cstdlib>\n#include <ostream>\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct CommandLineOptions\n    {\n        char* host;\n        int32_t port;\n        bool print_help;\n    };\n\n    static const char* debugger_host_option = \"--debugger-host\";\n    static const char* debugger_port_option = \"--debugger-port\";\n    static const char* debugger_help_option = \"--help\";\n\n    class CommandLineParser\n    {\n    public:\n        static bool Parse(int argc, char* argv[], CommandLineOptions* options);\n        static void PrintUsage(std::ostream& out);\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/common.h",
    "content": "#pragma once\n\n#include <sstream>\n#include <iostream>\n#include <stdlib.h>\n#include <stdint.h>\n\n#include \"il2cpp-config.h\"\n\n#include \"../os/Thread.h\"\n\nstruct Il2CppAssembly;\nstruct Il2CppClass;\nstruct Il2CppObject;\nstruct Il2CppImage;\nstruct Il2CppDomain;\nstruct MethodInfo;\nstruct FieldInfo;\nstruct PropertyInfo;\nstruct Il2CppThread;\nstruct Il2CppType;\n\nextern bool is_debugger_thread();\n\n#define DISALLOW_COPY(t) \\\n    private: \\\n        t(const t&); \\\n        t& operator=(const t&);\n\n#if IL2CPP_DEBUGGER_LOG\n    #define LOG(msg) \\\n        {\\\n            std::cout << \"[debugger:\"<< il2cpp::os::Thread::CurrentThreadId() << \"/\" << (is_debugger_thread() ? \"dbg\" : \"vm\") << \"] \" << msg << std::endl; \\\n        }\n#else\n    #define LOG(msg) do{} while(0)\n#endif\n\nenum SuspendPolicy\n{\n    kSuspendPolicyNone = 0,\n    kSuspendPolicyEventThread = 1,\n    kSuspendPolicyAll = 2\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/data-buffer.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"data-buffer.h\"\n\n#include \"common.h\"\n#include \"variant.h\"\n\n#include \"id-bank.h\"\n\nusing namespace il2cpp::debugger;\n\nBuffer::Buffer(size_t size) :\n    _data(0),\n    _ptr(0),\n    _tail(0),\n    _end(0)\n{\n    AssureRoomFor(size);\n\n    memset(_data, 0, buffer_size());\n}\n\nBuffer::~Buffer()\n{\n    if (_data != 0)\n    {\n        delete[] _data;\n\n        _data = 0;\n        _ptr = 0;\n        _tail = 0;\n        _end = 0;\n    }\n}\n\nvoid Buffer::Reset()\n{\n    memset(_data, 0, buffer_size());\n\n    _ptr = _data;\n    _tail = _data;\n}\n\nvoid Buffer::Reset(size_t sz)\n{\n    if (sz > buffer_size())\n    {\n        delete[] _data;\n\n        _data = new uint8_t[((sz / GrowStep) + 1) * GrowStep];\n        _ptr = _data;\n        _tail = _data;\n        _end = _data + sz;\n    }\n\n    Reset();\n}\n\nvoid Buffer::Seek(int32_t offset)\n{\n    const int32_t dist = (offset - (int32_t)buffer_size());\n    if (dist > 0)\n        AssureRoomFor(dist);\n\n    _ptr = _data + offset;\n\n    if (_ptr > _tail)\n        _tail = _ptr;\n}\n\nvoid Buffer::AssureRoomFor(size_t size)\n{\n    const size_t pos = position();\n    const size_t new_size = buffer_size() + size;\n    const size_t tail_pos = length();\n\n    if (pos + size <= buffer_size())\n        return;\n\n    uint8_t *new_data = new uint8_t[((new_size / GrowStep) + 1) * GrowStep];\n\n    if (_data != 0)\n    {\n        memcpy(new_data, _data, buffer_size());\n        delete[] _data;\n    }\n\n    _data = new_data;\n    _ptr = _data + pos;\n    _tail = _data + tail_pos;\n    _end = _data + new_size;\n}\n\nvoid Buffer::WriteInt(uint32_t value)\n{\n    AssureRoomFor(4);\n\n    *(_ptr + 0) = (value >> 24) & 0xFF;\n    *(_ptr + 1) = (value >> 16) & 0xFF;\n    *(_ptr + 2) = (value >> 8) & 0xFF;\n    *(_ptr + 3) = (value >> 0) & 0xFF;\n\n    _ptr += 4;\n\n    if (_ptr > _tail)\n        _tail = _ptr;\n}\n\nvoid Buffer::WriteString(const char *value)\n{\n    if (value != 0)\n    {\n        const size_t len = strlen(value);\n\n        WriteInt(len);\n        WriteData((uint8_t*)value, len);\n    }\n    else\n    {\n        WriteInt(0);\n    }\n}\n\nvoid Buffer::WriteString(const std::string &value)\n{\n    WriteInt(value.size());\n    WriteData((uint8_t*)value.c_str(), value.size());\n}\n\nvoid Buffer::WriteData(const uint8_t *data, size_t size)\n{\n    AssureRoomFor(size);\n    std::copy(data, data + size, _ptr);\n\n    _ptr += size;\n\n    if (_ptr > _tail)\n        _tail = _ptr;\n}\n\nvoid Buffer::WriteData(const Buffer &data)\n{\n    WriteData(data.raw(), data.length());\n}\n\nvoid Buffer::WriteByte(uint8_t value)\n{\n    AssureRoomFor(1);\n\n    *_ptr = value;\n\n    ++_ptr;\n\n    if (_ptr > _tail)\n        _tail = _ptr;\n}\n\nvoid Buffer::WriteBool(bool value)\n{\n    WriteByte((uint8_t)value);\n}\n\nvoid Buffer::WriteLong(uint64_t value)\n{\n    WriteInt((value >> 32) & 0xffffffff);\n    WriteInt((value >> 0) & 0xffffffff);\n}\n\nvoid Buffer::WritePtrId(const Id &id)\n{\n    WriteInt(id.id);\n}\n\nvoid Buffer::WriteAssemblyId(const Il2CppAssembly *assembly)\n{\n    WritePtrId(AssemblyId(assembly));\n}\n\nvoid Buffer::WriteObjectId(const Il2CppObject *object)\n{\n    WritePtrId(ObjectId(object));\n}\n\nvoid Buffer::WriteThreadId(const Il2CppThread *thread)\n{\n    WritePtrId(ObjectId((Il2CppObject*)thread));\n}\n\nvoid Buffer::WriteModuleId(const Il2CppImage *image)\n{\n    WritePtrId(ModuleId(image));\n}\n\nvoid Buffer::WriteTypeId(const Il2CppClass *klass)\n{\n    WritePtrId(TypeId(klass));\n}\n\nvoid Buffer::WriteDomainId(const Il2CppDomain *domain)\n{\n    WritePtrId(DomainId(domain));\n}\n\nvoid Buffer::WriteMethodId(const MethodInfo *method)\n{\n    WritePtrId(MethodId(method));\n}\n\nvoid Buffer::WriteFieldId(const FieldInfo *field)\n{\n    WritePtrId(FieldId(field));\n}\n\nvoid Buffer::WritePropertyId(const PropertyInfo *prop)\n{\n    WritePtrId(PropertyId(prop));\n}\n\nvoid Buffer::WriteVariant(const Variant &value)\n{\n    value.WriteTo(*this);\n}\n\nint32_t Buffer::ReadInt()\n{\n    IL2CPP_ASSERT(position() + 4 <= length() && \"Cannot read past the end of the buffer!\");\n\n    uint8_t *c = _ptr;\n\n    _ptr += 4;\n\n    if (_ptr > _tail)\n        _tail = _ptr;\n\n    return (((int32_t)c[0]) << 24)\n        | (((int32_t)c[1]) << 16)\n        | (((int32_t)c[2]) << 8)\n        | (((int32_t)c[3]) << 0);\n}\n\nuint8_t Buffer::ReadByte()\n{\n    IL2CPP_ASSERT(position() + 1 <= length() && \"Cannot read past the end of the buffer!\");\n\n    uint8_t *c = _ptr;\n\n    _ptr += 1;\n\n    if (_ptr > _tail)\n        _tail = _ptr;\n\n    return (uint8_t)c[0];\n}\n\nbool Buffer::ReadBool()\n{\n    return ReadByte() ? true : false;\n}\n\nIl2CppClass *Buffer::ReadType()\n{\n    return TypeFromId(ReadInt());\n}\n\nIl2CppObject *Buffer::ReadObject()\n{\n    Id id;\n    id.type = kIdTypeObject;\n    id.id = ReadInt();\n\n    return ObjectFromId(id);\n}\n\nIl2CppThread *Buffer::ReadThread()\n{\n    Id id;\n    id.type = kIdTypeObject;\n    id.id = ReadInt();\n\n    return (Il2CppThread*)ObjectFromId(id);\n}\n\nuint64_t Buffer::ReadLong()\n{\n    uint32_t high = ReadInt();\n    uint32_t low = ReadInt();\n\n    return ((((uint64_t)high) << 32) | ((uint64_t)low));\n}\n\nIl2CppDomain *Buffer::ReadDomain()\n{\n    Id id;\n    id.type = kIdTypeDomain;\n    id.id = ReadInt();\n\n    return DomainFromId(id);\n}\n\nIl2CppAssembly *Buffer::ReadAssembly()\n{\n    Id id;\n    id.type = kIdTypeAssembly;\n    id.id = ReadInt();\n\n    return AssemblyFromId(id);\n}\n\nIl2CppImage *Buffer::ReadModule()\n{\n    Id id;\n    id.type = kIdTypeModule;\n    id.id = ReadInt();\n\n    return ModuleFromId(id);\n}\n\nMethodInfo *Buffer::ReadMethod()\n{\n    Id id;\n    id.type = kIdTypeMethod;\n    id.id = ReadInt();\n\n    return MethodFromId(id);\n}\n\nFieldInfo *Buffer::ReadField()\n{\n    Id id;\n    id.type = kIdTypeField;\n    id.id = ReadInt();\n\n    return FieldFromId(id);\n}\n\nPropertyInfo *Buffer::ReadProperty()\n{\n    Id id;\n    id.type = kIdTypeProperty;\n    id.id = ReadInt();\n\n    return PropertyFromId(id);\n}\n\nstd::string Buffer::ReadString()\n{\n    const size_t len = ReadInt();\n\n    std::string value;\n    value.resize(len);\n\n    memcpy(&value[0], _ptr, len);\n\n    _ptr += len;\n\n    return value;\n}\n\nvoid Buffer::MarkReadRaw(size_t size)\n{\n    IL2CPP_ASSERT(size <= buffer_size() && \"A raw read was performed, but too many bytes were read. Memory overwrite!\");\n\n    _tail += size;\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/data-buffer.h",
    "content": "#pragma once\n\n#include \"common.h\"\n\n#include <string>\n#include <iterator>\n\nstruct Il2CppClass;\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct Id;\n    class Variant;\n\n    class Buffer\n    {\n    public:\n\n        static const int32_t GrowStep = 32;\n\n        explicit Buffer(size_t size);\n        ~Buffer();\n\n        void Seek(int32_t offset);\n        void Reset();\n        void Reset(size_t size);\n        void AssureRoomFor(size_t size);\n\n        void WriteInt(uint32_t value);\n        void WriteData(const uint8_t *data, size_t size);\n        void WriteData(const Buffer &data);\n        void WriteString(const char *value);\n        void WriteString(const std::string &value);\n        void WriteBool(bool value);\n        void WriteByte(uint8_t value);\n        void WritePtrId(const Id &id);\n        void WriteObjectId(const Il2CppObject *object);\n        void WriteThreadId(const Il2CppThread *thread);\n        void WriteAssemblyId(const Il2CppAssembly *assembly);\n        void WriteMethodId(const MethodInfo *method);\n        void WriteFieldId(const FieldInfo *field);\n        void WritePropertyId(const PropertyInfo *prop);\n        void WriteModuleId(const Il2CppImage *image);\n        void WriteTypeId(const Il2CppClass *klass);\n        void WriteDomainId(const Il2CppDomain *domain);\n        void WriteLong(uint64_t value);\n        void WriteVariant(const Variant &value);\n\n        int32_t ReadInt();\n        uint8_t ReadByte();\n        bool ReadBool();\n        Il2CppClass *ReadType();\n        Il2CppDomain *ReadDomain();\n        Il2CppObject *ReadObject();\n        Il2CppAssembly *ReadAssembly();\n        Il2CppImage *ReadModule();\n        MethodInfo *ReadMethod();\n        FieldInfo *ReadField();\n        PropertyInfo *ReadProperty();\n        std::string ReadString();\n        uint64_t ReadLong();\n        Il2CppThread *ReadThread();\n\n        void MarkReadRaw(size_t size);\n\n        template<typename T>\n        inline T ReadEnum()\n        {\n            return (T)ReadByte();\n        }\n\n        inline const int32_t position() const\n        {\n            return (((uintptr_t)_ptr) - ((uintptr_t)_data));\n        }\n\n        inline const size_t length() const\n        {\n            return (((uintptr_t)_tail) - ((uintptr_t)_data));\n        }\n\n        inline const size_t buffer_size() const\n        {\n            return (((uintptr_t)_end) - ((uintptr_t)_data));\n        }\n\n        inline uint8_t *raw()\n        {\n            return _data;\n        }\n\n        inline const uint8_t *raw() const\n        {\n            return _data;\n        }\n\n    private:\n\n        uint8_t *_data;\n        uint8_t *_ptr;\n        uint8_t *_tail;\n        uint8_t *_end;\n\n        DISALLOW_COPY(Buffer);\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/event-request.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"event-request.h\"\n\n#include \"../os/Atomic.h\"\n#include \"../il2cpp-api.h\"\n\n#include \"protocol/protocol.h\"\n\nusing namespace il2cpp::debugger;\n\nEventRequest::EventRequest(EventKind kind, SuspendPolicy suspend_policy, const std::vector<Modifier*> &modifiers) :\n    _id((int32_t)il2cpp::os::Atomic::Increment(&event_request_id)),\n    _kind(kind),\n    _suspend_policy(suspend_policy),\n    _modifiers(modifiers),\n    _breakpoint_data(0),\n    _single_step_data(0)\n{\n}\n\nEventRequestList::EventRequestList(Agent &agent, bool owns_requests) :\n    _agent(agent),\n    _owns_requests(owns_requests)\n{\n}\n\nEventRequestList::~EventRequestList()\n{\n    if (!_owns_requests)\n        return;\n\n    ClearAllRequests();\n}\n\nvoid EventRequestList::ClearAllRequests()\n{\n    IL2CPP_ASSERT(_owns_requests && \"EventRequestList::ClearAllRequests cannot be invoked on a list that does not own the requests\");\n\n    std::list<const EventRequest*>::const_iterator it = _requests.begin();\n    while (it != _requests.end())\n    {\n        delete (*it);\n        ++it;\n    }\n\n    _requests.clear();\n}\n\nbool EventRequestList::IsClientInterested(const Event &evt) const\n{\n    if (evt.kind() == kEventKindVmStart || evt.kind() == kEventKindVmDeath)\n        return true;\n\n    std::list<const EventRequest*>::const_iterator it = _requests.begin();\n    while (it != _requests.end())\n    {\n        if ((*it)->kind() == evt.kind())\n            return true;\n\n        ++it;\n    }\n\n    return false;\n}\n\nint32_t EventRequestList::RequestIdsFor(std::vector<int32_t> &ids, const Event &evt,  FilterInfo &filter) const\n{\n    if (evt.kind() == kEventKindVmStart || evt.kind() == kEventKindVmDeath)\n        ids.push_back(0);\n    else\n    {\n        std::list<const EventRequest*>::const_iterator it = _requests.begin();\n        while (it != _requests.end())\n        {\n            const EventRequest* req = *it;\n            if (req->kind() == evt.kind())\n            {\n                bool filtered = false;\n                std::vector<Modifier*>::const_iterator mit = req->modifiers().begin();\n\n                while (mit != req->modifiers().end())\n                {\n                    Modifier *modifier = *mit;\n\n                    switch (modifier->kind)\n                    {\n                        case kModifierKindCount:\n                            filtered = ((modifier->data.count > 0) && (--modifier->data.count > 0));\n                            break;\n\n                        case kModifierKindLocationOnly:\n                            IL2CPP_ASSERT(0 && \"kModifierKindLocationOnly modifier filter not supported!\");\n                            break;\n\n                        case kModifierKindStep:\n                            IL2CPP_ASSERT(0 && \"kModifierKindStep modifier filter not supported!\");\n                            break;\n\n                        case kModifierKindThreadOnly:\n                            filtered = (modifier->data.thread != il2cpp_thread_current());\n                            break;\n\n                        case kModifierKindExceptionOnly:\n                            IL2CPP_ASSERT(0 && \"kModifierKindExceptionOnly modifier filter not supported!\");\n                            break;\n\n                        case kModifierKindAssemblyOnly:\n                            IL2CPP_ASSERT(0 && \"kModifierKindAssemblyOnly modifier filter not supported!\");\n//              int k;\n//              gboolean found = FALSE;\n//              MonoAssembly **assemblies = mod->data.assemblies;\n\n//              if (assemblies) {\n//                  for (k = 0; assemblies [k]; ++k)\n//                      if (assemblies [k] == klass->image->assembly)\n//                          found = TRUE;\n//              }\n//              if (!found)\n//                  filtered = TRUE;\n                            break;\n                    }\n\n                    ++mit;\n                }\n\n                if (!filtered)\n                    ids.push_back(req->id());\n            }\n\n            ++it;\n        }\n    }\n\n    return ids.size();\n}\n\nconst EventRequest *EventRequestList::GetEventRequestById(int32_t id) const\n{\n    std::list<const EventRequest*>::const_iterator it = _requests.begin();\n    while (it != _requests.end())\n    {\n        if ((*it)->id() == id)\n            return *it;\n\n        ++it;\n    }\n\n    return NULL;\n}\n\nvoid EventRequestList::AddEventRequest(const EventRequest *request)\n{\n    _requests.push_back(request);\n}\n\nconst EventRequest* EventRequestList::RemoveEventRequest(EventKind kind, int32_t id)\n{\n    std::list<const EventRequest*>::iterator it = _requests.begin();\n    while (it != _requests.end())\n    {\n        if ((*it)->kind() == kind && (*it)->id() == id)\n        {\n            const EventRequest* req = *it;\n            _requests.erase(it);\n            return req;\n        }\n\n        ++it;\n    }\n\n    return NULL;\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/event-request.h",
    "content": "#pragma once\n\n#include \"common.h\"\n\n#include <list>\n#include <vector>\n\n#include \"protocol/globals.h\"\n\nstruct Il2CppClass;\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    class Event;\n    class Agent;\n    struct BreakpointData;\n    struct SingleStepData;\n\n    static int32_t event_request_id;\n\n    class EventRequest\n    {\n    public:\n\n        EventRequest(EventKind kind, SuspendPolicy suspend_policy, const std::vector<Modifier*> &modifiers);\n\n        inline int32_t id() const\n        {\n            return _id;\n        }\n\n        inline EventKind kind() const\n        {\n            return _kind;\n        }\n\n        inline SuspendPolicy suspend_policy() const\n        {\n            return _suspend_policy;\n        }\n\n        inline const std::vector<Modifier*> &modifiers() const\n        {\n            return _modifiers;\n        }\n\n        inline bool has_modifiers() const\n        {\n            return _modifiers.size() > 0;\n        }\n\n        inline BreakpointData *breakpoint_data() const\n        {\n            return _breakpoint_data;\n        }\n\n        inline void breakpoint_data(BreakpointData *value)\n        {\n            _breakpoint_data = value;\n        }\n\n        inline SingleStepData *single_step_data() const\n        {\n            return _single_step_data;\n        }\n\n        inline void single_step_data(SingleStepData *value)\n        {\n            _single_step_data = value;\n        }\n\n    private:\n\n        int32_t _id;\n        EventKind _kind;\n        SuspendPolicy _suspend_policy;\n        std::vector<Modifier*> _modifiers;\n        BreakpointData *_breakpoint_data;\n        SingleStepData *_single_step_data;\n\n        DISALLOW_COPY(EventRequest);\n\n        friend class Agent;\n    };\n\n    class EventRequestList\n    {\n    public:\n\n        struct FilterInfo\n        {\n            Il2CppClass *klass;\n            Il2CppObject *exception;\n\n            FilterInfo() :\n                klass(0),\n                exception(0)\n            {\n            }\n        };\n\n        EventRequestList(Agent &agent, bool owns_requests);\n        ~EventRequestList();\n\n        inline const std::list<const EventRequest*> requests() const\n        {\n            return _requests;\n        }\n\n        int32_t RequestIdsFor(std::vector<int32_t> &ids, const Event &evt, FilterInfo &filter) const;\n        bool IsClientInterested(const Event &evt) const;\n        const EventRequest *GetEventRequestById(int32_t id) const;\n\n        void AddEventRequest(const EventRequest *request);\n        const EventRequest* RemoveEventRequest(EventKind kind, int32_t id);\n\n        void ClearAllRequests();\n\n    private:\n\n        Agent &_agent;\n        bool _owns_requests;\n        std::list<const EventRequest*> _requests;\n\n        DISALLOW_COPY(EventRequestList);\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/app-domain.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include <algorithm>\n#include \"../../il2cpp-api.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/app-domain.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nusing namespace il2cpp::debugger;\n\nconst Reply *Agent::Process(const AppDomainGetRootDomainCommand *command)\n{\n    AppDomainGetRootDomainCommand::Reply *app_domain_get_root_domain_reply = command->reply();\n\n    app_domain_get_root_domain_reply->domain(CALL_IL2CPP_API(il2cpp_domain_get)());\n\n    return app_domain_get_root_domain_reply;\n}\n\nconst Reply *Agent::Process(const AppDomainGetCorlibCommand *command)\n{\n    AppDomainGetCorlibCommand::Reply *get_corlib_reply = command->reply();\n\n    Il2CppDomain *domain = command->domain();\n    const Il2CppImage *image = il2cpp_get_corlib();\n\n    get_corlib_reply->assembly(const_cast<Il2CppAssembly*>(il2cpp_image_get_assembly(image)));\n\n    return get_corlib_reply;\n}\n\nconst Reply *Agent::Process(const AppDomainGetFriendlyNameCommand *command)\n{\n    AppDomainGetFriendlyNameCommand::Reply *get_friendly_name_reply = command->reply();\n\n    Il2CppDomain *domain = command->domain();\n\n    LOG(\"warning: `AppDomainGetFriendlyNameCommand` not implemented properly. Returning a stub name for now!\");\n\n    get_friendly_name_reply->friendly_name(\"[ROOT_DOMAIN]\");\n\n    return get_friendly_name_reply;\n}\n\nconst Reply *Agent::Process(const AppDomainCreateStringCommand *command)\n{\n    AppDomainCreateStringCommand::Reply *create_string_reply = command->reply();\n\n    const Il2CppDomain *domain = command->domain();\n    const std::string str = command->string();\n\n    create_string_reply->object((Il2CppObject*)il2cpp_string_new(str.c_str()));\n\n    return create_string_reply;\n}\n\nconst Reply *Agent::Process(const AppDomainGetEntryAssemblyCommand *command)\n{\n    LOG(\"warning: `AppDomainGetEntryAssemblyCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n    IL2CPP_ASSERT(0);\n\n    return new InternalErrorNotImplementedReply(command);\n}\n\nconst Reply *Agent::Process(const AppDomainCreateBoxedValueCommand *command)\n{\n    LOG(\"warning: `AppDomainCreateBoxedValueCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n    IL2CPP_ASSERT(0);\n\n    return new InternalErrorNotImplementedReply(command);\n}\n\nconst Reply *Agent::Process(const AppDomainGetAssembliesCommand *command)\n{\n    AppDomainGetAssembliesCommand::Reply *get_assemblies_reply = command->reply();\n\n    size_t number_of_assemblies;\n    const Il2CppAssembly** assemblies = il2cpp_domain_get_assemblies(NULL, &number_of_assemblies);\n\n    get_assemblies_reply->number_of_assemblies(number_of_assemblies);\n\n    for (size_t i = 0; i < number_of_assemblies; ++i)\n        get_assemblies_reply->assemblies().push_back(const_cast<Il2CppAssembly*>(assemblies[i]));\n\n    return get_assemblies_reply;\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/array-ref.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include \"../../il2cpp-api.h\"\n#include \"../../class-internals.h\"\n#include \"../../object-internals.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/array-ref.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const Reply *Agent::Process(const ArrayRefGetValuesCommand *command)\n    {\n        ArrayRefGetValuesCommand::Reply *get_values_reply = command->reply();\n\n        Il2CppArray *arr = (Il2CppArray*)command->object();\n        if (arr == 0)\n            return get_values_reply;\n\n        Il2CppClass *array_klass = il2cpp_object_get_class(arr);\n\n        int32_t element_size = il2cpp_array_element_size(array_klass);\n        for (int32_t i = command->index(); i < command->index() + command->length(); ++i)\n        {\n            void *element = (void*)((uint8_t*)arr + kIl2CppSizeOfArray + (i * element_size));\n            get_values_reply->values().push_back(\n                Variant(array_klass->element_class->byval_arg, element));\n        }\n\n        return get_values_reply;\n    }\n\n    const Reply *Agent::Process(const ArrayRefGetLengthCommand *command)\n    {\n        ArrayRefGetLengthCommand::Reply *get_length_reply = command->reply();\n\n        Il2CppArray *arr = (Il2CppArray*)command->object();\n        if (arr == 0)\n            return get_length_reply;\n\n        Il2CppClass *array_klass = il2cpp_object_get_class(arr);\n\n        get_length_reply->rank(array_klass->rank);\n\n        if (!arr->bounds)\n        {\n            get_length_reply->lengths().push_back(arr->max_length);\n            get_length_reply->lower_bounds().push_back(0);\n        }\n        else\n        {\n            for (uint8_t i = 0; i < array_klass->rank; ++i)\n            {\n                get_length_reply->lengths().push_back(arr->bounds[i].length);\n                get_length_reply->lower_bounds().push_back(arr->bounds[i].lower_bound);\n            }\n        }\n\n        return get_length_reply;\n    }\n\n    const Reply *Agent::Process(const ArrayRefSetValuesCommand *command)\n    {\n        LOG(\"warning: `ArrayRefSetValuesCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n        IL2CPP_ASSERT(0);\n\n        return new InternalErrorNotImplementedReply(command);\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/assembly.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include <sstream>\n\n#include \"../../il2cpp-api.h\"\n#include \"../../tabledefs.h\"\n#include \"../../class-internals.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/assembly.h\"\n#include \"../protocol/commands/internal-error.h\"\n\n#include \"../../vm/Assembly.h\"\n#include \"../../vm/AssemblyName.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const Reply *Agent::Process(const AssemblyGetTypeCommand *command)\n    {\n        AssemblyGetTypeCommand::Reply *get_type_reply = command->reply();\n\n        /*char *s = decode_string (p, &p, end);\n        gboolean ignorecase = decode_byte (p, &p, end);\n        MonoTypeNameParse info;\n        MonoType *t;\n        gboolean type_resolve;\n\n        if (!mono_reflection_parse_type (s, &info)) {\n            t = NULL;\n        } else {\n            if (info.assembly.name)\n                NOT_IMPLEMENTED;\n            t = mono_reflection_get_type (ass->image, &info, ignorecase, &type_resolve);\n        }\n        buffer_add_typeid (buf, domain, t ? mono_class_from_mono_type (t) : NULL);\n        mono_reflection_free_type_info (&info);\n        g_free (s);*/\n\n        LOG(\"warning: Implement proper name parsing for `AssemblyGetType` command\");\n\n        if (command->ignore_case())\n            LOG(\"warning: AssemblyGetType not implemented for ignore_case = true\");\n\n        std::string ns;\n        std::string name;\n\n        const size_t last_dot_index = command->name().find_last_of(\".\");\n\n        if (last_dot_index != std::string::npos)\n        {\n            ns.assign(command->name().begin(), command->name().begin() + last_dot_index);\n            name.assign(command->name().begin() + last_dot_index + 1, command->name().end());\n        }\n        else\n        {\n            name = command->name();\n        }\n\n        Il2CppClass *type = il2cpp_class_from_name(\n                il2cpp_assembly_get_image(command->assembly()),\n                ns.c_str(), name.c_str());\n\n        if (type == 0)\n            LOG(\"warning: AssemblyGetType command not mocked up for type \" << command->name());\n\n        get_type_reply->type(type);\n\n        return get_type_reply;\n    }\n\n    const Reply *Agent::Process(const AssemblyGetObjectCommand *command)\n    {\n        LOG(\"warning: `AssemblyGetObjectCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n        IL2CPP_ASSERT(0);\n\n        return new InternalErrorNotImplementedReply(command);\n    }\n\n    const Reply *Agent::Process(const AssemblyGetEntryPointCommand *command)\n    {\n        LOG(\"warning: `AssemblyGetEntryPointCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n        IL2CPP_ASSERT(0);\n\n        return new InternalErrorNotImplementedReply(command);\n    }\n\n    const Reply *Agent::Process(const AssemblyGetManifestModuleCommand *command)\n    {\n        AssemblyGetManifestModuleCommand::Reply *reply = command->reply();\n\n        reply->module(il2cpp_assembly_get_image(command->assembly()));\n\n        return reply;\n    }\n\n    const Reply *Agent::Process(const AssemblyGetNameCommand *command)\n    {\n        AssemblyGetNameCommand::Reply *reply = command->reply();\n\n        const Il2CppAssembly *assembly = command->assembly();\n\n        reply->name(il2cpp::vm::AssemblyName::AssemblyNameToString(assembly->aname));\n\n        return reply;\n    }\n\n    const Reply *Agent::Process(const AssemblyGetLocationCommand *command)\n    {\n        AssemblyGetLocationCommand::Reply *reply = command->reply();\n\n        reply->location(\n            il2cpp_image_get_filename(\n                il2cpp_assembly_get_image(command->assembly())));\n\n        return reply;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/event-request.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include \"../../il2cpp-api.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/event-request.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const Reply *Agent::Process(const EventRequestSetCommand *command)\n    {\n        SuspendPolicy suspend_policy = command->suspend_policy();\n\n        // We always suspend in case of breakpoint or single step events\n        if (command->kind() == kEventKindBreakpoint || command->kind() == kEventKindStep)\n            suspend_policy = kSuspendPolicyAll;\n\n        EventRequest *request = new EventRequest(\n                command->kind(),\n                suspend_policy,\n                command->modifiers());\n\n        // TODO: if something was wrong, please make sure to set reply->error(...)\n\n        _event_req_list.AddEventRequest(request);\n\n        switch (command->kind())\n        {\n            case kEventKindAssemblyLoad:\n            case kEventKindAssemblyUnload:\n            case kEventKindThreadStart:\n            case kEventKindThreadDeath:\n            case kEventKindUserBreak:\n            case kEventKindUserLog:\n            case kEventKindException:\n            case kEventKindVmDeath:\n            case kEventKindVmStart:\n            case kEventKindAppDomainCreate:\n            case kEventKindAppDomainUnload:\n                // Nothing special to do here\n                break;\n\n            case kEventKindTypeLoad:\n                // Note: this should be set to true only if defer=y\n                _notify_pending_events_on_first_invoke = true;\n                break;\n\n            case kEventKindBreakpoint:\n            {\n                IL2CPP_ASSERT(command->method() != 0 && \"kEventKindBreakpoint expects a method and a location to be set!\");\n\n                BreakpointData *data = new BreakpointData();\n                data->method = command->method();\n                data->request = request;\n                data->location = command->location();\n\n                _bp_data.push_back(data);\n\n                request->breakpoint_data(data);\n\n                il2cpp_debug_method_set_breakpoint_data_at(\n                    (Il2CppDebugMethodInfo*)il2cpp_debug_get_method_info(command->method()),\n                    command->location(),\n                    data);\n            }\n            break;\n\n            case kEventKindStep:\n            {\n                IL2CPP_ASSERT(command->thread() != 0 && \"kEventKindStep expects a thread, size and depth to be set!\");\n\n                // TODO: we probably need to clear also the SingleStepData state, if any.\n                if (_ss_data != 0)\n                    ClearSingleStepData();\n\n                _ss_data = PrepareSingleStepData(\n                        request, command->thread(),\n                        (StepSizeKind)command->size(),\n                        (StepDepthKind)command->depth());\n\n                request->single_step_data(_ss_data);\n            }\n            break;\n\n            case kEventKindMethodEntry:\n                /*req->info = set_breakpoint (NULL, METHOD_ENTRY_IL_OFFSET, req);*/\n\n                IL2CPP_ASSERT(0 && \"Not implemented request kEventKindMethodEntry\");\n                break;\n\n            case kEventKindMethodExit:\n                /*req->info = set_breakpoint (NULL, METHOD_EXIT_IL_OFFSET, req);*/\n\n                IL2CPP_ASSERT(0 && \"Not implemented request kEventKindMethodExit\");\n                break;\n\n            case kEventKindKeepAlive:\n                // Was empty\n\n                IL2CPP_ASSERT(0 && \"Not implemented request kEventKindKeepAlive\");\n                break;\n\n            default:\n                LOG(\"Not implemented request ??(\" << command->kind() << \") with modifiers\");\n                IL2CPP_ASSERT(0 && \"Not implemented request\");\n        }\n\n        EventRequestSetCommand::Reply *event_request_set_reply = command->reply();\n        event_request_set_reply->request_id(request->id());\n\n        /*LOG(\"NotifyPendingEventsOfKind is being invoked from the debugger agent thread, which is WRONG. Only the VM thread should send these events.\");\n        NotifyPendingEventsOfKind(command->kind());*/\n\n        return event_request_set_reply;\n    }\n\n    const Reply *Agent::Process(const EventRequestClearCommand *command)\n    {\n        EventRequestClearCommand::Reply *empty_reply = command->reply();\n\n        const EventRequest *request = _event_req_list.RemoveEventRequest(\n                (EventKind)command->event_kind(),\n                command->request_id());\n\n        if (request == 0)\n        {\n            LOG(\"EventRequestClearCommand: invalid request Id: \" << command->request_id());\n            return empty_reply;\n        }\n\n        BreakpointData *data = request->breakpoint_data();\n        if (data != 0)\n        {\n            LOG(\"EventRequestClearCommand: breakpoint_data found, deleting it\");\n\n            _bp_data.remove(data);\n\n            il2cpp_debug_method_clear_breakpoint_data_at(\n                (Il2CppDebugMethodInfo*)il2cpp_debug_get_method_info(data->method),\n                data->location);\n\n            delete data;\n        }\n\n        delete request;\n\n        return empty_reply;\n    }\n\n    const Reply *Agent::Process(const EventRequestClearAllBreakpointsCommand *command)\n    {\n        EventRequestClearAllBreakpointsCommand::Reply *empty_reply = command->reply();\n\n        std::list<BreakpointData*>::iterator it = _bp_data.begin();\n\n        while (it != _bp_data.end())\n        {\n            BreakpointData* data = *it;\n\n            il2cpp_debug_method_clear_breakpoint_data(\n                (Il2CppDebugMethodInfo*)il2cpp_debug_get_method_info(data->method));\n\n            delete data;\n\n            ++it;\n        }\n\n        _bp_data.clear();\n\n        return empty_reply;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/event.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include \"../../il2cpp-api.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/event.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const Reply *Agent::Process(const EventCompositeCommand *command)\n    {\n        LOG(\"warning: `EventCompositeCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n        IL2CPP_ASSERT(0);\n\n        return new InternalErrorNotImplementedReply(command);\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/internal-error.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include \"../../il2cpp-api.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const Reply *Agent::Process(const InternalErrorNotImplementedCommand *command)\n    {\n        return new InternalErrorNotImplementedReply(command);\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/method.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include \"../../il2cpp-api.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/method.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const Reply *Agent::Process(const MethodGetParamInfoCommand *command)\n    {\n        MethodGetParamInfoCommand::Reply *get_param_info_reply = command->reply();\n\n        LOG(\"warning: `MethodGetParamInfoCommand` not implemented properly yet.\");\n\n        const MethodInfo *method = command->method();\n\n        get_param_info_reply->call_convention(0 /* IL2CPP_CALL_DEFAULT */);\n        get_param_info_reply->generic_param_count(0);\n        get_param_info_reply->return_type(\n            il2cpp_class_from_type(\n                (Il2CppType*)il2cpp_method_get_return_type(method)));\n\n        const size_t count = il2cpp_method_get_param_count(method);\n        for (uint32_t i = 0; i < count; ++i)\n        {\n            MethodGetParamInfoCommand::Reply::ParamInfo param;\n\n            param.type = il2cpp_class_from_type(\n                    (Il2CppType*)il2cpp_method_get_param(method, i));\n            param.name = il2cpp_method_get_param_name(method, i);\n\n            get_param_info_reply->params().push_back(param);\n        }\n\n        return get_param_info_reply;\n    }\n\n    const Reply *Agent::Process(const MethodGetNameCommand *command)\n    {\n        MethodGetNameCommand::Reply *get_name_reply = command->reply();\n\n        get_name_reply->name(il2cpp_method_get_name(command->method()));\n\n        return get_name_reply;\n    }\n\n    const Reply *Agent::Process(const MethodGetDeclaringTypeCommand *command)\n    {\n        MethodGetDeclaringTypeCommand::Reply *get_declaring_type_reply = command->reply();\n\n        get_declaring_type_reply->type(il2cpp_method_get_declaring_type(command->method()));\n\n        return get_declaring_type_reply;\n    }\n\n    const Reply *Agent::Process(const MethodGetDebugInfoCommand *command)\n    {\n        MethodGetDebugInfoCommand::Reply *get_debug_info_reply = command->reply();\n\n        const Il2CppDebugMethodInfo *info = il2cpp_debug_get_method_info(command->method());\n        const Il2CppDebugDocument *document = il2cpp_debug_method_get_document(info);\n\n        if (info == 0 || document == 0)\n            return get_debug_info_reply;\n\n        std::string filename;\n\n        filename += il2cpp_debug_document_get_directory(document);\n        filename += il2cpp_debug_document_get_filename(document);\n\n        const int32_t *offset_table = il2cpp_debug_method_get_offset_table(info);\n\n        get_debug_info_reply->code_size(il2cpp_debug_method_get_code_size(info));\n        get_debug_info_reply->file_name(filename);\n\n        for (int32_t i = 0; offset_table[i] >= 0; i += 2)\n        {\n            get_debug_info_reply->offsets().push_back(std::pair<int32_t, int32_t>(offset_table[i], offset_table[i + 1]));\n        }\n\n        return get_debug_info_reply;\n    }\n\n    const Reply *Agent::Process(const MethodGetBodyCommand *command)\n    {\n        MethodGetBodyCommand::Reply *get_body_reply = command->reply();\n\n        LOG(\"warning: `MethodGetBodyCommand` always return an empty byte array for now\");\n\n        return get_body_reply;\n    }\n\n    const Reply *Agent::Process(const MethodResolveTokenCommand *command)\n    {\n        LOG(\"warning: `MethodResolveTokenCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n        IL2CPP_ASSERT(0);\n\n        return new InternalErrorNotImplementedReply(command);\n    }\n\n    const Reply *Agent::Process(const MethodGetLocalsInfoCommand *command)\n    {\n        MethodGetLocalsInfoCommand::Reply *get_locals_info_reply = command->reply();\n\n        const Il2CppDebugMethodInfo *info = il2cpp_debug_get_method_info(command->method());\n        const Il2CppDebugLocalsInfo **locals = il2cpp_debug_method_get_locals_info(info);\n\n        while (*locals != NULL)\n        {\n            MethodGetLocalsInfoCommand::Reply::LocalInfo local;\n\n            local.type = il2cpp_debug_local_get_type(*locals);\n            local.name = il2cpp_debug_local_get_name(*locals);\n            local.begin_scope = il2cpp_debug_local_get_start_offset(*locals);\n            local.end_scope = il2cpp_debug_local_get_end_offset(*locals);\n\n            if (local.end_scope == 0)\n            {\n                local.begin_scope = 0;\n                local.end_scope = il2cpp_debug_method_get_code_size(info);\n            }\n\n            get_locals_info_reply->locals().push_back(local);\n\n            ++locals;\n        }\n\n        return get_locals_info_reply;\n    }\n\n    const Reply *Agent::Process(const MethodGetInfoCommand *command)\n    {\n        MethodGetInfoCommand::Reply *reply = command->reply();\n\n        uint32_t iflags = 0;\n        reply->flags(\n            il2cpp_method_get_flags(command->method(), &iflags));\n        reply->token(\n            il2cpp_method_get_token(command->method()));\n        reply->implementation_flags(iflags);\n\n        return reply;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/module.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include \"../../il2cpp-api.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/module.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const Reply *Agent::Process(const ModuleGetInfoCommand *command)\n    {\n        ModuleGetInfoCommand::Reply *get_info_reply = command->reply();\n\n        Il2CppImage *image = command->module();\n\n        LOG(\"warning: `ModuleGetInfoCommand` is not implemented properly.\");\n\n        get_info_reply->basename(\"FAKE BASENAME\");\n        get_info_reply->scope_name(\"FAKE SCOPE NAME\");\n        get_info_reply->fullname(il2cpp_image_get_name(image));\n        get_info_reply->guid(\"FAKE GUID\");\n        get_info_reply->assembly(const_cast<Il2CppAssembly*>(il2cpp_image_get_assembly(image)));\n\n        return get_info_reply;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/object-ref.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include \"../../il2cpp-api.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/object-ref.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nusing namespace il2cpp::debugger;\n\nconst Reply *Agent::Process(const ObjectRefGetTypeCommand *command)\n{\n    ObjectRefGetTypeCommand::Reply *get_type_reply = command->reply();\n\n    Il2CppObject *object = command->object();\n\n    get_type_reply->type(il2cpp_object_get_class(object));\n\n    return get_type_reply;\n}\n\nconst Reply *Agent::Process(const ObjectRefGetDomainCommand *command)\n{\n    ObjectRefGetDomainCommand::Reply *get_domain_reply = command->reply();\n\n    Il2CppObject *object = command->object();\n\n    // TODO: use `object` even if we don't really have domains in il2cpp?\n\n    get_domain_reply->domain(il2cpp_domain_get());\n\n    return get_domain_reply;\n}\n\nconst Reply *Agent::Process(const ObjectRefIsCollectedCommand *command)\n{\n    LOG(\"warning: `ObjectRefIsCollectedCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n    IL2CPP_ASSERT(0);\n\n    return new InternalErrorNotImplementedReply(command);\n}\n\nconst Reply *Agent::Process(const ObjectRefSetValuesCommand *command)\n{\n    LOG(\"warning: `ObjectRefSetValuesCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n    IL2CPP_ASSERT(0);\n\n    return new InternalErrorNotImplementedReply(command);\n}\n\nconst Reply *Agent::Process(const ObjectRefGetAddressCommand *command)\n{\n    LOG(\"warning: `ObjectRefGetAddressCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n    IL2CPP_ASSERT(0);\n\n    return new InternalErrorNotImplementedReply(command);\n}\n\nconst Reply *Agent::Process(const ObjectRefGetValuesCommand *command)\n{\n    LOG(\"warning: `ObjectRefGetValuesCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n    IL2CPP_ASSERT(0);\n\n    return new InternalErrorNotImplementedReply(command);\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/stack-frame.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include <vector>\n\n#include \"../../il2cpp-api.h\"\n#include \"../../class-internals.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/stack-frame.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct FrameFinderData\n    {\n        int32_t frame_id;\n        int32_t counter;\n        const Il2CppStackFrameInfo *info;\n    };\n\n    static void find_stack_frame(Il2CppThread* thread, const Il2CppStackFrameInfo *info, void *user_data)\n    {\n        FrameFinderData *data = (FrameFinderData*)user_data;\n\n        if (++data->counter == data->frame_id)\n            data->info = info;\n    }\n\n    const Reply *Agent::Process(const StackFrameGetValuesCommand *command)\n    {\n        ThreadData *data = _thread_data.ThreadDataFor(command->thread());\n\n        IL2CPP_ASSERT(data->IsFramesCacheValid() && \"ThreadData frames cache is invalid when invoking StackFrameGetValuesCommand\");\n\n        const Il2CppStackFrameInfo *frame = data->FrameById(command->frame_id());\n\n        IL2CPP_ASSERT(frame != NULL && \"Couldn't find a stack frame with the given ID.\");\n\n        const MethodInfo *method = frame->method;\n\n        StackFrameGetValuesCommand::Reply *get_values_reply = command->reply();\n\n        std::vector<int32_t>::const_iterator it = command->positions().begin();\n\n        while (it != command->positions().end())\n        {\n            int32_t pos = *it;\n            const Il2CppType *type = 0;\n            void *addr = 0;\n\n            if (pos < 0)\n            {\n                pos = -pos - 1;\n\n                IL2CPP_ASSERT(pos < frame->method->parameters_count && \"StackFrameGetValuesCommand was invoked with an outside of range param position\");\n\n                type = frame->method->parameters[pos].parameter_type;\n                addr = frame->params[pos];\n            }\n            else\n            {\n                IL2CPP_ASSERT(pos < (int32_t)frame->locals_count && \"StackFrameGetValuesCommand was invoked with an outside of range local position\");\n\n                type = frame->method->debug_info->locals[pos]->type->byval_arg;\n                addr = frame->locals[pos];\n            }\n\n            get_values_reply->values().push_back(Variant(type, addr));\n\n            ++it;\n        }\n\n        return get_values_reply;\n    }\n\n    const Reply *Agent::Process(const StackFrameSetValuesCommand *command)\n    {\n        ThreadData *data = _thread_data.ThreadDataFor(command->thread());\n\n        IL2CPP_ASSERT(data->IsFramesCacheValid() && \"ThreadData frames cache is invalid when invoking StackFrameSetValuesCommand\");\n\n        const Il2CppStackFrameInfo *frame = data->FrameById(command->frame_id());\n\n        IL2CPP_ASSERT(frame != NULL && \"Couldn't find a stack frame with the given ID.\");\n\n        const MethodInfo *method = frame->method;\n        const int32_t count = command->values_count();\n        Buffer &buffer = command->command_buffer();\n\n        StackFrameSetValuesCommand::Reply *empty_reply = command->reply();\n\n        for (int32_t i = 0; i < count; ++i)\n        {\n            int32_t pos = buffer.ReadInt();\n\n            const Il2CppType *expected_type = 0;\n            void *addr = 0;\n\n            if (pos < 0)\n            {\n                pos = -pos - 1;\n\n                IL2CPP_ASSERT(pos < frame->method->parameters_count && \"StackFrameSetValuesCommand was invoked with an outside of range param position\");\n\n                expected_type = frame->method->parameters[pos].parameter_type;\n                addr = frame->params[pos];\n            }\n            else\n            {\n                IL2CPP_ASSERT(pos < (int32_t)frame->locals_count && \"StackFrameSetValuesCommand was invoked with an outside of range local position\");\n\n                expected_type = frame->method->debug_info->locals[pos]->type->byval_arg;\n                addr = frame->locals[pos];\n            }\n\n            Variant::ReadInto(buffer, expected_type, addr);\n        }\n\n        return empty_reply;\n    }\n\n    const Reply *Agent::Process(const StackFrameGetThisCommand *command)\n    {\n        ThreadData *data = _thread_data.ThreadDataFor(command->thread());\n\n        IL2CPP_ASSERT(data->IsFramesCacheValid() && \"ThreadData frames cache is invalid when invoking StackFrameGetThis\");\n\n        const Il2CppStackFrameInfo *frame = data->FrameById(command->frame_id());\n\n        IL2CPP_ASSERT(frame != NULL && \"Couldn't find a stack frame with the given ID.\");\n\n        const MethodInfo *method = frame->method;\n\n        StackFrameGetThisCommand::Reply *get_this_reply = command->reply();\n\n        get_this_reply->this_object = VTypeVariant(\n                method->declaring_type->byval_arg,\n                frame->this_ptr);\n\n        return get_this_reply;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/string-ref.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include \"../../il2cpp-api.h\"\n#include \"../../utils/StringUtils.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/string-ref.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const Reply *Agent::Process(const StringRefGetValueCommand *command)\n    {\n        StringRefGetValueCommand::Reply *get_value_reply = command->reply();\n\n        Il2CppString *str = (Il2CppString*)command->object();\n        if (str == 0)\n            return get_value_reply;\n\n        get_value_reply->value(\n            utils::StringUtils::Utf16ToUtf8(\n                il2cpp_string_chars(str)));\n\n        return get_value_reply;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/thread.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include \"../../il2cpp-api.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/thread.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const Reply *Agent::Process(const ThreadGetIdCommand *command)\n    {\n        ThreadGetIdCommand::Reply *get_id_reply = command->reply();\n\n        get_id_reply->id((uintptr_t)command->thread());\n\n        return get_id_reply;\n    }\n\n    const Reply *Agent::Process(const ThreadGetNameCommand *command)\n    {\n        ThreadGetNameCommand::Reply *get_name_reply = command->reply();\n\n        uint32_t len = 0;\n        char *name = il2cpp_thread_get_name(command->thread(), &len);\n\n        get_name_reply->name(std::string(name, len));\n\n        if (name)\n            delete name;\n\n        return get_name_reply;\n    }\n\n    const Reply *Agent::Process(const ThreadGetInfoCommand *command)\n    {\n        ThreadGetInfoCommand::Reply *get_info_reply = command->reply();\n\n        LOG(\"warning: `ThreadGetInfoCommand` is not implemented properly\");\n\n        // TODO: assuming thread is never in a pool for now\n        get_info_reply->is_thread_pool(false);\n\n        return get_info_reply;\n    }\n\n    const Reply *Agent::Process(const ThreadGetFrameInfoCommand *command)\n    {\n        ThreadGetFrameInfoCommand::Reply *get_frame_info_reply = command->reply();\n\n        // TODO: assert that the VM is suspended or suspending; in the second case, wait for the suspension to\n        // complete.\n        // if(IsSuspending()) WaitForSuspend();\n\n        IL2CPP_ASSERT(IsSuspended() && \"`ThreadGetFrameInfoCommand` can only be invoked with the VM suspended or suspending.\");\n\n        ThreadData *data = _thread_data.ThreadDataFor(command->thread());\n        data->UpdateFramesCacheIfNeeded();\n\n        std::vector<const Il2CppStackFrameInfo*>::const_iterator it = data->frames_cache().begin();\n\n        while (it != data->frames_cache().end())\n        {\n            const Il2CppStackFrameInfo *frame = *it;\n            ThreadGetFrameInfoCommand::Reply::FrameInfo frame_info;\n\n            frame_info.flags = 0;\n            frame_info.frame_id = frame->id;\n            frame_info.il_offset = frame->il_offset;\n            frame_info.method = frame->method;\n\n            get_frame_info_reply->infos().push_back(frame_info);\n\n            ++it;\n        }\n\n        return get_frame_info_reply;\n    }\n\n    const Reply *Agent::Process(const ThreadGetStateCommand *command)\n    {\n        LOG(\"warning: `ThreadGetStateCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n        IL2CPP_ASSERT(0);\n\n        return new InternalErrorNotImplementedReply(command);\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/type.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include \"../../il2cpp-api.h\"\n#include \"../../blob.h\"\n#include \"../../tabledefs.h\"\n#include \"../../class-internals.h\"\n#include \"../../object-internals.h\"\n#include \"../../vm/Class.h\"\n\n#include \"../agent.h\"\n#include \"../variant.h\"\n#include \"../protocol/commands/type.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nusing il2cpp::vm::Class;\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const Reply *Agent::Process(const TypeGetInfoCommand *command)\n    {\n        TypeGetInfoCommand::Reply *get_info_reply = command->reply();\n\n        Il2CppClass *klass = command->type();\n        const Il2CppImage *image = il2cpp_class_get_image(klass);\n        const Il2CppType *type = il2cpp_class_get_type(klass);\n        char *fullname = il2cpp_type_get_name(type);\n\n        get_info_reply->ns(il2cpp_class_get_namespace(klass));\n        get_info_reply->name(il2cpp_class_get_name(klass));\n        get_info_reply->fullname(fullname);\n        get_info_reply->assembly(const_cast<Il2CppAssembly*>(il2cpp_image_get_assembly(image)));\n        get_info_reply->module(const_cast<Il2CppImage*>(image));\n        get_info_reply->parent_type(il2cpp_class_get_parent(klass));\n        if (klass->rank || klass->byval_arg->type == IL2CPP_TYPE_PTR)\n            get_info_reply->underlying_type(il2cpp_class_get_element_class(klass)); // TODO: fix\n        else\n            get_info_reply->underlying_type(0);\n        get_info_reply->type_token(il2cpp_type_get_type(type));\n        get_info_reply->rank(klass->rank);\n        get_info_reply->flags(il2cpp_class_get_flags(klass));\n        // get_info_reply->nested_types(); // TODO: fix\n\n        uint8_t by_val_flags = 0;\n        if (type->type == IL2CPP_TYPE_PTR)\n            by_val_flags |= (1 << 1);\n        if (!type->byref && (((type->type >= IL2CPP_TYPE_BOOLEAN) && (type->type <= IL2CPP_TYPE_R8)) || (type->type == IL2CPP_TYPE_I) || (type->type == IL2CPP_TYPE_U)))\n            by_val_flags |= (1 << 2);\n        if (type->type == IL2CPP_TYPE_VALUETYPE)\n            by_val_flags |= (1 << 3);\n        if (klass->enumtype)\n            by_val_flags |= (1 << 4);\n        if (Class::IsGeneric(klass))\n            by_val_flags |= (1 << 5);\n        if (Class::IsGeneric(klass) || klass->generic_class)\n            by_val_flags |= (1 << 6);\n\n        get_info_reply->by_val_flags(by_val_flags);\n\n        delete[] fullname;\n\n        LOG(\"warning: `TypeGetInfoReply` is not properly set up yet in `Agent::Process(const TypeGetInfoCommand *command)`.\");\n\n        return get_info_reply;\n    }\n\n    const Reply *Agent::Process(const TypeGetSourceFilesCommand *command)\n    {\n        TypeGetSourceFilesCommand::Reply *get_source_files_reply = command->reply();\n\n        const Il2CppClass *type = command->type();\n        const Il2CppDebugTypeInfo *debug_info = il2cpp_debug_get_class_info(type);\n\n        if (!debug_info)\n            return get_source_files_reply;\n\n        const Il2CppDebugDocument *document = il2cpp_debug_class_get_document(debug_info);\n        if (!document)\n            return get_source_files_reply;\n\n        std::string basename = il2cpp_debug_document_get_filename(document);\n\n        // TODO: we need to iterate through all the methods and register the documents where the method is defined\n        LOG(\"warning: `TypeGetSourceFiles` still doesn't deal with partial type definitions. Only one source file is always returned.\");\n\n        get_source_files_reply->source_files().insert(basename);\n\n        return get_source_files_reply;\n    }\n\n    const Reply *Agent::Process(const TypeGetSourceFiles2Command *command)\n    {\n        TypeGetSourceFiles2Command::Reply *get_source_files_reply = command->reply();\n\n        const Il2CppClass *type = command->type();\n        const Il2CppDebugTypeInfo *debug_info = il2cpp_debug_get_class_info(type);\n\n        if (!debug_info)\n            return get_source_files_reply;\n\n        const Il2CppDebugDocument *document = il2cpp_debug_class_get_document(debug_info);\n        if (!document)\n            return get_source_files_reply;\n\n        std::string basename = il2cpp_debug_document_get_filename(document);\n        std::string path = il2cpp_debug_document_get_directory(document);\n\n        // TODO: we need to iterate through all the methods and register the documents where the method is defined\n        LOG(\"warning: `TypeGetSourceFiles2Command` still doesn't deal with partial type definitions. Only one source file is always returned.\");\n\n        IL2CPP_ASSERT((path.size() == 0 || (path.back() == '/' || path.back() == '\\\\')) && \"Il2CppDebugDocument::directory is expected to end with a platform-specific trailing slash.\");\n\n        get_source_files_reply->source_files().insert(path + basename);\n\n        return get_source_files_reply;\n    }\n\n    const Reply *Agent::Process(const TypeGetPropertiesCommand *command)\n    {\n        TypeGetPropertiesCommand::Reply *get_properties_reply = command->reply();\n\n        void* iterator = NULL;\n        const PropertyInfo *prop = NULL;\n\n        while (prop = il2cpp_class_get_properties(command->type(), &iterator))\n        {\n            get_properties_reply->properties.push_back(prop);\n        }\n\n        return get_properties_reply;\n    }\n\n    const Reply *Agent::Process(const TypeGetPropertyCAttrsCommand *command)\n    {\n        TypeGetPropertyCAttrsCommand::Reply *get_cattrs_reply = command->reply();\n\n        get_cattrs_reply->fake_count(0);\n\n        LOG(\"warning: `TypeGetPropertyCAttrsCommand` needs to be implemented properly. For now it only returns 0 attributes!\");\n\n        return get_cattrs_reply;\n    }\n\n    const Reply *Agent::Process(const TypeGetFieldCAttrsCommand *command)\n    {\n        TypeGetFieldCAttrsCommand::Reply *get_cattrs_reply = command->reply();\n\n        get_cattrs_reply->fake_count(0);\n\n        LOG(\"warning: `TypeGetFieldCAttrsCommand` needs to be implemented properly. For now it only returns 0 attributes!\");\n\n        return get_cattrs_reply;\n    }\n\n    const Reply *Agent::Process(const TypeIsAssignableFromCommand *command)\n    {\n        LOG(\"warning: `TypeIsAssignableFromCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n        IL2CPP_ASSERT(0);\n\n        return new InternalErrorNotImplementedReply(command);\n    }\n\n    const Reply *Agent::Process(const TypeGetCAttrsCommand *command)\n    {\n        TypeGetCAttrsCommand::Reply *get_cattrs_reply = command->reply();\n\n        get_cattrs_reply->fake_count(0);\n\n        LOG(\"warning: `TypeGetCAttrsCommand` needs to be implemented properly. For now it only returns 0 attributes!\");\n\n        return get_cattrs_reply;\n    }\n\n    const Reply *Agent::Process(const TypeGetValuesCommand *command)\n    {\n        TypeGetValuesCommand::Reply *get_values_reply = command->reply();\n\n        std::vector<FieldInfo*>::const_iterator it = command->fields().begin();\n\n        while (it != command->fields().end())\n        {\n            FieldInfo *field = *it;\n\n            if (!(field->type->attrs & FIELD_ATTRIBUTE_STATIC))\n            {\n                LOG(\"error: TypeGetValuesCommand is expected to receive only static field IDs\");\n                get_values_reply->error_code(kErrorCodeInvalidFieldId);\n                break;\n            }\n\n            /*if (il2cpp_class_field_is_special_static (field))\n            {\n                LOG(\"error: TypeGetValuesCommand is expected to receive only static field IDs\");\n                get_values_reply->error_code(kErrorCodeInvalidFieldId);\n                break;\n            }*/\n\n            bool found = false;\n\n            for (Il2CppClass *t = command->type(); t != 0; t = t->parent)\n            {\n                if (t == field->parent)\n                {\n                    found = true;\n                    break;\n                }\n            }\n\n            if (!found)\n            {\n                LOG(\"error: TypeGetValuesCommand is expected to receive valid field IDs\");\n                get_values_reply->error_code(kErrorCodeInvalidFieldId);\n                break;\n            }\n\n            get_values_reply->values().push_back(\n                Variant(\n                    field->type,\n                    ((char*)field->parent->static_fields) + field->offset));\n\n            ++it;\n        }\n\n        return get_values_reply;\n    }\n\n    const Reply *Agent::Process(const TypeGetObjectCommand *command)\n    {\n        TypeGetObjectCommand::Reply *get_object_reply = command->reply();\n\n        get_object_reply->object(\n            il2cpp_type_get_object(command->type()->byval_arg));\n\n        return get_object_reply;\n    }\n\n    const Reply *Agent::Process(const TypeGetFieldsCommand *command)\n    {\n        TypeGetFieldsCommand::Reply *get_fields_reply = command->reply();\n\n        void* iterator = NULL;\n        FieldInfo *field = NULL;\n\n        while (field = il2cpp_class_get_fields(command->type(), &iterator))\n        {\n            get_fields_reply->fields.push_back(field);\n        }\n\n        return get_fields_reply;\n    }\n\n    const Reply *Agent::Process(const TypeSetValuesCommand *command)\n    {\n        LOG(\"warning: `TypeSetValuesCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n        IL2CPP_ASSERT(0);\n\n        return new InternalErrorNotImplementedReply(command);\n    }\n\n    const Reply *Agent::Process(const TypeGetMethodsCommand *command)\n    {\n        TypeGetMethodsCommand::Reply *get_methods_reply = command->reply();\n\n        void* iterator = NULL;\n        const MethodInfo *method = NULL;\n\n        while (method = il2cpp_class_get_methods(command->type(), &iterator))\n        {\n            get_methods_reply->methods().push_back(method);\n        }\n\n        return get_methods_reply;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/handlers/vm.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#pragma once\n\n#include \"../../il2cpp-api.h\"\n#include \"../../metadata.h\"\n\n#include \"../agent.h\"\n#include \"../protocol/commands/vm.h\"\n#include \"../protocol/commands/internal-error.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const Reply *Agent::Process(const VmVersionCommand *command)\n    {\n        VmVersionCommand::Reply *vm_version_reply = command->reply();\n\n        vm_version_reply->name(\"il2cpp 0.0.1\");\n        vm_version_reply->major_version(_protocol.major_version());\n        vm_version_reply->minor_version(_protocol.minor_version());\n\n        return vm_version_reply;\n    }\n\n    const Reply *Agent::Process(const VmSetProtocolVersionCommand *command)\n    {\n        _protocol.major_version(command->major_version());\n        _protocol.minor_version(command->minor_version());\n\n        LOG(\"Protocol version \" << Protocol::MajorVersion << \".\" << Protocol::MinorVersion << \", client protocol version \" << _protocol.major_version() << \".\" << _protocol.minor_version() << \".\");\n\n        return command->reply();\n    }\n\n    const Reply *Agent::Process(const VmResumeCommand *command)\n    {\n        VmResumeCommand::Reply *empty_reply = command->reply();\n\n        if (!IsSuspended())\n            empty_reply->error_code(kErrorCodeNotSuspended);\n        else\n            RequestResume();\n\n        return empty_reply;\n    }\n\n    const Reply *Agent::Process(const VmAllThreadsCommand *command)\n    {\n        VmAllThreadsCommand::Reply *all_threads_reply = command->reply();\n\n        size_t size = 0;\n        Il2CppThread **threads = CALL_IL2CPP_API(il2cpp_thread_get_all_attached_threads) (&size);\n\n        for (size_t i = 0; i < size; ++i)\n        {\n            Il2CppThread *thread = threads[i];\n            if (!CALL_IL2CPP_API(il2cpp_is_vm_thread)(thread))\n                continue;\n\n            if (thread == _managed_debugger_thread)\n                continue;\n\n            all_threads_reply->threads().push_back(thread);\n        }\n\n        return all_threads_reply;\n    }\n\n    const Reply *Agent::Process(const VmDisposeCommand *command)\n    {\n        VmDisposeCommand::Reply *empty_reply = command->reply();\n\n        LOG(\"warning: probably we should use a global lock here to avoid contention on event_req_list.\");\n\n        InvalidateBreakpointData();\n\n        _event_req_list.ClearAllRequests();\n\n        while (IsSuspended())\n            RequestResume();\n\n        return empty_reply;\n    }\n\n    const Reply *Agent::Process(const VmSuspendCommand *command)\n    {\n        VmSuspendCommand::Reply *empty_reply = command->reply();\n\n        if (!IsSuspended())\n        {\n            RequestSuspend();\n            WaitForSuspend();\n        }\n\n        return empty_reply;\n    }\n\n    const Reply *Agent::Process(const VmAbortInvokeCommand *command)\n    {\n        LOG(\"warning: `VmAbortInvokeCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n        IL2CPP_ASSERT(0);\n\n        return new InternalErrorNotImplementedReply(command);\n    }\n\n    const Reply *Agent::Process(const VmExitCommand *command)\n    {\n        LOG(\"warning: `VmExitCommand` not implemented. Returning a `NotImplemented` reply!\");\n\n        IL2CPP_ASSERT(0);\n\n        return new InternalErrorNotImplementedReply(command);\n    }\n\n    const Reply *Agent::Process(const VmInvokeMethodCommand *command)\n    {\n        VmInvokeMethodCommand::Reply *reply = command->reply();\n\n        if (!IsSuspended())\n        {\n            reply->error_code(kErrorCodeNotSuspended);\n            return reply;\n        }\n\n        Il2CppThread *vm_thread = command->vm_thread();\n        int32_t flags = command->flags();\n        const MethodInfo* method = command->method();\n\n        ThreadData* vm_thread_data = _thread_data.ThreadDataFor(vm_thread);\n\n        vm_thread_data->SetMethodToInvoke(method);\n\n        vm_thread_data->WaitForMethodToBeInvoked();\n\n        reply->method_did_not_throw_exception(true);\n\n        const Il2CppType* return_type = CALL_IL2CPP_API(il2cpp_method_get_return_type)(method);\n        reply->return_type(return_type->type);\n\n        if (return_type->type == IL2CPP_TYPE_VOID)\n        {\n            reply->skip_return_value = true;\n        }\n        else\n        {\n            int32_t actual_return = *(int32_t*)(CALL_IL2CPP_API(il2cpp_object_unbox)(vm_thread_data->GetReturnValueOfMethodToInvoke()));\n            reply->return_value(actual_return);\n        }\n\n        return reply;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/id-bank.h",
    "content": "#pragma once\n\n#include \"common.h\"\n\nstruct Il2CppClass;\nstruct Il2CppObject;\nstruct Il2CppDomain;\nstruct Il2CppAssembly;\nstruct Il2CppImage;\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    enum IdType\n    {\n        // Note: kIdTypeObject is used only internally, it should never\n        // be sent to the client 'cause it is invalid.\n        kIdTypeObject = -1,\n        kIdTypeAssembly = 0,\n        kIdTypeModule = 1,\n        kIdTypeType = 2,\n        kIdTypeMethod = 3,\n        kIdTypeField = 4,\n        kIdTypeDomain = 5,\n        kIdTypeProperty = 6,\n        kIdTypeCount\n    };\n\n    struct Id\n    {\n        IdType type;\n        int32_t id;\n    };\n\n    Id AssemblyId(const Il2CppAssembly *assembly);\n    Id ModuleId(const Il2CppImage *image);\n    Id TypeId(const Il2CppClass *type);\n    Id DomainId(const Il2CppDomain *domain);\n    Id ObjectId(const Il2CppObject *object);\n    Id MethodId(const MethodInfo *method);\n    Id FieldId(const FieldInfo *field);\n    Id PropertyId(const PropertyInfo *prop);\n    Il2CppClass *TypeFromId(Id &id);\n    Il2CppClass *TypeFromId(int32_t id);\n    Il2CppObject *ObjectFromId(Id &id);\n    Il2CppDomain *DomainFromId(Id &id);\n    Il2CppAssembly *AssemblyFromId(Id &id);\n    MethodInfo *MethodFromId(Id &id);\n    FieldInfo *FieldFromId(Id &id);\n    PropertyInfo *PropertyFromId(Id &id);\n    Il2CppImage *ModuleFromId(Id &id);\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/id-brank.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"id-bank.h\"\n\n#include <map>\n\n#include \"../os/Atomic.h\"\n\nusing namespace il2cpp::debugger;\n\n// Mono stores the ID map per domain. We don't support domains, so we can store it globally\nstatic std::map<IdType, std::map<uintptr_t, int32_t> > gTypesMap;\n\nstatic int32_t get_or_create_id_for(IdType type, const void *ptr)\n{\n    if (ptr == 0)\n        return 0;\n\n    // Note: we don't use GCHandles here as long as `ptr` is always supposed to point to\n    // memory statically allocated or managed directly by il2cpp (like Il2CppClass*, Il2CppType*, etc).\n\n    if (gTypesMap.find(type) == gTypesMap.end())\n    {\n        gTypesMap[type] = std::map<uintptr_t, int32_t>();\n    }\n\n    const uintptr_t value_ptr = (uintptr_t)ptr;\n    std::map<uintptr_t, int32_t> &type_map = gTypesMap[type];\n    std::map<uintptr_t, int32_t>::iterator it = type_map.find(value_ptr);\n\n    if (it == type_map.end())\n    {\n        type_map[value_ptr] = type_map.size() + 1;\n    }\n\n    return type_map[value_ptr];\n}\n\nstatic void *get_ptr_from_id(IdType type, int32_t id)\n{\n    if (id == 0)\n        return 0;\n\n    std::map<IdType, std::map<uintptr_t, int32_t> >::const_iterator itt = gTypesMap.find(type);\n    if (itt == gTypesMap.end())\n        return 0;\n\n    const std::map<uintptr_t, int32_t> &type_map = itt->second;\n    std::map<uintptr_t, int32_t>::const_iterator it = type_map.begin();\n\n    // Slooooooow\n    while (it != type_map.end())\n    {\n        if (it->second == id)\n            return (void*)it->first;\n\n        ++it;\n    }\n\n    return 0;\n}\n\ntypedef uintptr_t GCHandle;\n\nstruct ObjectRef\n{\n    uint64_t id;\n    GCHandle gc_handle; // This will be a week ref GC handle to the Object\n};\n\nstatic int32_t obj_reference_id = 0;\nstatic std::map<uint32_t, ObjectRef> gIdToRefMap;\nstatic std::map<uintptr_t, ObjectRef> gObjToRefMap;\n\n// TODO: these il2cpp_gc_* functions need to be replaced with the right implementations later\nstatic GCHandle il2cpp_gc_handle_new_weakref(const Il2CppObject *object, bool)\n{\n    return (uintptr_t)object;\n}\n\nstatic bool il2cpp_gc_weak_ref_is_alive(GCHandle gc_handle)\n{\n    return true;\n}\n\nstatic int32_t get_or_create_object_id(const Il2CppObject *object)\n{\n    if (object == 0)\n        return 0;\n\n    const uintptr_t uid = (uintptr_t)(~((uintptr_t)object));\n    std::map<uintptr_t, ObjectRef>::iterator it = gObjToRefMap.find(uid);\n    if (it != gObjToRefMap.end() && il2cpp_gc_weak_ref_is_alive(it->second.gc_handle))\n        return it->second.id;\n\n    ObjectRef ref;\n    ref.id = il2cpp::os::Atomic::Increment(&obj_reference_id);\n    ref.gc_handle = il2cpp_gc_handle_new_weakref(object, false);\n\n    gObjToRefMap[uid] = ref;\n    gIdToRefMap[ref.id] = ref;\n\n    return ref.id;\n}\n\nstatic Il2CppObject *get_object_from_id(int32_t id)\n{\n    if (id == 0)\n        return 0;\n\n    std::map<uint32_t, ObjectRef>::iterator it = gIdToRefMap.find(id);\n    if (it == gIdToRefMap.end())\n    {\n        LOG(\"Invalid object ID\");\n        return 0;\n    }\n\n    return (Il2CppObject*)it->second.gc_handle;\n}\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    Id TypeId(const Il2CppClass *type)\n    {\n        Id id;\n\n        id.type = kIdTypeType;\n        id.id = get_or_create_id_for(id.type, type);\n\n        return id;\n    }\n\n    Id AssemblyId(const Il2CppAssembly *assembly)\n    {\n        Id id;\n\n        id.type = kIdTypeAssembly;\n        id.id = get_or_create_id_for(id.type, assembly);\n\n        return id;\n    }\n\n    Id ModuleId(const Il2CppImage *image)\n    {\n        Id id;\n\n        id.type = kIdTypeModule;\n        id.id = get_or_create_id_for(id.type, image);\n\n        return id;\n    }\n\n    Id DomainId(const Il2CppDomain *domain)\n    {\n        Id id;\n\n        id.type = kIdTypeDomain;\n        id.id = get_or_create_id_for(id.type, domain);\n\n        return id;\n    }\n\n    Id ObjectId(const Il2CppObject *object)\n    {\n        Id id;\n\n        id.type = kIdTypeObject;\n        id.id = get_or_create_object_id(object);\n\n        return id;\n    }\n\n    Id MethodId(const MethodInfo *method)\n    {\n        Id id;\n\n        id.type = kIdTypeMethod;\n        id.id = get_or_create_id_for(id.type, method);\n\n        return id;\n    }\n\n    Id FieldId(const FieldInfo *field)\n    {\n        Id id;\n\n        id.type = kIdTypeField;\n        id.id = get_or_create_id_for(id.type, field);\n\n        return id;\n    }\n\n    Id PropertyId(const PropertyInfo *prop)\n    {\n        Id id;\n\n        id.type = kIdTypeProperty;\n        id.id = get_or_create_id_for(id.type, prop);\n\n        return id;\n    }\n\n    Il2CppClass *TypeFromId(int32_t id)\n    {\n        return (Il2CppClass*)get_ptr_from_id(kIdTypeType, id);\n    }\n\n    Il2CppClass *TypeFromId(Id &id)\n    {\n        IL2CPP_ASSERT(id.type == kIdTypeType && \"TypeFromId can only be used on kIdTypeType ids.\");\n\n        return TypeFromId(id.id);\n    }\n\n    Il2CppObject *ObjectFromId(Id &id)\n    {\n        IL2CPP_ASSERT(id.type == kIdTypeObject && \"ObjectFromId can only be used on kIdTypeObject ids.\");\n\n        return get_object_from_id(id.id);\n    }\n\n    Il2CppDomain *DomainFromId(Id &id)\n    {\n        IL2CPP_ASSERT(id.type == kIdTypeDomain && \"DomainFromId can only be used on kIdTypeDomain ids.\");\n\n        return (Il2CppDomain*)get_ptr_from_id(id.type, id.id);\n    }\n\n    Il2CppAssembly *AssemblyFromId(Id &id)\n    {\n        IL2CPP_ASSERT(id.type == kIdTypeAssembly && \"AssemblyFromId can only be used on kIdTypeAssembly ids.\");\n\n        return (Il2CppAssembly*)get_ptr_from_id(id.type, id.id);\n    }\n\n    Il2CppImage *ModuleFromId(Id &id)\n    {\n        IL2CPP_ASSERT(id.type == kIdTypeModule && \"ModuleFromId can only be used on kIdTypeModule ids.\");\n\n        return (Il2CppImage*)get_ptr_from_id(id.type, id.id);\n    }\n\n    MethodInfo *MethodFromId(Id &id)\n    {\n        IL2CPP_ASSERT(id.type == kIdTypeMethod && \"MethodFromId can only be used on kIdTypeMethod ids.\");\n\n        return (MethodInfo*)get_ptr_from_id(id.type, id.id);\n    }\n\n    FieldInfo *FieldFromId(Id &id)\n    {\n        IL2CPP_ASSERT(id.type == kIdTypeField && \"FieldFromId can only be used on kIdTypeField ids.\");\n\n        return (FieldInfo*)get_ptr_from_id(id.type, id.id);\n    }\n\n    PropertyInfo *PropertyFromId(Id &id)\n    {\n        IL2CPP_ASSERT(id.type == kIdTypeProperty && \"PropertyFromId can only be used on kIdTypeProperty ids.\");\n\n        return (PropertyInfo*)get_ptr_from_id(id.type, id.id);\n    }\n} /* namespace debugger */\n} /* namespace il2cpp */\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/il2cpp-api-test-forwarder.cpp",
    "content": "#if IL2CPP_UNIT_TESTS_ENABLED\n\n#include \"il2cpp-api-test-forwarder.h\"\n#include \"agent.h\"\n\nusing namespace il2cpp::debugger;\n\nconst Il2CppApiTestForwarder Il2CppApiTestForwarderAutoClear::zero_forwarder = {};\n\nIl2CppApiTestForwarderAutoClear::Il2CppApiTestForwarderAutoClear()\n{\n    ClearAllForwardingMethods();\n}\n\nIl2CppApiTestForwarderAutoClear::~Il2CppApiTestForwarderAutoClear()\n{\n    ClearAllForwardingMethods();\n}\n\nvoid Il2CppApiTestForwarderAutoClear::ClearAllForwardingMethods()\n{\n    Agent::instance().TestForwarder = zero_forwarder;\n}\n\n#endif // IL2CPP_UNIT_TESTS_ENABLED\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/il2cpp-api-test-forwarder.h",
    "content": "#pragma once\n\n#include <object-internals.h>\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n#if IL2CPP_UNIT_TESTS_ENABLED\n\n    struct Il2CppApiTestForwarder\n    {\n        Il2CppDomain* (*il2cpp_domain_get)();\n        Il2CppThread* (*il2cpp_thread_current)();\n        Il2CppThread** (*il2cpp_thread_get_all_attached_threads)(size_t *size);\n        bool (*il2cpp_is_vm_thread)(Il2CppThread *thread);\n        Il2CppObject* (*il2cpp_runtime_invoke)(MethodInfo *method, void *obj, void **params, Il2CppObject **exc);\n        const Il2CppType* (*il2cpp_method_get_return_type)(MethodInfo* method);\n        void* (*il2cpp_object_unbox)(Il2CppObject* obj);\n    };\n\n    class Il2CppApiTestForwarderAutoClear\n    {\n    public:\n        Il2CppApiTestForwarderAutoClear();\n        ~Il2CppApiTestForwarderAutoClear();\n\n    private:\n        void ClearAllForwardingMethods();\n        static const Il2CppApiTestForwarder zero_forwarder;\n    };\n\n#define CALL_IL2CPP_API(x) Agent::instance().TestForwarder.x\n#define ENABLE_IL2CPP_API_METHOD_FORWARDING Il2CppApiTestForwarderAutoClear __define_ENABLE_IL2CPP_API_METHOD_FORWARDING_before_forwarding_any_methods_consider_using_Il2CppApiForwardingTestFixture;\n#define FORWARD_IL2CPP_API_METHOD_UNSAFE(method, target) Agent::instance().TestForwarder.method = target;\n#define FORWARD_IL2CPP_API_METHOD(method, target) \\\n    __define_ENABLE_IL2CPP_API_METHOD_FORWARDING_before_forwarding_any_methods_consider_using_Il2CppApiForwardingTestFixture;\\\n    FORWARD_IL2CPP_API_METHOD_UNSAFE(method, target)\n\n#else\n\n#define CALL_IL2CPP_API(x) x\n#define ENABLE_IL2CPP_API_METHOD_FORWARDING\n#define FORWARD_IL2CPP_API_METHOD_UNSAFE(method, target)\n#define FORWARD_IL2CPP_API_METHOD(method, target)\n\n#endif // IL2CPP_UNIT_TESTS_ENABLED\n} /* namspace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/meta.h",
    "content": "#pragma once\n\n#include <set>\n#include <vector>\n#include <string>\n\n#include \"common.h\"\n#include \"data-buffer.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    template<typename T>\n    struct Property;\n\n#define DEFINE_SIMPLE_PROP_STD(Type, Writer, Reader) \\\n    template<> \\\n    struct Property<Type> \\\n    { \\\n        inline const Type &operator()() const { return _storage; } \\\n        inline void operator()(const Type &v) { _storage = v; } \\\n        inline void WriteTo(Buffer &out) const { out. Writer (_storage); } \\\n        inline Type ReadFrom(Buffer &in) { return _storage = in. Reader (); } \\\n        inline operator Type() { return _storage; } \\\n    private: \\\n        Type _storage; \\\n    }\n\n#define DEFINE_SIMPLE_PROP_INIT(Type, Writer, Reader) \\\n    template<> \\\n    struct Property<Type> \\\n    { \\\n        Property() : _storage( 0 ) {} \\\n        inline Type operator()() const { return _storage; } \\\n        inline void operator()(Type v) { _storage = v; } \\\n        inline void WriteTo(Buffer &out) const { out. Writer (_storage); } \\\n        inline void ReadFrom(Buffer &in) { _storage = in. Reader (); } \\\n        inline operator Type() { return _storage; } \\\n    private: \\\n        Type _storage; \\\n    }\n\n#define DEFINE_LIST_PROP(Type, Writer, Reader) \\\n    template<> \\\n    struct Property<std::vector<Type> > \\\n    { \\\n        Property() { } \\\n        inline std::vector<Type> &operator()() { return _storage; } \\\n        inline const std::vector<Type> &operator()() const { return _storage; } \\\n        inline operator std::vector<Type> &() { return _storage; } \\\n        inline void WriteTo(Buffer &out) const { \\\n            out.WriteInt(_storage.size()); \\\n            std::vector<Type>::const_iterator it = _storage.begin(); \\\n            while(it != _storage.end()) { \\\n                out. Writer (*it); \\\n                ++it; \\\n            } \\\n        } \\\n        inline void ReadFrom(Buffer &in) { \\\n            const int32_t len = in.ReadInt(); \\\n            _storage.resize(len); \\\n            for(int32_t i = 0; i < len; ++i) { \\\n                _storage[i] = in. Reader (); \\\n            } \\\n        } \\\n    private: \\\n        std::vector<Type> _storage; \\\n    };\n\n#define DEFINE_SET_PROP(Type, Writer, Reader) \\\n    template<> \\\n    struct Property<std::set<Type> > \\\n    { \\\n        Property() { } \\\n        inline std::set<Type> &operator()() { return _storage; } \\\n        inline operator std::set<Type> &() { return _storage; } \\\n        inline void WriteTo(Buffer &out) const { \\\n            out.WriteInt(_storage.size()); \\\n            std::set<Type>::const_iterator it = _storage.begin(); \\\n            while(it != _storage.end()) { \\\n                out. Writer (*it); \\\n                ++it; \\\n            } \\\n        } \\\n        inline void ReadFrom(Buffer &in) { \\\n            const int32_t len = in.ReadInt(); \\\n            for(int32_t i = 0; i < len; ++i) { \\\n                _storage.insert(in. Reader ()); \\\n            } \\\n        } \\\n    private: \\\n        std::set<Type> _storage; \\\n    };\n\n    DEFINE_SIMPLE_PROP_STD(std::string, WriteString, ReadString);\n    DEFINE_SIMPLE_PROP_INIT(bool, WriteBool, ReadBool);\n    DEFINE_SIMPLE_PROP_INIT(int32_t, WriteInt, ReadInt);\n    DEFINE_SIMPLE_PROP_INIT(uint8_t, WriteByte, ReadByte);\n    DEFINE_SIMPLE_PROP_INIT(uint64_t, WriteLong, ReadLong);\n    DEFINE_SIMPLE_PROP_INIT(Il2CppAssembly*, WriteAssemblyId, ReadAssembly);\n    DEFINE_SIMPLE_PROP_INIT(Il2CppClass*, WriteTypeId, ReadType);\n    DEFINE_SIMPLE_PROP_INIT(const MethodInfo*, WriteMethodId, ReadMethod);\n    DEFINE_SIMPLE_PROP_INIT(Il2CppImage*, WriteModuleId, ReadModule);\n    DEFINE_SIMPLE_PROP_INIT(Il2CppDomain*, WriteDomainId, ReadDomain);\n    DEFINE_SIMPLE_PROP_INIT(Il2CppObject*, WriteObjectId, ReadObject);\n    DEFINE_SIMPLE_PROP_INIT(Il2CppThread*, WriteThreadId, ReadThread);\n    DEFINE_SIMPLE_PROP_INIT(FieldInfo*, WriteFieldId, ReadField);\n    DEFINE_SIMPLE_PROP_INIT(const Il2CppImage*, WriteModuleId, ReadModule);\n\n    DEFINE_LIST_PROP(std::string, WriteString, ReadString);\n    DEFINE_LIST_PROP(bool, WriteBool, ReadBool);\n    DEFINE_LIST_PROP(int32_t, WriteInt, ReadInt);\n    DEFINE_LIST_PROP(uint8_t, WriteByte, ReadByte);\n    DEFINE_LIST_PROP(uint64_t, WriteLong, ReadLong);\n    DEFINE_LIST_PROP(Il2CppAssembly*, WriteAssemblyId, ReadAssembly);\n    DEFINE_LIST_PROP(Il2CppClass*, WriteTypeId, ReadType);\n    DEFINE_LIST_PROP(const MethodInfo*, WriteMethodId, ReadMethod);\n    DEFINE_LIST_PROP(Il2CppImage*, WriteModuleId, ReadModule);\n    DEFINE_LIST_PROP(Il2CppDomain*, WriteDomainId, ReadDomain);\n    DEFINE_LIST_PROP(Il2CppObject*, WriteObjectId, ReadObject);\n    DEFINE_LIST_PROP(Il2CppThread*, WriteThreadId, ReadThread);\n    DEFINE_LIST_PROP(FieldInfo*, WriteFieldId, ReadField);\n\n    DEFINE_SET_PROP(std::string, WriteString, ReadString);\n    DEFINE_SET_PROP(bool, WriteBool, ReadBool);\n    DEFINE_SET_PROP(int32_t, WriteInt, ReadInt);\n    DEFINE_SET_PROP(uint8_t, WriteByte, ReadByte);\n    DEFINE_SET_PROP(uint64_t, WriteLong, ReadLong);\n    DEFINE_SET_PROP(Il2CppAssembly*, WriteAssemblyId, ReadAssembly);\n    DEFINE_SET_PROP(Il2CppClass*, WriteTypeId, ReadType);\n    DEFINE_SET_PROP(const MethodInfo*, WriteMethodId, ReadMethod);\n    DEFINE_SET_PROP(Il2CppImage*, WriteModuleId, ReadModule);\n    DEFINE_SET_PROP(Il2CppDomain*, WriteDomainId, ReadDomain);\n    DEFINE_SET_PROP(Il2CppObject*, WriteObjectId, ReadObject);\n    DEFINE_SET_PROP(Il2CppThread*, WriteThreadId, ReadThread);\n    DEFINE_SET_PROP(FieldInfo*, WriteFieldId, ReadField);\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/app-domain.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"app-domain.h\"\n\nusing namespace il2cpp::debugger;\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/app-domain.h",
    "content": "#pragma once\n\n#include \"../../common.h\"\n#include \"../protocol-utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct AppDomainGetRootDomainCommand : public CustomCommand<AppDomainGetRootDomainCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<Il2CppDomain*> domain;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                domain.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(AppDomain, GetRootDomain);\n    };\n\n    struct AppDomainGetCorlibCommand : public CustomCommand<AppDomainGetCorlibCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<Il2CppAssembly*> assembly;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                assembly.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(AppDomain, GetCorlib);\n\n        Property<Il2CppDomain*> domain;\n\n        void ReadProperties(Buffer &in)\n        {\n            domain.ReadFrom(in);\n        }\n    };\n\n    struct AppDomainGetFriendlyNameCommand : public CustomCommand<AppDomainGetFriendlyNameCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::string> friendly_name;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                friendly_name.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(AppDomain, GetFriendlyName);\n\n        Property<Il2CppDomain*> domain;\n\n        void ReadProperties(Buffer &in)\n        {\n            domain.ReadFrom(in);\n        }\n    };\n\n    struct AppDomainCreateStringCommand : public CustomCommand<AppDomainCreateStringCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<Il2CppObject*> object;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                object.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(AppDomain, CreateString);\n\n        Property<Il2CppDomain*> domain;\n        Property<std::string> string;\n\n        void ReadProperties(Buffer &in)\n        {\n            domain.ReadFrom(in);\n            string.ReadFrom(in);\n        }\n    };\n\n    struct AppDomainGetEntryAssemblyCommand : public CustomCommand<AppDomainGetEntryAssemblyCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(AppDomain, GetEntryAssembly);\n\n        Property<Il2CppDomain*> domain;\n\n        void ReadProperties(Buffer &in)\n        {\n            domain.ReadFrom(in);\n        }\n    };\n\n    struct AppDomainCreateBoxedValueCommand : public CustomCommand<AppDomainCreateBoxedValueCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(AppDomain, CreateBoxedValue);\n\n        Property<Il2CppDomain*> domain;\n\n        void ReadProperties(Buffer &in)\n        {\n            domain.ReadFrom(in);\n        }\n    };\n\n    struct AppDomainGetAssembliesCommand : public CustomCommand<AppDomainGetAssembliesCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<int32_t> number_of_assemblies;\n            Property<std::vector<Il2CppAssembly*> > assemblies;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                number_of_assemblies.WriteTo(out);\n                assemblies.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(AppDomain, GetAssemblies);\n\n        Property<Il2CppDomain*> domain;\n\n        void ReadProperties(Buffer &in)\n        {\n            domain.ReadFrom(in);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/array-ref.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"array-ref.h\"\n\nusing namespace il2cpp::debugger;\n\nvoid ArrayRefGetValuesCommand::Reply::WriteContentTo(Buffer &out) const\n{\n    for (std::vector<Variant>::const_iterator it = _values.begin(); it != _values.end(); ++it)\n    {\n        out.WriteVariant(*it);\n    }\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/array-ref.h",
    "content": "#pragma once\n\n#include \"../../common.h\"\n#include \"../../variant.h\"\n#include \"../protocol-utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct ArrayRefGetValuesCommand : public CustomCommand<ArrayRefGetValuesCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            inline std::vector<Variant> &values()\n            {\n                return _values;\n            }\n\n            void WriteContentTo(Buffer &out) const;\n\n        private:\n\n            std::vector<Variant> _values;\n        };\n\n\n        CUSTOM_COMMAND(ArrayRef, GetValues);\n\n        Property<Il2CppObject*> object;\n        Property<int32_t> index;\n        Property<int32_t> length;\n\n        void ReadProperties(Buffer &in)\n        {\n            object.ReadFrom(in);\n            index.ReadFrom(in);\n            length.ReadFrom(in);\n        }\n    };\n\n    struct ArrayRefGetLengthCommand : public CustomCommand<ArrayRefGetLengthCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<int32_t> rank;\n            Property<std::vector<int32_t> > lengths;\n            Property<std::vector<int32_t> > lower_bounds;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                rank.WriteTo(out);\n\n                for (size_t i = 0; i < lengths().size(); ++i)\n                {\n                    out.WriteInt(lengths().at(i));\n                    out.WriteInt(lower_bounds().at(i));\n                }\n            }\n        };\n\n\n        CUSTOM_COMMAND(ArrayRef, GetLength);\n\n        Property<Il2CppObject*> object;\n\n        void ReadProperties(Buffer &in)\n        {\n            object.ReadFrom(in);\n        }\n    };\n\n    struct ArrayRefSetValuesCommand : public CustomCommand<ArrayRefSetValuesCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(ArrayRef, SetValues);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/assembly.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"assembly.h\"\n\nusing namespace il2cpp::debugger;\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/assembly.h",
    "content": "#pragma once\n\n#include \"../../common.h\"\n#include \"../protocol-utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct AssemblyGetTypeCommand : public CustomCommand<AssemblyGetTypeCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<Il2CppClass*> type;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                type.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Assembly, GetType);\n\n        Property<Il2CppAssembly*> assembly;\n        Property<std::string> name;\n        Property<bool> ignore_case;\n\n        void ReadProperties(Buffer &in)\n        {\n            assembly.ReadFrom(in);\n            name.ReadFrom(in);\n            ignore_case.ReadFrom(in);\n        }\n    };\n\n    struct AssemblyGetObjectCommand : public CustomCommand<AssemblyGetObjectCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(Assembly, GetObject);\n    };\n\n    struct AssemblyGetEntryPointCommand : public CustomCommand<AssemblyGetEntryPointCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(Assembly, GetEntryPoint);\n    };\n\n    struct AssemblyGetManifestModuleCommand : public CustomCommand<AssemblyGetManifestModuleCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<const Il2CppImage*> module;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                module.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Assembly, GetManifestModule);\n\n        Property<Il2CppAssembly*> assembly;\n\n        void ReadProperties(Buffer &in)\n        {\n            assembly.ReadFrom(in);\n        }\n    };\n\n    struct AssemblyGetNameCommand : public CustomCommand<AssemblyGetNameCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::string> name;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                name.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Assembly, GetName);\n\n        Property<Il2CppAssembly*> assembly;\n\n        void ReadProperties(Buffer &in)\n        {\n            assembly.ReadFrom(in);\n        }\n    };\n\n    struct AssemblyGetLocationCommand : public CustomCommand<AssemblyGetLocationCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::string> location;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                location.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Assembly, GetLocation);\n\n        Property<Il2CppAssembly*> assembly;\n\n        void ReadProperties(Buffer &in)\n        {\n            assembly.ReadFrom(in);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/event-request.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"event-request.h\"\n\nusing namespace il2cpp::debugger;\n\nvoid EventRequestSetCommand::ReadProperties(Buffer &in)\n{\n    _kind = in.ReadEnum<EventKind>();\n    _suspend_policy = in.ReadEnum<SuspendPolicy>();\n\n    const int32_t nmodifiers = in.ReadByte();\n\n    for (int i = 0; i < nmodifiers; ++i)\n    {\n        Modifier *modifier = new Modifier();\n\n        modifier->kind = in.ReadEnum<ModifierKind>();\n\n        switch (modifier->kind)\n        {\n            case kModifierKindCount:\n                modifier->data.count = in.ReadInt();\n                break;\n\n            case kModifierKindLocationOnly:\n                IL2CPP_ASSERT(method() == 0 && \"Duplicated kModifierKindLocationOnly modifier!\");\n\n                method.ReadFrom(in);\n                location.ReadFrom(in);\n                break;\n\n            case kModifierKindStep:\n                IL2CPP_ASSERT(thread() == 0 && \"Duplicated kModifierKindStep modifier!\");\n\n                thread.ReadFrom(in);\n                size.ReadFrom(in);\n                depth.ReadFrom(in);\n                break;\n\n            case kModifierKindThreadOnly:\n                IL2CPP_ASSERT(modifier->data.thread == 0 && \"Duplicated kModifierKindThreadOnly modifier!\");\n\n                modifier->data.thread = in.ReadThread();\n                break;\n\n            case kModifierKindExceptionOnly:\n                modifier->data.exc_class = in.ReadType();\n                modifier->caught = in.ReadBool();\n                modifier->uncaught = in.ReadBool();\n\n                // DEBUG(1, fprintf (log_file, \"[dbg] \\tEXCEPTION_ONLY filter (%s%s%s).\\n\", exc_class ? exc_class->name : \"all\", req->modifiers [i].caught ? \", caught\" : \"\", req->modifiers [i].uncaught ? \", uncaught\" : \"\"));\n                if (modifier->data.exc_class != 0)\n                {\n                    /*\n                    if (!mono_class_is_assignable_from (mono_defaults.exception_class, exc_class)) {\n                        g_free (req);\n                        return ERR_INVALID_ARGUMENT;\n                    }*/\n                }\n\n                break;\n\n            case kModifierKindAssemblyOnly:\n            {\n                const int32_t count = in.ReadInt();\n\n                modifier->data.assemblies = new Il2CppAssembly*[count];\n\n                for (int32_t i = 0; i < count; ++i)\n                    modifier->data.assemblies[i] = in.ReadAssembly();\n            }\n            break;\n\n            default:\n                LOG(\"Not implemented EventRequestSetCommand+??(\" << modifier->kind << \")\");\n                exit(1);\n        }\n\n        _modifiers.push_back(modifier);\n    }\n}\n\nEventRequestSetCommand::~EventRequestSetCommand()\n{\n    std::vector<Modifier*>::iterator it = _modifiers.begin();\n    while (it != _modifiers.end())\n    {\n        delete *it;\n        ++it;\n    }\n\n    _modifiers.clear();\n}\n\nvoid EventRequestClearCommand::ReadProperties(Buffer &in)\n{\n    event_kind.ReadFrom(in);\n    request_id.ReadFrom(in);\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/event-request.h",
    "content": "#pragma once\n\n#include <vector>\n\n#include \"../../common.h\"\n#include \"../protocol-utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct EventRequestSetCommand : public CustomCommand<EventRequestSetCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<int32_t> request_id;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                request_id.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(EventRequest, Set);\n\n        ~EventRequestSetCommand();\n\n        Property<const MethodInfo*> method;\n        Property<uint64_t> location;\n        Property<Il2CppThread*> thread;\n        Property<int32_t> size;\n        Property<int32_t> depth;\n\n        inline EventKind kind() const\n        {\n            return _kind;\n        }\n\n        inline SuspendPolicy suspend_policy() const\n        {\n            return _suspend_policy;\n        }\n\n        inline const std::vector<Modifier*> &modifiers() const\n        {\n            return _modifiers;\n        }\n\n        void ReadProperties(Buffer & in);\n\n    private:\n\n        EventKind _kind;\n        SuspendPolicy _suspend_policy;\n        std::vector<Modifier*> _modifiers;\n    };\n\n    struct EventRequestClearCommand : public CustomCommand<EventRequestClearCommand>\n    {\n        CUSTOM_COMMAND_EMPTY_REPLY(EventRequest, Clear);\n\n        Property<uint8_t> event_kind;\n        Property<int32_t> request_id;\n\n        void ReadProperties(Buffer & in);\n    };\n\n    struct EventRequestClearAllBreakpointsCommand : public CustomCommand<EventRequestClearAllBreakpointsCommand>\n    {\n        CUSTOM_COMMAND_EMPTY_REPLY(EventRequest, ClearAllBreakpoints);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/event.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"event.h\"\n\n#include \"../../data-buffer.h\"\n#include \"../../../os/Atomic.h\"\n\nusing namespace il2cpp::debugger;\n\nstatic int32_t event_packed_id = 0;\n\nEventCompositeCommand::EventCompositeCommand() :\n    Command(kCommandSetEvent, kCommandSetEventComposite, (int32_t)il2cpp::os::Atomic::Increment(&event_packed_id)),\n    _suspend_policy(kSuspendPolicyNone)\n{\n}\n\nEventCompositeCommand::EventCompositeCommand(int32_t /*ignored*/) :\n    Command(kCommandSetEvent, kCommandSetEventComposite, (int32_t)il2cpp::os::Atomic::Increment(&event_packed_id)),\n    _suspend_policy(kSuspendPolicyNone)\n{\n}\n\nvoid EventCompositeCommand::AddEvent(int32_t req_id, const Event *evt)\n{\n    _events[req_id] = evt;\n}\n\nvoid EventCompositeCommand::WriteContentTo(Buffer &out) const\n{\n    const size_t count = _events.size();\n    std::map<int32_t, const Event*>::const_iterator it = _events.begin();\n\n    // VM_START event suspend policy might be configured by the user, thus allowing\n    // the debugger to suspend as soon as the VM start.\n    out.WriteByte(_suspend_policy);\n    out.WriteInt(count);\n\n    while (it != _events.end())\n    {\n        it->second->WriteTo(out, it->first);\n        ++it;\n    }\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/event.h",
    "content": "#pragma once\n\n#include \"../../common.h\"\n#include \"../../meta.h\"\n#include \"../protocol.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    class EventCompositeCommand : public Command\n    {\n    public:\n\n        EventCompositeCommand();\n        explicit EventCompositeCommand(int32_t /*ignored*/);\n\n        inline SuspendPolicy suspend_policy() const\n        {\n            return _suspend_policy;\n        }\n\n        inline void suspend_policy(SuspendPolicy v)\n        {\n            _suspend_policy = v;\n        }\n\n        void AddEvent(int32_t req_id, const Event *evt);\n\n    protected:\n\n        void WriteContentTo(Buffer &out) const;\n\n    private:\n\n        SuspendPolicy _suspend_policy;\n        std::map<int32_t, const Event*> _events;\n\n        PROTOCOL_COMMAND(Event, Composite);\n\n        DISALLOW_COPY(EventCompositeCommand);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/internal-error.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"internal-error.h\"\n\nusing namespace il2cpp::debugger;\n\nInternalErrorNotImplementedCommand::InternalErrorNotImplementedCommand(int32_t id) :\n    Command(kCommandSetInternalError, kCommandSetInternalErrorNotImplemented, id)\n{\n}\n\nInternalErrorNotImplementedReply::InternalErrorNotImplementedReply(const Command *command) :\n    Reply(command)\n{\n    _error_code = kErrorCodeNotImplemented;\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/internal-error.h",
    "content": "#pragma once\n\n#include \"../../common.h\"\n#include \"../../meta.h\"\n#include \"../protocol.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct InternalErrorNotImplementedCommand : public Command\n    {\n    public:\n\n        explicit InternalErrorNotImplementedCommand(int32_t id);\n\n        PROTOCOL_COMMAND(InternalError, NotImplemented);\n\n        DISALLOW_COPY(InternalErrorNotImplementedCommand);\n    };\n\n    struct InternalErrorNotImplementedReply : public Reply\n    {\n    public:\n\n        explicit InternalErrorNotImplementedReply(const Command *command);\n\n        DISALLOW_COPY(InternalErrorNotImplementedReply);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/method.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"method.h\"\n\nusing namespace il2cpp::debugger;\n\nvoid MethodGetDebugInfoCommand::Reply::WriteContentTo(Buffer &out) const\n{\n    code_size.WriteTo(out);\n    file_name.WriteTo(out);\n\n    out.WriteInt(_offsets.size());\n\n    std::vector<std::pair<int32_t, int32_t> >::const_iterator it = _offsets.begin();\n\n    while (it != _offsets.end())\n    {\n        out.WriteInt((*it).first);\n        out.WriteInt((*it).second);\n\n        ++it;\n    }\n}\n\nvoid MethodGetParamInfoCommand::Reply::WriteContentTo(Buffer &out) const\n{\n    call_convention.WriteTo(out);\n    out.WriteInt(_params.size());\n    generic_param_count.WriteTo(out);\n    return_type.WriteTo(out);\n\n    std::vector<ParamInfo>::const_iterator it = _params.begin();\n\n    while (it != _params.end())\n    {\n        out.WriteTypeId((*it).type);\n        ++it;\n    }\n\n    it = _params.begin();\n\n    while (it != _params.end())\n    {\n        out.WriteString((*it).name);\n        ++it;\n    }\n}\n\nvoid MethodGetLocalsInfoCommand::Reply::WriteContentTo(Buffer &out) const\n{\n    out.WriteInt(_locals.size());\n\n    std::vector<LocalInfo>::const_iterator it;\n\n    for (it = _locals.begin(); it != _locals.end(); ++it)\n    {\n        out.WriteTypeId((Il2CppClass*)(*it).type);\n    }\n\n    for (it = _locals.begin(); it != _locals.end(); ++it)\n    {\n        out.WriteString((*it).name);\n    }\n\n    for (it = _locals.begin(); it != _locals.end(); ++it)\n    {\n        out.WriteInt((*it).begin_scope);\n        out.WriteInt((*it).end_scope);\n    }\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/method.h",
    "content": "#pragma once\n\n#include <string>\n#include <vector>\n\n#include \"../../common.h\"\n#include \"../protocol-utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct MethodGetDeclaringTypeCommand : public CustomCommand<MethodGetDeclaringTypeCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<Il2CppClass*> type;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                type.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Method, GetDeclaringType);\n\n        Property<const MethodInfo*> method;\n\n        void ReadProperties(Buffer &in)\n        {\n            method.ReadFrom(in);\n        }\n    };\n\n    struct MethodGetDebugInfoCommand : public CustomCommand<MethodGetDebugInfoCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<int32_t> code_size;\n            Property<std::string> file_name;\n\n            inline std::vector<std::pair<int32_t, int32_t> > &offsets()\n            {\n                return _offsets;\n            }\n\n            void WriteContentTo(Buffer &out) const;\n\n        private:\n\n            std::vector<std::pair<int32_t, int32_t> > _offsets;\n        };\n\n\n        CUSTOM_COMMAND(Method, GetDebugInfo);\n\n        Property<const MethodInfo*> method;\n\n        void ReadProperties(Buffer &in)\n        {\n            method.ReadFrom(in);\n        }\n    };\n\n    struct MethodGetNameCommand : public CustomCommand<MethodGetNameCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::string> name;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                name.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Method, GetName);\n\n        Property<const MethodInfo*> method;\n\n        void ReadProperties(Buffer &in)\n        {\n            method.ReadFrom(in);\n        }\n    };\n\n    struct MethodGetParamInfoCommand : public CustomCommand<MethodGetParamInfoCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            struct ParamInfo\n            {\n                const char *name;\n                Il2CppClass *type;\n            };\n\n            Property<int32_t> call_convention;\n            Property<int32_t> generic_param_count;\n            Property<Il2CppClass*> return_type;\n\n            inline std::vector<ParamInfo> &params()\n            {\n                return _params;\n            }\n\n            void WriteContentTo(Buffer &out) const;\n\n        private:\n\n            std::vector<ParamInfo> _params;\n        };\n\n\n        CUSTOM_COMMAND(Method, GetParamInfo);\n\n        Property<const MethodInfo*> method;\n\n        void ReadProperties(Buffer &in)\n        {\n            method.ReadFrom(in);\n        }\n    };\n\n    struct MethodGetBodyCommand : public CustomCommand<MethodGetBodyCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::vector<uint8_t> > bytes;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                bytes.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Method, GetBody);\n\n        Property<const MethodInfo*> method;\n\n        void ReadProperties(Buffer &in)\n        {\n            method.ReadFrom(in);\n        }\n    };\n\n    struct MethodGetLocalsInfoCommand : public CustomCommand<MethodGetLocalsInfoCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            struct LocalInfo\n            {\n                const Il2CppClass *type;\n                std::string name;\n                uint32_t begin_scope;\n                uint32_t end_scope;\n            };\n\n            inline std::vector<LocalInfo> &locals()\n            {\n                return _locals;\n            }\n\n            void WriteContentTo(Buffer &out) const;\n\n        private:\n\n            std::vector<LocalInfo> _locals;\n        };\n\n\n        CUSTOM_COMMAND(Method, GetLocalsInfo);\n\n        Property<const MethodInfo*> method;\n\n        void ReadProperties(Buffer &in)\n        {\n            method.ReadFrom(in);\n        }\n    };\n\n    struct MethodGetInfoCommand : public CustomCommand<MethodGetInfoCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<int32_t> flags;\n            Property<int32_t> implementation_flags;\n            Property<int32_t> token;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                flags.WriteTo(out);\n                implementation_flags.WriteTo(out);\n                token.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Method, GetInfo);\n\n        Property<const MethodInfo*> method;\n\n        void ReadProperties(Buffer &in)\n        {\n            method.ReadFrom(in);\n        }\n    };\n\n    struct MethodResolveTokenCommand : public CustomCommand<MethodResolveTokenCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(Method, ResolveToken);\n\n        Property<const MethodInfo*> method;\n\n        void ReadProperties(Buffer &in)\n        {\n            method.ReadFrom(in);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/module.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"module.h\"\n\nusing namespace il2cpp::debugger;\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/module.h",
    "content": "#pragma once\n\n#include <string>\n\n#include \"../../common.h\"\n#include \"../protocol-utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct ModuleGetInfoCommand : public CustomCommand<ModuleGetInfoCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::string> basename;\n            Property<std::string> fullname;\n            Property<std::string> guid;\n            Property<std::string> scope_name;\n            Property<Il2CppAssembly*> assembly;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                basename.WriteTo(out);\n                scope_name.WriteTo(out);\n                fullname.WriteTo(out);\n                guid.WriteTo(out);\n                assembly.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Module, GetInfo);\n\n        Property<Il2CppImage*> module;\n\n        void ReadProperties(Buffer &in)\n        {\n            module.ReadFrom(in);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/object-ref.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"object-ref.h\"\n\nusing namespace il2cpp::debugger;\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/object-ref.h",
    "content": "#pragma once\n\n#include \"../../common.h\"\n#include \"../protocol-utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct ObjectRefGetTypeCommand : public CustomCommand<ObjectRefGetTypeCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<Il2CppClass*> type;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                type.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(ObjectRef, GetType);\n\n        Property<Il2CppObject*> object;\n\n        void ReadProperties(Buffer &in)\n        {\n            object.ReadFrom(in);\n        }\n    };\n\n    struct ObjectRefGetDomainCommand : public CustomCommand<ObjectRefGetDomainCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<Il2CppDomain*> domain;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                domain.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(ObjectRef, GetDomain);\n\n        Property<Il2CppObject*> object;\n\n        void ReadProperties(Buffer &in)\n        {\n            object.ReadFrom(in);\n        }\n    };\n\n    struct ObjectRefIsCollectedCommand : public CustomCommand<ObjectRefIsCollectedCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented!\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(ObjectRef, IsCollected);\n\n        Property<Il2CppObject*> object;\n\n        void ReadProperties(Buffer &in)\n        {\n            object.ReadFrom(in);\n        }\n    };\n\n    struct ObjectRefSetValuesCommand : public CustomCommand<ObjectRefSetValuesCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented!\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(ObjectRef, SetValues);\n\n        Property<Il2CppObject*> object;\n\n        void ReadProperties(Buffer &in)\n        {\n            object.ReadFrom(in);\n        }\n    };\n\n    struct ObjectRefGetAddressCommand : public CustomCommand<ObjectRefGetAddressCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented!\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(ObjectRef, GetAddress);\n\n        Property<Il2CppObject*> object;\n\n        void ReadProperties(Buffer &in)\n        {\n            object.ReadFrom(in);\n        }\n    };\n\n    struct ObjectRefGetValuesCommand : public CustomCommand<ObjectRefGetValuesCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented!\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(ObjectRef, GetValues);\n\n        Property<Il2CppObject*> object;\n\n        void ReadProperties(Buffer &in)\n        {\n            object.ReadFrom(in);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/stack-frame.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"stack-frame.h\"\n\nusing namespace il2cpp::debugger;\n\nvoid StackFrameGetValuesCommand::Reply::WriteContentTo(Buffer &out) const\n{\n    for (std::vector<Variant>::const_iterator it = _values.begin(); it != _values.end(); ++it)\n    {\n        out.WriteVariant(*it);\n    }\n}\n\nvoid StackFrameSetValuesCommand::ReadProperties(Buffer &in)\n{\n    thread.ReadFrom(in);\n    frame_id.ReadFrom(in);\n    values_count.ReadFrom(in);\n\n    // Note: we need to copy the data, as long as the incoming\n    // buffer survives only for the duration of the command parsing.\n    // We might want to change this in the future\n    _command_buffer = new Buffer(in.length());\n    _command_buffer->WriteData(in.raw(), in.length());\n    _command_buffer->Seek(in.position());\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/stack-frame.h",
    "content": "#pragma once\n\n#include <vector>\n\n#include \"../../common.h\"\n#include \"../../variant.h\"\n#include \"../protocol-utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct StackFrameGetValuesCommand : public CustomCommand<StackFrameGetValuesCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            inline std::vector<Variant> &values()\n            {\n                return _values;\n            }\n\n            void WriteContentTo(Buffer &out) const;\n\n        private:\n\n            std::vector<Variant> _values;\n        };\n\n\n        CUSTOM_COMMAND(StackFrame, GetValues);\n\n        Property<int32_t> frame_id;\n        Property<Il2CppThread*> thread;\n        Property<std::vector<int32_t> > positions;\n\n        void ReadProperties(Buffer &in)\n        {\n            thread.ReadFrom(in);\n            frame_id.ReadFrom(in);\n            positions.ReadFrom(in);\n        }\n    };\n\n    struct StackFrameSetValuesCommand : public CustomCommand<StackFrameSetValuesCommand>\n    {\n        CUSTOM_COMMAND_EMPTY_REPLY(StackFrame, SetValues);\n\n        Property<int32_t> frame_id;\n        Property<Il2CppThread*> thread;\n        Property<int32_t> values_count;\n\n        inline Buffer &command_buffer() const\n        {\n            return *_command_buffer;\n        }\n\n        void ReadProperties(Buffer & in);\n\n        ~StackFrameSetValuesCommand()\n        {\n            delete _command_buffer;\n        }\n\n    private:\n\n        Buffer *_command_buffer;\n    };\n\n    struct StackFrameGetThisCommand : public CustomCommand<StackFrameGetThisCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Variant this_object;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                out.WriteVariant(this_object);\n            }\n        };\n\n\n        CUSTOM_COMMAND(StackFrame, GetThis);\n\n        Property<int32_t> frame_id;\n        Property<Il2CppThread*> thread;\n\n        void ReadProperties(Buffer &in)\n        {\n            thread.ReadFrom(in);\n            frame_id.ReadFrom(in);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/string-ref.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"string-ref.h\"\n\nusing namespace il2cpp::debugger;\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/string-ref.h",
    "content": "#pragma once\n\n#include \"../../common.h\"\n#include \"../protocol-utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct StringRefGetValueCommand : public CustomCommand<StringRefGetValueCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::string> value;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                value.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(StringRef, GetValue);\n\n        Property<Il2CppObject*> object;\n\n        void ReadProperties(Buffer &in)\n        {\n            object.ReadFrom(in);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/thread.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"thread.h\"\n\nusing namespace il2cpp::debugger;\n\nvoid ThreadGetFrameInfoCommand::Reply::WriteContentTo(Buffer &out) const\n{\n    std::vector<FrameInfo>::const_iterator it = _infos.begin();\n\n    out.WriteInt(_infos.size());\n\n    while (it != _infos.end())\n    {\n        out.WriteInt((*it).frame_id);\n        out.WriteMethodId((*it).method);\n        out.WriteInt((*it).il_offset);\n        out.WriteByte((*it).flags);\n        ++it;\n    }\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/thread.h",
    "content": "#pragma once\n\n#include <vector>\n\n#include \"../../common.h\"\n#include \"../protocol-utils.h\"\n\nstruct MethodInfo;\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct ThreadGetIdCommand : public CustomCommand<ThreadGetIdCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<uint64_t> id;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                id.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Thread, GetId);\n\n        Property<Il2CppThread*> thread;\n\n        void ReadProperties(Buffer &in)\n        {\n            thread.ReadFrom(in);\n        }\n    };\n\n    struct ThreadGetNameCommand : public CustomCommand<ThreadGetNameCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::string> name;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                name.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Thread, GetName);\n\n        Property<Il2CppThread*> thread;\n\n        void ReadProperties(Buffer &in)\n        {\n            thread.ReadFrom(in);\n        }\n    };\n\n    struct ThreadGetInfoCommand : public CustomCommand<ThreadGetInfoCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<bool> is_thread_pool;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                is_thread_pool.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Thread, GetInfo);\n\n        Property<Il2CppThread*> thread;\n\n        void ReadProperties(Buffer &in)\n        {\n            thread.ReadFrom(in);\n        }\n    };\n\n    struct ThreadGetFrameInfoCommand : public CustomCommand<ThreadGetFrameInfoCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            struct FrameInfo\n            {\n                int32_t frame_id;\n                const MethodInfo *method;\n                int32_t il_offset;\n                uint8_t flags;\n            };\n\n            inline std::vector<FrameInfo> &infos()\n            {\n                return _infos;\n            }\n\n            void WriteContentTo(Buffer &out) const;\n\n        private:\n\n            std::vector<FrameInfo> _infos;\n        };\n\n\n        CUSTOM_COMMAND(Thread, GetFrameInfo);\n\n        Property<Il2CppThread*> thread;\n        Property<int32_t> stack_frame;\n        Property<int32_t> length;\n\n        void ReadProperties(Buffer &in)\n        {\n            thread.ReadFrom(in);\n            stack_frame.ReadFrom(in);\n            length.ReadFrom(in);\n        }\n    };\n\n    struct ThreadGetStateCommand : public CustomCommand<ThreadGetStateCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<int32_t> state;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                state.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Thread, GetState);\n\n        Property<Il2CppThread*> thread;\n\n        void ReadProperties(Buffer &in)\n        {\n            thread.ReadFrom(in);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/type.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"type.h\"\n\nusing namespace il2cpp::debugger;\n\nvoid TypeGetValuesCommand::Reply::WriteContentTo(Buffer &out) const\n{\n    for (std::vector<Variant>::const_iterator it = _values.begin(); it != _values.end(); ++it)\n    {\n        out.WriteVariant(*it);\n    }\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/type.h",
    "content": "#pragma once\n\n#include <set>\n#include <string>\n#include <vector>\n\n#include \"../../common.h\"\n#include \"../../variant.h\"\n#include \"../../../class-internals.h\"\n#include \"../../../il2cpp-api.h\"\n#include \"../protocol-utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct TypeGetInfoCommand : public CustomCommand<TypeGetInfoCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::string> ns;\n            Property<std::string> name;\n            Property<std::string> fullname;\n            Property<Il2CppAssembly*> assembly;\n            Property<Il2CppImage*> module;\n            Property<Il2CppClass*> parent_type;\n            Property<Il2CppClass*> underlying_type;\n            Property<int32_t> type_token;\n            Property<uint8_t> rank;\n            Property<int32_t> flags;\n            Property<uint8_t> by_val_flags;\n            Property<std::vector<Il2CppClass*> > nested_types;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                ns.WriteTo(out);\n                name.WriteTo(out);\n                fullname.WriteTo(out);\n                assembly.WriteTo(out);\n                module.WriteTo(out);\n                parent_type.WriteTo(out);\n                underlying_type.WriteTo(out);\n                type_token.WriteTo(out);\n                rank.WriteTo(out);\n                flags.WriteTo(out);\n                by_val_flags.WriteTo(out);\n                nested_types.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, GetInfo);\n\n        Property<Il2CppClass*> type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n        }\n    };\n\n    struct TypeGetSourceFilesCommand : public CustomCommand<TypeGetSourceFilesCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::set<std::string> > source_files;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                source_files.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, GetSourceFiles);\n\n        Property<Il2CppClass*> type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n        }\n    };\n\n    struct TypeGetPropertiesCommand : public CustomCommand<TypeGetPropertiesCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            std::vector<const PropertyInfo*> properties;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                out.WriteInt(properties.size());\n\n                std::vector<const PropertyInfo*>::const_iterator it = properties.begin();\n                while (it != properties.end())\n                {\n                    const PropertyInfo *prop = *it;\n                    out.WritePropertyId(prop);\n                    out.WriteString(prop->name);\n                    out.WriteMethodId(prop->get);\n                    out.WriteMethodId(prop->set);\n                    out.WriteInt(prop->attrs);\n\n                    ++it;\n                }\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, GetProperties);\n\n        Property<Il2CppClass*> type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n        }\n    };\n\n    struct TypeGetSourceFiles2Command : public CustomCommand<TypeGetSourceFiles2Command>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::set<std::string> > source_files;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                source_files.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, GetSourceFiles2);\n\n        Property<Il2CppClass*> type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n        }\n    };\n\n    struct TypeGetPropertyCAttrsCommand : public CustomCommand<TypeGetPropertyCAttrsCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<int32_t> fake_count;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                fake_count.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, GetPropertyCAttrs);\n\n        Property<Il2CppClass*> type;\n        Property<Il2CppClass*> attr_type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n            attr_type.ReadFrom(in);\n        }\n    };\n\n    struct TypeGetFieldCAttrsCommand : public CustomCommand<TypeGetFieldCAttrsCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<int32_t> fake_count;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                fake_count.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, GetFieldCAttrs);\n\n        Property<Il2CppClass*> type;\n        Property<Il2CppClass*> attr_type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n            attr_type.ReadFrom(in);\n        }\n    };\n\n    struct TypeIsAssignableFromCommand : public CustomCommand<TypeIsAssignableFromCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented!\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, IsAssignableFrom);\n\n        Property<Il2CppClass*> type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n        }\n    };\n\n    struct TypeGetCAttrsCommand : public CustomCommand<TypeGetCAttrsCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<int32_t> fake_count;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                fake_count.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, GetCAttrs);\n\n        Property<Il2CppClass*> type;\n        Property<Il2CppClass*> attr_type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n            attr_type.ReadFrom(in);\n        }\n    };\n\n    struct TypeGetValuesCommand : public CustomCommand<TypeGetValuesCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            inline std::vector<Variant> &values()\n            {\n                return _values;\n            }\n\n            void WriteContentTo(Buffer &out) const;\n\n        private:\n\n            std::vector<Variant> _values;\n        };\n\n\n        CUSTOM_COMMAND(Type, GetValues);\n\n        Property<Il2CppClass*> type;\n        Property<std::vector<FieldInfo*> > fields;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n            fields.ReadFrom(in);\n        }\n    };\n\n    struct TypeGetObjectCommand : public CustomCommand<TypeGetObjectCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<Il2CppObject*> object;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                object.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, GetObject);\n\n        Property<Il2CppClass*> type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n        }\n    };\n\n    struct TypeGetFieldsCommand : public CustomCommand<TypeGetFieldsCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            std::vector<FieldInfo*> fields;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                out.WriteInt(fields.size());\n\n                std::vector<FieldInfo*>::const_iterator it = fields.begin();\n                while (it != fields.end())\n                {\n                    FieldInfo *field = *it;\n                    out.WriteFieldId(field);\n                    out.WriteString(field->name);\n                    out.WriteTypeId(il2cpp_class_from_il2cpp_type(field->type));\n                    out.WriteInt(field->type->attrs);\n                    ++it;\n                }\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, GetFields);\n\n        Property<Il2CppClass*> type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n        }\n    };\n\n    struct TypeSetValuesCommand : public CustomCommand<TypeSetValuesCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented!\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, SetValues);\n\n        Property<Il2CppClass*> type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n        }\n    };\n\n    struct TypeGetMethodsCommand : public CustomCommand<TypeGetMethodsCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::vector<const MethodInfo*> > methods;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                methods.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Type, GetMethods);\n\n        Property<Il2CppClass*> type;\n\n        void ReadProperties(Buffer &in)\n        {\n            type.ReadFrom(in);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/vm.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"vm.h\"\n\nusing namespace il2cpp::debugger;\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/commands/vm.h",
    "content": "#pragma once\n\n#include <vector>\n\n#include \"../../common.h\"\n#include \"../protocol-utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct VmSetProtocolVersionCommand : public CustomCommand<VmSetProtocolVersionCommand>\n    {\n        CUSTOM_COMMAND_EMPTY_REPLY(Vm, SetProtocolVersion);\n\n        Property<int32_t> major_version;\n        Property<int32_t> minor_version;\n\n        void ReadProperties(Buffer &in)\n        {\n            major_version.ReadFrom(in);\n            minor_version.ReadFrom(in);\n        }\n    };\n\n    struct VmVersionCommand : public CustomCommand<VmVersionCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::string> name;\n            Property<int32_t> major_version;\n            Property<int32_t> minor_version;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                name.WriteTo(out);\n                major_version.WriteTo(out);\n                minor_version.WriteTo(out);\n            }\n        };\n\n        CUSTOM_COMMAND(Vm, Version);\n    };\n\n    struct VmResumeCommand : public CustomCommand<VmResumeCommand>\n    {\n        CUSTOM_COMMAND_EMPTY_REPLY(Vm, Resume);\n    };\n\n    struct VmDisposeCommand : public CustomCommand<VmDisposeCommand>\n    {\n        CUSTOM_COMMAND_EMPTY_REPLY(Vm, Dispose);\n    };\n\n    struct VmSuspendCommand : public CustomCommand<VmSuspendCommand>\n    {\n        CUSTOM_COMMAND_EMPTY_REPLY(Vm, Suspend);\n    };\n\n    struct VmAllThreadsCommand : public CustomCommand<VmAllThreadsCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<std::vector<Il2CppThread*> > threads;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                threads.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Vm, AllThreads);\n    };\n\n    struct VmExitCommand : public CustomCommand<VmExitCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Property<int32_t> exit_code;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                exit_code.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Vm, Exit);\n    };\n\n    struct VmAbortInvokeCommand : public CustomCommand<VmAbortInvokeCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            void WriteContentTo(Buffer &out) const\n            {\n                IL2CPP_ASSERT(0 && \"Not implemented!\");\n            }\n        };\n\n\n        CUSTOM_COMMAND(Vm, AbortInvoke);\n    };\n\n    struct VmInvokeMethodCommand : public CustomCommand<VmInvokeMethodCommand>\n    {\n        struct Reply : public CustomReply\n        {\n            Reply() : skip_return_value(false) {}\n\n            Property<bool> method_did_not_throw_exception;\n            Property<uint8_t> return_type;\n            Property<int32_t> return_value;\n\n            bool skip_return_value;\n\n            void WriteContentTo(Buffer &out) const\n            {\n                method_did_not_throw_exception.WriteTo(out);\n                return_type.WriteTo(out);\n\n                if (!skip_return_value)\n                    return_value.WriteTo(out);\n            }\n        };\n\n\n        CUSTOM_COMMAND(Vm, InvokeMethod);\n\n        Property<Il2CppThread*> vm_thread;\n        Property<int32_t> flags;\n        Property<const MethodInfo*> method;\n\n        void ReadProperties(Buffer &in)\n        {\n            vm_thread.ReadFrom(in);\n            flags.ReadFrom(in);\n            method.ReadFrom(in);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/events.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"events.h\"\n\n#include \"../../il2cpp-api.h\"\n\n#include \"../agent.h\"\n#include \"../id-bank.h\"\n#include \"../data-buffer.h\"\n\nusing namespace il2cpp::debugger;\n\nVmStartEvent::VmStartEvent()\n{\n}\n\nVmStartEvent::VmStartEvent(Il2CppThread *thread) :\n    Event(thread)\n{\n}\n\nvoid VmStartEvent::WriteContentTo(Buffer &out) const\n{\n    out.WritePtrId(DomainId(il2cpp_domain_get()));\n}\n\nVmDeathEvent::VmDeathEvent()\n{\n}\n\nVmDeathEvent::VmDeathEvent(Il2CppThread *thread) :\n    Event(thread)\n{\n}\n\nvoid VmDeathEvent::WriteContentTo(Buffer &out) const\n{\n}\n\nUserBreakEvent::UserBreakEvent()\n{\n}\n\nUserBreakEvent::UserBreakEvent(Il2CppThread *thread) :\n    Event(thread)\n{\n}\n\nvoid UserBreakEvent::WriteContentTo(Buffer &out) const\n{\n}\n\nAppDomainCreateEvent::AppDomainCreateEvent(Il2CppThread *thread) :\n    Event(thread)\n{\n}\n\nvoid AppDomainCreateEvent::WriteContentTo(Buffer &out) const\n{\n    domain.WriteTo(out);\n}\n\nAssemblyLoadEvent::AssemblyLoadEvent(Il2CppThread *thread) :\n    Event(thread)\n{\n}\n\nvoid AssemblyLoadEvent::WriteContentTo(Buffer &out) const\n{\n    assembly.WriteTo(out);\n}\n\nTypeLoadEvent::TypeLoadEvent(Il2CppThread *thread) :\n    Event(thread)\n{\n}\n\nvoid TypeLoadEvent::WriteContentTo(Buffer &out) const\n{\n    type.WriteTo(out);\n}\n\nBreakPointEvent::BreakPointEvent()\n{\n}\n\nBreakPointEvent::BreakPointEvent(Il2CppThread *thread) :\n    Event(thread)\n{\n}\n\nvoid BreakPointEvent::WriteContentTo(Buffer &out) const\n{\n    method.WriteTo(out);\n    il_offset.WriteTo(out);\n}\n\nStepEvent::StepEvent()\n{\n}\n\nStepEvent::StepEvent(Il2CppThread *thread) :\n    Event(thread)\n{\n}\n\nvoid StepEvent::WriteContentTo(Buffer &out) const\n{\n    method.WriteTo(out);\n    il_offset.WriteTo(out);\n}\n\nThreadStartEvent::ThreadStartEvent(Il2CppThread *thread) :\n    Event(thread)\n{\n}\n\nvoid ThreadStartEvent::WriteContentTo(Buffer &out) const\n{\n}\n\nThreadDeathEvent::ThreadDeathEvent(Il2CppThread *thread) :\n    Event(thread)\n{\n}\n\nvoid ThreadDeathEvent::WriteContentTo(Buffer &out) const\n{\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/events.h",
    "content": "#pragma once\n\n#include \"../common.h\"\n#include \"../meta.h\"\n#include \"protocol.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    class Buffer;\n    class Command;\n\n    class VmStartEvent : public Event\n    {\n    public:\n\n        VmStartEvent();\n        explicit VmStartEvent(Il2CppThread *thread);\n\n        inline EventKind kind() const\n        {\n            return kEventKindVmStart;\n        }\n\n    protected:\n\n        void WriteContentTo(Buffer &out) const;\n\n        DISALLOW_COPY(VmStartEvent);\n    };\n\n    class VmDeathEvent : public Event\n    {\n    public:\n\n        VmDeathEvent();\n        explicit VmDeathEvent(Il2CppThread *thread);\n\n        inline EventKind kind() const\n        {\n            return kEventKindVmDeath;\n        }\n\n    protected:\n\n        void WriteContentTo(Buffer &out) const;\n\n        DISALLOW_COPY(VmDeathEvent);\n    };\n\n    class UserBreakEvent : public Event\n    {\n    public:\n\n        UserBreakEvent();\n        explicit UserBreakEvent(Il2CppThread *thread);\n\n        inline EventKind kind() const\n        {\n            return kEventKindUserBreak;\n        }\n\n    protected:\n\n        void WriteContentTo(Buffer &out) const;\n\n        DISALLOW_COPY(UserBreakEvent);\n    };\n\n    class AppDomainCreateEvent : public Event\n    {\n    public:\n\n        AppDomainCreateEvent();\n        explicit AppDomainCreateEvent(Il2CppThread *thread);\n\n        inline EventKind kind() const\n        {\n            return kEventKindAppDomainCreate;\n        }\n\n        Property<Il2CppDomain*> domain;\n\n    protected:\n\n        void WriteContentTo(Buffer &out) const;\n\n        DISALLOW_COPY(AppDomainCreateEvent);\n    };\n\n    class AssemblyLoadEvent : public Event\n    {\n    public:\n\n        AssemblyLoadEvent();\n        explicit AssemblyLoadEvent(Il2CppThread *thread);\n\n        inline EventKind kind() const\n        {\n            return kEventKindAssemblyLoad;\n        }\n\n        Property<Il2CppAssembly*> assembly;\n\n    protected:\n\n        void WriteContentTo(Buffer &out) const;\n\n        DISALLOW_COPY(AssemblyLoadEvent);\n    };\n\n    class TypeLoadEvent : public Event\n    {\n    public:\n\n        TypeLoadEvent();\n        explicit TypeLoadEvent(Il2CppThread *thread);\n\n        inline EventKind kind() const\n        {\n            return kEventKindTypeLoad;\n        }\n\n        Property<Il2CppClass*> type;\n\n    protected:\n\n        void WriteContentTo(Buffer &out) const;\n\n        DISALLOW_COPY(TypeLoadEvent);\n    };\n\n    class BreakPointEvent : public Event\n    {\n    public:\n\n        BreakPointEvent();\n        explicit BreakPointEvent(Il2CppThread *thread);\n\n        inline EventKind kind() const\n        {\n            return kEventKindBreakpoint;\n        }\n\n        Property<const MethodInfo*> method;\n        Property<uint64_t> il_offset;\n\n    protected:\n\n        void WriteContentTo(Buffer &out) const;\n\n        DISALLOW_COPY(BreakPointEvent);\n    };\n\n    class StepEvent : public Event\n    {\n    public:\n\n        StepEvent();\n        explicit StepEvent(Il2CppThread *thread);\n\n        inline EventKind kind() const\n        {\n            return kEventKindStep;\n        }\n\n        Property<const MethodInfo*> method;\n        Property<uint64_t> il_offset;\n\n    protected:\n\n        void WriteContentTo(Buffer &out) const;\n\n        DISALLOW_COPY(StepEvent);\n    };\n\n\n    class ThreadStartEvent : public Event\n    {\n    public:\n\n        ThreadStartEvent();\n        explicit ThreadStartEvent(Il2CppThread *thread);\n\n        inline EventKind kind() const\n        {\n            return kEventKindThreadStart;\n        }\n\n    protected:\n\n        void WriteContentTo(Buffer &out) const;\n\n        DISALLOW_COPY(ThreadStartEvent);\n    };\n\n\n    class ThreadDeathEvent : public Event\n    {\n    public:\n\n        ThreadDeathEvent();\n        explicit ThreadDeathEvent(Il2CppThread *thread);\n\n        inline EventKind kind() const\n        {\n            return kEventKindThreadDeath;\n        }\n\n    protected:\n\n        void WriteContentTo(Buffer &out) const;\n\n        DISALLOW_COPY(ThreadDeathEvent);\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/globals.h",
    "content": "#pragma once\n\n#include \"../common.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    enum CommandSet\n    {\n        kCommandSetInternalError = -1,\n        kCommandSetVm = 1,\n        kCommandSetObjectRef = 9,\n        kCommandSetStringRef = 10,\n        kCommandSetThread = 11,\n        kCommandSetArrayRef = 13,\n        kCommandSetEventRequest = 15,\n        kCommandSetStackFrame = 16,\n        kCommandSetAppDomain = 20,\n        kCommandSetAssembly = 21,\n        kCommandSetMethod = 22,\n        kCommandSetType = 23,\n        kCommandSetModule = 24,\n        kCommandSetEvent = 64\n    };\n\n    enum CommandSetInternalError\n    {\n        kCommandSetInternalErrorNotImplemented = 1\n    };\n\n    enum CommandSetVm\n    {\n        kCommandSetVmVersion = 1,\n        kCommandSetVmAllThreads = 2,\n        kCommandSetVmSuspend = 3,\n        kCommandSetVmResume = 4,\n        kCommandSetVmExit = 5,\n        kCommandSetVmDispose = 6,\n        kCommandSetVmInvokeMethod = 7,\n        kCommandSetVmSetProtocolVersion = 8,\n        kCommandSetVmAbortInvoke = 9\n    };\n\n    enum CommandSetThread\n    {\n        kCommandSetThreadGetFrameInfo = 1,\n        kCommandSetThreadGetName = 2,\n        kCommandSetThreadGetState = 3,\n        kCommandSetThreadGetInfo = 4,\n        kCommandSetThreadGetId = 5\n    };\n\n    enum CommandSetEventRequest\n    {\n        kCommandSetEventRequestSet = 1,\n        kCommandSetEventRequestClear = 2,\n        kCommandSetEventRequestClearAllBreakpoints = 3\n    };\n\n    enum CommandSetEvent\n    {\n        kCommandSetEventComposite = 100\n    };\n\n    enum CommandSetAppDomain\n    {\n        kCommandSetAppDomainGetRootDomain = 1,\n        kCommandSetAppDomainGetFriendlyName = 2,\n        kCommandSetAppDomainGetAssemblies = 3,\n        kCommandSetAppDomainGetEntryAssembly = 4,\n        kCommandSetAppDomainCreateString = 5,\n        kCommandSetAppDomainGetCorlib = 6,\n        kCommandSetAppDomainCreateBoxedValue = 7,\n    };\n\n    enum CommandSetAssembly\n    {\n        kCommandSetAssemblyGetLocation = 1,\n        kCommandSetAssemblyGetEntryPoint = 2,\n        kCommandSetAssemblyGetManifestModule = 3,\n        kCommandSetAssemblyGetObject = 4,\n        kCommandSetAssemblyGetType = 5,\n        kCommandSetAssemblyGetName = 6\n    };\n\n    enum CommandSetModule\n    {\n        kCommandSetModuleGetInfo = 1,\n    };\n\n    enum CommandSetMethod\n    {\n        kCommandSetMethodGetName = 1,\n        kCommandSetMethodGetDeclaringType = 2,\n        kCommandSetMethodGetDebugInfo = 3,\n        kCommandSetMethodGetParamInfo = 4,\n        kCommandSetMethodGetLocalsInfo = 5,\n        kCommandSetMethodGetInfo = 6,\n        kCommandSetMethodGetBody = 7,\n        kCommandSetMethodResolveToken = 8,\n    };\n\n    enum CommandSetType\n    {\n        kCommandSetTypeGetInfo = 1,\n        kCommandSetTypeGetMethods = 2,\n        kCommandSetTypeGetFields = 3,\n        kCommandSetTypeGetValues = 4,\n        kCommandSetTypeGetObject = 5,\n        kCommandSetTypeGetSourceFiles = 6,\n        kCommandSetTypeSetValues = 7,\n        kCommandSetTypeIsAssignableFrom = 8,\n        kCommandSetTypeGetProperties = 9,\n        kCommandSetTypeGetCAttrs = 10,\n        kCommandSetTypeGetFieldCAttrs = 11,\n        kCommandSetTypeGetPropertyCAttrs = 12,\n        kCommandSetTypeGetSourceFiles2 = 13,\n    };\n\n    enum CommandSetStackFrame\n    {\n        kCommandSetStackFrameGetValues = 1,\n        kCommandSetStackFrameGetThis = 2,\n        kCommandSetStackFrameSetValues = 3\n    };\n\n    enum CommandSetArrayRef\n    {\n        kCommandSetArrayRefGetLength = 1,\n        kCommandSetArrayRefGetValues = 2,\n        kCommandSetArrayRefSetValues = 3,\n    };\n\n    enum CommandSetStringRef\n    {\n        kCommandSetStringRefGetValue = 1,\n    };\n\n    enum CommandSetObjectRef\n    {\n        kCommandSetObjectRefGetType = 1,\n        kCommandSetObjectRefGetValues = 2,\n        kCommandSetObjectRefIsCollected = 3,\n        kCommandSetObjectRefGetAddress = 4,\n        kCommandSetObjectRefGetDomain = 5,\n        kCommandSetObjectRefSetValues = 6\n    };\n\n    enum ErrorCode\n    {\n        kErrorCodeNone = 0,\n        kErrorCodeInvalidObject = 20,\n        kErrorCodeInvalidFieldId = 25,\n        kErrorCodeInvalidFrameId = 30,\n        kErrorCodeNotImplemented = 100,\n        kErrorCodeNotSuspended = 101,\n        kErrorCodeInvalidArgument = 102,\n        kErrorCodeUnloaded = 103,\n        kErrorCodeNoInvocation = 104,\n        kErrorCodeAbsentInformation = 105\n    };\n\n    enum EventKind\n    {\n        kEventKindVmStart = 0,\n        kEventKindVmDeath = 1,\n        kEventKindThreadStart = 2,\n        kEventKindThreadDeath = 3,\n        kEventKindAppDomainCreate = 4,\n        kEventKindAppDomainUnload = 5,\n        kEventKindMethodEntry = 6,\n        kEventKindMethodExit = 7,\n        kEventKindAssemblyLoad = 8,\n        kEventKindAssemblyUnload = 9,\n        kEventKindBreakpoint = 10,\n        kEventKindStep = 11,\n        kEventKindTypeLoad = 12,\n        kEventKindException = 13,\n        kEventKindKeepAlive = 14,\n        kEventKindUserBreak = 15,\n        kEventKindUserLog = 16,\n        kEventKindInvalid = -1\n    };\n\n    enum ModifierKind\n    {\n        kModifierKindInvalid = -1,\n        kModifierKindCount = 1,\n        kModifierKindThreadOnly = 3,\n        kModifierKindLocationOnly = 7,\n        kModifierKindExceptionOnly = 8,\n        kModifierKindStep = 10,\n        kModifierKindAssemblyOnly = 11\n    };\n\n    enum StepDepthKind\n    {\n        kStepDepthKindInto = 0,\n        kStepDepthKindOver = 1,\n        kStepDepthKindOut = 2\n    };\n\n    enum StepSizeKind\n    {\n        kStepSizeKindMin = 0,\n        kStepSizeKindLine = 1\n    };\n\n    struct Modifier\n    {\n        ModifierKind kind;\n        union\n        {\n            int count; // kModifierKindCount\n            Il2CppThread *thread; // kModifierKindThreadOnly\n            Il2CppClass *exc_class; // kModifierKindExceptionOnly\n            Il2CppAssembly **assemblies; // kModifierKindAssemblyOnly\n        } data;\n        bool caught;\n        bool uncaught; // kModifierKindExceptionOnly\n\n        Modifier() :\n            kind(kModifierKindInvalid),\n            caught(false),\n            uncaught(false)\n        {\n            data.count = 0;\n            data.thread = 0;\n            data.exc_class = 0;\n            data.assemblies = 0;\n        }\n\n        ~Modifier()\n        {\n            if (kind == kModifierKindAssemblyOnly && data.assemblies != 0)\n            {\n                delete[] data.assemblies;\n                data.assemblies = 0;\n            }\n        }\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/protocol-utils.h",
    "content": "#pragma once\n\n#include <string>\n\n#include \"../common.h\"\n#include \"../meta.h\"\n#include \"protocol.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    template<typename Cmd>\n    struct CustomCommand : public Command\n    {\n        explicit CustomCommand(int32_t id) :\n            Command(Cmd::SetKind, Cmd::CommandKind, id)\n        {\n        }\n    };\n\n#define _CUSTOM_COMMAND(TSet, TCommand) \\\n    public: \\\n        static const CommandSet SetKind = kCommandSet ## TSet; \\\n        static const int32_t CommandKind = kCommandSet ## TSet ## TCommand; \\\n        inline static Command *Factory(Header &header, Buffer &in) \\\n        { \\\n            Command * command = new TSet ## TCommand ## Command(header.id()); \\\n            command->ReadProperties(in); \\\n            return command; \\\n        } \\\n        explicit TSet ## TCommand ## Command(int32_t id) : \\\n            CustomCommand(id) {}\n\n#define CUSTOM_COMMAND(TSet, TCommand) \\\n    _CUSTOM_COMMAND(TSet, TCommand) \\\n    TSet ## TCommand ## Command::Reply * reply() const \\\n    { \\\n        TSet ## TCommand ## Command::Reply *reply = new TSet ## TCommand ## Command::Reply(); \\\n        reply->command(this); \\\n        return reply; \\\n    }\n\n#define CUSTOM_COMMAND_EMPTY_REPLY(TSet, TCommand) \\\n    _CUSTOM_COMMAND(TSet, TCommand) \\\n    struct Reply : public EmptyReply \\\n    { \\\n        explicit Reply(const Command *command) : EmptyReply(command) {} \\\n    }; \\\n    TSet ## TCommand ## Command::Reply * reply() const \\\n    { \\\n        return new TSet ## TCommand ## Command::Reply(this); \\\n    }\n\n    struct CustomReply : public Reply\n    {\n        CustomReply() :\n            Reply(NULL)\n        {\n        }\n\n        inline void command(const Command *v)\n        {\n            _command = v;\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/protocol.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"protocol.h\"\n\n#include \"../../il2cpp-api.h\"\n\n#include \"../data-buffer.h\"\n#include \"../id-bank.h\"\n#include \"../transport.h\"\n#include \"../agent.h\"\n\n#include \"utils.h\"\n\n#include \"commands/type.h\"\n#include \"commands/vm.h\"\n#include \"commands/app-domain.h\"\n#include \"commands/array-ref.h\"\n#include \"commands/assembly.h\"\n#include \"commands/event.h\"\n#include \"commands/event-request.h\"\n#include \"commands/internal-error.h\"\n#include \"commands/method.h\"\n#include \"commands/module.h\"\n#include \"commands/object-ref.h\"\n#include \"commands/stack-frame.h\"\n#include \"commands/string-ref.h\"\n#include \"commands/thread.h\"\n\nusing namespace il2cpp::debugger;\n\nHeader::Header(HeaderType type) :\n    _packet_size(0),\n    _id(0),\n    _flags(type),\n    _data(0)\n{\n}\n\nvoid Header::ReadHeader(Header &header, Buffer &in)\n{\n    const int32_t length = in.ReadInt();\n    const int32_t id = in.ReadInt();\n    const HeaderType type = in.ReadEnum<HeaderType>();\n    const uint16_t data = (in.ReadByte() << 8) | in.ReadByte();\n\n    IL2CPP_ASSERT(header.type() == type && \"Incompatible Header types: incoming header is not of the expected type\");\n\n    header.packet_size(length);\n    header.id(id);\n\n    if (header.is_command())\n    {\n        header.set((CommandSet)((data >> 8) & 0xFF));\n        header.command(data & 0xFF);\n    }\n    else\n    {\n        header.error_code((ErrorCode)data);\n    }\n}\n\nvoid Header::WriteTo(Buffer &out) const\n{\n    out.WriteInt(packet_size());\n    out.WriteInt(id());\n    out.WriteByte(_flags);\n    out.WriteByte((_data >> 8) & 0xFF);\n    out.WriteByte(_data & 0xFF);\n}\n\nCommand::Command(CommandSet set, int32_t command, int32_t id) :\n    _id(id),\n    _set(set),\n    _command(command)\n{\n}\n\nCommand::~Command()\n{\n}\n\nvoid Command::ReadProperties(Buffer &in)\n{\n}\n\nvoid Command::WriteTo(Buffer &out) const\n{\n    out.Seek(Header::Length);\n\n    WriteContentTo(out);\n\n    Header header(kHeaderTypeCommand);\n\n    header.packet_size(out.length());\n    header.id(_id);\n    header.set(set());\n    header.command(command());\n\n    out.Seek(0);\n    header.WriteTo(out);\n    out.Seek(header.packet_size());\n}\n\nvoid Command::WriteContentTo(Buffer &out) const\n{\n}\n\nEvent::Event() :\n    _thread(il2cpp_thread_current())\n{\n}\n\nEvent::Event(Il2CppThread *thread) :\n    _thread(thread)\n{\n}\n\nEvent::~Event()\n{\n}\n\nvoid Event::WriteTo(Buffer &out, int32_t req_id) const\n{\n    out.WriteByte(kind());\n    out.WriteInt(req_id);\n    out.WritePtrId(ObjectId((Il2CppObject*)_thread));\n\n    WriteContentTo(out);\n}\n\nvoid Event::WriteContentTo(Buffer &out) const\n{\n}\n\nReply::Reply(const Command *command) :\n    _command(command),\n    _error_code(kErrorCodeNone)\n{\n}\n\nReply::~Reply()\n{\n}\n\nvoid Reply::WriteTo(Buffer &out) const\n{\n    // Reserve space for the header\n    out.Seek(Header::Length);\n\n    if (error_code() == kErrorCodeNone)\n        WriteContentTo(out);\n    else\n        LOG(\"Reply returned an error: \" << error_code());\n\n    Header header(kHeaderTypeReply);\n\n    header.packet_size(out.length());\n    header.id(_command ? _command->id() : 0);\n    header.error_code(error_code());\n\n    out.Seek(0);\n    header.WriteTo(out);\n    out.Seek(header.packet_size());\n}\n\nvoid Reply::WriteContentTo(Buffer &out) const\n{\n}\n\nEmptyReply::EmptyReply(const Command *command) :\n    Reply(command)\n{\n}\n\nProtocol::Protocol() :\n    _minor_version(Protocol::MinorVersion),\n    _major_version(Protocol::MajorVersion),\n    _transport(0)\n{\n}\n\nProtocol::~Protocol()\n{\n    _transport = 0;\n}\n\nvoid Protocol::Setup(IDataTransport *transport)\n{\n    IL2CPP_ASSERT(transport != NULL && \"Invalid data transport\");\n\n    _transport = transport;\n\n    RegisterCommand<VmSetProtocolVersionCommand>();\n    RegisterCommand<VmVersionCommand>();\n    RegisterCommand<VmResumeCommand>();\n    RegisterCommand<VmAllThreadsCommand>();\n    RegisterCommand<VmSuspendCommand>();\n    RegisterCommand<VmDisposeCommand>();\n    RegisterCommand<VmAbortInvokeCommand>();\n    RegisterCommand<VmExitCommand>();\n    RegisterCommand<VmInvokeMethodCommand>();\n\n    RegisterCommand<TypeGetInfoCommand>();\n    RegisterCommand<TypeGetSourceFilesCommand>();\n    RegisterCommand<TypeGetPropertiesCommand>();\n    RegisterCommand<TypeGetSourceFiles2Command>();\n    RegisterCommand<TypeGetPropertyCAttrsCommand>();\n    RegisterCommand<TypeGetFieldCAttrsCommand>();\n    RegisterCommand<TypeIsAssignableFromCommand>();\n    RegisterCommand<TypeGetCAttrsCommand>();\n    RegisterCommand<TypeGetValuesCommand>();\n    RegisterCommand<TypeGetObjectCommand>();\n    RegisterCommand<TypeGetFieldsCommand>();\n    RegisterCommand<TypeSetValuesCommand>();\n    RegisterCommand<TypeGetMethodsCommand>();\n\n    RegisterCommand<ThreadGetIdCommand>();\n    RegisterCommand<ThreadGetNameCommand>();\n    RegisterCommand<ThreadGetInfoCommand>();\n    RegisterCommand<ThreadGetFrameInfoCommand>();\n    RegisterCommand<ThreadGetStateCommand>();\n\n    RegisterCommand<StringRefGetValueCommand>();\n\n    RegisterCommand<StackFrameGetValuesCommand>();\n    RegisterCommand<StackFrameSetValuesCommand>();\n    RegisterCommand<StackFrameGetThisCommand>();\n\n    RegisterCommand<ObjectRefGetTypeCommand>();\n    RegisterCommand<ObjectRefGetDomainCommand>();\n    RegisterCommand<ObjectRefIsCollectedCommand>();\n    RegisterCommand<ObjectRefSetValuesCommand>();\n    RegisterCommand<ObjectRefGetAddressCommand>();\n    RegisterCommand<ObjectRefGetValuesCommand>();\n\n    RegisterCommand<ModuleGetInfoCommand>();\n\n    RegisterCommand<MethodGetDeclaringTypeCommand>();\n    RegisterCommand<MethodGetDebugInfoCommand>();\n    RegisterCommand<MethodGetNameCommand>();\n    RegisterCommand<MethodGetParamInfoCommand>();\n    RegisterCommand<MethodGetBodyCommand>();\n    RegisterCommand<MethodGetLocalsInfoCommand>();\n    RegisterCommand<MethodGetInfoCommand>();\n    RegisterCommand<MethodResolveTokenCommand>();\n\n    RegisterCommand<InternalErrorNotImplementedCommand>();\n\n    RegisterCommand<EventCompositeCommand>();\n\n    RegisterCommand<EventRequestSetCommand>();\n    RegisterCommand<EventRequestClearCommand>();\n    RegisterCommand<EventRequestClearAllBreakpointsCommand>();\n\n    RegisterCommand<AssemblyGetTypeCommand>();\n    RegisterCommand<AssemblyGetObjectCommand>();\n    RegisterCommand<AssemblyGetEntryPointCommand>();\n    RegisterCommand<AssemblyGetManifestModuleCommand>();\n    RegisterCommand<AssemblyGetNameCommand>();\n    RegisterCommand<AssemblyGetLocationCommand>();\n\n    RegisterCommand<ArrayRefGetValuesCommand>();\n    RegisterCommand<ArrayRefGetLengthCommand>();\n    RegisterCommand<ArrayRefSetValuesCommand>();\n\n    RegisterCommand<AppDomainGetRootDomainCommand>();\n    RegisterCommand<AppDomainGetCorlibCommand>();\n    RegisterCommand<AppDomainGetFriendlyNameCommand>();\n    RegisterCommand<AppDomainCreateStringCommand>();\n    RegisterCommand<AppDomainGetEntryAssemblyCommand>();\n    RegisterCommand<AppDomainCreateBoxedValueCommand>();\n    RegisterCommand<AppDomainGetAssembliesCommand>();\n}\n\nCommand *Protocol::CreateCommand(Header &header, Buffer &in) const\n{\n    IL2CPP_ASSERT(header.is_command() && \"CommandFactory::Create can only be used with `command` headers.\");\n\n    const CommandUId uid = CommandIdFor(header.set(), header.command());\n    std::map<CommandUId, CommandGenerator>::const_iterator it = _command_factories.find(uid);\n\n    if (it == _command_factories.end())\n    {\n        LOG(\"Command not found: \" << command_set_to_string(header.set()) << \"+\" << command_to_string(header.set(), header.command()) << \"(\" << header.set() << \":\" << header.command() << \")\");\n        return NULL;\n    }\n\n    return it->second(header, in);\n}\n\nProtocol::CommandUId Protocol::CommandIdFor(Header &header) const\n{\n    return CommandIdFor(header.set(), header.command());\n}\n\nProtocol::CommandUId Protocol::CommandIdFor(CommandSet set, int32_t command) const\n{\n    return ((((int32_t)set) & 0xFF) << 8) | (command & 0xFF);\n}\n\nbool Protocol::Handshake()\n{\n    const char *handshake_msg = \"DWP-Handshake\";\n    const size_t msg_length = strlen(handshake_msg);\n\n    Buffer in(128);\n    Buffer out(128);\n\n    out.WriteData((const uint8_t*)handshake_msg, msg_length);\n\n    int32_t sent_bytes = _transport->Send(out.raw(), out.length());\n    if (sent_bytes != out.length())\n    {\n        LOG(\"DWP handshake failed.\");\n        return false;\n    }\n\n    int32_t received_bytes = _transport->Recv(in.raw(), msg_length);\n    if ((received_bytes != msg_length) || (memcmp(in.raw(), handshake_msg, msg_length != 0)))\n    {\n        LOG(\"DWP handshake failed.\");\n        return false;\n    }\n\n    return true;\n}\n\nconst Command *Protocol::WaitForCommand()\n{\n    // In/Out buffers are allocated at every iteration. This needs to be improved\n    Buffer in(Header::Length);\n\n    int32_t read_bytes = _transport->Recv(in.raw(), Header::Length);\n    if (read_bytes != Header::Length)\n    {\n        LOG(\"Couldn't parse the header. Expecting \" << Header::Length << \" bytes, but got \" << read_bytes << \". Shutting down.\");\n        return NULL;\n    }\n\n    in.MarkReadRaw(read_bytes);\n\n    Header header(kHeaderTypeCommand);\n\n    Header::ReadHeader(header, in);\n\n    LOG(\"Received command \" << command_set_to_string(header.set()) << \" \" << command_to_string(header.set(), header.command()) << \"(\" << header.command() << \"), id=\" << header.id() << \".\");\n\n    if (header.message_size() > 0)\n    {\n        in.Reset(header.message_size());\n\n        if (is_disposed())\n            return NULL;\n\n        int32_t received = _transport->Recv(in.raw(), header.message_size());\n        if (received != header.message_size())\n        {\n            LOG(\"Expecting a command of \" << header.message_size() << \" bytes. Got \" << received << \". Shutting down.\");\n            exit(1);\n        }\n\n        in.MarkReadRaw(received);\n    }\n\n    Command *command = CreateCommand(header, in);\n    if (command == NULL)\n    {\n        LOG(\"Not implemented command\");\n        command = new InternalErrorNotImplementedCommand(header.id());\n    }\n\n    return command;\n}\n\nbool Protocol::SendReply(const Reply *reply)\n{\n    // For now, every reply has its own 'out' buffer as long as SendReply might\n    // be called from different threads. This needs to be improved.\n\n    if (is_disposed())\n    {\n        LOG(\"The protocol was disposed. Reply can not be sent.\");\n        return false;\n    }\n\n    Buffer out(128);\n\n    reply->WriteTo(out);\n\n    if (!_transport->Send(out.raw(), out.length()))\n    {\n        LOG(\"The socket was shut down while sending the header\");\n        return false;\n    }\n\n    return true;\n}\n\nbool Protocol::SendCommand(const Command *command)\n{\n    // For now, every reply has its own 'out' buffer as long as SendReply might\n    // be called from different threads. This needs to be improved.\n\n    if (is_disposed())\n    {\n        LOG(\"The protocol was disposed. Command can not be sent.\");\n        return false;\n    }\n\n    Buffer out(128);\n\n    command->WriteTo(out);\n\n    if (!_transport->Send(out.raw(), out.length()))\n    {\n        LOG(\"The socket was shut down while sending the header\");\n        return false;\n    }\n\n    return true;\n}\n\nvoid Protocol::Dispose()\n{\n    if (_transport == 0)\n        return;\n\n    _transport->Close();\n    _transport = 0;\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/protocol.h",
    "content": "#pragma once\n\n#include \"../common.h\"\n\n#include <map>\n\n#include \"globals.h\"\n#include \"utils.h\"\n\nstruct Il2CppThread;\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    class Reply;\n    class Buffer;\n    class Command;\n    class IDataTransport;\n\n    enum HeaderType\n    {\n        kHeaderTypeCommand = 0x00,\n        kHeaderTypeReply = 0x80\n    };\n\n    class Header\n    {\n    public:\n\n        static const int32_t Length = 11;\n\n        explicit Header(HeaderType type);\n\n        inline HeaderType type() const\n        {\n            return (HeaderType)_flags;\n        }\n\n        inline bool is_command() const\n        {\n            return _flags == kHeaderTypeCommand;\n        }\n\n        inline bool is_reply() const\n        {\n            return _flags == kHeaderTypeReply;\n        }\n\n        inline size_t message_size() const\n        {\n            return _packet_size - Header::Length;\n        }\n\n        inline int32_t id() const\n        {\n            return _id;\n        }\n\n        inline void id(int32_t v)\n        {\n            _id = v;\n        }\n\n        inline size_t packet_size() const\n        {\n            return _packet_size;\n        }\n\n        inline void packet_size(size_t v)\n        {\n            _packet_size = v;\n        }\n\n        inline CommandSet set() const\n        {\n            IL2CPP_ASSERT(is_command() && \"Header::set() can only be invoked on `Command` headers\");\n\n            return (CommandSet)((_data >> 8) & 0xFF);\n        }\n\n        inline void set(CommandSet v)\n        {\n            IL2CPP_ASSERT(is_command() && \"Header::set(CommandSet) can only be invoked on `Command` headers\");\n\n            _data = (v << 8) | (_data & 0xFF);\n        }\n\n        inline int32_t command() const\n        {\n            IL2CPP_ASSERT(is_command() && \"Header::command() can only be invoked on `Command` headers\");\n\n            return _data & 0xFF;\n        }\n\n        inline void command(int32_t v)\n        {\n            IL2CPP_ASSERT(is_command() && \"Header::command(int32_t) can only be invoked on `Command` headers\");\n\n            _data = (_data & 0xFF00) | (v & 0xFF);\n        }\n\n        inline ErrorCode error_code() const\n        {\n            IL2CPP_ASSERT(is_reply() && \"Header::error_code() can only be invoked on `Reply` headers\");\n\n            return (ErrorCode)_data;\n        }\n\n        inline void error_code(ErrorCode v)\n        {\n            IL2CPP_ASSERT(is_reply() && \"Header::error_code(ErrorCode) can only be invoked on `Command` headers\");\n\n            _data = v;\n        }\n\n        static void ReadHeader(Header & header, Buffer & in);\n\n        void WriteTo(Buffer &out) const;\n\n    private:\n\n        size_t _packet_size;\n        int32_t _id;\n        uint8_t _flags;\n        uint16_t _data;\n\n        DISALLOW_COPY(Header);\n    };\n\n#define PROTOCOL_COMMAND(TSet, TCommand) \\\n    public: \\\n        static const CommandSet SetKind = kCommandSet ## TSet; \\\n        static const int32_t CommandKind = kCommandSet ## TSet ## TCommand; \\\n        inline static Command *Factory(Header &header, Buffer &in) \\\n        { \\\n            Command * command = new TSet ## TCommand ## Command(header.id()); \\\n            command->ReadProperties(in); \\\n            return command; \\\n        }\n\n    class Command\n    {\n    public:\n\n        Command(CommandSet set, int32_t command, int32_t id);\n        virtual ~Command();\n\n        inline CommandSet set() const\n        {\n            return _set;\n        }\n\n        inline int32_t command() const\n        {\n            return _command;\n        }\n\n        inline int32_t id() const\n        {\n            return _id;\n        }\n\n        inline bool is(CommandSet set, int32_t command) const\n        {\n            return _set == set && _command == command;\n        }\n\n        void WriteTo(Buffer &out) const;\n\n        virtual void ReadProperties(Buffer & in);\n\n    protected:\n\n        virtual void WriteContentTo(Buffer &out) const;\n\n        int32_t _id;\n        CommandSet _set;\n        int32_t _command;\n\n        DISALLOW_COPY(Command);\n    };\n\n    class Reply\n    {\n    public:\n\n        explicit Reply(const Command *command);\n        virtual ~Reply();\n\n        inline const Command *command() const\n        {\n            return _command;\n        }\n\n        inline ErrorCode error_code() const\n        {\n            return _error_code;\n        }\n\n        inline void error_code(ErrorCode code)\n        {\n            _error_code = code;\n        }\n\n        void WriteTo(Buffer &out) const;\n\n    protected:\n\n        virtual void WriteContentTo(Buffer &out) const;\n\n        const Command *_command;\n        ErrorCode _error_code;\n\n        DISALLOW_COPY(Reply);\n    };\n\n    class EmptyReply : public Reply\n    {\n    public:\n\n        explicit EmptyReply(const Command *command);\n\n        DISALLOW_COPY(EmptyReply);\n    };\n\n    class Event\n    {\n    public:\n\n        Event();\n        explicit Event(Il2CppThread *thread);\n        virtual ~Event();\n\n        inline virtual EventKind kind() const\n        {\n            return kEventKindInvalid;\n        }\n\n        inline Il2CppThread *thread() const\n        {\n            return _thread;\n        }\n\n        inline void thread(Il2CppThread *v)\n        {\n            _thread = v;\n        }\n\n        void WriteTo(Buffer &out, int32_t req_id) const;\n\n    protected:\n\n        virtual void WriteContentTo(Buffer &out) const;\n\n        Il2CppThread *_thread;\n\n        DISALLOW_COPY(Event);\n    };\n\n    class Protocol\n    {\n        typedef uint16_t CommandUId;\n        typedef Command* (*CommandGenerator)(Header &header, Buffer &in);\n\n    public:\n\n        static const int32_t MajorVersion = 2;\n        static const int32_t MinorVersion = 1;\n\n        Protocol();\n        ~Protocol();\n\n        inline IDataTransport *transport()\n        {\n            return _transport;\n        }\n\n        inline int32_t major_version() const\n        {\n            return _major_version;\n        }\n\n        inline void major_version(int32_t v)\n        {\n            _major_version = v;\n        }\n\n        inline int32_t minor_version() const\n        {\n            return _minor_version;\n        }\n\n        inline void minor_version(int32_t v)\n        {\n            _minor_version = v;\n        }\n\n        inline bool is_disposed() const\n        {\n            return _transport == 0;\n        }\n\n        void Setup(IDataTransport *transport);\n        void Dispose();\n\n        bool Handshake();\n\n        // Note WaitForCommand gives ownership of the Command object away for now.\n        // It is responsability of the invoker to delete the Command when done.\n        const Command  *WaitForCommand();\n        bool SendReply(const Reply *reply);\n        bool SendCommand(const Command *command);\n\n    private:\n\n        template<typename TCommand>\n        inline void RegisterCommand()\n        {\n            LOG(\"Registering \" << command_to_string(TCommand::SetKind, TCommand::CommandKind) << \" with id: \" << CommandIdFor(TCommand::SetKind, TCommand::CommandKind));\n            _command_factories[CommandIdFor(TCommand::SetKind, TCommand::CommandKind)] = &TCommand::Factory;\n        }\n\n        Command *CreateCommand(Header & header, Buffer & in) const;\n        CommandUId CommandIdFor(Header &header) const;\n        CommandUId CommandIdFor(CommandSet set, int32_t command) const;\n\n        int32_t _major_version;\n        int32_t _minor_version;\n        IDataTransport *_transport;\n        std::map<CommandUId, CommandGenerator> _command_factories;\n\n        DISALLOW_COPY(Protocol);\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/utils.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"utils.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const char* command_set_to_string(CommandSet command_set)\n    {\n        switch (command_set)\n        {\n            case kCommandSetInternalError:  return \"INTERNAL_ERROR\";\n            case kCommandSetVm:             return \"VM\";\n            case kCommandSetObjectRef:      return \"OBJECT_REF\";\n            case kCommandSetStringRef:      return \"STRING_REF\";\n            case kCommandSetThread:         return \"THREAD\";\n            case kCommandSetArrayRef:       return \"ARRAY_REF\";\n            case kCommandSetEventRequest:   return \"EVENT_REQUEST\";\n            case kCommandSetStackFrame:     return \"STACK_FRAME\";\n            case kCommandSetAppDomain:      return \"APPDOMAIN\";\n            case kCommandSetAssembly:       return \"ASSEMBLY\";\n            case kCommandSetMethod:         return \"METHOD\";\n            case kCommandSetType:           return \"TYPE\";\n            case kCommandSetModule:         return \"MODULE\";\n            case kCommandSetEvent:          return \"EVENT\";\n            default:                        return \"\";\n        }\n    }\n\n    const char* command_to_string(CommandSet command_set, int command)\n    {\n        switch (command_set)\n        {\n            case kCommandSetInternalError:\n            {\n                switch ((CommandSetInternalError)command)\n                {\n                    case kCommandSetInternalErrorNotImplemented:    return \"CMD_INT_ERR_NOT_IMPL\";\n                    default:                                    return \"\";\n                }\n            }\n\n            case kCommandSetVm:\n            {\n                switch ((CommandSetVm)command)\n                {\n                    case kCommandSetVmVersion:              return \"CMD_VM_VERSION\";\n                    case kCommandSetVmAllThreads:           return \"CMD_VM_ALL_THREADS\";\n                    case kCommandSetVmSuspend:              return \"CMD_VM_SUSPEND\";\n                    case kCommandSetVmResume:               return \"CMD_VM_RESUME\";\n                    case kCommandSetVmExit:                 return \"CMD_VM_EXIT\";\n                    case kCommandSetVmDispose:              return \"CMD_VM_DISPOSE\";\n                    case kCommandSetVmInvokeMethod:         return \"CMD_VM_INVOKE_METHOD\";\n                    case kCommandSetVmSetProtocolVersion:   return \"CMD_VM_SET_PROTOCOL_VERSION\";\n                    case kCommandSetVmAbortInvoke:          return \"CMD_VM_ABORT_INVOKE\";\n                    default:                                return \"\";\n                }\n            }\n\n            case kCommandSetObjectRef:\n            {\n                switch ((CommandSetObjectRef)command)\n                {\n                    case kCommandSetObjectRefGetType:       return \"CMD_OBJECT_REF_GET_TYPE\";\n                    case kCommandSetObjectRefGetValues:     return \"CMD_OBJECT_REF_GET_VALUES\";\n                    case kCommandSetObjectRefIsCollected:   return \"CMD_OBJECT_REF_IS_COLLECTED\";\n                    case kCommandSetObjectRefGetAddress:    return \"CMD_OBJECT_REF_GET_ADDRESS\";\n                    case kCommandSetObjectRefGetDomain:     return \"CMD_OBJECT_REF_GET_DOMAIN\";\n                    case kCommandSetObjectRefSetValues:     return \"CMD_OBJECT_REF_SET_VALUES\";\n                    default:                                return \"\";\n                }\n            }\n\n            case kCommandSetStringRef:\n            {\n                switch ((CommandSetStringRef)command)\n                {\n                    case kCommandSetStringRefGetValue:  return \"CMD_STRING_REF_GET_VALUE\";\n                    default:                            return \"\";\n                }\n            }\n\n            case kCommandSetThread:\n            {\n                switch ((CommandSetThread)command)\n                {\n                    case kCommandSetThreadGetName:          return \"CMD_THREAD_GET_NAME\";\n                    case kCommandSetThreadGetFrameInfo: return \"CMD_THREAD_GET_FRAME_INFO\";\n                    case kCommandSetThreadGetState:     return \"CMD_THREAD_GET_STATE\";\n                    case kCommandSetThreadGetInfo:          return \"CMD_THREAD_GET_INFO\";\n                    case kCommandSetThreadGetId:            return \"CMD_THREAD_GET_ID\";\n                    default:                            return \"\";\n                }\n            }\n\n            case kCommandSetArrayRef:\n            {\n                switch ((CommandSetArrayRef)command)\n                {\n                    case kCommandSetArrayRefGetLength:  return \"CMD_ARRAY_REF_GET_LENGTH\";\n                    case kCommandSetArrayRefGetValues:  return \"CMD_ARRAY_REF_GET_VALUES\";\n                    case kCommandSetArrayRefSetValues:  return \"CMD_ARRAY_REF_SET_VALUES\";\n                    default:                            return \"\";\n                }\n            }\n\n            case kCommandSetEventRequest:\n            {\n                switch ((CommandSetEvent)command)\n                {\n                    case kCommandSetEventRequestSet:                    return \"CMD_EVENT_REQUEST_SET\";\n                    case kCommandSetEventRequestClear:                  return \"CMD_EVENT_REQUEST_CLEAR\";\n                    case kCommandSetEventRequestClearAllBreakpoints:    return \"CMD_EVENT_REQUEST_CLEAR_ALL_BREAKPOINTS\";\n                    default:                                        return \"\";\n                }\n            }\n\n            case kCommandSetStackFrame:\n            {\n                switch ((CommandSetStackFrame)command)\n                {\n                    case kCommandSetStackFrameGetValues:    return \"CMD_STACK_FRAME_GET_VALUES\";\n                    case kCommandSetStackFrameGetThis:      return \"CMD_STACK_FRAME_GET_THIS\";\n                    case kCommandSetStackFrameSetValues:    return \"CMD_STACK_FRAME_SET_VALUES\";\n                    default:                            return \"\";\n                }\n            }\n\n            case kCommandSetAppDomain:\n            {\n                switch ((CommandSetAppDomain)command)\n                {\n                    case kCommandSetAppDomainGetRootDomain: return \"CMD_APPDOMAIN_GET_ROOT_DOMAIN\";\n                    case kCommandSetAppDomainGetFriendlyName:   return \"CMD_APPDOMAIN_GET_FRIENDLY_NAME\";\n                    case kCommandSetAppDomainGetAssemblies: return \"CMD_APPDOMAIN_GET_ASSEMBLIES\";\n                    case kCommandSetAppDomainGetEntryAssembly:  return \"CMD_APPDOMAIN_GET_ENTRY_ASSEMBLY\";\n                    case kCommandSetAppDomainCreateString:      return \"CMD_APPDOMAIN_CREATE_STRING\";\n                    case kCommandSetAppDomainGetCorlib:     return \"CMD_APPDOMAIN_GET_CORLIB\";\n                    case kCommandSetAppDomainCreateBoxedValue:  return \"CMD_APPDOMAIN_CREATE_BOXED_VALUE\";\n                    default:                                return \"\";\n                }\n            }\n\n            case kCommandSetAssembly:\n            {\n                switch ((CommandSetAssembly)command)\n                {\n                    case kCommandSetAssemblyGetLocation:        return \"CMD_ASSEMBLY_GET_LOCATION\";\n                    case kCommandSetAssemblyGetEntryPoint:      return \"CMD_ASSEMBLY_GET_ENTRY_POINT\";\n                    case kCommandSetAssemblyGetManifestModule:  return \"CMD_ASSEMBLY_GET_MANIFEST_MODULE\";\n                    case kCommandSetAssemblyGetObject:          return \"CMD_ASSEMBLY_GET_OBJECT\";\n                    case kCommandSetAssemblyGetType:            return \"CMD_ASSEMBLY_GET_TYPE\";\n                    case kCommandSetAssemblyGetName:            return \"CMD_ASSEMBLY_GET_NAME\";\n                    default:                                return \"\";\n                }\n            }\n\n            case kCommandSetMethod:\n            {\n                switch ((CommandSetMethod)command)\n                {\n                    case kCommandSetMethodGetName:              return \"CMD_METHOD_GET_NAME\";\n                    case kCommandSetMethodGetDeclaringType: return \"CMD_METHOD_GET_DECLARING_TYPE\";\n                    case kCommandSetMethodGetDebugInfo:     return \"CMD_METHOD_GET_DEBUG_INFO\";\n                    case kCommandSetMethodGetParamInfo:     return \"CMD_METHOD_GET_PARAM_INFO\";\n                    case kCommandSetMethodGetLocalsInfo:        return \"CMD_METHOD_GET_LOCALS_INFO\";\n                    case kCommandSetMethodGetInfo:              return \"CMD_METHOD_GET_INFO\";\n                    case kCommandSetMethodGetBody:              return \"CMD_METHOD_GET_BODY\";\n                    case kCommandSetMethodResolveToken:     return \"CMD_METHOD_RESOLVE_TOKEN\";\n                    default:                                return \"\";\n                }\n            }\n\n            case kCommandSetType:\n            {\n                switch ((CommandSetType)command)\n                {\n                    case kCommandSetTypeGetInfo:            return \"CMD_TYPE_GET_INFO\";\n                    case kCommandSetTypeGetMethods:     return \"CMD_TYPE_GET_METHODS\";\n                    case kCommandSetTypeGetFields:          return \"CMD_TYPE_GET_FIELDS\";\n                    case kCommandSetTypeGetValues:          return \"CMD_TYPE_GET_VALUES\";\n                    case kCommandSetTypeGetObject:          return \"CMD_TYPE_GET_OBJECT\";\n                    case kCommandSetTypeGetSourceFiles: return \"CMD_TYPE_GET_SOURCE_FILES\";\n                    case kCommandSetTypeSetValues:          return \"CMD_TYPE_SET_VALUES\";\n                    case kCommandSetTypeIsAssignableFrom:   return \"CMD_TYPE_IS_ASSIGNABLE_FROM\";\n                    case kCommandSetTypeGetProperties:      return \"CMD_TYPE_GET_PROPERTIES\";\n                    case kCommandSetTypeGetCAttrs:          return \"CMD_TYPE_GET_CATTRS\";\n                    case kCommandSetTypeGetFieldCAttrs: return \"CMD_TYPE_GET_FIELD_CATTRS\";\n                    case kCommandSetTypeGetPropertyCAttrs:  return \"CMD_TYPE_GET_PROPERTY_CATTRS\";\n                    case kCommandSetTypeGetSourceFiles2:    return \"CMD_TYPE_GET_SOURCE_FILES_2\";\n                    default:                            return \"\";\n                }\n            }\n\n            case kCommandSetModule:\n            {\n                switch ((CommandSetModule)command)\n                {\n                    case kCommandSetModuleGetInfo:          return \"CMD_MODULE_GET_INFO\";\n                    default:                            return \"\";\n                }\n            }\n\n            case kCommandSetEvent:\n            {\n                switch ((CommandSetEvent)command)\n                {\n                    case kCommandSetEventComposite: return \"CMD_COMPOSITE\";\n                    default:                        return \"\";\n                }\n            }\n\n            default:\n                return \"\";\n        }\n    }\n\n    const char* event_to_string(EventKind evt)\n    {\n        switch (evt)\n        {\n            case kEventKindVmStart:         return \"VM_START\";\n            case kEventKindVmDeath:         return \"VM_DEATH\";\n            case kEventKindThreadStart:     return \"THREAD_START\";\n            case kEventKindThreadDeath:     return \"THREAD_DEATH\";\n            case kEventKindAppDomainCreate: return \"APPDOMAIN_CREATE\";\n            case kEventKindAppDomainUnload: return \"APPDOMAIN_UNLOAD\";\n            case kEventKindMethodEntry:     return \"METHOD_ENTRY\";\n            case kEventKindMethodExit:      return \"METHOD_EXIT\";\n            case kEventKindAssemblyLoad:    return \"ASSEMBLY_LOAD\";\n            case kEventKindAssemblyUnload:  return \"ASSEMBLY_UNLOAD\";\n            case kEventKindBreakpoint:      return \"BREAKPOINT\";\n            case kEventKindStep:            return \"STEP\";\n            case kEventKindTypeLoad:        return \"TYPE_LOAD\";\n            case kEventKindException:       return \"EXCEPTION\";\n            default:                        return \"INVALID\";\n        }\n    }\n} /* namespace debugger */\n} /* namespace il2cpp */\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/protocol/utils.h",
    "content": "#pragma once\n\n#include \"../common.h\"\n\n#include \"globals.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    const char* event_to_string(EventKind evt);\n    const char* command_set_to_string(CommandSet command_set);\n    const char* command_to_string(CommandSet command_set, int command);\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/thread-data.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"thread-data.h\"\n\n#include \"../os/Mutex.h\"\n#include \"../os/Atomic.h\"\n#include \"../os/Event.h\"\n#include \"../il2cpp-api.h\"\n\nusing namespace il2cpp::debugger;\n\nThreadData::ThreadData(Il2CppThread *thread) :\n    _thread(thread),\n    _write_sync(new os::Mutex),\n    _is_frames_cache_valid(0),\n    _method_to_invoke_sync(new os::Mutex),\n    _method_to_invoke_complete(new os::Event)\n{\n}\n\nThreadData::~ThreadData()\n{\n    _frames_cache.clear();\n    _thread = 0;\n}\n\nstruct ThreadDataUpdateInfo\n{\n    ThreadData *data;\n    std::vector<const Il2CppStackFrameInfo*> new_frames;\n};\n\nbool ThreadData::IsFramesCacheValid()\n{\n    return os::Atomic::CompareExchange(&_is_frames_cache_valid, _is_frames_cache_valid, 0) != 0;\n}\n\nconst Il2CppStackFrameInfo *ThreadData::FrameById(int32_t id)\n{\n    std::vector<const Il2CppStackFrameInfo*>::const_iterator fit = _frames_cache.begin();\n\n    while (fit != _frames_cache.end())\n    {\n        const Il2CppStackFrameInfo *frame = *fit;\n        if (frame->id == id)\n            return frame;\n\n        ++fit;\n    }\n\n    return 0;\n}\n\nvoid ThreadData::UpdateFramesCacheIfNeeded()\n{\n    os::AutoLock lock(_write_sync.get());\n\n    if (os::Atomic::CompareExchange(&_is_frames_cache_valid, _is_frames_cache_valid, 0) != 0)\n        return;\n\n    ThreadDataUpdateInfo info;\n    info.data = this;\n\n    il2cpp_thread_walk_frame_stack(_thread, ThreadData::UpdateStackFrame, &info);\n\n    _frames_cache = info.new_frames;\n\n    os::Atomic::Increment(&_is_frames_cache_valid);\n}\n\nvoid ThreadData::UpdateStackFrame(const Il2CppStackFrameInfo *info, void *user_data)\n{\n    ThreadDataUpdateInfo *data = (ThreadDataUpdateInfo*)user_data;\n\n    Il2CppStackFrameInfo *w_info = const_cast<Il2CppStackFrameInfo*>(info);\n\n    if (w_info->id != -1)\n    {\n        // Let's try to recycle the frame id if possible\n        std::vector<const Il2CppStackFrameInfo*>::const_iterator it = data->data->frames_cache().begin();\n        std::vector<const Il2CppStackFrameInfo*>::const_iterator end = data->data->frames_cache().end();\n        while (it != end)\n        {\n            const Il2CppStackFrameInfo *frame = *it;\n            if ((uintptr_t)frame == (uintptr_t)info && (uintptr_t)frame->locals == (uintptr_t)info->locals)\n            {\n                // In this case, the frame is considered to be unchanged and we can keep the old ID.\n                break;\n            }\n            ++it;\n        }\n\n        if (it == end)\n            w_info->id = os::Atomic::Increment(&frame_id);\n    }\n    else\n        w_info->id = os::Atomic::Increment(&frame_id);\n\n    data->new_frames.push_back(info);\n}\n\nvoid ThreadData::InvalidateFramesCache()\n{\n    os::AutoLock lock(_write_sync.get());\n\n    if (os::Atomic::CompareExchange(&_is_frames_cache_valid, _is_frames_cache_valid, 0) == 0)\n        return;\n\n    // Invalidate the frames cache\n    os::Atomic::Decrement(&_is_frames_cache_valid);\n}\n\nvoid ThreadData::SetMethodToInvoke(const MethodInfo* method)\n{\n    os::AutoLock lock(_method_to_invoke_sync.get());\n\n    IL2CPP_ASSERT(_method_to_invoke_data.method_to_invoke == NULL && \"ThreadData::SetMethodToInvoke called with a method to invoke, when one is already waiting to be invoked\");\n\n    _method_to_invoke_data.method_to_invoke = method;\n}\n\nconst MethodInfo* ThreadData::GetMethodToInvoke() const\n{\n    os::AutoLock lock(_method_to_invoke_sync.get());\n\n    return _method_to_invoke_data.method_to_invoke;\n}\n\nvoid ThreadData::ClearMethodToInvoke()\n{\n    os::AutoLock lock(_method_to_invoke_sync.get());\n\n    _method_to_invoke_data.method_to_invoke = NULL;\n}\n\nvoid ThreadData::SetReturnValueOfMethodToInvoke(Il2CppObject* return_value)\n{\n    os::AutoLock lock(_method_to_invoke_sync.get());\n\n    _method_to_invoke_data.return_value = return_value;\n}\n\nIl2CppObject* ThreadData::GetReturnValueOfMethodToInvoke() const\n{\n    os::AutoLock lock(_method_to_invoke_sync.get());\n\n    return _method_to_invoke_data.return_value;\n}\n\nvoid ThreadData::WaitForMethodToBeInvoked()\n{\n    _method_to_invoke_complete->Wait();\n}\n\nvoid ThreadData::SignalMethodInvokeComplete()\n{\n    _method_to_invoke_complete->Set();\n}\n\nThreadDataMap::ThreadDataMap() :\n    _thread_to_data_sync(0)\n{\n    _thread_to_data_sync = new os::Mutex();\n}\n\nThreadDataMap::~ThreadDataMap()\n{\n    std::map<const Il2CppThread*, ThreadData*>::iterator it = _thread_to_data.begin();\n\n    while (it != _thread_to_data.end())\n    {\n        ThreadData* data = it->second;\n        delete data;\n\n        ++it;\n    }\n\n    _thread_to_data.clear();\n\n    delete _thread_to_data_sync;\n    _thread_to_data_sync = 0;\n}\n\nvoid ThreadDataMap::NotifyThreadAttach(Il2CppThread *thread)\n{\n    os::AutoLock lock(_thread_to_data_sync);\n\n    IL2CPP_ASSERT(_thread_to_data.find(thread) == _thread_to_data.end() && \"ThreadDataMap::NotifyThreadAttach is being called twice on the same thread\");\n\n    _thread_to_data[thread] = new ThreadData(thread);\n}\n\nvoid ThreadDataMap::NotifyThreadDetach(Il2CppThread *thread)\n{\n    os::AutoLock lock(_thread_to_data_sync);\n\n    std::map<const Il2CppThread*, ThreadData*>::const_iterator it = _thread_to_data.find(thread);\n\n    IL2CPP_ASSERT(it != _thread_to_data.end() && \"ThreadDataMap::NotifyThreadDetach is being called on a thread that was not attached\");\n\n    delete it->second;\n\n    _thread_to_data.erase(it);\n}\n\nbool ThreadDataMap::HasThreadDataForThread(const Il2CppThread *thread) const\n{\n    os::AutoLock lock(_thread_to_data_sync);\n\n    return _thread_to_data.find(thread) != _thread_to_data.end();\n}\n\nbool ThreadDataMap::HasThreadDataForCurrentThread() const\n{\n    return HasThreadDataForThread(il2cpp_thread_current());\n}\n\nThreadData *ThreadDataMap::ThreadDataFor(const Il2CppThread *thread)\n{\n    os::AutoLock lock(_thread_to_data_sync);\n\n    std::map<const Il2CppThread*, ThreadData*>::const_iterator it = _thread_to_data.find(thread);\n\n    if (it == _thread_to_data.end())\n        return NULL;\n\n    return it->second;\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/thread-data.h",
    "content": "#pragma once\n\n#include <map>\n#include <vector>\n\n#include \"common.h\"\n\n#include \"protocol/globals.h\"\n\nstruct Il2CppThread;\nstruct Il2CppStackFrameInfo;\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class Mutex;\n    class Event;\n} /* namespace os */\n\nnamespace debugger\n{\n    struct MethodInvokeData\n    {\n        MethodInvokeData() :\n            method_to_invoke(NULL),\n            return_value(NULL)\n        {}\n\n        const MethodInfo* method_to_invoke;\n        Il2CppObject* return_value;\n    };\n\n    static int32_t frame_id = 0;\n\n    class ThreadData\n    {\n    public:\n\n        explicit ThreadData(Il2CppThread *thread);\n        ~ThreadData();\n\n        inline Il2CppThread *thread()\n        {\n            return _thread;\n        }\n\n        inline std::vector<const Il2CppStackFrameInfo*> &frames_cache()\n        {\n            return _frames_cache;\n        }\n\n        inline const std::vector<const Il2CppStackFrameInfo*> &frames_cache() const\n        {\n            return _frames_cache;\n        }\n\n        void UpdateFramesCacheIfNeeded();\n        void InvalidateFramesCache();\n\n        bool IsFramesCacheValid();\n        const Il2CppStackFrameInfo *FrameById(int32_t id);\n\n        void SetMethodToInvoke(const MethodInfo* method);\n        const MethodInfo* GetMethodToInvoke() const;\n        void ClearMethodToInvoke();\n        void SetReturnValueOfMethodToInvoke(Il2CppObject* return_value);\n        Il2CppObject* GetReturnValueOfMethodToInvoke() const;\n        void WaitForMethodToBeInvoked();\n        void SignalMethodInvokeComplete();\n\n    private:\n\n        static void UpdateStackFrame(const Il2CppStackFrameInfo *info, void *user_data);\n\n        Il2CppThread *_thread;\n        const std::auto_ptr<os::Mutex> _write_sync;\n        int32_t _is_frames_cache_valid;\n        std::vector<const Il2CppStackFrameInfo*> _frames_cache;\n\n        const std::auto_ptr<os::Mutex> _method_to_invoke_sync;\n        const std::auto_ptr<os::Event> _method_to_invoke_complete;\n        MethodInvokeData _method_to_invoke_data;\n\n        DISALLOW_COPY(ThreadData);\n    };\n\n    class ThreadDataMap\n    {\n    public:\n\n        ThreadDataMap();\n        ~ThreadDataMap();\n\n        void NotifyThreadAttach(Il2CppThread *thread);\n        void NotifyThreadDetach(Il2CppThread *thread);\n\n        bool HasThreadDataForThread(const Il2CppThread *thread) const;\n        bool HasThreadDataForCurrentThread() const;\n\n        ThreadData *ThreadDataFor(const Il2CppThread *thread);\n\n    private:\n\n        os::Mutex *_thread_to_data_sync;\n        std::map<const Il2CppThread*, ThreadData*> _thread_to_data;\n\n        DISALLOW_COPY(ThreadDataMap);\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/transport-tcp.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"transport-tcp.h\"\n\n#include <sstream>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct TCPDataTransportHandle\n    {\n        int32_t listen_fd;\n        int32_t client_fd;\n        HANDLE send_mutex;\n\n        TCPDataTransportHandle() :\n            listen_fd(INVALID_SOCKET),\n            client_fd(INVALID_SOCKET)\n        {\n            send_mutex = CreateMutex(0, false, L\"send_mutex\");\n        }\n\n        ~TCPDataTransportHandle()\n        {\n            CloseHandle(send_mutex);\n            send_mutex = 0;\n        }\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n\n\nusing namespace il2cpp::debugger;\n\nTCPDataTransport::TCPDataTransport(const char *host, int32_t port) :\n    _host(host),\n    _port(port),\n    _connected(false),\n    _handle(new TCPDataTransportHandle())\n{\n}\n\nTCPDataTransport::~TCPDataTransport()\n{\n    delete _handle;\n    _handle = 0;\n}\n\nbool TCPDataTransport::Setup()\n{\n    int err;\n\n    // Initialize Winsock\n\n    WSADATA wsaData;\n    err = WSAStartup(MAKEWORD(2, 2), &wsaData);\n    if (err != 0)\n    {\n        LOG(\"WSAStartup failed with error: \" << err);\n        return false;\n    }\n\n    // Prepare connection\n    std::stringstream oss;\n\n    oss << _port;\n\n    addrinfo hints;\n\n    memset(&hints, 0, sizeof(struct addrinfo));\n\n    hints.ai_flags = 0;\n    hints.ai_protocol = 0;\n    hints.ai_family = AF_INET;\n    hints.ai_socktype = SOCK_STREAM;\n\n    addrinfo *result;\n\n    err = getaddrinfo(_host, oss.str().c_str(), &hints, &result);\n    if (err != 0)\n    {\n        LOG(\"Unable to connect to \" << _host << \":\" << _port << \": \" << gai_strerror(err));\n        return false;\n    }\n\n    int socket_fd;\n\n    for (addrinfo *rp = result; rp != NULL; rp = rp->ai_next)\n    {\n        socket_fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);\n        if (socket_fd == INVALID_SOCKET)\n            continue;\n\n        err = bind(socket_fd, rp->ai_addr, rp->ai_addrlen);\n        if (err != 0)\n            continue;\n\n        err = listen(socket_fd, 16);\n        if (err != 0)\n            continue;\n\n        _handle->listen_fd = socket_fd;\n        break;\n    }\n\n    freeaddrinfo(result);\n\n    return true;\n}\n\nbool TCPDataTransport::WaitForClient()\n{\n    // Wait for a client to connect ..\n\n    _handle->client_fd = accept(_handle->listen_fd, NULL, NULL);\n\n    if (_handle->client_fd == INVALID_SOCKET)\n    {\n        LOG(\"Unable to listen on \" << _handle->listen_fd);\n        return false;\n    }\n\n    LOG(\"Accepted connection from client, connection fd=\" << _handle->listen_fd);\n\n    _connected = true;\n\n    // Set the socket as non blocking\n    int flag = 1;\n    int err = setsockopt(_handle->client_fd, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(int));\n    if (err != 0)\n    {\n        LOG(\"Error setting TCP_NODELAY.\");\n        Close();\n        return false;\n    }\n\n    return true;\n}\n\nint32_t TCPDataTransport::Send(const uint8_t *data, size_t length, int flags)\n{\n    // Note: still not sure a mutex is needed here.\n    WaitForSingleObject(_handle->send_mutex, INFINITE);\n    int32_t result = send(_handle->client_fd, (const char*)data, length, flags);\n    ReleaseMutex(_handle->send_mutex);\n    return result;\n}\n\nint32_t TCPDataTransport::Recv(uint8_t *data, size_t length, int flags)\n{\n    int32_t read;\n    size_t total_read = 0;\n\n    do\n    {\n        read = recv(_handle->client_fd, (char*)data + total_read, length - total_read, flags);\n        if (read > 0)\n            total_read += read;\n    }\n    while ((read > 0 && total_read < length) || (read == -1 && errno == EINTR));\n\n    return total_read;\n}\n\nvoid TCPDataTransport::Close()\n{\n    if (!_connected)\n        return;\n\n    shutdown(_handle->client_fd, SD_BOTH);\n    shutdown(_handle->listen_fd, SD_BOTH);\n\n    closesocket(_handle->client_fd);\n    closesocket(_handle->listen_fd);\n\n    _handle->listen_fd = INVALID_SOCKET;\n    _handle->client_fd = INVALID_SOCKET;\n    _connected = false;\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/transport-tcp.h",
    "content": "#pragma once\n\n#include \"common.h\"\n#include \"transport.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    struct TCPDataTransportHandle;\n\n    class TCPDataTransport : public IDataTransport\n    {\n    public:\n\n        TCPDataTransport(const char *host, int32_t port);\n        ~TCPDataTransport();\n\n        inline const char *host() const\n        {\n            return _host;\n        }\n\n        inline int32_t port() const\n        {\n            return _port;\n        }\n\n        inline bool connected() const\n        {\n            return _connected;\n        }\n\n        bool Setup();\n        bool WaitForClient();\n        int32_t Send(const uint8_t *data, size_t length, int flags = 0);\n        int32_t Recv(uint8_t *data, size_t length, int flags = 0);\n        void Close();\n\n    private:\n\n        const char *_host;\n        int32_t _port;\n        bool _connected;\n        TCPDataTransportHandle *_handle;\n\n        DISALLOW_COPY(TCPDataTransport);\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/transport.h",
    "content": "#pragma once\n\n#include \"common.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    class IDataTransport\n    {\n    public:\n\n        IDataTransport() {}\n        virtual ~IDataTransport() {}\n\n        virtual bool Setup() = 0;\n        virtual bool WaitForClient() = 0;\n        virtual int32_t Send(const uint8_t *data, size_t length, int flags = 0) = 0;\n        virtual int32_t Recv(uint8_t *data, size_t length, int flags = 0) = 0;\n        virtual void Close() = 0;\n\n        DISALLOW_COPY(IDataTransport);\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/variant.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"variant.h\"\n\n#include \"data-buffer.h\"\n#include \"../il2cpp-api.h\"\n#include \"../blob.h\"\n#include \"../tabledefs.h\"\n#include \"../class-internals.h\"\n#include \"../object-internals.h\"\n#include \"vm/Type.h\"\n\nusing namespace il2cpp::debugger;\n\n#define VALUE_TYPE_ID_NULL  0xF0\n\nVariant::Variant() :\n    _type(0),\n    _value(0)\n{\n}\n\nVariant::Variant(const Il2CppType *type, void *value) :\n    _type(type),\n    _value(value)\n{\n}\n\nvoid Variant::WriteTo(Buffer &out) const\n{\n    switch (_type->type)\n    {\n        case IL2CPP_TYPE_VOID:\n            out.WriteByte(_type->type);\n            break;\n\n        case IL2CPP_TYPE_BOOLEAN:\n        case IL2CPP_TYPE_I1:\n        case IL2CPP_TYPE_U1:\n            out.WriteByte(_type->type);\n            out.WriteInt(*((int8_t*)_value));\n            break;\n\n        case IL2CPP_TYPE_CHAR:\n        case IL2CPP_TYPE_I2:\n        case IL2CPP_TYPE_U2:\n            out.WriteByte(_type->type);\n            out.WriteInt(*((int16_t*)_value));\n            break;\n\n        case IL2CPP_TYPE_I4:\n        case IL2CPP_TYPE_U4:\n        case IL2CPP_TYPE_R4:\n            out.WriteByte(_type->type);\n            out.WriteInt(*((int32_t*)_value));\n            break;\n\n        case IL2CPP_TYPE_I8:\n        case IL2CPP_TYPE_U8:\n        case IL2CPP_TYPE_R8:\n            out.WriteByte(_type->type);\n            out.WriteLong(*((int64_t*)_value));\n            break;\n\n        case IL2CPP_TYPE_I:\n        case IL2CPP_TYPE_U:\n            VTypeVariant(_type, _value).WriteTo(out);\n            break;\n\n        case IL2CPP_TYPE_PTR:\n            out.WriteByte(_type->type);\n            out.WriteLong(*((size_t*)_value));\n            break;\n\n        // handle_ref:\n        case IL2CPP_TYPE_STRING:\n        case IL2CPP_TYPE_SZARRAY:\n        case IL2CPP_TYPE_OBJECT:\n        case IL2CPP_TYPE_CLASS:\n        case IL2CPP_TYPE_ARRAY:\n        {\n            Il2CppObject *obj = *(Il2CppObject**)_value;\n\n            if (!obj)\n            {\n                out.WriteByte(VALUE_TYPE_ID_NULL);\n            }\n            else\n            {\n                if (obj->klass->valuetype)\n                {\n                    VTypeVariant(obj->klass->byval_arg, il2cpp_object_unbox(obj)).WriteTo(out);\n                }\n                else\n                {\n                    if (obj->klass->rank)\n                        out.WriteByte(obj->klass->byval_arg->type);\n                    else if (obj->klass->byval_arg->type == IL2CPP_TYPE_GENERICINST)\n                        out.WriteByte(IL2CPP_TYPE_CLASS);\n                    else\n                        out.WriteByte(obj->klass->byval_arg->type);\n\n                    out.WriteObjectId(obj);\n                }\n            }\n        }\n        break;\n\n        case IL2CPP_TYPE_VALUETYPE:\n            VTypeVariant(_type, _value).WriteTo(out);\n            break;\n\n        case IL2CPP_TYPE_GENERICINST:\n            LOG(\"Encoding of generic instance types not supported yet.\");\n            IL2CPP_ASSERT(0 && \"Variant::WriteTo: encoding of generic instance types not supported yet\");\n            break;\n\n        default:\n            IL2CPP_ASSERT(0 && \"Variant::WriteTo: unexpected type\");\n            break;\n    }\n}\n\nErrorCode Variant::ReadInto(Buffer &in, const Il2CppType *expected_type, void *addr)\n{\n    // TODO: probably nullables need to be dealt with in a special way. Test it.\n    int32_t type_code = in.ReadByte();\n\n    switch (type_code)\n    {\n        case IL2CPP_TYPE_BOOLEAN:\n            *(uint8_t*)addr = in.ReadInt();\n            break;\n\n        case IL2CPP_TYPE_CHAR:\n            *(uint16_t*)addr = in.ReadInt();\n            break;\n\n        case IL2CPP_TYPE_I1:\n            *(int8_t*)addr = in.ReadInt();\n            break;\n\n        case IL2CPP_TYPE_U1:\n            *(uint8_t*)addr = in.ReadInt();\n            break;\n\n        case IL2CPP_TYPE_I2:\n            *(int16_t*)addr = in.ReadInt();\n            break;\n\n        case IL2CPP_TYPE_U2:\n            *(uint16_t*)addr = in.ReadInt();\n            break;\n\n        case IL2CPP_TYPE_I4:\n            *(int32_t*)addr = in.ReadInt();\n            break;\n\n        case IL2CPP_TYPE_U4:\n            *(uint32_t*)addr = in.ReadInt();\n            break;\n\n        case IL2CPP_TYPE_I8:\n            *(int64_t*)addr = in.ReadLong();\n            break;\n\n        case IL2CPP_TYPE_U8:\n            *(uint64_t*)addr = in.ReadLong();\n            break;\n\n        case IL2CPP_TYPE_R4:\n            *(uint32_t*)addr = in.ReadInt();\n            break;\n\n        case IL2CPP_TYPE_R8:\n            *(uint64_t*)addr = in.ReadLong();\n            break;\n\n        case IL2CPP_TYPE_PTR:\n            *(size_t*)addr = in.ReadLong();\n            break;\n\n        case IL2CPP_TYPE_GENERICINST:\n            /*if (IL2CPP_TYPE_ISSTRUCT (t))\n                goto handle_vtype;\n            else\n                goto handle_ref;*/\n            LOG(\"Decoding of generic instance types not supported yet.\");\n            IL2CPP_ASSERT(0 && \"Variant::ReadFrom: encoding of generic instance types not supported yet\");\n            break;\n\n        // handle_vtype:\n        case IL2CPP_TYPE_I:\n        case IL2CPP_TYPE_U:\n        case IL2CPP_TYPE_VALUETYPE:\n        {\n            bool is_enum = in.ReadBool();\n\n            IL2CPP_ASSERT(!is_enum && \"Variant::ReadFrom: is_enum not implemented!\");\n\n            Il2CppClass *klass = in.ReadType();\n\n            void *iter = 0;\n            FieldInfo *field;\n            int32_t fields_count = in.ReadInt();\n\n            while ((field = il2cpp_class_get_fields(klass, &iter)))\n            {\n                if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n                    continue;\n\n                /*if(il2cpp_field_is_deleted (field))\n                    continue;*/\n\n                Variant::ReadInto(in, field->type, (uint8_t*)addr + field->offset - sizeof(Il2CppObject));\n\n                --fields_count;\n            }\n\n            IL2CPP_ASSERT(fields_count == 0 && \"Variant::ReadFrom: some fields have not been decoded properly!\");\n        }\n        break;\n\n        // handle_ref:\n        default:\n        {\n            IL2CPP_ASSERT(!vm::Type::IsValueType(expected_type) && \"Variant::ReadFrom: expecting a reference type!\");\n\n            switch (type_code)\n            {\n                case IL2CPP_TYPE_OBJECT:\n                {\n                    Il2CppObject *obj = in.ReadObject();\n\n                    if (obj && !il2cpp_class_is_assignable_from(il2cpp_class_from_il2cpp_type(expected_type), obj->klass))\n                        return kErrorCodeInvalidArgument;\n\n                    *(Il2CppObject**)addr = obj;\n                }\n                break;\n\n                case VALUE_TYPE_ID_NULL:\n                    *(Il2CppObject**)addr = NULL;\n                    break;\n\n                default:\n                    IL2CPP_ASSERT(0 && \"Variant::ReadFrom: unexpected type code!\");\n                    break;\n            }\n        }\n        break;\n    }\n\n    return kErrorCodeNone;\n}\n\nVTypeVariant::VTypeVariant() :\n    Variant(0, 0)\n{\n}\n\nVTypeVariant::VTypeVariant(const Il2CppType *type, void *value) :\n    Variant(type, value)\n{\n}\n\nvoid VTypeVariant::WriteTo(Buffer &out) const\n{\n    switch (type()->type)\n    {\n        case IL2CPP_TYPE_BOOLEAN:\n        case IL2CPP_TYPE_I1:\n        case IL2CPP_TYPE_U1:\n        case IL2CPP_TYPE_CHAR:\n        case IL2CPP_TYPE_I2:\n        case IL2CPP_TYPE_U2:\n        case IL2CPP_TYPE_I4:\n        case IL2CPP_TYPE_U4:\n        case IL2CPP_TYPE_R4:\n        case IL2CPP_TYPE_I8:\n        case IL2CPP_TYPE_U8:\n        case IL2CPP_TYPE_R8:\n        case IL2CPP_TYPE_I:\n        case IL2CPP_TYPE_U:\n        case IL2CPP_TYPE_PTR:\n        case IL2CPP_TYPE_VALUETYPE:\n        {\n            FieldInfo *field_info;\n            Il2CppClass *klass = il2cpp_class_from_il2cpp_type(type());\n\n            out.WriteByte(IL2CPP_TYPE_VALUETYPE);\n            out.WriteByte(klass->enumtype);\n            out.WriteTypeId(klass);\n\n            size_t nfields = 0;\n            void *iter = NULL;\n\n            while ((field_info = il2cpp_class_get_fields(klass, &iter)))\n            {\n                if (field_info->type->attrs & FIELD_ATTRIBUTE_STATIC)\n                    continue;\n\n                /*if (il2cpp_field_is_deleted(field_info))\n                    continue;*/\n\n                nfields++;\n            }\n\n            out.WriteInt(nfields);\n\n            iter = NULL;\n            while ((field_info = il2cpp_class_get_fields(klass, &iter)))\n            {\n                if (field_info->type->attrs & FIELD_ATTRIBUTE_STATIC)\n                    continue;\n\n                /*if (il2cpp_field_is_deleted(field_info))\n                    continue;*/\n\n                Variant(field_info->type, (uint8_t*)value() + field_info->offset - sizeof(Il2CppObject)).WriteTo(out);\n            }\n        }\n        break;\n\n        default:\n            Variant::WriteTo(out);\n            break;\n    }\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/debugger/variant.h",
    "content": "#pragma once\n\n#include \"common.h\"\n\n#include \"protocol/globals.h\"\n\nnamespace il2cpp\n{\nnamespace debugger\n{\n    class Buffer;\n\n    class Variant\n    {\n    public:\n\n        Variant();\n        Variant(const Il2CppType *type, void *value);\n\n        inline const Il2CppType *type() const\n        {\n            return _type;\n        }\n\n        inline void *value() const\n        {\n            return _value;\n        }\n\n        virtual void WriteTo(Buffer &out) const;\n\n        static ErrorCode ReadInto(Buffer & in, const Il2CppType * expected_type, void *addr);\n\n    private:\n\n        const Il2CppType *_type;\n        void *_value;\n    };\n\n    class VTypeVariant : public Variant\n    {\n    public:\n\n        VTypeVariant();\n        VTypeVariant(const Il2CppType *type, void *value);\n\n        virtual void WriteTo(Buffer &out) const;\n    };\n} /* namespace debugger */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/google/sparsehash/dense_hash_map.h",
    "content": "// Copyright (c) 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// ----\n// Author: Craig Silverstein\n//\n// This is just a very thin wrapper over densehashtable.h, just\n// like sgi stl's stl_hash_map is a very thin wrapper over\n// stl_hashtable.  The major thing we define is operator[], because\n// we have a concept of a data_type which stl_hashtable doesn't\n// (it only has a key and a value).\n//\n// NOTE: this is exactly like sparse_hash_map.h, with the word\n// \"sparse\" replaced by \"dense\", except for the addition of\n// set_empty_key().\n//\n//   YOU MUST CALL SET_EMPTY_KEY() IMMEDIATELY AFTER CONSTRUCTION.\n//\n// Otherwise your program will die in mysterious ways.\n//\n// In other respects, we adhere mostly to the STL semantics for\n// hash-map.  One important exception is that insert() invalidates\n// iterators entirely.  On the plus side, though, erase() doesn't\n// invalidate iterators at all, or even change the ordering of elements.\n//\n// Here are a few \"power user\" tips:\n//\n//    1) set_deleted_key():\n//         If you want to use erase() you must call set_deleted_key(),\n//         in addition to set_empty_key(), after construction.\n//         The deleted and empty keys must differ.\n//\n//    2) resize(0):\n//         When an item is deleted, its memory isn't freed right\n//         away.  This allows you to iterate over a hashtable,\n//         and call erase(), without invalidating the iterator.\n//         To force the memory to be freed, call resize(0).\n//\n// Guide to what kind of hash_map to use:\n//   (1) dense_hash_map: fastest, uses the most memory\n//   (2) sparse_hash_map: slowest, uses the least memory\n//   (3) hash_map (STL): in the middle\n// Typically I use sparse_hash_map when I care about space and/or when\n// I need to save the hashtable on disk.  I use hash_map otherwise.  I\n// don't personally use dense_hash_map ever; the only use of\n// dense_hash_map I know of is to work around malloc() bugs in some\n// systems (dense_hash_map has a particularly simple allocation scheme).\n//\n// - dense_hash_map has, typically, a factor of 2 memory overhead (if your\n//   data takes up X bytes, the hash_map uses X more bytes in overhead).\n// - sparse_hash_map has about 2 bits overhead per entry.\n// - sparse_hash_map can be 3-7 times slower than the others for lookup and,\n//   especially, inserts.  See time_hash_map.cc for details.\n//\n// See /usr/(local/)?doc/sparsehash-0.1/dense_hash_map.html\n// for information about how to use this class.\n\n#ifndef _DENSE_HASH_MAP_H_\n#define _DENSE_HASH_MAP_H_\n\n//#include <google/sparsehash/sparseconfig.h>\n#include <stdio.h>                   // for FILE * in read()/write()\n#include <algorithm>                 // for the default template args\n#include <functional>                // for equal_to\n#include <memory>                    // for alloc<>\n#include <utility>                   // for pair<>\n//#include <ext/hash_fun.h>                  // defined in config.h\n#include \"densehashtable.h\"\n\n\nusing std::pair;\n\ntemplate <class Key, class T,\n          class HashFcn,\n          class EqualKey = std::equal_to<Key>,\n\t\t  class Alloc = std::allocator< std::pair<const Key, T> > >\nclass dense_hash_map {\n private:\n  // Apparently select1st is not stl-standard, so we define our own\n  struct SelectKey {\n    const Key& operator()(const pair<const Key, T>& p) const {\n      return p.first;\n    }\n  };\n\n  // The actual data\n  typedef dense_hashtable<pair<const Key, T>, Key, HashFcn,\n                          SelectKey, EqualKey, Alloc> ht;\n  ht rep;\n\n public:\n  typedef typename ht::key_type key_type;\n  typedef T data_type;\n  typedef T mapped_type;\n  typedef typename ht::value_type value_type;\n  typedef typename ht::hasher hasher;\n  typedef typename ht::key_equal key_equal;\n\n  typedef typename ht::size_type size_type;\n  typedef typename ht::difference_type difference_type;\n  typedef typename ht::pointer pointer;\n  typedef typename ht::const_pointer const_pointer;\n  typedef typename ht::reference reference;\n  typedef typename ht::const_reference const_reference;\n\n  typedef typename ht::iterator iterator;\n  typedef typename ht::const_iterator const_iterator;\n\n  // Iterator functions\n  iterator begin()                    { return rep.begin(); }\n  iterator end()                      { return rep.end(); }\n  const_iterator begin() const        { return rep.begin(); }\n  const_iterator end() const          { return rep.end(); }\n\n\n  // Accessor functions\n  hasher hash_funct() const { return rep.hash_funct(); }\n  key_equal key_eq() const  { return rep.key_eq(); }\n\n\n  // Constructors\n  explicit dense_hash_map(size_type n = 0,\n                          const hasher& hf = hasher(),\n                          const key_equal& eql = key_equal())\n    : rep(n, hf, eql) { }\n\n  template <class InputIterator>\n  dense_hash_map(InputIterator f, InputIterator l,\n                 size_type n = 0,\n                 const hasher& hf = hasher(),\n                 const key_equal& eql = key_equal())\n    : rep(n, hf, eql) {\n    rep.insert(f, l);\n  }\n  // We use the default copy constructor\n  // We use the default operator=()\n  // We use the default destructor\n\n  void clear()                        { rep.clear(); }\n  // This clears the hash map without resizing it down to the minimum\n  // bucket count, but rather keeps the number of buckets constant\n  void clear_no_resize()              { rep.clear_no_resize(); }\n  void swap(dense_hash_map& hs)       { rep.swap(hs.rep); }\n\n\n  // Functions concerning size\n  size_type size() const              { return rep.size(); }\n  size_type max_size() const          { return rep.max_size(); }\n  bool empty() const                  { return rep.empty(); }\n  size_type bucket_count() const      { return rep.bucket_count(); }\n  size_type max_bucket_count() const  { return rep.max_bucket_count(); }\n\n  void resize(size_type hint)         { rep.resize(hint); }\n\n\n  // Lookup routines\n  iterator find(const key_type& key)                 { return rep.find(key); }\n  const_iterator find(const key_type& key) const     { return rep.find(key); }\n\n  data_type& operator[](const key_type& key) {       // This is our value-add!\n    iterator it = find(key);\n    if (it != end()) {\n      return it->second;\n    } else {\n      return insert(value_type(key, data_type())).first->second;\n    }\n  }\n\n  size_type count(const key_type& key) const         { return rep.count(key); }\n\n  pair<iterator, iterator> equal_range(const key_type& key) {\n    return rep.equal_range(key);\n  }\n  pair<const_iterator, const_iterator> equal_range(const key_type& key) const {\n    return rep.equal_range(key);\n  }\n\n  // Insertion routines\n  pair<iterator, bool> insert(const value_type& obj) { return rep.insert(obj); }\n  template <class InputIterator>\n  void insert(InputIterator f, InputIterator l)      { rep.insert(f, l); }\n  void insert(const_iterator f, const_iterator l)    { rep.insert(f, l); }\n  // required for std::insert_iterator; the passed-in iterator is ignored\n  iterator insert(iterator, const value_type& obj)   { return insert(obj).first; }\n\n\n  // Deletion and empty routines\n  // THESE ARE NON-STANDARD!  I make you specify an \"impossible\" key\n  // value to identify deleted and empty buckets.  You can change the\n  // deleted key as time goes on, or get rid of it entirely to be insert-only.\n  void set_empty_key(const key_type& key)   {           // YOU MUST CALL THIS!\n    rep.set_empty_key(value_type(key, data_type()));    // rep wants a value\n  }\n  void set_deleted_key(const key_type& key)   {\n    rep.set_deleted_key(value_type(key, data_type()));  // rep wants a value\n  }\n  void clear_deleted_key()                    { rep.clear_deleted_key(); }\n\n  // These are standard\n  size_type erase(const key_type& key)               { return rep.erase(key); }\n  void erase(iterator it)                            { rep.erase(it); }\n  void erase(iterator f, iterator l)                 { rep.erase(f, l); }\n\n\n  // Comparison\n  bool operator==(const dense_hash_map& hs) const    { return rep == hs.rep; }\n  bool operator!=(const dense_hash_map& hs) const    { return rep != hs.rep; }\n};\n\n// We need a global swap as well\ntemplate <class Key, class T, class HashFcn, class EqualKey, class Alloc>\ninline void swap(dense_hash_map<Key, T, HashFcn, EqualKey, Alloc>& hm1,\n                 dense_hash_map<Key, T, HashFcn, EqualKey, Alloc>& hm2) {\n  hm1.swap(hm2);\n}\n\n#endif /* _DENSE_HASH_MAP_H_ */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/google/sparsehash/dense_hash_set.h",
    "content": "// Copyright (c) 2005, Google Inc.\n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n// \n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// ---\n// Author: Craig Silverstein\n//\n// This is just a very thin wrapper over densehashtable.h, just\n// like sgi stl's stl_hash_set is a very thin wrapper over\n// stl_hashtable.  The major thing we define is operator[], because\n// we have a concept of a data_type which stl_hashtable doesn't\n// (it only has a key and a value).\n//\n// This is more different from dense_hash_map than you might think,\n// because all iterators for sets are const (you obviously can't\n// change the key, and for sets there is no value).\n//\n// NOTE: this is exactly like sparse_hash_set.h, with the word\n// \"sparse\" replaced by \"dense\", except for the addition of\n// set_empty_key().\n//\n//   YOU MUST CALL SET_EMPTY_KEY() IMMEDIATELY AFTER CONSTRUCTION.\n//\n// Otherwise your program will die in mysterious ways.\n//\n// In other respects, we adhere mostly to the STL semantics for\n// hash-set.  One important exception is that insert() invalidates\n// iterators entirely.  On the plus side, though, erase() doesn't\n// invalidate iterators at all, or even change the ordering of elements.\n//\n// Here are a few \"power user\" tips:\n//\n//    1) set_deleted_key():\n//         If you want to use erase() you must call set_deleted_key(),\n//         in addition to set_empty_key(), after construction.\n//         The deleted and empty keys must differ.\n//\n//    2) resize(0):\n//         When an item is deleted, its memory isn't freed right\n//         away.  This allows you to iterate over a hashtable,\n//         and call erase(), without invalidating the iterator.\n//         To force the memory to be freed, call resize(0).\n//\n// Guide to what kind of hash_set to use:\n//   (1) dense_hash_set: fastest, uses the most memory\n//   (2) sparse_hash_set: slowest, uses the least memory\n//   (3) hash_set (STL): in the middle\n// Typically I use sparse_hash_set when I care about space and/or when\n// I need to save the hashtable on disk.  I use hash_set otherwise.  I\n// don't personally use dense_hash_set ever; the only use of\n// dense_hash_set I know of is to work around malloc() bugs in some\n// systems (dense_hash_set has a particularly simple allocation scheme).\n//\n// - dense_hash_set has, typically, a factor of 2 memory overhead (if your\n//   data takes up X bytes, the hash_set uses X more bytes in overhead).\n// - sparse_hash_set has about 2 bits overhead per entry.\n// - sparse_hash_map can be 3-7 times slower than the others for lookup and,\n//   especially, inserts.  See time_hash_map.cc for details.\n//\n// See /usr/(local/)?doc/sparsehash-0.1/dense_hash_set.html\n// for information about how to use this class.\n\n#ifndef _DENSE_HASH_SET_H_\n#define _DENSE_HASH_SET_H_\n\n//#include <google/sparsehash/sparseconfig.h>\n#include <stdio.h>                   // for FILE * in read()/write()\n#include <algorithm>                 // for the default template args\n#include <functional>                // for equal_to\n#include <memory>                    // for alloc<>\n#include <utility>                   // for pair<>\n//#include HASH_FUN_H                  // defined in config.h\n#include \"densehashtable.h\"\n\nusing std::pair;\n\ntemplate <class Value,\n          class HashFcn,  \n          class EqualKey = std::equal_to<Value>, \n          class Alloc = std::allocator<Value> >\nclass dense_hash_set {\n private:\n  // Apparently identity is not stl-standard, so we define our own\n  struct Identity {\n    Value& operator()(Value& v) const { return v; }\n    const Value& operator()(const Value& v) const { return v; }\n  };\n\n  // The actual data\n  typedef dense_hashtable<Value, Value, HashFcn, Identity, EqualKey, Alloc> ht;\n  ht rep;\n\n public:\n  typedef typename ht::key_type key_type;\n  typedef typename ht::value_type value_type;\n  typedef typename ht::hasher hasher;\n  typedef typename ht::key_equal key_equal;\n\n  typedef typename ht::size_type size_type;\n  typedef typename ht::difference_type difference_type;\n  typedef typename ht::const_pointer pointer;\n  typedef typename ht::const_pointer const_pointer;\n  typedef typename ht::const_reference reference;\n  typedef typename ht::const_reference const_reference;\n\n  typedef typename ht::const_iterator iterator;\n  typedef typename ht::const_iterator const_iterator;\n\n\n  // Iterator functions -- recall all iterators are const\n  iterator begin() const              { return rep.begin(); }\n  iterator end() const                { return rep.end(); }\n\n\n  // Accessor functions\n  hasher hash_funct() const { return rep.hash_funct(); }\n  key_equal key_eq() const  { return rep.key_eq(); }\n\n\n  // Constructors\n  explicit dense_hash_set(size_type n = 0,\n                          const hasher& hf = hasher(),\n                          const key_equal& eql = key_equal())\n    : rep(n, hf, eql) { }\n\n  template <class InputIterator>\n  dense_hash_set(InputIterator f, InputIterator l,\n                 size_type n = 0,\n                 const hasher& hf = hasher(),\n                 const key_equal& eql = key_equal()) \n\t: rep(n, hf, eql) {\n    rep.insert(f, l);\n  }\n  // We use the default copy constructor\n  // We use the default operator=()\n  // We use the default destructor\n\n  void clear()                        { rep.clear(); }\n  // This clears the hash set without resizing it down to the minimum\n  // bucket count, but rather keeps the number of buckets constant\n  void clear_no_resize()              { rep.clear_no_resize(); }\n  void swap(dense_hash_set& hs)       { rep.swap(hs.rep); }\n\n\n  // Functions concerning size\n  size_type size() const              { return rep.size(); }\n  size_type max_size() const          { return rep.max_size(); }\n  bool empty() const                  { return rep.empty(); }\n  size_type bucket_count() const      { return rep.bucket_count(); }\n  size_type max_bucket_count() const  { return rep.max_bucket_count(); }\n\n  void resize(size_type hint)         { rep.resize(hint); }\n\n\n  // Lookup routines\n  iterator find(const key_type& key) const           { return rep.find(key); }\n\n  size_type count(const key_type& key) const         { return rep.count(key); }\n\n  pair<iterator, iterator> equal_range(const key_type& key) const {\n    return rep.equal_range(key);\n  }\n\n  // Insertion routines\n  pair<iterator, bool> insert(const value_type& obj) {\n    pair<typename ht::iterator, bool> p = rep.insert(obj);\n    return pair<iterator, bool>(p.first, p.second);   // const to non-const\n  }\n  template <class InputIterator>\n  void insert(InputIterator f, InputIterator l)      { rep.insert(f, l); }\n  void insert(const_iterator f, const_iterator l)    { rep.insert(f, l); }\n  // required for std::insert_iterator; the passed-in iterator is ignored\n  iterator insert(iterator, const value_type& obj)   { return insert(obj).first; }\n\n\n  // Deletion and empty routines\n  // THESE ARE NON-STANDARD!  I make you specify an \"impossible\" key\n  // value to identify deleted and empty buckets.  You can change the\n  // deleted key as time goes on, or get rid of it entirely to be insert-only.\n  void set_empty_key(const key_type& key)     { rep.set_empty_key(key); }\n  void set_deleted_key(const key_type& key)   { rep.set_deleted_key(key); }\n  void clear_deleted_key()                    { rep.clear_deleted_key(); }\n\n  // These are standard\n  size_type erase(const key_type& key)               { return rep.erase(key); }\n  void erase(iterator it)                            { rep.erase(it); }\n  void erase(iterator f, iterator l)                 { rep.erase(f, l); }\n\n\n  // Comparison\n  bool operator==(const dense_hash_set& hs) const    { return rep == hs.rep; }\n  bool operator!=(const dense_hash_set& hs) const    { return rep != hs.rep; }\n};\n\ntemplate <class Val, class HashFcn, class EqualKey, class Alloc>\ninline void swap(dense_hash_set<Val, HashFcn, EqualKey, Alloc>& hs1,\n                 dense_hash_set<Val, HashFcn, EqualKey, Alloc>& hs2) {\n  hs1.swap(hs2);\n}\n\n\n#endif /* _DENSE_HASH_SET_H_ */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/google/sparsehash/densehashtable.h",
    "content": "// Copyright (c) 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// ---\n// Author: Craig Silverstein\n//\n// A dense hashtable is a particular implementation of\n// a hashtable: one that is meant to minimize memory allocation.\n// It does this by using an array to store all the data.  We\n// steal a value from the key space to indicate \"empty\" array\n// elements (ie indices where no item lives) and another to indicate\n// \"deleted\" elements.\n//\n// (Note it is possible to change the value of the delete key\n// on the fly; you can even remove it, though after that point\n// the hashtable is insert_only until you set it again.  The empty\n// value however can't be changed.)\n//\n// To minimize allocation and pointer overhead, we use internal\n// probing, in which the hashtable is a single table, and collisions\n// are resolved by trying to insert again in another bucket.  The\n// most cache-efficient internal probing schemes are linear probing\n// (which suffers, alas, from clumping) and quadratic probing, which\n// is what we implement by default.\n//\n// Type requirements: value_type is required to be Copy Constructible\n// and Default Constructible. It is not required to be (and commonly\n// isn't) Assignable.\n//\n// You probably shouldn't use this code directly.  Use\n// <google/dense_hash_map> or <google/dense_hash_set> instead.\n\n// You can change the following below:\n// HT_OCCUPANCY_FLT      -- how full before we double size\n// HT_EMPTY_FLT          -- how empty before we halve size\n// HT_MIN_BUCKETS        -- default smallest bucket size\n//\n// How to decide what values to use?\n// HT_EMPTY_FLT's default of .4 * OCCUPANCY_FLT, is probably good.\n// HT_MIN_BUCKETS is probably unnecessary since you can specify\n// (indirectly) the starting number of buckets at construct-time.\n// For HT_OCCUPANCY_FLT, you can use this chart to try to trade-off\n// expected lookup time to the space taken up.  By default, this\n// code uses quadratic probing, though you can change it to linear\n// via _JUMP below if you really want to.\n//\n// From http://www.augustana.ca/~mohrj/courses/1999.fall/csc210/lecture_notes/hashing.html\n// NUMBER OF PROBES / LOOKUP       Successful            Unsuccessful\n// Quadratic collision resolution   1 - ln(1-L) - L/2    1/(1-L) - L - ln(1-L)\n// Linear collision resolution     [1+1/(1-L)]/2         [1+1/(1-L)2]/2\n//\n// -- HT_OCCUPANCY_FLT --         0.10  0.50  0.60  0.75  0.80  0.90  0.99\n// QUADRATIC COLLISION RES.\n//    probes/successful lookup    1.05  1.44  1.62  2.01  2.21  2.85  5.11\n//    probes/unsuccessful lookup  1.11  2.19  2.82  4.64  5.81  11.4  103.6\n// LINEAR COLLISION RES.\n//    probes/successful lookup    1.06  1.5   1.75  2.5   3.0   5.5   50.5\n//    probes/unsuccessful lookup  1.12  2.5   3.6   8.5   13.0  50.0  5000.0\n\n#ifndef _DENSEHASHTABLE_H_\n#define _DENSEHASHTABLE_H_\n\n// The probing method\n// Linear probing\n// #define JUMP_(key, num_probes)    ( 1 )\n// Quadratic-ish probing\n#define JUMP_(key, num_probes)    ( num_probes )\n\n\n// Hashtable class, used to implement the hashed associative containers\n// hash_set and hash_map.\n\n//#include <google/sparsehash/sparseconfig.h>\n#include <assert.h>\n// Use Unity's assertion pathways\n// #include \"Runtime/Logging/LogAssert.h\"\n//#include <stdlib.h>             // for abort()\n//#include <algorithm>            // For swap(), eg\n//#include <iostream>             // For cerr\n#include <memory>               // For uninitialized_fill, uninitialized_copy\n//#include <utility>              // for pair<>\n//#include <iterator>             // for facts about iterator tags\n#include \"type_traits.h\" // for true_type, integral_constant, etc.\n\nusing std::pair;\n\ntemplate <class Value, class Key, class HashFcn,\n          class ExtractKey, class EqualKey, class Alloc>\nclass dense_hashtable;\n\ntemplate <class V, class K, class HF, class ExK, class EqK, class A>\nstruct dense_hashtable_iterator;\n\ntemplate <class V, class K, class HF, class ExK, class EqK, class A>\nstruct dense_hashtable_const_iterator;\n\n// We're just an array, but we need to skip over empty and deleted elements\ntemplate <class V, class K, class HF, class ExK, class EqK, class A>\nstruct dense_hashtable_iterator {\n public:\n  typedef dense_hashtable_iterator<V,K,HF,ExK,EqK,A>       iterator;\n  typedef dense_hashtable_const_iterator<V,K,HF,ExK,EqK,A> const_iterator;\n\n  typedef std::forward_iterator_tag iterator_category;\n  typedef V value_type;\n  typedef std::ptrdiff_t difference_type;\n  typedef size_t size_type;\n  typedef V& reference;                // Value\n  typedef V* pointer;\n\n  // \"Real\" constructor and default constructor\n  dense_hashtable_iterator(const dense_hashtable<V,K,HF,ExK,EqK,A> *h,\n                           pointer it, pointer it_end, bool advance)\n    : ht(h), pos(it), end(it_end)   {\n    if (advance)  advance_past_empty_and_deleted();\n  }\n  dense_hashtable_iterator() { }\n  // The default destructor is fine; we don't define one\n  // The default operator= is fine; we don't define one\n\n  // Happy dereferencer\n  reference operator*() const { return *pos; }\n  pointer operator->() const { return &(operator*()); }\n\n  // Arithmetic.  The only hard part is making sure that\n  // we're not on an empty or marked-deleted array element\n  void advance_past_empty_and_deleted() {\n    while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) )\n      ++pos;\n  }\n  iterator& operator++()   {\n    Assert(pos != end); ++pos; advance_past_empty_and_deleted(); return *this;\n  }\n  iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }\n\n  // Comparison.\n  bool operator==(const iterator& it) const { return pos == it.pos; }\n  bool operator!=(const iterator& it) const { return pos != it.pos; }\n\n\n  // The actual data\n  const dense_hashtable<V,K,HF,ExK,EqK,A> *ht;\n  pointer pos, end;\n};\n\n\n// Now do it all again, but with const-ness!\ntemplate <class V, class K, class HF, class ExK, class EqK, class A>\nstruct dense_hashtable_const_iterator {\n public:\n  typedef dense_hashtable_iterator<V,K,HF,ExK,EqK,A>       iterator;\n  typedef dense_hashtable_const_iterator<V,K,HF,ExK,EqK,A> const_iterator;\n\n  typedef std::forward_iterator_tag iterator_category;\n  typedef V value_type;\n  typedef std::ptrdiff_t difference_type;\n  typedef size_t size_type;\n  typedef const V& reference;                // Value\n  typedef const V* pointer;\n\n  // \"Real\" constructor and default constructor\n  dense_hashtable_const_iterator(const dense_hashtable<V,K,HF,ExK,EqK,A> *h,\n                                 pointer it, pointer it_end, bool advance)\n    : ht(h), pos(it), end(it_end)   {\n    if (advance)  advance_past_empty_and_deleted();\n  }\n  dense_hashtable_const_iterator() { }\n  // This lets us convert regular iterators to const iterators\n  dense_hashtable_const_iterator(const iterator &it)\n    : ht(it.ht), pos(it.pos), end(it.end) { }\n  // The default destructor is fine; we don't define one\n  // The default operator= is fine; we don't define one\n\n  // Happy dereferencer\n  reference operator*() const { return *pos; }\n  pointer operator->() const { return &(operator*()); }\n\n  // Arithmetic.  The only hard part is making sure that\n  // we're not on an empty or marked-deleted array element\n  void advance_past_empty_and_deleted() {\n    while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) )\n      ++pos;\n  }\n  const_iterator& operator++()   {\n    Assert(pos != end); ++pos; advance_past_empty_and_deleted(); return *this;\n  }\n  const_iterator operator++(int) { const_iterator tmp(*this); ++*this; return tmp; }\n\n  // Comparison.\n  bool operator==(const const_iterator& it) const { return pos == it.pos; }\n  bool operator!=(const const_iterator& it) const { return pos != it.pos; }\n\n\n  // The actual data\n  const dense_hashtable<V,K,HF,ExK,EqK,A> *ht;\n  pointer pos, end;\n};\n\ntemplate <class Value, class Key, class HashFcn,\n          class ExtractKey, class EqualKey, class Alloc>\nclass dense_hashtable {\n public:\n  typedef Key key_type;\n  typedef Value value_type;\n  typedef HashFcn hasher;\n  typedef EqualKey key_equal;\n\n  typedef size_t            size_type;\n  typedef std::ptrdiff_t         difference_type;\n  typedef value_type*       pointer;\n  typedef const value_type* const_pointer;\n  typedef value_type&       reference;\n  typedef const value_type& const_reference;\n  typedef dense_hashtable_iterator<Value, Key, HashFcn,\n                                   ExtractKey, EqualKey, Alloc>\n  iterator;\n\n  typedef dense_hashtable_const_iterator<Value, Key, HashFcn,\n                                          ExtractKey, EqualKey, Alloc>\n  const_iterator;\n\n  // How full we let the table get before we resize.  Knuth says .8 is\n  // good -- higher causes us to probe too much, though saves memory\n  static const float HT_OCCUPANCY_FLT; // = 0.8;\n\n  // How empty we let the table get before we resize lower.\n  // (0.0 means never resize lower.)\n  // It should be less than OCCUPANCY_FLT / 2 or we thrash resizing\n  static const float HT_EMPTY_FLT; // = 0.4 * HT_OCCUPANCY_FLT\n\n  // Minimum size we're willing to let hashtables be.\n  // Must be a power of two, and at least 4.\n  // Note, however, that for a given hashtable, the initial size is a\n  // function of the first constructor arg, and may be >HT_MIN_BUCKETS.\n  static const size_t HT_MIN_BUCKETS  = 32;\n\n\n  // ITERATOR FUNCTIONS\n  iterator begin()             { return iterator(this, table,\n                                                 table + num_buckets, true); }\n  iterator end()               { return iterator(this, table + num_buckets,\n                                                 table + num_buckets, true); }\n  const_iterator begin() const { return const_iterator(this, table,\n                                                       table+num_buckets,true);}\n  const_iterator end() const   { return const_iterator(this, table + num_buckets,\n                                                       table+num_buckets,true);}\n\n  // ACCESSOR FUNCTIONS for the things we templatize on, basically\n  hasher hash_funct() const { return hash; }\n  key_equal key_eq() const  { return equals; }\n\n  // Annoyingly, we can't copy values around, because they might have\n  // const components (they're probably pair<const X, Y>).  We use\n  // explicit destructor invocation and placement new to get around\n  // this.  Arg.\n private:\n  void set_value(value_type* dst, const value_type& src) {\n    dst->~value_type();\n    new(dst) value_type(src);\n  }\n\n  void destroy_buckets(size_type first, size_type last) {\n    for ( ; first != last; ++first)\n      table[first].~value_type();\n  }\n\n  // DELETE HELPER FUNCTIONS\n  // This lets the user describe a key that will indicate deleted\n  // table entries.  This key should be an \"impossible\" entry --\n  // if you try to insert it for real, you won't be able to retrieve it!\n  // (NB: while you pass in an entire value, only the key part is looked\n  // at.  This is just because I don't know how to assign just a key.)\n private:\n  void squash_deleted() {           // gets rid of any deleted entries we have\n    if ( num_deleted ) {            // get rid of deleted before writing\n      dense_hashtable tmp(*this);   // copying will get rid of deleted\n      swap(tmp);                    // now we are tmp\n    }\n    Assert(num_deleted == 0);\n  }\n\n public:\n  void set_deleted_key(const value_type &val) {\n    // the empty indicator (if specified) and the deleted indicator\n    // must be different\n    Assert(!use_empty || !equals(get_key(val), get_key(emptyval)));\n    // It's only safe to change what \"deleted\" means if we purge deleted guys\n    squash_deleted();\n    use_deleted = true;\n    set_value(&delval, val);\n  }\n  void clear_deleted_key() {\n    squash_deleted();\n    use_deleted = false;\n  }\n\n  // These are public so the iterators can use them\n  // True if the item at position bucknum is \"deleted\" marker\n  bool test_deleted(size_type bucknum) const {\n    // The num_deleted test is crucial for read(): after read(), the ht values\n    // are garbage, and we don't want to think some of them are deleted.\n    return (use_deleted && num_deleted > 0 &&\n            equals(get_key(delval), get_key(table[bucknum])));\n  }\n  bool test_deleted(const iterator &it) const {\n    return (use_deleted && num_deleted > 0 &&\n            equals(get_key(delval), get_key(*it)));\n  }\n  bool test_deleted(const const_iterator &it) const {\n    return (use_deleted && num_deleted > 0 &&\n            equals(get_key(delval), get_key(*it)));\n  }\n  // Set it so test_deleted is true.  true if object didn't used to be deleted\n  // See below (at erase()) to explain why we allow const_iterators\n  bool set_deleted(const_iterator &it) {\n    Assert(use_deleted);             // bad if set_deleted_key() wasn't called\n    bool retval = !test_deleted(it);\n    // &* converts from iterator to value-type\n    set_value(const_cast<value_type*>(&(*it)), delval);\n    return retval;\n  }\n  // Set it so test_deleted is false.  true if object used to be deleted\n  bool clear_deleted(const_iterator &it) {\n    Assert(use_deleted);             // bad if set_deleted_key() wasn't called\n    // happens automatically when we assign something else in its place\n    return test_deleted(it);\n  }\n\n  // EMPTY HELPER FUNCTIONS\n  // This lets the user describe a key that will indicate empty (unused)\n  // table entries.  This key should be an \"impossible\" entry --\n  // if you try to insert it for real, you won't be able to retrieve it!\n  // (NB: while you pass in an entire value, only the key part is looked\n  // at.  This is just because I don't know how to assign just a key.)\n public:\n  // These are public so the iterators can use them\n  // True if the item at position bucknum is \"empty\" marker\n  bool test_empty(size_type bucknum) const {\n    Assert(use_empty);              // we always need to know what's empty!\n    return equals(get_key(emptyval), get_key(table[bucknum]));\n  }\n  bool test_empty(const iterator &it) const {\n    Assert(use_empty);              // we always need to know what's empty!\n    return equals(get_key(emptyval), get_key(*it));\n  }\n  bool test_empty(const const_iterator &it) const {\n    Assert(use_empty);              // we always need to know what's empty!\n    return equals(get_key(emptyval), get_key(*it));\n  }\n\n private:\n  // You can either set a range empty or an individual element\n  void set_empty(size_type bucknum) {\n    Assert(use_empty);\n    set_value(&table[bucknum], emptyval);\n  }\n  void fill_range_with_empty(value_type* table_start, value_type* table_end) {\n    // Like set_empty(range), but doesn't destroy previous contents\n    std::uninitialized_fill(table_start, table_end, emptyval);\n  }\n  void set_empty(size_type buckstart, size_type buckend) {\n    Assert(use_empty);\n    destroy_buckets(buckstart, buckend);\n    fill_range_with_empty(table + buckstart, table + buckend);\n  }\n\n public:\n  // TODO(csilvers): change all callers of this to pass in a key instead,\n  //                 and take a const key_type instead of const value_type.\n  void set_empty_key(const value_type &val) {\n    // Once you set the empty key, you can't change it\n    Assert(!use_empty);\n    // The deleted indicator (if specified) and the empty indicator\n    // must be different.\n    Assert(!use_deleted || !equals(get_key(val), get_key(delval)));\n    use_empty = true;\n    set_value(&emptyval, val);\n\n    Assert(!table);                  // must set before first use\n    // num_buckets was set in constructor even though table was NULL\n\ttable = _Alval.allocate(num_buckets);\n    Assert(table);\n    fill_range_with_empty(table, table + num_buckets);\n  }\n\n  // FUNCTIONS CONCERNING SIZE\n public:\n  size_type size() const      { return num_elements - num_deleted; }\n  // Buckets are always a power of 2\n  size_type max_size() const  { return (size_type(-1) >> 1U) + 1; }\n  bool empty() const          { return size() == 0; }\n  size_type bucket_count() const      { return num_buckets; }\n  size_type max_bucket_count() const  { return max_size(); }\n  size_type nonempty_bucket_count() const { return num_elements; }\n\n private:\n  // Because of the above, size_type(-1) is never legal; use it for errors\n  static const size_type ILLEGAL_BUCKET = size_type(-1);\n\n private:\n  // This is the smallest size a hashtable can be without being too crowded\n  // If you like, you can give a min #buckets as well as a min #elts\n  size_type min_size(size_type num_elts, size_type min_buckets_wanted) {\n    size_type sz = HT_MIN_BUCKETS;             // min buckets allowed\n    while ( sz < min_buckets_wanted || num_elts >= sz * HT_OCCUPANCY_FLT )\n      sz *= 2;\n    return sz;\n  }\n\n  // Used after a string of deletes\n  void maybe_shrink() {\n    Assert(num_elements >= num_deleted);\n    Assert((bucket_count() & (bucket_count()-1)) == 0); // is a power of two\n    Assert(bucket_count() >= HT_MIN_BUCKETS);\n\n    if ( (num_elements-num_deleted) < shrink_threshold &&\n         bucket_count() > HT_MIN_BUCKETS ) {\n      size_type sz = bucket_count() / 2;    // find how much we should shrink\n      while ( sz > HT_MIN_BUCKETS &&\n              (num_elements - num_deleted) < sz * HT_EMPTY_FLT )\n        sz /= 2;                            // stay a power of 2\n      dense_hashtable tmp(*this, sz);       // Do the actual resizing\n      swap(tmp);                            // now we are tmp\n    }\n    consider_shrink = false;                // because we just considered it\n  }\n\n  // We'll let you resize a hashtable -- though this makes us copy all!\n  // When you resize, you say, \"make it big enough for this many more elements\"\n  void resize_delta(size_type delta, size_type min_buckets_wanted = 0) {\n    if ( consider_shrink )                   // see if lots of deletes happened\n      maybe_shrink();\n    if ( bucket_count() > min_buckets_wanted &&\n         (num_elements + delta) <= enlarge_threshold )\n      return;                                // we're ok as we are\n\n    // Sometimes, we need to resize just to get rid of all the\n    // \"deleted\" buckets that are clogging up the hashtable.  So when\n    // deciding whether to resize, count the deleted buckets (which\n    // are currently taking up room).  But later, when we decide what\n    // size to resize to, *don't* count deleted buckets, since they\n    // get discarded during the resize.\n    const size_type needed_size = min_size(num_elements + delta,\n                                           min_buckets_wanted);\n    if ( needed_size > bucket_count() ) {      // we don't have enough buckets\n      const size_type resize_to = min_size(num_elements - num_deleted + delta,\n                                           min_buckets_wanted);\n      dense_hashtable tmp(*this, resize_to);\n      swap(tmp);                             // now we are tmp\n    }\n  }\n\n  // Increase number of buckets, assuming value_type has trivial copy\n  // constructor and destructor.  (Really, we want it to have \"trivial\n  // move\", because that's what realloc does.  But there's no way to\n  // capture that using type_traits, so we pretend that move(x, y) is\n  // equivalent to \"x.~T(); new(x) T(y);\" which is pretty much\n  // correct, if a bit conservative.)\n\tvoid expand_array(size_t resize_to, dense_hash_map_traits::true_type) {\n\t\tvalue_type* new_table = _Alval.allocate(resize_to);\n\t\tAssert(new_table);\n\t\tif(table)\n\t\t{\n\t\t\tstd::uninitialized_copy(table, table + num_buckets, new_table);\n\t\t\t_Alval.deallocate(table, num_buckets);\n\t\t}\n\t\tfill_range_with_empty(new_table + num_buckets, new_table + resize_to);\n\t\ttable = new_table;\n\t\tAssert(table);\n  }\n\n  // Increase number of buckets, without special assumptions about value_type.\n  // TODO(austern): make this exception safe. Handle exceptions from\n  // value_type's copy constructor.\n  void expand_array(size_t resize_to, dense_hash_map_traits::false_type) {\n    value_type* new_table = _Alval.allocate(resize_to);\n    Assert(new_table);\n    std::uninitialized_copy(table, table + std::min(num_buckets,resize_to), new_table);\n    fill_range_with_empty(new_table + num_buckets, new_table + resize_to);\n    destroy_buckets(0, num_buckets);\n    _Alval.deallocate(table, num_buckets);\n    table = new_table;\n  }\n\n  // Used to actually do the rehashing when we grow/shrink a hashtable\n  void copy_from(const dense_hashtable &ht, size_type min_buckets_wanted = 0) {\n    clear();            // clear table, set num_deleted to 0\n\n    // If we need to change the size of our table, do it now\n    const size_type resize_to = min_size(ht.size(), min_buckets_wanted);\n    if ( resize_to > bucket_count() ) { // we don't have enough buckets\n      typedef dense_hash_map_traits::integral_constant<bool,\n          (dense_hash_map_traits::has_trivial_copy<value_type>::value &&\n           dense_hash_map_traits::has_trivial_destructor<value_type>::value)>\n          realloc_ok; // we pretend mv(x,y) == \"x.~T(); new(x) T(y)\"\n      expand_array(resize_to, realloc_ok());\n      num_buckets = resize_to;\n      reset_thresholds();\n    }\n\n    // We use a normal iterator to get non-deleted bcks from ht\n    // We could use insert() here, but since we know there are\n    // no duplicates and no deleted items, we can be more efficient\n    Assert((bucket_count() & (bucket_count()-1)) == 0);      // a power of two\n    for ( const_iterator it = ht.begin(); it != ht.end(); ++it ) {\n      size_type num_probes = 0;              // how many times we've probed\n      size_type bucknum;\n      const size_type bucket_count_minus_one = bucket_count() - 1;\n      for (bucknum = hash(get_key(*it)) & bucket_count_minus_one;\n           !test_empty(bucknum);                               // not empty\n           bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one) {\n        ++num_probes;\n        Assert(num_probes < bucket_count()); // or else the hashtable is full\n      }\n      set_value(&table[bucknum], *it);       // copies the value to here\n      num_elements++;\n    }\n  }\n\n  // Required by the spec for hashed associative container\n public:\n  // Though the docs say this should be num_buckets, I think it's much\n  // more useful as req_elements.  As a special feature, calling with\n  // req_elements==0 will cause us to shrink if we can, saving space.\n  void resize(size_type req_elements) {       // resize to this or larger\n    if ( consider_shrink || req_elements == 0 )\n      maybe_shrink();\n    if ( req_elements > num_elements )\n      return resize_delta(req_elements - num_elements, 0);\n  }\n\n\n  // CONSTRUCTORS -- as required by the specs, we take a size,\n  // but also let you specify a hashfunction, key comparator,\n  // and key extractor.  We also define a copy constructor and =.\n  // DESTRUCTOR -- needs to free the table\n  explicit dense_hashtable(size_type n = 0,\n                           const HashFcn& hf = HashFcn(),\n                           const EqualKey& eql = EqualKey(),\n                           const ExtractKey& ext = ExtractKey())\n    : hash(hf), equals(eql), get_key(ext), num_deleted(0),\n      use_deleted(false), use_empty(false),\n      delval(), emptyval(),\n      table(NULL), num_buckets(min_size(0, n)), num_elements(0) {\n    // table is NULL until emptyval is set.  However, we set num_buckets\n    // here so we know how much space to allocate once emptyval is set\n    reset_thresholds();\n  }\n\n  // As a convenience for resize(), we allow an optional second argument\n  // which lets you make this new hashtable a different size than ht\n  dense_hashtable(const dense_hashtable& ht, size_type min_buckets_wanted = 0)\n    : hash(ht.hash), equals(ht.equals), get_key(ht.get_key), num_deleted(0),\n      use_deleted(ht.use_deleted), use_empty(ht.use_empty),\n      delval(ht.delval), emptyval(ht.emptyval),\n      table(NULL), num_buckets(0),\n      num_elements(0) {\n    reset_thresholds();\n    copy_from(ht, min_buckets_wanted);   // copy_from() ignores deleted entries\n  }\n\n  dense_hashtable& operator= (const dense_hashtable& ht) {\n    if (&ht == this)  return *this;        // don't copy onto ourselves\n    clear();\n    hash = ht.hash;\n    equals = ht.equals;\n    get_key = ht.get_key;\n    use_deleted = ht.use_deleted;\n    use_empty = ht.use_empty;\n    set_value(&delval, ht.delval);\n    set_value(&emptyval, ht.emptyval);\n    copy_from(ht);                         // sets num_deleted to 0 too\n    return *this;\n  }\n\n  ~dense_hashtable() {\n    if (table) {\n      destroy_buckets(0, num_buckets);\n      _Alval.deallocate(table, num_buckets);\n    }\n  }\n\n  // Many STL algorithms use swap instead of copy constructors\n  void swap(dense_hashtable& ht) {\n    std::swap(hash, ht.hash);\n    std::swap(equals, ht.equals);\n    std::swap(get_key, ht.get_key);\n    std::swap(num_deleted, ht.num_deleted);\n    std::swap(use_deleted, ht.use_deleted);\n    std::swap(use_empty, ht.use_empty);\n    { value_type tmp;     // for annoying reasons, swap() doesn't work\n      set_value(&tmp, delval);\n      set_value(&delval, ht.delval);\n      set_value(&ht.delval, tmp);\n    }\n    { value_type tmp;     // for annoying reasons, swap() doesn't work\n      set_value(&tmp, emptyval);\n      set_value(&emptyval, ht.emptyval);\n      set_value(&ht.emptyval, tmp);\n    }\n    std::swap(table, ht.table);\n    std::swap(num_buckets, ht.num_buckets);\n    std::swap(num_elements, ht.num_elements);\n    reset_thresholds();\n    ht.reset_thresholds();\n  }\n\n  // It's always nice to be able to clear a table without deallocating it\n  void clear() {\n    if (table)\n      destroy_buckets(0, num_buckets);\n\n\tsize_type old_bucket_count = num_buckets;\n\tnum_buckets = min_size(0,0);          // our new size\n    reset_thresholds();\n\tvalue_type* new_table = _Alval.allocate(num_buckets);\n\tAssert(new_table);\n\tif(table)\n\t\t_Alval.deallocate(table, old_bucket_count);\n\ttable = new_table;\n\tAssert(table);\n\tfill_range_with_empty(table, table + num_buckets);\n\tnum_elements = 0;\n\tnum_deleted = 0;\n  }\n\n  // Clear the table without resizing it.\n  // Mimicks the stl_hashtable's behaviour when clear()-ing in that it\n  // does not modify the bucket count\n  void clear_no_resize() {\n    if (table) {\n      set_empty(0, num_buckets);\n    }\n    // don't consider to shrink before another erase()\n    reset_thresholds();\n    num_elements = 0;\n    num_deleted = 0;\n  }\n\n  // LOOKUP ROUTINES\n private:\n  // Returns a pair of positions: 1st where the object is, 2nd where\n  // it would go if you wanted to insert it.  1st is ILLEGAL_BUCKET\n  // if object is not found; 2nd is ILLEGAL_BUCKET if it is.\n  // Note: because of deletions where-to-insert is not trivial: it's the\n  // first deleted bucket we see, as long as we don't find the key later\n  pair<size_type, size_type> find_position(const key_type &key) const {\n    size_type num_probes = 0;              // how many times we've probed\n    const size_type bucket_count_minus_one = bucket_count() - 1;\n    size_type bucknum = hash(key) & bucket_count_minus_one;\n    size_type insert_pos = ILLEGAL_BUCKET; // where we would insert\n    while ( 1 ) {                          // probe until something happens\n      if ( test_empty(bucknum) ) {         // bucket is empty\n        if ( insert_pos == ILLEGAL_BUCKET )   // found no prior place to insert\n          return pair<size_type,size_type>(ILLEGAL_BUCKET, bucknum);\n        else\n          return pair<size_type,size_type>(ILLEGAL_BUCKET, insert_pos);\n\n      } else if ( test_deleted(bucknum) ) {// keep searching, but mark to insert\n        if ( insert_pos == ILLEGAL_BUCKET )\n          insert_pos = bucknum;\n\n      } else if ( equals(key, get_key(table[bucknum])) ) {\n        return pair<size_type,size_type>(bucknum, ILLEGAL_BUCKET);\n      }\n      ++num_probes;                        // we're doing another probe\n      bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one;\n      Assert(num_probes < bucket_count()); // don't probe too many times!\n    }\n  }\n\n public:\n  iterator find(const key_type& key) {\n    if ( size() == 0 ) return end();\n    pair<size_type, size_type> pos = find_position(key);\n    if ( pos.first == ILLEGAL_BUCKET )     // alas, not there\n      return end();\n    else\n      return iterator(this, table + pos.first, table + num_buckets, false);\n  }\n\n  const_iterator find(const key_type& key) const {\n    if ( size() == 0 ) return end();\n    pair<size_type, size_type> pos = find_position(key);\n    if ( pos.first == ILLEGAL_BUCKET )     // alas, not there\n      return end();\n    else\n      return const_iterator(this, table + pos.first, table+num_buckets, false);\n  }\n\n  // Counts how many elements have key key.  For maps, it's either 0 or 1.\n  size_type count(const key_type &key) const {\n    pair<size_type, size_type> pos = find_position(key);\n    return pos.first == ILLEGAL_BUCKET ? 0 : 1;\n  }\n\n  // Likewise, equal_range doesn't really make sense for us.  Oh well.\n  pair<iterator,iterator> equal_range(const key_type& key) {\n    const iterator pos = find(key);      // either an iterator or end\n    return pair<iterator,iterator>(pos, pos);\n  }\n  pair<const_iterator,const_iterator> equal_range(const key_type& key) const {\n    const const_iterator pos = find(key);      // either an iterator or end\n    return pair<iterator,iterator>(pos, pos);\n  }\n\n\n  // INSERTION ROUTINES\n private:\n  // If you know *this is big enough to hold obj, use this routine\n  pair<iterator, bool> insert_noresize(const value_type& obj) {\n    const pair<size_type,size_type> pos = find_position(get_key(obj));\n    if ( pos.first != ILLEGAL_BUCKET) {      // object was already there\n      return pair<iterator,bool>(iterator(this, table + pos.first,\n                                          table + num_buckets, false),\n                                 false);          // false: we didn't insert\n    } else {                                 // pos.second says where to put it\n      if ( test_deleted(pos.second) ) {      // just replace if it's been del.\n        const_iterator delpos(this, table + pos.second,              // shrug:\n                              table + num_buckets, false);// shouldn't need const\n        clear_deleted(delpos);\n        Assert( num_deleted > 0);\n        --num_deleted;                       // used to be, now it isn't\n      } else {\n        ++num_elements;                      // replacing an empty bucket\n      }\n      set_value(&table[pos.second], obj);\n      return pair<iterator,bool>(iterator(this, table + pos.second,\n                                          table + num_buckets, false),\n                                 true);           // true: we did insert\n    }\n  }\n\n public:\n  // This is the normal insert routine, used by the outside world\n  pair<iterator, bool> insert(const value_type& obj) {\n    resize_delta(1);                      // adding an object, grow if need be\n    return insert_noresize(obj);\n  }\n\n  // When inserting a lot at a time, we specialize on the type of iterator\n  template <class InputIterator>\n  void insert(InputIterator f, InputIterator l) {\n    // specializes on iterator type\n    insert(f, l, typename std::iterator_traits<InputIterator>::iterator_category());\n  }\n\n  // Iterator supports operator-, resize before inserting\n  template <class ForwardIterator>\n  void insert(ForwardIterator f, ForwardIterator l,\n              std::forward_iterator_tag) {\n    size_type n = std::distance(f, l);   // TODO(csilvers): standard?\n    resize_delta(n);\n    for ( ; n > 0; --n, ++f)\n      insert_noresize(*f);\n  }\n\n  // Arbitrary iterator, can't tell how much to resize\n  template <class InputIterator>\n  void insert(InputIterator f, InputIterator l,\n              std::input_iterator_tag) {\n    for ( ; f != l; ++f)\n      insert(*f);\n  }\n\n\n  // DELETION ROUTINES\n  size_type erase(const key_type& key) {\n    const_iterator pos = find(key);   // shrug: shouldn't need to be const\n    if ( pos != end() ) {\n      Assert(!test_deleted(pos));  // or find() shouldn't have returned it\n      set_deleted(pos);\n      ++num_deleted;\n      consider_shrink = true;      // will think about shrink after next insert\n      return 1;                    // because we deleted one thing\n    } else {\n      return 0;                    // because we deleted nothing\n    }\n  }\n\n  // This is really evil: really it should be iterator, not const_iterator.\n  // But...the only reason keys are const is to allow lookup.\n  // Since that's a moot issue for deleted keys, we allow const_iterators\n  void erase(const_iterator pos) {\n    if ( pos == end() ) return;    // sanity check\n    if ( set_deleted(pos) ) {      // true if object has been newly deleted\n      ++num_deleted;\n      consider_shrink = true;      // will think about shrink after next insert\n    }\n  }\n\n  void erase(const_iterator f, const_iterator l) {\n    for ( ; f != l; ++f) {\n      if ( set_deleted(f)  )       // should always be true\n        ++num_deleted;\n    }\n    consider_shrink = true;        // will think about shrink after next insert\n  }\n\n\n  // COMPARISON\n  bool operator==(const dense_hashtable& ht) const {\n    if (size() != ht.size()) {\n      return false;\n    } else if (this == &ht) {\n      return true;\n    } else {\n      // Iterate through the elements in \"this\" and see if the\n      // corresponding element is in ht\n      for ( const_iterator it = begin(); it != end(); ++it ) {\n        const_iterator it2 = ht.find(get_key(*it));\n        if ((it2 == ht.end()) || (*it != *it2)) {\n          return false;\n        }\n      }\n      return true;\n    }\n  }\n  bool operator!=(const dense_hashtable& ht) const {\n    return !(*this == ht);\n  }\n\n\n private:\n  // The actual data\n  hasher hash;                      // required by hashed_associative_container\n  key_equal equals;\n  ExtractKey get_key;\n  size_type num_deleted;        // how many occupied buckets are marked deleted\n  bool use_deleted;                          // false until delval has been set\n  bool use_empty;                          // you must do this before you start\n  value_type delval;                         // which key marks deleted entries\n  value_type emptyval;                        // which key marks unused entries\n  value_type *table;\n  size_type num_buckets;\n  size_type num_elements;\n  size_type shrink_threshold;                     // num_buckets * HT_EMPTY_FLT\n  size_type enlarge_threshold;                // num_buckets * HT_OCCUPANCY_FLT\n  bool consider_shrink;   // true if we should try to shrink before next insert\n\n  Alloc _Alval;                              // allocator object for value_type\n\n  void reset_thresholds() {\n    enlarge_threshold = static_cast<size_type>(num_buckets*HT_OCCUPANCY_FLT);\n    shrink_threshold = static_cast<size_type>(num_buckets*HT_EMPTY_FLT);\n    consider_shrink = false;   // whatever caused us to reset already considered\n  }\n};\n\n// We need a global swap as well\ntemplate <class V, class K, class HF, class ExK, class EqK, class A>\ninline void swap(dense_hashtable<V,K,HF,ExK,EqK,A> &x,\n                 dense_hashtable<V,K,HF,ExK,EqK,A> &y) {\n  x.swap(y);\n}\n\n#undef JUMP_\n\ntemplate <class V, class K, class HF, class ExK, class EqK, class A>\nconst typename dense_hashtable<V,K,HF,ExK,EqK,A>::size_type\n  dense_hashtable<V,K,HF,ExK,EqK,A>::ILLEGAL_BUCKET;\n\n// How full we let the table get before we resize.  Knuth says .8 is\n// good -- higher causes us to probe too much, though saves memory\ntemplate <class V, class K, class HF, class ExK, class EqK, class A>\nconst float dense_hashtable<V,K,HF,ExK,EqK,A>::HT_OCCUPANCY_FLT = 0.5f;\n\n// How empty we let the table get before we resize lower.\n// It should be less than OCCUPANCY_FLT / 2 or we thrash resizing\ntemplate <class V, class K, class HF, class ExK, class EqK, class A>\nconst float dense_hashtable<V,K,HF,ExK,EqK,A>::HT_EMPTY_FLT = 0.4f *\ndense_hashtable<V,K,HF,ExK,EqK,A>::HT_OCCUPANCY_FLT;\n\n#endif /* _DENSEHASHTABLE_H_ */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/google/sparsehash/type_traits.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// ----\n// Author: Matt Austern\n//\n// Define a small subset of tr1 type traits. The traits we define are:\n//   is_integral\n//   is_floating_point\n//   is_pointer\n//   is_reference\n//   is_pod\n//   has_trivial_constructor\n//   has_trivial_copy\n//   has_trivial_assign\n//   has_trivial_destructor\n//   remove_const\n//   remove_volatile\n//   remove_cv\n//   remove_reference\n//   remove_pointer\n//   is_convertible\n// We can add more type traits as required.\n\n#ifndef BASE_TYPE_TRAITS_H_\n#define BASE_TYPE_TRAITS_H_\n\n//#include <google/sparsehash/sparseconfig.h>\n#include <utility>                  // For pair\n\nnamespace dense_hash_map_traits\n{\n\n// integral_constant, defined in tr1, is a wrapper for an integer\n// value. We don't really need this generality; we could get away\n// with hardcoding the integer type to bool. We use the fully\n// general integer_constant for compatibility with tr1.\n\ntemplate<class T, T v>\nstruct integral_constant {\n  static const T value = v;\n  typedef T value_type;\n  typedef integral_constant<T, v> type;\n};\n\ntemplate <class T, T v> const T integral_constant<T, v>::value;\n\n// Abbreviations: true_type and false_type are structs that represent\n// boolean true and false values.\ntypedef integral_constant<bool, true>  true_type;\ntypedef integral_constant<bool, false> false_type;\n\n// Types small_ and big_ are guaranteed such that sizeof(small_) <\n// sizeof(big_)\ntypedef char small_;\n\nstruct big_ {\n  char dummy[2];\n};\n\n// is_integral is false except for the built-in integer types.\ntemplate <class T> struct is_integral : false_type { };\ntemplate<> struct is_integral<bool> : true_type { };\ntemplate<> struct is_integral<char> : true_type { };\ntemplate<> struct is_integral<unsigned char> : true_type { };\ntemplate<> struct is_integral<signed char> : true_type { };\n#if defined(_MSC_VER)\n// wchar_t is not by default a distinct type from unsigned short in\n// Microsoft C.\n// See http://msdn2.microsoft.com/en-us/library/dh8che7s(VS.80).aspx\ntemplate<> struct is_integral<__wchar_t> : true_type { };\n#else\ntemplate<> struct is_integral<wchar_t> : true_type { };\n#endif\ntemplate<> struct is_integral<short> : true_type { };\ntemplate<> struct is_integral<unsigned short> : true_type { };\ntemplate<> struct is_integral<int> : true_type { };\ntemplate<> struct is_integral<unsigned int> : true_type { };\ntemplate<> struct is_integral<long> : true_type { };\ntemplate<> struct is_integral<unsigned long> : true_type { };\n#ifdef HAVE_LONG_LONG\ntemplate<> struct is_integral<long long> : true_type { };\ntemplate<> struct is_integral<unsigned long long> : true_type { };\n#endif\n\n\n// is_floating_point is false except for the built-in floating-point types.\ntemplate <class T> struct is_floating_point : false_type { };\ntemplate<> struct is_floating_point<float> : true_type { };\ntemplate<> struct is_floating_point<double> : true_type { };\ntemplate<> struct is_floating_point<long double> : true_type { };\n\n\n// is_pointer is false except for pointer types.\ntemplate <class T> struct is_pointer : false_type { };\ntemplate <class T> struct is_pointer<T*> : true_type { };\n\n\n// is_reference is false except for reference types.\ntemplate<typename T> struct is_reference : false_type {};\ntemplate<typename T> struct is_reference<T&> : true_type {};\n\n\n// We can't get is_pod right without compiler help, so fail conservatively.\n// We will assume it's false except for arithmetic types and pointers,\n// and const versions thereof. Note that std::pair is not a POD.\ntemplate <class T> struct is_pod\n : integral_constant<bool, (is_integral<T>::value ||\n                            is_floating_point<T>::value ||\n                            is_pointer<T>::value)> { };\ntemplate <class T> struct is_pod<const T> : is_pod<T> { };\n\n\n// We can't get has_trivial_constructor right without compiler help, so\n// fail conservatively. We will assume it's false except for: (1) types\n// for which is_pod is true. (2) std::pair of types with trivial\n// constructors. (3) array of a type with a trivial constructor.\n// (4) const versions thereof.\ntemplate <class T> struct has_trivial_constructor : is_pod<T> { };\ntemplate <class T, class U> struct has_trivial_constructor<std::pair<T, U> >\n  : integral_constant<bool,\n                      (has_trivial_constructor<T>::value &&\n                       has_trivial_constructor<U>::value)> { };\ntemplate <class A, int N> struct has_trivial_constructor<A[N]>\n  : has_trivial_constructor<A> { };\ntemplate <class T> struct has_trivial_constructor<const T>\n  : has_trivial_constructor<T> { };\n\n// We can't get has_trivial_copy right without compiler help, so fail\n// conservatively. We will assume it's false except for: (1) types\n// for which is_pod is true. (2) std::pair of types with trivial copy\n// constructors. (3) array of a type with a trivial copy constructor.\n// (4) const versions thereof.\ntemplate <class T> struct has_trivial_copy : is_pod<T> { };\ntemplate <class T, class U> struct has_trivial_copy<std::pair<T, U> >\n  : integral_constant<bool,\n                      (has_trivial_copy<T>::value &&\n                       has_trivial_copy<U>::value)> { };\ntemplate <class A, int N> struct has_trivial_copy<A[N]>\n  : has_trivial_copy<A> { };\ntemplate <class T> struct has_trivial_copy<const T> : has_trivial_copy<T> { };\n\n// We can't get has_trivial_assign right without compiler help, so fail\n// conservatively. We will assume it's false except for: (1) types\n// for which is_pod is true. (2) std::pair of types with trivial copy\n// constructors. (3) array of a type with a trivial assign constructor.\ntemplate <class T> struct has_trivial_assign : is_pod<T> { };\ntemplate <class T, class U> struct has_trivial_assign<std::pair<T, U> >\n  : integral_constant<bool,\n                      (has_trivial_assign<T>::value &&\n                       has_trivial_assign<U>::value)> { };\ntemplate <class A, int N> struct has_trivial_assign<A[N]>\n  : has_trivial_assign<A> { };\n\n// We can't get has_trivial_destructor right without compiler help, so\n// fail conservatively. We will assume it's false except for: (1) types\n// for which is_pod is true. (2) std::pair of types with trivial\n// destructors. (3) array of a type with a trivial destructor.\n// (4) const versions thereof.\ntemplate <class T> struct has_trivial_destructor : is_pod<T> { };\ntemplate <class T, class U> struct has_trivial_destructor<std::pair<T, U> >\n  : integral_constant<bool,\n                      (has_trivial_destructor<T>::value &&\n                       has_trivial_destructor<U>::value)> { };\ntemplate <class A, int N> struct has_trivial_destructor<A[N]>\n  : has_trivial_destructor<A> { };\ntemplate <class T> struct has_trivial_destructor<const T>\n  : has_trivial_destructor<T> { };\n\n// Specified by TR1 [4.7.1]\ntemplate<typename T> struct remove_const { typedef T type; };\ntemplate<typename T> struct remove_const<T const> { typedef T type; };\ntemplate<typename T> struct remove_volatile { typedef T type; };\ntemplate<typename T> struct remove_volatile<T volatile> { typedef T type; };\ntemplate<typename T> struct remove_cv {\n  typedef typename remove_const<typename remove_volatile<T>::type>::type type;\n};\n\n\n// Specified by TR1 [4.7.2]\ntemplate<typename T> struct remove_reference { typedef T type; };\ntemplate<typename T> struct remove_reference<T&> { typedef T type; };\n\n// Specified by TR1 [4.7.4] Pointer modifications.\ntemplate<typename T> struct remove_pointer { typedef T type; };\ntemplate<typename T> struct remove_pointer<T*> { typedef T type; };\ntemplate<typename T> struct remove_pointer<T* const> { typedef T type; };\ntemplate<typename T> struct remove_pointer<T* volatile> { typedef T type; };\ntemplate<typename T> struct remove_pointer<T* const volatile> {\n  typedef T type; };\n\n// Specified by TR1 [4.6] Relationships between types\n#ifndef _MSC_VER\nnamespace internal_type_traits {\n\n// This class is an implementation detail for is_convertible, and you\n// don't need to know how it works to use is_convertible. For those\n// who care: we declare two different functions, one whose argument is\n// of type To and one with a variadic argument list. We give them\n// return types of different size, so we can use sizeof to trick the\n// compiler into telling us which function it would have chosen if we\n// had called it with an argument of type From.  See Alexandrescu's\n// _Modern C++ Design_ for more details on this sort of trick.\n\ntemplate <typename From, typename To>\nstruct ConvertHelper {\n  static small_ Test(To);\n  static big_ Test(...);\n  static From Create();\n};\n}  // namespace internal\n\n// Inherits from true_type if From is convertible to To, false_type otherwise.\ntemplate <typename From, typename To>\nstruct is_convertible\n    : integral_constant<bool,\n                        sizeof(internal_type_traits::ConvertHelper<From, To>::Test(\n                                  internal_type_traits::ConvertHelper<From, To>::Create()))\n                        == sizeof(small_)> {\n};\n#endif\n\n}\n#endif  // BASE_TYPE_TRAITS_H_\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/xamarin-android/README",
    "content": "Files copied by Unity to fix case 751744 (NetworkInterface.GetAllNetworkInterfaces method not working on Android).\nSource: https://github.com/xamarin/xamarin-android\nRevision: ff86ed81928b69118d14f1f97f4e22832fc5c7fb\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/xamarin-android/logger.h",
    "content": "#ifndef __MONODROID_LOGGER_H__\n#define __MONODROID_LOGGER_H__\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef ANDROID\ntypedef enum android_LogPriority\n{\n    ANDROID_LOG_UNKNOWN = 0,\n    ANDROID_LOG_DEFAULT,    /* only for SetMinPriority() */\n    ANDROID_LOG_VERBOSE,\n    ANDROID_LOG_DEBUG,\n    ANDROID_LOG_INFO,\n    ANDROID_LOG_WARN,\n    ANDROID_LOG_ERROR,\n    ANDROID_LOG_FATAL,\n    ANDROID_LOG_SILENT,     /* only for SetMinPriority(); must be last */\n} android_LogPriority;\n#endif\n\n// Keep in sync with Mono.Android/src/Runtime/Logger.cs!LogCategories enum\ntypedef enum _LogCategories\n{\n    LOG_NONE      = 0,\n    LOG_DEFAULT   = 1 << 0,\n    LOG_ASSEMBLY  = 1 << 1,\n    LOG_DEBUGGER  = 1 << 2,\n    LOG_GC        = 1 << 3,\n    LOG_GREF      = 1 << 4,\n    LOG_LREF      = 1 << 5,\n    LOG_TIMING    = 1 << 6,\n    LOG_BUNDLE    = 1 << 7,\n    LOG_NET       = 1 << 8,\n    LOG_NETLINK   = 1 << 9,\n} LogCategories;\n\n#if 0\n\nextern unsigned int log_categories;\n\n#if DEBUG\nextern int gc_spew_enabled;\n#endif\n\nvoid init_categories(const char *override_dir);\n\nvoid log_error(LogCategories category, const char *format, ...);\n\nvoid log_fatal(LogCategories category, const char *format, ...);\n\nvoid log_info(LogCategories category, const char *format, ...);\n\nvoid log_warn(LogCategories category, const char *format, ...);\n\nvoid log_debug(LogCategories category, const char *format, ...);\n\n#else\n\n#define init_categories(override_dir)\n#define log_error(category, format, ...)\n#define log_fatal(category, format, ...)\n#define log_info(category, format, ...)\n#define log_warn(category, format, ...)\n#define log_debug(category, format, ...)\n\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __MONODROID_LOGGER_H__ */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/xamarin-android/monodroid.h",
    "content": "#ifndef __MONODROID_H\n#define __MONODROID_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* VS 2010 and later have stdint.h */\n#if defined(_MSC_VER)\n\n    #define MONO_API_EXPORT __declspec(dllexport)\n    #define MONO_API_IMPORT __declspec(dllimport)\n\n#else   /* defined(_MSC_VER */\n\n    #define MONO_API_EXPORT __attribute__ ((visibility (\"default\")))\n    #define MONO_API_IMPORT\n\n#endif  /* !defined(_MSC_VER) */\n\n#if defined(MONO_DLL_EXPORT)\n    #define MONO_API MONO_API_EXPORT\n#elif defined(MONO_DLL_IMPORT)\n    #define MONO_API MONO_API_IMPORT\n#else   /* !defined(MONO_DLL_IMPORT) && !defined(MONO_API_IMPORT) */\n    #define MONO_API\n#endif  /* MONO_DLL_EXPORT... */\n\nenum FatalExitCodes\n{\n    FATAL_EXIT_CANNOT_FIND_MONO           =  1,\n    FATAL_EXIT_ATTACH_JVM_FAILED          =  2,\n    FATAL_EXIT_DEBUGGER_CONNECT           =  3,\n    FATAL_EXIT_CANNOT_FIND_JNIENV         =  4,\n    FATAL_EXIT_CANNOT_FIND_APK            = 10,\n    FATAL_EXIT_TRIAL_EXPIRED              = 11,\n    FATAL_EXIT_PTHREAD_FAILED             = 12,\n    FATAL_EXIT_MISSING_ASSEMBLY           = 13,\n    FATAL_EXIT_CANNOT_LOAD_BUNDLE         = 14,\n    FATAL_EXIT_CANNOT_FIND_LIBMONOSGEN    = 15,\n    FATAL_EXIT_NO_ASSEMBLIES              = 'A',\n    FATAL_EXIT_MONO_MISSING_SYMBOLS       = 'B',\n    FATAL_EXIT_FORK_FAILED                = 'F',\n    FATAL_EXIT_MISSING_INIT               = 'I',\n    FATAL_EXIT_MISSING_TIMEZONE_MEMBERS   = 'T',\n    FATAL_EXIT_MISSING_ZIPALIGN           = 'Z',\n    FATAL_EXIT_OUT_OF_MEMORY              = 'M',\n};\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  /* defined __MONODROID_H */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/xamarin-android/xamarin_getifaddrs.c",
    "content": "#include <assert.h>\n#include <errno.h>\n#if !defined(WIN32) && !defined(SN_TARGET_ORBIS) && !defined(SN_TARGET_PSP2) && !defined(NN_COMPILER_RVCT)\n#include <dlfcn.h>\n#endif\n#include <limits.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#if !defined(NN_COMPILER_RVCT) && !defined(SN_TARGET_PSP2)\n#include <sys/types.h>\n#endif\n#if !defined(WIN32) && !defined(NN_COMPILER_RVCT)\n#include <sys/socket.h>\n\n#include <unistd.h>\n#endif\n\n#if LINUX\n#include <linux/netlink.h>\n#include <linux/rtnetlink.h>\n#include <linux/if_arp.h>\n#endif /* def LINUX */\n#if !defined(WIN32) && !defined(NN_COMPILER_RVCT) && !defined(SN_TARGET_PSP2)\n#include <netinet/in.h>\n#endif\n\n#if ANDROID\n#include <android/log.h>\n#endif\n\n#include \"logger.h\"\n#include \"xamarin_getifaddrs.h\"\n\n/* These aren't defined in android's rtnetlink.h (as of ndk 9d). We define fake values for them if\n * they aren't found so that the debug code works properly. We could skip them but future versions\n * of the NDK might include definitions for them.\n */\n#ifndef IFLA_LINKINFO\n#define IFLA_LINKINFO 1000\n#endif\n\n#ifndef IFLA_NET_NS_PID\n#define IFLA_NET_NS_PID 1001\n#endif\n\n#ifndef IFLA_IFALIAS\n#define IFLA_IFALIAS 1002\n#endif\n\n#ifndef IFLA_NUM_VF\n#define IFLA_NUM_VF 1003\n#endif\n\n#ifndef IFLA_VFINFO_LIST\n#define IFLA_VFINFO_LIST 1004\n#endif\n\n#ifndef IFLA_STATS64\n#define IFLA_STATS64 1005\n#endif\n\n#ifndef IFLA_VF_PORTS\n#define IFLA_VF_PORTS 1006\n#endif\n\n#ifndef IFLA_PORT_SELF\n#define IFLA_PORT_SELF 1007\n#endif\n\n#ifndef IFLA_AF_SPEC\n#define IFLA_AF_SPEC 1008\n#endif\n\n#ifndef IFLA_GROUP\n#define IFLA_GROUP 1009\n#endif\n\n#ifndef IFLA_NET_NS_FD\n#define IFLA_NET_NS_FD 1010\n#endif\n\n#ifndef IFLA_EXT_MASK\n#define IFLA_EXT_MASK 1011\n#endif\n\n#ifndef IFLA_PROMISCUITY\n#define IFLA_PROMISCUITY 1012\n#endif\n\n#ifndef IFLA_NUM_TX_QUEUES\n#define IFLA_NUM_TX_QUEUES 1013\n#endif\n\n#ifndef IFLA_NUM_RX_QUEUES\n#define IFLA_NUM_RX_QUEUES 1014\n#endif\n\n#ifndef IFLA_CARRIER\n#define IFLA_CARRIER 1015\n#endif\n\n#ifndef IFLA_PHYS_PORT_ID\n#define IFLA_PHYS_PORT_ID 1016\n#endif\n\n/* The amount of data we read from the kernel in one call */\n#define RESPONSE_BUFFER_SIZE 1024\n\n/* Maximum interface address label size, should be more than enough */\n#define MAX_IFA_LABEL_SIZE 1024\n\n#if LINUX\n\n/* This is the message we send to the kernel */\ntypedef struct\n{\n    struct nlmsghdr header;\n    struct rtgenmsg message;\n} netlink_request;\n\ntypedef struct\n{\n    int sock_fd;\n    int seq;\n    struct sockaddr_nl them; /* kernel end */\n    struct sockaddr_nl us; /* our end */\n    struct msghdr message_header; /* for use with sendmsg */\n    struct iovec payload_vector; /* Used to send netlink_request */\n} netlink_session;\n\n/* Turns out that quite a few link types have address length bigger than the 8 bytes allocated in\n * this structure as defined by the OS. Examples are Infiniband or ipv6 tunnel devices\n */\nstruct sockaddr_ll_extended\n{\n    unsigned short int sll_family;\n    unsigned short int sll_protocol;\n    int sll_ifindex;\n    unsigned short int sll_hatype;\n    unsigned char sll_pkttype;\n    unsigned char sll_halen;\n    unsigned char sll_addr[24];\n};\n\nstatic int parse_netlink_reply(netlink_session *session, struct _monodroid_ifaddrs **ifaddrs_head, struct _monodroid_ifaddrs **last_ifaddr);\nstatic struct _monodroid_ifaddrs *get_link_info(const struct nlmsghdr *message);\nstatic struct _monodroid_ifaddrs *get_link_address(const struct nlmsghdr *message, struct _monodroid_ifaddrs **ifaddrs_head);\nstatic int open_netlink_session(netlink_session *session);\nstatic int send_netlink_dump_request(netlink_session *session, int type);\nstatic int append_ifaddr(struct _monodroid_ifaddrs *addr, struct _monodroid_ifaddrs **ifaddrs_head, struct _monodroid_ifaddrs **last_ifaddr);\nstatic int fill_ll_address(struct sockaddr_ll_extended **sa, struct ifinfomsg *net_interface, void *rta_data, int rta_payload_length);\nstatic int fill_sa_address(struct sockaddr **sa, struct ifaddrmsg *net_address, void *rta_data, int rta_payload_length);\nstatic void free_single_xamarin_ifaddrs(struct _monodroid_ifaddrs **ifap);\nstatic void get_ifaddrs_impl(int(**getifaddrs_impl) (struct _monodroid_ifaddrs **ifap), void(**freeifaddrs_impl) (struct _monodroid_ifaddrs *ifa));\nstatic struct _monodroid_ifaddrs *find_interface_by_index(int index, struct _monodroid_ifaddrs **ifaddrs_head);\nstatic char *get_interface_name_by_index(int index, struct _monodroid_ifaddrs **ifaddrs_head);\nstatic int get_interface_flags_by_index(int index, struct _monodroid_ifaddrs **ifaddrs_head);\nstatic int calculate_address_netmask(struct _monodroid_ifaddrs *ifa, struct ifaddrmsg *net_address);\n#if DEBUG\nstatic void print_ifla_name(int id);\nstatic void print_address_list(char *title, struct _monodroid_ifaddrs *list);\n#endif\n\n/* We don't use 'struct ifaddrs' since that doesn't exist in Android's bionic, but since our\n * version of the structure is 100% compatible we can just use it instead\n */\ntypedef int (*getifaddrs_impl_fptr)(struct _monodroid_ifaddrs **);\ntypedef void (*freeifaddrs_impl_fptr)(struct _monodroid_ifaddrs *ifa);\n\nstatic getifaddrs_impl_fptr getifaddrs_impl = NULL;\nstatic freeifaddrs_impl_fptr freeifaddrs_impl = NULL;\n\nvoid\n_monodroid_getifaddrs_init()\n{\n    get_ifaddrs_impl(&getifaddrs_impl, &freeifaddrs_impl);\n}\n\nint\n_monodroid_getifaddrs(struct _monodroid_ifaddrs **ifap)\n{\n    netlink_session session;\n    struct _monodroid_ifaddrs *ifaddrs_head;\n    struct _monodroid_ifaddrs *last_ifaddr;\n    int ret = -1;\n\n    if (getifaddrs_impl)\n        return (*getifaddrs_impl)(ifap);\n\n    if (!ifap)\n    {\n        goto cleanup;\n    }\n\n    *ifap = NULL;\n    ifaddrs_head = 0;\n    last_ifaddr = 0;\n\n    if (open_netlink_session(&session) < 0)\n    {\n        goto cleanup;\n    }\n\n    /* Request information about the specified link. In our case it will be all of them since we\n       request the root of the link tree below\n    */\n    if ((send_netlink_dump_request(&session, RTM_GETLINK) < 0) ||\n        (parse_netlink_reply(&session, &ifaddrs_head, &last_ifaddr) < 0) ||\n        (send_netlink_dump_request(&session, RTM_GETADDR) < 0) ||\n        (parse_netlink_reply(&session, &ifaddrs_head, &last_ifaddr) < 0))\n    {\n        _monodroid_freeifaddrs(ifaddrs_head);\n        goto cleanup;\n    }\n\n    ret = 0;\n    *ifap = ifaddrs_head;\n#if DEBUG\n    print_address_list(\"Initial interfaces list\", *ifap);\n#endif\n\ncleanup:\n    if (session.sock_fd >= 0)\n    {\n        close(session.sock_fd);\n        session.sock_fd = -1;\n    }\n\n    return ret;\n}\n\nvoid\n_monodroid_freeifaddrs(struct _monodroid_ifaddrs *ifa)\n{\n    struct _monodroid_ifaddrs *cur, *next;\n\n    if (!ifa)\n        return;\n\n    if (freeifaddrs_impl)\n    {\n        (*freeifaddrs_impl)(ifa);\n        return;\n    }\n\n#if DEBUG\n    print_address_list(\"List passed to freeifaddrs\", ifa);\n#endif\n    cur = ifa;\n    while (cur)\n    {\n        next = cur->ifa_next;\n        free_single_xamarin_ifaddrs(&cur);\n        cur = next;\n    }\n}\n\nstatic void\nget_ifaddrs_impl(int(**getifaddrs_impl) (struct _monodroid_ifaddrs **ifap), void(**freeifaddrs_impl) (struct _monodroid_ifaddrs *ifa))\n{\n    void *libc;\n\n    assert(getifaddrs_impl);\n    assert(freeifaddrs_impl);\n\n    libc = dlopen(\"libc.so\", RTLD_NOW);\n    if (libc)\n    {\n        *getifaddrs_impl = dlsym(libc, \"getifaddrs\");\n        if (*getifaddrs_impl)\n            *freeifaddrs_impl = dlsym(libc, \"freeifaddrs\");\n    }\n\n    if (!*getifaddrs_impl)\n        log_info(LOG_NET, \"This libc does not have getifaddrs/freeifaddrs, using Xamarin's\\n\");\n    else\n        log_info(LOG_NET, \"This libc has getifaddrs/freeifaddrs\\n\");\n}\n\nstatic void\nfree_single_xamarin_ifaddrs(struct _monodroid_ifaddrs **ifap)\n{\n    struct _monodroid_ifaddrs *ifa = ifap ? *ifap : NULL;\n    if (!ifa)\n        return;\n\n    if (ifa->ifa_name)\n        free(ifa->ifa_name);\n\n    if (ifa->ifa_addr)\n        free(ifa->ifa_addr);\n\n    if (ifa->ifa_netmask)\n        free(ifa->ifa_netmask);\n\n    if (ifa->_monodroid_ifa_broadaddr)\n        free(ifa->_monodroid_ifa_broadaddr);\n\n    if (ifa->ifa_data)\n        free(ifa->ifa_data);\n\n    free(ifa);\n    *ifap = NULL;\n}\n\nstatic int\nopen_netlink_session(netlink_session *session)\n{\n    assert(session != 0);\n\n    memset(session, 0, sizeof(*session));\n    session->sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);\n    if (session->sock_fd == -1)\n    {\n        log_warn(LOG_NETLINK, \"Failed to create a netlink socket. %s\\n\", strerror(errno));\n        return -1;\n    }\n\n    /* Fill out addresses */\n    session->us.nl_family = AF_NETLINK;\n    session->us.nl_pid = getpid();\n    session->us.nl_groups = 0;\n\n    session->them.nl_family = AF_NETLINK;\n\n    if (bind(session->sock_fd, (struct sockaddr *)&session->us, sizeof(session->us)) < 0)\n    {\n        log_warn(LOG_NETLINK, \"Failed to bind to the netlink socket. %s\\n\", strerror(errno));\n        return -1;\n    }\n\n    return 0;\n}\n\nstatic int\nsend_netlink_dump_request(netlink_session *session, int type)\n{\n    netlink_request request;\n\n    memset(&request, 0, sizeof(request));\n    request.header.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg));\n    /* Flags (from netlink.h):\n       NLM_F_REQUEST - it's a request message\n       NLM_F_DUMP - gives us the root of the link tree and returns all links matching our requested\n       AF, which in our case means all of them (AF_PACKET)\n    */\n    request.header.nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT | NLM_F_MATCH;\n    request.header.nlmsg_seq = ++session->seq;\n    request.header.nlmsg_pid = session->us.nl_pid;\n    request.header.nlmsg_type = type;\n\n    /* AF_PACKET means we want to see everything */\n    request.message.rtgen_family = AF_PACKET;\n\n    memset(&session->payload_vector, 0, sizeof(session->payload_vector));\n    session->payload_vector.iov_len = request.header.nlmsg_len;\n    session->payload_vector.iov_base = &request;\n\n    memset(&session->message_header, 0, sizeof(session->message_header));\n    session->message_header.msg_namelen = sizeof(session->them);\n    session->message_header.msg_name = &session->them;\n    session->message_header.msg_iovlen = 1;\n    session->message_header.msg_iov = &session->payload_vector;\n\n    if (sendmsg(session->sock_fd, (const struct msghdr*)&session->message_header, 0) < 0)\n    {\n        log_warn(LOG_NETLINK, \"Failed to send netlink message. %s\\n\", strerror(errno));\n        return -1;\n    }\n\n    return 0;\n}\n\nstatic int\nappend_ifaddr(struct _monodroid_ifaddrs *addr, struct _monodroid_ifaddrs **ifaddrs_head, struct _monodroid_ifaddrs **last_ifaddr)\n{\n    assert(addr);\n    assert(ifaddrs_head);\n    assert(last_ifaddr);\n\n    if (!*ifaddrs_head)\n    {\n        *ifaddrs_head = *last_ifaddr = addr;\n        if (!*ifaddrs_head)\n            return -1;\n    }\n    else if (!*last_ifaddr)\n    {\n        struct _monodroid_ifaddrs *last = *ifaddrs_head;\n\n        while (last->ifa_next)\n            last = last->ifa_next;\n        *last_ifaddr = last;\n    }\n\n    addr->ifa_next = NULL;\n    if (addr == *last_ifaddr)\n        return 0;\n\n    assert(addr != *last_ifaddr);\n    (*last_ifaddr)->ifa_next = addr;\n    *last_ifaddr = addr;\n    assert((*last_ifaddr)->ifa_next == NULL);\n\n    return 0;\n}\n\nstatic int\nparse_netlink_reply(netlink_session *session, struct _monodroid_ifaddrs **ifaddrs_head, struct _monodroid_ifaddrs **last_ifaddr)\n{\n    ssize_t length;\n    struct msghdr netlink_reply;\n    struct iovec reply_vector;\n    struct nlmsghdr *current_message;\n    struct _monodroid_ifaddrs *addr;\n    unsigned char response[RESPONSE_BUFFER_SIZE];\n\n    assert(session);\n    assert(ifaddrs_head);\n    assert(last_ifaddr);\n\n    while (1)\n    {\n        memset(response, 0, RESPONSE_BUFFER_SIZE);\n        memset(&reply_vector, 0, sizeof(reply_vector));\n        reply_vector.iov_len = RESPONSE_BUFFER_SIZE;\n        reply_vector.iov_base = response;\n\n        memset(&netlink_reply, 0, sizeof(netlink_reply));\n        netlink_reply.msg_namelen = sizeof(&session->them);\n        netlink_reply.msg_name = &session->them;\n        netlink_reply.msg_iovlen = 1;\n        netlink_reply.msg_iov = &reply_vector;\n\n        log_debug(LOG_NETLINK, \"receiving message...\\n\");\n        length = recvmsg(session->sock_fd, &netlink_reply, 0);\n        log_debug(LOG_NETLINK, \"  length == %d\\n\", (int)length);\n\n        if (length < 0)\n        {\n            log_debug(LOG_NETLINK, \"Failed to receive reply from netlink. %s\\n\", strerror(errno));\n            return -1;\n        }\n\n        if (length == 0)\n            return 0; /* done, apparently */\n\n        for (current_message = (struct nlmsghdr*)response; current_message && NLMSG_OK(current_message, length); current_message = NLMSG_NEXT(current_message, length))\n        {\n            log_debug(LOG_NETLINK, \"next message... (type: %u)\\n\", current_message->nlmsg_type);\n            switch (current_message->nlmsg_type)\n            {\n                /* See rtnetlink.h */\n                case RTM_NEWLINK:\n                    log_debug(LOG_NETLINK, \"  dumping link...\\n\");\n                    addr = get_link_info(current_message);\n                    if (!addr || append_ifaddr(addr, ifaddrs_head, last_ifaddr) < 0)\n                        return -1;\n                    log_debug(LOG_NETLINK, \"  done\\n\");\n                    break;\n\n                case RTM_NEWADDR:\n                    log_debug(LOG_NETLINK, \"  got an address\\n\");\n                    addr = get_link_address(current_message, ifaddrs_head);\n                    if (!addr || append_ifaddr(addr, ifaddrs_head, last_ifaddr) < 0)\n                        return -1;\n                    break;\n\n                case NLMSG_DONE:\n                    log_debug(LOG_NETLINK, \"  message done\\n\");\n                    return 0;\n            }\n        }\n    }\n}\n\nstatic int\nfill_sa_address(struct sockaddr **sa, struct ifaddrmsg *net_address, void *rta_data, int rta_payload_length)\n{\n    assert(sa);\n    assert(net_address);\n    assert(rta_data);\n\n    switch (net_address->ifa_family)\n    {\n        case AF_INET:\n        {\n            struct sockaddr_in *sa4;\n            assert(rta_payload_length == 4);  /* IPv4 address length */\n            sa4 = (struct sockaddr_in*)calloc(1, sizeof(*sa4));\n            if (!sa4)\n                return -1;\n\n            sa4->sin_family = AF_INET;\n            memcpy(&sa4->sin_addr, rta_data, rta_payload_length);\n            *sa = (struct sockaddr*)sa4;\n            break;\n        }\n\n        case AF_INET6:\n        {\n            struct sockaddr_in6 *sa6;\n            assert(rta_payload_length == 16);  /* IPv6 address length */\n            sa6 = (struct sockaddr_in6*)calloc(1, sizeof(*sa6));\n            if (!sa6)\n                return -1;\n\n            sa6->sin6_family = AF_INET6;\n            memcpy(&sa6->sin6_addr, rta_data, rta_payload_length);\n            if (IN6_IS_ADDR_LINKLOCAL(&sa6->sin6_addr) || IN6_IS_ADDR_MC_LINKLOCAL(&sa6->sin6_addr))\n                sa6->sin6_scope_id = net_address->ifa_index;\n            *sa = (struct sockaddr*)sa6;\n            break;\n        }\n\n        default:\n        {\n            struct sockaddr *sagen;\n            assert(rta_payload_length <= sizeof(sagen->sa_data));\n            *sa = sagen = (struct sockaddr*)calloc(1, sizeof(*sagen));\n            if (sagen)\n                return -1;\n\n            sagen->sa_family = net_address->ifa_family;\n            memcpy(&sagen->sa_data, rta_data, rta_payload_length);\n            break;\n        }\n    }\n\n    return 0;\n}\n\nstatic int\nfill_ll_address(struct sockaddr_ll_extended **sa, struct ifinfomsg *net_interface, void *rta_data, int rta_payload_length)\n{\n    assert(sa);\n    assert(net_interface);\n\n    /* Always allocate, do not free - caller may reuse the same variable */\n    *sa = calloc(1, sizeof(**sa));\n    if (!*sa)\n        return -1;\n\n    (*sa)->sll_family = AF_PACKET; /* Always for physical links */\n\n    /* The assert can only fail for Iniband links, which are quite unlikely to be found\n     * in any mobile devices\n     */\n    log_debug(LOG_NETLINK, \"rta_payload_length == %d; sizeof sll_addr == %d; hw type == 0x%X\\n\", rta_payload_length, sizeof((*sa)->sll_addr), net_interface->ifi_type);\n    if (rta_payload_length > sizeof((*sa)->sll_addr))\n    {\n        log_info(LOG_NETLINK, \"Address is too long to place in sockaddr_ll (%d > %d)\", rta_payload_length, sizeof((*sa)->sll_addr));\n        free(*sa);\n        *sa = NULL;\n        return -1;\n    }\n\n    (*sa)->sll_ifindex = net_interface->ifi_index;\n    (*sa)->sll_hatype = net_interface->ifi_type;\n    (*sa)->sll_halen = rta_payload_length;\n    memcpy((*sa)->sll_addr, rta_data, rta_payload_length);\n\n    return 0;\n}\n\nstatic struct _monodroid_ifaddrs *\nfind_interface_by_index(int index, struct _monodroid_ifaddrs **ifaddrs_head)\n{\n    struct _monodroid_ifaddrs *cur;\n    if (!ifaddrs_head || !*ifaddrs_head)\n        return NULL;\n\n    /* Normally expensive, but with the small amount of links in the chain we'll deal with it's not\n     * worth the extra houskeeping and memory overhead\n     */\n    cur = *ifaddrs_head;\n    while (cur)\n    {\n        if (cur->ifa_addr && cur->ifa_addr->sa_family == AF_PACKET && ((struct sockaddr_ll_extended*)cur->ifa_addr)->sll_ifindex == index)\n            return cur;\n        if (cur == cur->ifa_next)\n            break;\n        cur = cur->ifa_next;\n    }\n\n    return NULL;\n}\n\nstatic char *\nget_interface_name_by_index(int index, struct _monodroid_ifaddrs **ifaddrs_head)\n{\n    struct _monodroid_ifaddrs *iface = find_interface_by_index(index, ifaddrs_head);\n    if (!iface || !iface->ifa_name)\n        return NULL;\n\n    return iface->ifa_name;\n}\n\nstatic int\nget_interface_flags_by_index(int index, struct _monodroid_ifaddrs **ifaddrs_head)\n{\n    struct _monodroid_ifaddrs *iface = find_interface_by_index(index, ifaddrs_head);\n    if (!iface)\n        return 0;\n\n    return iface->ifa_flags;\n}\n\nstatic int\ncalculate_address_netmask(struct _monodroid_ifaddrs *ifa, struct ifaddrmsg *net_address)\n{\n    if (ifa->ifa_addr && ifa->ifa_addr->sa_family != AF_UNSPEC && ifa->ifa_addr->sa_family != AF_PACKET)\n    {\n        uint32_t prefix_length = 0;\n        uint32_t data_length = 0;\n        unsigned char *netmask_data = NULL;\n\n        switch (ifa->ifa_addr->sa_family)\n        {\n            case AF_INET:\n            {\n                struct sockaddr_in *sa = (struct sockaddr_in*)calloc(1, sizeof(struct sockaddr_in));\n                if (!sa)\n                    return -1;\n\n                ifa->ifa_netmask = (struct sockaddr*)sa;\n                prefix_length = net_address->ifa_prefixlen;\n                if (prefix_length > 32)\n                    prefix_length = 32;\n                data_length = sizeof(sa->sin_addr);\n                netmask_data = (unsigned char*)&sa->sin_addr;\n                break;\n            }\n\n            case AF_INET6:\n            {\n                struct sockaddr_in6 *sa = (struct sockaddr_in6*)calloc(1, sizeof(struct sockaddr_in6));\n                if (!sa)\n                    return -1;\n\n                ifa->ifa_netmask = (struct sockaddr*)sa;\n                prefix_length = net_address->ifa_prefixlen;\n                if (prefix_length > 128)\n                    prefix_length = 128;\n                data_length = sizeof(sa->sin6_addr);\n                netmask_data = (unsigned char*)&sa->sin6_addr;\n                break;\n            }\n        }\n\n        if (ifa->ifa_netmask && netmask_data)\n        {\n            /* Fill the first X bytes with 255 */\n            uint32_t prefix_bytes = prefix_length / 8;\n            uint32_t postfix_bytes;\n            int i;\n\n            if (prefix_bytes > data_length)\n            {\n                errno = EINVAL;\n                return -1;\n            }\n            postfix_bytes = data_length - prefix_bytes;\n            memset(netmask_data, 0xFF, prefix_bytes);\n            if (postfix_bytes > 0)\n                memset(netmask_data + prefix_bytes + 1, 0x00, postfix_bytes);\n            log_debug(LOG_NETLINK, \"   calculating netmask, prefix length is %u bits (%u bytes), data length is %u bytes\\n\", prefix_length, prefix_bytes, data_length);\n            if (prefix_bytes + 2 < data_length)\n                /* Set the rest of the mask bits in the byte following the last 0xFF value */\n                netmask_data[prefix_bytes + 1] = 0xff << (8 - (prefix_length % 8));\n            log_debug(LOG_NETLINK, \"   netmask is: \");\n            for (i = 0; i < data_length; i++)\n            {\n                log_debug(LOG_NETLINK, \"%s%u\", i == 0 ? \"\" : \".\", (unsigned char)ifa->ifa_netmask->sa_data[i]);\n            }\n            log_debug(LOG_NETLINK, \"\\n\");\n        }\n    }\n\n    return 0;\n}\n\nstatic struct _monodroid_ifaddrs *\nget_link_address(const struct nlmsghdr *message, struct _monodroid_ifaddrs **ifaddrs_head)\n{\n    size_t length;\n    struct rtattr *attribute;\n    struct ifaddrmsg *net_address;\n    struct _monodroid_ifaddrs *ifa = NULL;\n    struct sockaddr **sa;\n    int payload_size;\n\n    assert(message);\n    net_address = NLMSG_DATA(message);\n    length = IFA_PAYLOAD(message);\n    if (length <= 0)\n    {\n        goto error;\n    }\n\n    ifa = calloc(1, sizeof(*ifa));\n    if (!ifa)\n    {\n        goto error;\n    }\n\n    ifa->ifa_flags = get_interface_flags_by_index(net_address->ifa_index, ifaddrs_head);\n\n    attribute = IFA_RTA(net_address);\n    while (RTA_OK(attribute, length))\n    {\n        payload_size = RTA_PAYLOAD(attribute);\n        sa = NULL;\n\n        switch (attribute->rta_type)\n        {\n            case IFA_LABEL:\n            {\n                int room_for_trailing_null = 0;\n\n                if (payload_size > MAX_IFA_LABEL_SIZE)\n                {\n                    payload_size = MAX_IFA_LABEL_SIZE;\n                    room_for_trailing_null = 1;\n                }\n\n                if (payload_size > 0)\n                {\n                    ifa->ifa_name = (char*)malloc(payload_size + room_for_trailing_null);\n                    if (!ifa->ifa_name)\n                    {\n                        goto error;\n                    }\n\n                    memcpy(ifa->ifa_name, RTA_DATA(attribute), payload_size);\n                    if (room_for_trailing_null)\n                        ifa->ifa_name[payload_size] = '\\0';\n                }\n                break;\n            }\n\n            case IFA_LOCAL:\n                if (ifa->ifa_addr)\n                {\n                    /* P2P protocol, set the dst/broadcast address union from the original address.\n                     * Since ifa_addr is set it means IFA_ADDRESST occured earlier and that address\n                     * is indeed the P2P destination one.\n                     */\n                    ifa->_monodroid_ifa_dstaddr = ifa->ifa_addr;\n                    ifa->ifa_addr = 0;\n                }\n                sa = &ifa->ifa_addr;\n                break;\n\n            case IFA_BROADCAST:\n                if (ifa->_monodroid_ifa_dstaddr)\n                {\n                    /* IFA_LOCAL happened earlier, undo its effect here */\n                    free(ifa->_monodroid_ifa_dstaddr);\n                    ifa->_monodroid_ifa_dstaddr = NULL;\n                }\n                sa = &ifa->_monodroid_ifa_broadaddr;\n                break;\n\n            case IFA_ADDRESS:\n                if (ifa->ifa_addr)\n                {\n                    /* Apparently IFA_LOCAL occured earlier and we have a P2P connection\n                     * here. IFA_LOCAL carries the destination address, move it there\n                     */\n                    ifa->_monodroid_ifa_dstaddr = ifa->ifa_addr;\n                    ifa->ifa_addr = NULL;\n                }\n                sa = &ifa->ifa_addr;\n                break;\n        }\n\n        if (sa)\n        {\n            if (fill_sa_address(sa, net_address, RTA_DATA(attribute), RTA_PAYLOAD(attribute)) < 0)\n            {\n                goto error;\n            }\n        }\n\n        attribute = RTA_NEXT(attribute, length);\n    }\n\n    /* glibc stores the associated interface name in the address if IFA_LABEL never occured */\n    if (!ifa->ifa_name)\n    {\n        char *name = get_interface_name_by_index(net_address->ifa_index, ifaddrs_head);\n        log_debug(LOG_NETLINK, \"   address has no name/label, getting one from interface\\n\");\n        ifa->ifa_name = name ? strdup(name) : NULL;\n    }\n    log_debug(LOG_NETLINK, \"   address label: %s\\n\", ifa->ifa_name);\n\n    if (calculate_address_netmask(ifa, net_address) < 0)\n    {\n        goto error;\n    }\n\n    return ifa;\n\n    error :\n    {\n        /* errno may be modified by free, or any other call inside the free_single_xamarin_ifaddrs\n         * function. We don't care about errors in there since it is more important to know how we\n         * failed to obtain the link address and not that we went OOM. Save and restore the value\n         * after the resources are freed.\n         */\n        int errno_save = errno;\n        free_single_xamarin_ifaddrs(&ifa);\n        errno = errno_save;\n        return NULL;\n    }\n}\n\nstatic struct _monodroid_ifaddrs *\nget_link_info(const struct nlmsghdr *message)\n{\n    ssize_t length;\n    struct rtattr *attribute;\n    struct ifinfomsg *net_interface;\n    struct _monodroid_ifaddrs *ifa = NULL;\n    struct sockaddr_ll_extended *sa = NULL;\n\n    assert(message);\n    net_interface = NLMSG_DATA(message);\n    length = message->nlmsg_len - NLMSG_LENGTH(sizeof(*net_interface));\n    if (length <= 0)\n    {\n        goto error;\n    }\n\n    ifa = calloc(1, sizeof(*ifa));\n    if (!ifa)\n    {\n        goto error;\n    }\n\n    ifa->ifa_flags = net_interface->ifi_flags;\n    attribute = IFLA_RTA(net_interface);\n    while (RTA_OK(attribute, length))\n    {\n        switch (attribute->rta_type)\n        {\n            case IFLA_IFNAME:\n                ifa->ifa_name = strdup(RTA_DATA(attribute));\n                if (!ifa->ifa_name)\n                {\n                    goto error;\n                }\n                log_debug(LOG_NETLINK, \"   interface name (payload length: %d; string length: %d)\\n\", RTA_PAYLOAD(attribute), strlen(ifa->ifa_name));\n                log_debug(LOG_NETLINK, \"     %s\\n\", ifa->ifa_name);\n                break;\n\n            case IFLA_BROADCAST:\n                log_debug(LOG_NETLINK, \"   interface broadcast (%d bytes)\\n\", RTA_PAYLOAD(attribute));\n                if (fill_ll_address(&sa, net_interface, RTA_DATA(attribute), RTA_PAYLOAD(attribute)) < 0)\n                {\n                    goto error;\n                }\n                ifa->_monodroid_ifa_broadaddr = (struct sockaddr*)sa;\n                break;\n\n            case IFLA_ADDRESS:\n                log_debug(LOG_NETLINK, \"   interface address (%d bytes)\\n\", RTA_PAYLOAD(attribute));\n                if (fill_ll_address(&sa, net_interface, RTA_DATA(attribute), RTA_PAYLOAD(attribute)) < 0)\n                {\n                    goto error;\n                }\n                ifa->ifa_addr = (struct sockaddr*)sa;\n                break;\n\n            default:\n                log_debug(LOG_NETLINK, \"     rta_type: \");\n#if DEBUG\n                print_ifla_name(attribute->rta_type);\n#endif\n                break;\n        }\n\n        attribute = RTA_NEXT(attribute, length);\n    }\n    log_debug(LOG_NETLINK, \"link flags: 0x%X\", ifa->ifa_flags);\n    return ifa;\n\nerror:\n    if (sa)\n        free(sa);\n    free_single_xamarin_ifaddrs(&ifa);\n\n    return NULL;\n}\n\n#else\nvoid\n_monodroid_getifaddrs_init(void)\n{\n}\n\nint\n_monodroid_getifaddrs(struct _monodroid_ifaddrs **ifap)\n{\n    *ifap = NULL;\n    return 0;\n}\n\nvoid _monodroid_freeifaddrs(struct _monodroid_ifaddrs *ifa)\n{\n}\n\n#endif\n\n#if LINUX && DEBUG\n#define ENUM_VALUE_ENTRY(enumvalue) { enumvalue, #enumvalue }\nstruct enumvalue\n{\n    int   value;\n    char *name;\n};\n\nstruct enumvalue iflas[] = {\n    ENUM_VALUE_ENTRY(IFLA_UNSPEC),\n    ENUM_VALUE_ENTRY(IFLA_ADDRESS),\n    ENUM_VALUE_ENTRY(IFLA_BROADCAST),\n    ENUM_VALUE_ENTRY(IFLA_IFNAME),\n    ENUM_VALUE_ENTRY(IFLA_MTU),\n    ENUM_VALUE_ENTRY(IFLA_LINK),\n    ENUM_VALUE_ENTRY(IFLA_QDISC),\n    ENUM_VALUE_ENTRY(IFLA_STATS),\n    ENUM_VALUE_ENTRY(IFLA_COST),\n    ENUM_VALUE_ENTRY(IFLA_PRIORITY),\n    ENUM_VALUE_ENTRY(IFLA_MASTER),\n    ENUM_VALUE_ENTRY(IFLA_WIRELESS),\n    ENUM_VALUE_ENTRY(IFLA_PROTINFO),\n    ENUM_VALUE_ENTRY(IFLA_TXQLEN),\n    ENUM_VALUE_ENTRY(IFLA_MAP),\n    ENUM_VALUE_ENTRY(IFLA_WEIGHT),\n    ENUM_VALUE_ENTRY(IFLA_OPERSTATE),\n    ENUM_VALUE_ENTRY(IFLA_LINKMODE),\n    ENUM_VALUE_ENTRY(IFLA_LINKINFO),\n    ENUM_VALUE_ENTRY(IFLA_NET_NS_PID),\n    ENUM_VALUE_ENTRY(IFLA_IFALIAS),\n    ENUM_VALUE_ENTRY(IFLA_NUM_VF),\n    ENUM_VALUE_ENTRY(IFLA_VFINFO_LIST),\n    ENUM_VALUE_ENTRY(IFLA_STATS64),\n    ENUM_VALUE_ENTRY(IFLA_VF_PORTS),\n    ENUM_VALUE_ENTRY(IFLA_PORT_SELF),\n    ENUM_VALUE_ENTRY(IFLA_AF_SPEC),\n    ENUM_VALUE_ENTRY(IFLA_GROUP),\n    ENUM_VALUE_ENTRY(IFLA_NET_NS_FD),\n    ENUM_VALUE_ENTRY(IFLA_EXT_MASK),\n    ENUM_VALUE_ENTRY(IFLA_PROMISCUITY),\n    ENUM_VALUE_ENTRY(IFLA_NUM_TX_QUEUES),\n    ENUM_VALUE_ENTRY(IFLA_NUM_RX_QUEUES),\n    ENUM_VALUE_ENTRY(IFLA_CARRIER),\n    ENUM_VALUE_ENTRY(IFLA_PHYS_PORT_ID),\n    { -1, 0 }\n};\n\nstatic void\nprint_ifla_name(int id)\n{\n    int i = 0;\n    while (1)\n    {\n        if (iflas[i].value == -1 && iflas[i].name == 0)\n        {\n            log_info(LOG_NETLINK, \"Unknown ifla->name: unknown id %d\\n\", id);\n            break;\n        }\n\n        if (iflas[i].value != id)\n        {\n            i++;\n            continue;\n        }\n        log_info(LOG_NETLINK, \"ifla->name: %s (%d)\\n\", iflas[i].name, iflas[i].value);\n        break;\n    }\n}\n\nstatic void\nprint_address_list(char *title, struct _monodroid_ifaddrs *list)\n{\n    struct _monodroid_ifaddrs *cur;\n    char *msg, *tmp;\n\n    if (!list)\n    {\n        log_info(LOG_NETLINK, \"monodroid-net\", \"No list to print in %s\", __FUNCTION__);\n        return;\n    }\n\n    cur = list;\n    msg = NULL;\n    while (cur)\n    {\n        tmp = NULL;\n        asprintf(&tmp, \"%s%s%p (%s; %p)\", msg ? msg : \"\", msg ? \" -> \" : \"\", cur, cur->ifa_name, cur->ifa_name);\n        if (msg)\n            free(msg);\n        msg = tmp;\n        cur = cur->ifa_next;\n    }\n\n    log_info(LOG_NETLINK, \"%s: %s\", title, msg ? msg : \"[no addresses]\");\n    free(msg);\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/xamarin-android/xamarin_getifaddrs.h",
    "content": "#ifndef __XAMARIN_GETIFADDRS_H\n\n#include \"monodroid.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* We're implementing getifaddrs behavior, this is the structure we use. It is exactly the same as\n * struct ifaddrs defined in ifaddrs.h but since bionics doesn't have it we need to mirror it here.\n */\nstruct _monodroid_ifaddrs\n{\n    struct _monodroid_ifaddrs *ifa_next; /* Pointer to the next structure.      */\n\n    char *ifa_name;                      /* Name of this network interface.     */\n    unsigned int ifa_flags;              /* Flags as from SIOCGIFFLAGS ioctl.   */\n\n    struct sockaddr *ifa_addr;           /* Network address of this interface.  */\n    struct sockaddr *ifa_netmask;        /* Netmask of this interface.          */\n    union\n    {\n        /* At most one of the following two is valid.  If the IFF_BROADCAST\n           bit is set in `ifa_flags', then `ifa_broadaddr' is valid.  If the\n           IFF_POINTOPOINT bit is set, then `ifa_dstaddr' is valid.\n           It is never the case that both these bits are set at once.  */\n        struct sockaddr *ifu_broadaddr;  /* Broadcast address of this interface. */\n        struct sockaddr *ifu_dstaddr;    /* Point-to-point destination address.  */\n    } ifa_ifu;\n    /* These very same macros are defined by <net/if.h> for `struct ifaddr'.\n       So if they are defined already, the existing definitions will be fine.  */\n# ifndef _monodroid_ifa_broadaddr\n#  define _monodroid_ifa_broadaddr ifa_ifu.ifu_broadaddr\n# endif\n# ifndef _monodroid_ifa_dstaddr\n#  define _monodroid_ifa_dstaddr   ifa_ifu.ifu_dstaddr\n# endif\n\n    void *ifa_data;               /* Address-specific data (may be unused).  */\n};\n\nvoid _monodroid_getifaddrs_init(void);\nMONO_API  int  _monodroid_getifaddrs(struct _monodroid_ifaddrs **ifap);\nMONO_API  void _monodroid_freeifaddrs(struct _monodroid_ifaddrs *ifa);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/adler32.c",
    "content": "/* adler32.c -- compute the Adler-32 checksum of a data stream\n * Copyright (C) 1995-2006 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#define ZLIB_INTERNAL\n#include \"zlib.h\"\n\n#define local static\n\n#ifdef _LARGEFILE64_SOURCE\n   local uLong adler32_combine_(uLong adler1, uLong adler2, off64_t len2);\n#else\n   local uLong adler32_combine_(uLong adler1, uLong adler2, z_off_t len2);\n#endif\n\n\n#define BASE 65521UL    /* largest prime smaller than 65536 */\n#define NMAX 5552\n/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */\n\n#define DO1(buf,i)  {adler += (buf)[i]; sum2 += adler;}\n#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);\n#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);\n#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);\n#define DO16(buf)   DO8(buf,0); DO8(buf,8);\n\n/* use NO_DIVIDE if your processor does not do division in hardware */\n#ifdef NO_DIVIDE\n#  define MOD(a) \\\n    do { \\\n        if (a >= (BASE << 16)) a -= (BASE << 16); \\\n        if (a >= (BASE << 15)) a -= (BASE << 15); \\\n        if (a >= (BASE << 14)) a -= (BASE << 14); \\\n        if (a >= (BASE << 13)) a -= (BASE << 13); \\\n        if (a >= (BASE << 12)) a -= (BASE << 12); \\\n        if (a >= (BASE << 11)) a -= (BASE << 11); \\\n        if (a >= (BASE << 10)) a -= (BASE << 10); \\\n        if (a >= (BASE << 9)) a -= (BASE << 9); \\\n        if (a >= (BASE << 8)) a -= (BASE << 8); \\\n        if (a >= (BASE << 7)) a -= (BASE << 7); \\\n        if (a >= (BASE << 6)) a -= (BASE << 6); \\\n        if (a >= (BASE << 5)) a -= (BASE << 5); \\\n        if (a >= (BASE << 4)) a -= (BASE << 4); \\\n        if (a >= (BASE << 3)) a -= (BASE << 3); \\\n        if (a >= (BASE << 2)) a -= (BASE << 2); \\\n        if (a >= (BASE << 1)) a -= (BASE << 1); \\\n        if (a >= BASE) a -= BASE; \\\n    } while (0)\n#  define MOD4(a) \\\n    do { \\\n        if (a >= (BASE << 4)) a -= (BASE << 4); \\\n        if (a >= (BASE << 3)) a -= (BASE << 3); \\\n        if (a >= (BASE << 2)) a -= (BASE << 2); \\\n        if (a >= (BASE << 1)) a -= (BASE << 1); \\\n        if (a >= BASE) a -= BASE; \\\n    } while (0)\n#else\n#  define MOD(a) a %= BASE\n#  define MOD4(a) a %= BASE\n#endif\n\n/* ========================================================================= */\nuLong ZEXPORT adler32(adler, buf, len)\n    uLong adler;\n    const Bytef *buf;\n    uInt len;\n{\n    unsigned long sum2;\n    unsigned n;\n\n    /* split Adler-32 into component sums */\n    sum2 = (adler >> 16) & 0xffff;\n    adler &= 0xffff;\n\n    /* in case user likes doing a byte at a time, keep it fast */\n    if (len == 1) {\n        adler += buf[0];\n        if (adler >= BASE)\n            adler -= BASE;\n        sum2 += adler;\n        if (sum2 >= BASE)\n            sum2 -= BASE;\n        return adler | (sum2 << 16);\n    }\n\n    /* initial Adler-32 value (deferred check for len == 1 speed) */\n    if (buf == Z_NULL)\n        return 1L;\n\n    /* in case short lengths are provided, keep it somewhat fast */\n    if (len < 16) {\n        while (len--) {\n            adler += *buf++;\n            sum2 += adler;\n        }\n        if (adler >= BASE)\n            adler -= BASE;\n        MOD4(sum2);             /* only added so many BASE's */\n        return adler | (sum2 << 16);\n    }\n\n    /* do length NMAX blocks -- requires just one modulo operation */\n    while (len >= NMAX) {\n        len -= NMAX;\n        n = NMAX / 16;          /* NMAX is divisible by 16 */\n        do {\n            DO16(buf);          /* 16 sums unrolled */\n            buf += 16;\n        } while (--n);\n        MOD(adler);\n        MOD(sum2);\n    }\n\n    /* do remaining bytes (less than NMAX, still just one modulo) */\n    if (len) {                  /* avoid modulos if none remaining */\n        while (len >= 16) {\n            len -= 16;\n            DO16(buf);\n            buf += 16;\n        }\n        while (len--) {\n            adler += *buf++;\n            sum2 += adler;\n        }\n        MOD(adler);\n        MOD(sum2);\n    }\n\n    /* return recombined sums */\n    return adler | (sum2 << 16);\n}\n\n/* ========================================================================= */\nlocal uLong adler32_combine_(adler1, adler2, len2)\n    uLong adler1;\n    uLong adler2;\n#ifdef _LARGEFILE64_SOURCE\n    off64_t len2;\n#else\n    z_off_t len2;\n#endif\n{\n    unsigned long sum1;\n    unsigned long sum2;\n    unsigned rem;\n\n    /* the derivation of this formula is left as an exercise for the reader */\n    rem = (unsigned)(len2 % BASE);\n    sum1 = adler1 & 0xffff;\n    sum2 = rem * sum1;\n    MOD(sum2);\n    sum1 += (adler2 & 0xffff) + BASE - 1;\n    sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;\n    if (sum1 > BASE) sum1 -= BASE;\n    if (sum1 > BASE) sum1 -= BASE;\n    if (sum2 > (BASE << 1)) sum2 -= (BASE << 1);\n    if (sum2 > BASE) sum2 -= BASE;\n    return sum1 | (sum2 << 16);\n}\n\n/* ========================================================================= */\nuLong ZEXPORT adler32_combine(adler1, adler2, len2)\n    uLong adler1;\n    uLong adler2;\n    z_off_t len2;\n{\n    return adler32_combine_(adler1, adler2, len2);\n}\n\n#ifdef _LARGEFILE64_SOURCE\nuLong ZEXPORT adler32_combine64(adler1, adler2, len2)\n    uLong adler1;\n    uLong adler2;\n    off64_t len2;\n{\n    return adler32_combine_(adler1, adler2, len2);\n}\n#else\nuLong ZEXPORT adler32_combine64(adler1, adler2, len2)\n    uLong adler1;\n    uLong adler2;\n    z_off_t len2;\n{\n    return adler32_combine_(adler1, adler2, len2);\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/compress.c",
    "content": "/* compress.c -- compress a memory buffer\n * Copyright (C) 1995-2005 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#define ZLIB_INTERNAL\n#include \"zlib.h\"\n\n/* ===========================================================================\n     Compresses the source buffer into the destination buffer. The level\n   parameter has the same meaning as in deflateInit.  sourceLen is the byte\n   length of the source buffer. Upon entry, destLen is the total size of the\n   destination buffer, which must be at least 0.1% larger than sourceLen plus\n   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.\n\n     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_BUF_ERROR if there was not enough room in the output buffer,\n   Z_STREAM_ERROR if the level parameter is invalid.\n*/\nint ZEXPORT compress2 (dest, destLen, source, sourceLen, level)\n    Bytef *dest;\n    uLongf *destLen;\n    const Bytef *source;\n    uLong sourceLen;\n    int level;\n{\n    z_stream stream;\n    int err;\n\n    stream.next_in = (Bytef*)source;\n    stream.avail_in = (uInt)sourceLen;\n#ifdef MAXSEG_64K\n    /* Check for source > 64K on 16-bit machine: */\n    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;\n#endif\n    stream.next_out = dest;\n    stream.avail_out = (uInt)*destLen;\n    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;\n\n    stream.zalloc = (alloc_func)0;\n    stream.zfree = (free_func)0;\n    stream.opaque = (voidpf)0;\n\n    err = deflateInit(&stream, level);\n    if (err != Z_OK) return err;\n\n    err = deflate(&stream, Z_FINISH);\n    if (err != Z_STREAM_END) {\n        deflateEnd(&stream);\n        return err == Z_OK ? Z_BUF_ERROR : err;\n    }\n    *destLen = stream.total_out;\n\n    err = deflateEnd(&stream);\n    return err;\n}\n\n/* ===========================================================================\n */\nint ZEXPORT compress (dest, destLen, source, sourceLen)\n    Bytef *dest;\n    uLongf *destLen;\n    const Bytef *source;\n    uLong sourceLen;\n{\n    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);\n}\n\n/* ===========================================================================\n     If the default memLevel or windowBits for deflateInit() is changed, then\n   this function needs to be updated.\n */\nuLong ZEXPORT compressBound (sourceLen)\n    uLong sourceLen;\n{\n    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +\n           (sourceLen >> 25) + 13;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/crc32.c",
    "content": "/* crc32.c -- compute the CRC-32 of a data stream\n * Copyright (C) 1995-2006 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n *\n * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster\n * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing\n * tables for updating the shift register in one step with three exclusive-ors\n * instead of four steps with four exclusive-ors.  This results in about a\n * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.\n */\n\n/* @(#) $Id$ */\n\n/*\n  Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore\n  protection on the static variables used to control the first-use generation\n  of the crc tables.  Therefore, if you #define DYNAMIC_CRC_TABLE, you should\n  first call get_crc_table() to initialize the tables before allowing more than\n  one thread to use crc32().\n */\n\n#ifdef MAKECRCH\n#  include <stdio.h>\n#  ifndef DYNAMIC_CRC_TABLE\n#    define DYNAMIC_CRC_TABLE\n#  endif /* !DYNAMIC_CRC_TABLE */\n#endif /* MAKECRCH */\n\n#include \"zutil.h\"      /* for STDC and FAR definitions */\n\n#define local static\n\n/* Find a four-byte integer type for crc32_little() and crc32_big(). */\n#ifndef NOBYFOUR\n#  ifdef STDC           /* need ANSI C limits.h to determine sizes */\n#    include <limits.h>\n#    define BYFOUR\n#    if (UINT_MAX == 0xffffffffUL)\n       typedef unsigned int u4;\n#    else\n#      if (ULONG_MAX == 0xffffffffUL)\n         typedef unsigned long u4;\n#      else\n#        if (USHRT_MAX == 0xffffffffUL)\n           typedef unsigned short u4;\n#        else\n#          undef BYFOUR     /* can't find a four-byte integer type! */\n#        endif\n#      endif\n#    endif\n#  endif /* STDC */\n#endif /* !NOBYFOUR */\n\n/* Definitions for doing the crc four data bytes at a time. */\n#ifdef BYFOUR\n#  define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \\\n                (((w)&0xff00)<<8)+(((w)&0xff)<<24))\n   local unsigned long crc32_little OF((unsigned long,\n                        const unsigned char FAR *, unsigned));\n   local unsigned long crc32_big OF((unsigned long,\n                        const unsigned char FAR *, unsigned));\n#  define TBLS 8\n#else\n#  define TBLS 1\n#endif /* BYFOUR */\n\n/* Local functions for crc concatenation */\nlocal unsigned long gf2_matrix_times OF((unsigned long *mat,\n                                         unsigned long vec));\nlocal void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));\n#ifdef _LARGEFILE64_SOURCE\n   local uLong crc32_combine_(uLong crc1, uLong crc2, off64_t len2);\n#else\n   local uLong crc32_combine_(uLong crc1, uLong crc2, z_off_t len2);\n#endif\n\n\n#ifdef DYNAMIC_CRC_TABLE\n\nlocal volatile int crc_table_empty = 1;\nlocal unsigned long FAR crc_table[TBLS][256];\nlocal void make_crc_table OF((void));\n#ifdef MAKECRCH\n   local void write_table OF((FILE *, const unsigned long FAR *));\n#endif /* MAKECRCH */\n/*\n  Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:\n  x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.\n\n  Polynomials over GF(2) are represented in binary, one bit per coefficient,\n  with the lowest powers in the most significant bit.  Then adding polynomials\n  is just exclusive-or, and multiplying a polynomial by x is a right shift by\n  one.  If we call the above polynomial p, and represent a byte as the\n  polynomial q, also with the lowest power in the most significant bit (so the\n  byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,\n  where a mod b means the remainder after dividing a by b.\n\n  This calculation is done using the shift-register method of multiplying and\n  taking the remainder.  The register is initialized to zero, and for each\n  incoming bit, x^32 is added mod p to the register if the bit is a one (where\n  x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by\n  x (which is shifting right by one and adding x^32 mod p if the bit shifted\n  out is a one).  We start with the highest power (least significant bit) of\n  q and repeat for all eight bits of q.\n\n  The first table is simply the CRC of all possible eight bit values.  This is\n  all the information needed to generate CRCs on data a byte at a time for all\n  combinations of CRC register values and incoming bytes.  The remaining tables\n  allow for word-at-a-time CRC calculation for both big-endian and little-\n  endian machines, where a word is four bytes.\n*/\nlocal void make_crc_table()\n{\n    unsigned long c;\n    int n, k;\n    unsigned long poly;                 /* polynomial exclusive-or pattern */\n    /* terms of polynomial defining this crc (except x^32): */\n    static volatile int first = 1;      /* flag to limit concurrent making */\n    static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};\n\n    /* See if another task is already doing this (not thread-safe, but better\n       than nothing -- significantly reduces duration of vulnerability in\n       case the advice about DYNAMIC_CRC_TABLE is ignored) */\n    if (first) {\n        first = 0;\n\n        /* make exclusive-or pattern from polynomial (0xedb88320UL) */\n        poly = 0UL;\n        for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++)\n            poly |= 1UL << (31 - p[n]);\n\n        /* generate a crc for every 8-bit value */\n        for (n = 0; n < 256; n++) {\n            c = (unsigned long)n;\n            for (k = 0; k < 8; k++)\n                c = c & 1 ? poly ^ (c >> 1) : c >> 1;\n            crc_table[0][n] = c;\n        }\n\n#ifdef BYFOUR\n        /* generate crc for each value followed by one, two, and three zeros,\n           and then the byte reversal of those as well as the first table */\n        for (n = 0; n < 256; n++) {\n            c = crc_table[0][n];\n            crc_table[4][n] = REV(c);\n            for (k = 1; k < 4; k++) {\n                c = crc_table[0][c & 0xff] ^ (c >> 8);\n                crc_table[k][n] = c;\n                crc_table[k + 4][n] = REV(c);\n            }\n        }\n#endif /* BYFOUR */\n\n        crc_table_empty = 0;\n    }\n    else {      /* not first */\n        /* wait for the other guy to finish (not efficient, but rare) */\n        while (crc_table_empty)\n            ;\n    }\n\n#ifdef MAKECRCH\n    /* write out CRC tables to crc32.h */\n    {\n        FILE *out;\n\n        out = fopen(\"crc32.h\", \"w\");\n        if (out == NULL) return;\n        fprintf(out, \"/* crc32.h -- tables for rapid CRC calculation\\n\");\n        fprintf(out, \" * Generated automatically by crc32.c\\n */\\n\\n\");\n        fprintf(out, \"local const unsigned long FAR \");\n        fprintf(out, \"crc_table[TBLS][256] =\\n{\\n  {\\n\");\n        write_table(out, crc_table[0]);\n#  ifdef BYFOUR\n        fprintf(out, \"#ifdef BYFOUR\\n\");\n        for (k = 1; k < 8; k++) {\n            fprintf(out, \"  },\\n  {\\n\");\n            write_table(out, crc_table[k]);\n        }\n        fprintf(out, \"#endif\\n\");\n#  endif /* BYFOUR */\n        fprintf(out, \"  }\\n};\\n\");\n        fclose(out);\n    }\n#endif /* MAKECRCH */\n}\n\n#ifdef MAKECRCH\nlocal void write_table(out, table)\n    FILE *out;\n    const unsigned long FAR *table;\n{\n    int n;\n\n    for (n = 0; n < 256; n++)\n        fprintf(out, \"%s0x%08lxUL%s\", n % 5 ? \"\" : \"    \", table[n],\n                n == 255 ? \"\\n\" : (n % 5 == 4 ? \",\\n\" : \", \"));\n}\n#endif /* MAKECRCH */\n\n#else /* !DYNAMIC_CRC_TABLE */\n/* ========================================================================\n * Tables of CRC-32s of all single-byte values, made by make_crc_table().\n */\n#include \"crc32.h\"\n#endif /* DYNAMIC_CRC_TABLE */\n\n/* =========================================================================\n * This function can be used by asm versions of crc32()\n */\nconst unsigned long FAR * ZEXPORT get_crc_table()\n{\n#ifdef DYNAMIC_CRC_TABLE\n    if (crc_table_empty)\n        make_crc_table();\n#endif /* DYNAMIC_CRC_TABLE */\n    return (const unsigned long FAR *)crc_table;\n}\n\n/* ========================================================================= */\n#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)\n#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1\n\n/* ========================================================================= */\nunsigned long ZEXPORT crc32(crc, buf, len)\n    unsigned long crc;\n    const unsigned char FAR *buf;\n    unsigned len;\n{\n    if (buf == Z_NULL) return 0UL;\n\n#ifdef DYNAMIC_CRC_TABLE\n    if (crc_table_empty)\n        make_crc_table();\n#endif /* DYNAMIC_CRC_TABLE */\n\n#ifdef BYFOUR\n    if (sizeof(void *) == sizeof(ptrdiff_t)) {\n        u4 endian;\n\n        endian = 1;\n        if (*((unsigned char *)(&endian)))\n            return crc32_little(crc, buf, len);\n        else\n            return crc32_big(crc, buf, len);\n    }\n#endif /* BYFOUR */\n    crc = crc ^ 0xffffffffUL;\n    while (len >= 8) {\n        DO8;\n        len -= 8;\n    }\n    if (len) do {\n        DO1;\n    } while (--len);\n    return crc ^ 0xffffffffUL;\n}\n\n#ifdef BYFOUR\n\n/* ========================================================================= */\n#define DOLIT4 c ^= *buf4++; \\\n        c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \\\n            crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]\n#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4\n\n/* ========================================================================= */\nlocal unsigned long crc32_little(crc, buf, len)\n    unsigned long crc;\n    const unsigned char FAR *buf;\n    unsigned len;\n{\n    register u4 c;\n    register const u4 FAR *buf4;\n\n    c = (u4)crc;\n    c = ~c;\n    while (len && ((ptrdiff_t)buf & 3)) {\n        c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);\n        len--;\n    }\n\n    buf4 = (const u4 FAR *)(const void FAR *)buf;\n    while (len >= 32) {\n        DOLIT32;\n        len -= 32;\n    }\n    while (len >= 4) {\n        DOLIT4;\n        len -= 4;\n    }\n    buf = (const unsigned char FAR *)buf4;\n\n    if (len) do {\n        c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);\n    } while (--len);\n    c = ~c;\n    return (unsigned long)c;\n}\n\n/* ========================================================================= */\n#define DOBIG4 c ^= *++buf4; \\\n        c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \\\n            crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]\n#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4\n\n/* ========================================================================= */\nlocal unsigned long crc32_big(crc, buf, len)\n    unsigned long crc;\n    const unsigned char FAR *buf;\n    unsigned len;\n{\n    register u4 c;\n    register const u4 FAR *buf4;\n\n    c = REV((u4)crc);\n    c = ~c;\n    while (len && ((ptrdiff_t)buf & 3)) {\n        c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);\n        len--;\n    }\n\n    buf4 = (const u4 FAR *)(const void FAR *)buf;\n    buf4--;\n    while (len >= 32) {\n        DOBIG32;\n        len -= 32;\n    }\n    while (len >= 4) {\n        DOBIG4;\n        len -= 4;\n    }\n    buf4++;\n    buf = (const unsigned char FAR *)buf4;\n\n    if (len) do {\n        c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);\n    } while (--len);\n    c = ~c;\n    return (unsigned long)(REV(c));\n}\n\n#endif /* BYFOUR */\n\n#define GF2_DIM 32      /* dimension of GF(2) vectors (length of CRC) */\n\n/* ========================================================================= */\nlocal unsigned long gf2_matrix_times(mat, vec)\n    unsigned long *mat;\n    unsigned long vec;\n{\n    unsigned long sum;\n\n    sum = 0;\n    while (vec) {\n        if (vec & 1)\n            sum ^= *mat;\n        vec >>= 1;\n        mat++;\n    }\n    return sum;\n}\n\n/* ========================================================================= */\nlocal void gf2_matrix_square(square, mat)\n    unsigned long *square;\n    unsigned long *mat;\n{\n    int n;\n\n    for (n = 0; n < GF2_DIM; n++)\n        square[n] = gf2_matrix_times(mat, mat[n]);\n}\n\n/* ========================================================================= */\nlocal uLong crc32_combine_(crc1, crc2, len2)\n    uLong crc1;\n    uLong crc2;\n#ifdef _LARGEFILE64_SOURCE\n    off64_t len2;\n#else\n    z_off_t len2;\n#endif\n{\n    int n;\n    unsigned long row;\n    unsigned long even[GF2_DIM];    /* even-power-of-two zeros operator */\n    unsigned long odd[GF2_DIM];     /* odd-power-of-two zeros operator */\n\n    /* degenerate case */\n    if (len2 == 0)\n        return crc1;\n\n    /* put operator for one zero bit in odd */\n    odd[0] = 0xedb88320L;           /* CRC-32 polynomial */\n    row = 1;\n    for (n = 1; n < GF2_DIM; n++) {\n        odd[n] = row;\n        row <<= 1;\n    }\n\n    /* put operator for two zero bits in even */\n    gf2_matrix_square(even, odd);\n\n    /* put operator for four zero bits in odd */\n    gf2_matrix_square(odd, even);\n\n    /* apply len2 zeros to crc1 (first square will put the operator for one\n       zero byte, eight zero bits, in even) */\n    do {\n        /* apply zeros operator for this bit of len2 */\n        gf2_matrix_square(even, odd);\n        if (len2 & 1)\n            crc1 = gf2_matrix_times(even, crc1);\n        len2 >>= 1;\n\n        /* if no more bits set, then done */\n        if (len2 == 0)\n            break;\n\n        /* another iteration of the loop with odd and even swapped */\n        gf2_matrix_square(odd, even);\n        if (len2 & 1)\n            crc1 = gf2_matrix_times(odd, crc1);\n        len2 >>= 1;\n\n        /* if no more bits set, then done */\n    } while (len2 != 0);\n\n    /* return combined crc */\n    crc1 ^= crc2;\n    return crc1;\n}\n\n/* ========================================================================= */\nuLong ZEXPORT crc32_combine(crc1, crc2, len2)\n    uLong crc1;\n    uLong crc2;\n    z_off_t len2;\n{\n    return crc32_combine_(crc1, crc2, len2);\n}\n\n#ifdef _LARGEFILE64_SOURCE\nuLong ZEXPORT crc32_combine64(crc1, crc2, len2)\n    uLong crc1;\n    uLong crc2;\n    off64_t len2;\n{\n    return crc32_combine_(crc1, crc2, len2);\n}\n#else\nuLong ZEXPORT crc32_combine64(crc1, crc2, len2)\n    uLong crc1;\n    uLong crc2;\n    z_off_t len2;\n{\n    return crc32_combine_(crc1, crc2, len2);\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/crc32.h",
    "content": "/* crc32.h -- tables for rapid CRC calculation\n * Generated automatically by crc32.c\n */\n\nlocal const unsigned long FAR crc_table[TBLS][256] =\n{\n    {\n        0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,\n        0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,\n        0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,\n        0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,\n        0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,\n        0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,\n        0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,\n        0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,\n        0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,\n        0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,\n        0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,\n        0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,\n        0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,\n        0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,\n        0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,\n        0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,\n        0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,\n        0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,\n        0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,\n        0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,\n        0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,\n        0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,\n        0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,\n        0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,\n        0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,\n        0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,\n        0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,\n        0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,\n        0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,\n        0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,\n        0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,\n        0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,\n        0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,\n        0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,\n        0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,\n        0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,\n        0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,\n        0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,\n        0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,\n        0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,\n        0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,\n        0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,\n        0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,\n        0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,\n        0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,\n        0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,\n        0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,\n        0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,\n        0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,\n        0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,\n        0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,\n        0x2d02ef8dUL\n#ifdef BYFOUR\n    },\n    {\n        0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,\n        0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,\n        0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,\n        0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,\n        0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,\n        0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,\n        0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,\n        0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,\n        0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,\n        0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,\n        0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,\n        0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,\n        0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,\n        0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,\n        0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,\n        0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,\n        0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,\n        0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,\n        0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,\n        0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,\n        0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,\n        0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,\n        0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,\n        0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,\n        0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,\n        0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,\n        0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,\n        0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,\n        0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,\n        0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,\n        0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,\n        0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,\n        0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,\n        0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,\n        0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,\n        0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,\n        0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,\n        0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,\n        0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,\n        0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,\n        0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,\n        0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,\n        0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,\n        0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,\n        0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,\n        0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,\n        0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,\n        0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,\n        0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,\n        0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,\n        0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,\n        0x9324fd72UL\n    },\n    {\n        0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,\n        0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,\n        0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,\n        0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,\n        0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,\n        0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,\n        0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,\n        0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,\n        0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,\n        0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,\n        0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,\n        0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,\n        0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,\n        0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,\n        0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,\n        0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,\n        0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,\n        0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,\n        0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,\n        0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,\n        0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,\n        0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,\n        0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,\n        0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,\n        0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,\n        0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,\n        0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,\n        0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,\n        0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,\n        0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,\n        0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,\n        0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,\n        0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,\n        0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,\n        0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,\n        0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,\n        0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,\n        0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,\n        0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,\n        0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,\n        0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,\n        0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,\n        0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,\n        0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,\n        0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,\n        0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,\n        0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,\n        0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,\n        0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,\n        0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,\n        0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,\n        0xbe9834edUL\n    },\n    {\n        0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,\n        0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,\n        0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,\n        0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,\n        0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,\n        0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,\n        0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,\n        0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,\n        0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,\n        0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,\n        0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,\n        0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,\n        0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,\n        0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,\n        0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,\n        0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,\n        0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,\n        0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,\n        0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,\n        0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,\n        0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,\n        0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,\n        0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,\n        0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,\n        0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,\n        0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,\n        0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,\n        0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,\n        0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,\n        0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,\n        0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,\n        0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,\n        0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,\n        0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,\n        0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,\n        0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,\n        0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,\n        0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,\n        0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,\n        0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,\n        0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,\n        0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,\n        0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,\n        0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,\n        0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,\n        0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,\n        0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,\n        0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,\n        0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,\n        0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,\n        0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,\n        0xde0506f1UL\n    },\n    {\n        0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,\n        0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,\n        0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,\n        0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,\n        0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,\n        0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,\n        0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,\n        0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,\n        0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,\n        0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,\n        0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,\n        0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,\n        0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,\n        0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,\n        0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,\n        0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,\n        0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,\n        0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,\n        0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,\n        0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,\n        0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,\n        0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,\n        0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,\n        0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,\n        0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,\n        0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,\n        0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,\n        0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,\n        0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,\n        0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,\n        0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,\n        0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,\n        0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,\n        0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,\n        0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,\n        0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,\n        0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,\n        0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,\n        0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,\n        0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,\n        0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,\n        0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,\n        0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,\n        0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,\n        0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,\n        0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,\n        0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,\n        0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,\n        0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,\n        0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,\n        0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,\n        0x8def022dUL\n    },\n    {\n        0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,\n        0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,\n        0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,\n        0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,\n        0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,\n        0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,\n        0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,\n        0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,\n        0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,\n        0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,\n        0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,\n        0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,\n        0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,\n        0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,\n        0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,\n        0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,\n        0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,\n        0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,\n        0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,\n        0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,\n        0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,\n        0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,\n        0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,\n        0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,\n        0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,\n        0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,\n        0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,\n        0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,\n        0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,\n        0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,\n        0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,\n        0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,\n        0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,\n        0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,\n        0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,\n        0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,\n        0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,\n        0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,\n        0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,\n        0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,\n        0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,\n        0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,\n        0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,\n        0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,\n        0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,\n        0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,\n        0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,\n        0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,\n        0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,\n        0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,\n        0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,\n        0x72fd2493UL\n    },\n    {\n        0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,\n        0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,\n        0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,\n        0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,\n        0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,\n        0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,\n        0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,\n        0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,\n        0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,\n        0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,\n        0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,\n        0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,\n        0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,\n        0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,\n        0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,\n        0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,\n        0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,\n        0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,\n        0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,\n        0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,\n        0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,\n        0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,\n        0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,\n        0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,\n        0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,\n        0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,\n        0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,\n        0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,\n        0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,\n        0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,\n        0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,\n        0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,\n        0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,\n        0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,\n        0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,\n        0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,\n        0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,\n        0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,\n        0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,\n        0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,\n        0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,\n        0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,\n        0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,\n        0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,\n        0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,\n        0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,\n        0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,\n        0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,\n        0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,\n        0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,\n        0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,\n        0xed3498beUL\n    },\n    {\n        0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,\n        0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,\n        0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,\n        0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,\n        0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,\n        0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,\n        0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,\n        0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,\n        0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,\n        0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,\n        0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,\n        0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,\n        0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,\n        0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,\n        0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,\n        0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,\n        0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,\n        0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,\n        0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,\n        0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,\n        0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,\n        0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,\n        0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,\n        0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,\n        0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,\n        0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,\n        0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,\n        0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,\n        0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,\n        0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,\n        0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,\n        0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,\n        0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,\n        0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,\n        0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,\n        0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,\n        0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,\n        0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,\n        0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,\n        0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,\n        0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,\n        0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,\n        0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,\n        0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,\n        0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,\n        0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,\n        0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,\n        0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,\n        0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,\n        0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,\n        0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,\n        0xf10605deUL\n#endif\n    }\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/deflate.c",
    "content": "/* deflate.c -- compress data using the deflation algorithm\n * Copyright (C) 1995-2006 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/*\n *  ALGORITHM\n *\n *      The \"deflation\" process depends on being able to identify portions\n *      of the input text which are identical to earlier input (within a\n *      sliding window trailing behind the input currently being processed).\n *\n *      The most straightforward technique turns out to be the fastest for\n *      most input files: try all possible matches and select the longest.\n *      The key feature of this algorithm is that insertions into the string\n *      dictionary are very simple and thus fast, and deletions are avoided\n *      completely. Insertions are performed at each input character, whereas\n *      string matches are performed only when the previous match ends. So it\n *      is preferable to spend more time in matches to allow very fast string\n *      insertions and avoid deletions. The matching algorithm for small\n *      strings is inspired from that of Rabin & Karp. A brute force approach\n *      is used to find longer strings when a small match has been found.\n *      A similar algorithm is used in comic (by Jan-Mark Wams) and freeze\n *      (by Leonid Broukhis).\n *         A previous version of this file used a more sophisticated algorithm\n *      (by Fiala and Greene) which is guaranteed to run in linear amortized\n *      time, but has a larger average cost, uses more memory and is patented.\n *      However the F&G algorithm may be faster for some highly redundant\n *      files if the parameter max_chain_length (described below) is too large.\n *\n *  ACKNOWLEDGEMENTS\n *\n *      The idea of lazy evaluation of matches is due to Jan-Mark Wams, and\n *      I found it in 'freeze' written by Leonid Broukhis.\n *      Thanks to many people for bug reports and testing.\n *\n *  REFERENCES\n *\n *      Deutsch, L.P.,\"DEFLATE Compressed Data Format Specification\".\n *      Available in http://www.ietf.org/rfc/rfc1951.txt\n *\n *      A description of the Rabin and Karp algorithm is given in the book\n *         \"Algorithms\" by R. Sedgewick, Addison-Wesley, p252.\n *\n *      Fiala,E.R., and Greene,D.H.\n *         Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595\n *\n */\n\n/* @(#) $Id$ */\n\n#include \"deflate.h\"\n\nconst char deflate_copyright[] =\n   \" deflate 1.2.3.3 Copyright 1995-2006 Jean-loup Gailly \";\n/*\n  If you use the zlib library in a product, an acknowledgment is welcome\n  in the documentation of your product. If for some reason you cannot\n  include such an acknowledgment, I would appreciate that you keep this\n  copyright string in the executable of your product.\n */\n\n/* ===========================================================================\n *  Function prototypes.\n */\ntypedef enum {\n    need_more,      /* block not completed, need more input or more output */\n    block_done,     /* block flush performed */\n    finish_started, /* finish started, need only more output at next deflate */\n    finish_done     /* finish done, accept no more input or output */\n} block_state;\n\ntypedef block_state (*compress_func) OF((deflate_state *s, int flush));\n/* Compression function. Returns the block state after the call. */\n\nlocal void fill_window    OF((deflate_state *s));\nlocal block_state deflate_stored OF((deflate_state *s, int flush));\nlocal block_state deflate_fast   OF((deflate_state *s, int flush));\n#ifndef FASTEST\nlocal block_state deflate_slow   OF((deflate_state *s, int flush));\n#endif\nlocal void lm_init        OF((deflate_state *s));\nlocal void putShortMSB    OF((deflate_state *s, uInt b));\nlocal void flush_pending  OF((z_streamp strm));\nlocal int read_buf        OF((z_streamp strm, Bytef *buf, unsigned size));\n#ifndef FASTEST\n#ifdef ASMV\n      void match_init OF((void)); /* asm code initialization */\n      uInt longest_match  OF((deflate_state *s, IPos cur_match));\n#else\nlocal uInt longest_match  OF((deflate_state *s, IPos cur_match));\n#endif\n#endif\nlocal uInt longest_match_fast OF((deflate_state *s, IPos cur_match));\n\n#ifdef DEBUG\nlocal  void check_match OF((deflate_state *s, IPos start, IPos match,\n                            int length));\n#endif\n\n/* ===========================================================================\n * Local data\n */\n\n#define NIL 0\n/* Tail of hash chains */\n\n#ifndef TOO_FAR\n#  define TOO_FAR 4096\n#endif\n/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */\n\n#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)\n/* Minimum amount of lookahead, except at the end of the input file.\n * See deflate.c for comments about the MIN_MATCH+1.\n */\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\ntypedef struct config_s {\n   ush good_length; /* reduce lazy search above this match length */\n   ush max_lazy;    /* do not perform lazy search above this match length */\n   ush nice_length; /* quit search above this match length */\n   ush max_chain;\n   compress_func func;\n} config;\n\n#ifdef FASTEST\nlocal const config configuration_table[2] = {\n/*      good lazy nice chain */\n/* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */\n/* 1 */ {4,    4,  8,    4, deflate_fast}}; /* max speed, no lazy matches */\n#else\nlocal const config configuration_table[10] = {\n/*      good lazy nice chain */\n/* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */\n/* 1 */ {4,    4,  8,    4, deflate_fast}, /* max speed, no lazy matches */\n/* 2 */ {4,    5, 16,    8, deflate_fast},\n/* 3 */ {4,    6, 32,   32, deflate_fast},\n\n/* 4 */ {4,    4, 16,   16, deflate_slow},  /* lazy matches */\n/* 5 */ {8,   16, 32,   32, deflate_slow},\n/* 6 */ {8,   16, 128, 128, deflate_slow},\n/* 7 */ {8,   32, 128, 256, deflate_slow},\n/* 8 */ {32, 128, 258, 1024, deflate_slow},\n/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */\n#endif\n\n/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4\n * For deflate_fast() (levels <= 3) good is ignored and lazy has a different\n * meaning.\n */\n\n#define EQUAL 0\n/* result of memcmp for equal strings */\n\n#ifndef NO_DUMMY_DECL\nstruct static_tree_desc_s {int dummy;}; /* for buggy compilers */\n#endif\n\n/* ===========================================================================\n * Update a hash value with the given input byte\n * IN  assertion: all calls to to UPDATE_HASH are made with consecutive\n *    input characters, so that a running hash key can be computed from the\n *    previous key instead of complete recalculation each time.\n */\n#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)\n\n\n/* ===========================================================================\n * Insert string str in the dictionary and set match_head to the previous head\n * of the hash chain (the most recent string with same hash key). Return\n * the previous length of the hash chain.\n * If this file is compiled with -DFASTEST, the compression level is forced\n * to 1, and no hash chains are maintained.\n * IN  assertion: all calls to to INSERT_STRING are made with consecutive\n *    input characters and the first MIN_MATCH bytes of str are valid\n *    (except for the last MIN_MATCH-1 bytes of the input file).\n */\n#ifdef FASTEST\n#define INSERT_STRING(s, str, match_head) \\\n   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \\\n    match_head = s->head[s->ins_h], \\\n    s->head[s->ins_h] = (Pos)(str))\n#else\n#define INSERT_STRING(s, str, match_head) \\\n   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \\\n    match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \\\n    s->head[s->ins_h] = (Pos)(str))\n#endif\n\n/* ===========================================================================\n * Initialize the hash table (avoiding 64K overflow for 16 bit systems).\n * prev[] will be initialized on the fly.\n */\n#define CLEAR_HASH(s) \\\n    s->head[s->hash_size-1] = NIL; \\\n    zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));\n\n/* ========================================================================= */\nint ZEXPORT deflateInit_(strm, level, version, stream_size)\n    z_streamp strm;\n    int level;\n    const char *version;\n    int stream_size;\n{\n    return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,\n                         Z_DEFAULT_STRATEGY, version, stream_size);\n    /* To do: ignore strm->next_in if we use it as window */\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,\n                  version, stream_size)\n    z_streamp strm;\n    int  level;\n    int  method;\n    int  windowBits;\n    int  memLevel;\n    int  strategy;\n    const char *version;\n    int stream_size;\n{\n    deflate_state *s;\n    int wrap = 1;\n    static const char my_version[] = ZLIB_VERSION;\n\n    ushf *overlay;\n    /* We overlay pending_buf and d_buf+l_buf. This works since the average\n     * output size for (length,distance) codes is <= 24 bits.\n     */\n\n    if (version == Z_NULL || version[0] != my_version[0] ||\n        stream_size != sizeof(z_stream)) {\n        return Z_VERSION_ERROR;\n    }\n    if (strm == Z_NULL) return Z_STREAM_ERROR;\n\n    strm->msg = Z_NULL;\n    if (strm->zalloc == (alloc_func)0) {\n        strm->zalloc = zcalloc;\n        strm->opaque = (voidpf)0;\n    }\n    if (strm->zfree == (free_func)0) strm->zfree = zcfree;\n\n#ifdef FASTEST\n    if (level != 0) level = 1;\n#else\n    if (level == Z_DEFAULT_COMPRESSION) level = 6;\n#endif\n\n    if (windowBits < 0) { /* suppress zlib wrapper */\n        wrap = 0;\n        windowBits = -windowBits;\n    }\n#ifdef GZIP\n    else if (windowBits > 15) {\n        wrap = 2;       /* write gzip wrapper instead */\n        windowBits -= 16;\n    }\n#endif\n    if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||\n        windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n        strategy < 0 || strategy > Z_FIXED) {\n        return Z_STREAM_ERROR;\n    }\n    if (windowBits == 8) windowBits = 9;  /* until 256-byte window bug fixed */\n    s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));\n    if (s == Z_NULL) return Z_MEM_ERROR;\n    strm->state = (struct internal_state FAR *)s;\n    s->strm = strm;\n\n    s->wrap = wrap;\n    s->gzhead = Z_NULL;\n    s->w_bits = windowBits;\n    s->w_size = 1 << s->w_bits;\n    s->w_mask = s->w_size - 1;\n\n    s->hash_bits = memLevel + 7;\n    s->hash_size = 1 << s->hash_bits;\n    s->hash_mask = s->hash_size - 1;\n    s->hash_shift =  ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);\n\n    s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));\n    s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));\n    s->head   = (Posf *)  ZALLOC(strm, s->hash_size, sizeof(Pos));\n\n    s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n    overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n    s->pending_buf = (uchf *) overlay;\n    s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);\n\n    if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||\n        s->pending_buf == Z_NULL) {\n        s->status = FINISH_STATE;\n        strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);\n        deflateEnd (strm);\n        return Z_MEM_ERROR;\n    }\n    s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n    s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n\n    s->level = level;\n    s->strategy = strategy;\n    s->method = (Byte)method;\n\n    return deflateReset(strm);\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)\n    z_streamp strm;\n    const Bytef *dictionary;\n    uInt  dictLength;\n{\n    deflate_state *s;\n    uInt length = dictLength;\n    uInt n;\n    IPos hash_head = 0;\n\n    if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||\n        strm->state->wrap == 2 ||\n        (strm->state->wrap == 1 && strm->state->status != INIT_STATE))\n        return Z_STREAM_ERROR;\n\n    s = strm->state;\n    if (s->wrap)\n        strm->adler = adler32(strm->adler, dictionary, dictLength);\n\n    if (length < MIN_MATCH) return Z_OK;\n    if (length > MAX_DIST(s)) {\n        length = MAX_DIST(s);\n        dictionary += dictLength - length; /* use the tail of the dictionary */\n    }\n    zmemcpy(s->window, dictionary, length);\n    s->strstart = length;\n    s->block_start = (long)length;\n\n    /* Insert all strings in the hash table (except for the last two bytes).\n     * s->lookahead stays null, so s->ins_h will be recomputed at the next\n     * call of fill_window.\n     */\n    s->ins_h = s->window[0];\n    UPDATE_HASH(s, s->ins_h, s->window[1]);\n    for (n = 0; n <= length - MIN_MATCH; n++) {\n        INSERT_STRING(s, n, hash_head);\n    }\n    if (hash_head) hash_head = 0;  /* to make compiler happy */\n    return Z_OK;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateReset (strm)\n    z_streamp strm;\n{\n    deflate_state *s;\n\n    if (strm == Z_NULL || strm->state == Z_NULL ||\n        strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {\n        return Z_STREAM_ERROR;\n    }\n\n    strm->total_in = strm->total_out = 0;\n    strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */\n    strm->data_type = Z_UNKNOWN;\n\n    s = (deflate_state *)strm->state;\n    s->pending = 0;\n    s->pending_out = s->pending_buf;\n\n    if (s->wrap < 0) {\n        s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */\n    }\n    s->status = s->wrap ? INIT_STATE : BUSY_STATE;\n    strm->adler =\n#ifdef GZIP\n        s->wrap == 2 ? crc32(0L, Z_NULL, 0) :\n#endif\n        adler32(0L, Z_NULL, 0);\n    s->last_flush = Z_NO_FLUSH;\n\n    _tr_init(s);\n    lm_init(s);\n\n    return Z_OK;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateSetHeader (strm, head)\n    z_streamp strm;\n    gz_headerp head;\n{\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    if (strm->state->wrap != 2) return Z_STREAM_ERROR;\n    strm->state->gzhead = head;\n    return Z_OK;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflatePrime (strm, bits, value)\n    z_streamp strm;\n    int bits;\n    int value;\n{\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    strm->state->bi_valid = bits;\n    strm->state->bi_buf = (ush)(value & ((1 << bits) - 1));\n    return Z_OK;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateParams(strm, level, strategy)\n    z_streamp strm;\n    int level;\n    int strategy;\n{\n    deflate_state *s;\n    compress_func func;\n    int err = Z_OK;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    s = strm->state;\n\n#ifdef FASTEST\n    if (level != 0) level = 1;\n#else\n    if (level == Z_DEFAULT_COMPRESSION) level = 6;\n#endif\n    if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {\n        return Z_STREAM_ERROR;\n    }\n    func = configuration_table[s->level].func;\n\n    if (func != configuration_table[level].func && strm->total_in != 0) {\n        /* Flush the last buffer: */\n        err = deflate(strm, Z_PARTIAL_FLUSH);\n    }\n    if (s->level != level) {\n        s->level = level;\n        s->max_lazy_match   = configuration_table[level].max_lazy;\n        s->good_match       = configuration_table[level].good_length;\n        s->nice_match       = configuration_table[level].nice_length;\n        s->max_chain_length = configuration_table[level].max_chain;\n    }\n    s->strategy = strategy;\n    return err;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)\n    z_streamp strm;\n    int good_length;\n    int max_lazy;\n    int nice_length;\n    int max_chain;\n{\n    deflate_state *s;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    s = strm->state;\n    s->good_match = good_length;\n    s->max_lazy_match = max_lazy;\n    s->nice_match = nice_length;\n    s->max_chain_length = max_chain;\n    return Z_OK;\n}\n\n/* =========================================================================\n * For the default windowBits of 15 and memLevel of 8, this function returns\n * a close to exact, as well as small, upper bound on the compressed size.\n * They are coded as constants here for a reason--if the #define's are\n * changed, then this function needs to be changed as well.  The return\n * value for 15 and 8 only works for those exact settings.\n *\n * For any setting other than those defaults for windowBits and memLevel,\n * the value returned is a conservative worst case for the maximum expansion\n * resulting from using fixed blocks instead of stored blocks, which deflate\n * can emit on compressed data for some combinations of the parameters.\n *\n * This function could be more sophisticated to provide closer upper bounds for\n * every combination of windowBits and memLevel.  But even the conservative\n * upper bound of about 14% expansion does not seem onerous for output buffer\n * allocation.\n */\nuLong ZEXPORT deflateBound(strm, sourceLen)\n    z_streamp strm;\n    uLong sourceLen;\n{\n    deflate_state *s;\n    uLong complen, wraplen;\n    Bytef *str;\n\n    /* conservative upper bound for compressed data */\n    complen = sourceLen +\n              ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;\n\n    /* if can't get parameters, return conservative bound plus zlib wrapper */\n    if (strm == Z_NULL || strm->state == Z_NULL)\n        return complen + 6;\n\n    /* compute wrapper length */\n    s = strm->state;\n    switch (s->wrap) {\n    case 0:                                 /* raw deflate */\n        wraplen = 0;\n        break;\n    case 1:                                 /* zlib wrapper */\n        wraplen = 6 + (s->strstart ? 4 : 0);\n        break;\n    case 2:                                 /* gzip wrapper */\n        wraplen = 18;\n        if (s->gzhead != NULL) {            /* user-supplied gzip header */\n            if (s->gzhead->extra != NULL)\n                wraplen += 2 + s->gzhead->extra_len;\n            str = s->gzhead->name;\n            if (str != NULL)\n                do {\n                    wraplen++;\n                } while (*str++);\n            str = s->gzhead->comment;\n            if (str != NULL)\n                do {\n                    wraplen++;\n                } while (*str++);\n            if (s->gzhead->hcrc)\n                wraplen += 2;\n        }\n        break;\n    default:                                /* for compiler happiness */\n        wraplen = 6;\n    }\n\n    /* if not default parameters, return conservative bound */\n    if (s->w_bits != 15 || s->hash_bits != 8 + 7)\n        return complen + wraplen;\n\n    /* default settings: return tight bound for that case */\n    return compressBound(sourceLen) - 6 + wraplen;\n}\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nlocal void putShortMSB (s, b)\n    deflate_state *s;\n    uInt b;\n{\n    put_byte(s, (Byte)(b >> 8));\n    put_byte(s, (Byte)(b & 0xff));\n}\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->next_out buffer and copying into it.\n * (See also read_buf()).\n */\nlocal void flush_pending(strm)\n    z_streamp strm;\n{\n    unsigned len = strm->state->pending;\n\n    if (len > strm->avail_out) len = strm->avail_out;\n    if (len == 0) return;\n\n    zmemcpy(strm->next_out, strm->state->pending_out, len);\n    strm->next_out  += len;\n    strm->state->pending_out  += len;\n    strm->total_out += len;\n    strm->avail_out  -= len;\n    strm->state->pending -= len;\n    if (strm->state->pending == 0) {\n        strm->state->pending_out = strm->state->pending_buf;\n    }\n}\n\n/* ========================================================================= */\nint ZEXPORT deflate (strm, flush)\n    z_streamp strm;\n    int flush;\n{\n    int old_flush; /* value of flush param for previous deflate call */\n    deflate_state *s;\n\n    if (strm == Z_NULL || strm->state == Z_NULL ||\n        flush > Z_FINISH || flush < 0) {\n        return Z_STREAM_ERROR;\n    }\n    s = strm->state;\n\n    if (strm->next_out == Z_NULL ||\n        (strm->next_in == Z_NULL && strm->avail_in != 0) ||\n        (s->status == FINISH_STATE && flush != Z_FINISH)) {\n        ERR_RETURN(strm, Z_STREAM_ERROR);\n    }\n    if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);\n\n    s->strm = strm; /* just in case */\n    old_flush = s->last_flush;\n    s->last_flush = flush;\n\n    /* Write the header */\n    if (s->status == INIT_STATE) {\n#ifdef GZIP\n        if (s->wrap == 2) {\n            strm->adler = crc32(0L, Z_NULL, 0);\n            put_byte(s, 31);\n            put_byte(s, 139);\n            put_byte(s, 8);\n            if (s->gzhead == NULL) {\n                put_byte(s, 0);\n                put_byte(s, 0);\n                put_byte(s, 0);\n                put_byte(s, 0);\n                put_byte(s, 0);\n                put_byte(s, s->level == 9 ? 2 :\n                            (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?\n                             4 : 0));\n                put_byte(s, OS_CODE);\n                s->status = BUSY_STATE;\n            }\n            else {\n                put_byte(s, (s->gzhead->text ? 1 : 0) +\n                            (s->gzhead->hcrc ? 2 : 0) +\n                            (s->gzhead->extra == Z_NULL ? 0 : 4) +\n                            (s->gzhead->name == Z_NULL ? 0 : 8) +\n                            (s->gzhead->comment == Z_NULL ? 0 : 16)\n                        );\n                put_byte(s, (Byte)(s->gzhead->time & 0xff));\n                put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));\n                put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));\n                put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));\n                put_byte(s, s->level == 9 ? 2 :\n                            (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?\n                             4 : 0));\n                put_byte(s, s->gzhead->os & 0xff);\n                if (s->gzhead->extra != NULL) {\n                    put_byte(s, s->gzhead->extra_len & 0xff);\n                    put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);\n                }\n                if (s->gzhead->hcrc)\n                    strm->adler = crc32(strm->adler, s->pending_buf,\n                                        s->pending);\n                s->gzindex = 0;\n                s->status = EXTRA_STATE;\n            }\n        }\n        else\n#endif\n        {\n            uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;\n            uInt level_flags;\n\n            if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)\n                level_flags = 0;\n            else if (s->level < 6)\n                level_flags = 1;\n            else if (s->level == 6)\n                level_flags = 2;\n            else\n                level_flags = 3;\n            header |= (level_flags << 6);\n            if (s->strstart != 0) header |= PRESET_DICT;\n            header += 31 - (header % 31);\n\n            s->status = BUSY_STATE;\n            putShortMSB(s, header);\n\n            /* Save the adler32 of the preset dictionary: */\n            if (s->strstart != 0) {\n                putShortMSB(s, (uInt)(strm->adler >> 16));\n                putShortMSB(s, (uInt)(strm->adler & 0xffff));\n            }\n            strm->adler = adler32(0L, Z_NULL, 0);\n        }\n    }\n#ifdef GZIP\n    if (s->status == EXTRA_STATE) {\n        if (s->gzhead->extra != NULL) {\n            uInt beg = s->pending;  /* start of bytes to update crc */\n\n            while (s->gzindex < (s->gzhead->extra_len & 0xffff)) {\n                if (s->pending == s->pending_buf_size) {\n                    if (s->gzhead->hcrc && s->pending > beg)\n                        strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                            s->pending - beg);\n                    flush_pending(strm);\n                    beg = s->pending;\n                    if (s->pending == s->pending_buf_size)\n                        break;\n                }\n                put_byte(s, s->gzhead->extra[s->gzindex]);\n                s->gzindex++;\n            }\n            if (s->gzhead->hcrc && s->pending > beg)\n                strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                    s->pending - beg);\n            if (s->gzindex == s->gzhead->extra_len) {\n                s->gzindex = 0;\n                s->status = NAME_STATE;\n            }\n        }\n        else\n            s->status = NAME_STATE;\n    }\n    if (s->status == NAME_STATE) {\n        if (s->gzhead->name != NULL) {\n            uInt beg = s->pending;  /* start of bytes to update crc */\n            int val;\n\n            do {\n                if (s->pending == s->pending_buf_size) {\n                    if (s->gzhead->hcrc && s->pending > beg)\n                        strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                            s->pending - beg);\n                    flush_pending(strm);\n                    beg = s->pending;\n                    if (s->pending == s->pending_buf_size) {\n                        val = 1;\n                        break;\n                    }\n                }\n                val = s->gzhead->name[s->gzindex++];\n                put_byte(s, val);\n            } while (val != 0);\n            if (s->gzhead->hcrc && s->pending > beg)\n                strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                    s->pending - beg);\n            if (val == 0) {\n                s->gzindex = 0;\n                s->status = COMMENT_STATE;\n            }\n        }\n        else\n            s->status = COMMENT_STATE;\n    }\n    if (s->status == COMMENT_STATE) {\n        if (s->gzhead->comment != NULL) {\n            uInt beg = s->pending;  /* start of bytes to update crc */\n            int val;\n\n            do {\n                if (s->pending == s->pending_buf_size) {\n                    if (s->gzhead->hcrc && s->pending > beg)\n                        strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                            s->pending - beg);\n                    flush_pending(strm);\n                    beg = s->pending;\n                    if (s->pending == s->pending_buf_size) {\n                        val = 1;\n                        break;\n                    }\n                }\n                val = s->gzhead->comment[s->gzindex++];\n                put_byte(s, val);\n            } while (val != 0);\n            if (s->gzhead->hcrc && s->pending > beg)\n                strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                    s->pending - beg);\n            if (val == 0)\n                s->status = HCRC_STATE;\n        }\n        else\n            s->status = HCRC_STATE;\n    }\n    if (s->status == HCRC_STATE) {\n        if (s->gzhead->hcrc) {\n            if (s->pending + 2 > s->pending_buf_size)\n                flush_pending(strm);\n            if (s->pending + 2 <= s->pending_buf_size) {\n                put_byte(s, (Byte)(strm->adler & 0xff));\n                put_byte(s, (Byte)((strm->adler >> 8) & 0xff));\n                strm->adler = crc32(0L, Z_NULL, 0);\n                s->status = BUSY_STATE;\n            }\n        }\n        else\n            s->status = BUSY_STATE;\n    }\n#endif\n\n    /* Flush as much pending output as possible */\n    if (s->pending != 0) {\n        flush_pending(strm);\n        if (strm->avail_out == 0) {\n            /* Since avail_out is 0, deflate will be called again with\n             * more output space, but possibly with both pending and\n             * avail_in equal to zero. There won't be anything to do,\n             * but this is not an error situation so make sure we\n             * return OK instead of BUF_ERROR at next call of deflate:\n             */\n            s->last_flush = -1;\n            return Z_OK;\n        }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n    } else if (strm->avail_in == 0 && flush <= old_flush &&\n               flush != Z_FINISH) {\n        ERR_RETURN(strm, Z_BUF_ERROR);\n    }\n\n    /* User must not provide more input after the first FINISH: */\n    if (s->status == FINISH_STATE && strm->avail_in != 0) {\n        ERR_RETURN(strm, Z_BUF_ERROR);\n    }\n\n    /* Start a new block or continue the current one.\n     */\n    if (strm->avail_in != 0 || s->lookahead != 0 ||\n        (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {\n        block_state bstate;\n\n        bstate = (*(configuration_table[s->level].func))(s, flush);\n\n        if (bstate == finish_started || bstate == finish_done) {\n            s->status = FINISH_STATE;\n        }\n        if (bstate == need_more || bstate == finish_started) {\n            if (strm->avail_out == 0) {\n                s->last_flush = -1; /* avoid BUF_ERROR next call, see above */\n            }\n            return Z_OK;\n            /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n             * of deflate should use the same flush parameter to make sure\n             * that the flush is complete. So we don't have to output an\n             * empty block here, this will be done at next call. This also\n             * ensures that for a very small output buffer, we emit at most\n             * one empty block.\n             */\n        }\n        if (bstate == block_done) {\n            if (flush == Z_PARTIAL_FLUSH) {\n                _tr_align(s);\n            } else { /* FULL_FLUSH or SYNC_FLUSH */\n                _tr_stored_block(s, (char*)0, 0L, 0);\n                /* For a full flush, this empty block will be recognized\n                 * as a special marker by inflate_sync().\n                 */\n                if (flush == Z_FULL_FLUSH) {\n                    CLEAR_HASH(s);             /* forget history */\n                }\n            }\n            flush_pending(strm);\n            if (strm->avail_out == 0) {\n              s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n              return Z_OK;\n            }\n        }\n    }\n    Assert(strm->avail_out > 0, \"bug2\");\n\n    if (flush != Z_FINISH) return Z_OK;\n    if (s->wrap <= 0) return Z_STREAM_END;\n\n    /* Write the trailer */\n#ifdef GZIP\n    if (s->wrap == 2) {\n        put_byte(s, (Byte)(strm->adler & 0xff));\n        put_byte(s, (Byte)((strm->adler >> 8) & 0xff));\n        put_byte(s, (Byte)((strm->adler >> 16) & 0xff));\n        put_byte(s, (Byte)((strm->adler >> 24) & 0xff));\n        put_byte(s, (Byte)(strm->total_in & 0xff));\n        put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));\n        put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));\n        put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));\n    }\n    else\n#endif\n    {\n        putShortMSB(s, (uInt)(strm->adler >> 16));\n        putShortMSB(s, (uInt)(strm->adler & 0xffff));\n    }\n    flush_pending(strm);\n    /* If avail_out is zero, the application will call deflate again\n     * to flush the rest.\n     */\n    if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */\n    return s->pending != 0 ? Z_OK : Z_STREAM_END;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateEnd (strm)\n    z_streamp strm;\n{\n    int status;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n\n    status = strm->state->status;\n    if (status != INIT_STATE &&\n        status != EXTRA_STATE &&\n        status != NAME_STATE &&\n        status != COMMENT_STATE &&\n        status != HCRC_STATE &&\n        status != BUSY_STATE &&\n        status != FINISH_STATE) {\n      return Z_STREAM_ERROR;\n    }\n\n    /* Deallocate in reverse order of allocations: */\n    TRY_FREE(strm, strm->state->pending_buf);\n    TRY_FREE(strm, strm->state->head);\n    TRY_FREE(strm, strm->state->prev);\n    TRY_FREE(strm, strm->state->window);\n\n    ZFREE(strm, strm->state);\n    strm->state = Z_NULL;\n\n    return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;\n}\n\n/* =========================================================================\n * Copy the source state to the destination state.\n * To simplify the source, this is not supported for 16-bit MSDOS (which\n * doesn't have enough memory anyway to duplicate compression states).\n */\nint ZEXPORT deflateCopy (dest, source)\n    z_streamp dest;\n    z_streamp source;\n{\n#ifdef MAXSEG_64K\n    return Z_STREAM_ERROR;\n#else\n    deflate_state *ds;\n    deflate_state *ss;\n    ushf *overlay;\n\n\n    if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {\n        return Z_STREAM_ERROR;\n    }\n\n    ss = source->state;\n\n    zmemcpy(dest, source, sizeof(z_stream));\n\n    ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));\n    if (ds == Z_NULL) return Z_MEM_ERROR;\n    dest->state = (struct internal_state FAR *) ds;\n    zmemcpy(ds, ss, sizeof(deflate_state));\n    ds->strm = dest;\n\n    ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));\n    ds->prev   = (Posf *)  ZALLOC(dest, ds->w_size, sizeof(Pos));\n    ds->head   = (Posf *)  ZALLOC(dest, ds->hash_size, sizeof(Pos));\n    overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);\n    ds->pending_buf = (uchf *) overlay;\n\n    if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||\n        ds->pending_buf == Z_NULL) {\n        deflateEnd (dest);\n        return Z_MEM_ERROR;\n    }\n    /* following zmemcpy do not work for 16-bit MSDOS */\n    zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));\n    zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));\n    zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));\n    zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);\n\n    ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);\n    ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);\n    ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;\n\n    ds->l_desc.dyn_tree = ds->dyn_ltree;\n    ds->d_desc.dyn_tree = ds->dyn_dtree;\n    ds->bl_desc.dyn_tree = ds->bl_tree;\n\n    return Z_OK;\n#endif /* MAXSEG_64K */\n}\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->next_in buffer and copying from it.\n * (See also flush_pending()).\n */\nlocal int read_buf(strm, buf, size)\n    z_streamp strm;\n    Bytef *buf;\n    unsigned size;\n{\n    unsigned len = strm->avail_in;\n\n    if (len > size) len = size;\n    if (len == 0) return 0;\n\n    strm->avail_in  -= len;\n\n    if (strm->state->wrap == 1) {\n        strm->adler = adler32(strm->adler, strm->next_in, len);\n    }\n#ifdef GZIP\n    else if (strm->state->wrap == 2) {\n        strm->adler = crc32(strm->adler, strm->next_in, len);\n    }\n#endif\n    zmemcpy(buf, strm->next_in, len);\n    strm->next_in  += len;\n    strm->total_in += len;\n\n    return (int)len;\n}\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nlocal void lm_init (s)\n    deflate_state *s;\n{\n    s->window_size = (ulg)2L*s->w_size;\n\n    CLEAR_HASH(s);\n\n    /* Set the default configuration parameters:\n     */\n    s->max_lazy_match   = configuration_table[s->level].max_lazy;\n    s->good_match       = configuration_table[s->level].good_length;\n    s->nice_match       = configuration_table[s->level].nice_length;\n    s->max_chain_length = configuration_table[s->level].max_chain;\n\n    s->strstart = 0;\n    s->block_start = 0L;\n    s->lookahead = 0;\n    s->match_length = s->prev_length = MIN_MATCH-1;\n    s->match_available = 0;\n    s->ins_h = 0;\n#ifndef FASTEST\n#ifdef ASMV\n    match_init(); /* initialize the asm code */\n#endif\n#endif\n}\n\n#ifndef FASTEST\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\n#ifndef ASMV\n/* For 80x86 and 680x0, an optimized version will be provided in match.asm or\n * match.S. The code will be functionally equivalent.\n */\nlocal uInt longest_match(s, cur_match)\n    deflate_state *s;\n    IPos cur_match;                             /* current match */\n{\n    unsigned chain_length = s->max_chain_length;/* max hash chain length */\n    register Bytef *scan = s->window + s->strstart; /* current string */\n    register Bytef *match;                       /* matched string */\n    register int len;                           /* length of current match */\n    int best_len = s->prev_length;              /* best match length so far */\n    int nice_match = s->nice_match;             /* stop if match long enough */\n    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?\n        s->strstart - (IPos)MAX_DIST(s) : NIL;\n    /* Stop when cur_match becomes <= limit. To simplify the code,\n     * we prevent matches with the string of window index 0.\n     */\n    Posf *prev = s->prev;\n    uInt wmask = s->w_mask;\n\n#ifdef UNALIGNED_OK\n    /* Compare two bytes at a time. Note: this is not always beneficial.\n     * Try with and without -DUNALIGNED_OK to check.\n     */\n    register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;\n    register ush scan_start = *(ushf*)scan;\n    register ush scan_end   = *(ushf*)(scan+best_len-1);\n#else\n    register Bytef *strend = s->window + s->strstart + MAX_MATCH;\n    register Byte scan_end1  = scan[best_len-1];\n    register Byte scan_end   = scan[best_len];\n#endif\n\n    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n     * It is easy to get rid of this optimization if necessary.\n     */\n    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n    /* Do not waste too much time if we already have a good match: */\n    if (s->prev_length >= s->good_match) {\n        chain_length >>= 2;\n    }\n    /* Do not look for matches beyond the end of the input. This is necessary\n     * to make deflate deterministic.\n     */\n    if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;\n\n    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n    do {\n        Assert(cur_match < s->strstart, \"no future\");\n        match = s->window + cur_match;\n\n        /* Skip to next match if the match length cannot increase\n         * or if the match length is less than 2.  Note that the checks below\n         * for insufficient lookahead only occur occasionally for performance\n         * reasons.  Therefore uninitialized memory will be accessed, and\n         * conditional jumps will be made that depend on those values.\n         * However the length of the match is limited to the lookahead, so\n         * the output of deflate is not affected by the uninitialized values.\n         */\n#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)\n        /* This code assumes sizeof(unsigned short) == 2. Do not use\n         * UNALIGNED_OK if your compiler uses a different size.\n         */\n        if (*(ushf*)(match+best_len-1) != scan_end ||\n            *(ushf*)match != scan_start) continue;\n\n        /* It is not necessary to compare scan[2] and match[2] since they are\n         * always equal when the other bytes match, given that the hash keys\n         * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at\n         * strstart+3, +5, ... up to strstart+257. We check for insufficient\n         * lookahead only every 4th comparison; the 128th check will be made\n         * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is\n         * necessary to put more guard bytes at the end of the window, or\n         * to check more often for insufficient lookahead.\n         */\n        Assert(scan[2] == match[2], \"scan[2]?\");\n        scan++, match++;\n        do {\n        } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\n                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\n                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\n                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\n                 scan < strend);\n        /* The funny \"do {}\" generates better code on most compilers */\n\n        /* Here, scan <= window+strstart+257 */\n        Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n        if (*scan == *match) scan++;\n\n        len = (MAX_MATCH - 1) - (int)(strend-scan);\n        scan = strend - (MAX_MATCH-1);\n\n#else /* UNALIGNED_OK */\n\n        if (match[best_len]   != scan_end  ||\n            match[best_len-1] != scan_end1 ||\n            *match            != *scan     ||\n            *++match          != scan[1])      continue;\n\n        /* The check at best_len-1 can be removed because it will be made\n         * again later. (This heuristic is not always a win.)\n         * It is not necessary to compare scan[2] and match[2] since they\n         * are always equal when the other bytes match, given that\n         * the hash keys are equal and that HASH_BITS >= 8.\n         */\n        scan += 2, match++;\n        Assert(*scan == *match, \"match[2]?\");\n\n        /* We check for insufficient lookahead only every 8th comparison;\n         * the 256th check will be made at strstart+258.\n         */\n        do {\n        } while (*++scan == *++match && *++scan == *++match &&\n                 *++scan == *++match && *++scan == *++match &&\n                 *++scan == *++match && *++scan == *++match &&\n                 *++scan == *++match && *++scan == *++match &&\n                 scan < strend);\n\n        Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n        len = MAX_MATCH - (int)(strend - scan);\n        scan = strend - MAX_MATCH;\n\n#endif /* UNALIGNED_OK */\n\n        if (len > best_len) {\n            s->match_start = cur_match;\n            best_len = len;\n            if (len >= nice_match) break;\n#ifdef UNALIGNED_OK\n            scan_end = *(ushf*)(scan+best_len-1);\n#else\n            scan_end1  = scan[best_len-1];\n            scan_end   = scan[best_len];\n#endif\n        }\n    } while ((cur_match = prev[cur_match & wmask]) > limit\n             && --chain_length != 0);\n\n    if ((uInt)best_len <= s->lookahead) return (uInt)best_len;\n    return s->lookahead;\n}\n#endif /* ASMV */\n#endif /* FASTEST */\n\n/* ---------------------------------------------------------------------------\n * Optimized version for level == 1 or strategy == Z_RLE only\n */\nlocal uInt longest_match_fast(s, cur_match)\n    deflate_state *s;\n    IPos cur_match;                             /* current match */\n{\n    register Bytef *scan = s->window + s->strstart; /* current string */\n    register Bytef *match;                       /* matched string */\n    register int len;                           /* length of current match */\n    register Bytef *strend = s->window + s->strstart + MAX_MATCH;\n\n    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n     * It is easy to get rid of this optimization if necessary.\n     */\n    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n    Assert(cur_match < s->strstart, \"no future\");\n\n    match = s->window + cur_match;\n\n    /* Return failure if the match length is less than 2:\n     */\n    if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2, match += 2;\n    Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n    } while (*++scan == *++match && *++scan == *++match &&\n             *++scan == *++match && *++scan == *++match &&\n             *++scan == *++match && *++scan == *++match &&\n             *++scan == *++match && *++scan == *++match &&\n             scan < strend);\n\n    Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (int)(strend - scan);\n\n    if (len < MIN_MATCH) return MIN_MATCH - 1;\n\n    s->match_start = cur_match;\n    return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;\n}\n\n#ifdef DEBUG\n/* ===========================================================================\n * Check that the match at match_start is indeed a match.\n */\nlocal void check_match(s, start, match, length)\n    deflate_state *s;\n    IPos start, match;\n    int length;\n{\n    /* check that the match is indeed a match */\n    if (zmemcmp(s->window + match,\n                s->window + start, length) != EQUAL) {\n        fprintf(stderr, \" start %u, match %u, length %d\\n\",\n                start, match, length);\n        do {\n            fprintf(stderr, \"%c%c\", s->window[match++], s->window[start++]);\n        } while (--length != 0);\n        z_error(\"invalid match\");\n    }\n    if (z_verbose > 1) {\n        fprintf(stderr,\"\\\\[%d,%d]\", start-match, length);\n        do { putc(s->window[start++], stderr); } while (--length != 0);\n    }\n}\n#else\n#  define check_match(s, start, match, length)\n#endif /* DEBUG */\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nlocal void fill_window(s)\n    deflate_state *s;\n{\n    register unsigned n, m;\n    register Posf *p;\n    unsigned more;    /* Amount of free space at the end of the window. */\n    uInt wsize = s->w_size;\n\n    do {\n        more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);\n\n        /* Deal with !@#$% 64K limit: */\n        if (sizeof(int) <= 2) {\n            if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n                more = wsize;\n\n            } else if (more == (unsigned)(-1)) {\n                /* Very unlikely, but possible on 16 bit machine if\n                 * strstart == 0 && lookahead == 1 (input done a byte at time)\n                 */\n                more--;\n            }\n        }\n\n        /* If the window is almost full and there is insufficient lookahead,\n         * move the upper half to the lower one to make room in the upper half.\n         */\n        if (s->strstart >= wsize+MAX_DIST(s)) {\n\n            zmemcpy(s->window, s->window+wsize, (unsigned)wsize);\n            s->match_start -= wsize;\n            s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */\n            s->block_start -= (long) wsize;\n\n            /* Slide the hash table (could be avoided with 32 bit values\n               at the expense of memory usage). We slide even when level == 0\n               to keep the hash table consistent if we switch back to level > 0\n               later. (Using level 0 permanently is not an optimal usage of\n               zlib, so we don't care about this pathological case.)\n             */\n            /* %%% avoid this when Z_RLE */\n            n = s->hash_size;\n            p = &s->head[n];\n            do {\n                m = *--p;\n                *p = (Pos)(m >= wsize ? m-wsize : NIL);\n            } while (--n);\n\n            n = wsize;\n#ifndef FASTEST\n            p = &s->prev[n];\n            do {\n                m = *--p;\n                *p = (Pos)(m >= wsize ? m-wsize : NIL);\n                /* If n is not on any hash chain, prev[n] is garbage but\n                 * its value will never be used.\n                 */\n            } while (--n);\n#endif\n            more += wsize;\n        }\n        if (s->strm->avail_in == 0) return;\n\n        /* If there was no sliding:\n         *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n         *    more == window_size - lookahead - strstart\n         * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n         * => more >= window_size - 2*WSIZE + 2\n         * In the BIG_MEM or MMAP case (not yet supported),\n         *   window_size == input_size + MIN_LOOKAHEAD  &&\n         *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n         * Otherwise, window_size == 2*WSIZE so more >= 2.\n         * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n         */\n        Assert(more >= 2, \"more < 2\");\n\n        n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);\n        s->lookahead += n;\n\n        /* Initialize the hash value now that we have some input: */\n        if (s->lookahead >= MIN_MATCH) {\n            s->ins_h = s->window[s->strstart];\n            UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);\n#if MIN_MATCH != 3\n            Call UPDATE_HASH() MIN_MATCH-3 more times\n#endif\n        }\n        /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n         * but this is not important since only literal bytes will be emitted.\n         */\n\n    } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);\n}\n\n/* ===========================================================================\n * Flush the current block, with given end-of-file flag.\n * IN assertion: strstart is set to the end of the current match.\n */\n#define FLUSH_BLOCK_ONLY(s, eof) { \\\n   _tr_flush_block(s, (s->block_start >= 0L ? \\\n                   (charf *)&s->window[(unsigned)s->block_start] : \\\n                   (charf *)Z_NULL), \\\n                (ulg)((long)s->strstart - s->block_start), \\\n                (eof)); \\\n   s->block_start = s->strstart; \\\n   flush_pending(s->strm); \\\n   Tracev((stderr,\"[FLUSH]\")); \\\n}\n\n/* Same but force premature exit if necessary. */\n#define FLUSH_BLOCK(s, eof) { \\\n   FLUSH_BLOCK_ONLY(s, eof); \\\n   if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \\\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nlocal block_state deflate_stored(s, flush)\n    deflate_state *s;\n    int flush;\n{\n    /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n     * to pending_buf_size, and each stored block has a 5 byte header:\n     */\n    ulg max_block_size = 0xffff;\n    ulg max_start;\n\n    if (max_block_size > s->pending_buf_size - 5) {\n        max_block_size = s->pending_buf_size - 5;\n    }\n\n    /* Copy as much as possible from input to output: */\n    for (;;) {\n        /* Fill the window as much as possible: */\n        if (s->lookahead <= 1) {\n\n            Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n                   s->block_start >= (long)s->w_size, \"slide too late\");\n\n            fill_window(s);\n            if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;\n\n            if (s->lookahead == 0) break; /* flush the current block */\n        }\n        Assert(s->block_start >= 0L, \"block gone\");\n\n        s->strstart += s->lookahead;\n        s->lookahead = 0;\n\n        /* Emit a stored block if pending_buf will be full: */\n        max_start = s->block_start + max_block_size;\n        if (s->strstart == 0 || (ulg)s->strstart >= max_start) {\n            /* strstart == 0 is possible when wraparound on 16-bit machine */\n            s->lookahead = (uInt)(s->strstart - max_start);\n            s->strstart = (uInt)max_start;\n            FLUSH_BLOCK(s, 0);\n        }\n        /* Flush if we may have to slide, otherwise block_start may become\n         * negative and the data will be gone:\n         */\n        if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {\n            FLUSH_BLOCK(s, 0);\n        }\n    }\n    FLUSH_BLOCK(s, flush == Z_FINISH);\n    return flush == Z_FINISH ? finish_done : block_done;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nlocal block_state deflate_fast(s, flush)\n    deflate_state *s;\n    int flush;\n{\n    IPos hash_head = NIL; /* head of the hash chain */\n    int bflush;           /* set if current block must be flushed */\n\n    for (;;) {\n        /* Make sure that we always have enough lookahead, except\n         * at the end of the input file. We need MAX_MATCH bytes\n         * for the next match, plus MIN_MATCH bytes to insert the\n         * string following the next match.\n         */\n        if (s->lookahead < MIN_LOOKAHEAD) {\n            fill_window(s);\n            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {\n                return need_more;\n            }\n            if (s->lookahead == 0) break; /* flush the current block */\n        }\n\n        /* Insert the string window[strstart .. strstart+2] in the\n         * dictionary, and set hash_head to the head of the hash chain:\n         */\n        if (s->lookahead >= MIN_MATCH) {\n            INSERT_STRING(s, s->strstart, hash_head);\n        }\n\n        /* Find the longest match, discarding those <= prev_length.\n         * At this point we have always match_length < MIN_MATCH\n         */\n        if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {\n            /* To simplify the code, we prevent matches with the string\n             * of window index 0 (in particular we have to avoid a match\n             * of the string with itself at the start of the input file).\n             */\n#ifdef FASTEST\n            if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) ||\n                (s->strategy == Z_RLE && s->strstart - hash_head == 1)) {\n                s->match_length = longest_match_fast (s, hash_head);\n            }\n#else\n            if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) {\n                s->match_length = longest_match (s, hash_head);\n            } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) {\n                s->match_length = longest_match_fast (s, hash_head);\n            }\n#endif\n            /* longest_match() or longest_match_fast() sets match_start */\n        }\n        if (s->match_length >= MIN_MATCH) {\n            check_match(s, s->strstart, s->match_start, s->match_length);\n\n            _tr_tally_dist(s, s->strstart - s->match_start,\n                           s->match_length - MIN_MATCH, bflush);\n\n            s->lookahead -= s->match_length;\n\n            /* Insert new strings in the hash table only if the match length\n             * is not too large. This saves time but degrades compression.\n             */\n#ifndef FASTEST\n            if (s->match_length <= s->max_insert_length &&\n                s->lookahead >= MIN_MATCH) {\n                s->match_length--; /* string at strstart already in table */\n                do {\n                    s->strstart++;\n                    INSERT_STRING(s, s->strstart, hash_head);\n                    /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n                     * always MIN_MATCH bytes ahead.\n                     */\n                } while (--s->match_length != 0);\n                s->strstart++;\n            } else\n#endif\n            {\n                s->strstart += s->match_length;\n                s->match_length = 0;\n                s->ins_h = s->window[s->strstart];\n                UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);\n#if MIN_MATCH != 3\n                Call UPDATE_HASH() MIN_MATCH-3 more times\n#endif\n                /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n                 * matter since it will be recomputed at next deflate call.\n                 */\n            }\n        } else {\n            /* No match, output a literal byte */\n            Tracevv((stderr,\"%c\", s->window[s->strstart]));\n            _tr_tally_lit (s, s->window[s->strstart], bflush);\n            s->lookahead--;\n            s->strstart++;\n        }\n        if (bflush) FLUSH_BLOCK(s, 0);\n    }\n    FLUSH_BLOCK(s, flush == Z_FINISH);\n    return flush == Z_FINISH ? finish_done : block_done;\n}\n\n#ifndef FASTEST\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nlocal block_state deflate_slow(s, flush)\n    deflate_state *s;\n    int flush;\n{\n    IPos hash_head = NIL;    /* head of hash chain */\n    int bflush;              /* set if current block must be flushed */\n\n    /* Process the input block. */\n    for (;;) {\n        /* Make sure that we always have enough lookahead, except\n         * at the end of the input file. We need MAX_MATCH bytes\n         * for the next match, plus MIN_MATCH bytes to insert the\n         * string following the next match.\n         */\n        if (s->lookahead < MIN_LOOKAHEAD) {\n            fill_window(s);\n            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {\n                return need_more;\n            }\n            if (s->lookahead == 0) break; /* flush the current block */\n        }\n\n        /* Insert the string window[strstart .. strstart+2] in the\n         * dictionary, and set hash_head to the head of the hash chain:\n         */\n        if (s->lookahead >= MIN_MATCH) {\n            INSERT_STRING(s, s->strstart, hash_head);\n        }\n\n        /* Find the longest match, discarding those <= prev_length.\n         */\n        s->prev_length = s->match_length, s->prev_match = s->match_start;\n        s->match_length = MIN_MATCH-1;\n\n        if (hash_head != NIL && s->prev_length < s->max_lazy_match &&\n            s->strstart - hash_head <= MAX_DIST(s)) {\n            /* To simplify the code, we prevent matches with the string\n             * of window index 0 (in particular we have to avoid a match\n             * of the string with itself at the start of the input file).\n             */\n            if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) {\n                s->match_length = longest_match (s, hash_head);\n            } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) {\n                s->match_length = longest_match_fast (s, hash_head);\n            }\n            /* longest_match() or longest_match_fast() sets match_start */\n\n            if (s->match_length <= 5 && (s->strategy == Z_FILTERED\n#if TOO_FAR <= 32767\n                || (s->match_length == MIN_MATCH &&\n                    s->strstart - s->match_start > TOO_FAR)\n#endif\n                )) {\n\n                /* If prev_match is also MIN_MATCH, match_start is garbage\n                 * but we will ignore the current match anyway.\n                 */\n                s->match_length = MIN_MATCH-1;\n            }\n        }\n        /* If there was a match at the previous step and the current\n         * match is not better, output the previous match:\n         */\n        if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {\n            uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;\n            /* Do not insert strings in hash table beyond this. */\n\n            check_match(s, s->strstart-1, s->prev_match, s->prev_length);\n\n            _tr_tally_dist(s, s->strstart -1 - s->prev_match,\n                           s->prev_length - MIN_MATCH, bflush);\n\n            /* Insert in hash table all strings up to the end of the match.\n             * strstart-1 and strstart are already inserted. If there is not\n             * enough lookahead, the last two strings are not inserted in\n             * the hash table.\n             */\n            s->lookahead -= s->prev_length-1;\n            s->prev_length -= 2;\n            do {\n                if (++s->strstart <= max_insert) {\n                    INSERT_STRING(s, s->strstart, hash_head);\n                }\n            } while (--s->prev_length != 0);\n            s->match_available = 0;\n            s->match_length = MIN_MATCH-1;\n            s->strstart++;\n\n            if (bflush) FLUSH_BLOCK(s, 0);\n\n        } else if (s->match_available) {\n            /* If there was no match at the previous position, output a\n             * single literal. If there was a match but the current match\n             * is longer, truncate the previous match to a single literal.\n             */\n            Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n            _tr_tally_lit(s, s->window[s->strstart-1], bflush);\n            if (bflush) {\n                FLUSH_BLOCK_ONLY(s, 0);\n            }\n            s->strstart++;\n            s->lookahead--;\n            if (s->strm->avail_out == 0) return need_more;\n        } else {\n            /* There is no previous match to compare with, wait for\n             * the next step to decide.\n             */\n            s->match_available = 1;\n            s->strstart++;\n            s->lookahead--;\n        }\n    }\n    Assert (flush != Z_NO_FLUSH, \"no flush?\");\n    if (s->match_available) {\n        Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n        _tr_tally_lit(s, s->window[s->strstart-1], bflush);\n        s->match_available = 0;\n    }\n    FLUSH_BLOCK(s, flush == Z_FINISH);\n    return flush == Z_FINISH ? finish_done : block_done;\n}\n#endif /* FASTEST */\n\n#if 0\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nlocal block_state deflate_rle(s, flush)\n    deflate_state *s;\n    int flush;\n{\n    int bflush;         /* set if current block must be flushed */\n    uInt run;           /* length of run */\n    uInt max;           /* maximum length of run */\n    uInt prev;          /* byte at distance one to match */\n    Bytef *scan;        /* scan for end of run */\n\n    for (;;) {\n        /* Make sure that we always have enough lookahead, except\n         * at the end of the input file. We need MAX_MATCH bytes\n         * for the longest encodable run.\n         */\n        if (s->lookahead < MAX_MATCH) {\n            fill_window(s);\n            if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) {\n                return need_more;\n            }\n            if (s->lookahead == 0) break; /* flush the current block */\n        }\n\n        /* See how many times the previous byte repeats */\n        run = 0;\n        if (s->strstart > 0) {      /* if there is a previous byte, that is */\n            max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH;\n            scan = s->window + s->strstart - 1;\n            prev = *scan++;\n            do {\n                if (*scan++ != prev)\n                    break;\n            } while (++run < max);\n        }\n\n        /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n        if (run >= MIN_MATCH) {\n            check_match(s, s->strstart, s->strstart - 1, run);\n            _tr_tally_dist(s, 1, run - MIN_MATCH, bflush);\n            s->lookahead -= run;\n            s->strstart += run;\n        } else {\n            /* No match, output a literal byte */\n            Tracevv((stderr,\"%c\", s->window[s->strstart]));\n            _tr_tally_lit (s, s->window[s->strstart], bflush);\n            s->lookahead--;\n            s->strstart++;\n        }\n        if (bflush) FLUSH_BLOCK(s, 0);\n    }\n    FLUSH_BLOCK(s, flush == Z_FINISH);\n    return flush == Z_FINISH ? finish_done : block_done;\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/deflate.h",
    "content": "/* deflate.h -- internal compression state\n * Copyright (C) 1995-2005 Jean-loup Gailly\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n/* @(#) $Id$ */\n\n#ifndef DEFLATE_H\n#define DEFLATE_H\n\n#include \"zutil.h\"\n\n/* define NO_GZIP when compiling if you want to disable gzip header and\n   trailer creation by deflate().  NO_GZIP would be used to avoid linking in\n   the crc code when it is not needed.  For shared libraries, gzip encoding\n   should be left enabled. */\n#ifndef NO_GZIP\n#  define GZIP\n#endif\n\n/* ===========================================================================\n * Internal compression state.\n */\n\n#define LENGTH_CODES 29\n/* number of length codes, not counting the special END_BLOCK code */\n\n#define LITERALS  256\n/* number of literal bytes 0..255 */\n\n#define L_CODES (LITERALS+1+LENGTH_CODES)\n/* number of Literal or Length codes, including the END_BLOCK code */\n\n#define D_CODES   30\n/* number of distance codes */\n\n#define BL_CODES  19\n/* number of codes used to transfer the bit lengths */\n\n#define HEAP_SIZE (2*L_CODES+1)\n/* maximum heap size */\n\n#define MAX_BITS 15\n/* All codes must not exceed MAX_BITS bits */\n\n#define INIT_STATE    42\n#define EXTRA_STATE   69\n#define NAME_STATE    73\n#define COMMENT_STATE 91\n#define HCRC_STATE   103\n#define BUSY_STATE   113\n#define FINISH_STATE 666\n/* Stream status */\n\n\n/* Data structure describing a single value and its code string. */\ntypedef struct ct_data_s {\n    union {\n        ush  freq;       /* frequency count */\n        ush  code;       /* bit string */\n    } fc;\n    union {\n        ush  dad;        /* father node in Huffman tree */\n        ush  len;        /* length of bit string */\n    } dl;\n} FAR ct_data;\n\n#define Freq fc.freq\n#define Code fc.code\n#define Dad  dl.dad\n#define Len  dl.len\n\ntypedef struct static_tree_desc_s  static_tree_desc;\n\ntypedef struct tree_desc_s {\n    ct_data *dyn_tree;           /* the dynamic tree */\n    int     max_code;            /* largest code with non zero frequency */\n    static_tree_desc *stat_desc; /* the corresponding static tree */\n} FAR tree_desc;\n\ntypedef ush Pos;\ntypedef Pos FAR Posf;\ntypedef unsigned IPos;\n\n/* A Pos is an index in the character window. We use short instead of int to\n * save space in the various tables. IPos is used only for parameter passing.\n */\n\ntypedef struct internal_state {\n    z_streamp strm;      /* pointer back to this zlib stream */\n    int   status;        /* as the name implies */\n    Bytef *pending_buf;  /* output still pending */\n    ulg   pending_buf_size; /* size of pending_buf */\n    Bytef *pending_out;  /* next pending byte to output to the stream */\n    uInt   pending;      /* nb of bytes in the pending buffer */\n    int   wrap;          /* bit 0 true for zlib, bit 1 true for gzip */\n    gz_headerp  gzhead;  /* gzip header information to write */\n    uInt   gzindex;      /* where in extra, name, or comment */\n    Byte  method;        /* STORED (for zip only) or DEFLATED */\n    int   last_flush;    /* value of flush param for previous deflate call */\n\n                /* used by deflate.c: */\n\n    uInt  w_size;        /* LZ77 window size (32K by default) */\n    uInt  w_bits;        /* log2(w_size)  (8..16) */\n    uInt  w_mask;        /* w_size - 1 */\n\n    Bytef *window;\n    /* Sliding window. Input bytes are read into the second half of the window,\n     * and move to the first half later to keep a dictionary of at least wSize\n     * bytes. With this organization, matches are limited to a distance of\n     * wSize-MAX_MATCH bytes, but this ensures that IO is always\n     * performed with a length multiple of the block size. Also, it limits\n     * the window size to 64K, which is quite useful on MSDOS.\n     * To do: use the user input buffer as sliding window.\n     */\n\n    ulg window_size;\n    /* Actual size of window: 2*wSize, except when the user input buffer\n     * is directly used as sliding window.\n     */\n\n    Posf *prev;\n    /* Link to older string with same hash index. To limit the size of this\n     * array to 64K, this link is maintained only for the last 32K strings.\n     * An index in this array is thus a window index modulo 32K.\n     */\n\n    Posf *head; /* Heads of the hash chains or NIL. */\n\n    uInt  ins_h;          /* hash index of string to be inserted */\n    uInt  hash_size;      /* number of elements in hash table */\n    uInt  hash_bits;      /* log2(hash_size) */\n    uInt  hash_mask;      /* hash_size-1 */\n\n    uInt  hash_shift;\n    /* Number of bits by which ins_h must be shifted at each input\n     * step. It must be such that after MIN_MATCH steps, the oldest\n     * byte no longer takes part in the hash key, that is:\n     *   hash_shift * MIN_MATCH >= hash_bits\n     */\n\n    long block_start;\n    /* Window position at the beginning of the current output block. Gets\n     * negative when the window is moved backwards.\n     */\n\n    uInt match_length;           /* length of best match */\n    IPos prev_match;             /* previous match */\n    int match_available;         /* set if previous match exists */\n    uInt strstart;               /* start of string to insert */\n    uInt match_start;            /* start of matching string */\n    uInt lookahead;              /* number of valid bytes ahead in window */\n\n    uInt prev_length;\n    /* Length of the best match at previous step. Matches not greater than this\n     * are discarded. This is used in the lazy match evaluation.\n     */\n\n    uInt max_chain_length;\n    /* To speed up deflation, hash chains are never searched beyond this\n     * length.  A higher limit improves compression ratio but degrades the\n     * speed.\n     */\n\n    uInt max_lazy_match;\n    /* Attempt to find a better match only when the current match is strictly\n     * smaller than this value. This mechanism is used only for compression\n     * levels >= 4.\n     */\n#   define max_insert_length  max_lazy_match\n    /* Insert new strings in the hash table only if the match length is not\n     * greater than this length. This saves time but degrades compression.\n     * max_insert_length is used only for compression levels <= 3.\n     */\n\n    int level;    /* compression level (1..9) */\n    int strategy; /* favor or force Huffman coding*/\n\n    uInt good_match;\n    /* Use a faster search when the previous match is longer than this */\n\n    int nice_match; /* Stop searching when current match exceeds this */\n\n                /* used by trees.c: */\n    /* Didn't use ct_data typedef below to supress compiler warning */\n    struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n    struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n    struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n    struct tree_desc_s l_desc;               /* desc. for literal tree */\n    struct tree_desc_s d_desc;               /* desc. for distance tree */\n    struct tree_desc_s bl_desc;              /* desc. for bit length tree */\n\n    ush bl_count[MAX_BITS+1];\n    /* number of codes at each bit length for an optimal tree */\n\n    int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n    int heap_len;               /* number of elements in the heap */\n    int heap_max;               /* element of largest frequency */\n    /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n     * The same heap array is used to build all trees.\n     */\n\n    uch depth[2*L_CODES+1];\n    /* Depth of each subtree used as tie breaker for trees of equal frequency\n     */\n\n    uchf *l_buf;          /* buffer for literals or lengths */\n\n    uInt  lit_bufsize;\n    /* Size of match buffer for literals/lengths.  There are 4 reasons for\n     * limiting lit_bufsize to 64K:\n     *   - frequencies can be kept in 16 bit counters\n     *   - if compression is not successful for the first block, all input\n     *     data is still in the window so we can still emit a stored block even\n     *     when input comes from standard input.  (This can also be done for\n     *     all blocks if lit_bufsize is not greater than 32K.)\n     *   - if compression is not successful for a file smaller than 64K, we can\n     *     even emit a stored file instead of a stored block (saving 5 bytes).\n     *     This is applicable only for zip (not gzip or zlib).\n     *   - creating new Huffman trees less frequently may not provide fast\n     *     adaptation to changes in the input data statistics. (Take for\n     *     example a binary file with poorly compressible code followed by\n     *     a highly compressible string table.) Smaller buffer sizes give\n     *     fast adaptation but have of course the overhead of transmitting\n     *     trees more frequently.\n     *   - I can't count above 4\n     */\n\n    uInt last_lit;      /* running index in l_buf */\n\n    ushf *d_buf;\n    /* Buffer for distances. To simplify the code, d_buf and l_buf have\n     * the same number of elements. To use different lengths, an extra flag\n     * array would be necessary.\n     */\n\n    ulg opt_len;        /* bit length of current block with optimal trees */\n    ulg static_len;     /* bit length of current block with static trees */\n    uInt matches;       /* number of string matches in current block */\n    int last_eob_len;   /* bit length of EOB code for last block */\n\n#ifdef DEBUG\n    ulg compressed_len; /* total bit length of compressed file mod 2^32 */\n    ulg bits_sent;      /* bit length of compressed data sent mod 2^32 */\n#endif\n\n    ush bi_buf;\n    /* Output buffer. bits are inserted starting at the bottom (least\n     * significant bits).\n     */\n    int bi_valid;\n    /* Number of valid bits in bi_buf.  All bits above the last valid bit\n     * are always zero.\n     */\n\n} FAR deflate_state;\n\n/* Output a byte on the stream.\n * IN assertion: there is enough room in pending_buf.\n */\n#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}\n\n\n#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)\n/* Minimum amount of lookahead, except at the end of the input file.\n * See deflate.c for comments about the MIN_MATCH+1.\n */\n\n#define MAX_DIST(s)  ((s)->w_size-MIN_LOOKAHEAD)\n/* In order to simplify the code, particularly on 16 bit machines, match\n * distances are limited to MAX_DIST instead of WSIZE.\n */\n\n        /* in trees.c */\nvoid _tr_init         OF((deflate_state *s));\nint  _tr_tally        OF((deflate_state *s, unsigned dist, unsigned lc));\nvoid _tr_flush_block  OF((deflate_state *s, charf *buf, ulg stored_len,\n                          int eof));\nvoid _tr_align        OF((deflate_state *s));\nvoid _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,\n                          int eof));\n\n#define d_code(dist) \\\n   ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])\n/* Mapping from a distance to a distance code. dist is the distance - 1 and\n * must not have side effects. _dist_code[256] and _dist_code[257] are never\n * used.\n */\n\n#ifndef DEBUG\n/* Inline versions of _tr_tally for speed: */\n\n#if defined(GEN_TREES_H) || !defined(STDC)\n  extern uch _length_code[];\n  extern uch _dist_code[];\n#else\n  extern const uch _length_code[];\n  extern const uch _dist_code[];\n#endif\n\n# define _tr_tally_lit(s, c, flush) \\\n  { uch cc = (c); \\\n    s->d_buf[s->last_lit] = 0; \\\n    s->l_buf[s->last_lit++] = cc; \\\n    s->dyn_ltree[cc].Freq++; \\\n    flush = (s->last_lit == s->lit_bufsize-1); \\\n   }\n# define _tr_tally_dist(s, distance, length, flush) \\\n  { uch len = (length); \\\n    ush dist = (distance); \\\n    s->d_buf[s->last_lit] = dist; \\\n    s->l_buf[s->last_lit++] = len; \\\n    dist--; \\\n    s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \\\n    s->dyn_dtree[d_code(dist)].Freq++; \\\n    flush = (s->last_lit == s->lit_bufsize-1); \\\n  }\n#else\n# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)\n# define _tr_tally_dist(s, distance, length, flush) \\\n              flush = _tr_tally(s, distance, length)\n#endif\n\n#endif /* DEFLATE_H */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/gzio.c",
    "content": "#ifdef MONO_DOES_NOT_NEED_THIS\n/* gzio.c -- IO on .gz files\n * Copyright (C) 1995-2006 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n *\n * Compile this file with -DNO_GZCOMPRESS to avoid the compression code.\n */\n\n/* @(#) $Id$ */\n\n#ifdef _LARGEFILE64_SOURCE\n#  ifndef _LARGEFILE_SOURCE\n#    define _LARGEFILE_SOURCE\n#  endif\n#  ifdef _FILE_OFFSET_BITS\n#    undef _FILE_OFFSET_BITS\n#  endif\n#endif\n\n#include \"zutil.h\"\n#include <stdio.h>\n\n#ifdef NO_DEFLATE       /* for compatibility with old definition */\n#  define NO_GZCOMPRESS\n#endif\n\n#ifndef NO_DUMMY_DECL\nstruct internal_state {int dummy;}; /* for buggy compilers */\n#endif\n\n#ifndef Z_BUFSIZE\n#  ifdef MAXSEG_64K\n#    define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */\n#  else\n#    define Z_BUFSIZE 16384\n#  endif\n#endif\n#ifndef Z_PRINTF_BUFSIZE\n#  define Z_PRINTF_BUFSIZE 4096\n#endif\n\n#ifdef __MVS__\n#  pragma map (fdopen , \"\\174\\174FDOPEN\")\n   FILE *fdopen(int, const char *);\n#endif\n\n#ifndef STDC\nextern voidp  malloc OF((uInt size));\nextern void   free   OF((voidpf ptr));\n#endif\n\n#ifdef NO_FSEEKO\n#  define FSEEK fseek\n#  define FTELL ftell\n#else\n#  define FSEEK fseeko\n#  define FTELL ftello\n#endif\n\n#define ALLOC(size) malloc(size)\n#define TRYFREE(p) {if (p) free(p);}\n\nstatic int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */\n\n/* gzip flag byte */\n#define ASCII_FLAG   0x01 /* bit 0 set: file probably ascii text */\n#define HEAD_CRC     0x02 /* bit 1 set: header CRC present */\n#define EXTRA_FIELD  0x04 /* bit 2 set: extra field present */\n#define ORIG_NAME    0x08 /* bit 3 set: original file name present */\n#define COMMENT      0x10 /* bit 4 set: file comment present */\n#define RESERVED     0xE0 /* bits 5..7: reserved */\n\ntypedef struct gz_stream {\n    z_stream stream;\n    int      z_err;   /* error code for last stream operation */\n    int      z_eof;   /* set if end of input file */\n    FILE     *file;   /* .gz file */\n    Byte     *inbuf;  /* input buffer */\n    Byte     *outbuf; /* output buffer */\n    uLong    crc;     /* crc32 of uncompressed data */\n    char     *msg;    /* error message */\n    char     *path;   /* path name for debugging only */\n    int      transparent; /* 1 if input file is not a .gz file */\n    char     mode;    /* 'w' or 'r' */\n#ifdef _LARGEFILE64_SOURCE\n    off64_t  start;   /* start of compressed data in file (header skipped) */\n    off64_t  in;      /* bytes into deflate or inflate */\n    off64_t  out;     /* bytes out of deflate or inflate */\n#else\n    z_off_t  start;   /* start of compressed data in file (header skipped) */\n    z_off_t  in;      /* bytes into deflate or inflate */\n    z_off_t  out;     /* bytes out of deflate or inflate */\n#endif\n    int      back;    /* one character push-back */\n    int      last;    /* true if push-back is last character */\n} gz_stream;\n\n\nlocal gzFile gz_open      OF((const char *path, const char *mode, int fd,\n                              int use64));\n#ifdef _LARGEFILE64_SOURCE\nlocal off64_t gz_seek OF((gzFile file, off64_t offset, int whence, int use64));\n#else\nlocal z_off_t gz_seek OF((gzFile file, z_off_t offset, int whence, int use64));\n#endif\nlocal int do_flush        OF((gzFile file, int flush));\nlocal int    get_byte     OF((gz_stream *s));\nlocal void   check_header OF((gz_stream *s));\nlocal int    destroy      OF((gz_stream *s));\nlocal void   putLong      OF((FILE *file, uLong x));\nlocal uLong  getLong      OF((gz_stream *s));\n\n/* ===========================================================================\n     Opens a gzip (.gz) file for reading or writing. The mode parameter\n   is as in fopen (\"rb\" or \"wb\"). The file is given either by file descriptor\n   or path name (if fd == -1).\n     gz_open returns NULL if the file could not be opened or if there was\n   insufficient memory to allocate the (de)compression state; errno\n   can be checked to distinguish the two cases (if errno is zero, the\n   zlib error is Z_MEM_ERROR).\n*/\nlocal gzFile gz_open (path, mode, fd, use64)\n    const char *path;\n    const char *mode;\n    int  fd;\n    int use64;\n{\n    int err;\n    int level = Z_DEFAULT_COMPRESSION; /* compression level */\n    int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */\n    char *p = (char*)mode;\n    gz_stream *s;\n    char fmode[80]; /* copy of mode, without the compression level */\n    char *m = fmode;\n\n    if (!path || !mode) return Z_NULL;\n\n    s = (gz_stream *)ALLOC(sizeof(gz_stream));\n    if (!s) return Z_NULL;\n\n    s->stream.zalloc = (alloc_func)0;\n    s->stream.zfree = (free_func)0;\n    s->stream.opaque = (voidpf)0;\n    s->stream.next_in = s->inbuf = Z_NULL;\n    s->stream.next_out = s->outbuf = Z_NULL;\n    s->stream.avail_in = s->stream.avail_out = 0;\n    s->file = NULL;\n    s->z_err = Z_OK;\n    s->z_eof = 0;\n    s->in = 0;\n    s->out = 0;\n    s->back = EOF;\n    s->crc = crc32(0L, Z_NULL, 0);\n    s->msg = NULL;\n    s->transparent = 0;\n\n    s->path = (char*)ALLOC(strlen(path)+1);\n    if (s->path == NULL) {\n        return destroy(s), (gzFile)Z_NULL;\n    }\n    strcpy(s->path, path); /* do this early for debugging */\n\n    s->mode = '\\0';\n    do {\n        if (*p == 'r') s->mode = 'r';\n        if (*p == 'w' || *p == 'a') s->mode = 'w';\n        if (*p >= '0' && *p <= '9') {\n            level = *p - '0';\n        } else if (*p == 'f') {\n          strategy = Z_FILTERED;\n        } else if (*p == 'h') {\n          strategy = Z_HUFFMAN_ONLY;\n        } else if (*p == 'R') {\n          strategy = Z_RLE;\n        } else {\n            *m++ = *p; /* copy the mode */\n        }\n    } while (*p++ && m != fmode + sizeof(fmode));\n    if (s->mode == '\\0') return destroy(s), (gzFile)Z_NULL;\n\n    if (s->mode == 'w') {\n#ifdef NO_GZCOMPRESS\n        err = Z_STREAM_ERROR;\n#else\n        err = deflateInit2(&(s->stream), level,\n                           Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy);\n        /* windowBits is passed < 0 to suppress zlib header */\n\n        s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);\n#endif\n        if (err != Z_OK || s->outbuf == Z_NULL) {\n            return destroy(s), (gzFile)Z_NULL;\n        }\n    } else {\n        s->stream.next_in  = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE);\n\n        err = inflateInit2(&(s->stream), -MAX_WBITS);\n        /* windowBits is passed < 0 to tell that there is no zlib header */\n        if (err != Z_OK || s->inbuf == Z_NULL) {\n            return destroy(s), (gzFile)Z_NULL;\n        }\n    }\n    s->stream.avail_out = Z_BUFSIZE;\n\n    errno = 0;\n    s->file = fd < 0 ? (use64 ? F_OPEN64(path, fmode) : F_OPEN(path, fmode)) :\n              (FILE*)fdopen(fd, fmode);\n\n    if (s->file == NULL) {\n        return destroy(s), (gzFile)Z_NULL;\n    }\n    if (s->mode == 'w') {\n        /* Write a very simple .gz header:\n         */\n        fprintf(s->file, \"%c%c%c%c%c%c%c%c%c%c\", gz_magic[0], gz_magic[1],\n             Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, level == 9 ? 2 :\n                            (strategy >= Z_HUFFMAN_ONLY ||\n                             (level != Z_DEFAULT_COMPRESSION && level < 2) ?\n                             4 : 0) /*xflags*/, OS_CODE);\n        s->start = 10L;\n        /* We use 10L instead of ftell(s->file) to because ftell causes an\n         * fflush on some systems. This version of the library doesn't use\n         * start anyway in write mode, so this initialization is not\n         * necessary.\n         */\n    } else {\n        check_header(s); /* skip the .gz header */\n        s->start = FTELL(s->file) - s->stream.avail_in;\n    }\n\n    return (gzFile)s;\n}\n\n/* ===========================================================================\n     Opens a gzip (.gz) file for reading or writing.\n*/\ngzFile ZEXPORT gzopen (path, mode)\n    const char *path;\n    const char *mode;\n{\n    return gz_open (path, mode, -1, 0);\n}\n\n/* ===========================================================================\n     Opens a gzip (.gz) file for reading or writing for 64-bit offsets\n*/\ngzFile ZEXPORT gzopen64 (path, mode)\n    const char *path;\n    const char *mode;\n{\n    return gz_open (path, mode, -1, 1);\n}\n\n/* ===========================================================================\n     Associate a gzFile with the file descriptor fd. fd is not dup'ed here\n   to mimic the behavio(u)r of fdopen.\n*/\ngzFile ZEXPORT gzdopen (fd, mode)\n    int fd;\n    const char *mode;\n{\n    char name[46];      /* allow for up to 128-bit integers */\n\n    if (fd < 0) return (gzFile)Z_NULL;\n    sprintf(name, \"<fd:%d>\", fd); /* for debugging */\n\n    return gz_open (name, mode, fd, 0);\n}\n\n/* ===========================================================================\n * Update the compression level and strategy\n */\nint ZEXPORT gzsetparams (file, level, strategy)\n    gzFile file;\n    int level;\n    int strategy;\n{\n    gz_stream *s = (gz_stream*)file;\n\n    if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;\n\n    /* Make room to allow flushing */\n    if (s->stream.avail_out == 0) {\n\n        s->stream.next_out = s->outbuf;\n        if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {\n            s->z_err = Z_ERRNO;\n        }\n        s->stream.avail_out = Z_BUFSIZE;\n    }\n\n    return deflateParams (&(s->stream), level, strategy);\n}\n\n/* ===========================================================================\n     Read a byte from a gz_stream; update next_in and avail_in. Return EOF\n   for end of file.\n   IN assertion: the stream s has been successfully opened for reading.\n*/\nlocal int get_byte(s)\n    gz_stream *s;\n{\n    if (s->z_eof) return EOF;\n    if (s->stream.avail_in == 0) {\n        errno = 0;\n        s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file);\n        if (s->stream.avail_in == 0) {\n            s->z_eof = 1;\n            if (ferror(s->file)) s->z_err = Z_ERRNO;\n            return EOF;\n        }\n        s->stream.next_in = s->inbuf;\n    }\n    s->stream.avail_in--;\n    return *(s->stream.next_in)++;\n}\n\n/* ===========================================================================\n      Check the gzip header of a gz_stream opened for reading. Set the stream\n    mode to transparent if the gzip magic header is not present; set s->err\n    to Z_DATA_ERROR if the magic header is present but the rest of the header\n    is incorrect.\n    IN assertion: the stream s has already been created successfully;\n       s->stream.avail_in is zero for the first time, but may be non-zero\n       for concatenated .gz files.\n*/\nlocal void check_header(s)\n    gz_stream *s;\n{\n    int method; /* method byte */\n    int flags;  /* flags byte */\n    uInt len;\n    int c;\n\n    /* Assure two bytes in the buffer so we can peek ahead -- handle case\n       where first byte of header is at the end of the buffer after the last\n       gzip segment */\n    len = s->stream.avail_in;\n    if (len < 2) {\n        if (len) s->inbuf[0] = s->stream.next_in[0];\n        errno = 0;\n        len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file);\n        if (len == 0) s->z_eof = 1;\n        if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO;\n        s->stream.avail_in += len;\n        s->stream.next_in = s->inbuf;\n        if (s->stream.avail_in < 2) {\n            s->transparent = s->stream.avail_in;\n            return;\n        }\n    }\n\n    /* Peek ahead to check the gzip magic header */\n    if (s->stream.next_in[0] != gz_magic[0] ||\n        s->stream.next_in[1] != gz_magic[1]) {\n        s->transparent = 1;\n        return;\n    }\n    s->stream.avail_in -= 2;\n    s->stream.next_in += 2;\n\n    /* Check the rest of the gzip header */\n    method = get_byte(s);\n    flags = get_byte(s);\n    if (method != Z_DEFLATED || (flags & RESERVED) != 0) {\n        s->z_err = Z_DATA_ERROR;\n        return;\n    }\n\n    /* Discard time, xflags and OS code: */\n    for (len = 0; len < 6; len++) (void)get_byte(s);\n\n    if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */\n        len  =  (uInt)get_byte(s);\n        len += ((uInt)get_byte(s))<<8;\n        /* len is garbage if EOF but the loop below will quit anyway */\n        while (len-- != 0 && get_byte(s) != EOF) ;\n    }\n    if ((flags & ORIG_NAME) != 0) { /* skip the original file name */\n        while ((c = get_byte(s)) != 0 && c != EOF) ;\n    }\n    if ((flags & COMMENT) != 0) {   /* skip the .gz file comment */\n        while ((c = get_byte(s)) != 0 && c != EOF) ;\n    }\n    if ((flags & HEAD_CRC) != 0) {  /* skip the header crc */\n        for (len = 0; len < 2; len++) (void)get_byte(s);\n    }\n    s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK;\n}\n\n /* ===========================================================================\n * Cleanup then free the given gz_stream. Return a zlib error code.\n   Try freeing in the reverse order of allocations.\n */\nlocal int destroy (s)\n    gz_stream *s;\n{\n    int err = Z_OK;\n\n    if (!s) return Z_STREAM_ERROR;\n\n    TRYFREE(s->msg);\n\n    if (s->stream.state != NULL) {\n        if (s->mode == 'w') {\n#ifdef NO_GZCOMPRESS\n            err = Z_STREAM_ERROR;\n#else\n            err = deflateEnd(&(s->stream));\n#endif\n        } else if (s->mode == 'r') {\n            err = inflateEnd(&(s->stream));\n        }\n    }\n    if (s->file != NULL && fclose(s->file)) {\n#ifdef ESPIPE\n        if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */\n#endif\n            err = Z_ERRNO;\n    }\n    if (s->z_err < 0) err = s->z_err;\n\n    TRYFREE(s->inbuf);\n    TRYFREE(s->outbuf);\n    TRYFREE(s->path);\n    TRYFREE(s);\n    return err;\n}\n\n/* ===========================================================================\n     Reads the given number of uncompressed bytes from the compressed file.\n   gzread returns the number of bytes actually read (0 for end of file).\n*/\nint ZEXPORT gzread (file, buf, len)\n    gzFile file;\n    voidp buf;\n    unsigned len;\n{\n    gz_stream *s = (gz_stream*)file;\n    Bytef *start = (Bytef*)buf; /* starting point for crc computation */\n    Byte  *next_out; /* == stream.next_out but not forced far (for MSDOS) */\n\n    if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR;\n\n    if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1;\n    if (s->z_err == Z_STREAM_END) return 0;  /* EOF */\n\n    next_out = (Byte*)buf;\n    s->stream.next_out = (Bytef*)buf;\n    s->stream.avail_out = len;\n\n    if (s->stream.avail_out && s->back != EOF) {\n        *next_out++ = s->back;\n        s->stream.next_out++;\n        s->stream.avail_out--;\n        s->back = EOF;\n        s->out++;\n        start++;\n        if (s->last) {\n            s->z_err = Z_STREAM_END;\n            return 1;\n        }\n    }\n\n    while (s->stream.avail_out != 0) {\n\n        if (s->transparent) {\n            /* Copy first the lookahead bytes: */\n            uInt n = s->stream.avail_in;\n            if (n > s->stream.avail_out) n = s->stream.avail_out;\n            if (n > 0) {\n                zmemcpy(s->stream.next_out, s->stream.next_in, n);\n                next_out += n;\n                s->stream.next_out = next_out;\n                s->stream.next_in   += n;\n                s->stream.avail_out -= n;\n                s->stream.avail_in  -= n;\n            }\n            if (s->stream.avail_out > 0 && !feof(s->file)) {\n                s->stream.avail_out -=\n                    (uInt)fread(next_out, 1, s->stream.avail_out, s->file);\n            }\n            len -= s->stream.avail_out;\n            s->in  += len;\n            s->out += len;\n            if (len == 0) s->z_eof = 1;\n            return (int)len;\n        }\n        if (s->stream.avail_in == 0 && !s->z_eof) {\n\n            errno = 0;\n            s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file);\n            if (s->stream.avail_in == 0) {\n                s->z_eof = 1;\n                if (ferror(s->file)) {\n                    s->z_err = Z_ERRNO;\n                    break;\n                }\n            }\n            s->stream.next_in = s->inbuf;\n        }\n        s->in += s->stream.avail_in;\n        s->out += s->stream.avail_out;\n        s->z_err = inflate(&(s->stream), Z_NO_FLUSH);\n        s->in -= s->stream.avail_in;\n        s->out -= s->stream.avail_out;\n\n        if (s->z_err == Z_STREAM_END) {\n            /* Check CRC and original size */\n            s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));\n            start = s->stream.next_out;\n\n            if (getLong(s) != s->crc) {\n                s->z_err = Z_DATA_ERROR;\n            } else {\n                (void)getLong(s);\n                /* The uncompressed length returned by above getlong() may be\n                 * different from s->out in case of concatenated .gz files.\n                 * Check for such files:\n                 */\n                check_header(s);\n                if (s->z_err == Z_OK) {\n                    inflateReset(&(s->stream));\n                    s->crc = crc32(0L, Z_NULL, 0);\n                }\n            }\n        }\n        if (s->z_err != Z_OK || s->z_eof) break;\n    }\n    s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));\n\n    if (len == s->stream.avail_out &&\n        (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO))\n        return -1;\n    return (int)(len - s->stream.avail_out);\n}\n\n\n/* ===========================================================================\n      Reads one byte from the compressed file. gzgetc returns this byte\n   or -1 in case of end of file or error.\n*/\nint ZEXPORT gzgetc(file)\n    gzFile file;\n{\n    unsigned char c;\n\n    return gzread(file, &c, 1) == 1 ? c : -1;\n}\n\n\n/* ===========================================================================\n      Push one byte back onto the stream.\n*/\nint ZEXPORT gzungetc(c, file)\n    int c;\n    gzFile file;\n{\n    gz_stream *s = (gz_stream*)file;\n\n    if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF;\n    s->back = c;\n    s->out--;\n    s->last = (s->z_err == Z_STREAM_END);\n    if (s->last) s->z_err = Z_OK;\n    s->z_eof = 0;\n    return c;\n}\n\n\n/* ===========================================================================\n      Reads bytes from the compressed file until len-1 characters are\n   read, or a newline character is read and transferred to buf, or an\n   end-of-file condition is encountered.  The string is then terminated\n   with a null character.\n      gzgets returns buf, or Z_NULL in case of error.\n\n      The current implementation is not optimized at all.\n*/\nchar * ZEXPORT gzgets(file, buf, len)\n    gzFile file;\n    char *buf;\n    int len;\n{\n    char *b = buf;\n    if (buf == Z_NULL || len <= 0) return Z_NULL;\n\n    while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\\n') ;\n    *buf = '\\0';\n    return b == buf && len > 0 ? Z_NULL : b;\n}\n\n\n#ifndef NO_GZCOMPRESS\n/* ===========================================================================\n     Writes the given number of uncompressed bytes into the compressed file.\n   gzwrite returns the number of bytes actually written (0 in case of error).\n*/\nint ZEXPORT gzwrite (file, buf, len)\n    gzFile file;\n    voidpc buf;\n    unsigned len;\n{\n    gz_stream *s = (gz_stream*)file;\n\n    if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;\n\n    s->stream.next_in = (Bytef*)buf;\n    s->stream.avail_in = len;\n\n    while (s->stream.avail_in != 0) {\n\n        if (s->stream.avail_out == 0) {\n\n            s->stream.next_out = s->outbuf;\n            if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {\n                s->z_err = Z_ERRNO;\n                break;\n            }\n            s->stream.avail_out = Z_BUFSIZE;\n        }\n        s->in += s->stream.avail_in;\n        s->out += s->stream.avail_out;\n        s->z_err = deflate(&(s->stream), Z_NO_FLUSH);\n        s->in -= s->stream.avail_in;\n        s->out -= s->stream.avail_out;\n        if (s->z_err != Z_OK) break;\n    }\n    s->crc = crc32(s->crc, (const Bytef *)buf, len);\n\n    return (int)(len - s->stream.avail_in);\n}\n\n\n/* ===========================================================================\n     Converts, formats, and writes the args to the compressed file under\n   control of the format string, as in fprintf. gzprintf returns the number of\n   uncompressed bytes actually written (0 in case of error).\n*/\n#ifdef STDC\n#include <stdarg.h>\n\nint ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...)\n{\n    char buf[Z_PRINTF_BUFSIZE];\n    va_list va;\n    int len;\n\n    buf[sizeof(buf) - 1] = 0;\n    va_start(va, format);\n#ifdef NO_vsnprintf\n#  ifdef HAS_vsprintf_void\n    (void)vsprintf(buf, format, va);\n    va_end(va);\n    for (len = 0; len < sizeof(buf); len++)\n        if (buf[len] == 0) break;\n#  else\n    len = vsprintf(buf, format, va);\n    va_end(va);\n#  endif\n#else\n#  ifdef HAS_vsnprintf_void\n    (void)vsnprintf(buf, sizeof(buf), format, va);\n    va_end(va);\n    len = strlen(buf);\n#  else\n    len = vsnprintf(buf, sizeof(buf), format, va);\n    va_end(va);\n#  endif\n#endif\n    if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0)\n        return 0;\n    return gzwrite(file, buf, (unsigned)len);\n}\n#else /* not ANSI C */\n\nint ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,\n                       a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)\n    gzFile file;\n    const char *format;\n    int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,\n        a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;\n{\n    char buf[Z_PRINTF_BUFSIZE];\n    int len;\n\n    buf[sizeof(buf) - 1] = 0;\n#ifdef NO_snprintf\n#  ifdef HAS_sprintf_void\n    sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8,\n            a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);\n    for (len = 0; len < sizeof(buf); len++)\n        if (buf[len] == 0) break;\n#  else\n    len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8,\n                a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);\n#  endif\n#else\n#  ifdef HAS_snprintf_void\n    snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8,\n             a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);\n    len = strlen(buf);\n#  else\n    len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8,\n                 a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);\n#  endif\n#endif\n    if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0)\n        return 0;\n    return gzwrite(file, buf, len);\n}\n#endif\n\n/* ===========================================================================\n      Writes c, converted to an unsigned char, into the compressed file.\n   gzputc returns the value that was written, or -1 in case of error.\n*/\nint ZEXPORT gzputc(file, c)\n    gzFile file;\n    int c;\n{\n    unsigned char cc = (unsigned char) c; /* required for big endian systems */\n\n    return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1;\n}\n\n\n/* ===========================================================================\n      Writes the given null-terminated string to the compressed file, excluding\n   the terminating null character.\n      gzputs returns the number of characters written, or -1 in case of error.\n*/\nint ZEXPORT gzputs(file, s)\n    gzFile file;\n    const char *s;\n{\n    return gzwrite(file, (char*)s, (unsigned)strlen(s));\n}\n\n\n/* ===========================================================================\n     Flushes all pending output into the compressed file. The parameter\n   flush is as in the deflate() function.\n*/\nlocal int do_flush (file, flush)\n    gzFile file;\n    int flush;\n{\n    uInt len;\n    int done = 0;\n    gz_stream *s = (gz_stream*)file;\n\n    if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;\n\n    s->stream.avail_in = 0; /* should be zero already anyway */\n\n    for (;;) {\n        len = Z_BUFSIZE - s->stream.avail_out;\n\n        if (len != 0) {\n            if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) {\n                s->z_err = Z_ERRNO;\n                return Z_ERRNO;\n            }\n            s->stream.next_out = s->outbuf;\n            s->stream.avail_out = Z_BUFSIZE;\n        }\n        if (done) break;\n        s->out += s->stream.avail_out;\n        s->z_err = deflate(&(s->stream), flush);\n        s->out -= s->stream.avail_out;\n\n        /* Ignore the second of two consecutive flushes: */\n        if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK;\n\n        /* deflate has finished flushing only when it hasn't used up\n         * all the available space in the output buffer:\n         */\n        done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END);\n\n        if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break;\n    }\n    return  s->z_err == Z_STREAM_END ? Z_OK : s->z_err;\n}\n\nint ZEXPORT gzflush (file, flush)\n     gzFile file;\n     int flush;\n{\n    gz_stream *s = (gz_stream*)file;\n    int err = do_flush (file, flush);\n\n    if (err) return err;\n    fflush(s->file);\n    return  s->z_err == Z_STREAM_END ? Z_OK : s->z_err;\n}\n#endif /* NO_GZCOMPRESS */\n\n/* ===========================================================================\n      Sets the starting position for the next gzread or gzwrite on the given\n   compressed file. The offset represents a number of bytes in the\n      gzseek returns the resulting offset location as measured in bytes from\n   the beginning of the uncompressed stream, or -1 in case of error.\n      SEEK_END is not implemented, returns error.\n      In this version of the library, gzseek can be extremely slow.\n*/\n#ifdef _LARGEFILE64_SOURCE\nlocal off64_t gz_seek (file, offset, whence, use64)\n    gzFile file;\n    off64_t offset;\n#else\nlocal z_off_t gz_seek (file, offset, whence, use64)\n    gzFile file;\n    z_off_t offset;\n#endif\n    int whence;\n    int use64;\n{\n    gz_stream *s = (gz_stream*)file;\n\n    if (s == NULL || whence == SEEK_END ||\n        s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) {\n        return -1L;\n    }\n\n    if (s->mode == 'w') {\n#ifdef NO_GZCOMPRESS\n        return -1L;\n#else\n        if (whence == SEEK_SET) {\n            offset -= s->in;\n        }\n        if (offset < 0) return -1L;\n\n        /* At this point, offset is the number of zero bytes to write. */\n        if (s->inbuf == Z_NULL) {\n            s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */\n            if (s->inbuf == Z_NULL) return -1L;\n            zmemzero(s->inbuf, Z_BUFSIZE);\n        }\n        while (offset > 0)  {\n            uInt size = Z_BUFSIZE;\n            if (offset < Z_BUFSIZE) size = (uInt)offset;\n\n            size = gzwrite(file, s->inbuf, size);\n            if (size == 0) return -1L;\n\n            offset -= size;\n        }\n        return s->in;\n#endif\n    }\n    /* Rest of function is for reading only */\n\n    /* compute absolute position */\n    if (whence == SEEK_CUR) {\n        offset += s->out;\n    }\n    if (offset < 0) return -1L;\n\n    if (s->transparent) {\n        /* map to fseek */\n        s->back = EOF;\n        s->stream.avail_in = 0;\n        s->stream.next_in = s->inbuf;\n#ifdef _LARGEFILE64_SOURCE\n        if ((use64 ? fseeko64(s->file, offset, SEEK_SET) :\n                     FSEEK(s->file, offset, SEEK_SET)) < 0)\n            return -1L;\n#else\n        if (FSEEK(s->file, offset, SEEK_SET) < 0) return -1L;\n#endif\n\n        s->in = s->out = offset;\n        return offset;\n    }\n\n    /* For a negative seek, rewind and use positive seek */\n    if (offset >= s->out) {\n        offset -= s->out;\n    } else if (gzrewind(file) < 0) {\n        return -1L;\n    }\n    /* offset is now the number of bytes to skip. */\n\n    if (offset != 0 && s->outbuf == Z_NULL) {\n        s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);\n        if (s->outbuf == Z_NULL) return -1L;\n    }\n    if (offset && s->back != EOF) {\n        s->back = EOF;\n        s->out++;\n        offset--;\n        if (s->last) s->z_err = Z_STREAM_END;\n    }\n    while (offset > 0)  {\n        int size = Z_BUFSIZE;\n        if (offset < Z_BUFSIZE) size = (int)offset;\n\n        size = gzread(file, s->outbuf, (uInt)size);\n        if (size <= 0) return -1L;\n        offset -= size;\n    }\n    return s->out;\n}\n\n/* ===========================================================================\n    Define external functions gzseek() and gzseek64() using local gz_seek().\n*/\nz_off_t ZEXPORT gzseek (file, offset, whence)\n    gzFile file;\n    z_off_t offset;\n    int whence;\n{\n    return (z_off_t)gz_seek(file, offset, whence, 0);\n}\n\n#ifdef _LARGEFILE64_SOURCE\noff64_t ZEXPORT gzseek64 (file, offset, whence)\n    gzFile file;\n    off64_t offset;\n    int whence;\n{\n    return gz_seek(file, offset, whence, 1);\n}\n#else\nz_off_t ZEXPORT gzseek64 (file, offset, whence)\n    gzFile file;\n    z_off_t offset;\n    int whence;\n{\n    return gz_seek(file, offset, whence, 0);\n}\n#endif\n\n/* ===========================================================================\n     Rewinds input file.\n*/\nint ZEXPORT gzrewind (file)\n    gzFile file;\n{\n    gz_stream *s = (gz_stream*)file;\n\n    if (s == NULL || s->mode != 'r') return -1;\n\n    s->z_err = Z_OK;\n    s->z_eof = 0;\n    s->back = EOF;\n    s->stream.avail_in = 0;\n    s->stream.next_in = s->inbuf;\n    s->crc = crc32(0L, Z_NULL, 0);\n    if (!s->transparent) (void)inflateReset(&s->stream);\n    s->in = 0;\n    s->out = 0;\n    return FSEEK(s->file, s->start, SEEK_SET);\n}\n\n/* ===========================================================================\n     Returns the starting position for the next gzread or gzwrite on the\n   given compressed file. This position represents a number of bytes in the\n   uncompressed data stream.\n*/\nz_off_t ZEXPORT gztell (file)\n    gzFile file;\n{\n    return gzseek(file, 0L, SEEK_CUR);\n}\n\n/* ===========================================================================\n     64-bit version\n*/\n#ifdef _LARGEFILE64_SOURCE\noff64_t ZEXPORT gztell64 (file)\n#else\nz_off_t ZEXPORT gztell64 (file)\n#endif\n    gzFile file;\n{\n    return gzseek64(file, 0L, SEEK_CUR);\n}\n\n/* ===========================================================================\n     Returns 1 when EOF has previously been detected reading the given\n   input stream, otherwise zero.\n*/\nint ZEXPORT gzeof (file)\n    gzFile file;\n{\n    gz_stream *s = (gz_stream*)file;\n\n    /* With concatenated compressed files that can have embedded\n     * crc trailers, z_eof is no longer the only/best indicator of EOF\n     * on a gz_stream. Handle end-of-stream error explicitly here.\n     */\n    if (s == NULL || s->mode != 'r') return 0;\n    if (s->z_eof) return 1;\n    return s->z_err == Z_STREAM_END;\n}\n\n/* ===========================================================================\n     Returns 1 if reading and doing so transparently, otherwise zero.\n*/\nint ZEXPORT gzdirect (file)\n    gzFile file;\n{\n    gz_stream *s = (gz_stream*)file;\n\n    if (s == NULL || s->mode != 'r') return 0;\n    return s->transparent;\n}\n\n/* ===========================================================================\n   Outputs a long in LSB order to the given file\n*/\nlocal void putLong (file, x)\n    FILE *file;\n    uLong x;\n{\n    int n;\n    for (n = 0; n < 4; n++) {\n        fputc((int)(x & 0xff), file);\n        x >>= 8;\n    }\n}\n\n/* ===========================================================================\n   Reads a long in LSB order from the given gz_stream. Sets z_err in case\n   of error.\n*/\nlocal uLong getLong (s)\n    gz_stream *s;\n{\n    uLong x = (uLong)get_byte(s);\n    int c;\n\n    x += ((uLong)get_byte(s))<<8;\n    x += ((uLong)get_byte(s))<<16;\n    c = get_byte(s);\n    if (c == EOF) s->z_err = Z_DATA_ERROR;\n    x += ((uLong)c)<<24;\n    return x;\n}\n\n/* ===========================================================================\n     Flushes all pending output if necessary, closes the compressed file\n   and deallocates all the (de)compression state.\n*/\nint ZEXPORT gzclose (file)\n    gzFile file;\n{\n    gz_stream *s = (gz_stream*)file;\n\n    if (s == NULL) return Z_STREAM_ERROR;\n\n    if (s->mode == 'w') {\n#ifdef NO_GZCOMPRESS\n        return Z_STREAM_ERROR;\n#else\n        if (do_flush (file, Z_FINISH) != Z_OK)\n            return destroy((gz_stream*)file);\n\n        putLong (s->file, s->crc);\n        putLong (s->file, (uLong)(s->in & 0xffffffff));\n#endif\n    }\n    return destroy((gz_stream*)file);\n}\n\n#if defined(STDC) && !defined(_WIN32_WCE)\n#  define zstrerror(errnum) strerror(errnum)\n#else\n#  define zstrerror(errnum) \"\"\n#endif\n\n/* ===========================================================================\n     Returns the error message for the last error which occurred on the\n   given compressed file. errnum is set to zlib error number. If an\n   error occurred in the file system and not in the compression library,\n   errnum is set to Z_ERRNO and the application may consult errno\n   to get the exact error code.\n*/\nconst char * ZEXPORT gzerror (file, errnum)\n    gzFile file;\n    int *errnum;\n{\n    char *m;\n    gz_stream *s = (gz_stream*)file;\n\n    if (s == NULL) {\n        *errnum = Z_STREAM_ERROR;\n        return (const char*)ERR_MSG(Z_STREAM_ERROR);\n    }\n    *errnum = s->z_err;\n    if (*errnum == Z_OK) return (const char*)\"\";\n\n    m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg);\n\n    if (m == NULL || *m == '\\0') m = (char*)ERR_MSG(s->z_err);\n\n    TRYFREE(s->msg);\n    s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3);\n    if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR);\n    strcpy(s->msg, s->path);\n    strcat(s->msg, \": \");\n    strcat(s->msg, m);\n    return (const char*)s->msg;\n}\n\n/* ===========================================================================\n     Clear the error and end-of-file flags, and do the same for the real file.\n*/\nvoid ZEXPORT gzclearerr (file)\n    gzFile file;\n{\n    gz_stream *s = (gz_stream*)file;\n\n    if (s == NULL) return;\n    if (s->z_err != Z_STREAM_END) s->z_err = Z_OK;\n    s->z_eof = 0;\n    clearerr(s->file);\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/infback.c",
    "content": "/* infback.c -- inflate using a call-back interface\n * Copyright (C) 1995-2006 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/*\n   This code is largely copied from inflate.c.  Normally either infback.o or\n   inflate.o would be linked into an application--not both.  The interface\n   with inffast.c is retained so that optimized assembler-coded versions of\n   inflate_fast() can be used with either inflate.c or infback.c.\n */\n\n#include \"zutil.h\"\n#include \"inftrees.h\"\n#include \"inflate.h\"\n#include \"inffast.h\"\n\n/* function prototypes */\nlocal void fixedtables OF((struct inflate_state FAR *state));\n\n/*\n   strm provides memory allocation functions in zalloc and zfree, or\n   Z_NULL to use the library memory allocation functions.\n\n   windowBits is in the range 8..15, and window is a user-supplied\n   window and output buffer that is 2**windowBits bytes.\n */\nint ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)\nz_streamp strm;\nint windowBits;\nunsigned char FAR *window;\nconst char *version;\nint stream_size;\n{\n    struct inflate_state FAR *state;\n\n    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||\n        stream_size != (int)(sizeof(z_stream)))\n        return Z_VERSION_ERROR;\n    if (strm == Z_NULL || window == Z_NULL ||\n        windowBits < 8 || windowBits > 15)\n        return Z_STREAM_ERROR;\n    strm->msg = Z_NULL;                 /* in case we return an error */\n    if (strm->zalloc == (alloc_func)0) {\n        strm->zalloc = zcalloc;\n        strm->opaque = (voidpf)0;\n    }\n    if (strm->zfree == (free_func)0) strm->zfree = zcfree;\n    state = (struct inflate_state FAR *)ZALLOC(strm, 1,\n                                               sizeof(struct inflate_state));\n    if (state == Z_NULL) return Z_MEM_ERROR;\n    Tracev((stderr, \"inflate: allocated\\n\"));\n    strm->state = (struct internal_state FAR *)state;\n    state->dmax = 32768U;\n    state->wbits = windowBits;\n    state->wsize = 1U << windowBits;\n    state->window = window;\n    state->write = 0;\n    state->whave = 0;\n    return Z_OK;\n}\n\n/*\n   Return state with length and distance decoding tables and index sizes set to\n   fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n   If BUILDFIXED is defined, then instead this routine builds the tables the\n   first time it's called, and returns those tables the first time and\n   thereafter.  This reduces the size of the code by about 2K bytes, in\n   exchange for a little execution time.  However, BUILDFIXED should not be\n   used for threaded applications, since the rewriting of the tables and virgin\n   may not be thread-safe.\n */\nlocal void fixedtables(state)\nstruct inflate_state FAR *state;\n{\n#ifdef BUILDFIXED\n    static int virgin = 1;\n    static code *lenfix, *distfix;\n    static code fixed[544];\n\n    /* build fixed huffman tables if first call (may not be thread safe) */\n    if (virgin) {\n        unsigned sym, bits;\n        static code *next;\n\n        /* literal/length table */\n        sym = 0;\n        while (sym < 144) state->lens[sym++] = 8;\n        while (sym < 256) state->lens[sym++] = 9;\n        while (sym < 280) state->lens[sym++] = 7;\n        while (sym < 288) state->lens[sym++] = 8;\n        next = fixed;\n        lenfix = next;\n        bits = 9;\n        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);\n\n        /* distance table */\n        sym = 0;\n        while (sym < 32) state->lens[sym++] = 5;\n        distfix = next;\n        bits = 5;\n        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);\n\n        /* do this just once */\n        virgin = 0;\n    }\n#else /* !BUILDFIXED */\n#   include \"inffixed.h\"\n#endif /* BUILDFIXED */\n    state->lencode = lenfix;\n    state->lenbits = 9;\n    state->distcode = distfix;\n    state->distbits = 5;\n}\n\n/* Macros for inflateBack(): */\n\n/* Load returned state from inflate_fast() */\n#define LOAD() \\\n    do { \\\n        put = strm->next_out; \\\n        left = strm->avail_out; \\\n        next = strm->next_in; \\\n        have = strm->avail_in; \\\n        hold = state->hold; \\\n        bits = state->bits; \\\n    } while (0)\n\n/* Set state from registers for inflate_fast() */\n#define RESTORE() \\\n    do { \\\n        strm->next_out = put; \\\n        strm->avail_out = left; \\\n        strm->next_in = next; \\\n        strm->avail_in = have; \\\n        state->hold = hold; \\\n        state->bits = bits; \\\n    } while (0)\n\n/* Clear the input bit accumulator */\n#define INITBITS() \\\n    do { \\\n        hold = 0; \\\n        bits = 0; \\\n    } while (0)\n\n/* Assure that some input is available.  If input is requested, but denied,\n   then return a Z_BUF_ERROR from inflateBack(). */\n#define PULL() \\\n    do { \\\n        if (have == 0) { \\\n            have = in(in_desc, &next); \\\n            if (have == 0) { \\\n                next = Z_NULL; \\\n                ret = Z_BUF_ERROR; \\\n                goto inf_leave; \\\n            } \\\n        } \\\n    } while (0)\n\n/* Get a byte of input into the bit accumulator, or return from inflateBack()\n   with an error if there is no input available. */\n#define PULLBYTE() \\\n    do { \\\n        PULL(); \\\n        have--; \\\n        hold += (unsigned long)(*next++) << bits; \\\n        bits += 8; \\\n    } while (0)\n\n/* Assure that there are at least n bits in the bit accumulator.  If there is\n   not enough available input to do that, then return from inflateBack() with\n   an error. */\n#define NEEDBITS(n) \\\n    do { \\\n        while (bits < (unsigned)(n)) \\\n            PULLBYTE(); \\\n    } while (0)\n\n/* Return the low n bits of the bit accumulator (n < 16) */\n#define BITS(n) \\\n    ((unsigned)hold & ((1U << (n)) - 1))\n\n/* Remove n bits from the bit accumulator */\n#define DROPBITS(n) \\\n    do { \\\n        hold >>= (n); \\\n        bits -= (unsigned)(n); \\\n    } while (0)\n\n/* Remove zero to seven bits as needed to go to a byte boundary */\n#define BYTEBITS() \\\n    do { \\\n        hold >>= bits & 7; \\\n        bits -= bits & 7; \\\n    } while (0)\n\n/* Assure that some output space is available, by writing out the window\n   if it's full.  If the write fails, return from inflateBack() with a\n   Z_BUF_ERROR. */\n#define ROOM() \\\n    do { \\\n        if (left == 0) { \\\n            put = state->window; \\\n            left = state->wsize; \\\n            state->whave = left; \\\n            if (out(out_desc, put, left)) { \\\n                ret = Z_BUF_ERROR; \\\n                goto inf_leave; \\\n            } \\\n        } \\\n    } while (0)\n\n/*\n   strm provides the memory allocation functions and window buffer on input,\n   and provides information on the unused input on return.  For Z_DATA_ERROR\n   returns, strm will also provide an error message.\n\n   in() and out() are the call-back input and output functions.  When\n   inflateBack() needs more input, it calls in().  When inflateBack() has\n   filled the window with output, or when it completes with data in the\n   window, it calls out() to write out the data.  The application must not\n   change the provided input until in() is called again or inflateBack()\n   returns.  The application must not change the window/output buffer until\n   inflateBack() returns.\n\n   in() and out() are called with a descriptor parameter provided in the\n   inflateBack() call.  This parameter can be a structure that provides the\n   information required to do the read or write, as well as accumulated\n   information on the input and output such as totals and check values.\n\n   in() should return zero on failure.  out() should return non-zero on\n   failure.  If either in() or out() fails, than inflateBack() returns a\n   Z_BUF_ERROR.  strm->next_in can be checked for Z_NULL to see whether it\n   was in() or out() that caused in the error.  Otherwise,  inflateBack()\n   returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format\n   error, or Z_MEM_ERROR if it could not allocate memory for the state.\n   inflateBack() can also return Z_STREAM_ERROR if the input parameters\n   are not correct, i.e. strm is Z_NULL or the state was not initialized.\n */\nint ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)\nz_streamp strm;\nin_func in;\nvoid FAR *in_desc;\nout_func out;\nvoid FAR *out_desc;\n{\n    struct inflate_state FAR *state;\n    unsigned char FAR *next;    /* next input */\n    unsigned char FAR *put;     /* next output */\n    unsigned have, left;        /* available input and output */\n    unsigned long hold;         /* bit buffer */\n    unsigned bits;              /* bits in bit buffer */\n    unsigned copy;              /* number of stored or match bytes to copy */\n    unsigned char FAR *from;    /* where to copy match bytes from */\n    code here;                  /* current decoding table entry */\n    code last;                  /* parent table entry */\n    unsigned len;               /* length to copy for repeats, bits to drop */\n    int ret;                    /* return code */\n    static const unsigned short order[19] = /* permutation of code lengths */\n        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};\n\n    /* Check that the strm exists and that the state was initialized */\n    if (strm == Z_NULL || strm->state == Z_NULL)\n        return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n\n    /* Reset the state */\n    strm->msg = Z_NULL;\n    state->mode = TYPE;\n    state->last = 0;\n    state->whave = 0;\n    next = strm->next_in;\n    have = next != Z_NULL ? strm->avail_in : 0;\n    hold = 0;\n    bits = 0;\n    put = state->window;\n    left = state->wsize;\n\n    /* Inflate until end of block marked as last */\n    for (;;)\n        switch (state->mode) {\n        case TYPE:\n            /* determine and dispatch block type */\n            if (state->last) {\n                BYTEBITS();\n                state->mode = DONE;\n                break;\n            }\n            NEEDBITS(3);\n            state->last = BITS(1);\n            DROPBITS(1);\n            switch (BITS(2)) {\n            case 0:                             /* stored block */\n                Tracev((stderr, \"inflate:     stored block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = STORED;\n                break;\n            case 1:                             /* fixed block */\n                fixedtables(state);\n                Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = LEN;              /* decode codes */\n                break;\n            case 2:                             /* dynamic block */\n                Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = TABLE;\n                break;\n            case 3:\n                strm->msg = (char *)\"invalid block type\";\n                state->mode = BAD;\n            }\n            DROPBITS(2);\n            break;\n\n        case STORED:\n            /* get and verify stored block length */\n            BYTEBITS();                         /* go to byte boundary */\n            NEEDBITS(32);\n            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {\n                strm->msg = (char *)\"invalid stored block lengths\";\n                state->mode = BAD;\n                break;\n            }\n            state->length = (unsigned)hold & 0xffff;\n            Tracev((stderr, \"inflate:       stored length %u\\n\",\n                    state->length));\n            INITBITS();\n\n            /* copy stored block from input to output */\n            while (state->length != 0) {\n                copy = state->length;\n                PULL();\n                ROOM();\n                if (copy > have) copy = have;\n                if (copy > left) copy = left;\n                zmemcpy(put, next, copy);\n                have -= copy;\n                next += copy;\n                left -= copy;\n                put += copy;\n                state->length -= copy;\n            }\n            Tracev((stderr, \"inflate:       stored end\\n\"));\n            state->mode = TYPE;\n            break;\n\n        case TABLE:\n            /* get dynamic table entries descriptor */\n            NEEDBITS(14);\n            state->nlen = BITS(5) + 257;\n            DROPBITS(5);\n            state->ndist = BITS(5) + 1;\n            DROPBITS(5);\n            state->ncode = BITS(4) + 4;\n            DROPBITS(4);\n#ifndef PKZIP_BUG_WORKAROUND\n            if (state->nlen > 286 || state->ndist > 30) {\n                strm->msg = (char *)\"too many length or distance symbols\";\n                state->mode = BAD;\n                break;\n            }\n#endif\n            Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n\n            /* get code length code lengths (not a typo) */\n            state->have = 0;\n            while (state->have < state->ncode) {\n                NEEDBITS(3);\n                state->lens[order[state->have++]] = (unsigned short)BITS(3);\n                DROPBITS(3);\n            }\n            while (state->have < 19)\n                state->lens[order[state->have++]] = 0;\n            state->next = state->codes;\n            state->lencode = (code const FAR *)(state->next);\n            state->lenbits = 7;\n            ret = inflate_table(CODES, state->lens, 19, &(state->next),\n                                &(state->lenbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid code lengths set\";\n                state->mode = BAD;\n                break;\n            }\n            Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n\n            /* get length and distance code code lengths */\n            state->have = 0;\n            while (state->have < state->nlen + state->ndist) {\n                for (;;) {\n                    here = state->lencode[BITS(state->lenbits)];\n                    if ((unsigned)(here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                if (here.val < 16) {\n                    NEEDBITS(here.bits);\n                    DROPBITS(here.bits);\n                    state->lens[state->have++] = here.val;\n                }\n                else {\n                    if (here.val == 16) {\n                        NEEDBITS(here.bits + 2);\n                        DROPBITS(here.bits);\n                        if (state->have == 0) {\n                            strm->msg = (char *)\"invalid bit length repeat\";\n                            state->mode = BAD;\n                            break;\n                        }\n                        len = (unsigned)(state->lens[state->have - 1]);\n                        copy = 3 + BITS(2);\n                        DROPBITS(2);\n                    }\n                    else if (here.val == 17) {\n                        NEEDBITS(here.bits + 3);\n                        DROPBITS(here.bits);\n                        len = 0;\n                        copy = 3 + BITS(3);\n                        DROPBITS(3);\n                    }\n                    else {\n                        NEEDBITS(here.bits + 7);\n                        DROPBITS(here.bits);\n                        len = 0;\n                        copy = 11 + BITS(7);\n                        DROPBITS(7);\n                    }\n                    if (state->have + copy > state->nlen + state->ndist) {\n                        strm->msg = (char *)\"invalid bit length repeat\";\n                        state->mode = BAD;\n                        break;\n                    }\n                    while (copy--)\n                        state->lens[state->have++] = (unsigned short)len;\n                }\n            }\n\n            /* handle error breaks in while */\n            if (state->mode == BAD) break;\n\n            /* build code tables */\n            state->next = state->codes;\n            state->lencode = (code const FAR *)(state->next);\n            state->lenbits = 9;\n            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),\n                                &(state->lenbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid literal/lengths set\";\n                state->mode = BAD;\n                break;\n            }\n            state->distcode = (code const FAR *)(state->next);\n            state->distbits = 6;\n            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,\n                            &(state->next), &(state->distbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid distances set\";\n                state->mode = BAD;\n                break;\n            }\n            Tracev((stderr, \"inflate:       codes ok\\n\"));\n            state->mode = LEN;\n\n        case LEN:\n            /* use inflate_fast() if we have enough input and output */\n            if (have >= 6 && left >= 258) {\n                RESTORE();\n                if (state->whave < state->wsize)\n                    state->whave = state->wsize - left;\n                inflate_fast(strm, state->wsize);\n                LOAD();\n                break;\n            }\n\n            /* get a literal, length, or end-of-block code */\n            for (;;) {\n                here = state->lencode[BITS(state->lenbits)];\n                if ((unsigned)(here.bits) <= bits) break;\n                PULLBYTE();\n            }\n            if (here.op && (here.op & 0xf0) == 0) {\n                last = here;\n                for (;;) {\n                    here = state->lencode[last.val +\n                            (BITS(last.bits + last.op) >> last.bits)];\n                    if ((unsigned)(last.bits + here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                DROPBITS(last.bits);\n            }\n            DROPBITS(here.bits);\n            state->length = (unsigned)here.val;\n\n            /* process literal */\n            if (here.op == 0) {\n                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n                        \"inflate:         literal '%c'\\n\" :\n                        \"inflate:         literal 0x%02x\\n\", here.val));\n                ROOM();\n                *put++ = (unsigned char)(state->length);\n                left--;\n                state->mode = LEN;\n                break;\n            }\n\n            /* process end of block */\n            if (here.op & 32) {\n                Tracevv((stderr, \"inflate:         end of block\\n\"));\n                state->mode = TYPE;\n                break;\n            }\n\n            /* invalid code */\n            if (here.op & 64) {\n                strm->msg = (char *)\"invalid literal/length code\";\n                state->mode = BAD;\n                break;\n            }\n\n            /* length code -- get extra bits, if any */\n            state->extra = (unsigned)(here.op) & 15;\n            if (state->extra != 0) {\n                NEEDBITS(state->extra);\n                state->length += BITS(state->extra);\n                DROPBITS(state->extra);\n            }\n            Tracevv((stderr, \"inflate:         length %u\\n\", state->length));\n\n            /* get distance code */\n            for (;;) {\n                here = state->distcode[BITS(state->distbits)];\n                if ((unsigned)(here.bits) <= bits) break;\n                PULLBYTE();\n            }\n            if ((here.op & 0xf0) == 0) {\n                last = here;\n                for (;;) {\n                    here = state->distcode[last.val +\n                            (BITS(last.bits + last.op) >> last.bits)];\n                    if ((unsigned)(last.bits + here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                DROPBITS(last.bits);\n            }\n            DROPBITS(here.bits);\n            if (here.op & 64) {\n                strm->msg = (char *)\"invalid distance code\";\n                state->mode = BAD;\n                break;\n            }\n            state->offset = (unsigned)here.val;\n\n            /* get distance extra bits, if any */\n            state->extra = (unsigned)(here.op) & 15;\n            if (state->extra != 0) {\n                NEEDBITS(state->extra);\n                state->offset += BITS(state->extra);\n                DROPBITS(state->extra);\n            }\n            if (state->offset > state->wsize - (state->whave < state->wsize ?\n                                                left : 0)) {\n                strm->msg = (char *)\"invalid distance too far back\";\n                state->mode = BAD;\n                break;\n            }\n            Tracevv((stderr, \"inflate:         distance %u\\n\", state->offset));\n\n            /* copy match from window to output */\n            do {\n                ROOM();\n                copy = state->wsize - state->offset;\n                if (copy < left) {\n                    from = put + copy;\n                    copy = left - copy;\n                }\n                else {\n                    from = put - state->offset;\n                    copy = left;\n                }\n                if (copy > state->length) copy = state->length;\n                state->length -= copy;\n                left -= copy;\n                do {\n                    *put++ = *from++;\n                } while (--copy);\n            } while (state->length != 0);\n            break;\n\n        case DONE:\n            /* inflate stream terminated properly -- write leftover output */\n            ret = Z_STREAM_END;\n            if (left < state->wsize) {\n                if (out(out_desc, state->window, state->wsize - left))\n                    ret = Z_BUF_ERROR;\n            }\n            goto inf_leave;\n\n        case BAD:\n            ret = Z_DATA_ERROR;\n            goto inf_leave;\n\n        default:                /* can't happen, but makes compilers happy */\n            ret = Z_STREAM_ERROR;\n            goto inf_leave;\n        }\n\n    /* Return unused input */\n  inf_leave:\n    strm->next_in = next;\n    strm->avail_in = have;\n    return ret;\n}\n\nint ZEXPORT inflateBackEnd(strm)\nz_streamp strm;\n{\n    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)\n        return Z_STREAM_ERROR;\n    ZFREE(strm, strm->state);\n    strm->state = Z_NULL;\n    Tracev((stderr, \"inflate: end\\n\"));\n    return Z_OK;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/inffast.c",
    "content": "/* inffast.c -- fast decoding\n * Copyright (C) 1995-2006 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"zutil.h\"\n#include \"inftrees.h\"\n#include \"inflate.h\"\n#include \"inffast.h\"\n\n#ifndef ASMINF\n\n/* Allow machine dependent optimization for post-increment or pre-increment.\n   Based on testing to date,\n   Pre-increment preferred for:\n   - PowerPC G3 (Adler)\n   - MIPS R5000 (Randers-Pehrson)\n   Post-increment preferred for:\n   - none\n   No measurable difference:\n   - Pentium III (Anderson)\n   - M68060 (Nikl)\n */\n#ifdef POSTINC\n#  define OFF 0\n#  define PUP(a) *(a)++\n#else\n#  define OFF 1\n#  define PUP(a) *++(a)\n#endif\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state->mode == LEN\n        strm->avail_in >= 6\n        strm->avail_out >= 258\n        start >= strm->avail_out\n        state->bits < 8\n\n   On return, state->mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm->avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm->avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nvoid inflate_fast(strm, start)\nz_streamp strm;\nunsigned start;         /* inflate()'s starting value for strm->avail_out */\n{\n    struct inflate_state FAR *state;\n    unsigned char FAR *in;      /* local strm->next_in */\n    unsigned char FAR *last;    /* while in < last, enough input available */\n    unsigned char FAR *out;     /* local strm->next_out */\n    unsigned char FAR *beg;     /* inflate()'s initial strm->next_out */\n    unsigned char FAR *end;     /* while out < end, enough space available */\n#ifdef INFLATE_STRICT\n    unsigned dmax;              /* maximum distance from zlib header */\n#endif\n    unsigned wsize;             /* window size or zero if not using window */\n    unsigned whave;             /* valid bytes in the window */\n    unsigned write;             /* window write index */\n    unsigned char FAR *window;  /* allocated sliding window, if wsize != 0 */\n    unsigned long hold;         /* local strm->hold */\n    unsigned bits;              /* local strm->bits */\n    code const FAR *lcode;      /* local strm->lencode */\n    code const FAR *dcode;      /* local strm->distcode */\n    unsigned lmask;             /* mask for first level of length codes */\n    unsigned dmask;             /* mask for first level of distance codes */\n    code here;                  /* retrieved table entry */\n    unsigned op;                /* code bits, operation, extra bits, or */\n                                /*  window position, window bytes to copy */\n    unsigned len;               /* match length, unused bytes */\n    unsigned dist;              /* match distance */\n    unsigned char FAR *from;    /* where to copy match from */\n\n    /* copy state to local variables */\n    state = (struct inflate_state FAR *)strm->state;\n    in = strm->next_in - OFF;\n    last = in + (strm->avail_in - 5);\n    out = strm->next_out - OFF;\n    beg = out - (start - strm->avail_out);\n    end = out + (strm->avail_out - 257);\n#ifdef INFLATE_STRICT\n    dmax = state->dmax;\n#endif\n    wsize = state->wsize;\n    whave = state->whave;\n    write = state->write;\n    window = state->window;\n    hold = state->hold;\n    bits = state->bits;\n    lcode = state->lencode;\n    dcode = state->distcode;\n    lmask = (1U << state->lenbits) - 1;\n    dmask = (1U << state->distbits) - 1;\n\n    /* decode literals and length/distances until end-of-block or not enough\n       input data or output space */\n    do {\n        if (bits < 15) {\n            hold += (unsigned long)(PUP(in)) << bits;\n            bits += 8;\n            hold += (unsigned long)(PUP(in)) << bits;\n            bits += 8;\n        }\n        here = lcode[hold & lmask];\n      dolen:\n        op = (unsigned)(here.bits);\n        hold >>= op;\n        bits -= op;\n        op = (unsigned)(here.op);\n        if (op == 0) {                          /* literal */\n            Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n                    \"inflate:         literal '%c'\\n\" :\n                    \"inflate:         literal 0x%02x\\n\", here.val));\n            PUP(out) = (unsigned char)(here.val);\n        }\n        else if (op & 16) {                     /* length base */\n            len = (unsigned)(here.val);\n            op &= 15;                           /* number of extra bits */\n            if (op) {\n                if (bits < op) {\n                    hold += (unsigned long)(PUP(in)) << bits;\n                    bits += 8;\n                }\n                len += (unsigned)hold & ((1U << op) - 1);\n                hold >>= op;\n                bits -= op;\n            }\n            Tracevv((stderr, \"inflate:         length %u\\n\", len));\n            if (bits < 15) {\n                hold += (unsigned long)(PUP(in)) << bits;\n                bits += 8;\n                hold += (unsigned long)(PUP(in)) << bits;\n                bits += 8;\n            }\n            here = dcode[hold & dmask];\n          dodist:\n            op = (unsigned)(here.bits);\n            hold >>= op;\n            bits -= op;\n            op = (unsigned)(here.op);\n            if (op & 16) {                      /* distance base */\n                dist = (unsigned)(here.val);\n                op &= 15;                       /* number of extra bits */\n                if (bits < op) {\n                    hold += (unsigned long)(PUP(in)) << bits;\n                    bits += 8;\n                    if (bits < op) {\n                        hold += (unsigned long)(PUP(in)) << bits;\n                        bits += 8;\n                    }\n                }\n                dist += (unsigned)hold & ((1U << op) - 1);\n#ifdef INFLATE_STRICT\n                if (dist > dmax) {\n                    strm->msg = (char *)\"invalid distance too far back\";\n                    state->mode = BAD;\n                    break;\n                }\n#endif\n                hold >>= op;\n                bits -= op;\n                Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n                op = (unsigned)(out - beg);     /* max distance in output */\n                if (dist > op) {                /* see if copy from window */\n                    op = dist - op;             /* distance back in window */\n                    if (op > whave) {\n                        if (state->sane) {\n                            strm->msg = (char *)\"invalid distance too far back\";\n                            state->mode = BAD;\n                            break;\n                        }\n#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n                        if (len <= op - whave) {\n                            do {\n                                PUP(out) = 0;\n                            } while (--len);\n                            continue;\n                        }\n                        len -= op - whave;\n                        do {\n                            PUP(out) = 0;\n                        } while (--op > whave);\n                        if (op == 0) {\n                            from = out - dist;\n                            do {\n                                PUP(out) = PUP(from);\n                            } while (--len);\n                            continue;\n                        }\n#endif\n                    }\n                    from = window - OFF;\n                    if (write == 0) {           /* very common case */\n                        from += wsize - op;\n                        if (op < len) {         /* some from window */\n                            len -= op;\n                            do {\n                                PUP(out) = PUP(from);\n                            } while (--op);\n                            from = out - dist;  /* rest from output */\n                        }\n                    }\n                    else if (write < op) {      /* wrap around window */\n                        from += wsize + write - op;\n                        op -= write;\n                        if (op < len) {         /* some from end of window */\n                            len -= op;\n                            do {\n                                PUP(out) = PUP(from);\n                            } while (--op);\n                            from = window - OFF;\n                            if (write < len) {  /* some from start of window */\n                                op = write;\n                                len -= op;\n                                do {\n                                    PUP(out) = PUP(from);\n                                } while (--op);\n                                from = out - dist;      /* rest from output */\n                            }\n                        }\n                    }\n                    else {                      /* contiguous in window */\n                        from += write - op;\n                        if (op < len) {         /* some from window */\n                            len -= op;\n                            do {\n                                PUP(out) = PUP(from);\n                            } while (--op);\n                            from = out - dist;  /* rest from output */\n                        }\n                    }\n                    while (len > 2) {\n                        PUP(out) = PUP(from);\n                        PUP(out) = PUP(from);\n                        PUP(out) = PUP(from);\n                        len -= 3;\n                    }\n                    if (len) {\n                        PUP(out) = PUP(from);\n                        if (len > 1)\n                            PUP(out) = PUP(from);\n                    }\n                }\n                else {\n                    from = out - dist;          /* copy direct from output */\n                    do {                        /* minimum length is three */\n                        PUP(out) = PUP(from);\n                        PUP(out) = PUP(from);\n                        PUP(out) = PUP(from);\n                        len -= 3;\n                    } while (len > 2);\n                    if (len) {\n                        PUP(out) = PUP(from);\n                        if (len > 1)\n                            PUP(out) = PUP(from);\n                    }\n                }\n            }\n            else if ((op & 64) == 0) {          /* 2nd level distance code */\n                here = dcode[here.val + (hold & ((1U << op) - 1))];\n                goto dodist;\n            }\n            else {\n                strm->msg = (char *)\"invalid distance code\";\n                state->mode = BAD;\n                break;\n            }\n        }\n        else if ((op & 64) == 0) {              /* 2nd level length code */\n            here = lcode[here.val + (hold & ((1U << op) - 1))];\n            goto dolen;\n        }\n        else if (op & 32) {                     /* end-of-block */\n            Tracevv((stderr, \"inflate:         end of block\\n\"));\n            state->mode = TYPE;\n            break;\n        }\n        else {\n            strm->msg = (char *)\"invalid literal/length code\";\n            state->mode = BAD;\n            break;\n        }\n    } while (in < last && out < end);\n\n    /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n    len = bits >> 3;\n    in -= len;\n    bits -= len << 3;\n    hold &= (1U << bits) - 1;\n\n    /* update state and return */\n    strm->next_in = in + OFF;\n    strm->next_out = out + OFF;\n    strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));\n    strm->avail_out = (unsigned)(out < end ?\n                                 257 + (end - out) : 257 - (out - end));\n    state->hold = hold;\n    state->bits = bits;\n    return;\n}\n\n/*\n   inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):\n   - Using bit fields for code structure\n   - Different op definition to avoid & for extra bits (do & for table bits)\n   - Three separate decoding do-loops for direct, window, and write == 0\n   - Special case for distance > 1 copies to do overlapped load and store copy\n   - Explicit branch predictions (based on measured branch probabilities)\n   - Deferring match copy and interspersed it with decoding subsequent codes\n   - Swapping literal/length else\n   - Swapping window/direct else\n   - Larger unrolled copy loops (three is about right)\n   - Moving len -= 3 statement into middle of loop\n */\n\n#endif /* !ASMINF */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/inffast.h",
    "content": "/* inffast.h -- header to use inffast.c\n * Copyright (C) 1995-2003 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\nvoid inflate_fast OF((z_streamp strm, unsigned start));\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/inffixed.h",
    "content": "/* inffixed.h -- table for decoding fixed codes\n     * Generated automatically by makefixed().\n     */\n\n/* WARNING: this file should *not* be used by applications. It\n   is part of the implementation of the compression library and\n   is subject to change. Applications should only use zlib.h.\n */\n\nstatic const code lenfix[512] =\n{\n    {96, 7, 0}, {0, 8, 80}, {0, 8, 16}, {20, 8, 115}, {18, 7, 31}, {0, 8, 112}, {0, 8, 48},\n    {0, 9, 192}, {16, 7, 10}, {0, 8, 96}, {0, 8, 32}, {0, 9, 160}, {0, 8, 0}, {0, 8, 128},\n    {0, 8, 64}, {0, 9, 224}, {16, 7, 6}, {0, 8, 88}, {0, 8, 24}, {0, 9, 144}, {19, 7, 59},\n    {0, 8, 120}, {0, 8, 56}, {0, 9, 208}, {17, 7, 17}, {0, 8, 104}, {0, 8, 40}, {0, 9, 176},\n    {0, 8, 8}, {0, 8, 136}, {0, 8, 72}, {0, 9, 240}, {16, 7, 4}, {0, 8, 84}, {0, 8, 20},\n    {21, 8, 227}, {19, 7, 43}, {0, 8, 116}, {0, 8, 52}, {0, 9, 200}, {17, 7, 13}, {0, 8, 100},\n    {0, 8, 36}, {0, 9, 168}, {0, 8, 4}, {0, 8, 132}, {0, 8, 68}, {0, 9, 232}, {16, 7, 8},\n    {0, 8, 92}, {0, 8, 28}, {0, 9, 152}, {20, 7, 83}, {0, 8, 124}, {0, 8, 60}, {0, 9, 216},\n    {18, 7, 23}, {0, 8, 108}, {0, 8, 44}, {0, 9, 184}, {0, 8, 12}, {0, 8, 140}, {0, 8, 76},\n    {0, 9, 248}, {16, 7, 3}, {0, 8, 82}, {0, 8, 18}, {21, 8, 163}, {19, 7, 35}, {0, 8, 114},\n    {0, 8, 50}, {0, 9, 196}, {17, 7, 11}, {0, 8, 98}, {0, 8, 34}, {0, 9, 164}, {0, 8, 2},\n    {0, 8, 130}, {0, 8, 66}, {0, 9, 228}, {16, 7, 7}, {0, 8, 90}, {0, 8, 26}, {0, 9, 148},\n    {20, 7, 67}, {0, 8, 122}, {0, 8, 58}, {0, 9, 212}, {18, 7, 19}, {0, 8, 106}, {0, 8, 42},\n    {0, 9, 180}, {0, 8, 10}, {0, 8, 138}, {0, 8, 74}, {0, 9, 244}, {16, 7, 5}, {0, 8, 86},\n    {0, 8, 22}, {64, 8, 0}, {19, 7, 51}, {0, 8, 118}, {0, 8, 54}, {0, 9, 204}, {17, 7, 15},\n    {0, 8, 102}, {0, 8, 38}, {0, 9, 172}, {0, 8, 6}, {0, 8, 134}, {0, 8, 70}, {0, 9, 236},\n    {16, 7, 9}, {0, 8, 94}, {0, 8, 30}, {0, 9, 156}, {20, 7, 99}, {0, 8, 126}, {0, 8, 62},\n    {0, 9, 220}, {18, 7, 27}, {0, 8, 110}, {0, 8, 46}, {0, 9, 188}, {0, 8, 14}, {0, 8, 142},\n    {0, 8, 78}, {0, 9, 252}, {96, 7, 0}, {0, 8, 81}, {0, 8, 17}, {21, 8, 131}, {18, 7, 31},\n    {0, 8, 113}, {0, 8, 49}, {0, 9, 194}, {16, 7, 10}, {0, 8, 97}, {0, 8, 33}, {0, 9, 162},\n    {0, 8, 1}, {0, 8, 129}, {0, 8, 65}, {0, 9, 226}, {16, 7, 6}, {0, 8, 89}, {0, 8, 25},\n    {0, 9, 146}, {19, 7, 59}, {0, 8, 121}, {0, 8, 57}, {0, 9, 210}, {17, 7, 17}, {0, 8, 105},\n    {0, 8, 41}, {0, 9, 178}, {0, 8, 9}, {0, 8, 137}, {0, 8, 73}, {0, 9, 242}, {16, 7, 4},\n    {0, 8, 85}, {0, 8, 21}, {16, 8, 258}, {19, 7, 43}, {0, 8, 117}, {0, 8, 53}, {0, 9, 202},\n    {17, 7, 13}, {0, 8, 101}, {0, 8, 37}, {0, 9, 170}, {0, 8, 5}, {0, 8, 133}, {0, 8, 69},\n    {0, 9, 234}, {16, 7, 8}, {0, 8, 93}, {0, 8, 29}, {0, 9, 154}, {20, 7, 83}, {0, 8, 125},\n    {0, 8, 61}, {0, 9, 218}, {18, 7, 23}, {0, 8, 109}, {0, 8, 45}, {0, 9, 186}, {0, 8, 13},\n    {0, 8, 141}, {0, 8, 77}, {0, 9, 250}, {16, 7, 3}, {0, 8, 83}, {0, 8, 19}, {21, 8, 195},\n    {19, 7, 35}, {0, 8, 115}, {0, 8, 51}, {0, 9, 198}, {17, 7, 11}, {0, 8, 99}, {0, 8, 35},\n    {0, 9, 166}, {0, 8, 3}, {0, 8, 131}, {0, 8, 67}, {0, 9, 230}, {16, 7, 7}, {0, 8, 91},\n    {0, 8, 27}, {0, 9, 150}, {20, 7, 67}, {0, 8, 123}, {0, 8, 59}, {0, 9, 214}, {18, 7, 19},\n    {0, 8, 107}, {0, 8, 43}, {0, 9, 182}, {0, 8, 11}, {0, 8, 139}, {0, 8, 75}, {0, 9, 246},\n    {16, 7, 5}, {0, 8, 87}, {0, 8, 23}, {64, 8, 0}, {19, 7, 51}, {0, 8, 119}, {0, 8, 55},\n    {0, 9, 206}, {17, 7, 15}, {0, 8, 103}, {0, 8, 39}, {0, 9, 174}, {0, 8, 7}, {0, 8, 135},\n    {0, 8, 71}, {0, 9, 238}, {16, 7, 9}, {0, 8, 95}, {0, 8, 31}, {0, 9, 158}, {20, 7, 99},\n    {0, 8, 127}, {0, 8, 63}, {0, 9, 222}, {18, 7, 27}, {0, 8, 111}, {0, 8, 47}, {0, 9, 190},\n    {0, 8, 15}, {0, 8, 143}, {0, 8, 79}, {0, 9, 254}, {96, 7, 0}, {0, 8, 80}, {0, 8, 16},\n    {20, 8, 115}, {18, 7, 31}, {0, 8, 112}, {0, 8, 48}, {0, 9, 193}, {16, 7, 10}, {0, 8, 96},\n    {0, 8, 32}, {0, 9, 161}, {0, 8, 0}, {0, 8, 128}, {0, 8, 64}, {0, 9, 225}, {16, 7, 6},\n    {0, 8, 88}, {0, 8, 24}, {0, 9, 145}, {19, 7, 59}, {0, 8, 120}, {0, 8, 56}, {0, 9, 209},\n    {17, 7, 17}, {0, 8, 104}, {0, 8, 40}, {0, 9, 177}, {0, 8, 8}, {0, 8, 136}, {0, 8, 72},\n    {0, 9, 241}, {16, 7, 4}, {0, 8, 84}, {0, 8, 20}, {21, 8, 227}, {19, 7, 43}, {0, 8, 116},\n    {0, 8, 52}, {0, 9, 201}, {17, 7, 13}, {0, 8, 100}, {0, 8, 36}, {0, 9, 169}, {0, 8, 4},\n    {0, 8, 132}, {0, 8, 68}, {0, 9, 233}, {16, 7, 8}, {0, 8, 92}, {0, 8, 28}, {0, 9, 153},\n    {20, 7, 83}, {0, 8, 124}, {0, 8, 60}, {0, 9, 217}, {18, 7, 23}, {0, 8, 108}, {0, 8, 44},\n    {0, 9, 185}, {0, 8, 12}, {0, 8, 140}, {0, 8, 76}, {0, 9, 249}, {16, 7, 3}, {0, 8, 82},\n    {0, 8, 18}, {21, 8, 163}, {19, 7, 35}, {0, 8, 114}, {0, 8, 50}, {0, 9, 197}, {17, 7, 11},\n    {0, 8, 98}, {0, 8, 34}, {0, 9, 165}, {0, 8, 2}, {0, 8, 130}, {0, 8, 66}, {0, 9, 229},\n    {16, 7, 7}, {0, 8, 90}, {0, 8, 26}, {0, 9, 149}, {20, 7, 67}, {0, 8, 122}, {0, 8, 58},\n    {0, 9, 213}, {18, 7, 19}, {0, 8, 106}, {0, 8, 42}, {0, 9, 181}, {0, 8, 10}, {0, 8, 138},\n    {0, 8, 74}, {0, 9, 245}, {16, 7, 5}, {0, 8, 86}, {0, 8, 22}, {64, 8, 0}, {19, 7, 51},\n    {0, 8, 118}, {0, 8, 54}, {0, 9, 205}, {17, 7, 15}, {0, 8, 102}, {0, 8, 38}, {0, 9, 173},\n    {0, 8, 6}, {0, 8, 134}, {0, 8, 70}, {0, 9, 237}, {16, 7, 9}, {0, 8, 94}, {0, 8, 30},\n    {0, 9, 157}, {20, 7, 99}, {0, 8, 126}, {0, 8, 62}, {0, 9, 221}, {18, 7, 27}, {0, 8, 110},\n    {0, 8, 46}, {0, 9, 189}, {0, 8, 14}, {0, 8, 142}, {0, 8, 78}, {0, 9, 253}, {96, 7, 0},\n    {0, 8, 81}, {0, 8, 17}, {21, 8, 131}, {18, 7, 31}, {0, 8, 113}, {0, 8, 49}, {0, 9, 195},\n    {16, 7, 10}, {0, 8, 97}, {0, 8, 33}, {0, 9, 163}, {0, 8, 1}, {0, 8, 129}, {0, 8, 65},\n    {0, 9, 227}, {16, 7, 6}, {0, 8, 89}, {0, 8, 25}, {0, 9, 147}, {19, 7, 59}, {0, 8, 121},\n    {0, 8, 57}, {0, 9, 211}, {17, 7, 17}, {0, 8, 105}, {0, 8, 41}, {0, 9, 179}, {0, 8, 9},\n    {0, 8, 137}, {0, 8, 73}, {0, 9, 243}, {16, 7, 4}, {0, 8, 85}, {0, 8, 21}, {16, 8, 258},\n    {19, 7, 43}, {0, 8, 117}, {0, 8, 53}, {0, 9, 203}, {17, 7, 13}, {0, 8, 101}, {0, 8, 37},\n    {0, 9, 171}, {0, 8, 5}, {0, 8, 133}, {0, 8, 69}, {0, 9, 235}, {16, 7, 8}, {0, 8, 93},\n    {0, 8, 29}, {0, 9, 155}, {20, 7, 83}, {0, 8, 125}, {0, 8, 61}, {0, 9, 219}, {18, 7, 23},\n    {0, 8, 109}, {0, 8, 45}, {0, 9, 187}, {0, 8, 13}, {0, 8, 141}, {0, 8, 77}, {0, 9, 251},\n    {16, 7, 3}, {0, 8, 83}, {0, 8, 19}, {21, 8, 195}, {19, 7, 35}, {0, 8, 115}, {0, 8, 51},\n    {0, 9, 199}, {17, 7, 11}, {0, 8, 99}, {0, 8, 35}, {0, 9, 167}, {0, 8, 3}, {0, 8, 131},\n    {0, 8, 67}, {0, 9, 231}, {16, 7, 7}, {0, 8, 91}, {0, 8, 27}, {0, 9, 151}, {20, 7, 67},\n    {0, 8, 123}, {0, 8, 59}, {0, 9, 215}, {18, 7, 19}, {0, 8, 107}, {0, 8, 43}, {0, 9, 183},\n    {0, 8, 11}, {0, 8, 139}, {0, 8, 75}, {0, 9, 247}, {16, 7, 5}, {0, 8, 87}, {0, 8, 23},\n    {64, 8, 0}, {19, 7, 51}, {0, 8, 119}, {0, 8, 55}, {0, 9, 207}, {17, 7, 15}, {0, 8, 103},\n    {0, 8, 39}, {0, 9, 175}, {0, 8, 7}, {0, 8, 135}, {0, 8, 71}, {0, 9, 239}, {16, 7, 9},\n    {0, 8, 95}, {0, 8, 31}, {0, 9, 159}, {20, 7, 99}, {0, 8, 127}, {0, 8, 63}, {0, 9, 223},\n    {18, 7, 27}, {0, 8, 111}, {0, 8, 47}, {0, 9, 191}, {0, 8, 15}, {0, 8, 143}, {0, 8, 79},\n    {0, 9, 255}\n};\n\nstatic const code distfix[32] =\n{\n    {16, 5, 1}, {23, 5, 257}, {19, 5, 17}, {27, 5, 4097}, {17, 5, 5}, {25, 5, 1025},\n    {21, 5, 65}, {29, 5, 16385}, {16, 5, 3}, {24, 5, 513}, {20, 5, 33}, {28, 5, 8193},\n    {18, 5, 9}, {26, 5, 2049}, {22, 5, 129}, {64, 5, 0}, {16, 5, 2}, {23, 5, 385},\n    {19, 5, 25}, {27, 5, 6145}, {17, 5, 7}, {25, 5, 1537}, {21, 5, 97}, {29, 5, 24577},\n    {16, 5, 4}, {24, 5, 769}, {20, 5, 49}, {28, 5, 12289}, {18, 5, 13}, {26, 5, 3073},\n    {22, 5, 193}, {64, 5, 0}\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/inflate.c",
    "content": "/* inflate.c -- zlib decompression\n * Copyright (C) 1995-2006 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/*\n * Change history:\n *\n * 1.2.beta0    24 Nov 2002\n * - First version -- complete rewrite of inflate to simplify code, avoid\n *   creation of window when not needed, minimize use of window when it is\n *   needed, make inffast.c even faster, implement gzip decoding, and to\n *   improve code readability and style over the previous zlib inflate code\n *\n * 1.2.beta1    25 Nov 2002\n * - Use pointers for available input and output checking in inffast.c\n * - Remove input and output counters in inffast.c\n * - Change inffast.c entry and loop from avail_in >= 7 to >= 6\n * - Remove unnecessary second byte pull from length extra in inffast.c\n * - Unroll direct copy to three copies per loop in inffast.c\n *\n * 1.2.beta2    4 Dec 2002\n * - Change external routine names to reduce potential conflicts\n * - Correct filename to inffixed.h for fixed tables in inflate.c\n * - Make hbuf[] unsigned char to match parameter type in inflate.c\n * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)\n *   to avoid negation problem on Alphas (64 bit) in inflate.c\n *\n * 1.2.beta3    22 Dec 2002\n * - Add comments on state->bits assertion in inffast.c\n * - Add comments on op field in inftrees.h\n * - Fix bug in reuse of allocated window after inflateReset()\n * - Remove bit fields--back to byte structure for speed\n * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths\n * - Change post-increments to pre-increments in inflate_fast(), PPC biased?\n * - Add compile time option, POSTINC, to use post-increments instead (Intel?)\n * - Make MATCH copy in inflate() much faster for when inflate_fast() not used\n * - Use local copies of stream next and avail values, as well as local bit\n *   buffer and bit count in inflate()--for speed when inflate_fast() not used\n *\n * 1.2.beta4    1 Jan 2003\n * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings\n * - Move a comment on output buffer sizes from inffast.c to inflate.c\n * - Add comments in inffast.c to introduce the inflate_fast() routine\n * - Rearrange window copies in inflate_fast() for speed and simplification\n * - Unroll last copy for window match in inflate_fast()\n * - Use local copies of window variables in inflate_fast() for speed\n * - Pull out common write == 0 case for speed in inflate_fast()\n * - Make op and len in inflate_fast() unsigned for consistency\n * - Add FAR to lcode and dcode declarations in inflate_fast()\n * - Simplified bad distance check in inflate_fast()\n * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new\n *   source file infback.c to provide a call-back interface to inflate for\n *   programs like gzip and unzip -- uses window as output buffer to avoid\n *   window copying\n *\n * 1.2.beta5    1 Jan 2003\n * - Improved inflateBack() interface to allow the caller to provide initial\n *   input in strm.\n * - Fixed stored blocks bug in inflateBack()\n *\n * 1.2.beta6    4 Jan 2003\n * - Added comments in inffast.c on effectiveness of POSTINC\n * - Typecasting all around to reduce compiler warnings\n * - Changed loops from while (1) or do {} while (1) to for (;;), again to\n *   make compilers happy\n * - Changed type of window in inflateBackInit() to unsigned char *\n *\n * 1.2.beta7    27 Jan 2003\n * - Changed many types to unsigned or unsigned short to avoid warnings\n * - Added inflateCopy() function\n *\n * 1.2.0        9 Mar 2003\n * - Changed inflateBack() interface to provide separate opaque descriptors\n *   for the in() and out() functions\n * - Changed inflateBack() argument and in_func typedef to swap the length\n *   and buffer address return values for the input function\n * - Check next_in and next_out for Z_NULL on entry to inflate()\n *\n * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.\n */\n\n#include \"zutil.h\"\n#include \"inftrees.h\"\n#include \"inflate.h\"\n#include \"inffast.h\"\n\n#ifdef MAKEFIXED\n#  ifndef BUILDFIXED\n#    define BUILDFIXED\n#  endif\n#endif\n\n/* function prototypes */\nlocal void fixedtables OF((struct inflate_state FAR *state));\nlocal int updatewindow OF((z_streamp strm, unsigned out));\n#ifdef BUILDFIXED\n   void makefixed OF((void));\n#endif\nlocal unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,\n                              unsigned len));\n\nint ZEXPORT inflateReset(strm)\nz_streamp strm;\n{\n    struct inflate_state FAR *state;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    strm->total_in = strm->total_out = state->total = 0;\n    strm->msg = Z_NULL;\n    strm->adler = 1;        /* to support ill-conceived Java test suite */\n    state->mode = HEAD;\n    state->last = 0;\n    state->havedict = 0;\n    state->dmax = 32768U;\n    state->head = Z_NULL;\n    state->wsize = 0;\n    state->whave = 0;\n    state->write = 0;\n    state->hold = 0;\n    state->bits = 0;\n    state->lencode = state->distcode = state->next = state->codes;\n    state->sane = 1;\n    Tracev((stderr, \"inflate: reset\\n\"));\n    return Z_OK;\n}\n\nint ZEXPORT inflatePrime(strm, bits, value)\nz_streamp strm;\nint bits;\nint value;\n{\n    struct inflate_state FAR *state;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;\n    value &= (1L << bits) - 1;\n    state->hold += value << state->bits;\n    state->bits += bits;\n    return Z_OK;\n}\n\nint ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)\nz_streamp strm;\nint windowBits;\nconst char *version;\nint stream_size;\n{\n    struct inflate_state FAR *state;\n\n    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||\n        stream_size != (int)(sizeof(z_stream)))\n        return Z_VERSION_ERROR;\n    if (strm == Z_NULL) return Z_STREAM_ERROR;\n    strm->msg = Z_NULL;                 /* in case we return an error */\n    if (strm->zalloc == (alloc_func)0) {\n        strm->zalloc = zcalloc;\n        strm->opaque = (voidpf)0;\n    }\n    if (strm->zfree == (free_func)0) strm->zfree = zcfree;\n    state = (struct inflate_state FAR *)\n            ZALLOC(strm, 1, sizeof(struct inflate_state));\n    if (state == Z_NULL) return Z_MEM_ERROR;\n    Tracev((stderr, \"inflate: allocated\\n\"));\n    strm->state = (struct internal_state FAR *)state;\n    if (windowBits < 0) {\n        state->wrap = 0;\n        windowBits = -windowBits;\n    }\n    else {\n        state->wrap = (windowBits >> 4) + 1;\n#ifdef GUNZIP\n        if (windowBits < 48) windowBits &= 15;\n#endif\n    }\n    if (windowBits < 8 || windowBits > 15) {\n        ZFREE(strm, state);\n        strm->state = Z_NULL;\n        return Z_STREAM_ERROR;\n    }\n    state->wbits = (unsigned)windowBits;\n    state->window = Z_NULL;\n    return inflateReset(strm);\n}\n\nint ZEXPORT inflateInit_(strm, version, stream_size)\nz_streamp strm;\nconst char *version;\nint stream_size;\n{\n    return inflateInit2_(strm, DEF_WBITS, version, stream_size);\n}\n\n/*\n   Return state with length and distance decoding tables and index sizes set to\n   fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n   If BUILDFIXED is defined, then instead this routine builds the tables the\n   first time it's called, and returns those tables the first time and\n   thereafter.  This reduces the size of the code by about 2K bytes, in\n   exchange for a little execution time.  However, BUILDFIXED should not be\n   used for threaded applications, since the rewriting of the tables and virgin\n   may not be thread-safe.\n */\nlocal void fixedtables(state)\nstruct inflate_state FAR *state;\n{\n#ifdef BUILDFIXED\n    static int virgin = 1;\n    static code *lenfix, *distfix;\n    static code fixed[544];\n\n    /* build fixed huffman tables if first call (may not be thread safe) */\n    if (virgin) {\n        unsigned sym, bits;\n        static code *next;\n\n        /* literal/length table */\n        sym = 0;\n        while (sym < 144) state->lens[sym++] = 8;\n        while (sym < 256) state->lens[sym++] = 9;\n        while (sym < 280) state->lens[sym++] = 7;\n        while (sym < 288) state->lens[sym++] = 8;\n        next = fixed;\n        lenfix = next;\n        bits = 9;\n        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);\n\n        /* distance table */\n        sym = 0;\n        while (sym < 32) state->lens[sym++] = 5;\n        distfix = next;\n        bits = 5;\n        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);\n\n        /* do this just once */\n        virgin = 0;\n    }\n#else /* !BUILDFIXED */\n#   include \"inffixed.h\"\n#endif /* BUILDFIXED */\n    state->lencode = lenfix;\n    state->lenbits = 9;\n    state->distcode = distfix;\n    state->distbits = 5;\n}\n\n#ifdef MAKEFIXED\n#include <stdio.h>\n\n/*\n   Write out the inffixed.h that is #include'd above.  Defining MAKEFIXED also\n   defines BUILDFIXED, so the tables are built on the fly.  makefixed() writes\n   those tables to stdout, which would be piped to inffixed.h.  A small program\n   can simply call makefixed to do this:\n\n    void makefixed(void);\n\n    int main(void)\n    {\n        makefixed();\n        return 0;\n    }\n\n   Then that can be linked with zlib built with MAKEFIXED defined and run:\n\n    a.out > inffixed.h\n */\nvoid makefixed()\n{\n    unsigned low, size;\n    struct inflate_state state;\n\n    fixedtables(&state);\n    puts(\"    /* inffixed.h -- table for decoding fixed codes\");\n    puts(\"     * Generated automatically by makefixed().\");\n    puts(\"     */\");\n    puts(\"\");\n    puts(\"    /* WARNING: this file should *not* be used by applications.\");\n    puts(\"       It is part of the implementation of this library and is\");\n    puts(\"       subject to change. Applications should only use zlib.h.\");\n    puts(\"     */\");\n    puts(\"\");\n    size = 1U << 9;\n    printf(\"    static const code lenfix[%u] = {\", size);\n    low = 0;\n    for (;;) {\n        if ((low % 7) == 0) printf(\"\\n        \");\n        printf(\"{%u,%u,%d}\", state.lencode[low].op, state.lencode[low].bits,\n               state.lencode[low].val);\n        if (++low == size) break;\n        putchar(',');\n    }\n    puts(\"\\n    };\");\n    size = 1U << 5;\n    printf(\"\\n    static const code distfix[%u] = {\", size);\n    low = 0;\n    for (;;) {\n        if ((low % 6) == 0) printf(\"\\n        \");\n        printf(\"{%u,%u,%d}\", state.distcode[low].op, state.distcode[low].bits,\n               state.distcode[low].val);\n        if (++low == size) break;\n        putchar(',');\n    }\n    puts(\"\\n    };\");\n}\n#endif /* MAKEFIXED */\n\n/*\n   Update the window with the last wsize (normally 32K) bytes written before\n   returning.  If window does not exist yet, create it.  This is only called\n   when a window is already in use, or when output has been written during this\n   inflate call, but the end of the deflate stream has not been reached yet.\n   It is also called to create a window for dictionary data when a dictionary\n   is loaded.\n\n   Providing output buffers larger than 32K to inflate() should provide a speed\n   advantage, since only the last 32K of output is copied to the sliding window\n   upon return from inflate(), and since all distances after the first 32K of\n   output will fall in the output data, making match copies simpler and faster.\n   The advantage may be dependent on the size of the processor's data caches.\n */\nlocal int updatewindow(strm, out)\nz_streamp strm;\nunsigned out;\n{\n    struct inflate_state FAR *state;\n    unsigned copy, dist;\n\n    state = (struct inflate_state FAR *)strm->state;\n\n    /* if it hasn't been done already, allocate space for the window */\n    if (state->window == Z_NULL) {\n        state->window = (unsigned char FAR *)\n                        ZALLOC(strm, 1U << state->wbits,\n                               sizeof(unsigned char));\n        if (state->window == Z_NULL) return 1;\n    }\n\n    /* if window not in use yet, initialize */\n    if (state->wsize == 0) {\n        state->wsize = 1U << state->wbits;\n        state->write = 0;\n        state->whave = 0;\n    }\n\n    /* copy state->wsize or less output bytes into the circular window */\n    copy = out - strm->avail_out;\n    if (copy >= state->wsize) {\n        zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);\n        state->write = 0;\n        state->whave = state->wsize;\n    }\n    else {\n        dist = state->wsize - state->write;\n        if (dist > copy) dist = copy;\n        zmemcpy(state->window + state->write, strm->next_out - copy, dist);\n        copy -= dist;\n        if (copy) {\n            zmemcpy(state->window, strm->next_out - copy, copy);\n            state->write = copy;\n            state->whave = state->wsize;\n        }\n        else {\n            state->write += dist;\n            if (state->write == state->wsize) state->write = 0;\n            if (state->whave < state->wsize) state->whave += dist;\n        }\n    }\n    return 0;\n}\n\n/* Macros for inflate(): */\n\n/* check function to use adler32() for zlib or crc32() for gzip */\n#ifdef GUNZIP\n#  define UPDATE(check, buf, len) \\\n    (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))\n#else\n#  define UPDATE(check, buf, len) adler32(check, buf, len)\n#endif\n\n/* check macros for header crc */\n#ifdef GUNZIP\n#  define CRC2(check, word) \\\n    do { \\\n        hbuf[0] = (unsigned char)(word); \\\n        hbuf[1] = (unsigned char)((word) >> 8); \\\n        check = crc32(check, hbuf, 2); \\\n    } while (0)\n\n#  define CRC4(check, word) \\\n    do { \\\n        hbuf[0] = (unsigned char)(word); \\\n        hbuf[1] = (unsigned char)((word) >> 8); \\\n        hbuf[2] = (unsigned char)((word) >> 16); \\\n        hbuf[3] = (unsigned char)((word) >> 24); \\\n        check = crc32(check, hbuf, 4); \\\n    } while (0)\n#endif\n\n/* Load registers with state in inflate() for speed */\n#define LOAD() \\\n    do { \\\n        put = strm->next_out; \\\n        left = strm->avail_out; \\\n        next = strm->next_in; \\\n        have = strm->avail_in; \\\n        hold = state->hold; \\\n        bits = state->bits; \\\n    } while (0)\n\n/* Restore state from registers in inflate() */\n#define RESTORE() \\\n    do { \\\n        strm->next_out = put; \\\n        strm->avail_out = left; \\\n        strm->next_in = next; \\\n        strm->avail_in = have; \\\n        state->hold = hold; \\\n        state->bits = bits; \\\n    } while (0)\n\n/* Clear the input bit accumulator */\n#define INITBITS() \\\n    do { \\\n        hold = 0; \\\n        bits = 0; \\\n    } while (0)\n\n/* Get a byte of input into the bit accumulator, or return from inflate()\n   if there is no input available. */\n#define PULLBYTE() \\\n    do { \\\n        if (have == 0) goto inf_leave; \\\n        have--; \\\n        hold += (unsigned long)(*next++) << bits; \\\n        bits += 8; \\\n    } while (0)\n\n/* Assure that there are at least n bits in the bit accumulator.  If there is\n   not enough available input to do that, then return from inflate(). */\n#define NEEDBITS(n) \\\n    do { \\\n        while (bits < (unsigned)(n)) \\\n            PULLBYTE(); \\\n    } while (0)\n\n/* Return the low n bits of the bit accumulator (n < 16) */\n#define BITS(n) \\\n    ((unsigned)hold & ((1U << (n)) - 1))\n\n/* Remove n bits from the bit accumulator */\n#define DROPBITS(n) \\\n    do { \\\n        hold >>= (n); \\\n        bits -= (unsigned)(n); \\\n    } while (0)\n\n/* Remove zero to seven bits as needed to go to a byte boundary */\n#define BYTEBITS() \\\n    do { \\\n        hold >>= bits & 7; \\\n        bits -= bits & 7; \\\n    } while (0)\n\n/* Reverse the bytes in a 32-bit value */\n#define REVERSE(q) \\\n    ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \\\n     (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))\n\n/*\n   inflate() uses a state machine to process as much input data and generate as\n   much output data as possible before returning.  The state machine is\n   structured roughly as follows:\n\n    for (;;) switch (state) {\n    ...\n    case STATEn:\n        if (not enough input data or output space to make progress)\n            return;\n        ... make progress ...\n        state = STATEm;\n        break;\n    ...\n    }\n\n   so when inflate() is called again, the same case is attempted again, and\n   if the appropriate resources are provided, the machine proceeds to the\n   next state.  The NEEDBITS() macro is usually the way the state evaluates\n   whether it can proceed or should return.  NEEDBITS() does the return if\n   the requested bits are not available.  The typical use of the BITS macros\n   is:\n\n        NEEDBITS(n);\n        ... do something with BITS(n) ...\n        DROPBITS(n);\n\n   where NEEDBITS(n) either returns from inflate() if there isn't enough\n   input left to load n bits into the accumulator, or it continues.  BITS(n)\n   gives the low n bits in the accumulator.  When done, DROPBITS(n) drops\n   the low n bits off the accumulator.  INITBITS() clears the accumulator\n   and sets the number of available bits to zero.  BYTEBITS() discards just\n   enough bits to put the accumulator on a byte boundary.  After BYTEBITS()\n   and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.\n\n   NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return\n   if there is no input available.  The decoding of variable length codes uses\n   PULLBYTE() directly in order to pull just enough bytes to decode the next\n   code, and no more.\n\n   Some states loop until they get enough input, making sure that enough\n   state information is maintained to continue the loop where it left off\n   if NEEDBITS() returns in the loop.  For example, want, need, and keep\n   would all have to actually be part of the saved state in case NEEDBITS()\n   returns:\n\n    case STATEw:\n        while (want < need) {\n            NEEDBITS(n);\n            keep[want++] = BITS(n);\n            DROPBITS(n);\n        }\n        state = STATEx;\n    case STATEx:\n\n   As shown above, if the next state is also the next case, then the break\n   is omitted.\n\n   A state may also return if there is not enough output space available to\n   complete that state.  Those states are copying stored data, writing a\n   literal byte, and copying a matching string.\n\n   When returning, a \"goto inf_leave\" is used to update the total counters,\n   update the check value, and determine whether any progress has been made\n   during that inflate() call in order to return the proper return code.\n   Progress is defined as a change in either strm->avail_in or strm->avail_out.\n   When there is a window, goto inf_leave will update the window with the last\n   output written.  If a goto inf_leave occurs in the middle of decompression\n   and there is no window currently, goto inf_leave will create one and copy\n   output to the window for the next call of inflate().\n\n   In this implementation, the flush parameter of inflate() only affects the\n   return code (per zlib.h).  inflate() always writes as much as possible to\n   strm->next_out, given the space available and the provided input--the effect\n   documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers\n   the allocation of and copying into a sliding window until necessary, which\n   provides the effect documented in zlib.h for Z_FINISH when the entire input\n   stream available.  So the only thing the flush parameter actually does is:\n   when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it\n   will return Z_BUF_ERROR if it has not reached the end of the stream.\n */\n\nint ZEXPORT inflate(strm, flush)\nz_streamp strm;\nint flush;\n{\n    struct inflate_state FAR *state;\n    unsigned char FAR *next;    /* next input */\n    unsigned char FAR *put;     /* next output */\n    unsigned have, left;        /* available input and output */\n    unsigned long hold;         /* bit buffer */\n    unsigned bits;              /* bits in bit buffer */\n    unsigned in, out;           /* save starting available input and output */\n    unsigned copy;              /* number of stored or match bytes to copy */\n    unsigned char FAR *from;    /* where to copy match bytes from */\n    code here;                  /* current decoding table entry */\n    code last;                  /* parent table entry */\n    unsigned len;               /* length to copy for repeats, bits to drop */\n    int ret;                    /* return code */\n#ifdef GUNZIP\n    unsigned char hbuf[4];      /* buffer for gzip header crc calculation */\n#endif\n    static const unsigned short order[19] = /* permutation of code lengths */\n        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};\n\n    if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL ||\n        (strm->next_in == Z_NULL && strm->avail_in != 0))\n        return Z_STREAM_ERROR;\n\n    state = (struct inflate_state FAR *)strm->state;\n    if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */\n    LOAD();\n    in = have;\n    out = left;\n    ret = Z_OK;\n    for (;;)\n        switch (state->mode) {\n        case HEAD:\n            if (state->wrap == 0) {\n                state->mode = TYPEDO;\n                break;\n            }\n            NEEDBITS(16);\n#ifdef GUNZIP\n            if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */\n                state->check = crc32(0L, Z_NULL, 0);\n                CRC2(state->check, hold);\n                INITBITS();\n                state->mode = FLAGS;\n                break;\n            }\n            state->flags = 0;           /* expect zlib header */\n            if (state->head != Z_NULL)\n                state->head->done = -1;\n            if (!(state->wrap & 1) ||   /* check if zlib header allowed */\n#else\n            if (\n#endif\n                ((BITS(8) << 8) + (hold >> 8)) % 31) {\n                strm->msg = (char *)\"incorrect header check\";\n                state->mode = BAD;\n                break;\n            }\n            if (BITS(4) != Z_DEFLATED) {\n                strm->msg = (char *)\"unknown compression method\";\n                state->mode = BAD;\n                break;\n            }\n            DROPBITS(4);\n            len = BITS(4) + 8;\n            if (len > state->wbits) {\n                strm->msg = (char *)\"invalid window size\";\n                state->mode = BAD;\n                break;\n            }\n            state->dmax = 1U << len;\n            Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n            strm->adler = state->check = adler32(0L, Z_NULL, 0);\n            state->mode = hold & 0x200 ? DICTID : TYPE;\n            INITBITS();\n            break;\n#ifdef GUNZIP\n        case FLAGS:\n            NEEDBITS(16);\n            state->flags = (int)(hold);\n            if ((state->flags & 0xff) != Z_DEFLATED) {\n                strm->msg = (char *)\"unknown compression method\";\n                state->mode = BAD;\n                break;\n            }\n            if (state->flags & 0xe000) {\n                strm->msg = (char *)\"unknown header flags set\";\n                state->mode = BAD;\n                break;\n            }\n            if (state->head != Z_NULL)\n                state->head->text = (int)((hold >> 8) & 1);\n            if (state->flags & 0x0200) CRC2(state->check, hold);\n            INITBITS();\n            state->mode = TIME;\n        case TIME:\n            NEEDBITS(32);\n            if (state->head != Z_NULL)\n                state->head->time = hold;\n            if (state->flags & 0x0200) CRC4(state->check, hold);\n            INITBITS();\n            state->mode = OS;\n        case OS:\n            NEEDBITS(16);\n            if (state->head != Z_NULL) {\n                state->head->xflags = (int)(hold & 0xff);\n                state->head->os = (int)(hold >> 8);\n            }\n            if (state->flags & 0x0200) CRC2(state->check, hold);\n            INITBITS();\n            state->mode = EXLEN;\n        case EXLEN:\n            if (state->flags & 0x0400) {\n                NEEDBITS(16);\n                state->length = (unsigned)(hold);\n                if (state->head != Z_NULL)\n                    state->head->extra_len = (unsigned)hold;\n                if (state->flags & 0x0200) CRC2(state->check, hold);\n                INITBITS();\n            }\n            else if (state->head != Z_NULL)\n                state->head->extra = Z_NULL;\n            state->mode = EXTRA;\n        case EXTRA:\n            if (state->flags & 0x0400) {\n                copy = state->length;\n                if (copy > have) copy = have;\n                if (copy) {\n                    if (state->head != Z_NULL &&\n                        state->head->extra != Z_NULL) {\n                        len = state->head->extra_len - state->length;\n                        zmemcpy(state->head->extra + len, next,\n                                len + copy > state->head->extra_max ?\n                                state->head->extra_max - len : copy);\n                    }\n                    if (state->flags & 0x0200)\n                        state->check = crc32(state->check, next, copy);\n                    have -= copy;\n                    next += copy;\n                    state->length -= copy;\n                }\n                if (state->length) goto inf_leave;\n            }\n            state->length = 0;\n            state->mode = NAME;\n        case NAME:\n            if (state->flags & 0x0800) {\n                if (have == 0) goto inf_leave;\n                copy = 0;\n                do {\n                    len = (unsigned)(next[copy++]);\n                    if (state->head != Z_NULL &&\n                            state->head->name != Z_NULL &&\n                            state->length < state->head->name_max)\n                        state->head->name[state->length++] = len;\n                } while (len && copy < have);\n                if (state->flags & 0x0200)\n                    state->check = crc32(state->check, next, copy);\n                have -= copy;\n                next += copy;\n                if (len) goto inf_leave;\n            }\n            else if (state->head != Z_NULL)\n                state->head->name = Z_NULL;\n            state->length = 0;\n            state->mode = COMMENT;\n        case COMMENT:\n            if (state->flags & 0x1000) {\n                if (have == 0) goto inf_leave;\n                copy = 0;\n                do {\n                    len = (unsigned)(next[copy++]);\n                    if (state->head != Z_NULL &&\n                            state->head->comment != Z_NULL &&\n                            state->length < state->head->comm_max)\n                        state->head->comment[state->length++] = len;\n                } while (len && copy < have);\n                if (state->flags & 0x0200)\n                    state->check = crc32(state->check, next, copy);\n                have -= copy;\n                next += copy;\n                if (len) goto inf_leave;\n            }\n            else if (state->head != Z_NULL)\n                state->head->comment = Z_NULL;\n            state->mode = HCRC;\n        case HCRC:\n            if (state->flags & 0x0200) {\n                NEEDBITS(16);\n                if (hold != (state->check & 0xffff)) {\n                    strm->msg = (char *)\"header crc mismatch\";\n                    state->mode = BAD;\n                    break;\n                }\n                INITBITS();\n            }\n            if (state->head != Z_NULL) {\n                state->head->hcrc = (int)((state->flags >> 9) & 1);\n                state->head->done = 1;\n            }\n            strm->adler = state->check = crc32(0L, Z_NULL, 0);\n            state->mode = TYPE;\n            break;\n#endif\n        case DICTID:\n            NEEDBITS(32);\n            strm->adler = state->check = REVERSE(hold);\n            INITBITS();\n            state->mode = DICT;\n        case DICT:\n            if (state->havedict == 0) {\n                RESTORE();\n                return Z_NEED_DICT;\n            }\n            strm->adler = state->check = adler32(0L, Z_NULL, 0);\n            state->mode = TYPE;\n        case TYPE:\n            if (flush == Z_BLOCK) goto inf_leave;\n        case TYPEDO:\n            if (state->last) {\n                BYTEBITS();\n                state->mode = CHECK;\n                break;\n            }\n            NEEDBITS(3);\n            state->last = BITS(1);\n            DROPBITS(1);\n            switch (BITS(2)) {\n            case 0:                             /* stored block */\n                Tracev((stderr, \"inflate:     stored block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = STORED;\n                break;\n            case 1:                             /* fixed block */\n                fixedtables(state);\n                Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = LEN;              /* decode codes */\n                break;\n            case 2:                             /* dynamic block */\n                Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = TABLE;\n                break;\n            case 3:\n                strm->msg = (char *)\"invalid block type\";\n                state->mode = BAD;\n            }\n            DROPBITS(2);\n            break;\n        case STORED:\n            BYTEBITS();                         /* go to byte boundary */\n            NEEDBITS(32);\n            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {\n                strm->msg = (char *)\"invalid stored block lengths\";\n                state->mode = BAD;\n                break;\n            }\n            state->length = (unsigned)hold & 0xffff;\n            Tracev((stderr, \"inflate:       stored length %u\\n\",\n                    state->length));\n            INITBITS();\n            state->mode = COPY;\n        case COPY:\n            copy = state->length;\n            if (copy) {\n                if (copy > have) copy = have;\n                if (copy > left) copy = left;\n                if (copy == 0) goto inf_leave;\n                zmemcpy(put, next, copy);\n                have -= copy;\n                next += copy;\n                left -= copy;\n                put += copy;\n                state->length -= copy;\n                break;\n            }\n            Tracev((stderr, \"inflate:       stored end\\n\"));\n            state->mode = TYPE;\n            break;\n        case TABLE:\n            NEEDBITS(14);\n            state->nlen = BITS(5) + 257;\n            DROPBITS(5);\n            state->ndist = BITS(5) + 1;\n            DROPBITS(5);\n            state->ncode = BITS(4) + 4;\n            DROPBITS(4);\n#ifndef PKZIP_BUG_WORKAROUND\n            if (state->nlen > 286 || state->ndist > 30) {\n                strm->msg = (char *)\"too many length or distance symbols\";\n                state->mode = BAD;\n                break;\n            }\n#endif\n            Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n            state->have = 0;\n            state->mode = LENLENS;\n        case LENLENS:\n            while (state->have < state->ncode) {\n                NEEDBITS(3);\n                state->lens[order[state->have++]] = (unsigned short)BITS(3);\n                DROPBITS(3);\n            }\n            while (state->have < 19)\n                state->lens[order[state->have++]] = 0;\n            state->next = state->codes;\n            state->lencode = (code const FAR *)(state->next);\n            state->lenbits = 7;\n            ret = inflate_table(CODES, state->lens, 19, &(state->next),\n                                &(state->lenbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid code lengths set\";\n                state->mode = BAD;\n                break;\n            }\n            Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n            state->have = 0;\n            state->mode = CODELENS;\n        case CODELENS:\n            while (state->have < state->nlen + state->ndist) {\n                for (;;) {\n                    here = state->lencode[BITS(state->lenbits)];\n                    if ((unsigned)(here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                if (here.val < 16) {\n                    NEEDBITS(here.bits);\n                    DROPBITS(here.bits);\n                    state->lens[state->have++] = here.val;\n                }\n                else {\n                    if (here.val == 16) {\n                        NEEDBITS(here.bits + 2);\n                        DROPBITS(here.bits);\n                        if (state->have == 0) {\n                            strm->msg = (char *)\"invalid bit length repeat\";\n                            state->mode = BAD;\n                            break;\n                        }\n                        len = state->lens[state->have - 1];\n                        copy = 3 + BITS(2);\n                        DROPBITS(2);\n                    }\n                    else if (here.val == 17) {\n                        NEEDBITS(here.bits + 3);\n                        DROPBITS(here.bits);\n                        len = 0;\n                        copy = 3 + BITS(3);\n                        DROPBITS(3);\n                    }\n                    else {\n                        NEEDBITS(here.bits + 7);\n                        DROPBITS(here.bits);\n                        len = 0;\n                        copy = 11 + BITS(7);\n                        DROPBITS(7);\n                    }\n                    if (state->have + copy > state->nlen + state->ndist) {\n                        strm->msg = (char *)\"invalid bit length repeat\";\n                        state->mode = BAD;\n                        break;\n                    }\n                    while (copy--)\n                        state->lens[state->have++] = (unsigned short)len;\n                }\n            }\n\n            /* handle error breaks in while */\n            if (state->mode == BAD) break;\n\n            /* build code tables */\n            state->next = state->codes;\n            state->lencode = (code const FAR *)(state->next);\n            state->lenbits = 9;\n            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),\n                                &(state->lenbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid literal/lengths set\";\n                state->mode = BAD;\n                break;\n            }\n            state->distcode = (code const FAR *)(state->next);\n            state->distbits = 6;\n            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,\n                            &(state->next), &(state->distbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid distances set\";\n                state->mode = BAD;\n                break;\n            }\n            Tracev((stderr, \"inflate:       codes ok\\n\"));\n            state->mode = LEN;\n        case LEN:\n            if (have >= 6 && left >= 258) {\n                RESTORE();\n                inflate_fast(strm, out);\n                LOAD();\n                break;\n            }\n            for (;;) {\n                here = state->lencode[BITS(state->lenbits)];\n                if ((unsigned)(here.bits) <= bits) break;\n                PULLBYTE();\n            }\n            if (here.op && (here.op & 0xf0) == 0) {\n                last = here;\n                for (;;) {\n                    here = state->lencode[last.val +\n                            (BITS(last.bits + last.op) >> last.bits)];\n                    if ((unsigned)(last.bits + here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                DROPBITS(last.bits);\n            }\n            DROPBITS(here.bits);\n            state->length = (unsigned)here.val;\n            if ((int)(here.op) == 0) {\n                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n                        \"inflate:         literal '%c'\\n\" :\n                        \"inflate:         literal 0x%02x\\n\", here.val));\n                state->mode = LIT;\n                break;\n            }\n            if (here.op & 32) {\n                Tracevv((stderr, \"inflate:         end of block\\n\"));\n                state->mode = TYPE;\n                break;\n            }\n            if (here.op & 64) {\n                strm->msg = (char *)\"invalid literal/length code\";\n                state->mode = BAD;\n                break;\n            }\n            state->extra = (unsigned)(here.op) & 15;\n            state->mode = LENEXT;\n        case LENEXT:\n            if (state->extra) {\n                NEEDBITS(state->extra);\n                state->length += BITS(state->extra);\n                DROPBITS(state->extra);\n            }\n            Tracevv((stderr, \"inflate:         length %u\\n\", state->length));\n            state->mode = DIST;\n        case DIST:\n            for (;;) {\n                here = state->distcode[BITS(state->distbits)];\n                if ((unsigned)(here.bits) <= bits) break;\n                PULLBYTE();\n            }\n            if ((here.op & 0xf0) == 0) {\n                last = here;\n                for (;;) {\n                    here = state->distcode[last.val +\n                            (BITS(last.bits + last.op) >> last.bits)];\n                    if ((unsigned)(last.bits + here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                DROPBITS(last.bits);\n            }\n            DROPBITS(here.bits);\n            if (here.op & 64) {\n                strm->msg = (char *)\"invalid distance code\";\n                state->mode = BAD;\n                break;\n            }\n            state->offset = (unsigned)here.val;\n            state->extra = (unsigned)(here.op) & 15;\n            state->mode = DISTEXT;\n        case DISTEXT:\n            if (state->extra) {\n                NEEDBITS(state->extra);\n                state->offset += BITS(state->extra);\n                DROPBITS(state->extra);\n            }\n#ifdef INFLATE_STRICT\n            if (state->offset > state->dmax) {\n                strm->msg = (char *)\"invalid distance too far back\";\n                state->mode = BAD;\n                break;\n            }\n#endif\n            Tracevv((stderr, \"inflate:         distance %u\\n\", state->offset));\n            state->mode = MATCH;\n        case MATCH:\n            if (left == 0) goto inf_leave;\n            copy = out - left;\n            if (state->offset > copy) {         /* copy from window */\n                copy = state->offset - copy;\n                if (copy > state->whave) {\n                    if (state->sane) {\n                        strm->msg = (char *)\"invalid distance too far back\";\n                        state->mode = BAD;\n                        break;\n                    }\n#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n                    Trace((stderr, \"inflate.c too far\\n\"));\n                    copy -= state->whave;\n                    if (copy > state->length) copy = state->length;\n                    if (copy > left) copy = left;\n                    left -= copy;\n                    state->length -= copy;\n                    do {\n                        *put++ = 0;\n                    } while (--copy);\n                    if (state->length == 0) state->mode = LEN;\n                    break;\n#endif\n                }\n                if (copy > state->write) {\n                    copy -= state->write;\n                    from = state->window + (state->wsize - copy);\n                }\n                else\n                    from = state->window + (state->write - copy);\n                if (copy > state->length) copy = state->length;\n            }\n            else {                              /* copy from output */\n                from = put - state->offset;\n                copy = state->length;\n            }\n            if (copy > left) copy = left;\n            left -= copy;\n            state->length -= copy;\n            do {\n                *put++ = *from++;\n            } while (--copy);\n            if (state->length == 0) state->mode = LEN;\n            break;\n        case LIT:\n            if (left == 0) goto inf_leave;\n            *put++ = (unsigned char)(state->length);\n            left--;\n            state->mode = LEN;\n            break;\n        case CHECK:\n            if (state->wrap) {\n                NEEDBITS(32);\n                out -= left;\n                strm->total_out += out;\n                state->total += out;\n                if (out)\n                    strm->adler = state->check =\n                        UPDATE(state->check, put - out, out);\n                out = left;\n                if ((\n#ifdef GUNZIP\n                     state->flags ? hold :\n#endif\n                     REVERSE(hold)) != state->check) {\n                    strm->msg = (char *)\"incorrect data check\";\n                    state->mode = BAD;\n                    break;\n                }\n                INITBITS();\n                Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n            }\n#ifdef GUNZIP\n            state->mode = LENGTH;\n        case LENGTH:\n            if (state->wrap && state->flags) {\n                NEEDBITS(32);\n                if (hold != (state->total & 0xffffffffUL)) {\n                    strm->msg = (char *)\"incorrect length check\";\n                    state->mode = BAD;\n                    break;\n                }\n                INITBITS();\n                Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n            }\n#endif\n            state->mode = DONE;\n        case DONE:\n            ret = Z_STREAM_END;\n            goto inf_leave;\n        case BAD:\n            ret = Z_DATA_ERROR;\n            goto inf_leave;\n        case MEM:\n            return Z_MEM_ERROR;\n        case SYNC:\n        default:\n            return Z_STREAM_ERROR;\n        }\n\n    /*\n       Return from inflate(), updating the total counts and the check value.\n       If there was no progress during the inflate() call, return a buffer\n       error.  Call updatewindow() to create and/or update the window state.\n       Note: a memory error from inflate() is non-recoverable.\n     */\n  inf_leave:\n    RESTORE();\n    if (state->wsize || (state->mode < CHECK && out != strm->avail_out))\n        if (updatewindow(strm, out)) {\n            state->mode = MEM;\n            return Z_MEM_ERROR;\n        }\n    in -= strm->avail_in;\n    out -= strm->avail_out;\n    strm->total_in += in;\n    strm->total_out += out;\n    state->total += out;\n    if (state->wrap && out)\n        strm->adler = state->check =\n            UPDATE(state->check, strm->next_out - out, out);\n    strm->data_type = state->bits + (state->last ? 64 : 0) +\n                      (state->mode == TYPE ? 128 : 0);\n    if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)\n        ret = Z_BUF_ERROR;\n    return ret;\n}\n\nint ZEXPORT inflateEnd(strm)\nz_streamp strm;\n{\n    struct inflate_state FAR *state;\n    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)\n        return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    if (state->window != Z_NULL) ZFREE(strm, state->window);\n    ZFREE(strm, strm->state);\n    strm->state = Z_NULL;\n    Tracev((stderr, \"inflate: end\\n\"));\n    return Z_OK;\n}\n\nint ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)\nz_streamp strm;\nconst Bytef *dictionary;\nuInt dictLength;\n{\n    struct inflate_state FAR *state;\n    unsigned long id;\n\n    /* check state */\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    if (state->wrap != 0 && state->mode != DICT)\n        return Z_STREAM_ERROR;\n\n    /* check for correct dictionary id */\n    if (state->mode == DICT) {\n        id = adler32(0L, Z_NULL, 0);\n        id = adler32(id, dictionary, dictLength);\n        if (id != state->check)\n            return Z_DATA_ERROR;\n    }\n\n    /* copy dictionary to window */\n    if (updatewindow(strm, strm->avail_out)) {\n        state->mode = MEM;\n        return Z_MEM_ERROR;\n    }\n    if (dictLength > state->wsize) {\n        zmemcpy(state->window, dictionary + dictLength - state->wsize,\n                state->wsize);\n        state->whave = state->wsize;\n    }\n    else {\n        zmemcpy(state->window + state->wsize - dictLength, dictionary,\n                dictLength);\n        state->whave = dictLength;\n    }\n    state->havedict = 1;\n    Tracev((stderr, \"inflate:   dictionary set\\n\"));\n    return Z_OK;\n}\n\nint ZEXPORT inflateGetHeader(strm, head)\nz_streamp strm;\ngz_headerp head;\n{\n    struct inflate_state FAR *state;\n\n    /* check state */\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;\n\n    /* save header structure */\n    state->head = head;\n    head->done = 0;\n    return Z_OK;\n}\n\n/*\n   Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff.  Return when found\n   or when out of input.  When called, *have is the number of pattern bytes\n   found in order so far, in 0..3.  On return *have is updated to the new\n   state.  If on return *have equals four, then the pattern was found and the\n   return value is how many bytes were read including the last byte of the\n   pattern.  If *have is less than four, then the pattern has not been found\n   yet and the return value is len.  In the latter case, syncsearch() can be\n   called again with more data and the *have state.  *have is initialized to\n   zero for the first call.\n */\nlocal unsigned syncsearch(have, buf, len)\nunsigned FAR *have;\nunsigned char FAR *buf;\nunsigned len;\n{\n    unsigned got;\n    unsigned next;\n\n    got = *have;\n    next = 0;\n    while (next < len && got < 4) {\n        if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))\n            got++;\n        else if (buf[next])\n            got = 0;\n        else\n            got = 4 - got;\n        next++;\n    }\n    *have = got;\n    return next;\n}\n\nint ZEXPORT inflateSync(strm)\nz_streamp strm;\n{\n    unsigned len;               /* number of bytes to look at or looked at */\n    unsigned long in, out;      /* temporary to save total_in and total_out */\n    unsigned char buf[4];       /* to restore bit buffer to byte string */\n    struct inflate_state FAR *state;\n\n    /* check parameters */\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;\n\n    /* if first time, start search in bit buffer */\n    if (state->mode != SYNC) {\n        state->mode = SYNC;\n        state->hold <<= state->bits & 7;\n        state->bits -= state->bits & 7;\n        len = 0;\n        while (state->bits >= 8) {\n            buf[len++] = (unsigned char)(state->hold);\n            state->hold >>= 8;\n            state->bits -= 8;\n        }\n        state->have = 0;\n        syncsearch(&(state->have), buf, len);\n    }\n\n    /* search available input */\n    len = syncsearch(&(state->have), strm->next_in, strm->avail_in);\n    strm->avail_in -= len;\n    strm->next_in += len;\n    strm->total_in += len;\n\n    /* return no joy or set up to restart inflate() on a new block */\n    if (state->have != 4) return Z_DATA_ERROR;\n    in = strm->total_in;  out = strm->total_out;\n    inflateReset(strm);\n    strm->total_in = in;  strm->total_out = out;\n    state->mode = TYPE;\n    return Z_OK;\n}\n\n/*\n   Returns true if inflate is currently at the end of a block generated by\n   Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP\n   implementation to provide an additional safety check. PPP uses\n   Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored\n   block. When decompressing, PPP checks that at the end of input packet,\n   inflate is waiting for these length bytes.\n */\nint ZEXPORT inflateSyncPoint(strm)\nz_streamp strm;\n{\n    struct inflate_state FAR *state;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    return state->mode == STORED && state->bits == 0;\n}\n\nint ZEXPORT inflateCopy(dest, source)\nz_streamp dest;\nz_streamp source;\n{\n    struct inflate_state FAR *state;\n    struct inflate_state FAR *copy;\n    unsigned char FAR *window;\n    unsigned wsize;\n\n    /* check input */\n    if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||\n        source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)\n        return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)source->state;\n\n    /* allocate space */\n    copy = (struct inflate_state FAR *)\n           ZALLOC(source, 1, sizeof(struct inflate_state));\n    if (copy == Z_NULL) return Z_MEM_ERROR;\n    window = Z_NULL;\n    if (state->window != Z_NULL) {\n        window = (unsigned char FAR *)\n                 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));\n        if (window == Z_NULL) {\n            ZFREE(source, copy);\n            return Z_MEM_ERROR;\n        }\n    }\n\n    /* copy state */\n    zmemcpy(dest, source, sizeof(z_stream));\n    zmemcpy(copy, state, sizeof(struct inflate_state));\n    if (state->lencode >= state->codes &&\n        state->lencode <= state->codes + ENOUGH - 1) {\n        copy->lencode = copy->codes + (state->lencode - state->codes);\n        copy->distcode = copy->codes + (state->distcode - state->codes);\n    }\n    copy->next = copy->codes + (state->next - state->codes);\n    if (window != Z_NULL) {\n        wsize = 1U << state->wbits;\n        zmemcpy(window, state->window, wsize);\n    }\n    copy->window = window;\n    dest->state = (struct internal_state FAR *)copy;\n    return Z_OK;\n}\n\nint ZEXPORT inflateUndermine(strm, subvert)\nz_streamp strm;\nint subvert;\n{\n    struct inflate_state FAR *state;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n    state->sane = !subvert;\n    return Z_OK;\n#else\n    state->sane = 1;\n    return Z_DATA_ERROR;\n#endif\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/inflate.h",
    "content": "/* inflate.h -- internal inflate state definition\n * Copyright (C) 1995-2006 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n/* define NO_GZIP when compiling if you want to disable gzip header and\n   trailer decoding by inflate().  NO_GZIP would be used to avoid linking in\n   the crc code when it is not needed.  For shared libraries, gzip decoding\n   should be left enabled. */\n#ifndef NO_GZIP\n#  define GUNZIP\n#endif\n\n/* Possible inflate modes between inflate() calls */\ntypedef enum {\n    HEAD,       /* i: waiting for magic header */\n    FLAGS,      /* i: waiting for method and flags (gzip) */\n    TIME,       /* i: waiting for modification time (gzip) */\n    OS,         /* i: waiting for extra flags and operating system (gzip) */\n    EXLEN,      /* i: waiting for extra length (gzip) */\n    EXTRA,      /* i: waiting for extra bytes (gzip) */\n    NAME,       /* i: waiting for end of file name (gzip) */\n    COMMENT,    /* i: waiting for end of comment (gzip) */\n    HCRC,       /* i: waiting for header crc (gzip) */\n    DICTID,     /* i: waiting for dictionary check value */\n    DICT,       /* waiting for inflateSetDictionary() call */\n        TYPE,       /* i: waiting for type bits, including last-flag bit */\n        TYPEDO,     /* i: same, but skip check to exit inflate on new block */\n        STORED,     /* i: waiting for stored size (length and complement) */\n        COPY,       /* i/o: waiting for input or output to copy stored block */\n        TABLE,      /* i: waiting for dynamic block table lengths */\n        LENLENS,    /* i: waiting for code length code lengths */\n        CODELENS,   /* i: waiting for length/lit and distance code lengths */\n            LEN,        /* i: waiting for length/lit code */\n            LENEXT,     /* i: waiting for length extra bits */\n            DIST,       /* i: waiting for distance code */\n            DISTEXT,    /* i: waiting for distance extra bits */\n            MATCH,      /* o: waiting for output space to copy string */\n            LIT,        /* o: waiting for output space to write literal */\n    CHECK,      /* i: waiting for 32-bit check value */\n    LENGTH,     /* i: waiting for 32-bit length (gzip) */\n    DONE,       /* finished check, done -- remain here until reset */\n    BAD,        /* got a data error -- remain here until reset */\n    MEM,        /* got an inflate() memory error -- remain here until reset */\n    SYNC        /* looking for synchronization bytes to restart inflate() */\n} inflate_mode;\n\n/*\n    State transitions between above modes -\n\n    (most modes can go to the BAD or MEM mode -- not shown for clarity)\n\n    Process header:\n        HEAD -> (gzip) or (zlib)\n        (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME\n        NAME -> COMMENT -> HCRC -> TYPE\n        (zlib) -> DICTID or TYPE\n        DICTID -> DICT -> TYPE\n    Read deflate blocks:\n            TYPE -> STORED or TABLE or LEN or CHECK\n            STORED -> COPY -> TYPE\n            TABLE -> LENLENS -> CODELENS -> LEN\n    Read deflate codes:\n                LEN -> LENEXT or LIT or TYPE\n                LENEXT -> DIST -> DISTEXT -> MATCH -> LEN\n                LIT -> LEN\n    Process trailer:\n        CHECK -> LENGTH -> DONE\n */\n\n/* state maintained between inflate() calls.  Approximately 10K bytes. */\nstruct inflate_state {\n    inflate_mode mode;          /* current inflate mode */\n    int last;                   /* true if processing last block */\n    int wrap;                   /* bit 0 true for zlib, bit 1 true for gzip */\n    int havedict;               /* true if dictionary provided */\n    int flags;                  /* gzip header method and flags (0 if zlib) */\n    unsigned dmax;              /* zlib header max distance (INFLATE_STRICT) */\n    unsigned long check;        /* protected copy of check value */\n    unsigned long total;        /* protected copy of output count */\n    gz_headerp head;            /* where to save gzip header information */\n        /* sliding window */\n    unsigned wbits;             /* log base 2 of requested window size */\n    unsigned wsize;             /* window size or zero if not using window */\n    unsigned whave;             /* valid bytes in the window */\n    unsigned write;             /* window write index */\n    unsigned char FAR *window;  /* allocated sliding window, if needed */\n        /* bit accumulator */\n    unsigned long hold;         /* input bit accumulator */\n    unsigned bits;              /* number of bits in \"in\" */\n        /* for string and stored block copying */\n    unsigned length;            /* literal or length of data to copy */\n    unsigned offset;            /* distance back to copy string from */\n        /* for table and code decoding */\n    unsigned extra;             /* extra bits needed */\n        /* fixed and dynamic code tables */\n    code const FAR *lencode;    /* starting table for length/literal codes */\n    code const FAR *distcode;   /* starting table for distance codes */\n    unsigned lenbits;           /* index bits for lencode */\n    unsigned distbits;          /* index bits for distcode */\n        /* dynamic table building */\n    unsigned ncode;             /* number of code length code lengths */\n    unsigned nlen;              /* number of length code lengths */\n    unsigned ndist;             /* number of distance code lengths */\n    unsigned have;              /* number of code lengths in lens[] */\n    code FAR *next;             /* next available space in codes[] */\n    unsigned short lens[320];   /* temporary storage for code lengths */\n    unsigned short work[288];   /* work area for code table building */\n    code codes[ENOUGH];         /* space for code tables */\n    int sane;                   /* if false, allow invalid distance too far */\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/inftrees.c",
    "content": "/* inftrees.c -- generate Huffman trees for efficient decoding\n * Copyright (C) 1995-2006 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"zutil.h\"\n#include \"inftrees.h\"\n\n#define MAXBITS 15\n\nconst char inflate_copyright[] =\n   \" inflate 1.2.3.3 Copyright 1995-2006 Mark Adler \";\n/*\n  If you use the zlib library in a product, an acknowledgment is welcome\n  in the documentation of your product. If for some reason you cannot\n  include such an acknowledgment, I would appreciate that you keep this\n  copyright string in the executable of your product.\n */\n\n/*\n   Build a set of tables to decode the provided canonical Huffman code.\n   The code lengths are lens[0..codes-1].  The result starts at *table,\n   whose indices are 0..2^bits-1.  work is a writable array of at least\n   lens shorts, which is used as a work area.  type is the type of code\n   to be generated, CODES, LENS, or DISTS.  On return, zero is success,\n   -1 is an invalid code, and +1 means that ENOUGH isn't enough.  table\n   on return points to the next available entry's address.  bits is the\n   requested root table index bits, and on return it is the actual root\n   table index bits.  It will differ if the request is greater than the\n   longest code or if it is less than the shortest code.\n */\nint inflate_table(type, lens, codes, table, bits, work)\ncodetype type;\nunsigned short FAR *lens;\nunsigned codes;\ncode FAR * FAR *table;\nunsigned FAR *bits;\nunsigned short FAR *work;\n{\n    unsigned len;               /* a code's length in bits */\n    unsigned sym;               /* index of code symbols */\n    unsigned min, max;          /* minimum and maximum code lengths */\n    unsigned root;              /* number of index bits for root table */\n    unsigned curr;              /* number of index bits for current table */\n    unsigned drop;              /* code bits to drop for sub-table */\n    int left;                   /* number of prefix codes available */\n    unsigned used;              /* code entries in table used */\n    unsigned huff;              /* Huffman code */\n    unsigned incr;              /* for incrementing code, index */\n    unsigned fill;              /* index for replicating entries */\n    unsigned low;               /* low bits for current root entry */\n    unsigned mask;              /* mask for low root bits */\n    code here;                  /* table entry for duplication */\n    code FAR *next;             /* next available space in table */\n    const unsigned short FAR *base;     /* base value table to use */\n    const unsigned short FAR *extra;    /* extra bits table to use */\n    int end;                    /* use base and extra for symbol > end */\n    unsigned short count[MAXBITS+1];    /* number of codes of each length */\n    unsigned short offs[MAXBITS+1];     /* offsets in table for each length */\n    static const unsigned short lbase[31] = { /* Length codes 257..285 base */\n        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};\n    static const unsigned short lext[31] = { /* Length codes 257..285 extra */\n        16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 203};\n    static const unsigned short dbase[32] = { /* Distance codes 0..29 base */\n        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n        8193, 12289, 16385, 24577, 0, 0};\n    static const unsigned short dext[32] = { /* Distance codes 0..29 extra */\n        16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n        23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n        28, 28, 29, 29, 64, 64};\n\n    /*\n       Process a set of code lengths to create a canonical Huffman code.  The\n       code lengths are lens[0..codes-1].  Each length corresponds to the\n       symbols 0..codes-1.  The Huffman code is generated by first sorting the\n       symbols by length from short to long, and retaining the symbol order\n       for codes with equal lengths.  Then the code starts with all zero bits\n       for the first code of the shortest length, and the codes are integer\n       increments for the same length, and zeros are appended as the length\n       increases.  For the deflate format, these bits are stored backwards\n       from their more natural integer increment ordering, and so when the\n       decoding tables are built in the large loop below, the integer codes\n       are incremented backwards.\n\n       This routine assumes, but does not check, that all of the entries in\n       lens[] are in the range 0..MAXBITS.  The caller must assure this.\n       1..MAXBITS is interpreted as that code length.  zero means that that\n       symbol does not occur in this code.\n\n       The codes are sorted by computing a count of codes for each length,\n       creating from that a table of starting indices for each length in the\n       sorted table, and then entering the symbols in order in the sorted\n       table.  The sorted table is work[], with that space being provided by\n       the caller.\n\n       The length counts are used for other purposes as well, i.e. finding\n       the minimum and maximum length codes, determining if there are any\n       codes at all, checking for a valid set of lengths, and looking ahead\n       at length counts to determine sub-table sizes when building the\n       decoding tables.\n     */\n\n    /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n    for (len = 0; len <= MAXBITS; len++)\n        count[len] = 0;\n    for (sym = 0; sym < codes; sym++)\n        count[lens[sym]]++;\n\n    /* bound code lengths, force root to be within code lengths */\n    root = *bits;\n    for (max = MAXBITS; max >= 1; max--)\n        if (count[max] != 0) break;\n    if (root > max) root = max;\n    if (max == 0) {                     /* no symbols to code at all */\n        here.op = (unsigned char)64;    /* invalid code marker */\n        here.bits = (unsigned char)1;\n        here.val = (unsigned short)0;\n        *(*table)++ = here;             /* make a table to force an error */\n        *(*table)++ = here;\n        *bits = 1;\n        return 0;     /* no symbols, but wait for decoding to report error */\n    }\n    for (min = 1; min <= MAXBITS; min++)\n        if (count[min] != 0) break;\n    if (root < min) root = min;\n\n    /* check for an over-subscribed or incomplete set of lengths */\n    left = 1;\n    for (len = 1; len <= MAXBITS; len++) {\n        left <<= 1;\n        left -= count[len];\n        if (left < 0) return -1;        /* over-subscribed */\n    }\n    if (left > 0 && (type == CODES || max != 1))\n        return -1;                      /* incomplete set */\n\n    /* generate offsets into symbol table for each length for sorting */\n    offs[1] = 0;\n    for (len = 1; len < MAXBITS; len++)\n        offs[len + 1] = offs[len] + count[len];\n\n    /* sort symbols by length, by symbol order within each length */\n    for (sym = 0; sym < codes; sym++)\n        if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;\n\n    /*\n       Create and fill in decoding tables.  In this loop, the table being\n       filled is at next and has curr index bits.  The code being used is huff\n       with length len.  That code is converted to an index by dropping drop\n       bits off of the bottom.  For codes where len is less than drop + curr,\n       those top drop + curr - len bits are incremented through all values to\n       fill the table with replicated entries.\n\n       root is the number of index bits for the root table.  When len exceeds\n       root, sub-tables are created pointed to by the root entry with an index\n       of the low root bits of huff.  This is saved in low to check for when a\n       new sub-table should be started.  drop is zero when the root table is\n       being filled, and drop is root when sub-tables are being filled.\n\n       When a new sub-table is needed, it is necessary to look ahead in the\n       code lengths to determine what size sub-table is needed.  The length\n       counts are used for this, and so count[] is decremented as codes are\n       entered in the tables.\n\n       used keeps track of how many table entries have been allocated from the\n       provided *table space.  It is checked when a LENS table is being made\n       against the space in *table, ENOUGH, minus the maximum space needed by\n       the worst case distance code, MAXD.  This should never happen, but the\n       sufficiency of ENOUGH has not been proven exhaustively, hence the check.\n       This assumes that when type == LENS, bits == 9.\n\n       sym increments through all symbols, and the loop terminates when\n       all codes of length max, i.e. all codes, have been processed.  This\n       routine permits incomplete codes, so another loop after this one fills\n       in the rest of the decoding tables with invalid code markers.\n     */\n\n    /* set up for code type */\n    switch (type) {\n    case CODES:\n        base = extra = work;    /* dummy value--not used */\n        end = 19;\n        break;\n    case LENS:\n        base = lbase;\n        base -= 257;\n        extra = lext;\n        extra -= 257;\n        end = 256;\n        break;\n    default:            /* DISTS */\n        base = dbase;\n        extra = dext;\n        end = -1;\n    }\n\n    /* initialize state for loop */\n    huff = 0;                   /* starting code */\n    sym = 0;                    /* starting code symbol */\n    len = min;                  /* starting code length */\n    next = *table;              /* current table to fill in */\n    curr = root;                /* current table index bits */\n    drop = 0;                   /* current bits to drop from code for index */\n    low = (unsigned)(-1);       /* trigger new sub-table when len > root */\n    used = 1U << root;          /* use root table entries */\n    mask = used - 1;            /* mask for comparing low */\n\n    /* check available table space */\n    if (type == LENS && used >= ENOUGH - MAXD)\n        return 1;\n\n    /* process all codes and make table entries */\n    for (;;) {\n        /* create table entry */\n        here.bits = (unsigned char)(len - drop);\n        if ((int)(work[sym]) < end) {\n            here.op = (unsigned char)0;\n            here.val = work[sym];\n        }\n        else if ((int)(work[sym]) > end) {\n            here.op = (unsigned char)(extra[work[sym]]);\n            here.val = base[work[sym]];\n        }\n        else {\n            here.op = (unsigned char)(32 + 64);         /* end of block */\n            here.val = 0;\n        }\n\n        /* replicate for those indices with low len bits equal to huff */\n        incr = 1U << (len - drop);\n        fill = 1U << curr;\n        min = fill;                 /* save offset to next table */\n        do {\n            fill -= incr;\n            next[(huff >> drop) + fill] = here;\n        } while (fill != 0);\n\n        /* backwards increment the len-bit code huff */\n        incr = 1U << (len - 1);\n        while (huff & incr)\n            incr >>= 1;\n        if (incr != 0) {\n            huff &= incr - 1;\n            huff += incr;\n        }\n        else\n            huff = 0;\n\n        /* go to next symbol, update count, len */\n        sym++;\n        if (--(count[len]) == 0) {\n            if (len == max) break;\n            len = lens[work[sym]];\n        }\n\n        /* create new sub-table if needed */\n        if (len > root && (huff & mask) != low) {\n            /* if first time, transition to sub-tables */\n            if (drop == 0)\n                drop = root;\n\n            /* increment past last table */\n            next += min;            /* here min is 1 << curr */\n\n            /* determine length of next table */\n            curr = len - drop;\n            left = (int)(1 << curr);\n            while (curr + drop < max) {\n                left -= count[curr + drop];\n                if (left <= 0) break;\n                curr++;\n                left <<= 1;\n            }\n\n            /* check for enough space */\n            used += 1U << curr;\n            if (type == LENS && used >= ENOUGH - MAXD)\n                return 1;\n\n            /* point entry in root table to sub-table */\n            low = huff & mask;\n            (*table)[low].op = (unsigned char)curr;\n            (*table)[low].bits = (unsigned char)root;\n            (*table)[low].val = (unsigned short)(next - *table);\n        }\n    }\n\n    /*\n       Fill in rest of table for incomplete codes.  This loop is similar to the\n       loop above in incrementing huff for table indices.  It is assumed that\n       len is equal to curr + drop, so there is no loop needed to increment\n       through high index bits.  When the current sub-table is filled, the loop\n       drops back to the root table to fill in any remaining entries there.\n     */\n    here.op = (unsigned char)64;                /* invalid code marker */\n    here.bits = (unsigned char)(len - drop);\n    here.val = (unsigned short)0;\n    while (huff != 0) {\n        /* when done with sub-table, drop back to root table */\n        if (drop != 0 && (huff & mask) != low) {\n            drop = 0;\n            len = root;\n            next = *table;\n            here.bits = (unsigned char)len;\n        }\n\n        /* put invalid code marker in table */\n        next[huff >> drop] = here;\n\n        /* backwards increment the len-bit code huff */\n        incr = 1U << (len - 1);\n        while (huff & incr)\n            incr >>= 1;\n        if (incr != 0) {\n            huff &= incr - 1;\n            huff += incr;\n        }\n        else\n            huff = 0;\n    }\n\n    /* set return parameters */\n    *table += used;\n    *bits = root;\n    return 0;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/inftrees.h",
    "content": "/* inftrees.h -- header to use inftrees.c\n * Copyright (C) 1995-2005 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n/* Structure for decoding tables.  Each entry provides either the\n   information needed to do the operation requested by the code that\n   indexed that table entry, or it provides a pointer to another\n   table that indexes more bits of the code.  op indicates whether\n   the entry is a pointer to another table, a literal, a length or\n   distance, an end-of-block, or an invalid code.  For a table\n   pointer, the low four bits of op is the number of index bits of\n   that table.  For a length or distance, the low four bits of op\n   is the number of extra bits to get after the code.  bits is\n   the number of bits in this code or part of the code to drop off\n   of the bit buffer.  val is the actual byte to output in the case\n   of a literal, the base length or distance, or the offset from\n   the current table to the next table.  Each entry is four bytes. */\ntypedef struct {\n    unsigned char op;           /* operation, extra bits, table bits */\n    unsigned char bits;         /* bits in this part of the code */\n    unsigned short val;         /* offset in table or code value */\n} code;\n\n/* op values as set by inflate_table():\n    00000000 - literal\n    0000tttt - table link, tttt != 0 is the number of table index bits\n    0001eeee - length or distance, eeee is the number of extra bits\n    01100000 - end of block\n    01000000 - invalid code\n */\n\n/* Maximum size of dynamic tree.  The maximum found in a long but non-\n   exhaustive search was 1444 code structures (852 for length/literals\n   and 592 for distances, the latter actually the result of an\n   exhaustive search).  The true maximum is not known, but the value\n   below is more than safe. */\n#define ENOUGH 2048\n#define MAXD 592\n\n/* Type of code to build for inftable() */\ntypedef enum {\n    CODES,\n    LENS,\n    DISTS\n} codetype;\n\nextern int inflate_table OF((codetype type, unsigned short FAR *lens,\n                             unsigned codes, code FAR * FAR *table,\n                             unsigned FAR *bits, unsigned short FAR *work));\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/trees.c",
    "content": "/* trees.c -- output deflated data using Huffman coding\n * Copyright (C) 1995-2006 Jean-loup Gailly\n * detect_data_type() function provided freely by Cosmin Truta, 2006\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/*\n *  ALGORITHM\n *\n *      The \"deflation\" process uses several Huffman trees. The more\n *      common source values are represented by shorter bit sequences.\n *\n *      Each code tree is stored in a compressed form which is itself\n * a Huffman encoding of the lengths of all the code strings (in\n * ascending order by source values).  The actual code strings are\n * reconstructed from the lengths in the inflate process, as described\n * in the deflate specification.\n *\n *  REFERENCES\n *\n *      Deutsch, L.P.,\"'Deflate' Compressed Data Format Specification\".\n *      Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc\n *\n *      Storer, James A.\n *          Data Compression:  Methods and Theory, pp. 49-50.\n *          Computer Science Press, 1988.  ISBN 0-7167-8156-5.\n *\n *      Sedgewick, R.\n *          Algorithms, p290.\n *          Addison-Wesley, 1983. ISBN 0-201-06672-6.\n */\n\n/* @(#) $Id$ */\n\n/* #define GEN_TREES_H */\n\n#include \"deflate.h\"\n\n#ifdef DEBUG\n#  include <ctype.h>\n#endif\n\n/* ===========================================================================\n * Constants\n */\n\n#define MAX_BL_BITS 7\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\n#define END_BLOCK 256\n/* end of block literal code */\n\n#define REP_3_6      16\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\n#define REPZ_3_10    17\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\n#define REPZ_11_138  18\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\nlocal const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */\n   = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};\n\nlocal const int extra_dbits[D_CODES] /* extra bits for each distance code */\n   = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};\n\nlocal const int extra_blbits[BL_CODES]/* extra bits for each bit length code */\n   = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};\n\nlocal const uch bl_order[BL_CODES]\n   = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n#define Buf_size (8 * 2*sizeof(char))\n/* Number of bits used within bi_buf. (bi_buf might be implemented on\n * more than 16 bits on some systems.)\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n#define DIST_CODE_LEN  512 /* see definition of array dist_code below */\n\n#if defined(GEN_TREES_H) || !defined(STDC)\n/* non ANSI compilers may not accept trees.h */\n\nlocal ct_data static_ltree[L_CODES+2];\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nlocal ct_data static_dtree[D_CODES];\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nuch _dist_code[DIST_CODE_LEN];\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nuch _length_code[MAX_MATCH-MIN_MATCH+1];\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nlocal int base_length[LENGTH_CODES];\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nlocal int base_dist[D_CODES];\n/* First normalized distance for each code (0 = distance of 1) */\n\n#else\n#  include \"trees.h\"\n#endif /* GEN_TREES_H */\n\nstruct static_tree_desc_s {\n    const ct_data *static_tree;  /* static tree or NULL */\n    const intf *extra_bits;      /* extra bits for each code or NULL */\n    int     extra_base;          /* base index for extra_bits */\n    int     elems;               /* max number of elements in the tree */\n    int     max_length;          /* max bit length for the codes */\n};\n\nlocal static_tree_desc  static_l_desc =\n{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};\n\nlocal static_tree_desc  static_d_desc =\n{static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS};\n\nlocal static_tree_desc  static_bl_desc =\n{(const ct_data *)0, extra_blbits, 0,   BL_CODES, MAX_BL_BITS};\n\n/* ===========================================================================\n * Local (static) routines in this file.\n */\n\nlocal void tr_static_init OF((void));\nlocal void init_block     OF((deflate_state *s));\nlocal void pqdownheap     OF((deflate_state *s, ct_data *tree, int k));\nlocal void gen_bitlen     OF((deflate_state *s, tree_desc *desc));\nlocal void gen_codes      OF((ct_data *tree, int max_code, ushf *bl_count));\nlocal void build_tree     OF((deflate_state *s, tree_desc *desc));\nlocal void scan_tree      OF((deflate_state *s, ct_data *tree, int max_code));\nlocal void send_tree      OF((deflate_state *s, ct_data *tree, int max_code));\nlocal int  build_bl_tree  OF((deflate_state *s));\nlocal void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,\n                              int blcodes));\nlocal void compress_block OF((deflate_state *s, ct_data *ltree,\n                              ct_data *dtree));\nlocal int  detect_data_type OF((deflate_state *s));\nlocal unsigned bi_reverse OF((unsigned value, int length));\nlocal void bi_windup      OF((deflate_state *s));\nlocal void bi_flush       OF((deflate_state *s));\nlocal void copy_block     OF((deflate_state *s, charf *buf, unsigned len,\n                              int header));\n\n#ifdef GEN_TREES_H\nlocal void gen_trees_header OF((void));\n#endif\n\n#ifndef DEBUG\n#  define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)\n   /* Send a code of the given tree. c and tree must not have side effects */\n\n#else /* DEBUG */\n#  define send_code(s, c, tree) \\\n     { if (z_verbose>2) fprintf(stderr,\"\\ncd %3d \",(c)); \\\n       send_bits(s, tree[c].Code, tree[c].Len); }\n#endif\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\n#define put_short(s, w) { \\\n    put_byte(s, (uch)((w) & 0xff)); \\\n    put_byte(s, (uch)((ush)(w) >> 8)); \\\n}\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\n#ifdef DEBUG\nlocal void send_bits      OF((deflate_state *s, int value, int length));\n\nlocal void send_bits(s, value, length)\n    deflate_state *s;\n    int value;  /* value to send */\n    int length; /* number of bits */\n{\n    Tracevv((stderr,\" l %2d v %4x \", length, value));\n    Assert(length > 0 && length <= 15, \"invalid length\");\n    s->bits_sent += (ulg)length;\n\n    /* If not enough room in bi_buf, use (valid) bits from bi_buf and\n     * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))\n     * unused bits in value.\n     */\n    if (s->bi_valid > (int)Buf_size - length) {\n        s->bi_buf |= (value << s->bi_valid);\n        put_short(s, s->bi_buf);\n        s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);\n        s->bi_valid += length - Buf_size;\n    } else {\n        s->bi_buf |= value << s->bi_valid;\n        s->bi_valid += length;\n    }\n}\n#else /* !DEBUG */\n\n#define send_bits(s, value, length) \\\n{ int len = length;\\\n  if (s->bi_valid > (int)Buf_size - len) {\\\n    int val = value;\\\n    s->bi_buf |= (val << s->bi_valid);\\\n    put_short(s, s->bi_buf);\\\n    s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\\\n    s->bi_valid += len - Buf_size;\\\n  } else {\\\n    s->bi_buf |= (value) << s->bi_valid;\\\n    s->bi_valid += len;\\\n  }\\\n}\n#endif /* DEBUG */\n\n\n/* the arguments must not have side effects */\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nlocal void tr_static_init()\n{\n#if defined(GEN_TREES_H) || !defined(STDC)\n    static int static_init_done = 0;\n    int n;        /* iterates over tree elements */\n    int bits;     /* bit counter */\n    int length;   /* length value */\n    int code;     /* code value */\n    int dist;     /* distance index */\n    ush bl_count[MAX_BITS+1];\n    /* number of codes at each bit length for an optimal tree */\n\n    if (static_init_done) return;\n\n    /* For some embedded targets, global variables are not initialized: */\n#ifdef NO_INIT_GLOBAL_POINTERS\n    static_l_desc.static_tree = static_ltree;\n    static_l_desc.extra_bits = extra_lbits;\n    static_d_desc.static_tree = static_dtree;\n    static_d_desc.extra_bits = extra_dbits;\n    static_bl_desc.extra_bits = extra_blbits;\n#endif\n\n    /* Initialize the mapping length (0..255) -> length code (0..28) */\n    length = 0;\n    for (code = 0; code < LENGTH_CODES-1; code++) {\n        base_length[code] = length;\n        for (n = 0; n < (1<<extra_lbits[code]); n++) {\n            _length_code[length++] = (uch)code;\n        }\n    }\n    Assert (length == 256, \"tr_static_init: length != 256\");\n    /* Note that the length 255 (match length 258) can be represented\n     * in two different ways: code 284 + 5 bits or code 285, so we\n     * overwrite length_code[255] to use the best encoding:\n     */\n    _length_code[length-1] = (uch)code;\n\n    /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n    dist = 0;\n    for (code = 0 ; code < 16; code++) {\n        base_dist[code] = dist;\n        for (n = 0; n < (1<<extra_dbits[code]); n++) {\n            _dist_code[dist++] = (uch)code;\n        }\n    }\n    Assert (dist == 256, \"tr_static_init: dist != 256\");\n    dist >>= 7; /* from now on, all distances are divided by 128 */\n    for ( ; code < D_CODES; code++) {\n        base_dist[code] = dist << 7;\n        for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {\n            _dist_code[256 + dist++] = (uch)code;\n        }\n    }\n    Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n    /* Construct the codes of the static literal tree */\n    for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;\n    n = 0;\n    while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;\n    while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;\n    while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;\n    while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;\n    /* Codes 286 and 287 do not exist, but we must include them in the\n     * tree construction to get a canonical Huffman tree (longest code\n     * all ones)\n     */\n    gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);\n\n    /* The static distance tree is trivial: */\n    for (n = 0; n < D_CODES; n++) {\n        static_dtree[n].Len = 5;\n        static_dtree[n].Code = bi_reverse((unsigned)n, 5);\n    }\n    static_init_done = 1;\n\n#  ifdef GEN_TREES_H\n    gen_trees_header();\n#  endif\n#endif /* defined(GEN_TREES_H) || !defined(STDC) */\n}\n\n/* ===========================================================================\n * Genererate the file trees.h describing the static trees.\n */\n#ifdef GEN_TREES_H\n#  ifndef DEBUG\n#    include <stdio.h>\n#  endif\n\n#  define SEPARATOR(i, last, width) \\\n      ((i) == (last)? \"\\n};\\n\\n\" :    \\\n       ((i) % (width) == (width)-1 ? \",\\n\" : \", \"))\n\nvoid gen_trees_header()\n{\n    FILE *header = fopen(\"trees.h\", \"w\");\n    int i;\n\n    Assert (header != NULL, \"Can't open trees.h\");\n    fprintf(header,\n            \"/* header created automatically with -DGEN_TREES_H */\\n\\n\");\n\n    fprintf(header, \"local const ct_data static_ltree[L_CODES+2] = {\\n\");\n    for (i = 0; i < L_CODES+2; i++) {\n        fprintf(header, \"{{%3u},{%3u}}%s\", static_ltree[i].Code,\n                static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));\n    }\n\n    fprintf(header, \"local const ct_data static_dtree[D_CODES] = {\\n\");\n    for (i = 0; i < D_CODES; i++) {\n        fprintf(header, \"{{%2u},{%2u}}%s\", static_dtree[i].Code,\n                static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));\n    }\n\n    fprintf(header, \"const uch _dist_code[DIST_CODE_LEN] = {\\n\");\n    for (i = 0; i < DIST_CODE_LEN; i++) {\n        fprintf(header, \"%2u%s\", _dist_code[i],\n                SEPARATOR(i, DIST_CODE_LEN-1, 20));\n    }\n\n    fprintf(header, \"const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\\n\");\n    for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {\n        fprintf(header, \"%2u%s\", _length_code[i],\n                SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));\n    }\n\n    fprintf(header, \"local const int base_length[LENGTH_CODES] = {\\n\");\n    for (i = 0; i < LENGTH_CODES; i++) {\n        fprintf(header, \"%1u%s\", base_length[i],\n                SEPARATOR(i, LENGTH_CODES-1, 20));\n    }\n\n    fprintf(header, \"local const int base_dist[D_CODES] = {\\n\");\n    for (i = 0; i < D_CODES; i++) {\n        fprintf(header, \"%5u%s\", base_dist[i],\n                SEPARATOR(i, D_CODES-1, 10));\n    }\n\n    fclose(header);\n}\n#endif /* GEN_TREES_H */\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nvoid _tr_init(s)\n    deflate_state *s;\n{\n    tr_static_init();\n\n    s->l_desc.dyn_tree = s->dyn_ltree;\n    s->l_desc.stat_desc = &static_l_desc;\n\n    s->d_desc.dyn_tree = s->dyn_dtree;\n    s->d_desc.stat_desc = &static_d_desc;\n\n    s->bl_desc.dyn_tree = s->bl_tree;\n    s->bl_desc.stat_desc = &static_bl_desc;\n\n    s->bi_buf = 0;\n    s->bi_valid = 0;\n    s->last_eob_len = 8; /* enough lookahead for inflate */\n#ifdef DEBUG\n    s->compressed_len = 0L;\n    s->bits_sent = 0L;\n#endif\n\n    /* Initialize the first block of the first file: */\n    init_block(s);\n}\n\n/* ===========================================================================\n * Initialize a new block.\n */\nlocal void init_block(s)\n    deflate_state *s;\n{\n    int n; /* iterates over tree elements */\n\n    /* Initialize the trees. */\n    for (n = 0; n < L_CODES;  n++) s->dyn_ltree[n].Freq = 0;\n    for (n = 0; n < D_CODES;  n++) s->dyn_dtree[n].Freq = 0;\n    for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;\n\n    s->dyn_ltree[END_BLOCK].Freq = 1;\n    s->opt_len = s->static_len = 0L;\n    s->last_lit = s->matches = 0;\n}\n\n#define SMALLEST 1\n/* Index within the heap array of least frequent node in the Huffman tree */\n\n\n/* ===========================================================================\n * Remove the smallest element from the heap and recreate the heap with\n * one less element. Updates heap and heap_len.\n */\n#define pqremove(s, tree, top) \\\n{\\\n    top = s->heap[SMALLEST]; \\\n    s->heap[SMALLEST] = s->heap[s->heap_len--]; \\\n    pqdownheap(s, tree, SMALLEST); \\\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\n#define smaller(tree, n, m, depth) \\\n   (tree[n].Freq < tree[m].Freq || \\\n   (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nlocal void pqdownheap(s, tree, k)\n    deflate_state *s;\n    ct_data *tree;  /* the tree to restore */\n    int k;               /* node to move down */\n{\n    int v = s->heap[k];\n    int j = k << 1;  /* left son of k */\n    while (j <= s->heap_len) {\n        /* Set j to the smallest of the two sons: */\n        if (j < s->heap_len &&\n            smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {\n            j++;\n        }\n        /* Exit if v is smaller than both sons */\n        if (smaller(tree, v, s->heap[j], s->depth)) break;\n\n        /* Exchange v with the smallest son */\n        s->heap[k] = s->heap[j];  k = j;\n\n        /* And continue down the tree, setting j to the left son of k */\n        j <<= 1;\n    }\n    s->heap[k] = v;\n}\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nlocal void gen_bitlen(s, desc)\n    deflate_state *s;\n    tree_desc *desc;    /* the tree descriptor */\n{\n    ct_data *tree        = desc->dyn_tree;\n    int max_code         = desc->max_code;\n    const ct_data *stree = desc->stat_desc->static_tree;\n    const intf *extra    = desc->stat_desc->extra_bits;\n    int base             = desc->stat_desc->extra_base;\n    int max_length       = desc->stat_desc->max_length;\n    int h;              /* heap index */\n    int n, m;           /* iterate over the tree elements */\n    int bits;           /* bit length */\n    int xbits;          /* extra bits */\n    ush f;              /* frequency */\n    int overflow = 0;   /* number of elements with bit length too large */\n\n    for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;\n\n    /* In a first pass, compute the optimal bit lengths (which may\n     * overflow in the case of the bit length tree).\n     */\n    tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */\n\n    for (h = s->heap_max+1; h < HEAP_SIZE; h++) {\n        n = s->heap[h];\n        bits = tree[tree[n].Dad].Len + 1;\n        if (bits > max_length) bits = max_length, overflow++;\n        tree[n].Len = (ush)bits;\n        /* We overwrite tree[n].Dad which is no longer needed */\n\n        if (n > max_code) continue; /* not a leaf node */\n\n        s->bl_count[bits]++;\n        xbits = 0;\n        if (n >= base) xbits = extra[n-base];\n        f = tree[n].Freq;\n        s->opt_len += (ulg)f * (bits + xbits);\n        if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);\n    }\n    if (overflow == 0) return;\n\n    Trace((stderr,\"\\nbit length overflow\\n\"));\n    /* This happens for example on obj2 and pic of the Calgary corpus */\n\n    /* Find the first bit length which could increase: */\n    do {\n        bits = max_length-1;\n        while (s->bl_count[bits] == 0) bits--;\n        s->bl_count[bits]--;      /* move one leaf down the tree */\n        s->bl_count[bits+1] += 2; /* move one overflow item as its brother */\n        s->bl_count[max_length]--;\n        /* The brother of the overflow item also moves one step up,\n         * but this does not affect bl_count[max_length]\n         */\n        overflow -= 2;\n    } while (overflow > 0);\n\n    /* Now recompute all bit lengths, scanning in increasing frequency.\n     * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n     * lengths instead of fixing only the wrong ones. This idea is taken\n     * from 'ar' written by Haruhiko Okumura.)\n     */\n    for (bits = max_length; bits != 0; bits--) {\n        n = s->bl_count[bits];\n        while (n != 0) {\n            m = s->heap[--h];\n            if (m > max_code) continue;\n            if ((unsigned) tree[m].Len != (unsigned) bits) {\n                Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n                s->opt_len += ((long)bits - (long)tree[m].Len)\n                              *(long)tree[m].Freq;\n                tree[m].Len = (ush)bits;\n            }\n            n--;\n        }\n    }\n}\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nlocal void gen_codes (tree, max_code, bl_count)\n    ct_data *tree;             /* the tree to decorate */\n    int max_code;              /* largest code with non zero frequency */\n    ushf *bl_count;            /* number of codes at each bit length */\n{\n    ush next_code[MAX_BITS+1]; /* next code value for each bit length */\n    ush code = 0;              /* running code value */\n    int bits;                  /* bit index */\n    int n;                     /* code index */\n\n    /* The distribution counts are first used to generate the code values\n     * without bit reversal.\n     */\n    for (bits = 1; bits <= MAX_BITS; bits++) {\n        next_code[bits] = code = (code + bl_count[bits-1]) << 1;\n    }\n    /* Check that the bit counts in bl_count are consistent. The last code\n     * must be all ones.\n     */\n    Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n            \"inconsistent bit counts\");\n    Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n    for (n = 0;  n <= max_code; n++) {\n        int len = tree[n].Len;\n        if (len == 0) continue;\n        /* Now reverse the bits */\n        tree[n].Code = bi_reverse(next_code[len]++, len);\n\n        Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n             n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n    }\n}\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nlocal void build_tree(s, desc)\n    deflate_state *s;\n    tree_desc *desc; /* the tree descriptor */\n{\n    ct_data *tree         = desc->dyn_tree;\n    const ct_data *stree  = desc->stat_desc->static_tree;\n    int elems             = desc->stat_desc->elems;\n    int n, m;          /* iterate over heap elements */\n    int max_code = -1; /* largest code with non zero frequency */\n    int node;          /* new node being created */\n\n    /* Construct the initial heap, with least frequent element in\n     * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n     * heap[0] is not used.\n     */\n    s->heap_len = 0, s->heap_max = HEAP_SIZE;\n\n    for (n = 0; n < elems; n++) {\n        if (tree[n].Freq != 0) {\n            s->heap[++(s->heap_len)] = max_code = n;\n            s->depth[n] = 0;\n        } else {\n            tree[n].Len = 0;\n        }\n    }\n\n    /* The pkzip format requires that at least one distance code exists,\n     * and that at least one bit should be sent even if there is only one\n     * possible code. So to avoid special checks later on we force at least\n     * two codes of non zero frequency.\n     */\n    while (s->heap_len < 2) {\n        node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);\n        tree[node].Freq = 1;\n        s->depth[node] = 0;\n        s->opt_len--; if (stree) s->static_len -= stree[node].Len;\n        /* node is 0 or 1 so it does not have extra bits */\n    }\n    desc->max_code = max_code;\n\n    /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n     * establish sub-heaps of increasing lengths:\n     */\n    for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);\n\n    /* Construct the Huffman tree by repeatedly combining the least two\n     * frequent nodes.\n     */\n    node = elems;              /* next internal node of the tree */\n    do {\n        pqremove(s, tree, n);  /* n = node of least frequency */\n        m = s->heap[SMALLEST]; /* m = node of next least frequency */\n\n        s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */\n        s->heap[--(s->heap_max)] = m;\n\n        /* Create a new node father of n and m */\n        tree[node].Freq = tree[n].Freq + tree[m].Freq;\n        s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ?\n                                s->depth[n] : s->depth[m]) + 1);\n        tree[n].Dad = tree[m].Dad = (ush)node;\n#ifdef DUMP_BL_TREE\n        if (tree == s->bl_tree) {\n            fprintf(stderr,\"\\nnode %d(%d), sons %d(%d) %d(%d)\",\n                    node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);\n        }\n#endif\n        /* and insert the new node in the heap */\n        s->heap[SMALLEST] = node++;\n        pqdownheap(s, tree, SMALLEST);\n\n    } while (s->heap_len >= 2);\n\n    s->heap[--(s->heap_max)] = s->heap[SMALLEST];\n\n    /* At this point, the fields freq and dad are set. We can now\n     * generate the bit lengths.\n     */\n    gen_bitlen(s, (tree_desc *)desc);\n\n    /* The field len is now set, we can generate the bit codes */\n    gen_codes ((ct_data *)tree, max_code, s->bl_count);\n}\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nlocal void scan_tree (s, tree, max_code)\n    deflate_state *s;\n    ct_data *tree;   /* the tree to be scanned */\n    int max_code;    /* and its largest code of non zero frequency */\n{\n    int n;                     /* iterates over all tree elements */\n    int prevlen = -1;          /* last emitted length */\n    int curlen;                /* length of current code */\n    int nextlen = tree[0].Len; /* length of next code */\n    int count = 0;             /* repeat count of the current code */\n    int max_count = 7;         /* max repeat count */\n    int min_count = 4;         /* min repeat count */\n\n    if (nextlen == 0) max_count = 138, min_count = 3;\n    tree[max_code+1].Len = (ush)0xffff; /* guard */\n\n    for (n = 0; n <= max_code; n++) {\n        curlen = nextlen; nextlen = tree[n+1].Len;\n        if (++count < max_count && curlen == nextlen) {\n            continue;\n        } else if (count < min_count) {\n            s->bl_tree[curlen].Freq += count;\n        } else if (curlen != 0) {\n            if (curlen != prevlen) s->bl_tree[curlen].Freq++;\n            s->bl_tree[REP_3_6].Freq++;\n        } else if (count <= 10) {\n            s->bl_tree[REPZ_3_10].Freq++;\n        } else {\n            s->bl_tree[REPZ_11_138].Freq++;\n        }\n        count = 0; prevlen = curlen;\n        if (nextlen == 0) {\n            max_count = 138, min_count = 3;\n        } else if (curlen == nextlen) {\n            max_count = 6, min_count = 3;\n        } else {\n            max_count = 7, min_count = 4;\n        }\n    }\n}\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nlocal void send_tree (s, tree, max_code)\n    deflate_state *s;\n    ct_data *tree; /* the tree to be scanned */\n    int max_code;       /* and its largest code of non zero frequency */\n{\n    int n;                     /* iterates over all tree elements */\n    int prevlen = -1;          /* last emitted length */\n    int curlen;                /* length of current code */\n    int nextlen = tree[0].Len; /* length of next code */\n    int count = 0;             /* repeat count of the current code */\n    int max_count = 7;         /* max repeat count */\n    int min_count = 4;         /* min repeat count */\n\n    /* tree[max_code+1].Len = -1; */  /* guard already set */\n    if (nextlen == 0) max_count = 138, min_count = 3;\n\n    for (n = 0; n <= max_code; n++) {\n        curlen = nextlen; nextlen = tree[n+1].Len;\n        if (++count < max_count && curlen == nextlen) {\n            continue;\n        } else if (count < min_count) {\n            do { send_code(s, curlen, s->bl_tree); } while (--count != 0);\n\n        } else if (curlen != 0) {\n            if (curlen != prevlen) {\n                send_code(s, curlen, s->bl_tree); count--;\n            }\n            Assert(count >= 3 && count <= 6, \" 3_6?\");\n            send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);\n\n        } else if (count <= 10) {\n            send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);\n\n        } else {\n            send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);\n        }\n        count = 0; prevlen = curlen;\n        if (nextlen == 0) {\n            max_count = 138, min_count = 3;\n        } else if (curlen == nextlen) {\n            max_count = 6, min_count = 3;\n        } else {\n            max_count = 7, min_count = 4;\n        }\n    }\n}\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nlocal int build_bl_tree(s)\n    deflate_state *s;\n{\n    int max_blindex;  /* index of last bit length code of non zero freq */\n\n    /* Determine the bit length frequencies for literal and distance trees */\n    scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);\n    scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);\n\n    /* Build the bit length tree: */\n    build_tree(s, (tree_desc *)(&(s->bl_desc)));\n    /* opt_len now includes the length of the tree representations, except\n     * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n     */\n\n    /* Determine the number of bit length codes to send. The pkzip format\n     * requires that at least 4 bit length codes be sent. (appnote.txt says\n     * 3 but the actual value used is 4.)\n     */\n    for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {\n        if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;\n    }\n    /* Update opt_len to include the bit length tree and counts */\n    s->opt_len += 3*(max_blindex+1) + 5+5+4;\n    Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n            s->opt_len, s->static_len));\n\n    return max_blindex;\n}\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nlocal void send_all_trees(s, lcodes, dcodes, blcodes)\n    deflate_state *s;\n    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n    int rank;                    /* index in bl_order */\n\n    Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n    Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n            \"too many codes\");\n    Tracev((stderr, \"\\nbl counts: \"));\n    send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */\n    send_bits(s, dcodes-1,   5);\n    send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */\n    for (rank = 0; rank < blcodes; rank++) {\n        Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n        send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);\n    }\n    Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n    send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */\n    Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n    send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */\n    Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n/* ===========================================================================\n * Send a stored block\n */\nvoid _tr_stored_block(s, buf, stored_len, eof)\n    deflate_state *s;\n    charf *buf;       /* input block */\n    ulg stored_len;   /* length of input block */\n    int eof;          /* true if this is the last block for a file */\n{\n    send_bits(s, (STORED_BLOCK<<1)+eof, 3);  /* send block type */\n#ifdef DEBUG\n    s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;\n    s->compressed_len += (stored_len + 4) << 3;\n#endif\n    copy_block(s, buf, (unsigned)stored_len, 1); /* with header */\n}\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n * The current inflate code requires 9 bits of lookahead. If the\n * last two codes for the previous block (real code plus EOB) were coded\n * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode\n * the last real code. In this case we send two empty static blocks instead\n * of one. (There are no problems if the previous block is stored or fixed.)\n * To simplify the code, we assume the worst case of last real code encoded\n * on one bit only.\n */\nvoid _tr_align(s)\n    deflate_state *s;\n{\n    send_bits(s, STATIC_TREES<<1, 3);\n    send_code(s, END_BLOCK, static_ltree);\n#ifdef DEBUG\n    s->compressed_len += 10L; /* 3 for block type, 7 for EOB */\n#endif\n    bi_flush(s);\n    /* Of the 10 bits for the empty block, we have already sent\n     * (10 - bi_valid) bits. The lookahead for the last real code (before\n     * the EOB of the previous block) was thus at least one plus the length\n     * of the EOB plus what we have just sent of the empty static block.\n     */\n    if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {\n        send_bits(s, STATIC_TREES<<1, 3);\n        send_code(s, END_BLOCK, static_ltree);\n#ifdef DEBUG\n        s->compressed_len += 10L;\n#endif\n        bi_flush(s);\n    }\n    s->last_eob_len = 7;\n}\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nvoid _tr_flush_block(s, buf, stored_len, eof)\n    deflate_state *s;\n    charf *buf;       /* input block, or NULL if too old */\n    ulg stored_len;   /* length of input block */\n    int eof;          /* true if this is the last block for a file */\n{\n    ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n    int max_blindex = 0;  /* index of last bit length code of non zero freq */\n\n    /* Build the Huffman trees unless a stored block is forced */\n    if (s->level > 0) {\n\n        /* Check if the file is binary or text */\n        if (s->strm->data_type == Z_UNKNOWN)\n            s->strm->data_type = detect_data_type(s);\n\n        /* Construct the literal and distance trees */\n        build_tree(s, (tree_desc *)(&(s->l_desc)));\n        Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n                s->static_len));\n\n        build_tree(s, (tree_desc *)(&(s->d_desc)));\n        Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n                s->static_len));\n        /* At this point, opt_len and static_len are the total bit lengths of\n         * the compressed block data, excluding the tree representations.\n         */\n\n        /* Build the bit length tree for the above two trees, and get the index\n         * in bl_order of the last bit length code to send.\n         */\n        max_blindex = build_bl_tree(s);\n\n        /* Determine the best encoding. Compute the block lengths in bytes. */\n        opt_lenb = (s->opt_len+3+7)>>3;\n        static_lenb = (s->static_len+3+7)>>3;\n\n        Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n                opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n                s->last_lit));\n\n        if (static_lenb <= opt_lenb) opt_lenb = static_lenb;\n\n    } else {\n        Assert(buf != (char*)0, \"lost buf\");\n        opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n    }\n\n#ifdef FORCE_STORED\n    if (buf != (char*)0) { /* force stored block */\n#else\n    if (stored_len+4 <= opt_lenb && buf != (char*)0) {\n                       /* 4: two words for the lengths */\n#endif\n        /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n         * Otherwise we can't have processed more than WSIZE input bytes since\n         * the last block flush, because compression would have been\n         * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n         * transform a block into a stored block.\n         */\n        _tr_stored_block(s, buf, stored_len, eof);\n\n#ifdef FORCE_STATIC\n    } else if (static_lenb >= 0) { /* force static trees */\n#else\n    } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {\n#endif\n        send_bits(s, (STATIC_TREES<<1)+eof, 3);\n        compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);\n#ifdef DEBUG\n        s->compressed_len += 3 + s->static_len;\n#endif\n    } else {\n        send_bits(s, (DYN_TREES<<1)+eof, 3);\n        send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,\n                       max_blindex+1);\n        compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);\n#ifdef DEBUG\n        s->compressed_len += 3 + s->opt_len;\n#endif\n    }\n    Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n    /* The above check is made mod 2^32, for files larger than 512 MB\n     * and uLong implemented on 32 bits.\n     */\n    init_block(s);\n\n    if (eof) {\n        bi_windup(s);\n#ifdef DEBUG\n        s->compressed_len += 7;  /* align on byte boundary */\n#endif\n    }\n    Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n           s->compressed_len-7*eof));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nint _tr_tally (s, dist, lc)\n    deflate_state *s;\n    unsigned dist;  /* distance of matched string */\n    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n    s->d_buf[s->last_lit] = (ush)dist;\n    s->l_buf[s->last_lit++] = (uch)lc;\n    if (dist == 0) {\n        /* lc is the unmatched char */\n        s->dyn_ltree[lc].Freq++;\n    } else {\n        s->matches++;\n        /* Here, lc is the match length - MIN_MATCH */\n        dist--;             /* dist = match distance - 1 */\n        Assert((ush)dist < (ush)MAX_DIST(s) &&\n               (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n               (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n        s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;\n        s->dyn_dtree[d_code(dist)].Freq++;\n    }\n\n#ifdef TRUNCATE_BLOCK\n    /* Try to guess if it is profitable to stop the current block here */\n    if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {\n        /* Compute an upper bound for the compressed length */\n        ulg out_length = (ulg)s->last_lit*8L;\n        ulg in_length = (ulg)((long)s->strstart - s->block_start);\n        int dcode;\n        for (dcode = 0; dcode < D_CODES; dcode++) {\n            out_length += (ulg)s->dyn_dtree[dcode].Freq *\n                (5L+extra_dbits[dcode]);\n        }\n        out_length >>= 3;\n        Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n               s->last_lit, in_length, out_length,\n               100L - out_length*100L/in_length));\n        if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;\n    }\n#endif\n    return (s->last_lit == s->lit_bufsize-1);\n    /* We avoid equality with lit_bufsize because of wraparound at 64K\n     * on 16 bit machines and because stored blocks are restricted to\n     * 64K-1 bytes.\n     */\n}\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nlocal void compress_block(s, ltree, dtree)\n    deflate_state *s;\n    ct_data *ltree; /* literal tree */\n    ct_data *dtree; /* distance tree */\n{\n    unsigned dist;      /* distance of matched string */\n    int lc;             /* match length or unmatched char (if dist == 0) */\n    unsigned lx = 0;    /* running index in l_buf */\n    unsigned code;      /* the code to send */\n    int extra;          /* number of extra bits to send */\n\n    if (s->last_lit != 0) do {\n        dist = s->d_buf[lx];\n        lc = s->l_buf[lx++];\n        if (dist == 0) {\n            send_code(s, lc, ltree); /* send a literal byte */\n            Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n        } else {\n            /* Here, lc is the match length - MIN_MATCH */\n            code = _length_code[lc];\n            send_code(s, code+LITERALS+1, ltree); /* send the length code */\n            extra = extra_lbits[code];\n            if (extra != 0) {\n                lc -= base_length[code];\n                send_bits(s, lc, extra);       /* send the extra length bits */\n            }\n            dist--; /* dist is now the match distance - 1 */\n            code = d_code(dist);\n            Assert (code < D_CODES, \"bad d_code\");\n\n            send_code(s, code, dtree);       /* send the distance code */\n            extra = extra_dbits[code];\n            if (extra != 0) {\n                dist -= base_dist[code];\n                send_bits(s, dist, extra);   /* send the extra distance bits */\n            }\n        } /* literal or match pair ? */\n\n        /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n        Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n               \"pendingBuf overflow\");\n\n    } while (lx < s->last_lit);\n\n    send_code(s, END_BLOCK, ltree);\n    s->last_eob_len = ltree[END_BLOCK].Len;\n}\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"black list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nlocal int detect_data_type(s)\n    deflate_state *s;\n{\n    /* black_mask is the bit mask of black-listed bytes\n     * set bits 0..6, 14..25, and 28..31\n     * 0xf3ffc07f = binary 11110011111111111100000001111111\n     */\n    unsigned long black_mask = 0xf3ffc07fUL;\n    int n;\n\n    /* Check for non-textual (\"black-listed\") bytes. */\n    for (n = 0; n <= 31; n++, black_mask >>= 1)\n        if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0))\n            return Z_BINARY;\n\n    /* Check for textual (\"white-listed\") bytes. */\n    if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0\n            || s->dyn_ltree[13].Freq != 0)\n        return Z_TEXT;\n    for (n = 32; n < LITERALS; n++)\n        if (s->dyn_ltree[n].Freq != 0)\n            return Z_TEXT;\n\n    /* There are no \"black-listed\" or \"white-listed\" bytes:\n     * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n     */\n    return Z_BINARY;\n}\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nlocal unsigned bi_reverse(code, len)\n    unsigned code; /* the value to invert */\n    int len;       /* its bit length */\n{\n    register unsigned res = 0;\n    do {\n        res |= code & 1;\n        code >>= 1, res <<= 1;\n    } while (--len > 0);\n    return res >> 1;\n}\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nlocal void bi_flush(s)\n    deflate_state *s;\n{\n    if (s->bi_valid == 16) {\n        put_short(s, s->bi_buf);\n        s->bi_buf = 0;\n        s->bi_valid = 0;\n    } else if (s->bi_valid >= 8) {\n        put_byte(s, (Byte)s->bi_buf);\n        s->bi_buf >>= 8;\n        s->bi_valid -= 8;\n    }\n}\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nlocal void bi_windup(s)\n    deflate_state *s;\n{\n    if (s->bi_valid > 8) {\n        put_short(s, s->bi_buf);\n    } else if (s->bi_valid > 0) {\n        put_byte(s, (Byte)s->bi_buf);\n    }\n    s->bi_buf = 0;\n    s->bi_valid = 0;\n#ifdef DEBUG\n    s->bits_sent = (s->bits_sent+7) & ~7;\n#endif\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nlocal void copy_block(s, buf, len, header)\n    deflate_state *s;\n    charf    *buf;    /* the input data */\n    unsigned len;     /* its length */\n    int      header;  /* true if block header must be written */\n{\n    bi_windup(s);        /* align on byte boundary */\n    s->last_eob_len = 8; /* enough lookahead for inflate */\n\n    if (header) {\n        put_short(s, (ush)len);\n        put_short(s, (ush)~len);\n#ifdef DEBUG\n        s->bits_sent += 2*16;\n#endif\n    }\n#ifdef DEBUG\n    s->bits_sent += (ulg)len<<3;\n#endif\n    while (len--) {\n        put_byte(s, *buf++);\n    }\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/trees.h",
    "content": "/* header created automatically with -DGEN_TREES_H */\n\nlocal const ct_data static_ltree[L_CODES + 2] =\n{\n    {{ 12}, {  8}}, {{140}, {  8}}, {{ 76}, {  8}}, {{204}, {  8}}, {{ 44}, {  8}},\n    {{172}, {  8}}, {{108}, {  8}}, {{236}, {  8}}, {{ 28}, {  8}}, {{156}, {  8}},\n    {{ 92}, {  8}}, {{220}, {  8}}, {{ 60}, {  8}}, {{188}, {  8}}, {{124}, {  8}},\n    {{252}, {  8}}, {{  2}, {  8}}, {{130}, {  8}}, {{ 66}, {  8}}, {{194}, {  8}},\n    {{ 34}, {  8}}, {{162}, {  8}}, {{ 98}, {  8}}, {{226}, {  8}}, {{ 18}, {  8}},\n    {{146}, {  8}}, {{ 82}, {  8}}, {{210}, {  8}}, {{ 50}, {  8}}, {{178}, {  8}},\n    {{114}, {  8}}, {{242}, {  8}}, {{ 10}, {  8}}, {{138}, {  8}}, {{ 74}, {  8}},\n    {{202}, {  8}}, {{ 42}, {  8}}, {{170}, {  8}}, {{106}, {  8}}, {{234}, {  8}},\n    {{ 26}, {  8}}, {{154}, {  8}}, {{ 90}, {  8}}, {{218}, {  8}}, {{ 58}, {  8}},\n    {{186}, {  8}}, {{122}, {  8}}, {{250}, {  8}}, {{  6}, {  8}}, {{134}, {  8}},\n    {{ 70}, {  8}}, {{198}, {  8}}, {{ 38}, {  8}}, {{166}, {  8}}, {{102}, {  8}},\n    {{230}, {  8}}, {{ 22}, {  8}}, {{150}, {  8}}, {{ 86}, {  8}}, {{214}, {  8}},\n    {{ 54}, {  8}}, {{182}, {  8}}, {{118}, {  8}}, {{246}, {  8}}, {{ 14}, {  8}},\n    {{142}, {  8}}, {{ 78}, {  8}}, {{206}, {  8}}, {{ 46}, {  8}}, {{174}, {  8}},\n    {{110}, {  8}}, {{238}, {  8}}, {{ 30}, {  8}}, {{158}, {  8}}, {{ 94}, {  8}},\n    {{222}, {  8}}, {{ 62}, {  8}}, {{190}, {  8}}, {{126}, {  8}}, {{254}, {  8}},\n    {{  1}, {  8}}, {{129}, {  8}}, {{ 65}, {  8}}, {{193}, {  8}}, {{ 33}, {  8}},\n    {{161}, {  8}}, {{ 97}, {  8}}, {{225}, {  8}}, {{ 17}, {  8}}, {{145}, {  8}},\n    {{ 81}, {  8}}, {{209}, {  8}}, {{ 49}, {  8}}, {{177}, {  8}}, {{113}, {  8}},\n    {{241}, {  8}}, {{  9}, {  8}}, {{137}, {  8}}, {{ 73}, {  8}}, {{201}, {  8}},\n    {{ 41}, {  8}}, {{169}, {  8}}, {{105}, {  8}}, {{233}, {  8}}, {{ 25}, {  8}},\n    {{153}, {  8}}, {{ 89}, {  8}}, {{217}, {  8}}, {{ 57}, {  8}}, {{185}, {  8}},\n    {{121}, {  8}}, {{249}, {  8}}, {{  5}, {  8}}, {{133}, {  8}}, {{ 69}, {  8}},\n    {{197}, {  8}}, {{ 37}, {  8}}, {{165}, {  8}}, {{101}, {  8}}, {{229}, {  8}},\n    {{ 21}, {  8}}, {{149}, {  8}}, {{ 85}, {  8}}, {{213}, {  8}}, {{ 53}, {  8}},\n    {{181}, {  8}}, {{117}, {  8}}, {{245}, {  8}}, {{ 13}, {  8}}, {{141}, {  8}},\n    {{ 77}, {  8}}, {{205}, {  8}}, {{ 45}, {  8}}, {{173}, {  8}}, {{109}, {  8}},\n    {{237}, {  8}}, {{ 29}, {  8}}, {{157}, {  8}}, {{ 93}, {  8}}, {{221}, {  8}},\n    {{ 61}, {  8}}, {{189}, {  8}}, {{125}, {  8}}, {{253}, {  8}}, {{ 19}, {  9}},\n    {{275}, {  9}}, {{147}, {  9}}, {{403}, {  9}}, {{ 83}, {  9}}, {{339}, {  9}},\n    {{211}, {  9}}, {{467}, {  9}}, {{ 51}, {  9}}, {{307}, {  9}}, {{179}, {  9}},\n    {{435}, {  9}}, {{115}, {  9}}, {{371}, {  9}}, {{243}, {  9}}, {{499}, {  9}},\n    {{ 11}, {  9}}, {{267}, {  9}}, {{139}, {  9}}, {{395}, {  9}}, {{ 75}, {  9}},\n    {{331}, {  9}}, {{203}, {  9}}, {{459}, {  9}}, {{ 43}, {  9}}, {{299}, {  9}},\n    {{171}, {  9}}, {{427}, {  9}}, {{107}, {  9}}, {{363}, {  9}}, {{235}, {  9}},\n    {{491}, {  9}}, {{ 27}, {  9}}, {{283}, {  9}}, {{155}, {  9}}, {{411}, {  9}},\n    {{ 91}, {  9}}, {{347}, {  9}}, {{219}, {  9}}, {{475}, {  9}}, {{ 59}, {  9}},\n    {{315}, {  9}}, {{187}, {  9}}, {{443}, {  9}}, {{123}, {  9}}, {{379}, {  9}},\n    {{251}, {  9}}, {{507}, {  9}}, {{  7}, {  9}}, {{263}, {  9}}, {{135}, {  9}},\n    {{391}, {  9}}, {{ 71}, {  9}}, {{327}, {  9}}, {{199}, {  9}}, {{455}, {  9}},\n    {{ 39}, {  9}}, {{295}, {  9}}, {{167}, {  9}}, {{423}, {  9}}, {{103}, {  9}},\n    {{359}, {  9}}, {{231}, {  9}}, {{487}, {  9}}, {{ 23}, {  9}}, {{279}, {  9}},\n    {{151}, {  9}}, {{407}, {  9}}, {{ 87}, {  9}}, {{343}, {  9}}, {{215}, {  9}},\n    {{471}, {  9}}, {{ 55}, {  9}}, {{311}, {  9}}, {{183}, {  9}}, {{439}, {  9}},\n    {{119}, {  9}}, {{375}, {  9}}, {{247}, {  9}}, {{503}, {  9}}, {{ 15}, {  9}},\n    {{271}, {  9}}, {{143}, {  9}}, {{399}, {  9}}, {{ 79}, {  9}}, {{335}, {  9}},\n    {{207}, {  9}}, {{463}, {  9}}, {{ 47}, {  9}}, {{303}, {  9}}, {{175}, {  9}},\n    {{431}, {  9}}, {{111}, {  9}}, {{367}, {  9}}, {{239}, {  9}}, {{495}, {  9}},\n    {{ 31}, {  9}}, {{287}, {  9}}, {{159}, {  9}}, {{415}, {  9}}, {{ 95}, {  9}},\n    {{351}, {  9}}, {{223}, {  9}}, {{479}, {  9}}, {{ 63}, {  9}}, {{319}, {  9}},\n    {{191}, {  9}}, {{447}, {  9}}, {{127}, {  9}}, {{383}, {  9}}, {{255}, {  9}},\n    {{511}, {  9}}, {{  0}, {  7}}, {{ 64}, {  7}}, {{ 32}, {  7}}, {{ 96}, {  7}},\n    {{ 16}, {  7}}, {{ 80}, {  7}}, {{ 48}, {  7}}, {{112}, {  7}}, {{  8}, {  7}},\n    {{ 72}, {  7}}, {{ 40}, {  7}}, {{104}, {  7}}, {{ 24}, {  7}}, {{ 88}, {  7}},\n    {{ 56}, {  7}}, {{120}, {  7}}, {{  4}, {  7}}, {{ 68}, {  7}}, {{ 36}, {  7}},\n    {{100}, {  7}}, {{ 20}, {  7}}, {{ 84}, {  7}}, {{ 52}, {  7}}, {{116}, {  7}},\n    {{  3}, {  8}}, {{131}, {  8}}, {{ 67}, {  8}}, {{195}, {  8}}, {{ 35}, {  8}},\n    {{163}, {  8}}, {{ 99}, {  8}}, {{227}, {  8}}\n};\n\nlocal const ct_data static_dtree[D_CODES] =\n{\n    {{ 0}, { 5}}, {{16}, { 5}}, {{ 8}, { 5}}, {{24}, { 5}}, {{ 4}, { 5}},\n    {{20}, { 5}}, {{12}, { 5}}, {{28}, { 5}}, {{ 2}, { 5}}, {{18}, { 5}},\n    {{10}, { 5}}, {{26}, { 5}}, {{ 6}, { 5}}, {{22}, { 5}}, {{14}, { 5}},\n    {{30}, { 5}}, {{ 1}, { 5}}, {{17}, { 5}}, {{ 9}, { 5}}, {{25}, { 5}},\n    {{ 5}, { 5}}, {{21}, { 5}}, {{13}, { 5}}, {{29}, { 5}}, {{ 3}, { 5}},\n    {{19}, { 5}}, {{11}, { 5}}, {{27}, { 5}}, {{ 7}, { 5}}, {{23}, { 5}}\n};\n\nconst uch _dist_code[DIST_CODE_LEN] =\n{\n    0,  1,  2,  3,  4,  4,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  8,\n    8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,\n    11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,\n    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,\n    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,\n    13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 16, 17,\n    18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,\n    23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n    24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,\n    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,\n    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,\n    27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29\n};\n\nconst uch _length_code[MAX_MATCH - MIN_MATCH + 1] =\n{\n    0,  1,  2,  3,  4,  5,  6,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 12, 12,\n    13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,\n    17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,\n    19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\n    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,\n    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,\n    23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,\n    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,\n    26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,\n    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28\n};\n\nlocal const int base_length[LENGTH_CODES] =\n{\n    0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,\n    64, 80, 96, 112, 128, 160, 192, 224, 0\n};\n\nlocal const int base_dist[D_CODES] =\n{\n    0,     1,     2,     3,     4,     6,     8,    12,    16,    24,\n    32,    48,    64,    96,   128,   192,   256,   384,   512,   768,\n    1024,  1536,  2048,  3072,  4096,  6144,  8192, 12288, 16384, 24576\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/uncompr.c",
    "content": "/* uncompr.c -- decompress a memory buffer\n * Copyright (C) 1995-2003 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#define ZLIB_INTERNAL\n#include \"zlib.h\"\n\n/* ===========================================================================\n     Decompresses the source buffer into the destination buffer.  sourceLen is\n   the byte length of the source buffer. Upon entry, destLen is the total\n   size of the destination buffer, which must be large enough to hold the\n   entire uncompressed data. (The size of the uncompressed data must have\n   been saved previously by the compressor and transmitted to the decompressor\n   by some mechanism outside the scope of this compression library.)\n   Upon exit, destLen is the actual size of the compressed buffer.\n     This function can be used to decompress a whole file at once if the\n   input file is mmap'ed.\n\n     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_BUF_ERROR if there was not enough room in the output\n   buffer, or Z_DATA_ERROR if the input data was corrupted.\n*/\nint ZEXPORT uncompress (dest, destLen, source, sourceLen)\n    Bytef *dest;\n    uLongf *destLen;\n    const Bytef *source;\n    uLong sourceLen;\n{\n    z_stream stream;\n    int err;\n\n    stream.next_in = (Bytef*)source;\n    stream.avail_in = (uInt)sourceLen;\n    /* Check for source > 64K on 16-bit machine: */\n    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;\n\n    stream.next_out = dest;\n    stream.avail_out = (uInt)*destLen;\n    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;\n\n    stream.zalloc = (alloc_func)0;\n    stream.zfree = (free_func)0;\n\n    err = inflateInit(&stream);\n    if (err != Z_OK) return err;\n\n    err = inflate(&stream, Z_FINISH);\n    if (err != Z_STREAM_END) {\n        inflateEnd(&stream);\n        if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))\n            return Z_DATA_ERROR;\n        return err;\n    }\n    *destLen = stream.total_out;\n\n    err = inflateEnd(&stream);\n    return err;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/zconf.h",
    "content": "/* zconf.h -- configuration of the zlib compression library\n * Copyright (C) 1995-2006 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#ifndef ZCONF_H\n#define ZCONF_H\n\n/*\n * If you *really* need a unique prefix for all types and library functions,\n * compile with -DZ_PREFIX. The \"standard\" zlib should be compiled without it.\n * Even better than compiling with -DZ_PREFIX would be to use configure to set\n * this permanently in zconf.h using \"./configure --zprefix\".\n */\n#define Z_PREFIX 1\n#ifdef Z_PREFIX     /* may be set to #if 1 by ./configure */\n\n/* all linked symbols */\n#  define _dist_code            il2cpp_z__dist_code\n#  define _length_code          il2cpp_z__length_code\n#  define _tr_align             il2cpp_z__tr_align\n#  define _tr_flush_block       il2cpp_z__tr_flush_block\n#  define _tr_init              il2cpp_z__tr_init\n#  define _tr_stored_block      il2cpp_z__tr_stored_block\n#  define _tr_tally             il2cpp_z__tr_tally\n#  define adler32               il2cpp_z_adler32\n#  define adler32_combine       il2cpp_z_adler32_combine\n#  define adler32_combine64     il2cpp_z_adler32_combine64\n#  define compress              il2cpp_z_compress\n#  define compress2             il2cpp_z_compress2\n#  define compressBound         il2cpp_z_compressBound\n#  define crc32                 il2cpp_z_crc32\n#  define crc32_combine         il2cpp_z_crc32_combine\n#  define crc32_combine64       il2cpp_z_crc32_combine64\n#  define deflate               il2cpp_z_deflate\n#  define deflateBound          il2cpp_z_deflateBound\n#  define deflateCopy           il2cpp_z_deflateCopy\n#  define deflateEnd            il2cpp_z_deflateEnd\n#  define deflateInit2_         il2cpp_z_deflateInit2_\n#  define deflateInit_          il2cpp_z_deflateInit_\n#  define deflateParams         il2cpp_z_deflateParams\n#  define deflatePrime          il2cpp_z_deflatePrime\n#  define deflateReset          il2cpp_z_deflateReset\n#  define deflateSetDictionary  il2cpp_z_deflateSetDictionary\n#  define deflateSetHeader      il2cpp_z_deflateSetHeader\n#  define deflateTune           il2cpp_z_deflateTune\n#  define deflate_copyright     il2cpp_z_deflate_copyright\n#  define get_crc_table         il2cpp_z_get_crc_table\n#  define gzclearerr            il2cpp_z_gzclearerr\n#  define gzclose               il2cpp_z_gzclose\n#  define gzdirect              il2cpp_z_gzdirect\n#  define gzdopen               il2cpp_z_gzdopen\n#  define gzeof                 il2cpp_z_gzeof\n#  define gzerror               il2cpp_z_gzerror\n#  define gzflush               il2cpp_z_gzflush\n#  define gzgetc                il2cpp_z_gzgetc\n#  define gzgets                il2cpp_z_gzgets\n#  define gzopen                il2cpp_z_gzopen\n#  define gzprintf              il2cpp_z_gzprintf\n#  define gzputc                il2cpp_z_gzputc\n#  define gzputs                il2cpp_z_gzputs\n#  define gzread                il2cpp_z_gzread\n#  define gzrewind              il2cpp_z_gzrewind\n#  define gzseek                il2cpp_z_gzseek\n#  define gzsetparams           il2cpp_z_gzsetparams\n#  define gztell                il2cpp_z_gztell\n#  define gzungetc              il2cpp_z_gzungetc\n#  define gzwrite               il2cpp_z_gzwrite\n#  define inflate               il2cpp_z_inflate\n#  define inflateBack           il2cpp_z_inflateBack\n#  define inflateBackEnd        il2cpp_z_inflateBackEnd\n#  define inflateBackInit_      il2cpp_z_inflateBackInit_\n#  define inflateCopy           il2cpp_z_inflateCopy\n#  define inflateEnd            il2cpp_z_inflateEnd\n#  define inflateGetHeader      il2cpp_z_inflateGetHeader\n#  define inflateInit2_         il2cpp_z_inflateInit2_\n#  define inflateInit_          il2cpp_z_inflateInit_\n#  define inflatePrime          il2cpp_z_inflatePrime\n#  define inflateReset          il2cpp_z_inflateReset\n#  define inflateSetDictionary  il2cpp_z_inflateSetDictionary\n#  define inflateSync           il2cpp_z_inflateSync\n#  define inflateSyncPoint      il2cpp_z_inflateSyncPoint\n#  define inflateUndermine      il2cpp_z_inflateUndermine\n#  define inflate_copyright     il2cpp_z_inflate_copyright\n#  define inflate_fast          il2cpp_z_inflate_fast\n#  define inflate_table         il2cpp_z_inflate_table\n#  define uncompress            il2cpp_z_uncompress\n#  define zError                il2cpp_z_zError\n#  define z_errmsg              il2cpp_z_z_errmsg\n#  define zcalloc               il2cpp_z_zcalloc\n#  define zcfree                il2cpp_z_zcfree\n#  define zlibCompileFlags      il2cpp_z_zlibCompileFlags\n#  define zlibVersion           il2cpp_z_zlibVersion\n\n/* all zlib typedefs in zlib.h and zconf.h */\n#  define Byte                  il2cpp_z_Byte\n#  define Bytef                 il2cpp_z_Bytef\n#  define alloc_func            il2cpp_z_alloc_func\n#  define charf                 il2cpp_z_charf\n#  define free_func             il2cpp_z_free_func\n#  define gzFile                il2cpp_z_gzFile\n#  define gz_header             il2cpp_z_gz_header\n#  define gz_headerp            il2cpp_z_gz_headerp\n#  define in_func               il2cpp_z_in_func\n#  define intf                  il2cpp_z_intf\n#  define out_func              il2cpp_z_out_func\n#  define uInt                  il2cpp_z_uInt\n#  define uIntf                 il2cpp_z_uIntf\n#  define uLong                 il2cpp_z_uLong\n#  define uLongf                il2cpp_z_uLongf\n#  define voidp                 il2cpp_z_voidp\n#  define voidp                 il2cpp_z_voidp\n#  define voidpc                il2cpp_z_voidpc\n#  define voidpc                il2cpp_z_voidpc\n#  define voidpf                il2cpp_z_voidpf\n#  define voidpf                il2cpp_z_voidpf\n#  define z_stream              il2cpp_z_z_stream\n#  define z_streamp             il2cpp_z_z_streamp\n\n/* all zlib structs in zlib.h and zconf.h */\n#  define gz_header_s           il2cpp_z_gz_header_s\n#  define internal_state        il2cpp_z_internal_state\n#  define z_stream_s            il2cpp_z_z_stream_s\n\n#endif\n\n#if defined(__MSDOS__) && !defined(MSDOS)\n#  define MSDOS\n#endif\n#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)\n#  define OS2\n#endif\n#if defined(_WINDOWS) && !defined(WINDOWS)\n#  define WINDOWS\n#endif\n#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)\n#  ifndef WIN32\n#    define WIN32\n#  endif\n#endif\n#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)\n#  if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)\n#    ifndef SYS16BIT\n#      define SYS16BIT\n#    endif\n#  endif\n#endif\n\n/*\n * Compile with -DMAXSEG_64K if the alloc function cannot allocate more\n * than 64k bytes at a time (needed on systems with 16-bit int).\n */\n#ifdef SYS16BIT\n#  define MAXSEG_64K\n#endif\n#ifdef MSDOS\n#  define UNALIGNED_OK\n#endif\n\n#ifdef __STDC_VERSION__\n#  ifndef STDC\n#    define STDC\n#  endif\n#  if __STDC_VERSION__ >= 199901L\n#    ifndef STDC99\n#      define STDC99\n#    endif\n#  endif\n#endif\n#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))\n#  define STDC\n#endif\n#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))\n#  define STDC\n#endif\n#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))\n#  define STDC\n#endif\n#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))\n#  define STDC\n#endif\n\n#if defined(__OS400__) && !defined(STDC)    /* iSeries (formerly AS/400). */\n#  define STDC\n#endif\n\n#ifndef STDC\n#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */\n#    define const       /* note: need a more gentle solution here */\n#  endif\n#endif\n\n/* Some Mac compilers merge all .h files incorrectly: */\n#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)\n#  define NO_DUMMY_DECL\n#endif\n\n/* Maximum value for memLevel in deflateInit2 */\n#ifndef MAX_MEM_LEVEL\n#  ifdef MAXSEG_64K\n#    define MAX_MEM_LEVEL 8\n#  else\n#    define MAX_MEM_LEVEL 9\n#  endif\n#endif\n\n/* Maximum value for windowBits in deflateInit2 and inflateInit2.\n * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files\n * created by gzip. (Files created by minigzip can still be extracted by\n * gzip.)\n */\n#ifndef MAX_WBITS\n#  define MAX_WBITS   15 /* 32K LZ77 window */\n#endif\n\n/* The memory requirements for deflate are (in bytes):\n            (1 << (windowBits+2)) +  (1 << (memLevel+9))\n that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)\n plus a few kilobytes for small objects. For example, if you want to reduce\n the default memory requirements from 256K to 128K, compile with\n     make CFLAGS=\"-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7\"\n Of course this will generally degrade compression (there's no free lunch).\n\n   The memory requirements for inflate are (in bytes) 1 << windowBits\n that is, 32K for windowBits=15 (default value) plus a few kilobytes\n for small objects.\n*/\n\n                        /* Type declarations */\n\n#ifndef OF /* function prototypes */\n#  ifdef STDC\n#    define OF(args)  args\n#  else\n#    define OF(args)  ()\n#  endif\n#endif\n\n/* The following definitions for FAR are needed only for MSDOS mixed\n * model programming (small or medium model with some far allocations).\n * This was tested only with MSC; for other MSDOS compilers you may have\n * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,\n * just define FAR to be empty.\n */\n#ifdef SYS16BIT\n#  if defined(M_I86SM) || defined(M_I86MM)\n     /* MSC small or medium model */\n#    define SMALL_MEDIUM\n#    ifdef _MSC_VER\n#      define FAR _far\n#    else\n#      define FAR far\n#    endif\n#  endif\n#  if (defined(__SMALL__) || defined(__MEDIUM__))\n     /* Turbo C small or medium model */\n#    define SMALL_MEDIUM\n#    ifdef __BORLANDC__\n#      define FAR _far\n#    else\n#      define FAR far\n#    endif\n#  endif\n#endif\n\n#if defined(WINDOWS) || defined(WIN32)\n   /* If building or using zlib as a DLL, define ZLIB_DLL.\n    * This is not mandatory, but it offers a little performance increase.\n    */\n#  ifdef ZLIB_DLL\n#    if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))\n#      ifdef ZLIB_INTERNAL\n#        define ZEXTERN extern __declspec(dllexport)\n#      else\n#        define ZEXTERN extern __declspec(dllimport)\n#      endif\n#    endif\n#  endif  /* ZLIB_DLL */\n   /* If building or using zlib with the WINAPI/WINAPIV calling convention,\n    * define ZLIB_WINAPI.\n    * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.\n    */\n#  ifdef ZLIB_WINAPI\n#    ifdef FAR\n#      undef FAR\n#    endif\n#    include <windows.h>\n     /* No need for _export, use ZLIB.DEF instead. */\n     /* For complete Windows compatibility, use WINAPI, not __stdcall. */\n#    define ZEXPORT WINAPI\n#    ifdef WIN32\n#      define ZEXPORTVA WINAPIV\n#    else\n#      define ZEXPORTVA FAR CDECL\n#    endif\n#  endif\n#endif\n\n#if defined (__BEOS__)\n#  ifdef ZLIB_DLL\n#    ifdef ZLIB_INTERNAL\n#      define ZEXPORT   __declspec(dllexport)\n#      define ZEXPORTVA __declspec(dllexport)\n#    else\n#      define ZEXPORT   __declspec(dllimport)\n#      define ZEXPORTVA __declspec(dllimport)\n#    endif\n#  endif\n#endif\n\n#ifdef HAVE_VISIBILITY_PRAGMA\n#  define ZEXTERN __attribute__((visibility (\"default\"))) extern\n#endif\n\n#ifndef ZEXTERN\n#  define ZEXTERN extern\n#endif\n#ifndef ZEXPORT\n#  define ZEXPORT\n#endif\n#ifndef ZEXPORTVA\n#  define ZEXPORTVA\n#endif\n\n#ifndef FAR\n#  define FAR\n#endif\n\n#if !defined(__MACTYPES__)\ntypedef unsigned char  Byte;  /* 8 bits */\n#endif\ntypedef unsigned int   uInt;  /* 16 bits or more */\ntypedef unsigned long  uLong; /* 32 bits or more */\n\n#ifdef SMALL_MEDIUM\n   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */\n#  define Bytef Byte FAR\n#else\n   typedef Byte  FAR Bytef;\n#endif\ntypedef char  FAR charf;\ntypedef int   FAR intf;\ntypedef uInt  FAR uIntf;\ntypedef uLong FAR uLongf;\n\n#ifdef STDC\n   typedef void const *voidpc;\n   typedef void FAR   *voidpf;\n   typedef void       *voidp;\n#else\n   typedef Byte const *voidpc;\n   typedef Byte FAR   *voidpf;\n   typedef Byte       *voidp;\n#endif\n\n/* not needed\n * This is created by zlib's configure script to define off_t\n#include \"zlibdefs.h\"\n*/\n\n#ifndef SEEK_SET\n#  define SEEK_SET        0       /* Seek from beginning of file.  */\n#  define SEEK_CUR        1       /* Seek from current position.  */\n#  define SEEK_END        2       /* Set file pointer to EOF plus \"offset\" */\n#endif\n#ifndef z_off_t\n#  define z_off_t long\n#endif\n\n#if defined(__OS400__)\n#  define NO_vsnprintf\n#endif\n\n#if defined(__MVS__)\n#  define NO_vsnprintf\n#endif\n\n/* MVS linker does not support external names larger than 8 bytes */\n#if defined(__MVS__)\n#   pragma map(deflateInit_,\"DEIN\")\n#   pragma map(deflateInit2_,\"DEIN2\")\n#   pragma map(deflateEnd,\"DEEND\")\n#   pragma map(deflateBound,\"DEBND\")\n#   pragma map(inflateInit_,\"ININ\")\n#   pragma map(inflateInit2_,\"ININ2\")\n#   pragma map(inflateEnd,\"INEND\")\n#   pragma map(inflateSync,\"INSY\")\n#   pragma map(inflateSetDictionary,\"INSEDI\")\n#   pragma map(compressBound,\"CMBND\")\n#   pragma map(inflate_table,\"INTABL\")\n#   pragma map(inflate_fast,\"INFA\")\n#   pragma map(inflate_copyright,\"INCOPY\")\n#endif\n\n#ifdef WINDOWS\n#define NO_FSEEKO 1\n#define NO_vsnprintf 1\n#endif\n#endif /* ZCONF_H */\n\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/zlib.h",
    "content": "/* zlib.h -- interface of the 'zlib' general purpose compression library\n  version 1.2.3.3, October 2nd, 2006\n\n  Copyright (C) 1995-2006 Jean-loup Gailly and Mark Adler\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  Jean-loup Gailly        Mark Adler\n  jloup@gzip.org          madler@alumni.caltech.edu\n\n\n  The data format used by the zlib library is described by RFCs (Request for\n  Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt\n  (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).\n*/\n\n#ifndef ZLIB_H\n#define ZLIB_H\n\n#include \"zconf.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define ZLIB_VERSION \"1.2.3.3\"\n#define ZLIB_VERNUM 0x1233\n#define ZLIB_VER_MAJOR 1\n#define ZLIB_VER_MINOR 2\n#define ZLIB_VER_REVISION 3\n\n/*\n     The 'zlib' compression library provides in-memory compression and\n  decompression functions, including integrity checks of the uncompressed\n  data.  This version of the library supports only one compression method\n  (deflation) but other algorithms will be added later and will have the same\n  stream interface.\n\n     Compression can be done in a single step if the buffers are large\n  enough (for example if an input file is mmap'ed), or can be done by\n  repeated calls of the compression function.  In the latter case, the\n  application must provide more input and/or consume the output\n  (providing more output space) before each call.\n\n     The compressed data format used by default by the in-memory functions is\n  the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped\n  around a deflate stream, which is itself documented in RFC 1951.\n\n     The library also supports reading and writing files in gzip (.gz) format\n  with an interface similar to that of stdio using the functions that start\n  with \"gz\".  The gzip format is different from the zlib format.  gzip is a\n  gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.\n\n     This library can optionally read and write gzip streams in memory as well.\n\n     The zlib format was designed to be compact and fast for use in memory\n  and on communications channels.  The gzip format was designed for single-\n  file compression on file systems, has a larger header than zlib to maintain\n  directory information, and uses a different, slower check method than zlib.\n\n     The library does not install any signal handler. The decoder checks\n  the consistency of the compressed data, so the library should never\n  crash even in case of corrupted input.\n*/\n\ntypedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));\ntypedef void   (*free_func)  OF((voidpf opaque, voidpf address));\n\nstruct internal_state;\n\ntypedef struct z_stream_s {\n    Bytef    *next_in;  /* next input byte */\n    uInt     avail_in;  /* number of bytes available at next_in */\n    uLong    total_in;  /* total nb of input bytes read so far */\n\n    Bytef    *next_out; /* next output byte should be put there */\n    uInt     avail_out; /* remaining free space at next_out */\n    uLong    total_out; /* total nb of bytes output so far */\n\n    char     *msg;      /* last error message, NULL if no error */\n    struct internal_state FAR *state; /* not visible by applications */\n\n    alloc_func zalloc;  /* used to allocate the internal state */\n    free_func  zfree;   /* used to free the internal state */\n    voidpf     opaque;  /* private data object passed to zalloc and zfree */\n\n    int     data_type;  /* best guess about the data type: binary or text */\n    uLong   adler;      /* adler32 value of the uncompressed data */\n    uLong   reserved;   /* reserved for future use */\n} z_stream;\n\ntypedef z_stream FAR *z_streamp;\n\n/*\n     gzip header information passed to and from zlib routines.  See RFC 1952\n  for more details on the meanings of these fields.\n*/\ntypedef struct gz_header_s {\n    int     text;       /* true if compressed data believed to be text */\n    uLong   time;       /* modification time */\n    int     xflags;     /* extra flags (not used when writing a gzip file) */\n    int     os;         /* operating system */\n    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */\n    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */\n    uInt    extra_max;  /* space at extra (only when reading header) */\n    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */\n    uInt    name_max;   /* space at name (only when reading header) */\n    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */\n    uInt    comm_max;   /* space at comment (only when reading header) */\n    int     hcrc;       /* true if there was or will be a header crc */\n    int     done;       /* true when done reading gzip header (not used\n                           when writing a gzip file) */\n} gz_header;\n\ntypedef gz_header FAR *gz_headerp;\n\n/*\n   The application must update next_in and avail_in when avail_in has\n   dropped to zero. It must update next_out and avail_out when avail_out\n   has dropped to zero. The application must initialize zalloc, zfree and\n   opaque before calling the init function. All other fields are set by the\n   compression library and must not be updated by the application.\n\n   The opaque value provided by the application will be passed as the first\n   parameter for calls of zalloc and zfree. This can be useful for custom\n   memory management. The compression library attaches no meaning to the\n   opaque value.\n\n   zalloc must return Z_NULL if there is not enough memory for the object.\n   If zlib is used in a multi-threaded application, zalloc and zfree must be\n   thread safe.\n\n   On 16-bit systems, the functions zalloc and zfree must be able to allocate\n   exactly 65536 bytes, but will not be required to allocate more than this\n   if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,\n   pointers returned by zalloc for objects of exactly 65536 bytes *must*\n   have their offset normalized to zero. The default allocation function\n   provided by this library ensures this (see zutil.c). To reduce memory\n   requirements and avoid any allocation of 64K objects, at the expense of\n   compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).\n\n   The fields total_in and total_out can be used for statistics or\n   progress reports. After compression, total_in holds the total size of\n   the uncompressed data and may be saved for use in the decompressor\n   (particularly if the decompressor wants to decompress everything in\n   a single step).\n*/\n\n                        /* constants */\n\n#define Z_NO_FLUSH      0\n#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */\n#define Z_SYNC_FLUSH    2\n#define Z_FULL_FLUSH    3\n#define Z_FINISH        4\n#define Z_BLOCK         5\n/* Allowed flush values; see deflate() and inflate() below for details */\n\n#define Z_OK            0\n#define Z_STREAM_END    1\n#define Z_NEED_DICT     2\n#define Z_ERRNO        (-1)\n#define Z_STREAM_ERROR (-2)\n#define Z_DATA_ERROR   (-3)\n#define Z_MEM_ERROR    (-4)\n#define Z_BUF_ERROR    (-5)\n#define Z_VERSION_ERROR (-6)\n/* Return codes for the compression/decompression functions. Negative\n * values are errors, positive values are used for special but normal events.\n */\n\n#define Z_NO_COMPRESSION         0\n#define Z_BEST_SPEED             1\n#define Z_BEST_COMPRESSION       9\n#define Z_DEFAULT_COMPRESSION  (-1)\n/* compression levels */\n\n#define Z_FILTERED            1\n#define Z_HUFFMAN_ONLY        2\n#define Z_RLE                 3\n#define Z_FIXED               4\n#define Z_DEFAULT_STRATEGY    0\n/* compression strategy; see deflateInit2() below for details */\n\n#define Z_BINARY   0\n#define Z_TEXT     1\n#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */\n#define Z_UNKNOWN  2\n/* Possible values of the data_type field (though see inflate()) */\n\n#define Z_DEFLATED   8\n/* The deflate compression method (the only one supported in this version) */\n\n#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */\n\n#define zlib_version zlibVersion()\n/* for compatibility with versions < 1.0.2 */\n\n                        /* basic functions */\n\nZEXTERN const char * ZEXPORT zlibVersion OF((void));\n/* The application can compare zlibVersion and ZLIB_VERSION for consistency.\n   If the first character differs, the library code actually used is\n   not compatible with the zlib.h header file used by the application.\n   This check is automatically made by deflateInit and inflateInit.\n */\n\n/*\nZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));\n\n     Initializes the internal stream state for compression. The fields\n   zalloc, zfree and opaque must be initialized before by the caller.\n   If zalloc and zfree are set to Z_NULL, deflateInit updates them to\n   use default allocation functions.\n\n     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:\n   1 gives best speed, 9 gives best compression, 0 gives no compression at\n   all (the input data is simply copied a block at a time).\n   Z_DEFAULT_COMPRESSION requests a default compromise between speed and\n   compression (currently equivalent to level 6).\n\n     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_STREAM_ERROR if level is not a valid compression level,\n   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible\n   with the version assumed by the caller (ZLIB_VERSION).\n   msg is set to null if there is no error message.  deflateInit does not\n   perform any compression: this will be done by deflate().\n*/\n\n\nZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));\n/*\n    deflate compresses as much data as possible, and stops when the input\n  buffer becomes empty or the output buffer becomes full. It may introduce some\n  output latency (reading input without producing any output) except when\n  forced to flush.\n\n    The detailed semantics are as follows. deflate performs one or both of the\n  following actions:\n\n  - Compress more input starting at next_in and update next_in and avail_in\n    accordingly. If not all input can be processed (because there is not\n    enough room in the output buffer), next_in and avail_in are updated and\n    processing will resume at this point for the next call of deflate().\n\n  - Provide more output starting at next_out and update next_out and avail_out\n    accordingly. This action is forced if the parameter flush is non zero.\n    Forcing flush frequently degrades the compression ratio, so this parameter\n    should be set only when necessary (in interactive applications).\n    Some output may be provided even if flush is not set.\n\n  Before the call of deflate(), the application should ensure that at least\n  one of the actions is possible, by providing more input and/or consuming\n  more output, and updating avail_in or avail_out accordingly; avail_out\n  should never be zero before the call. The application can consume the\n  compressed output when it wants, for example when the output buffer is full\n  (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK\n  and with zero avail_out, it must be called again after making room in the\n  output buffer because there might be more output pending.\n\n    Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to\n  decide how much data to accumualte before producing output, in order to\n  maximize compression.\n\n    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is\n  flushed to the output buffer and the output is aligned on a byte boundary, so\n  that the decompressor can get all input data available so far. (In particular\n  avail_in is zero after the call if enough output space has been provided\n  before the call.)  Flushing may degrade compression for some compression\n  algorithms and so it should be used only when necessary.\n\n    If flush is set to Z_FULL_FLUSH, all output is flushed as with\n  Z_SYNC_FLUSH, and the compression state is reset so that decompression can\n  restart from this point if previous compressed data has been damaged or if\n  random access is desired. Using Z_FULL_FLUSH too often can seriously degrade\n  compression.\n\n    If deflate returns with avail_out == 0, this function must be called again\n  with the same value of the flush parameter and more output space (updated\n  avail_out), until the flush is complete (deflate returns with non-zero\n  avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that\n  avail_out is greater than six to avoid repeated flush markers due to\n  avail_out == 0 on return.\n\n    If the parameter flush is set to Z_FINISH, pending input is processed,\n  pending output is flushed and deflate returns with Z_STREAM_END if there\n  was enough output space; if deflate returns with Z_OK, this function must be\n  called again with Z_FINISH and more output space (updated avail_out) but no\n  more input data, until it returns with Z_STREAM_END or an error. After\n  deflate has returned Z_STREAM_END, the only possible operations on the\n  stream are deflateReset or deflateEnd.\n\n    Z_FINISH can be used immediately after deflateInit if all the compression\n  is to be done in a single step. In this case, avail_out must be at least\n  the value returned by deflateBound (see below). If deflate does not return\n  Z_STREAM_END, then it must be called again as described above.\n\n    deflate() sets strm->adler to the adler32 checksum of all input read\n  so far (that is, total_in bytes).\n\n    deflate() may update strm->data_type if it can make a good guess about\n  the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered\n  binary. This field is only for information purposes and does not affect\n  the compression algorithm in any manner.\n\n    deflate() returns Z_OK if some progress has been made (more input\n  processed or more output produced), Z_STREAM_END if all input has been\n  consumed and all output has been produced (only when flush is set to\n  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example\n  if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible\n  (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not\n  fatal, and deflate() can be called again with more input and more output\n  space to continue compressing.\n*/\n\n\nZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));\n/*\n     All dynamically allocated data structures for this stream are freed.\n   This function discards any unprocessed input and does not flush any\n   pending output.\n\n     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the\n   stream state was inconsistent, Z_DATA_ERROR if the stream was freed\n   prematurely (some input or output was discarded). In the error case,\n   msg may be set but then points to a static string (which must not be\n   deallocated).\n*/\n\n\n/*\nZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));\n\n     Initializes the internal stream state for decompression. The fields\n   next_in, avail_in, zalloc, zfree and opaque must be initialized before by\n   the caller. If next_in is not Z_NULL and avail_in is large enough (the exact\n   value depends on the compression method), inflateInit determines the\n   compression method from the zlib header and allocates all data structures\n   accordingly; otherwise the allocation will be deferred to the first call of\n   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to\n   use default allocation functions.\n\n     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the\n   version assumed by the caller, or Z_STREAM_ERROR if the parameters are\n   invalid, such as a null pointer to the structure.  msg is set to null if\n   there is no error message. inflateInit does not perform any decompression\n   apart from possibly reading the zlib header if present: actual decompression\n   will be done by inflate().  (So next_in and avail_in may be modified, but\n   next_out and avail_out are unused and unchanged.)  The current\n   implementation of inflateInit() does not process any header information --\n   that is deferred until inflate() is called.\n*/\n\n\nZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));\n/*\n    inflate decompresses as much data as possible, and stops when the input\n  buffer becomes empty or the output buffer becomes full. It may introduce\n  some output latency (reading input without producing any output) except when\n  forced to flush.\n\n  The detailed semantics are as follows. inflate performs one or both of the\n  following actions:\n\n  - Decompress more input starting at next_in and update next_in and avail_in\n    accordingly. If not all input can be processed (because there is not\n    enough room in the output buffer), next_in is updated and processing\n    will resume at this point for the next call of inflate().\n\n  - Provide more output starting at next_out and update next_out and avail_out\n    accordingly.  inflate() provides as much output as possible, until there\n    is no more input data or no more space in the output buffer (see below\n    about the flush parameter).\n\n  Before the call of inflate(), the application should ensure that at least\n  one of the actions is possible, by providing more input and/or consuming\n  more output, and updating the next_* and avail_* values accordingly.\n  The application can consume the uncompressed output when it wants, for\n  example when the output buffer is full (avail_out == 0), or after each\n  call of inflate(). If inflate returns Z_OK and with zero avail_out, it\n  must be called again after making room in the output buffer because there\n  might be more output pending.\n\n    The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH,\n  Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much\n  output as possible to the output buffer. Z_BLOCK requests that inflate() stop\n  if and when it gets to the next deflate block boundary. When decoding the\n  zlib or gzip format, this will cause inflate() to return immediately after\n  the header and before the first block. When doing a raw inflate, inflate()\n  will go ahead and process the first block, and will return when it gets to\n  the end of that block, or when it runs out of data.\n\n    The Z_BLOCK option assists in appending to or combining deflate streams.\n  Also to assist in this, on return inflate() will set strm->data_type to the\n  number of unused bits in the last byte taken from strm->next_in, plus 64\n  if inflate() is currently decoding the last block in the deflate stream,\n  plus 128 if inflate() returned immediately after decoding an end-of-block\n  code or decoding the complete header up to just before the first byte of the\n  deflate stream. The end-of-block will not be indicated until all of the\n  uncompressed data from that block has been written to strm->next_out.  The\n  number of unused bits may in general be greater than seven, except when\n  bit 7 of data_type is set, in which case the number of unused bits will be\n  less than eight.\n\n    inflate() should normally be called until it returns Z_STREAM_END or an\n  error. However if all decompression is to be performed in a single step\n  (a single call of inflate), the parameter flush should be set to\n  Z_FINISH. In this case all pending input is processed and all pending\n  output is flushed; avail_out must be large enough to hold all the\n  uncompressed data. (The size of the uncompressed data may have been saved\n  by the compressor for this purpose.) The next operation on this stream must\n  be inflateEnd to deallocate the decompression state. The use of Z_FINISH\n  is never required, but can be used to inform inflate that a faster approach\n  may be used for the single inflate() call.\n\n     In this implementation, inflate() always flushes as much output as\n  possible to the output buffer, and always uses the faster approach on the\n  first call. So the only effect of the flush parameter in this implementation\n  is on the return value of inflate(), as noted below, or when it returns early\n  because Z_BLOCK is used.\n\n     If a preset dictionary is needed after this call (see inflateSetDictionary\n  below), inflate sets strm->adler to the adler32 checksum of the dictionary\n  chosen by the compressor and returns Z_NEED_DICT; otherwise it sets\n  strm->adler to the adler32 checksum of all output produced so far (that is,\n  total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described\n  below. At the end of the stream, inflate() checks that its computed adler32\n  checksum is equal to that saved by the compressor and returns Z_STREAM_END\n  only if the checksum is correct.\n\n    inflate() will decompress and check either zlib-wrapped or gzip-wrapped\n  deflate data.  The header type is detected automatically.  Any information\n  contained in the gzip header is not retained, so applications that need that\n  information should instead use raw inflate, see inflateInit2() below, or\n  inflateBack() and perform their own processing of the gzip header and\n  trailer.\n\n    inflate() returns Z_OK if some progress has been made (more input processed\n  or more output produced), Z_STREAM_END if the end of the compressed data has\n  been reached and all uncompressed output has been produced, Z_NEED_DICT if a\n  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was\n  corrupted (input stream not conforming to the zlib format or incorrect check\n  value), Z_STREAM_ERROR if the stream structure was inconsistent (for example\n  if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory,\n  Z_BUF_ERROR if no progress is possible or if there was not enough room in the\n  output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and\n  inflate() can be called again with more input and more output space to\n  continue decompressing. If Z_DATA_ERROR is returned, the application may then\n  call inflateSync() to look for a good compression block if a partial recovery\n  of the data is desired.\n*/\n\n\nZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));\n/*\n     All dynamically allocated data structures for this stream are freed.\n   This function discards any unprocessed input and does not flush any\n   pending output.\n\n     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state\n   was inconsistent. In the error case, msg may be set but then points to a\n   static string (which must not be deallocated).\n*/\n\n                        /* Advanced functions */\n\n/*\n    The following functions are needed only in some special applications.\n*/\n\n/*\nZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,\n                                     int  level,\n                                     int  method,\n                                     int  windowBits,\n                                     int  memLevel,\n                                     int  strategy));\n\n     This is another version of deflateInit with more compression options. The\n   fields next_in, zalloc, zfree and opaque must be initialized before by\n   the caller.\n\n     The method parameter is the compression method. It must be Z_DEFLATED in\n   this version of the library.\n\n     The windowBits parameter is the base two logarithm of the window size\n   (the size of the history buffer). It should be in the range 8..15 for this\n   version of the library. Larger values of this parameter result in better\n   compression at the expense of memory usage. The default value is 15 if\n   deflateInit is used instead.\n\n     windowBits can also be -8..-15 for raw deflate. In this case, -windowBits\n   determines the window size. deflate() will then generate raw deflate data\n   with no zlib header or trailer, and will not compute an adler32 check value.\n\n     windowBits can also be greater than 15 for optional gzip encoding. Add\n   16 to windowBits to write a simple gzip header and trailer around the\n   compressed data instead of a zlib wrapper. The gzip header will have no\n   file name, no extra data, no comment, no modification time (set to zero),\n   no header crc, and the operating system will be set to 255 (unknown).  If a\n   gzip stream is being written, strm->adler is a crc32 instead of an adler32.\n\n     The memLevel parameter specifies how much memory should be allocated\n   for the internal compression state. memLevel=1 uses minimum memory but\n   is slow and reduces compression ratio; memLevel=9 uses maximum memory\n   for optimal speed. The default value is 8. See zconf.h for total memory\n   usage as a function of windowBits and memLevel.\n\n     The strategy parameter is used to tune the compression algorithm. Use the\n   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a\n   filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no\n   string match), or Z_RLE to limit match distances to one (run-length\n   encoding). Filtered data consists mostly of small values with a somewhat\n   random distribution. In this case, the compression algorithm is tuned to\n   compress them better. The effect of Z_FILTERED is to force more Huffman\n   coding and less string matching; it is somewhat intermediate between\n   Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as\n   Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy\n   parameter only affects the compression ratio but not the correctness of the\n   compressed output even if it is not set appropriately.  Z_FIXED prevents the\n   use of dynamic Huffman codes, allowing for a simpler decoder for special\n   applications.\n\n      deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid\n   method). msg is set to null if there is no error message.  deflateInit2 does\n   not perform any compression: this will be done by deflate().\n*/\n\nZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,\n                                             const Bytef *dictionary,\n                                             uInt  dictLength));\n/*\n     Initializes the compression dictionary from the given byte sequence\n   without producing any compressed output. This function must be called\n   immediately after deflateInit, deflateInit2 or deflateReset, before any\n   call of deflate. The compressor and decompressor must use exactly the same\n   dictionary (see inflateSetDictionary).\n\n     The dictionary should consist of strings (byte sequences) that are likely\n   to be encountered later in the data to be compressed, with the most commonly\n   used strings preferably put towards the end of the dictionary. Using a\n   dictionary is most useful when the data to be compressed is short and can be\n   predicted with good accuracy; the data can then be compressed better than\n   with the default empty dictionary.\n\n     Depending on the size of the compression data structures selected by\n   deflateInit or deflateInit2, a part of the dictionary may in effect be\n   discarded, for example if the dictionary is larger than the window size in\n   deflate or deflate2. Thus the strings most likely to be useful should be\n   put at the end of the dictionary, not at the front. In addition, the\n   current implementation of deflate will use at most the window size minus\n   262 bytes of the provided dictionary.\n\n     Upon return of this function, strm->adler is set to the adler32 value\n   of the dictionary; the decompressor may later use this value to determine\n   which dictionary has been used by the compressor. (The adler32 value\n   applies to the whole dictionary even if only a subset of the dictionary is\n   actually used by the compressor.) If a raw deflate was requested, then the\n   adler32 value is not computed and strm->adler is not set.\n\n     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a\n   parameter is invalid (such as NULL dictionary) or the stream state is\n   inconsistent (for example if deflate has already been called for this stream\n   or if the compression method is bsort). deflateSetDictionary does not\n   perform any compression: this will be done by deflate().\n*/\n\nZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,\n                                    z_streamp source));\n/*\n     Sets the destination stream as a complete copy of the source stream.\n\n     This function can be useful when several compression strategies will be\n   tried, for example when there are several ways of pre-processing the input\n   data with a filter. The streams that will be discarded should then be freed\n   by calling deflateEnd.  Note that deflateCopy duplicates the internal\n   compression state which can be quite large, so this strategy is slow and\n   can consume lots of memory.\n\n     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent\n   (such as zalloc being NULL). msg is left unchanged in both source and\n   destination.\n*/\n\nZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));\n/*\n     This function is equivalent to deflateEnd followed by deflateInit,\n   but does not free and reallocate all the internal compression state.\n   The stream will keep the same compression level and any other attributes\n   that may have been set by deflateInit2.\n\n      deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent (such as zalloc or state being NULL).\n*/\n\nZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,\n                                      int level,\n                                      int strategy));\n/*\n     Dynamically update the compression level and compression strategy.  The\n   interpretation of level and strategy is as in deflateInit2.  This can be\n   used to switch between compression and straight copy of the input data, or\n   to switch to a different kind of input data requiring a different\n   strategy. If the compression level is changed, the input available so far\n   is compressed with the old level (and may be flushed); the new level will\n   take effect only at the next call of deflate().\n\n     Before the call of deflateParams, the stream state must be set as for\n   a call of deflate(), since the currently available input may have to\n   be compressed and flushed. In particular, strm->avail_out must be non-zero.\n\n     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source\n   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR\n   if strm->avail_out was zero.\n*/\n\nZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,\n                                    int good_length,\n                                    int max_lazy,\n                                    int nice_length,\n                                    int max_chain));\n/*\n     Fine tune deflate's internal compression parameters.  This should only be\n   used by someone who understands the algorithm used by zlib's deflate for\n   searching for the best matching string, and even then only by the most\n   fanatic optimizer trying to squeeze out the last compressed bit for their\n   specific input data.  Read the deflate.c source code for the meaning of the\n   max_lazy, good_length, nice_length, and max_chain parameters.\n\n     deflateTune() can be called after deflateInit() or deflateInit2(), and\n   returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.\n */\n\nZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,\n                                       uLong sourceLen));\n/*\n     deflateBound() returns an upper bound on the compressed size after\n   deflation of sourceLen bytes.  It must be called after deflateInit() or\n   deflateInit2(), and after deflateSetHeader(), if used.  This would be used\n   to allocate an output buffer for deflation in a single pass, and so would be\n   called before deflate().\n*/\n\nZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,\n                                     int bits,\n                                     int value));\n/*\n     deflatePrime() inserts bits in the deflate output stream.  The intent\n  is that this function is used to start off the deflate output with the\n  bits leftover from a previous deflate stream when appending to it.  As such,\n  this function can only be used for raw deflate, and must be used before the\n  first deflate() call after a deflateInit2() or deflateReset().  bits must be\n  less than or equal to 16, and that many of the least significant bits of\n  value will be inserted in the output.\n\n      deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n*/\n\nZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,\n                                         gz_headerp head));\n/*\n      deflateSetHeader() provides gzip header information for when a gzip\n   stream is requested by deflateInit2().  deflateSetHeader() may be called\n   after deflateInit2() or deflateReset() and before the first call of\n   deflate().  The text, time, os, extra field, name, and comment information\n   in the provided gz_header structure are written to the gzip header (xflag is\n   ignored -- the extra flags are set according to the compression level).  The\n   caller must assure that, if not Z_NULL, name and comment are terminated with\n   a zero byte, and that if extra is not Z_NULL, that extra_len bytes are\n   available there.  If hcrc is true, a gzip header crc is included.  Note that\n   the current versions of the command-line version of gzip (up through version\n   1.3.x) do not support header crc's, and will report that it is a \"multi-part\n   gzip file\" and give up.\n\n      If deflateSetHeader is not used, the default gzip header has text false,\n   the time set to zero, and os set to 255, with no extra, name, or comment\n   fields.  The gzip header is returned to the default state by deflateReset().\n\n      deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n*/\n\n/*\nZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,\n                                     int  windowBits));\n\n     This is another version of inflateInit with an extra parameter. The\n   fields next_in, avail_in, zalloc, zfree and opaque must be initialized\n   before by the caller.\n\n     The windowBits parameter is the base two logarithm of the maximum window\n   size (the size of the history buffer).  It should be in the range 8..15 for\n   this version of the library. The default value is 15 if inflateInit is used\n   instead. windowBits must be greater than or equal to the windowBits value\n   provided to deflateInit2() while compressing, or it must be equal to 15 if\n   deflateInit2() was not used. If a compressed stream with a larger window\n   size is given as input, inflate() will return with the error code\n   Z_DATA_ERROR instead of trying to allocate a larger window.\n\n     windowBits can also be -8..-15 for raw inflate. In this case, -windowBits\n   determines the window size. inflate() will then process raw deflate data,\n   not looking for a zlib or gzip header, not generating a check value, and not\n   looking for any check values for comparison at the end of the stream. This\n   is for use with other formats that use the deflate compressed data format\n   such as zip.  Those formats provide their own check values. If a custom\n   format is developed using the raw deflate format for compressed data, it is\n   recommended that a check value such as an adler32 or a crc32 be applied to\n   the uncompressed data as is done in the zlib, gzip, and zip formats.  For\n   most applications, the zlib format should be used as is. Note that comments\n   above on the use in deflateInit2() applies to the magnitude of windowBits.\n\n     windowBits can also be greater than 15 for optional gzip decoding. Add\n   32 to windowBits to enable zlib and gzip decoding with automatic header\n   detection, or add 16 to decode only the gzip format (the zlib format will\n   return a Z_DATA_ERROR).  If a gzip stream is being decoded, strm->adler is\n   a crc32 instead of an adler32.\n\n     inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the\n   version assumed by the caller, or Z_STREAM_ERROR if the parameters are\n   invalid, such as a null pointer to the structure.  msg is set to null if\n   there is no error message. inflateInit2 does not perform any decompression\n   apart from possibly reading the zlib header if present: actual decompression\n   will be done by inflate().  (So next_in and avail_in may be modified, but\n   next_out and avail_out are unused and unchanged.)  The current\n   implementation of inflateInit2() does not process any header information --\n   that is deferred until inflate() is called.\n*/\n\nZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,\n                                             const Bytef *dictionary,\n                                             uInt  dictLength));\n/*\n     Initializes the decompression dictionary from the given uncompressed byte\n   sequence. This function must be called immediately after a call of inflate,\n   if that call returned Z_NEED_DICT. The dictionary chosen by the compressor\n   can be determined from the adler32 value returned by that call of inflate.\n   The compressor and decompressor must use exactly the same dictionary (see\n   deflateSetDictionary).  For raw inflate, this function can be called\n   immediately after inflateInit2() or inflateReset() and before any call of\n   inflate() to set the dictionary.  The application must insure that the\n   dictionary that was used for compression is provided.\n\n     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a\n   parameter is invalid (such as NULL dictionary) or the stream state is\n   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the\n   expected one (incorrect adler32 value). inflateSetDictionary does not\n   perform any decompression: this will be done by subsequent calls of\n   inflate().\n*/\n\nZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));\n/*\n    Skips invalid compressed data until a full flush point (see above the\n  description of deflate with Z_FULL_FLUSH) can be found, or until all\n  available input is skipped. No output is provided.\n\n    inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR\n  if no more input was provided, Z_DATA_ERROR if no flush point has been found,\n  or Z_STREAM_ERROR if the stream structure was inconsistent. In the success\n  case, the application may save the current current value of total_in which\n  indicates where valid compressed data was found. In the error case, the\n  application may repeatedly call inflateSync, providing more input each time,\n  until success or end of the input data.\n*/\n\nZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,\n                                    z_streamp source));\n/*\n     Sets the destination stream as a complete copy of the source stream.\n\n     This function can be useful when randomly accessing a large stream.  The\n   first pass through the stream can periodically record the inflate state,\n   allowing restarting inflate at those points when randomly accessing the\n   stream.\n\n     inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent\n   (such as zalloc being NULL). msg is left unchanged in both source and\n   destination.\n*/\n\nZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));\n/*\n     This function is equivalent to inflateEnd followed by inflateInit,\n   but does not free and reallocate all the internal decompression state.\n   The stream will keep attributes that may have been set by inflateInit2.\n\n      inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent (such as zalloc or state being NULL).\n*/\n\nZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,\n                                     int bits,\n                                     int value));\n/*\n     This function inserts bits in the inflate input stream.  The intent is\n  that this function is used to start inflating at a bit position in the\n  middle of a byte.  The provided bits will be used before any bytes are used\n  from next_in.  This function should only be used with raw inflate, and\n  should be used before the first inflate() call after inflateInit2() or\n  inflateReset().  bits must be less than or equal to 16, and that many of the\n  least significant bits of value will be inserted in the input.\n\n      inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n*/\n\nZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,\n                                         gz_headerp head));\n/*\n      inflateGetHeader() requests that gzip header information be stored in the\n   provided gz_header structure.  inflateGetHeader() may be called after\n   inflateInit2() or inflateReset(), and before the first call of inflate().\n   As inflate() processes the gzip stream, head->done is zero until the header\n   is completed, at which time head->done is set to one.  If a zlib stream is\n   being decoded, then head->done is set to -1 to indicate that there will be\n   no gzip header information forthcoming.  Note that Z_BLOCK can be used to\n   force inflate() to return immediately after header processing is complete\n   and before any actual data is decompressed.\n\n      The text, time, xflags, and os fields are filled in with the gzip header\n   contents.  hcrc is set to true if there is a header CRC.  (The header CRC\n   was valid if done is set to one.)  If extra is not Z_NULL, then extra_max\n   contains the maximum number of bytes to write to extra.  Once done is true,\n   extra_len contains the actual extra field length, and extra contains the\n   extra field, or that field truncated if extra_max is less than extra_len.\n   If name is not Z_NULL, then up to name_max characters are written there,\n   terminated with a zero unless the length is greater than name_max.  If\n   comment is not Z_NULL, then up to comm_max characters are written there,\n   terminated with a zero unless the length is greater than comm_max.  When\n   any of extra, name, or comment are not Z_NULL and the respective field is\n   not present in the header, then that field is set to Z_NULL to signal its\n   absence.  This allows the use of deflateSetHeader() with the returned\n   structure to duplicate the header.  However if those fields are set to\n   allocated memory, then the application will need to save those pointers\n   elsewhere so that they can be eventually freed.\n\n      If inflateGetHeader is not used, then the header information is simply\n   discarded.  The header is always checked for validity, including the header\n   CRC if present.  inflateReset() will reset the process to discard the header\n   information.  The application would need to call inflateGetHeader() again to\n   retrieve the header from the next gzip stream.\n\n      inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n*/\n\n/*\nZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,\n                                        unsigned char FAR *window));\n\n     Initialize the internal stream state for decompression using inflateBack()\n   calls.  The fields zalloc, zfree and opaque in strm must be initialized\n   before the call.  If zalloc and zfree are Z_NULL, then the default library-\n   derived memory allocation routines are used.  windowBits is the base two\n   logarithm of the window size, in the range 8..15.  window is a caller\n   supplied buffer of that size.  Except for special applications where it is\n   assured that deflate was used with small window sizes, windowBits must be 15\n   and a 32K byte window must be supplied to be able to decompress general\n   deflate streams.\n\n     See inflateBack() for the usage of these routines.\n\n     inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of\n   the paramaters are invalid, Z_MEM_ERROR if the internal state could not\n   be allocated, or Z_VERSION_ERROR if the version of the library does not\n   match the version of the header file.\n*/\n\ntypedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));\ntypedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));\n\nZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,\n                                    in_func in, void FAR *in_desc,\n                                    out_func out, void FAR *out_desc));\n/*\n     inflateBack() does a raw inflate with a single call using a call-back\n   interface for input and output.  This is more efficient than inflate() for\n   file i/o applications in that it avoids copying between the output and the\n   sliding window by simply making the window itself the output buffer.  This\n   function trusts the application to not change the output buffer passed by\n   the output function, at least until inflateBack() returns.\n\n     inflateBackInit() must be called first to allocate the internal state\n   and to initialize the state with the user-provided window buffer.\n   inflateBack() may then be used multiple times to inflate a complete, raw\n   deflate stream with each call.  inflateBackEnd() is then called to free\n   the allocated state.\n\n     A raw deflate stream is one with no zlib or gzip header or trailer.\n   This routine would normally be used in a utility that reads zip or gzip\n   files and writes out uncompressed files.  The utility would decode the\n   header and process the trailer on its own, hence this routine expects\n   only the raw deflate stream to decompress.  This is different from the\n   normal behavior of inflate(), which expects either a zlib or gzip header and\n   trailer around the deflate stream.\n\n     inflateBack() uses two subroutines supplied by the caller that are then\n   called by inflateBack() for input and output.  inflateBack() calls those\n   routines until it reads a complete deflate stream and writes out all of the\n   uncompressed data, or until it encounters an error.  The function's\n   parameters and return types are defined above in the in_func and out_func\n   typedefs.  inflateBack() will call in(in_desc, &buf) which should return the\n   number of bytes of provided input, and a pointer to that input in buf.  If\n   there is no input available, in() must return zero--buf is ignored in that\n   case--and inflateBack() will return a buffer error.  inflateBack() will call\n   out(out_desc, buf, len) to write the uncompressed data buf[0..len-1].  out()\n   should return zero on success, or non-zero on failure.  If out() returns\n   non-zero, inflateBack() will return with an error.  Neither in() nor out()\n   are permitted to change the contents of the window provided to\n   inflateBackInit(), which is also the buffer that out() uses to write from.\n   The length written by out() will be at most the window size.  Any non-zero\n   amount of input may be provided by in().\n\n     For convenience, inflateBack() can be provided input on the first call by\n   setting strm->next_in and strm->avail_in.  If that input is exhausted, then\n   in() will be called.  Therefore strm->next_in must be initialized before\n   calling inflateBack().  If strm->next_in is Z_NULL, then in() will be called\n   immediately for input.  If strm->next_in is not Z_NULL, then strm->avail_in\n   must also be initialized, and then if strm->avail_in is not zero, input will\n   initially be taken from strm->next_in[0 .. strm->avail_in - 1].\n\n     The in_desc and out_desc parameters of inflateBack() is passed as the\n   first parameter of in() and out() respectively when they are called.  These\n   descriptors can be optionally used to pass any information that the caller-\n   supplied in() and out() functions need to do their job.\n\n     On return, inflateBack() will set strm->next_in and strm->avail_in to\n   pass back any unused input that was provided by the last in() call.  The\n   return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR\n   if in() or out() returned an error, Z_DATA_ERROR if there was a format\n   error in the deflate stream (in which case strm->msg is set to indicate the\n   nature of the error), or Z_STREAM_ERROR if the stream was not properly\n   initialized.  In the case of Z_BUF_ERROR, an input or output error can be\n   distinguished using strm->next_in which will be Z_NULL only if in() returned\n   an error.  If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to\n   out() returning non-zero.  (in() will always be called before out(), so\n   strm->next_in is assured to be defined if out() returns non-zero.)  Note\n   that inflateBack() cannot return Z_OK.\n*/\n\nZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));\n/*\n     All memory allocated by inflateBackInit() is freed.\n\n     inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream\n   state was inconsistent.\n*/\n\nZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));\n/* Return flags indicating compile-time options.\n\n    Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:\n     1.0: size of uInt\n     3.2: size of uLong\n     5.4: size of voidpf (pointer)\n     7.6: size of z_off_t\n\n    Compiler, assembler, and debug options:\n     8: DEBUG\n     9: ASMV or ASMINF -- use ASM code\n     10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention\n     11: 0 (reserved)\n\n    One-time table building (smaller code, but not thread-safe if true):\n     12: BUILDFIXED -- build static block decoding tables when needed\n     13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed\n     14,15: 0 (reserved)\n\n    Library content (indicates missing functionality):\n     16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking\n                          deflate code when not needed)\n     17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect\n                    and decode gzip streams (to avoid linking crc code)\n     18-19: 0 (reserved)\n\n    Operation variations (changes in library functionality):\n     20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate\n     21: FASTEST -- deflate algorithm with only one, lowest compression level\n     22,23: 0 (reserved)\n\n    The sprintf variant used by gzprintf (zero is best):\n     24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format\n     25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!\n     26: 0 = returns value, 1 = void -- 1 means inferred string length returned\n\n    Remainder:\n     27-31: 0 (reserved)\n */\n\n\n                        /* utility functions */\n\n/*\n     The following utility functions are implemented on top of the\n   basic stream-oriented functions. To simplify the interface, some\n   default options are assumed (compression level and memory usage,\n   standard memory allocation functions). The source code of these\n   utility functions can easily be modified if you need special options.\n*/\n\nZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,\n                                 const Bytef *source, uLong sourceLen));\n/*\n     Compresses the source buffer into the destination buffer.  sourceLen is\n   the byte length of the source buffer. Upon entry, destLen is the total\n   size of the destination buffer, which must be at least the value returned\n   by compressBound(sourceLen). Upon exit, destLen is the actual size of the\n   compressed buffer.\n     This function can be used to compress a whole file at once if the\n   input file is mmap'ed.\n     compress returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_BUF_ERROR if there was not enough room in the output\n   buffer.\n*/\n\nZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,\n                                  const Bytef *source, uLong sourceLen,\n                                  int level));\n/*\n     Compresses the source buffer into the destination buffer. The level\n   parameter has the same meaning as in deflateInit.  sourceLen is the byte\n   length of the source buffer. Upon entry, destLen is the total size of the\n   destination buffer, which must be at least the value returned by\n   compressBound(sourceLen). Upon exit, destLen is the actual size of the\n   compressed buffer.\n\n     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_BUF_ERROR if there was not enough room in the output buffer,\n   Z_STREAM_ERROR if the level parameter is invalid.\n*/\n\nZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));\n/*\n     compressBound() returns an upper bound on the compressed size after\n   compress() or compress2() on sourceLen bytes.  It would be used before\n   a compress() or compress2() call to allocate the destination buffer.\n*/\n\nZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,\n                                   const Bytef *source, uLong sourceLen));\n/*\n     Decompresses the source buffer into the destination buffer.  sourceLen is\n   the byte length of the source buffer. Upon entry, destLen is the total\n   size of the destination buffer, which must be large enough to hold the\n   entire uncompressed data. (The size of the uncompressed data must have\n   been saved previously by the compressor and transmitted to the decompressor\n   by some mechanism outside the scope of this compression library.)\n   Upon exit, destLen is the actual size of the compressed buffer.\n     This function can be used to decompress a whole file at once if the\n   input file is mmap'ed.\n\n     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_BUF_ERROR if there was not enough room in the output\n   buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.\n*/\n\n\ntypedef voidp gzFile;\n\n/*\nZEXTERN gzFile ZEXPORT gzopen  OF((const char *path, const char *mode));\n\n     Opens a gzip (.gz) file for reading or writing. The mode parameter\n   is as in fopen (\"rb\" or \"wb\") but can also include a compression level\n   (\"wb9\") or a strategy: 'f' for filtered data as in \"wb6f\", 'h' for\n   Huffman only compression as in \"wb1h\", or 'R' for run-length encoding\n   as in \"wb1R\". (See the description of deflateInit2 for more information\n   about the strategy parameter.)\n\n     gzopen can be used to read a file which is not in gzip format; in this\n   case gzread will directly read from the file without decompression.\n\n     gzopen returns NULL if the file could not be opened or if there was\n   insufficient memory to allocate the (de)compression state; errno\n   can be checked to distinguish the two cases (if errno is zero, the\n   zlib error is Z_MEM_ERROR).  */\n\nZEXTERN gzFile ZEXPORT gzdopen  OF((int fd, const char *mode));\n/*\n     gzdopen() associates a gzFile with the file descriptor fd.  File\n   descriptors are obtained from calls like open, dup, creat, pipe or\n   fileno (in the file has been previously opened with fopen).\n   The mode parameter is as in gzopen.\n     The next call of gzclose on the returned gzFile will also close the\n   file descriptor fd, just like fclose(fdopen(fd), mode) closes the file\n   descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).\n     gzdopen returns NULL if there was insufficient memory to allocate\n   the (de)compression state.\n*/\n\nZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));\n/*\n     Dynamically update the compression level or strategy. See the description\n   of deflateInit2 for the meaning of these parameters.\n     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not\n   opened for writing.\n*/\n\nZEXTERN int ZEXPORT    gzread  OF((gzFile file, voidp buf, unsigned len));\n/*\n     Reads the given number of uncompressed bytes from the compressed file.\n   If the input file was not in gzip format, gzread copies the given number\n   of bytes into the buffer.\n     gzread returns the number of uncompressed bytes actually read (0 for\n   end of file, -1 for error). */\n\nZEXTERN int ZEXPORT    gzwrite OF((gzFile file,\n                                   voidpc buf, unsigned len));\n/*\n     Writes the given number of uncompressed bytes into the compressed file.\n   gzwrite returns the number of uncompressed bytes actually written\n   (0 in case of error).\n*/\n\nZEXTERN int ZEXPORTVA   gzprintf OF((gzFile file, const char *format, ...));\n/*\n     Converts, formats, and writes the args to the compressed file under\n   control of the format string, as in fprintf. gzprintf returns the number of\n   uncompressed bytes actually written (0 in case of error).  The number of\n   uncompressed bytes written is limited to 4095. The caller should assure that\n   this limit is not exceeded. If it is exceeded, then gzprintf() will return\n   return an error (0) with nothing written. In this case, there may also be a\n   buffer overflow with unpredictable consequences, which is possible only if\n   zlib was compiled with the insecure functions sprintf() or vsprintf()\n   because the secure snprintf() or vsnprintf() functions were not available.\n*/\n\nZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));\n/*\n      Writes the given null-terminated string to the compressed file, excluding\n   the terminating null character.\n      gzputs returns the number of characters written, or -1 in case of error.\n*/\n\nZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));\n/*\n      Reads bytes from the compressed file until len-1 characters are read, or\n   a newline character is read and transferred to buf, or an end-of-file\n   condition is encountered.  The string is then terminated with a null\n   character.\n      gzgets returns buf, or Z_NULL in case of error.\n*/\n\nZEXTERN int ZEXPORT    gzputc OF((gzFile file, int c));\n/*\n      Writes c, converted to an unsigned char, into the compressed file.\n   gzputc returns the value that was written, or -1 in case of error.\n*/\n\nZEXTERN int ZEXPORT    gzgetc OF((gzFile file));\n/*\n      Reads one byte from the compressed file. gzgetc returns this byte\n   or -1 in case of end of file or error.\n*/\n\nZEXTERN int ZEXPORT    gzungetc OF((int c, gzFile file));\n/*\n      Push one character back onto the stream to be read again later.\n   Only one character of push-back is allowed.  gzungetc() returns the\n   character pushed, or -1 on failure.  gzungetc() will fail if a\n   character has been pushed but not read yet, or if c is -1. The pushed\n   character will be discarded if the stream is repositioned with gzseek()\n   or gzrewind().\n*/\n\nZEXTERN int ZEXPORT    gzflush OF((gzFile file, int flush));\n/*\n     Flushes all pending output into the compressed file. The parameter\n   flush is as in the deflate() function. The return value is the zlib\n   error number (see function gzerror below). gzflush returns Z_OK if\n   the flush parameter is Z_FINISH and all output could be flushed.\n     gzflush should be called only when strictly necessary because it can\n   degrade compression.\n*/\n\n/*\nZEXTERN z_off_t ZEXPORT    gzseek OF((gzFile file,\n                                      z_off_t offset, int whence));\n\n      Sets the starting position for the next gzread or gzwrite on the\n   given compressed file. The offset represents a number of bytes in the\n   uncompressed data stream. The whence parameter is defined as in lseek(2);\n   the value SEEK_END is not supported.\n     If the file is opened for reading, this function is emulated but can be\n   extremely slow. If the file is opened for writing, only forward seeks are\n   supported; gzseek then compresses a sequence of zeroes up to the new\n   starting position.\n\n      gzseek returns the resulting offset location as measured in bytes from\n   the beginning of the uncompressed stream, or -1 in case of error, in\n   particular if the file is opened for writing and the new starting position\n   would be before the current position.\n*/\n\nZEXTERN int ZEXPORT    gzrewind OF((gzFile file));\n/*\n     Rewinds the given file. This function is supported only for reading.\n\n   gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)\n*/\n\n/*\nZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));\n\n     Returns the starting position for the next gzread or gzwrite on the\n   given compressed file. This position represents a number of bytes in the\n   uncompressed data stream.\n\n   gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)\n*/\n\nZEXTERN int ZEXPORT gzeof OF((gzFile file));\n/*\n     Returns 1 when EOF has previously been detected reading the given\n   input stream, otherwise zero.\n*/\n\nZEXTERN int ZEXPORT gzdirect OF((gzFile file));\n/*\n     Returns 1 if file is being read directly without decompression, otherwise\n   zero.\n*/\n\nZEXTERN int ZEXPORT    gzclose OF((gzFile file));\n/*\n     Flushes all pending output if necessary, closes the compressed file\n   and deallocates all the (de)compression state. The return value is the zlib\n   error number.  Note that once file is close, you cannot call gzerror with\n   file, since its structures have been deallocated.\n*/\n\nZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));\n/*\n     Returns the error message for the last error which occurred on the\n   given compressed file. errnum is set to zlib error number. If an\n   error occurred in the file system and not in the compression library,\n   errnum is set to Z_ERRNO and the application may consult errno\n   to get the exact error code.\n\n   The application must not modify the returned string and future calls to\n   this function may invalidate the returned string.\n*/\n\nZEXTERN void ZEXPORT gzclearerr OF((gzFile file));\n/*\n     Clears the error and end-of-file flags for file. This is analogous to the\n   clearerr() function in stdio. This is useful for continuing to read a gzip\n   file that is being written concurrently.\n*/\n\n                        /* checksum functions */\n\n/*\n     These functions are not related to compression but are exported\n   anyway because they might be useful in applications using the\n   compression library.\n*/\n\nZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));\n/*\n     Update a running Adler-32 checksum with the bytes buf[0..len-1] and\n   return the updated checksum. If buf is NULL, this function returns\n   the required initial value for the checksum.\n   An Adler-32 checksum is almost as reliable as a CRC32 but can be computed\n   much faster. Usage example:\n\n     uLong adler = adler32(0L, Z_NULL, 0);\n\n     while (read_buffer(buffer, length) != EOF) {\n       adler = adler32(adler, buffer, length);\n     }\n     if (adler != original_adler) error();\n*/\n\n/*\nZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,\n                                          z_off_t len2));\n\n     Combine two Adler-32 checksums into one.  For two sequences of bytes, seq1\n   and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for\n   each, adler1 and adler2.  adler32_combine() returns the Adler-32 checksum of\n   seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.\n*/\n\nZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));\n/*\n     Update a running CRC-32 with the bytes buf[0..len-1] and return the\n   updated CRC-32. If buf is NULL, this function returns the required initial\n   value for the for the crc. Pre- and post-conditioning (one's complement) is\n   performed within this function so it shouldn't be done by the application.\n   Usage example:\n\n     uLong crc = crc32(0L, Z_NULL, 0);\n\n     while (read_buffer(buffer, length) != EOF) {\n       crc = crc32(crc, buffer, length);\n     }\n     if (crc != original_crc) error();\n*/\n\n/*\nZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));\n\n     Combine two CRC-32 check values into one.  For two sequences of bytes,\n   seq1 and seq2 with lengths len1 and len2, CRC-32 check values were\n   calculated for each, crc1 and crc2.  crc32_combine() returns the CRC-32\n   check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and\n   len2.\n*/\n\n\n                        /* various hacks, don't look :) */\n\n/* deflateInit and inflateInit are macros to allow checking the zlib version\n * and the compiler's view of z_stream:\n */\nZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,\n                                     const char *version, int stream_size));\nZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,\n                                     const char *version, int stream_size));\nZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,\n                                      int windowBits, int memLevel,\n                                      int strategy, const char *version,\n                                      int stream_size));\nZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,\n                                      const char *version, int stream_size));\nZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,\n                                         unsigned char FAR *window,\n                                         const char *version,\n                                         int stream_size));\n#define deflateInit(strm, level) \\\n        deflateInit_((strm), (level),       ZLIB_VERSION, sizeof(z_stream))\n#define inflateInit(strm) \\\n        inflateInit_((strm),                ZLIB_VERSION, sizeof(z_stream))\n#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \\\n        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\\\n                      (strategy),           ZLIB_VERSION, sizeof(z_stream))\n#define inflateInit2(strm, windowBits) \\\n        inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))\n#define inflateBackInit(strm, windowBits, window) \\\n        inflateBackInit_((strm), (windowBits), (window), \\\n                                            ZLIB_VERSION, sizeof(z_stream))\n\n#ifdef _LARGEFILE64_SOURCE\n   ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));\n   ZEXTERN off64_t ZEXPORT gzseek64 OF((gzFile, off64_t, int));\n   ZEXTERN off64_t ZEXPORT gztell64 OF((gzFile));\n   ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, off64_t));\n   ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, off64_t));\n#endif\n\n/* Mono: disable this. We don't use it and makes compilation fail\n#if _FILE_OFFSET_BITS == 64\n#  define gzopen gzopen64\n#  define gzseek gzseek64\n#  define gztell gztell64\n#  define adler32_combine adler32_combine64\n#  define crc32_combine crc32_combine64\n#else\n*/\n   ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));\n   ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));\n   ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));\n   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));\n   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));\n/*#endif*/\n\n#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)\n    struct internal_state {int dummy;}; /* hack for buggy compilers */\n#endif\n\nZEXTERN const char   * ZEXPORT zError           OF((int));\nZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp));\nZEXTERN const uLongf * ZEXPORT get_crc_table    OF((void));\nZEXTERN int            ZEXPORT inflateUndermine OF((z_streamp, int));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZLIB_H */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/zutil.c",
    "content": "/* zutil.c -- target dependent utility functions for the compression library\n * Copyright (C) 1995-2005 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#include \"zutil.h\"\n\n#ifndef NO_DUMMY_DECL\nstruct internal_state      {int dummy;}; /* for buggy compilers */\n#endif\n\nconst char * const z_errmsg[10] = {\n\"need dictionary\",     /* Z_NEED_DICT       2  */\n\"stream end\",          /* Z_STREAM_END      1  */\n\"\",                    /* Z_OK              0  */\n\"file error\",          /* Z_ERRNO         (-1) */\n\"stream error\",        /* Z_STREAM_ERROR  (-2) */\n\"data error\",          /* Z_DATA_ERROR    (-3) */\n\"insufficient memory\", /* Z_MEM_ERROR     (-4) */\n\"buffer error\",        /* Z_BUF_ERROR     (-5) */\n\"incompatible version\",/* Z_VERSION_ERROR (-6) */\n\"\"};\n\n\nconst char * ZEXPORT zlibVersion()\n{\n    return ZLIB_VERSION;\n}\n\nuLong ZEXPORT zlibCompileFlags()\n{\n    uLong flags;\n\n    flags = 0;\n    switch (sizeof(uInt)) {\n    case 2:     break;\n    case 4:     flags += 1;     break;\n    case 8:     flags += 2;     break;\n    default:    flags += 3;\n    }\n    switch (sizeof(uLong)) {\n    case 2:     break;\n    case 4:     flags += 1 << 2;        break;\n    case 8:     flags += 2 << 2;        break;\n    default:    flags += 3 << 2;\n    }\n    switch (sizeof(voidpf)) {\n    case 2:     break;\n    case 4:     flags += 1 << 4;        break;\n    case 8:     flags += 2 << 4;        break;\n    default:    flags += 3 << 4;\n    }\n    switch (sizeof(z_off_t)) {\n    case 2:     break;\n    case 4:     flags += 1 << 6;        break;\n    case 8:     flags += 2 << 6;        break;\n    default:    flags += 3 << 6;\n    }\n#ifdef DEBUG\n    flags += 1 << 8;\n#endif\n#if defined(ASMV) || defined(ASMINF)\n    flags += 1 << 9;\n#endif\n#ifdef ZLIB_WINAPI\n    flags += 1 << 10;\n#endif\n#ifdef BUILDFIXED\n    flags += 1 << 12;\n#endif\n#ifdef DYNAMIC_CRC_TABLE\n    flags += 1 << 13;\n#endif\n#ifdef NO_GZCOMPRESS\n    flags += 1L << 16;\n#endif\n#ifdef NO_GZIP\n    flags += 1L << 17;\n#endif\n#ifdef PKZIP_BUG_WORKAROUND\n    flags += 1L << 20;\n#endif\n#ifdef FASTEST\n    flags += 1L << 21;\n#endif\n#ifdef STDC\n#  ifdef NO_vsnprintf\n        flags += 1L << 25;\n#    ifdef HAS_vsprintf_void\n        flags += 1L << 26;\n#    endif\n#  else\n#    ifdef HAS_vsnprintf_void\n        flags += 1L << 26;\n#    endif\n#  endif\n#else\n        flags += 1L << 24;\n#  ifdef NO_snprintf\n        flags += 1L << 25;\n#    ifdef HAS_sprintf_void\n        flags += 1L << 26;\n#    endif\n#  else\n#    ifdef HAS_snprintf_void\n        flags += 1L << 26;\n#    endif\n#  endif\n#endif\n    return flags;\n}\n\n#ifdef DEBUG\n\n#  ifndef verbose\n#    define verbose 0\n#  endif\nint z_verbose = verbose;\n\nvoid z_error (m)\n    char *m;\n{\n    fprintf(stderr, \"%s\\n\", m);\n    exit(1);\n}\n#endif\n\n/* exported to allow conversion of error code to string for compress() and\n * uncompress()\n */\nconst char * ZEXPORT zError(err)\n    int err;\n{\n    return ERR_MSG(err);\n}\n\n#if defined(_WIN32_WCE)\n    /* The Microsoft C Run-Time Library for Windows CE doesn't have\n     * errno.  We define it as a global variable to simplify porting.\n     * Its value is always 0 and should not be used.\n     */\n    int errno = 0;\n#endif\n\n#ifndef HAVE_MEMCPY\n\nvoid zmemcpy(dest, source, len)\n    Bytef* dest;\n    const Bytef* source;\n    uInt  len;\n{\n    if (len == 0) return;\n    do {\n        *dest++ = *source++; /* ??? to be unrolled */\n    } while (--len != 0);\n}\n\nint zmemcmp(s1, s2, len)\n    const Bytef* s1;\n    const Bytef* s2;\n    uInt  len;\n{\n    uInt j;\n\n    for (j = 0; j < len; j++) {\n        if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;\n    }\n    return 0;\n}\n\nvoid zmemzero(dest, len)\n    Bytef* dest;\n    uInt  len;\n{\n    if (len == 0) return;\n    do {\n        *dest++ = 0;  /* ??? to be unrolled */\n    } while (--len != 0);\n}\n#endif\n\n\n#ifdef SYS16BIT\n\n#ifdef __TURBOC__\n/* Turbo C in 16-bit mode */\n\n#  define MY_ZCALLOC\n\n/* Turbo C malloc() does not allow dynamic allocation of 64K bytes\n * and farmalloc(64K) returns a pointer with an offset of 8, so we\n * must fix the pointer. Warning: the pointer must be put back to its\n * original form in order to free it, use zcfree().\n */\n\n#define MAX_PTR 10\n/* 10*64K = 640K */\n\nlocal int next_ptr = 0;\n\ntypedef struct ptr_table_s {\n    voidpf org_ptr;\n    voidpf new_ptr;\n} ptr_table;\n\nlocal ptr_table table[MAX_PTR];\n/* This table is used to remember the original form of pointers\n * to large buffers (64K). Such pointers are normalized with a zero offset.\n * Since MSDOS is not a preemptive multitasking OS, this table is not\n * protected from concurrent access. This hack doesn't work anyway on\n * a protected system like OS/2. Use Microsoft C instead.\n */\n\nvoidpf zcalloc (voidpf opaque, unsigned items, unsigned size)\n{\n    voidpf buf = opaque; /* just to make some compilers happy */\n    ulg bsize = (ulg)items*size;\n\n    /* If we allocate less than 65520 bytes, we assume that farmalloc\n     * will return a usable pointer which doesn't have to be normalized.\n     */\n    if (bsize < 65520L) {\n        buf = farmalloc(bsize);\n        if (*(ush*)&buf != 0) return buf;\n    } else {\n        buf = farmalloc(bsize + 16L);\n    }\n    if (buf == NULL || next_ptr >= MAX_PTR) return NULL;\n    table[next_ptr].org_ptr = buf;\n\n    /* Normalize the pointer to seg:0 */\n    *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;\n    *(ush*)&buf = 0;\n    table[next_ptr++].new_ptr = buf;\n    return buf;\n}\n\nvoid  zcfree (voidpf opaque, voidpf ptr)\n{\n    int n;\n    if (*(ush*)&ptr != 0) { /* object < 64K */\n        farfree(ptr);\n        return;\n    }\n    /* Find the original pointer */\n    for (n = 0; n < next_ptr; n++) {\n        if (ptr != table[n].new_ptr) continue;\n\n        farfree(table[n].org_ptr);\n        while (++n < next_ptr) {\n            table[n-1] = table[n];\n        }\n        next_ptr--;\n        return;\n    }\n    ptr = opaque; /* just to make some compilers happy */\n    Assert(0, \"zcfree: ptr not found\");\n}\n\n#endif /* __TURBOC__ */\n\n\n#ifdef M_I86\n/* Microsoft C in 16-bit mode */\n\n#  define MY_ZCALLOC\n\n#if (!defined(_MSC_VER) || (_MSC_VER <= 600))\n#  define _halloc  halloc\n#  define _hfree   hfree\n#endif\n\nvoidpf zcalloc (voidpf opaque, unsigned items, unsigned size)\n{\n    if (opaque) opaque = 0; /* to make compiler happy */\n    return _halloc((long)items, size);\n}\n\nvoid  zcfree (voidpf opaque, voidpf ptr)\n{\n    if (opaque) opaque = 0; /* to make compiler happy */\n    _hfree(ptr);\n}\n\n#endif /* M_I86 */\n\n#endif /* SYS16BIT */\n\n\n#ifndef MY_ZCALLOC /* Any system without a special alloc function */\n\n#ifndef STDC\nextern voidp  malloc OF((uInt size));\nextern voidp  calloc OF((uInt items, uInt size));\nextern void   free   OF((voidpf ptr));\n#endif\n\nvoidpf zcalloc (opaque, items, size)\n    voidpf opaque;\n    unsigned items;\n    unsigned size;\n{\n    if (opaque) items += size - size; /* make compiler happy */\n    return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :\n                              (voidpf)calloc(items, size);\n}\n\nvoid  zcfree (opaque, ptr)\n    voidpf opaque;\n    voidpf ptr;\n{\n    free(ptr);\n    if (opaque) return; /* make compiler happy */\n}\n\n#endif /* MY_ZCALLOC */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/external/zlib/zutil.h",
    "content": "/* zutil.h -- internal interface and configuration of the compression library\n * Copyright (C) 1995-2006 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n/* @(#) $Id$ */\n\n#ifndef ZUTIL_H\n#define ZUTIL_H\n\n#define ZLIB_INTERNAL\n#include \"zlib.h\"\n\n#ifdef STDC\n#  ifndef _WIN32_WCE\n#    include <stddef.h>\n#  endif\n#  include <string.h>\n#  include <stdlib.h>\n#endif\n#if defined(NO_ERRNO_H) || defined(_WIN32_WCE)\n#   ifdef _WIN32_WCE\n      /* The Microsoft C Run-Time Library for Windows CE doesn't have\n       * errno.  We define it as a global variable to simplify porting.\n       * Its value is always 0 and should not be used.  We rename it to\n       * avoid conflict with other libraries that use the same workaround.\n       */\n#     define errno z_errno\n#   endif\n    extern int errno;\n#else\n#   include <errno.h>\n#endif\n\n#ifndef local\n#  define local static\n#endif\n/* compile with -Dlocal if your debugger can't find static symbols */\n\ntypedef unsigned char  uch;\ntypedef uch FAR uchf;\ntypedef unsigned short ush;\ntypedef ush FAR ushf;\ntypedef unsigned long  ulg;\n\nextern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */\n/* (size given to avoid silly warnings with Visual C++) */\n\n#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]\n\n#define ERR_RETURN(strm,err) \\\n  return (strm->msg = (char*)ERR_MSG(err), (err))\n/* To be used only when the state is known to be valid */\n\n        /* common constants */\n\n#ifndef DEF_WBITS\n#  define DEF_WBITS MAX_WBITS\n#endif\n/* default windowBits for decompression. MAX_WBITS is for compression only */\n\n#if MAX_MEM_LEVEL >= 8\n#  define DEF_MEM_LEVEL 8\n#else\n#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL\n#endif\n/* default memLevel */\n\n#define STORED_BLOCK 0\n#define STATIC_TREES 1\n#define DYN_TREES    2\n/* The three kinds of block type */\n\n#define MIN_MATCH  3\n#define MAX_MATCH  258\n/* The minimum and maximum match lengths */\n\n#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */\n\n        /* target dependencies */\n\n#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))\n#  define OS_CODE  0x00\n#  if defined(__TURBOC__) || defined(__BORLANDC__)\n#    if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))\n       /* Allow compilation with ANSI keywords only enabled */\n       void _Cdecl farfree( void *block );\n       void *_Cdecl farmalloc( unsigned long nbytes );\n#    else\n#      include <alloc.h>\n#    endif\n#  else /* MSC or DJGPP */\n#    include <malloc.h>\n#  endif\n#endif\n\n#ifdef AMIGA\n#  define OS_CODE  0x01\n#endif\n\n#if defined(VAXC) || defined(VMS)\n#  define OS_CODE  0x02\n#  define F_OPEN(name, mode) \\\n     fopen((name), (mode), \"mbc=60\", \"ctx=stm\", \"rfm=fix\", \"mrs=512\")\n#endif\n\n#if defined(ATARI) || defined(atarist)\n#  define OS_CODE  0x05\n#endif\n\n#ifdef OS2\n#  define OS_CODE  0x06\n#  ifdef M_I86\n     #include <malloc.h>\n#  endif\n#endif\n\n#if defined(MACOS) || defined(TARGET_OS_MAC)\n#  define OS_CODE  0x07\n#  if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os\n#    include <unix.h> /* for fdopen */\n#  else\n#    ifndef fdopen\n#      define fdopen(fd,mode) NULL /* No fdopen() */\n#    endif\n#  endif\n#endif\n\n#ifdef TOPS20\n#  define OS_CODE  0x0a\n#endif\n\n#ifdef WIN32\n#  ifndef __CYGWIN__  /* Cygwin is Unix, not Win32 */\n#    define OS_CODE  0x0b\n#  endif\n#endif\n\n#ifdef __50SERIES /* Prime/PRIMOS */\n#  define OS_CODE  0x0f\n#endif\n\n#if defined(_BEOS_) || defined(RISCOS)\n#  define fdopen(fd,mode) NULL /* No fdopen() */\n#endif\n\n#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX\n#  if defined(_WIN32_WCE)\n#    define fdopen(fd,mode) NULL /* No fdopen() */\n#    ifndef _PTRDIFF_T_DEFINED\n       typedef int ptrdiff_t;\n#      define _PTRDIFF_T_DEFINED\n#    endif\n#  else\n#    define fdopen(fd,type)  _fdopen(fd,type)\n#  endif\n#endif\n\n#if defined(__BORLANDC__)\n#pragma warn -8004\n#pragma warn -8008\n#pragma warn -8066\n#endif\n\n        /* common defaults */\n\n#ifndef OS_CODE\n#  define OS_CODE  0x03  /* assume Unix */\n#endif\n\n#ifndef F_OPEN\n#  define F_OPEN(name, mode) fopen((name), (mode))\n#endif\n\n#ifdef _LARGEFILE64_SOURCE\n#  define F_OPEN64(name, mode) fopen64((name), (mode))\n#else\n#  define F_OPEN64(name, mode) fopen((name), (mode))\n#endif\n\n         /* functions */\n\n#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)\n#  ifndef HAVE_VSNPRINTF\n#    define HAVE_VSNPRINTF\n#  endif\n#endif\n#if defined (_MSC_VER) && (_MSC_VER > 1800)\n#   define HAVE_VSNPRINTF\n#endif\n#if defined(__CYGWIN__)\n#  ifndef HAVE_VSNPRINTF\n#    define HAVE_VSNPRINTF\n#  endif\n#endif\n#ifndef HAVE_VSNPRINTF\n#  ifdef MSDOS\n     /* vsnprintf may exist on some MS-DOS compilers (DJGPP?),\n        but for now we just assume it doesn't. */\n#    define NO_vsnprintf\n#  endif\n#  ifdef __TURBOC__\n#    define NO_vsnprintf\n#  endif\n#  ifdef WIN32\n     /* In Win32, vsnprintf is available as the \"non-ANSI\" _vsnprintf. */\n#    if !defined(vsnprintf) && !defined(NO_vsnprintf)\n#      define vsnprintf _vsnprintf\n#    endif\n#  endif\n#  ifdef __SASC\n#    define NO_vsnprintf\n#  endif\n#endif\n#ifdef VMS\n#  define NO_vsnprintf\n#endif\n\n#if defined(pyr)\n#  define NO_MEMCPY\n#endif\n#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)\n /* Use our own functions for small and medium model with MSC <= 5.0.\n  * You may have to use the same strategy for Borland C (untested).\n  * The __SC__ check is for Symantec.\n  */\n#  define NO_MEMCPY\n#endif\n#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)\n#  define HAVE_MEMCPY\n#endif\n#ifdef HAVE_MEMCPY\n#  ifdef SMALL_MEDIUM /* MSDOS small or medium model */\n#    define zmemcpy _fmemcpy\n#    define zmemcmp _fmemcmp\n#    define zmemzero(dest, len) _fmemset(dest, 0, len)\n#  else\n#    define zmemcpy memcpy\n#    define zmemcmp memcmp\n#    define zmemzero(dest, len) memset(dest, 0, len)\n#  endif\n#else\n   extern void zmemcpy  OF((Bytef* dest, const Bytef* source, uInt len));\n   extern int  zmemcmp  OF((const Bytef* s1, const Bytef* s2, uInt len));\n   extern void zmemzero OF((Bytef* dest, uInt len));\n#endif\n\n#if Z_PREFIX\n#  define z_verbose il2cpp_z__verbose\n#  define z_error   il2cpp_z__error\n#endif\n\n/* Diagnostic functions */\n#ifdef DEBUG\n#  include <stdio.h>\n   extern int z_verbose;\n   extern void z_error    OF((char *m));\n#  define Assert(cond,msg) {if(!(cond)) z_error(msg);}\n#  define Trace(x) {if (z_verbose>=0) fprintf x ;}\n#  define Tracev(x) {if (z_verbose>0) fprintf x ;}\n#  define Tracevv(x) {if (z_verbose>1) fprintf x ;}\n#  define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}\n#  define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}\n#else\n#  define Assert(cond,msg)\n#  define Trace(x)\n#  define Tracev(x)\n#  define Tracevv(x)\n#  define Tracec(c,x)\n#  define Tracecv(c,x)\n#endif\n\n\nvoidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));\nvoid   zcfree  OF((voidpf opaque, voidpf ptr));\n\n#define ZALLOC(strm, items, size) \\\n           (*((strm)->zalloc))((strm)->opaque, (items), (size))\n#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))\n#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}\n\n#endif /* ZUTIL_H */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/externals/MonoPosixHelper.cpp",
    "content": "#include \"MonoPosixHelper.h\"\n\n#include <string.h>\n#include <stdlib.h>\n\n#include \"external/zlib/zlib.h\"\n\n#define BUFFER_SIZE 4096\n#define ARGUMENT_ERROR -10\n#define IO_ERROR -11\n\n#if NET_4_0\ntypedef int32_t (*read_write_func)(intptr_t buffer, int32_t length, intptr_t gchandle);\n#else\ntypedef int32_t (STDCALL * read_write_func)(intptr_t buffer, int32_t length, intptr_t gchandle);\n#endif\n\nstruct ZStream\n{\n    z_stream *stream;\n    uint8_t *buffer;\n    read_write_func func;\n    void *gchandle;\n    uint8_t compress;\n    uint8_t eof;\n};\n\nstatic int32_t write_to_managed(ZStream *stream)\n{\n    int32_t n;\n    z_stream *zs;\n\n    zs = stream->stream;\n    if (zs->avail_out != BUFFER_SIZE)\n    {\n        intptr_t buffer_ptr = reinterpret_cast<intptr_t>(stream->buffer);\n        intptr_t gchandle_ptr = reinterpret_cast<intptr_t>(stream->gchandle);\n\n        n = stream->func(buffer_ptr, BUFFER_SIZE - zs->avail_out, gchandle_ptr);\n        zs->next_out = stream->buffer;\n        zs->avail_out = BUFFER_SIZE;\n        if (n < 0)\n            return IO_ERROR;\n    }\n    return 0;\n}\n\nstatic int32_t flush_internal(ZStream *stream, bool is_final)\n{\n    int32_t status;\n\n    if (!stream->compress)\n        return 0;\n\n    if (!is_final)\n    {\n        status = deflate(stream->stream, Z_PARTIAL_FLUSH);\n        if (status != Z_OK && status != Z_STREAM_END)\n            return status;\n    }\n\n    return write_to_managed(stream);\n}\n\nstatic void *z_alloc(void *opaque, uint32_t nitems, uint32_t item_size)\n{\n    return calloc(nitems, item_size);\n}\n\nstatic void z_free(void *opaque, void *ptr)\n{\n    free(ptr);\n}\n\nintptr_t CreateZStream(int32_t compress, uint8_t gzip, Il2CppMethodPointer func_ptr, intptr_t gchandle)\n{\n    z_stream *z;\n    int32_t retval;\n    ZStream *result;\n\n    intptr_t result_ptr = 0;\n    read_write_func func = (read_write_func)func_ptr;\n\n    if (func == NULL)\n        return result_ptr;\n\n#if !defined(ZLIB_VERNUM) || (ZLIB_VERNUM < 0x1204)\n    // Older versions of zlib do not support raw deflate or gzip\n    return NULL;\n#endif\n\n    z = (z_stream*)calloc(1, sizeof(z_stream));\n    if (compress)\n    {\n        retval = deflateInit2(z, Z_DEFAULT_COMPRESSION, Z_DEFLATED, gzip ? 31 : -15, 8, Z_DEFAULT_STRATEGY);\n    }\n    else\n    {\n        retval = inflateInit2(z, gzip ? 31 : -15);\n    }\n\n    if (retval != Z_OK)\n    {\n        free(z);\n        return result_ptr;\n    }\n\n    z->zalloc = z_alloc;\n    z->zfree = z_free;\n    result = (ZStream*)calloc(1, sizeof(ZStream));\n    result->stream = z;\n    result->func = func;\n    result->gchandle = reinterpret_cast<void*>(gchandle);\n    result->compress = compress;\n    result->buffer = (uint8_t*)malloc(BUFFER_SIZE * sizeof(uint8_t));\n\n    result_ptr = reinterpret_cast<intptr_t>(result);\n    return result_ptr;\n}\n\nint32_t CloseZStream(intptr_t zstream)\n{\n    int32_t status;\n    int32_t flush_status;\n\n    ZStream *stream = reinterpret_cast<ZStream*>(zstream);\n\n    if (stream == NULL)\n        return ARGUMENT_ERROR;\n\n    status = 0;\n    if (stream->compress)\n    {\n        if (stream->stream->total_in > 0)\n        {\n            do\n            {\n                status = deflate(stream->stream, Z_FINISH);\n                flush_status = flush_internal(stream, true);\n            }\n            while (status == Z_OK); /* We want Z_STREAM_END or error here here */\n\n            if (status == Z_STREAM_END)\n                status = flush_status;\n        }\n        deflateEnd(stream->stream);\n    }\n    else\n    {\n        inflateEnd(stream->stream);\n    }\n\n    free(stream->buffer);\n    free(stream->stream);\n    memset(stream, 0, sizeof(ZStream));\n    free(stream);\n\n    return status;\n}\n\nint32_t Flush(intptr_t zstream)\n{\n    ZStream *stream = (ZStream*)zstream;\n    return flush_internal(stream, false);\n}\n\nint32_t ReadZStream(intptr_t zstream, intptr_t zbuffer, int32_t length)\n{\n    int32_t n;\n    int32_t status;\n    z_stream *zs;\n\n    ZStream *stream = (ZStream*)zstream;\n    uint8_t *buffer = (uint8_t*)zbuffer;\n\n    if (stream == NULL || buffer == NULL || length < 0)\n        return ARGUMENT_ERROR;\n\n    if (stream->eof)\n        return 0;\n\n    zs = stream->stream;\n    zs->next_out = buffer;\n    zs->avail_out = length;\n    while (zs->avail_out > 0)\n    {\n        if (zs->avail_in == 0)\n        {\n            intptr_t buffer_ptr = reinterpret_cast<intptr_t>(stream->buffer);\n            intptr_t gchandle_ptr = reinterpret_cast<intptr_t>(stream->gchandle);\n\n            n = stream->func(buffer_ptr, BUFFER_SIZE, gchandle_ptr);\n            if (n <= 0)\n            {\n                stream->eof = 1;\n                break;\n            }\n            zs->next_in = stream->buffer;\n            zs->avail_in = n;\n        }\n\n        status = inflate(stream->stream, Z_SYNC_FLUSH);\n        if (status == Z_STREAM_END)\n        {\n            stream->eof = 1;\n            break;\n        }\n        else if (status != Z_OK)\n        {\n            return status;\n        }\n    }\n    return length - zs->avail_out;\n}\n\nint32_t WriteZStream(intptr_t zstream, intptr_t zbuffer, int32_t length)\n{\n    int32_t n;\n    int32_t status;\n    z_stream *zs;\n\n    ZStream *stream = (ZStream*)zstream;\n    uint8_t *buffer = (uint8_t*)zbuffer;\n\n    if (stream == NULL || buffer == NULL || length < 0)\n        return ARGUMENT_ERROR;\n\n    if (stream->eof)\n        return IO_ERROR;\n\n    zs = stream->stream;\n    zs->next_in = buffer;\n    zs->avail_in = length;\n    while (zs->avail_in > 0)\n    {\n        if (zs->avail_out == 0)\n        {\n            zs->next_out = stream->buffer;\n            zs->avail_out = BUFFER_SIZE;\n        }\n        status = deflate(stream->stream, Z_NO_FLUSH);\n        if (status != Z_OK && status != Z_STREAM_END)\n            return status;\n\n        if (zs->avail_out == 0)\n        {\n            n = write_to_managed(stream);\n            if (n < 0)\n                return n;\n        }\n    }\n    return length;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/externals/MonoPosixHelper.h",
    "content": "#pragma once\n\n#include <stdint.h>\n\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nextern \"C\"\n{\nstruct ZStream;\n\nIL2CPP_EXPORT intptr_t CreateZStream(int32_t compress, uint8_t gzip, Il2CppMethodPointer func, intptr_t gchandle);\nIL2CPP_EXPORT int32_t CloseZStream(intptr_t zstream);\nIL2CPP_EXPORT int32_t Flush(intptr_t zstream);\nIL2CPP_EXPORT int32_t ReadZStream(intptr_t zstream, intptr_t buffer, int32_t length);\nIL2CPP_EXPORT int32_t WriteZStream(intptr_t zstream, intptr_t buffer, int32_t length);\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/gc/Allocator.h",
    "content": "#pragma once\n#include \"GarbageCollector.h\"\n\nnamespace il2cpp\n{\nnamespace gc\n{\n    template<typename T>\n    class Allocator\n    {\n    public:\n        typedef size_t    size_type;\n        typedef ptrdiff_t difference_type;\n        typedef T*        pointer;\n        typedef const T*  const_pointer;\n        typedef T&        reference;\n        typedef const T&  const_reference;\n        typedef T         value_type;\n        typedef Allocator<T> allocator_type;\n        Allocator() {}\n        Allocator(const Allocator&) {}\n\n        pointer allocate(size_type n, const void * = 0)\n        {\n            T* t = (T*)GarbageCollector::AllocateFixed(n * sizeof(T), 0);\n            return t;\n        }\n\n        void deallocate(void* p, size_type)\n        {\n            if (p)\n            {\n                GarbageCollector::FreeFixed(p);\n            }\n        }\n\n        pointer address(reference x) const { return &x; }\n        const_pointer address(const_reference x) const { return &x; }\n        Allocator<T>& operator=(const Allocator&) { return *this; }\n        void construct(pointer p, const T& val) { new((T*)p)T(val); }\n        void destroy(pointer p) { p->~T(); }\n\n        size_type max_size() const { return size_t(-1); }\n\n        template<class U>\n        struct rebind { typedef Allocator<U> other; };\n\n        template<class U>\n        Allocator(const Allocator<U>&) {}\n\n        template<class U>\n        Allocator& operator=(const Allocator<U>&) { return *this; }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/gc/AppendOnlyGCHashMap.h",
    "content": "#pragma once\n\n#include \"utils/Il2CppHashMap.h\"\n#include \"utils/NonCopyable.h\"\n#include \"GarbageCollector.h\"\n\nnamespace il2cpp\n{\nnamespace gc\n{\n    template<class Key, class T,\n             class HashFcn,\n             class EqualKey = std::equal_to<Key> >\n    class AppendOnlyGCHashMap : public il2cpp::utils::NonCopyable\n    {\n        typedef Il2CppHashMap<Key, size_t, HashFcn, EqualKey> hash_map_type;\n        typedef typename Il2CppHashMap<Key, size_t, HashFcn, EqualKey>::const_iterator ConstIterator;\n    public:\n\n        typedef typename hash_map_type::key_type key_type;\n        typedef T data_type;\n        typedef typename hash_map_type::size_type size_type;\n        typedef typename hash_map_type::hasher hasher;\n        typedef typename hash_map_type::key_equal key_equal;\n\n        AppendOnlyGCHashMap() :\n            m_Data(NULL),\n            m_Size(0)\n        {\n        }\n\n        ~AppendOnlyGCHashMap()\n        {\n            if (m_Data)\n                il2cpp::gc::GarbageCollector::FreeFixed(m_Data);\n        }\n\n        bool Contains(const Key& k)\n        {\n            return m_Map.find(k) != m_Map.end();\n        }\n\n        // Returns true if value was added. False if it already existed\n        bool Add(const Key& k, T value)\n        {\n            if (m_Map.find(k) != m_Map.end())\n                return false;\n\n            if (m_Size == 0)\n            {\n                m_Size = 8;\n                m_Data = (T*)il2cpp::gc::GarbageCollector::AllocateFixed(m_Size * sizeof(T), NULL);\n                assert(m_Data);\n            }\n            else if (m_Map.size() == m_Size)\n            {\n                size_t newSize = 2 * m_Size;\n                T* newData = (T*)il2cpp::gc::GarbageCollector::AllocateFixed(newSize * sizeof(T), NULL);\n\n                MemCpyData memCpyData = { newData, m_Data, m_Size * sizeof(T) };\n                // perform memcpy with GC lock held so GC doesn't see torn pointer values.I think this is less of an issue with Boehm than other GCs, but being safe.\n                il2cpp::gc::GarbageCollector::CallWithAllocLockHeld(&CopyValues, &memCpyData);\n\n                il2cpp::gc::GarbageCollector::FreeFixed(m_Data);\n                m_Size = newSize;\n                m_Data = newData;\n                assert(m_Data);\n            }\n\n            size_t index = m_Map.size();\n            m_Map.insert(std::make_pair(k, index));\n            m_Data[index] = value;\n            assert(m_Map.size() <= m_Size);\n            return true;\n        }\n\n        bool TryGetValue(const Key& k, T* value)\n        {\n            ConstIterator iter = m_Map.find(k);\n            if (iter == m_Map.end())\n                return false;\n\n            size_t index = iter->second;\n            assert(index <= m_Map.size());\n            *value = m_Data[index];\n            return true;\n        }\n\n    private:\n        struct MemCpyData\n        {\n            void* dst;\n            const void* src;\n            size_t size;\n        };\n\n        static void* CopyValues(void* arg)\n        {\n            MemCpyData* thisPtr = (MemCpyData*)arg;\n            memcpy(thisPtr->dst, thisPtr->src, thisPtr->size);\n            return NULL;\n        }\n\n        Il2CppHashMap<Key, size_t, HashFcn, EqualKey> m_Map;\n        T* m_Data;\n        size_t m_Size;\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/gc/BoehmGC.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_GC_BOEHM\n\n#include <stdint.h>\n#include \"gc_wrapper.h\"\n#include \"GarbageCollector.h\"\n#include \"vm/Profiler.h\"\n\nstatic bool s_GCInitialized = false;\n\n#if IL2CPP_ENABLE_DEFERRED_GC\nstatic bool s_PendingGC = false;\n#endif\n\n#if IL2CPP_ENABLE_PROFILER\nusing il2cpp::vm::Profiler;\nstatic void on_gc_event(GCEventType eventType);\nstatic void on_heap_resize(GC_word newSize);\n#endif\n\nvoid\nil2cpp::gc::GarbageCollector::Initialize()\n{\n    if (s_GCInitialized)\n        return;\n    // This tells the GC that we are not scanning dynamic library data segments and that\n    // the GC tracked data structures need ot be manually pushed and marked.\n    // Call this before GC_INIT since the initialization logic uses this value.\n    GC_set_no_dls(1);\n\n#if IL2CPP_ENABLE_PROFILER\n    GC_set_on_event(&on_gc_event);\n    GC_set_on_heap_resize(&on_heap_resize);\n#endif\n\n    GC_INIT();\n#if defined(GC_THREADS)\n    GC_set_finalize_on_demand(1);\n    GC_set_finalizer_notifier(&il2cpp::gc::GarbageCollector::NotifyFinalizers);\n    // We need to call this if we want to manually register threads, i.e. GC_register_my_thread\n    GC_allow_register_threads();\n#endif\n#ifdef GC_GCJ_SUPPORT\n    GC_init_gcj_malloc(0, NULL);\n#endif\n    s_GCInitialized = true;\n}\n\nvoid il2cpp::gc::GarbageCollector::UninitializeGC()\n{\n    GC_deinit();\n}\n\nint32_t\nil2cpp::gc::GarbageCollector::GetCollectionCount(int32_t generation)\n{\n    return (int32_t)GC_get_gc_no();\n}\n\nint32_t\nil2cpp::gc::GarbageCollector::GetMaxGeneration()\n{\n    return 0;\n}\n\nvoid\nil2cpp::gc::GarbageCollector::Collect(int maxGeneration)\n{\n#if IL2CPP_ENABLE_DEFERRED_GC\n    if (GC_is_disabled())\n        s_PendingGC = true;\n#endif\n    GC_gcollect();\n}\n\nint32_t\nil2cpp::gc::GarbageCollector::CollectALittle()\n{\n#if IL2CPP_ENABLE_DEFERRED_GC\n    if (s_PendingGC)\n    {\n        s_PendingGC = false;\n        GC_gcollect();\n        return 0; // no more work to do\n    }\n    else\n    {\n        return GC_collect_a_little();\n    }\n#else\n    return GC_collect_a_little();\n#endif\n}\n\nint64_t\nil2cpp::gc::GarbageCollector::GetUsedHeapSize(void)\n{\n    return GC_get_heap_size() - GC_get_free_bytes();\n}\n\nint64_t\nil2cpp::gc::GarbageCollector::GetAllocatedHeapSize(void)\n{\n    return GC_get_heap_size();\n}\n\nvoid\nil2cpp::gc::GarbageCollector::Disable()\n{\n    GC_disable();\n}\n\nvoid\nil2cpp::gc::GarbageCollector::Enable()\n{\n    GC_enable();\n}\n\nbool\nil2cpp::gc::GarbageCollector::RegisterThread(void *baseptr)\n{\n#if defined(GC_THREADS)\n    struct GC_stack_base sb;\n    int res;\n\n    res = GC_get_stack_base(&sb);\n    if (res != GC_SUCCESS)\n    {\n        sb.mem_base = baseptr;\n#ifdef __ia64__\n        /* Can't determine the register stack bounds */\n        IL2CPP_ASSERT(false && \"mono_gc_register_thread failed ().\");\n#endif\n    }\n    res = GC_register_my_thread(&sb);\n    if ((res != GC_SUCCESS) && (res != GC_DUPLICATE))\n    {\n        IL2CPP_ASSERT(false && \"GC_register_my_thread () failed.\");\n        return false;\n    }\n#endif\n    return true;\n}\n\nbool\nil2cpp::gc::GarbageCollector::UnregisterThread()\n{\n#if defined(GC_THREADS)\n    int res;\n\n    res = GC_unregister_my_thread();\n    if (res != GC_SUCCESS)\n        IL2CPP_ASSERT(false && \"GC_unregister_my_thread () failed.\");\n\n    return res == GC_SUCCESS;\n#else\n    return true;\n#endif\n}\n\nil2cpp::gc::GarbageCollector::FinalizerCallback il2cpp::gc::GarbageCollector::RegisterFinalizerWithCallback(Il2CppObject* obj, FinalizerCallback callback)\n{\n    FinalizerCallback oldCallback;\n    void* oldData;\n    GC_REGISTER_FINALIZER_NO_ORDER((char*)obj, callback, NULL, &oldCallback, &oldData);\n    IL2CPP_ASSERT(oldData == NULL);\n    return oldCallback;\n}\n\nvoid\nil2cpp::gc::GarbageCollector::AddWeakLink(void **link_addr, Il2CppObject *obj, bool track)\n{\n    /* libgc requires that we use HIDE_POINTER... */\n    *link_addr = (void*)GC_HIDE_POINTER(obj);\n    // need this since our strings are not real objects\n    if (GC_is_heap_ptr(obj))\n        GC_GENERAL_REGISTER_DISAPPEARING_LINK(link_addr, obj);\n}\n\nvoid\nil2cpp::gc::GarbageCollector::RemoveWeakLink(void **link_addr)\n{\n    Il2CppObject*  obj = GarbageCollector::GetWeakLink(link_addr);\n    if (GC_is_heap_ptr(obj))\n        GC_unregister_disappearing_link(link_addr);\n    *link_addr = NULL;\n}\n\nstatic void*\nRevealLink(void* link_addr)\n{\n    void **link_a = (void**)link_addr;\n    return GC_REVEAL_POINTER(*link_a);\n}\n\nIl2CppObject*\nil2cpp::gc::GarbageCollector::GetWeakLink(void **link_addr)\n{\n    Il2CppObject *obj = (Il2CppObject*)GC_call_with_alloc_lock(RevealLink, link_addr);\n    if (obj == (Il2CppObject*)-1)\n        return NULL;\n    return obj;\n}\n\nvoid*\nil2cpp::gc::GarbageCollector::MakeDescriptorForObject(size_t *bitmap, int numbits)\n{\n#ifdef GC_GCJ_SUPPORT\n    /* It seems there are issues when the bitmap doesn't fit: play it safe */\n    if (numbits >= 30)\n        return GC_NO_DESCRIPTOR;\n    else\n        return (void*)GC_make_descriptor((GC_bitmap)bitmap, numbits);\n#else\n    return 0;\n#endif\n}\n\nvoid* il2cpp::gc::GarbageCollector::MakeDescriptorForString()\n{\n    return GC_NO_DESCRIPTOR;\n}\n\nvoid* il2cpp::gc::GarbageCollector::MakeDescriptorForArray()\n{\n    return GC_NO_DESCRIPTOR;\n}\n\nvoid il2cpp::gc::GarbageCollector::StopWorld()\n{\n    GC_stop_world_external();\n}\n\nvoid il2cpp::gc::GarbageCollector::StartWorld()\n{\n    GC_start_world_external();\n}\n\nvoid*\nil2cpp::gc::GarbageCollector::AllocateFixed(size_t size, void *descr)\n{\n    // Note that we changed the implementation from mono.\n    // In our case, we expect that\n    // a) This memory will never be moved\n    // b) This memory will be scanned for references\n    // c) This memory will remain 'alive' until explicitly freed\n    // GC_MALLOC_UNCOLLECTABLE fulfills all these requirements\n    // It does not accept a descriptor, but there was only one\n    // or two places in mono that pass a descriptor to this routine\n    // and we can or will support those use cases in a different manner.\n    IL2CPP_ASSERT(!descr);\n\n    return GC_MALLOC_UNCOLLECTABLE(size);\n}\n\nvoid\nil2cpp::gc::GarbageCollector::FreeFixed(void* addr)\n{\n    GC_FREE(addr);\n}\n\nint32_t\nil2cpp::gc::GarbageCollector::InvokeFinalizers()\n{\n    return (int32_t)GC_invoke_finalizers();\n}\n\nbool\nil2cpp::gc::GarbageCollector::HasPendingFinalizers()\n{\n    return GC_should_invoke_finalizers() != 0;\n}\n\n#if IL2CPP_ENABLE_PROFILER\n\nvoid on_gc_event(GCEventType eventType)\n{\n    Profiler::GCEvent((Il2CppGCEvent)eventType);\n}\n\nvoid on_heap_resize(GC_word newSize)\n{\n    Profiler::GCHeapResize((int64_t)newSize);\n}\n\n#endif // IL2CPP_ENABLE_PROFILER\n\nvoid il2cpp::gc::GarbageCollector::ForEachHeapSection(void* user_data, HeapSectionCallback callback)\n{\n    GC_foreach_heap_section(user_data, callback);\n}\n\nsize_t il2cpp::gc::GarbageCollector::GetSectionCount()\n{\n    return GC_get_heap_section_count();\n}\n\nvoid* il2cpp::gc::GarbageCollector::CallWithAllocLockHeld(GCCallWithAllocLockCallback callback, void* user_data)\n{\n    return GC_call_with_alloc_lock(callback, user_data);\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/gc/GCHandle.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"gc/GCHandle.h\"\n#include \"object-internals.h\"\n#include \"GarbageCollector.h\"\n#include \"os/Mutex.h\"\n#include \"utils/Memory.h\"\n#include <memory>\n\nnamespace il2cpp\n{\nnamespace gc\n{\n    typedef struct\n    {\n        uint32_t  *bitmap;\n        void* *entries;\n        uint32_t   size;\n        uint8_t    type;\n        uint32_t     slot_hint : 24;/* starting slot for search */\n        /* 2^16 appdomains should be enough for everyone (though I know I'll regret this in 20 years) */\n        /* we alloc this only for weak refs, since we can get the domain directly in the other cases */\n        uint16_t  *domain_ids;\n    } HandleData;\n\n/* weak and weak-track arrays will be allocated in malloc memory\n */\n    static HandleData gc_handles[] =\n    {\n        {NULL, NULL, 0, HANDLE_WEAK, 0},\n        {NULL, NULL, 0, HANDLE_WEAK_TRACK, 0},\n        {NULL, NULL, 0, HANDLE_NORMAL, 0},\n        {NULL, NULL, 0, HANDLE_PINNED, 0}\n    };\n\n\n    static int\n    find_first_unset(uint32_t bitmap)\n    {\n        int i;\n        for (i = 0; i < 32; ++i)\n        {\n            if (!(bitmap & (1 << i)))\n                return i;\n        }\n        return -1;\n    }\n\n    static os::FastMutex g_HandlesMutex;\n\n#define lock_handles(handles) g_HandlesMutex.Lock ()\n#define unlock_handles(handles) g_HandlesMutex.Unlock ()\n\n    static uint32_t\n    alloc_handle(HandleData *handles, Il2CppObject *obj, bool track)\n    {\n        uint32_t slot;\n        int i;\n        lock_handles(handles);\n        if (!handles->size)\n        {\n            handles->size = 32;\n            if (handles->type > HANDLE_WEAK_TRACK)\n            {\n                handles->entries = (void**)GarbageCollector::AllocateFixed(sizeof(void*) * handles->size, NULL);\n            }\n            else\n            {\n                handles->entries = (void**)IL2CPP_MALLOC_ZERO(sizeof(void*) * handles->size);\n                handles->domain_ids = (uint16_t*)IL2CPP_MALLOC_ZERO(sizeof(uint16_t) * handles->size);\n            }\n            handles->bitmap = (uint32_t*)IL2CPP_MALLOC_ZERO(handles->size / 8);\n        }\n        i = -1;\n        for (slot = handles->slot_hint; slot < handles->size / 32; ++slot)\n        {\n            if (handles->bitmap[slot] != 0xffffffff)\n            {\n                i = find_first_unset(handles->bitmap[slot]);\n                handles->slot_hint = slot;\n                break;\n            }\n        }\n        if (i == -1 && handles->slot_hint != 0)\n        {\n            for (slot = 0; slot < handles->slot_hint; ++slot)\n            {\n                if (handles->bitmap[slot] != 0xffffffff)\n                {\n                    i = find_first_unset(handles->bitmap[slot]);\n                    handles->slot_hint = slot;\n                    break;\n                }\n            }\n        }\n        if (i == -1)\n        {\n            uint32_t *new_bitmap;\n            uint32_t new_size = handles->size * 2; /* always double: we memset to 0 based on this below */\n\n            /* resize and copy the bitmap */\n            new_bitmap = (uint32_t*)IL2CPP_MALLOC_ZERO(new_size / 8);\n            memcpy(new_bitmap, handles->bitmap, handles->size / 8);\n            IL2CPP_FREE(handles->bitmap);\n            handles->bitmap = new_bitmap;\n\n            /* resize and copy the entries */\n            if (handles->type > HANDLE_WEAK_TRACK)\n            {\n                void* *entries;\n                entries = (void**)GarbageCollector::AllocateFixed(sizeof(void*) * new_size, NULL);\n                memcpy(entries, handles->entries, sizeof(void*) * handles->size);\n                void** previous_entries = handles->entries;\n                handles->entries = entries;\n                GarbageCollector::FreeFixed(previous_entries);\n            }\n            else\n            {\n                void* *entries;\n                uint16_t *domain_ids;\n                domain_ids = (uint16_t*)IL2CPP_MALLOC_ZERO(sizeof(uint16_t) * new_size);\n                entries = (void**)IL2CPP_MALLOC(sizeof(void*) * new_size);\n                /* we disable GC because we could lose some disappearing link updates */\n                GarbageCollector::Disable();\n                memcpy(entries, handles->entries, sizeof(void*) * handles->size);\n                memset(entries + handles->size, 0, sizeof(void*) * handles->size);\n                memcpy(domain_ids, handles->domain_ids, sizeof(uint16_t) * handles->size);\n                for (i = 0; i < (int32_t)handles->size; ++i)\n                {\n                    Il2CppObject *obj = GarbageCollector::GetWeakLink(&(handles->entries[i]));\n                    if (handles->entries[i])\n                        GarbageCollector::RemoveWeakLink(&(handles->entries[i]));\n                    /*g_print (\"reg/unreg entry %d of type %d at %p to object %p (%p), was: %p\\n\", i, handles->type, &(entries [i]), obj, entries [i], handles->entries [i]);*/\n                    if (obj)\n                    {\n                        GarbageCollector::AddWeakLink(&(entries[i]), obj, track);\n                    }\n                }\n                IL2CPP_FREE(handles->entries);\n                IL2CPP_FREE(handles->domain_ids);\n                handles->entries = entries;\n                handles->domain_ids = domain_ids;\n                GarbageCollector::Enable();\n            }\n\n            /* set i and slot to the next free position */\n            i = 0;\n            slot = (handles->size + 1) / 32;\n            handles->slot_hint = handles->size + 1;\n            handles->size = new_size;\n        }\n        handles->bitmap[slot] |= 1 << i;\n        slot = slot * 32 + i;\n        handles->entries[slot] = obj;\n        if (handles->type <= HANDLE_WEAK_TRACK)\n        {\n            if (obj)\n                GarbageCollector::AddWeakLink(&(handles->entries[slot]), obj, track);\n        }\n\n        //mono_perfcounters->gc_num_handles++;\n        unlock_handles(handles);\n        /*g_print (\"allocated entry %d of type %d to object %p (in slot: %p)\\n\", slot, handles->type, obj, handles->entries [slot]);*/\n        return (slot << 3) | (handles->type + 1);\n    }\n\n    uint32_t GCHandle::New(Il2CppObject *obj, bool pinned)\n    {\n        return alloc_handle(&gc_handles[pinned ? HANDLE_PINNED : HANDLE_NORMAL], obj, false);\n    }\n\n    uint32_t GCHandle::NewWeakref(Il2CppObject *obj, bool track_resurrection)\n    {\n        uint32_t handle = alloc_handle(&gc_handles[track_resurrection ? HANDLE_WEAK_TRACK : HANDLE_WEAK], obj, track_resurrection);\n\n#ifndef HAVE_SGEN_GC\n        if (track_resurrection)\n            NOT_IMPLEMENTED(GCHandle::NewWeakref);\n#endif\n\n        return handle;\n    }\n\n    GCHandleType GCHandle::GetHandleType(uint32_t gchandle)\n    {\n        return static_cast<GCHandleType>((gchandle & 7) - 1);\n    }\n\n    static inline uint32_t GetHandleSlot(uint32_t gchandle)\n    {\n        return gchandle >> 3;\n    }\n\n    Il2CppObject* GCHandle::GetTarget(uint32_t gchandle)\n    {\n        uint32_t slot = GetHandleSlot(gchandle);\n        uint32_t type = GetHandleType(gchandle);\n        HandleData *handles = &gc_handles[type];\n        Il2CppObject *obj = NULL;\n        if (type > 3)\n            return NULL;\n        lock_handles(handles);\n        if (slot < handles->size && (handles->bitmap[slot / 32] & (1 << (slot % 32))))\n        {\n            if (handles->type <= HANDLE_WEAK_TRACK)\n            {\n                obj = GarbageCollector::GetWeakLink(&handles->entries[slot]);\n            }\n            else\n            {\n                obj = (Il2CppObject*)handles->entries[slot];\n            }\n        }\n        else\n        {\n            /* print a warning? */\n        }\n        unlock_handles(handles);\n        /*g_print (\"get target of entry %d of type %d: %p\\n\", slot, handles->type, obj);*/\n        return obj;\n    }\n\n    static void\n    il2cpp_gchandle_set_target(uint32_t gchandle, Il2CppObject *obj)\n    {\n        uint32_t slot = GetHandleSlot(gchandle);\n        uint32_t type = GCHandle::GetHandleType(gchandle);\n        HandleData *handles = &gc_handles[type];\n        Il2CppObject *old_obj = NULL;\n\n        if (type > 3)\n            return;\n        lock_handles(handles);\n        if (slot < handles->size && (handles->bitmap[slot / 32] & (1 << (slot % 32))))\n        {\n            if (handles->type <= HANDLE_WEAK_TRACK)\n            {\n                old_obj = (Il2CppObject*)handles->entries[slot];\n                if (handles->entries[slot])\n                    GarbageCollector::RemoveWeakLink(&handles->entries[slot]);\n                if (obj)\n                    GarbageCollector::AddWeakLink(&handles->entries[slot], obj, handles->type == HANDLE_WEAK_TRACK);\n            }\n            else\n            {\n                handles->entries[slot] = obj;\n            }\n        }\n        else\n        {\n            /* print a warning? */\n        }\n        unlock_handles(handles);\n\n#ifndef HAVE_SGEN_GC\n        if (type == HANDLE_WEAK_TRACK)\n            NOT_IMPLEMENTED(il2cpp_gchandle_set_target);\n#endif\n    }\n\n    void GCHandle::Free(uint32_t gchandle)\n    {\n        uint32_t slot = GetHandleSlot(gchandle);\n        uint32_t type = GetHandleType(gchandle);\n        HandleData *handles = &gc_handles[type];\n        if (type > 3)\n            return;\n#ifndef HAVE_SGEN_GC\n        if (type == HANDLE_WEAK_TRACK)\n            NOT_IMPLEMENTED(GCHandle::Free);\n#endif\n\n        lock_handles(handles);\n        if (slot < handles->size && (handles->bitmap[slot / 32] & (1 << (slot % 32))))\n        {\n            if (handles->type <= HANDLE_WEAK_TRACK)\n            {\n                if (handles->entries[slot])\n                    GarbageCollector::RemoveWeakLink(&handles->entries[slot]);\n            }\n            else\n            {\n                handles->entries[slot] = NULL;\n            }\n            handles->bitmap[slot / 32] &= ~(1 << (slot % 32));\n        }\n        else\n        {\n            /* print a warning? */\n        }\n        //mono_perfcounters->gc_num_handles--;\n        /*g_print (\"freed entry %d of type %d\\n\", slot, handles->type);*/\n        unlock_handles(handles);\n    }\n\n    int32_t GCHandle::GetTargetHandle(Il2CppObject * obj, int32_t handle, int32_t type)\n    {\n        if (type == -1)\n        {\n            il2cpp_gchandle_set_target(handle, obj);\n            /* the handle doesn't change */\n            return handle;\n        }\n        switch (type)\n        {\n            case HANDLE_WEAK:\n                return NewWeakref(obj, false);\n            case HANDLE_WEAK_TRACK:\n                return NewWeakref(obj, true);\n            case HANDLE_NORMAL:\n                return New(obj, false);\n            case HANDLE_PINNED:\n                return New(obj, true);\n            default:\n                IL2CPP_ASSERT(0);\n        }\n        return 0;\n    }\n\n    void GCHandle::WalkStrongGCHandleTargets(WalkGCHandleTargetsCallback callback, void* context)\n    {\n        lock_handles(handles);\n        const GCHandleType types[] = { HANDLE_NORMAL, HANDLE_PINNED };\n\n        for (int gcHandleTypeIndex = 0; gcHandleTypeIndex < 2; gcHandleTypeIndex++)\n        {\n            const HandleData& handles = gc_handles[types[gcHandleTypeIndex]];\n\n            for (uint32_t i = 0; i < handles.size; i++)\n            {\n                if (handles.entries[i] != NULL)\n                    callback(static_cast<Il2CppObject*>(handles.entries[i]), context);\n            }\n        }\n        unlock_handles(handles);\n    }\n} /* gc */\n} /* il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/gc/GCHandle.h",
    "content": "#pragma once\n\n#include <stdint.h>\n\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace gc\n{\n    enum GCHandleType\n    {\n        HANDLE_WEAK,\n        HANDLE_WEAK_TRACK,\n        HANDLE_NORMAL,\n        HANDLE_PINNED\n    };\n\n    class LIBIL2CPP_CODEGEN_API GCHandle\n    {\n    public:\n        // external\n        static uint32_t New(Il2CppObject *obj, bool pinned);\n        static uint32_t NewWeakref(Il2CppObject *obj, bool track_resurrection);\n        static Il2CppObject* GetTarget(uint32_t gchandle);\n        static GCHandleType GetHandleType(uint32_t gcHandle);\n        static void Free(uint32_t gchandle);\n    public:\n        //internal\n        static int32_t GetTargetHandle(Il2CppObject * obj, int32_t handle, int32_t type);\n\n        typedef void(*WalkGCHandleTargetsCallback)(Il2CppObject* obj, void* context);\n        static void WalkStrongGCHandleTargets(WalkGCHandleTargetsCallback callback, void* context);\n    };\n} /* gc */\n} /* il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/gc/GarbageCollector.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"il2cpp-vm-support.h\"\n#include \"GarbageCollector.h\"\n#include \"os/Event.h\"\n#include \"os/Mutex.h\"\n#include \"os/Semaphore.h\"\n#include \"os/Thread.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"utils/HashUtils.h\"\n#include \"vm/CCW.h\"\n#include \"vm/Class.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Exception.h\"\n#include \"vm/RCW.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Thread.h\"\n\nusing namespace il2cpp::os;\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace gc\n{\n// So COM Callable Wrapper can be created for any kind of managed object,\n// whether it has finalizer or not. If it doesn't then it's an easy case:\n// when creating the CCW, we just register our cleanup method to be the\n// finalizer method. In case it does, then we need to be able to invoke\n// both our CCW cleanup method, and the finalizer in question.\n// We could chain them by registering CCW cleanup method over the finalizer\n// method and storing the previous finalizer in CCW cache, but it would\n// screw us over if for example the object is IDisposable and then it\n// calls `GC.SuppressFinalize` from C# - instead of the finalizer getting\n// unregistered, our CCW cleanup method gets unregistered, and we now have\n// a dangling pointer to the managed heap in the CCW cache. Not pretty.\n// Instead, we made GarbageCollector::RegisterFinalizer and GarbageCollector::SuppressFinalizer\n// to be CCW cache aware. Now, any managed object goes into 1 of these categories:\n//\n// 1. Object has no finalizer and it is not in CCW cache. It gets garbage\n//    collected and no cleanup is needed.\n// 2. Object has a finalizer and it is not in CCW cache. GarbageCollector::RunFinalizer\n//    gets registered with the GC for such object.\n// 3. Object has no finalizer and it is in CCW cache. CleanupCCW is\n//    registered with the GC for such object. Once it is called, it removes\n//    the object from the CCW cache.\n// 4. Object has a finalizer and it is in CCW cache. CleanupCCW is\n//    registered with the GC for such object. Once it is called, it removes\n//    the object from the CCW cache and then calls its finalizer.\n//\n// To know whether we have case 3 or 4, we have the \"hasFinalizer\" field in\n// the CachedCCW object.\n//\n// When GarbageCollector::RegisterFinalizer or GarbageCollector::SuppressFinalizer\n// is called, we have managed objects fitting in two buckets:\n//\n// 1. Those that do not exist in CCW cache. Finalizer is normally registered with\n//    the GC.\n// 2. Those that are in the CCW cache. In such case, GC won't know about the call,\n//    but instead we'll find the object in the CCW cache and RegisterFinalizer will\n//    set \"hasFinalizer\" field to true, while SuppressFinalizer will set it to false\n//\n// Any methods that interact with s_CCWCache have to lock s_CCWCacheMutex.\n    struct CachedCCW\n    {\n        Il2CppIManagedObjectHolder* managedObjectHolder;\n        bool hasFinalizer;\n    };\n\n    typedef Il2CppHashMap<Il2CppObject*, CachedCCW, utils::PointerHash<Il2CppObject> > CCWCache;\n\n    static FastMutex s_CCWCacheMutex;\n    static CCWCache s_CCWCache;\n\n#if IL2CPP_SUPPORT_THREADS\n\n    static bool s_StopFinalizer = false;\n    static il2cpp::os::Thread* s_FinalizerThread;\n    static Il2CppThread* s_FinalizerThreadObject;\n    static Semaphore s_FinalizerSemaphore(0, 32767);\n    static Event s_FinalizersThreadStartedEvent;\n    static Event s_FinalizersCompletedEvent(true, false);\n\n    static void FinalizerThread(void* arg)\n    {\n        s_FinalizerThreadObject = il2cpp::vm::Thread::Attach(Domain::GetCurrent());\n        s_FinalizerThread->SetName(\"GC Finalizer\");\n\n        s_FinalizersThreadStartedEvent.Set();\n\n        while (!s_StopFinalizer)\n        {\n            s_FinalizerSemaphore.Wait();\n\n            GarbageCollector::InvokeFinalizers();\n\n            s_FinalizersCompletedEvent.Set();\n        }\n\n        il2cpp::vm::Thread::Detach(s_FinalizerThreadObject);\n    }\n\n    bool GarbageCollector::IsFinalizerThread(Il2CppThread *thread)\n    {\n        return s_FinalizerThreadObject == thread;\n    }\n\n#else\n\n    bool GarbageCollector::IsFinalizerThread(Il2CppThread *thread)\n    {\n        return false;\n    }\n\n#endif\n\n    void GarbageCollector::InitializeFinalizer()\n    {\n        GarbageCollector::InvokeFinalizers();\n#if IL2CPP_SUPPORT_THREADS\n        s_FinalizerThread = new il2cpp::os::Thread;\n        s_FinalizerThread->Run(&FinalizerThread, NULL);\n        s_FinalizersThreadStartedEvent.Wait();\n#endif\n    }\n\n    void GarbageCollector::UninitializeFinalizers()\n    {\n#if IL2CPP_SUPPORT_THREADS\n        s_StopFinalizer = true;\n        NotifyFinalizers();\n        s_FinalizerThread->Join();\n        delete s_FinalizerThread;\n        s_FinalizerThread = NULL;\n#endif\n    }\n\n    void GarbageCollector::NotifyFinalizers()\n    {\n#if IL2CPP_SUPPORT_THREADS\n        s_FinalizerSemaphore.Post(1, NULL);\n#endif\n    }\n\n    void GarbageCollector::RunFinalizer(void *obj, void *data)\n    {\n        NOT_IMPLEMENTED_NO_ASSERT(GarbageCollector::RunFinalizer, \"Compare to mono implementation special cases\");\n\n        Il2CppException *exc = NULL;\n        Il2CppObject *o;\n        const MethodInfo* finalizer = NULL;\n\n        o = (Il2CppObject*)obj;\n\n        finalizer = Class::GetFinalizer(o->klass);\n\n        Runtime::Invoke(finalizer, o, NULL, &exc);\n\n        if (exc)\n            Runtime::UnhandledException(exc);\n    }\n\n    void GarbageCollector::RegisterFinalizerForNewObject(Il2CppObject* obj)\n    {\n        // Fast path\n        // No need to check CCW cache since it's guaranteed to not be in it for a new object\n        RegisterFinalizerWithCallback(obj, &GarbageCollector::RunFinalizer);\n    }\n\n    void GarbageCollector::RegisterFinalizer(Il2CppObject* obj)\n    {\n        // Slow path\n        // Check in CCW cache first\n        os::FastAutoLock lock(&s_CCWCacheMutex);\n        CCWCache::iterator it = s_CCWCache.find(obj);\n\n        if (it != s_CCWCache.end())\n        {\n            it->second.hasFinalizer = true;\n        }\n        else\n        {\n            RegisterFinalizerWithCallback(obj, &GarbageCollector::RunFinalizer);\n        }\n    }\n\n    void GarbageCollector::SuppressFinalizer(Il2CppObject* obj)\n    {\n        // Slow path\n        // Check in CCW cache first\n        os::FastAutoLock lock(&s_CCWCacheMutex);\n        CCWCache::iterator it = s_CCWCache.find(obj);\n\n        if (it != s_CCWCache.end())\n        {\n            it->second.hasFinalizer = false;\n        }\n        else\n        {\n            RegisterFinalizerWithCallback(obj, NULL);\n        }\n    }\n\n    void GarbageCollector::WaitForPendingFinalizers()\n    {\n        if (!GarbageCollector::HasPendingFinalizers())\n            return;\n\n#if IL2CPP_SUPPORT_THREADS\n        /* Avoid deadlocks */\n        if (vm::Thread::Current() == s_FinalizerThreadObject)\n            return;\n\n        s_FinalizersCompletedEvent.Reset();\n        NotifyFinalizers();\n        s_FinalizersCompletedEvent.Wait();\n#else\n        GarbageCollector::InvokeFinalizers();\n#endif\n    }\n\n    int32_t GarbageCollector::GetGeneration(void* addr)\n    {\n        return 0;\n    }\n\n    void GarbageCollector::AddMemoryPressure(int64_t value)\n    {\n    }\n\n    static void CleanupCCW(void* obj, void* data)\n    {\n        bool hasFinalizer;\n\n        // We have to destroy CCW before invoking the finalizer, because we cannot know whether the finalizer will revive the object\n        // In cases it does revive it, it's also possible for it to hit CCW cache, and in that case we'd want to create a new CCW object\n        // rather than returning the one that we're about to destroy here\n        {\n            os::FastAutoLock lock(&s_CCWCacheMutex);\n            CCWCache::iterator it = s_CCWCache.find(static_cast<Il2CppObject*>(obj));\n            IL2CPP_ASSERT(it != s_CCWCache.end());\n\n            Il2CppIManagedObjectHolder* managedObjectHolder = it->second.managedObjectHolder;\n            hasFinalizer = it->second.hasFinalizer;\n            s_CCWCache.erase(it);\n\n            managedObjectHolder->Destroy();\n        }\n\n        if (hasFinalizer)\n            GarbageCollector::RunFinalizer(obj, data);\n    }\n\n    // When creating COM Callable Wrappers for classes that project to other Windows Runtime classes\n    // for instance, System.Uri to Windows.Foundation.Uri, we cannot actually create a wrapper against managed object\n    // as the native side actually wants an instance of a real Windows.Foundation.Uri class. So do that, our createCCW\n    // instead of creating a COM Callable Wrapper, will create an instance of that windows runtime class. In that case,\n    // we do not (AND CANNOT!) put it into a CCW cache because it's not a CCW.\n    static bool ShouldInsertIntoCCWCache(Il2CppObject* obj)\n    {\n        if (obj->klass == il2cpp_defaults.system_uri_class && il2cpp_defaults.windows_foundation_uri_class != NULL)\n            return false;\n\n        /* TODO - Add the rest of the class projections:\n        System.Collections.Specialized.NotifyCollectionChangedEventArgs <-> Windows.UI.Xaml.Interop.NotifyCollectionChangedEventArgs\n        System.ComponentModel.PropertyChangedEventArgs <-> Windows.UI.Xaml.Data.PropertyChangedEventArgs\n        */\n\n        return true;\n    }\n\n    Il2CppIUnknown* GarbageCollector::GetOrCreateCCW(Il2CppObject* obj, const Il2CppGuid& iid)\n    {\n        if (obj == NULL)\n            return NULL;\n\n        // check for rcw object. COM interface can be extracted from it and there's no need to create ccw\n        if (obj->klass->is_import_or_windows_runtime)\n            return RCW::QueryInterface<true>(static_cast<Il2CppComObject*>(obj), iid);\n\n        os::FastAutoLock lock(&s_CCWCacheMutex);\n        CCWCache::iterator it = s_CCWCache.find(obj);\n        Il2CppIUnknown* comCallableWrapper;\n\n        if (it == s_CCWCache.end())\n        {\n            comCallableWrapper = CCW::CreateCCW(obj);\n\n            if (ShouldInsertIntoCCWCache(obj))\n            {\n#if IL2CPP_DEBUG\n                // Assert that CCW::CreateCCW actually returns upcasted Il2CppIManagedObjectHolder\n                Il2CppIManagedObjectHolder* managedObjectHolder = NULL;\n                comCallableWrapper->QueryInterface(Il2CppIManagedObjectHolder::IID, reinterpret_cast<void**>(&managedObjectHolder));\n                IL2CPP_ASSERT(static_cast<void*>(comCallableWrapper) == static_cast<void*>(managedObjectHolder));\n                managedObjectHolder->Release();\n#endif\n                CachedCCW ccw =\n                {\n                    static_cast<Il2CppIManagedObjectHolder*>(comCallableWrapper),\n                    RegisterFinalizerWithCallback(obj, &CleanupCCW) != NULL\n                };\n\n                s_CCWCache.insert(std::make_pair(obj, ccw));\n            }\n        }\n        else\n        {\n            comCallableWrapper = it->second.managedObjectHolder;\n        }\n\n        Il2CppIUnknown* result;\n        il2cpp_hresult_t hr = comCallableWrapper->QueryInterface(iid, reinterpret_cast<void**>(&result));\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n        return result;\n    }\n\n#if NET_4_0\n    void il2cpp::gc::GarbageCollector::SetSkipThread(bool skip)\n    {\n    }\n\n#endif\n} // namespace gc\n} // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/gc/GarbageCollector.h",
    "content": "#pragma once\n\nstruct Il2CppGuid;\nstruct Il2CppIUnknown;\nstruct Il2CppObject;\nstruct Il2CppThread;\n\nnamespace il2cpp\n{\nnamespace gc\n{\n    class GarbageCollector\n    {\n    public:\n        static void Collect(int maxGeneration);\n        static int32_t CollectALittle();\n        static int32_t GetCollectionCount(int32_t generation);\n        static int64_t GetUsedHeapSize();\n\n    public:\n        // internal\n        typedef void (*FinalizerCallback)(void* object, void* client_data);\n\n        // functions implemented in a GC agnostic manner\n        static void InitializeFinalizer();\n        static bool IsFinalizerThread(Il2CppThread* thread);\n        static int32_t GetGeneration(void* addr);\n        static void UninitializeFinalizers();\n        static void UninitializeGC();\n        static void NotifyFinalizers();\n        static void RunFinalizer(void *obj, void *data);\n        static void RegisterFinalizerForNewObject(Il2CppObject* obj);\n        static void RegisterFinalizer(Il2CppObject* obj);\n        static void SuppressFinalizer(Il2CppObject* obj);\n        static void WaitForPendingFinalizers();\n        static int32_t GetMaxGeneration();\n        static void AddMemoryPressure(int64_t value);\n        static Il2CppIUnknown* GetOrCreateCCW(Il2CppObject* obj, const Il2CppGuid& iid);\n\n        // functions implemented in a GC specific manner\n        static void Initialize();\n        static void Enable();\n        static void Disable();\n\n        static FinalizerCallback RegisterFinalizerWithCallback(Il2CppObject* obj, FinalizerCallback callback);\n\n        static int64_t GetAllocatedHeapSize();\n\n        static void* MakeDescriptorForObject(size_t *bitmap, int numbits);\n        static void* MakeDescriptorForString();\n        static void* MakeDescriptorForArray();\n\n        static void* AllocateFixed(size_t size, void *descr);\n        static void FreeFixed(void* addr);\n\n        static bool RegisterThread(void *baseptr);\n        static bool UnregisterThread();\n\n        static bool HasPendingFinalizers();\n        static int32_t InvokeFinalizers();\n\n        static void AddWeakLink(void **link_addr, Il2CppObject *obj, bool track);\n        static void RemoveWeakLink(void **link_addr);\n        static Il2CppObject *GetWeakLink(void **link_addr);\n\n        /* Used by liveness code */\n        static void StopWorld();\n        static void StartWorld();\n\n        typedef void (*HeapSectionCallback) (void* user_data, void* start, void* end);\n        static void ForEachHeapSection(void* user_data, HeapSectionCallback callback);\n        static size_t GetSectionCount();\n\n        typedef void* (*GCCallWithAllocLockCallback)(void* user_data);\n        static void* CallWithAllocLockHeld(GCCallWithAllocLockCallback callback, void* user_data);\n\n#if NET_4_0\n        static void SetSkipThread(bool skip);\n#endif\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/gc/NullGC.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_GC_NULL\nstruct Il2CppObject;\n\n#include <stdlib.h>\n#include \"il2cpp-api.h\"\n#include \"GarbageCollector.h\"\n#include \"utils/Memory.h\"\n\nvoid\nil2cpp::gc::GarbageCollector::Initialize()\n{\n}\n\nvoid il2cpp::gc::GarbageCollector::UninitializeGC()\n{\n}\n\nvoid*\nil2cpp::gc::GarbageCollector::AllocateFixed(size_t size, void *descr)\n{\n    return IL2CPP_MALLOC_ZERO(size);\n}\n\nvoid*\nil2cpp::gc::GarbageCollector::MakeDescriptorForObject(size_t *bitmap, int numbits)\n{\n    return NULL;\n}\n\nvoid* il2cpp::gc::GarbageCollector::MakeDescriptorForString()\n{\n    return NULL;\n}\n\nvoid* il2cpp::gc::GarbageCollector::MakeDescriptorForArray()\n{\n    return NULL;\n}\n\nvoid il2cpp::gc::GarbageCollector::StopWorld()\n{\n    NOT_IMPLEMENTED(il2cpp::gc::GarbageCollector::StopWorld);\n}\n\nvoid il2cpp::gc::GarbageCollector::StartWorld()\n{\n    NOT_IMPLEMENTED(il2cpp::gc::GarbageCollector::StartWorld);\n}\n\nvoid\nil2cpp::gc::GarbageCollector::RemoveWeakLink(void **link_addr)\n{\n    *link_addr = NULL;\n}\n\nIl2CppObject*\nil2cpp::gc::GarbageCollector::GetWeakLink(void **link_addr)\n{\n    return (Il2CppObject*)*link_addr;\n}\n\nvoid\nil2cpp::gc::GarbageCollector::AddWeakLink(void **link_addr, Il2CppObject *obj, bool track)\n{\n    *link_addr = obj;\n}\n\nbool\nil2cpp::gc::GarbageCollector::RegisterThread(void *baseptr)\n{\n    return true;\n}\n\nbool\nil2cpp::gc::GarbageCollector::UnregisterThread()\n{\n    return true;\n}\n\nil2cpp::gc::GarbageCollector::FinalizerCallback il2cpp::gc::GarbageCollector::RegisterFinalizerWithCallback(Il2CppObject* obj, FinalizerCallback callback)\n{\n    return NULL;\n}\n\nvoid\nil2cpp::gc::GarbageCollector::FreeFixed(void* addr)\n{\n    IL2CPP_FREE(addr);\n}\n\nint32_t\nil2cpp::gc::GarbageCollector::InvokeFinalizers()\n{\n    return 0;\n}\n\nbool\nil2cpp::gc::GarbageCollector::HasPendingFinalizers()\n{\n    return false;\n}\n\nvoid\nil2cpp::gc::GarbageCollector::Collect(int maxGeneration)\n{\n}\n\nint32_t\nil2cpp::gc::GarbageCollector::CollectALittle()\n{\n    return 0;\n}\n\nvoid\nil2cpp::gc::GarbageCollector::Enable()\n{\n}\n\nvoid\nil2cpp::gc::GarbageCollector::Disable()\n{\n}\n\nint64_t\nil2cpp::gc::GarbageCollector::GetUsedHeapSize(void)\n{\n    return 0;\n}\n\nint64_t\nil2cpp::gc::GarbageCollector::GetAllocatedHeapSize(void)\n{\n    return 0;\n}\n\nint32_t\nil2cpp::gc::GarbageCollector::GetMaxGeneration()\n{\n    return 0;\n}\n\nint32_t\nil2cpp::gc::GarbageCollector::GetCollectionCount(int32_t generation)\n{\n    return 0;\n}\n\nvoid il2cpp::gc::GarbageCollector::ForEachHeapSection(void* user_data, HeapSectionCallback callback)\n{\n}\n\nsize_t il2cpp::gc::GarbageCollector::GetSectionCount()\n{\n    return 0;\n}\n\nvoid* il2cpp::gc::GarbageCollector::CallWithAllocLockHeld(GCCallWithAllocLockCallback callback, void* user_data)\n{\n    return callback(user_data);\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/gc/WriteBarrier.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"gc/WriteBarrier.h\"\n\nnamespace il2cpp\n{\nnamespace gc\n{\n    void WriteBarrier::GenericStore(void* ptr, Il2CppObject* value)\n    {\n        *(void**)ptr = value;\n    }\n} /* gc */\n} /* il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/gc/WriteBarrier.h",
    "content": "#pragma once\n\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace gc\n{\n    class WriteBarrier\n    {\n    public:\n        static void GenericStore(void* ptr, Il2CppObject* value);\n    };\n} /* gc */\n} /* il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/gc/gc_wrapper.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\n#if IL2CPP_GC_BOEHM\n\n/* here is the defines we build Boehm with */\n    #define IGNORE_DYNAMIC_LOADING 1\n    #define GC_DONT_REGISTER_MAIN_STATIC_DATA 1\n    #if IL2CPP_HAS_GC_DESCRIPTORS\n    #define GC_GCJ_SUPPORT 1\n    #endif\n    #if IL2CPP_SUPPORT_THREADS\n        #define GC_THREADS 1\n    #endif\n\n    #if IL2CPP_TARGET_WINRT\n    #define GC_NOT_DLL\n    #endif\n\n    #include \"gc.h\"\n    #include \"gc_typed.h\"\n    #include \"gc_mark.h\"\n    #include \"gc_gcj.h\"\n\n    #define GC_NO_DESCRIPTOR ((void*)(0 | GC_DS_LENGTH))\n\n#else\n    #define GC_NO_DESCRIPTOR ((void*)0)\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icallincludes.h",
    "content": "#include \"icalls/mscorlib/Mono.Globalization.Unicode/Normalization.h\"\n\n#include \"icalls/mscorlib/Mono.Interop/ComInteropProxy.h\"\n\n#include \"icalls/mscorlib/Mono/Runtime.h\"\n\n#include \"icalls/mscorlib/Mono.Security.Cryptography/KeyPairPersistence.h\"\n\n#include \"icalls/mscorlib/System/__ComObject.h\"\n\n#include \"icalls/mscorlib/System/Activator.h\"\n#include \"icalls/mscorlib/System/AppDomain.h\"\n#include \"icalls/mscorlib/System/ArgIterator.h\"\n#include \"icalls/mscorlib/System/Array.h\"\n#include \"icalls/mscorlib/System/Buffer.h\"\n#include \"icalls/mscorlib/System/Char.h\"\n#include \"icalls/mscorlib/System/CLRConfig.h\"\n#include \"icalls/mscorlib/System/Convert.h\"\n#include \"icalls/mscorlib/System/ConsoleDriver.h\"\n#include \"icalls/mscorlib/System/CurrentSystemTimeZone.h\"\n#include \"icalls/mscorlib/System/DateTime.h\"\n#include \"icalls/mscorlib/System/Decimal.h\"\n#include \"icalls/mscorlib/System/Delegate.h\"\n\n#include \"icalls/mscorlib/System.Diagnostics/Assert.h\"\n#include \"icalls/mscorlib/System.Diagnostics/Debugger.h\"\n#include \"icalls/mscorlib/System.Diagnostics/StackFrame.h\"\n#include \"icalls/mscorlib/System.Diagnostics/StackTrace.h\"\n#include \"icalls/mscorlib/System/Double.h\"\n\n#include \"icalls/mscorlib/System/Enum.h\"\n#include \"icalls/mscorlib/System/Environment.h\"\n#include \"icalls/mscorlib/System/Exception.h\"\n#include \"icalls/mscorlib/System/GC.h\"\n\n#include \"icalls/mscorlib/System.Globalization/CalendarData.h\"\n#include \"icalls/mscorlib/System.Globalization/CompareInfo.h\"\n#include \"icalls/mscorlib/System.Globalization/CultureData.h\"\n#include \"icalls/mscorlib/System.Globalization/CultureInfo.h\"\n#include \"icalls/mscorlib/System.Globalization/RegionInfo.h\"\n#include \"icalls/mscorlib/System.IO/DriveInfo.h\"\n#include \"icalls/mscorlib/System.IO/MonoIO.h\"\n#include \"icalls/mscorlib/System.IO/Path.h\"\n#include \"icalls/mscorlib/System/Math.h\"\n#include \"icalls/mscorlib/System/MissingMemberException.h\"\n#include \"icalls/mscorlib/System/MonoCustomAttrs.h\"\n#include \"icalls/mscorlib/System/MonoEnumInfo.h\"\n#include \"icalls/mscorlib/System/MonoType.h\"\n#include \"icalls/mscorlib/System/Number.h\"\n#include \"icalls/mscorlib/System/NumberFormatter.h\"\n#include \"icalls/mscorlib/System/Object.h\"\n\n#include \"icalls/mscorlib/System.Reflection/Assembly.h\"\n#include \"icalls/mscorlib/System.Reflection/AssemblyName.h\"\n#include \"icalls/mscorlib/System.Reflection/CustomAttributeData.h\"\n\n#include \"icalls/mscorlib/System.Reflection.Emit/AssemblyBuilder.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/CustomAttributeBuilder.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/DerivedType.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/DynamicMethod.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/EnumBuilder.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/GenericTypeParameterBuilder.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/MethodBuilder.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/ModuleBuilder.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/SignatureHelper.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/SymbolType.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/TypeBuilder.h\"\n\n#include \"icalls/mscorlib/System.Reflection/FieldInfo.h\"\n#include \"icalls/mscorlib/System.Reflection/MemberInfo.h\"\n#include \"icalls/mscorlib/System.Reflection/MethodBase.h\"\n#include \"icalls/mscorlib/System.Reflection/Module.h\"\n#include \"icalls/mscorlib/System.Reflection/MonoCMethod.h\"\n#include \"icalls/mscorlib/System.Reflection/MonoEventInfo.h\"\n#include \"icalls/mscorlib/System.Reflection/MonoField.h\"\n#include \"icalls/mscorlib/System.Reflection/MonoGenericClass.h\"\n#include \"icalls/mscorlib/System.Reflection/MonoGenericCMethod.h\"\n#include \"icalls/mscorlib/System.Reflection/MonoGenericMethod.h\"\n#include \"icalls/mscorlib/System.Reflection/MonoMethod.h\"\n#include \"icalls/mscorlib/System.Reflection/MonoMethodInfo.h\"\n#include \"icalls/mscorlib/System.Reflection/MonoPropertyInfo.h\"\n#include \"icalls/mscorlib/System.Reflection/ParameterInfo.h\"\n#include \"icalls/mscorlib/System.Reflection/RtFieldInfo.h\"\n\n#include \"icalls/mscorlib/System.Runtime.CompilerServices/RuntimeHelpers.h\"\n\n#include \"icalls/mscorlib/System.Runtime.InteropServices/GCHandle.h\"\n#include \"icalls/mscorlib/System.Runtime.InteropServices/Marshal.h\"\n#include \"icalls/mscorlib/System.Runtime.InteropServices.WindowsRuntime/UnsafeNativeMethods.h\"\n\n#include \"icalls/mscorlib/System.Runtime.Remoting.Activation/ActivationServices.h\"\n#include \"icalls/mscorlib/System.Runtime.Remoting.Contexts/Context.h\"\n#include \"icalls/mscorlib/System.Runtime.Remoting.Messaging/AsyncResult.h\"\n#include \"icalls/mscorlib/System.Runtime.Remoting.Messaging/MonoMethodMessage.h\"\n#include \"icalls/mscorlib/System.Runtime.Remoting.Proxies/RealProxy.h\"\n#include \"icalls/mscorlib/System.Runtime.Remoting/RemotingServices.h\"\n#include \"icalls/mscorlib/System.Runtime.Versioning/VersioningHelper.h\"\n\n#include \"icalls/mscorlib/System/RuntimeFieldHandle.h\"\n#include \"icalls/mscorlib/System/RuntimeMethodHandle.h\"\n#include \"icalls/mscorlib/System/RuntimeTypeHandle.h\"\n#include \"icalls/mscorlib/System/RuntimeType.h\"\n\n#include \"icalls/mscorlib/System.Security.Cryptography/RNGCryptoServiceProvider.h\"\n\n#include \"icalls/mscorlib/System.Security.Policy/Evidence.h\"\n\n#include \"icalls/mscorlib/System.Security.Principal/WindowsIdentity.h\"\n\n#include \"icalls/mscorlib/System.Security.Principal/WindowsImpersonationContext.h\"\n#include \"icalls/mscorlib/System.Security.Principal/WindowsPrincipal.h\"\n#include \"icalls/mscorlib/System.Security/SecurityFrame.h\"\n\n#include \"icalls/mscorlib/System.Security/SecurityManager.h\"\n#include \"icalls/mscorlib/System/SizedReference.h\"\n#include \"icalls/mscorlib/System/String.h\"\n\n#include \"icalls/mscorlib/System.Text/Encoding.h\"\n#include \"icalls/mscorlib/System.Text/EncodingHelper.h\"\n#include \"icalls/mscorlib/System.Text/Normalization.h\"\n\n#include \"icalls/mscorlib/System.Threading/Interlocked.h\"\n#include \"icalls/mscorlib/System.Threading/InternalThread.h\"\n#include \"icalls/mscorlib/System.Threading/Monitor.h\"\n#include \"icalls/mscorlib/System.Threading/Mutex.h\"\n#include \"icalls/mscorlib/System.Threading/NativeEventCalls.h\"\n#include \"icalls/mscorlib/System.Threading/Timer.h\"\n#include \"icalls/mscorlib/System.Threading/Thread.h\"\n#include \"icalls/mscorlib/System.Threading/ThreadPool.h\"\n#include \"icalls/mscorlib/System.Threading/WaitHandle.h\"\n#include \"icalls/mscorlib/System/TimeSpan.h\"\n#include \"icalls/mscorlib/System/TimeZoneInfo.h\"\n#include \"icalls/mscorlib/System/Type.h\"\n#include \"icalls/mscorlib/System/TypedReference.h\"\n#include \"icalls/mscorlib/System/ValueType.h\"\n\n#include \"icalls/System/Microsoft.Win32/NativeMethods.h\"\n#include \"icalls/System/Mono.Net.Security/MonoTlsProviderFactory.h\"\n\n#include \"icalls/System.Configuration/System.Configuration/InternalConfigurationHost.h\"\n#include \"icalls/System.Core/System.IO.MemoryMappedFiles/MemoryMapImpl.h\"\n\n#include \"icalls/System/System.ComponentModel/Win32Exception.h\"\n#include \"icalls/System/System.Configuration/DefaultConfig.h\"\n#include \"icalls/System/System.Configuration/InternalConfigurationHost.h\"\n\n#include \"icalls/System/System.IO/FAMWatcher.h\"\n#include \"icalls/System/System.IO/FileSystemWatcher.h\"\n#include \"icalls/System/System.IO/InotifyWatcher.h\"\n#include \"icalls/System/System.IO/KqueueMonitor.h\"\n#include \"icalls/System/System/IOSelector.h\"\n\n#include \"icalls/System/System.Diagnostics/DefaultTraceListener.h\"\n#include \"icalls/System/System.Diagnostics/FileVersionInfo.h\"\n#include \"icalls/System/System.Diagnostics/PerformanceCounter.h\"\n#include \"icalls/System/System.Diagnostics/PerformanceCounterCategory.h\"\n#include \"icalls/System/System.Diagnostics/Process.h\"\n#include \"icalls/System/System.Diagnostics/Stopwatch.h\"\n\n#include \"icalls/System/System.Net/Dns.h\"\n\n#include \"icalls/System/System.Net.NetworkInformation/LinuxNetworkInterface.h\"\n#include \"icalls/System/System.Net.NetworkInformation/MacOsIPInterfaceProperties.h\"\n#include \"icalls/System/System.Net.Sockets/Socket.h\"\n#include \"icalls/System/System.Net.Sockets/SocketException.h\"\n\n#include \"icalls/System/System.Threading/Semaphore.h\"\n\n#include \"mono/ThreadPool/threadpool-ms.h\"\n#include \"mono/ThreadPool/threadpool-ms-io.h\"\n\n#include \"icalls/mscorlib/Mono/SafeStringMarshal.h\"\n#include \"icalls/mscorlib/Mono/RuntimeMarshal.h\"\n#include \"icalls/mscorlib/Mono/RuntimeGPtrArrayHandle.h\"\n#include \"icalls/mscorlib/Mono/RuntimeClassHandle.h\"\n\n#include \"icalls/mscorlib/System.Reflection/EventInfo.h\"\n#include \"icalls/mscorlib/System.Reflection/PropertyInfo.h\"\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/Microsoft.Win32/NativeMethods.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"NativeMethods.h\"\n#include \"os/Win32/WindowsHeaders.h\"\n#include \"os/NativeMethods.h\"\n#include \"os/Process.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace Microsoft\n{\nnamespace Win32\n{\n    bool NativeMethods::CloseProcess(Il2CppIntPtr handle)\n    {\n        return os::NativeMethods::CloseProcess((il2cpp::os::ProcessHandle*)handle.m_value);\n    }\n\n    bool NativeMethods::GetExitCodeProcess(Il2CppIntPtr processHandle, int32_t* exitCode)\n    {\n        return os::NativeMethods::GetExitCodeProcess((il2cpp::os::ProcessHandle*)processHandle.m_value, exitCode);\n    }\n\n    bool NativeMethods::GetProcessTimes(Il2CppIntPtr handle, int64_t* creation, int64_t* exit, int64_t* kernel, int64_t* user)\n    {\n        NOT_IMPLEMENTED_ICALL(NativeMethods::GetProcessTimes);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    bool NativeMethods::GetProcessWorkingSetSize(Il2CppIntPtr handle, Il2CppIntPtr* min, Il2CppIntPtr* max)\n    {\n        NOT_IMPLEMENTED_ICALL(NativeMethods::GetProcessWorkingSetSize);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    bool NativeMethods::SetPriorityClass(Il2CppIntPtr handle, int32_t priorityClass)\n    {\n        NOT_IMPLEMENTED_ICALL(NativeMethods::SetPriorityClass);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    bool NativeMethods::SetProcessWorkingSetSize(Il2CppIntPtr handle, Il2CppIntPtr min, Il2CppIntPtr max)\n    {\n        NOT_IMPLEMENTED_ICALL(NativeMethods::SetProcessWorkingSetSize);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    bool NativeMethods::TerminateProcess(Il2CppIntPtr processHandle, int32_t exitCode)\n    {\n        NOT_IMPLEMENTED_ICALL(NativeMethods::TerminateProcess);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    int32_t NativeMethods::GetCurrentProcessId()\n    {\n        return os::NativeMethods::GetCurrentProcessId();\n    }\n\n    int32_t NativeMethods::GetPriorityClass(Il2CppIntPtr handle)\n    {\n        NOT_IMPLEMENTED_ICALL(NativeMethods::GetPriorityClass);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n\n    int32_t NativeMethods::WaitForInputIdle(Il2CppIntPtr handle, int32_t milliseconds)\n    {\n        NOT_IMPLEMENTED_ICALL(NativeMethods::WaitForInputIdle);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n\n    Il2CppIntPtr NativeMethods::GetCurrentProcess()\n    {\n        Il2CppIntPtr handle;\n        handle.m_value = os::NativeMethods::GetCurrentProcess();\n        return handle;\n    }\n} // namespace Win32\n} // namespace Microsoft\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/Microsoft.Win32/NativeMethods.h",
    "content": "#pragma once\n\n#if NET_4_0\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace Microsoft\n{\nnamespace Win32\n{\n    class LIBIL2CPP_CODEGEN_API NativeMethods\n    {\n    public:\n        static bool CloseProcess(Il2CppIntPtr handle);\n        static bool GetExitCodeProcess(Il2CppIntPtr processHandle, int32_t* exitCode);\n        static bool GetProcessTimes(Il2CppIntPtr handle, int64_t* creation, int64_t* exit, int64_t* kernel, int64_t* user);\n        static bool GetProcessWorkingSetSize(Il2CppIntPtr handle, Il2CppIntPtr* min, Il2CppIntPtr* max);\n        static bool SetPriorityClass(Il2CppIntPtr handle, int32_t priorityClass);\n        static bool SetProcessWorkingSetSize(Il2CppIntPtr handle, Il2CppIntPtr min, Il2CppIntPtr max);\n        static bool TerminateProcess(Il2CppIntPtr processHandle, int32_t exitCode);\n        static int32_t GetCurrentProcessId();\n        static int32_t GetPriorityClass(Il2CppIntPtr handle);\n        static int32_t WaitForInputIdle(Il2CppIntPtr handle, int32_t milliseconds);\n        static Il2CppIntPtr GetCurrentProcess();\n    };\n} // namespace Win32\n} // namespace Microsoft\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/Mono.Net.Security/MonoTlsProviderFactory.cpp",
    "content": "#if NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"MonoTlsProviderFactory.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace Mono\n{\nnamespace Net\n{\nnamespace Security\n{\n    bool MonoTlsProviderFactory::IsBtlsSupported()\n    {\n        NOT_IMPLEMENTED_ICALL(MonoTlsProviderFactory::IsBtlsSupported);\n        IL2CPP_UNREACHABLE;\n    }\n} // namespace Security\n} // namespace Net\n} // namespace Mono\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/Mono.Net.Security/MonoTlsProviderFactory.h",
    "content": "#pragma once\n\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace Mono\n{\nnamespace Net\n{\nnamespace Security\n{\n    class LIBIL2CPP_CODEGEN_API MonoTlsProviderFactory\n    {\n    public:\n        static bool IsBtlsSupported();\n    };\n} // namespace Security\n} // namespace Net\n} // namespace Mono\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System/IOSelector.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"IOSelector.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\n    void IOSelector::Add(Il2CppIntPtr handle, Il2CppObject* job)\n    {\n        NOT_IMPLEMENTED_ICALL(IOSelector::Add);\n        IL2CPP_UNREACHABLE;\n    }\n\n    void IOSelector::Remove(Il2CppIntPtr handle)\n    {\n        NOT_IMPLEMENTED_ICALL(IOSelector::Remove);\n        IL2CPP_UNREACHABLE;\n    }\n} // namespace System\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System/IOSelector.h",
    "content": "#pragma once\n\n#if NET_4_0\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API IOSelector\n    {\n    public:\n        static void Add(Il2CppIntPtr handle, Il2CppObject* job);\n        static void Remove(Il2CppIntPtr handle);\n    };\n} // namespace System\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.ComponentModel/Win32Exception.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include <string>\n\n#include \"icalls/System/System.ComponentModel/Win32Exception.h\"\n\n#include \"vm/String.h\"\n#include \"os/ErrorCodes.h\"\n#include \"os/Messages.h\"\n\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"utils/StringUtils.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace ComponentModel\n{\n    Il2CppString *Win32Exception::W32ErrorMessage(int32_t code)\n    {\n        std::string message = os::Messages::FromCode((os::ErrorCode)code);\n\n        if (message.size() == 0)\n        {\n            // Note: this is a special case only for il2cpp. We might not want to keep\n            // this in the future, but helps with debugging and testing for now.\n            message = utils::StringUtils::Printf(\"Win32 Error message: %d (message string not found in the message table)\", code);\n        }\n\n        return vm::String::New(message.c_str());\n    }\n} /* namespace ComponentModel */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.ComponentModel/Win32Exception.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace ComponentModel\n{\n    class LIBIL2CPP_CODEGEN_API Win32Exception\n    {\n    public:\n        static Il2CppString *W32ErrorMessage(int32_t code);\n    };\n} /* namespace ComponentModel */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Configuration/DefaultConfig.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.Configuration/DefaultConfig.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Configuration\n{\n    Il2CppString* DefaultConfig::get_bundled_machine_config()\n    {\n        NOT_IMPLEMENTED_ICALL(DefaultConfig::get_bundled_machine_config);\n\n        return 0;\n    }\n\n    Il2CppString* DefaultConfig::get_machine_config_path()\n    {\n        NOT_IMPLEMENTED_ICALL(DefaultConfig::get_machine_config_path);\n\n        return 0;\n    }\n} /* namespace Configuration */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Configuration/DefaultConfig.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"object-internals.h\"\n#include \"il2cpp-config.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Configuration\n{\n    class LIBIL2CPP_CODEGEN_API DefaultConfig\n    {\n    public:\n        static Il2CppString* get_machine_config_path();\n        static Il2CppString* get_bundled_machine_config();\n    };\n} /* namespace Configuration */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Configuration/InternalConfigurationHost.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.Configuration/InternalConfigurationHost.h\"\n#include \"vm/String.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Runtime.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Configuration\n{\n    Il2CppString* InternalConfigurationHost::get_bundled_machine_config()\n    {\n        const char *config_xml = vm::Runtime::GetBundledMachineConfig();\n\n        if (config_xml == 0)\n            return NULL;\n\n        return vm::String::NewWrapper(config_xml);\n    }\n} /* namespace Configuration */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Configuration/InternalConfigurationHost.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Configuration\n{\n    class LIBIL2CPP_CODEGEN_API InternalConfigurationHost\n    {\n    public:\n        static Il2CppString* get_bundled_machine_config();\n    };\n} /* namespace Configuration */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/DefaultTraceListener.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.Diagnostics/DefaultTraceListener.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    void DefaultTraceListener::WriteWindowsDebugString(Il2CppString* message)\n    {\n        NOT_IMPLEMENTED_ICALL(DefaultTraceListener::WriteWindowsDebugString);\n    }\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/DefaultTraceListener.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    class LIBIL2CPP_CODEGEN_API DefaultTraceListener\n    {\n    public:\n        static void WriteWindowsDebugString(Il2CppString* message);\n    };\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/FileVersionInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.Diagnostics/FileVersionInfo.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    void FileVersionInfo::GetVersionInfo_internal(void* /* System.Diagnostics.FileVersionInfo */ self, Il2CppString* fileName)\n    {\n        NOT_IMPLEMENTED_ICALL(FileVersionInfo::GetVersionInfo_internal);\n    }\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/FileVersionInfo.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    class LIBIL2CPP_CODEGEN_API FileVersionInfo\n    {\n    public:\n        static void GetVersionInfo_internal(void* /* System.Diagnostics.FileVersionInfo */ self, Il2CppString* fileName);\n    };\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/PerformanceCounter.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.Diagnostics/PerformanceCounter.h\"\n#include \"PerformanceCounterUtils.h\"\n#include \"os/Time.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Exception.h\"\n#include \"vm-utils/VmStringUtils.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    static void fill_sample(Il2CppCounterSample *sample)\n    {\n        sample->timeStamp = os::Time::GetTicksMillisecondsMonotonic();\n        sample->timeStamp100nSec = sample->timeStamp;\n        sample->counterTimeStamp = sample->timeStamp;\n        sample->counterFrequency = 10000000;\n        sample->systemFrequency = 10000000;\n        // the real basevalue needs to be get from a different counter...\n        sample->baseValue = 0;\n    }\n\n    static bool Il2CppMemoryCounter(ImplVtable *vtable, bool only_value, Il2CppCounterSample *sample)\n    {\n        int id = (int)(intptr_t)vtable->arg;\n        if (!only_value)\n        {\n            fill_sample(sample);\n            sample->baseValue = 1;\n        }\n        sample->counterType = predef_counters[predef_categories[CATEGORY_MONO_MEM].first_counter + id].type;\n        switch (id)\n        {\n            case COUNTER_MEM_NUM_OBJECTS:\n                sample->rawValue = il2cpp_runtime_stats.new_object_count;\n                return true;\n        }\n        return false;\n    }\n\n    static void* Il2CppMemoryCounterImpl(Il2CppString* counter, Il2CppString* instance, int* type, bool* custom)\n    {\n        *custom = false;\n        const CounterDesc *cdesc = get_counter_in_category(&predef_categories[CATEGORY_MONO_MEM], counter);\n        if (cdesc)\n        {\n            *type = cdesc->type;\n            return create_vtable((void*)(intptr_t)cdesc->id, Il2CppMemoryCounter, NULL);\n        }\n        return NULL;\n    }\n\n    Il2CppIntPtr PerformanceCounter::GetImpl(Il2CppString* category, Il2CppString* counter, Il2CppString* instance, Il2CppString* machine, int* type, bool* custom)\n    {\n        Il2CppIntPtr returnValue = {0};\n        const CategoryDesc *cdesc;\n        if (!utils::VmStringUtils::CaseInsensitiveEquals(machine, \".\"))\n            return returnValue;\n\n        cdesc = find_category(category);\n        if (!cdesc)\n        {\n            return returnValue;\n        }\n        else\n        {\n            switch (cdesc->id)\n            {\n                case CATEGORY_MONO_MEM:\n                    returnValue.m_value = Il2CppMemoryCounterImpl(counter, instance, type, custom);\n            }\n        }\n\n        return returnValue;\n    }\n\n    bool PerformanceCounter::GetSample(Il2CppIntPtr impl, bool only_value, Il2CppCounterSample* sample)\n    {\n        ImplVtable *vtable = (ImplVtable*)impl.m_value;\n        if (vtable && vtable->sample)\n            return vtable->sample(vtable, only_value, sample);\n        return false;\n    }\n\n    int64_t PerformanceCounter::UpdateValue(Il2CppIntPtr impl, bool do_incr, int64_t value)\n    {\n        NOT_IMPLEMENTED_ICALL(PerformanceCounter::UpdateValue);\n\n        return 0;\n    }\n\n    void PerformanceCounter::FreeData(Il2CppIntPtr impl)\n    {\n        ImplVtable* vtable = (ImplVtable*)impl.m_value;\n        if (vtable && vtable->cleanup)\n            vtable->cleanup(vtable);\n        IL2CPP_FREE(vtable);\n    }\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/PerformanceCounter.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    struct Il2CppCounterSample;\n\n    class LIBIL2CPP_CODEGEN_API PerformanceCounter\n    {\n    public:\n        static void FreeData(Il2CppIntPtr impl);\n        static bool GetSample(Il2CppIntPtr impl, bool only_value, Il2CppCounterSample* sample);\n        static int64_t UpdateValue(Il2CppIntPtr impl, bool do_incr, int64_t value);\n        static Il2CppIntPtr GetImpl(Il2CppString* category, Il2CppString* counter, Il2CppString* instance, Il2CppString* machine, int* type, bool* custom);\n    };\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/PerformanceCounterCategory.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.Diagnostics/PerformanceCounterCategory.h\"\n#include \"PerformanceCounterUtils.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Array.h\"\n#include \"vm/String.h\"\n#include \"vm/Exception.h\"\n#include \"vm-utils/VmStringUtils.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    bool PerformanceCounterCategory::CategoryDelete(Il2CppString* name)\n    {\n        NOT_SUPPORTED_IL2CPP(PerformanceCounterCategory::Create, \"The IL2CPP scripting backend does not support the removal of custom performance counter categories.\");\n\n        return false;\n    }\n\n    Il2CppString* PerformanceCounterCategory::CategoryHelpInternal(Il2CppString* category, Il2CppString* machine)\n    {\n        if (!utils::VmStringUtils::CaseInsensitiveEquals(machine, \".\"))\n            return NULL;\n        const CategoryDesc* cdesc = find_category(category);\n        if (!cdesc)\n            return NULL;\n        return vm::String::New(cdesc->help);\n    }\n\n    bool PerformanceCounterCategory::CounterCategoryExists(Il2CppString* counter, Il2CppString* category, Il2CppString* machine)\n    {\n        if (!utils::VmStringUtils::CaseInsensitiveEquals(machine, \".\"))\n            return false;\n        const CategoryDesc* cdesc = find_category(category);\n        if (!cdesc)\n            return false;\n\n        /* counter is allowed to be null */\n        if (!counter)\n            return true;\n        if (get_counter_in_category(cdesc, counter))\n            return true;\n        return false;\n    }\n\n    bool PerformanceCounterCategory::Create(Il2CppString* categoryName, Il2CppString* categoryHelp, PerformanceCounterCategoryType categoryType, Il2CppArray* items)\n    {\n        NOT_SUPPORTED_IL2CPP(PerformanceCounterCategory::Create, \"The IL2CPP scripting backend does not support the creation of custom performance counter categories.\");\n\n        return false;\n    }\n\n    int32_t PerformanceCounterCategory::InstanceExistsInternal(Il2CppString* instance, Il2CppString* category, Il2CppString* machine)\n    {\n        return 0;\n    }\n\n    Il2CppArray* PerformanceCounterCategory::GetCategoryNames(Il2CppString* machine)\n    {\n        if (!utils::VmStringUtils::CaseInsensitiveEquals(machine, \".\"))\n            return vm::Array::New(il2cpp_defaults.string_class, 0);\n\n        Il2CppArray* res = vm::Array::New(il2cpp_defaults.string_class, NUM_CATEGORIES);\n        for (int i = 0; i < NUM_CATEGORIES; ++i)\n        {\n            const CategoryDesc *cdesc = &predef_categories[i];\n            il2cpp_array_setref(res, i, vm::String::New(cdesc->name));\n        }\n\n        return res;\n    }\n\n    Il2CppArray* PerformanceCounterCategory::GetCounterNames(Il2CppString* category, Il2CppString* machine)\n    {\n        if (!utils::VmStringUtils::CaseInsensitiveEquals(machine, \".\"))\n            return vm::Array::New(il2cpp_defaults.string_class, 0);\n\n        const CategoryDesc* cdesc = find_category(category);\n        if (cdesc)\n        {\n            Il2CppArray* res = vm::Array::New(il2cpp_defaults.string_class, cdesc[1].first_counter - cdesc->first_counter);\n            for (int i = cdesc->first_counter; i < cdesc[1].first_counter; ++i)\n            {\n                const CounterDesc *desc = &predef_counters[i];\n                il2cpp_array_setref(res, i - cdesc->first_counter, vm::String::New(desc->name));\n            }\n            return res;\n        }\n\n        return vm::Array::New(il2cpp_defaults.string_class, 0);\n    }\n\n    Il2CppArray* PerformanceCounterCategory::GetInstanceNames(Il2CppString* category, Il2CppString* machine)\n    {\n        return vm::Array::New(il2cpp_defaults.string_class, 0);\n    }\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/PerformanceCounterCategory.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    typedef int32_t PerformanceCounterCategoryType;\n\n    class LIBIL2CPP_CODEGEN_API PerformanceCounterCategory\n    {\n    public:\n        static Il2CppString* CategoryHelpInternal(Il2CppString* category, Il2CppString* machine);\n        static bool CounterCategoryExists(Il2CppString* counter, Il2CppString* category, Il2CppString* machine);\n        static bool Create(Il2CppString* categoryName, Il2CppString* categoryHelp, PerformanceCounterCategoryType categoryType, Il2CppArray* items);\n        static Il2CppArray* GetCategoryNames(Il2CppString* machine);\n        static Il2CppArray* GetCounterNames(Il2CppString* category, Il2CppString* machine);\n        static Il2CppArray* GetInstanceNames(Il2CppString* category, Il2CppString* machine);\n        static int32_t InstanceExistsInternal(Il2CppString* instance, Il2CppString* category, Il2CppString* machine);\n        static bool CategoryDelete(Il2CppString* name);\n    };\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/PerformanceCounterUtils.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"PerformanceCounterUtils.h\"\n#include \"object-internals.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/String.h\"\n#include \"vm-utils/VmStringUtils.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    ImplVtable* create_vtable(void *arg, SampleFunc sample, UpdateFunc update)\n    {\n        ImplVtable* vtable = (ImplVtable*)IL2CPP_MALLOC_ZERO(sizeof(ImplVtable));\n        vtable->arg = arg;\n        vtable->sample = sample;\n        vtable->update = update;\n        return vtable;\n    }\n\n    const CategoryDesc* find_category(Il2CppString *category)\n    {\n        for (int i = 0; i < NUM_CATEGORIES; ++i)\n        {\n            if (utils::VmStringUtils::CaseInsensitiveEquals(category, predef_categories[i].name))\n                return &predef_categories[i];\n        }\n        return NULL;\n    }\n\n    const CounterDesc* get_counter_in_category(const CategoryDesc *desc, Il2CppString *counter)\n    {\n        const CounterDesc *cdesc = &predef_counters[desc->first_counter];\n        const CounterDesc *end = &predef_counters[desc[1].first_counter];\n        for (; cdesc < end; ++cdesc)\n        {\n            if (utils::VmStringUtils::CaseInsensitiveEquals(counter, cdesc->name))\n                return cdesc;\n        }\n        return NULL;\n    }\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/PerformanceCounterUtils.h",
    "content": "#pragma once\n\n#include \"class-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    struct CategoryDesc\n    {\n        const char *name;\n        const char *help;\n        unsigned char id;\n        signed int type : 2;\n        unsigned int instance_type : 6;\n        short first_counter;\n    };\n\n#define PERFCTR_CAT(id, name, help, type, inst, first_counter) CATEGORY_ ## id,\n#define PERFCTR_COUNTER(id, name, help, type, field)\n    enum\n    {\n#include \"perfcounters-def.h\"\n        NUM_CATEGORIES\n    };\n\n#undef PERFCTR_CAT\n#undef PERFCTR_COUNTER\n#define PERFCTR_CAT(id, name, help, type, inst, first_counter) CATEGORY_START_ ## id = -1,\n#define PERFCTR_COUNTER(id, name, help, type, field) COUNTER_ ## id,\n/* each counter is assigned an id starting from 0 inside the category */\n    enum\n    {\n#include \"perfcounters-def.h\"\n        END_COUNTERS\n    };\n\n#undef PERFCTR_CAT\n#undef PERFCTR_COUNTER\n#define PERFCTR_CAT(id, name, help, type, inst, first_counter)\n#define PERFCTR_COUNTER(id, name, help, type, field) CCOUNTER_ ## id,\n/* this is used just to count the number of counters */\n    enum\n    {\n#include \"perfcounters-def.h\"\n        NUM_COUNTERS\n    };\n\n    struct CounterDesc\n    {\n        const char *name;\n        const char *help;\n        short id;\n        unsigned short offset; // offset inside Il2CppPerfCounters\n        int type;\n    };\n\n    enum\n    {\n        FTYPE_CATEGORY = 'C',\n        FTYPE_DELETED = 'D',\n        FTYPE_PREDEF_INSTANCE = 'P', // an instance of a predef counter\n        FTYPE_INSTANCE = 'I',\n        FTYPE_DIRTY = 'd',\n        FTYPE_END = 0\n    };\n\n    struct SharedHeader\n    {\n        unsigned char ftype;\n        unsigned char extra;\n        unsigned short size;\n    };\n\n    struct SharedCategory\n    {\n        SharedHeader header;\n        unsigned short num_counters;\n        unsigned short counters_data_size;\n        int num_instances;\n        /* variable length data follows */\n        char name[1];\n        // string name\n        // string help\n        // SharedCounter counters_info [num_counters]\n    };\n\n    struct SharedInstance\n    {\n        SharedHeader header;\n        size_t category_offset;\n        /* variable length data follows */\n        char instance_name[1];\n        // string name\n    };\n\n    struct SharedCounter\n    {\n        unsigned char type;\n        uint8_t seq_num;\n        /* variable length data follows */\n        char name[1];\n        // string name\n        // string help\n    };\n\n    struct CatSearch\n    {\n        Il2CppString *name;\n        SharedCategory *cat;\n    };\n\n/* map of PerformanceCounterType.cs */\n    enum\n    {\n        NumberOfItemsHEX32 = 0x00000000,\n        NumberOfItemsHEX64 = 0x00000100,\n        NumberOfItems32 = 0x00010000,\n        NumberOfItems64 = 0x00010100,\n        CounterDelta32 = 0x00400400,\n        CounterDelta64 = 0x00400500,\n        SampleCounter = 0x00410400,\n        CountPerTimeInterval32 = 0x00450400,\n        CountPerTimeInterval64 = 0x00450500,\n        RateOfCountsPerSecond32 = 0x10410400,\n        RateOfCountsPerSecond64 = 0x10410500,\n        RawFraction = 0x20020400,\n        CounterTimer = 0x20410500,\n        Timer100Ns = 0x20510500,\n        SampleFraction = 0x20C20400,\n        CounterTimerInverse = 0x21410500,\n        Timer100NsInverse = 0x21510500,\n        CounterMultiTimer = 0x22410500,\n        CounterMultiTimer100Ns = 0x22510500,\n        CounterMultiTimerInverse = 0x23410500,\n        CounterMultiTimer100NsInverse = 0x23510500,\n        AverageTimer32 = 0x30020400,\n        ElapsedTime = 0x30240500,\n        AverageCount64 = 0x40020500,\n        SampleBase = 0x40030401,\n        AverageBase = 0x40030402,\n        RawBase = 0x40030403,\n        CounterMultiBase = 0x42030500\n    };\n\n/* maps a small integer type to the counter types above */\n    static const int simple_type_to_type[] =\n    {\n        NumberOfItemsHEX32, NumberOfItemsHEX64,\n        NumberOfItems32, NumberOfItems64,\n        CounterDelta32, CounterDelta64,\n        SampleCounter, CountPerTimeInterval32,\n        CountPerTimeInterval64, RateOfCountsPerSecond32,\n        RateOfCountsPerSecond64, RawFraction,\n        CounterTimer, Timer100Ns,\n        SampleFraction, CounterTimerInverse,\n        Timer100NsInverse, CounterMultiTimer,\n        CounterMultiTimer100Ns, CounterMultiTimerInverse,\n        CounterMultiTimer100NsInverse, AverageTimer32,\n        ElapsedTime, AverageCount64,\n        SampleBase, AverageBase,\n        RawBase, CounterMultiBase\n    };\n\n    enum\n    {\n        SingleInstance,\n        MultiInstance,\n        CatTypeUnknown = -1\n    };\n\n    enum\n    {\n        ProcessInstance,\n        ThreadInstance,\n        CPUInstance,\n        MonoInstance,\n        NetworkInterfaceInstance,\n        CustomInstance\n    };\n\n/* map of CounterSample.cs */\n    struct Il2CppCounterSample\n    {\n        int64_t rawValue;\n        int64_t baseValue;\n        int64_t counterFrequency;\n        int64_t systemFrequency;\n        int64_t timeStamp;\n        int64_t timeStamp100nSec;\n        int64_t counterTimeStamp;\n        int counterType;\n    };\n\n#undef PERFCTR_CAT\n#undef PERFCTR_COUNTER\n#define PERFCTR_CAT(id, name, help, type, inst, first_counter) {name, help, CATEGORY_ ## id, type, inst ## Instance, CCOUNTER_ ## first_counter},\n#define PERFCTR_COUNTER(id, name, help, type, field)\n    static const CategoryDesc\n        predef_categories[] =\n    {\n        /* sample runtime counter */\n#include \"perfcounters-def.h\"\n        { NULL, NULL, NUM_CATEGORIES, -1, 0, NUM_COUNTERS }\n    };\n\n#undef PERFCTR_CAT\n#undef PERFCTR_COUNTER\n#define PERFCTR_CAT(id, name, help, type, inst, first_counter)\n#define PERFCTR_COUNTER(id, name, help, type, field) {name, help, COUNTER_ ## id, offsetof (Il2CppPerfCounters, field), type},\n    static const CounterDesc\n        predef_counters[] =\n    {\n#include \"perfcounters-def.h\"\n        { NULL, NULL, -1, 0, 0 }\n    };\n/*\n* We have several different classes of counters:\n* *) system counters\n* *) runtime counters\n* *) remote counters\n* *) user-defined counters\n* *) windows counters (the implementation on windows will use this)\n*\n* To easily handle the differences we create a vtable for each class that contains the\n* function pointers with the actual implementation to access the counters.\n*/\n    typedef struct _ImplVtable ImplVtable;\n\n    typedef bool(*SampleFunc) (ImplVtable *vtable, bool only_value, Il2CppCounterSample* sample);\n    typedef uint64_t(*UpdateFunc) (ImplVtable *vtable, bool do_incr, int64_t value);\n    typedef void(*CleanupFunc) (ImplVtable *vtable);\n\n    struct _ImplVtable\n    {\n        void *arg;\n        SampleFunc sample;\n        UpdateFunc update;\n        CleanupFunc cleanup;\n    };\n\n    struct CustomVTable\n    {\n        ImplVtable vtable;\n        SharedInstance *instance_desc;\n        SharedCounter *counter_desc;\n    };\n\n    const CategoryDesc* find_category(Il2CppString *category);\n    const CounterDesc* get_counter_in_category(const CategoryDesc *desc, Il2CppString *counter);\n    ImplVtable* create_vtable(void *arg, SampleFunc sample, UpdateFunc update);\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/Process.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.Diagnostics/Process.h\"\n#include \"os/Process.h\"\n#include \"vm/Exception.h\"\n#include \"vm/String.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    int32_t Process::ExitCode_internal(Il2CppIntPtr handle)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::ExitCode_internal);\n\n        return 0;\n    }\n\n    int64_t Process::ExitTime_internal(Il2CppIntPtr handle)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::ExitTime_internal);\n\n        return 0;\n    }\n\n    bool Process::GetWorkingSet_internal(Il2CppIntPtr handle, int32_t* min, int32_t* max)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::GetWorkingSet_internal);\n\n        return false;\n    }\n\n    bool Process::SetWorkingSet_internal(Il2CppIntPtr handle, int32_t min, int32_t max, bool use_min)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::SetWorkingSet_internal);\n\n        return false;\n    }\n\n    Il2CppArray* Process::GetModules_internal(void* /* System.Diagnostics.Process */ self, Il2CppIntPtr handle)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::GetModules_internal);\n\n        return 0;\n    }\n\n    int64_t Process::GetProcessData(int32_t pid, int32_t data_type, int32_t* error)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::GetProcessData);\n\n        return 0;\n    }\n\n    int32_t Process::GetPriorityClass(Il2CppIntPtr handle, int32_t* error)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::GetPriorityClass);\n\n        return 0;\n    }\n\n    bool Process::SetPriorityClass(Il2CppIntPtr handle, int32_t priority, int32_t* error)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::SetPriorityClass);\n\n        return false;\n    }\n\n    int64_t Process::Times(Il2CppIntPtr handle, int32_t type)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::Times);\n\n        return 0;\n    }\n\n    Il2CppString* Process::ProcessName_internal(Il2CppIntPtr handle)\n    {\n        os::ProcessHandle *pHandle = (os::ProcessHandle*)handle.m_value;\n        std::string name = os::Process::GetProcessName(pHandle);\n        return il2cpp::vm::String::New(name.c_str());\n    }\n\n    int64_t Process::StartTime_internal(Il2CppIntPtr handle)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::StartTime_internal);\n\n        return 0;\n    }\n\n    bool Process::Kill_internal(Il2CppIntPtr handle, int32_t signo)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::Kill_internal);\n\n        return false;\n    }\n\n    Il2CppIntPtr Process::GetProcess_internal(int32_t pid)\n    {\n        Il2CppIntPtr process;\n        process.m_value = os::Process::GetProcess(pid);\n\n        return process;\n    }\n\n    int32_t Process::GetPid_internal()\n    {\n        return os::Process::GetCurrentProcessId();\n    }\n\n    Il2CppArray* Process::GetProcesses_internal()\n    {\n        NOT_IMPLEMENTED_ICALL(Process::GetProcesses_internal);\n\n        return 0;\n    }\n\n    bool Process::ShellExecuteEx_internal(void* /* System.Diagnostics.ProcessStartInfo */ startInfo, ProcInfo* proc_info)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::ShellExecuteEx_internal);\n\n        return false;\n    }\n\n    bool Process::CreateProcess_internal(void* /* System.Diagnostics.ProcessStartInfo */ startInfo, Il2CppIntPtr _stdin, Il2CppIntPtr _stdout, Il2CppIntPtr _stderr, ProcInfo* proc_info)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::CreateProcess_internal);\n\n        return false;\n    }\n\n    bool Process::WaitForExit_internal(void* /* System.Diagnostics.Process */ self, Il2CppIntPtr handle, int32_t ms)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::WaitForExit_internal);\n\n        return false;\n    }\n\n    bool Process::WaitForInputIdle_internal(void* /* System.Diagnostics.Process */ self, Il2CppIntPtr handle, int32_t ms)\n    {\n        NOT_IMPLEMENTED_ICALL(Process::WaitForInputIdle_internal);\n\n        return false;\n    }\n\n    void Process::Process_free_internal(void* /* System.Diagnostics.Process */ self, Il2CppIntPtr handle)\n    {\n        os::Process::FreeProcess((os::ProcessHandle*)handle.m_value);\n    }\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/Process.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    struct ProcInfo;\n\n    class LIBIL2CPP_CODEGEN_API Process\n    {\n    public:\n        static Il2CppArray* GetProcesses_internal();\n        static int32_t GetPid_internal();\n        static bool CreateProcess_internal(void* /* System.Diagnostics.ProcessStartInfo */ startInfo, Il2CppIntPtr _stdin, Il2CppIntPtr _stdout, Il2CppIntPtr _stderr, ProcInfo* proc_info);\n        static int64_t ExitTime_internal(Il2CppIntPtr handle);\n        static Il2CppArray* GetModules_internal(void* /* System.Diagnostics.Process */ self, Il2CppIntPtr handle);\n        static int32_t GetPriorityClass(Il2CppIntPtr handle, int32_t* error);\n        static int64_t GetProcessData(int32_t pid, int32_t data_type, int32_t* error);\n        static Il2CppIntPtr GetProcess_internal(int32_t pid);\n        static bool GetWorkingSet_internal(Il2CppIntPtr handle, int32_t* min, int32_t* max);\n        static bool Kill_internal(Il2CppIntPtr handle, int32_t signo);\n        static Il2CppString* ProcessName_internal(Il2CppIntPtr handle);\n        static void Process_free_internal(void* /* System.Diagnostics.Process */ self, Il2CppIntPtr handle);\n        static bool SetPriorityClass(Il2CppIntPtr handle, int32_t priority, int32_t* error);\n        static bool SetWorkingSet_internal(Il2CppIntPtr handle, int32_t min, int32_t max, bool use_min);\n        static bool ShellExecuteEx_internal(void* /* System.Diagnostics.ProcessStartInfo */ startInfo, ProcInfo* proc_info);\n        static int64_t StartTime_internal(Il2CppIntPtr handle);\n        static int64_t Times(Il2CppIntPtr handle, int32_t type);\n        static bool WaitForExit_internal(void* /* System.Diagnostics.Process */ self, Il2CppIntPtr handle, int32_t ms);\n        static bool WaitForInputIdle_internal(void* /* System.Diagnostics.Process */ self, Il2CppIntPtr handle, int32_t ms);\n        static int32_t ExitCode_internal(Il2CppIntPtr handle);\n    };\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/Stopwatch.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/System/System.Diagnostics/Stopwatch.h\"\n#include \"os/Time.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    int64_t Stopwatch::GetTimestamp()\n    {\n        return il2cpp::os::Time::GetTicks100NanosecondsMonotonic();\n    }\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/Stopwatch.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    class LIBIL2CPP_CODEGEN_API Stopwatch\n    {\n    public:\n        static int64_t GetTimestamp();\n    };\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Diagnostics/perfcounters-def.h",
    "content": "/*\n* Define the system and runtime performance counters.\n* Each category is defined with the macro:\n*       PERFCTR_CAT(catid, name, help, type, instances, first_counter_id)\n* and after that follows the counters inside the category, defined by the macro:\n*       PERFCTR_COUNTER(counter_id, name, help, type, field)\n* field is the field inside MonoPerfCounters per predefined counters.\n* Note we set it to unused for unrelated counters: it is unused\n* in those cases.\n*/\n//PERFCTR_CAT(CPU, \"Processor\", \"\", MultiInstance, CPU, CPU_USER_TIME)\n//PERFCTR_COUNTER(CPU_USER_TIME, \"% User Time\", \"\", Timer100Ns, unused)\n//PERFCTR_COUNTER(CPU_PRIV_TIME, \"% Privileged Time\", \"\", Timer100Ns, unused)\n//PERFCTR_COUNTER(CPU_INTR_TIME, \"% Interrupt Time\", \"\", Timer100Ns, unused)\n//PERFCTR_COUNTER(CPU_DCP_TIME, \"% DCP Time\", \"\", Timer100Ns, unused)\n//PERFCTR_COUNTER(CPU_PROC_TIME, \"% Processor Time\", \"\", Timer100NsInverse, unused)\n//\n//PERFCTR_CAT(PROC, \"Process\", \"\", MultiInstance, Process, PROC_USER_TIME)\n//PERFCTR_COUNTER(PROC_USER_TIME, \"% User Time\", \"\", Timer100Ns, unused)\n//PERFCTR_COUNTER(PROC_PRIV_TIME, \"% Privileged Time\", \"\", Timer100Ns, unused)\n//PERFCTR_COUNTER(PROC_PROC_TIME, \"% Processor Time\", \"\", Timer100Ns, unused)\n//PERFCTR_COUNTER(PROC_THREADS, \"Thread Count\", \"\", NumberOfItems64, unused)\n//PERFCTR_COUNTER(PROC_VBYTES, \"Virtual Bytes\", \"\", NumberOfItems64, unused)\n//PERFCTR_COUNTER(PROC_WSET, \"Working Set\", \"\", NumberOfItems64, unused)\n//PERFCTR_COUNTER(PROC_PBYTES, \"Private Bytes\", \"\", NumberOfItems64, unused)\n\n/* sample runtime counter */\nPERFCTR_CAT(MONO_MEM, \"Mono Memory\", \"\", SingleInstance, Mono, MEM_NUM_OBJECTS)\nPERFCTR_COUNTER(MEM_NUM_OBJECTS, \"Allocated Objects\", \"\", NumberOfItems64, unused)\n//PERFCTR_COUNTER(MEM_PHYS_TOTAL, \"Total Physical Memory\", \"Physical memory installed in the machine, in bytes\", NumberOfItems64, unused)\n//PERFCTR_COUNTER(MEM_PHYS_AVAILABLE, \"Available Physical Memory\", \"Physical memory available in the machine, in bytes\", NumberOfItems64, unused)\n//\n//PERFCTR_CAT(ASPNET, \"ASP.NET\", \"\", MultiInstance, Mono, ASPNET_REQ_Q)\n//PERFCTR_COUNTER(ASPNET_REQ_Q, \"Requests Queued\", \"\", NumberOfItems64, aspnet_requests_queued)\n//PERFCTR_COUNTER(ASPNET_REQ_TOTAL, \"Requests Total\", \"\", NumberOfItems32, aspnet_requests)\n//PERFCTR_COUNTER(ASPNET_REQ_PSEC, \"Requests/Sec\", \"\", RateOfCountsPerSecond32, aspnet_requests)\n//\n//PERFCTR_CAT(JIT, \".NET CLR JIT\", \"\", MultiInstance, Mono, JIT_BYTES)\n//PERFCTR_COUNTER(JIT_BYTES, \"# of IL Bytes JITted\", \"\", NumberOfItems32, jit_bytes)\n//PERFCTR_COUNTER(JIT_METHODS, \"# of IL Methods JITted\", \"\", NumberOfItems32, jit_methods)\n//PERFCTR_COUNTER(JIT_TIME, \"% Time in JIT\", \"\", RawFraction, jit_time)\n//PERFCTR_COUNTER(JIT_BYTES_PSEC, \"IL Bytes Jitted/Sec\", \"\", RateOfCountsPerSecond32, jit_bytes)\n//PERFCTR_COUNTER(JIT_FAILURES, \"Standard Jit Failures\", \"\", NumberOfItems32, jit_failures)\n//\n//PERFCTR_CAT(EXC, \".NET CLR Exceptions\", \"\", MultiInstance, Mono, EXC_THROWN)\n//PERFCTR_COUNTER(EXC_THROWN, \"# of Exceps Thrown\", \"\", NumberOfItems32, exceptions_thrown)\n//PERFCTR_COUNTER(EXC_THROWN_PSEC, \"# of Exceps Thrown/Sec\", \"\", RateOfCountsPerSecond32, exceptions_thrown)\n//PERFCTR_COUNTER(EXC_FILTERS_PSEC, \"# of Filters/Sec\", \"\", RateOfCountsPerSecond32, exceptions_filters)\n//PERFCTR_COUNTER(EXC_FINALLYS_PSEC, \"# of Finallys/Sec\", \"\", RateOfCountsPerSecond32, exceptions_finallys)\n//PERFCTR_COUNTER(EXC_CATCH_DEPTH, \"Throw to Catch Depth/Sec\", \"\", NumberOfItems32, exceptions_depth)\n//\n//PERFCTR_CAT(GC, \".NET CLR Memory\", \"\", MultiInstance, Mono, GC_GEN0)\n//PERFCTR_COUNTER(GC_GEN0, \"# Gen 0 Collections\", \"\", NumberOfItems32, gc_collections0)\n//PERFCTR_COUNTER(GC_GEN1, \"# Gen 1 Collections\", \"\", NumberOfItems32, gc_collections1)\n//PERFCTR_COUNTER(GC_GEN2, \"# Gen 2 Collections\", \"\", NumberOfItems32, gc_collections2)\n//PERFCTR_COUNTER(GC_PROM0, \"Promoted Memory from Gen 0\", \"\", NumberOfItems32, gc_promotions0)\n//PERFCTR_COUNTER(GC_PROM1, \"Promoted Memory from Gen 1\", \"\", NumberOfItems32, gc_promotions1)\n//PERFCTR_COUNTER(GC_PROM0SEC, \"Gen 0 Promoted Bytes/Sec\", \"\", RateOfCountsPerSecond32, gc_promotions0)\n//PERFCTR_COUNTER(GC_PROM1SEC, \"Gen 1 Promoted Bytes/Sec\", \"\", RateOfCountsPerSecond32, gc_promotions1)\n//PERFCTR_COUNTER(GC_PROMFIN, \"Promoted Finalization-Memory from Gen 0\", \"\", NumberOfItems32, gc_promotion_finalizers)\n//PERFCTR_COUNTER(GC_GEN0SIZE, \"Gen 0 heap size\", \"\", NumberOfItems32, gc_gen0size)\n//PERFCTR_COUNTER(GC_GEN1SIZE, \"Gen 1 heap size\", \"\", NumberOfItems32, gc_gen1size)\n//PERFCTR_COUNTER(GC_GEN2SIZE, \"Gen 2 heap size\", \"\", NumberOfItems32, gc_gen2size)\n//PERFCTR_COUNTER(GC_LOSIZE, \"Large Object Heap size\", \"\", NumberOfItems32, gc_lossize)\n//PERFCTR_COUNTER(GC_FINSURV, \"Finalization Survivors\", \"\", NumberOfItems32, gc_fin_survivors)\n//PERFCTR_COUNTER(GC_NHANDLES, \"# GC Handles\", \"\", NumberOfItems32, gc_num_handles)\n//PERFCTR_COUNTER(GC_BYTESSEC, \"Allocated Bytes/sec\", \"\", RateOfCountsPerSecond32, gc_allocated)\n//PERFCTR_COUNTER(GC_INDGC, \"# Induced GC\", \"\", NumberOfItems32, gc_induced)\n//PERFCTR_COUNTER(GC_PERCTIME, \"% Time in GC\", \"\", RawFraction, gc_time)\n//PERFCTR_COUNTER(GC_BYTES, \"# Bytes in all Heaps\", \"\", NumberOfItems32, gc_total_bytes)\n//PERFCTR_COUNTER(GC_COMMBYTES, \"# Total committed Bytes\", \"\", NumberOfItems32, gc_committed_bytes)\n//PERFCTR_COUNTER(GC_RESBYTES, \"# Total reserved Bytes\", \"\", NumberOfItems32, gc_reserved_bytes)\n//PERFCTR_COUNTER(GC_PINNED, \"# of Pinned Objects\", \"\", NumberOfItems32, gc_num_pinned)\n//PERFCTR_COUNTER(GC_SYNKB, \"# of Sink Blocks in use\", \"\", NumberOfItems32, gc_sync_blocks)\n//\n//PERFCTR_CAT(REMOTING, \".NET CLR Remoting\", \"\", MultiInstance, Mono, REMOTING_CALLSEC)\n//PERFCTR_COUNTER(REMOTING_CALLSEC, \"Remote Calls/sec\", \"\", RateOfCountsPerSecond32, remoting_calls)\n//PERFCTR_COUNTER(REMOTING_CALLS, \"Total Remote Calls\", \"\", NumberOfItems32, remoting_calls)\n//PERFCTR_COUNTER(REMOTING_CHANNELS, \"Channels\", \"\", NumberOfItems32, remoting_channels)\n//PERFCTR_COUNTER(REMOTING_CPROXIES, \"Context Proxies\", \"\", NumberOfItems32, remoting_proxies)\n//PERFCTR_COUNTER(REMOTING_CBLOADED, \"Context-Bound Classes Loaded\", \"\", NumberOfItems32, remoting_classes)\n//PERFCTR_COUNTER(REMOTING_CBALLOCSEC, \"Context-Bound Objects Alloc / sec\", \"\", RateOfCountsPerSecond32, remoting_objects)\n//PERFCTR_COUNTER(REMOTING_CONTEXTS, \"Contexts\", \"\", NumberOfItems32, remoting_contexts)\n//\n//PERFCTR_CAT(LOADING, \".NET CLR Loading\", \"\", MultiInstance, Mono, LOADING_CLASSES)\n//PERFCTR_COUNTER(LOADING_CLASSES, \"Current Classes Loaded\", \"\", NumberOfItems32, loader_classes)\n//PERFCTR_COUNTER(LOADING_TOTCLASSES, \"Total Classes Loaded\", \"\", NumberOfItems32, loader_total_classes)\n//PERFCTR_COUNTER(LOADING_CLASSESSEC, \"Rate of Classes Loaded\", \"\", RateOfCountsPerSecond32, loader_total_classes)\n//PERFCTR_COUNTER(LOADING_APPDOMAINS, \"Current appdomains\", \"\", NumberOfItems32, loader_appdomains)\n//PERFCTR_COUNTER(LOADING_TOTAPPDOMAINS, \"Total Appdomains\", \"\", NumberOfItems32, loader_total_appdomains)\n//PERFCTR_COUNTER(LOADING_APPDOMAINSEC, \"Rate of appdomains\", \"\", RateOfCountsPerSecond32, loader_total_appdomains)\n//PERFCTR_COUNTER(LOADING_ASSEMBLIES, \"Current Assemblies\", \"\", NumberOfItems32, loader_assemblies)\n//PERFCTR_COUNTER(LOADING_TOTASSEMBLIES, \"Total Assemblies\", \"\", NumberOfItems32, loader_total_assemblies)\n//PERFCTR_COUNTER(LOADING_ASSEMBLIESEC, \"Rate of Assemblies\", \"\", RateOfCountsPerSecond32, loader_total_assemblies)\n//PERFCTR_COUNTER(LOADING_FAILURES, \"Total # of Load Failures\", \"\", NumberOfItems32, loader_failures)\n//PERFCTR_COUNTER(LOADING_FAILURESSEC, \"Rate of Load Failures\", \"\", RateOfCountsPerSecond32, loader_failures)\n//PERFCTR_COUNTER(LOADING_BYTES, \"Bytes in Loader Heap\", \"\", NumberOfItems32, loader_bytes)\n//PERFCTR_COUNTER(LOADING_APPUNLOADED, \"Total appdomains unloaded\", \"\", NumberOfItems32, loader_appdomains_uloaded)\n//PERFCTR_COUNTER(LOADING_APPUNLOADEDSEC, \"Rate of appdomains unloaded\", \"\", RateOfCountsPerSecond32, loader_appdomains_uloaded)\n//\n//PERFCTR_CAT(THREAD, \".NET CLR LocksAndThreads\", \"\", MultiInstance, Mono, THREAD_CONTENTIONS)\n//PERFCTR_COUNTER(THREAD_CONTENTIONS, \"Total # of Contentions\", \"\", NumberOfItems32, thread_contentions)\n//PERFCTR_COUNTER(THREAD_CONTENTIONSSEC, \"Contention Rate / sec\", \"\", RateOfCountsPerSecond32, thread_contentions)\n//PERFCTR_COUNTER(THREAD_QUEUELEN, \"Current Queue Length\", \"\", NumberOfItems32, thread_queue_len)\n//PERFCTR_COUNTER(THREAD_QUEUELENP, \"Queue Length Peak\", \"\", NumberOfItems32, thread_queue_max)\n//PERFCTR_COUNTER(THREAD_QUEUELENSEC, \"Queue Length / sec\", \"\", RateOfCountsPerSecond32, thread_queue_max)\n//PERFCTR_COUNTER(THREAD_NUMLOG, \"# of current logical Threads\", \"\", NumberOfItems32, thread_num_logical)\n//PERFCTR_COUNTER(THREAD_NUMPHYS, \"# of current physical Threads\", \"\", NumberOfItems32, thread_num_physical)\n//PERFCTR_COUNTER(THREAD_NUMREC, \"# of current recognized threads\", \"\", NumberOfItems32, thread_cur_recognized)\n//PERFCTR_COUNTER(THREAD_TOTREC, \"# of total recognized threads\", \"\", NumberOfItems32, thread_num_recognized)\n//PERFCTR_COUNTER(THREAD_TOTRECSEC, \"rate of recognized threads / sec\", \"\", RateOfCountsPerSecond32, thread_num_recognized)\n//\n//PERFCTR_CAT(INTEROP, \".NET CLR Interop\", \"\", MultiInstance, Mono, INTEROP_NUMCCW)\n//PERFCTR_COUNTER(INTEROP_NUMCCW, \"# of CCWs\", \"\", NumberOfItems32, interop_num_ccw)\n//PERFCTR_COUNTER(INTEROP_STUBS, \"# of Stubs\", \"\", NumberOfItems32, interop_num_stubs)\n//PERFCTR_COUNTER(INTEROP_MARSH, \"# of marshalling\", \"\", NumberOfItems32, interop_num_marshals)\n//\n//PERFCTR_CAT(SECURITY, \".NET CLR Security\", \"\", MultiInstance, Mono, SECURITY_CHECKS)\n//PERFCTR_COUNTER(SECURITY_CHECKS, \"Total Runtime Checks\", \"\", NumberOfItems32, security_num_checks)\n//PERFCTR_COUNTER(SECURITY_LCHECKS, \"# Link Time Checks\", \"\", NumberOfItems32, security_num_link_checks)\n//PERFCTR_COUNTER(SECURITY_PERCTIME, \"% Time in RT checks\", \"\", RawFraction, security_time)\n//PERFCTR_COUNTER(SECURITY_SWDEPTH, \"Stack Walk Depth\", \"\", NumberOfItems32, security_depth)\n//\n//PERFCTR_CAT(THREADPOOL, \"Mono Threadpool\", \"\", MultiInstance, Mono, THREADPOOL_WORKITEMS)\n//PERFCTR_COUNTER(THREADPOOL_WORKITEMS, \"Work Items Added\", \"\", NumberOfItems64, threadpool_workitems)\n//PERFCTR_COUNTER(THREADPOOL_WORKITEMS_PSEC, \"Work Items Added/Sec\", \"\", RateOfCountsPerSecond32, threadpool_workitems)\n//PERFCTR_COUNTER(THREADPOOL_IOWORKITEMS, \"IO Work Items Added\", \"\", NumberOfItems64, threadpool_ioworkitems)\n//PERFCTR_COUNTER(THREADPOOL_IOWORKITEMS_PSEC, \"IO Work Items Added/Sec\", \"\", RateOfCountsPerSecond32, threadpool_ioworkitems)\n//PERFCTR_COUNTER(THREADPOOL_THREADS, \"# of Threads\", \"\", NumberOfItems32, threadpool_threads)\n//PERFCTR_COUNTER(THREADPOOL_IOTHREADS, \"# of IO Threads\", \"\", NumberOfItems32, threadpool_iothreads)\n//\n//PERFCTR_CAT(NETWORK, \"Network Interface\", \"\", MultiInstance, NetworkInterface, NETWORK_BYTESRECSEC)\n//PERFCTR_COUNTER(NETWORK_BYTESRECSEC, \"Bytes Received/sec\", \"\", RateOfCountsPerSecond64, unused)\n//PERFCTR_COUNTER(NETWORK_BYTESSENTSEC, \"Bytes Sent/sec\", \"\", RateOfCountsPerSecond64, unused)\n//PERFCTR_COUNTER(NETWORK_BYTESTOTALSEC, \"Bytes Total/sec\", \"\", RateOfCountsPerSecond64, unused)\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.IO/FAMWatcher.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.IO/FAMWatcher.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace IO\n{\n    int32_t FAMWatcher::InternalFAMNextEvent(FAMConnection* fc, Il2CppString** filename, int32_t* code, int32_t* reqnum)\n    {\n        NOT_IMPLEMENTED_ICALL(FAMWatcher::InternalFAMNextEvent);\n\n        return 0;\n    }\n} /* namespace IO */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.IO/FAMWatcher.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"object-internals.h\"\n#include \"il2cpp-config.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace IO\n{\n    struct FAMConnection;\n\n    class LIBIL2CPP_CODEGEN_API FAMWatcher\n    {\n    public:\n        static int32_t InternalFAMNextEvent(FAMConnection* fc, Il2CppString** filename, int32_t* code, int32_t* reqnum);\n    };\n} /* namespace IO */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.IO/FileSystemWatcher.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.IO/FileSystemWatcher.h\"\n#include \"os/FileSystemWatcher.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace IO\n{\n    int32_t FileSystemWatcher::InternalSupportsFSW()\n    {\n        return os::FileSystemWatcher::IsSupported();\n    }\n} /* namespace IO */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.IO/FileSystemWatcher.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"object-internals.h\"\n#include \"il2cpp-config.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace IO\n{\n    class LIBIL2CPP_CODEGEN_API FileSystemWatcher\n    {\n    public:\n        static int32_t InternalSupportsFSW();\n    };\n} /* namespace IO */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.IO/InotifyWatcher.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.IO/InotifyWatcher.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace IO\n{\n    Il2CppIntPtr InotifyWatcher::GetInotifyInstance()\n    {\n        NOT_IMPLEMENTED_ICALL(InotifyWatcher::GetInotifyInstance);\n\n        return Il2CppIntPtr();\n    }\n\n    int32_t InotifyWatcher::AddWatch(Il2CppIntPtr fd, Il2CppString* name, InotifyMask mask)\n    {\n        NOT_IMPLEMENTED_ICALL(InotifyWatcher::AddWatch);\n\n        return 0;\n    }\n\n    Il2CppIntPtr InotifyWatcher::RemoveWatch(Il2CppIntPtr fd, int32_t wd)\n    {\n        NOT_IMPLEMENTED_ICALL(InotifyWatcher::RemoveWatch);\n\n        return Il2CppIntPtr();\n    }\n} /* namespace IO */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.IO/InotifyWatcher.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"object-internals.h\"\n#include \"il2cpp-config.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace IO\n{\n    typedef int32_t InotifyMask;\n\n    class LIBIL2CPP_CODEGEN_API InotifyWatcher\n    {\n    public:\n        static Il2CppIntPtr RemoveWatch(Il2CppIntPtr fd, int32_t wd);\n        static int32_t AddWatch(Il2CppIntPtr fd, Il2CppString* name, InotifyMask mask);\n        static Il2CppIntPtr GetInotifyInstance();\n    };\n} /* namespace IO */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.IO/KqueueMonitor.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"KqueueMonitor.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace IO\n{\n    int32_t KqueueMonitor::kevent_notimeout(int32_t* kq, Il2CppIntPtr ev, int32_t nchanges, Il2CppIntPtr evtlist, int32_t nevents)\n    {\n        NOT_IMPLEMENTED_ICALL(KqueueMonitor::kevent_notimeout);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n} // namespace IO\n} // namespace System\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.IO/KqueueMonitor.h",
    "content": "#pragma once\n#if NET_4_0\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace IO\n{\n    class LIBIL2CPP_CODEGEN_API KqueueMonitor\n    {\n    public:\n        static int32_t kevent_notimeout(int32_t* kq, Il2CppIntPtr ev, int32_t nchanges, Il2CppIntPtr evtlist, int32_t nevents);\n    };\n} // namespace IO\n} // namespace System\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Net/Dns.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.Net/Dns.h\"\n\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"vm/Array.h\"\n#include \"vm/String.h\"\n#include \"os/Socket.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/StringUtils.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Net\n{\n    bool Dns::GetHostByAddr(Il2CppString* addr, Il2CppString** h_name, Il2CppArray** h_aliases, Il2CppArray** h_addr_list)\n    {\n        std::string name;\n        std::vector<std::string> aliases;\n        std::vector<std::string> addr_list;\n\n        const std::string address = il2cpp::utils::StringUtils::Utf16ToUtf8(addr->chars);\n        const os::WaitStatus result = os::Socket::GetHostByAddr(address, name, aliases, addr_list);\n\n        *h_name = vm::String::New(name.c_str());\n        *h_aliases = vm::Array::New(il2cpp_defaults.string_class, (il2cpp_array_size_t)aliases.size());\n        *h_addr_list = vm::Array::New(il2cpp_defaults.string_class, (il2cpp_array_size_t)addr_list.size());\n\n        int32_t index = 0;\n\n        std::vector<std::string>::const_iterator it = aliases.begin();\n        while (it != aliases.end())\n        {\n            il2cpp_array_setref(*h_aliases, index++, vm::String::New((*it).c_str()));\n            ++it;\n        }\n\n        index = 0;\n\n        it = addr_list.begin();\n        while (it != addr_list.end())\n        {\n            il2cpp_array_setref(*h_addr_list, index++, vm::String::New((*it).c_str()));\n            ++it;\n        }\n\n        return (result != os::kWaitStatusFailure);\n    }\n\n    bool Dns::GetHostByName(Il2CppString* host, Il2CppString** h_name, Il2CppArray** h_aliases, Il2CppArray** h_addr_list)\n    {\n        std::string name;\n        std::vector<std::string> aliases;\n        std::vector<std::string> addr_list;\n\n        const std::string host_name = il2cpp::utils::StringUtils::Utf16ToUtf8(host->chars);\n        const os::WaitStatus result = os::Socket::GetHostByName(host_name, name, aliases, addr_list);\n\n        *h_name = vm::String::New(name.c_str());\n        *h_aliases = vm::Array::New(il2cpp_defaults.string_class, (il2cpp_array_size_t)aliases.size());\n        *h_addr_list = vm::Array::New(il2cpp_defaults.string_class, (il2cpp_array_size_t)addr_list.size());\n\n        int32_t index = 0;\n\n        std::vector<std::string>::const_iterator it = aliases.begin();\n        while (it != aliases.end())\n        {\n            il2cpp_array_setref(*h_aliases, index++, vm::String::New((*it).c_str()));\n            ++it;\n        }\n\n        index = 0;\n\n        it = addr_list.begin();\n        while (it != addr_list.end())\n        {\n            il2cpp_array_setref(*h_addr_list, index++, vm::String::New((*it).c_str()));\n            ++it;\n        }\n\n        return (result != os::kWaitStatusFailure);\n    }\n\n    bool Dns::GetHostName(Il2CppString** name)\n    {\n        std::string host_name;\n\n        *name = (os::Socket::GetHostName(host_name) != os::kWaitStatusFailure)\n            ? vm::String::New(host_name.c_str())\n            : NULL;\n\n        return *name != NULL;\n    }\n} /* namespace Net */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Net/Dns.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppArray;\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Net\n{\n    class LIBIL2CPP_CODEGEN_API Dns\n    {\n    public:\n        static bool GetHostByAddr(Il2CppString*, Il2CppString**, Il2CppArray**, Il2CppArray**);\n        static bool GetHostByName(Il2CppString*, Il2CppString**, Il2CppArray**, Il2CppArray**);\n        static bool GetHostName(Il2CppString**);\n    };\n} /* namespace Net */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Net.NetworkInformation/LinuxNetworkInterface.cpp",
    "content": "#if !NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"LinuxNetworkInterface.h\"\n#include \"external/xamarin-android/xamarin_getifaddrs.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Net\n{\nnamespace NetworkInformation\n{\n    int32_t LinuxNetworkInterface::GetInterfaceAddresses(Il2CppIntPtr* ifap)\n    {\n        return _monodroid_getifaddrs(reinterpret_cast<_monodroid_ifaddrs**>(&ifap->m_value));\n    }\n\n    void LinuxNetworkInterface::FreeInterfaceAddresses(Il2CppIntPtr ifap)\n    {\n        _monodroid_freeifaddrs(static_cast<_monodroid_ifaddrs*>(ifap.m_value));\n    }\n\n    void LinuxNetworkInterface::InitializeInterfaceAddresses()\n    {\n        _monodroid_getifaddrs_init();\n    }\n} // namespace NetworkInformation\n} // namespace Net\n} // namespace System\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Net.NetworkInformation/LinuxNetworkInterface.h",
    "content": "#pragma once\n\n#if !NET_4_0\n\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Net\n{\nnamespace NetworkInformation\n{\n    class LIBIL2CPP_CODEGEN_API LinuxNetworkInterface\n    {\n    public:\n        static int32_t GetInterfaceAddresses(Il2CppIntPtr* ifap);\n        static void FreeInterfaceAddresses(Il2CppIntPtr ifap);\n        static void InitializeInterfaceAddresses();\n    };\n} // namespace NetworkInformation\n} // namespace Net\n} // namespace System\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Net.NetworkInformation/MacOsIPInterfaceProperties.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"MacOsIPInterfaceProperties.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Net\n{\nnamespace NetworkInformation\n{\n    bool MacOsIPInterfaceProperties::ParseRouteInfo_internal(Il2CppString* iface, Il2CppArray** gw_addr_list)\n    {\n        NOT_IMPLEMENTED_ICALL(MacOsIPInterfaceProperties::ParseRouteInfo_internal);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n} // namespace NetworkInformation\n} // namespace Net\n} // namespace System\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Net.NetworkInformation/MacOsIPInterfaceProperties.h",
    "content": "#pragma once\n#if NET_4_0\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Net\n{\nnamespace NetworkInformation\n{\n    class LIBIL2CPP_CODEGEN_API MacOsIPInterfaceProperties\n    {\n    public:\n        static bool ParseRouteInfo_internal(Il2CppString* iface, Il2CppArray** gw_addr_list);\n    };\n} // namespace NetworkInformation\n} // namespace Net\n} // namespace System\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Net.Sockets/Socket.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.Net.Sockets/Socket.h\"\n\n#include \"class-internals.h\"\n#include \"os/Socket.h\"\n#include \"os/Mutex.h\"\n#include \"os/Thread.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Array.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Field.h\"\n#include \"vm/Object.h\"\n#include \"vm/String.h\"\n#include \"vm/Thread.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Net\n{\nnamespace Sockets\n{\n    static os::AddressFamily convert_address_family(AddressFamily family)\n    {\n        switch (family)\n        {\n            case kAddressFamilyUnknown:\n            case kAddressFamilyImpLink:\n            case kAddressFamilyPup:\n            case kAddressFamilyChaos:\n            case kAddressFamilyIso:\n            case kAddressFamilyEcma:\n            case kAddressFamilyDataKit:\n            case kAddressFamilyCcitt:\n            case kAddressFamilyDataLink:\n            case kAddressFamilyLat:\n            case kAddressFamilyHyperChannel:\n            case kAddressFamilyNetBios:\n            case kAddressFamilyVoiceView:\n            case kAddressFamilyFireFox:\n            case kAddressFamilyBanyan:\n            case kAddressFamilyAtm:\n            case kAddressFamilyCluster:\n            case kAddressFamilyIeee12844:\n            case kAddressFamilyNetworkDesigners:\n                // Unsupported\n                return os::kAddressFamilyError;\n\n            case kAddressFamilyUnspecified:\n                return os::kAddressFamilyUnspecified;\n\n            case kAddressFamilyUnix:\n                return os::kAddressFamilyUnix;\n\n            case kAddressFamilyInterNetwork:\n                return os::kAddressFamilyInterNetwork;\n\n            case kAddressFamilyIpx:\n                return os::kAddressFamilyIpx;\n\n            case kAddressFamilySna:\n                return os::kAddressFamilySna;\n\n            case kAddressFamilyDecNet:\n                return os::kAddressFamilyDecNet;\n\n            case kAddressFamilyAppleTalk:\n                return os::kAddressFamilyAppleTalk;\n\n            case kAddressFamilyInterNetworkV6:\n                return os::kAddressFamilyInterNetworkV6;\n\n            case kAddressFamilyIrda:\n                return os::kAddressFamilyIrda;\n\n            default:\n                return os::kAddressFamilyError;\n        }\n\n        return os::kAddressFamilyError;\n    }\n\n    static os::SocketType convert_socket_type(SocketType type)\n    {\n        switch (type)\n        {\n            case kSocketTypeStream:\n                return os::kSocketTypeStream;\n\n            case kSocketTypeDgram:\n                return os::kSocketTypeDgram;\n\n            case kSocketTypeRaw:\n                return os::kSocketTypeRaw;\n\n            case kSocketTypeRdm:\n                return os::kSocketTypeRdm;\n\n            case kSocketTypeSeqpacket:\n                return os::kSocketTypeSeqpacket;\n\n            default:\n                return os::kSocketTypeError;\n        }\n\n        return os::kSocketTypeError;\n    }\n\n    static os::ProtocolType convert_socket_protocol(ProtocolType protocol)\n    {\n        switch (protocol)\n        {\n            case kProtocolTypeIP:\n            case kProtocolTypeIPv6:\n            case kProtocolTypeIcmp:\n            case kProtocolTypeIgmp:\n            case kProtocolTypeGgp:\n            case kProtocolTypeTcp:\n            case kProtocolTypePup:\n            case kProtocolTypeUdp:\n            case kProtocolTypeIdp:\n                // In this case the enum values map exactly.\n                return (os::ProtocolType)protocol;\n\n            case kProtocolTypeND:\n            case kProtocolTypeRaw:\n            case kProtocolTypeIpx:\n            case kProtocolTypeSpx:\n            case kProtocolTypeSpxII:\n            case kProtocolTypeUnknown:\n                // Everything else in unsupported\n                return os::kProtocolTypeUnknown;\n\n            default:\n                return os::kProtocolTypeUnknown;\n        }\n\n        return os::kProtocolTypeUnknown;\n    }\n\n    static AddressFamily convert_from_os_address_family(os::AddressFamily family)\n    {\n        switch (family)\n        {\n            case os::kAddressFamilyUnspecified:\n                return kAddressFamilyUnspecified;\n\n            case os::kAddressFamilyUnix:\n                return kAddressFamilyUnix;\n\n            case os::kAddressFamilyInterNetwork:\n                return kAddressFamilyInterNetwork;\n\n//  #ifdef AF_IPX\n            case os::kAddressFamilyIpx:\n                return kAddressFamilyIpx;\n//  #endif\n\n            case os::kAddressFamilySna:\n                return kAddressFamilySna;\n\n            case os::kAddressFamilyDecNet:\n                return kAddressFamilyDecNet;\n\n            case os::kAddressFamilyAppleTalk:\n                return kAddressFamilyAppleTalk;\n\n//  #ifdef AF_INET6\n            case os::kAddressFamilyInterNetworkV6:\n                return kAddressFamilyInterNetworkV6;\n//  #endif\n\n//  #ifdef AF_IRDA\n            case os::kAddressFamilyIrda:\n                return kAddressFamilyIrda;\n//  #endif\n            default:\n                break;\n        }\n\n        return kAddressFamilyUnknown;\n    }\n\n    static os::SocketFlags convert_socket_flags(SocketFlags flags)\n    {\n        return (os::SocketFlags)flags;\n    }\n\n    static Il2CppSocketAddress* end_point_info_to_socket_address(const os::EndPointInfo &info)\n    {\n        static Il2CppClass *System_Net_SocketAddress = NULL;\n\n        Il2CppSocketAddress *socket_address = NULL;\n\n        if (!System_Net_SocketAddress)\n        {\n            System_Net_SocketAddress = vm::Class::FromName(\n                    vm::Assembly::GetImage(\n                        vm::Assembly::Load(\"System.dll\")),\n                    \"System.Net\", \"SocketAddress\");\n        }\n\n        socket_address = (Il2CppSocketAddress*)vm::Object::New(System_Net_SocketAddress);\n\n        const AddressFamily family = convert_from_os_address_family(info.family);\n\n        if (info.family == os::kAddressFamilyInterNetwork)\n        {\n#if NET_4_0\n            socket_address->m_Size = 8;\n#endif\n            socket_address->data = vm::Array::New(il2cpp_defaults.byte_class, 8);\n\n            const uint16_t port = info.data.inet.port;\n            const uint32_t address = info.data.inet.address;\n\n            il2cpp_array_set(socket_address->data, uint8_t, 0, (family >> 0) & 0xFF);\n            il2cpp_array_set(socket_address->data, uint8_t, 1, (family >> 8) & 0xFF);\n            il2cpp_array_set(socket_address->data, uint8_t, 2, (port >> 8) & 0xFF);\n            il2cpp_array_set(socket_address->data, uint8_t, 3, (port >> 0) & 0xFF);\n            il2cpp_array_set(socket_address->data, uint8_t, 4, (address >> 24) & 0xFF);\n            il2cpp_array_set(socket_address->data, uint8_t, 5, (address >> 16) & 0xFF);\n            il2cpp_array_set(socket_address->data, uint8_t, 6, (address >>  8) & 0xFF);\n            il2cpp_array_set(socket_address->data, uint8_t, 7, (address >>  0) & 0xFF);\n        }\n        else if (info.family == os::kAddressFamilyUnix)\n        {\n            const int32_t path_len = (int32_t)strlen(info.data.path);\n\n#if NET_4_0\n            socket_address->m_Size = 3 + path_len;\n#endif\n            socket_address->data = vm::Array::New(il2cpp_defaults.byte_class, 3 + path_len);\n\n            il2cpp_array_set(socket_address->data, uint8_t, 0, (family >> 0) & 0xFF);\n            il2cpp_array_set(socket_address->data, uint8_t, 1, (family >> 8) & 0xFF);\n\n            for (int32_t i = 0; i <= path_len; i++)\n                il2cpp_array_set(socket_address->data, uint8_t, i + 2, info.data.path[i]);\n\n            il2cpp_array_set(socket_address->data, uint8_t, 2 + path_len, 0);\n        }\n        else if (info.family == os::kAddressFamilyInterNetworkV6)\n        {\n#if NET_4_0\n            socket_address->m_Size = 28;\n#endif\n            socket_address->data = vm::Array::New(il2cpp_defaults.byte_class, 28);\n\n            il2cpp_array_set(socket_address->data, uint8_t, 0, (family >> 0) & 0xFF);\n            il2cpp_array_set(socket_address->data, uint8_t, 1, (family >> 8) & 0xFF);\n\n            // Note that we start at the 3rd byte in both the managed array, where the first\n            // two bytes are the family, set just above this. We also start at the third byte\n            // in the info.data.raw array, as the first two bytes are unused and garbage data.\n            for (int i = 2; i < 28; ++i)\n                il2cpp_array_set(socket_address->data, uint8_t, i, info.data.raw[i]);\n        }\n        else\n        {\n            // Not supported\n            return NULL;\n        }\n\n        return socket_address;\n    }\n\n    static bool check_thread_status()\n    {\n        static os::FastMutex _mutex;\n\n        os::FastAutoLock lock(&_mutex);\n\n        Il2CppThread *current_thread = vm::Thread::Current();\n        const vm::ThreadState state = vm::Thread::GetState(current_thread);\n\n        if (state & vm::kThreadStateAbortRequested)\n            return false;\n\n        if (state & vm::kThreadStateSuspendRequested)\n        {\n            IL2CPP_ASSERT(0 && \"kThreadStateSuspendRequested not supported yet!\");\n            return true;\n        }\n\n        if (state & vm::kThreadStateStopRequested)\n            return false;\n\n        if (current_thread->GetInternalThread()->interruption_requested)\n        {\n            IL2CPP_ASSERT(0 && \"thread->interruption_requested not supported yet!\");\n            return false;\n        }\n\n        return true;\n    }\n\n/// Acquire os::SocketHandle in IntPtr \"socket\" for the current scope.\n#define AUTO_ACQUIRE_SOCKET \\\n    os::SocketHandleWrapper socketHandle (os::PointerToSocketHandle (socket.m_value))\n\n#define RETURN_IF_SOCKET_IS_INVALID(...) \\\n    if (!socketHandle.IsValid ()) \\\n    { \\\n        *error = os::kErrorCodeInvalidHandle; \\\n        return __VA_ARGS__; \\\n    }\n\n    Il2CppIntPtr Socket::Accept(Il2CppIntPtr socket, int32_t* error, bool blocking)\n    {\n        *error = 0;\n\n        os::Socket *new_sock = NULL;\n\n        AUTO_ACQUIRE_SOCKET;\n\n        if (socketHandle.IsValid())\n        {\n            const os::WaitStatus status = socketHandle->Accept(&new_sock);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else\n        {\n            *error = os::kErrorCodeInvalidHandle;\n        }\n\n        Il2CppIntPtr ret;\n        if (new_sock)\n            ret.m_value = reinterpret_cast<void*>(static_cast<uintptr_t>(os::CreateSocketHandle(new_sock)));\n        else\n            ret.m_value = NULL;\n\n        return ret;\n    }\n\n    int32_t Socket::Available(Il2CppIntPtr socket, int32_t *error)\n    {\n        *error = 0;\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID(0);\n\n        int32_t available = 0;\n\n        const os::WaitStatus status = socketHandle->Available(&available);\n\n        if (status == os::kWaitStatusFailure)\n        {\n            *error = socketHandle->GetLastError();\n            return 0;\n        }\n\n        return available;\n    }\n\n    void UnpackIPv6AddressFromBuffer(const uint8_t* buffer, int32_t length, uint16_t* port, uint8_t* address, uint32_t* scope)\n    {\n        if (length < 28)\n        {\n            vm::Exception::Raise(vm::Exception::GetSystemException());\n            return;\n        }\n\n        *port = ((buffer[2] << 8) | buffer[3]);\n\n        for (int i = 0; i < ipv6AddressSize; i++)\n            address[i] = buffer[i + 8];\n\n        *scope = (uint32_t)((buffer[27] << 24) +\n                            (buffer[26] << 16) +\n                            (buffer[25] << 8) +\n                            (buffer[24]));\n    }\n\n    void Socket::Bind(Il2CppIntPtr socket, Il2CppSocketAddress* socket_address, int32_t* error)\n    {\n        *error = 0;\n\n        const int32_t length = socket_address->data->max_length;\n        const uint8_t *buffer = (uint8_t*)il2cpp::vm::Array::GetFirstElementAddress(socket_address->data);\n\n        if (length < 2)\n        {\n            vm::Exception::Raise(vm::Exception::GetSystemException());\n            return;\n        }\n\n        const os::AddressFamily family = convert_address_family((AddressFamily)(buffer[0] | (buffer[1] << 8)));\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID();\n\n        if (family == os::kAddressFamilyInterNetwork)\n        {\n            if (length < 8)\n            {\n                vm::Exception::Raise(vm::Exception::GetSystemException());\n                return;\n            }\n\n            const uint16_t port = ((buffer[2] << 8) | buffer[3]);\n            const uint32_t address = ((buffer[4] << 24) | (buffer[5] << 16) | (buffer[6] << 8) | buffer[7]);\n\n            const os::WaitStatus status = socketHandle->Bind(address, port);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else if (family == os::kAddressFamilyUnix)\n        {\n            if (length - 2 >= END_POINT_MAX_PATH_LEN)\n            {\n                vm::Exception::Raise(vm::Exception::GetSystemException());\n                return;\n            }\n\n            char path[END_POINT_MAX_PATH_LEN] = {0};\n\n            for (int32_t i = 0; i < (length - 2); ++i)\n            {\n                path[i] = (char)buffer[i + 2];\n            }\n\n            const os::WaitStatus status = socketHandle->Bind(path);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else if (family == os::kAddressFamilyInterNetworkV6)\n        {\n            uint16_t port;\n            uint8_t address[ipv6AddressSize] = {0};\n            uint32_t scope;\n            UnpackIPv6AddressFromBuffer(buffer, length, &port, address, &scope);\n\n            const os::WaitStatus status = socketHandle->Bind(address, scope, port);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else\n        {\n            *error = os::kWSAeafnosupport;\n            return;\n        }\n    }\n\n    void Socket::Blocking(Il2CppIntPtr socket, bool block, int32_t* error)\n    {\n        *error = 0;\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID();\n\n        const os::WaitStatus status = socketHandle->SetBlocking(block);\n\n        if (status == os::kWaitStatusFailure)\n            *error = socketHandle->GetLastError();\n    }\n\n    void Socket::Close(Il2CppIntPtr socket, int32_t* error)\n    {\n        *error = 0;\n\n        // Socket::Close get invoked when running the finalizers; in case Socket_internal\n        // didn't succeed, the socket.m_value has a NULL value and thus we don't need to do\n        // anything here.\n        if (os::PointerToSocketHandle(socket.m_value) == os::kInvalidSocketHandle)\n            return;\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID();\n\n        socket.m_value = (void*)os::kInvalidSocketHandle;\n\n        socketHandle->Close();\n\n        // There is an implicit acquisition happening when we create the socket which we undo\n        // now that we have closed the socket.\n        os::ReleaseSocketHandle(socketHandle.GetHandle());\n    }\n\n    void Socket::Connect(Il2CppIntPtr socket, Il2CppSocketAddress* socket_address, int32_t* error)\n    {\n        *error = 0;\n\n        const int32_t length = socket_address->data->max_length;\n        const uint8_t *buffer = (uint8_t*)il2cpp::vm::Array::GetFirstElementAddress(socket_address->data);\n\n        if (length < 2)\n        {\n            vm::Exception::Raise(vm::Exception::GetSystemException());\n            return;\n        }\n\n        const os::AddressFamily family = convert_address_family((AddressFamily)(buffer[0] | (buffer[1] << 8)));\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID();\n\n        if (family == os::kAddressFamilyInterNetwork)\n        {\n            if (length < 8)\n            {\n                vm::Exception::Raise(vm::Exception::GetSystemException());\n                return;\n            }\n\n            const uint16_t port = ((buffer[2] << 8) | buffer[3]);\n            const uint32_t address = ((buffer[4] << 24) | (buffer[5] << 16) | (buffer[6] << 8) | buffer[7]);\n\n            const os::WaitStatus status = socketHandle->Connect(address, port);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else if (family == os::kAddressFamilyUnix)\n        {\n            if (length - 2 >= END_POINT_MAX_PATH_LEN)\n            {\n                vm::Exception::Raise(vm::Exception::GetSystemException());\n                return;\n            }\n\n            char path[END_POINT_MAX_PATH_LEN] = {0};\n\n            for (int32_t i = 0; i < (length - 2); ++i)\n            {\n                path[i] = (char)buffer[i + 2];\n            }\n\n            const os::WaitStatus status = socketHandle->Connect(path);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else if (family == os::kAddressFamilyInterNetworkV6)\n        {\n            uint16_t port;\n            uint8_t address[ipv6AddressSize] = {0};\n            uint32_t scope;\n            UnpackIPv6AddressFromBuffer(buffer, length, &port, address, &scope);\n\n            const os::WaitStatus status = socketHandle->Connect(address, scope, port);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else\n        {\n            *error = os::kWSAeafnosupport;\n            return;\n        }\n    }\n\n    void Socket::Disconnect(Il2CppIntPtr socket, bool reuse, int32_t *error)\n    {\n        *error = 0;\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID();\n\n        const os::WaitStatus status = socketHandle->Disconnect(reuse);\n\n        if (status == os::kWaitStatusFailure)\n            *error = socketHandle->GetLastError();\n    }\n\n    void Socket::GetSocketOptionArray(Il2CppIntPtr socket, SocketOptionLevel level, SocketOptionName name, Il2CppArray **byte_val, int32_t *error)\n    {\n        *error = 0;\n\n        // Note: for now the options map one to one.\n        const os::SocketOptionName system_name = (os::SocketOptionName)(name);\n        const os::SocketOptionLevel system_level = (os::SocketOptionLevel)(level);\n\n        int32_t length = (*byte_val)->max_length;\n        uint8_t *buffer = (uint8_t*)il2cpp::vm::Array::GetFirstElementAddress((*byte_val));\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID();\n\n        const os::WaitStatus status = socketHandle->GetSocketOption(system_level, system_name, buffer, &length);\n\n        if (status == os::kWaitStatusFailure)\n            *error = socketHandle->GetLastError();\n    }\n\n    void Socket::GetSocketOptionObj(Il2CppIntPtr socket, SocketOptionLevel level, SocketOptionName name, Il2CppObject **obj_val, int32_t *error)\n    {\n        *error = 0;\n\n        // Note: for now the options map one to one.\n        const os::SocketOptionName system_name = (os::SocketOptionName)(name);\n        const os::SocketOptionLevel system_level = (os::SocketOptionLevel)(level);\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID();\n\n        int32_t first = 0;\n        int32_t second = 0;\n\n        const os::WaitStatus status = socketHandle->GetSocketOptionFull(system_level, system_name, &first, &second);\n\n        if (status == os::kWaitStatusFailure)\n        {\n            *error = socketHandle->GetLastError();\n            return;\n        }\n\n        switch (name)\n        {\n            case kSocketOptionNameLinger:\n            {\n                static Il2CppClass *System_Net_Sockets_LingerOption = NULL;\n\n                if (!System_Net_Sockets_LingerOption)\n                {\n                    System_Net_Sockets_LingerOption = vm::Class::FromName(\n                            vm::Assembly::GetImage(\n                                vm::Assembly::Load(\"System.dll\")),\n                            \"System.Net.Sockets\", \"LingerOption\");\n                }\n\n                *obj_val = vm::Object::New(System_Net_Sockets_LingerOption);\n\n#if NET_4_0\n                const FieldInfo *enabled_field_info = vm::Class::GetFieldFromName(System_Net_Sockets_LingerOption, \"enabled\");\n                const FieldInfo *seconds_field_info = vm::Class::GetFieldFromName(System_Net_Sockets_LingerOption, \"lingerTime\");\n#else\n                const FieldInfo *enabled_field_info = vm::Class::GetFieldFromName(System_Net_Sockets_LingerOption, \"enabled\");\n                const FieldInfo *seconds_field_info = vm::Class::GetFieldFromName(System_Net_Sockets_LingerOption, \"seconds\");\n#endif\n\n                *((bool*)((char*)(*obj_val) + enabled_field_info->offset)) = (first ? 1 : 0);\n                *((int32_t*)((char*)(*obj_val) + seconds_field_info->offset)) = second;\n            }\n\n            break;\n\n            case kSocketOptionNameDontLinger:\n            case kSocketOptionNameSendTimeout:\n            case kSocketOptionNameReceiveTimeout:\n            default:\n                *obj_val = vm::Object::Box(il2cpp_defaults.int32_class, &first);\n                break;\n        }\n    }\n\n    void Socket::Listen(Il2CppIntPtr socket, int32_t backlog, int32_t *error)\n    {\n        *error = 0;\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID();\n\n        const os::WaitStatus status = socketHandle->Listen(backlog);\n\n        if (status == os::kWaitStatusFailure)\n            *error = socketHandle->GetLastError();\n    }\n\n    static os::PollFlags select_mode_to_poll_flags(SelectMode mode)\n    {\n        switch (mode)\n        {\n            case kSelectModeSelectRead:\n                return os::kPollFlagsIn;\n\n            case kSelectModeSelectWrite:\n                return os::kPollFlagsOut;\n\n            case kSelectModeSelectError:\n                return os::kPollFlagsErr;\n        }\n\n        return os::kPollFlagsNone;\n    }\n\n    bool Socket::Poll(Il2CppIntPtr socket, SelectMode mode, int32_t timeout, int32_t *error)\n    {\n        *error = 0;\n\n        os::PollRequest request;\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID(false);\n\n        request.fd = socketHandle.GetSocket()->GetDescriptor();\n        request.events = select_mode_to_poll_flags(mode);\n        request.revents = os::kPollFlagsNone;\n\n        if (request.events == os::kPollFlagsNone)\n        {\n            *error = os::kWSAefault;\n            return false;\n        }\n\n        std::vector<os::PollRequest> requests;\n\n        requests.push_back(request);\n\n        int32_t results = 0;\n        const os::WaitStatus result = os::Socket::Poll(requests, timeout, &results, error);\n\n        if (result == os::kWaitStatusFailure || results == 0)\n            return false;\n\n        return (requests[0].revents != os::kPollFlagsNone);\n    }\n\n    int32_t Socket::ReceiveArray(Il2CppIntPtr socket, Il2CppArray *buffers, SocketFlags flags, int32_t *error)\n    {\n        *error = 0;\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID(0);\n\n        const int32_t count = buffers->max_length;\n        const os::SocketFlags c_flags = convert_socket_flags(flags);\n\n        os::WSABuf *wsabufs = il2cpp_array_addr(buffers, os::WSABuf, 0);\n\n        int32_t len = 0;\n\n        const os::WaitStatus status = socketHandle->ReceiveArray(wsabufs, count, &len, c_flags);\n\n        if (status == os::kWaitStatusFailure)\n        {\n            *error = socketHandle->GetLastError();\n            return 0;\n        }\n\n        return len;\n    }\n\n    int32_t Socket::Receive(Il2CppIntPtr socket, Il2CppArray *buffer, int32_t offset, int32_t count, SocketFlags flags, int32_t *error)\n    {\n        *error = 0;\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID(0);\n\n        const int32_t a_len = buffer->max_length;\n        if (offset > a_len - count)\n            return 0;\n\n        const os::SocketFlags c_flags = convert_socket_flags(flags);\n        const uint8_t *data = il2cpp_array_addr(buffer, uint8_t, offset);\n\n        int32_t len = 0;\n\n        const os::WaitStatus status = socketHandle->Receive(data, count, c_flags, &len);\n\n        if (status == os::kWaitStatusFailure)\n            *error = socketHandle->GetLastError();\n\n        return len;\n    }\n\n    int32_t Socket::RecvFrom(Il2CppIntPtr socket, Il2CppArray *buffer, int32_t offset, int32_t count, SocketFlags flags, Il2CppSocketAddress **socket_address, int32_t *error)\n    {\n        *error = 0;\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID(0);\n\n        const int32_t a_len = buffer->max_length;\n        if (offset > a_len - count)\n            return 0;\n\n        const os::SocketFlags c_flags = convert_socket_flags(flags);\n        const uint8_t *data = il2cpp_array_addr(buffer, uint8_t, offset);\n\n        int32_t len = 0;\n\n        const int32_t length = (*socket_address)->data->max_length;\n        const uint8_t *socket_buffer = (uint8_t*)il2cpp::vm::Array::GetFirstElementAddress((*socket_address)->data);\n\n        if (length < 2)\n        {\n            vm::Exception::Raise(vm::Exception::GetSystemException());\n            return 0;\n        }\n\n        const os::AddressFamily family = convert_address_family((AddressFamily)(socket_buffer[0] | (socket_buffer[1] << 8)));\n\n        os::EndPointInfo info;\n\n        info.family = os::kAddressFamilyError;\n\n        if (family == os::kAddressFamilyInterNetwork)\n        {\n            if (length < 8)\n            {\n                vm::Exception::Raise(vm::Exception::GetSystemException());\n                return 0;\n            }\n\n            const uint16_t port = ((socket_buffer[2] << 8) | socket_buffer[3]);\n            const uint32_t address = ((socket_buffer[4] << 24) | (socket_buffer[5] << 16) | (socket_buffer[6] << 8) | socket_buffer[7]);\n\n            const os::WaitStatus status = socketHandle->RecvFrom(address, port, data, count, c_flags, &len, info);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else if (family == os::kAddressFamilyUnix)\n        {\n            if (length - 2 >= END_POINT_MAX_PATH_LEN)\n            {\n                vm::Exception::Raise(vm::Exception::GetSystemException());\n                return 0;\n            }\n\n            char path[END_POINT_MAX_PATH_LEN] = {0};\n\n            for (int32_t i = 0; i < (length - 2); ++i)\n            {\n                path[i] = (char)socket_buffer[i + 2];\n            }\n\n            const os::WaitStatus status = socketHandle->RecvFrom(path, data, count, c_flags, &len, info);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else if (family == os::kAddressFamilyInterNetworkV6)\n        {\n            uint16_t port;\n            uint8_t address[ipv6AddressSize] = {0};\n            uint32_t scope;\n            UnpackIPv6AddressFromBuffer(socket_buffer, length, &port, address, &scope);\n\n            const os::WaitStatus status = socketHandle->RecvFrom(address, scope, port, data, count, c_flags, &len, info);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else\n        {\n            *error = os::kWSAeafnosupport;\n            return 0;\n        }\n\n        *socket_address = (info.family == os::kAddressFamilyError) ? NULL : end_point_info_to_socket_address(info);\n\n        return len;\n    }\n\n    Il2CppSocketAddress* Socket::LocalEndPoint(Il2CppIntPtr socket, int32_t* error)\n    {\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID(NULL);\n\n        os::EndPointInfo info;\n\n        memset(&info, 0x00, sizeof(os::EndPointInfo));\n\n        const os::WaitStatus status = socketHandle->GetLocalEndPointInfo(info);\n\n        if (status == os::kWaitStatusFailure)\n        {\n            *error = socketHandle->GetLastError();\n            return NULL;\n        }\n\n        Il2CppSocketAddress *socket_address = end_point_info_to_socket_address(info);\n\n        if (socket_address == NULL)\n            *error = os::kWSAeafnosupport;\n\n        return socket_address;\n    }\n\n    Il2CppSocketAddress* Socket::RemoteEndPoint(Il2CppIntPtr socket, int32_t* error)\n    {\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID(NULL);\n\n        os::EndPointInfo info;\n\n        memset(&info, 0x00, sizeof(os::EndPointInfo));\n\n        const os::WaitStatus status = socketHandle->GetRemoteEndPointInfo(info);\n\n        if (status == os::kWaitStatusFailure)\n        {\n            *error = socketHandle->GetLastError();\n            return NULL;\n        }\n\n        Il2CppSocketAddress *socket_address = end_point_info_to_socket_address(info);\n\n        if (socket_address == NULL)\n            *error = os::kWSAeafnosupport;\n\n        return socket_address;\n    }\n\n    void Socket::Select(Il2CppArray **sockets, int32_t timeout, int32_t *error)\n    {\n        *error = 0;\n\n        // Layout: READ, null, WRITE, null, ERROR, null\n        const uint32_t input_sockets_count = (*sockets)->max_length;\n\n        std::vector<os::PollRequest> requests;\n        std::vector<os::SocketHandleWrapper> socketHandles;\n\n        requests.reserve(input_sockets_count - 3);\n\n        int32_t mode = 0;\n\n        for (uint32_t i = 0; i < input_sockets_count; ++i)\n        {\n            Il2CppObject *obj = il2cpp_array_get(*sockets, Il2CppObject*, i);\n\n            if (obj == NULL)\n            {\n                if (++mode > 3)\n                {\n                    // Something very bad happened here (ie: the input array was wrong)\n                    // so we gracefully terminate the method.\n                    *error = os::kWSAefault;\n                    return;\n                }\n\n                continue;\n            }\n\n#if !NET_4_0\n\n            const FieldInfo *field_info = vm::Class::GetFieldFromName(obj->klass, \"socket\");\n            Il2CppIntPtr& intPtr = *((Il2CppIntPtr*)((char*)obj + field_info->offset));\n#else\n            FieldInfo *safe_handle_field_info = vm::Class::GetFieldFromName(obj->klass, \"safe_handle\");\n            const Il2CppObject* value = NULL;\n            vm::Field::GetValue(obj, safe_handle_field_info, &value);\n\n            const FieldInfo *handle_field_info = vm::Class::GetFieldFromName(value->klass, \"handle\");\n            Il2CppIntPtr& intPtr = *((Il2CppIntPtr*)((char*)value + handle_field_info->offset));\n#endif\n\n            // Acquire socket.\n            socketHandles.push_back(os::SocketHandleWrapper());\n            os::SocketHandleWrapper& socketHandle = socketHandles.back();\n            socketHandle.Acquire(os::PointerToSocketHandle(intPtr.m_value));\n\n            os::PollRequest request;\n            // May 'invalid socket' (-1); we want the error from Poll() in that case.\n            request.fd = socketHandle.GetSocket() == NULL ? -1 : socketHandle.GetSocket()->GetDescriptor();\n            request.events = (mode == 0 ? os::kPollFlagsIn : (mode == 1 ? os::kPollFlagsOut : os::kPollFlagsErr));\n            request.revents = os::kPollFlagsNone;\n\n            requests.push_back(request);\n        }\n\n        if (requests.size() == 0)\n            return;\n\n        int32_t results = 0;\n        const os::WaitStatus result = os::Socket::Poll(requests, timeout, &results, error);\n\n        if (result == os::kWaitStatusFailure)\n        {\n            *sockets = NULL;\n            return;\n        }\n\n        Il2CppArray *new_sockets = vm::Array::New(((Il2CppObject*)(*sockets))->klass->element_class, results + 3);\n\n        if (results > 0)\n        {\n            mode = 0;\n\n            uint32_t request_index = 0;\n\n            // This odd loop is due to the layout of the sockets input array:\n            // Layout: READ, null, WRITE, null, ERROR, null\n            // We need to iterate each request and iterate the sockets array, skipping\n            // the null entries. We try to avoid an infinite loop here as well.\n            uint32_t add_index = 0;\n            while (request_index < requests.size())\n            {\n                const uint32_t input_sockets_index = (request_index + mode);\n                if (input_sockets_index > input_sockets_count - 1)\n                    break; // We have exhausted the input sockets array, so exit.\n\n                Il2CppObject *obj = il2cpp_array_get(*sockets, Il2CppObject*, input_sockets_index);\n\n                if (obj == NULL)\n                {\n                    ++mode;\n                    continue; // Here is a null entry, skip it without updated the next request index.\n                }\n\n                os::PollRequest &request = requests[request_index];\n\n                if (request.revents != os::kPollFlagsNone)\n                {\n                    switch (mode)\n                    {\n                        case 0:\n                            if (request.revents & (os::kPollFlagsIn | os::kPollFlagsErr))\n                            {\n                                il2cpp_array_setref(new_sockets, (add_index + mode), obj);\n                                add_index++;\n                            }\n                            break;\n\n                        case 1:\n                            if (request.revents & (os::kPollFlagsOut | os::kPollFlagsErr))\n                            {\n                                il2cpp_array_setref(new_sockets, (add_index + mode), obj);\n                                add_index++;\n                            }\n                            break;\n\n                        default:\n                            if (request.revents & os::kPollFlagsErr)\n                            {\n                                il2cpp_array_setref(new_sockets, (add_index + mode), obj);\n                                add_index++;\n                            }\n                            break;\n                    }\n                }\n\n                ++request_index;\n            }\n        }\n\n        *sockets = new_sockets;\n    }\n\n    bool Socket::SendFile(Il2CppIntPtr socket, Il2CppString *filename, Il2CppArray *pre_buffer, Il2CppArray *post_buffer, TransmitFileOptions flags)\n    {\n        if (filename == NULL)\n            return false;\n\n        os::TransmitFileBuffers t_buffers = {0};\n\n        if (pre_buffer != NULL)\n        {\n            t_buffers.head = il2cpp_array_addr(pre_buffer, uint8_t, 0);\n            t_buffers.head_length = pre_buffer->max_length;\n        }\n\n        if (post_buffer != NULL)\n        {\n            t_buffers.tail = il2cpp_array_addr(post_buffer, uint8_t, 0);\n            t_buffers.tail_length = post_buffer->max_length;\n        }\n\n        AUTO_ACQUIRE_SOCKET;\n        if (!socketHandle.IsValid())\n            return false;\n\n        const Il2CppChar* ustr = utils::StringUtils::GetChars(filename);\n        const std::string str = utils::StringUtils::Utf16ToUtf8(ustr);\n\n        // Note: for now they map 1-1\n        const os::TransmitFileOptions o_flags = (os::TransmitFileOptions)flags;\n        const os::WaitStatus status = socketHandle->SendFile(str.c_str(), &t_buffers, o_flags);\n\n        if (status == os::kWaitStatusFailure)\n        {\n            // TODO: mono stores socketHandle->GetLastError into a threadlocal global variable\n            // that can be retrieved later by other icalls.\n            return false;\n        }\n\n        if ((flags & kTransmitFileOptionsDisconnect) == kTransmitFileOptionsDisconnect)\n            socketHandle->Disconnect(true);\n\n        return true;\n    }\n\n    int32_t Socket::SendTo(Il2CppIntPtr socket, Il2CppArray *buffer, int32_t offset, int32_t count, SocketFlags flags, Il2CppSocketAddress *socket_address, int32_t *error)\n    {\n        *error = 0;\n\n        const int32_t a_len = buffer->max_length;\n        if (offset > a_len - count)\n            return 0;\n\n        const os::SocketFlags c_flags = convert_socket_flags(flags);\n        const uint8_t *data = il2cpp_array_addr(buffer, uint8_t, offset);\n\n        int32_t len = 0;\n\n        const int32_t length = socket_address->data->max_length;\n        const uint8_t *socket_buffer = (uint8_t*)il2cpp::vm::Array::GetFirstElementAddress(socket_address->data);\n\n        if (length < 2)\n        {\n            vm::Exception::Raise(vm::Exception::GetSystemException());\n            return 0;\n        }\n\n        const os::AddressFamily family = convert_address_family((AddressFamily)(socket_buffer[0] | (socket_buffer[1] << 8)));\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID(0);\n\n        if (family == os::kAddressFamilyInterNetwork)\n        {\n            if (length < 8)\n            {\n                vm::Exception::Raise(vm::Exception::GetSystemException());\n                return 0;\n            }\n\n            const uint16_t port = ((socket_buffer[2] << 8) | socket_buffer[3]);\n            const uint32_t address = ((socket_buffer[4] << 24) | (socket_buffer[5] << 16) | (socket_buffer[6] << 8) | socket_buffer[7]);\n\n            const os::WaitStatus status = socketHandle->SendTo(address, port, data, count, c_flags, &len);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else if (family == os::kAddressFamilyUnix)\n        {\n            if (length - 2 >= END_POINT_MAX_PATH_LEN)\n            {\n                vm::Exception::Raise(vm::Exception::GetSystemException());\n                return 0;\n            }\n\n            char path[END_POINT_MAX_PATH_LEN] = {0};\n\n            for (int32_t i = 0; i < (length - 2); ++i)\n            {\n                path[i] = (char)socket_buffer[i + 2];\n            }\n\n            const os::WaitStatus status = socketHandle->SendTo(path, data, count, c_flags, &len);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else if (family == os::kAddressFamilyInterNetworkV6)\n        {\n            uint16_t port;\n            uint8_t address[ipv6AddressSize] = {0};\n            uint32_t scope;\n            UnpackIPv6AddressFromBuffer(socket_buffer, length, &port, address, &scope);\n\n            const os::WaitStatus status = socketHandle->SendTo(address, scope, port, data, count, c_flags, &len);\n\n            if (status == os::kWaitStatusFailure)\n                *error = socketHandle->GetLastError();\n        }\n        else\n        {\n            *error = os::kWSAeafnosupport;\n            return 0;\n        }\n\n        return len;\n    }\n\n    int32_t Socket::SendArray(Il2CppIntPtr socket, Il2CppArray *buffers, SocketFlags flags, int32_t *error)\n    {\n        *error = 0;\n\n        const int32_t count = buffers->max_length;\n        const os::SocketFlags c_flags = convert_socket_flags(flags);\n\n        os::WSABuf *wsabufs = il2cpp_array_addr(buffers, os::WSABuf, 0);\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID(0);\n\n        int32_t sent = 0;\n\n        const os::WaitStatus status = socketHandle->SendArray(wsabufs, count, &sent, c_flags);\n\n        if (status == os::kWaitStatusFailure)\n        {\n            *error = socketHandle->GetLastError();\n            return 0;\n        }\n\n        return sent;\n    }\n\n    int32_t Socket::Send(Il2CppIntPtr socket, Il2CppArray *buffer, int32_t offset, int32_t count, SocketFlags flags, int32_t *error)\n    {\n        *error = 0;\n\n        const int32_t a_len = buffer->max_length;\n        if (offset > a_len - count)\n            return 0;\n\n        const os::SocketFlags c_flags = convert_socket_flags(flags);\n        const uint8_t *data = il2cpp_array_addr(buffer, uint8_t, offset);\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID(0);\n\n        int32_t len = 0;\n\n        const os::WaitStatus status = socketHandle->Send(data, count, c_flags, &len);\n\n        if (status == os::kWaitStatusFailure)\n            *error = socketHandle->GetLastError();\n\n        return len;\n    }\n\n#if IL2CPP_SUPPORT_IPV6\n    static os::IPv6Address ipaddress_to_ipv6_addr(Il2CppObject *ipaddr)\n    {\n        FieldInfo* numbersFieldInfo = vm::Class::GetFieldFromName(ipaddr->klass, \"m_Numbers\");\n        IL2CPP_ASSERT(numbersFieldInfo);\n        Il2CppArray* data = (Il2CppArray*)vm::Field::GetValueObject(numbersFieldInfo, ipaddr);\n\n        os::IPv6Address ipv6;\n        for (int i = 0; i < 8; i++)\n        {\n            uint16_t s = il2cpp_array_get(data, uint16_t, i);\n            ipv6.addr[2 * i] = (s >> 8) & 0xff;\n            ipv6.addr[2 * i + 1] = s & 0xff;\n        }\n\n        return ipv6;\n    }\n\n    static void GetAddressAndInterfaceFromObject(Il2CppObject* object, const char* groupField, const char* interfaceField,\n        os::IPv6Address& ipv6, uint64_t& interfaceOffset)\n    {\n        FieldInfo* groupFieldInfo = vm::Class::GetFieldFromName(object->klass, groupField);\n        IL2CPP_ASSERT(groupFieldInfo);\n        Il2CppObject* address = vm::Field::GetValueObject(groupFieldInfo, object);\n\n        if (address)\n            ipv6 = ipaddress_to_ipv6_addr(address);\n\n        FieldInfo* interfaceFieldInfo = vm::Class::GetFieldFromName(object->klass, interfaceField);\n        IL2CPP_ASSERT(interfaceFieldInfo);\n        vm::Field::GetValue(object, interfaceFieldInfo, &interfaceOffset);\n    }\n\n#endif // IL2CPP_SUPPORT_IPV6\n\n    void Socket::SetSocketOption(Il2CppIntPtr socket, SocketOptionLevel level, SocketOptionName name, Il2CppObject *obj_val, Il2CppArray *byte_val, int32_t int_val, int32_t *error)\n    {\n        *error = 0;\n\n        // Note: for now the options map one to one.\n        const os::SocketOptionName system_name = (os::SocketOptionName)(name);\n        const os::SocketOptionLevel system_level = (os::SocketOptionLevel)(level);\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID();\n\n        os::WaitStatus status = os::kWaitStatusFailure;\n\n        if (byte_val != NULL)\n        {\n            const int32_t length = byte_val->max_length;\n            const uint8_t *buffer = (uint8_t*)il2cpp::vm::Array::GetFirstElementAddress(byte_val);\n\n            status = socketHandle->SetSocketOptionArray(system_level, system_name, buffer, length);\n        }\n        else if (obj_val != NULL)\n        {\n            switch (name)\n            {\n                case kSocketOptionNameLinger:\n                {\n#if NET_4_0\n                    const FieldInfo *enabled_field_info = vm::Class::GetFieldFromName(obj_val->klass, \"enabled\");\n                    const FieldInfo *seconds_field_info = vm::Class::GetFieldFromName(obj_val->klass, \"lingerTime\");\n#else\n                    const FieldInfo *enabled_field_info = vm::Class::GetFieldFromName(obj_val->klass, \"enabled\");\n                    const FieldInfo *seconds_field_info = vm::Class::GetFieldFromName(obj_val->klass, \"seconds\");\n#endif\n\n                    const bool enabled = *((bool*)((char*)obj_val + enabled_field_info->offset));\n                    const int32_t seconds = *((int32_t*)((char*)obj_val + seconds_field_info->offset));\n\n                    status = socketHandle->SetSocketOptionLinger(system_level, system_name, enabled, seconds);\n                }\n\n                break;\n\n                case kSocketOptionNameAddMembership:\n                case kSocketOptionNameDropMembership:\n                {\n#if IL2CPP_SUPPORT_IPV6\n                    if (system_level == (os::SocketOptionLevel)kSocketOptionLevelIPv6)\n                    {\n                        os::IPv6Address ipv6 = { { 0 } };\n                        uint64_t interfaceOffset;\n#if NET_4_0\n                        GetAddressAndInterfaceFromObject(obj_val, \"m_Group\", \"m_Interface\", ipv6, interfaceOffset);\n#else\n                        GetAddressAndInterfaceFromObject(obj_val, \"group\", \"ifIndex\", ipv6, interfaceOffset);\n#endif // NET_4_0\n                        status = socketHandle->SetSocketOptionMembership(system_level, system_name, ipv6, interfaceOffset);\n                    }\n                    else if (system_level == (os::SocketOptionLevel)kSocketOptionLevelIP)\n#endif // IL2CPP_SUPPORT_IPV6\n                    {\n                        FieldInfo *group_field_info = vm::Class::GetFieldFromName(obj_val->klass, \"group\");\n#if NET_4_0\n                        FieldInfo *local_field_info = vm::Class::GetFieldFromName(obj_val->klass, \"localAddress\");\n#else\n                        FieldInfo *local_field_info = vm::Class::GetFieldFromName(obj_val->klass, \"local\");\n#endif\n\n                        Il2CppObject* group_obj = vm::Field::GetValueObject(group_field_info, obj_val);\n                        Il2CppObject* local_obj = vm::Field::GetValueObject(local_field_info, obj_val);\n\n                        const FieldInfo *group_address_field_info = vm::Class::GetFieldFromName(group_obj->klass, \"m_Address\");\n                        const FieldInfo *local_address_field_info = vm::Class::GetFieldFromName(local_obj->klass, \"m_Address\");\n\n                        const uint32_t group_address = *((uint32_t*)(uint64_t*)((char*)group_obj + group_address_field_info->offset));\n                        const uint32_t local_address = *((uint32_t*)(uint64_t*)((char*)local_obj + local_address_field_info->offset));\n\n                        status = socketHandle->SetSocketOptionMembership(system_level, system_name, group_address, local_address);\n                    }\n                }\n\n                break;\n\n                default:\n                    *error = os::kWSAeinval;\n                    return; // early out\n            }\n        }\n        else\n            status = socketHandle->SetSocketOption(system_level, system_name, int_val);\n\n        if (status == os::kWaitStatusFailure)\n            *error = socketHandle->GetLastError();\n    }\n\n    void Socket::Shutdown(Il2CppIntPtr socket, SocketShutdown how, int32_t* error)\n    {\n        *error = 0;\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID();\n\n        const os::WaitStatus status = socketHandle->Shutdown(how);\n\n        if (status == os::kWaitStatusFailure)\n            *error = socketHandle->GetLastError();\n    }\n\n    Il2CppIntPtr Socket::Socket_internal(Il2CppObject *self, AddressFamily family, SocketType type, ProtocolType protocol, int32_t* error)\n    {\n        Il2CppIntPtr socket = { NULL };\n\n        *error = 0;\n\n        os::AddressFamily n_family = convert_address_family(family);\n        os::SocketType n_type = convert_socket_type(type);\n        os::ProtocolType n_protocol = convert_socket_protocol(protocol);\n\n        if (n_family == os::kAddressFamilyError)\n        {\n            *error = os::kWSAeafnosupport;\n            return socket;\n        }\n\n        if (n_type == os::kSocketTypeError)\n        {\n            *error = os::kWSAesocktnosupport;\n            return socket;\n        }\n\n        if (n_protocol == os::kProtocolTypeUnknown)\n        {\n            *error = os::kWSAeprotonosupport;\n            return socket;\n        }\n\n        os::Socket *sock = new os::Socket(check_thread_status);\n\n        const os::WaitStatus status = sock->Create(n_family, n_type, n_protocol);\n\n        if (status == os::kWaitStatusFailure)\n        {\n            *error = sock->GetLastError();\n\n            // Okay to delete socket directly. We haven't created a handle yet.\n            delete sock;\n\n            return socket;\n        }\n\n        os::SocketHandle socketHandle = os::CreateSocketHandle(sock);\n        socket.m_value = reinterpret_cast<void*>(static_cast<uintptr_t>(socketHandle));\n\n        return socket;\n    }\n\n    int32_t Socket::WSAIoctl(Il2CppIntPtr socket, int32_t code, Il2CppArray *input, Il2CppArray *output, int32_t *error)\n    {\n        *error = 0;\n\n        AUTO_ACQUIRE_SOCKET;\n        RETURN_IF_SOCKET_IS_INVALID(-1);\n\n        if (code == 0x5421 /* FIONBIO */)\n        {\n            // Invalid command. Must use Socket.Blocking\n            return -1;\n        }\n\n        const int32_t in_length = (input ? input->max_length : 0);\n        const uint8_t *in_buffer = (input ? (uint8_t*)il2cpp::vm::Array::GetFirstElementAddress(input) : NULL);\n\n        const int32_t out_length = (output ? output->max_length : 0);\n        uint8_t *out_buffer = (output ? (uint8_t*)il2cpp::vm::Array::GetFirstElementAddress(output) : NULL);\n\n        int32_t output_bytes = 0;\n\n        const os::WaitStatus status = socketHandle->Ioctl(code, in_buffer, in_length, out_buffer, out_length, &output_bytes);\n\n        if (status == os::kWaitStatusFailure)\n        {\n            *error = socketHandle->GetLastError();\n            return -1;\n        }\n\n        return output_bytes;\n    }\n\n#if NET_4_0\n    bool Socket::SendFile_internal(Il2CppIntPtr sock, Il2CppString* filename, Il2CppArray* pre_buffer, Il2CppArray* post_buffer, int32_t flags)\n    {\n        return SendFile(sock, filename, pre_buffer, post_buffer, static_cast<TransmitFileOptions>(flags));\n    }\n\n    bool Socket::SupportsPortReuse(ProtocolType proto)\n    {\n        NOT_IMPLEMENTED_ICALL(Socket::SupportsPortReuse);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    int32_t Socket::IOControl_internal(Il2CppIntPtr sock, int32_t ioctl_code, Il2CppArray* input, Il2CppArray* output, int32_t* error)\n    {\n        NOT_IMPLEMENTED_ICALL(Socket::IOControl_internal);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n\n    int32_t Socket::ReceiveFrom_internal(Il2CppIntPtr sock, Il2CppArray* buffer, int32_t offset, int32_t count, int32_t flags, Il2CppSocketAddress** sockaddr, int32_t* error)\n    {\n        return RecvFrom(sock, buffer, offset, count, static_cast<SocketFlags>(flags), sockaddr, error);\n    }\n\n    int32_t Socket::SendTo_internal(Il2CppIntPtr sock, Il2CppArray* buffer, int32_t offset, int32_t count, int32_t flags, Il2CppSocketAddress* sa, int32_t* error)\n    {\n        return SendTo(sock, buffer, offset, count, static_cast<SocketFlags>(flags), sa, error);\n    }\n\n    Il2CppSocketAddress* Socket::LocalEndPoint_internal(Il2CppIntPtr socket, int32_t family, int32_t* error)\n    {\n        // We should be able to ignore the family, as the socket should already have that information.\n        return LocalEndPoint(socket, error);\n    }\n\n    Il2CppSocketAddress* Socket::RemoteEndPoint_internal(Il2CppIntPtr socket, int32_t family, int32_t* error)\n    {\n        // We should be able to ignore the family, as the socket should already have that information.\n        return RemoteEndPoint(socket, error);\n    }\n\n    static void STDCALL\n    abort_apc(void* param)\n    {\n    }\n\n    void Socket::cancel_blocking_socket_operation(Il2CppObject* thread)\n    {\n        Il2CppThread* t = reinterpret_cast<Il2CppThread*>(thread);\n        t->internal_thread->handle->QueueUserAPC(abort_apc, NULL);\n    }\n\n    void Socket::Connect_internal(Il2CppIntPtr sock, Il2CppSocketAddress* sa, int32_t* error)\n    {\n        Connect(sock, sa, error);\n    }\n\n#endif\n} /* namespace Sockets */\n} /* namespace Net */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Net.Sockets/Socket.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppArray;\nstruct Il2CppObject;\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Net\n{\nnamespace Sockets\n{\n    enum AddressFamily\n    {\n        kAddressFamilyUnknown           = -1,\n        kAddressFamilyUnspecified       = 0,\n        kAddressFamilyUnix              = 1,\n        kAddressFamilyInterNetwork      = 2,\n        kAddressFamilyImpLink           = 3,\n        kAddressFamilyPup               = 4,\n        kAddressFamilyChaos             = 5,\n        kAddressFamilyNS                = 6,\n        kAddressFamilyIpx               = 6,\n        kAddressFamilyIso               = 7,\n        kAddressFamilyOsi               = 7,\n        kAddressFamilyEcma              = 8,\n        kAddressFamilyDataKit           = 9,\n        kAddressFamilyCcitt             = 10,\n        kAddressFamilySna               = 11,\n        kAddressFamilyDecNet            = 12,\n        kAddressFamilyDataLink          = 13,\n        kAddressFamilyLat               = 14,\n        kAddressFamilyHyperChannel      = 15,\n        kAddressFamilyAppleTalk         = 16,\n        kAddressFamilyNetBios           = 17,\n        kAddressFamilyVoiceView         = 18,\n        kAddressFamilyFireFox           = 19,\n        kAddressFamilyBanyan            = 21,\n        kAddressFamilyAtm               = 22,\n        kAddressFamilyInterNetworkV6    = 23,\n        kAddressFamilyCluster           = 24,\n        kAddressFamilyIeee12844         = 25,\n        kAddressFamilyIrda              = 26,\n        kAddressFamilyNetworkDesigners  = 28,\n        kAddressFamilyMax               = 29,\n    };\n\n    enum SocketType\n    {\n        kSocketTypeUnknown  = -1,\n        kSocketTypeStream   = 1,\n        kSocketTypeDgram    = 2,\n        kSocketTypeRaw      = 3,\n        kSocketTypeRdm      = 4,\n        kSocketTypeSeqpacket = 5,\n    };\n\n    enum ProtocolType\n    {\n        kProtocolTypeUnknown                            = -1,\n        kProtocolTypeIP                                 = 0,\n        kProtocolTypeIcmp                               = 1,\n        kProtocolTypeIgmp                               = 2,\n        kProtocolTypeGgp                                = 3,\n        kProtocolTypeTcp                                = 6,\n        kProtocolTypePup                                = 12,\n        kProtocolTypeUdp                                = 17,\n        kProtocolTypeIdp                                = 22,\n        kProtocolTypeND                                 = 77,\n        kProtocolTypeRaw                                = 255,\n        kProtocolTypeUnspecified                        = 0,\n        kProtocolTypeIpx                                = 1000,\n        kProtocolTypeSpx                                = 1256,\n        kProtocolTypeSpxII                              = 1257,\n\n// #if NET_1_1\n        kProtocolTypeIPv6                               = 41,\n// #endif\n\n// #if NET_2_0\n        kProtocolTypeIPv4                               = 4,\n        kProtocolTypeIPv6RoutingHeader                  = 43,\n        kProtocolTypeIPv6FragmentHeader                 = 44,\n        kProtocolTypeIPSecEncapsulatingSecurityPayload  = 50,\n        kProtocolTypeIPSecAuthenticationHeader          = 51,\n        kProtocolTypeIcmpV6                             = 58,\n        kProtocolTypeIPv6NoNextHeader                   = 59,\n        kProtocolTypeIPv6DestinationOptions             = 60,\n        kProtocolTypeIPv6HopByHopOptions                = 0,\n// #endif\n    };\n\n    enum SocketOptionLevel\n    {\n        kSocketOptionLevelSocket    = 65535,\n        kSocketOptionLevelIP        = 0,\n        kSocketOptionLevelTcp       = 6,\n        kSocketOptionLevelUdp       = 17,\n\n//#if NET_1_1\n        kSocketOptionLevelIPv6      = 41,\n//#endif\n    };\n\n    enum SocketOptionName\n    {\n        kSocketOptionNameDebug                  = 1,\n        kSocketOptionNameAcceptConnection       = 2,\n        kSocketOptionNameReuseAddress           = 4,\n        kSocketOptionNameKeepAlive              = 8,\n        kSocketOptionNameDontRoute              = 16,\n        kSocketOptionNameBroadcast              = 32,\n        kSocketOptionNameUseLoopback            = 64,\n        kSocketOptionNameLinger                 = 128,\n        kSocketOptionNameOutOfBandInline        = 256,\n        kSocketOptionNameDontLinger             = -129,\n        kSocketOptionNameExclusiveAddressUse    = -5,\n        kSocketOptionNameSendBuffer             = 4097,\n        kSocketOptionNameReceiveBuffer          = 4098,\n        kSocketOptionNameSendLowWater           = 4099,\n        kSocketOptionNameReceiveLowWater        = 4100,\n        kSocketOptionNameSendTimeout            = 4101,\n        kSocketOptionNameReceiveTimeout         = 4102,\n        kSocketOptionNameError                  = 4103,\n        kSocketOptionNameType                   = 4104,\n        kSocketOptionNameMaxConnections         = 2147483647,\n        kSocketOptionNameIPOptions              = 1,\n        kSocketOptionNameHeaderIncluded         = 2,\n        kSocketOptionNameTypeOfService          = 3,\n        kSocketOptionNameIpTimeToLive           = 4,\n        kSocketOptionNameMulticastInterface     = 9,\n        kSocketOptionNameMulticastTimeToLive    = 10,\n        kSocketOptionNameMulticastLoopback      = 11,\n        kSocketOptionNameAddMembership          = 12,\n        kSocketOptionNameDropMembership         = 13,\n        kSocketOptionNameDontFragment           = 14,\n        kSocketOptionNameAddSourceMembership    = 15,\n        kSocketOptionNameDropSourceMembership   = 16,\n        kSocketOptionNameBlockSource            = 17,\n        kSocketOptionNameUnblockSource          = 18,\n        kSocketOptionNamePacketInformation      = 19,\n        kSocketOptionNameNoDelay                = 1,\n        kSocketOptionNameBsdUrgent              = 2,\n        kSocketOptionNameExpedited              = 2,\n        kSocketOptionNameNoChecksum             = 1,\n        kSocketOptionNameChecksumCoverage       = 20,\n\n// #if NET_2_0\n        kSocketOptionNameHopLimit               = 21,\n        kSocketOptionNameUpdateAcceptContext    = 28683,\n        kSocketOptionNameUpdateConnectContext   = 28688,\n// #endif\n    };\n\n    enum SelectMode\n    {\n        kSelectModeSelectRead   = 0,\n        kSelectModeSelectWrite  = 1,\n        kSelectModeSelectError  = 2,\n    };\n\n    enum SocketFlags\n    {\n        kSocketFlagsNone                    = 0x00000000,\n        kSocketFlagsOutOfBand               = 0x00000001,\n        kSocketFlagsPeek                    = 0x00000002,\n        kSocketFlagsDontRoute               = 0x00000004,\n        kSocketFlagsMaxIOVectorLength       = 0x00000010,\n// #if NET_2_0\n        kSocketFlagsTruncated               = 0x00000100,\n        kSocketFlagsControlDataTruncated    = 0x00000200,\n        kSocketFlagsBroadcast               = 0x00000400,\n        kSocketFlagsMulticast               = 0x00000800,\n// #endif\n        kSocketFlagsPartial                 = 0x00008000,\n    };\n\n    enum TransmitFileOptions\n    {\n        kTransmitFileOptionsUseDefaultWorkerThread  = 0x00000000,\n        kTransmitFileOptionsDisconnect              = 0x00000001,\n        kTransmitFileOptionsReuseSocket             = 0x00000002,\n        kTransmitFileOptionsWriteBehind             = 0x00000004,\n        kTransmitFileOptionsUseSystemThread         = 0x00000010,\n        kTransmitFileOptionsUseKernelApc            = 0x00000020,\n    };\n\n    enum SocketShutdown\n    {\n        kSocketShutdownReceive  = 0,\n        kSocketShutdownSend     = 1,\n        kSocketShutdownBoth     = 2,\n    };\n\n    class LIBIL2CPP_CODEGEN_API Socket\n    {\n    public:\n        static Il2CppIntPtr Accept(Il2CppIntPtr, int32_t*, bool);\n        static int32_t Available(Il2CppIntPtr, int32_t*);\n        static void Bind(Il2CppIntPtr, Il2CppSocketAddress*, int32_t*);\n        static void Blocking(Il2CppIntPtr, bool, int32_t*);\n        static void Close(Il2CppIntPtr, int32_t*);\n        static void Connect(Il2CppIntPtr, Il2CppSocketAddress*, int32_t*);\n        static void Disconnect(Il2CppIntPtr, bool, int32_t*);\n        static void GetSocketOptionArray(Il2CppIntPtr, SocketOptionLevel, SocketOptionName, Il2CppArray**, int32_t*);\n        static void GetSocketOptionObj(Il2CppIntPtr, SocketOptionLevel, SocketOptionName, Il2CppObject**, int32_t*);\n        static void Listen(Il2CppIntPtr, int32_t, int32_t*);\n        static Il2CppSocketAddress* LocalEndPoint(Il2CppIntPtr, int32_t*);\n        static bool Poll(Il2CppIntPtr, SelectMode, int32_t, int32_t*);\n        static int32_t ReceiveArray(Il2CppIntPtr, Il2CppArray*, SocketFlags, int32_t*);\n        static int32_t Receive(Il2CppIntPtr, Il2CppArray*, int32_t, int32_t, SocketFlags, int32_t*);\n        static int32_t RecvFrom(Il2CppIntPtr, Il2CppArray*, int32_t, int32_t, SocketFlags, Il2CppSocketAddress**, int32_t*);\n        static Il2CppSocketAddress* RemoteEndPoint(Il2CppIntPtr, int32_t*);\n        static void Select(Il2CppArray**, int32_t, int32_t*);\n        static bool SendFile(Il2CppIntPtr, Il2CppString*, Il2CppArray*, Il2CppArray*, TransmitFileOptions);\n        static int32_t SendTo(Il2CppIntPtr, Il2CppArray*, int32_t, int32_t, SocketFlags, Il2CppSocketAddress*, int32_t*);\n        static int32_t SendArray(Il2CppIntPtr, Il2CppArray*, SocketFlags, int32_t*);\n        static int32_t Send(Il2CppIntPtr, Il2CppArray*, int32_t, int32_t, SocketFlags, int32_t*);\n        static void SetSocketOption(Il2CppIntPtr, SocketOptionLevel, SocketOptionName, Il2CppObject*, Il2CppArray*, int32_t, int32_t*);\n        static void Shutdown(Il2CppIntPtr, SocketShutdown, int32_t*);\n        static Il2CppIntPtr Socket_internal(Il2CppObject * self, AddressFamily, SocketType, ProtocolType, int32_t*);\n        static int32_t WSAIoctl(Il2CppIntPtr, int32_t, Il2CppArray*, Il2CppArray*, int32_t*);\n#if NET_4_0\n        static bool SendFile_internal(Il2CppIntPtr sock, Il2CppString* filename, Il2CppArray* pre_buffer, Il2CppArray* post_buffer, int32_t flags);\n        static bool SupportsPortReuse(ProtocolType proto);\n        static int32_t IOControl_internal(Il2CppIntPtr sock, int32_t ioctl_code, Il2CppArray* input, Il2CppArray* output, int32_t* error);\n        static int32_t ReceiveFrom_internal(Il2CppIntPtr sock, Il2CppArray* buffer, int32_t offset, int32_t count, int32_t flags, Il2CppSocketAddress** sockaddr, int32_t* error);\n        static int32_t SendTo_internal(Il2CppIntPtr sock, Il2CppArray* buffer, int32_t offset, int32_t count, int32_t flags, Il2CppSocketAddress* sa, int32_t* error);\n        static Il2CppSocketAddress* LocalEndPoint_internal(Il2CppIntPtr socket, int32_t family, int32_t* error);\n        static Il2CppSocketAddress* RemoteEndPoint_internal(Il2CppIntPtr socket, int32_t family, int32_t* error);\n        static void cancel_blocking_socket_operation(Il2CppObject* thread);\n        static void Connect_internal(Il2CppIntPtr sock, Il2CppSocketAddress* sa, int32_t* error);\n#endif\n    };\n} /* namespace Sockets */\n} /* namespace Net */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Net.Sockets/SocketException.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/System/System.Net.Sockets/SocketException.h\"\n\n#include \"os/Error.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Net\n{\nnamespace Sockets\n{\n    int32_t SocketException::WSAGetLastError()\n    {\n        NOT_IMPLEMENTED_ICALL(SocketException::WSAGetLastError);\n\n        return (int32_t)os::Error::GetLastError();\n    }\n} /* namespace Sockets */\n} /* namespace Net */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Net.Sockets/SocketException.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppArray;\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Net\n{\nnamespace Sockets\n{\n    class LIBIL2CPP_CODEGEN_API SocketException\n    {\n    public:\n        static int32_t WSAGetLastError();\n    };\n} /* namespace Sockets */\n} /* namespace Net */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Threading/Semaphore.cpp",
    "content": "#include \"icalls/System/System.Threading/Semaphore.h\"\n#include \"os/Semaphore.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Threading\n{\n#if !NET_4_0\n    Il2CppIntPtr Semaphore::CreateSemaphore_internal(int32_t initialCount, int32_t maximumCount, Il2CppString* name, bool* created)\n    {\n        *created = true;\n        os::Semaphore* semaphore = NULL;\n\n        if (name == NULL)\n            semaphore = new os::Semaphore(initialCount, maximumCount);\n        else\n            NOT_SUPPORTED_IL2CPP(Semaphore::CreateSemaphore_internal, \"Named semaphores are not supported.\");\n\n        Il2CppIntPtr ret = { new os::SemaphoreHandle(semaphore) };\n        return ret;\n    }\n\n    int32_t Semaphore::ReleaseSemaphore_internal(Il2CppIntPtr handlePtr, int32_t releaseCount, bool* fail)\n    {\n        os::SemaphoreHandle* handle = (os::SemaphoreHandle*)handlePtr.m_value;\n\n        int32_t previousCount = 0;\n        *fail = !handle->Get().Post(releaseCount, &previousCount);\n\n        return previousCount;\n    }\n\n#else\n    Il2CppIntPtr Semaphore::CreateSemaphore_internal40(int32_t initialCount, int32_t maximumCount, Il2CppString* name, int32_t* errorCode)\n    {\n        *errorCode = true;\n        os::Semaphore* semaphore = NULL;\n\n        if (name == NULL)\n            semaphore = new os::Semaphore(initialCount, maximumCount);\n        else\n            NOT_SUPPORTED_IL2CPP(Semaphore::CreateSemaphore_internal, \"Named semaphores are not supported.\");\n\n        Il2CppIntPtr ret = { new os::SemaphoreHandle(semaphore) };\n        return ret;\n    }\n\n    bool Semaphore::ReleaseSemaphore_internal40(Il2CppIntPtr handlePtr, int32_t releaseCount, int32_t* previousCount)\n    {\n        os::SemaphoreHandle* handle = (os::SemaphoreHandle*)handlePtr.m_value;\n\n        return handle->Get().Post(releaseCount, previousCount);\n    }\n\n#endif\n\n    Il2CppIntPtr Semaphore::OpenSemaphore_internal(Il2CppString* name, int32_t rights, int32_t* error)\n    {\n        NOT_SUPPORTED_IL2CPP(Semaphore::OpenSemaphore_internal, \"Named semaphores are not supported.\");\n\n        return Il2CppIntPtr::Zero;\n    }\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System/System.Threading/Semaphore.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace System\n{\nnamespace Threading\n{\n    class LIBIL2CPP_CODEGEN_API Semaphore\n    {\n    public:\n#if !NET_4_0\n        static Il2CppIntPtr CreateSemaphore_internal(int32_t initialCount, int32_t maximumCount, Il2CppString* name, bool* created);\n        static int32_t ReleaseSemaphore_internal(Il2CppIntPtr handlePtr, int32_t releaseCount, bool* fail);\n#else\n        static Il2CppIntPtr CreateSemaphore_internal40(int32_t initialCount, int32_t maximumCount, Il2CppString* name, int32_t* errorCode);\n        static bool ReleaseSemaphore_internal40(Il2CppIntPtr handlePtr, int32_t releaseCount, int32_t* previousCount);\n#endif\n        static Il2CppIntPtr OpenSemaphore_internal(Il2CppString* name, int32_t rights, int32_t* error);\n    };\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace System */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System.Configuration/System.Configuration/InternalConfigurationHost.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"InternalConfigurationHost.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace Configuration\n{\nnamespace System\n{\nnamespace Configuration\n{\n    Il2CppString* InternalConfigurationHost::get_bundled_app_config()\n    {\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(InternalConfigurationHost::get_bundled_app_config, \"Once we properly handle app.config files, implement this icall to return the contents of the app.config file\");\n        return NULL;\n    }\n} // namespace Configuration\n} // namespace System\n} // namespace Configuration\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System.Configuration/System.Configuration/InternalConfigurationHost.h",
    "content": "#pragma once\n\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace Configuration\n{\nnamespace System\n{\nnamespace Configuration\n{\n    class LIBIL2CPP_CODEGEN_API InternalConfigurationHost\n    {\n    public:\n        static Il2CppString* get_bundled_app_config();\n    };\n} // namespace Configuration\n} // namespace System\n} // namespace Configuration\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System.Core/System.IO.MemoryMappedFiles/MemoryMapImpl.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"MemoryMapImpl.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace Core\n{\nnamespace System\n{\nnamespace IO\n{\nnamespace MemoryMappedFiles\n{\n    bool MemoryMapImpl::Unmap(Il2CppIntPtr mmap_handle)\n    {\n        NOT_IMPLEMENTED_ICALL(MemoryMapImpl::Unmap);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    int32_t MemoryMapImpl::MapInternal(Il2CppIntPtr handle, int64_t offset, int64_t* size, int32_t access, Il2CppIntPtr* mmap_handle, Il2CppIntPtr* base_address)\n    {\n        NOT_IMPLEMENTED_ICALL(MemoryMapImpl::MapInternal);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n\n    Il2CppIntPtr MemoryMapImpl::OpenFileInternal(Il2CppString* path, int32_t mode, Il2CppString* mapName, int64_t* capacity, int32_t access, int32_t options, int32_t* error)\n    {\n        NOT_IMPLEMENTED_ICALL(MemoryMapImpl::OpenFileInternal);\n        IL2CPP_UNREACHABLE;\n        return Il2CppIntPtr();\n    }\n\n    Il2CppIntPtr MemoryMapImpl::OpenHandleInternal(Il2CppIntPtr handle, Il2CppString* mapName, int64_t* capacity, int32_t access, int32_t options, int32_t* error)\n    {\n        NOT_IMPLEMENTED_ICALL(MemoryMapImpl::OpenHandleInternal);\n        IL2CPP_UNREACHABLE;\n        return Il2CppIntPtr();\n    }\n\n    void MemoryMapImpl::CloseMapping(Il2CppIntPtr handle)\n    {\n        NOT_IMPLEMENTED_ICALL(MemoryMapImpl::CloseMapping);\n        IL2CPP_UNREACHABLE;\n    }\n\n    void MemoryMapImpl::ConfigureHandleInheritability(Il2CppIntPtr handle, int32_t inheritability)\n    {\n        NOT_IMPLEMENTED_ICALL(MemoryMapImpl::ConfigureHandleInheritability);\n        IL2CPP_UNREACHABLE;\n    }\n\n    void MemoryMapImpl::Flush(Il2CppIntPtr file_handle)\n    {\n        NOT_IMPLEMENTED_ICALL(MemoryMapImpl::Flush);\n        IL2CPP_UNREACHABLE;\n    }\n} // namespace MemoryMappedFiles\n} // namespace IO\n} // namespace System\n} // namespace Core\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/System.Core/System.IO.MemoryMappedFiles/MemoryMapImpl.h",
    "content": "#pragma once\n\n#if NET_4_0\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace System\n{\nnamespace Core\n{\nnamespace System\n{\nnamespace IO\n{\nnamespace MemoryMappedFiles\n{\n    class LIBIL2CPP_CODEGEN_API MemoryMapImpl\n    {\n    public:\n        static bool Unmap(Il2CppIntPtr mmap_handle);\n        static int32_t MapInternal(Il2CppIntPtr handle, int64_t offset, int64_t* size, int32_t access, Il2CppIntPtr* mmap_handle, Il2CppIntPtr* base_address);\n        static Il2CppIntPtr OpenFileInternal(Il2CppString* path, int32_t mode, Il2CppString* mapName, int64_t* capacity, int32_t access, int32_t options, int32_t* error);\n        static Il2CppIntPtr OpenHandleInternal(Il2CppIntPtr handle, Il2CppString* mapName, int64_t* capacity, int32_t access, int32_t options, int32_t* error);\n        static void CloseMapping(Il2CppIntPtr handle);\n        static void ConfigureHandleInheritability(Il2CppIntPtr handle, int32_t inheritability);\n        static void Flush(Il2CppIntPtr file_handle);\n    };\n} // namespace MemoryMappedFiles\n} // namespace IO\n} // namespace System\n} // namespace Core\n} // namespace System\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono/Runtime.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/Mono/Runtime.h\"\n#include \"vm/String.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\n    Il2CppString* Runtime::GetDisplayName()\n    {\n        return il2cpp::vm::String::New(\"Unity IL2CPP (\" __DATE__ \" \" __TIME__ \")\");\n    }\n\n    void Runtime::mono_runtime_install_handlers()\n    {\n        NOT_SUPPORTED_IL2CPP(Runtime::mono_runtime_install_handlers, \"This method appears to never be called.\");\n    }\n\n#if NET_4_0\n    Il2CppString* Runtime::GetNativeStackTrace(Il2CppException* exception)\n    {\n        NOT_IMPLEMENTED_ICALL(Runtime::GetNativeStackTrace);\n        IL2CPP_UNREACHABLE;\n        return NULL;\n    }\n\n#endif\n} /* namespace Mono */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono/Runtime.h",
    "content": "#pragma once\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\n    class LIBIL2CPP_CODEGEN_API Runtime\n    {\n    public:\n        static void mono_runtime_install_handlers();\n        static Il2CppString* GetDisplayName();\n#if NET_4_0\n        static Il2CppString* GetNativeStackTrace(Il2CppException* exception);\n#endif\n    };\n} /* namespace Mono */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono/RuntimeClassHandle.cpp",
    "content": "#if NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"RuntimeClassHandle.h\"\n#include \"vm/Class.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\n    Il2CppIntPtr RuntimeClassHandle::GetTypeFromClass(Il2CppClass* klass)\n    {\n        Il2CppIntPtr retVal;\n        retVal.m_value = (void*)il2cpp::vm::Class::GetType(klass);\n        return retVal;\n    }\n} // namespace Mono\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono/RuntimeClassHandle.h",
    "content": "#pragma once\n\n#if NET_4_0\n\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\n    class LIBIL2CPP_CODEGEN_API RuntimeClassHandle\n    {\n    public:\n        static Il2CppIntPtr GetTypeFromClass(Il2CppClass* klass);\n    };\n} // namespace Mono\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono/RuntimeGPtrArrayHandle.cpp",
    "content": "#if NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"mono-structs.h\"\n#include \"RuntimeGPtrArrayHandle.h\"\n#include \"utils/Memory.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\n    void RuntimeGPtrArrayHandle::GPtrArrayFree(void* value)\n    {\n        IL2CPP_ASSERT(value != NULL);\n        free_gptr_array((GPtrArray*)value);\n    }\n} // namespace Mono\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono/RuntimeGPtrArrayHandle.h",
    "content": "#pragma once\n\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\n    class LIBIL2CPP_CODEGEN_API RuntimeGPtrArrayHandle\n    {\n    public:\n        static void GPtrArrayFree(void* value);\n    };\n} // namespace Mono\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono/RuntimeMarshal.cpp",
    "content": "#if NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"RuntimeMarshal.h\"\n#include \"mono-structs.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\n    void RuntimeMarshal::FreeAssemblyName(Il2CppMonoAssemblyName* name)\n    {\n        IL2CPP_FREE(name->name.m_value);\n        IL2CPP_FREE(name->culture.m_value);\n        IL2CPP_FREE(name->hash_value.m_value);\n        IL2CPP_FREE(name->public_key.m_value);\n    }\n} // namespace Mono\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono/RuntimeMarshal.h",
    "content": "#pragma once\n\n#if NET_4_0\n\nstruct Il2CppMonoAssemblyName;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\n    class LIBIL2CPP_CODEGEN_API RuntimeMarshal\n    {\n    public:\n        static void FreeAssemblyName(Il2CppMonoAssemblyName* name);\n    };\n} // namespace Mono\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono/SafeStringMarshal.cpp",
    "content": "#if NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"SafeStringMarshal.h\"\n#include \"utils/StringUtils.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\n    Il2CppIntPtr SafeStringMarshal::StringToUtf8(Il2CppString* str)\n    {\n        Il2CppIntPtr res;\n\n        std::string strobj = il2cpp::utils::StringUtils::Utf16ToUtf8(str->chars, str->length);\n        size_t size = strobj.size();\n        char *cstr = new char[size + 1];\n        memcpy(cstr, strobj.c_str(), size);\n        cstr[size] = 0;\n        res.m_value = cstr;\n\n        return res;\n    }\n\n    void SafeStringMarshal::GFree(Il2CppIntPtr ptr)\n    {\n        char *cstr = (char*)ptr.m_value;\n        delete cstr;\n    }\n} // namespace Mono\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono/SafeStringMarshal.h",
    "content": "#pragma once\n\n#if NET_4_0\n\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\n    class LIBIL2CPP_CODEGEN_API SafeStringMarshal\n    {\n    public:\n        static Il2CppIntPtr StringToUtf8(Il2CppString* str);\n        static void GFree(Il2CppIntPtr ptr);\n    };\n} // namespace Mono\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono.Globalization.Unicode/Normalization.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/Mono.Globalization.Unicode/Normalization.h\"\n#include \"vm/Exception.h\"\n#include \"normalization-tables.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\nnamespace Globalization\n{\nnamespace Unicode\n{\n    void Normalization::load_normalization_resource(Il2CppIntPtr* argProps, Il2CppIntPtr* argMappedChars, Il2CppIntPtr* argCharMapIndex, Il2CppIntPtr* argHelperIndex, Il2CppIntPtr* argMapIdxToComposite, Il2CppIntPtr* argCombiningClass)\n    {\n        argProps->m_value = (uint8_t*)props;\n        argMappedChars->m_value = (uint8_t*)mappedChars;\n        argCharMapIndex->m_value = (uint8_t*)charMapIndex;\n        argHelperIndex->m_value = (uint8_t*)helperIndex;\n        argMapIdxToComposite->m_value = (uint8_t*)mapIdxToComposite;\n        argCombiningClass->m_value = (uint8_t*)combiningClass;\n    }\n} /* namespace Unicode */\n} /* namespace Globalization */\n} /* namespace Mono */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono.Globalization.Unicode/Normalization.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\nnamespace Globalization\n{\nnamespace Unicode\n{\n    class LIBIL2CPP_CODEGEN_API Normalization\n    {\n    public:\n        static void load_normalization_resource(Il2CppIntPtr* argProps, Il2CppIntPtr* argMappedChars, Il2CppIntPtr* argCharMapIndex, Il2CppIntPtr* argHelperIndex, Il2CppIntPtr* argMapIdxToComposite, Il2CppIntPtr* argCombiningClass);\n    };\n} /* namespace Unicode */\n} /* namespace Globalization */\n} /* namespace Mono */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono.Interop/ComInteropProxy.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/Mono.Interop/ComInteropProxy.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\nnamespace Interop\n{\n    void ComInteropProxy::AddProxy(Il2CppIntPtr pItf, mscorlib_Mono_Interop_ComInteropProxy * proxy)\n    {\n        NOT_IMPLEMENTED_ICALL(ComInteropProxy::AddProxy);\n    }\n\n    mscorlib_Mono_Interop_ComInteropProxy* ComInteropProxy::FindProxy(Il2CppIntPtr pItf)\n    {\n        NOT_IMPLEMENTED_ICALL(ComInteropProxy::FindProxy);\n        return 0;\n    }\n} /* namespace Interop */\n} /* namespace Mono */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono.Interop/ComInteropProxy.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct mscorlib_Mono_Interop_ComInteropProxy;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\nnamespace Interop\n{\n    class LIBIL2CPP_CODEGEN_API ComInteropProxy\n    {\n    public:\n        static void AddProxy(Il2CppIntPtr pItf, mscorlib_Mono_Interop_ComInteropProxy * proxy);\n        static mscorlib_Mono_Interop_ComInteropProxy* FindProxy(Il2CppIntPtr pItf);\n    };\n} /* namespace Interop */\n} /* namespace Mono */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono.Security.Cryptography/KeyPairPersistence.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/Mono.Security.Cryptography/KeyPairPersistence.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\nnamespace Security\n{\nnamespace Cryptography\n{\n    bool KeyPairPersistence::_CanSecure(Il2CppString* root)\n    {\n        NOT_IMPLEMENTED_ICALL(KeyPairPersistence::_CanSecure);\n        return false;\n    }\n\n    bool KeyPairPersistence::_ProtectUser(Il2CppString* path)\n    {\n        NOT_IMPLEMENTED_ICALL(KeyPairPersistence::_ProtectUser);\n        return false;\n    }\n\n    bool KeyPairPersistence::_ProtectMachine(Il2CppString* path)\n    {\n        NOT_IMPLEMENTED_ICALL(KeyPairPersistence::_ProtectMachine);\n        return false;\n    }\n\n    bool KeyPairPersistence::_IsUserProtected(Il2CppString* path)\n    {\n        NOT_IMPLEMENTED_ICALL(KeyPairPersistence::_IsUserProtected);\n        return false;\n    }\n\n    bool KeyPairPersistence::_IsMachineProtected(Il2CppString* path)\n    {\n        NOT_IMPLEMENTED_ICALL(KeyPairPersistence::_IsMachineProtected);\n        return false;\n    }\n} /* namespace Cryptography */\n} /* namespace Security */\n} /* namespace Mono */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/Mono.Security.Cryptography/KeyPairPersistence.h",
    "content": "#pragma once\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace Mono\n{\nnamespace Security\n{\nnamespace Cryptography\n{\n    class LIBIL2CPP_CODEGEN_API KeyPairPersistence\n    {\n    public:\n        static bool _CanSecure(Il2CppString* root);\n        static bool _IsUserProtected(Il2CppString* path);\n        static bool _ProtectMachine(Il2CppString* path);\n        static bool _ProtectUser(Il2CppString* path);\n        static bool _IsMachineProtected(Il2CppString* path);\n    };\n} /* namespace Cryptography */\n} /* namespace Security */\n} /* namespace Mono */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Activator.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"il2cpp-api.h\"\n#include \"icalls/mscorlib/System/Activator.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"metadata.h\"\n#include \"vm/Image.h\"\n#include \"vm/Class.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    Il2CppObject * Activator::CreateInstanceInternal(Il2CppReflectionType *type)\n    {\n        Il2CppClass* typeInfo = vm::Class::FromIl2CppType(type->type);\n\n        if (typeInfo == NULL)\n            return NULL;\n\n        il2cpp::vm::Class::Init(typeInfo);\n\n        //you could think \"hey, shouldn't we call the constructor here? but we don't because this path is only hit for value\n        //types, and they cannot have default constructors.  for reference types with constructors, the c# side of CreateInstance()\n        //actually takes care of its own business by using reflection to create the object and invoke the constructor.\n        return il2cpp_object_new(typeInfo);\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Activator.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\nstruct Il2CppObject;\nstruct Il2CppReflectionType;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Activator\n    {\n    public:\n        static Il2CppObject* CreateInstanceInternal(Il2CppReflectionType *type);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/AppDomain.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System/AppDomain.h\"\n\n#include \"gc/Allocator.h\"\n#include \"os/Mutex.h\"\n#include \"utils/StringUtils.h\"\n\n#include \"vm/Array.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/Class.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Image.h\"\n#include \"vm/Object.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Thread.h\"\n#include \"vm/Type.h\"\n\n#include \"tabledefs.h\"\n#include \"il2cpp-string-types.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"il2cpp-api.h\"\n\n#include <map>\n#include <string>\n#include <vector>\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    Il2CppAppDomain* AppDomain::getCurDomain()\n    {\n        Il2CppDomain *add = Domain::GetCurrent();\n\n        if (add->domain)\n            return add->domain;\n\n        add->domain = (Il2CppAppDomain*)il2cpp::vm::Object::New(il2cpp_defaults.appdomain_class);\n        return add->domain;\n    }\n\n    Il2CppAppDomain* AppDomain::getRootDomain()\n    {\n        return Domain::GetRoot()->domain;\n    }\n\n    Il2CppAppDomain* AppDomain::createDomain(Il2CppString*, mscorlib_System_AppDomainSetup*)\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::createDomain, \"IL2CPP only supports one app domain, others cannot be created.\");\n        return NULL;\n    }\n\n    Il2CppArray* AppDomain::GetAssemblies(Il2CppAppDomain* ad, bool refonly)\n    {\n        static Il2CppClass *System_Reflection_Assembly;\n\n        if (!System_Reflection_Assembly)\n        {\n#if !NET_4_0\n            System_Reflection_Assembly = il2cpp_defaults.assembly_class;\n#else\n            System_Reflection_Assembly = il2cpp_defaults.mono_assembly_class;\n#endif\n        }\n\n        vm::AssemblyVector* assemblies = Assembly::GetAllAssemblies();\n\n        int c = 0;\n        Il2CppArray *res = Array::New(System_Reflection_Assembly, (il2cpp_array_size_t)assemblies->size());\n        for (vm::AssemblyVector::const_iterator assembly = assemblies->begin(); assembly != assemblies->end(); ++assembly)\n            il2cpp_array_setref(res, c++, Reflection::GetAssemblyObject(*assembly));\n\n        return res;\n    }\n\n    Il2CppString *  AppDomain::getFriendlyName(Il2CppAppDomain* ad)\n    {\n        return il2cpp_string_new(ad->data->friendly_name);\n    }\n\n    Il2CppAppDomainSetup* AppDomain::getSetup(Il2CppAppDomain* domain)\n    {\n        IL2CPP_ASSERT(domain != NULL);\n        IL2CPP_ASSERT(domain->data != NULL);\n\n        return domain->data->setup;\n    }\n\n    Il2CppAppContext* AppDomain::InternalGetDefaultContext(void)\n    {\n        return vm::Domain::ContextGet();\n    }\n\n    Il2CppAppContext* AppDomain::InternalGetContext(void)\n    {\n        return vm::Domain::ContextGet();\n    }\n\n    Il2CppString* AppDomain::InternalGetProcessGuid(Il2CppString* newguid)\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::InternalGetProcessGuid, \"This icall is only used in System.Runtime.Remoting.RemotingConfiguraiton.ProcessId.\");\n\n        return NULL;\n    }\n\n    void AppDomain::InternalPopDomainRef()\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::InternalPopDomainRef, \"This icall is only used in the System.Runtime.Remoting namespace.\");\n    }\n\n    void AppDomain::InternalPushDomainRef(mscorlib_System_AppDomain * domain)\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::InternalPushDomainRef, \"This icall is only used in the System.Runtime.Remoting namespace.\");\n    }\n\n    void AppDomain::InternalPushDomainRefByID(int32_t domain_id)\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::InternalPushDomainRefByID, \"This icall is only used in the System.Runtime.Remoting namespace.\");\n    }\n\n    mscorlib_System_Runtime_Remoting_Contexts_Context * AppDomain::InternalSetContext(mscorlib_System_Runtime_Remoting_Contexts_Context * context)\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::InternalSetContext, \"This icall is only used in the System.Runtime.Remoting namespace.\");\n\n        return 0;\n    }\n\n    mscorlib_System_AppDomain * AppDomain::InternalSetDomain(mscorlib_System_AppDomain * context)\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::InternalSetDomain, \"This icall is only used in the System.Runtime.Remoting namespace.\");\n\n        return 0;\n    }\n\n    mscorlib_System_AppDomain * AppDomain::InternalSetDomainByID(int32_t domain_id)\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::InternalSetDomainByID, \"This icall is only used in the System.Runtime.Remoting namespace.\");\n\n        return 0;\n    }\n\n    Il2CppReflectionAssembly* AppDomain::LoadAssembly(Il2CppAppDomain* ad, Il2CppString* assemblyRef, struct mscorlib_System_Security_Policy_Evidence* evidence, bool refOnly)\n    {\n        il2cpp::vm::TypeNameParseInfo info;\n        std::string name = il2cpp::utils::StringUtils::Utf16ToUtf8(assemblyRef->chars);\n        il2cpp::vm::TypeNameParser parser(name, info, false);\n\n        if (!parser.ParseAssembly())\n            return NULL;\n\n        //assemblyRef might have been a fullname like System, CultureInfo=bla, Version=4.0, PublicKeyToken=23423423423423\n        //we ignore all that info except the name. (mono ignores the keytoken, and I'm quite sure it also ignores the version).\n        //il2cpp does not pack multiple assemblies with the same name, and even if that one is not the exact one that is asked for,\n        //it's more useful to return it than not to. (like cases where you want to Deserialize a BinaryFormatter blob that was serialized\n        //on 4.0)\n        const Il2CppAssembly* assembly = vm::Assembly::GetLoadedAssembly(info.assembly_name().name.c_str());\n\n        if (assembly != NULL)\n            return Reflection::GetAssemblyObject(assembly);\n\n        return NULL;\n    }\n\n    int32_t AppDomain::ExecuteAssembly(Il2CppAppDomain* self, Il2CppAssembly* a, Il2CppArray* args)\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::ExecuteAssembly, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    Il2CppAssembly* AppDomain::LoadAssemblyRaw(Il2CppAppDomain* self, Il2CppArray* rawAssembly, Il2CppArray* rawSymbolStore, void* /* System.Security.Policy.Evidence */ securityEvidence, bool refonly)\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::LoadAssemblyRaw, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    bool AppDomain::InternalIsFinalizingForUnload(int32_t domain_id)\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::InternalIsFinalizingForUnload, \"This icall is not supported by il2cpp.\");\n\n        return false;\n    }\n\n    void AppDomain::InternalUnload(int32_t domain_id)\n    {\n        NOT_SUPPORTED_IL2CPP(AppDomain::InternalUnload, \"This icall is not supported by il2cpp.\");\n    }\n\n    os::FastMutex s_DomainDataMutex;\n    typedef std::vector<std::pair<UTF16String, Il2CppObject*>, il2cpp::gc::Allocator<std::pair<UTF16String, Il2CppObject*> > > DomainDataStorage;\n    DomainDataStorage* s_DomainData;\n\n    static inline void InitializeDomainData()\n    {\n        void* memory = utils::Memory::Malloc(sizeof(DomainDataStorage));\n        s_DomainData = new(memory)DomainDataStorage;\n    }\n\n    Il2CppObject* AppDomain::GetData(Il2CppAppDomain* self, Il2CppString* name)\n    {\n        os::FastAutoLock lock(&s_DomainDataMutex);\n\n        if (s_DomainData == NULL)\n            InitializeDomainData();\n\n        for (DomainDataStorage::iterator it = s_DomainData->begin(); it != s_DomainData->end(); it++)\n        {\n            if (it->first.compare(name->chars) == 0)\n                return it->second;\n        }\n\n        return NULL;\n    }\n\n    void AppDomain::SetData(Il2CppAppDomain* self, Il2CppString* name, Il2CppObject* data)\n    {\n        os::FastAutoLock lock(&s_DomainDataMutex);\n\n        if (s_DomainData == NULL)\n            InitializeDomainData();\n\n        for (DomainDataStorage::iterator it = s_DomainData->begin(); it != s_DomainData->end(); it++)\n        {\n            if (it->first.compare(0, it->first.size(), name->chars, name->length) == 0)\n            {\n                it->second = data;\n                return;\n            }\n        }\n\n        s_DomainData->push_back(std::make_pair(UTF16String(name->chars, name->length), data));\n    }\n\n#if NET_4_0\n    void AppDomain::DoUnhandledException(Il2CppObject* _this, Il2CppException* e)\n    {\n        NOT_IMPLEMENTED_ICALL(AppDomain::DoUnhandledException);\n        IL2CPP_UNREACHABLE;\n    }\n\n#endif\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/AppDomain.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct mscorlib_System_AppDomain;\nstruct mscorlib_System_AppDomainSetup;\nstruct mscorlib_System_Runtime_Remoting_Contexts_Context;\nstruct mscorlib_System_Security_Policy_Evidence;\nstruct mscorlib_System_Reflection_Assembly;\n\nstruct Il2CppObject;\nstruct Il2CppString;\nstruct Il2CppArray;\nstruct Il2CppAssembly;\nstruct Il2CppAppDomain;\nstruct Il2CppAppDomainSetup;\nstruct Il2CppReflectionAssembly;\nstruct Il2CppAppContext;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API AppDomain\n    {\n    public:\n        static void InternalPopDomainRef();\n        static Il2CppAppDomain* getCurDomain();\n        static Il2CppAppDomain* getRootDomain();\n        static int32_t ExecuteAssembly(Il2CppAppDomain* self, Il2CppAssembly* a, Il2CppArray* args);\n        static Il2CppObject* GetData(Il2CppAppDomain* self, Il2CppString* name);\n        static Il2CppAppContext* InternalGetContext(void);\n        static Il2CppAppContext* InternalGetDefaultContext(void);\n        static Il2CppString* InternalGetProcessGuid(Il2CppString* newguid);\n        static bool InternalIsFinalizingForUnload(int32_t domain_id);\n        static void InternalPushDomainRef(mscorlib_System_AppDomain * domain);\n        static void InternalPushDomainRefByID(int32_t domain_id);\n        static mscorlib_System_Runtime_Remoting_Contexts_Context * InternalSetContext(mscorlib_System_Runtime_Remoting_Contexts_Context * context);\n        static mscorlib_System_AppDomain * InternalSetDomain(mscorlib_System_AppDomain * context);\n        static mscorlib_System_AppDomain * InternalSetDomainByID(int32_t domain_id);\n        static void InternalUnload(int32_t domain_id);\n        static Il2CppReflectionAssembly* LoadAssembly(Il2CppAppDomain* ad, Il2CppString* assemblyRef, struct mscorlib_System_Security_Policy_Evidence* evidence, bool refOnly);\n        static Il2CppAssembly* LoadAssemblyRaw(Il2CppAppDomain* self, Il2CppArray* rawAssembly, Il2CppArray* rawSymbolStore, void* /* System.Security.Policy.Evidence */ securityEvidence, bool refonly);\n        static void SetData(Il2CppAppDomain* self, Il2CppString* name, Il2CppObject* data);\n        static Il2CppAppDomain* createDomain(Il2CppString*, mscorlib_System_AppDomainSetup*);\n        static Il2CppString * getFriendlyName(Il2CppAppDomain* ad);\n        static Il2CppAppDomainSetup* getSetup(Il2CppAppDomain* domain);\n        static Il2CppArray* GetAssemblies(Il2CppAppDomain* ad, bool refonly);\n#if NET_4_0\n        static void DoUnhandledException(Il2CppObject* _this, Il2CppException* e);\n#endif\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/ArgIterator.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System/ArgIterator.h\"\n#include \"tabledefs.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    void ArgIterator::Setup(mscorlib_System_ArgIterator * thisPtr, Il2CppIntPtr argsp, Il2CppIntPtr start)\n    {\n        NOT_SUPPORTED_IL2CPP(ArgIterator::Setup, \"ArgIterator is not supported. Do not use __argList, use params instead.\");\n    }\n\n    Il2CppTypedRef ArgIterator::IntGetNextArg_mscorlib_System_TypedReference(mscorlib_System_ArgIterator * thisPtr)\n    {\n        NOT_SUPPORTED_IL2CPP(ArgIterator::Setup, \"ArgIterator is not supported. Do not use __argList, use params instead.\");\n        return Il2CppTypedRef();\n    }\n\n    Il2CppTypedRef ArgIterator::IntGetNextArg_mscorlib_System_TypedReference_mscorlib_System_IntPtr(mscorlib_System_ArgIterator * thisPtr, Il2CppIntPtr rth)\n    {\n        NOT_SUPPORTED_IL2CPP(ArgIterator::Setup, \"ArgIterator is not supported. Do not use __argList, use params instead.\");\n        return Il2CppTypedRef();\n    }\n\n    Il2CppIntPtr ArgIterator::IntGetNextArgType(mscorlib_System_ArgIterator * thisPtr)\n    {\n        NOT_SUPPORTED_IL2CPP(ArgIterator::Setup, \"ArgIterator is not supported. Do not use __argList, use params instead.\");\n        return Il2CppIntPtr();\n    }\n\n    void* /* System.TypedReference */ ArgIterator::IntGetNextArg(ArgIterator self)\n    {\n        NOT_SUPPORTED_IL2CPP(ArgIterator::IntGetNextArg, \"ArgIterator is not supported. Do not use __argList, use params instead.\");\n\n        return 0;\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/ArgIterator.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct mscorlib_System_ArgIterator;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API ArgIterator\n    {\n    public:\n        static void* /* System.TypedReference */ IntGetNextArg(ArgIterator self);\n        static Il2CppTypedRef IntGetNextArg_mscorlib_System_TypedReference(mscorlib_System_ArgIterator * thisPtr);\n        static Il2CppTypedRef IntGetNextArg_mscorlib_System_TypedReference_mscorlib_System_IntPtr(mscorlib_System_ArgIterator * thisPtr, Il2CppIntPtr rth);\n        static void Setup(mscorlib_System_ArgIterator * thisPtr, Il2CppIntPtr argsp, Il2CppIntPtr start);\n        static Il2CppIntPtr IntGetNextArgType(mscorlib_System_ArgIterator * thisPtr);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Array.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <memory>\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"icalls/mscorlib/System/Array.h\"\n#include \"utils/Exception.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Object.h\"\n#include \"vm/Type.h\"\n\n#include <vector>\n#include <sstream>\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    void Array::ClearInternal(Il2CppArray * arr, int32_t idx, int32_t length)\n    {\n        int sz = il2cpp_array_element_size(arr->klass);\n        memset(il2cpp_array_addr_with_size(arr, sz, idx), 0, length * sz);\n    }\n\n    Il2CppArray * Array::Clone(Il2CppArray * arr)\n    {\n        Il2CppClass *typeInfo = arr->klass;\n        const uint32_t elem_size = il2cpp::vm::Array::GetElementSize(typeInfo);\n\n        if (arr->bounds == NULL)\n        {\n            il2cpp_array_size_t len = il2cpp::vm::Array::GetLength(arr);\n            Il2CppArray *clone = (Il2CppArray*)il2cpp::vm::Array::NewFull(typeInfo, &len, NULL);\n            memcpy(il2cpp::vm::Array::GetFirstElementAddress(clone), il2cpp::vm::Array::GetFirstElementAddress(arr), elem_size * len);\n\n            return clone;\n        }\n\n        il2cpp_array_size_t size = elem_size;\n        std::vector<il2cpp_array_size_t> lengths(typeInfo->rank);\n        std::vector<il2cpp_array_size_t> lowerBounds(typeInfo->rank);\n\n        for (int i = 0; i < typeInfo->rank; ++i)\n        {\n            lengths[i] = arr->bounds[i].length;\n            size *= arr->bounds[i].length;\n            lowerBounds[i] = arr->bounds[i].lower_bound;\n        }\n\n        Il2CppArray* clone = il2cpp::vm::Array::NewFull(typeInfo, &lengths[0], &lowerBounds[0]);\n        memcpy(il2cpp::vm::Array::GetFirstElementAddress(clone), il2cpp::vm::Array::GetFirstElementAddress(arr), size);\n\n        return clone;\n    }\n\n    static std::string FormatCreateInstanceException(const Il2CppType* type)\n    {\n        std::string typeName = vm::Type::GetName(type, IL2CPP_TYPE_NAME_FORMAT_IL);\n\n        std::string message;\n        message += \"Unable to create an array of type '\";\n        message += typeName;\n        message += \"'. IL2CPP needs to know about the array type at compile time, so please define a private static field like this:\\n\\nprivate static \";\n        message += typeName;\n        message += \"[] _unused;\\n\\nin any MonoBehaviour class, and this exception should go away.\";\n\n        return message;\n    }\n\n    Il2CppArray * Array::CreateInstanceImpl(Il2CppReflectionType * elementType, Il2CppArray* lengths, Il2CppArray* bounds)\n    {\n        il2cpp_array_size_t* i32lengths = NULL;\n        il2cpp_array_size_t* i32bounds = NULL;\n        if (lengths != NULL)\n            i32lengths = (il2cpp_array_size_t*)il2cpp_array_addr_with_size(lengths, il2cpp_array_element_size(lengths->klass), 0);\n\n        if (bounds != NULL)\n            i32bounds = (il2cpp_array_size_t*)il2cpp_array_addr_with_size(bounds, il2cpp_array_element_size(bounds->klass), 0);\n\n        Il2CppClass* arrayType = il2cpp::vm::Class::GetArrayClassCached(il2cpp::vm::Class::FromIl2CppType(elementType->type), il2cpp::vm::Array::GetLength(lengths));\n\n        if (arrayType == NULL)\n            vm::Exception::Raise(vm::Exception::GetInvalidOperationException(FormatCreateInstanceException(elementType->type).c_str()));\n\n        return (Il2CppArray*)il2cpp::vm::Array::NewFull(arrayType, i32lengths, i32bounds);\n    }\n\n    bool Array::FastCopy(Il2CppArray *source, int32_t source_idx, Il2CppArray *dest, int32_t dest_idx, int32_t length)\n    {\n        int element_size;\n        Il2CppClass *src_class;\n        Il2CppClass *dest_class;\n        int i;\n\n        if (source->klass->rank != dest->klass->rank)\n            return false;\n\n        if (source->bounds || dest->bounds)\n            return false;\n\n        // Our max array length is il2cpp_array_size_t, which is currently int32_t,\n        // so Array::GetLength will never return more than 2^31 - 1\n        // Therefore, casting sum to uint32_t is safe even if it overflows - it if does,\n        // the comparison will succeed and this function will return false\n        if ((static_cast<uint32_t>(dest_idx + length) > il2cpp::vm::Array::GetLength(dest)) ||\n            (static_cast<uint32_t>(source_idx + length) > il2cpp::vm::Array::GetLength(source)))\n            return false;\n\n        src_class = source->klass->element_class;\n        dest_class = dest->klass->element_class;\n\n        // object[] -> valuetype[]\n        if (src_class == il2cpp_defaults.object_class && dest_class->valuetype)\n        {\n            for (i = source_idx; i < source_idx + length; ++i)\n            {\n                Il2CppObject *elem = il2cpp_array_get(source, Il2CppObject*, i);\n                if (elem && !Object::IsInst(elem, dest_class))\n                    return false;\n            }\n\n            element_size = il2cpp_array_element_size(dest->klass);\n            memset(il2cpp_array_addr_with_size(dest, element_size, dest_idx), 0, element_size * length);\n            for (i = 0; i < length; ++i)\n            {\n                Il2CppObject *elem = il2cpp_array_get(source, Il2CppObject*, source_idx + i);\n#if IL2CPP_ENABLE_MONO_BUG_EMULATION\n                if (!elem)\n                    continue;\n#else\n                if (!elem)\n                    Exception::Raise(Exception::GetInvalidCastException(\"At least one element in the source array could not be cast down to the destination array type.\"));\n#endif\n\n                NOT_IMPLEMENTED_ICALL_NO_ASSERT(Array::FastCopy, \"Need GC write barrier\");\n                memcpy(il2cpp_array_addr_with_size(dest, element_size, dest_idx + i), Object::Unbox(elem), element_size);\n            }\n            return true;\n        }\n\n        if (src_class != dest_class)\n        {\n            if (Class::IsValuetype(dest_class) || Class::IsEnum(dest_class) || Class::IsValuetype(src_class) || Class::IsEnum(src_class))\n                return false;\n\n            // object[] -> reftype[]\n            if (Class::IsSubclassOf(dest_class, src_class, false))\n            {\n                for (i = source_idx; i < source_idx + length; ++i)\n                {\n                    Il2CppObject *elem = il2cpp_array_get(source, Il2CppObject*, i);\n                    if (elem && !Object::IsInst(elem, dest_class))\n                        Exception::Raise(Exception::GetInvalidCastException(\"At least one element in the source array could not be cast down to the destination array type.\"));\n                }\n            }\n            else if (!Class::IsSubclassOf(src_class, dest_class, false))\n                return false;\n\n            // derivedtype[] -> basetype[]\n            IL2CPP_ASSERT(Type::IsReference(src_class->byval_arg));\n            IL2CPP_ASSERT(Type::IsReference(dest_class->byval_arg));\n        }\n\n        IL2CPP_ASSERT(il2cpp_array_element_size(dest->klass) == il2cpp_array_element_size(source->klass));\n\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(Array::FastCopy, \"Need GC write barrier\");\n        memmove(\n            il2cpp_array_addr_with_size(dest, il2cpp_array_element_size(dest->klass), dest_idx),\n            il2cpp_array_addr_with_size(source, il2cpp_array_element_size(source->klass), source_idx),\n            length * il2cpp_array_element_size(dest->klass));\n\n        return true;\n    }\n\n    int32_t Array::GetLength(Il2CppArray * thisPtr, int dimension)\n    {\n        int32_t rank = thisPtr->klass->rank;\n        il2cpp_array_size_t length;\n\n        if ((dimension < 0) || (dimension >= rank))\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetIndexOutOfRangeException());\n\n        if (thisPtr->bounds == NULL)\n            length = thisPtr->max_length;\n        else\n            length = thisPtr->bounds[dimension].length;\n\n#ifdef IL2CPP_BIG_ARRAYS\n        if (length > G_MAXINT32)\n            mono_raise_exception(mono_get_exception_overflow());\n#endif\n        return length;\n    }\n\n    int32_t Array::GetLowerBound(Il2CppArray * thisPtr, int32_t dimension)\n    {\n        int32_t rank = thisPtr->klass->rank;\n\n        if ((dimension < 0) || (dimension >= rank))\n            Exception::Raise(Exception::GetIndexOutOfRangeException());\n\n        if (thisPtr->bounds == NULL)\n            return false;\n\n        return thisPtr->bounds[dimension].lower_bound;\n    }\n\n    int Array::GetRank(Il2CppArray * arr)\n    {\n        return arr->klass->rank;\n    }\n\n    Il2CppObject * Array::GetValue(Il2CppArray * thisPtr, Il2CppArray* indices)\n    {\n        Il2CppClass *ac, *ic;\n        Il2CppArray *ao, *io;\n        int32_t i, pos, *ind;\n\n        IL2CPP_CHECK_ARG_NULL(indices);\n\n        io = (Il2CppArray*)indices;\n        ic = (Il2CppClass*)io->klass;\n\n        ao = (Il2CppArray*)thisPtr;\n        ac = (Il2CppClass*)ao->klass;\n\n        IL2CPP_ASSERT(ic->rank == 1);\n        if (io->bounds != NULL || io->max_length !=  ac->rank)\n            Exception::Raise(Exception::GetArgumentException(NULL, NULL));\n\n        ind = (int32_t*)il2cpp::vm::Array::GetFirstElementAddress(io);\n\n        if (ao->bounds == NULL)\n        {\n            if (*ind < 0 || *ind >= ao->max_length)\n                Exception::Raise(Exception::GetIndexOutOfRangeException());\n\n            return GetValueImpl(thisPtr, *ind);\n        }\n\n        for (i = 0; i < ac->rank; i++)\n            if ((ind[i] < ao->bounds[i].lower_bound) ||\n                (ind[i] >= ao->bounds[i].length + ao->bounds[i].lower_bound))\n                Exception::Raise(Exception::GetIndexOutOfRangeException());\n\n        pos = ind[0] - ao->bounds[0].lower_bound;\n        for (i = 1; i < ac->rank; i++)\n            pos = pos * ao->bounds[i].length + ind[i] - ao->bounds[i].lower_bound;\n\n        return GetValueImpl(thisPtr, pos);\n    }\n\n    Il2CppObject * Array::GetValueImpl(Il2CppArray * thisPtr, int32_t pos)\n    {\n        Il2CppClass* typeInfo = thisPtr->klass;\n        void **ea;\n\n        ea = (void**)load_array_elema(thisPtr, pos, typeInfo->element_size);\n\n        if (typeInfo->element_class->valuetype)\n            return il2cpp::vm::Object::Box(typeInfo->element_class, ea);\n\n        return (Il2CppObject*)*ea;\n    }\n\n    void Array::SetValue(Il2CppArray * thisPtr, Il2CppObject* value, Il2CppArray* idxs)\n    {\n        Il2CppClass *ac, *ic;\n        int32_t i, pos, *ind;\n\n        IL2CPP_CHECK_ARG_NULL(idxs);\n\n        ic = idxs->klass;\n        ac = thisPtr->klass;\n\n        IL2CPP_ASSERT(ic->rank == 1);\n        if (idxs->bounds != NULL || idxs->max_length != ac->rank)\n            Exception::Raise(Exception::GetArgumentException(NULL, NULL));\n\n        ind = (int32_t*)il2cpp::vm::Array::GetFirstElementAddress(idxs);\n\n        if (thisPtr->bounds == NULL)\n        {\n            if (*ind < 0 || *ind >= thisPtr->max_length)\n                Exception::Raise(Exception::GetIndexOutOfRangeException());\n\n            SetValueImpl(thisPtr, value, *ind);\n            return;\n        }\n\n        for (i = 0; i < ac->rank; i++)\n            if ((ind[i] < thisPtr->bounds[i].lower_bound) ||\n                (ind[i] >= (il2cpp_array_lower_bound_t)thisPtr->bounds[i].length + thisPtr->bounds[i].lower_bound))\n                Exception::Raise(Exception::GetIndexOutOfRangeException());\n\n        pos = ind[0] - thisPtr->bounds[0].lower_bound;\n        for (i = 1; i < ac->rank; i++)\n            pos = pos * thisPtr->bounds[i].length + ind[i] -\n                thisPtr->bounds[i].lower_bound;\n\n        SetValueImpl(thisPtr, value, pos);\n    }\n\n    static void ThrowNoWidening()\n    {\n        Exception::Raise(Exception::GetArgumentException(\"value\", \"not a widening conversion\"));\n    }\n\n    static void ThrowInvalidCast(const Il2CppClass* a, const Il2CppClass* b)\n    {\n        Exception::Raise(Exception::GetInvalidCastException(utils::Exception::FormatInvalidCastException(b, a).c_str()));\n    }\n\n    union WidenedValueUnion\n    {\n        int64_t i64;\n        uint64_t u64;\n        double r64;\n    };\n\n    WidenedValueUnion ExtractWidenedValue(Il2CppTypeEnum type, void* value)\n    {\n        WidenedValueUnion extractedValue = { 0 };\n        switch (type)\n        {\n            case IL2CPP_TYPE_U1:\n                extractedValue.u64 = *(uint8_t*)value;\n                break;\n            case IL2CPP_TYPE_CHAR:\n                extractedValue.u64 = *(Il2CppChar*)value;\n                break;\n            case IL2CPP_TYPE_U2:\n                extractedValue.u64 = *(uint16_t*)value;\n                break;\n            case IL2CPP_TYPE_U4:\n                extractedValue.u64 = *(uint32_t*)value;\n                break;\n            case IL2CPP_TYPE_U8:\n                extractedValue.u64 = *(uint64_t*)value;\n                break;\n            case IL2CPP_TYPE_I1:\n                extractedValue.i64 = *(int8_t*)value;\n                break;\n            case IL2CPP_TYPE_I2:\n                extractedValue.i64 = *(int16_t*)value;\n                break;\n            case IL2CPP_TYPE_I4:\n                extractedValue.i64 = *(int32_t*)value;\n                break;\n            case IL2CPP_TYPE_I8:\n                extractedValue.i64 = *(int64_t*)value;\n                break;\n            case IL2CPP_TYPE_R4:\n                extractedValue.r64 = *(float*)value;\n                break;\n            case IL2CPP_TYPE_R8:\n                extractedValue.r64 = *(double*)value;\n                break;\n            default:\n                IL2CPP_ASSERT(0);\n                break;\n        }\n\n        return extractedValue;\n    }\n\n    static void CheckWideningConversion(size_t elementSize, size_t valueSize, size_t extra = 0)\n    {\n        if (elementSize < valueSize + (extra))\n            ThrowNoWidening();\n    }\n\n    template<typename T>\n    static void AssignUnsigned(WidenedValueUnion value, void* elementAddress, Il2CppTypeEnum valueType, size_t elementSize, size_t valueSize)\n    {\n        switch (valueType)\n        {\n            case IL2CPP_TYPE_U1:\n            case IL2CPP_TYPE_U2:\n            case IL2CPP_TYPE_U4:\n            case IL2CPP_TYPE_U8:\n            case IL2CPP_TYPE_CHAR:\n                CheckWideningConversion(elementSize, valueSize);\n                *(T*)elementAddress = (T)value.u64;\n                break;\n            /* You can't assign a signed value to an unsigned array. */\n            case IL2CPP_TYPE_I1:\n            case IL2CPP_TYPE_I2:\n            case IL2CPP_TYPE_I4:\n            case IL2CPP_TYPE_I8:\n            /* You can't assign a floating point number to an integer array. */\n            case IL2CPP_TYPE_R4:\n            case IL2CPP_TYPE_R8:\n                ThrowNoWidening();\n                break;\n            default:\n                IL2CPP_ASSERT(0);\n                break;\n        }\n    }\n\n    template<typename T>\n    static void AssignSigned(WidenedValueUnion value, void* elementAddress, Il2CppTypeEnum valueType, size_t elementSize, size_t valueSize)\n    {\n        switch (valueType)\n        {\n            /* You can assign an unsigned value to a signed array if the array's\n                element size is larger than the value size. */\n            case IL2CPP_TYPE_U1:\n            case IL2CPP_TYPE_U2:\n            case IL2CPP_TYPE_U4:\n            case IL2CPP_TYPE_U8:\n            case IL2CPP_TYPE_CHAR:\n                CheckWideningConversion(elementSize, valueSize, 1);\n                *(T*)elementAddress = (T)value.u64;\n                break;\n            case IL2CPP_TYPE_I1:\n            case IL2CPP_TYPE_I2:\n            case IL2CPP_TYPE_I4:\n            case IL2CPP_TYPE_I8:\n                CheckWideningConversion(elementSize, valueSize);\n                *(T*)elementAddress = (T)value.i64;\n                break;\n            /* You can't assign a floating point number to an integer array. */\n            case IL2CPP_TYPE_R4:\n            case IL2CPP_TYPE_R8:\n                ThrowNoWidening();\n                break;\n            default:\n                IL2CPP_ASSERT(0);\n                break;\n        }\n    }\n\n    template<typename T>\n    static void AssignReal(WidenedValueUnion value, void* elementAddress, Il2CppTypeEnum valueType, size_t elementSize, size_t valueSize)\n    {\n        switch (valueType)\n        {\n            /* All integers fit into the floating point value range. No need to check size. */\n            case IL2CPP_TYPE_U1:\n            case IL2CPP_TYPE_U2:\n            case IL2CPP_TYPE_U4:\n            case IL2CPP_TYPE_U8:\n            case IL2CPP_TYPE_CHAR:\n                *(T*)elementAddress = (T)value.u64;\n                break;\n            case IL2CPP_TYPE_I1:\n            case IL2CPP_TYPE_I2:\n            case IL2CPP_TYPE_I4:\n            case IL2CPP_TYPE_I8:\n                *(T*)elementAddress = (T)value.i64;\n                break;\n            case IL2CPP_TYPE_R4:\n            case IL2CPP_TYPE_R8:\n                CheckWideningConversion(elementSize, valueSize);\n                *(T*)elementAddress = (T)value.r64;\n                break;\n            default:\n                IL2CPP_ASSERT(0);\n                break;\n        }\n    }\n\n    static void NullableInit(uint8_t* buf, Il2CppObject* value, Il2CppClass* klass)\n    {\n        Il2CppClass *parameterClass = klass->castClass;\n\n        IL2CPP_ASSERT(Class::FromIl2CppType(klass->fields[0].type) == parameterClass);\n        IL2CPP_ASSERT(Class::FromIl2CppType(klass->fields[1].type) == il2cpp_defaults.boolean_class);\n\n        *(uint8_t*)(buf + klass->fields[1].offset - sizeof(Il2CppObject)) = value ? 1 : 0;\n        if (value)\n            memcpy(buf + klass->fields[0].offset - sizeof(Il2CppObject), Object::Unbox(value), Class::GetValueSize(parameterClass, NULL));\n        else\n            memset(buf + klass->fields[0].offset - sizeof(Il2CppObject), 0, Class::GetValueSize(parameterClass, NULL));\n    }\n\n    void Array::SetValueImpl(Il2CppArray * thisPtr, Il2CppObject * value, int index)\n    {\n        Il2CppClass* typeInfo = thisPtr->klass;\n        Il2CppClass* elementClass = Class::GetElementClass(typeInfo);\n\n        int elementSize = Class::GetArrayElementSize(elementClass);\n        void* elementAddress = il2cpp_array_addr_with_size(thisPtr, elementSize, index);\n\n        if (Class::IsNullable(elementClass))\n        {\n            NullableInit((uint8_t*)elementAddress, value, elementClass);\n            return;\n        }\n\n        if (value == NULL)\n        {\n            memset(elementAddress, 0, elementSize);\n            return;\n        }\n\n        if (!Class::IsValuetype(elementClass))\n        {\n            if (!Object::IsInst(value, elementClass))\n                Exception::Raise(Exception::GetInvalidCastException(utils::Exception::FormatInvalidCastException(thisPtr->klass->element_class, value->klass).c_str()));\n            il2cpp_array_setref(thisPtr, index, value);\n            return;\n        }\n\n        if (Object::IsInst(value, elementClass))\n        {\n            // write barrier\n            memcpy(elementAddress, Object::Unbox(value), elementSize);\n            return;\n        }\n\n        Il2CppClass* valueClass = Object::GetClass(value);\n\n        if (!Class::IsValuetype(valueClass))\n            ThrowInvalidCast(elementClass, valueClass);\n\n        int valueSize = Class::GetInstanceSize(valueClass) - sizeof(Il2CppObject);\n\n        Il2CppTypeEnum elementType = Class::IsEnum(elementClass) ? Class::GetEnumBaseType(elementClass)->type : elementClass->byval_arg->type;\n        Il2CppTypeEnum valueType = Class::IsEnum(valueClass) ? Class::GetEnumBaseType(valueClass)->type : valueClass->byval_arg->type;\n\n        if (elementType == IL2CPP_TYPE_BOOLEAN)\n        {\n            switch (valueType)\n            {\n                case IL2CPP_TYPE_BOOLEAN:\n                    break;\n                case IL2CPP_TYPE_CHAR:\n                case IL2CPP_TYPE_U1:\n                case IL2CPP_TYPE_U2:\n                case IL2CPP_TYPE_U4:\n                case IL2CPP_TYPE_U8:\n                case IL2CPP_TYPE_I1:\n                case IL2CPP_TYPE_I2:\n                case IL2CPP_TYPE_I4:\n                case IL2CPP_TYPE_I8:\n                case IL2CPP_TYPE_R4:\n                case IL2CPP_TYPE_R8:\n                    ThrowNoWidening();\n                default:\n                    ThrowInvalidCast(elementClass, valueClass);\n            }\n        }\n\n        WidenedValueUnion widenedValue = ExtractWidenedValue(valueType, Object::Unbox(value));\n\n        switch (elementType)\n        {\n            case IL2CPP_TYPE_U1:\n                AssignUnsigned<uint8_t>(widenedValue, elementAddress, valueType, elementSize, valueSize);\n                break;\n            case IL2CPP_TYPE_CHAR:\n                AssignUnsigned<Il2CppChar>(widenedValue, elementAddress, valueType, elementSize, valueSize);\n                break;\n            case IL2CPP_TYPE_U2:\n                AssignUnsigned<uint16_t>(widenedValue, elementAddress, valueType, elementSize, valueSize);\n                break;\n            case IL2CPP_TYPE_U4:\n                AssignUnsigned<uint32_t>(widenedValue, elementAddress, valueType, elementSize, valueSize);\n                break;\n            case IL2CPP_TYPE_U8:\n                AssignUnsigned<uint64_t>(widenedValue, elementAddress, valueType, elementSize, valueSize);\n                break;\n            case IL2CPP_TYPE_I1:\n                AssignSigned<int8_t>(widenedValue, elementAddress, valueType, elementSize, valueSize);\n                break;\n            case IL2CPP_TYPE_I2:\n                AssignSigned<int16_t>(widenedValue, elementAddress, valueType, elementSize, valueSize);\n                break;\n            case IL2CPP_TYPE_I4:\n                AssignSigned<int32_t>(widenedValue, elementAddress, valueType, elementSize, valueSize);\n                break;\n            case IL2CPP_TYPE_I8:\n                AssignSigned<int64_t>(widenedValue, elementAddress, valueType, elementSize, valueSize);\n                break;\n            case IL2CPP_TYPE_R4:\n                AssignReal<float>(widenedValue, elementAddress, valueType, elementSize, valueSize);\n                break;\n            case IL2CPP_TYPE_R8:\n                AssignReal<double>(widenedValue, elementAddress, valueType, elementSize, valueSize);\n                break;\n            default:\n                ThrowInvalidCast(elementClass, valueClass);\n                break;\n        }\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Array.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\nstruct Il2CppArray;\nstruct Il2CppReflectionType;\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Array\n    {\n    public:\n        static void ClearInternal(Il2CppArray* arr, int32_t idx, int32_t length);\n        static Il2CppArray* Clone(Il2CppArray* arr);\n        static Il2CppArray* CreateInstanceImpl(Il2CppReflectionType* elementType, Il2CppArray* lengths, Il2CppArray* bounds);\n        static bool FastCopy(Il2CppArray* source, int32_t source_idx, Il2CppArray* dest, int32_t dest_idx, int32_t length);\n        static int32_t GetLength(Il2CppArray* thisPtr, int dimension);\n        static int32_t GetLowerBound(Il2CppArray* , int32_t);\n        static Il2CppObject* GetValue(Il2CppArray* thisPtr, Il2CppArray* indices);\n        static Il2CppObject* GetValueImpl(Il2CppArray* thisPtr, int32_t pos);\n        static void SetValue(Il2CppArray* , Il2CppObject* , Il2CppArray*);\n        static void SetValueImpl(Il2CppArray* thisPtr, Il2CppObject* value, int index);\n        static int GetRank(Il2CppArray* array);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Buffer.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <memory>\n#include \"icalls/mscorlib/System/Buffer.h\"\n#include \"class-internals.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n\nusing il2cpp::vm::Class;\n\n#ifdef _MSC_VER\n# define ISNAN _isnan\n#else\n# define ISNAN isnan\n#endif\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    bool Buffer::BlockCopyInternal(Il2CppArray * src, int src_offset, Il2CppArray * dest, int dest_offset, int count)\n    {\n        IL2CPP_CHECK_ARG_NULL(src);\n        IL2CPP_CHECK_ARG_NULL(dest);\n\n        /* watch out for integer overflow */\n        if (((uint32_t)src_offset > il2cpp::vm::Array::GetByteLength(src) - count) || ((uint32_t)dest_offset > il2cpp::vm::Array::GetByteLength(dest) - count))\n            return false;\n\n        char *src_buf = ((char*)il2cpp_array_addr_with_size(src, Class::GetInstanceSize(src->klass->element_class), 0)) + src_offset;\n        char *dest_buf = ((char*)il2cpp_array_addr_with_size(dest, Class::GetInstanceSize(dest->klass->element_class), 0)) + dest_offset;\n\n        if (src != dest)\n            memcpy(dest_buf, src_buf, count);\n        else\n            memmove(dest_buf, src_buf, count); /* Source and dest are the same array */\n\n        return true;\n    }\n\n    int32_t Buffer::ByteLengthInternal(Il2CppArray* arr)\n    {\n        return il2cpp::vm::Array::GetByteLength(arr);\n    }\n\n    uint8_t Buffer::GetByteInternal(Il2CppArray* arr, int idx)\n    {\n        return il2cpp_array_get(arr, uint8_t, idx);\n    }\n\n    void Buffer::SetByteInternal(Il2CppArray* arr, int idx, int value)\n    {\n        il2cpp_array_set(arr, uint8_t, idx, value);\n    }\n\n#if NET_4_0\n    uint8_t Buffer::_GetByte(Il2CppArray* array, int32_t index)\n    {\n        return GetByteInternal(array, index);\n    }\n\n    bool Buffer::InternalBlockCopy(Il2CppArray* src, int32_t srcOffsetBytes, Il2CppArray* dst, int32_t dstOffsetBytes, int32_t byteCount)\n    {\n        return BlockCopyInternal(src, srcOffsetBytes, dst, dstOffsetBytes, byteCount);\n    }\n\n    int32_t Buffer::_ByteLength(Il2CppArray* array)\n    {\n        return ByteLengthInternal(array);\n    }\n\n    void Buffer::_SetByte(Il2CppArray* array, int32_t index, uint8_t value)\n    {\n        SetByteInternal(array, index, value);\n    }\n\n#endif\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Buffer.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppArray;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Buffer\n    {\n    public:\n        static bool BlockCopyInternal(Il2CppArray * src, int src_offset, Il2CppArray * dest, int dest_offset, int count);\n        static int32_t ByteLengthInternal(Il2CppArray* arr);\n        static uint8_t GetByteInternal(Il2CppArray* arr, int idx);\n        static void SetByteInternal(Il2CppArray* arr, int idx, int value);\n#if NET_4_0\n        static uint8_t _GetByte(Il2CppArray* array, int32_t index);\n        static bool InternalBlockCopy(Il2CppArray* src, int32_t srcOffsetBytes, Il2CppArray* dst, int32_t dstOffsetBytes, int32_t byteCount);\n        static int32_t _ByteLength(Il2CppArray* array);\n        static void _SetByte(Il2CppArray* array, int32_t index, uint8_t value);\n#endif\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/CLRConfig.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"CLRConfig.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    bool CLRConfig::CheckThrowUnobservedTaskExceptions()\n    {\n        // TODO : Properly support this icall at some point.  This requires knowning that the ThrowUnobservedTaskExceptions=true flag was\n        // set in the app.config and return true here if it was\n        return false;\n    }\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/CLRConfig.h",
    "content": "#pragma once\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API CLRConfig\n    {\n    public:\n        static bool CheckThrowUnobservedTaskExceptions();\n    };\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Char.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System/Char.h\"\n#include \"char-conversions.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    void Char::GetDataTablePointers(\n        const unsigned char** category_data,\n        const unsigned char** numeric_data,\n        const double** numeric_data_values,\n        const Il2CppChar** to_lower_data_low,\n        const Il2CppChar** to_lower_data_high,\n        const Il2CppChar** to_upper_data_low,\n        const Il2CppChar** to_upper_data_high)\n    {\n        *category_data = CategoryData_v4;\n        *numeric_data = NumericData;\n        *numeric_data_values = NumericDataValues;\n        *to_lower_data_low = ToLowerDataLow;\n        *to_lower_data_high = ToLowerDataHigh;\n        *to_upper_data_low = ToUpperDataLow;\n        *to_upper_data_high = ToUpperDataHigh;\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Char.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Char\n    {\n    public:\n        static void GetDataTablePointers(\n            const unsigned char** category_data,\n            const unsigned char** numeric_data,\n            const double** numeric_data_values,\n            const Il2CppChar** to_lower_data_low,\n            const Il2CppChar** to_lower_data_high,\n            const Il2CppChar** to_upper_data_low,\n            const Il2CppChar** to_upper_data_high);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/ConsoleDriver.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System/ConsoleDriver.h\"\n#include \"class-internals.h\"\n#include \"os/Console.h\"\n#include \"os/File.h\"\n#include \"vm/Array.h\"\n#include \"vm/Exception.h\"\n#include \"utils/StringUtils.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n// Used in .NET 2.0 System.Console -> CStreamReader/CStreamWriter -> TermInfoDriver -> ConsoleDriver -> icalls\n\n    bool ConsoleDriver::Isatty(Il2CppIntPtr handle)\n    {\n        il2cpp::os::FileHandle* fileHandle = (il2cpp::os::FileHandle*)handle.m_value;\n        return os::File::Isatty(fileHandle);\n    }\n\n    int32_t ConsoleDriver::InternalKeyAvailable(int32_t ms_timeout)\n    {\n        return il2cpp::os::Console::InternalKeyAvailable(ms_timeout);\n    }\n\n    bool ConsoleDriver::TtySetup(Il2CppString* keypadXmit, Il2CppString* teardown, Il2CppArray** control_characters, int32_t** size)\n    {\n        const std::string keypadXmitString(keypadXmit ? il2cpp::utils::StringUtils::Utf16ToUtf8(keypadXmit->chars) : \"\");\n        const std::string teardownString(teardown ? il2cpp::utils::StringUtils::Utf16ToUtf8(teardown->chars) : \"\");\n\n        uint8_t controlChars[17];\n\n        const bool ret = il2cpp::os::Console::TtySetup(keypadXmitString, teardownString, controlChars, size);\n\n        *control_characters = vm::Array::New(il2cpp_defaults.byte_class, 17);\n        // mono_gc_wbarrier_generic_store (data, Array::New (il2cpp_defaults.byte_class, 17));\n\n        if (ret)\n            memcpy(il2cpp_array_addr(*control_characters, uint8_t, 0), controlChars, 17);\n\n        return true;\n    }\n\n    bool ConsoleDriver::SetEcho(bool wantEcho)\n    {\n        return il2cpp::os::Console::SetEcho(wantEcho);\n    }\n\n    bool ConsoleDriver::SetBreak(bool wantBreak)\n    {\n        return il2cpp::os::Console::SetBreak(wantBreak);\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/ConsoleDriver.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API ConsoleDriver\n    {\n    public:\n        static int32_t InternalKeyAvailable(int32_t ms_timeout);\n        static bool SetBreak(bool wantBreak);\n        static bool SetEcho(bool wantEcho);\n        static bool TtySetup(Il2CppString* keypadXmit, Il2CppString* teardown, Il2CppArray** control_characters, int32_t** size);\n        static bool Isatty(Il2CppIntPtr handle);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Convert.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <ctype.h>\n#include \"icalls/mscorlib/System/Convert.h\"\n#include \"il2cpp-api.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"vm/Array.h\"\n#include \"vm/Image.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    Il2CppArray* Convert::InternalFromBase64String(Il2CppString* str, bool allowWhitespaceOnly)\n    {\n        return Base64ToByteArray(str->chars, str->length, allowWhitespaceOnly);\n    }\n\n    Il2CppArray* Convert::InternalFromBase64CharArray(Il2CppArray* chars, int32_t offset, int32_t length)\n    {\n        return Base64ToByteArray(il2cpp_array_addr(chars, Il2CppChar, offset), length, false);\n    }\n\n    Il2CppArray* Convert::Base64ToByteArray(Il2CppChar* start, int length, bool allowWhitespaceOnly)\n    {\n        int ignored;\n        int i;\n        Il2CppChar c;\n        Il2CppChar last, prev_last, prev2_last;\n        int olength;\n        Il2CppArray *result;\n        unsigned char *res_ptr;\n        int a[4], b[4];\n\n        const static unsigned char dbase64[] =\n        {\n            128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,\n            128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,\n            128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 62, 128, 128, 128, 63,\n            52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 0, 128, 128,\n            128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\n            15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128,\n            128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n            41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51\n        };\n\n        ignored = 0;\n        last = prev_last = 0, prev2_last = 0;\n        for (i = 0; i < length; i++)\n        {\n            c = start[i];\n            if (c >= sizeof(dbase64))\n            {\n                // The content of this exception message matches Mono, but differs from .Net.\n                il2cpp_raise_exception(vm::Exception::GetFormatException(\"Invalid character found.\"));\n            }\n            else if (isspace(c))\n            {\n                ignored++;\n            }\n            else\n            {\n                prev2_last = prev_last;\n                prev_last = last;\n                last = c;\n            }\n        }\n\n        olength = length - ignored;\n\n        if (allowWhitespaceOnly && olength == 0)\n            return vm::Array::New(il2cpp_defaults.byte_class, 0);\n\n        if ((olength & 3) != 0 || olength <= 0)\n        {\n            // The content of this exception message matches Mono, but differs from .Net.\n            il2cpp_raise_exception(vm::Exception::GetFormatException(\"Invalid length.\"));\n        }\n\n        if (prev2_last == '=')\n        {\n            // The content of this exception message matches Mono, but differs from .Net.\n            il2cpp_raise_exception(vm::Exception::GetFormatException(\"Invalid format.\"));\n        }\n\n        olength = (olength * 3) / 4;\n        if (last == '=')\n            olength--;\n\n        if (prev_last == '=')\n            olength--;\n\n        result = vm::Array::New(il2cpp_defaults.byte_class, olength);\n        res_ptr = il2cpp_array_addr(result, unsigned char, 0);\n        for (i = 0; i < length;)\n        {\n            int k;\n\n            for (k = 0; k < 4 && i < length;)\n            {\n                c = start[i++];\n                if (isspace(c))\n                    continue;\n\n                a[k] = (unsigned char)c;\n                if (((b[k] = dbase64[c]) & 0x80) != 0)\n                {\n                    // The content of this exception message matches Mono, but differs from .Net.\n                    il2cpp_raise_exception(vm::Exception::GetFormatException(\"Invalid character found.\"));\n                }\n                k++;\n            }\n\n            *res_ptr++ = (b[0] << 2) | (b[1] >> 4);\n            if (a[2] != '=')\n                *res_ptr++ = (b[1] << 4) | (b[2] >> 2);\n            if (a[3] != '=')\n                *res_ptr++ = (b[2] << 6) | b[3];\n\n            while (i < length && isspace(start[i]))\n                i++;\n        }\n\n        return result;\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Convert.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppArray;\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Convert\n    {\n    public:\n        static Il2CppArray* InternalFromBase64CharArray(Il2CppArray* arr, int32_t offset, int32_t length);\n        static Il2CppArray* InternalFromBase64String(Il2CppString* str, bool allowWhitespaceOnly);\n        static Il2CppArray* Base64ToByteArray(Il2CppChar* start, int length, bool allowWhitespaceOnly);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/CurrentSystemTimeZone.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <string>\n#include \"icalls/mscorlib/System/CurrentSystemTimeZone.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"vm/Array.h\"\n#include \"vm/Exception.h\"\n#include \"vm/String.h\"\n#include \"os/TimeZone.h\"\n\nusing namespace il2cpp::vm;\nusing namespace il2cpp::os;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    bool CurrentSystemTimeZone::GetTimeZoneData(int year, Il2CppArray** data, Il2CppArray** names)\n    {\n        NOT_IMPLEMENTED_NO_ASSERT(CurrentSystemTimeZone::GetTimeZoneData, \"Check arguments and write barriers\");\n        int64_t dataTemp[4] = {0};\n        std::string namesTemp[2];\n        IL2CPP_CHECK_ARG_NULL(data);\n        IL2CPP_CHECK_ARG_NULL(names);\n\n        *data = Array::New(il2cpp_defaults.int64_class, 4);\n        //mono_gc_wbarrier_generic_store (data, Array::New (il2cpp_defaults.int64_class, 4));\n        *names = Array::New(il2cpp_defaults.string_class, 2);\n        //mono_gc_wbarrier_generic_store (names, Array::New (il2cpp_defaults.string_class, 2));\n\n        if (!TimeZone::GetTimeZoneData(year, dataTemp, namesTemp))\n            return false;\n\n        for (int i = 0; i < 4; i++)\n            il2cpp_array_set((*data), int64_t, i, dataTemp[i]);\n\n        for (int i = 0; i < 2; i++)\n            il2cpp_array_setref((*names), i, String::New(namesTemp[i].c_str()));\n\n        return true;\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/CurrentSystemTimeZone.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppArray;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API CurrentSystemTimeZone\n    {\n    public:\n        static bool GetTimeZoneData(int, Il2CppArray * *, Il2CppArray * *);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/DateTime.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System/DateTime.h\"\n#include \"os/Time.h\"\n\nusing namespace il2cpp::os;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    int64_t DateTime::GetNow(void)\n    {\n        return Time::GetTicks100NanosecondsDateTime();\n    }\n\n    int64_t DateTime::GetTimeMonotonic()\n    {\n        return Time::GetTicks100NanosecondsMonotonic();\n    }\n\n#if NET_4_0\n    int64_t DateTime::GetSystemTimeAsFileTime()\n    {\n        return Time::GetSystemTimeAsFileTime();\n    }\n\n#endif\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/DateTime.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API DateTime\n    {\n    public:\n        static int64_t GetNow(void);\n        static int64_t GetTimeMonotonic();\n#if NET_4_0\n        static int64_t GetSystemTimeAsFileTime();\n#endif\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Decimal.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"icalls/mscorlib/System/Decimal.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Exception.h\"\n#include <cmath>\n#include <algorithm>\n\n#if !NET_4_0\n\n#define DECIMAL_MAX_SCALE 28\n#define DECIMAL_MAX_INTFACTORS 9\n\n#define DECIMAL_SUCCESS 0\n#define DECIMAL_FINISHED 1\n#define DECIMAL_OVERFLOW 2\n#define DECIMAL_INVALID_CHARACTER 2\n#define DECIMAL_INTERNAL_ERROR 3\n#define DECIMAL_INVALID_BITS 4\n#define DECIMAL_DIVIDE_BY_ZERO 5\n#define DECIMAL_BUFFER_OVERFLOW 6\n\n#define LIT_GUINT32(x) x\n#define LIT_GUINT64(x) x##LL\n\n#define LIT_GUINT32_HIGHBIT 0x80000000\n#define LIT_GUINT64_HIGHBIT LIT_GUINT64(0x8000000000000000)\n\n#define DECIMAL_LOG_NEGINF -1000\n\n#define DECINIT(src) memset(src, 0, sizeof(il2cpp_decimal_repr))\n\n#define DECCOPY(dest, src) memcpy(dest, src, sizeof(il2cpp_decimal_repr))\n\n#define DECNEGATE(p1) (p1)->u.signscale.sign = 1 - (p1)->u.signscale.sign\n\n#define DECTO128(pd, lo, hi) \\\n    lo = (((uint64_t)(pd)->mid32) << 32) | (pd)->lo32; \\\n    hi = (pd)->hi32;\n\n#ifndef MAX\n#define MAX(a, b) (((a)>(b)) ? (a) : (b))\n#endif\n\n#ifdef _DEBUG\n#include <assert.h>\n#define PRECONDITION(flag) IL2CPP_ASSERT(flag)\n#define POSTCONDITION(flag) IL2CPP_ASSERT(flag)\n#else\n#define PRECONDITION(flag)\n#define POSTCONDITION(flag)\n#endif /* _DEBUG */\n\ntypedef struct\n{\n    uint64_t lo;\n    uint64_t hi;\n} dec128_repr;\n\n#define LIT_DEC128(hi, mid, lo) { (((uint64_t)mid)<<32 | lo), hi }\n\nstatic const dec128_repr dec128decadeFactors[DECIMAL_MAX_SCALE + 1] =\n{\n    LIT_DEC128(0, 0, 1u), /* == 1 */\n    LIT_DEC128(0, 0, 10u), /* == 10 */\n    LIT_DEC128(0, 0, 100u), /* == 100 */\n    LIT_DEC128(0, 0, 1000u), /* == 1e3m */\n    LIT_DEC128(0, 0, 10000u), /* == 1e4m */\n    LIT_DEC128(0, 0, 100000u), /* == 1e5m */\n    LIT_DEC128(0, 0, 1000000u), /* == 1e6m */\n    LIT_DEC128(0, 0, 10000000u), /* == 1e7m */\n    LIT_DEC128(0, 0, 100000000u), /* == 1e8m */\n    LIT_DEC128(0, 0, 1000000000u), /* == 1e9m */\n    LIT_DEC128(0, 2u, 1410065408u), /* == 1e10m */\n    LIT_DEC128(0, 23u, 1215752192u), /* == 1e11m */\n    LIT_DEC128(0, 232u, 3567587328u), /* == 1e12m */\n    LIT_DEC128(0, 2328u, 1316134912u), /* == 1e13m */\n    LIT_DEC128(0, 23283u, 276447232u), /* == 1e14m */\n    LIT_DEC128(0, 232830u, 2764472320u), /* == 1e15m */\n    LIT_DEC128(0, 2328306u, 1874919424u), /* == 1e16m */\n    LIT_DEC128(0, 23283064u, 1569325056u), /* == 1e17m */\n    LIT_DEC128(0, 232830643u, 2808348672u), /* == 1e18m */\n    LIT_DEC128(0, 2328306436u, 2313682944u), /* == 1e19m */\n    LIT_DEC128(5u, 1808227885u, 1661992960u), /* == 1e20m */\n    LIT_DEC128(54u, 902409669u, 3735027712u), /* == 1e21m */\n    LIT_DEC128(542u, 434162106u, 2990538752u), /* == 1e22m */\n    LIT_DEC128(5421u, 46653770u, 4135583744u), /* == 1e23m */\n    LIT_DEC128(54210u, 466537709u, 2701131776u), /* == 1e24m */\n    LIT_DEC128(542101u, 370409800u, 1241513984u), /* == 1e25m */\n    LIT_DEC128(5421010u, 3704098002u, 3825205248u), /* == 1e26m */\n    LIT_DEC128(54210108u, 2681241660u, 3892314112u), /* == 1e27m */\n    LIT_DEC128(542101086u, 1042612833u, 268435456u), /* == 1e28m */\n};\n\nstatic const uint32_t constantsDecadeInt32Factors[DECIMAL_MAX_INTFACTORS + 1] =\n{\n    1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000\n};\n\nstatic int pack128toDecimal(il2cpp_decimal_repr* pA, uint64_t alo, uint64_t ahi, int scale, int sign)\n{\n    if (scale < 0 || scale > DECIMAL_MAX_SCALE || (ahi >> 32) != 0)\n        return DECIMAL_OVERFLOW;\n\n    pA->lo32 = (uint32_t)alo;\n    pA->mid32 = (uint32_t)(alo >> 32);\n    pA->hi32 = (uint32_t)ahi;\n    pA->u.signscale.sign = sign;\n    pA->u.signscale.scale = scale;\n\n    return DECIMAL_SUCCESS;\n}\n\nstatic void add128(uint64_t alo, uint64_t ahi, uint64_t blo, uint64_t bhi, uint64_t* pclo, uint64_t* pchi)\n{\n    alo += blo;\n    if (alo < blo)\n        ahi++;\n    ahi += bhi;\n\n    *pclo = alo;\n    *pchi = ahi;\n}\n\nstatic void sub128(uint64_t alo, uint64_t ahi, uint64_t blo, uint64_t bhi, uint64_t* pclo, uint64_t* pchi)\n{\n    uint64_t clo, chi;\n\n    clo = alo - blo;\n    chi = ahi - bhi;\n    if (alo < blo)\n        chi--;            /* borrow */\n\n    *pclo = clo;\n    *pchi = chi;\n}\n\nstatic int div128by32(uint64_t* plo, uint64_t* phi, uint32_t factor, uint32_t* pRest)\n{\n    uint64_t a, b, c, h;\n\n    h = *phi;\n    a = (uint32_t)(h >> 32);\n    b = a / factor;\n    a -= b * factor;\n    a <<= 32;\n    a |= (uint32_t)h;\n    c = a / factor;\n    a -= c * factor;\n    a <<= 32;\n    *phi = b << 32 | (uint32_t)c;\n\n    h = *plo;\n    a |= (uint32_t)(h >> 32);\n    b = a / factor;\n    a -= b * factor;\n    a <<= 32;\n    a |= (uint32_t)h;\n    c = a / factor;\n    a -= c * factor;\n    *plo = b << 32 | (uint32_t)c;\n\n    if (pRest)\n        *pRest = (uint32_t)a;\n\n    a <<= 1;\n    return (a >= factor || (a == factor && (c & 1) == 1)) ? 1 : 0;\n}\n\nstatic int mult128by32(uint64_t* pclo, uint64_t* pchi, uint32_t factor, int roundBit)\n{\n    uint64_t a;\n    uint32_t h0, h1;\n\n    a = ((uint64_t)(uint32_t)(*pclo)) * factor;\n    if (roundBit)\n        a += factor / 2;\n    h0 = (uint32_t)a;\n\n    a >>= 32;\n    a += (*pclo >> 32) * factor;\n    h1 = (uint32_t)a;\n\n    *pclo = ((uint64_t)h1) << 32 | h0;\n\n    a >>= 32;\n    a += ((uint64_t)(uint32_t)(*pchi)) * factor;\n    h0 = (uint32_t)a;\n\n    a >>= 32;\n    a += (*pchi >> 32) * factor;\n    h1 = (uint32_t)a;\n\n    *pchi = ((uint64_t)h1) << 32 | h0;\n\n    return ((a >> 32) == 0) ? DECIMAL_SUCCESS : DECIMAL_OVERFLOW;\n}\n\nstatic void mult96by96to192(uint32_t alo, uint32_t ami, uint32_t ahi, uint32_t blo, uint32_t bmi, uint32_t bhi, uint64_t* pclo, uint64_t* pcmi, uint64_t* pchi)\n{\n    uint64_t a, b, c, d;\n    uint32_t h0, h1, h2, h3, h4, h5;\n    int carry0, carry1;\n\n    a = ((uint64_t)alo) * blo;\n    h0 = (uint32_t)a;\n\n    a >>= 32; carry0 = 0;\n    b = ((uint64_t)alo) * bmi;\n    c = ((uint64_t)ami) * blo;\n    a += b; if (a < b)\n        carry0++;\n    a += c; if (a < c)\n        carry0++;\n    h1 = (uint32_t)a;\n\n    a >>= 32; carry1 = 0;\n    b = ((uint64_t)alo) * bhi;\n    c = ((uint64_t)ami) * bmi;\n    d = ((uint64_t)ahi) * blo;\n    a += b; if (a < b)\n        carry1++;\n    a += c; if (a < c)\n        carry1++;\n    a += d; if (a < d)\n        carry1++;\n    h2 = (uint32_t)a;\n\n    a >>= 32; a += carry0; carry0 = 0;\n    b = ((uint64_t)ami) * bhi;\n    c = ((uint64_t)ahi) * bmi;\n    a += b; if (a < b)\n        carry0++;\n    a += c; if (a < c)\n        carry0++;\n    h3 = (uint32_t)a;\n\n    a >>= 32; a += carry1;\n    b = ((uint64_t)ahi) * bhi;\n    a += b;\n    h4 = (uint32_t)a;\n\n    a >>= 32; a += carry0;\n    h5 = (uint32_t)a;\n\n    *pclo = ((uint64_t)h1) << 32 | h0;\n    *pcmi = ((uint64_t)h3) << 32 | h2;\n    *pchi = ((uint64_t)h5) << 32 | h4;\n}\n\nstatic void div192by32(uint64_t* plo, uint64_t* pmi, uint64_t* phi, uint32_t factor)\n{\n    uint64_t a, b, c, h;\n\n    h = *phi;\n    a = (uint32_t)(h >> 32);\n    b = a / factor;\n    a -= b * factor;\n    a <<= 32;\n    a |= (uint32_t)h;\n    c = a / factor;\n    a -= c * factor;\n    a <<= 32;\n    *phi = b << 32 | (uint32_t)c;\n\n    h = *pmi;\n    a |= (uint32_t)(h >> 32);\n    b = a / factor;\n    a -= b * factor;\n    a <<= 32;\n    a |= (uint32_t)h;\n    c = a / factor;\n    a -= c * factor;\n    a <<= 32;\n    *pmi = b << 32 | (uint32_t)c;\n\n    h = *plo;\n    a |= (uint32_t)(h >> 32);\n    b = a / factor;\n    a -= b * factor;\n    a <<= 32;\n    a |= (uint32_t)h;\n    c = a / factor;\n    a -= c * factor;\n    a <<= 32;\n    *plo = b << 32 | (uint32_t)c;\n}\n\nstatic int incMultConstant128(uint64_t* palo, uint64_t* pahi, int idx, int factor)\n{\n    uint64_t blo, bhi, h;\n\n    IL2CPP_ASSERT(idx >= 0 && idx <= DECIMAL_MAX_SCALE);\n    IL2CPP_ASSERT(factor > 0 && factor <= 9);\n\n    blo = dec128decadeFactors[idx].lo;\n    h = bhi = dec128decadeFactors[idx].hi;\n    if (factor != 1)\n    {\n        mult128by32(&blo, &bhi, factor, 0);\n        if (h > bhi)\n            return DECIMAL_OVERFLOW;\n    }\n    h = *pahi;\n    add128(*palo, *pahi, blo, bhi, palo, pahi);\n    if (h > *pahi)\n        return DECIMAL_OVERFLOW;\n\n    return DECIMAL_SUCCESS;\n}\n\nstatic void roundUp128(uint64_t* pclo, uint64_t* pchi)\n{\n    if (++(*pclo) == 0)\n        ++(*pchi);\n}\n\nstatic int decimalIsZero(il2cpp_decimal_repr* pA)\n{\n    return (pA->lo32 == 0 && pA->mid32 == 0 && pA->hi32 == 0);\n}\n\nstatic void sub192(uint64_t alo, uint64_t ami, uint64_t ahi , uint64_t blo, uint64_t bmi, uint64_t bhi, uint64_t* pclo, uint64_t* pcmi, uint64_t* pchi)\n{\n    uint64_t clo, cmi, chi;\n\n    clo = alo - blo;\n    cmi = ami - bmi;\n    chi = ahi - bhi;\n    if (alo < blo)\n    {\n        if (cmi == 0)\n            chi--; /* borrow mid */\n        cmi--; /* borrow low */\n    }\n    if (ami < bmi)\n        chi--; /* borrow mid */\n    *pclo = clo;\n    *pcmi = cmi;\n    *pchi = chi;\n}\n\nstatic void mult96by32to128(uint32_t alo, uint32_t ami, uint32_t ahi, uint32_t factor, uint64_t* pclo, uint64_t* pchi)\n{\n    uint64_t a;\n    uint32_t h0, h1;\n\n    a = ((uint64_t)alo) * factor;\n    h0 = (uint32_t)a;\n\n    a >>= 32;\n    a += ((uint64_t)ami) * factor;\n    h1 = (uint32_t)a;\n\n    a >>= 32;\n    a += ((uint64_t)ahi) * factor;\n\n    *pclo = ((uint64_t)h1) << 32 | h0;\n    *pchi = a;\n}\n\nstatic void add192(uint64_t alo, uint64_t ami, uint64_t ahi, uint64_t blo, uint64_t bmi, uint64_t bhi, uint64_t* pclo, uint64_t* pcmi, uint64_t* pchi)\n{\n    alo += blo;\n    if (alo < blo)\n    { /* carry low */\n        ami++;\n        if (ami == 0)\n            ahi++; /* carry mid */\n    }\n    ami += bmi;\n    if (ami < bmi)\n        ahi++; /* carry mid */\n    ahi += bhi;\n    *pclo = alo;\n    *pcmi = ami;\n    *pchi = ahi;\n}\n\nstatic uint32_t div192by96to32withRest(uint64_t* palo, uint64_t* pami, uint64_t* pahi, uint32_t blo, uint32_t bmi, uint32_t bhi)\n{\n    uint64_t rlo, rmi, rhi; /* remainder */\n    uint64_t tlo, thi; /* term */\n    uint32_t c;\n\n    rlo = *palo; rmi = *pami; rhi = *pahi;\n    if (rhi >= (((uint64_t)bhi) << 32))\n    {\n        c = LIT_GUINT32(0xFFFFFFFF);\n    }\n    else\n    {\n        c = (uint32_t)(rhi / bhi);\n    }\n    mult96by32to128(blo, bmi, bhi, c, &tlo, &thi);\n    sub192(rlo, rmi, rhi, 0, tlo, thi, &rlo, &rmi, &rhi);\n    while (((int64_t)rhi) < 0)\n    {\n        c--;\n        add192(rlo, rmi, rhi, 0, (((uint64_t)bmi) << 32) | blo, bhi, &rlo, &rmi, &rhi);\n    }\n    *palo = rlo; *pami = rmi; *pahi = rhi;\n\n    POSTCONDITION(rhi >> 32 == 0);\n\n    return c;\n}\n\nstatic void div192by96to128(uint64_t alo, uint64_t ami, uint64_t ahi, uint32_t blo, uint32_t bmi, uint32_t bhi, uint64_t* pclo, uint64_t* pchi)\n{\n    uint64_t rlo, rmi, rhi; /* remainder */\n    uint32_t h, c;\n\n    PRECONDITION(ahi < (((uint64_t)bhi) << 32 | bmi)\n        || (ahi == (((uint64_t)bhi) << 32 | bmi) && (ami >> 32) > blo));\n\n    /* high 32 bit*/\n    rlo = alo; rmi = ami; rhi = ahi;\n    h = div192by96to32withRest(&rlo, &rmi, &rhi, blo, bmi, bhi);\n\n    /* mid 32 bit*/\n    rhi = (rhi << 32) | (rmi >> 32); rmi = (rmi << 32) | (rlo >> 32); rlo <<= 32;\n    *pchi = (((uint64_t)h) << 32) | div192by96to32withRest(&rlo, &rmi, &rhi, blo, bmi, bhi);\n\n    /* low 32 bit */\n    rhi = (rhi << 32) | (rmi >> 32); rmi = (rmi << 32) | (rlo >> 32); rlo <<= 32;\n    h = div192by96to32withRest(&rlo, &rmi, &rhi, blo, bmi, bhi);\n\n    /* estimate lowest 32 bit (two last bits may be wrong) */\n    if (rhi >= bhi)\n    {\n        c = LIT_GUINT32(0xFFFFFFFF);\n    }\n    else\n    {\n        rhi <<= 32;\n        c = (uint32_t)(rhi / bhi);\n    }\n    *pclo = (((uint64_t)h) << 32) | c;\n}\n\nstatic void rshift128(uint64_t* pclo, uint64_t* pchi)\n{\n    *pclo >>= 1;\n    *pclo |= (*pchi & 1) << 63;\n    *pchi >>= 1;\n}\n\nstatic void lshift128(uint64_t* pclo, uint64_t* pchi)\n{\n    *pchi <<= 1;\n    *pchi |= (*pclo & LIT_GUINT64_HIGHBIT) >> 63;\n    *pclo <<= 1;\n}\n\nstatic inline int\nmy_g_bit_nth_msf(uintptr_t mask)\n{\n    int i;\n\n    // Mono uses some architecture and OS-specific code to implement this function.\n    // This is the code from the #else case, which attempts to use sizeof(gsize),\n    // which is sizeof(uintptr_t) for us. This seems to be wrong on 64-bit though,\n    // So we will explicitly always use 4 here.\n    //i = sizeof(gsize) * 8;\n    i = 4 * 8;\n    while (i > 0)\n    {\n        i--;\n        if (mask & static_cast<uintptr_t>(1ULL << i))\n            return i;\n    }\n    return -1;\n}\n\nstatic int decimalDivSub(il2cpp_decimal_repr* pA, il2cpp_decimal_repr* pB, uint64_t* pclo, uint64_t* pchi, int* pExp)\n{\n    uint64_t alo, ami, ahi;\n    uint64_t tlo, tmi, thi;\n    uint32_t blo, bmi, bhi;\n    int ashift, bshift, extraBit, texp;\n\n    ahi = (((uint64_t)(pA->hi32)) << 32) | pA->mid32;\n    ami = ((uint64_t)(pA->lo32)) << 32;\n    alo = 0;\n    blo = pB->lo32;\n    bmi = pB->mid32;\n    bhi = pB->hi32;\n\n    if (blo == 0 && bmi == 0 && bhi == 0)\n    {\n        return DECIMAL_DIVIDE_BY_ZERO;\n    }\n\n    if (ami == 0 && ahi == 0)\n    {\n        *pclo = *pchi = 0;\n        return DECIMAL_FINISHED;\n    }\n\n    /* enlarge dividend to get maximal precision */\n    if (ahi == 0)\n    {\n        ahi = ami;\n        ami = 0;\n        for (ashift = 64; (ahi & LIT_GUINT64_HIGHBIT) == 0; ++ashift)\n        {\n            ahi <<= 1;\n        }\n    }\n    else\n    {\n        for (ashift = 0; (ahi & LIT_GUINT64_HIGHBIT) == 0; ++ashift)\n        {\n            lshift128(&ami, &ahi);\n        }\n    }\n\n    /* ensure that divisor is at least 2^95 */\n    if (bhi == 0)\n    {\n        if (bmi == 0)\n        {\n            uint32_t hi_shift;\n            bhi = blo;\n            bmi = 0;\n            blo = 0;\n\n            //IL2CPP_ASSERT(g_bit_nth_msf (bhi, 32) == my_g_bit_nth_msf (bhi));\n\n            hi_shift = 31 - my_g_bit_nth_msf(bhi);\n            bhi <<= hi_shift;\n            bshift = 64 + hi_shift;\n        }\n        else\n        {\n            bhi = bmi;\n            bmi = blo;\n            blo = 0;\n\n            for (bshift = 32; (bhi & LIT_GUINT32_HIGHBIT) == 0; ++bshift)\n            {\n                bhi <<= 1;\n                bhi |= (bmi & LIT_GUINT32_HIGHBIT) >> 31;\n                bmi <<= 1;\n            }\n        }\n    }\n    else\n    {\n        for (bshift = 0; (bhi & LIT_GUINT32_HIGHBIT) == 0; ++bshift)\n        {\n            bhi <<= 1;\n            bhi |= (bmi & LIT_GUINT32_HIGHBIT) >> 31;\n            bmi <<= 1;\n            bmi |= (blo & LIT_GUINT32_HIGHBIT) >> 31;\n            blo <<= 1;\n        }\n    }\n\n    thi = ((uint64_t)bhi) << 32 | bmi;\n    tmi = ((uint64_t)blo) << 32;\n    tlo = 0;\n    if (ahi > thi || (ahi == thi && ami >= tmi))\n    {\n        sub192(alo, ami, ahi, tlo, tmi, thi, &alo, &ami, &ahi);\n        extraBit = 1;\n    }\n    else\n    {\n        extraBit = 0;\n    }\n\n    div192by96to128(alo, ami, ahi, blo, bmi, bhi, pclo, pchi);\n    texp = 128 + ashift - bshift;\n\n    if (extraBit)\n    {\n        rshift128(pclo, pchi);\n        *pchi += LIT_GUINT64_HIGHBIT;\n        texp--;\n    }\n\n    /* try loss free right shift */\n    while (texp > 0 && (*pclo & 1) == 0)\n    {\n        /* right shift */\n        rshift128(pclo, pchi);\n        texp--;\n    }\n\n    *pExp = texp;\n\n    return DECIMAL_SUCCESS;\n}\n\nstatic int log2_32(uint32_t a)\n{\n    if (a == 0)\n        return DECIMAL_LOG_NEGINF;\n\n    return my_g_bit_nth_msf(a) + 1;\n}\n\nstatic int log2_64(uint64_t a)\n{\n    if (a == 0)\n        return DECIMAL_LOG_NEGINF;\n\n#if SIZEOF_VOID_P == 8\n    return my_g_bit_nth_msf(a) + 1;\n#else\n    if ((a >> 32) == 0)\n        return my_g_bit_nth_msf((uint32_t)a) + 1;\n    else\n        return my_g_bit_nth_msf((uint32_t)(a >> 32)) + 1 + 32;\n#endif\n}\n\nstatic int log2_128(uint64_t alo, uint64_t ahi)\n{\n    if (ahi == 0)\n        return log2_64(alo);\n    else\n        return log2_64(ahi) + 64;\n}\n\nstatic int log2withScale_128(uint64_t alo, uint64_t ahi, int scale)\n{\n    int tlog2 = log2_128(alo, ahi);\n    if (tlog2 < 0)\n        tlog2 = 0;\n    return tlog2 - (scale * 33219) / 10000;\n}\n\nstatic int decimalLog2(il2cpp_decimal_repr* pA)\n{\n    int tlog2;\n    int scale = pA->u.signscale.scale;\n\n    if (pA->hi32 != 0)\n        tlog2 = 64 + log2_32(pA->hi32);\n    else if (pA->mid32 != 0)\n        tlog2 = 32 + log2_32(pA->mid32);\n    else\n        tlog2 = log2_32(pA->lo32);\n\n    if (tlog2 != DECIMAL_LOG_NEGINF)\n    {\n        tlog2 -= (scale * 33219) / 10000;\n    }\n\n    return tlog2;\n}\n\nstatic int normalize128(uint64_t* pclo, uint64_t* pchi, int* pScale, int roundFlag, int roundBit)\n{\n    uint32_t overhang = (uint32_t)(*pchi >> 32);\n    int scale = *pScale;\n    int deltaScale;\n\n    while (overhang != 0)\n    {\n        for (deltaScale = 1; deltaScale < DECIMAL_MAX_INTFACTORS; deltaScale++)\n        {\n            if (overhang < constantsDecadeInt32Factors[deltaScale])\n                break;\n        }\n\n        scale -= deltaScale;\n\n        if (scale < 0)\n            return DECIMAL_OVERFLOW;\n\n        roundBit = div128by32(pclo, pchi, constantsDecadeInt32Factors[deltaScale], 0);\n\n        overhang = (uint32_t)(*pchi >> 32);\n        if (roundFlag && roundBit && *pclo == (uint64_t)-1 && (int32_t)*pchi == (int32_t)-1)\n            overhang = 1;\n    }\n\n    *pScale = scale;\n\n    if (roundFlag && roundBit)\n        roundUp128(pclo, pchi);\n\n    return DECIMAL_SUCCESS;\n}\n\nstatic int adjustScale128(uint64_t* palo, uint64_t* pahi, int deltaScale)\n{\n    int idx, rc;\n\n    if (deltaScale < 0)\n    {\n        deltaScale *= -1;\n        if (deltaScale > DECIMAL_MAX_SCALE)\n            return DECIMAL_INTERNAL_ERROR;\n        while (deltaScale > 0)\n        {\n            idx = (deltaScale > DECIMAL_MAX_INTFACTORS) ? DECIMAL_MAX_INTFACTORS : deltaScale;\n            deltaScale -= idx;\n            div128by32(palo, pahi, constantsDecadeInt32Factors[idx], 0);\n        }\n    }\n    else if (deltaScale > 0)\n    {\n        if (deltaScale > DECIMAL_MAX_SCALE)\n            return DECIMAL_INTERNAL_ERROR;\n        while (deltaScale > 0)\n        {\n            idx = (deltaScale > DECIMAL_MAX_INTFACTORS) ? DECIMAL_MAX_INTFACTORS : deltaScale;\n            deltaScale -= idx;\n            rc = mult128by32(palo, pahi, constantsDecadeInt32Factors[idx], 0);\n            if (rc != DECIMAL_SUCCESS)\n                return rc;\n        }\n    }\n\n    return DECIMAL_SUCCESS;\n}\n\nstatic int rescale128(uint64_t* pclo, uint64_t* pchi, int* pScale, int texp,\n    int minScale, int maxScale, int roundFlag)\n{\n    uint32_t factor, overhang;\n    int scale, i, rc, roundBit = 0;\n\n    scale = *pScale;\n\n    if (texp > 0)\n    {\n        /* reduce exp */\n        while (texp > 0 && scale <= maxScale)\n        {\n            overhang = (uint32_t)(*pchi >> 32);\n\n            /* The original loop was this: */\n            /*\n            while (texp > 0 && (overhang > (2<<DECIMAL_MAX_INTFACTORS) || (*pclo & 1) == 0)) {\n                if (--texp == 0)\n                    roundBit = (int)(*pclo & 1);\n                rshift128(pclo, pchi);\n                overhang = (guint32)(*pchi >> 32);\n            }\n            */\n            if (overhang > 0)\n            {\n                int msf = my_g_bit_nth_msf(overhang);\n                int shift = msf - (DECIMAL_MAX_INTFACTORS + 2);\n\n                if (shift >= texp)\n                    shift = texp - 1;\n\n                if (shift > 0)\n                {\n                    texp -= shift;\n                    *pclo = (*pclo >> shift) | ((*pchi & ((1 << shift) - 1)) << (64 - shift));\n                    *pchi >>= shift;\n                    overhang >>= shift;\n\n                    IL2CPP_ASSERT(texp > 0);\n                    IL2CPP_ASSERT(overhang > (2 << DECIMAL_MAX_INTFACTORS));\n                }\n            }\n            while (texp > 0 && (overhang > (2 << DECIMAL_MAX_INTFACTORS) || (*pclo & 1) == 0))\n            {\n                if (--texp == 0)\n                    roundBit = (int)(*pclo & 1);\n                rshift128(pclo, pchi);\n                overhang >>= 1;\n            }\n\n            if (texp > DECIMAL_MAX_INTFACTORS)\n                i = DECIMAL_MAX_INTFACTORS;\n            else\n                i = texp;\n            if (scale + i > maxScale)\n                i = maxScale - scale;\n            if (i == 0)\n                break;\n            texp -= i;\n            scale += i;\n            factor = constantsDecadeInt32Factors[i] >> i; /* 10^i/2^i=5^i */\n            mult128by32(pclo, pchi, factor, 0);\n            /*printf(\"3: %.17e\\n\", (((double)chi) * pow(2,64) + clo) * pow(10, -scale) * pow(2, -texp));*/\n        }\n\n        while (texp > 0)\n        {\n            if (--texp == 0)\n                roundBit = (int)(*pclo & 1);\n            rshift128(pclo, pchi);\n        }\n    }\n\n    while (scale > maxScale)\n    {\n        i = scale - maxScale;\n        if (i > DECIMAL_MAX_INTFACTORS)\n            i = DECIMAL_MAX_INTFACTORS;\n        scale -= i;\n        roundBit = div128by32(pclo, pchi, constantsDecadeInt32Factors[i], 0);\n    }\n\n    while (scale < minScale)\n    {\n        if (!roundFlag)\n            roundBit = 0;\n        i = minScale - scale;\n        if (i > DECIMAL_MAX_INTFACTORS)\n            i = DECIMAL_MAX_INTFACTORS;\n        scale += i;\n        rc = mult128by32(pclo, pchi, constantsDecadeInt32Factors[i], roundBit);\n        if (rc != DECIMAL_SUCCESS)\n            return rc;\n        roundBit = 0;\n    }\n\n    *pScale = scale;\n\n    return normalize128(pclo, pchi, pScale, roundFlag, roundBit);\n}\n\nstatic void div128DecadeFactor(uint64_t* palo, uint64_t* pahi, int powerOfTen)\n{\n    int idx, roundBit = 0;\n\n    while (powerOfTen > 0)\n    {\n        idx = (powerOfTen > DECIMAL_MAX_INTFACTORS) ? DECIMAL_MAX_INTFACTORS : powerOfTen;\n        powerOfTen -= idx;\n        roundBit = div128by32(palo, pahi, constantsDecadeInt32Factors[idx], 0);\n    }\n\n    if (roundBit)\n        roundUp128(palo, pahi);\n}\n\nstatic void buildIEEE754Double(double* pd, int sign, int texp, uint64_t mantisse)\n{\n    uint64_t* p = (uint64_t*)pd;\n\n    *p = (((uint64_t)sign) << 63) | (((uint64_t)((1023 + texp) & 0x7ff)) << 52) | mantisse;\n\n    NOT_IMPLEMENTED_NO_ASSERT(buildIEEE754Double, \"Endianess is not being considered\");\n}\n\n#else // NET_4_0\n\ntypedef enum\n{\n    IL2CPP_DECIMAL_OK,\n    IL2CPP_DECIMAL_OVERFLOW,\n    IL2CPP_DECIMAL_INVALID_ARGUMENT,\n    IL2CPP_DECIMAL_DIVBYZERO,\n    IL2CPP_DECIMAL_ARGUMENT_OUT_OF_RANGE\n} Il2CppDecimalStatus;\n\n#ifndef FC_GC_POLL\n#   define FC_GC_POLL()\n#endif\n\n// Double floating point Bias\n#define IL2CPP_DOUBLE_BIAS 1022\n\n// Single floating point Bias\n#define IL2CPP_SINGLE_BIAS 126\n\nstatic const uint32_t ten_to_nine = 1000000000U;\nstatic const uint32_t ten_to_ten_div_4 = 2500000000U;\n#define POWER10_MAX     9\n#define DECIMAL_NEG ((uint8_t)0x80)\n#define DECMAX 28\n#define DECIMAL_SCALE(dec)       ((dec).u.u.scale)\n#define DECIMAL_SIGN(dec)        ((dec).u.u.sign)\n#define DECIMAL_SIGNSCALE(dec)   ((dec).u.signscale)\n#define DECIMAL_LO32(dec)        ((dec).v.v.Lo32)\n#define DECIMAL_MID32(dec)       ((dec).v.v.Mid32)\n#define DECIMAL_HI32(dec)        ((dec).Hi32)\n#if IL2CPP_BYTE_ORDER != IL2CPP_LITTLE_ENDIAN\n# define DECIMAL_LO64_GET(dec)   (((uint64_t)((dec).v.v.Mid32) << 32) | (dec).v.v.Lo32)\n# define DECIMAL_LO64_SET(dec, value)   {(dec).v.v.Lo32 = (value); (dec).v.v.Mid32 = ((value) >> 32); }\n#else\n# define DECIMAL_LO64_GET(dec)    ((dec).v.Lo64)\n# define DECIMAL_LO64_SET(dec, value)   {(dec).v.Lo64 = value; }\n#endif\n\n#define DECIMAL_SETZERO(dec) {DECIMAL_LO32(dec) = 0; DECIMAL_MID32(dec) = 0; DECIMAL_HI32(dec) = 0; DECIMAL_SIGNSCALE(dec) = 0;}\n#define COPYDEC(dest, src) {DECIMAL_SIGNSCALE(dest) = DECIMAL_SIGNSCALE(src); DECIMAL_HI32(dest) = DECIMAL_HI32(src); \\\n    DECIMAL_MID32(dest) = DECIMAL_MID32(src); DECIMAL_LO32(dest) = DECIMAL_LO32(src); }\n\n#define DEC_SCALE_MAX   28\n#define POWER10_MAX     9\n\n#define OVFL_MAX_9_HI   4\n#define OVFL_MAX_9_MID  1266874889\n#define OVFL_MAX_9_LO   3047500985u\n\n#define OVFL_MAX_5_HI   42949\n#define OVFL_MAX_5_MID  2890341191\n\n#define OVFL_MAX_1_HI   429496729\n\ntypedef union\n{\n    uint64_t int64;\n    struct\n    {\n#if IL2CPP_BYTE_ORDER == IL2CPP_BIG_ENDIAN\n        uint32_t Hi;\n        uint32_t Lo;\n#else\n        uint32_t Lo;\n        uint32_t Hi;\n#endif\n    } u;\n} SPLIT64;\n\nstatic const SPLIT64    ten_to_eighteen = { 1000000000000000000ULL };\n\n#if IL2CPP_BYTE_ORDER == IL2CPP_BIG_ENDIAN\nconst Il2CppDouble_double ds2to64 = { { 0, IL2CPP_DOUBLE_BIAS + 65, 0, 0 } };\n#else\nconst Il2CppDouble_double ds2to64 = { { 0, 0, IL2CPP_DOUBLE_BIAS + 65, 0 } };\n#endif\n\n//\n// Data tables\n//\n\nstatic const uint32_t power10[POWER10_MAX + 1] =\n{\n    1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000\n};\n\n\nstatic const double double_power10[] =\n{\n    1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,\n    1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,\n    1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29,\n    1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39,\n    1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47, 1e48, 1e49,\n    1e50, 1e51, 1e52, 1e53, 1e54, 1e55, 1e56, 1e57, 1e58, 1e59,\n    1e60, 1e61, 1e62, 1e63, 1e64, 1e65, 1e66, 1e67, 1e68, 1e69,\n    1e70, 1e71, 1e72, 1e73, 1e74, 1e75, 1e76, 1e77, 1e78, 1e79,\n    1e80\n};\n\nconst SPLIT64 sdl_power10[] = { { 10000000000ULL },          // 1E10\n                                { 100000000000ULL }, // 1E11\n                                { 1000000000000ULL }, // 1E12\n                                { 10000000000000ULL }, // 1E13\n                                { 100000000000000ULL } }; // 1E14\n\nstatic const uint64_t long_power10[] =\n{\n    1,\n    10ULL,\n    100ULL,\n    1000ULL,\n    10000ULL,\n    100000ULL,\n    1000000ULL,\n    10000000ULL,\n    100000000ULL,\n    1000000000ULL,\n    10000000000ULL,\n    100000000000ULL,\n    1000000000000ULL,\n    10000000000000ULL,\n    100000000000000ULL,\n    1000000000000000ULL,\n    10000000000000000ULL,\n    100000000000000000ULL,\n    1000000000000000000ULL,\n    10000000000000000000ULL\n};\n\ntypedef struct\n{\n    uint32_t Hi, Mid, Lo;\n} DECOVFL;\n\nconst DECOVFL power_overflow[] =\n{\n    // This is a table of the largest values that can be in the upper two\n    // ULONGs of a 96-bit number that will not overflow when multiplied\n    // by a given power.  For the upper word, this is a table of\n    // 2^32 / 10^n for 1 <= n <= 9.  For the lower word, this is the\n    // remaining fraction part * 2^32.  2^32 = 4294967296.\n    //\n    { 429496729u, 2576980377u, 2576980377u }, // 10^1 remainder 0.6\n    { 42949672u,  4123168604u, 687194767u }, // 10^2 remainder 0.16\n    { 4294967u,   1271310319u, 2645699854u }, // 10^3 remainder 0.616\n    { 429496u,    3133608139u, 694066715u }, // 10^4 remainder 0.1616\n    { 42949u,     2890341191u, 2216890319u }, // 10^5 remainder 0.51616\n    { 4294u,      4154504685u, 2369172679u }, // 10^6 remainder 0.551616\n    { 429u,       2133437386u, 4102387834u }, // 10^7 remainder 0.9551616\n    { 42u,        4078814305u, 410238783u }, // 10^8 remainder 0.09991616\n    { 4u,         1266874889u, 3047500985u }, // 10^9 remainder 0.709551616\n};\n\n\n#define UInt32x32To64(a, b) ((uint64_t)((uint32_t)(a)) * (uint64_t)((uint32_t)(b)))\n#define Div64by32(num, den) ((uint32_t)((uint64_t)(num) / (uint32_t)(den)))\n#define Mod64by32(num, den) ((uint32_t)((uint64_t)(num) % (uint32_t)(den)))\n\nstatic double\nfnDblPower10(int ix)\n{\n    const int maxIx = (sizeof(double_power10) / sizeof(double_power10[0]));\n    IL2CPP_ASSERT(ix >= 0);\n    if (ix < maxIx)\n        return double_power10[ix];\n    return pow(10.0, ix);\n} // double fnDblPower10()\n\nstatic inline int64_t\nDivMod32by32(int32_t num, int32_t den)\n{\n    SPLIT64  sdl;\n\n    sdl.u.Lo = num / den;\n    sdl.u.Hi = num % den;\n    return sdl.int64;\n}\n\nstatic inline int64_t\nDivMod64by32(int64_t num, int32_t den)\n{\n    SPLIT64  sdl;\n\n    sdl.u.Lo = Div64by32(num, den);\n    sdl.u.Hi = Mod64by32(num, den);\n    return sdl.int64;\n}\n\nstatic uint64_t\nUInt64x64To128(SPLIT64 op1, SPLIT64 op2, uint64_t *hi)\n{\n    SPLIT64  tmp1;\n    SPLIT64  tmp2;\n    SPLIT64  tmp3;\n\n    tmp1.int64 = UInt32x32To64(op1.u.Lo, op2.u.Lo); // lo partial prod\n    tmp2.int64 = UInt32x32To64(op1.u.Lo, op2.u.Hi); // mid 1 partial prod\n    tmp1.u.Hi += tmp2.u.Lo;\n    if (tmp1.u.Hi < tmp2.u.Lo)  // test for carry\n        tmp2.u.Hi++;\n    tmp3.int64 = UInt32x32To64(op1.u.Hi, op2.u.Hi) + (uint64_t)tmp2.u.Hi;\n    tmp2.int64 = UInt32x32To64(op1.u.Hi, op2.u.Lo);\n    tmp1.u.Hi += tmp2.u.Lo;\n    if (tmp1.u.Hi < tmp2.u.Lo)  // test for carry\n        tmp2.u.Hi++;\n    tmp3.int64 += (uint64_t)tmp2.u.Hi;\n\n    *hi = tmp3.int64;\n    return tmp1.int64;\n}\n\n/**\n* FullDiv64By32:\n*\n* Entry:\n*   pdlNum  - Pointer to 64-bit dividend\n*   ulDen   - 32-bit divisor\n*\n* Purpose:\n*   Do full divide, yielding 64-bit result and 32-bit remainder.\n*\n* Exit:\n*   Quotient overwrites dividend.\n*   Returns remainder.\n*\n* Exceptions:\n*   None.\n*/\n// Was: FullDiv64By32\nstatic uint32_t\nFullDiv64By32(uint64_t *num, uint32_t den)\n{\n    SPLIT64  tmp;\n    SPLIT64  res;\n\n    tmp.int64 = *num;\n    res.u.Hi = 0;\n\n    if (tmp.u.Hi >= den)\n    {\n        // DivMod64by32 returns quotient in Lo, remainder in Hi.\n        //\n        res.u.Lo = tmp.u.Hi;\n        res.int64 = DivMod64by32(res.int64, den);\n        tmp.u.Hi = res.u.Hi;\n        res.u.Hi = res.u.Lo;\n    }\n\n    tmp.int64 = DivMod64by32(tmp.int64, den);\n    res.u.Lo = tmp.u.Lo;\n    *num = res.int64;\n    return tmp.u.Hi;\n}\n\n/***\n* SearchScale\n*\n* Entry:\n*   res_hi - Top uint32_t of quotient\n*   res_mid - Middle uint32_t of quotient\n*   res_lo - Bottom uint32_t of quotient\n*   scale  - Scale factor of quotient, range -DEC_SCALE_MAX to DEC_SCALE_MAX\n*\n* Purpose:\n*   Determine the max power of 10, <= 9, that the quotient can be scaled\n*   up by and still fit in 96 bits.\n*\n* Exit:\n*   Returns power of 10 to scale by, -1 if overflow error.\n*\n***********************************************************************/\n\nstatic int\nSearchScale(uint32_t res_hi, uint32_t res_mid, uint32_t res_lo, int scale)\n{\n    int   cur_scale;\n\n    // Quick check to stop us from trying to scale any more.\n    //\n    if (res_hi > OVFL_MAX_1_HI || scale >= DEC_SCALE_MAX)\n    {\n        cur_scale = 0;\n        goto HaveScale;\n    }\n\n    if (scale > DEC_SCALE_MAX - 9)\n    {\n        // We can't scale by 10^9 without exceeding the max scale factor.\n        // See if we can scale to the max.  If not, we'll fall into\n        // standard search for scale factor.\n        //\n        cur_scale = DEC_SCALE_MAX - scale;\n        if (res_hi < power_overflow[cur_scale - 1].Hi)\n            goto HaveScale;\n\n        if (res_hi == power_overflow[cur_scale - 1].Hi)\n        {\n        UpperEq:\n            if (res_mid > power_overflow[cur_scale - 1].Mid ||\n                (res_mid == power_overflow[cur_scale - 1].Mid && res_lo > power_overflow[cur_scale - 1].Lo))\n            {\n                cur_scale--;\n            }\n            goto HaveScale;\n        }\n    }\n    else if (res_hi < OVFL_MAX_9_HI || (res_hi == OVFL_MAX_9_HI && res_mid < OVFL_MAX_9_MID) || (res_hi == OVFL_MAX_9_HI && res_mid == OVFL_MAX_9_MID && res_lo <= OVFL_MAX_9_LO))\n        return 9;\n\n    // Search for a power to scale by < 9.  Do a binary search\n    // on power_overflow[].\n    //\n    cur_scale = 5;\n    if (res_hi < OVFL_MAX_5_HI)\n        cur_scale = 7;\n    else if (res_hi > OVFL_MAX_5_HI)\n        cur_scale = 3;\n    else\n        goto UpperEq;\n\n    // cur_scale is 3 or 7.\n    //\n    if (res_hi < power_overflow[cur_scale - 1].Hi)\n        cur_scale++;\n    else if (res_hi > power_overflow[cur_scale - 1].Hi)\n        cur_scale--;\n    else\n        goto UpperEq;\n\n    // cur_scale is 2, 4, 6, or 8.\n    //\n    // In all cases, we already found we could not use the power one larger.\n    // So if we can use this power, it is the biggest, and we're done.  If\n    // we can't use this power, the one below it is correct for all cases\n    // unless it's 10^1 -- we might have to go to 10^0 (no scaling).\n    //\n    if (res_hi > power_overflow[cur_scale - 1].Hi)\n        cur_scale--;\n\n    if (res_hi == power_overflow[cur_scale - 1].Hi)\n        goto UpperEq;\n\nHaveScale:\n    // cur_scale = largest power of 10 we can scale by without overflow,\n    // cur_scale < 9.  See if this is enough to make scale factor\n    // positive if it isn't already.\n    //\n    if (cur_scale + scale < 0)\n        cur_scale = -1;\n\n    return cur_scale;\n}\n\n/**\n* Div96By32\n*\n* Entry:\n*   rgulNum - Pointer to 96-bit dividend as array of uint32_ts, least-sig first\n*   ulDen   - 32-bit divisor.\n*\n* Purpose:\n*   Do full divide, yielding 96-bit result and 32-bit remainder.\n*\n* Exit:\n*   Quotient overwrites dividend.\n*   Returns remainder.\n*\n* Exceptions:\n*   None.\n*\n*/\nstatic uint32_t\nDiv96By32(uint32_t *num, uint32_t den)\n{\n    SPLIT64  tmp;\n\n    tmp.u.Hi = 0;\n\n    if (num[2] != 0)\n        goto Div3Word;\n\n    if (num[1] >= den)\n        goto Div2Word;\n\n    tmp.u.Hi = num[1];\n    num[1] = 0;\n    goto Div1Word;\n\nDiv3Word:\n    tmp.u.Lo = num[2];\n    tmp.int64 = DivMod64by32(tmp.int64, den);\n    num[2] = tmp.u.Lo;\nDiv2Word:\n    tmp.u.Lo = num[1];\n    tmp.int64 = DivMod64by32(tmp.int64, den);\n    num[1] = tmp.u.Lo;\nDiv1Word:\n    tmp.u.Lo = num[0];\n    tmp.int64 = DivMod64by32(tmp.int64, den);\n    num[0] = tmp.u.Lo;\n    return tmp.u.Hi;\n}\n\n/***\n* DecFixInt\n*\n* Entry:\n*   pdecRes - Pointer to Decimal result location\n*   operand  - Pointer to Decimal operand\n*\n* Purpose:\n*   Chop the value to integer.  Return remainder so Int() function\n*   can round down if non-zero.\n*\n* Exit:\n*   Returns remainder.\n*\n* Exceptions:\n*   None.\n*\n***********************************************************************/\n\nstatic uint32_t\nDecFixInt(Il2CppDecimal * result, Il2CppDecimal * operand)\n{\n    uint32_t   num[3];\n    uint32_t   rem;\n    uint32_t   pwr;\n    int     scale;\n\n    if (operand->u.u.scale > 0)\n    {\n        num[0] = operand->v.v.Lo32;\n        num[1] = operand->v.v.Mid32;\n        num[2] = operand->Hi32;\n        scale = operand->u.u.scale;\n        result->u.u.sign = operand->u.u.sign;\n        rem = 0;\n\n        do\n        {\n            if (scale > POWER10_MAX)\n                pwr = ten_to_nine;\n            else\n                pwr = power10[scale];\n\n            rem |= Div96By32(num, pwr);\n            scale -= 9;\n        }\n        while (scale > 0);\n\n        result->v.v.Lo32 = num[0];\n        result->v.v.Mid32 = num[1];\n        result->Hi32 = num[2];\n        result->u.u.scale = 0;\n\n        return rem;\n    }\n\n    COPYDEC(*result, *operand);\n    // Odd, the Microsoft code does not set result->reserved to zero on this case\n    return 0;\n}\n\n/**\n* ScaleResult:\n*\n* Entry:\n*   res - Array of uint32_ts with value, least-significant first.\n*   hi_res  - Index of last non-zero value in res.\n*   scale  - Scale factor for this value, range 0 - 2 * DEC_SCALE_MAX\n*\n* Purpose:\n*   See if we need to scale the result to fit it in 96 bits.\n*   Perform needed scaling.  Adjust scale factor accordingly.\n*\n* Exit:\n*   res updated in place, always 3 uint32_ts.\n*   New scale factor returned, -1 if overflow error.\n*\n*/\nstatic int\nScaleResult(uint32_t *res, int hi_res, int scale)\n{\n    int     new_scale;\n    int     cur;\n    uint32_t   pwr;\n    uint32_t   tmp;\n    uint32_t   sticky;\n    SPLIT64 sdlTmp;\n\n    // See if we need to scale the result.  The combined scale must\n    // be <= DEC_SCALE_MAX and the upper 96 bits must be zero.\n    //\n    // Start by figuring a lower bound on the scaling needed to make\n    // the upper 96 bits zero.  hi_res is the index into res[]\n    // of the highest non-zero uint32_t.\n    //\n    new_scale = hi_res * 32 - 64 - 1;\n    if (new_scale > 0)\n    {\n        // Find the MSB.\n        //\n        tmp = res[hi_res];\n        if (!(tmp & 0xFFFF0000))\n        {\n            new_scale -= 16;\n            tmp <<= 16;\n        }\n        if (!(tmp & 0xFF000000))\n        {\n            new_scale -= 8;\n            tmp <<= 8;\n        }\n        if (!(tmp & 0xF0000000))\n        {\n            new_scale -= 4;\n            tmp <<= 4;\n        }\n        if (!(tmp & 0xC0000000))\n        {\n            new_scale -= 2;\n            tmp <<= 2;\n        }\n        if (!(tmp & 0x80000000))\n        {\n            new_scale--;\n            tmp <<= 1;\n        }\n\n        // Multiply bit position by log10(2) to figure it's power of 10.\n        // We scale the log by 256.  log(2) = .30103, * 256 = 77.  Doing this\n        // with a multiply saves a 96-byte lookup table.  The power returned\n        // is <= the power of the number, so we must add one power of 10\n        // to make it's integer part zero after dividing by 256.\n        //\n        // Note: the result of this multiplication by an approximation of\n        // log10(2) have been exhaustively checked to verify it gives the\n        // correct result.  (There were only 95 to check...)\n        //\n        new_scale = ((new_scale * 77) >> 8) + 1;\n\n        // new_scale = min scale factor to make high 96 bits zero, 0 - 29.\n        // This reduces the scale factor of the result.  If it exceeds the\n        // current scale of the result, we'll overflow.\n        //\n        if (new_scale > scale)\n            return -1;\n    }\n    else\n        new_scale = 0;\n\n    // Make sure we scale by enough to bring the current scale factor\n    // into valid range.\n    //\n    if (new_scale < scale - DEC_SCALE_MAX)\n        new_scale = scale - DEC_SCALE_MAX;\n\n    if (new_scale != 0)\n    {\n        // Scale by the power of 10 given by new_scale.  Note that this is\n        // NOT guaranteed to bring the number within 96 bits -- it could\n        // be 1 power of 10 short.\n        //\n        scale -= new_scale;\n        sticky = 0;\n        sdlTmp.u.Hi = 0; // initialize remainder\n\n        for (;;)\n        {\n            sticky |= sdlTmp.u.Hi; // record remainder as sticky bit\n\n            if (new_scale > POWER10_MAX)\n                pwr = ten_to_nine;\n            else\n                pwr = power10[new_scale];\n\n            // Compute first quotient.\n            // DivMod64by32 returns quotient in Lo, remainder in Hi.\n            //\n            sdlTmp.int64 = DivMod64by32(res[hi_res], pwr);\n            res[hi_res] = sdlTmp.u.Lo;\n            cur = hi_res - 1;\n\n            if (cur >= 0)\n            {\n                // If first quotient was 0, update hi_res.\n                //\n                if (sdlTmp.u.Lo == 0)\n                    hi_res--;\n\n                // Compute subsequent quotients.\n                //\n                do\n                {\n                    sdlTmp.u.Lo = res[cur];\n                    sdlTmp.int64 = DivMod64by32(sdlTmp.int64, pwr);\n                    res[cur] = sdlTmp.u.Lo;\n                    cur--;\n                }\n                while (cur >= 0);\n            }\n\n            new_scale -= POWER10_MAX;\n            if (new_scale > 0)\n                continue; // scale some more\n\n            // If we scaled enough, hi_res would be 2 or less.  If not,\n            // divide by 10 more.\n            //\n            if (hi_res > 2)\n            {\n                new_scale = 1;\n                scale--;\n                continue; // scale by 10\n            }\n\n            // Round final result.  See if remainder >= 1/2 of divisor.\n            // If remainder == 1/2 divisor, round up if odd or sticky bit set.\n            //\n            pwr >>= 1;  // power of 10 always even\n            if (pwr <= sdlTmp.u.Hi && (pwr < sdlTmp.u.Hi ||\n                                       ((res[0] & 1) | sticky)))\n            {\n                cur = -1;\n                while (++res[++cur] == 0)\n                    ;\n\n                if (cur > 2)\n                {\n                    // The rounding caused us to carry beyond 96 bits.\n                    // Scale by 10 more.\n                    //\n                    hi_res = cur;\n                    sticky = 0;  // no sticky bit\n                    sdlTmp.u.Hi = 0; // or remainder\n                    new_scale = 1;\n                    scale--;\n                    continue; // scale by 10\n                }\n            }\n\n            // We may have scaled it more than we planned.  Make sure the scale\n            // factor hasn't gone negative, indicating overflow.\n            //\n            if (scale < 0)\n                return -1;\n\n            return scale;\n        } // for(;;)\n    }\n    return scale;\n}\n\n// Returns: IL2CPP_DECIMAL_OK, or IL2CPP_DECIMAL_INVALID_ARGUMENT\nstatic Il2CppDecimalStatus\nil2cpp_decimal_to_double_result(Il2CppDecimal *input, double *result)\n{\n    SPLIT64  tmp;\n    double   dbl;\n\n    if (DECIMAL_SCALE(*input) > DECMAX || (DECIMAL_SIGN(*input) & ~DECIMAL_NEG) != 0)\n        return IL2CPP_DECIMAL_INVALID_ARGUMENT;\n\n    tmp.u.Lo = DECIMAL_LO32(*input);\n    tmp.u.Hi = DECIMAL_MID32(*input);\n\n    if ((int32_t)DECIMAL_MID32(*input) < 0)\n        dbl = (ds2to64.d + (double)(int64_t)tmp.int64 +\n               (double)DECIMAL_HI32(*input) * ds2to64.d) / fnDblPower10(DECIMAL_SCALE(*input));\n    else\n        dbl = ((double)(int64_t)tmp.int64 +\n               (double)DECIMAL_HI32(*input) * ds2to64.d) / fnDblPower10(DECIMAL_SCALE(*input));\n\n    if (DECIMAL_SIGN(*input))\n        dbl = -dbl;\n\n    *result = dbl;\n    return IL2CPP_DECIMAL_OK;\n}\n\n// Returns: IL2CPP_DECIMAL_OK, or IL2CPP_DECIMAL_INVALID_ARGUMENT\nstatic Il2CppDecimalStatus\nil2cpp_decimal_to_float_result(Il2CppDecimal *input, float *result)\n{\n    double   dbl;\n\n    if (DECIMAL_SCALE(*input) > DECMAX || (DECIMAL_SIGN(*input) & ~DECIMAL_NEG) != 0)\n        return IL2CPP_DECIMAL_INVALID_ARGUMENT;\n\n    // Can't overflow; no errors possible.\n    //\n    il2cpp_decimal_to_double_result(input, &dbl);\n    *result = (float)dbl;\n    return IL2CPP_DECIMAL_OK;\n}\n\nstatic Il2CppDecimalStatus\nDecAddSub(Il2CppDecimal *left, Il2CppDecimal *right, Il2CppDecimal *result, int8_t sign)\n{\n    uint32_t     num[6];\n    uint32_t     pwr;\n    int       scale;\n    int       hi_prod;\n    int       cur;\n    SPLIT64   tmp;\n    Il2CppDecimal decRes;\n    Il2CppDecimal decTmp;\n    Il2CppDecimal *pdecTmp;\n\n    sign ^= (right->u.u.sign ^ left->u.u.sign) & DECIMAL_NEG;\n\n    if (right->u.u.scale == left->u.u.scale)\n    {\n        // Scale factors are equal, no alignment necessary.\n        //\n        decRes.u.signscale = left->u.signscale;\n\n    AlignedAdd:\n        if (sign)\n        {\n            // Signs differ - subtract\n            //\n            DECIMAL_LO64_SET(decRes, DECIMAL_LO64_GET(*left) - DECIMAL_LO64_GET(*right));\n            DECIMAL_HI32(decRes) = DECIMAL_HI32(*left) - DECIMAL_HI32(*right);\n\n            // Propagate carry\n            //\n            if (DECIMAL_LO64_GET(decRes) > DECIMAL_LO64_GET(*left))\n            {\n                decRes.Hi32--;\n                if (decRes.Hi32 >= left->Hi32)\n                    goto SignFlip;\n            }\n            else if (decRes.Hi32 > left->Hi32)\n            {\n                // Got negative result.  Flip its sign.\n                //\n            SignFlip:\n                DECIMAL_LO64_SET(decRes, (uint64_t)DECIMAL_LO64_GET(decRes));\n                decRes.Hi32 = ~decRes.Hi32;\n                if (DECIMAL_LO64_GET(decRes) == 0)\n                    decRes.Hi32++;\n                decRes.u.u.sign ^= DECIMAL_NEG;\n            }\n        }\n        else\n        {\n            // Signs are the same - add\n            //\n            DECIMAL_LO64_SET(decRes, DECIMAL_LO64_GET(*left) + DECIMAL_LO64_GET(*right));\n            decRes.Hi32 = left->Hi32 + right->Hi32;\n\n            // Propagate carry\n            //\n            if (DECIMAL_LO64_GET(decRes) < DECIMAL_LO64_GET(*left))\n            {\n                decRes.Hi32++;\n                if (decRes.Hi32 <= left->Hi32)\n                    goto AlignedScale;\n            }\n            else if (decRes.Hi32 < left->Hi32)\n            {\n            AlignedScale:\n                // The addition carried above 96 bits.  Divide the result by 10,\n                // dropping the scale factor.\n                //\n                if (decRes.u.u.scale == 0)\n                    return IL2CPP_DECIMAL_OVERFLOW;\n                decRes.u.u.scale--;\n\n                tmp.u.Lo = decRes.Hi32;\n                tmp.u.Hi = 1;\n                tmp.int64 = DivMod64by32(tmp.int64, 10);\n                decRes.Hi32 = tmp.u.Lo;\n\n                tmp.u.Lo = decRes.v.v.Mid32;\n                tmp.int64 = DivMod64by32(tmp.int64, 10);\n                decRes.v.v.Mid32 = tmp.u.Lo;\n\n                tmp.u.Lo = decRes.v.v.Lo32;\n                tmp.int64 = DivMod64by32(tmp.int64, 10);\n                decRes.v.v.Lo32 = tmp.u.Lo;\n\n                // See if we need to round up.\n                //\n                if (tmp.u.Hi >= 5 && (tmp.u.Hi > 5 || (decRes.v.v.Lo32 & 1)))\n                {\n                    DECIMAL_LO64_SET(decRes, DECIMAL_LO64_GET(decRes) + 1)\n                    if (DECIMAL_LO64_GET(decRes) == 0)\n                        decRes.Hi32++;\n                }\n            }\n        }\n    }\n    else\n    {\n        // Scale factors are not equal.  Assume that a larger scale\n        // factor (more decimal places) is likely to mean that number\n        // is smaller.  Start by guessing that the right operand has\n        // the larger scale factor.  The result will have the larger\n        // scale factor.\n        //\n        decRes.u.u.scale = right->u.u.scale;  // scale factor of \"smaller\"\n        decRes.u.u.sign = left->u.u.sign;    // but sign of \"larger\"\n        scale = decRes.u.u.scale - left->u.u.scale;\n\n        if (scale < 0)\n        {\n            // Guessed scale factor wrong. Swap operands.\n            //\n            scale = -scale;\n            decRes.u.u.scale = left->u.u.scale;\n            decRes.u.u.sign ^= sign;\n            pdecTmp = right;\n            right = left;\n            left = pdecTmp;\n        }\n\n        // *left will need to be multiplied by 10^scale so\n        // it will have the same scale as *right.  We could be\n        // extending it to up to 192 bits of precision.\n        //\n        if (scale <= POWER10_MAX)\n        {\n            // Scaling won't make it larger than 4 uint32_ts\n            //\n            pwr = power10[scale];\n            DECIMAL_LO64_SET(decTmp, UInt32x32To64(left->v.v.Lo32, pwr));\n            tmp.int64 = UInt32x32To64(left->v.v.Mid32, pwr);\n            tmp.int64 += decTmp.v.v.Mid32;\n            decTmp.v.v.Mid32 = tmp.u.Lo;\n            decTmp.Hi32 = tmp.u.Hi;\n            tmp.int64 = UInt32x32To64(left->Hi32, pwr);\n            tmp.int64 += decTmp.Hi32;\n            if (tmp.u.Hi == 0)\n            {\n                // Result fits in 96 bits.  Use standard aligned add.\n                //\n                decTmp.Hi32 = tmp.u.Lo;\n                left = &decTmp;\n                goto AlignedAdd;\n            }\n            num[0] = decTmp.v.v.Lo32;\n            num[1] = decTmp.v.v.Mid32;\n            num[2] = tmp.u.Lo;\n            num[3] = tmp.u.Hi;\n            hi_prod = 3;\n        }\n        else\n        {\n            // Have to scale by a bunch.  Move the number to a buffer\n            // where it has room to grow as it's scaled.\n            //\n            num[0] = left->v.v.Lo32;\n            num[1] = left->v.v.Mid32;\n            num[2] = left->Hi32;\n            hi_prod = 2;\n\n            // Scan for zeros in the upper words.\n            //\n            if (num[2] == 0)\n            {\n                hi_prod = 1;\n                if (num[1] == 0)\n                {\n                    hi_prod = 0;\n                    if (num[0] == 0)\n                    {\n                        // Left arg is zero, return right.\n                        //\n                        DECIMAL_LO64_SET(decRes, DECIMAL_LO64_GET(*right));\n                        decRes.Hi32 = right->Hi32;\n                        decRes.u.u.sign ^= sign;\n                        goto RetDec;\n                    }\n                }\n            }\n\n            // Scaling loop, up to 10^9 at a time.  hi_prod stays updated\n            // with index of highest non-zero uint32_t.\n            //\n            for (; scale > 0; scale -= POWER10_MAX)\n            {\n                if (scale > POWER10_MAX)\n                    pwr = ten_to_nine;\n                else\n                    pwr = power10[scale];\n\n                tmp.u.Hi = 0;\n                for (cur = 0; cur <= hi_prod; cur++)\n                {\n                    tmp.int64 = UInt32x32To64(num[cur], pwr) + tmp.u.Hi;\n                    num[cur] = tmp.u.Lo;\n                }\n\n                if (tmp.u.Hi != 0)\n                    // We're extending the result by another uint32_t.\n                    num[++hi_prod] = tmp.u.Hi;\n            }\n        }\n\n        // Scaling complete, do the add.  Could be subtract if signs differ.\n        //\n        tmp.u.Lo = num[0];\n        tmp.u.Hi = num[1];\n\n        if (sign)\n        {\n            // Signs differ, subtract.\n            //\n            DECIMAL_LO64_SET(decRes, tmp.int64 - DECIMAL_LO64_GET(*right));\n            decRes.Hi32 = num[2] - right->Hi32;\n\n            // Propagate carry\n            //\n            if (DECIMAL_LO64_GET(decRes) > tmp.int64)\n            {\n                decRes.Hi32--;\n                if (decRes.Hi32 >= num[2])\n                    goto LongSub;\n            }\n            else if (decRes.Hi32 > num[2])\n            {\n            LongSub:\n                // If num has more than 96 bits of precision, then we need to\n                // carry the subtraction into the higher bits.  If it doesn't,\n                // then we subtracted in the wrong order and have to flip the\n                // sign of the result.\n                //\n                if (hi_prod <= 2)\n                    goto SignFlip;\n\n                cur = 3;\n                while (num[cur++]-- == 0)\n                    ;\n                if (num[hi_prod] == 0)\n                    hi_prod--;\n            }\n        }\n        else\n        {\n            // Signs the same, add.\n            //\n            DECIMAL_LO64_SET(decRes, tmp.int64 + DECIMAL_LO64_GET(*right));\n            decRes.Hi32 = num[2] + right->Hi32;\n\n            // Propagate carry\n            //\n            if (DECIMAL_LO64_GET(decRes) < tmp.int64)\n            {\n                decRes.Hi32++;\n                if (decRes.Hi32 <= num[2])\n                    goto LongAdd;\n            }\n            else if (decRes.Hi32 < num[2])\n            {\n            LongAdd:\n                // Had a carry above 96 bits.\n                //\n                cur = 3;\n                do\n                {\n                    if (hi_prod < cur)\n                    {\n                        num[cur] = 1;\n                        hi_prod = cur;\n                        break;\n                    }\n                }\n                while (++num[cur++] == 0);\n            }\n        }\n\n        if (hi_prod > 2)\n        {\n            num[0] = decRes.v.v.Lo32;\n            num[1] = decRes.v.v.Mid32;\n            num[2] = decRes.Hi32;\n            decRes.u.u.scale = ScaleResult(num, hi_prod, decRes.u.u.scale);\n            if (decRes.u.u.scale == (uint8_t)-1)\n                return IL2CPP_DECIMAL_OVERFLOW;\n\n            decRes.v.v.Lo32 = num[0];\n            decRes.v.v.Mid32 = num[1];\n            decRes.Hi32 = num[2];\n        }\n    }\n\nRetDec:\n    COPYDEC(*result, decRes);\n    // Odd, the Microsoft code does not set result->reserved to zero on this case\n    return IL2CPP_DECIMAL_OK;\n}\n\n// Returns IL2CPP_DECIMAL_OK or IL2CPP_DECIMAL_OVERFLOW\nstatic Il2CppDecimalStatus\nil2cpp_decimal_from_double(double input_d, Il2CppDecimal *result)\n{\n    int         exp;    // number of bits to left of binary point\n    int         power;  // power-of-10 scale factor\n    SPLIT64     sdlMant;\n    SPLIT64     sdlLo;\n    double      dbl;\n    int         lmax, cur;  // temps used during scale reduction\n    uint32_t       pwr_cur;\n    uint32_t       quo;\n    Il2CppDouble_double input;\n    input.d = input_d;\n\n    // The most we can scale by is 10^28, which is just slightly more\n    // than 2^93.  So a float with an exponent of -94 could just\n    // barely reach 0.5, but smaller exponents will always round to zero.\n    //\n    if ((exp = input.s.exp - IL2CPP_DOUBLE_BIAS) < -94)\n    {\n        DECIMAL_SETZERO(*result);\n        return IL2CPP_DECIMAL_OK;\n    }\n\n    if (exp > 96)\n        return IL2CPP_DECIMAL_OVERFLOW;\n\n    // Round the input to a 15-digit integer.  The R8 format has\n    // only 15 digits of precision, and we want to keep garbage digits\n    // out of the Decimal were making.\n    //\n    // Calculate max power of 10 input value could have by multiplying\n    // the exponent by log10(2).  Using scaled integer multiplcation,\n    // log10(2) * 2 ^ 16 = .30103 * 65536 = 19728.3.\n    //\n    dbl = fabs(input.d);\n    power = 14 - ((exp * 19728) >> 16);\n\n    if (power >= 0)\n    {\n        // We have less than 15 digits, scale input up.\n        //\n        if (power > DECMAX)\n            power = DECMAX;\n\n        dbl = dbl * double_power10[power];\n    }\n    else\n    {\n        if (power != -1 || dbl >= 1E15)\n            dbl = dbl / fnDblPower10(-power);\n        else\n            power = 0; // didn't scale it\n    }\n\n    IL2CPP_ASSERT(dbl < 1E15);\n    if (dbl < 1E14 && power < DECMAX)\n    {\n        dbl *= 10;\n        power++;\n        IL2CPP_ASSERT(dbl >= 1E14);\n    }\n\n    // Round to int64\n    //\n    sdlMant.int64 = (int64_t)dbl;\n    dbl -= (double)(int64_t)sdlMant.int64;  // dif between input & integer\n    if (dbl > 0.5 || (dbl == 0.5 && (sdlMant.u.Lo & 1)))\n        sdlMant.int64++;\n\n    if (sdlMant.int64 == 0)\n    {\n        DECIMAL_SETZERO(*result);\n        return IL2CPP_DECIMAL_OK;\n    }\n\n    if (power < 0)\n    {\n        // Add -power factors of 10, -power <= (29 - 15) = 14.\n        //\n        power = -power;\n        if (power < 10)\n        {\n            sdlLo.int64 = UInt32x32To64(sdlMant.u.Lo, (uint32_t)long_power10[power]);\n            sdlMant.int64 = UInt32x32To64(sdlMant.u.Hi, (uint32_t)long_power10[power]);\n            sdlMant.int64 += sdlLo.u.Hi;\n            sdlLo.u.Hi = sdlMant.u.Lo;\n            sdlMant.u.Lo = sdlMant.u.Hi;\n        }\n        else\n        {\n            // Have a big power of 10.\n            //\n            IL2CPP_ASSERT(power <= 14);\n            sdlLo.int64 = UInt64x64To128(sdlMant, sdl_power10[power - 10], &sdlMant.int64);\n\n            if (sdlMant.u.Hi != 0)\n                return IL2CPP_DECIMAL_OVERFLOW;\n        }\n        DECIMAL_LO32(*result) = sdlLo.u.Lo;\n        DECIMAL_MID32(*result) = sdlLo.u.Hi;\n        DECIMAL_HI32(*result) = sdlMant.u.Lo;\n        DECIMAL_SCALE(*result) = 0;\n    }\n    else\n    {\n        // Factor out powers of 10 to reduce the scale, if possible.\n        // The maximum number we could factor out would be 14.  This\n        // comes from the fact we have a 15-digit number, and the\n        // MSD must be non-zero -- but the lower 14 digits could be\n        // zero.  Note also the scale factor is never negative, so\n        // we can't scale by any more than the power we used to\n        // get the integer.\n        //\n        // DivMod64by32 returns the quotient in Lo, the remainder in Hi.\n        //\n        lmax = std::min(power, 14);\n\n        // lmax is the largest power of 10 to try, lmax <= 14.\n        // We'll try powers 8, 4, 2, and 1 unless they're too big.\n        //\n        for (cur = 8; cur > 0; cur >>= 1)\n        {\n            if (cur > lmax)\n                continue;\n\n            pwr_cur = (uint32_t)long_power10[cur];\n\n            if (sdlMant.u.Hi >= pwr_cur)\n            {\n                // Overflow if we try to divide in one step.\n                //\n                sdlLo.int64 = DivMod64by32(sdlMant.u.Hi, pwr_cur);\n                quo = sdlLo.u.Lo;\n                sdlLo.u.Lo = sdlMant.u.Lo;\n                sdlLo.int64 = DivMod64by32(sdlLo.int64, pwr_cur);\n            }\n            else\n            {\n                quo = 0;\n                sdlLo.int64 = DivMod64by32(sdlMant.int64, pwr_cur);\n            }\n\n            if (sdlLo.u.Hi == 0)\n            {\n                sdlMant.u.Hi = quo;\n                sdlMant.u.Lo = sdlLo.u.Lo;\n                power -= cur;\n                lmax -= cur;\n            }\n        }\n\n        DECIMAL_HI32(*result) = 0;\n        DECIMAL_SCALE(*result) = power;\n        DECIMAL_LO32(*result) = sdlMant.u.Lo;\n        DECIMAL_MID32(*result) = sdlMant.u.Hi;\n    }\n\n    DECIMAL_SIGN(*result) = (char)input.s.sign << 7;\n    return IL2CPP_DECIMAL_OK;\n}\n\n// Decimal multiply\n// Returns: IL2CPP_DECIMAL_OVERFLOW or IL2CPP_DECIMAL_OK\nstatic Il2CppDecimalStatus il2cpp_decimal_multiply_result(Il2CppDecimal *left, Il2CppDecimal *right, Il2CppDecimal *result)\n{\n    SPLIT64 tmp;\n    SPLIT64 tmp2;\n    SPLIT64 tmp3;\n    int     scale;\n    int     hi_prod;\n    uint32_t   pwr;\n    uint32_t   rem_lo;\n    uint32_t   rem_hi;\n    uint32_t   prod[6];\n\n    scale = left->u.u.scale + right->u.u.scale;\n\n    if ((left->Hi32 | left->v.v.Mid32 | right->Hi32 | right->v.v.Mid32) == 0)\n    {\n        // Upper 64 bits are zero.\n        //\n        tmp.int64 = UInt32x32To64(left->v.v.Lo32, right->v.v.Lo32);\n        if (scale > DEC_SCALE_MAX)\n        {\n            // Result scale is too big.  Divide result by power of 10 to reduce it.\n            // If the amount to divide by is > 19 the result is guaranteed\n            // less than 1/2.  [max value in 64 bits = 1.84E19]\n            //\n            scale -= DEC_SCALE_MAX;\n            if (scale > 19)\n            {\n            ReturnZero:\n                DECIMAL_SETZERO(*result);\n                return IL2CPP_DECIMAL_OK;\n            }\n\n            if (scale > POWER10_MAX)\n            {\n                // Divide by 1E10 first, to get the power down to a 32-bit quantity.\n                // 1E10 itself doesn't fit in 32 bits, so we'll divide by 2.5E9 now\n                // then multiply the next divisor by 4 (which will be a max of 4E9).\n                //\n                rem_lo = FullDiv64By32(&tmp.int64, ten_to_ten_div_4);\n                pwr = power10[scale - 10] << 2;\n            }\n            else\n            {\n                pwr = power10[scale];\n                rem_lo = 0;\n            }\n\n            // Power to divide by fits in 32 bits.\n            //\n            rem_hi = FullDiv64By32(&tmp.int64, pwr);\n\n            // Round result.  See if remainder >= 1/2 of divisor.\n            // Divisor is a power of 10, so it is always even.\n            //\n            pwr >>= 1;\n            if (rem_hi >= pwr && (rem_hi > pwr || (rem_lo | (tmp.u.Lo & 1))))\n                tmp.int64++;\n\n            scale = DEC_SCALE_MAX;\n        }\n        DECIMAL_LO32(*result) = tmp.u.Lo;\n        DECIMAL_MID32(*result) = tmp.u.Hi;\n        DECIMAL_HI32(*result) = 0;\n    }\n    else\n    {\n        // At least one operand has bits set in the upper 64 bits.\n        //\n        // Compute and accumulate the 9 partial products into a\n        // 192-bit (24-byte) result.\n        //\n        //                [l-h][l-m][l-l]   left high, middle, low\n        //             x  [r-h][r-m][r-l]   right high, middle, low\n        // ------------------------------\n        //\n        //                     [0-h][0-l]   l-l * r-l\n        //                [1ah][1al]        l-l * r-m\n        //                [1bh][1bl]        l-m * r-l\n        //           [2ah][2al]             l-m * r-m\n        //           [2bh][2bl]             l-l * r-h\n        //           [2ch][2cl]             l-h * r-l\n        //      [3ah][3al]                  l-m * r-h\n        //      [3bh][3bl]                  l-h * r-m\n        // [4-h][4-l]                       l-h * r-h\n        // ------------------------------\n        // [p-5][p-4][p-3][p-2][p-1][p-0]   prod[] array\n        //\n        tmp.int64 = UInt32x32To64(left->v.v.Lo32, right->v.v.Lo32);\n        prod[0] = tmp.u.Lo;\n\n        tmp2.int64 = UInt32x32To64(left->v.v.Lo32, right->v.v.Mid32) + tmp.u.Hi;\n\n        tmp.int64 = UInt32x32To64(left->v.v.Mid32, right->v.v.Lo32);\n        tmp.int64 += tmp2.int64; // this could generate carry\n        prod[1] = tmp.u.Lo;\n        if (tmp.int64 < tmp2.int64) // detect carry\n            tmp2.u.Hi = 1;\n        else\n            tmp2.u.Hi = 0;\n        tmp2.u.Lo = tmp.u.Hi;\n\n        tmp.int64 = UInt32x32To64(left->v.v.Mid32, right->v.v.Mid32) + tmp2.int64;\n\n        if (left->Hi32 | right->Hi32)\n        {\n            // Highest 32 bits is non-zero.  Calculate 5 more partial products.\n            //\n            tmp2.int64 = UInt32x32To64(left->v.v.Lo32, right->Hi32);\n            tmp.int64 += tmp2.int64; // this could generate carry\n            if (tmp.int64 < tmp2.int64) // detect carry\n                tmp3.u.Hi = 1;\n            else\n                tmp3.u.Hi = 0;\n\n            tmp2.int64 = UInt32x32To64(left->Hi32, right->v.v.Lo32);\n            tmp.int64 += tmp2.int64; // this could generate carry\n            prod[2] = tmp.u.Lo;\n            if (tmp.int64 < tmp2.int64) // detect carry\n                tmp3.u.Hi++;\n            tmp3.u.Lo = tmp.u.Hi;\n\n            tmp.int64 = UInt32x32To64(left->v.v.Mid32, right->Hi32);\n            tmp.int64 += tmp3.int64; // this could generate carry\n            if (tmp.int64 < tmp3.int64) // detect carry\n                tmp3.u.Hi = 1;\n            else\n                tmp3.u.Hi = 0;\n\n            tmp2.int64 = UInt32x32To64(left->Hi32, right->v.v.Mid32);\n            tmp.int64 += tmp2.int64; // this could generate carry\n            prod[3] = tmp.u.Lo;\n            if (tmp.int64 < tmp2.int64) // detect carry\n                tmp3.u.Hi++;\n            tmp3.u.Lo = tmp.u.Hi;\n\n            tmp.int64 = UInt32x32To64(left->Hi32, right->Hi32) + tmp3.int64;\n            prod[4] = tmp.u.Lo;\n            prod[5] = tmp.u.Hi;\n\n            hi_prod = 5;\n        }\n        else\n        {\n            prod[2] = tmp.u.Lo;\n            prod[3] = tmp.u.Hi;\n            hi_prod = 3;\n        }\n\n        // Check for leading zero uint32_ts on the product\n        //\n        while (prod[hi_prod] == 0)\n        {\n            hi_prod--;\n            if (hi_prod < 0)\n                goto ReturnZero;\n        }\n\n        scale = ScaleResult(prod, hi_prod, scale);\n        if (scale == -1)\n            return IL2CPP_DECIMAL_OVERFLOW;\n\n        result->v.v.Lo32 = prod[0];\n        result->v.v.Mid32 = prod[1];\n        result->Hi32 = prod[2];\n    }\n\n    result->u.u.sign = right->u.u.sign ^ left->u.u.sign;\n    result->u.u.scale = (char)scale;\n    return IL2CPP_DECIMAL_OK;\n}\n\n// Add a 32 bit unsigned long to an array of 3 unsigned longs representing a 96 integer\n// Returns FALSE if there is an overflow\nstatic bool\nAdd32To96(uint32_t *num, uint32_t value)\n{\n    num[0] += value;\n    if (num[0] < value)\n    {\n        if (++num[1] == 0)\n        {\n            if (++num[2] == 0)\n            {\n                return false;\n            }\n        }\n    }\n    return true;\n}\n\nstatic void\nOverflowUnscale(uint32_t *quo, bool remainder)\n{\n    SPLIT64  sdlTmp;\n\n    // We have overflown, so load the high bit with a one.\n    sdlTmp.u.Hi = 1u;\n    sdlTmp.u.Lo = quo[2];\n    sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10u);\n    quo[2] = sdlTmp.u.Lo;\n    sdlTmp.u.Lo = quo[1];\n    sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10u);\n    quo[1] = sdlTmp.u.Lo;\n    sdlTmp.u.Lo = quo[0];\n    sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10u);\n    quo[0] = sdlTmp.u.Lo;\n    // The remainder is the last digit that does not fit, so we can use it to work out if we need to round up\n    if ((sdlTmp.u.Hi > 5) || ((sdlTmp.u.Hi == 5) && (remainder || (quo[0] & 1))))\n    {\n        Add32To96(quo, 1u);\n    }\n}\n\n/**\n* IncreaseScale:\n*\n* Entry:\n*   num - Pointer to 96-bit number as array of uint32_ts, least-sig first\n*   pwr   - Scale factor to multiply by\n*\n* Purpose:\n*   Multiply the two numbers.  The low 96 bits of the result overwrite\n*   the input.  The last 32 bits of the product are the return value.\n*\n* Exit:\n*   Returns highest 32 bits of product.\n*\n* Exceptions:\n*   None.\n*\n*/\nstatic uint32_t\nIncreaseScale(uint32_t *num, uint32_t pwr)\n{\n    SPLIT64   sdlTmp;\n\n    sdlTmp.int64 = UInt32x32To64(num[0], pwr);\n    num[0] = sdlTmp.u.Lo;\n    sdlTmp.int64 = UInt32x32To64(num[1], pwr) + sdlTmp.u.Hi;\n    num[1] = sdlTmp.u.Lo;\n    sdlTmp.int64 = UInt32x32To64(num[2], pwr) + sdlTmp.u.Hi;\n    num[2] = sdlTmp.u.Lo;\n    return sdlTmp.u.Hi;\n}\n\n/***\n* Div128By96\n*\n* Entry:\n*   rgulNum - Pointer to 128-bit dividend as array of uint32_ts, least-sig first\n*   den - Pointer to 96-bit divisor.\n*\n* Purpose:\n*   Do partial divide, yielding 32-bit result and 96-bit remainder.\n*   Top divisor uint32_t must be larger than top dividend uint32_t.  This is\n*   assured in the initial call because the divisor is normalized\n*   and the dividend can't be.  In subsequent calls, the remainder\n*   is multiplied by 10^9 (max), so it can be no more than 1/4 of\n*   the divisor which is effectively multiplied by 2^32 (4 * 10^9).\n*\n* Exit:\n*   Remainder overwrites lower 96-bits of dividend.\n*   Returns quotient.\n*\n* Exceptions:\n*   None.\n*\n***********************************************************************/\n\nstatic uint32_t\nDiv128By96(uint32_t *num, uint32_t *den)\n{\n    SPLIT64 sdlQuo;\n    SPLIT64 sdlNum;\n    SPLIT64 sdlProd1;\n    SPLIT64 sdlProd2;\n\n    sdlNum.u.Lo = num[0];\n    sdlNum.u.Hi = num[1];\n\n    if (num[3] == 0 && num[2] < den[2])\n    {\n        // Result is zero.  Entire dividend is remainder.\n        //\n        return 0;\n    }\n\n    // DivMod64by32 returns quotient in Lo, remainder in Hi.\n    //\n    sdlQuo.u.Lo = num[2];\n    sdlQuo.u.Hi = num[3];\n    sdlQuo.int64 = DivMod64by32(sdlQuo.int64, den[2]);\n\n    // Compute full remainder, rem = dividend - (quo * divisor).\n    //\n    sdlProd1.int64 = UInt32x32To64(sdlQuo.u.Lo, den[0]); // quo * lo divisor\n    sdlProd2.int64 = UInt32x32To64(sdlQuo.u.Lo, den[1]); // quo * mid divisor\n    sdlProd2.int64 += sdlProd1.u.Hi;\n    sdlProd1.u.Hi = sdlProd2.u.Lo;\n\n    sdlNum.int64 -= sdlProd1.int64;\n    num[2] = sdlQuo.u.Hi - sdlProd2.u.Hi; // sdlQuo.Hi is remainder\n\n    // Propagate carries\n    //\n    if (sdlNum.int64 > ~sdlProd1.int64)\n    {\n        num[2]--;\n        if (num[2] >= ~sdlProd2.u.Hi)\n            goto NegRem;\n    }\n    else if (num[2] > ~sdlProd2.u.Hi)\n    {\n    NegRem:\n        // Remainder went negative.  Add divisor back in until it's positive,\n        // a max of 2 times.\n        //\n        sdlProd1.u.Lo = den[0];\n        sdlProd1.u.Hi = den[1];\n\n        for (;;)\n        {\n            sdlQuo.u.Lo--;\n            sdlNum.int64 += sdlProd1.int64;\n            num[2] += den[2];\n\n            if (sdlNum.int64 < sdlProd1.int64)\n            {\n                // Detected carry. Check for carry out of top\n                // before adding it in.\n                //\n                if (num[2]++ < den[2])\n                    break;\n            }\n            if (num[2] < den[2])\n                break; // detected carry\n        }\n    }\n\n    num[0] = sdlNum.u.Lo;\n    num[1] = sdlNum.u.Hi;\n    return sdlQuo.u.Lo;\n}\n\n/**\n* Div96By64:\n*\n* Entry:\n*   rgulNum - Pointer to 96-bit dividend as array of uint32_ts, least-sig first\n*   sdlDen  - 64-bit divisor.\n*\n* Purpose:\n*   Do partial divide, yielding 32-bit result and 64-bit remainder.\n*   Divisor must be larger than upper 64 bits of dividend.\n*\n* Exit:\n*   Remainder overwrites lower 64-bits of dividend.\n*   Returns quotient.\n*\n* Exceptions:\n*   None.\n*\n*/\nstatic uint32_t\nDiv96By64(uint32_t *num, SPLIT64 den)\n{\n    SPLIT64 quo;\n    SPLIT64 sdlNum;\n    SPLIT64 prod;\n\n    sdlNum.u.Lo = num[0];\n\n    if (num[2] >= den.u.Hi)\n    {\n        // Divide would overflow.  Assume a quotient of 2^32, and set\n        // up remainder accordingly.  Then jump to loop which reduces\n        // the quotient.\n        //\n        sdlNum.u.Hi = num[1] - den.u.Lo;\n        quo.u.Lo = 0;\n        goto NegRem;\n    }\n\n    // Hardware divide won't overflow\n    //\n    if (num[2] == 0 && num[1] < den.u.Hi)\n        // Result is zero.  Entire dividend is remainder.\n        //\n        return 0;\n\n    // DivMod64by32 returns quotient in Lo, remainder in Hi.\n    //\n    quo.u.Lo = num[1];\n    quo.u.Hi = num[2];\n    quo.int64 = DivMod64by32(quo.int64, den.u.Hi);\n    sdlNum.u.Hi = quo.u.Hi; // remainder\n\n    // Compute full remainder, rem = dividend - (quo * divisor).\n    //\n    prod.int64 = UInt32x32To64(quo.u.Lo, den.u.Lo); // quo * lo divisor\n    sdlNum.int64 -= prod.int64;\n\n    if (sdlNum.int64 > ~prod.int64)\n    {\n    NegRem:\n        // Remainder went negative.  Add divisor back in until it's positive,\n        // a max of 2 times.\n        //\n        do\n        {\n            quo.u.Lo--;\n            sdlNum.int64 += den.int64;\n        }\n        while (sdlNum.int64 >= den.int64);\n    }\n\n    num[0] = sdlNum.u.Lo;\n    num[1] = sdlNum.u.Hi;\n    return quo.u.Lo;\n}\n\n//\n// Returns: IL2CPP_DECIMAL_INVALID_ARGUMENT, IL2CPP_DECIMAL_OK\n//\nstatic Il2CppDecimalStatus\nil2cpp_decimal_round_result(Il2CppDecimal *input, int cDecimals, Il2CppDecimal *result)\n{\n    uint32_t num[3];\n    uint32_t rem;\n    uint32_t sticky;\n    uint32_t pwr;\n    int scale;\n\n    if (cDecimals < 0)\n        return IL2CPP_DECIMAL_INVALID_ARGUMENT;\n\n    scale = input->u.u.scale - cDecimals;\n    if (scale > 0)\n    {\n        num[0] = input->v.v.Lo32;\n        num[1] = input->v.v.Mid32;\n        num[2] = input->Hi32;\n        result->u.u.sign = input->u.u.sign;\n        rem = sticky = 0;\n\n        do\n        {\n            sticky |= rem;\n            if (scale > POWER10_MAX)\n                pwr = ten_to_nine;\n            else\n                pwr = power10[scale];\n\n            rem = Div96By32(num, pwr);\n            scale -= 9;\n        }\n        while (scale > 0);\n\n        // Now round.  rem has last remainder, sticky has sticky bits.\n        // To do IEEE rounding, we add LSB of result to sticky bits so\n        // either causes round up if remainder * 2 == last divisor.\n        //\n        sticky |= num[0] & 1;\n        rem = (rem << 1) + (sticky != 0);\n        if (pwr < rem &&\n            ++num[0] == 0 &&\n            ++num[1] == 0\n            )\n            ++num[2];\n\n        result->v.v.Lo32 = num[0];\n        result->v.v.Mid32 = num[1];\n        result->Hi32 = num[2];\n        result->u.u.scale = cDecimals;\n        return IL2CPP_DECIMAL_OK;\n    }\n\n    COPYDEC(*result, *input);\n    // Odd, the Microsoft source does not set the result->reserved to zero here.\n    return IL2CPP_DECIMAL_OK;\n}\n\n//\n// Returns IL2CPP_DECIMAL_OK or IL2CPP_DECIMAL_OVERFLOW\nstatic Il2CppDecimalStatus\nil2cpp_decimal_from_float(float input_f, Il2CppDecimal* result)\n{\n    int         exp;    // number of bits to left of binary point\n    int         power;\n    uint32_t       mant;\n    double      dbl;\n    SPLIT64     sdlLo;\n    SPLIT64     sdlHi;\n    int         lmax, cur;  // temps used during scale reduction\n    Il2CppSingle_float input;\n    input.f = input_f;\n\n    // The most we can scale by is 10^28, which is just slightly more\n    // than 2^93.  So a float with an exponent of -94 could just\n    // barely reach 0.5, but smaller exponents will always round to zero.\n    //\n    if ((exp = input.s.exp - IL2CPP_SINGLE_BIAS) < -94)\n    {\n        DECIMAL_SETZERO(*result);\n        return IL2CPP_DECIMAL_OK;\n    }\n\n    if (exp > 96)\n        return IL2CPP_DECIMAL_OVERFLOW;\n\n    // Round the input to a 7-digit integer.  The R4 format has\n    // only 7 digits of precision, and we want to keep garbage digits\n    // out of the Decimal were making.\n    //\n    // Calculate max power of 10 input value could have by multiplying\n    // the exponent by log10(2).  Using scaled integer multiplcation,\n    // log10(2) * 2 ^ 16 = .30103 * 65536 = 19728.3.\n    //\n    dbl = fabs(input.f);\n    power = 6 - ((exp * 19728) >> 16);\n\n    if (power >= 0)\n    {\n        // We have less than 7 digits, scale input up.\n        //\n        if (power > DECMAX)\n            power = DECMAX;\n\n        dbl = dbl * double_power10[power];\n    }\n    else\n    {\n        if (power != -1 || dbl >= 1E7)\n            dbl = dbl / fnDblPower10(-power);\n        else\n            power = 0; // didn't scale it\n    }\n\n    IL2CPP_ASSERT(dbl < 1E7);\n    if (dbl < 1E6 && power < DECMAX)\n    {\n        dbl *= 10;\n        power++;\n        IL2CPP_ASSERT(dbl >= 1E6);\n    }\n\n    // Round to integer\n    //\n    mant = (int32_t)dbl;\n    dbl -= (double)mant;  // difference between input & integer\n    if (dbl > 0.5 || (dbl == 0.5 && (mant & 1)))\n        mant++;\n\n    if (mant == 0)\n    {\n        DECIMAL_SETZERO(*result);\n        return IL2CPP_DECIMAL_OK;\n    }\n\n    if (power < 0)\n    {\n        // Add -power factors of 10, -power <= (29 - 7) = 22.\n        //\n        power = -power;\n        if (power < 10)\n        {\n            sdlLo.int64 = UInt32x32To64(mant, (uint32_t)long_power10[power]);\n\n            DECIMAL_LO32(*result) = sdlLo.u.Lo;\n            DECIMAL_MID32(*result) = sdlLo.u.Hi;\n            DECIMAL_HI32(*result) = 0;\n        }\n        else\n        {\n            // Have a big power of 10.\n            //\n            if (power > 18)\n            {\n                sdlLo.int64 = UInt32x32To64(mant, (uint32_t)long_power10[power - 18]);\n                sdlLo.int64 = UInt64x64To128(sdlLo, ten_to_eighteen, &sdlHi.int64);\n\n                if (sdlHi.u.Hi != 0)\n                    return IL2CPP_DECIMAL_OVERFLOW;\n            }\n            else\n            {\n                sdlLo.int64 = UInt32x32To64(mant, (uint32_t)long_power10[power - 9]);\n                sdlHi.int64 = UInt32x32To64(ten_to_nine, sdlLo.u.Hi);\n                sdlLo.int64 = UInt32x32To64(ten_to_nine, sdlLo.u.Lo);\n                sdlHi.int64 += sdlLo.u.Hi;\n                sdlLo.u.Hi = sdlHi.u.Lo;\n                sdlHi.u.Lo = sdlHi.u.Hi;\n            }\n            DECIMAL_LO32(*result) = sdlLo.u.Lo;\n            DECIMAL_MID32(*result) = sdlLo.u.Hi;\n            DECIMAL_HI32(*result) = sdlHi.u.Lo;\n        }\n        DECIMAL_SCALE(*result) = 0;\n    }\n    else\n    {\n        // Factor out powers of 10 to reduce the scale, if possible.\n        // The maximum number we could factor out would be 6.  This\n        // comes from the fact we have a 7-digit number, and the\n        // MSD must be non-zero -- but the lower 6 digits could be\n        // zero.  Note also the scale factor is never negative, so\n        // we can't scale by any more than the power we used to\n        // get the integer.\n        //\n        // DivMod32by32 returns the quotient in Lo, the remainder in Hi.\n        //\n        lmax = std::min(power, 6);\n\n        // lmax is the largest power of 10 to try, lmax <= 6.\n        // We'll try powers 4, 2, and 1 unless they're too big.\n        //\n        for (cur = 4; cur > 0; cur >>= 1)\n        {\n            if (cur > lmax)\n                continue;\n\n            sdlLo.int64 = DivMod32by32(mant, (uint32_t)long_power10[cur]);\n\n            if (sdlLo.u.Hi == 0)\n            {\n                mant = sdlLo.u.Lo;\n                power -= cur;\n                lmax -= cur;\n            }\n        }\n        DECIMAL_LO32(*result) = mant;\n        DECIMAL_MID32(*result) = 0;\n        DECIMAL_HI32(*result) = 0;\n        DECIMAL_SCALE(*result) = power;\n    }\n\n    DECIMAL_SIGN(*result) = (char)input.s.sign << 7;\n    return IL2CPP_DECIMAL_OK;\n}\n\n// il2cpp_decimal_round_to_int - Decimal Int (round down to integer)\nstatic void\nil2cpp_decimal_round_to_int(Il2CppDecimal *pdecOprd, Il2CppDecimal *result)\n{\n    if (DecFixInt(result, pdecOprd) != 0 && (result->u.u.sign & DECIMAL_NEG))\n    {\n        // We have chopped off a non-zero amount from a negative value.  Since\n        // we round toward -infinity, we must increase the integer result by\n        // 1 to make it more negative.  This will never overflow because\n        // in order to have a remainder, we must have had a non-zero scale factor.\n        // Our scale factor is back to zero now.\n        //\n        DECIMAL_LO64_SET(*result, DECIMAL_LO64_GET(*result) + 1);\n        if (DECIMAL_LO64_GET(*result) == 0)\n            result->Hi32++;\n    }\n}\n\nstatic void\nil2cpp_decimal_fix(Il2CppDecimal *pdecOprd, Il2CppDecimal *result)\n{\n    DecFixInt(result, pdecOprd);\n}\n\n#endif // !NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n#if !NET_4_0\n    int Decimal::decimalSetExponent(il2cpp_decimal_repr* pA, int texp)\n    {\n        int scale = pA->u.signscale.scale;\n\n        scale -= texp;\n\n        if (scale < 0 || scale > DECIMAL_MAX_SCALE)\n        {\n            uint64_t alo;\n            uint64_t ahi;\n\n            DECTO128(pA, alo, ahi);\n            int status = rescale128(&alo, &ahi, &scale, 0, 0, DECIMAL_MAX_SCALE, 1);\n            if (status != DECIMAL_SUCCESS)\n                return status;\n\n            return pack128toDecimal(pA, alo, ahi, scale, pA->u.signscale.sign);\n        }\n        else\n        {\n            pA->u.signscale.scale = scale;\n            return DECIMAL_SUCCESS;\n        }\n    }\n\n    int Decimal::string2decimal(il2cpp_decimal_repr *pA, Il2CppString *str, unsigned int decrDecimal, int sign)\n    {\n        Il2CppChar* buf = utils::StringUtils::GetChars(str);\n        Il2CppChar* p;\n        uint64_t alo, ahi;\n        alo = ahi = 0;\n        int n, rc, i, len, sigLen = -1, firstNonZero;\n        int scale, roundBit = 0;\n\n        DECINIT(pA);\n\n        for (p = buf, len = 0; *p != 0; len++, p++)\n        {\n        }\n\n        for (p = buf, i = 0; *p != 0; i++, p++)\n        {\n            n = *p - '0';\n            if (n < 0 || n > 9)\n                return DECIMAL_INVALID_CHARACTER;\n\n            if (n)\n            {\n                if (sigLen < 0)\n                {\n                    firstNonZero = i;\n                    sigLen = (len - firstNonZero > DECIMAL_MAX_SCALE + 1) ? DECIMAL_MAX_SCALE + 1 + firstNonZero : len;\n                    if (decrDecimal > static_cast<uint32_t>(sigLen + 1))\n                        return DECIMAL_OVERFLOW;\n                }\n                if (i >= sigLen)\n                    break;\n                rc = incMultConstant128(&alo, &ahi, sigLen - 1 - i, n);\n                if (rc != DECIMAL_SUCCESS)\n                    return rc;\n            }\n        }\n\n        scale = sigLen - decrDecimal;\n\n        if (i < len) /* too much digits, we must round */\n        {\n            n = buf[i] - '0';\n            if (n < 0 || n > 9)\n            {\n                return DECIMAL_INVALID_CHARACTER;\n            }\n            if (n > 5)\n                roundBit = 1;\n            else if (n == 5) /* we must take a nearer look */\n            {\n                n = buf[i - 1] - '0';\n                for (++i; i < len; ++i)\n                {\n                    if (buf[i] != '0')\n                        break;            /* we are greater than .5 */\n                }\n                if (i < len /* greater than exactly .5 */\n                    || n % 2 == 1) /* exactly .5, use banker's rule for rounding */\n                {\n                    roundBit = 1;\n                }\n            }\n        }\n\n        if (ahi != 0)\n        {\n            rc = normalize128(&alo, &ahi, &scale, 1, roundBit);\n            if (rc != DECIMAL_SUCCESS)\n                return rc;\n        }\n\n        if (alo == 0 && ahi == 0)\n        {\n            DECINIT(pA);\n            return DECIMAL_SUCCESS;\n        }\n        else\n        {\n            return pack128toDecimal(pA, alo, ahi, sigLen - decrDecimal, sign);\n        }\n        return 0;\n    }\n\n    int Decimal::decimalCompare(il2cpp_decimal_repr *pA, il2cpp_decimal_repr *pB)\n    {\n        int log2a, log2b, delta, sign;\n        il2cpp_decimal_repr aa;\n\n        sign = (pA->u.signscale.sign) ? -1 : 1;\n\n        if (pA->u.signscale.sign ^ pB->u.signscale.sign)\n        {\n            return (decimalIsZero(pA) && decimalIsZero(pB)) ? 0 : sign;\n        }\n\n        /* try fast comparison via log2 */\n        log2a = decimalLog2(pA);\n        log2b = decimalLog2(pB);\n        delta = log2a - log2b;\n        /* decimalLog2 is not exact, so we can say nothing\n        if abs(delta) <= 1 */\n        if (delta < -1)\n            return -sign;\n        if (delta > 1)\n            return sign;\n\n        DECCOPY(&aa, pA);\n        DECNEGATE(&aa);\n        decimalIncr(&aa, pB);\n\n        if (decimalIsZero(&aa))\n            return 0;\n\n        return (aa.u.signscale.sign) ? 1 : -1;\n    }\n\n    int32_t Decimal::decimalIncr(il2cpp_decimal_repr * pA, il2cpp_decimal_repr * pB)\n    {\n        uint64_t alo, ahi, blo, bhi;\n        int log2A, log2B, log2Result, log10Result, rc;\n        int subFlag, sign, scaleA, scaleB;\n\n        DECTO128(pA, alo, ahi);\n        DECTO128(pB, blo, bhi);\n\n        sign = pA->u.signscale.sign;\n        subFlag = sign - (int)pB->u.signscale.sign;\n        scaleA = pA->u.signscale.scale;\n        scaleB = pB->u.signscale.scale;\n        if (scaleA == scaleB)\n        {\n            /* same scale, that's easy */\n            if (subFlag)\n            {\n                sub128(alo, ahi, blo, bhi, &alo, &ahi);\n                if (ahi & LIT_GUINT64_HIGHBIT)\n                {\n                    alo--;\n                    alo = ~alo;\n                    if (alo == 0)\n                        ahi--;\n                    ahi = ~ahi;\n                    sign = !sign;\n                }\n            }\n            else\n            {\n                add128(alo, ahi, blo, bhi, &alo, &ahi);\n            }\n            rc = normalize128(&alo, &ahi, &scaleA, 1, 0);\n        }\n        else\n        {\n            /* scales must be adjusted */\n            /* Estimate log10 and scale of result for adjusting scales */\n            log2A = log2withScale_128(alo, ahi, scaleA);\n            log2B = log2withScale_128(blo, bhi, scaleB);\n            log2Result = MAX(log2A, log2B);\n            if (!subFlag)\n                log2Result++;       /* result can have one bit more */\n            log10Result = (log2Result * 1000) / 3322 + 1;\n            /* we will calculate in 128bit, so we may need to adjust scale */\n            if (scaleB > scaleA)\n                scaleA = scaleB;\n            if (scaleA + log10Result > DECIMAL_MAX_SCALE + 7)\n            {\n                /* this may not fit in 128bit, so limit it */\n                scaleA = DECIMAL_MAX_SCALE + 7 - log10Result;\n            }\n\n            rc = adjustScale128(&alo, &ahi, scaleA - (int)pA->u.signscale.scale);\n            if (rc != DECIMAL_SUCCESS)\n                return rc;\n            rc = adjustScale128(&blo, &bhi, scaleA - scaleB);\n            if (rc != DECIMAL_SUCCESS)\n                return rc;\n\n            if (subFlag)\n            {\n                sub128(alo, ahi, blo, bhi, &alo, &ahi);\n                if (ahi & LIT_GUINT64_HIGHBIT)\n                {\n                    alo--;\n                    alo = ~alo;\n                    if (alo == 0)\n                        ahi--;\n                    ahi = ~ahi;\n                    sign = !sign;\n                }\n            }\n            else\n            {\n                add128(alo, ahi, blo, bhi, &alo, &ahi);\n            }\n\n            rc = rescale128(&alo, &ahi, &scaleA, 0, 0, DECIMAL_MAX_SCALE, 1);\n        }\n\n        if (rc != DECIMAL_SUCCESS)\n            return rc;\n\n        return pack128toDecimal(pA, alo, ahi, scaleA, sign);\n    }\n\n    void Decimal::decimalFloorAndTrunc(il2cpp_decimal_repr * pA, int32_t floorFlag)\n    {\n        uint64_t alo, ahi;\n        uint32_t factor, rest;\n        int scale, sign, idx;\n        int hasRest = 0;\n\n        scale = pA->u.signscale.scale;\n        if (scale == 0)\n            return;         /* nothing to do */\n\n        DECTO128(pA, alo, ahi);\n        sign = pA->u.signscale.sign;\n\n        while (scale > 0)\n        {\n            idx = (scale > DECIMAL_MAX_INTFACTORS) ? DECIMAL_MAX_INTFACTORS : scale;\n            factor = constantsDecadeInt32Factors[idx];\n            scale -= idx;\n            div128by32(&alo, &ahi, factor, &rest);\n            hasRest = hasRest || (rest != 0);\n        }\n\n        if (floorFlag && hasRest && sign) /* floor: if negative, we must round up */\n        {\n            roundUp128(&alo, &ahi);\n        }\n\n        pack128toDecimal(pA, alo, ahi, 0, sign);\n    }\n\n    int32_t Decimal::decimal2UInt64(il2cpp_decimal_repr * pA, uint64_t* pResult)\n    {\n        uint64_t alo, ahi;\n        int scale;\n\n        DECTO128(pA, alo, ahi);\n        scale = pA->u.signscale.scale;\n        if (scale > 0)\n        {\n            div128DecadeFactor(&alo, &ahi, scale);\n        }\n\n        /* overflow if integer too large or < 0 */\n        if (ahi != 0 || (alo != 0 && pA->u.signscale.sign))\n            return DECIMAL_OVERFLOW;\n\n        *pResult = alo;\n        return DECIMAL_SUCCESS;\n    }\n\n    int32_t Decimal::decimal2Int64(il2cpp_decimal_repr * pA, int64_t* pResult)\n    {\n        uint64_t alo, ahi;\n        int sign, scale;\n\n        DECTO128(pA, alo, ahi);\n        scale = pA->u.signscale.scale;\n        if (scale > 0)\n        {\n            div128DecadeFactor(&alo, &ahi, scale);\n        }\n\n        if (ahi != 0)\n            return DECIMAL_OVERFLOW;\n\n        sign = pA->u.signscale.sign;\n        if (sign && alo != 0)\n        {\n            if (alo > LIT_GUINT64_HIGHBIT)\n                return DECIMAL_OVERFLOW;\n            *pResult = (int64_t) ~(alo - 1);\n        }\n        else\n        {\n            if (alo & LIT_GUINT64_HIGHBIT)\n                return DECIMAL_OVERFLOW;\n            *pResult = (int64_t)alo;\n        }\n\n        return DECIMAL_SUCCESS;\n    }\n\n    int32_t Decimal::decimalMult(il2cpp_decimal_repr* pA, il2cpp_decimal_repr* pB)\n    {\n        uint64_t low, mid, high;\n        uint32_t factor;\n        int scale, sign;\n\n        mult96by96to192(pA->lo32, pA->mid32, pA->hi32, pB->lo32, pB->mid32, pB->hi32, &low, &mid, &high);\n\n        /* adjust scale and sign */\n        scale = (int)pA->u.signscale.scale + (int)pB->u.signscale.scale;\n        sign = pA->u.signscale.sign ^ pB->u.signscale.sign;\n\n        /* first scaling step */\n        factor = constantsDecadeInt32Factors[DECIMAL_MAX_INTFACTORS];\n        while (high != 0 || (mid >> 32) >= factor)\n        {\n            if (high < 100)\n            {\n                factor /= 1000; /* we need some digits for final rounding */\n                scale -= DECIMAL_MAX_INTFACTORS - 3;\n            }\n            else\n            {\n                scale -= DECIMAL_MAX_INTFACTORS;\n            }\n\n            div192by32(&low, &mid, &high, factor);\n        }\n\n        /* second and final scaling */\n        int status = rescale128(&low, &mid, &scale, 0, 0, DECIMAL_MAX_SCALE, 1);\n        if (status != DECIMAL_SUCCESS)\n            return status;\n\n        return pack128toDecimal(pA, low, mid, scale, sign);\n    }\n\n    int32_t Decimal::decimalDiv(il2cpp_decimal_repr* pC, il2cpp_decimal_repr* pA, il2cpp_decimal_repr* pB)\n    {\n        uint64_t clo, chi; /* result */\n        int scale, texp;\n\n        /* Check for common cases */\n        if (decimalCompare(pA, pB) == 0)\n        {\n            /* One */\n            return pack128toDecimal(pC, 1, 0, 0, 0);\n        }\n        pA->u.signscale.sign = pA->u.signscale.sign ? 0 : 1;\n        if (decimalCompare(pA, pB) == 0)\n        {\n            /* Minus one */\n            return pack128toDecimal(pC, 1, 0, 0, 1);\n        }\n        pA->u.signscale.sign = pA->u.signscale.sign ? 0 : 1;\n\n        int status = decimalDivSub(pA, pB, &clo, &chi, &texp);\n        if (status != DECIMAL_SUCCESS)\n        {\n            if (status == DECIMAL_FINISHED)\n                status = DECIMAL_SUCCESS;\n            return status;\n        }\n\n        /* adjust scale and sign */\n        scale = (int)pA->u.signscale.scale - (int)pB->u.signscale.scale;\n\n        /*test: printf(\"0: %.17e\\n\", (((double)chi) * pow(2,64) + clo) * pow(10, -scale) * pow(2, -exp));*/\n        status = rescale128(&clo, &chi, &scale, texp, 0, DECIMAL_MAX_SCALE, 1);\n        if (status != DECIMAL_SUCCESS)\n            return status;\n\n        return pack128toDecimal(pC, clo, chi, scale, pA->u.signscale.sign ^ pB->u.signscale.sign);\n    }\n\n    double Decimal::decimal2double(il2cpp_decimal_repr * pA)\n    {\n        double d;\n        uint64_t alo, ahi, mantisse;\n        uint32_t overhang, factor, roundBits;\n        int scale, texp, log5, i;\n\n\n        ahi = (((uint64_t)(pA->hi32)) << 32) | pA->mid32;\n        alo = ((uint64_t)(pA->lo32)) << 32;\n\n        /* special case zero */\n        if (ahi == 0 && alo == 0)\n            return 0.0;\n\n        texp = 0;\n        scale = pA->u.signscale.scale;\n\n        /* transform n * 10^-scale and exp = 0 => m * 2^-exp and scale = 0 */\n        while (scale > 0)\n        {\n            while ((ahi & LIT_GUINT64_HIGHBIT) == 0)\n            {\n                lshift128(&alo, &ahi);\n                texp++;\n            }\n\n            overhang = (uint32_t)(ahi >> 32);\n            if (overhang >= 5)\n            {\n                /* estimate log5 */\n                log5 = (log2_32(overhang) * 1000) / 2322; /* ln(5)/ln(2) = 2.3219... */\n                if (log5 < DECIMAL_MAX_INTFACTORS)\n                {\n                    /* get maximal factor=5^i, so that overhang / factor >= 1 */\n                    factor = constantsDecadeInt32Factors[log5] >> log5; /* 5^n = 10^n/2^n */\n                    i = log5 + overhang / factor;\n                }\n                else\n                {\n                    i = DECIMAL_MAX_INTFACTORS; /* we have only constants up to 10^DECIMAL_MAX_INTFACTORS */\n                }\n                if (i > scale)\n                    i = scale;\n                factor = constantsDecadeInt32Factors[i] >> i; /* 5^n = 10^n/2^n */\n                /* n * 10^-scale * 2^-exp => m * 10^-(scale-i) * 2^-(exp+i) with m = n * 5^-i */\n                div128by32(&alo, &ahi, factor, 0);\n                scale -= i;\n                texp += i;\n            }\n        }\n\n        /* normalize significand (highest bit should be 1) */\n        while ((ahi & LIT_GUINT64_HIGHBIT) == 0)\n        {\n            lshift128(&alo, &ahi);\n            texp++;\n        }\n\n        /* round to nearest even */\n        roundBits = (uint32_t)ahi & 0x7ff;\n        ahi += 0x400;\n        if ((ahi & LIT_GUINT64_HIGHBIT) == 0) /* overflow ? */\n        {\n            ahi >>= 1;\n            texp--;\n        }\n        else if ((roundBits & 0x400) == 0)\n            ahi &= ~1;\n\n        /* 96 bit => 1 implizit bit and 52 explicit bits */\n        mantisse = (ahi & ~LIT_GUINT64_HIGHBIT) >> 11;\n\n        buildIEEE754Double(&d, pA->u.signscale.sign, -texp + 95, mantisse);\n\n        return d;\n    }\n\n    int32_t Decimal::decimal2string(il2cpp_decimal_repr* val, int32_t digits, int32_t decimals, Il2CppArray* bufDigits, int32_t bufSize, int32_t* decPos, int32_t* sign)\n    {\n        NOT_IMPLEMENTED_ICALL(Decimal::decimal2string);\n\n        return 0;\n    }\n\n    int32_t Decimal::decimalIntDiv(il2cpp_decimal_repr* pC, il2cpp_decimal_repr* pA, il2cpp_decimal_repr* pB)\n    {\n        uint64_t clo, chi; /* result */\n        int scale, texp, rc;\n\n        rc = decimalDivSub(pA, pB, &clo, &chi, &texp);\n        if (rc != DECIMAL_SUCCESS)\n        {\n            if (rc == DECIMAL_FINISHED)\n                rc = DECIMAL_SUCCESS;\n            return rc;\n        }\n\n        /* calc scale  */\n        scale = (int)pA->u.signscale.scale - (int)pB->u.signscale.scale;\n\n        /* truncate result to integer */\n        rc = rescale128(&clo, &chi, &scale, texp, 0, 0, 0);\n        if (rc != DECIMAL_SUCCESS)\n            return rc;\n\n        return pack128toDecimal(pC, clo, chi, scale, pA->u.signscale.sign);\n    }\n\n#else\n    double Decimal::ToDouble(Il2CppDecimal d)\n    {\n        double result = 0.0;\n        // Note: this can fail if the input is an invalid decimal, but for compatibility we should return 0\n        il2cpp_decimal_to_double_result(&d, &result);\n        return result;\n    }\n\n    int32_t Decimal::FCallCompare(Il2CppDecimal* left, Il2CppDecimal* right)\n    {\n        uint32_t   left_sign;\n        uint32_t   right_sign;\n        Il2CppDecimal result;\n\n        result.Hi32 = 0; // Just to shut up the compiler\n\n        // First check signs and whether either are zero.  If both are\n        // non-zero and of the same sign, just use subtraction to compare.\n        //\n        left_sign = left->v.v.Lo32 | left->v.v.Mid32 | left->Hi32;\n        right_sign = right->v.v.Lo32 | right->v.v.Mid32 | right->Hi32;\n        if (left_sign != 0)\n            left_sign = (left->u.u.sign & DECIMAL_NEG) | 1;\n\n        if (right_sign != 0)\n            right_sign = (right->u.u.sign & DECIMAL_NEG) | 1;\n\n        // left_sign & right_sign have values 1, 0, or 0x81 depending on if the left/right\n        // operand is +, 0, or -.\n        //\n        if (left_sign == right_sign)\n        {\n            if (left_sign == 0) // both are zero\n                return IL2CPP_DECIMAL_CMP_EQ; // return equal\n\n            DecAddSub(left, right, &result, DECIMAL_NEG);\n            if (DECIMAL_LO64_GET(result) == 0 && result.Hi32 == 0)\n                return IL2CPP_DECIMAL_CMP_EQ;\n            if (result.u.u.sign & DECIMAL_NEG)\n                return IL2CPP_DECIMAL_CMP_LT;\n            return IL2CPP_DECIMAL_CMP_GT;\n        }\n\n        //\n        // Signs are different.  Use signed byte comparison\n        //\n        if ((signed char)left_sign > (signed char)right_sign)\n            return IL2CPP_DECIMAL_CMP_GT;\n        return IL2CPP_DECIMAL_CMP_LT;\n    }\n\n    int32_t Decimal::FCallToInt32(Il2CppDecimal d)\n    {\n        Il2CppDecimal result;\n\n        // The following can not return an error, it only returns INVALID_ARG if the decimals is < 0\n        il2cpp_decimal_round_result(&d, 0, &result);\n\n        if (DECIMAL_SCALE(result) != 0)\n        {\n            d = result;\n            il2cpp_decimal_fix(&d, &result);\n        }\n\n        if (DECIMAL_HI32(result) == 0 && DECIMAL_MID32(result) == 0)\n        {\n            int32_t i = DECIMAL_LO32(result);\n            if ((int16_t)DECIMAL_SIGNSCALE(result) >= 0)\n            {\n                if (i >= 0)\n                    return i;\n            }\n            else\n            {\n                i = -i;\n                if (i <= 0)\n                    return i;\n            }\n        }\n\n        vm::Exception::RaiseOverflowException();\n        return 0;\n    }\n\n    int32_t Decimal::GetHashCode(Il2CppDecimal* _this)\n    {\n        double dbl;\n\n        if (il2cpp_decimal_to_double_result(_this, &dbl) != IL2CPP_DECIMAL_OK)\n            return 0;\n\n        if (dbl == 0.0)\n        {\n            // Ensure 0 and -0 have the same hash code\n            return 0;\n        }\n        // conversion to double is lossy and produces rounding errors so we mask off the lowest 4 bits\n        //\n        // For example these two numerically equal decimals with different internal representations produce\n        // slightly different results when converted to double:\n        //\n        // decimal a = new decimal(new int[] { 0x76969696, 0x2fdd49fa, 0x409783ff, 0x00160000 });\n        //                     => (decimal)1999021.176470588235294117647000000000 => (double)1999021.176470588\n        // decimal b = new decimal(new int[] { 0x3f0f0f0f, 0x1e62edcc, 0x06758d33, 0x00150000 });\n        //                     => (decimal)1999021.176470588235294117647000000000 => (double)1999021.1764705882\n        //\n        return ((((int*)&dbl)[0]) & 0xFFFFFFF0) ^ ((int*)&dbl)[1];\n    }\n\n    float Decimal::ToSingle(Il2CppDecimal d)\n    {\n        float result = 0.0f;\n        // Note: this can fail if the input is an invalid decimal, but for compatibility we should return 0\n        il2cpp_decimal_to_float_result(&d, &result);\n        return result;\n    }\n\n    void Decimal::ConstructorDouble(Il2CppDecimal* _this, double value)\n    {\n        if (il2cpp_decimal_from_double(value, _this) == IL2CPP_DECIMAL_OVERFLOW)\n        {\n            vm::Exception::RaiseOverflowException();\n            return;\n        }\n        _this->reserved = 0;\n    }\n\n    void Decimal::ConstructorFloat(Il2CppDecimal* _this, float value)\n    {\n        if (il2cpp_decimal_from_float(value, _this) == IL2CPP_DECIMAL_OVERFLOW)\n        {\n            vm::Exception::RaiseOverflowException();\n            return;\n        }\n        _this->reserved = 0;\n    }\n\n    void Decimal::FCallAddSub(Il2CppDecimal* left, Il2CppDecimal* right, uint8_t sign)\n    {\n        Il2CppDecimal result, decTmp;\n        Il2CppDecimal *pdecTmp, *leftOriginal;\n        uint32_t    num[6], pwr;\n        int         scale, hi_prod, cur;\n        SPLIT64     sdlTmp;\n\n        IL2CPP_ASSERT(sign == 0 || sign == DECIMAL_NEG);\n\n        leftOriginal = left;\n\n        sign ^= (DECIMAL_SIGN(*right) ^ DECIMAL_SIGN(*left)) & DECIMAL_NEG;\n\n        if (DECIMAL_SCALE(*right) == DECIMAL_SCALE(*left))\n        {\n            // Scale factors are equal, no alignment necessary.\n            //\n            DECIMAL_SIGNSCALE(result) = DECIMAL_SIGNSCALE(*left);\n\n        AlignedAdd:\n            if (sign)\n            {\n                // Signs differ - subtract\n                //\n                DECIMAL_LO64_SET(result, (DECIMAL_LO64_GET(*left) - DECIMAL_LO64_GET(*right)));\n                DECIMAL_HI32(result) = DECIMAL_HI32(*left) - DECIMAL_HI32(*right);\n\n                // Propagate carry\n                //\n                if (DECIMAL_LO64_GET(result) > DECIMAL_LO64_GET(*left))\n                {\n                    DECIMAL_HI32(result)--;\n                    if (DECIMAL_HI32(result) >= DECIMAL_HI32(*left))\n                        goto SignFlip;\n                }\n                else if (DECIMAL_HI32(result) > DECIMAL_HI32(*left))\n                {\n                    // Got negative result.  Flip its sign.\n                    //\n                SignFlip:\n                    DECIMAL_LO64_SET(result, -(int64_t)DECIMAL_LO64_GET(result));\n                    DECIMAL_HI32(result) = ~DECIMAL_HI32(result);\n                    if (DECIMAL_LO64_GET(result) == 0)\n                        DECIMAL_HI32(result)++;\n                    DECIMAL_SIGN(result) ^= DECIMAL_NEG;\n                }\n            }\n            else\n            {\n                // Signs are the same - add\n                //\n                DECIMAL_LO64_SET(result, (DECIMAL_LO64_GET(*left) + DECIMAL_LO64_GET(*right)));\n                DECIMAL_HI32(result) = DECIMAL_HI32(*left) + DECIMAL_HI32(*right);\n\n                // Propagate carry\n                //\n                if (DECIMAL_LO64_GET(result) < DECIMAL_LO64_GET(*left))\n                {\n                    DECIMAL_HI32(result)++;\n                    if (DECIMAL_HI32(result) <= DECIMAL_HI32(*left))\n                        goto AlignedScale;\n                }\n                else if (DECIMAL_HI32(result) < DECIMAL_HI32(*left))\n                {\n                AlignedScale:\n                    // The addition carried above 96 bits.  Divide the result by 10,\n                    // dropping the scale factor.\n                    //\n                    if (DECIMAL_SCALE(result) == 0)\n                    {\n                        vm::Exception::RaiseOverflowException();\n                        return;\n                    }\n                    DECIMAL_SCALE(result)--;\n\n                    sdlTmp.u.Lo = DECIMAL_HI32(result);\n                    sdlTmp.u.Hi = 1;\n                    sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10);\n                    DECIMAL_HI32(result) = sdlTmp.u.Lo;\n\n                    sdlTmp.u.Lo = DECIMAL_MID32(result);\n                    sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10);\n                    DECIMAL_MID32(result) = sdlTmp.u.Lo;\n\n                    sdlTmp.u.Lo = DECIMAL_LO32(result);\n                    sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10);\n                    DECIMAL_LO32(result) = sdlTmp.u.Lo;\n\n                    // See if we need to round up.\n                    //\n                    if (sdlTmp.u.Hi >= 5 && (sdlTmp.u.Hi > 5 || (DECIMAL_LO32(result) & 1)))\n                    {\n                        DECIMAL_LO64_SET(result, DECIMAL_LO64_GET(result) + 1);\n                        if (DECIMAL_LO64_GET(result) == 0)\n                            DECIMAL_HI32(result)++;\n                    }\n                }\n            }\n        }\n        else\n        {\n            // Scale factors are not equal.  Assume that a larger scale\n            // factor (more decimal places) is likely to mean that number\n            // is smaller.  Start by guessing that the right operand has\n            // the larger scale factor.  The result will have the larger\n            // scale factor.\n            //\n            DECIMAL_SCALE(result) = DECIMAL_SCALE(*right); // scale factor of \"smaller\"\n            DECIMAL_SIGN(result) = DECIMAL_SIGN(*left); // but sign of \"larger\"\n            scale = DECIMAL_SCALE(result) - DECIMAL_SCALE(*left);\n\n            if (scale < 0)\n            {\n                // Guessed scale factor wrong. Swap operands.\n                //\n                scale = -scale;\n                DECIMAL_SCALE(result) = DECIMAL_SCALE(*left);\n                DECIMAL_SIGN(result) ^= sign;\n                pdecTmp = right;\n                right = left;\n                left = pdecTmp;\n            }\n\n            // *left will need to be multiplied by 10^scale so\n            // it will have the same scale as *right.  We could be\n            // extending it to up to 192 bits of precision.\n            //\n            if (scale <= POWER10_MAX)\n            {\n                // Scaling won't make it larger than 4 uint32_ts\n                //\n                pwr = power10[scale];\n                DECIMAL_LO64_SET(decTmp, UInt32x32To64(DECIMAL_LO32(*left), pwr));\n                sdlTmp.int64 = UInt32x32To64(DECIMAL_MID32(*left), pwr);\n                sdlTmp.int64 += DECIMAL_MID32(decTmp);\n                DECIMAL_MID32(decTmp) = sdlTmp.u.Lo;\n                DECIMAL_HI32(decTmp) = sdlTmp.u.Hi;\n                sdlTmp.int64 = UInt32x32To64(DECIMAL_HI32(*left), pwr);\n                sdlTmp.int64 += DECIMAL_HI32(decTmp);\n                if (sdlTmp.u.Hi == 0)\n                {\n                    // Result fits in 96 bits.  Use standard aligned add.\n                    //\n                    DECIMAL_HI32(decTmp) = sdlTmp.u.Lo;\n                    left = &decTmp;\n                    goto AlignedAdd;\n                }\n                num[0] = DECIMAL_LO32(decTmp);\n                num[1] = DECIMAL_MID32(decTmp);\n                num[2] = sdlTmp.u.Lo;\n                num[3] = sdlTmp.u.Hi;\n                hi_prod = 3;\n            }\n            else\n            {\n                // Have to scale by a bunch.  Move the number to a buffer\n                // where it has room to grow as it's scaled.\n                //\n                num[0] = DECIMAL_LO32(*left);\n                num[1] = DECIMAL_MID32(*left);\n                num[2] = DECIMAL_HI32(*left);\n                hi_prod = 2;\n\n                // Scan for zeros in the upper words.\n                //\n                if (num[2] == 0)\n                {\n                    hi_prod = 1;\n                    if (num[1] == 0)\n                    {\n                        hi_prod = 0;\n                        if (num[0] == 0)\n                        {\n                            // Left arg is zero, return right.\n                            //\n                            DECIMAL_LO64_SET(result, DECIMAL_LO64_GET(*right));\n                            DECIMAL_HI32(result) = DECIMAL_HI32(*right);\n                            DECIMAL_SIGN(result) ^= sign;\n                            goto RetDec;\n                        }\n                    }\n                }\n\n                // Scaling loop, up to 10^9 at a time.  hi_prod stays updated\n                // with index of highest non-zero uint32_t.\n                //\n                for (; scale > 0; scale -= POWER10_MAX)\n                {\n                    if (scale > POWER10_MAX)\n                        pwr = ten_to_nine;\n                    else\n                        pwr = power10[scale];\n\n                    sdlTmp.u.Hi = 0;\n                    for (cur = 0; cur <= hi_prod; cur++)\n                    {\n                        sdlTmp.int64 = UInt32x32To64(num[cur], pwr) + sdlTmp.u.Hi;\n                        num[cur] = sdlTmp.u.Lo;\n                    }\n\n                    if (sdlTmp.u.Hi != 0)\n                        // We're extending the result by another uint32_t.\n                        num[++hi_prod] = sdlTmp.u.Hi;\n                }\n            }\n\n            // Scaling complete, do the add.  Could be subtract if signs differ.\n            //\n            sdlTmp.u.Lo = num[0];\n            sdlTmp.u.Hi = num[1];\n\n            if (sign)\n            {\n                // Signs differ, subtract.\n                //\n                DECIMAL_LO64_SET(result, (sdlTmp.int64 - DECIMAL_LO64_GET(*right)));\n                DECIMAL_HI32(result) = num[2] - DECIMAL_HI32(*right);\n\n                // Propagate carry\n                //\n                if (DECIMAL_LO64_GET(result) > sdlTmp.int64)\n                {\n                    DECIMAL_HI32(result)--;\n                    if (DECIMAL_HI32(result) >= num[2])\n                        goto LongSub;\n                }\n                else if (DECIMAL_HI32(result) > num[2])\n                {\n                LongSub:\n                    // If num has more than 96 bits of precision, then we need to\n                    // carry the subtraction into the higher bits.  If it doesn't,\n                    // then we subtracted in the wrong order and have to flip the\n                    // sign of the result.\n                    //\n                    if (hi_prod <= 2)\n                        goto SignFlip;\n\n                    cur = 3;\n                    while (num[cur++]-- == 0)\n                        ;\n                    if (num[hi_prod] == 0)\n                        hi_prod--;\n                }\n            }\n            else\n            {\n                // Signs the same, add.\n                //\n                DECIMAL_LO64_SET(result, (sdlTmp.int64 + DECIMAL_LO64_GET(*right)));\n                DECIMAL_HI32(result) = num[2] + DECIMAL_HI32(*right);\n\n                // Propagate carry\n                //\n                if (DECIMAL_LO64_GET(result) < sdlTmp.int64)\n                {\n                    DECIMAL_HI32(result)++;\n                    if (DECIMAL_HI32(result) <= num[2])\n                        goto LongAdd;\n                }\n                else if (DECIMAL_HI32(result) < num[2])\n                {\n                LongAdd:\n                    // Had a carry above 96 bits.\n                    //\n                    cur = 3;\n                    do\n                    {\n                        if (hi_prod < cur)\n                        {\n                            num[cur] = 1;\n                            hi_prod = cur;\n                            break;\n                        }\n                    }\n                    while (++num[cur++] == 0);\n                }\n            }\n\n            if (hi_prod > 2)\n            {\n                num[0] = DECIMAL_LO32(result);\n                num[1] = DECIMAL_MID32(result);\n                num[2] = DECIMAL_HI32(result);\n                DECIMAL_SCALE(result) = (uint8_t)ScaleResult(num, hi_prod, DECIMAL_SCALE(result));\n                if (DECIMAL_SCALE(result) == (uint8_t)-1)\n                {\n                    vm::Exception::RaiseOverflowException();\n                    return;\n                }\n\n                DECIMAL_LO32(result) = num[0];\n                DECIMAL_MID32(result) = num[1];\n                DECIMAL_HI32(result) = num[2];\n            }\n        }\n\n    RetDec:\n        left = leftOriginal;\n        COPYDEC(*left, result);\n        left->reserved = 0;\n    }\n\n    void Decimal::FCallDivide(Il2CppDecimal* left, Il2CppDecimal* right)\n    {\n        uint32_t quo[3], quo_save[3], rem[4], divisor[3];\n        uint32_t pwr, tmp, tmp1;\n        SPLIT64  sdlTmp, sdlDivisor;\n        int      scale, cur_scale;\n        bool unscale;\n\n        scale = DECIMAL_SCALE(*left) - DECIMAL_SCALE(*right);\n        unscale = false;\n        divisor[0] = DECIMAL_LO32(*right);\n        divisor[1] = DECIMAL_MID32(*right);\n        divisor[2] = DECIMAL_HI32(*right);\n\n        if (divisor[1] == 0 && divisor[2] == 0)\n        {\n            // Divisor is only 32 bits.  Easy divide.\n            //\n            if (divisor[0] == 0)\n            {\n                vm::Exception::RaiseDivideByZeroException();\n                return;\n            }\n\n            quo[0] = DECIMAL_LO32(*left);\n            quo[1] = DECIMAL_MID32(*left);\n            quo[2] = DECIMAL_HI32(*left);\n            rem[0] = Div96By32(quo, divisor[0]);\n\n            for (;;)\n            {\n                if (rem[0] == 0)\n                {\n                    if (scale < 0)\n                    {\n                        cur_scale = std::min(9, -scale);\n                        goto HaveScale;\n                    }\n                    break;\n                }\n                // We need to unscale if and only if we have a non-zero remainder\n                unscale = true;\n\n                // We have computed a quotient based on the natural scale\n                // ( <dividend scale> - <divisor scale> ).  We have a non-zero\n                // remainder, so now we should increase the scale if possible to\n                // include more quotient bits.\n                //\n                // If it doesn't cause overflow, we'll loop scaling by 10^9 and\n                // computing more quotient bits as long as the remainder stays\n                // non-zero.  If scaling by that much would cause overflow, we'll\n                // drop out of the loop and scale by as much as we can.\n                //\n                // Scaling by 10^9 will overflow if quo[2].quo[1] >= 2^32 / 10^9\n                // = 4.294 967 296.  So the upper limit is quo[2] == 4 and\n                // quo[1] == 0.294 967 296 * 2^32 = 1,266,874,889.7+.  Since\n                // quotient bits in quo[0] could be all 1's, then 1,266,874,888\n                // is the largest value in quo[1] (when quo[2] == 4) that is\n                // assured not to overflow.\n                //\n                cur_scale = SearchScale(quo[2], quo[1], quo[0], scale);\n                if (cur_scale == 0)\n                {\n                    // No more scaling to be done, but remainder is non-zero.\n                    // Round quotient.T\n                    //\n                    tmp = rem[0] << 1;\n                    if (tmp < rem[0] || (tmp >= divisor[0] &&\n                                         (tmp > divisor[0] || (quo[0] & 1))))\n                    {\n                    RoundUp:\n                        if (!Add32To96(quo, 1))\n                        {\n                            if (scale == 0)\n                            {\n                                vm::Exception::RaiseOverflowException();\n                                return;\n                            }\n                            scale--;\n                            OverflowUnscale(quo, true);\n                            break;\n                        }\n                    }\n                    break;\n                }\n\n                if (cur_scale < 0)\n                {\n                    vm::Exception::RaiseOverflowException();\n                    return;\n                }\n\n            HaveScale:\n                pwr = power10[cur_scale];\n                scale += cur_scale;\n\n                if (IncreaseScale(quo, pwr) != 0)\n                {\n                    vm::Exception::RaiseOverflowException();\n                    return;\n                }\n\n                sdlTmp.int64 = DivMod64by32(UInt32x32To64(rem[0], pwr), divisor[0]);\n                rem[0] = sdlTmp.u.Hi;\n\n                if (!Add32To96(quo, sdlTmp.u.Lo))\n                {\n                    if (scale == 0)\n                    {\n                        vm::Exception::RaiseOverflowException();\n                        return;\n                    }\n                    scale--;\n                    OverflowUnscale(quo, (rem[0] != 0));\n                    break;\n                }\n            } // for (;;)\n        }\n        else\n        {\n            // Divisor has bits set in the upper 64 bits.\n            //\n            // Divisor must be fully normalized (shifted so bit 31 of the most\n            // significant uint32_t is 1).  Locate the MSB so we know how much to\n            // normalize by.  The dividend will be shifted by the same amount so\n            // the quotient is not changed.\n            //\n            if (divisor[2] == 0)\n                tmp = divisor[1];\n            else\n                tmp = divisor[2];\n\n            cur_scale = 0;\n            if (!(tmp & 0xFFFF0000))\n            {\n                cur_scale += 16;\n                tmp <<= 16;\n            }\n            if (!(tmp & 0xFF000000))\n            {\n                cur_scale += 8;\n                tmp <<= 8;\n            }\n            if (!(tmp & 0xF0000000))\n            {\n                cur_scale += 4;\n                tmp <<= 4;\n            }\n            if (!(tmp & 0xC0000000))\n            {\n                cur_scale += 2;\n                tmp <<= 2;\n            }\n            if (!(tmp & 0x80000000))\n            {\n                cur_scale++;\n                tmp <<= 1;\n            }\n\n            // Shift both dividend and divisor left by cur_scale.\n            //\n            sdlTmp.int64 = DECIMAL_LO64_GET(*left) << cur_scale;\n            rem[0] = sdlTmp.u.Lo;\n            rem[1] = sdlTmp.u.Hi;\n            sdlTmp.u.Lo = DECIMAL_MID32(*left);\n            sdlTmp.u.Hi = DECIMAL_HI32(*left);\n            sdlTmp.int64 <<= cur_scale;\n            rem[2] = sdlTmp.u.Hi;\n            rem[3] = (DECIMAL_HI32(*left) >> (31 - cur_scale)) >> 1;\n\n            sdlDivisor.u.Lo = divisor[0];\n            sdlDivisor.u.Hi = divisor[1];\n            sdlDivisor.int64 <<= cur_scale;\n\n            if (divisor[2] == 0)\n            {\n                // Have a 64-bit divisor in sdlDivisor.  The remainder\n                // (currently 96 bits spread over 4 uint32_ts) will be < divisor.\n                //\n                sdlTmp.u.Lo = rem[2];\n                sdlTmp.u.Hi = rem[3];\n\n                quo[2] = 0;\n                quo[1] = Div96By64(&rem[1], sdlDivisor);\n                quo[0] = Div96By64(rem, sdlDivisor);\n\n                for (;;)\n                {\n                    if ((rem[0] | rem[1]) == 0)\n                    {\n                        if (scale < 0)\n                        {\n                            cur_scale = std::min(9, -scale);\n                            goto HaveScale64;\n                        }\n                        break;\n                    }\n\n                    // We need to unscale if and only if we have a non-zero remainder\n                    unscale = true;\n\n                    // Remainder is non-zero.  Scale up quotient and remainder by\n                    // powers of 10 so we can compute more significant bits.\n                    //\n                    cur_scale = SearchScale(quo[2], quo[1], quo[0], scale);\n                    if (cur_scale == 0)\n                    {\n                        // No more scaling to be done, but remainder is non-zero.\n                        // Round quotient.\n                        //\n                        sdlTmp.u.Lo = rem[0];\n                        sdlTmp.u.Hi = rem[1];\n                        if (sdlTmp.u.Hi >= 0x80000000 || (sdlTmp.int64 <<= 1) > sdlDivisor.int64 ||\n                            (sdlTmp.int64 == sdlDivisor.int64 && (quo[0] & 1)))\n                            goto RoundUp;\n                        break;\n                    }\n\n                    if (cur_scale < 0)\n                    {\n                        vm::Exception::RaiseOverflowException();\n                        return;\n                    }\n\n                HaveScale64:\n                    pwr = power10[cur_scale];\n                    scale += cur_scale;\n\n                    if (IncreaseScale(quo, pwr) != 0)\n                    {\n                        vm::Exception::RaiseOverflowException();\n                        return;\n                    }\n\n                    rem[2] = 0; // rem is 64 bits, IncreaseScale uses 96\n                    IncreaseScale(rem, pwr);\n                    tmp = Div96By64(rem, sdlDivisor);\n                    if (!Add32To96(quo, tmp))\n                    {\n                        if (scale == 0)\n                        {\n                            vm::Exception::RaiseOverflowException();\n                            return;\n                        }\n                        scale--;\n                        OverflowUnscale(quo, (rem[0] != 0 || rem[1] != 0));\n                        break;\n                    }\n                } // for (;;)\n            }\n            else\n            {\n                // Have a 96-bit divisor in divisor[].\n                //\n                // Start by finishing the shift left by cur_scale.\n                //\n                sdlTmp.u.Lo = divisor[1];\n                sdlTmp.u.Hi = divisor[2];\n                sdlTmp.int64 <<= cur_scale;\n                divisor[0] = sdlDivisor.u.Lo;\n                divisor[1] = sdlDivisor.u.Hi;\n                divisor[2] = sdlTmp.u.Hi;\n\n                // The remainder (currently 96 bits spread over 4 uint32_ts)\n                // will be < divisor.\n                //\n                quo[2] = 0;\n                quo[1] = 0;\n                quo[0] = Div128By96(rem, divisor);\n\n                for (;;)\n                {\n                    if ((rem[0] | rem[1] | rem[2]) == 0)\n                    {\n                        if (scale < 0)\n                        {\n                            cur_scale = std::min(9, -scale);\n                            goto HaveScale96;\n                        }\n                        break;\n                    }\n\n                    // We need to unscale if and only if we have a non-zero remainder\n                    unscale = true;\n\n                    // Remainder is non-zero.  Scale up quotient and remainder by\n                    // powers of 10 so we can compute more significant bits.\n                    //\n                    cur_scale = SearchScale(quo[2], quo[1], quo[0], scale);\n                    if (cur_scale == 0)\n                    {\n                        // No more scaling to be done, but remainder is non-zero.\n                        // Round quotient.\n                        //\n                        if (rem[2] >= 0x80000000)\n                            goto RoundUp;\n\n                        tmp = rem[0] > 0x80000000;\n                        tmp1 = rem[1] > 0x80000000;\n                        rem[0] <<= 1;\n                        rem[1] = (rem[1] << 1) + tmp;\n                        rem[2] = (rem[2] << 1) + tmp1;\n\n                        if (rem[2] > divisor[2] || (rem[2] == divisor[2] && (rem[1] > divisor[1] || rem[1] == (divisor[1] && (rem[0] > divisor[0] || (rem[0] == divisor[0] && (quo[0] & 1)))))))\n                            goto RoundUp;\n                        break;\n                    }\n\n                    if (cur_scale < 0)\n                    {\n                        vm::Exception::RaiseOverflowException();\n                        return;\n                    }\n\n                HaveScale96:\n                    pwr = power10[cur_scale];\n                    scale += cur_scale;\n\n                    if (IncreaseScale(quo, pwr) != 0)\n                    {\n                        vm::Exception::RaiseOverflowException();\n                        return;\n                    }\n\n                    rem[3] = IncreaseScale(rem, pwr);\n                    tmp = Div128By96(rem, divisor);\n                    if (!Add32To96(quo, tmp))\n                    {\n                        if (scale == 0)\n                        {\n                            vm::Exception::RaiseOverflowException();\n                            return;\n                        }\n\n                        scale--;\n                        OverflowUnscale(quo, (rem[0] != 0 || rem[1] != 0 || rem[2] != 0 || rem[3] != 0));\n                        break;\n                    }\n                } // for (;;)\n            }\n        }\n\n        // We need to unscale if and only if we have a non-zero remainder\n        if (unscale)\n        {\n            // Try extracting any extra powers of 10 we may have\n            // added.  We do this by trying to divide out 10^8, 10^4, 10^2, and 10^1.\n            // If a division by one of these powers returns a zero remainder, then\n            // we keep the quotient.  If the remainder is not zero, then we restore\n            // the previous value.\n            //\n            // Since 10 = 2 * 5, there must be a factor of 2 for every power of 10\n            // we can extract.  We use this as a quick test on whether to try a\n            // given power.\n            //\n            while ((quo[0] & 0xFF) == 0 && scale >= 8)\n            {\n                quo_save[0] = quo[0];\n                quo_save[1] = quo[1];\n                quo_save[2] = quo[2];\n\n                if (Div96By32(quo_save, 100000000) == 0)\n                {\n                    quo[0] = quo_save[0];\n                    quo[1] = quo_save[1];\n                    quo[2] = quo_save[2];\n                    scale -= 8;\n                }\n                else\n                    break;\n            }\n\n            if ((quo[0] & 0xF) == 0 && scale >= 4)\n            {\n                quo_save[0] = quo[0];\n                quo_save[1] = quo[1];\n                quo_save[2] = quo[2];\n\n                if (Div96By32(quo_save, 10000) == 0)\n                {\n                    quo[0] = quo_save[0];\n                    quo[1] = quo_save[1];\n                    quo[2] = quo_save[2];\n                    scale -= 4;\n                }\n            }\n\n            if ((quo[0] & 3) == 0 && scale >= 2)\n            {\n                quo_save[0] = quo[0];\n                quo_save[1] = quo[1];\n                quo_save[2] = quo[2];\n\n                if (Div96By32(quo_save, 100) == 0)\n                {\n                    quo[0] = quo_save[0];\n                    quo[1] = quo_save[1];\n                    quo[2] = quo_save[2];\n                    scale -= 2;\n                }\n            }\n\n            if ((quo[0] & 1) == 0 && scale >= 1)\n            {\n                quo_save[0] = quo[0];\n                quo_save[1] = quo[1];\n                quo_save[2] = quo[2];\n\n                if (Div96By32(quo_save, 10) == 0)\n                {\n                    quo[0] = quo_save[0];\n                    quo[1] = quo_save[1];\n                    quo[2] = quo_save[2];\n                    scale -= 1;\n                }\n            }\n        }\n\n        DECIMAL_SIGN(*left) = DECIMAL_SIGN(*left) ^ DECIMAL_SIGN(*right);\n        DECIMAL_HI32(*left) = quo[2];\n        DECIMAL_MID32(*left) = quo[1];\n        DECIMAL_LO32(*left) = quo[0];\n        DECIMAL_SCALE(*left) = (uint8_t)scale;\n        left->reserved = 0;\n    }\n\n    void Decimal::FCallFloor(Il2CppDecimal* d)\n    {\n        Il2CppDecimal decRes;\n\n        il2cpp_decimal_round_to_int(d, &decRes);\n\n        // copy decRes into d\n        COPYDEC(*d, decRes);\n        d->reserved = 0;\n        FC_GC_POLL();\n    }\n\n    void Decimal::FCallMultiply(Il2CppDecimal* d1, Il2CppDecimal* d2)\n    {\n        Il2CppDecimal decRes;\n\n        Il2CppDecimalStatus status = il2cpp_decimal_multiply_result(d1, d2, &decRes);\n        if (status != IL2CPP_DECIMAL_OK)\n        {\n            vm::Exception::RaiseOverflowException();\n            return;\n        }\n\n        COPYDEC(*d1, decRes);\n        d1->reserved = 0;\n\n        FC_GC_POLL();\n    }\n\n    void Decimal::FCallRound(Il2CppDecimal* d, int32_t decimals)\n    {\n        Il2CppDecimal decRes;\n\n        // GC is only triggered for throwing, no need to protect result\n        if (decimals < 0 || decimals > 28)\n        {\n            vm::Exception::RaiseArgumentOutOfRangeException(\"d\");\n            return;\n        }\n\n        il2cpp_decimal_round_result(d, decimals, &decRes);\n\n        // copy decRes into d\n        COPYDEC(*d, decRes);\n        d->reserved = 0;\n\n        FC_GC_POLL();\n    }\n\n    void Decimal::FCallTruncate(Il2CppDecimal* d)\n    {\n        Il2CppDecimal decRes;\n\n        il2cpp_decimal_fix(d, &decRes);\n\n        // copy decRes into d\n        COPYDEC(*d, decRes);\n        d->reserved = 0;\n        FC_GC_POLL();\n    }\n\n#endif\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Decimal.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\nstruct mscorlib_System_Decimal;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Decimal\n    {\n    public:\n#if !NET_4_0\n        static int32_t decimal2Int64(il2cpp_decimal_repr* val, int64_t* result);\n        static int32_t decimal2UInt64(il2cpp_decimal_repr* val, uint64_t* result);\n        static int32_t decimal2string(il2cpp_decimal_repr* val, int32_t digits, int32_t decimals, Il2CppArray* bufDigits, int32_t bufSize, int32_t* decPos, int32_t* sign);\n        static int decimalCompare(il2cpp_decimal_repr *pA, il2cpp_decimal_repr *pB);\n        static int32_t decimalDiv(il2cpp_decimal_repr* pC, il2cpp_decimal_repr* pA, il2cpp_decimal_repr* pB);\n        static void decimalFloorAndTrunc(il2cpp_decimal_repr * pA, int32_t floorFlag);\n        static int32_t decimalIncr(il2cpp_decimal_repr * d1, il2cpp_decimal_repr * d2);\n        static int32_t decimalIntDiv(il2cpp_decimal_repr* pc, il2cpp_decimal_repr* pa, il2cpp_decimal_repr* pb);\n        static int32_t decimalMult(il2cpp_decimal_repr* pA, il2cpp_decimal_repr* pB);\n        static int decimalSetExponent(il2cpp_decimal_repr*, int);\n        static int string2decimal(il2cpp_decimal_repr *pA, Il2CppString *str, unsigned int decrDecimal, int sign);\n        static double decimal2double(il2cpp_decimal_repr* val);\n#else\n        static double ToDouble(Il2CppDecimal d);\n        static int32_t FCallCompare(Il2CppDecimal* left, Il2CppDecimal* right);\n        static int32_t FCallToInt32(Il2CppDecimal d);\n        static int32_t GetHashCode(Il2CppDecimal* _this);\n        static float ToSingle(Il2CppDecimal d);\n        static void ConstructorDouble(Il2CppDecimal* _this, double value);\n        static void ConstructorFloat(Il2CppDecimal* _this, float value);\n        static void FCallAddSub(Il2CppDecimal* left, Il2CppDecimal* right, uint8_t sign);\n        static void FCallDivide(Il2CppDecimal* left, Il2CppDecimal* right);\n        static void FCallFloor(Il2CppDecimal* d);\n        static void FCallMultiply(Il2CppDecimal* d1, Il2CppDecimal* d2);\n        static void FCallRound(Il2CppDecimal* d, int32_t decimals);\n        static void FCallTruncate(Il2CppDecimal* d);\n#endif\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Delegate.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System/Delegate.h\"\n#include \"vm/Class.h\"\n#include \"vm/Method.h\"\n#include \"vm/Object.h\"\n#include \"vm/Type.h\"\n#include \"vm/Runtime.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    Il2CppDelegate * Delegate::CreateDelegate_internal(Il2CppReflectionType *__type, Il2CppObject *target, Il2CppReflectionMethod *info, bool throwOnBindFailure)\n    {\n        Il2CppClass *delegate_class = il2cpp::vm::Class::FromIl2CppType(__type->type);\n        const MethodInfo *method = info->method;\n\n        IL2CPP_ASSERT(delegate_class->parent == il2cpp_defaults.multicastdelegate_class);\n\n        //if (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR) {\n        //  if (!mono_security_core_clr_ensure_delegate_creation (method, throwOnBindFailure))\n        //      return NULL;\n        //}\n\n        Il2CppObject* delegate = il2cpp::vm::Object::New(delegate_class);\n        Il2CppMethodPointer func = method->methodPointer;\n\n        il2cpp::vm::Type::ConstructDelegate((Il2CppDelegate*)delegate, target, func, method);\n\n        return (Il2CppDelegate*)delegate;\n    }\n\n    void Delegate::SetMulticastInvoke(Il2CppDelegate * delegate)\n    {\n        const MethodInfo* invokeMethod = il2cpp::vm::Runtime::GetDelegateInvoke(delegate->object.klass);\n        delegate->invoke_impl = invokeMethod->invoker_method;\n    }\n\n#if NET_4_0\n    Il2CppMulticastDelegate* Delegate::AllocDelegateLike_internal(Il2CppDelegate* d)\n    {\n        IL2CPP_ASSERT(d->object.klass->parent == il2cpp_defaults.multicastdelegate_class);\n\n        Il2CppMulticastDelegate *ret = (Il2CppMulticastDelegate*)il2cpp::vm::Object::New(d->object.klass);\n\n        Il2CppMethodPointer func = d->method_ptr;\n        il2cpp::vm::Type::ConstructDelegate(&ret->delegate, &d->object, func, d->method);\n\n        const MethodInfo* invokeMethod = il2cpp::vm::Runtime::GetDelegateInvoke(d->object.klass);\n        ret->delegate.invoke_impl = invokeMethod->invoker_method;\n\n        return ret;\n    }\n\n    Il2CppObject* Delegate::GetVirtualMethod_internal(Il2CppObject* _this)\n    {\n        NOT_IMPLEMENTED_ICALL(Delegate::GetVirtualMethod_internal);\n        IL2CPP_UNREACHABLE;\n        return NULL;\n    }\n\n#endif\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Delegate.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppObject;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\n\nstruct Il2CppDelegate;\nstruct Il2CppMulticastDelegate;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Delegate\n    {\n    public:\n        static Il2CppDelegate * CreateDelegate_internal(Il2CppReflectionType *, Il2CppObject *, Il2CppReflectionMethod *, bool);\n        static void SetMulticastInvoke(Il2CppDelegate *);\n#if NET_4_0\n        static Il2CppMulticastDelegate* AllocDelegateLike_internal(Il2CppDelegate* d);\n        static Il2CppObject* GetVirtualMethod_internal(Il2CppObject* _this);\n#endif\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Double.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <stdlib.h>\n#include \"icalls/mscorlib/System/Double.h\"\n#include \"os/Locale.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    bool Double::ParseImpl(char *ptr, double *result)\n    {\n        char *endptr = NULL;\n        *result = 0.0;\n\n        if (*ptr)\n        {\n#if IL2CPP_SUPPORT_LOCALE_INDEPENDENT_PARSING\n            *result = il2cpp::os::Locale::DoubleParseLocaleIndependentImpl(ptr, &endptr);\n#else\n            *result = strtod(ptr, &endptr);\n#endif\n        }\n\n        if (!*ptr || (endptr && *endptr))\n            return false;\n\n        return true;\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Double.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Double\n    {\n    public:\n        static bool ParseImpl(char *, double *);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Enum.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"icalls/mscorlib/System/Enum.h\"\n#include \"vm/Class.h\"\n#include \"vm/Object.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Enum.h\"\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    Il2CppObject * Enum::get_value(Il2CppObject *thisPtr)\n    {\n        if (!thisPtr)\n            return NULL;\n\n        IL2CPP_ASSERT(thisPtr->klass->enumtype);\n\n        Il2CppClass* enumClass = Class::FromIl2CppType(Class::GetEnumBaseType(thisPtr->klass));\n        Il2CppObject* res = Object::New(enumClass);\n        void* dst = (char*)res + sizeof(Il2CppObject);\n        void* src = (char*)thisPtr + sizeof(Il2CppObject);\n        int32_t size = Class::GetValueSize(enumClass, NULL);\n\n        memcpy(dst, src, size);\n\n        return res;\n\n        return il2cpp::vm::Object::Box(thisPtr->klass->element_class, (char*)thisPtr + sizeof(Il2CppObject));\n    }\n\n    int Enum::compare_value_to(Il2CppObject * thisPtr, Il2CppObject * other)\n    {\n        void* tdata = (char*)thisPtr + sizeof(Il2CppObject);\n        void* odata = (char*)other + sizeof(Il2CppObject);\n        const Il2CppType *basetype = Class::GetEnumBaseType(Object::GetClass(thisPtr));\n        IL2CPP_ASSERT(basetype);\n\n#define COMPARE_ENUM_VALUES(ENUM_TYPE) do { \\\n        ENUM_TYPE me = *((ENUM_TYPE*)tdata); \\\n        ENUM_TYPE other = *((ENUM_TYPE*)odata); \\\n        if (me == other) \\\n            return 0; \\\n        return me > other ? 1 : -1; \\\n    } while (0)\n\n#define COMPARE_ENUM_VALUES_RANGE(ENUM_TYPE) do { \\\n        ENUM_TYPE me = *((ENUM_TYPE*)tdata); \\\n        ENUM_TYPE other = *((ENUM_TYPE*)odata); \\\n        if (me == other) \\\n            return 0; \\\n        return me - other; \\\n    } while (0)\n\n        switch (basetype->type)\n        {\n            case IL2CPP_TYPE_U1:\n                COMPARE_ENUM_VALUES(uint8_t);\n            case IL2CPP_TYPE_I1:\n                COMPARE_ENUM_VALUES(int8_t);\n            case IL2CPP_TYPE_CHAR:\n                COMPARE_ENUM_VALUES_RANGE(Il2CppChar);\n            case IL2CPP_TYPE_U2:\n                COMPARE_ENUM_VALUES_RANGE(uint16_t);\n            case IL2CPP_TYPE_I2:\n                COMPARE_ENUM_VALUES(int16_t);\n            case IL2CPP_TYPE_U4:\n                COMPARE_ENUM_VALUES(uint32_t);\n            case IL2CPP_TYPE_I4:\n                COMPARE_ENUM_VALUES(int32_t);\n            case IL2CPP_TYPE_U8:\n                COMPARE_ENUM_VALUES(uint64_t);\n            case IL2CPP_TYPE_I8:\n                COMPARE_ENUM_VALUES(int64_t);\n            default:\n                IL2CPP_ASSERT(false && \"Implement type 0x%02x in compare_value_to\");\n        }\n\n#undef COMPARE_ENUM_VALUES_RANGE\n#undef COMPARE_ENUM_VALUES\n        return 0;\n    }\n\n    int32_t Enum::get_hashcode(Il2CppObject * thisPtr)\n    {\n        void* data = (char*)thisPtr + sizeof(Il2CppObject);\n        Il2CppClass *basetype = thisPtr->klass->element_class;\n        IL2CPP_ASSERT(basetype);\n\n        if (basetype == il2cpp_defaults.sbyte_class)\n            return *((int8_t*)data);\n        if (basetype == il2cpp_defaults.byte_class)\n            return *((uint8_t*)data);\n        if (basetype == il2cpp_defaults.char_class)\n            return *((Il2CppChar*)data);\n        if (basetype == il2cpp_defaults.uint16_class)\n            return *((uint16_t*)data);\n        if (basetype == il2cpp_defaults.int16_class)\n            return *((uint16_t*)data);\n        if (basetype == il2cpp_defaults.uint32_class)\n            return *((uint32_t*)data);\n        if (basetype == il2cpp_defaults.int32_class)\n            return *((int32_t*)data);\n        if (basetype == il2cpp_defaults.uint64_class || basetype == il2cpp_defaults.int64_class)\n        {\n            int64_t value = *((int64_t*)data);\n            return (int32_t)(value & 0xffffffff) ^ (int32_t)(value >> 32);\n        }\n\n        IL2CPP_ASSERT(0 && \"System_Enum_get_hashcode_icall\");\n        return 0;\n    }\n\n    static uint64_t\n    read_enum_value(char *mem, Il2CppClass* type)\n    {\n        if (type == il2cpp_defaults.byte_class)\n            return *(int8_t*)mem;\n        if (type == il2cpp_defaults.sbyte_class)\n            return *(uint8_t*)mem;\n        if (type == il2cpp_defaults.uint16_class)\n            return *(uint16_t*)mem;\n        if (type == il2cpp_defaults.int16_class)\n            return *(int16_t*)mem;\n        if (type == il2cpp_defaults.uint32_class)\n            return *(uint32_t*)mem;\n        if (type == il2cpp_defaults.int32_class)\n            return *(int32_t*)mem;\n        if (type == il2cpp_defaults.uint64_class)\n            return *(uint64_t*)mem;\n        if (type == il2cpp_defaults.int64_class)\n            return *(int64_t*)mem;\n\n        IL2CPP_ASSERT(0);\n\n        return 0;\n    }\n\n    static void\n    write_enum_value(char *mem, Il2CppClass* type, uint64_t value)\n    {\n        if (type == il2cpp_defaults.byte_class || type == il2cpp_defaults.sbyte_class)\n        {\n            uint8_t *p = (uint8_t*)mem;\n            *p = (uint8_t)value;\n        }\n        else if (type == il2cpp_defaults.uint16_class || type == il2cpp_defaults.int16_class)\n        {\n            uint16_t *p = (uint16_t*)mem;\n            *p = (uint16_t)value;\n        }\n        else if (type == il2cpp_defaults.uint32_class || type == il2cpp_defaults.int32_class)\n        {\n            uint32_t *p = (uint32_t*)mem;\n            *p = (uint32_t)value;\n        }\n        else if (type == il2cpp_defaults.uint64_class || type == il2cpp_defaults.int64_class)\n        {\n            uint64_t *p = (uint64_t*)mem;\n            *p = value;\n        }\n        else\n        {\n            IL2CPP_ASSERT(0);\n        }\n    }\n\n    Il2CppObject * Enum::ToObject(Il2CppReflectionType * enumType, Il2CppObject * value)\n    {\n        //MonoDomain *domain;\n        Il2CppClass *enumc, *objc;\n        Il2CppObject *res;\n        Il2CppClass *etype;\n        uint64_t val;\n\n        IL2CPP_CHECK_ARG_NULL(enumType);\n        IL2CPP_CHECK_ARG_NULL(value);\n\n        //domain = mono_object_domain (enumType);\n        enumc = Class::FromIl2CppType(enumType->type);\n        objc = Object::GetClass(value);\n\n        //if (!enumc->enumtype)\n        //  mono_raise_exception (mono_get_exception_argument (\"enumType\", \"Type provided must be an Enum.\"));\n        //if (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 && objc->byval_arg.type <= MONO_TYPE_U8)))\n        //  mono_raise_exception (mono_get_exception_argument (\"value\", \"The value passed in must be an enum base or an underlying type for an enum, such as an Int32.\"));\n\n        etype = Class::GetElementClass(enumc);\n        if (!etype)\n            /* MS throws this for typebuilders */\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetArgumentException(\"Type must be a type provided by the runtime.\", \"enumType\"));\n\n        res = (Il2CppObject*)il2cpp::vm::Object::New(enumc);\n        //val = read_enum_value ((char *)value + sizeof (mscorlib_System_Object), objc->enumtype? mono_class_enum_basetype (objc)->type: objc->byval_arg.type);\n        val = read_enum_value((char*)value + sizeof(Il2CppObject), objc->enumtype ? objc->element_class : objc);\n        write_enum_value((char*)res + sizeof(Il2CppObject), etype, val);\n\n        return res;\n    }\n\n    Il2CppReflectionType * Enum::get_underlying_type(Il2CppReflectionType *type)\n    {\n        const Il2CppType *etype;\n\n        etype = Class::GetEnumBaseType(Class::FromIl2CppType(type->type));\n        if (!etype)\n            /* MS throws this for typebuilders */\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetArgumentException(\"Type must be a type provided by the runtime.\", \"enumType\"));\n\n        return il2cpp::vm::Reflection::GetTypeObject(etype);\n    }\n\n#if NET_4_0\n    bool Enum::GetEnumValuesAndNames(Il2CppReflectionRuntimeType* enumType, Il2CppArray** values, Il2CppArray** names)\n    {\n        return vm::Enum::GetEnumValuesAndNames(Class::FromIl2CppType(enumType->type.type), values, names);\n    }\n\n    bool Enum::InternalHasFlag(Il2CppObject* thisPtr, Il2CppObject* flags)\n    {\n        Il2CppClass* enumClass = Class::FromIl2CppType(Class::GetEnumBaseType(thisPtr->klass));\n        int32_t size = Class::GetValueSize(enumClass, NULL);\n        uint64_t a_val = 0, b_val = 0;\n\n        memcpy(&a_val, Object::Unbox(thisPtr), size);\n        memcpy(&b_val, Object::Unbox(flags), size);\n\n        return (a_val & b_val) == b_val;\n    }\n\n    int32_t Enum::InternalCompareTo(Il2CppObject* o1, Il2CppObject* o2)\n    {\n        return compare_value_to(o1, o2);\n    }\n\n    Il2CppObject* Enum::InternalBoxEnum(Il2CppReflectionRuntimeType* enumType, int64_t value)\n    {\n        return Object::Box(Class::FromIl2CppType(enumType->type.type), &value);\n    }\n\n    Il2CppReflectionRuntimeType* Enum::InternalGetUnderlyingType(Il2CppReflectionRuntimeType* enumType)\n    {\n        return reinterpret_cast<Il2CppReflectionRuntimeType*>(get_underlying_type(&enumType->type));\n    }\n\n#endif\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Enum.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppObject;\nstruct Il2CppReflectionType;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Enum\n    {\n    public:\n        static Il2CppObject* ToObject(Il2CppReflectionType* enumType, Il2CppObject* value);\n        static int compare_value_to(Il2CppObject* thisPtr, Il2CppObject* other);\n        static int32_t get_hashcode(Il2CppObject* thisPtr);\n        static Il2CppObject* get_value(Il2CppObject* thisPtr);\n        static Il2CppReflectionType* get_underlying_type(Il2CppReflectionType* type);\n\n#if NET_4_0\n        static bool GetEnumValuesAndNames(Il2CppReflectionRuntimeType* enumType, Il2CppArray** values, Il2CppArray** names);\n        static bool InternalHasFlag(Il2CppObject* thisPtr, Il2CppObject* flags);\n        static int32_t InternalCompareTo(Il2CppObject* o1, Il2CppObject* o2);\n        static Il2CppObject* InternalBoxEnum(Il2CppReflectionRuntimeType* enumType, int64_t value);\n        static Il2CppReflectionRuntimeType* InternalGetUnderlyingType(Il2CppReflectionRuntimeType* enumType);\n#endif\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Environment.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n\n#include \"icalls/mscorlib/System/Environment.h\"\n\n#include \"os/Time.h\"\n#include \"os/Environment.h\"\n\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/String.h\"\n#include \"vm/Exception.h\"\n\n#include \"utils/PathUtils.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/Environment.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    static int32_t exitcode = 0;\n    static bool socket_security_enabled = false;\n\n    static Il2CppArray* ToIl2CppArray(const std::vector<std::string>& strings)\n    {\n        Il2CppClass *klass = il2cpp::vm::Class::GetArrayClass(il2cpp_defaults.string_class, 1);\n        Il2CppArray* array = (Il2CppArray*)il2cpp::vm::Array::NewSpecific(klass, (il2cpp_array_size_t)strings.size());\n\n        for (size_t i = 0, size = strings.size(); i < size; ++i)\n            il2cpp_array_setref(array, i, il2cpp::vm::String::New(strings[i].c_str()));\n\n        return array;\n    }\n\n    Il2CppString* Environment::get_MachineName()\n    {\n        return il2cpp::vm::String::New(il2cpp::os::Environment::GetMachineName().c_str());\n    }\n\n    Il2CppString* Environment::get_NewLine(void)\n    {\n        return il2cpp::vm::String::NewUtf16(kIl2CppNewLine);\n    }\n\n    bool Environment::get_SocketSecurityEnabled()\n    {\n        return socket_security_enabled;\n    }\n\n    int32_t Environment::get_TickCount()\n    {\n        return il2cpp::os::Time::GetTicksMillisecondsMonotonic();\n    }\n\n    int32_t Environment::get_ProcessorCount()\n    {\n        return il2cpp::os::Environment::GetProcessorCount();\n    }\n\n    Il2CppArray* Environment::GetCommandLineArgs()\n    {\n        Il2CppArray *res;\n        int i;\n        int num_main_args = utils::Environment::GetNumMainArgs();\n        const std::vector<UTF16String>& mainArgs = utils::Environment::GetMainArgs();\n\n        Il2CppClass *klass = il2cpp::vm::Class::GetArrayClass(il2cpp_defaults.string_class, 1);\n        res = (Il2CppArray*)il2cpp::vm::Array::NewSpecific(klass, num_main_args);\n\n        for (i = 0; i < num_main_args; ++i)\n            il2cpp_array_setref(res, i, il2cpp::vm::String::NewUtf16(mainArgs[i].c_str(), static_cast<int>(mainArgs[i].length())));\n\n        return res;\n    }\n\n    Il2CppArray* Environment::GetEnvironmentVariableNames()\n    {\n        return ToIl2CppArray(il2cpp::os::Environment::GetEnvironmentVariableNames());\n    }\n\n    Il2CppString* Environment::GetWindowsFolderPath(int32_t folder)\n    {\n        return il2cpp::vm::String::New(il2cpp::os::Environment::GetWindowsFolderPath(folder).c_str());\n    }\n\n    Il2CppString* Environment::internalGetHome()\n    {\n        return il2cpp::vm::String::New(il2cpp::os::Environment::GetHomeDirectory().c_str());\n    }\n\n    Il2CppArray* Environment::GetLogicalDrivesInternal()\n    {\n        return ToIl2CppArray(il2cpp::os::Environment::GetLogicalDrives());\n    }\n\n    void Environment::InternalSetEnvironmentVariable(Il2CppString* variable, Il2CppString* value)\n    {\n        const std::string variableStr(utils::StringUtils::Utf16ToUtf8(utils::StringUtils::GetChars(variable)));\n\n        const bool clearValue = value == NULL || utils::StringUtils::GetLength(value) == 0 || utils::StringUtils::GetChars(0) == 0;\n\n        const std::string valueStr = clearValue ? std::string() : utils::StringUtils::Utf16ToUtf8(utils::StringUtils::GetChars(value));\n\n        il2cpp::os::Environment::SetEnvironmentVariable(variableStr, valueStr);\n    }\n\n    void Environment::internalBroadcastSettingChange()\n    {\n        NOT_IMPLEMENTED_ICALL(Environment::internalBroadcastSettingChange);\n    }\n\n    Il2CppString * Environment::GetMachineConfigPath(void)\n    {\n        const char* frameworkVersion = vm::Runtime::GetFrameworkVersion();\n\n        std::string path = utils::PathUtils::Combine(\n                vm::Runtime::GetConfigDir(), utils::PathUtils::Combine(\n                    utils::StringView<char>(\"mono\"), utils::PathUtils::Combine(\n                        utils::StringView<char>(frameworkVersion, strlen(frameworkVersion)), utils::StringView<char>(\"machine.config\"))));\n\n        return vm::String::NewWrapper(path.c_str());\n    }\n\n    Il2CppString * Environment::internalGetEnvironmentVariable(Il2CppString *name)\n    {\n        const std::string nameStr(utils::StringUtils::Utf16ToUtf8(utils::StringUtils::GetChars(name)));\n        const std::string variable(il2cpp::os::Environment::GetEnvironmentVariable(nameStr));\n\n        return variable.empty() ? NULL : il2cpp::vm::String::New(variable.c_str());\n    }\n\n    Il2CppString * Environment::GetOSVersionString(void)\n    {\n        return il2cpp::vm::String::New(il2cpp::os::Environment::GetOsVersionString().c_str());\n    }\n\n    int Environment::get_Platform(void)\n    {\n#ifdef _MSC_VER\n        return 2;\n#else\n        return 4;\n#endif\n    }\n\n    int32_t Environment::get_ExitCode()\n    {\n        return exitcode;\n    }\n\n    void Environment::set_ExitCode(int32_t value)\n    {\n        exitcode = value;\n    }\n\n    bool Environment::get_HasShutdownStarted()\n    {\n        return vm::Runtime::IsShuttingDown();\n    }\n\n    Il2CppString* Environment::get_EmbeddingHostName()\n    {\n        return il2cpp::vm::String::New(\"IL2CPP\");\n    }\n\n    Il2CppString* Environment::get_UserName()\n    {\n        return il2cpp::vm::String::New(il2cpp::os::Environment::GetOsUserName().c_str());\n    }\n\n    void Environment::Exit(int32_t exitCode)\n    {\n        il2cpp::os::Environment::Exit(exitCode);\n    }\n\n    Il2CppString* Environment::internalGetGacPath()\n    {\n        // Not used by the runtime. Used only by the Mono compiler (mcs).\n        NOT_IMPLEMENTED_ICALL(Environment::internalGetGacPatH);\n\n        return 0;\n    }\n\n#if NET_4_0\n    bool Environment::GetIs64BitOperatingSystem()\n    {\n        if (sizeof(void*) == 8)\n            return true;\n        return il2cpp::os::Environment::Is64BitOs();\n    }\n\n    int32_t Environment::GetPageSize()\n    {\n        return IL2CPP_PAGE_SIZE;\n    }\n\n    Il2CppString* Environment::GetNewLine()\n    {\n        return get_NewLine();\n    }\n\n    Il2CppString* Environment::internalGetEnvironmentVariable_native(Il2CppIntPtr variablePtr)\n    {\n        const char *value = (char*)variablePtr.m_value;\n\n        if (!value)\n            return NULL;\n\n        const std::string nameStr(value);\n        const std::string variable(il2cpp::os::Environment::GetEnvironmentVariable(nameStr));\n\n        return variable.empty() ? NULL : il2cpp::vm::String::New(variable.c_str());\n    }\n\n    Il2CppString* Environment::get_bundled_machine_config()\n    {\n        NOT_IMPLEMENTED_ICALL(Environment::get_bundled_machine_config);\n        IL2CPP_UNREACHABLE;\n    }\n\n#endif\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Environment.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\nstruct Il2CppArray;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Environment\n    {\n    public:\n        static Il2CppString* internalGetGacPath();\n        static int32_t get_ProcessorCount();\n        static bool get_SocketSecurityEnabled();\n        static void internalBroadcastSettingChange();\n        static Il2CppString* GetOSVersionString();\n        static Il2CppString* GetMachineConfigPath();\n        static Il2CppArray* GetLogicalDrivesInternal();\n        static Il2CppArray* GetEnvironmentVariableNames();\n        static Il2CppArray* GetCommandLineArgs();\n        static Il2CppString* internalGetHome();\n        static Il2CppString*  get_NewLine();\n        static Il2CppString* get_MachineName();\n        static int32_t get_ExitCode();\n        static bool get_HasShutdownStarted();\n        static Il2CppString* get_EmbeddingHostName();\n        static Il2CppString* get_UserName();\n        static int get_Platform();\n        static int32_t get_TickCount();\n        static void Exit(int32_t exitCode);\n        static Il2CppString* GetWindowsFolderPath(int32_t folder);\n        static Il2CppString* internalGetEnvironmentVariable(Il2CppString *);\n        static void set_ExitCode(int32_t value);\n        static void InternalSetEnvironmentVariable(Il2CppString* variable, Il2CppString* value);\n#if NET_4_0\n        static bool GetIs64BitOperatingSystem();\n        static int32_t GetPageSize();\n        static Il2CppString* GetNewLine();\n        static Il2CppString* internalGetEnvironmentVariable_native(Il2CppIntPtr variable);\n        static Il2CppString* get_bundled_machine_config();\n#endif\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Exception.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    bool Exception::nIsTransient(int32_t hr)\n    {\n        NOT_IMPLEMENTED_ICALL(Exception::nIsTransient);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    Il2CppObject* Exception::GetMethodFromStackTrace(Il2CppObject* stackTrace)\n    {\n        NOT_IMPLEMENTED_ICALL(Exception::GetMethodFromStackTrace);\n        IL2CPP_UNREACHABLE;\n        return NULL;\n    }\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Exception.h",
    "content": "#pragma once\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Exception\n    {\n    public:\n        static bool nIsTransient(int32_t hr);\n        static Il2CppObject* GetMethodFromStackTrace(Il2CppObject* stackTrace);\n    };\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/GC.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"class-internals.h\"\n#include \"icalls/mscorlib/System/GC.h\"\n#include \"gc/GarbageCollector.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Object.h\"\n#include \"vm/Array.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    void GC::SuppressFinalize(Il2CppObject *obj)\n    {\n        if (obj == NULL)\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetArgumentNullException(\"obj\"));\n\n        il2cpp::gc::GarbageCollector::SuppressFinalizer(obj);\n    }\n\n    int32_t GC::GetGeneration(Il2CppObject* obj)\n    {\n        return il2cpp::gc::GarbageCollector::GetGeneration(obj);\n    }\n\n    void GC::KeepAlive(Il2CppObject* obj)\n    {\n        // do nothing. icall just prevents compilers from optimizing away references to object being passed in\n    }\n\n    void GC::InternalCollect(int generation)\n    {\n        il2cpp::gc::GarbageCollector::Collect(generation);\n    }\n\n    int32_t GC::get_MaxGeneration()\n    {\n        return il2cpp::gc::GarbageCollector::GetMaxGeneration();\n    }\n\n    void GC::RecordPressure(int64_t bytesAllocated)\n    {\n        il2cpp::gc::GarbageCollector::AddMemoryPressure(bytesAllocated);\n    }\n\n    void GC::WaitForPendingFinalizers()\n    {\n        il2cpp::gc::GarbageCollector::WaitForPendingFinalizers();\n    }\n\n    int64_t GC::GetTotalMemory(bool forceFullCollection)\n    {\n        if (forceFullCollection)\n            il2cpp::gc::GarbageCollector::Collect(il2cpp::gc::GarbageCollector::GetMaxGeneration());\n\n        return il2cpp::gc::GarbageCollector::GetUsedHeapSize();\n    }\n\n    void GC::ReRegisterForFinalize(Il2CppObject* obj)\n    {\n        if (obj == NULL)\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetArgumentNullException(\"obj\"));\n\n        il2cpp::gc::GarbageCollector::RegisterFinalizer(obj);\n    }\n\n    int32_t GC::CollectionCount(int32_t generation)\n    {\n        return il2cpp::gc::GarbageCollector::GetCollectionCount(generation);\n    }\n\n#if NET_4_0\n    Il2CppObject* GC::get_ephemeron_tombstone()\n    {\n        return vm::Object::New(il2cpp_defaults.object_class);\n    }\n\n    void GC::register_ephemeron_array(Il2CppArray* array)\n    {\n        // Mono only does something in this icall when SGEN is in use.  We don't have SGEN,\n        // so there is nothing to do here.\n    }\n\n    int32_t GC::GetCollectionCount(int32_t generation)\n    {\n        return CollectionCount(generation);\n    }\n\n    int32_t GC::GetMaxGeneration()\n    {\n        return get_MaxGeneration();\n    }\n\n    void GC::_ReRegisterForFinalize(Il2CppObject* o)\n    {\n        ReRegisterForFinalize(o);\n    }\n\n    void GC::_SuppressFinalize(Il2CppObject* o)\n    {\n        SuppressFinalize(o);\n    }\n\n#endif\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/GC.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API GC\n    {\n    public:\n        static int get_MaxGeneration();\n        static int32_t CollectionCount(int32_t generation);\n        static int32_t GetGeneration(Il2CppObject* obj);\n        static int64_t GetTotalMemory(bool forceFullCollection);\n        static void InternalCollect(int generation);\n        static void KeepAlive(Il2CppObject* obj);\n        static void ReRegisterForFinalize(Il2CppObject* obj);\n        static void SuppressFinalize(Il2CppObject *);\n        static void RecordPressure(int64_t bytesAllocated);\n        static void WaitForPendingFinalizers();\n#if NET_4_0\n        static Il2CppObject* get_ephemeron_tombstone();\n        static void register_ephemeron_array(Il2CppArray* array);\n        static int32_t GetCollectionCount(int32_t generation);\n        static int32_t GetMaxGeneration();\n        static void _ReRegisterForFinalize(Il2CppObject* o);\n        static void _SuppressFinalize(Il2CppObject* o);\n#endif\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Math.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <math.h>\n#include <limits>\n#include <float.h>\n#include \"icalls/mscorlib/System/Math.h\"\n#include \"vm/Exception.h\"\n\n#ifdef _MSC_VER\n# define ISNAN _isnan\n#else\n# define ISNAN isnan\n#endif\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    double Math::Acos(double val)\n    {\n        return acos(val);\n    }\n\n    double Math::Asin(double val)\n    {\n        return asin(val);\n    }\n\n    double Math::Atan(double val)\n    {\n        return atan(val);\n    }\n\n    double Math::Atan2(double y, double x)\n    {\n        return atan2(y, x);\n    }\n\n    double Math::Cos(double val)\n    {\n        return cos(val);\n    }\n\n    double Math::Cosh(double val)\n    {\n        return cosh(val);\n    }\n\n    double Math::Exp(double val)\n    {\n        return exp(val);\n    }\n\n    double Math::Floor(double x)\n    {\n        return floor(x);\n    }\n\n    double Math::Log(double x)\n    {\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(Math::Log, \"Determin what value of NAN to use\");\n\n        if (x == 0)\n            return -HUGE_VAL;\n        else if (x < 0)\n            return std::numeric_limits<double>::signaling_NaN();\n        //return NAN;\n\n        return log(x);\n    }\n\n    double Math::Log10(double val)\n    {\n        return log10(val);\n    }\n\n    double Math::Pow(double val, double exp)\n    {\n        double res = pow(val, exp);\n        if (ISNAN(res))\n            return 1.0;\n\n        if (res == -0.0)\n            return 0.0;\n\n        return res;\n    }\n\n    double Math::Round(double x)\n    {\n        double int_part, dec_part;\n        int_part = floor(x);\n        dec_part = x - int_part;\n        if (((dec_part == 0.5) &&\n             ((2.0 * ((int_part / 2.0) - floor(int_part / 2.0))) != 0.0)) ||\n            (dec_part > 0.5))\n        {\n            int_part++;\n        }\n        return int_part;\n    }\n\n    double Math::Sin(double val)\n    {\n        return sin(val);\n    }\n\n    double Math::Sinh(double val)\n    {\n        return sinh(val);\n    }\n\n    double Math::Sqrt(double val)\n    {\n        return sqrt(val);\n    }\n\n    double Math::Tan(double val)\n    {\n        return tan(val);\n    }\n\n    double Math::Tanh(double val)\n    {\n        return tanh(val);\n    }\n\n    double Math::Round2(double value, int32_t digits, bool away_from_zero)\n    {\n        double p;\n        if (value == HUGE_VAL)\n            return HUGE_VAL;\n        if (value == -HUGE_VAL)\n            return -HUGE_VAL;\n        if (digits == 0 && !away_from_zero)\n            return Round(value);\n\n        p = pow(10.0, digits);\n\n// Note: Migrate to C++11 when possible\n#if 0\n        if (away_from_zero)\n            return std::round(value * p) / p;\n        else\n            return std::rint(value * p) / p;\n#else\n        if (away_from_zero)\n            return (value >= 0.0) ? floor(value * p + 0.5) / p : ceil(value * p - 0.5) / p;\n        else\n            return (value >= 0.0) ? ceil(value * p - 0.5) / p : floor(value * p + 0.5) / p;\n#endif\n    }\n\n#if NET_4_0\n    double Math::Abs(double value)\n    {\n        return fabs(value);\n    }\n\n    double Math::Ceiling(double a)\n    {\n        return ceil(a);\n    }\n\n    double Math::SplitFractionDouble(double* value)\n    {\n        return modf(*value, value);\n    }\n\n    float Math::Abs(float value)\n    {\n        return fabsf(value);\n    }\n\n#endif\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Math.h",
    "content": "#pragma once\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Math\n    {\n    public:\n        static double Acos(double val);\n        static double Asin(double val);\n        static double Atan(double val);\n        static double Atan2(double y, double x);\n        static double Cos(double val);\n        static double Cosh(double val);\n        static double Exp(double val);\n        static double Floor(double x);\n        static double Log(double x);\n        static double Log10(double val);\n        static double Pow(double val, double exp);\n        static double Round(double x);\n        static double Round2(double value, int32_t digits, bool away_from_zero);\n        static double Sin(double val);\n        static double Sinh(double val);\n        static double Sqrt(double val);\n        static double Tan(double val);\n        static double Tanh(double val);\n#if NET_4_0\n        static double Abs(double value);\n        static double Ceiling(double a);\n        static double SplitFractionDouble(double* value);\n        static float Abs(float value);\n#endif\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/MissingMemberException.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"MissingMemberException.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    Il2CppString* MissingMemberException::FormatSignature(Il2CppArray* signature)\n    {\n        NOT_IMPLEMENTED_ICALL(MissingMemberException::FormatSignature);\n        IL2CPP_UNREACHABLE;\n        return NULL;\n    }\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/MissingMemberException.h",
    "content": "#pragma once\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API MissingMemberException\n    {\n    public:\n        static Il2CppString* FormatSignature(Il2CppArray* signature);\n    };\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/MonoCustomAttrs.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <memory>\n#include \"icalls/mscorlib/System/MonoCustomAttrs.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Object.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Exception.h\"\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    Il2CppArray * MonoCustomAttrs::GetCustomAttributesInternal(Il2CppObject* obj, Il2CppReflectionType* type, bool pseudoAttrs)\n    {\n        IL2CPP_ASSERT(pseudoAttrs == false && \"System_MonoCustomAttrs_GetCustomAttributesInternal_icall with pseudoAttrs == true has not been implemented yet\");\n\n        CustomAttributesCache *cinfo = il2cpp::vm::Reflection::GetCustomAttrsInfo(obj);\n\n        if (!cinfo)\n        {\n            return il2cpp::vm::Array::New(il2cpp_defaults.object_class, 0);\n        }\n\n        if (!type)\n        {\n            Il2CppArray *result = il2cpp::vm::Array::New(il2cpp_defaults.object_class, cinfo->count);\n            memcpy(il2cpp_array_addr(result, Il2CppObject*, 0), cinfo->attributes, sizeof(Il2CppObject*) * cinfo->count);\n\n            return result;\n        }\n\n        Il2CppClass* attributeClass = Class::FromIl2CppType(type->type);\n        int count = 0;\n        for (int i = 0; i < cinfo->count; i++)\n        {\n            Il2CppObject* attr = cinfo->attributes[i];\n            if (Class::IsAssignableFrom(attributeClass, attr->klass))\n                count++;\n        }\n\n        Il2CppArray *result = il2cpp::vm::Array::New(il2cpp_defaults.object_class, count);\n\n        int index = 0;\n        for (int i = 0; i < cinfo->count; i++)\n        {\n            Il2CppObject* attr = cinfo->attributes[i];\n            if (!Class::IsAssignableFrom(attributeClass, attr->klass))\n                continue;\n\n            il2cpp_array_setref(result, index, cinfo->attributes[i]);\n            index++;\n        }\n\n        return result;\n    }\n\n    bool MonoCustomAttrs::IsDefinedInternal(Il2CppObject *obj, Il2CppReflectionType *attr_type)\n    {\n        return il2cpp::vm::Reflection::HasAttribute(obj, Class::FromIl2CppType(attr_type->type));\n    }\n\n#if !NET_4_0\n    static Il2CppObject* CreateCustomAttributeData(Il2CppObject* attribute)\n    {\n        static const MethodInfo* customAttributeDataConstructor;\n        void *params[3];\n\n        if (!customAttributeDataConstructor)\n            customAttributeDataConstructor = vm::Class::GetMethodFromName(il2cpp_defaults.customattribute_data_class, \".ctor\", 3);\n\n        const MethodInfo* attributeConstructor = vm::Class::GetMethodFromName(attribute->klass, \".ctor\", 0);\n\n        if (attributeConstructor == NULL)\n            NOT_IMPLEMENTED_ICALL(MonoCustomAttrs::GetCustomAttributesDataInternal);\n\n        Il2CppObject* customAttributeData = vm::Object::New(il2cpp_defaults.customattribute_data_class);\n        params[0] = vm::Reflection::GetMethodObject(attributeConstructor, NULL);\n        params[1] = params[2] = NULL;\n        vm::Runtime::Invoke(customAttributeDataConstructor, customAttributeData, params, NULL);\n        return customAttributeData;\n    }\n\n#else\n    static Il2CppObject* CreateCustomAttributeData(Il2CppObject* attribute)\n    {\n        static const MethodInfo* customAttributeDataConstructor;\n        void *params[4];\n\n        if (!customAttributeDataConstructor)\n            customAttributeDataConstructor = vm::Class::GetMethodFromName(il2cpp_defaults.customattribute_data_class, \".ctor\", 4);\n\n        const MethodInfo* attributeConstructor = vm::Class::GetMethodFromName(attribute->klass, \".ctor\", 0);\n\n        if (attributeConstructor == NULL)\n            NOT_IMPLEMENTED_ICALL(MonoCustomAttrs::GetCustomAttributesDataInternal);\n\n        Il2CppObject* customAttributeData = vm::Object::New(il2cpp_defaults.customattribute_data_class);\n        int argCount = 0;\n        params[0] = vm::Reflection::GetMethodObject(attributeConstructor, NULL);\n        params[1] = vm::Reflection::GetAssemblyObject(MetadataCache::GetAssemblyFromIndex(attribute->klass->image->assemblyIndex));\n        params[2] = &Il2CppIntPtr::Zero;\n        params[3] = &argCount;\n        vm::Runtime::Invoke(customAttributeDataConstructor, customAttributeData, params, NULL);\n        return customAttributeData;\n    }\n\n#endif\n\n    Il2CppArray* MonoCustomAttrs::GetCustomAttributesDataInternal(Il2CppObject* obj)\n    {\n        CustomAttributesCache *cinfo = il2cpp::vm::Reflection::GetCustomAttrsInfo(obj);\n\n        if (!cinfo)\n            return il2cpp::vm::Array::New(il2cpp_defaults.customattribute_data_class, 0);\n\n        Il2CppArray* result = il2cpp::vm::Array::New(il2cpp_defaults.customattribute_data_class, cinfo->count);\n        for (int i = 0; i < cinfo->count; ++i)\n        {\n            Il2CppObject* attribute = CreateCustomAttributeData(cinfo->attributes[i]);\n            il2cpp_array_setref(result, i, attribute);\n        }\n\n        return result;\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/MonoCustomAttrs.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppArray;\nstruct Il2CppObject;\nstruct Il2CppReflectionType;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API MonoCustomAttrs\n    {\n    public:\n        static Il2CppArray* GetCustomAttributesDataInternal(Il2CppObject* obj);\n        static Il2CppArray * GetCustomAttributesInternal(Il2CppObject* obj, Il2CppReflectionType* type, bool pseudoAttrs);\n        static bool IsDefinedInternal(Il2CppObject *obj, Il2CppReflectionType *attr_type);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/MonoEnumInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <string>\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"icalls/mscorlib/System/MonoEnumInfo.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Enum.h\"\n#include \"vm/Field.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/String.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Type.h\"\n#include \"utils/MemoryRead.h\"\n\n#if !NET_4_0\n\nusing namespace il2cpp::vm;\nusing namespace il2cpp::utils;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    void MonoEnumInfo::get_enum_info(Il2CppReflectionType* type, Il2CppEnumInfo* info)\n    {\n        IL2CPP_OBJECT_SETREF(info, utype, Reflection::GetTypeObject(Type::GetUnderlyingType(type->type)));\n        vm::Enum::GetEnumValuesAndNames(Class::FromIl2CppType(type->type), &info->values, &info->names);\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/MonoEnumInfo.h",
    "content": "#pragma once\n#include \"il2cpp-config.h\"\n\n#if !NET_4_0\n\nstruct Il2CppReflectionType;\nstruct Il2CppEnumInfo;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API MonoEnumInfo\n    {\n    public:\n        static void get_enum_info(Il2CppReflectionType* type, Il2CppEnumInfo* info);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/MonoType.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"tabledefs.h\"\n#include \"gc/Allocator.h\"\n#include \"icalls/mscorlib/System/MonoType.h\"\n#include \"utils/Functional.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Field.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/GenericContainer.h\"\n#include \"vm/Method.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/String.h\"\n#include \"vm/Type.h\"\n#include \"vm/Exception.h\"\n#include \"vm-utils/VmStringUtils.h\"\n\n#include <vector>\n#include <set>\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    struct Il2CppEventInfoHash\n    {\n        size_t operator()(const EventInfo* eventInfo) const\n        {\n            return il2cpp::utils::StringUtils::Hash(eventInfo->name);\n        }\n    };\n\n    struct Il2CppEventInfoCompare\n    {\n        bool operator()(const EventInfo* event1, const EventInfo* event2) const\n        {\n            // You can't overload events\n            return strcmp(event1->name, event2->name) == 0;\n        }\n    };\n\n    struct PropertyPair\n    {\n        const PropertyInfo *property;\n        Il2CppClass* originalType;\n\n        PropertyPair(const PropertyInfo *property, Il2CppClass* originalType) : property(property), originalType(originalType)\n        {\n        }\n    };\n\n    typedef std::vector<PropertyPair> PropertyPairVector;\n\n    typedef Il2CppHashMap<const EventInfo*, Il2CppClass*, Il2CppEventInfoHash, Il2CppEventInfoCompare> EventMap;\n\n    bool MonoType::PropertyEqual(const PropertyInfo* prop1, const PropertyInfo* prop2)\n    {\n        // Name check is not enough, property can be overloaded\n        if (strcmp(prop1->name, prop2->name) != 0)\n            return false;\n\n        return vm::Method::IsSameOverloadSignature(prop1, prop2);\n    }\n\n    static bool PropertyPairVectorContains(const PropertyPairVector& properties, const PropertyInfo* property)\n    {\n        for (PropertyPairVector::const_iterator it = properties.begin(), end = properties.end(); it != end; ++it)\n            if (MonoType::PropertyEqual(it->property, property))\n                return true;\n\n        return false;\n    }\n\n    static inline bool IsPublic(const FieldInfo* field)\n    {\n        return (field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC;\n    }\n\n    static inline bool IsPrivate(const FieldInfo* field)\n    {\n        return (field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PRIVATE;\n    }\n\n    static inline bool IsStatic(const FieldInfo* field)\n    {\n        return (field->type->attrs & FIELD_ATTRIBUTE_STATIC) != 0;\n    }\n\n    static inline bool IsPublic(const PropertyInfo* property)\n    {\n        if (property->get != NULL && (property->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)\n            return true;\n\n        if (property->set != NULL && (property->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)\n            return true;\n\n        return false;\n    }\n\n    static inline bool IsPrivate(const PropertyInfo* property)\n    {\n        if (property->get != NULL && (property->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE)\n            return false;\n\n        if (property->set != NULL && (property->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE)\n            return false;\n\n        return true;\n    }\n\n    static inline bool IsStatic(const PropertyInfo* property)\n    {\n        if (property->get != NULL)\n            return (property->get->flags & METHOD_ATTRIBUTE_STATIC) != 0;\n\n        if (property->set != NULL)\n            return (property->set->flags & METHOD_ATTRIBUTE_STATIC) != 0;\n\n        return false;\n    }\n\n    static inline bool IsPublic(const MethodInfo* method)\n    {\n        return (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC;\n    }\n\n    static inline bool IsPrivate(const MethodInfo* method)\n    {\n        return (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PRIVATE;\n    }\n\n    static inline bool IsStatic(const MethodInfo* method)\n    {\n        return (method->flags & METHOD_ATTRIBUTE_STATIC) != 0;\n    }\n\n// From MSDN: An event is considered public to reflection if it has at least one method or accessor that is public.\n    static inline bool IsPublic(const EventInfo* event)\n    {\n        if (event->add != NULL && (event->add->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)\n            return true;\n\n        if (event->remove != NULL && (event->remove->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)\n            return true;\n\n        if (event->raise != NULL && (event->raise->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)\n            return true;\n\n        return false;\n    }\n\n    static inline bool IsPrivate(const EventInfo* event)\n    {\n        if (event->add != NULL && (event->add->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE)\n            return false;\n\n        if (event->remove != NULL && (event->remove->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE)\n            return false;\n\n        if (event->raise != NULL && (event->raise->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE)\n            return false;\n\n        return true;\n    }\n\n    static inline bool IsStatic(const EventInfo* event)\n    {\n        if (event->add != NULL)\n            return (event->add->flags & METHOD_ATTRIBUTE_STATIC) != 0;\n\n        if (event->remove != NULL)\n            return (event->remove->flags & METHOD_ATTRIBUTE_STATIC) != 0;\n\n        if (event->raise != NULL)\n            return (event->raise->flags & METHOD_ATTRIBUTE_STATIC) != 0;\n\n        return false;\n    }\n\n    template<typename MemberInfo, typename NameFilter>\n    static bool CheckMemberMatch(const MemberInfo* member, const Il2CppClass* type, const Il2CppClass* originalType, int32_t bindingFlags, const NameFilter& nameFilter)\n    {\n        uint32_t accessBindingFlag = IsPublic(member) ? BFLAGS_Public : BFLAGS_NonPublic;\n\n        if ((bindingFlags & accessBindingFlag) == 0)\n            return false;\n\n        if (type != originalType && IsPrivate(member)) // Private members are not part of derived class\n            return false;\n\n        if (IsStatic(member))\n        {\n            if ((bindingFlags & BFLAGS_Static) == 0)\n                return false;\n\n            if ((bindingFlags & BFLAGS_FlattenHierarchy) == 0 && type != originalType)\n                return false;\n        }\n        else if ((bindingFlags & BFLAGS_Instance) == 0)\n        {\n            return false;\n        }\n\n        if (!nameFilter(member->name))\n            return false;\n\n        return true;\n    }\n\n    static inline bool ValidBindingFlagsForGetMember(uint32_t bindingFlags)\n    {\n        return (bindingFlags & BFLAGS_Static) != 0 || (bindingFlags & BFLAGS_Instance) != 0;\n    }\n\n    Il2CppReflectionAssembly* MonoType::get_Assembly(Il2CppReflectionType* type)\n    {\n        Il2CppClass* klass = Class::FromIl2CppType(type->type);\n\n        return il2cpp::vm::Reflection::GetAssemblyObject(MetadataCache::GetAssemblyFromIndex(klass->image->assemblyIndex));\n    }\n\n    int MonoType::get_attributes(Il2CppReflectionType *type)\n    {\n        Il2CppClass *klass = Class::FromSystemType(type);\n\n        return klass->flags;\n    }\n\n    int MonoType::GetArrayRank(Il2CppReflectionType *type)\n    {\n        if (type->type->type != IL2CPP_TYPE_ARRAY && type->type->type != IL2CPP_TYPE_SZARRAY)\n            IL2CPP_ASSERT(\"Type must be an array type\");\n\n        Il2CppClass* klass = Class::FromIl2CppType(type->type);\n        return klass->rank;\n    }\n\n    Il2CppReflectionType* MonoType::get_DeclaringType(Il2CppReflectionMonoType *monoType)\n    {\n        return vm::Type::GetDeclaringType(monoType->GetIl2CppType());\n    }\n\n    bool MonoType::IsGenericParameter(const Il2CppType *type)\n    {\n        return !type->byref && (type->type == IL2CPP_TYPE_VAR || type->type == IL2CPP_TYPE_MVAR);\n    }\n\n    bool MonoType::get_IsGenericParameter(Il2CppReflectionType* type)\n    {\n        return IsGenericParameter(type->type);\n    }\n\n    Il2CppReflectionModule* MonoType::get_Module(Il2CppReflectionType* type)\n    {\n        Il2CppClass* klass = Class::FromIl2CppType(type->type);\n\n        return il2cpp::vm::Reflection::GetModuleObject(klass->image);\n    }\n\n    Il2CppString * MonoType::get_Name(Il2CppReflectionType * type)\n    {\n        Il2CppClass* typeInfo = Class::FromIl2CppType(type->type);\n\n        if (type->type->byref)\n        {\n            std::string n = il2cpp::utils::StringUtils::Printf(\"%s&\", typeInfo->name);\n            return String::New(n.c_str());\n        }\n        else\n        {\n            return il2cpp::vm::String::NewWrapper(typeInfo->name);\n        }\n    }\n\n    Il2CppString *  MonoType::get_Namespace(Il2CppReflectionType *type)\n    {\n        Il2CppClass* typeInfo = Class::FromIl2CppType(type->type);\n\n        while (Il2CppClass* declaringType = Class::GetDeclaringType(typeInfo))\n            typeInfo = declaringType;\n\n        if (typeInfo->namespaze[0] == '\\0')\n            return NULL;\n        else\n            return il2cpp::vm::String::NewWrapper(typeInfo->namespaze);\n    }\n\n    Il2CppReflectionType * MonoType::get_BaseType(Il2CppReflectionType * type)\n    {\n        Il2CppClass* klass = Class::FromIl2CppType(type->type);\n\n        return klass->parent ? il2cpp::vm::Reflection::GetTypeObject(klass->parent->byval_arg) : NULL;\n    }\n\n    Il2CppArray* MonoType::GetConstructors_internal(Il2CppReflectionType* type, int32_t bflags, Il2CppReflectionType *reftype)\n    {\n        static Il2CppClass *System_Reflection_ConstructorInfo = NULL;\n        Il2CppClass *startklass, *klass, *refklass;\n        Il2CppArray *res;\n        const MethodInfo *method;\n        int match;\n        void* iter = NULL;\n        typedef std::vector<std::pair<const MethodInfo*, Il2CppClass*> > MethodPairVector;\n        MethodPairVector tmp_vec;\n\n        if (type->type->byref)\n            return il2cpp::vm::Array::NewCached(il2cpp_defaults.method_info_class, 0);\n        klass = startklass = Class::FromIl2CppType(type->type);\n\n        refklass = Class::FromIl2CppType(reftype->type);\n\n        if (!System_Reflection_ConstructorInfo)\n            System_Reflection_ConstructorInfo = Class::FromName(il2cpp_defaults.corlib, \"System.Reflection\", \"ConstructorInfo\");\n\n        iter = NULL;\n        while ((method = Class::GetMethods(klass, &iter)))\n        {\n            match = 0;\n            if (strcmp(method->name, \".ctor\") && strcmp(method->name, \".cctor\"))\n                continue;\n            if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)\n            {\n                if (bflags & BFLAGS_Public)\n                    match++;\n            }\n            else\n            {\n                if (bflags & BFLAGS_NonPublic)\n                    match++;\n            }\n            if (!match)\n                continue;\n            match = 0;\n            if (method->flags & METHOD_ATTRIBUTE_STATIC)\n            {\n                if (bflags & BFLAGS_Static)\n                    if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n                        match++;\n            }\n            else\n            {\n                if (bflags & BFLAGS_Instance)\n                    match++;\n            }\n\n            if (!match)\n                continue;\n\n            tmp_vec.push_back(std::make_pair(method, refklass));\n        }\n\n        res = il2cpp::vm::Array::NewCached(System_Reflection_ConstructorInfo, (il2cpp_array_size_t)tmp_vec.size());\n\n        for (size_t i = 0; i < tmp_vec.size(); ++i)\n            il2cpp_array_setref(res, i, (Il2CppObject*)Reflection::GetMethodObject(tmp_vec[i].first, tmp_vec[i].second));\n\n        return res;\n    }\n\n    mscorlib_System_Reflection_MethodInfo *  MonoType::GetCorrespondingInflatedMethod(Il2CppReflectionMonoType *, Il2CppReflectionMonoType *)\n    {\n        NOT_SUPPORTED_IL2CPP(MonoType::GetCorrespondingInflatedMethod, \"This icall is only used by System.Reflection.Emit.TypeBuilder.\");\n        return 0;\n    }\n\n    Il2CppReflectionType* MonoType::GetElementType(Il2CppReflectionType * type)\n    {\n        Il2CppClass *klass;\n\n        klass = Class::FromIl2CppType(type->type);\n\n        // GetElementType should only return a type for:\n        // Array Pointer PassedByRef\n        if (type->type->byref)\n            return il2cpp::vm::Reflection::GetTypeObject(klass->byval_arg);\n        else if (klass->element_class && IL2CPP_CLASS_IS_ARRAY(klass))\n            return il2cpp::vm::Reflection::GetTypeObject(klass->element_class->byval_arg);\n        else if (klass->element_class && type->type->type == IL2CPP_TYPE_PTR)\n            return il2cpp::vm::Reflection::GetTypeObject(klass->element_class->byval_arg);\n        else\n            return NULL;\n    }\n\n    template<typename NameFilter>\n    static inline Il2CppReflectionField* GetFieldFromType(Il2CppClass* type, Il2CppClass* const originalType, int32_t bindingFlags, const NameFilter& nameFilter)\n    {\n        void* iter = NULL;\n        while (FieldInfo* field = Class::GetFields(type, &iter))\n        {\n            if (CheckMemberMatch(field, type, originalType, bindingFlags, nameFilter))\n            {\n                return Reflection::GetFieldObject(originalType, field);\n            }\n        }\n\n        return NULL;\n    }\n\n    template<typename NameFilter>\n    static Il2CppReflectionField* GetFieldImpl(Il2CppClass* type, int32_t bindingFlags, const NameFilter& nameFilter)\n    {\n        Il2CppReflectionField* field = GetFieldFromType(type, type, bindingFlags, nameFilter);\n\n        if (field == NULL && (bindingFlags & BFLAGS_DeclaredOnly) == 0)\n        {\n            Il2CppClass* const originalType = type;\n            type = Class::GetParent(type);\n\n            while (field == NULL && type != NULL)\n            {\n                field = GetFieldFromType(type, originalType, bindingFlags, nameFilter);\n                type = Class::GetParent(type);\n            }\n        }\n\n        return field;\n    }\n\n    Il2CppReflectionField* MonoType::GetField(Il2CppReflectionType* _this, Il2CppString* name, int32_t bindingFlags)\n    {\n        using namespace utils;\n        using namespace utils::functional;\n\n        if (_this->type->byref)\n            return NULL;\n\n        Il2CppClass* type = Class::FromIl2CppType(_this->type);\n\n        if (bindingFlags & BFLAGS_IgnoreCase)\n        {\n            return GetFieldImpl(type, bindingFlags, Filter<std::string, VmStringUtils::CaseInsensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n        }\n\n        return GetFieldImpl(type, bindingFlags, Filter<std::string, VmStringUtils::CaseSensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n    }\n\n    template<typename NameFilter>\n    static inline void CollectTypeFields(Il2CppClass* type, const Il2CppClass* const originalType, int32_t bindingFlags, std::vector<FieldInfo*>& fields, const NameFilter& nameFilter)\n    {\n        void* iterator = NULL;\n        FieldInfo* field = NULL;\n        while ((field = Class::GetFields(type, &iterator)) != NULL)\n        {\n            if (CheckMemberMatch(field, type, originalType, bindingFlags, nameFilter))\n                fields.push_back(field);\n        }\n    }\n\n    template<typename NameFilter>\n    static inline Il2CppArray* GetFieldsImpl(Il2CppReflectionType* _this, int bindingFlags, Il2CppReflectionType* reflectedType, const NameFilter& nameFilter)\n    {\n        if (reflectedType->type->byref || !ValidBindingFlagsForGetMember(bindingFlags))\n            return Array::New(il2cpp_defaults.field_info_class, 0);\n\n        std::vector<FieldInfo*> fields;\n        Il2CppClass* typeInfo = Class::FromIl2CppType(reflectedType->type);\n        Il2CppClass* const originalType = typeInfo;\n\n        CollectTypeFields(typeInfo, typeInfo, bindingFlags, fields, nameFilter);\n\n        if ((bindingFlags & BFLAGS_DeclaredOnly) == 0)\n        {\n            typeInfo = typeInfo->parent;\n\n            while (typeInfo != NULL)\n            {\n                CollectTypeFields(typeInfo, originalType, bindingFlags, fields, nameFilter);\n                typeInfo = typeInfo->parent;\n            }\n        }\n\n        size_t fieldCount = fields.size();\n        Il2CppArray* result = Array::NewCached(il2cpp_defaults.field_info_class, (il2cpp_array_size_t)fieldCount);\n\n        for (size_t i = 0; i < fieldCount; i++)\n        {\n            il2cpp_array_setref(result, i, Reflection::GetFieldObject(originalType, fields[i]));\n        }\n\n        return result;\n    }\n\n    Il2CppArray* MonoType::GetFields_internal(Il2CppReflectionType* _this, int bindingFlags, Il2CppReflectionType* reflectedType)\n    {\n        return GetFieldsImpl(_this, bindingFlags, reflectedType, utils::functional::TrueFilter());\n    }\n\n    Il2CppArray* MonoType::GetFieldsByName(Il2CppReflectionType* _this, Il2CppString* name, int bindingFlags, Il2CppReflectionType* reflectedType)\n    {\n        using namespace utils;\n        using namespace utils::functional;\n\n        if (name == NULL)\n            return GetFieldsImpl(_this, bindingFlags, reflectedType, utils::functional::TrueFilter());\n\n        if (bindingFlags & BFLAGS_IgnoreCase)\n        {\n            return GetFieldsImpl(_this, bindingFlags, reflectedType, Filter<std::string, VmStringUtils::CaseInsensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n        }\n\n        return GetFieldsImpl(_this, bindingFlags, reflectedType, Filter<std::string, VmStringUtils::CaseSensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n    }\n\n    Il2CppString * MonoType::getFullName(Il2CppReflectionType * type, bool full_name, bool assembly_qualified)\n    {\n        Il2CppTypeNameFormat format;\n\n        if (full_name)\n            format = assembly_qualified ?\n                IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED :\n                IL2CPP_TYPE_NAME_FORMAT_FULL_NAME;\n        else\n            format = IL2CPP_TYPE_NAME_FORMAT_REFLECTION;\n\n        std::string name(Type::GetName(type->type, format));\n        if (name.empty())\n            return NULL;\n\n        if (full_name && (type->type->type == IL2CPP_TYPE_VAR || type->type->type == IL2CPP_TYPE_MVAR))\n        {\n            return NULL;\n        }\n\n        return il2cpp::vm::String::NewWrapper(name.c_str());\n    }\n\n    Il2CppArray * MonoType::GetGenericArguments(Il2CppReflectionType* type)\n    {\n        return vm::Type::GetGenericArgumentsInternal(type, false);\n    }\n\n    Il2CppArray* MonoType::GetInterfaces(Il2CppReflectionType* type)\n    {\n        Il2CppClass* klass = Class::FromIl2CppType(type->type);\n        typedef std::set<Il2CppClass*> InterfaceVector;\n        InterfaceVector itfs;\n\n        Il2CppClass* currentType = klass;\n        while (currentType != NULL)\n        {\n            void* iter = NULL;\n            while (Il2CppClass* itf = Class::GetInterfaces(currentType, &iter))\n                itfs.insert(itf);\n\n            currentType = Class::GetParent(currentType);\n        }\n\n        Il2CppArray* res = Array::New(il2cpp_defaults.systemtype_class, (il2cpp_array_size_t)itfs.size());\n        int i = 0;\n        for (InterfaceVector::const_iterator iter = itfs.begin(); iter != itfs.end(); ++iter, ++i)\n            il2cpp_array_setref(res, i, Reflection::GetTypeObject((*iter)->byval_arg));\n\n        return res;\n    }\n\n    static bool\n    method_public(MethodInfo* method)\n    {\n        return (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC;\n    }\n\n    bool MonoType::MethodNonPublic(const MethodInfo* method, bool start_klass)\n    {\n        switch (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK)\n        {\n            case METHOD_ATTRIBUTE_ASSEM:\n                return (start_klass || il2cpp_defaults.generic_ilist_class);\n            case METHOD_ATTRIBUTE_PRIVATE:\n                return start_klass;\n            case METHOD_ATTRIBUTE_PUBLIC:\n                return false;\n            default:\n                return true;\n        }\n    }\n\n    static bool\n    method_rt_special_name(MethodInfo* method)\n    {\n        return (method->flags & METHOD_ATTRIBUTE_RESERVED_MASK) == METHOD_ATTRIBUTE_RT_SPECIAL_NAME;\n    }\n\n    static bool\n    method_static(MethodInfo* method)\n    {\n        return (method->flags & METHOD_ATTRIBUTE_STATIC) != 0;\n    }\n\n    template<typename NameFilter>\n    void CollectTypeMethods(Il2CppClass* type, const Il2CppClass* originalType, uint32_t bindingFlags, const NameFilter& nameFilter, std::vector<const MethodInfo*>& methods, bool(&filledSlots)[65535])\n    {\n        void* iter = NULL;\n        while (const MethodInfo* method = Class::GetMethods(type, &iter))\n        {\n            if ((method->flags & METHOD_ATTRIBUTE_RT_SPECIAL_NAME) != 0 && (strcmp(method->name, \".ctor\") == 0 || strcmp(method->name, \".cctor\") == 0))\n                continue;\n\n            if (CheckMemberMatch(method, type, originalType, bindingFlags, nameFilter))\n            {\n                if ((method->flags & METHOD_ATTRIBUTE_VIRTUAL) != 0)\n                {\n                    if (filledSlots[method->slot])\n                        continue;\n\n                    filledSlots[method->slot] = true;\n                }\n\n                methods.push_back(method);\n            }\n        }\n    }\n\n    template<typename NameFilter>\n    static Il2CppArray* GetMethodsByNameImpl(const Il2CppType* type, uint32_t bindingFlags, const NameFilter& nameFilter)\n    {\n        std::vector<const MethodInfo*> methods;\n        bool filledSlots[65535] = { 0 };\n\n        Il2CppClass* typeInfo = Class::FromIl2CppType(type);\n        Il2CppClass* const originalTypeInfo = typeInfo;\n\n        CollectTypeMethods(typeInfo, typeInfo, bindingFlags, nameFilter, methods, filledSlots);\n\n        if ((bindingFlags & BFLAGS_DeclaredOnly) == 0)\n        {\n            for (typeInfo = Class::GetParent(typeInfo); typeInfo != NULL; typeInfo = Class::GetParent(typeInfo))\n            {\n                CollectTypeMethods(typeInfo, originalTypeInfo, bindingFlags, nameFilter, methods, filledSlots);\n            }\n        }\n\n        size_t methodCount = methods.size();\n        Il2CppArray* result = Array::NewCached(il2cpp_defaults.method_info_class, (il2cpp_array_size_t)methodCount);\n\n        for (size_t i = 0; i < methodCount; i++)\n        {\n            Il2CppReflectionMethod* method = Reflection::GetMethodObject(methods[i], originalTypeInfo);\n            il2cpp_array_setref(result, i, method);\n        }\n\n        return result;\n    }\n\n    Il2CppArray* MonoType::GetMethodsByName(Il2CppReflectionType* _this, Il2CppString* name, int bindingFlags, bool ignoreCase, Il2CppReflectionType* type)\n    {\n        using namespace utils;\n        using namespace utils::functional;\n\n        if (type->type->byref || !ValidBindingFlagsForGetMember(bindingFlags))\n            return Array::NewCached(il2cpp_defaults.property_info_class, 0);\n\n        if (name != NULL)\n        {\n            if (ignoreCase)\n            {\n                return GetMethodsByNameImpl(type->type, bindingFlags, Filter<std::string, VmStringUtils::CaseInsensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n            }\n\n            return GetMethodsByNameImpl(type->type, bindingFlags, Filter<std::string, VmStringUtils::CaseSensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n        }\n\n        return GetMethodsByNameImpl(type->type, bindingFlags, TrueFilter());\n    }\n\n    template<typename NameFilter>\n    static void CollectTypeProperties(Il2CppClass* type, uint32_t bindingFlags, const NameFilter& nameFilter, Il2CppClass* const originalType, PropertyPairVector& properties)\n    {\n        void* iter = NULL;\n        while (const PropertyInfo* property = Class::GetProperties(type, &iter))\n        {\n            if (CheckMemberMatch(property, type, originalType, bindingFlags, nameFilter))\n            {\n                if (PropertyPairVectorContains(properties, property))\n                    continue;\n\n                properties.push_back(PropertyPair(property, originalType));\n            }\n        }\n    }\n\n    template<typename NameFilter>\n    static Il2CppArray* GetPropertiesByNameImpl(const Il2CppType* type, uint32_t bindingFlags, const NameFilter& nameFilter)\n    {\n        PropertyPairVector properties;\n        Il2CppClass* typeInfo = Class::FromIl2CppType(type);\n        Il2CppClass* const originalTypeInfo = typeInfo;\n\n        properties.reserve(typeInfo->property_count);\n        CollectTypeProperties(typeInfo, bindingFlags, nameFilter, originalTypeInfo, properties);\n\n        if ((bindingFlags & BFLAGS_DeclaredOnly) == 0)\n        {\n            for (typeInfo = typeInfo->parent; typeInfo != NULL; typeInfo = typeInfo->parent)\n            {\n                CollectTypeProperties(typeInfo, bindingFlags, nameFilter, originalTypeInfo, properties);\n            }\n        }\n\n        int i = 0;\n        Il2CppArray* res = Array::NewCached(il2cpp_defaults.property_info_class, (il2cpp_array_size_t)properties.size());\n\n        for (PropertyPairVector::const_iterator iter = properties.begin(); iter != properties.end(); iter++)\n        {\n            il2cpp_array_setref(res, i, Reflection::GetPropertyObject(iter->originalType, iter->property));\n            i++;\n        }\n\n        return res;\n    }\n\n    Il2CppArray* MonoType::GetPropertiesByName(Il2CppReflectionType* _this, Il2CppString* name, uint32_t bindingFlags, bool ignoreCase, Il2CppReflectionType* type)\n    {\n        using namespace utils;\n        using namespace utils::functional;\n\n        if (type->type->byref || !ValidBindingFlagsForGetMember(bindingFlags))\n            return Array::NewCached(il2cpp_defaults.property_info_class, 0);\n\n        if (name != NULL)\n        {\n            if (ignoreCase)\n            {\n                return GetPropertiesByNameImpl(type->type, bindingFlags, Filter<std::string, VmStringUtils::CaseInsensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n            }\n\n            return GetPropertiesByNameImpl(type->type, bindingFlags, Filter<std::string, VmStringUtils::CaseSensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n        }\n\n        return GetPropertiesByNameImpl(type->type, bindingFlags, TrueFilter());\n    }\n\n    bool MonoType::IsByRefImpl(Il2CppReflectionType* type)\n    {\n        return type->type->byref;\n    }\n\n    bool MonoType::IsCOMObjectImpl(Il2CppReflectionMonoType *)\n    {\n        return false; // il2cpp does not support COM objects, so this is always false\n    }\n\n    bool MonoType::IsPointerImpl(Il2CppReflectionType* type)\n    {\n        return type->type->type == IL2CPP_TYPE_PTR;\n    }\n\n    bool MonoType::IsPrimitiveImpl(Il2CppReflectionType *type)\n    {\n        return (!type->type->byref && (((type->type->type >= IL2CPP_TYPE_BOOLEAN) && (type->type->type <= IL2CPP_TYPE_R8)) || (type->type->type == IL2CPP_TYPE_I) || (type->type->type == IL2CPP_TYPE_U)));\n    }\n\n    template<typename NameFilter>\n    static inline Il2CppReflectionEvent* GetEventFromType(Il2CppClass* const type, Il2CppClass* const originalType, int32_t bindingFlags, const NameFilter& nameFilter)\n    {\n        void* iter = NULL;\n        while (const EventInfo* event = Class::GetEvents(type, &iter))\n        {\n            if (CheckMemberMatch(event, type, originalType, bindingFlags, nameFilter))\n            {\n                return Reflection::GetEventObject(originalType, event);\n            }\n        }\n\n        return NULL;\n    }\n\n    template<typename NameFilter>\n    static Il2CppReflectionEvent* GetEventImpl(Il2CppClass* type, int32_t bindingFlags, const NameFilter& nameFilter)\n    {\n        Il2CppReflectionEvent* event = GetEventFromType(type, type, bindingFlags, nameFilter);\n\n        if (event == NULL && (bindingFlags & BFLAGS_DeclaredOnly) == 0)\n        {\n            Il2CppClass* const originalType = type;\n            type = type->parent;\n\n            while (event == NULL && type != NULL)\n            {\n                event = GetEventFromType(type, originalType, bindingFlags, nameFilter);\n                type = type->parent;\n            }\n        }\n\n        return event;\n    }\n\n    Il2CppReflectionEvent* MonoType::InternalGetEvent(Il2CppReflectionType* _this, Il2CppString* name, int32_t bindingFlags)\n    {\n        using namespace utils;\n        using namespace utils::functional;\n\n        if (_this->type->byref || !ValidBindingFlagsForGetMember(bindingFlags))\n            return NULL;\n\n        Il2CppClass* type = Class::FromIl2CppType(_this->type);\n\n        if (bindingFlags & BFLAGS_IgnoreCase)\n        {\n            return GetEventImpl(type, bindingFlags, Filter<std::string, VmStringUtils::CaseInsensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n        }\n\n        return GetEventImpl(type, bindingFlags, Filter<std::string, VmStringUtils::CaseSensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n    }\n\n    template<typename NameFilter>\n    static inline void CollectTypeEvents(Il2CppClass* type, Il2CppClass* const originalType, int32_t bindingFlags, EventMap& events, const NameFilter& nameFilter)\n    {\n        void* iter = NULL;\n        while (const EventInfo* event = Class::GetEvents(type, &iter))\n        {\n            if (CheckMemberMatch(event, type, originalType, bindingFlags, nameFilter))\n            {\n                if (events.find(event) != events.end())\n                    continue;\n\n                events[event] = originalType;\n            }\n        }\n    }\n\n    template<typename NameFilter>\n    static inline Il2CppArray* GetEventsImpl(Il2CppReflectionType* type, int bindingFlags, Il2CppReflectionType* reflectedType, const NameFilter& nameFilter)\n    {\n        if (type->type->byref || !ValidBindingFlagsForGetMember(bindingFlags))\n            return Array::New(il2cpp_defaults.event_info_class, 0);\n\n        EventMap events;\n        Il2CppClass* typeInfo = Class::FromIl2CppType(type->type);\n\n        CollectTypeEvents(typeInfo, typeInfo, bindingFlags, events, nameFilter);\n\n        if ((bindingFlags & BFLAGS_DeclaredOnly) == 0)\n        {\n            Il2CppClass* const originalType = typeInfo;\n            typeInfo = Class::GetParent(typeInfo);\n\n            while (typeInfo != NULL)\n            {\n                CollectTypeEvents(typeInfo, originalType, bindingFlags, events, nameFilter);\n                typeInfo = Class::GetParent(typeInfo);\n            }\n        }\n\n        int i = 0;\n        Il2CppArray* result = Array::NewCached(il2cpp_defaults.event_info_class, (il2cpp_array_size_t)events.size());\n\n        for (EventMap::const_iterator iter = events.begin(); iter != events.end(); iter++)\n        {\n            il2cpp_array_setref(result, i, Reflection::GetEventObject(iter->second, iter->first.key));\n            i++;\n        }\n\n        return result;\n    }\n\n    Il2CppArray* MonoType::GetEvents_internal(Il2CppReflectionType* _this, int32_t bindingFlags, Il2CppReflectionType* type)\n    {\n        return GetEventsImpl(_this, bindingFlags, type, utils::functional::TrueFilter());\n    }\n\n    Il2CppArray* MonoType::GetEventsByName(Il2CppReflectionType* _this, Il2CppString* name, int bindingFlags, Il2CppReflectionType* reflectedType)\n    {\n        using namespace utils;\n        using namespace utils::functional;\n\n        if (name == NULL)\n            return GetEventsImpl(_this, bindingFlags, reflectedType, utils::functional::TrueFilter());\n\n        if (bindingFlags & BFLAGS_IgnoreCase)\n        {\n            return GetEventsImpl(_this, bindingFlags, reflectedType, Filter<std::string, VmStringUtils::CaseInsensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n        }\n\n        return GetEventsImpl(_this, bindingFlags, reflectedType, Filter<std::string, VmStringUtils::CaseSensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n    }\n\n    void MonoType::type_from_obj(void* /* System.MonoType */ type, Il2CppObject* obj)\n    {\n        NOT_SUPPORTED_IL2CPP(MonoType::type_from_obj, \"This icall is only used by System.MonoType constructor, which throws NotImplementedException right after this call.\");\n    }\n\n    void* /* System.Reflection.ConstructorInfo */ MonoType::GetCorrespondingInflatedConstructor(void* /* System.MonoType */ self, void* /* System.Reflection.ConstructorInfo */ genericInfo)\n    {\n        NOT_SUPPORTED_IL2CPP(MonoType::GetCorrespondingInflatedConstructor, \"This icall is only used by System.Reflection.Emit.TypeBuilder.\");\n        return 0;\n    }\n\n    static inline bool CheckNestedTypeMatch(Il2CppClass* nestedType, BindingFlags bindingFlags)\n    {\n        uint32_t accessFlag = (nestedType->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC ? BFLAGS_Public : BFLAGS_NonPublic;\n        return (accessFlag & bindingFlags) != 0;\n    }\n\n    template<typename NameFilter>\n    Il2CppReflectionType* GetNestedTypeImpl(Il2CppClass* typeInfo, BindingFlags bindingFlags, const NameFilter& nameFilter)\n    {\n        void* iter = NULL;\n        while (Il2CppClass* nestedType = Class::GetNestedTypes(typeInfo, &iter))\n        {\n            if (CheckNestedTypeMatch(nestedType, bindingFlags) && nameFilter(nestedType->name))\n                return Reflection::GetTypeObject(nestedType->byval_arg);\n        }\n\n        return NULL;\n    }\n\n    Il2CppReflectionType* MonoType::GetNestedType(Il2CppReflectionType* type, Il2CppString* name, BindingFlags bindingFlags)\n    {\n        using namespace utils;\n        using namespace utils::functional;\n\n        bool validBindingFlags = (bindingFlags & BFLAGS_NonPublic) != 0 || (bindingFlags & BFLAGS_Public) != 0;\n\n        if (type->type->byref || !validBindingFlags)\n            return NULL;\n\n        Il2CppClass* typeInfo = Class::FromIl2CppType(type->type);\n\n        // nested types are always generic type definitions, even for inflated types. As such we only store/retrieve them on\n        // type definitions and generic type definitions. If we are a generic instance, use our generic type definition instead.\n        if (typeInfo->generic_class)\n            typeInfo = GenericClass::GetTypeDefinition(typeInfo->generic_class);\n\n        if (bindingFlags & BFLAGS_IgnoreCase)\n        {\n            return GetNestedTypeImpl(typeInfo, bindingFlags, Filter<std::string, VmStringUtils::CaseInsensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n        }\n\n        return GetNestedTypeImpl(typeInfo, bindingFlags, Filter<std::string, VmStringUtils::CaseSensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n    }\n\n    template<typename NameFilter>\n    static Il2CppArray* GetNestedTypesImpl(Il2CppReflectionType* type, int32_t bindingFlags, const NameFilter& nameFilter)\n    {\n        bool validBindingFlags = (bindingFlags & BFLAGS_NonPublic) != 0 || (bindingFlags & BFLAGS_Public) != 0;\n\n        if (type->type->byref || !validBindingFlags)\n            return Array::New(il2cpp_defaults.monotype_class, 0);\n\n        Il2CppClass* typeInfo = Class::FromIl2CppType(type->type);\n\n        // nested types are always generic type definitions, even for inflated types. As such we only store/retrieve them on\n        // type definitions and generic type definitions. If we are a generic instance, use our generic type definition instead.\n        if (typeInfo->generic_class)\n            typeInfo = GenericClass::GetTypeDefinition(typeInfo->generic_class);\n\n        std::vector<Il2CppClass*> nestedTypes;\n\n        void* iter = NULL;\n        while (Il2CppClass* nestedType = Class::GetNestedTypes(typeInfo, &iter))\n        {\n            if (CheckNestedTypeMatch(nestedType, bindingFlags) && nameFilter(nestedType->name))\n                nestedTypes.push_back(nestedType);\n        }\n\n        size_t nestedTypeCount = nestedTypes.size();\n        Il2CppArray* result = Array::New(il2cpp_defaults.monotype_class, (il2cpp_array_size_t)nestedTypeCount);\n\n        for (size_t i = 0; i < nestedTypeCount; i++)\n        {\n            il2cpp_array_setref(result, i, Reflection::GetTypeObject(nestedTypes[i]->byval_arg));\n        }\n\n        return result;\n    }\n\n    Il2CppArray* MonoType::GetNestedTypesByName(Il2CppReflectionType* type, Il2CppString* name, int32_t bindingFlags)\n    {\n        using namespace utils;\n        using namespace utils::functional;\n\n        if (name == NULL)\n            return GetNestedTypesImpl(type, bindingFlags, utils::functional::TrueFilter());\n\n        if (bindingFlags & BFLAGS_IgnoreCase)\n            return GetNestedTypesImpl(type, bindingFlags, Filter<std::string, VmStringUtils::CaseInsensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n\n        return GetNestedTypesImpl(type, bindingFlags, Filter<std::string, VmStringUtils::CaseSensitiveComparer>(StringUtils::Utf16ToUtf8(name->chars)));\n    }\n\n    Il2CppArray* MonoType::GetNestedTypes(Il2CppReflectionType* type, int32_t bindingFlags)\n    {\n        return GetNestedTypesImpl(type, bindingFlags, utils::functional::TrueFilter());\n    }\n\n    void* /* System.Reflection.MethodBase */ MonoType::get_DeclaringMethod(void* /* System.MonoType */ self)\n    {\n        NOT_IMPLEMENTED_ICALL(MonoType::get_DeclaringMethod);\n\n        return 0;\n    }\n\n    bool MonoType::PropertyAccessorNonPublic(const MethodInfo* accessor, bool start_klass)\n    {\n        if (!accessor)\n            return false;\n\n        return MethodNonPublic(accessor, start_klass);\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/MonoType.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct mscorlib_System_Reflection_MethodInfo;\n\nstruct Il2CppArray;\nstruct Il2CppString;\nstruct Il2CppReflectionAssembly;\nstruct Il2CppReflectionField;\nstruct Il2CppReflectionModule;\nstruct Il2CppReflectionMonoType;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionEvent;\n\ntypedef int32_t BindingFlags;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    enum\n    {\n        BFLAGS_IgnoreCase = 1,\n        BFLAGS_DeclaredOnly = 2,\n        BFLAGS_Instance = 4,\n        BFLAGS_Static = 8,\n        BFLAGS_Public = 0x10,\n        BFLAGS_NonPublic = 0x20,\n        BFLAGS_FlattenHierarchy = 0x40,\n        BFLAGS_InvokeMethod = 0x100,\n        BFLAGS_CreateInstance = 0x200,\n        BFLAGS_GetField = 0x400,\n        BFLAGS_SetField = 0x800,\n        BFLAGS_GetProperty = 0x1000,\n        BFLAGS_SetProperty = 0x2000,\n        BFLAGS_ExactBinding = 0x10000,\n        BFLAGS_SuppressChangeType = 0x20000,\n        BFLAGS_OptionalParamBinding = 0x40000\n    };\n\n\n    class LIBIL2CPP_CODEGEN_API MonoType\n    {\n    public:\n        static Il2CppString* getFullName(Il2CppReflectionType* type, bool full_name, bool assembly_qualified);\n        static Il2CppArray* GetFields_internal(Il2CppReflectionType* _this, int, Il2CppReflectionType* reflectedType);\n        static Il2CppArray* GetFieldsByName(Il2CppReflectionType* _this, Il2CppString* name, int, Il2CppReflectionType* reflectedType);\n        static int GetArrayRank(Il2CppReflectionType* type);\n        static Il2CppArray* GetConstructors_internal(Il2CppReflectionType* type, int32_t bflags, Il2CppReflectionType* reftype);\n        static void* /* System.Reflection.ConstructorInfo */ GetCorrespondingInflatedConstructor(void* /* System.MonoType */ self, void* /* System.Reflection.ConstructorInfo */ genericInfo);\n        static mscorlib_System_Reflection_MethodInfo* GetCorrespondingInflatedMethod(Il2CppReflectionMonoType* , Il2CppReflectionMonoType*);\n        static Il2CppReflectionType* GetElementType(Il2CppReflectionType* type);\n        static Il2CppArray* GetEvents_internal(Il2CppReflectionType* thisPtr, int32_t bindingFlags, Il2CppReflectionType* type);\n        static Il2CppArray* GetEventsByName(Il2CppReflectionType* _this, Il2CppString* name, int bindingFlags, Il2CppReflectionType* reflectedType);\n        static Il2CppReflectionField* GetField(Il2CppReflectionType* _this, Il2CppString* name, int32_t bindingFlags);\n        static Il2CppArray* GetGenericArguments(Il2CppReflectionType* type);\n        static Il2CppArray* GetInterfaces(Il2CppReflectionType* type);\n        static Il2CppArray* GetMethodsByName(Il2CppReflectionType* _this, Il2CppString* name, int bindingFlags, bool ignoreCase, Il2CppReflectionType* type);\n        static Il2CppReflectionType* GetNestedType(Il2CppReflectionType* type, Il2CppString* name, BindingFlags bindingFlags);\n        static Il2CppArray* GetNestedTypesByName(Il2CppReflectionType* type, Il2CppString* name, int32_t bindingAttr);\n        static Il2CppArray* GetNestedTypes(Il2CppReflectionType* type, int32_t bindingAttr);\n        static Il2CppArray* GetPropertiesByName(Il2CppReflectionType* _this, Il2CppString* name, uint32_t bindingFlags, bool ignoreCase, Il2CppReflectionType* type);\n        static Il2CppReflectionEvent* InternalGetEvent(Il2CppReflectionType* _this, Il2CppString* name, int32_t bindingFlags);\n        static bool IsByRefImpl(Il2CppReflectionType* type);\n        static bool IsCOMObjectImpl(Il2CppReflectionMonoType*);\n        static bool IsPointerImpl(Il2CppReflectionType* type);\n        static Il2CppReflectionAssembly* get_Assembly(Il2CppReflectionType*);\n        static Il2CppReflectionType* get_BaseType(Il2CppReflectionType* type);\n        static void* /* System.Reflection.MethodBase */ get_DeclaringMethod(void* /* System.MonoType */ self);\n        static Il2CppReflectionType* get_DeclaringType(Il2CppReflectionMonoType*);\n        static bool get_IsGenericParameter(Il2CppReflectionType*);\n        static bool IsGenericParameter(const Il2CppType *type);\n        static Il2CppReflectionModule* get_Module(Il2CppReflectionType* thisPtr);\n        static Il2CppString* get_Name(Il2CppReflectionType* type);\n        static Il2CppString* get_Namespace(Il2CppReflectionType* type);\n        static int get_attributes(Il2CppReflectionType* type);\n        static void type_from_obj(void* /* System.MonoType */ type, Il2CppObject* obj);\n        static bool IsPrimitiveImpl(Il2CppReflectionType*);\n        static bool PropertyEqual(const PropertyInfo* prop1, const PropertyInfo* prop2);\n        static bool PropertyAccessorNonPublic(const MethodInfo* accessor, bool start_klass);\n        static bool MethodNonPublic(const MethodInfo* method, bool start_klass);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Number.cpp",
    "content": "// The MIT License(MIT)\n//\n// Copyright(c) Unity Technologies, Microsoft Corporation\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files(the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions :\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"Number.h\"\n#include \"utils/StringUtils.h\"\n\n#include <algorithm>\n\n#define NUMBER_MAXDIGITS 50\n\nstruct NUMBER\n{\n\tint precision;\n\tint scale;\n\tint sign;\n\tIl2CppChar digits[NUMBER_MAXDIGITS + 1];\n\tIl2CppChar* allDigits;\n\n\tNUMBER() : \n\t\tprecision(0),\n\t\tscale(0),\n\t\tsign(0),\n\t\tallDigits(NULL)\n\t{\n\t}\n};\n\nstruct FPDOUBLE\n{\n#if IL2CPP_BYTE_ORDER == IL2CPP_BIG_ENDIAN\n\tunsigned int sign : 1;\n\tunsigned int exp : 11;\n\tunsigned int mantHi : 20;\n\tunsigned int mantLo;\n#else\n\tunsigned int mantLo;\n\tunsigned int mantHi : 20;\n\tunsigned int exp : 11;\n\tunsigned int sign : 1;\n#endif\n};\n\n\n//\n// precomputed tables with powers of 10. These allows us to do at most\n// two Mul64 during the conversion. This is important not only\n// for speed, but also for precision because of Mul64 computes with 1 bit error.\n//\nstatic const uint64_t rgval64Power10[] =\n{\n\t// powers of 10\n\t/*1*/ 0xa000000000000000ULL,\n\t/*2*/ 0xc800000000000000ULL,\n\t/*3*/ 0xfa00000000000000ULL,\n\t/*4*/ 0x9c40000000000000ULL,\n\t/*5*/ 0xc350000000000000ULL,\n\t/*6*/ 0xf424000000000000ULL,\n\t/*7*/ 0x9896800000000000ULL,\n\t/*8*/ 0xbebc200000000000ULL,\n\t/*9*/ 0xee6b280000000000ULL,\n\t/*10*/ 0x9502f90000000000ULL,\n\t/*11*/ 0xba43b74000000000ULL,\n\t/*12*/ 0xe8d4a51000000000ULL,\n\t/*13*/ 0x9184e72a00000000ULL,\n\t/*14*/ 0xb5e620f480000000ULL,\n\t/*15*/ 0xe35fa931a0000000ULL,\n\n\t// powers of 0.1\n\t/*1*/ 0xcccccccccccccccdULL,\n\t/*2*/ 0xa3d70a3d70a3d70bULL,\n\t/*3*/ 0x83126e978d4fdf3cULL,\n\t/*4*/ 0xd1b71758e219652eULL,\n\t/*5*/ 0xa7c5ac471b478425ULL,\n\t/*6*/ 0x8637bd05af6c69b7ULL,\n\t/*7*/ 0xd6bf94d5e57a42beULL,\n\t/*8*/ 0xabcc77118461ceffULL,\n\t/*9*/ 0x89705f4136b4a599ULL,\n\t/*10*/ 0xdbe6fecebdedd5c2ULL,\n\t/*11*/ 0xafebff0bcb24ab02ULL,\n\t/*12*/ 0x8cbccc096f5088cfULL,\n\t/*13*/ 0xe12e13424bb40e18ULL,\n\t/*14*/ 0xb424dc35095cd813ULL,\n\t/*15*/ 0x901d7cf73ab0acdcULL,\n};\n\nstatic const int8_t rgexp64Power10[] = {\n\t// exponents for both powers of 10 and 0.1\n\t/*1*/ 4,\n\t/*2*/ 7,\n\t/*3*/ 10,\n\t/*4*/ 14,\n\t/*5*/ 17,\n\t/*6*/ 20,\n\t/*7*/ 24,\n\t/*8*/ 27,\n\t/*9*/ 30,\n\t/*10*/ 34,\n\t/*11*/ 37,\n\t/*12*/ 40,\n\t/*13*/ 44,\n\t/*14*/ 47,\n\t/*15*/ 50,\n};\n\nstatic const uint64_t rgval64Power10By16[] = {\n\t// powers of 10^16\n\t/*1*/ 0x8e1bc9bf04000000ULL,\n\t/*2*/ 0x9dc5ada82b70b59eULL,\n\t/*3*/ 0xaf298d050e4395d6ULL,\n\t/*4*/ 0xc2781f49ffcfa6d4ULL,\n\t/*5*/ 0xd7e77a8f87daf7faULL,\n\t/*6*/ 0xefb3ab16c59b14a0ULL,\n\t/*7*/ 0x850fadc09923329cULL,\n\t/*8*/ 0x93ba47c980e98cdeULL,\n\t/*9*/ 0xa402b9c5a8d3a6e6ULL,\n\t/*10*/ 0xb616a12b7fe617a8ULL,\n\t/*11*/ 0xca28a291859bbf90ULL,\n\t/*12*/ 0xe070f78d39275566ULL,\n\t/*13*/ 0xf92e0c3537826140ULL,\n\t/*14*/ 0x8a5296ffe33cc92cULL,\n\t/*15*/ 0x9991a6f3d6bf1762ULL,\n\t/*16*/ 0xaa7eebfb9df9de8aULL,\n\t/*17*/ 0xbd49d14aa79dbc7eULL,\n\t/*18*/ 0xd226fc195c6a2f88ULL,\n\t/*19*/ 0xe950df20247c83f8ULL,\n\t/*20*/ 0x81842f29f2cce373ULL,\n\t/*21*/ 0x8fcac257558ee4e2ULL,\n\n\t// powers of 0.1^16\n\t/*1*/ 0xe69594bec44de160ULL,\n\t/*2*/ 0xcfb11ead453994c3ULL,\n\t/*3*/ 0xbb127c53b17ec165ULL,\n\t/*4*/ 0xa87fea27a539e9b3ULL,\n\t/*5*/ 0x97c560ba6b0919b5ULL,\n\t/*6*/ 0x88b402f7fd7553abULL,\n\t/*7*/ 0xf64335bcf065d3a0ULL,\n\t/*8*/ 0xddd0467c64bce4c4ULL,\n\t/*9*/ 0xc7caba6e7c5382edULL,\n\t/*10*/ 0xb3f4e093db73a0b7ULL,\n\t/*11*/ 0xa21727db38cb0053ULL,\n\t/*12*/ 0x91ff83775423cc29ULL,\n\t/*13*/ 0x8380dea93da4bc82ULL,\n\t/*14*/ 0xece53cec4a314f00ULL,\n\t/*15*/ 0xd5605fcdcf32e217ULL,\n\t/*16*/ 0xc0314325637a1978ULL,\n\t/*17*/ 0xad1c8eab5ee43ba2ULL,\n\t/*18*/ 0x9becce62836ac5b0ULL,\n\t/*19*/ 0x8c71dcd9ba0b495cULL,\n\t/*20*/ 0xfd00b89747823938ULL,\n\t/*21*/ 0xe3e27a444d8d991aULL,\n};\n\nstatic const int16_t rgexp64Power10By16[] =\n{\n\t// exponents for both powers of 10^16 and 0.1^16\n\t/*1*/ 54,\n\t/*2*/ 107,\n\t/*3*/ 160,\n\t/*4*/ 213,\n\t/*5*/ 266,\n\t/*6*/ 319,\n\t/*7*/ 373,\n\t/*8*/ 426,\n\t/*9*/ 479,\n\t/*10*/ 532,\n\t/*11*/ 585,\n\t/*12*/ 638,\n\t/*13*/ 691,\n\t/*14*/ 745,\n\t/*15*/ 798,\n\t/*16*/ 851,\n\t/*17*/ 904,\n\t/*18*/ 957,\n\t/*19*/ 1010,\n\t/*20*/ 1064,\n\t/*21*/ 1117,\n};\n\n#define Mul32x32To64(a, b) ((uint64_t)((uint32_t)(a)) * (uint64_t)((uint32_t)(b)))\n\n\n#ifdef _DEBUG\n//\n// slower high precision version of Mul64 for computation of the tables\n//\nstatic uint64_t Mul64Precise(uint64_t a, uint64_t b, int* pexp)\n{\n\tuint64_t hilo =\n\t\t((Mul32x32To64(a >> 32, b) >> 1) +\n\t\t(Mul32x32To64(a, b >> 32) >> 1) +\n\t\t(Mul32x32To64(a, b) >> 33)) >> 30;\n\n\tuint64_t val = Mul32x32To64(a >> 32, b >> 32) + (hilo >> 1) + (hilo & 1);\n\n\t// normalize\n\tif ((val & 0x8000000000000000L) == 0) { val <<= 1; *pexp -= 1; }\n\n\treturn val;\n}\n\n//\n// debug-only verification of the precomputed tables\n//\nstatic void CheckTable(uint64_t val, int exp, const void* table, int size, const char* name, int tabletype)\n{\n\tuint64_t multval = val;\n\tint mulexp = exp;\n\tbool fBad = false;\n\n\tfor (int i = 0; i < size; i++)\n\t{\n\t\tswitch (tabletype)\n\t\t{\n\t\tcase 1:\n\t\t\tif (((uint64_t*)table)[i] != val)\n\t\t\t{\n\t\t\t\tif (!fBad)\n\t\t\t\t{\n\t\t\t\t\tfprintf(stderr, \"%s:\\n\", name);\n\t\t\t\t\tfBad = true;\n\t\t\t\t}\n\t\t\t\tfprintf(stderr, \"/*%d*/ I64(0x%llx),\\n\", i + 1, val);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tif (((int8_t*)table)[i] != exp)\n\t\t\t{\n\t\t\t\tif (!fBad)\n\t\t\t\t{\n\t\t\t\t\tfprintf(stderr, \"%s:\\n\", name);\n\t\t\t\t\tfBad = true;\n\t\t\t\t}\n\t\t\t\tfprintf(stderr, \"/*%d*/ %d,\\n\", i + 1, exp);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tif (((int16_t*)table)[i] != exp)\n\t\t\t{\n\t\t\t\tif (!fBad)\n\t\t\t\t{\n\t\t\t\t\tfprintf(stderr, \"%s:\\n\", name);\n\t\t\t\t\tfBad = true;\n\t\t\t\t}\n\t\t\t\tfprintf(stderr, \"/*%d*/ %d,\\n\", i + 1, exp);\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tIL2CPP_ASSERT(false);\n\t\t\tbreak;\n\t\t}\n\n\t\texp += mulexp;\n\t\tval = Mul64Precise(val, multval, &exp);\n\t}\n\tIL2CPP_ASSERT(!fBad || !\"NumberToDouble table not correct. Correct version dumped to stderr.\");\n}\n\nvoid CheckTables()\n{\n\tuint64_t val;\n\tint exp;\n\n\tval = 0xa000000000000000L; exp = 4; // 10\n\tCheckTable(val, exp, rgval64Power10, 15, \"rgval64Power10\", 1);\n\tCheckTable(val, exp, rgexp64Power10, 15, \"rgexp64Power10\", 2);\n\n\tval = 0x8e1bc9bf04000000L; exp = 54; //10^16\n\tCheckTable(val, exp, rgval64Power10By16, 21, \"rgval64Power10By16\", 1);\n\tCheckTable(val, exp, rgexp64Power10By16, 21, \"rgexp64Power10By16\", 3);\n\n\tval = 0xCCCCCCCCCCCCCCCDL; exp = -3; // 0.1\n\tCheckTable(val, exp, rgval64Power10 + 15, 15, \"rgval64Power10 - inv\", 1);\n\n\tval = 0xe69594bec44de160L; exp = -53; // 0.1^16\n\tCheckTable(val, exp, rgval64Power10By16 + 21, 21, \"rgval64Power10By16 - inv\", 1);\n}\n#endif // _DEBUG\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n\n#define DECIMAL_NEG ((uint8_t)0x80)\n#define DECIMAL_PRECISION 29\n#define DECIMAL_SCALE(dec)       ((dec).u.u.scale)\n#define DECIMAL_SIGN(dec)        ((dec).u.u.sign)\n#define DECIMAL_SIGNSCALE(dec)   ((dec).u.signscale)\n#define DECIMAL_LO32(dec)        ((dec).v.v.Lo32)\n#define DECIMAL_MID32(dec)       ((dec).v.v.Mid32)\n#define DECIMAL_HI32(dec)        ((dec).Hi32)\n\nstatic void DecShiftLeft(Il2CppDecimal* value)\n{\n\tunsigned int c0 = DECIMAL_LO32(*value) & 0x80000000 ? 1 : 0;\n\tunsigned int c1 = DECIMAL_MID32(*value) & 0x80000000 ? 1 : 0;\n\tIL2CPP_ASSERT(value != NULL);\n\n\tDECIMAL_LO32(*value) <<= 1;\n\tDECIMAL_MID32(*value) = DECIMAL_MID32(*value) << 1 | c0;\n\tDECIMAL_HI32(*value) = DECIMAL_HI32(*value) << 1 | c1;\n}\n\nstatic int D32AddCarry(uint32_t* value, uint32_t i)\n{\n\tuint32_t v = *value;\n\tuint32_t sum = v + i;\n\t*value = sum;\n\treturn sum < v || sum < i ? 1 : 0;\n}\n\nstatic void DecAdd(Il2CppDecimal *value, Il2CppDecimal* d)\n{\n\tIL2CPP_ASSERT(value != NULL && d != NULL);\n\n\tif (D32AddCarry(&DECIMAL_LO32(*value), DECIMAL_LO32(*d)))\n\t{\n\t\tif (D32AddCarry(&DECIMAL_MID32(*value), 1))\n\t\t{\n\t\t\tD32AddCarry(&DECIMAL_HI32(*value), 1);\n\t\t}\n\t}\n\tif (D32AddCarry(&DECIMAL_MID32(*value), DECIMAL_MID32(*d)))\n\t{\n\t\tD32AddCarry(&DECIMAL_HI32(*value), 1);\n\t}\n\tD32AddCarry(&DECIMAL_HI32(*value), DECIMAL_HI32(*d));\n}\n\nstatic void DecMul10(Il2CppDecimal* value)\n{\n\tIl2CppDecimal d = *value;\n\tIL2CPP_ASSERT(value != NULL);\n\n\tDecShiftLeft(value);\n\tDecShiftLeft(value);\n\tDecAdd(value, &d);\n\tDecShiftLeft(value);\n}\n\nstatic void DecAddInt32(Il2CppDecimal* value, unsigned int i)\n{\n\tIL2CPP_ASSERT(value != NULL);\n\n\tif (D32AddCarry(&DECIMAL_LO32(*value), i))\n\t{\n\t\tif (D32AddCarry(&DECIMAL_MID32(*value), 1))\n\t\t{\n\t\t\tD32AddCarry(&DECIMAL_HI32(*value), 1);\n\t\t}\n\t}\n}\n\nbool Number::NumberBufferToDecimal(uint8_t* number, Il2CppDecimal* value)\n{\n\tIL2CPP_ASSERT(number != NULL);\n\tIL2CPP_ASSERT(value != NULL);\n\n\tNUMBER* numberStruct = (NUMBER*)number;\n\tIl2CppChar* p = numberStruct->digits;\n\tIl2CppDecimal d;\n\tint e = numberStruct->scale;\n\n\td.reserved = 0;\n\tDECIMAL_SIGNSCALE(d) = 0;\n\tDECIMAL_HI32(d) = 0;\n\tDECIMAL_LO32(d) = 0;\n\tDECIMAL_MID32(d) = 0;\n\tIL2CPP_ASSERT(p != NULL);\n\tif (!*p)\n\t{\n\t\t// To avoid risking an app-compat issue with pre 4.5 (where some app was illegally using Reflection to examine the internal scale bits), we'll only force\n\t\t// the scale to 0 if the scale was previously positive\n\t\tif (e > 0)\n\t\t{\n\t\t\te = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (e > DECIMAL_PRECISION)\n\t\t\treturn 0;\n\t\twhile ((e > 0 || (*p && e > -28)) && (DECIMAL_HI32(d) < 0x19999999 || (DECIMAL_HI32(d) == 0x19999999 && (DECIMAL_MID32(d) < 0x99999999 || (DECIMAL_MID32(d) == 0x99999999 && (DECIMAL_LO32(d) < 0x99999999 || (DECIMAL_LO32(d) == 0x99999999 && *p <= '5')))))))\n\t\t{\n\t\t\tDecMul10(&d);\n\t\t\tif (*p)\n\t\t\t\tDecAddInt32(&d, *p++ - '0');\n\t\t\te--;\n\t\t}\n\t\tif (*p++ >= '5')\n\t\t{\n\t\t\tbool round = true;\n\t\t\tif (*(p - 1) == '5' && *(p - 2) % 2 == 0)\n\t\t\t{\n\t\t\t\t// Check if previous digit is even, only if the when we are unsure whether hows to do Banker's rounding\n\t\t\t\t// For digits > 5 we will be roundinp up anyway.\n\t\t\t\tint count = 20; // Look at the next 20 digits to check to round\n\t\t\t\twhile (*p == '0' && count != 0)\n\t\t\t\t{\n\t\t\t\t\tp++;\n\t\t\t\t\tcount--;\n\t\t\t\t}\n\t\t\t\tif (*p == '\\0' || count == 0)\n\t\t\t\t\tround = false;// Do nothing\n\t\t\t}\n\n\t\t\tif (round)\n\t\t\t{\n\t\t\t\tDecAddInt32(&d, 1);\n\t\t\t\tif ((DECIMAL_HI32(d) | DECIMAL_MID32(d) | DECIMAL_LO32(d)) == 0)\n\t\t\t\t{\n\t\t\t\t\tDECIMAL_HI32(d) = 0x19999999;\n\t\t\t\t\tDECIMAL_MID32(d) = 0x99999999;\n\t\t\t\t\tDECIMAL_LO32(d) = 0x9999999A;\n\t\t\t\t\te++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (e > 0)\n\t\treturn 0;\n\tif (e <= -DECIMAL_PRECISION)\n\t{\n\t\t// Parsing a large scale zero can give you more precision than fits in the decimal.\n\t\t// This should only happen for actual zeros or very small numbers that round to zero.\n\t\tDECIMAL_SIGNSCALE(d) = 0;\n\t\tDECIMAL_HI32(d) = 0;\n\t\tDECIMAL_LO32(d) = 0;\n\t\tDECIMAL_MID32(d) = 0;\n\t\tDECIMAL_SCALE(d) = (DECIMAL_PRECISION - 1);\n\t}\n\telse\n\t{\n\t\tDECIMAL_SCALE(d) = (uint8_t)(-e);\n\t}\n\n\tDECIMAL_SIGN(d) = numberStruct->sign ? DECIMAL_NEG : 0;\n\t*value = d;\n\treturn 1;\n}\n\n//\n// get 32-bit integer from at most 9 digits\n//\nstatic inline unsigned DigitsToInt(Il2CppChar* p, int count)\n{\n\tIL2CPP_ASSERT(1 <= count && count <= 9);\n\tIl2CppChar* end = p + count;\n\tunsigned res = *p - '0';\n\n\tfor (p = p + 1; p < end; p++)\n\t\tres = 10 * res + *p - '0';\n\n\treturn res;\n}\n\nstatic uint64_t Mul64Lossy(uint64_t a, uint64_t b, int* pexp)\n{\n\t// it's ok to losse some precision here - Mul64 will be called\n\t// at most twice during the conversion, so the error won't propagate\n\t// to any of the 53 significant bits of the result\n\tuint64_t val = Mul32x32To64(a >> 32, b >> 32) +\n\t\t(Mul32x32To64(a >> 32, b) >> 32) +\n\t\t(Mul32x32To64(a, b >> 32) >> 32);\n\n\t// normalize\n\tif ((val & 0x8000000000000000ULL) == 0) { val <<= 1; *pexp -= 1; }\n\n\treturn val;\n}\n\n\nstatic inline void NumberToDouble(NUMBER* number, double* value)\n{\n\tuint64_t val;\n\tint exp;\n\tIl2CppChar* src = number->digits;\n\tint remaining;\n\tint total;\n\tint count;\n\tint scale;\n\tint absscale;\n\tint index;\n\n#ifdef _DEBUG\n\tstatic bool fCheckedTables = false;\n\tif (!fCheckedTables)\n\t{\n\t\tCheckTables();\n\t\tfCheckedTables = true;\n\t}\n#endif // _DEBUG\n\n\ttotal = (int)utils::StringUtils::StrLen(src);\n\tremaining = total;\n\n\t// skip the leading zeros\n\twhile (*src == '0')\n\t{\n\t\tremaining--;\n\t\tsrc++;\n\t}\n\n\tif (remaining == 0)\n\t{\n\t\t*value = 0;\n\t\tgoto done;\n\t}\n\n\tcount = std::min(remaining, 9);\n\tremaining -= count;\n\tval = DigitsToInt(src, count);\n\n\tif (remaining > 0)\n\t{\n\t\tcount = std::min(remaining, 9);\n\t\tremaining -= count;\n\n\t\t// get the denormalized power of 10\n\t\tuint32_t mult = (uint32_t)(rgval64Power10[count - 1] >> (64 - rgexp64Power10[count - 1]));\n\t\tval = Mul32x32To64(val, mult) + DigitsToInt(src + 9, count);\n\t}\n\n\tscale = number->scale - (total - remaining);\n\tabsscale = abs(scale);\n\tif (absscale >= 22 * 16)\n\t{\n\t\t// overflow / underflow\n\t\t*(uint64_t*)value = (scale > 0) ? 0x7FF0000000000000ULL : 0;\n\t\tgoto done;\n\t}\n\n\texp = 64;\n\n\t// normalize the mantissa\n\tif ((val & 0xFFFFFFFF00000000ULL) == 0) { val <<= 32; exp -= 32; }\n\tif ((val & 0xFFFF000000000000ULL) == 0) { val <<= 16; exp -= 16; }\n\tif ((val & 0xFF00000000000000ULL) == 0) { val <<= 8; exp -= 8; }\n\tif ((val & 0xF000000000000000ULL) == 0) { val <<= 4; exp -= 4; }\n\tif ((val & 0xC000000000000000ULL) == 0) { val <<= 2; exp -= 2; }\n\tif ((val & 0x8000000000000000ULL) == 0) { val <<= 1; exp -= 1; }\n\n\tindex = absscale & 15;\n\tif (index)\n\t{\n\t\tint multexp = rgexp64Power10[index - 1];\n\t\t// the exponents are shared between the inverted and regular table\n\t\texp += (scale < 0) ? (-multexp + 1) : multexp;\n\n\t\tuint64_t multval = rgval64Power10[index + ((scale < 0) ? 15 : 0) - 1];\n\t\tval = Mul64Lossy(val, multval, &exp);\n\t}\n\n\tindex = absscale >> 4;\n\tif (index)\n\t{\n\t\tint multexp = rgexp64Power10By16[index - 1];\n\t\t// the exponents are shared between the inverted and regular table\n\t\texp += (scale < 0) ? (-multexp + 1) : multexp;\n\n\t\tuint64_t multval = rgval64Power10By16[index + ((scale < 0) ? 21 : 0) - 1];\n\t\tval = Mul64Lossy(val, multval, &exp);\n\t}\n\n\n\t// round & scale down\n\tif ((uint32_t)val & (1 << 10))\n\t{\n\t\t// IEEE round to even\n\t\tuint64_t tmp = val + ((1 << 10) - 1) + (((uint32_t)val >> 11) & 1);\n\t\tif (tmp < val) {\n\t\t\t// overflow\n\t\t\ttmp = (tmp >> 1) | 0x8000000000000000ULL;\n\t\t\texp += 1;\n\t\t}\n\t\tval = tmp;\n\t}\n\n\t// return the exponent to a biased state\n\texp += 0x3FE;\n\n\t// handle overflow, underflow, \"Epsilon - 1/2 Epsilon\", denormalized, and the normal case\n\tif (exp <= 0)\n\t{\n\t\tif (exp == -52 && (val >= 0x8000000000000058ULL))\n\t\t{\n\t\t\t// round X where {Epsilon > X >= 2.470328229206232730000000E-324} up to Epsilon (instead of down to zero)\n\t\t\tval = 0x0000000000000001ULL;\n\t\t}\n\t\telse if (exp <= -52)\n\t\t{\n\t\t\t// underflow\n\t\t\tval = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// denormalized\n\t\t\tval >>= (-exp + 11 + 1);\n\t\t}\n\t}\n\telse if (exp >= 0x7FF)\n\t{\n\t\t// overflow\n\t\tval = 0x7FF0000000000000ULL;\n\t}\n\telse\n\t{\n\t\t// normal postive exponent case\n\t\tval = ((uint64_t)exp << 52) + ((val >> 11) & 0x000FFFFFFFFFFFFFULL);\n\t}\n\n\t*(uint64_t*)value = val;\n\ndone:\n\tif (number->sign) *(uint64_t*)value |= 0x8000000000000000ULL;\n}\n\nbool Number::NumberBufferToDouble(uint8_t* number, double* value)\n{\n\tdouble d = 0;\n\tNumberToDouble((NUMBER*)number, &d);\n\tunsigned int e = ((FPDOUBLE*)&d)->exp;\n\tunsigned int fmntLow = ((FPDOUBLE*)&d)->mantLo;\n\tunsigned int fmntHigh = ((FPDOUBLE*)&d)->mantHi;\n\t\n\tif (e == 0x7FF)\n\t\treturn false;\n\n\tif (e == 0 && fmntLow == 0 && fmntHigh == 0)\n\t\td = 0;\n\n\t*value = d;\n\treturn true;\n}\n\n\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Number.h",
    "content": "#pragma once\n#if NET_4_0\n\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Number\n    {\n    public:\n        static bool NumberBufferToDecimal(uint8_t* number, Il2CppDecimal* value);\n        static bool NumberBufferToDouble(uint8_t* number, double* value);\n    };\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/NumberFormatter.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System/NumberFormatter.h\"\n#include \"number-formatter.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    void NumberFormatter::GetFormatterTables(uint64_t * * mantissas,\n        int32_t * * exponents,\n        int16_t * * digitLowerTable,\n        int16_t * * digitUpperTable,\n        int64_t * * tenPowersList,\n        int32_t * * decHexDigits)\n    {\n        *mantissas = (uint64_t*)Formatter_MantissaBitsTable;\n        *exponents = (int32_t*)Formatter_TensExponentTable;\n        *digitLowerTable = (int16_t*)Formatter_DigitLowerTable;\n        *digitUpperTable = (int16_t*)Formatter_DigitUpperTable;\n        *tenPowersList = (int64_t*)Formatter_TenPowersList;\n        *decHexDigits = (int32_t*)Formatter_DecHexDigits;\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/NumberFormatter.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API NumberFormatter\n    {\n    public:\n        static void GetFormatterTables(uint64_t * * mantissas,\n            int32_t * * exponents,\n            int16_t * * digitLowerTable,\n            int16_t * * digitUpperTable,\n            int64_t * * tenPowersList,\n            int32_t * * decHexDigits);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Object.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"icalls/mscorlib/System/Object.h\"\n#include \"vm/Object.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    int Object::InternalGetHashCode(Il2CppObject* obj)\n    {\n        return il2cpp::vm::Object::GetHash(obj);\n    }\n\n    Il2CppReflectionType* Object::GetType(Il2CppObject* obj)\n    {\n        return il2cpp::vm::Reflection::GetTypeObject(obj->klass->byval_arg);\n    }\n\n    Il2CppObject* Object::MemberwiseClone(Il2CppObject* obj)\n    {\n        return il2cpp::vm::Object::Clone(obj);\n    }\n\n    Il2CppIntPtr Object::obj_address(Il2CppObject* obj)\n    {\n        Il2CppIntPtr addr = { obj };\n        return addr;\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Object.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppObject;\nstruct Il2CppReflectionType;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Object\n    {\n    public:\n        static Il2CppReflectionType* GetType(Il2CppObject* obj);\n        static int InternalGetHashCode(Il2CppObject* obj);\n        static Il2CppIntPtr obj_address(Il2CppObject* obj);\n        static Il2CppObject* MemberwiseClone(Il2CppObject* obj);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/RuntimeFieldHandle.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"RuntimeFieldHandle.h\"\n#include \"icalls/mscorlib/System.Reflection/MonoField.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    void RuntimeFieldHandle::SetValueDirect(Il2CppObject* field, Il2CppObject* fieldType, void* pTypedRef, Il2CppObject* value, Il2CppObject* contextType)\n    {\n        NOT_IMPLEMENTED_ICALL(RuntimeFieldHandle::SetValueDirect);\n        IL2CPP_UNREACHABLE;\n    }\n\n    void RuntimeFieldHandle::SetValueInternal(Il2CppReflectionField* fi, Il2CppObject* obj, Il2CppObject* value)\n    {\n        // In mono's icall-def.h file, this maps to the same icall as MonoField.SetValueInternal\n        // so our implementation will do the same\n        Reflection::MonoField::SetValueInternal(fi, obj, value);\n    }\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/RuntimeFieldHandle.h",
    "content": "#pragma once\n#if NET_4_0\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API RuntimeFieldHandle\n    {\n    public:\n        static void SetValueDirect(Il2CppObject* field, Il2CppObject* fieldType, void* pTypedRef, Il2CppObject* value, Il2CppObject* contextType);\n        static void SetValueInternal(Il2CppReflectionField* fi, Il2CppObject* obj, Il2CppObject* value);\n    };\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/RuntimeMethodHandle.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System/RuntimeMethodHandle.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    Il2CppIntPtr RuntimeMethodHandle::GetFunctionPointer(Il2CppIntPtr m)\n    {\n        NOT_IMPLEMENTED_ICALL(RuntimeMethodHandle::GetFunctionPointer);\n\n        return Il2CppIntPtr::Zero;\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/RuntimeMethodHandle.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"object-internals.h\"\n#include \"il2cpp-config.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API RuntimeMethodHandle\n    {\n    public:\n        static Il2CppIntPtr GetFunctionPointer(Il2CppIntPtr m);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/RuntimeType.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if NET_4_0\n\n#include \"Activator.h\"\n#include \"metadata.h\"\n#include \"MonoType.h\"\n#include \"RuntimeType.h\"\n#include \"Type.h\"\n#include \"vm/Array.h\"\n#include \"vm/Type.h\"\n#include \"vm/Class.h\"\n#include \"vm/Field.h\"\n#include \"vm/String.h\"\n#include \"vm/GenericClass.h\"\n#include \"utils/dynamic_array.h\"\n#include \"utils/Il2CppHashSet.h\"\n#include \"utils/StringUtils.h\"\n#include \"il2cpp-api.h\"\n#include \"icalls/mscorlib/System/MonoType.h\"\n#include \"tabledefs.h\"\n#include \"mono-structs.h\"\n\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    bool RuntimeType::IsTypeExportedToWindowsRuntime(Il2CppObject* type)\n    {\n        NOT_IMPLEMENTED_ICALL(RuntimeType::IsTypeExportedToWindowsRuntime);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    bool RuntimeType::IsWindowsRuntimeObjectType(Il2CppObject* type)\n    {\n        NOT_IMPLEMENTED_ICALL(RuntimeType::IsWindowsRuntimeObjectType);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    int32_t RuntimeType::get_core_clr_security_level(Il2CppObject* _this)\n    {\n        NOT_IMPLEMENTED_ICALL(RuntimeType::get_core_clr_security_level);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n\n    int32_t RuntimeType::GetGenericParameterPosition(Il2CppReflectionRuntimeType* _this)\n    {\n        return Type::GetGenericParameterPosition(&_this->type);\n    }\n\n    Il2CppObject* RuntimeType::CreateInstanceInternal(Il2CppReflectionType* type)\n    {\n        return Activator::CreateInstanceInternal(type);\n    }\n\n    int32_t RuntimeType::GetGenericParameterAttributes(Il2CppReflectionRuntimeType* _this)\n    {\n        return Type::GetGenericParameterAttributes(&_this->type);\n    }\n\n    Il2CppObject* RuntimeType::get_DeclaringMethod(Il2CppObject* _this)\n    {\n        NOT_IMPLEMENTED_ICALL(RuntimeType::get_DeclaringMethod);\n        IL2CPP_UNREACHABLE;\n        return NULL;\n    }\n\n    Il2CppArray* RuntimeType::GetConstructors_internal(Il2CppReflectionRuntimeType* _this, int32_t bindingAttr, Il2CppReflectionType* reflected_type)\n    {\n        return MonoType::GetConstructors_internal(&_this->type, bindingAttr, reflected_type);\n    }\n\n    Il2CppArray* RuntimeType::GetEvents_internal(Il2CppReflectionRuntimeType* _this, Il2CppString* name, int32_t bindingAttr, Il2CppReflectionType* reflected_type)\n    {\n        return MonoType::GetEventsByName(&_this->type, name, bindingAttr, reflected_type);\n    }\n\n    Il2CppArray* RuntimeType::GetFields_internal(Il2CppReflectionRuntimeType* _this, Il2CppString* name, int32_t bindingAttr, Il2CppReflectionType* reflected_type)\n    {\n        return MonoType::GetFieldsByName(&_this->type, name, bindingAttr, reflected_type);\n    }\n\n    Il2CppArray* RuntimeType::GetMethodsByName(Il2CppReflectionRuntimeType* _this, Il2CppString* name, int32_t bindingAttr, bool ignoreCase, Il2CppReflectionType* reflected_type)\n    {\n        return MonoType::GetMethodsByName(&_this->type, name, bindingAttr, ignoreCase, reflected_type);\n    }\n\n    Il2CppArray* RuntimeType::GetPropertiesByName(Il2CppReflectionRuntimeType* _this, Il2CppString* name, int32_t bindingAttr, bool icase, Il2CppReflectionType* reflected_type)\n    {\n        return MonoType::GetPropertiesByName(&_this->type, name, bindingAttr, icase, reflected_type);\n    }\n\n    Il2CppArray* RuntimeType::GetNestedTypes_internal(Il2CppReflectionRuntimeType* _this, Il2CppString* name, int32_t bindingFlags)\n    {\n        return MonoType::GetNestedTypesByName(&_this->type, name, bindingFlags);\n    }\n\n    Il2CppString* RuntimeType::get_Name(Il2CppReflectionRuntimeType* _this)\n    {\n        return MonoType::get_Name(&_this->type);\n    }\n\n    Il2CppString* RuntimeType::get_Namespace(Il2CppReflectionRuntimeType* _this)\n    {\n        return MonoType::get_Namespace(&_this->type);\n    }\n\n    Il2CppString* RuntimeType::getFullName(Il2CppReflectionRuntimeType* _this, bool full_name, bool assembly_qualified)\n    {\n        return MonoType::getFullName(&_this->type, full_name, assembly_qualified);\n    }\n\n    Il2CppReflectionType* RuntimeType::get_DeclaringType(Il2CppReflectionRuntimeType* _this)\n    {\n        return vm::Type::GetDeclaringType(_this->type.type);\n    }\n\n    Il2CppReflectionType* RuntimeType::make_array_type(Il2CppReflectionRuntimeType* _this, int32_t rank)\n    {\n        return Type::make_array_type(&_this->type, rank);\n    }\n\n    Il2CppReflectionType* RuntimeType::make_byref_type(Il2CppReflectionRuntimeType* _this)\n    {\n        return Type::make_byref_type(&_this->type);\n    }\n\n    Il2CppReflectionType* RuntimeType::MakeGenericType(Il2CppReflectionType* gt, Il2CppArray* types)\n    {\n        return Type::MakeGenericType(gt, types);\n    }\n\n    Il2CppReflectionType* RuntimeType::MakePointerType(Il2CppReflectionType* type)\n    {\n        return Type::MakePointerType(type);\n    }\n\n    Il2CppArray* RuntimeType::GetGenericArgumentsInternal(Il2CppReflectionRuntimeType* _this, bool runtimeArray)\n    {\n        return vm::Type::GetGenericArgumentsInternal(&_this->type, runtimeArray);\n    }\n\n    Il2CppArray* RuntimeType::GetGenericParameterConstraints_impl(Il2CppReflectionRuntimeType* _this)\n    {\n        return Type::GetGenericParameterConstraints_impl(&_this->type);\n    }\n\n    Il2CppArray* RuntimeType::GetInterfaces(Il2CppReflectionRuntimeType* _this)\n    {\n        return MonoType::GetInterfaces(&_this->type);\n    }\n\n    int32_t RuntimeType::GetTypeCodeImplInternal(Il2CppReflectionType* type)\n    {\n        return Type::GetTypeCodeInternal(type);\n    }\n\n    void RuntimeType::GetInterfaceMapData(Il2CppReflectionType* t, Il2CppReflectionType* iface, Il2CppArray** targets, Il2CppArray** methods)\n    {\n        Type::GetInterfaceMapData(t, iface, targets, methods);\n    }\n\n    void RuntimeType::GetPacking(Il2CppReflectionRuntimeType* _this, int32_t* packing, int32_t* size)\n    {\n        Type::GetPacking(&_this->type, packing, size);\n    }\n\n    Il2CppIntPtr RuntimeType::GetConstructors_native(Il2CppReflectionRuntimeType* thisPtr, int32_t bindingAttr)\n    {\n        Il2CppReflectionMethod *method;\n        Il2CppIntPtr retVal;\n\n        if (thisPtr->type.type->byref)\n        {\n            retVal.m_value = empty_gptr_array();\n            return retVal;\n        }\n\n        VoidPtrArray res_array;\n        res_array.reserve(4);\n\n        Il2CppArray* constructors = MonoType::GetConstructors_internal(&thisPtr->type, bindingAttr, &thisPtr->type);\n\n        for (unsigned int i = 0; i < il2cpp::vm::Array::GetLength(constructors); i++)\n        {\n            method = il2cpp_array_get(constructors, Il2CppReflectionMethod*, i);\n            res_array.push_back((MethodInfo*)method->method);\n        }\n\n        retVal.m_value = void_ptr_array_to_gptr_array(res_array);\n        return retVal;\n    }\n\n    Il2CppIntPtr RuntimeType::GetEvents_native(Il2CppReflectionRuntimeType* thisPtr, Il2CppIntPtr name, int32_t bindingAttr)\n    {\n        Il2CppReflectionMonoEvent *event;\n        VoidPtrArray res_array;\n        Il2CppIntPtr retVal;\n        const char *utf8_name = (const char*)name.m_value;\n\n        if (thisPtr->type.type->byref)\n        {\n            retVal.m_value = empty_gptr_array();\n            return retVal;\n        }\n\n        res_array.reserve(4);\n\n        Il2CppString* nameStr = name.m_value == NULL ? NULL : il2cpp::vm::String::New((const char*)name.m_value);\n        Il2CppArray* events = MonoType::GetEventsByName(&thisPtr->type, nameStr, bindingAttr, &thisPtr->type);\n\n        for (unsigned int i = 0; i < il2cpp::vm::Array::GetLength(events); i++)\n        {\n            event = il2cpp_array_get(events, Il2CppReflectionMonoEvent*, i);\n            res_array.push_back((EventInfo*)event->eventInfo);\n        }\n\n        retVal.m_value = void_ptr_array_to_gptr_array(res_array);\n        return retVal;\n    }\n\n    Il2CppIntPtr RuntimeType::GetFields_native(Il2CppReflectionRuntimeType* thisPtr, Il2CppIntPtr name, int32_t bindingAttr)\n    {\n        Il2CppReflectionField *field;\n        Il2CppIntPtr retVal;\n\n        VoidPtrArray res_array;\n\n        if (thisPtr->type.type->byref)\n        {\n            retVal.m_value = empty_gptr_array();\n            return retVal;\n        }\n\n        res_array.reserve(16);\n\n        Il2CppString* nameStr = name.m_value == NULL ? NULL : il2cpp::vm::String::New((const char*)name.m_value);\n        Il2CppArray* fields = MonoType::GetFieldsByName(&thisPtr->type, nameStr, bindingAttr, &thisPtr->type);\n\n        for (unsigned int i = 0; i < il2cpp::vm::Array::GetLength(fields); i++)\n        {\n            field = il2cpp_array_get(fields, Il2CppReflectionField*, i);\n            res_array.push_back(field->field);\n        }\n\n        retVal.m_value = void_ptr_array_to_gptr_array(res_array);\n        return retVal;\n    }\n\n    Il2CppIntPtr RuntimeType::GetMethodsByName_native(Il2CppReflectionRuntimeType* thisPtr, Il2CppIntPtr namePtr, int32_t bindingAttr, bool ignoreCase)\n    {\n        VoidPtrArray res_array;\n        Il2CppIntPtr retVal;\n        Il2CppReflectionMethod *method;\n\n        if (thisPtr->type.type->byref)\n        {\n            Il2CppIntPtr retVal;\n            retVal.m_value = empty_gptr_array();\n            return retVal;\n        }\n\n        Il2CppString* nameStr = namePtr.m_value == NULL ? NULL : il2cpp::vm::String::New((const char*)namePtr.m_value);\n        Il2CppArray* methods = MonoType::GetMethodsByName(&thisPtr->type, nameStr, bindingAttr, ignoreCase, &thisPtr->type);\n\n        for (unsigned int i = 0; i < il2cpp::vm::Array::GetLength(methods); i++)\n        {\n            method = il2cpp_array_get(methods, Il2CppReflectionMethod*, i);\n            res_array.push_back((MethodInfo*)method->method);\n        }\n\n        retVal.m_value = void_ptr_array_to_gptr_array(res_array);\n        return retVal;\n    }\n\n    Il2CppIntPtr RuntimeType::GetNestedTypes_native(Il2CppReflectionRuntimeType* thisPtr, Il2CppIntPtr name, int32_t bindingAttr)\n    {\n        Il2CppReflectionType *nested;\n        VoidPtrArray res_array;\n        Il2CppIntPtr retVal;\n\n        if (thisPtr->type.type->byref)\n        {\n            retVal.m_value = empty_gptr_array();\n            return retVal;\n        }\n\n        Il2CppString* nameStr = name.m_value == NULL ? NULL : il2cpp::vm::String::New((const char*)name.m_value);\n        Il2CppArray* nestedTypes = MonoType::GetNestedTypesByName(&thisPtr->type, nameStr, bindingAttr);\n\n        for (unsigned int i = 0; i < il2cpp::vm::Array::GetLength(nestedTypes); i++)\n        {\n            nested = il2cpp_array_get(nestedTypes, Il2CppReflectionType*, i);\n            res_array.push_back((Il2CppType*)nested->type);\n        }\n\n        retVal.m_value = void_ptr_array_to_gptr_array(res_array);\n        return retVal;\n    }\n\n    Il2CppIntPtr RuntimeType::GetPropertiesByName_native(Il2CppReflectionRuntimeType* thisPtr, Il2CppIntPtr name, int32_t bindingAttr, bool icase)\n    {\n        Il2CppReflectionProperty *prop;\n        VoidPtrArray res_array;\n        Il2CppIntPtr retVal;\n\n        if (thisPtr->type.type->byref)\n        {\n            retVal.m_value = empty_gptr_array();\n            return retVal;\n        }\n\n        res_array.reserve(8);\n\n        Il2CppString* nameStr = name.m_value == NULL ? NULL : il2cpp::vm::String::New((const char*)name.m_value);\n        Il2CppArray* properties = MonoType::GetPropertiesByName(&thisPtr->type, nameStr, bindingAttr, icase, &thisPtr->type);\n\n        for (unsigned int i = 0; i < il2cpp::vm::Array::GetLength(properties); i++)\n        {\n            prop = il2cpp_array_get(properties, Il2CppReflectionProperty*, i);\n            res_array.push_back((PropertyInfo*)prop->property);\n        }\n\n        retVal.m_value = void_ptr_array_to_gptr_array(res_array);\n        return retVal;\n    }\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/RuntimeType.h",
    "content": "#pragma once\n\n#if NET_4_0\n\nstruct Il2CppReflectionRuntimeType;\nstruct Il2CppIntPtr;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API RuntimeType\n    {\n    public:\n        static bool IsTypeExportedToWindowsRuntime(Il2CppObject* type);\n        static bool IsWindowsRuntimeObjectType(Il2CppObject* type);\n        static int32_t get_core_clr_security_level(Il2CppObject* _this);\n        static int32_t GetGenericParameterPosition(Il2CppReflectionRuntimeType* _this);\n        static Il2CppObject* CreateInstanceInternal(Il2CppReflectionType* type);\n        static int32_t GetGenericParameterAttributes(Il2CppReflectionRuntimeType* _this);\n        static Il2CppObject* get_DeclaringMethod(Il2CppObject* _this);\n        static Il2CppArray* GetConstructors_internal(Il2CppReflectionRuntimeType* _this, int32_t bindingAttr, Il2CppReflectionType* reflected_type);\n        static Il2CppArray* GetEvents_internal(Il2CppReflectionRuntimeType* _this, Il2CppString* name, int32_t bindingAttr, Il2CppReflectionType* reflected_type);\n        static Il2CppArray* GetFields_internal(Il2CppReflectionRuntimeType* _this, Il2CppString* name, int32_t bindingAttr, Il2CppReflectionType* reflected_type);\n        static Il2CppArray* GetMethodsByName(Il2CppReflectionRuntimeType* _this, Il2CppString* name, int32_t bindingAttr, bool ignoreCase, Il2CppReflectionType* reflected_type);\n        static Il2CppArray* GetPropertiesByName(Il2CppReflectionRuntimeType* _this, Il2CppString* name, int32_t bindingAttr, bool icase, Il2CppReflectionType* reflected_type);\n        static Il2CppArray* GetNestedTypes_internal(Il2CppReflectionRuntimeType* _this, Il2CppString* name, int32_t bindingFlags);\n        static Il2CppString* get_Name(Il2CppReflectionRuntimeType* _this);\n        static Il2CppString* get_Namespace(Il2CppReflectionRuntimeType* _this);\n        static Il2CppString* getFullName(Il2CppReflectionRuntimeType* _this, bool full_name, bool assembly_qualified);\n        static Il2CppReflectionType* get_DeclaringType(Il2CppReflectionRuntimeType* _this);\n        static Il2CppReflectionType* make_array_type(Il2CppReflectionRuntimeType* _this, int32_t rank);\n        static Il2CppReflectionType* make_byref_type(Il2CppReflectionRuntimeType* _this);\n        static Il2CppReflectionType* MakeGenericType(Il2CppReflectionType* gt, Il2CppArray* types);\n        static Il2CppReflectionType* MakePointerType(Il2CppReflectionType* type);\n        static Il2CppArray* GetGenericArgumentsInternal(Il2CppReflectionRuntimeType* _this, bool runtimeArray);\n        static Il2CppArray* GetGenericParameterConstraints_impl(Il2CppReflectionRuntimeType* _this);\n        static Il2CppArray* GetInterfaces(Il2CppReflectionRuntimeType* _this);\n        static int32_t GetTypeCodeImplInternal(Il2CppReflectionType* type);\n        static void GetInterfaceMapData(Il2CppReflectionType* t, Il2CppReflectionType* iface, Il2CppArray** targets, Il2CppArray** methods);\n        static void GetPacking(Il2CppReflectionRuntimeType* _this, int32_t* packing, int32_t* size);\n\n        static Il2CppIntPtr GetConstructors_native(Il2CppReflectionRuntimeType* thisPtr, int32_t bindingAttr);\n        static Il2CppIntPtr GetEvents_native(Il2CppReflectionRuntimeType* thisPtr, Il2CppIntPtr name, int32_t bindingAttr);\n        static Il2CppIntPtr GetFields_native(Il2CppReflectionRuntimeType* thisPtr, Il2CppIntPtr name, int32_t bindingAttr);\n        static Il2CppIntPtr GetMethodsByName_native(Il2CppReflectionRuntimeType* thisPtr, Il2CppIntPtr namePtr, int32_t bindingAttr, bool ignoreCase);\n        static Il2CppIntPtr GetNestedTypes_native(Il2CppReflectionRuntimeType* thisPtr, Il2CppIntPtr name, int32_t bindingAttr);\n        static Il2CppIntPtr GetPropertiesByName_native(Il2CppReflectionRuntimeType* thisPtr, Il2CppIntPtr name, int32_t bindingAttr, bool icase);\n    };\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/RuntimeTypeHandle.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"mono-structs.h\"\n\n#include \"MonoType.h\"\n#include \"RuntimeTypeHandle.h\"\n#include \"Type.h\"\n\n#include \"vm/Class.h\"\n#include \"vm/Image.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/MetadataCache.h\"\n\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    bool RuntimeTypeHandle::HasInstantiation(Il2CppReflectionRuntimeType* type)\n    {\n        return Type::get_IsGenericType(&type->type);\n    }\n\n    bool RuntimeTypeHandle::IsArray(Il2CppReflectionRuntimeType* type)\n    {\n        return Type::IsArrayImpl(&type->type);\n    }\n\n    bool RuntimeTypeHandle::IsByRef(Il2CppReflectionRuntimeType* type)\n    {\n        return MonoType::IsByRefImpl(&type->type);\n    }\n\n    bool RuntimeTypeHandle::IsComObject(Il2CppReflectionRuntimeType* type)\n    {\n        return false; // il2cpp does not support COM objects, so this is always false\n    }\n\n    bool RuntimeTypeHandle::IsGenericTypeDefinition(Il2CppReflectionRuntimeType* type)\n    {\n        return Type::get_IsGenericTypeDefinition(&type->type);\n    }\n\n    bool RuntimeTypeHandle::IsGenericVariable(Il2CppReflectionRuntimeType* type)\n    {\n        return MonoType::get_IsGenericParameter(&type->type);\n    }\n\n    bool RuntimeTypeHandle::IsInstanceOfType(Il2CppReflectionRuntimeType* type, Il2CppObject* o)\n    {\n        return Type::IsInstanceOfType(&type->type, o);\n    }\n\n    bool RuntimeTypeHandle::IsPointer(Il2CppReflectionRuntimeType* type)\n    {\n        return MonoType::IsPointerImpl(&type->type);\n    }\n\n    bool RuntimeTypeHandle::IsPrimitive(Il2CppReflectionRuntimeType* type)\n    {\n        return MonoType::IsPrimitiveImpl(&type->type);\n    }\n\n    bool RuntimeTypeHandle::type_is_assignable_from(Il2CppReflectionType* a, Il2CppReflectionType* b)\n    {\n        return Type::type_is_assignable_from(a, b);\n    }\n\n    int32_t RuntimeTypeHandle::GetArrayRank(Il2CppReflectionRuntimeType* type)\n    {\n        return MonoType::GetArrayRank(&type->type);\n    }\n\n    int32_t RuntimeTypeHandle::GetMetadataToken(Il2CppReflectionRuntimeType* type)\n    {\n        return vm::Class::FromSystemType(&type->type)->token;\n    }\n\n    Il2CppReflectionAssembly* RuntimeTypeHandle::GetAssembly(Il2CppReflectionRuntimeType* type)\n    {\n        return vm::Reflection::GetAssemblyObject(vm::Image::GetAssembly(vm::Class::GetImage(vm::Class::FromIl2CppType(type->type.type))));\n    }\n\n    Il2CppReflectionModule* RuntimeTypeHandle::GetModule(Il2CppReflectionRuntimeType* type)\n    {\n        return vm::Reflection::GetModuleObject(vm::Class::GetImage(vm::Class::FromIl2CppType(type->type.type)));\n    }\n\n    int32_t RuntimeTypeHandle::GetAttributes(Il2CppReflectionRuntimeType* type)\n    {\n        return MonoType::get_attributes(&type->type);\n    }\n\n    Il2CppReflectionRuntimeType* RuntimeTypeHandle::GetBaseType(Il2CppReflectionRuntimeType* type)\n    {\n        return reinterpret_cast<Il2CppReflectionRuntimeType*>(MonoType::get_BaseType(&type->type));\n    }\n\n    Il2CppReflectionRuntimeType* RuntimeTypeHandle::GetElementType(Il2CppReflectionRuntimeType* type)\n    {\n        return reinterpret_cast<Il2CppReflectionRuntimeType*>(MonoType::GetElementType(&type->type));\n    }\n\n    Il2CppReflectionType* RuntimeTypeHandle::GetGenericTypeDefinition_impl(Il2CppReflectionRuntimeType* type)\n    {\n        return Type::GetGenericTypeDefinition_impl(&type->type);\n    }\n\n    Il2CppIntPtr RuntimeTypeHandle::GetGenericParameterInfo(Il2CppReflectionRuntimeType* type)\n    {\n        Il2CppIntPtr retVal;\n        retVal.m_value = NULL;\n\n        const Il2CppType *thisType = type->type.type;\n        if ((thisType->type == IL2CPP_TYPE_VAR) || (thisType->type == IL2CPP_TYPE_MVAR))\n        {\n            const Il2CppGenericParameter *param = il2cpp::vm::MetadataCache::GetGenericParameterFromIndex(thisType->data.genericParameterIndex);\n            if (param)\n            {\n                MonoGenericParameterInfo *monoParam = (MonoGenericParameterInfo*)il2cpp::vm::Reflection::GetMonoGenericParameterInfo(param);\n                if (monoParam)\n                {\n                    retVal.m_value = monoParam;\n                }\n                else\n                {\n                    monoParam = (MonoGenericParameterInfo*)IL2CPP_MALLOC(sizeof(MonoGenericParameterInfo));\n                    monoParam->flags = param->flags;\n                    monoParam->token = param->num;\n                    monoParam->name = il2cpp::vm::MetadataCache::GetStringFromIndex(param->nameIndex);\n                    const Il2CppGenericContainer *container = il2cpp::vm::MetadataCache::GetGenericContainerFromIndex(param->ownerIndex);\n                    monoParam->pklass = NULL;\n                    if (container)\n                        monoParam->pklass = il2cpp::vm::MetadataCache::GetTypeInfoFromTypeIndex(container->ownerIndex);\n\n                    monoParam->constraints = (Il2CppClass**)IL2CPP_MALLOC(sizeof(Il2CppClass*) * (param->constraintsCount + 1));\n                    for (int i = 0; i < param->constraintsCount; ++i)\n                    {\n                        const Il2CppType *constraintType = il2cpp::vm::MetadataCache::GetGenericParameterConstraintFromIndex(param->constraintsStart + i);\n                        monoParam->constraints[i] = il2cpp::vm::Class::FromIl2CppType(constraintType);\n                    }\n\n                    monoParam->constraints[param->constraintsCount] = NULL;\n\n                    il2cpp::vm::Reflection::SetMonoGenericParameterInfo(param, monoParam);\n                    retVal.m_value = monoParam;\n                }\n            }\n        }\n\n        return retVal;\n    }\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/RuntimeTypeHandle.h",
    "content": "#pragma once\n\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API RuntimeTypeHandle\n    {\n    public:\n        static bool HasInstantiation(Il2CppReflectionRuntimeType* type);\n        static bool IsArray(Il2CppReflectionRuntimeType* type);\n        static bool IsByRef(Il2CppReflectionRuntimeType* type);\n        static bool IsComObject(Il2CppReflectionRuntimeType* type);\n        static bool IsGenericTypeDefinition(Il2CppReflectionRuntimeType* type);\n        static bool IsGenericVariable(Il2CppReflectionRuntimeType* type);\n        static bool IsInstanceOfType(Il2CppReflectionRuntimeType* type, Il2CppObject* o);\n        static bool IsPointer(Il2CppReflectionRuntimeType* type);\n        static bool IsPrimitive(Il2CppReflectionRuntimeType* type);\n        static bool type_is_assignable_from(Il2CppReflectionType* a, Il2CppReflectionType* b);\n        static int32_t GetArrayRank(Il2CppReflectionRuntimeType* type);\n        static int32_t GetMetadataToken(Il2CppReflectionRuntimeType* type);\n        static Il2CppReflectionAssembly* GetAssembly(Il2CppReflectionRuntimeType* type);\n        static Il2CppReflectionModule* GetModule(Il2CppReflectionRuntimeType* type);\n        static int32_t GetAttributes(Il2CppReflectionRuntimeType* type);\n        static Il2CppReflectionRuntimeType* GetBaseType(Il2CppReflectionRuntimeType* type);\n        static Il2CppReflectionRuntimeType* GetElementType(Il2CppReflectionRuntimeType* type);\n        static Il2CppReflectionType* GetGenericTypeDefinition_impl(Il2CppReflectionRuntimeType* type);\n        static Il2CppIntPtr GetGenericParameterInfo(Il2CppReflectionRuntimeType* type);\n    };\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/SizedReference.cpp",
    "content": "#if NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"SizedReference.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    int64_t SizedReference::GetApproximateSizeOfSizedRef(Il2CppIntPtr h)\n    {\n        NOT_IMPLEMENTED_ICALL(SizedReference::GetApproximateSizeOfSizedRef);\n        IL2CPP_UNREACHABLE;\n    }\n\n    Il2CppIntPtr SizedReference::CreateSizedRef(Il2CppObject* o)\n    {\n        NOT_IMPLEMENTED_ICALL(SizedReference::CreateSizedRef);\n        IL2CPP_UNREACHABLE;\n    }\n\n    Il2CppObject* SizedReference::GetTargetOfSizedRef(Il2CppIntPtr h)\n    {\n        NOT_IMPLEMENTED_ICALL(SizedReference::GetTargetOfSizedRef);\n        IL2CPP_UNREACHABLE;\n    }\n\n    void SizedReference::FreeSizedRef(Il2CppIntPtr h)\n    {\n        NOT_IMPLEMENTED_ICALL(SizedReference::FreeSizedRef);\n        IL2CPP_UNREACHABLE;\n    }\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/SizedReference.h",
    "content": "#pragma once\n\n#if NET_4_0\n\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API SizedReference\n    {\n    public:\n        static int64_t GetApproximateSizeOfSizedRef(Il2CppIntPtr h);\n        static Il2CppIntPtr CreateSizedRef(Il2CppObject* o);\n        static Il2CppObject* GetTargetOfSizedRef(Il2CppIntPtr h);\n        static void FreeSizedRef(Il2CppIntPtr h);\n    };\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/String.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <memory>\n#include \"il2cpp-api.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"icalls/mscorlib/System/String.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/String.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    void String::RedirectToCreateString()\n    {\n        NOT_SUPPORTED_IL2CPP(String::RedirectToCreateString, \"All String constructors should be redirected to String.CreateString.\");\n    }\n\n    Il2CppString * String::InternalAllocateStr(int length)\n    {\n        return il2cpp::vm::String::NewSize(length);\n    }\n\n    static bool\n    string_icall_is_in_array(Il2CppArray *chars, int32_t arraylength, Il2CppChar chr)\n    {\n        Il2CppChar cmpchar;\n        int32_t arrpos;\n\n        for (arrpos = 0; arrpos != arraylength; arrpos++)\n        {\n            cmpchar = il2cpp_array_get(chars, Il2CppChar, arrpos);\n            if (cmpchar == chr)\n                return true;\n        }\n\n        return false;\n    }\n\n/* System.StringSplitOptions */\n    typedef enum\n    {\n        STRINGSPLITOPTIONS_NONE = 0,\n        STRINGSPLITOPTIONS_REMOVE_EMPTY_ENTRIES = 1\n    } StringSplitOptions;\n\n    Il2CppArray * String::InternalSplit(Il2CppString* me, Il2CppArray* separator, int count, int options)\n    {\n        static Il2CppClass *String_array;\n        Il2CppString * tmpstr;\n        Il2CppArray * retarr;\n        Il2CppChar *src;\n        int32_t arrsize, srcsize, splitsize;\n        int32_t i, lastpos, arrpos;\n        int32_t tmpstrsize;\n        int32_t remempty;\n        int32_t flag;\n        Il2CppChar *tmpstrptr;\n\n        remempty = options & STRINGSPLITOPTIONS_REMOVE_EMPTY_ENTRIES;\n        src = il2cpp::utils::StringUtils::GetChars(me);\n        srcsize = il2cpp::utils::StringUtils::GetLength(me);\n        arrsize = il2cpp::vm::Array::GetLength(separator);\n\n        if (!String_array)\n        {\n            Il2CppClass *klass = il2cpp::vm::Class::GetArrayClass(il2cpp_defaults.string_class, 1);\n            //mono_memory_barrier ();\n            String_array = klass;\n        }\n\n        splitsize = 1;\n        /* Count the number of elements we will return. Note that this operation\n         * guarantees that we will return exactly splitsize elements, and we will\n         * have enough data to fill each. This allows us to skip some checks later on.\n         */\n        if (remempty == 0)\n        {\n            for (i = 0; i != srcsize && splitsize < count; i++)\n            {\n                if (string_icall_is_in_array(separator, arrsize, src[i]))\n                    splitsize++;\n            }\n        }\n        else if (count > 1)\n        {\n            /* Require pattern \"Nondelim + Delim + Nondelim\" to increment counter.\n             * Lastpos != 0 means first nondelim found.\n             * Flag = 0 means last char was delim.\n             * Efficient, though perhaps confusing.\n             */\n            lastpos = 0;\n            flag = 0;\n            for (i = 0; i != srcsize && splitsize < count; i++)\n            {\n                if (string_icall_is_in_array(separator, arrsize, src[i]))\n                {\n                    flag = 0;\n                }\n                else if (flag == 0)\n                {\n                    if (lastpos == 1)\n                        splitsize++;\n                    flag = 1;\n                    lastpos = 1;\n                }\n            }\n\n            /* Nothing but separators */\n            if (lastpos == 0)\n            {\n                retarr = il2cpp::vm::Array::NewSpecific(String_array, 0);\n                return retarr;\n            }\n        }\n\n        /* if no split chars found return the string */\n        if (splitsize == 1)\n        {\n            if (remempty == 0 || count == 1)\n            {\n                /* Copy the whole string */\n                retarr = il2cpp::vm::Array::NewSpecific(String_array, 1);\n                il2cpp_array_setref(retarr, 0, me);\n            }\n            else\n            {\n                /* otherwise we have to filter out leading & trailing delims */\n\n                /* find first non-delim char */\n                for (; srcsize != 0; srcsize--, src++)\n                {\n                    if (!string_icall_is_in_array(separator, arrsize, src[0]))\n                        break;\n                }\n                /* find last non-delim char */\n                for (; srcsize != 0; srcsize--)\n                {\n                    if (!string_icall_is_in_array(separator, arrsize, src[srcsize - 1]))\n                        break;\n                }\n                tmpstr = il2cpp::vm::String::NewSize(srcsize);\n                tmpstrptr = il2cpp::utils::StringUtils::GetChars(tmpstr);\n\n                memcpy(tmpstrptr, src, srcsize * sizeof(Il2CppChar));\n                retarr = il2cpp::vm::Array::NewSpecific(String_array, 1);\n                il2cpp_array_setref(retarr, 0, tmpstr);\n            }\n            return retarr;\n        }\n\n        lastpos = 0;\n        arrpos = 0;\n\n        retarr = il2cpp::vm::Array::NewSpecific(String_array, splitsize);\n\n        for (i = 0; i != srcsize && arrpos != splitsize; i++)\n        {\n            if (string_icall_is_in_array(separator, arrsize, src[i]))\n            {\n                if (lastpos != i || remempty == 0)\n                {\n                    tmpstrsize = i - lastpos;\n                    tmpstr = il2cpp::vm::String::NewSize(tmpstrsize);\n                    tmpstrptr = il2cpp::utils::StringUtils::GetChars(tmpstr);\n\n                    memcpy(tmpstrptr, src + lastpos, tmpstrsize * sizeof(Il2CppChar));\n                    il2cpp_array_setref(retarr, arrpos, tmpstr);\n                    arrpos++;\n\n                    if (arrpos == splitsize - 1)\n                    {\n                        /* Shortcut the last array element */\n\n                        lastpos = i + 1;\n                        if (remempty != 0)\n                        {\n                            /* Search for non-delim starting char (guaranteed to find one) Note that loop\n                             * condition is only there for safety. It will never actually terminate the loop. */\n                            for (; lastpos != srcsize; lastpos++)\n                            {\n                                if (!string_icall_is_in_array(separator, arrsize, src[lastpos]))\n                                    break;\n                            }\n                            if (count > splitsize)\n                            {\n                                /* Since we have fewer results than our limit, we must remove\n                                 * trailing delimiters as well.\n                                 */\n                                for (; srcsize != lastpos + 1; srcsize--)\n                                {\n                                    if (!string_icall_is_in_array(separator, arrsize, src[srcsize - 1]))\n                                        break;\n                                }\n                            }\n                        }\n\n                        tmpstrsize = srcsize - lastpos;\n                        tmpstr = il2cpp::vm::String::NewSize(tmpstrsize);\n                        tmpstrptr = il2cpp::utils::StringUtils::GetChars(tmpstr);\n\n                        memcpy(tmpstrptr, src + lastpos, tmpstrsize * sizeof(Il2CppChar));\n                        il2cpp_array_setref(retarr, arrpos, tmpstr);\n\n                        /* Loop will ALWAYS end here. Test criteria in the FOR loop is technically unnecessary. */\n                        break;\n                    }\n                }\n                lastpos = i + 1;\n            }\n        }\n\n        return retarr;\n    }\n\n    Il2CppString* String::InternalIntern(Il2CppString* str)\n    {\n        return il2cpp_string_intern(str);\n    }\n\n    Il2CppString* String::InternalIsInterned(Il2CppString* str)\n    {\n        return il2cpp_string_is_interned(str);\n    }\n\n#if NET_4_0\n    Il2CppString* String::FastAllocateString(int32_t length)\n    {\n        return vm::String::NewSize(length);\n    }\n\n#endif\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/String.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\nstruct Il2CppArray;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API String\n    {\n    public:\n        static void RedirectToCreateString();\n        static Il2CppString* InternalAllocateStr(int length);\n        static Il2CppString* InternalIntern(Il2CppString* str);\n        static Il2CppArray* InternalSplit(Il2CppString *, Il2CppArray*, int, int);\n        static Il2CppString* InternalIsInterned(Il2CppString* str);\n#if NET_4_0\n        static Il2CppString* FastAllocateString(int32_t length);\n#endif\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/TimeSpan.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"TimeSpan.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    bool TimeSpan::LegacyFormatMode()\n    {\n        NOT_IMPLEMENTED_ICALL(TimeSpan::LegacyFormatMode);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/TimeSpan.h",
    "content": "#pragma once\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API TimeSpan\n    {\n    public:\n        static bool LegacyFormatMode();\n    };\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/TimeZoneInfo.h",
    "content": "#pragma once\n\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API TimeZoneInfo\n    {\n    public:\n        static inline bool UseRegistryForTimeZoneInformation() { return IL2CPP_TARGET_WINDOWS_DESKTOP; }\n    };\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Type.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System/Type.h\"\n#include \"icalls/mscorlib/System/MonoType.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"il2cpp-api.h\"\n#include <sstream>\n#include \"tabledefs.h\"\n#include \"metadata/GenericMetadata.h\"\n#include \"metadata/Il2CppTypeVector.h\"\n#include \"vm/Array.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/Class.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Object.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/String.h\"\n#include \"vm/Type.h\"\n#include \"vm/Thread.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Reflection.h\"\n#include \"utils/StringUtils.h\"\n\n#include <vector>\n\nusing namespace il2cpp::vm;\nusing il2cpp::metadata::GenericMetadata;\nusing il2cpp::metadata::Il2CppTypeVector;\nusing il2cpp::utils::StringUtils;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    bool Type::EqualsInternal(Il2CppReflectionType * left, Il2CppReflectionType * right)\n    {\n        return (left->type == right->type);\n    }\n\n    bool Type::get_IsGenericType(Il2CppReflectionType* type)\n    {\n        Il2CppClass *klass;\n\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(MonoType::get_IsGenericTypeDefinition, \"Check for custom Type implementations\");\n        //if (!IS_MONOTYPE (type))\n        //  return FALSE;\n\n        if (type->type->byref)\n            return false;\n\n        klass = Class::FromIl2CppType(type->type);\n        return klass->generic_class != NULL || Class::IsGeneric(klass);\n    }\n\n    bool Type::get_IsGenericTypeDefinition(Il2CppReflectionType * type)\n    {\n        Il2CppClass *klass;\n\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(MonoType::get_IsGenericTypeDefinition, \"Check for custom Type implementations\");\n        //if (!IS_MONOTYPE (type))\n        //  return FALSE;\n\n        if (type->type->byref)\n            return false;\n\n        klass = Class::FromIl2CppType(type->type);\n\n        return Class::IsGeneric(klass);\n    }\n\n    int32_t Type::GetGenericParameterPosition(Il2CppReflectionType* type)\n    {\n        if (MonoType::get_IsGenericParameter(type))\n            return vm::Type::GetGenericParameter(type->type)->num;\n        return -1;\n    }\n\n    Il2CppReflectionType * Type::GetGenericTypeDefinition_impl(Il2CppReflectionType* type)\n    {\n        Il2CppClass *klass;\n\n        if (type->type->byref)\n            return NULL;\n\n        klass = Class::FromIl2CppType(type->type);\n        if (Class::IsGeneric(klass))\n            return type;\n\n        if (klass->generic_class)\n        {\n            Il2CppClass *generic_class = GenericClass::GetTypeDefinition(klass->generic_class);\n            return Reflection::GetTypeObject(generic_class->byval_arg);\n        }\n\n        return NULL;\n    }\n\n/* System.TypeCode */\n    typedef enum\n    {\n        TYPECODE_EMPTY,\n        TYPECODE_OBJECT,\n        TYPECODE_DBNULL,\n        TYPECODE_BOOLEAN,\n        TYPECODE_CHAR,\n        TYPECODE_SBYTE,\n        TYPECODE_BYTE,\n        TYPECODE_INT16,\n        TYPECODE_UINT16,\n        TYPECODE_INT32,\n        TYPECODE_UINT32,\n        TYPECODE_INT64,\n        TYPECODE_UINT64,\n        TYPECODE_SINGLE,\n        TYPECODE_DOUBLE,\n        TYPECODE_DECIMAL,\n        TYPECODE_DATETIME,\n        TYPECODE_STRING = 18\n    } TypeCode;\n\n    int Type::GetTypeCodeInternal(Il2CppReflectionType* type)\n    {\n        int t = type->type->type;\n\n        if (type->type->byref)\n            return TYPECODE_OBJECT;\n\n    handle_enum:\n        switch (t)\n        {\n            case IL2CPP_TYPE_VOID:\n                return TYPECODE_OBJECT;\n            case IL2CPP_TYPE_BOOLEAN:\n                return TYPECODE_BOOLEAN;\n            case IL2CPP_TYPE_U1:\n                return TYPECODE_BYTE;\n            case IL2CPP_TYPE_I1:\n                return TYPECODE_SBYTE;\n            case IL2CPP_TYPE_U2:\n                return TYPECODE_UINT16;\n            case IL2CPP_TYPE_I2:\n                return TYPECODE_INT16;\n            case IL2CPP_TYPE_CHAR:\n                return TYPECODE_CHAR;\n            case IL2CPP_TYPE_PTR:\n            case IL2CPP_TYPE_U:\n            case IL2CPP_TYPE_I:\n                return TYPECODE_OBJECT;\n            case IL2CPP_TYPE_U4:\n                return TYPECODE_UINT32;\n            case IL2CPP_TYPE_I4:\n                return TYPECODE_INT32;\n            case IL2CPP_TYPE_U8:\n                return TYPECODE_UINT64;\n            case IL2CPP_TYPE_I8:\n                return TYPECODE_INT64;\n            case IL2CPP_TYPE_R4:\n                return TYPECODE_SINGLE;\n            case IL2CPP_TYPE_R8:\n                return TYPECODE_DOUBLE;\n            case IL2CPP_TYPE_VALUETYPE:\n            {\n                if (vm::Type::IsEnum(type->type))\n                {\n                    t = Class::GetEnumBaseType(vm::Type::GetClass(type->type))->type;\n                    goto handle_enum;\n                }\n                else\n                {\n                    if (vm::Type::IsSystemDecimal(type->type))\n                        return TYPECODE_DECIMAL;\n                    else if (vm::Type::IsSystemDateTime(type->type))\n                        return TYPECODE_DATETIME;\n                }\n                return TYPECODE_OBJECT;\n            }\n            case IL2CPP_TYPE_STRING:\n                return TYPECODE_STRING;\n            case IL2CPP_TYPE_SZARRAY:\n            case IL2CPP_TYPE_ARRAY:\n            case IL2CPP_TYPE_OBJECT:\n            case IL2CPP_TYPE_VAR:\n            case IL2CPP_TYPE_MVAR:\n            case IL2CPP_TYPE_TYPEDBYREF:\n                return TYPECODE_OBJECT;\n            case IL2CPP_TYPE_CLASS:\n            {\n                if (vm::Type::IsSystemDBNull(type->type))\n                    return TYPECODE_DBNULL;\n            }\n                return TYPECODE_OBJECT;\n            case IL2CPP_TYPE_GENERICINST:\n                return TYPECODE_OBJECT;\n            default:\n                abort();\n        }\n        return false;\n    }\n\n    Il2CppReflectionType * Type::internal_from_handle(Il2CppIntPtr ptr)\n    {\n        const Il2CppType* type = (const Il2CppType*)ptr.m_value;\n        Il2CppClass *klass = Class::FromIl2CppType(type);\n\n        return il2cpp::vm::Reflection::GetTypeObject(klass->byval_arg);\n    }\n\n#define CHECK_IF_NULL(v)    \\\n    if ( (v) == NULL && throwOnError ) \\\n        Exception::Raise (Exception::GetTypeLoadException ()); \\\n    if ( (v) == NULL ) \\\n        return NULL;\n\n    Il2CppReflectionType * Type::internal_from_name(Il2CppString* name, bool throwOnError, bool ignoreCase)\n    {\n        std::string str = StringUtils::Utf16ToUtf8(utils::StringUtils::GetChars(name));\n\n        il2cpp::vm::TypeNameParseInfo info;\n        il2cpp::vm::TypeNameParser parser(str, info, false);\n\n        if (!parser.Parse())\n        {\n            if (throwOnError)\n                Exception::Raise(Exception::GetArgumentException(\"typeName\", \"Invalid type name\"));\n            else\n                return NULL;\n        }\n\n        const Il2CppType *type = vm::Class::il2cpp_type_from_type_info(info, throwOnError, ignoreCase);\n\n        CHECK_IF_NULL(type);\n\n        return il2cpp::vm::Reflection::GetTypeObject(type);\n    }\n\n    bool Type::IsArrayImpl(Il2CppReflectionType *t)\n    {\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(Type::IsArrayImpl, \"Faulty implementation?\");\n\n        Il2CppClass* typeInfo = Class::FromSystemType(t);\n        return typeInfo->rank > 0;\n    }\n\n    bool Type::IsInstanceOfType(Il2CppReflectionType *type, Il2CppObject * obj)\n    {\n        Il2CppClass *klass = Class::FromIl2CppType(type->type);\n        return il2cpp::vm::Object::IsInst(obj, klass) != NULL;\n    }\n\n    void validate_make_array_type_inputs(Il2CppReflectionType* type, int32_t rank)\n    {\n        // Per MSDN: http://msdn.microsoft.com/en-us/library/w0ykk2sw(v=vs.110).aspx\n        if (rank > 32)\n        {\n            std::stringstream message;\n            message << vm::Type::GetName(type->type, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME) << \" with rank \" << rank << \" has too many dimensions.\";\n            il2cpp_raise_exception(vm::Exception::GetTypeLoadException(message.str().c_str()));\n        }\n\n        if (type->type->byref)\n        {\n            std::stringstream message;\n            message << \"Could not create array type '\" << vm::Type::GetName(type->type, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME) << \"'.\";\n            il2cpp_raise_exception(vm::Exception::GetTypeLoadException(message.str().c_str()));\n        }\n\n        const Il2CppClass *klass = Class::FromIl2CppType(type->type);\n\n        if ((strcmp(klass->namespaze, \"System\") == 0 && strcmp(klass->name, \"TypedReference\") == 0))\n        {\n            std::stringstream message;\n            message << \"Could not create array type '\" << klass->namespaze << \".\" << klass->name << \"[]'.\";\n            il2cpp_raise_exception(vm::Exception::GetTypeLoadException(message.str().c_str()));\n        }\n    }\n\n    Il2CppReflectionType* Type::make_array_type(Il2CppReflectionType* type, int32_t rank)\n    {\n        validate_make_array_type_inputs(type, rank);\n\n        Il2CppClass* arrayClass;\n\n        Il2CppClass* klass = il2cpp_class_from_il2cpp_type(type->type);\n        if (rank == 0) //single dimentional array\n            arrayClass = il2cpp_array_class_get(klass, 1);\n        else\n            arrayClass = il2cpp_bounded_array_class_get(klass, rank, true);\n\n        return arrayClass != NULL ? Reflection::GetTypeObject(arrayClass->byval_arg) : NULL;\n    }\n\n    static std::string FormatExceptionMessageForNonConstructableGenericType(const Il2CppType* type, const Il2CppTypeVector& genericArguments)\n    {\n        std::string message;\n        message += \"Failed to construct generic type '\";\n        message += il2cpp::vm::Type::GetName(type, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME);\n        message += \"' with generic arguments [\";\n        for (Il2CppTypeVector::const_iterator iter = genericArguments.begin(); iter != genericArguments.end(); ++iter)\n        {\n            if (iter != genericArguments.begin())\n                message += \", \";\n            message += il2cpp::vm::Type::GetName(*iter, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME);\n        }\n        message += \"] at runtime.\";\n\n        return message;\n    }\n\n    Il2CppReflectionType * Type::MakeGenericType(Il2CppReflectionType* type, Il2CppArray* genericArgumentTypes)\n    {\n        const Il2CppType* genericTypeDefinitionType = type->type;\n        Il2CppClass* genericTypeDefinitionClass = Class::FromIl2CppType(genericTypeDefinitionType);\n        IL2CPP_ASSERT(Class::IsGeneric(genericTypeDefinitionClass));\n\n        uint32_t arrayLength = Array::GetLength(genericArgumentTypes);\n        Il2CppTypeVector genericArguments;\n        genericArguments.reserve(arrayLength);\n\n        for (uint32_t i = 0; i < arrayLength; i++)\n        {\n            Il2CppReflectionType* genericArgumentType = il2cpp_array_get(genericArgumentTypes, Il2CppReflectionType*, i);\n            genericArguments.push_back(genericArgumentType->type);\n        }\n\n        const Il2CppGenericInst* inst = MetadataCache::GetGenericInst(genericArguments);\n        Il2CppGenericClass* genericClass = GenericMetadata::GetGenericClass(genericTypeDefinitionClass, inst);\n        Il2CppClass* genericInstanceTypeClass = GenericClass::GetClass(genericClass);\n\n        if (!genericInstanceTypeClass)\n        {\n            Exception::Raise(Exception::GetNotSupportedException(FormatExceptionMessageForNonConstructableGenericType(genericTypeDefinitionType, genericArguments).c_str()));\n            return NULL;\n        }\n\n        return Reflection::GetTypeObject(genericInstanceTypeClass->byval_arg);\n    }\n\n    bool Type::type_is_assignable_from(Il2CppReflectionType * type, Il2CppReflectionType * c)\n    {\n        Il2CppClass *klass;\n        Il2CppClass *klassc;\n\n        klass = Class::FromIl2CppType(type->type);\n        klassc = Class::FromIl2CppType(c->type);\n\n        if (type->type->byref && !c->type->byref)\n            return false;\n\n        return Class::IsAssignableFrom(klass, klassc);\n    }\n\n    bool Type::type_is_subtype_of(Il2CppReflectionType *type, Il2CppReflectionType *c, bool check_interfaces)\n    {\n        Il2CppClass *klass;\n        Il2CppClass *klassc;\n\n        IL2CPP_ASSERT(type != NULL);\n\n        if (!c) /* FIXME: dont know what do do here */\n            return false;\n\n        klass = Class::FromSystemType(type);\n        klassc = Class::FromSystemType(c);\n\n        /*if (type->type->byref)\n            return klassc == mono_defaults.object_class;*/\n\n        return Class::IsSubclassOf(klass, klassc, check_interfaces);\n    }\n\n    Il2CppReflectionType* Type::make_byref_type(Il2CppReflectionType *type)\n    {\n        Il2CppClass *klass;\n\n        klass = Class::FromIl2CppType(type->type);\n\n        return il2cpp::vm::Reflection::GetTypeObject(klass->this_arg);\n    }\n\n    Il2CppReflectionType * Type::MakePointerType(Il2CppReflectionType* type)\n    {\n        Il2CppClass* pointerType = Class::GetPtrClass(type->type);\n\n        return Reflection::GetTypeObject(pointerType->byval_arg);\n    }\n\n    void Type::GetInterfaceMapData(Il2CppReflectionType* type, Il2CppReflectionType* iface, Il2CppArray** targets, Il2CppArray** methods)\n    {\n        Il2CppClass* klass = il2cpp_class_from_il2cpp_type(type->type);\n        Il2CppClass* iklass = il2cpp_class_from_il2cpp_type(iface->type);\n\n        int32_t numberOfMethods = (int32_t)Class::GetNumMethods(iklass);\n        *targets = il2cpp_array_new(il2cpp_defaults.method_info_class, numberOfMethods);\n        *methods = il2cpp_array_new(il2cpp_defaults.method_info_class, numberOfMethods);\n\n        if (numberOfMethods == 0)\n            return;\n\n        void* unused = NULL;\n        Class::Init(klass);\n        const VirtualInvokeData* invokeDataStart;\n\n        // So this part is tricky. GetInterfaceInvokeDataFromVTable takes an object pointer in order to support\n        // COM peculiarities, like being able to return invoke data for an interface only if native side implements it\n        // So here we create a fake object of the class we want to query and pass that to GetInterfaceInvokeDataFromVTable\n        // It is safe because the only fields GetInterfaceInvokeDataFromVTable accesses are the klass and identity fields\n        if (!klass->is_import_or_windows_runtime)\n        {\n            Il2CppObject fakeObject;\n            fakeObject.klass = klass;\n            fakeObject.monitor = NULL;\n            invokeDataStart = &Class::GetInterfaceInvokeDataFromVTable(&fakeObject, iklass, 0);\n        }\n        else\n        {\n            Il2CppComObject fakeComObject;\n            fakeComObject.klass = klass;\n            fakeComObject.monitor = NULL;\n\n            // This makes GetInterfaceInvokeDataFromVTable believe that the COM object is dead,\n            // thus making it skip asking native side whether a particular interface is supported\n            fakeComObject.identity = NULL;\n\n            invokeDataStart = &Class::GetInterfaceInvokeDataFromVTable(&fakeComObject, iklass, 0);\n        }\n\n        for (int i = 0; i < numberOfMethods; ++i)\n        {\n            const MethodInfo *method = il2cpp_class_get_methods(iklass, &unused);\n            Il2CppReflectionMethod* member = il2cpp_method_get_object(method, iklass);\n            il2cpp_array_setref(*methods, i, member);\n            member = il2cpp_method_get_object(invokeDataStart[i].method, klass);\n            il2cpp_array_setref(*targets, i, member);\n        }\n    }\n\n    GenericParameterAttributes Type::GetGenericParameterAttributes(Il2CppReflectionType* type)\n    {\n        const Il2CppGenericParameter* genericParameter = vm::Type::GetGenericParameter(type->type);\n        if (genericParameter->ownerIndex == kGenericContainerIndexInvalid)\n            return 0;\n\n        return genericParameter->flags;\n    }\n\n    Il2CppArray* Type::GetGenericParameterConstraints_impl(Il2CppReflectionType* type)\n    {\n        const Il2CppGenericParameter* genericParameter = vm::Type::GetGenericParameter(type->type);\n        if (genericParameter->ownerIndex == kGenericContainerIndexInvalid)\n            return NULL;\n\n        Il2CppArray* res = il2cpp_array_new(il2cpp_defaults.monotype_class, genericParameter->constraintsCount);\n        for (int i = 0; i < genericParameter->constraintsCount; i++)\n            il2cpp_array_setref(res, i, il2cpp_type_get_object(MetadataCache::GetGenericParameterConstraintFromIndex(genericParameter->constraintsStart + i)));\n\n        return res;\n    }\n\n    void Type::GetPacking(Il2CppReflectionType* type, int32_t* packing, int32_t* size)\n    {\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(Type::GetPacking, \"In progress, need this function to not assert to test other aspects of StructLayout attribute\");\n        *packing = 8;\n        *size = 0;\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/Type.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct mscorlib_System_Reflection_Assembly;\nstruct mscorlib_System_Reflection_Module;\nstruct mscorlib_System_Reflection_MethodInfo;\n\ntypedef int32_t GenericParameterAttributes;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API Type\n    {\n    public:\n        static bool EqualsInternal(Il2CppReflectionType* left, Il2CppReflectionType* right);\n        static GenericParameterAttributes GetGenericParameterAttributes(Il2CppReflectionType* type);\n        static Il2CppArray* GetGenericParameterConstraints_impl(Il2CppReflectionType* type);\n        static int32_t GetGenericParameterPosition(Il2CppReflectionType* type);\n        static Il2CppReflectionType* GetGenericTypeDefinition_impl(Il2CppReflectionType*);\n        static void GetInterfaceMapData(Il2CppReflectionType* t, Il2CppReflectionType* iface, Il2CppArray** targets, Il2CppArray** methods);\n        static void GetPacking(Il2CppReflectionType* type, int32_t* packing, int32_t* size);\n        static int GetTypeCodeInternal(Il2CppReflectionType*);\n        static bool IsArrayImpl(Il2CppReflectionType* t);\n        static bool IsInstanceOfType(Il2CppReflectionType* type, Il2CppObject* obj);\n        static Il2CppReflectionType* MakeGenericType(Il2CppReflectionType* , Il2CppArray*);\n        static Il2CppReflectionType* MakePointerType(Il2CppReflectionType* thisPtr);\n        static bool get_IsGenericType(Il2CppReflectionType*);\n        static bool get_IsGenericTypeDefinition(Il2CppReflectionType* type);\n        static Il2CppReflectionType* internal_from_handle(Il2CppIntPtr ptr);\n        static Il2CppReflectionType* internal_from_name(Il2CppString* name, bool throwOnError, bool ignoreCase);\n        static Il2CppReflectionType* make_array_type(Il2CppReflectionType* type, int32_t rank);\n        static bool type_is_assignable_from(Il2CppReflectionType* type, Il2CppReflectionType* c);\n        static bool type_is_subtype_of(Il2CppReflectionType* type, Il2CppReflectionType* c, bool check_interfaces);\n        static Il2CppReflectionType* make_byref_type(Il2CppReflectionType* type);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/TypedReference.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System/TypedReference.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    Il2CppObject* TypedReference::ToObject(void* /* System.TypedReference */ value)\n    {\n        NOT_SUPPORTED_IL2CPP(TypedReference::ToObject, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n#if NET_4_0\n    Il2CppObject* TypedReference::InternalToObject(void* value)\n    {\n        NOT_IMPLEMENTED_ICALL(TypedReference::InternalToObject);\n        IL2CPP_UNREACHABLE;\n        return NULL;\n    }\n\n    Il2CppTypedRef TypedReference::MakeTypedReferenceInternal(Il2CppObject* target, Il2CppArray* fields)\n    {\n        NOT_IMPLEMENTED_ICALL(TypedReference::MakeTypedReferenceInternal);\n        IL2CPP_UNREACHABLE;\n        return Il2CppTypedRef();\n    }\n\n#endif\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/TypedReference.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API TypedReference\n    {\n    public:\n        static Il2CppObject* ToObject(void* /* System.TypedReference */ value);\n#if NET_4_0\n        static Il2CppObject* InternalToObject(void* value);\n        static Il2CppTypedRef MakeTypedReferenceInternal(Il2CppObject* target, Il2CppArray* fields);\n#endif\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/ValueType.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <memory>\n#include \"icalls/mscorlib/System/ValueType.h\"\n#include \"tabledefs.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"gc/WriteBarrier.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Field.h\"\n#include \"vm/Object.h\"\n#include \"vm/String.h\"\n\nusing namespace il2cpp::vm;\nusing il2cpp::gc::WriteBarrier;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    bool ValueType::InternalEquals(Il2CppObject * thisPtr, Il2CppObject * that, Il2CppArray** fields)\n    {\n        Il2CppClass *klass;\n        Il2CppObject **values = NULL;\n        Il2CppObject *o;\n        FieldInfo* field;\n        void* iter;\n        int count = 0;\n\n        IL2CPP_CHECK_ARG_NULL(that);\n\n        if (thisPtr->klass != that->klass)\n            return false;\n\n        klass = Object::GetClass(thisPtr);\n\n        if (klass->enumtype && Class::GetEnumBaseType(klass) && Class::GetEnumBaseType(klass)->type == IL2CPP_TYPE_I4)\n            return (*(int32_t*)((uint8_t*)thisPtr + sizeof(Il2CppObject)) == *(int32_t*)((uint8_t*)that + sizeof(Il2CppObject)));\n\n        /*\n         * Do the comparison for fields of primitive type and return a result if\n         * possible. Otherwise, return the remaining fields in an array to the\n         * managed side. This way, we can avoid costly reflection operations in\n         * managed code.\n         */\n        *fields = NULL;\n        iter = NULL;\n        while ((field = Class::GetFields(klass, &iter)))\n        {\n            if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n                continue;\n            if (Field::IsDeleted(field))\n                continue;\n            /* FIXME: Add more types */\n\n            switch (field->type->type)\n            {\n                case IL2CPP_TYPE_I1:\n                case IL2CPP_TYPE_U1:\n                case IL2CPP_TYPE_BOOLEAN:\n                    if (*((uint8_t*)thisPtr + field->offset) != *((uint8_t*)that + field->offset))\n                        return false;\n                    break;\n                case IL2CPP_TYPE_I2:\n                case IL2CPP_TYPE_U2:\n                case IL2CPP_TYPE_CHAR:\n                    if (*(int16_t*)((uint8_t*)thisPtr + field->offset) != *(int16_t*)((uint8_t*)that + field->offset))\n                        return false;\n                    break;\n                case IL2CPP_TYPE_I4:\n                case IL2CPP_TYPE_U4:\n                    if (*(int32_t*)((uint8_t*)thisPtr + field->offset) != *(int32_t*)((uint8_t*)that + field->offset))\n                        return false;\n                    break;\n                case IL2CPP_TYPE_I8:\n                case IL2CPP_TYPE_U8:\n                    if (*(int64_t*)((uint8_t*)thisPtr + field->offset) != *(int64_t*)((uint8_t*)that + field->offset))\n                        return false;\n                    break;\n                case IL2CPP_TYPE_R4:\n                    if (*(float*)((uint8_t*)thisPtr + field->offset) != *(float*)((uint8_t*)that + field->offset))\n                        return false;\n                    break;\n                case IL2CPP_TYPE_R8:\n                    if (*(double*)((uint8_t*)thisPtr + field->offset) != *(double*)((uint8_t*)that + field->offset))\n                        return false;\n                    break;\n                case IL2CPP_TYPE_STRING:\n                    Il2CppString *s1, *s2;\n                    uint32_t s1len, s2len;\n                    s1 = *(Il2CppString**)((uint8_t*)thisPtr + field->offset);\n                    s2 = *(Il2CppString**)((uint8_t*)that + field->offset);\n                    if (s1 == s2)\n                        break;\n                    if ((s1 == NULL) || (s2 == NULL))\n                        return false;\n                    s1len = utils::StringUtils::GetLength(s1);\n                    s2len = utils::StringUtils::GetLength(s2);\n                    if (s1len != s2len)\n                        return false;\n\n                    if (memcmp(utils::StringUtils::GetChars(s1), utils::StringUtils::GetChars(s2), s1len * sizeof(Il2CppChar)) != 0)\n                        return false;\n                    break;\n                default:\n                    if (!values)\n                        values = (Il2CppObject**)alloca(sizeof(Il2CppObject*) * (Class::GetNumFields(klass) * 2));\n                    o = Field::GetValueObject(field, thisPtr);\n                    values[count++] = o;\n                    o = Field::GetValueObject(field, that);\n                    values[count++] = o;\n            }\n\n            if (klass->enumtype)\n                /* enums only have one non-static field */\n                break;\n        }\n\n        if (values)\n        {\n            int i;\n            WriteBarrier::GenericStore(fields, (Il2CppObject*)Array::New(il2cpp_defaults.object_class, count));\n            for (i = 0; i < count; ++i)\n                il2cpp_array_setref(*fields, i, values[i]);\n            return false;\n        }\n        else\n        {\n            return true;\n        }\n    }\n\n    int ValueType::InternalGetHashCode(Il2CppObject* obj, Il2CppArray** fields)\n    {\n        Il2CppObject **values = NULL;\n        int count = 0;\n        int32_t result = 0;\n        FieldInfo* field = NULL;\n        void* iter = NULL;\n\n        Il2CppClass* klass = Object::GetClass(obj);\n\n        if (Class::GetNumFields(klass) == 0)\n            return Object::GetHash(obj);\n\n        /*\n         * Compute the starting value of the hashcode for fields of primitive\n         * types, and return the remaining fields in an array to the managed side.\n         * This way, we can avoid costly reflection operations in managed code.\n         */\n        iter = NULL;\n        while ((field = Class::GetFields(klass, &iter)))\n        {\n            if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n                continue;\n            if (Field::IsDeleted(field))\n                continue;\n            /* FIXME: Add more types */\n            switch (field->type->type)\n            {\n                case IL2CPP_TYPE_I4:\n                    result ^= *(int32_t*)((uint8_t*)obj + field->offset);\n                    break;\n                case IL2CPP_TYPE_STRING:\n                {\n                    Il2CppString *s;\n                    s = *(Il2CppString**)((uint8_t*)obj + field->offset);\n                    if (s != NULL)\n                        result ^= String::GetHash(s);\n                    break;\n                }\n                default:\n                    if (!values)\n                        values = (Il2CppObject**)alloca(sizeof(Il2CppObject*) * Class::GetNumFields(klass));\n                    Il2CppObject* o = Field::GetValueObject(field, obj);\n                    values[count++] = o;\n            }\n        }\n\n        if (values)\n        {\n            int i;\n            WriteBarrier::GenericStore(fields, (Il2CppObject*)Array::New(il2cpp_defaults.object_class, count));\n            for (i = 0; i < count; ++i)\n                il2cpp_array_setref(*fields, i, values[i]);\n        }\n        else\n        {\n            *fields = NULL;\n        }\n\n        return result;\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/ValueType.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppArray;\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API ValueType\n    {\n    public:\n        static bool InternalEquals(Il2CppObject * thisPtr, Il2CppObject * that, Il2CppArray** fields);\n        static int InternalGetHashCode(Il2CppObject *, Il2CppArray * *);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/__ComObject.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System/__ComObject.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    mscorlib_System___ComObject * __ComObject::CreateRCW(Il2CppReflectionType * t)\n    {\n        NOT_IMPLEMENTED_ICALL(__ComObject::CreateRCW);\n        return 0;\n    }\n\n    void __ComObject::ReleaseInterfaces(mscorlib_System___ComObject * thisPtr)\n    {\n        NOT_IMPLEMENTED_ICALL(__ComObject::ReleaseInterfaces);\n    }\n\n    Il2CppIntPtr __ComObject::GetInterfaceInternal(mscorlib_System___ComObject * thisPtr, Il2CppReflectionType * t, bool throwException)\n    {\n        NOT_IMPLEMENTED_ICALL(__ComObject::GetInterfaceInternal);\n        return Il2CppIntPtr();\n    }\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System/__ComObject.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppReflectionType;\nstruct mscorlib_System___ComObject;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\n    class LIBIL2CPP_CODEGEN_API __ComObject\n    {\n    public:\n        static mscorlib_System___ComObject * CreateRCW(Il2CppReflectionType * t);\n        static void ReleaseInterfaces(mscorlib_System___ComObject * thisPtr);\n        static Il2CppIntPtr GetInterfaceInternal(mscorlib_System___ComObject * thisPtr, Il2CppReflectionType * t, bool throwException);\n    };\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Diagnostics/Assert.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"Assert.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    int32_t Assert::ShowDefaultAssertDialog(Il2CppString* conditionString, Il2CppString* message, Il2CppString* stackTrace, Il2CppString* windowTitle)\n    {\n        NOT_IMPLEMENTED_ICALL(Assert::ShowDefaultAssertDialog);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n} // namespace Diagnostics\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Diagnostics/Assert.h",
    "content": "#pragma once\n#if NET_4_0\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    class LIBIL2CPP_CODEGEN_API Assert\n    {\n    public:\n        static int32_t ShowDefaultAssertDialog(Il2CppString* conditionString, Il2CppString* message, Il2CppString* stackTrace, Il2CppString* windowTitle);\n    };\n} // namespace Diagnostics\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Diagnostics/Debugger.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Diagnostics/Debugger.h\"\n#include \"os/Debug.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n// Until we have il2cpp debugger, return whether a native debugger is attached\n    bool Debugger::IsAttached_internal()\n    {\n        return os::Debug::IsDebuggerPresent();\n    }\n\n#if NET_4_0\n    bool Debugger::IsLogging()\n    {\n        NOT_IMPLEMENTED_ICALL(Debugger::IsLogging);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    void Debugger::Log(int32_t level, Il2CppString* category, Il2CppString* message)\n    {\n        NOT_IMPLEMENTED_ICALL(Debugger::Log);\n        IL2CPP_UNREACHABLE;\n    }\n\n#endif\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Diagnostics/Debugger.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    class LIBIL2CPP_CODEGEN_API Debugger\n    {\n    public:\n        static bool IsAttached_internal();\n\n#if NET_4_0\n        static bool IsLogging();\n        static void Log(int32_t level, Il2CppString* category, Il2CppString* message);\n#endif\n    };\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Diagnostics/StackFrame.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Diagnostics/StackFrame.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/StackTrace.h\"\n#include \"class-internals.h\"\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    static bool IsCalledFromSystemDiagnosticsStackTrace(const StackFrames& stack)\n    {\n        for (StackFrames::const_iterator frame = stack.begin(); frame != stack.end(); ++frame)\n            if (strcmp(frame->method->declaring_type->namespaze, \"System.Diagnostics\") == 0 && strcmp(frame->method->declaring_type->name, \"StackTrace\") == 0)\n                return true;\n\n        return false;\n    }\n\n    static bool FrameNeedsSkipped(const Il2CppStackFrameInfo& frame)\n    {\n        return strcmp(frame.method->declaring_type->namespaze, \"System.Diagnostics\") == 0 &&\n            (strcmp(frame.method->declaring_type->name, \"StackFrame\") == 0 || strcmp(frame.method->declaring_type->name, \"StackTrace\") == 0);\n    }\n\n    bool StackFrame::get_frame_info(\n        int32_t skip,\n        bool needFileInfo,\n        Il2CppReflectionMethod ** method,\n        int32_t* iloffset,\n        int32_t* native_offset,\n        Il2CppString** file,\n        int32_t* line,\n        int32_t* column)\n    {\n        const int kSkippedFramesFromMSCorlibStackFrameMethods = 2;\n        const int kSkippedFramesFromMSCorlibStackTraceMethods = 2;\n\n        const StackFrames& stack = *StackTrace::GetStackFrames();\n\n        // Always ignore the skipped frames from System.Diagnostics.StackFrame, as we know we are always called from it.\n        // These frames might be inlined or optimized away by the C++ compiler, so we will inspect the actual stack\n        // frames later to see if we need to add skipped frames back in for System.Diagnostics.StackFrame.\n        skip -= kSkippedFramesFromMSCorlibStackFrameMethods;\n\n\n        // Sometimes ignore the skipped frames from System.Diagnostics.StackTrace, as we may or may not be called from it.\n        // These frames might be inlined or optimized away by the C++ compiler, so we will inspect the actual stack\n        // frames later to see if we need to add skipped frames back in for System.Diagnostics.StackTrace.\n        if (IsCalledFromSystemDiagnosticsStackTrace(stack))\n            skip -= kSkippedFramesFromMSCorlibStackTraceMethods;\n\n        // Now look in the actual stack trace to see if anything we ignored above is really there. We don't know what the C++\n        // compile will do with these frames, so we need to inspect each frame and check.\n        for (StackFrames::const_iterator frame = stack.begin(); frame != stack.end(); ++frame)\n        {\n            if (FrameNeedsSkipped(*frame))\n                skip++;\n        }\n\n        // Finally, find the location in the stack we actually want to use by offsetting from the end of the stack the number of\n        // frames we skipped, and offsetting it by one more to account for this icall itself.\n        int64_t index = stack.size() - skip - 1;\n        if (static_cast<uint64_t>(index) >= stack.size() || index < 0)\n            return false;\n\n        const Il2CppStackFrameInfo& info = stack[static_cast<size_t>(index)];\n\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(StackFrame::get_frame_info, \"use gc write barrier\");\n        *method = Reflection::GetMethodObject(info.method, info.method->declaring_type);\n\n        return true;\n    }\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Diagnostics/StackFrame.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\nstruct Il2CppReflectionMethod;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    class LIBIL2CPP_CODEGEN_API StackFrame\n    {\n    public:\n        static bool get_frame_info(\n            int32_t skip,\n            bool needFileInfo,\n            Il2CppReflectionMethod ** method,\n            int32_t* iloffset,\n            int32_t* native_offset,\n            Il2CppString** file,\n            int32_t* line,\n            int32_t* column);\n    };\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Diagnostics/StackTrace.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"vm/Array.h\"\n#include \"vm/Object.h\"\n#include \"vm/Reflection.h\"\n#include \"icalls/mscorlib/System.Diagnostics/StackTrace.h\"\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    Il2CppArray* StackTrace::get_trace(Il2CppException *exc, int32_t skip, bool need_file_info)\n    {\n        Il2CppArray *res;\n        Il2CppArray *ta = exc->trace_ips;\n        int i, len;\n\n        if (ta == NULL)\n        {\n            /* Exception is not thrown yet */\n            return Array::New(il2cpp_defaults.stack_frame_class, 0);\n        }\n\n        len = Array::GetLength(ta);\n\n        res = Array::New(il2cpp_defaults.stack_frame_class, len > skip ? len - skip : 0);\n\n        for (i = skip; i < len; i++)\n        {\n            Il2CppStackFrame *sf = (Il2CppStackFrame*)Object::New(il2cpp_defaults.stack_frame_class);\n            MethodInfo* method = il2cpp_array_get(ta, MethodInfo*, i);\n\n            IL2CPP_OBJECT_SETREF(sf, method, Reflection::GetMethodObject(method, NULL));\n\n            il2cpp_array_setref(res, i, sf);\n        }\n\n        return res;\n    }\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Diagnostics/StackTrace.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppArray;\nstruct Il2CppException;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Diagnostics\n{\n    class LIBIL2CPP_CODEGEN_API StackTrace\n    {\n    public:\n        static Il2CppArray* get_trace(Il2CppException *exc, int32_t skip, bool need_file_info);\n    };\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/CalendarData.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"CalendarData.h\"\n#include \"object-internals.h\"\n#include \"CultureInfoTables.h\"\n#include \"il2cpp-api.h\"\n#include \"class-internals.h\"\n#include \"vm/Array.h\"\n#include \"vm/String.h\"\n#include <string>\n#include \"utils/StringUtils.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Globalization\n{\n    static Il2CppArray* create_names_array_idx(const uint16_t* names, int max)\n    {\n        if (names == NULL)\n            return NULL;\n\n        int len = 0;\n        for (int i = 0; i < max; i++)\n        {\n            if (names[i] == 0)\n                break;\n            len++;\n        }\n\n        Il2CppArray* ret = il2cpp_array_new_specific(il2cpp_array_class_get(il2cpp_defaults.string_class, 1), len + 1);\n\n        for (int i = 0; i < len; i++)\n            il2cpp_array_setref(ret, i, il2cpp_string_new(idx2string(names[i])));\n\n        il2cpp_array_setref(ret, len, vm::String::Empty());\n\n        return ret;\n    }\n\n    static int culture_name_locator(const void *a, const void *b)\n    {\n        const char* aa = (const char*)a;\n        const CultureInfoNameEntry* bb = (const CultureInfoNameEntry*)b;\n        int ret;\n\n        ret = strcmp(aa, idx2string(bb->name));\n\n        return ret;\n    }\n\n    bool CalendarData::fill_calendar_data(Il2CppCalendarData* _this, Il2CppString* localeName, int32_t datetimeIndex)\n    {\n        const DateTimeFormatEntry *dfe;\n        const CultureInfoEntry *ci;\n\n        std::string cultureName = il2cpp::utils::StringUtils::Utf16ToUtf8(localeName->chars);\n\n        const CultureInfoNameEntry* ne = (const CultureInfoNameEntry*)bsearch(cultureName.c_str(), culture_name_entries, NUM_CULTURE_ENTRIES, sizeof(CultureInfoNameEntry), culture_name_locator);\n\n        if (ne == NULL)\n        {\n            return false;\n        }\n\n        ci = &culture_entries[ne->culture_entry_index];\n        dfe = &datetime_format_entries[ci->datetime_format_index];\n\n        IL2CPP_OBJECT_SETREF(_this, NativeName, il2cpp_string_new(idx2string(ci->nativename)));\n        Il2CppArray *short_date_patterns = create_names_array_idx(dfe->short_date_patterns, NUM_SHORT_DATE_PATTERNS);\n        IL2CPP_OBJECT_SETREF(_this, ShortDatePatterns, short_date_patterns);\n        Il2CppArray *year_month_patterns = create_names_array_idx(dfe->year_month_patterns, NUM_YEAR_MONTH_PATTERNS);\n        IL2CPP_OBJECT_SETREF(_this, YearMonthPatterns, year_month_patterns);\n        Il2CppArray *long_date_patterns = create_names_array_idx(dfe->long_date_patterns, NUM_LONG_DATE_PATTERNS);\n        IL2CPP_OBJECT_SETREF(_this, LongDatePatterns, long_date_patterns);\n        IL2CPP_OBJECT_SETREF(_this, MonthDayPattern, il2cpp_string_new(idx2string(dfe->month_day_pattern)));\n        Il2CppArray *day_names = create_names_array_idx(dfe->day_names, NUM_DAYS);\n        IL2CPP_OBJECT_SETREF(_this, DayNames, day_names);\n        Il2CppArray *abbr_day_names = create_names_array_idx(dfe->abbreviated_day_names, NUM_DAYS);\n        IL2CPP_OBJECT_SETREF(_this, AbbreviatedDayNames, abbr_day_names);\n        Il2CppArray *ss_day_names = create_names_array_idx(dfe->shortest_day_names, NUM_DAYS);\n        IL2CPP_OBJECT_SETREF(_this, SuperShortDayNames, ss_day_names);\n        Il2CppArray *month_names = create_names_array_idx(dfe->month_names, NUM_MONTHS);\n        IL2CPP_OBJECT_SETREF(_this, MonthNames, month_names);\n        Il2CppArray *abbr_mon_names = create_names_array_idx(dfe->abbreviated_month_names, NUM_MONTHS);\n        IL2CPP_OBJECT_SETREF(_this, AbbreviatedMonthNames, abbr_mon_names);\n        Il2CppArray *gen_month_names = create_names_array_idx(dfe->month_genitive_names, NUM_MONTHS);\n        IL2CPP_OBJECT_SETREF(_this, GenitiveMonthNames, gen_month_names);\n        Il2CppArray *gen_abbr_mon_names = create_names_array_idx(dfe->abbreviated_month_genitive_names, NUM_MONTHS);\n        IL2CPP_OBJECT_SETREF(_this, GenitiveAbbreviatedMonthNames, gen_abbr_mon_names);\n\n        return true;\n    }\n} // namespace Globalization\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/CalendarData.h",
    "content": "#pragma once\n\n#if NET_4_0\nstruct Il2CppCalendarData;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Globalization\n{\n    class LIBIL2CPP_CODEGEN_API CalendarData\n    {\n    public:\n        static bool fill_calendar_data(Il2CppCalendarData* _this, Il2CppString* localeName, int32_t datetimeIndex);\n    };\n} // namespace Globalization\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/CompareInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <memory>\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"icalls/mscorlib/System.Globalization/CompareInfo.h\"\n#include \"icalls/mscorlib/System.Globalization/CompareOptions.h\"\n#include \"vm/String.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Array.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm-utils/VmStringUtils.h\"\n#include <cwctype>\n#include <wctype.h>\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Globalization\n{\n    void CompareInfo::free_internal_collator(mscorlib_System_Globalization_CompareInfo * thisPtr)\n    {\n        // This method does not need any implementation.\n    }\n\n    static int string_invariant_indexof(Il2CppString *source, int sindex, int count, Il2CppString *value, bool first)\n    {\n        int lencmpstr = il2cpp::utils::StringUtils::GetLength(value);\n        Il2CppChar* src = il2cpp::utils::StringUtils::GetChars(source);\n        Il2CppChar* cmpstr = il2cpp::utils::StringUtils::GetChars(value);\n\n        if (first)\n        {\n            count -= lencmpstr;\n            for (int pos = sindex; pos <= sindex + count; pos++)\n            {\n                for (int i = 0; src[pos + i] == cmpstr[i];)\n                {\n                    if (++i == lencmpstr)\n                        return (pos);\n                }\n            }\n\n            return (-1);\n        }\n        else\n        {\n            for (int pos = sindex - lencmpstr + 1; pos > sindex - count; pos--)\n            {\n                if (memcmp(src + pos, cmpstr, lencmpstr * sizeof(Il2CppChar)) == 0)\n                    return (pos);\n            }\n\n            return (-1);\n        }\n    }\n\n    int CompareInfo::internal_index(mscorlib_System_Globalization_CompareInfo *thisPtr, Il2CppString *source, int sindex, int count, Il2CppString *value, int options, bool first)\n    {\n        return (string_invariant_indexof(source, sindex, count, value, first));\n    }\n\n    static int string_invariant_compare_char(Il2CppChar c1, Il2CppChar c2, int options)\n    {\n        int result = 0;\n\n        // Ordinal can not be mixed with other options, and must return the difference, not only -1, 0, 1.\n        if (options & CompareOptions_Ordinal)\n            return (int)(c1 - c2);\n\n        if (options & CompareOptions_IgnoreCase)\n        {\n            result = towlower(c1) - towlower(c2);\n        }\n        else\n        {\n            /*\n             * No options. Kana, symbol and spacing options don't\n             * apply to the invariant culture.\n             */\n\n            /*\n             * FIXME: here we must use the information from c1type and c2type\n             * to find out the proper collation, even on the InvariantCulture, the\n             * sorting is not done by computing the unicode values, but their\n             * actual sort order.\n             */\n            result = (int)(c1 - c2);\n        }\n\n        return ((result < 0) ? -1 : (result > 0) ? 1 : 0);\n    }\n\n    static int string_invariant_compare(Il2CppString *str1, int off1, int len1, Il2CppString *str2, int off2, int len2, int options)\n    {\n        int length;\n        if (len1 >= len2)\n            length = len1;\n        else\n            length = len2;\n\n        Il2CppChar* ustr1 = il2cpp::utils::StringUtils::GetChars(str1) + off1;\n        Il2CppChar* ustr2 = il2cpp::utils::StringUtils::GetChars(str2) + off2;\n\n        int pos = 0;\n        for (pos = 0; pos != length; pos++)\n        {\n            if (pos >= len1 || pos >= len2)\n                break;\n\n            int charcmp = string_invariant_compare_char(ustr1[pos], ustr2[pos], options);\n            if (charcmp != 0)\n                return (charcmp);\n        }\n\n        // The lesser wins, so if we have looped until length we just need to check the last char.\n        if (pos == length)\n            return (string_invariant_compare_char(ustr1[pos - 1], ustr2[pos - 1], options));\n\n        // Test if one of the strings has been compared to the end.\n        if (pos >= len1)\n        {\n            if (pos >= len2)\n                return (0);\n            else\n                return (-1);\n        }\n        else if (pos >= len2)\n            return (1);\n\n        // If not, check our last char only.. (can this happen?)\n        return (string_invariant_compare_char(ustr1[pos], ustr2[pos], options));\n    }\n\n    int CompareInfo::internal_compare(mscorlib_System_Globalization_CompareInfo *thisPtr, Il2CppString *str1, int off1, int len1, Il2CppString *str2, int off2, int len2, int options)\n    {\n        //MONO_ARCH_SAVE_REGS;\n\n        // Do a normal ascii string compare, as we only know the invariant locale if we dont have ICU.\n        return (string_invariant_compare(str1, off1, len1, str2, off2, len2, options));\n    }\n\n    void CompareInfo::construct_compareinfo(mscorlib_System_Globalization_CompareInfo *, Il2CppString *)\n    {\n        // This method does not need any implementation.\n    }\n\n    static Il2CppArray* GetSortKeyCaseSensitive(Il2CppString* source)\n    {\n        const int32_t keyLength = sizeof(Il2CppChar) * source->length;\n        Il2CppArray* keyBytes = vm::Array::New(il2cpp_defaults.byte_class, keyLength);\n        memcpy(il2cpp_array_addr(keyBytes, uint8_t, 0), source->chars, keyLength);\n\n        return keyBytes;\n    }\n\n    static Il2CppArray* GetSortKeyIgnoreCase(Il2CppString* source)\n    {\n        const int32_t keyLength = sizeof(Il2CppChar) * source->length;\n        Il2CppArray* keyBytes = vm::Array::New(il2cpp_defaults.byte_class, keyLength);\n        Il2CppChar* destination = reinterpret_cast<Il2CppChar*>(il2cpp_array_addr(keyBytes, uint8_t, 0));\n\n        for (int i = 0; i < source->length; i++, destination++)\n        {\n            *destination = utils::VmStringUtils::Utf16ToLower(source->chars[i]);\n        }\n\n        return keyBytes;\n    }\n\n    void CompareInfo::assign_sortkey(void* /* System.Globalization.CompareInfo */ self, Il2CppSortKey* key, Il2CppString* source, CompareOptions options)\n    {\n        if ((options & CompareOptions_IgnoreCase) != 0 || (options & CompareOptions_OrdinalIgnoreCase) != 0)\n        {\n            key->key = GetSortKeyIgnoreCase(source);\n        }\n        else\n        {\n            key->key = GetSortKeyCaseSensitive(source);\n        }\n    }\n} /* namespace Globalization */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/CompareInfo.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"CompareOptions.h\"\n\nstruct Il2CppString;\nstruct Il2CppObject;\nstruct Il2CppSortKey;\nstruct mscorlib_System_Globalization_CompareInfo;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Globalization\n{\n    class LIBIL2CPP_CODEGEN_API CompareInfo\n    {\n    public:\n        static void assign_sortkey(void* /* System.Globalization.CompareInfo */ self, Il2CppSortKey* key, Il2CppString* source, CompareOptions options);\n        static void free_internal_collator(mscorlib_System_Globalization_CompareInfo * thisPtr);\n        static int internal_compare(mscorlib_System_Globalization_CompareInfo *, Il2CppString *, int, int, Il2CppString *, int, int, int);\n        static int internal_index(mscorlib_System_Globalization_CompareInfo *thisPtr, Il2CppString *source, int sindex, int count, Il2CppString *value, int options, bool first);\n        static void construct_compareinfo(mscorlib_System_Globalization_CompareInfo *, Il2CppString *);\n    };\n} /* namespace Globalization */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/CompareOptions.h",
    "content": "#pragma once\n\n#include <stdint.h>\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Globalization\n{\n// System.Globalization.CompareOptions\n    typedef enum\n    {\n        CompareOptions_None              = 0x00,\n        CompareOptions_IgnoreCase        = 0x01,\n        CompareOptions_IgnoreNonSpace    = 0x02,\n        CompareOptions_IgnoreSymbols     = 0x04,\n        CompareOptions_IgnoreKanaType    = 0x08,\n        CompareOptions_IgnoreWidth       = 0x10,\n        CompareOptions_StringSort        = 0x20000000,\n        CompareOptions_Ordinal           = 0x40000000,\n        CompareOptions_OrdinalIgnoreCase = 0x10000000\n    } CompareOptions;\n} /* namespace Globalization */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/CultureData.cpp",
    "content": "#ifdef NET_4_0\n#include \"il2cpp-config.h\"\n#include \"CultureData.h\"\n#include \"CultureInfoInternals.h\"\n#include \"CultureInfoTables.h\"\n#include \"il2cpp-api.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"vm/Array.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Globalization\n{\n    static Il2CppArray* create_names_array_idx(const uint16_t* names, int max)\n    {\n        if (names == NULL)\n            return NULL;\n\n        int len = 0;\n        for (int i = 0; i < max; i++)\n        {\n            if (names[i] == 0)\n                break;\n            len++;\n        }\n\n        Il2CppArray* ret = il2cpp_array_new_specific(il2cpp_array_class_get(il2cpp_defaults.string_class, 1), len);\n\n        for (int i = 0; i < len; i++)\n            il2cpp_array_setref(ret, i, il2cpp_string_new(idx2string(names[i])));\n\n        return ret;\n    }\n\n    static Il2CppArray* create_group_sizes_array(const int *gs, int ml)\n    {\n        int i, len = 0;\n\n        for (i = 0; i < ml; i++)\n        {\n            if (gs[i] == -1)\n                break;\n            len++;\n        }\n\n        Il2CppArray* ret = il2cpp_array_new_specific(il2cpp_array_class_get(il2cpp_defaults.int32_class, 1), len);\n\n        for (i = 0; i < len; i++)\n            il2cpp_array_set(ret, int32_t, i, gs[i]);\n\n        return ret;\n    }\n\n    void CultureData::fill_culture_data(Il2CppCultureData* _this, int32_t datetimeIndex)\n    {\n        const DateTimeFormatEntry *dfe;\n\n        IL2CPP_ASSERT(datetimeIndex >= 0);\n\n        dfe = &datetime_format_entries[datetimeIndex];\n        IL2CPP_OBJECT_SETREF(_this, AMDesignator, il2cpp_string_new(idx2string(dfe->am_designator)));\n        IL2CPP_OBJECT_SETREF(_this, PMDesignator, il2cpp_string_new(idx2string(dfe->pm_designator)));\n        IL2CPP_OBJECT_SETREF(_this, TimeSeparator, il2cpp_string_new(idx2string(dfe->time_separator)));\n        Il2CppArray *long_time_patterns = create_names_array_idx(dfe->long_time_patterns, NUM_LONG_TIME_PATTERNS);\n        IL2CPP_OBJECT_SETREF(_this, LongTimePatterns, long_time_patterns);\n        Il2CppArray *short_time_patterns = create_names_array_idx(dfe->short_time_patterns, NUM_SHORT_TIME_PATTERNS);\n        IL2CPP_OBJECT_SETREF(_this, ShortTimePatterns, short_time_patterns);\n        _this->FirstDayOfWeek = dfe->first_day_of_week;\n        _this->CalendarWeekRule = dfe->calendar_week_rule;\n    }\n\n    void CultureData::fill_number_data(Il2CppNumberFormatInfo* number, int32_t numberIndex)\n    {\n        const NumberFormatEntry *nfe;\n\n        IL2CPP_ASSERT(numberIndex >= 0);\n\n        nfe = &number_format_entries[numberIndex];\n\n        number->currencyDecimalDigits = nfe->currency_decimal_digits;\n        IL2CPP_OBJECT_SETREF(number, currencyDecimalSeparator, il2cpp_string_new(idx2string(nfe->currency_decimal_separator)));\n        IL2CPP_OBJECT_SETREF(number, currencyGroupSeparator, il2cpp_string_new(idx2string(nfe->currency_group_separator)));\n        Il2CppArray *currency_sizes_arr = create_group_sizes_array(nfe->currency_group_sizes, GROUP_SIZE);\n        IL2CPP_OBJECT_SETREF(number, currencyGroupSizes, currency_sizes_arr);\n        number->currencyNegativePattern = nfe->currency_negative_pattern;\n        number->currencyPositivePattern = nfe->currency_positive_pattern;\n        IL2CPP_OBJECT_SETREF(number, currencySymbol, il2cpp_string_new(idx2string(nfe->currency_symbol)));\n        IL2CPP_OBJECT_SETREF(number, naNSymbol, il2cpp_string_new(idx2string(nfe->nan_symbol)));\n        IL2CPP_OBJECT_SETREF(number, negativeInfinitySymbol, il2cpp_string_new(idx2string(nfe->negative_infinity_symbol)));\n        IL2CPP_OBJECT_SETREF(number, negativeSign, il2cpp_string_new(idx2string(nfe->negative_sign)));\n        number->numberDecimalDigits = nfe->number_decimal_digits;\n        IL2CPP_OBJECT_SETREF(number, numberDecimalSeparator, il2cpp_string_new(idx2string(nfe->number_decimal_separator)));\n        IL2CPP_OBJECT_SETREF(number, numberGroupSeparator, il2cpp_string_new(idx2string(nfe->number_group_separator)));\n        Il2CppArray *number_sizes_arr = create_group_sizes_array(nfe->number_group_sizes, GROUP_SIZE);\n        IL2CPP_OBJECT_SETREF(number, numberGroupSizes, number_sizes_arr);\n        number->numberNegativePattern = nfe->number_negative_pattern;\n        number->percentNegativePattern = nfe->percent_negative_pattern;\n        number->percentPositivePattern = nfe->percent_positive_pattern;\n        IL2CPP_OBJECT_SETREF(number, percentSymbol, il2cpp_string_new(idx2string(nfe->percent_symbol)));\n        IL2CPP_OBJECT_SETREF(number, perMilleSymbol, il2cpp_string_new(idx2string(nfe->per_mille_symbol)));\n        IL2CPP_OBJECT_SETREF(number, positiveInfinitySymbol, il2cpp_string_new(idx2string(nfe->positive_infinity_symbol)));\n        IL2CPP_OBJECT_SETREF(number, positiveSign, il2cpp_string_new(idx2string(nfe->positive_sign)));\n    }\n} // namespace Globalization\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/CultureData.h",
    "content": "#pragma once\n\n#if NET_4_0\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Globalization\n{\n    class LIBIL2CPP_CODEGEN_API CultureData\n    {\n    public:\n        static void fill_culture_data(Il2CppCultureData* _this, int32_t datetimeIndex);\n        static void fill_number_data(Il2CppNumberFormatInfo* number, int32_t numberIndex);\n    };\n} // namespace Globalization\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/CultureInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <string>\n#include <algorithm>\n#include \"il2cpp-api.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Array.h\"\n#include \"vm/Exception.h\"\n#include \"vm/String.h\"\n#include \"os/Locale.h\"\n#include \"icalls/mscorlib/System.Globalization/CultureInfo.h\"\n#include \"CultureInfoInternals.h\"\n#include \"CultureInfoTables.h\"\n\n\n/*\n* The following methods is modified from the ICU source code. (http://oss.software.ibm.com/icu)\n* Copyright (c) 1995-2003 International Business Machines Corporation and others\n* All rights reserved.\n*/\nstatic std::string get_current_locale_name(void)\n{\n\tchar* locale;\n\tchar* corrected = NULL;\n\tconst char* p;\n\n\tstd::string locale_str = il2cpp::os::Locale::GetLocale();\n\n\tif (locale_str.empty())\n\t\treturn std::string();\n\n\tlocale = il2cpp::utils::StringUtils::StringDuplicate(locale_str.c_str());\n\n\tif ((p = strchr(locale, '.')) != NULL) {\n\t\t/* assume new locale can't be larger than old one? */\n\t\tcorrected = (char*)IL2CPP_MALLOC(strlen(locale));\n\t\tstrncpy(corrected, locale, p - locale);\n\t\tcorrected[p - locale] = 0;\n\n\t\t/* do not copy after the @ */\n\t\tif ((p = strchr(corrected, '@')) != NULL)\n\t\t\tcorrected[p - corrected] = 0;\n\t}\n\n\t/* Note that we scan the *uncorrected* ID. */\n\tif ((p = strrchr(locale, '@')) != NULL) {\n\n\t\t/*\n\t\t* Mono we doesn't handle the '@' modifier because it does\n\t\t* not have any cultures that use it. Just trim it\n\t\t* off of the end of the name.\n\t\t*/\n\n\t\tif (corrected == NULL) {\n\t\t\tcorrected = (char*)IL2CPP_MALLOC(strlen(locale));\n\t\t\tstrncpy(corrected, locale, p - locale);\n\t\t\tcorrected[p - locale] = 0;\n\t\t}\n\t}\n\n\tif (corrected == NULL)\n\t\tcorrected = locale;\n\telse\n\t\tIL2CPP_FREE(locale);\n\n\tchar* c;\n\tif ((c = strchr(corrected, '_')) != NULL)\n\t\t*c = '-';\n\n\tstd::string result(corrected);\n\tIL2CPP_FREE(corrected);\n\n\tstd::transform(result.begin(), result.end(), result.begin(), ::tolower);\n\n\treturn result;\n}\n\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Globalization\n{\n\nstatic Il2CppArray* create_names_array_idx(const uint16_t* names, int max)\n{\n\tif (names == NULL)\n\t\treturn NULL;\n\n\tint len = 0;\n\tfor (int i = 0; i < max; i++)\n\t{\n\t\tif (names[i] == 0)\n\t\t\tbreak;\n\t\tlen++;\n\t}\n\n\tIl2CppArray* ret = il2cpp_array_new_specific(il2cpp_array_class_get(il2cpp_defaults.string_class, 1), len);\n\n\tfor (int i = 0; i < len; i++)\n\t\til2cpp_array_setref(ret, i, il2cpp_string_new(idx2string(names[i])));\n\n\treturn ret;\n}\n\nstatic bool construct_culture(Il2CppCultureInfo* cultureInfo, const CultureInfoEntry *ci)\n{\n\tcultureInfo->lcid = ci->lcid;\n\tIL2CPP_OBJECT_SETREF(cultureInfo, name, il2cpp_string_new(idx2string(ci->name)));\n#if !NET_4_0\n\tIL2CPP_OBJECT_SETREF(cultureInfo, icu_name, il2cpp_string_new(idx2string(ci->icu_name)));\n\tIL2CPP_OBJECT_SETREF(cultureInfo, displayname, il2cpp_string_new(idx2string(ci->displayname)));\n#endif\n\tIL2CPP_OBJECT_SETREF(cultureInfo, englishname, il2cpp_string_new(idx2string(ci->englishname)));\n\tIL2CPP_OBJECT_SETREF(cultureInfo, nativename, il2cpp_string_new(idx2string(ci->nativename)));\n\tIL2CPP_OBJECT_SETREF(cultureInfo, win3lang, il2cpp_string_new(idx2string(ci->win3lang)));\n\tIL2CPP_OBJECT_SETREF(cultureInfo, iso3lang, il2cpp_string_new(idx2string(ci->iso3lang)));\n\tIL2CPP_OBJECT_SETREF(cultureInfo, iso2lang, il2cpp_string_new(idx2string(ci->iso2lang)));\n\n#if !NET_4_0\n\tIL2CPP_OBJECT_SETREF(cultureInfo, territory, il2cpp_string_new(idx2string(ci->territory)));\n#else\n\t// It's null for neutral cultures\n\tif(ci->territory > 0)\n\t\tIL2CPP_OBJECT_SETREF(cultureInfo, territory, il2cpp_string_new(idx2string(ci->territory)));\n#endif\n\tcultureInfo->parent_lcid = ci->parent_lcid;\n#if !NET_4_0\n\tcultureInfo->specific_lcid = ci->specific_lcid;\n\tcultureInfo->calendar_data = ci->calendar_data;\n#endif\n\tcultureInfo->datetime_index = ci->datetime_format_index;\n\tcultureInfo->number_index = ci->number_format_index;\n\tcultureInfo->text_info_data = &ci->text_info;\n\n#if NET_4_0\n\tIL2CPP_OBJECT_SETREF(cultureInfo, native_calendar_names, create_names_array_idx(ci->native_calendar_names, NUM_OPT_CALS));\n\tcultureInfo->default_calendar_type = ci->calendar_type;\n#endif\n\n\treturn true;\n}\n\nstatic int culture_name_locator(const void *a, const void *b)\n{\n\tconst char* aa = (const char*)a;\n\tconst CultureInfoNameEntry* bb = (const CultureInfoNameEntry*)b;\n\tint ret;\n\n\tret = strcmp(aa, idx2string(bb->name));\n\n\treturn ret;\n}\n\nstatic int culture_lcid_locator(const void *a, const void *b)\n{\n\tconst CultureInfoEntry *aa = (const CultureInfoEntry *)a;\n\tconst CultureInfoEntry *bb = (const CultureInfoEntry *)b;\n\n\treturn (aa->lcid - bb->lcid);\n}\n\nstatic const CultureInfoEntry* culture_info_entry_from_lcid(int lcid)\n{\n\tCultureInfoEntry key;\n\tkey.lcid = lcid;\n\treturn (const CultureInfoEntry*)bsearch(&key, culture_entries, NUM_CULTURE_ENTRIES, sizeof(CultureInfoEntry), culture_lcid_locator);\n}\n\n#if !NET_4_0\nstatic bool construct_culture_from_specific_name(Il2CppCultureInfo* cultureInfo, const char *name)\n{\n\tconst CultureInfoNameEntry* ne = (const CultureInfoNameEntry *)bsearch(name, culture_name_entries, NUM_CULTURE_ENTRIES, sizeof(CultureInfoNameEntry), culture_name_locator);\n\n\tif (ne == NULL)\n\t\treturn false;\n\n\tconst CultureInfoEntry* entry = &culture_entries[ne->culture_entry_index];\n\n\t/* try avoiding another lookup, often the culture is its own specific culture */\n\tif (entry->lcid != entry->specific_lcid)\n\t\tentry = culture_info_entry_from_lcid(entry->specific_lcid);\n\n\tif (entry)\n\t\treturn construct_culture(cultureInfo, entry);\n\telse\n\t\treturn false;\n}\n#endif\n\nstatic Il2CppArray* create_group_sizes_array(const int *gs, int ml)\n{\n\tint i, len = 0;\n\n\tfor (i = 0; i < ml; i++) {\n\t\tif (gs[i] == -1)\n\t\t\tbreak;\n\t\tlen++;\n\t}\n\n\tIl2CppArray* ret = il2cpp_array_new_specific(il2cpp_array_class_get(il2cpp_defaults.int32_class, 1), len);\n\n\tfor (i = 0; i < len; i++)\n\t\til2cpp_array_set(ret, int32_t, i, gs[i]);\n\n\treturn ret;\n}\n\n#if !NET_4_0\nvoid CultureInfo::construct_datetime_format(Il2CppCultureInfo* cultureInfo)\n{\n\tIL2CPP_ASSERT(cultureInfo->datetime_index >= 0);\n\n\tIl2CppDateTimeFormatInfo* datetime = cultureInfo->datetime_format;\n\tconst DateTimeFormatEntry* dfe = &datetime_format_entries[cultureInfo->datetime_index];\n\n\tdatetime->readOnly = cultureInfo->is_read_only;\n\tIL2CPP_OBJECT_SETREF(datetime, AbbreviatedDayNames, create_names_array_idx(dfe->abbreviated_day_names, NUM_DAYS));\n\tIL2CPP_OBJECT_SETREF(datetime, AbbreviatedMonthNames, create_names_array_idx(dfe->abbreviated_month_names, NUM_MONTHS));\n\tIL2CPP_OBJECT_SETREF(datetime, AMDesignator, il2cpp_string_new(idx2string(dfe->am_designator)));\n\tdatetime->CalendarWeekRule = dfe->calendar_week_rule;\n\tIL2CPP_OBJECT_SETREF(datetime, DateSeparator, il2cpp_string_new(idx2string(dfe->date_separator)));\n\tIL2CPP_OBJECT_SETREF(datetime, DayNames, create_names_array_idx(dfe->day_names, NUM_DAYS));\n\tdatetime->FirstDayOfWeek = dfe->first_day_of_week;\n\tIL2CPP_OBJECT_SETREF(datetime, FullDateTimePattern, il2cpp_string_new(idx2string(dfe->full_date_time_pattern)));\n\tIL2CPP_OBJECT_SETREF(datetime, LongDatePattern, il2cpp_string_new(idx2string(dfe->long_date_pattern)));\n\tIL2CPP_OBJECT_SETREF(datetime, LongTimePattern, il2cpp_string_new(idx2string(dfe->long_time_pattern)));\n\tIL2CPP_OBJECT_SETREF(datetime, MonthDayPattern, il2cpp_string_new(idx2string(dfe->month_day_pattern)));\n\tIL2CPP_OBJECT_SETREF(datetime, MonthNames, create_names_array_idx(dfe->month_names, NUM_MONTHS));\n\tIL2CPP_OBJECT_SETREF(datetime, PMDesignator, il2cpp_string_new(idx2string(dfe->pm_designator)));\n\tIL2CPP_OBJECT_SETREF(datetime, ShortDatePattern, il2cpp_string_new(idx2string(dfe->short_date_pattern)));\n\tIL2CPP_OBJECT_SETREF(datetime, ShortTimePattern, il2cpp_string_new(idx2string(dfe->short_time_pattern)));\n\tIL2CPP_OBJECT_SETREF(datetime, TimeSeparator, il2cpp_string_new(idx2string(dfe->time_separator)));\n\tIL2CPP_OBJECT_SETREF(datetime, YearMonthPattern, il2cpp_string_new(idx2string(dfe->year_month_pattern)));\n\tIL2CPP_OBJECT_SETREF(datetime, ShortDatePatterns, create_names_array_idx(dfe->short_date_patterns, NUM_SHORT_DATE_PATTERNS));\n\tIL2CPP_OBJECT_SETREF(datetime, LongDatePatterns, create_names_array_idx(dfe->long_date_patterns, NUM_LONG_DATE_PATTERNS));\n\tIL2CPP_OBJECT_SETREF(datetime, ShortTimePatterns, create_names_array_idx(dfe->short_time_patterns, NUM_SHORT_TIME_PATTERNS));\n\tIL2CPP_OBJECT_SETREF(datetime, LongTimePatterns, create_names_array_idx(dfe->long_time_patterns, NUM_LONG_TIME_PATTERNS));\n}\n\nbool CultureInfo::construct_internal_locale_from_current_locale(Il2CppCultureInfo* cultureInfo)\n{\n\tstd::string locale = ::get_current_locale_name();\n\tif (locale.empty())\n\t\treturn false;\n\n\tbool status = construct_culture_from_specific_name(cultureInfo, locale.c_str());\n\tcultureInfo->is_read_only = true;\n\tcultureInfo->use_user_override = true;\n\n\treturn status;\n}\n#endif\n\nbool CultureInfo::construct_internal_locale_from_lcid(Il2CppCultureInfo* cultureInfo, int lcid)\n{\n\tconst CultureInfoEntry* ci = culture_info_entry_from_lcid(lcid);\n\tif (ci == NULL)\n\t\treturn false;\n\n\treturn construct_culture(cultureInfo, ci);\n}\n\nbool CultureInfo::construct_internal_locale_from_name(Il2CppCultureInfo* cultureInfo, Il2CppString* name)\n{\n\tstd::string cultureName = il2cpp::utils::StringUtils::Utf16ToUtf8(name->chars);\n\tconst CultureInfoNameEntry* ne = (const CultureInfoNameEntry*)bsearch(cultureName.c_str(), culture_name_entries, NUM_CULTURE_ENTRIES, sizeof(CultureInfoNameEntry), culture_name_locator);\n\n\tif (ne == NULL)\n\t\treturn false;\n\n\treturn construct_culture(cultureInfo, &culture_entries[ne->culture_entry_index]);\n}\n\n#if !NET_4_0\nvoid CultureInfo::construct_number_format(Il2CppCultureInfo* cultureInfo)\n{\n\tIL2CPP_ASSERT(cultureInfo->number_format != 0);\n\n\tif (cultureInfo->number_index < 0)\n\t\treturn;\n\n\tIl2CppNumberFormatInfo* number = cultureInfo->number_format;\n\tconst NumberFormatEntry* nfe = &number_format_entries[cultureInfo->number_index];\n\n\tnumber->readOnly = cultureInfo->is_read_only;\n\tnumber->currencyDecimalDigits = nfe->currency_decimal_digits;\n\tIL2CPP_OBJECT_SETREF(number, currencyDecimalSeparator, il2cpp_string_new(idx2string(nfe->currency_decimal_separator)));\n\tIL2CPP_OBJECT_SETREF(number, currencyGroupSeparator, il2cpp_string_new(idx2string(nfe->currency_group_separator)));\n\tIL2CPP_OBJECT_SETREF(number, currencyGroupSizes, create_group_sizes_array(nfe->currency_group_sizes, GROUP_SIZE));\n\tnumber->currencyNegativePattern = nfe->currency_negative_pattern;\n\tnumber->currencyPositivePattern = nfe->currency_positive_pattern;\n\tIL2CPP_OBJECT_SETREF(number, currencySymbol, il2cpp_string_new(idx2string(nfe->currency_symbol)));\n\tIL2CPP_OBJECT_SETREF(number, naNSymbol, il2cpp_string_new(idx2string(nfe->nan_symbol)));\n\tIL2CPP_OBJECT_SETREF(number, negativeInfinitySymbol, il2cpp_string_new(idx2string(nfe->negative_infinity_symbol)));\n\tIL2CPP_OBJECT_SETREF(number, negativeSign, il2cpp_string_new(idx2string(nfe->negative_sign)));\n\tnumber->numberDecimalDigits = nfe->number_decimal_digits;\n\tIL2CPP_OBJECT_SETREF(number, numberDecimalSeparator, il2cpp_string_new(idx2string(nfe->number_decimal_separator)));\n\tIL2CPP_OBJECT_SETREF(number, numberGroupSeparator, il2cpp_string_new(idx2string(nfe->number_group_separator)));\n\tIL2CPP_OBJECT_SETREF(number, numberGroupSizes, create_group_sizes_array(nfe->number_group_sizes, GROUP_SIZE));\n\tnumber->numberNegativePattern = nfe->number_negative_pattern;\n\tnumber->percentDecimalDigits = nfe->percent_decimal_digits;\n\tIL2CPP_OBJECT_SETREF(number, percentDecimalSeparator, il2cpp_string_new(idx2string(nfe->percent_decimal_separator)));\n\tIL2CPP_OBJECT_SETREF(number, percentGroupSeparator, il2cpp_string_new(idx2string(nfe->percent_group_separator)));\n\tIL2CPP_OBJECT_SETREF(number, percentGroupSizes, create_group_sizes_array(nfe->percent_group_sizes, GROUP_SIZE));\n\tnumber->percentNegativePattern = nfe->percent_negative_pattern;\n\tnumber->percentPositivePattern = nfe->percent_positive_pattern;\n\tIL2CPP_OBJECT_SETREF(number, percentSymbol, il2cpp_string_new(idx2string(nfe->percent_symbol)));\n\tIL2CPP_OBJECT_SETREF(number, perMilleSymbol, il2cpp_string_new(idx2string(nfe->per_mille_symbol)));\n\tIL2CPP_OBJECT_SETREF(number, positiveInfinitySymbol, il2cpp_string_new(idx2string(nfe->positive_infinity_symbol)));\n\tIL2CPP_OBJECT_SETREF(number, positiveSign, il2cpp_string_new(idx2string(nfe->positive_sign)));\n}\n\nbool CultureInfo::construct_internal_locale_from_specific_name (Il2CppCultureInfo* cultureInfo, Il2CppString* name)\n{\n\tstd::string cultureName = il2cpp::utils::StringUtils::Utf16ToUtf8 (name->chars);\n\treturn construct_culture_from_specific_name (cultureInfo, cultureName.c_str());\n}\n#endif\n\nstatic bool IsMatchingCultureInfoEntry (const CultureInfoEntry& entry, bool neutral, bool specific, bool installed)\n{\n#if !NET_4_0\n\tconst bool isNeutral = ((entry.lcid & 0xff00) == 0) || (entry.specific_lcid == 0);\n#else\n\tconst bool isNeutral = entry.territory == 0;\n#endif\n\treturn ((neutral && isNeutral) || (specific && !isNeutral));\n}\n\nIl2CppArray* CultureInfo::internal_get_cultures (bool neutral, bool specific, bool installed)\n{\n\t// Count culture infos that match.\n\tint numMatchingCultures = 0;\n\tfor (int i = 0; i < NUM_CULTURE_ENTRIES; ++i)\n\t{\n\t\tconst CultureInfoEntry& entry = culture_entries[i];\n\t\tif (IsMatchingCultureInfoEntry (entry, neutral, specific, installed))\n\t\t\t++numMatchingCultures;\n\t}\n\n\tif (neutral)\n\t\t++numMatchingCultures;\n\n\t// Allocate result array.\n\tIl2CppClass* cultureInfoClass = il2cpp_defaults.culture_info;\n\tIl2CppArray* array = il2cpp_array_new (cultureInfoClass, numMatchingCultures);\n\n\tint index = 0;\n\n\t// InvariantCulture is not in culture table. We reserve the first\n\t// array element for it.\n\tif (neutral)\n\t\til2cpp_array_set (array, Il2CppCultureInfo*, index++, NULL);\n\n\t// Populate CultureInfo entries.\n\tfor (int i = 0; i < NUM_CULTURE_ENTRIES; ++i)\n\t{\n\t\tconst CultureInfoEntry& entry = culture_entries[i];\n\t\tif (!IsMatchingCultureInfoEntry (entry, neutral, specific, installed))\n\t\t\tcontinue;\n\n\t\tIl2CppCultureInfo* info = reinterpret_cast<Il2CppCultureInfo*> (il2cpp_object_new (cultureInfoClass));\n\t\tconstruct_culture (info, &entry);\n\n\t\til2cpp_array_set (array, Il2CppCultureInfo*, index++, info);\n\t}\n\t\n\treturn array;\n}\n\nbool CultureInfo::internal_is_lcid_neutral (int32_t lcid, bool* is_neutral)\n{\n\tNOT_SUPPORTED_IL2CPP (CultureInfo::internal_is_lcid_neutral, \"This icall is not supported by il2cpp.\");\n\t\n\treturn false;\n}\n\nIl2CppString* CultureInfo::get_current_locale_name()\n{\n\treturn vm::String::New(::get_current_locale_name().c_str());\n}\n\n} /* namespace Globalization */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/CultureInfo.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\nstruct Il2CppCultureInfo;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Globalization\n{\n    class LIBIL2CPP_CODEGEN_API CultureInfo\n    {\n    public:\n#if !NET_4_0\n        static void construct_datetime_format(Il2CppCultureInfo* cultureInfo);\n        static bool construct_internal_locale_from_current_locale(Il2CppCultureInfo* cultureInfo);\n#endif\n        static bool construct_internal_locale_from_lcid(Il2CppCultureInfo* cultureInfo, int lcid);\n        static bool construct_internal_locale_from_name(Il2CppCultureInfo* cultureInfo, Il2CppString* name);\n#if !NET_4_0\n        static bool construct_internal_locale_from_specific_name(Il2CppCultureInfo* cultureInfo, Il2CppString* name);\n#endif\n        static Il2CppArray* internal_get_cultures(bool neutral, bool specific, bool installed);\n        static bool internal_is_lcid_neutral(int32_t lcid, bool* is_neutral);\n#if !NET_4_0\n        static void construct_number_format(Il2CppCultureInfo* cultureInfo);\n#endif\n        static Il2CppString* get_current_locale_name();\n    };\n} /* namespace Diagnostics */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/CultureInfoInternals.h",
    "content": "#pragma once\n\n#include <stdint.h>\n\n#if !NET_4_0\n#define NUM_DAYS 7\n#define NUM_MONTHS 13\n#define GROUP_SIZE 5\n#define NUM_OPT_CALS 5\n\n#define NUM_SHORT_DATE_PATTERNS 14\n#define NUM_LONG_DATE_PATTERNS 8\n#define NUM_SHORT_TIME_PATTERNS 11\n#define NUM_LONG_TIME_PATTERNS 10\n\n#else\n\n#define NUM_DAYS 7\n#define NUM_MONTHS 13\n#define GROUP_SIZE 2\n#define NUM_OPT_CALS 4\n\n#define NUM_SHORT_DATE_PATTERNS 14\n#define NUM_LONG_DATE_PATTERNS 10\n#define NUM_SHORT_TIME_PATTERNS 12\n#define NUM_LONG_TIME_PATTERNS 9\n#define NUM_YEAR_MONTH_PATTERNS 8\n\n#endif\n\n#define idx2string(idx) (locale_strings + (idx))\n\n#if !NET_4_0\nstruct DateTimeFormatEntry\n{\n    const uint16_t full_date_time_pattern;\n    const uint16_t long_date_pattern;\n    const uint16_t short_date_pattern;\n    const uint16_t long_time_pattern;\n    const uint16_t short_time_pattern;\n    const uint16_t year_month_pattern;\n    const uint16_t month_day_pattern;\n\n    const uint16_t am_designator;\n    const uint16_t pm_designator;\n\n    const uint16_t day_names[NUM_DAYS];\n    const uint16_t abbreviated_day_names[NUM_DAYS];\n    const uint16_t month_names[NUM_MONTHS];\n    const uint16_t abbreviated_month_names[NUM_MONTHS];\n\n    int8_t calendar_week_rule;\n    int8_t first_day_of_week;\n\n    const uint16_t date_separator;\n    const uint16_t time_separator;\n\n    const uint16_t short_date_patterns[NUM_SHORT_DATE_PATTERNS];\n    const uint16_t long_date_patterns[NUM_LONG_DATE_PATTERNS];\n    const uint16_t short_time_patterns[NUM_SHORT_TIME_PATTERNS];\n    const uint16_t long_time_patterns[NUM_LONG_TIME_PATTERNS];\n};\n#else\nstruct DateTimeFormatEntry\n{\n    const uint16_t month_day_pattern;\n    const uint16_t am_designator;\n    const uint16_t pm_designator;\n\n    const uint16_t day_names[NUM_DAYS];\n    const uint16_t abbreviated_day_names[NUM_DAYS];\n    const uint16_t shortest_day_names[NUM_DAYS];\n    const uint16_t month_names[NUM_MONTHS];\n    const uint16_t month_genitive_names[NUM_MONTHS];\n    const uint16_t abbreviated_month_names[NUM_MONTHS];\n    const uint16_t abbreviated_month_genitive_names[NUM_MONTHS];\n\n    const int8_t calendar_week_rule;\n    const int8_t first_day_of_week;\n\n    const uint16_t date_separator;\n    const uint16_t time_separator;\n\n    const uint16_t short_date_patterns[NUM_SHORT_DATE_PATTERNS];\n    const uint16_t long_date_patterns[NUM_LONG_DATE_PATTERNS];\n    const uint16_t short_time_patterns[NUM_SHORT_TIME_PATTERNS];\n    const uint16_t long_time_patterns[NUM_LONG_TIME_PATTERNS];\n    const uint16_t year_month_patterns[NUM_YEAR_MONTH_PATTERNS];\n};\n#endif\n\nstruct NumberFormatEntry\n{\n    const uint16_t currency_decimal_separator;\n    const uint16_t currency_group_separator;\n#if !NET_4_0\n    const uint16_t percent_decimal_separator;\n    const uint16_t percent_group_separator;\n#endif\n    const uint16_t number_decimal_separator;\n    const uint16_t number_group_separator;\n\n    const uint16_t currency_symbol;\n    const uint16_t percent_symbol;\n    const uint16_t nan_symbol;\n    const uint16_t per_mille_symbol;\n    const uint16_t negative_infinity_symbol;\n    const uint16_t positive_infinity_symbol;\n\n    const uint16_t negative_sign;\n    const uint16_t positive_sign;\n\n    int8_t currency_negative_pattern;\n    int8_t currency_positive_pattern;\n    int8_t percent_negative_pattern;\n    int8_t percent_positive_pattern;\n    int8_t number_negative_pattern;\n\n    int8_t currency_decimal_digits;\n#if !NET_4_0\n    int8_t percent_decimal_digits;\n#endif\n    int8_t number_decimal_digits;\n\n    const int currency_group_sizes[GROUP_SIZE];\n#if !NET_4_0\n    const int percent_group_sizes[GROUP_SIZE];\n#endif\n    const int number_group_sizes[GROUP_SIZE];\n};\n\nstruct TextInfoEntry\n{\n    /*const*/ int ansi;\n    /*const*/ int ebcdic;\n    /*const*/ int mac;\n    /*const*/ int oem;\n#if NET_4_0\n    /*const*/ bool is_right_to_left;\n#endif\n    /*const*/ char list_sep;\n};\n\n\n#if !NET_4_0\n\nstruct CultureInfoEntry\n{\n    int16_t lcid;\n    int16_t parent_lcid;\n    int16_t specific_lcid;\n    int16_t region_entry_index;\n    /*const*/ uint16_t name;\n    /*const*/ uint16_t icu_name;\n    /*const*/ uint16_t englishname;\n    /*const*/ uint16_t displayname;\n    /*const*/ uint16_t nativename;\n    /*const*/ uint16_t win3lang;\n    /*const*/ uint16_t iso3lang;\n    /*const*/ uint16_t iso2lang;\n    /*const*/ uint16_t territory;\n\n    int calendar_data[NUM_OPT_CALS];\n\n    int16_t datetime_format_index;\n    int16_t number_format_index;\n\n    TextInfoEntry text_info;\n};\n\n#else\n\nstruct CultureInfoEntry\n{\n    int16_t lcid;\n    int16_t parent_lcid;\n    int16_t calendar_type;\n    int16_t region_entry_index;\n    /*const*/ uint16_t name;\n    /*const*/ uint16_t englishname;\n    /*const*/ uint16_t nativename;\n    /*const*/ uint16_t win3lang;\n    /*const*/ uint16_t iso3lang;\n    /*const*/ uint16_t iso2lang;\n    /*const*/ uint16_t territory;\n    /*const*/ uint16_t native_calendar_names[NUM_OPT_CALS];\n\n    int16_t datetime_format_index;\n    int16_t number_format_index;\n\n    TextInfoEntry text_info;\n};\n\n#endif\n\nstruct CultureInfoNameEntry\n{\n    const uint16_t name;\n    int16_t culture_entry_index;\n};\n\n#if !NET_4_0\nstruct RegionInfoEntry\n{\n    int16_t lcid;\n    int16_t region_id;\n    const uint16_t iso2name;\n    const uint16_t iso3name;\n    const uint16_t win3name;\n    const uint16_t english_name;\n    const uint16_t currency_symbol;\n    const uint16_t iso_currency_symbol;\n    const uint16_t currency_english_name;\n};\n#else\nstruct RegionInfoEntry\n{\n    const int16_t geo_id;\n    const uint16_t iso2name;\n    const uint16_t iso3name;\n    const uint16_t win3name;\n    const uint16_t english_name;\n    const uint16_t native_name;\n    const uint16_t currency_symbol;\n    const uint16_t iso_currency_symbol;\n    const uint16_t currency_english_name;\n    const uint16_t currency_native_name;\n};\n#endif\n\nstruct RegionInfoNameEntry\n{\n    const uint16_t name;\n    int16_t region_entry_index;\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/CultureInfoTables.h",
    "content": "#pragma once\n\n#include \"CultureInfoInternals.h\"\n\n/* This is a generated file. Do not edit. See tools/locale-builder. */\n#ifndef MONO_METADATA_CULTURE_INFO_TABLES\n#define MONO_METADATA_CULTURE_INFO_TABLES 1\n\n#if !NET_4_0\n#define NUM_CULTURE_ENTRIES 167\n#define NUM_REGION_ENTRIES 230\n#else\n#define NUM_CULTURE_ENTRIES 281\n#define NUM_REGION_ENTRIES 117\n#endif\n\n#if !NET_4_0\nstatic const DateTimeFormatEntry datetime_format_entries[] =\n{\n    { 1, 24, 37, 46, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 184, 187, 190, 193, 196, 199, 202 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37 }, { 357, 24 }, { 370, 56 }, { 376, 46 } },\n    { 387, 409, 422, 438, 370, 447, 457, 465, 468, { 471, 484, 505, 520, 531, 550, 561 }, { 574, 582, 590, 596, 602, 612, 620 }, { 628, 641, 658, 667, 678, 685, 692, 699, 712, 731, 748, 763, 343 }, { 780, 786, 658, 794, 678, 685, 692, 802, 810, 818, 826, 836, 343 }, 0, 1, 344, 346, { 348, 844, 422 }, { 357, 409 }, { 370 }, { 376, 438 } },\n    { 853, 876, 888, 376, 370, 447, 457, 465, 468, { 897, 906, 914, 922, 931, 938, 948 }, { 957, 961, 965, 969, 973, 977, 981 }, { 985, 991, 998, 1004, 1010, 1015, 1020, 1027, 1033, 1042, 1050, 1059, 343 }, { 1068, 1073, 998, 1078, 1010, 1015, 1083, 1088, 1092, 1097, 1102, 1107, 343 }, 0, 0, 344, 346, { 348, 888 }, { 357, 876 }, { 370 }, { 376 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 1154, 1161, { 1168, 1178, 1188, 1198, 1208, 1218, 1228 }, { 1238, 1242, 1246, 1250, 1254, 1258, 1262 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 1356, 1379, 1392, 1399, 1409, 447, 1414, 1422, 1427, { 1432, 1440, 1450, 1458, 1466, 1475, 1482 }, { 1489, 1492, 1495, 1499, 1502, 1506, 1510 }, { 1513, 1519, 1525, 1533, 1539, 1547, 1555, 1565, 1571, 1579, 1587, 1596, 343 }, { 1605, 1607, 1610, 1614, 1617, 1619, 1622, 1626, 1631, 1634, 1636, 1639, 343 }, 0, 1, 344, 346, { 348, 1392 }, { 357, 1379 }, { 370, 1409 }, { 376, 1399 } },\n    { 1643, 1664, 1676, 438, 370, 447, 1687, 465, 468, { 1696, 1704, 1711, 1719, 1726, 1734, 1741 }, { 1749, 1754, 1758, 1762, 1766, 1770, 1774 }, { 1779, 1786, 1794, 1800, 1806, 1810, 1815, 1820, 1827, 1837, 1845, 1854, 343 }, { 1863, 1867, 1871, 1875, 1806, 1879, 1883, 1887, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 1907, 1676 }, { 357, 1664 }, { 370 }, { 376, 438 } },\n    { 1916, 1379, 1938, 438, 370, 447, 1414, 1949, 1955, { 1962, 1970, 1977, 1986, 1995, 2006, 2014 }, { 2022, 2025, 2028, 2031, 2034, 2037, 2040 }, { 2043, 2050, 2058, 2064, 2070, 2074, 2079, 2084, 2091, 2101, 2109, 2118, 343 }, { 2127, 2131, 2135, 2139, 2070, 2143, 2147, 2151, 2155, 2159, 2163, 2167, 343 }, 0, 1, 344, 346, { 348, 844, 1938 }, { 357, 1379 }, { 370 }, { 376, 438 } },\n    { 2171, 409, 37, 2195, 56, 447, 457, 2206, 2211, { 2216, 2231, 2246, 2257, 2272, 2285, 2304 }, { 2319, 2326, 2333, 2340, 2347, 2354, 2361 }, { 2368, 2389, 2412, 2427, 2444, 2455, 2470, 2485, 2504, 2527, 2546, 2565, 343 }, { 2586, 2593, 2600, 2607, 2614, 2621, 2630, 2639, 2646, 2653, 2660, 2667, 343 }, 0, 1, 344, 346, { 348, 2674, 37 }, { 357, 409 }, { 370, 56 }, { 376, 2685, 2195 } },\n    { 2697, 2728, 2748, 2195, 2755, 447, 2763, 465, 468, { 2770, 2777, 2784, 2792, 2802, 2811, 2818 }, { 2827, 2831, 2835, 2839, 2843, 2847, 2851 }, { 2855, 2863, 2872, 2064, 2878, 2882, 2887, 2084, 2091, 2892, 2109, 2900, 343 }, { 2127, 2131, 2909, 2139, 2878, 2143, 2147, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 0, 344, 346, { 348, 2748 }, { 2728, 2728, 2921, 2935, 2955 }, { 2755, 2755, 2970, 1409, 370 }, { 2195, 2195, 2979, 2991, 438 } },\n    { 2999, 3033, 3055, 2979, 370, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055 }, { 357, 3033 }, { 370 }, { 376, 2979 } },\n    { 3281, 3306, 3323, 2991, 370, 3332, 3345, 465, 468, { 3357, 3367, 3377, 3385, 3397, 3405, 3415 }, { 3424, 3427, 3430, 3433, 3436, 3439, 3442 }, { 3445, 3454, 3463, 3473, 3482, 3491, 3500, 3510, 3517, 3525, 3533, 3543, 343 }, { 3552, 3558, 3564, 3571, 3577, 3583, 3589, 3596, 3600, 3605, 3610, 3617, 343 }, 0, 1, 344, 346, { 348, 3323 }, { 357, 3306 }, { 370 }, { 376, 2991 } },\n    { 3623, 3649, 888, 438, 370, 447, 74, 465, 468, { 3666, 3675, 3681, 3687, 3696, 3702, 3711 }, { 3718, 3723, 3728, 3733, 3738, 3743, 3748 }, { 3753, 3761, 3770, 3775, 3781, 3785, 3790, 3798, 3804, 3814, 1050, 3822, 343 }, { 3832, 3838, 3770, 3845, 3781, 3785, 3850, 3798, 3856, 1097, 1102, 3862, 343 }, 0, 0, 344, 346, { 888, 3868, 3273 }, { 357, 876, 3649 }, { 370 }, { 376, 438 } },\n    { 3878, 876, 2674, 438, 370, 447, 74, 465, 468, { 3899, 3917, 3931, 3949, 3967, 3985, 4001 }, { 4008, 4011, 4014, 4017, 4020, 4023, 4026 }, { 4029, 4040, 4053, 4060, 4071, 4078, 4087, 4096, 4109, 4122, 4137, 4150, 343 }, { 4161, 4168, 4053, 4175, 4071, 4182, 4189, 4196, 4203, 4210, 4217, 4224, 343 }, 0, 0, 344, 346, { 348, 888, 2674 }, { 357, 876 }, { 370 }, { 376, 438 } },\n    { 4231, 4253, 4267, 2991, 1409, 4281, 4292, 4300, 4303, { 4306, 4316, 4324, 4329, 4336, 4349, 4357 }, { 1617, 4365, 4367, 4369, 4373, 4376, 4378 }, { 4382, 4390, 4399, 4408, 4417, 4424, 4432, 4440, 4450, 4461, 1845, 1854, 343 }, { 4470, 4475, 4481, 4488, 4494, 4500, 4506, 4512, 4517, 4524, 1102, 4529, 343 }, 0, 1, 344, 346, { 348, 4534, 4267 }, { 357, 4253 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 1916, 1379, 3323, 438, 370, 447, 1414, 465, 468, { 4546, 4557, 4568, 4582, 4596, 4608, 4620 }, { 4632, 4636, 4641, 4646, 4651, 4655, 4660 }, { 4664, 4672, 3770, 4681, 4688, 4693, 4700, 4707, 1827, 4461, 4715, 4725, 343 }, { 1863, 1867, 1871, 1875, 4688, 4734, 4739, 4744, 1891, 1895, 4750, 4755, 343 }, 0, 0, 344, 346, { 348, 3323 }, { 357, 1379 }, { 370 }, { 376, 438 } },\n    { 4759, 409, 888, 376, 370, 447, 74, 4783, 4786, { 4789, 4798, 4806, 4815, 4826, 4835, 4844 }, { 3148, 3152, 1871, 4851, 4855, 4859, 4863 }, { 4867, 4875, 3188, 4884, 4891, 4898, 4905, 3211, 4912, 4922, 1050, 4930, 343 }, { 4939, 1867, 1871, 1875, 4943, 4947, 4951, 3261, 4955, 4959, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 888 }, { 357, 409 }, { 370 }, { 376 } },\n    { 4963, 4993, 5015, 2991, 1409, 5026, 5042, 5055, 5062, { 5069, 5079, 5089, 5099, 5109, 5119, 5129 }, { 1238, 5139, 5143, 5147, 5151, 5155, 5159 }, { 5163, 5168, 5173, 5178, 5183, 5188, 5193, 5198, 5203, 5208, 5214, 5220, 343 }, { 5226, 5228, 5230, 5232, 5234, 5236, 5238, 5240, 5242, 5244, 5247, 5250, 343 }, 0, 0, 344, 346, { 5015, 5015, 348, 5253, 5260, 5269, 5288, 5305 }, { 4993, 4993, 5324, 5348, 5375 }, { 1409, 1409, 370, 5404, 5412 }, { 2991, 438, 5421, 5432 } },\n    { 5444, 5497, 5524, 5533, 5559, 5577, 5594, 5608, 5615, { 5622, 5632, 5642, 5652, 5662, 5672, 5682 }, { 5692, 5696, 5700, 5704, 5708, 5712, 5716 }, { 5720, 5725, 5730, 5735, 5740, 5745, 5750, 5755, 5760, 5765, 5771, 5777, 343 }, { 5720, 5725, 5730, 5735, 5740, 5745, 5750, 5755, 5760, 5765, 5771, 5777, 343 }, 0, 0, 344, 346, { 348, 5524 }, { 357, 5497 }, { 370, 5559 }, { 376, 5533 } },\n    { 5783, 876, 5805, 1399, 1409, 447, 74, 465, 468, { 5812, 5819, 5827, 5835, 5844, 5854, 5862 }, { 5871, 3427, 5874, 5877, 5880, 5883, 5886 }, { 5889, 5897, 5906, 1800, 5912, 1810, 1815, 5916, 1827, 1837, 1845, 1854, 343 }, { 1863, 1867, 5925, 1875, 5912, 1879, 1883, 1887, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 5805 }, { 357, 876 }, { 370, 1409 }, { 376, 1399 } },\n    { 5929, 1379, 844, 5953, 5964, 447, 1414, 465, 468, { 1696, 1704, 1711, 1719, 1726, 1734, 1741 }, { 5970, 3427, 3430, 5974, 3436, 5977, 5980 }, { 1779, 1786, 3770, 1800, 3781, 1810, 1815, 1820, 1827, 1837, 1845, 4725, 343 }, { 1863, 1867, 1871, 1875, 3781, 1879, 1883, 1887, 1891, 1895, 1899, 4755, 343 }, 0, 1, 344, 346, { 348, 844 }, { 357, 1379 }, { 370, 5964 }, { 376, 5953 } },\n    { 5984, 876, 6005, 438, 370, 447, 74, 465, 468, { 6016, 6026, 6040, 6047, 6054, 6063, 1482 }, { 6071, 6073, 6076, 6079, 6083, 6086, 2022 }, { 6089, 6098, 6103, 6110, 1806, 6120, 6129, 6136, 6146, 6156, 1587, 6169, 343 }, { 6179, 6183, 1871, 6187, 1806, 6191, 6195, 6199, 6203, 6207, 6212, 6216, 343 }, 0, 1, 344, 346, { 348, 5524, 6005 }, { 357, 876 }, { 370 }, { 376, 438 } },\n    { 6220, 3033, 1676, 376, 370, 3066, 3071, 465, 468, { 3093, 6253, 6267, 6280, 6293, 6306, 3140 }, { 3148, 6318, 6322, 6326, 6330, 6334, 3169 }, { 6338, 6346, 6356, 1004, 6363, 6368, 6374, 3211, 6380, 6389, 6397, 6406, 343 }, { 1863, 6415, 1871, 3253, 3781, 1879, 1883, 3261, 4955, 6419, 1899, 6423, 343 }, 0, 0, 344, 346, { 348, 1676 }, { 357, 3033 }, { 370 }, { 376 } },\n    { 5984, 876, 1938, 438, 370, 447, 74, 465, 468, { 6427, 6437, 6442, 6449, 6458, 6462, 6469 }, { 6480, 6482, 6484, 2031, 6487, 1617, 6489 }, { 6491, 6500, 6510, 6517, 3781, 6525, 6531, 1820, 6537, 6548, 6558, 6568, 343 }, { 6578, 2131, 2909, 2139, 2070, 6582, 6586, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 1, 344, 346, { 348, 1938 }, { 357, 876 }, { 370 }, { 376, 438 } },\n    { 6590, 6616, 1938, 2991, 1409, 6634, 74, 465, 468, { 6650, 6673, 505, 6696, 6707, 6722, 6737 }, { 6752, 6757, 6762, 6767, 6772, 6777, 6782 }, { 6787, 6800, 6815, 6824, 6837, 6844, 6853, 6862, 6875, 6892, 6907, 6920, 343 }, { 6935, 6942, 6949, 6956, 678, 6963, 6970, 6977, 6984, 6991, 6998, 7005, 343 }, 0, 1, 344, 346, { 348, 844, 1938 }, { 357, 6616 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 7012, 7034, 3323, 2991, 370, 4281, 1146, 465, 468, { 7048, 7057, 7069, 7076, 7084, 7094, 7100 }, { 7107, 7111, 7115, 7119, 7123, 7128, 7132 }, { 7136, 7146, 7155, 7163, 7171, 7179, 7186, 7193, 7201, 1587, 7207, 7215, 343 }, { 7224, 7228, 7232, 7237, 7241, 6195, 7245, 7249, 7253, 6212, 7257, 7261, 343 }, 0, 1, 344, 346, { 348, 7265, 3323 }, { 357, 7034 }, { 370 }, { 376, 2991 } },\n    { 7276, 1379, 7297, 2991, 1409, 447, 1414, 465, 468, { 7308, 7316, 7325, 7332, 7339, 7348, 7355 }, { 7362, 7365, 7368, 7371, 7374, 7378, 2022 }, { 4382, 4390, 7381, 4681, 7387, 4734, 4739, 1820, 1827, 4461, 1845, 1854, 343 }, { 1863, 1867, 1871, 1875, 7387, 4734, 4739, 1887, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 3323, 7297 }, { 357, 1379 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 7392, 409, 6005, 7416, 7427, 447, 457, 7434, 7437, { 7440, 7447, 7456, 7465, 7477, 7485, 7494 }, { 7504, 7508, 2909, 7513, 7518, 7522, 7526 }, { 7530, 7536, 3770, 7543, 1806, 7549, 7557, 7564, 7570, 7578, 7584, 7592, 343 }, { 2127, 7600, 2909, 7604, 7608, 7612, 7616, 7620, 7526, 7624, 7628, 7633, 343 }, 0, 1, 344, 346, { 348, 5524, 6005 }, { 357, 409 }, { 370, 7427 }, { 376, 7637, 7416 } },\n    { 7649, 7677, 6005, 5953, 5964, 447, 74, 7694, 7697, { 7700, 7708, 7716, 1719, 1726, 1734, 7723 }, { 7731, 7735, 3430, 5974, 3436, 5977, 7739 }, { 5889, 5897, 3770, 1800, 1806, 1810, 1815, 7743, 1827, 1837, 1845, 1854, 343 }, { 1863, 1867, 1871, 1875, 1806, 1879, 1883, 1887, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 6005 }, { 357, 7677 }, { 370, 5964 }, { 376, 5953 } },\n    { 7751, 876, 37, 2991, 1409, 447, 74, 7772, 7803, { 7834, 7865, 7893, 7921, 7940, 7974, 7999 }, { 8024, 8032, 8037, 8042, 8047, 8055, 8060 }, { 8065, 8084, 8115, 8134, 8153, 8175, 8200, 8222, 8244, 8266, 8285, 8313, 343 }, { 8335, 8344, 8353, 8365, 8377, 8386, 8398, 8407, 8416, 8425, 8434, 8443, 343 }, 0, 0, 344, 346, { 348, 37 }, { 357, 876 }, { 370, 1409 }, { 376, 8452, 2991 } },\n    { 8492, 8519, 1938, 438, 370, 447, 457, 465, 468, { 8537, 8543, 8553, 8559, 8570, 8580, 8585 }, { 8595, 8599, 8603, 8607, 8612, 8616, 8620 }, { 8624, 8629, 8636, 8641, 8647, 8654, 8662, 8669, 8678, 8685, 8690, 8697, 343 }, { 8705, 8709, 2909, 8714, 2878, 8718, 8722, 8726, 8731, 8735, 8739, 8743, 343 }, 0, 1, 344, 346, { 348, 1938 }, { 357, 8519 }, { 370 }, { 376, 438 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 465, 468, { 8747, 8754, 8760, 8767, 8772, 8778, 8784 }, { 8790, 8794, 8798, 8802, 8806, 8810, 8814 }, { 8818, 8826, 8835, 2064, 8841, 2074, 2079, 8845, 2091, 2101, 2109, 8853, 343 }, { 2127, 2131, 2909, 2139, 8841, 2143, 2147, 8862, 2155, 2159, 2163, 8866, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 8870, 876, 1938, 2991, 370, 8890, 74, 465, 468, { 8906, 8919, 8938, 8955, 8968, 8981, 8997 }, { 9010, 6757, 6762, 6767, 6772, 6777, 6782 }, { 9015, 9026, 9039, 9054, 9067, 9080, 9093, 9104, 9117, 9132, 9145, 9164, 343 }, { 9177, 9184, 9191, 9198, 9207, 9216, 9225, 9232, 9241, 9248, 9257, 9266, 343 }, 0, 1, 344, 346, { 348, 844, 1938 }, { 357, 876 }, { 370 }, { 376, 2991 } },\n    { 9275, 876, 1392, 5953, 5964, 447, 74, 465, 468, { 9298, 9313, 9334, 9349, 9362, 9375, 9390 }, { 9403, 9408, 9413, 9418, 9423, 9428, 9433 }, { 9438, 9455, 9464, 9479, 678, 9496, 9511, 9524, 9539, 9556, 9577, 9594, 343 }, { 9609, 9184, 9616, 9623, 678, 9630, 9637, 9644, 9241, 9651, 9658, 9665, 343 }, 0, 1, 344, 346, { 348, 1392 }, { 357, 876 }, { 370, 5964 }, { 376, 5953 } },\n    { 9672, 9694, 3323, 2991, 1409, 447, 1687, 465, 468, { 9708, 9716, 9727, 9733, 9739, 9748, 1482 }, { 7107, 7111, 1766, 9754, 7123, 7128, 9758 }, { 1779, 1786, 7381, 1800, 1806, 9762, 9768, 9774, 1827, 1837, 1845, 1854, 343 }, { 1863, 1867, 1871, 1875, 1806, 1879, 1883, 9781, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 9785, 3323 }, { 357, 9694 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 8870, 876, 9792, 2991, 1409, 447, 9802, 465, 468, { 9810, 9821, 9832, 9843, 9854, 9865, 9871 }, { 4376, 9880, 9882, 4367, 6071, 9884, 6482 }, { 9886, 9894, 9903, 9910, 3781, 9917, 9923, 1820, 1827, 9929, 1845, 9938, 343 }, { 9948, 9953, 9903, 1875, 3781, 9917, 9923, 1887, 9959, 1895, 1899, 9964, 343 }, 0, 1, 344, 346, { 348, 844, 9792 }, { 357, 876 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 9969, 9998, 4534, 2991, 370, 10019, 1414, 465, 468, { 10037, 10048, 10058, 10067, 10078, 10090, 10101 }, { 10111, 4376, 10114, 9882, 10116, 10118, 6489 }, { 10121, 10131, 1794, 10142, 10151, 10157, 10165, 10173, 10181, 10192, 10201, 10211, 343 }, { 2127, 2131, 2909, 2139, 2070, 10221, 10226, 2151, 2155, 2159, 2163, 2917, 343 }, 0, 1, 344, 346, { 348, 10231, 4534 }, { 357, 9998 }, { 370 }, { 376, 2991 } },\n    { 10238, 10271, 7265, 376, 370, 10293, 10308, 465, 468, { 10320, 10332, 10344, 10356, 10370, 10385, 10398 }, { 10412, 10415, 10418, 10421, 10424, 6073, 7374 }, { 10427, 10434, 10442, 10447, 10458, 10468, 10478, 10485, 10497, 10506, 10513, 10524, 343 }, { 10534, 10538, 10542, 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574, 10578, 343 }, 0, 1, 344, 346, { 348, 7265 }, { 357, 10271 }, { 370 }, { 376 } },\n    { 10582, 876, 10606, 2979, 370, 447, 74, 10615, 10622, { 10629, 10645, 10658, 10674, 10691, 10709, 10718 }, { 10727, 10731, 10735, 10739, 10743, 10747, 10751 }, { 10755, 10768, 229, 10779, 10790, 10795, 10804, 10815, 10822, 10837, 10848, 10861, 343 }, { 10874, 10881, 10888, 10895, 10902, 10909, 10916, 10815, 10923, 10930, 10937, 10944, 343 }, 0, 0, 344, 346, { 348, 10951, 10606 }, { 357, 876 }, { 370 }, { 376, 10961, 2979 } },\n    { 10974, 409, 2674, 2195, 370, 447, 457, 10998, 11001, { 11004, 11017, 11027, 11036, 11046, 11057, 11068 }, { 11080, 11083, 11088, 11093, 11098, 11103, 11108 }, { 11113, 11126, 11137, 11147, 11158, 11170, 11182, 11195, 11207, 11220, 11235, 11256, 343 }, { 11275, 11281, 11287, 11293, 11299, 11305, 11311, 11317, 11323, 11329, 11336, 11343, 343 }, 0, 1, 344, 346, { 348, 2674 }, { 357, 409 }, { 370 }, { 376, 2195 } },\n    { 11350, 2921, 1938, 2991, 370, 447, 2763, 11372, 11380, { 11388, 11401, 11422, 11441, 11462, 11481, 11494 }, { 11505, 11512, 11519, 11526, 11533, 11540, 11547 }, { 11554, 11571, 11588, 11597, 11608, 11619, 11632, 11645, 11660, 11679, 11698, 11715, 343 }, { 11734, 11741, 11748, 11755, 11762, 11769, 11776, 11783, 11790, 11797, 11804, 11811, 343 }, 0, 1, 344, 346, { 348, 11818, 1938 }, { 357, 2921 }, { 370 }, { 376, 2991 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 465, 468, { 11827, 11835, 11846, 11856, 11867, 11876, 11885 }, { 11895, 11898, 11901, 11904, 11907, 11910, 11913 }, { 11916, 11926, 11934, 11942, 11950, 11958, 11965, 11973, 11981, 11988, 11994, 12001, 343 }, { 12009, 12013, 1871, 12017, 3781, 12021, 12025, 12029, 12033, 12037, 12041, 12045, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 387, 409, 1938, 438, 370, 447, 457, 465, 468, { 12049, 484, 505, 6696, 12062, 12079, 12090 }, { 574, 582, 590, 12103, 12111, 612, 12119 }, { 12127, 641, 658, 667, 12142, 12149, 12158, 699, 712, 731, 748, 763, 343 }, { 12167, 786, 12175, 794, 12183, 12191, 12199, 802, 12207, 818, 826, 12217, 343 }, 0, 1, 344, 346, { 348, 12229, 1938 }, { 357, 409 }, { 370 }, { 376, 438 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 12237, 12240, { 12243, 12250, 12258, 12266, 12275, 12285, 12292 }, { 2022, 6484, 2028, 12301, 2034, 12304, 2040 }, { 12307, 12316, 12326, 2064, 8841, 12332, 12338, 12344, 2091, 2101, 2109, 8853, 343 }, { 2127, 2131, 2909, 2139, 8841, 2143, 2147, 2151, 2155, 2159, 2163, 8866, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 12353, 12373, 348, 376, 370, 12382, 1146, 12389, 12405, { 5226, 5228, 5230, 5232, 5234, 5236, 5238 }, { 5226, 5228, 5230, 5232, 5234, 5236, 5238 }, { 5226, 5228, 5230, 5232, 5234, 5236, 5238, 5240, 5242, 5244, 5247, 5250, 343 }, { 5226, 5228, 5230, 5232, 5234, 5236, 5238, 5240, 5242, 5244, 5247, 5250, 343 }, 0, 0, 344, 346, { 348 }, { 357, 12373 }, { 370 }, { 376 } },\n    { 12427, 1664, 1907, 376, 370, 447, 457, 465, 468, { 4546, 12450, 12461, 12471, 12481, 12491, 12505 }, { 4632, 4636, 12517, 12522, 12526, 12531, 12536 }, { 1779, 1786, 3770, 4681, 3781, 1810, 1815, 1820, 1827, 1837, 1845, 4725, 343 }, { 1863, 1867, 1871, 1875, 3781, 1879, 1883, 1887, 1891, 1895, 1899, 4755, 343 }, 0, 0, 344, 346, { 348, 1907 }, { 357, 1664 }, { 370 }, { 376 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 12540, 12568, { 12590, 12609, 12628, 12650, 12669, 12691, 12716 }, { 12735, 12745, 12755, 12768, 12778, 12791, 12807 }, { 12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343 }, { 12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 465, 468, { 13018, 13027, 13036, 13044, 13053, 13062, 13069 }, { 13078, 13082, 13086, 13090, 13094, 13098, 13102 }, { 8818, 8826, 13106, 13112, 8841, 2074, 13119, 13125, 13132, 13141, 13148, 13156, 343 }, { 2127, 2131, 2909, 2139, 8841, 2143, 2147, 13164, 2155, 2159, 2163, 8866, 343 }, 0, 6, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 13168, 13210, { 13252, 13271, 13290, 13312, 13331, 13353, 13378 }, { 13397, 13407, 13417, 13430, 13440, 13453, 13469 }, { 13479, 13507, 13535, 13551, 13570, 13577, 13587, 13603, 13619, 13647, 13669, 13691, 343 }, { 13716, 13735, 13535, 13551, 13570, 13577, 13587, 13603, 13754, 13770, 13786, 13796, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 13809, 13822, { 13835, 13854, 13876, 13901, 13917, 13939, 13958 }, { 13968, 13975, 13982, 13989, 13996, 14003, 14010 }, { 14014, 14030, 14055, 14074, 14093, 14100, 14113, 14126, 14145, 14176, 14201, 14223, 343 }, { 14248, 14256, 14270, 14284, 14093, 14100, 14113, 14295, 14303, 14317, 14328, 14336, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 14347, 14375, { 14397, 14419, 14441, 14466, 14488, 14513, 14541 }, { 14563, 14573, 14583, 14596, 14606, 14619, 14635 }, { 14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343 }, { 14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 14879, 14907, { 14929, 14948, 14967, 14989, 15008, 15030, 15055 }, { 15074, 15079, 15087, 15095, 15103, 15111, 15119 }, { 15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343 }, { 15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 15364, 15376, { 12590, 12609, 15388, 12650, 12669, 12691, 12716 }, { 12735, 12745, 15410, 12768, 12778, 12791, 12807 }, { 15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343 }, { 15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 465, 468, { 15628, 15636, 15641, 15648, 15658, 15664, 15671 }, { 15679, 15683, 2909, 15687, 15692, 15696, 15700 }, { 15705, 15713, 15722, 15728, 15734, 15739, 15745, 15751, 15758, 15767, 15775, 15784, 343 }, { 15793, 2131, 2909, 15797, 2070, 15801, 15806, 13164, 15810, 15814, 2163, 2917, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 15364, 15376, { 15818, 12609, 15846, 12650, 12669, 12691, 12716 }, { 12735, 12745, 15410, 12768, 12778, 12791, 12807 }, { 15423, 15865, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343 }, { 15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } },\n    { 1, 24, 37, 46, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 87, 98, 113, 130, 147, 160, 173 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37 }, { 357, 24 }, { 370, 56 }, { 376, 46 } },\n    { 387, 409, 422, 438, 370, 447, 457, 465, 468, { 471, 484, 505, 520, 531, 550, 561 }, { 574, 582, 590, 596, 602, 612, 620 }, { 628, 641, 658, 667, 678, 685, 692, 699, 712, 731, 748, 763, 343 }, { 780, 786, 658, 794, 678, 685, 692, 802, 810, 818, 826, 836, 343 }, 0, 1, 344, 346, { 348, 844, 422 }, { 357, 409 }, { 370 }, { 376, 438 } },\n    { 5984, 876, 2674, 438, 370, 447, 457, 465, 468, { 897, 906, 914, 922, 931, 938, 948 }, { 957, 961, 965, 969, 973, 977, 981 }, { 985, 991, 998, 1004, 1010, 1015, 1020, 1027, 1033, 1042, 1050, 1059, 343 }, { 1068, 1073, 998, 1078, 1010, 1015, 1083, 1088, 1092, 1097, 1102, 1107, 343 }, 0, 1, 344, 346, { 348, 888, 2674 }, { 357, 876 }, { 370 }, { 376, 438 } },\n    { 15896, 4993, 5260, 15941, 15964, 5026, 5042, 1154, 1161, { 1168, 1178, 1188, 1198, 1208, 1218, 1228 }, { 1238, 1242, 1246, 1250, 1254, 1258, 1262 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, 0, 0, 344, 346, { 348, 5260 }, { 357, 4993 }, { 370, 15964 }, { 376, 15941 } },\n    { 7276, 1379, 3323, 2991, 1409, 447, 1414, 1422, 1427, { 1432, 1440, 1450, 1458, 1466, 1475, 1482 }, { 1489, 1492, 1495, 1499, 1502, 1506, 1510 }, { 1513, 1519, 1525, 1533, 1539, 1547, 1555, 1565, 1571, 1579, 1587, 1596, 343 }, { 1605, 1607, 1610, 1614, 1617, 1619, 1622, 1626, 1631, 1634, 1636, 1639, 343 }, 0, 1, 344, 346, { 348, 1392, 3323 }, { 357, 1379 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 1643, 1664, 1676, 438, 370, 447, 1687, 465, 468, { 1696, 1704, 1711, 1719, 1726, 1734, 1741 }, { 1749, 1754, 1758, 1762, 1766, 1770, 1774 }, { 1779, 1786, 1794, 1800, 1806, 1810, 1815, 1820, 1827, 1837, 1845, 1854, 343 }, { 1863, 1867, 1871, 1875, 1806, 1879, 1883, 1887, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 1907, 1676 }, { 357, 1664 }, { 370 }, { 376, 438 } },\n    { 1916, 1379, 1938, 438, 370, 447, 1414, 1949, 1955, { 1962, 1970, 1977, 1986, 1995, 2006, 2014 }, { 2022, 2025, 2028, 2031, 2034, 2037, 2040 }, { 2043, 2050, 2058, 2064, 2070, 2074, 2079, 2084, 2091, 2101, 2109, 2118, 343 }, { 2127, 2131, 2135, 2139, 2070, 2143, 2147, 2151, 2155, 2159, 2163, 2167, 343 }, 0, 1, 344, 346, { 348, 844, 1938 }, { 357, 1379 }, { 370 }, { 376, 438 } },\n    { 2171, 409, 37, 2195, 56, 447, 457, 2206, 2211, { 2216, 2231, 2246, 2257, 2272, 2285, 2304 }, { 2319, 2326, 2333, 2340, 2347, 2354, 2361 }, { 2368, 2389, 2412, 2427, 2444, 2455, 2470, 2485, 2504, 2527, 2546, 2565, 343 }, { 2586, 2593, 2600, 2607, 2614, 2621, 2630, 2639, 2646, 2653, 2660, 2667, 343 }, 0, 1, 344, 346, { 348, 2674, 37 }, { 357, 409 }, { 370, 56 }, { 376, 2685, 2195 } },\n    { 2697, 2728, 10606, 2195, 2755, 63, 2763, 465, 468, { 2770, 2777, 2784, 2792, 2802, 2811, 2818 }, { 2827, 2831, 2835, 2839, 2843, 2847, 2851 }, { 2855, 2863, 2872, 2064, 2878, 2882, 2887, 2084, 2091, 2892, 2109, 2900, 343 }, { 2127, 2131, 2909, 2139, 2878, 2143, 2147, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 0, 344, 346, { 10606, 10606, 2748, 2748, 11818, 3055, 348, 6005, 15971 }, { 2728, 2728, 2921, 2935, 2955 }, { 2755, 2755, 2970, 1409, 370 }, { 2195, 2195, 2979, 2991, 438 } },\n    { 3281, 3306, 3323, 2991, 370, 3332, 3345, 465, 468, { 3357, 3367, 3377, 3385, 3397, 3405, 3415 }, { 3424, 3427, 3430, 3433, 3436, 3439, 3442 }, { 3445, 3454, 3463, 3473, 3482, 3491, 3500, 3510, 3517, 3525, 3533, 3543, 343 }, { 3552, 3558, 3564, 3571, 3577, 3583, 3589, 3596, 3600, 3605, 3610, 3617, 343 }, 0, 1, 344, 346, { 348, 3323 }, { 357, 3306 }, { 370 }, { 376, 2991 } },\n    { 3623, 3649, 2674, 438, 370, 447, 74, 465, 468, { 3666, 3675, 3681, 3687, 3696, 3702, 3711 }, { 3718, 3723, 3728, 3733, 3738, 3743, 3748 }, { 3753, 3761, 3770, 3775, 3781, 3785, 3790, 3798, 3804, 3814, 1050, 3822, 343 }, { 3832, 3838, 3770, 3845, 3781, 3785, 3850, 3798, 3856, 1097, 1102, 3862, 343 }, 0, 1, 344, 346, { 888, 3868, 3273, 2674 }, { 357, 876, 3649 }, { 370 }, { 376, 438 } },\n    { 3878, 876, 2674, 438, 370, 447, 74, 465, 468, { 3899, 3917, 3931, 3949, 3967, 3985, 4001 }, { 4008, 4011, 4014, 4017, 4020, 4023, 4026 }, { 4029, 4040, 4053, 4060, 4071, 4078, 4087, 4096, 4109, 4122, 4137, 4150, 343 }, { 4161, 4168, 4053, 4175, 4071, 4182, 4189, 4196, 4203, 4210, 4217, 4224, 343 }, 0, 0, 344, 346, { 348, 888, 2674 }, { 357, 876 }, { 370 }, { 376, 438 } },\n    { 4231, 4253, 4267, 2991, 1409, 4281, 4292, 4300, 4303, { 4306, 4316, 4324, 4329, 4336, 4349, 4357 }, { 1617, 4365, 4367, 4369, 4373, 4376, 4378 }, { 4382, 4390, 4399, 4408, 4417, 4424, 4432, 4440, 4450, 4461, 1845, 1854, 343 }, { 4470, 4475, 4481, 4488, 4494, 4500, 4506, 4512, 4517, 4524, 1102, 4529, 343 }, 0, 1, 344, 346, { 348, 4534, 4267 }, { 357, 4253 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 1916, 1379, 3323, 438, 370, 447, 1414, 465, 468, { 4546, 4557, 4568, 4582, 4596, 4608, 4620 }, { 4632, 4636, 4641, 4646, 4651, 4655, 4660 }, { 4664, 4672, 3770, 4681, 4688, 4693, 4700, 4707, 1827, 4461, 4715, 4725, 343 }, { 1863, 1867, 1871, 1875, 4688, 4734, 4739, 4744, 1891, 1895, 4750, 4755, 343 }, 0, 0, 344, 346, { 348, 3323 }, { 357, 1379 }, { 370 }, { 376, 438 } },\n    { 15981, 409, 2674, 16002, 370, 447, 74, 4783, 4786, { 4789, 4798, 4806, 4815, 4826, 4835, 4844 }, { 3148, 3152, 1871, 4851, 4855, 4859, 4863 }, { 4867, 4875, 3188, 4884, 4891, 4898, 4905, 3211, 4912, 4922, 1050, 4930, 343 }, { 4939, 1867, 1871, 1875, 4943, 4947, 4951, 3261, 4955, 4959, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 888, 2674 }, { 357, 409 }, { 370 }, { 376, 1399, 16002 } },\n    { 4963, 4993, 5015, 2991, 1409, 5026, 5042, 5055, 5062, { 5069, 5079, 5089, 5099, 5109, 5119, 5129 }, { 1238, 5139, 5143, 5147, 5151, 5155, 5159 }, { 5163, 5168, 5173, 5178, 5183, 5188, 5193, 5198, 5203, 5208, 5214, 5220, 343 }, { 5226, 5228, 5230, 5232, 5234, 5236, 5238, 5240, 5242, 5244, 5247, 5250, 343 }, 0, 0, 344, 346, { 5015, 5015, 348, 5253, 5260, 5269, 5288, 5305 }, { 4993, 4993, 5324, 5348, 5375 }, { 1409, 1409, 370, 5404, 5412 }, { 2991, 438, 5421, 5432 } },\n    { 16010, 16060, 5015, 16084, 5404, 5577, 5594, 5608, 5615, { 5622, 5632, 5642, 5652, 5662, 5672, 5682 }, { 5692, 5696, 5700, 5704, 5708, 5712, 5716 }, { 5720, 5725, 5730, 5735, 5740, 5745, 5750, 5755, 5760, 5765, 5771, 5777, 343 }, { 5720, 5725, 5730, 5735, 5740, 5745, 5750, 5755, 5760, 5765, 5771, 5777, 343 }, 0, 0, 344, 346, { 5015, 5015, 348, 5253, 5260, 16110, 16123 }, { 16060, 16060, 16134, 16160, 16182 }, { 5404, 1409, 370, 16206, 16220, 16235, 5404, 5412, 16251, 16268, 16286 }, { 16084, 16084, 16305, 16327, 2991, 438, 16351, 16376, 5421, 5432 } },\n    { 8870, 876, 16403, 2991, 1409, 447, 74, 465, 468, { 5812, 5819, 5827, 5835, 5844, 5854, 5862 }, { 5871, 3427, 5874, 5877, 5880, 5883, 5886 }, { 5889, 5897, 5906, 1800, 5912, 1810, 1815, 5916, 1827, 1837, 1845, 1854, 343 }, { 1863, 1867, 5925, 1875, 5912, 1879, 1883, 1887, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 5805, 16403 }, { 357, 876 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 5929, 1379, 844, 5953, 5964, 447, 1414, 465, 468, { 1696, 1704, 1711, 1719, 1726, 1734, 1741 }, { 5970, 3427, 3430, 5974, 3436, 5977, 5980 }, { 1779, 1786, 3770, 1800, 3781, 1810, 1815, 1820, 1827, 1837, 1845, 4725, 343 }, { 1863, 1867, 1871, 1875, 3781, 1879, 1883, 1887, 1891, 1895, 1899, 4755, 343 }, 0, 1, 344, 346, { 348, 844 }, { 357, 1379 }, { 370, 5964 }, { 376, 5953 } },\n    { 5984, 876, 6005, 438, 370, 447, 74, 465, 468, { 6016, 6026, 6040, 6047, 6054, 6063, 1482 }, { 6071, 6073, 6076, 6079, 6083, 6086, 2022 }, { 6089, 6098, 6103, 6110, 1806, 6120, 6129, 6136, 6146, 6156, 1587, 6169, 343 }, { 6179, 6183, 1871, 6187, 1806, 6191, 6195, 6199, 6203, 6207, 6212, 6216, 343 }, 0, 1, 344, 346, { 348, 5524, 6005 }, { 357, 876 }, { 370 }, { 376, 438 } },\n    { 16412, 3033, 37, 438, 370, 3066, 3071, 465, 468, { 3093, 6253, 6267, 6280, 6293, 6306, 3140 }, { 3148, 6318, 6322, 6326, 6330, 6334, 3169 }, { 6338, 6346, 6356, 1004, 6363, 6368, 6374, 3211, 6380, 6389, 6397, 6406, 343 }, { 1863, 6415, 1871, 3253, 3781, 1879, 1883, 3261, 4955, 6419, 1899, 6423, 343 }, 0, 0, 344, 346, { 348, 1676, 888, 37 }, { 357, 3033 }, { 370 }, { 376, 16443, 438 } },\n    { 5984, 876, 1938, 438, 370, 447, 74, 465, 468, { 6427, 6437, 6442, 6449, 6458, 6462, 6469 }, { 6480, 6482, 6484, 2031, 6487, 1617, 6489 }, { 6491, 6500, 6510, 6517, 3781, 6525, 6531, 1820, 6537, 6548, 6558, 6568, 343 }, { 6578, 2131, 2909, 2139, 2070, 6582, 6586, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 1, 344, 346, { 348, 1938 }, { 357, 876 }, { 370 }, { 376, 438 } },\n    { 6590, 6616, 1938, 2991, 1409, 6634, 74, 465, 468, { 6650, 6673, 505, 6696, 6707, 6722, 6737 }, { 6752, 6757, 6762, 6767, 6772, 6777, 6782 }, { 6787, 6800, 6815, 6824, 6837, 6844, 6853, 6862, 6875, 6892, 6907, 6920, 343 }, { 6935, 6942, 6949, 6956, 678, 6963, 6970, 6977, 6984, 6991, 6998, 7005, 343 }, 0, 1, 344, 346, { 348, 844, 1938 }, { 357, 6616 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 7012, 7034, 3323, 2991, 370, 4281, 1146, 465, 468, { 7048, 7057, 7069, 7076, 7084, 7094, 7100 }, { 7107, 7111, 7115, 7119, 7123, 7128, 7132 }, { 7136, 7146, 7155, 7163, 7171, 7179, 7186, 7193, 7201, 1587, 7207, 7215, 343 }, { 7224, 7228, 7232, 7237, 7241, 6195, 7245, 7249, 7253, 6212, 7257, 7261, 343 }, 0, 1, 344, 346, { 348, 7265, 3323 }, { 357, 7034 }, { 370 }, { 376, 2991 } },\n    { 7276, 1379, 7297, 2991, 1409, 447, 1414, 465, 468, { 7308, 7316, 7325, 7332, 7339, 7348, 7355 }, { 7362, 7365, 7368, 7371, 7374, 7378, 2022 }, { 4382, 4390, 7381, 4681, 7387, 4734, 4739, 1820, 1827, 4461, 1845, 1854, 343 }, { 1863, 1867, 1871, 1875, 7387, 4734, 4739, 1887, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 3323, 7297 }, { 357, 1379 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 7392, 409, 6005, 7416, 7427, 447, 457, 7434, 7437, { 7440, 7447, 7456, 7465, 7477, 7485, 7494 }, { 7504, 7508, 2909, 7513, 7518, 7522, 7526 }, { 7530, 7536, 3770, 7543, 1806, 7549, 7557, 7564, 7570, 7578, 7584, 7592, 343 }, { 2127, 7600, 2909, 7604, 7608, 7612, 7616, 7620, 7526, 7624, 7628, 7633, 343 }, 0, 1, 344, 346, { 348, 5524, 6005 }, { 357, 409 }, { 370, 7427 }, { 376, 7637, 7416 } },\n    { 16460, 7677, 6005, 438, 370, 447, 74, 7694, 7697, { 7700, 7708, 7716, 1719, 1726, 1734, 7723 }, { 7731, 7735, 3430, 5974, 3436, 5977, 7739 }, { 5889, 5897, 3770, 1800, 1806, 1810, 1815, 7743, 1827, 1837, 1845, 1854, 343 }, { 1863, 1867, 1871, 1875, 1806, 1879, 1883, 1887, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 6005 }, { 357, 7677 }, { 370, 5964 }, { 376, 5953, 438 } },\n    { 7751, 876, 37, 2991, 1409, 447, 74, 7772, 7803, { 7834, 7865, 7893, 7921, 7940, 7974, 7999 }, { 8024, 8032, 8037, 8042, 8047, 8055, 8060 }, { 8065, 8084, 8115, 8134, 8153, 8175, 8200, 8222, 8244, 8266, 8285, 8313, 343 }, { 8335, 8344, 8353, 8365, 8377, 8386, 8398, 8407, 8416, 8425, 8434, 8443, 343 }, 0, 0, 344, 346, { 348, 37 }, { 357, 876 }, { 370, 1409 }, { 376, 8452, 2991 } },\n    { 8492, 8519, 1938, 438, 370, 447, 457, 465, 468, { 8537, 8543, 8553, 8559, 8570, 8580, 8585 }, { 8595, 8599, 8603, 8607, 8612, 8616, 8620 }, { 8624, 8629, 8636, 8641, 8647, 8654, 8662, 8669, 8678, 8685, 8690, 8697, 343 }, { 8705, 8709, 2909, 8714, 2878, 8718, 8722, 8726, 8731, 8735, 8739, 8743, 343 }, 0, 1, 344, 346, { 348, 1938 }, { 357, 8519 }, { 370 }, { 376, 438 } },\n    { 16486, 409, 2674, 2991, 1409, 447, 457, 465, 468, { 8747, 8754, 8760, 8767, 8772, 8778, 8784 }, { 8790, 8794, 8798, 8802, 8806, 8810, 8814 }, { 8818, 8826, 8835, 2064, 8841, 2074, 2079, 8845, 2091, 2101, 2109, 8853, 343 }, { 2127, 2131, 2909, 2139, 8841, 2143, 2147, 8862, 2155, 2159, 2163, 8866, 343 }, 0, 0, 344, 346, { 348, 888, 2674 }, { 357, 409 }, { 370, 1409 }, { 376, 2991 } },\n    { 8870, 876, 1938, 2991, 370, 8890, 74, 465, 468, { 8906, 8919, 8938, 8955, 8968, 8981, 8997 }, { 9010, 6757, 6762, 6767, 6772, 6777, 6782 }, { 9015, 9026, 9039, 9054, 9067, 9080, 9093, 9104, 9117, 9132, 9145, 9164, 343 }, { 9177, 9184, 9191, 9198, 9207, 9216, 9225, 9232, 9241, 9248, 9257, 9266, 343 }, 0, 1, 344, 346, { 348, 844, 1938 }, { 357, 876 }, { 370 }, { 376, 2991 } },\n    { 8870, 876, 1938, 2991, 5964, 447, 74, 465, 468, { 9298, 9313, 9334, 9349, 9362, 9375, 9390 }, { 9403, 9408, 9413, 9418, 9423, 9428, 9433 }, { 9438, 9455, 9464, 9479, 678, 9496, 9511, 9524, 9539, 9556, 9577, 9594, 343 }, { 9609, 9184, 9616, 9623, 678, 9630, 9637, 9644, 9241, 9651, 9658, 9665, 343 }, 0, 1, 344, 346, { 348, 1392, 1938 }, { 357, 876 }, { 370, 5964 }, { 376, 5953, 2991 } },\n    { 9672, 9694, 3323, 2991, 1409, 447, 1687, 465, 468, { 9708, 9716, 9727, 9733, 9739, 9748, 1482 }, { 7107, 7111, 1766, 9754, 7123, 7128, 9758 }, { 1779, 1786, 7381, 1800, 1806, 9762, 9768, 9774, 1827, 1837, 1845, 1854, 343 }, { 1863, 1867, 1871, 1875, 1806, 1879, 1883, 9781, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 9785, 3323 }, { 357, 9694 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 8870, 876, 9792, 2991, 1409, 447, 9802, 465, 468, { 9810, 9821, 9832, 9843, 9854, 9865, 9871 }, { 4376, 9880, 9882, 4367, 6071, 9884, 6482 }, { 9886, 9894, 9903, 9910, 3781, 9917, 9923, 1820, 1827, 9929, 1845, 9938, 343 }, { 9948, 9953, 9903, 1875, 3781, 9917, 9923, 1887, 9959, 1895, 1899, 9964, 343 }, 0, 1, 344, 346, { 348, 844, 9792 }, { 357, 876 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 9969, 9998, 4534, 2991, 370, 10019, 1414, 465, 468, { 10037, 10048, 10058, 10067, 10078, 10090, 10101 }, { 10111, 4376, 10114, 9882, 10116, 10118, 6489 }, { 10121, 10131, 1794, 10142, 10151, 10157, 10165, 10173, 10181, 10192, 10201, 10211, 343 }, { 2127, 2131, 2909, 2139, 2070, 10221, 10226, 2151, 2155, 2159, 2163, 2917, 343 }, 0, 1, 344, 346, { 348, 10231, 4534 }, { 357, 9998 }, { 370 }, { 376, 2991 } },\n    { 16507, 10271, 7265, 438, 370, 10293, 10308, 465, 468, { 10320, 10332, 10344, 10356, 10370, 10385, 10398 }, { 10412, 10415, 10418, 10421, 10424, 6073, 7374 }, { 10427, 10434, 10442, 10447, 10458, 10468, 10478, 10485, 10497, 10506, 10513, 10524, 343 }, { 10534, 10538, 10542, 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574, 10578, 343 }, 0, 1, 344, 346, { 348, 7265 }, { 357, 10271 }, { 370 }, { 376, 438 } },\n    { 10582, 876, 10606, 2979, 370, 447, 74, 10615, 10622, { 10629, 10645, 10658, 10674, 10691, 10709, 10718 }, { 10727, 10731, 10735, 10739, 10743, 10747, 10751 }, { 10755, 10768, 229, 10779, 10790, 10795, 10804, 10815, 10822, 10837, 10848, 10861, 343 }, { 10874, 10881, 10888, 10895, 10902, 10909, 10916, 10815, 10923, 10930, 10937, 10944, 343 }, 0, 6, 344, 346, { 348, 10951, 10606 }, { 357, 876 }, { 370 }, { 376, 10961, 2979 } },\n    { 10974, 409, 2674, 2195, 370, 447, 457, 10998, 11001, { 11004, 11017, 11027, 11036, 11046, 11057, 11068 }, { 11080, 11083, 11088, 11093, 11098, 11103, 11108 }, { 11113, 11126, 11137, 11147, 11158, 11170, 11182, 11195, 11207, 11220, 11235, 11256, 343 }, { 11275, 11281, 11287, 11293, 11299, 11305, 11311, 11317, 11323, 11329, 11336, 11343, 343 }, 0, 1, 344, 346, { 348, 2674 }, { 357, 409 }, { 370 }, { 376, 2195 } },\n    { 11350, 2921, 1938, 2991, 370, 447, 2763, 11372, 16538, { 11388, 11401, 11422, 11441, 11462, 11481, 11494 }, { 11505, 11512, 11519, 11526, 11533, 11540, 11547 }, { 16546, 16561, 11588, 11597, 11608, 16576, 16589, 11645, 11660, 11679, 11698, 11715, 343 }, { 16602, 16609, 11748, 11755, 11762, 16616, 16623, 11783, 11790, 11797, 11804, 11811, 343 }, 0, 1, 344, 346, { 348, 11818, 1938 }, { 357, 2921 }, { 370 }, { 376, 2991 } },\n    { 16630, 16669, 5015, 438, 370, 16699, 1146, 465, 468, { 11827, 11835, 11846, 11856, 11867, 11876, 11885 }, { 11895, 11898, 11901, 11904, 11907, 11910, 11913 }, { 11916, 11926, 11934, 11942, 11950, 11958, 11965, 11973, 11981, 11988, 11994, 12001, 343 }, { 12009, 12013, 1871, 12017, 3781, 12021, 12025, 12029, 12033, 12037, 12041, 12045, 343 }, 0, 1, 344, 346, { 348, 16714, 5015 }, { 357, 16669 }, { 370 }, { 376, 438 } },\n    { 387, 409, 1938, 438, 370, 447, 457, 465, 468, { 12049, 484, 505, 6696, 12062, 12079, 12090 }, { 574, 582, 590, 12103, 12111, 612, 12119 }, { 12127, 641, 658, 667, 12142, 12149, 12158, 699, 712, 731, 748, 763, 343 }, { 12167, 786, 12175, 794, 12183, 12191, 12199, 802, 12207, 818, 826, 12217, 343 }, 0, 1, 344, 346, { 348, 12229, 1938 }, { 357, 409 }, { 370 }, { 376, 438 } },\n    { 16727, 409, 5015, 2979, 56, 447, 457, 343, 343, { 12243, 12250, 12258, 12266, 12275, 12285, 12292 }, { 2022, 6484, 2028, 12301, 2034, 12304, 2040 }, { 12307, 12316, 12326, 2064, 8841, 12332, 12338, 12344, 2091, 2101, 2109, 8853, 343 }, { 2127, 2131, 2909, 2139, 8841, 2143, 2147, 2151, 2155, 2159, 2163, 8866, 343 }, 0, 0, 344, 346, { 348, 5015 }, { 357, 409 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 16752, 16792, 1938, 2991, 1409, 12382, 1146, 12389, 12405, { 5226, 5228, 5230, 5232, 5234, 5236, 5238 }, { 5226, 5228, 5230, 5232, 5234, 5236, 5238 }, { 5226, 5228, 5230, 5232, 5234, 5236, 5238, 5240, 5242, 5244, 5247, 5250, 343 }, { 5226, 5228, 5230, 5232, 5234, 5236, 5238, 5240, 5242, 5244, 5247, 5250, 343 }, 0, 0, 344, 346, { 348, 1938 }, { 357, 12373, 16792 }, { 370, 1409 }, { 376, 2991 } },\n    { 16824, 1664, 1676, 16845, 370, 447, 457, 465, 468, { 4546, 12450, 12461, 12471, 12481, 12491, 12505 }, { 4632, 4636, 12517, 12522, 12526, 12531, 12536 }, { 1779, 1786, 3770, 4681, 3781, 1810, 1815, 1820, 1827, 1837, 1845, 4725, 343 }, { 1863, 1867, 1871, 1875, 3781, 1879, 1883, 1887, 1891, 1895, 1899, 4755, 343 }, 0, 0, 344, 346, { 348, 1907, 1676 }, { 357, 1664 }, { 370 }, { 376, 16845 } },\n    { 5984, 876, 1676, 438, 56, 447, 74, 12540, 12568, { 12590, 12609, 12628, 12650, 12669, 12691, 12716 }, { 12735, 12745, 12755, 12768, 12778, 12791, 12807 }, { 12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343 }, { 12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343 }, 0, 0, 344, 346, { 348, 5805, 1676 }, { 357, 876 }, { 370, 56 }, { 376, 2685, 438 } },\n    { 16854, 357, 10606, 16878, 370, 1136, 1146, 465, 468, { 13018, 13027, 13036, 13044, 13053, 13062, 13069 }, { 13078, 13082, 13086, 13090, 13094, 13098, 13102 }, { 8818, 8826, 13106, 13112, 8841, 2074, 13119, 13125, 13132, 13141, 13148, 13156, 343 }, { 2127, 2131, 2909, 2139, 8841, 2143, 2147, 13164, 2155, 2159, 2163, 8866, 343 }, 0, 6, 344, 346, { 348, 10606 }, { 357 }, { 370 }, { 376, 16878 } },\n    { 16889, 876, 16914, 16922, 16935, 447, 74, 13168, 13210, { 13252, 13271, 13290, 13312, 13331, 13353, 13378 }, { 13397, 13407, 13417, 13430, 13440, 13453, 13469 }, { 13479, 13507, 13535, 13551, 13570, 13577, 13587, 13603, 13619, 13647, 13669, 13691, 343 }, { 13716, 13735, 13535, 13551, 13570, 13577, 13587, 13603, 13754, 13770, 13786, 13796, 343 }, 0, 0, 344, 346, { 348, 16914 }, { 357, 876 }, { 370, 16935 }, { 376, 16922 } },\n    { 16943, 876, 5805, 2685, 56, 447, 74, 13809, 13822, { 13835, 13854, 13876, 13901, 13917, 13939, 13958 }, { 13968, 13975, 13982, 13989, 13996, 14003, 14010 }, { 14014, 14030, 14055, 14074, 14093, 14100, 14113, 14126, 14145, 14176, 14201, 14223, 343 }, { 14248, 14256, 14270, 14284, 14093, 14100, 14113, 14295, 14303, 14317, 14328, 14336, 343 }, 0, 0, 344, 346, { 348, 5805 }, { 357, 876 }, { 370, 56 }, { 376, 2685 } },\n    { 16943, 876, 1907, 2685, 56, 447, 74, 14347, 14375, { 14397, 14419, 14441, 14466, 14488, 14513, 14541 }, { 14563, 14573, 14583, 14596, 14606, 14619, 14635 }, { 14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343 }, { 14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343 }, 0, 0, 344, 346, { 348, 1907 }, { 357, 876 }, { 370, 56 }, { 376, 2685 } },\n    { 16889, 876, 5805, 16922, 16935, 447, 74, 14879, 14907, { 14929, 14948, 14967, 14989, 15008, 15030, 15055 }, { 15074, 15079, 15087, 15095, 15103, 15111, 15119 }, { 15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343 }, { 15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343 }, 0, 0, 344, 346, { 348, 5805 }, { 357, 876 }, { 370, 16935 }, { 376, 16922 } },\n    { 16943, 876, 5805, 2685, 56, 447, 74, 15364, 15376, { 12590, 12609, 15388, 12650, 12669, 12691, 12716 }, { 12735, 12745, 15410, 12768, 12778, 12791, 12807 }, { 15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343 }, { 15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343 }, 0, 0, 344, 346, { 348, 5805 }, { 357, 876 }, { 370, 56 }, { 376, 2685 } },\n    { 4759, 409, 888, 376, 370, 447, 457, 465, 468, { 15628, 15636, 15641, 15648, 15658, 15664, 15671 }, { 15679, 15683, 2909, 15687, 15692, 15696, 15700 }, { 15705, 15713, 15722, 15728, 15734, 15739, 15745, 15751, 15758, 15767, 15775, 15784, 343 }, { 15793, 2131, 2909, 15797, 2070, 15801, 15806, 13164, 15810, 15814, 2163, 2917, 343 }, 0, 1, 344, 346, { 348, 888 }, { 357, 409 }, { 370 }, { 376 } },\n    { 16943, 876, 5805, 2685, 56, 447, 74, 15364, 15376, { 15818, 12609, 15846, 12650, 12669, 12691, 12716 }, { 12735, 12745, 15410, 12768, 12778, 12791, 12807 }, { 15423, 15865, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343 }, { 15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343 }, 0, 0, 344, 346, { 348, 5805 }, { 357, 876 }, { 370, 56 }, { 376, 2685 } },\n    { 1, 24, 37, 46, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 184, 187, 190, 193, 196, 199, 202 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37 }, { 357, 24 }, { 370, 56 }, { 376, 46 } },\n    { 16967, 4993, 17012, 17019, 17042, 5026, 5042, 1154, 1161, { 1168, 1178, 1188, 1198, 1208, 1218, 1228 }, { 1238, 1242, 1246, 1250, 1254, 1258, 1262 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, 0, 0, 344, 346, { 348, 17012 }, { 357, 4993 }, { 370, 17042 }, { 376, 17019 } },\n    { 1916, 1379, 1938, 438, 370, 447, 1414, 1949, 1955, { 1962, 1970, 1977, 1986, 1995, 2006, 2014 }, { 2022, 2025, 2028, 2031, 2034, 2037, 2040 }, { 2043, 2050, 2058, 2064, 2070, 2074, 2079, 2084, 2091, 2101, 2109, 2118, 343 }, { 2127, 2131, 2135, 2139, 2070, 2143, 2147, 2151, 2155, 2159, 2163, 2167, 343 }, 0, 1, 344, 346, { 348, 844, 1938 }, { 357, 1379 }, { 370 }, { 376, 438 } },\n    { 5984, 876, 2674, 438, 370, 447, 74, 465, 468, { 2770, 2777, 2784, 2792, 2802, 2811, 2818 }, { 2827, 2831, 2835, 2839, 2843, 2847, 2851 }, { 2855, 2863, 2872, 2064, 2878, 2882, 2887, 2084, 2091, 2892, 2109, 2900, 343 }, { 2127, 2131, 2909, 2139, 2878, 2143, 2147, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 1, 344, 346, { 348, 2748, 2674 }, { 2728, 2728, 2921, 2935, 2955, 876 }, { 2755, 2755, 2970, 1409, 370 }, { 2195, 2195, 2979, 2991, 438, 376 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 8870, 876, 3868, 2991, 370, 447, 74, 465, 468, { 3666, 3675, 3681, 3687, 3696, 3702, 3711 }, { 3718, 3723, 3728, 3733, 3738, 3743, 3748 }, { 3753, 3761, 3770, 3775, 3781, 3785, 3790, 3798, 3804, 3814, 1050, 3822, 343 }, { 3832, 3838, 3770, 3845, 3781, 3785, 3850, 3798, 3856, 1097, 1102, 3862, 343 }, 0, 1, 344, 346, { 888, 3868, 3273 }, { 357, 876, 3649 }, { 370 }, { 376, 438, 2991 } },\n    { 5984, 876, 1938, 438, 370, 447, 74, 4783, 4786, { 4789, 4798, 4806, 4815, 4826, 4835, 4844 }, { 3148, 3152, 1871, 4851, 4855, 4859, 4863 }, { 4867, 4875, 3188, 4884, 4891, 4898, 4905, 3211, 4912, 4922, 1050, 4930, 343 }, { 4939, 1867, 1871, 1875, 4943, 4947, 4951, 3261, 4955, 4959, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 888, 844, 1938 }, { 357, 409, 876 }, { 370 }, { 376, 438 } },\n    { 8870, 876, 3868, 2991, 370, 447, 74, 465, 468, { 5812, 5819, 5827, 5835, 5844, 5854, 5862 }, { 5871, 3427, 5874, 5877, 5880, 5883, 5886 }, { 5889, 5897, 5906, 1800, 5912, 1810, 1815, 5916, 1827, 1837, 1845, 1854, 343 }, { 1863, 1867, 5925, 1875, 5912, 1879, 1883, 1887, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 5805, 3273, 3868 }, { 357, 876 }, { 370, 1409 }, { 376, 1399, 2991 } },\n    { 5929, 1379, 844, 5953, 5964, 447, 1414, 465, 468, { 1696, 1704, 1711, 1719, 1726, 1734, 1741 }, { 5970, 3427, 3430, 5974, 3436, 5977, 5980 }, { 1779, 1786, 3770, 1800, 3781, 1810, 1815, 1820, 1827, 1837, 1845, 4725, 343 }, { 1863, 1867, 1871, 1875, 3781, 1879, 1883, 1887, 1891, 1895, 1899, 4755, 343 }, 0, 1, 344, 346, { 348, 844 }, { 357, 1379 }, { 370, 5964 }, { 376, 5953 } },\n    { 17048, 3033, 1676, 2991, 370, 3066, 3071, 465, 468, { 3093, 6253, 6267, 6280, 6293, 6306, 3140 }, { 3148, 6318, 6322, 6326, 6330, 6334, 3169 }, { 6338, 6346, 6356, 1004, 6363, 6368, 6374, 3211, 6380, 6389, 6397, 6406, 343 }, { 1863, 6415, 1871, 3253, 3781, 1879, 1883, 3261, 4955, 6419, 1899, 6423, 343 }, 0, 1, 344, 346, { 348, 1676 }, { 357, 3033 }, { 370 }, { 376, 2991 } },\n    { 16460, 7677, 3323, 438, 5964, 447, 74, 7694, 7697, { 7700, 7708, 7716, 1719, 1726, 1734, 7723 }, { 7731, 7735, 3430, 5974, 3436, 5977, 7739 }, { 5889, 5897, 3770, 1800, 1806, 1810, 1815, 7743, 1827, 1837, 1845, 1854, 343 }, { 1863, 1867, 1871, 1875, 1806, 1879, 1883, 1887, 1891, 1895, 1899, 1903, 343 }, 0, 1, 344, 346, { 348, 6005, 3323 }, { 357, 7677 }, { 370, 5964 }, { 376, 5953, 438 } },\n    { 17078, 24, 2674, 2979, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 184, 187, 190, 193, 196, 199, 202 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37, 2674 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 17103, 5324, 17150, 15941, 17042, 17170, 17187, 1154, 1161, { 1168, 1178, 1188, 1198, 1208, 1218, 1228 }, { 1238, 1242, 1246, 1250, 1254, 1258, 1262 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, { 5163, 5168, 5173, 5178, 5183, 5188, 5193, 5198, 5203, 5208, 5214, 5220, 343 }, 0, 0, 344, 346, { 348, 17150 }, { 357, 5324 }, { 370, 17042 }, { 376, 15941 } },\n    { 17202, 9694, 1938, 438, 370, 447, 1687, 1949, 1955, { 1962, 1970, 1977, 1986, 1995, 2006, 2014 }, { 2022, 2025, 2028, 2031, 2034, 2037, 2040 }, { 17225, 2050, 2058, 2064, 2070, 2074, 2079, 2084, 2091, 2101, 2109, 2118, 343 }, { 17233, 2131, 17238, 2139, 2070, 2143, 2147, 2151, 2155, 2159, 2163, 2167, 343 }, 0, 1, 344, 346, { 348, 844, 1938 }, { 357, 1379, 9694 }, { 370 }, { 376, 438 } },\n    { 17243, 876, 3868, 2195, 56, 447, 74, 465, 468, { 2770, 2777, 2784, 2792, 2802, 2811, 2818 }, { 2827, 2831, 2835, 2839, 2843, 2847, 2851 }, { 2855, 2863, 2872, 2064, 2878, 2882, 2887, 2084, 2091, 2892, 2109, 2900, 343 }, { 2127, 2131, 2909, 2139, 2878, 2143, 2147, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 0, 344, 346, { 348, 2748, 3273, 3868 }, { 2728, 2728, 2921, 2935, 2955, 876 }, { 2755, 2755, 2970, 1409, 370, 56 }, { 2195, 2195, 2979, 2991, 438, 46 } },\n    { 17266, 17303, 2674, 2991, 1409, 17332, 457, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033, 17303 }, { 370, 1409 }, { 376, 2979, 2991 } },\n    { 5984, 876, 6005, 438, 370, 447, 74, 465, 468, { 3666, 3675, 3681, 3687, 3696, 3702, 3711 }, { 3718, 3723, 3728, 3733, 3738, 3743, 3748 }, { 3753, 3761, 3770, 3775, 3781, 3785, 3790, 3798, 3804, 3814, 1050, 3822, 343 }, { 3832, 3838, 3770, 3845, 3781, 3785, 3850, 3798, 3856, 1097, 1102, 3862, 343 }, 0, 0, 344, 346, { 888, 3868, 3273, 5524, 6005 }, { 357, 876, 3649 }, { 370 }, { 376, 438 } },\n    { 17078, 24, 2674, 2979, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 184, 187, 190, 193, 196, 199, 202 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37, 2674 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 17347, 17370, 888, 17382, 17393, 447, 457, 1154, 1161, { 1168, 1178, 1188, 1198, 1208, 1218, 1228 }, { 1238, 1242, 1246, 1250, 1254, 1258, 1262 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, 0, 0, 344, 346, { 348, 888 }, { 357, 17370 }, { 370, 17393 }, { 376, 17382 } },\n    { 1916, 1379, 1938, 438, 370, 447, 1414, 1949, 1955, { 1962, 1970, 1977, 1986, 1995, 2006, 2014 }, { 2022, 2025, 2028, 2031, 2034, 2037, 2040 }, { 2043, 2050, 2058, 2064, 2070, 2074, 2079, 2084, 2091, 2101, 2109, 2118, 343 }, { 2127, 2131, 2135, 2139, 2070, 2143, 2147, 2151, 2155, 2159, 2163, 2167, 343 }, 0, 1, 344, 346, { 348, 844, 1938 }, { 357, 1379 }, { 370 }, { 376, 438 } },\n    { 17401, 17425, 2674, 2195, 56, 447, 2763, 465, 468, { 2770, 2777, 2784, 2792, 2802, 2811, 2818 }, { 2827, 2831, 2835, 2839, 2843, 2847, 2851 }, { 2855, 2863, 2872, 2064, 2878, 2882, 2887, 2084, 2091, 2892, 2109, 2900, 343 }, { 2127, 2131, 2909, 2139, 2878, 2143, 2147, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 0, 344, 346, { 348, 2748, 888, 2674 }, { 2728, 2728, 2921, 2935, 2955, 17425 }, { 2755, 2755, 2970, 1409, 370, 56 }, { 2195, 2195, 2979, 2991, 438, 2685 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 5984, 876, 1938, 438, 370, 447, 74, 465, 468, { 3666, 3675, 3681, 3687, 3696, 3702, 3711 }, { 3718, 3723, 3728, 3733, 3738, 3743, 3748 }, { 3753, 3761, 3770, 3775, 3781, 3785, 3790, 3798, 3804, 3814, 1050, 3822, 343 }, { 3832, 3838, 3770, 3845, 3781, 3785, 3850, 3798, 3856, 1097, 1102, 3862, 343 }, 0, 1, 344, 346, { 888, 3868, 3273, 844, 1938 }, { 357, 876, 3649 }, { 370 }, { 376, 438 } },\n    { 17438, 24, 1676, 2991, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 184, 187, 190, 193, 196, 199, 202 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37, 1676 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2991 } },\n    { 17103, 5324, 17150, 15941, 17042, 17170, 17187, 1154, 1161, { 1168, 1178, 1188, 1198, 1208, 1218, 1228 }, { 1238, 1242, 1246, 1250, 1254, 1258, 1262 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, { 5163, 5168, 5173, 5178, 5183, 5188, 5193, 5198, 5203, 5208, 5214, 5220, 343 }, 0, 0, 344, 346, { 348, 17150 }, { 357, 5324 }, { 370, 17042 }, { 376, 15941 } },\n    { 17243, 876, 3868, 2195, 56, 447, 74, 3083, 3088, { 2770, 2777, 2784, 2792, 2802, 2811, 2818 }, { 2827, 2831, 2835, 2839, 2843, 2847, 2851 }, { 2855, 2863, 2872, 2064, 2878, 2882, 2887, 2084, 2091, 2892, 2109, 2900, 343 }, { 2127, 2131, 2909, 2139, 2878, 2143, 2147, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 0, 344, 346, { 348, 2748, 3273, 3868 }, { 2728, 2728, 2921, 2935, 2955, 876 }, { 2755, 2755, 2970, 1409, 370, 56 }, { 2195, 2195, 2979, 2991, 438, 46 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 3623, 3649, 2674, 438, 370, 447, 74, 465, 468, { 3666, 3675, 3681, 3687, 3696, 3702, 3711 }, { 3718, 3723, 3728, 3733, 3738, 3743, 3748 }, { 3753, 3761, 3770, 3775, 3781, 3785, 3790, 3798, 3804, 3814, 1050, 3822, 343 }, { 3832, 3838, 3770, 3845, 3781, 3785, 3850, 3798, 3856, 1097, 1102, 3862, 343 }, 0, 1, 344, 346, { 888, 3868, 3273, 2674 }, { 357, 876, 3649 }, { 370 }, { 376, 438 } },\n    { 17438, 24, 1676, 2991, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 184, 187, 190, 193, 196, 199, 202 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37, 1676 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2991 } },\n    { 5984, 876, 2674, 438, 370, 447, 74, 3083, 3088, { 2770, 2777, 2784, 2792, 2802, 2811, 2818 }, { 2827, 2831, 2835, 2839, 2843, 2847, 2851 }, { 2855, 2863, 2872, 2064, 2878, 2882, 2887, 2084, 2091, 2892, 2109, 2900, 343 }, { 2127, 2131, 2909, 2139, 2878, 2143, 2147, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 0, 344, 346, { 348, 2748, 2674 }, { 2728, 2728, 2921, 2935, 2955, 876 }, { 2755, 2755, 2970, 1409, 370 }, { 2195, 2195, 2979, 2991, 438, 376 } },\n    { 2999, 3033, 3055, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 11818 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 17438, 24, 1676, 2991, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 87, 98, 113, 130, 147, 160, 173 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37, 1676 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2991 } },\n    { 16727, 409, 5015, 2979, 56, 447, 457, 465, 468, { 2770, 2777, 2784, 2792, 2802, 2811, 2818 }, { 2827, 2831, 2835, 2839, 2843, 2847, 2851 }, { 2855, 2863, 2872, 2064, 2878, 2882, 2887, 2084, 2091, 2892, 2109, 2900, 343 }, { 2127, 2131, 2909, 2139, 2878, 2143, 2147, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 0, 344, 346, { 348, 2748, 5015 }, { 2728, 2728, 2921, 2935, 2955, 409 }, { 2755, 2755, 2970, 1409, 370, 56 }, { 2195, 2195, 2979, 2991, 438, 46 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 17078, 24, 2674, 2979, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 184, 187, 190, 193, 196, 199, 202 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37, 2674 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 17078, 24, 2674, 2979, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 87, 98, 113, 130, 147, 160, 173 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37, 2674 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 2999, 3033, 2674, 2979, 1409, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 2674 }, { 357, 3033 }, { 370, 1409 }, { 376, 2979, 1399 } },\n    { 17078, 24, 2674, 2979, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 87, 98, 113, 130, 147, 160, 173 }, { 17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343 }, { 17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343 }, 0, 4, 344, 346, { 348, 37, 2674 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 17078, 24, 2674, 2979, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 87, 98, 113, 130, 147, 160, 173 }, { 17459, 17483, 17492, 17501, 17627, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343 }, { 17459, 17483, 17492, 17501, 17627, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343 }, 0, 6, 344, 346, { 348, 37, 2674 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 17636, 17667, 2674, 2979, 2755, 447, 2763, 465, 468, { 2770, 2777, 2784, 2792, 2802, 2811, 2818 }, { 2827, 2831, 2835, 2839, 2843, 2847, 2851 }, { 2855, 2863, 2872, 2064, 2878, 2882, 2887, 2084, 2091, 2892, 2109, 2900, 343 }, { 2127, 2131, 2909, 2139, 2878, 2143, 2147, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 0, 344, 346, { 2674, 6005 }, { 2728, 2728, 2921, 2935, 2955, 17667 }, { 2755, 2755, 2970, 1409, 370 }, { 2979, 438 } },\n    { 2999, 3033, 2674, 2979, 370, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370 }, { 376, 2979, 1399 } },\n    { 17078, 24, 2674, 2979, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 87, 98, 113, 130, 147, 160, 173 }, { 17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343 }, { 17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343 }, 0, 6, 344, 346, { 348, 37, 2674 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 2171, 409, 10606, 2195, 56, 447, 457, 465, 468, { 2770, 2777, 2784, 2792, 2802, 2811, 2818 }, { 2827, 2831, 2835, 2839, 2843, 2847, 2851 }, { 2855, 2863, 2872, 2064, 2878, 2882, 2887, 2084, 2091, 2892, 2109, 2900, 343 }, { 2127, 2131, 2909, 2139, 2878, 2143, 2147, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 0, 344, 346, { 348, 2748, 37, 10606 }, { 2728, 2728, 2921, 2935, 2955, 409 }, { 2755, 2755, 2970, 1409, 370, 56 }, { 2195, 2195, 2979, 2991, 438, 46 } },\n    { 17048, 3033, 2674, 2991, 1409, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370, 1409 }, { 376, 2979, 1399, 2991 } },\n    { 17078, 24, 2674, 2979, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 184, 187, 190, 193, 196, 199, 202 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37, 2674 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 17401, 17425, 10606, 2195, 56, 447, 2763, 465, 468, { 2770, 2777, 2784, 2792, 2802, 2811, 2818 }, { 2827, 2831, 2835, 2839, 2843, 2847, 2851 }, { 2855, 2863, 2872, 2064, 2878, 2882, 2887, 2084, 2091, 2892, 2109, 2900, 343 }, { 2127, 2131, 2909, 2139, 2878, 2143, 2147, 2151, 2155, 2913, 2163, 2917, 343 }, 0, 0, 344, 346, { 348, 2748, 10606 }, { 2728, 2728, 2921, 2935, 2955, 17425 }, { 2755, 2755, 2970, 1409, 370, 56 }, { 2195, 2195, 2979, 2991, 438, 2685 } },\n    { 17048, 3033, 1676, 2991, 1409, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 1907, 1676 }, { 357, 3033 }, { 370, 1409 }, { 376, 2979, 1399, 2991 } },\n    { 17078, 24, 2674, 2979, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 184, 187, 190, 193, 196, 199, 202 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37, 2674 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 17078, 24, 2674, 2979, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 184, 187, 190, 193, 196, 199, 202 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37, 2674 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 17078, 24, 2674, 2979, 56, 63, 74, 81, 84, { 87, 98, 113, 130, 147, 160, 173 }, { 87, 98, 113, 130, 147, 160, 173 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, { 205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343 }, 0, 6, 344, 346, { 348, 37, 2674 }, { 357, 24 }, { 370, 56 }, { 376, 46, 2979 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 17686, 17721, 2674, 2979, 16935, 3066, 17744, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033, 17721 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 888, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 2999, 3033, 2674, 2979, 16935, 3066, 3071, 3083, 3088, { 3093, 3101, 3107, 3114, 3125, 3132, 3140 }, { 3148, 3152, 1871, 3156, 3161, 3165, 3169 }, { 3174, 3180, 3188, 1004, 3194, 3199, 3205, 3211, 3218, 1042, 3229, 3239, 343 }, { 3249, 1867, 1871, 3253, 3257, 1879, 1883, 3261, 1891, 3265, 1899, 3269, 343 }, 0, 1, 344, 346, { 348, 3273, 3055, 11818, 2674 }, { 357, 3033 }, { 370, 16935 }, { 376, 2979, 16922 } },\n    { 1112, 357, 348, 376, 370, 1136, 1146, 1154, 1161, { 1168, 1178, 1188, 1198, 1208, 1218, 1228 }, { 1238, 1242, 1246, 1250, 1254, 1258, 1262 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, { 1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343 }, 0, 0, 344, 346, { 348 }, { 357 }, { 370 }, { 376 } }\n};\n\nstatic const NumberFormatEntry number_format_entries[] =\n{\n    { 17757, 17760, 17757, 17760, 17757, 17760, 0, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 0, 0, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 0, 0, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 0, 0, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 2, 2, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 0, 0, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 0, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17796, 17770, 17774, 17779, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 17819, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 1, 0, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17829, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 0, 0, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17839, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17843, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17847, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 12, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 1, 1, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17850, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 0, 0, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 0, 0, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17852, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17856, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17859, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17863, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 0, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17865, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 0, 0, 1, 0, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 0, 0, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17847, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 0, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17869, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17873, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17877, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17881, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 5, 1, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17885, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 10412, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17888, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17847, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17892, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 2, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17896, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17899, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 0, 0, 1, 1, 1, 0, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17902, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 1, 0, 1, 1, 1, 0, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17910, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17847, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17914, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17917, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 2, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 17920, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 0, 3, 2, 2, 1, 0, 2, 2, { 5, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17924, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17927, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 0, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 9884, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 0, 17792, 17796, 17770, 17774, 17779, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17847, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 12, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17931, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17938, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17942, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17949, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17956, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17931, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17931, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17931, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 }, { 2, 2, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 17964, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 3, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17974, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17978, 17794, 17978, 17794, 17978, 17980, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 2, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17985, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17850, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17978, 17794, 17978, 17794, 17978, 17980, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 2, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17847, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 0, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 17988, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17998, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17850, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17789, 17787, 17789, 17787, 17789, 17850, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 0, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18002, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 3, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 18012, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17850, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 18015, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17978, 17794, 17978, 17794, 17978, 18017, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 2, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18022, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 4376, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17850, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 18032, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17835, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 8, 3, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18036, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17835, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 18046, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18049, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 1, 0, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 9884, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 18059, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18063, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 18073, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 12, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18076, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 1, 0, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17850, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18086, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 1, 0, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 18096, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 2, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18099, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 3, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17850, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17850, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18109, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 18119, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 1, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 18122, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 2, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18126, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 3, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 18136, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 17850, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 2, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18140, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 18150, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 0, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18154, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 11, 2, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 18164, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 12, 2, 1, 1, 1, 0, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17757, 17760, 17757, 17760, 17757, 17760, 18167, 17763, 17766, 17770, 17774, 17779, 17783, 17785, 1, 0, 1, 1, 3, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17787, 17794, 17787, 17794, 17787, 17794, 18177, 17792, 17766, 17770, 17774, 17779, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 18180, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 18184, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 18187, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 17850, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 0, 0, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } },\n    { 17794, 17787, 17794, 17787, 17794, 17787, 0, 17792, 17796, 17770, 17800, 17810, 17783, 17785, 9, 2, 1, 1, 1, 2, 2, 2, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 }, { 3, -1, -1, -1, -1 } }\n};\n\nstatic const CultureInfoEntry culture_entries[] =\n{\n    { 0x0001, 0x007F, 0x0401, -1, 18190, 18193, 18193, 18193, 18200, 18215, 18219, 18190, 0, { 16777216, 0, 0, 0, 0 }, 0, 0, { 1256, 20420, 10004, 720, ';' } },\n    { 0x0002, 0x007F, 0x0402, -1, 18223, 18226, 18226, 18226, 18236, 18255, 18259, 18223, 0, { 0, 0, 0, 0, 0 }, 1, 1, { 1251, 20420, 10007, 866, ';' } },\n    { 0x0003, 0x007F, 0x0403, -1, 18263, 18266, 18266, 18266, 18274, 18282, 18286, 18263, 0, { 0, 0, 0, 0, 0 }, 2, 2, { 1252, 500, 10000, 850, ';' } },\n    { 0x0004, 0x007F, 0x0000, -1, 18290, 18297, 18297, 18297, 18305, 18312, 18316, 18320, 0, { 0, 0, 0, 0, 0 }, 166, 166, { 936, 500, 10008, 936, ',' } },\n    { 0x0005, 0x007F, 0x0405, -1, 18323, 18326, 18326, 18326, 18332, 18342, 18346, 18323, 0, { 0, 0, 0, 0, 0 }, 4, 4, { 1250, 500, 10029, 852, ';' } },\n    { 0x0006, 0x007F, 0x0406, -1, 18350, 18353, 18353, 18353, 18360, 18366, 18370, 18350, 0, { 0, 0, 0, 0, 0 }, 5, 5, { 1252, 20277, 10000, 850, ';' } },\n    { 0x0007, 0x007F, 0x0407, -1, 18374, 18377, 18377, 18377, 18384, 18392, 18396, 18374, 0, { 0, 0, 0, 0, 0 }, 6, 6, { 1252, 20273, 10000, 850, ';' } },\n    { 0x0008, 0x007F, 0x0408, -1, 18400, 18403, 18403, 18403, 18409, 18426, 18430, 18400, 0, { 0, 0, 0, 0, 0 }, 7, 7, { 1253, 20273, 10006, 737, ';' } },\n    { 0x0009, 0x007F, 0x0409, -1, 18434, 18437, 18437, 18437, 18437, 18445, 18449, 18434, 0, { 0, 0, 0, 0, 0 }, 8, 8, { 1252, 37, 10000, 437, ',' } },\n    { 0x000A, 0x007F, 0x0C0A, -1, 18453, 18456, 18456, 18456, 18464, 18473, 18477, 18453, 0, { 0, 0, 0, 0, 0 }, 9, 9, { 1252, 20284, 10000, 850, ';' } },\n    { 0x000B, 0x007F, 0x040B, -1, 18481, 18484, 18484, 18484, 18492, 18498, 18502, 18481, 0, { 0, 0, 0, 0, 0 }, 10, 10, { 1252, 20278, 10000, 850, ';' } },\n    { 0x000C, 0x007F, 0x040C, -1, 5977, 18506, 18506, 18506, 18513, 18523, 18527, 5977, 0, { 0, 0, 0, 0, 0 }, 11, 11, { 1252, 20297, 10000, 850, ';' } },\n    { 0x000D, 0x007F, 0x040D, -1, 18531, 18534, 18534, 18534, 18541, 18552, 18556, 18531, 0, { 0, 0, 0, 0, 0 }, 12, 12, { 1255, 500, 10005, 862, ',' } },\n    { 0x000E, 0x007F, 0x040E, -1, 18560, 18563, 18563, 18563, 18573, 18580, 18584, 18560, 0, { 0, 0, 0, 0, 0 }, 13, 13, { 1250, 500, 10029, 852, ';' } },\n    { 0x000F, 0x007F, 0x040F, -1, 18588, 18591, 18591, 18591, 18601, 18611, 18615, 18588, 0, { 0, 0, 0, 0, 0 }, 14, 14, { 1252, 20871, 10079, 850, ';' } },\n    { 0x0010, 0x007F, 0x0410, -1, 18619, 18622, 18622, 18622, 18630, 18639, 18643, 18619, 0, { 0, 0, 0, 0, 0 }, 15, 15, { 1252, 20280, 10000, 850, ';' } },\n    { 0x0011, 0x007F, 0x0411, -1, 18647, 18650, 18650, 18650, 18659, 18669, 18673, 18647, 0, { 0, 0, 0, 0, 0 }, 16, 16, { 932, 20290, 10001, 932, ',' } },\n    { 0x0012, 0x007F, 0x0412, -1, 18677, 18680, 18680, 18680, 18687, 18697, 18701, 18677, 0, { 0, 0, 0, 0, 0 }, 17, 17, { 949, 20833, 10003, 949, ',' } },\n    { 0x0013, 0x007F, 0x0413, -1, 18705, 18708, 18708, 18708, 18714, 18725, 18729, 18705, 0, { 0, 0, 0, 0, 0 }, 18, 18, { 1252, 500, 10000, 850, ';' } },\n    { 0x0014, 0x007F, 0x0414, -1, 18733, 18736, 18736, 18736, 18746, 18752, 18756, 18733, 0, { 0, 0, 0, 0, 0 }, 19, 19, { 1252, 20277, 10000, 850, ';' } },\n    { 0x0015, 0x007F, 0x0415, -1, 18760, 18763, 18763, 18763, 18770, 18777, 18781, 18760, 0, { 0, 0, 0, 0, 0 }, 20, 20, { 1250, 20880, 10029, 852, ';' } },\n    { 0x0016, 0x007F, 0x0416, -1, 18785, 18788, 18788, 18788, 18799, 18810, 18814, 18785, 0, { 0, 0, 0, 0, 0 }, 21, 21, { 1252, 500, 10000, 850, ';' } },\n    { 0x0018, 0x007F, 0x0418, -1, 18818, 18821, 18821, 18821, 18830, 18839, 18843, 18818, 0, { 0, 0, 0, 0, 0 }, 22, 22, { 1250, 20880, 10029, 852, ';' } },\n    { 0x0019, 0x007F, 0x0419, -1, 18847, 18850, 18850, 18850, 18858, 18873, 18877, 18847, 0, { 0, 0, 0, 0, 0 }, 23, 23, { 1251, 20880, 10007, 866, ';' } },\n    { 0x001A, 0x007F, 0x041A, -1, 18881, 18884, 18884, 18884, 18893, 18902, 18906, 18881, 0, { 0, 0, 0, 0, 0 }, 24, 24, { 1250, 500, 10082, 852, ';' } },\n    { 0x001B, 0x007F, 0x041B, -1, 18910, 18913, 18913, 18913, 18920, 18931, 18935, 18910, 0, { 0, 0, 0, 0, 0 }, 25, 25, { 1250, 20880, 10029, 852, ';' } },\n    { 0x001C, 0x007F, 0x041C, -1, 18939, 18942, 18942, 18942, 18951, 18958, 18962, 18939, 0, { 0, 0, 0, 0, 0 }, 26, 26, { 1250, 20880, 10029, 852, ';' } },\n    { 0x001D, 0x007F, 0x041D, -1, 18966, 18969, 18969, 18969, 18977, 18985, 18989, 18966, 0, { 0, 0, 0, 0, 0 }, 27, 27, { 1252, 20278, 10000, 850, ';' } },\n    { 0x001E, 0x007F, 0x041E, -1, 18993, 18996, 18996, 18996, 19001, 19011, 19015, 18993, 0, { 0, 0, 0, 0, 0 }, 28, 28, { 874, 20838, 10021, 874, ',' } },\n    { 0x001F, 0x007F, 0x041F, -1, 19019, 19022, 19022, 19022, 19030, 19039, 19043, 19019, 0, { 0, 0, 0, 0, 0 }, 29, 29, { 1254, 20905, 10081, 857, ';' } },\n    { 0x0021, 0x007F, 0x0421, -1, 19047, 19050, 19050, 19050, 19061, 19078, 19082, 19047, 0, { 0, 0, 0, 0, 0 }, 30, 30, { 1252, 500, 10000, 850, ';' } },\n    { 0x0022, 0x007F, 0x0422, -1, 19086, 19089, 19089, 19089, 19099, 19120, 19124, 19086, 0, { 0, 0, 0, 0, 0 }, 31, 31, { 1251, 500, 10017, 866, ';' } },\n    { 0x0023, 0x007F, 0x0423, -1, 19128, 19131, 19131, 19131, 19142, 19161, 19165, 19128, 0, { 0, 0, 0, 0, 0 }, 32, 32, { 1251, 500, 10007, 866, ';' } },\n    { 0x0024, 0x007F, 0x0424, -1, 19169, 19172, 19172, 19172, 19182, 19196, 19200, 19169, 0, { 0, 0, 0, 0, 0 }, 33, 33, { 1250, 20880, 10029, 852, ';' } },\n    { 0x0025, 0x007F, 0x0425, -1, 19204, 19207, 19207, 19207, 19216, 19222, 19226, 19204, 0, { 0, 0, 0, 0, 0 }, 34, 34, { 1257, 500, 10029, 775, ';' } },\n    { 0x0026, 0x007F, 0x0426, -1, 19230, 19233, 19233, 19233, 19241, 19251, 19255, 19230, 0, { 0, 0, 0, 0, 0 }, 35, 35, { 1257, 500, 10029, 775, ';' } },\n    { 0x0027, 0x007F, 0x0427, -1, 19259, 19262, 19262, 19262, 19273, 19283, 19287, 19259, 0, { 0, 0, 0, 0, 0 }, 36, 36, { 1257, 500, 10029, 775, ';' } },\n    { 0x0029, 0x007F, 0x0429, -1, 19291, 19294, 19294, 19294, 19302, 19313, 19317, 19291, 0, { 0, 0, 0, 0, 0 }, 37, 37, { 1256, 20420, 10004, 720, ';' } },\n    { 0x002A, 0x007F, 0x042A, -1, 19321, 19324, 19324, 19324, 19335, 19350, 3165, 19321, 0, { 0, 0, 0, 0, 0 }, 38, 38, { 1258, 500, 10000, 1258, ',' } },\n    { 0x002B, 0x007F, 0x042B, -1, 19354, 19357, 19357, 19357, 19366, 19381, 19385, 19354, 0, { 0, 0, 0, 0, 0 }, 39, 39, { 0, 500, 2, 1, ',' } },\n    { 0x002D, 0x007F, 0x042D, -1, 19389, 19392, 19392, 19392, 19399, 19407, 19411, 19389, 0, { 0, 0, 0, 0, 0 }, 40, 40, { 1252, 500, 10000, 850, ';' } },\n    { 0x002F, 0x007F, 0x042F, -1, 19415, 19418, 19418, 19418, 19429, 19450, 19454, 19415, 0, { 0, 0, 0, 0, 0 }, 41, 41, { 1251, 500, 10007, 866, ';' } },\n    { 0x0036, 0x007F, 0x0436, -1, 19458, 19461, 19461, 19461, 19471, 19482, 19486, 19458, 0, { 0, 0, 0, 0, 0 }, 42, 42, { 1252, 500, 10000, 850, ',' } },\n    { 0x0037, 0x007F, 0x0437, -1, 19490, 19493, 19493, 19493, 19502, 19524, 19528, 19490, 0, { 0, 0, 0, 0, 0 }, 43, 43, { 0, 500, 2, 1, ';' } },\n    { 0x0038, 0x007F, 0x0438, -1, 19532, 19535, 19535, 19535, 19543, 19553, 19557, 19532, 0, { 0, 0, 0, 0, 0 }, 44, 44, { 1252, 20277, 10079, 850, ';' } },\n    { 0x0039, 0x007F, 0x0439, -1, 19561, 19564, 19564, 19564, 19570, 19586, 19590, 19561, 0, { 0, 0, 0, 0, 0 }, 45, 45, { 0, 500, 2, 1, ',' } },\n    { 0x0041, 0x007F, 0x0441, -1, 19594, 19597, 19597, 19597, 19605, 19615, 19619, 19594, 0, { 0, 0, 0, 0, 0 }, 46, 46, { 1252, 500, 10000, 437, ',' } },\n    { 0x0047, 0x007F, 0x0447, -1, 19623, 19626, 19626, 19626, 19635, 19657, 19661, 19623, 0, { 0, 0, 0, 0, 0 }, 47, 47, { 0, 500, 2, 1, ',' } },\n    { 0x0049, 0x007F, 0x0449, -1, 19665, 19668, 19668, 19668, 19674, 19690, 19694, 19665, 0, { 0, 0, 0, 0, 0 }, 48, 48, { 0, 500, 2, 1, ',' } },\n    { 0x004A, 0x007F, 0x044A, -1, 19698, 19701, 19701, 19701, 19708, 19727, 19731, 19698, 0, { 0, 0, 0, 0, 0 }, 49, 49, { 0, 500, 2, 1, ',' } },\n    { 0x004B, 0x007F, 0x044B, -1, 19735, 19738, 19738, 19738, 19746, 19762, 19766, 19735, 0, { 0, 0, 0, 0, 0 }, 50, 50, { 0, 500, 2, 1, ',' } },\n    { 0x004E, 0x007F, 0x044E, -1, 19770, 19773, 19773, 19773, 19781, 19797, 1871, 19770, 0, { 0, 0, 0, 0, 0 }, 51, 51, { 0, 500, 2, 1, ',' } },\n    { 0x0056, 0x007F, 0x0456, -1, 19801, 19804, 19804, 19804, 19813, 19820, 19824, 19801, 0, { 0, 0, 0, 0, 0 }, 52, 52, { 1252, 500, 10000, 850, ',' } },\n    { 0x0057, 0x007F, 0x0457, -1, 19828, 19832, 19832, 19832, 19840, 19859, 19828, 19561, 0, { 0, 0, 0, 0, 0 }, 53, 53, { 0, 500, 2, 1, ',' } },\n    { 0x0401, 0x0001, 0x0401, 174, 19863, 19869, 19869, 19869, 19891, 18215, 18219, 18190, 10998, { 16777216, 0, 0, 0, 0 }, 54, 54, { 1256, 20420, 10004, 720, ';' } },\n    { 0x0402, 0x0002, 0x0402, 19, 19940, 19946, 19946, 19946, 19967, 18255, 18259, 18223, 20005, { 0, 0, 0, 0, 0 }, 55, 55, { 1251, 20420, 10007, 866, ';' } },\n    { 0x0403, 0x0003, 0x0403, 61, 20008, 20014, 20014, 20014, 20030, 18282, 18286, 18263, 20048, { 0, 0, 0, 0, 0 }, 56, 56, { 1252, 500, 10000, 850, ';' } },\n    { 0x0404, 0x7C04, 0x0404, 207, 20051, 20057, 20057, 20057, 20074, 20090, 18316, 18320, 20094, { 0, 0, 0, 0, 0 }, 57, 57, { 950, 500, 10002, 950, ',' } },\n    { 0x0405, 0x0005, 0x0405, 49, 20097, 20103, 20103, 20103, 20126, 18342, 18346, 18323, 20156, { 0, 0, 0, 0, 0 }, 58, 58, { 1250, 500, 10029, 852, ';' } },\n    { 0x0406, 0x0006, 0x0406, 52, 20159, 20165, 20165, 20165, 20182, 18366, 18370, 18350, 20198, { 0, 0, 0, 0, 0 }, 59, 59, { 1252, 20277, 10000, 850, ';' } },\n    { 0x0407, 0x0007, 0x0407, 50, 20201, 20207, 20207, 20207, 20224, 18392, 18396, 18374, 4300, { 0, 0, 0, 0, 0 }, 60, 60, { 1252, 20273, 10000, 850, ';' } },\n    { 0x0408, 0x0008, 0x0408, 81, 20246, 20252, 20252, 20252, 20267, 18426, 18430, 18400, 20299, { 0, 0, 0, 0, 0 }, 61, 61, { 1253, 20273, 10006, 737, ';' } },\n    { 0x0409, 0x0009, 0x0409, 212, 20302, 20308, 20308, 20308, 20308, 18445, 18449, 18434, 20332, { 0, 0, 0, 0, 0 }, 62, 62, { 1252, 37, 10000, 437, ',' } },\n    { 0x040B, 0x000B, 0x040B, 63, 20335, 20341, 20341, 20341, 20359, 18498, 18502, 18481, 20373, { 0, 0, 0, 0, 0 }, 63, 63, { 1252, 20278, 10000, 850, ';' } },\n    { 0x040C, 0x000C, 0x040C, 68, 20376, 20382, 20382, 20382, 20398, 18523, 18527, 5977, 20417, { 0, 0, 0, 0, 0 }, 64, 64, { 1252, 20297, 10000, 850, ';' } },\n    { 0x040D, 0x000D, 0x040D, 92, 20420, 20426, 20426, 20426, 20442, 18552, 18556, 18531, 20466, { 0, 0, 0, 0, 0 }, 65, 65, { 1255, 500, 10005, 862, ',' } },\n    { 0x040E, 0x000E, 0x040E, 89, 20469, 20475, 20475, 20475, 20495, 18580, 18584, 18560, 20518, { 0, 0, 0, 0, 0 }, 66, 66, { 1250, 500, 10029, 852, ';' } },\n    { 0x040F, 0x000F, 0x040F, 97, 20521, 20527, 20527, 20527, 20547, 18611, 18615, 18588, 20567, { 0, 0, 0, 0, 0 }, 67, 67, { 1252, 20871, 10079, 850, ';' } },\n    { 0x0410, 0x0010, 0x0410, 98, 20570, 20576, 20576, 20576, 20592, 18639, 18643, 18619, 20610, { 0, 0, 0, 0, 0 }, 68, 68, { 1252, 20280, 10000, 850, ';' } },\n    { 0x0411, 0x0011, 0x0411, 101, 20613, 20619, 20619, 20619, 20636, 18669, 18673, 18647, 20655, { 0, 0, 0, 0, 0 }, 69, 69, { 932, 20290, 10001, 932, ',' } },\n    { 0x0412, 0x0012, 0x0412, 109, 20658, 20664, 20664, 20664, 20685, 18697, 18701, 18677, 20710, { 0, 0, 0, 0, 0 }, 70, 70, { 949, 20833, 10003, 949, ',' } },\n    { 0x0413, 0x0013, 0x0413, 149, 20713, 20719, 20719, 20719, 20739, 18725, 18729, 18705, 20762, { 0, 0, 0, 0, 0 }, 71, 71, { 1252, 500, 10000, 850, ';' } },\n    { 0x0414, 0x0014, 0x0414, 150, 20765, 20771, 20797, 20797, 20824, 18752, 20846, 20850, 20853, { 0, 0, 0, 0, 0 }, 72, 72, { 1252, 20277, 10000, 850, ';' } },\n    { 0x0415, 0x0015, 0x0415, 162, 20856, 20862, 20862, 20862, 20878, 18777, 18781, 18760, 20894, { 0, 0, 0, 0, 0 }, 73, 73, { 1250, 20880, 10029, 852, ';' } },\n    { 0x0416, 0x0016, 0x0416, 26, 20897, 20903, 20903, 20903, 20923, 18810, 18814, 18785, 20943, { 0, 0, 0, 0, 0 }, 74, 74, { 1252, 500, 10000, 850, ';' } },\n    { 0x0418, 0x0018, 0x0418, 171, 20946, 20952, 20952, 20952, 20971, 18839, 18843, 18818, 20991, { 0, 0, 0, 0, 0 }, 75, 75, { 1250, 20880, 10029, 852, ';' } },\n    { 0x0419, 0x0019, 0x0419, 172, 20994, 21000, 21000, 21000, 21017, 18873, 18877, 18847, 21047, { 0, 0, 0, 0, 0 }, 76, 76, { 1251, 20880, 10007, 866, ';' } },\n    { 0x041A, 0x001A, 0x041A, 88, 21050, 21056, 21056, 21056, 21075, 18902, 18906, 18881, 21095, { 0, 0, 0, 0, 0 }, 77, 77, { 1250, 500, 10082, 852, ';' } },\n    { 0x041B, 0x001B, 0x041B, 183, 21098, 21104, 21104, 21104, 21122, 18931, 18935, 18910, 21156, { 0, 0, 0, 0, 0 }, 78, 78, { 1250, 20880, 10029, 852, ';' } },\n    { 0x041C, 0x001C, 0x041C, 4, 21159, 21165, 21165, 21165, 21184, 18958, 18962, 18939, 21204, { 0, 0, 0, 0, 0 }, 79, 79, { 1250, 20880, 10029, 852, ';' } },\n    { 0x041D, 0x001D, 0x041D, 178, 21207, 21213, 21213, 21213, 21230, 18985, 18989, 18966, 21248, { 0, 0, 0, 0, 0 }, 80, 80, { 1252, 20278, 10000, 850, ';' } },\n    { 0x041E, 0x001E, 0x041E, 197, 21251, 21257, 21257, 21257, 21273, 19011, 19015, 18993, 21313, { 0, 0, 0, 0, 0 }, 81, 81, { 874, 20838, 10021, 874, ',' } },\n    { 0x041F, 0x001F, 0x041F, 204, 21316, 21322, 21322, 21322, 21339, 19039, 19043, 19019, 21359, { 0, 0, 0, 0, 0 }, 82, 82, { 1254, 20905, 10081, 857, ';' } },\n    { 0x0421, 0x0021, 0x0421, 90, 21362, 21368, 21368, 21368, 21391, 19078, 19082, 19047, 21420, { 0, 0, 0, 0, 0 }, 83, 83, { 1252, 500, 10000, 850, ';' } },\n    { 0x0422, 0x0022, 0x0422, 209, 21423, 21429, 21429, 21429, 21449, 19120, 19124, 19086, 21487, { 0, 0, 0, 0, 0 }, 84, 84, { 1251, 500, 10017, 866, ';' } },\n    { 0x0423, 0x0023, 0x0423, 30, 21490, 21496, 21496, 21496, 21517, 19161, 19165, 19128, 21555, { 0, 0, 0, 0, 0 }, 85, 85, { 1251, 500, 10007, 866, ';' } },\n    { 0x0424, 0x0024, 0x0424, 181, 21558, 21564, 21564, 21564, 21585, 19196, 19200, 19169, 21611, { 0, 0, 0, 0, 0 }, 86, 86, { 1250, 20880, 10029, 852, ';' } },\n    { 0x0425, 0x0025, 0x0425, 57, 21614, 21620, 21620, 21620, 21639, 19222, 19226, 19204, 21653, { 0, 0, 0, 0, 0 }, 87, 87, { 1257, 500, 10029, 775, ';' } },\n    { 0x0426, 0x0026, 0x0426, 121, 21656, 21662, 21662, 21662, 21679, 19251, 19255, 19230, 21699, { 0, 0, 0, 0, 0 }, 88, 88, { 1257, 500, 10029, 775, ';' } },\n    { 0x0427, 0x0027, 0x0427, 119, 21702, 21708, 21708, 21708, 21731, 19283, 19287, 19259, 21751, { 0, 0, 0, 0, 0 }, 89, 89, { 1257, 500, 10029, 775, ';' } },\n    { 0x0429, 0x0029, 0x0429, 96, 21754, 21760, 21760, 21760, 21775, 19313, 19317, 19291, 21799, { 0, 0, 0, 0, 0 }, 90, 90, { 1256, 20420, 10004, 720, ';' } },\n    { 0x042A, 0x002A, 0x042A, 220, 21802, 21808, 21808, 21808, 21829, 19350, 3165, 19321, 21857, { 0, 0, 0, 0, 0 }, 91, 91, { 1258, 500, 10000, 1258, ',' } },\n    { 0x042B, 0x002B, 0x042B, 5, 21860, 21866, 21866, 21866, 21885, 19381, 19385, 19354, 465, { 0, 0, 0, 0, 0 }, 92, 92, { 0, 500, 2, 1, ',' } },\n    { 0x042D, 0x002D, 0x042D, 61, 21950, 21956, 21956, 21956, 21971, 19407, 19411, 19389, 20048, { 0, 0, 0, 0, 0 }, 93, 93, { 1252, 500, 10000, 850, ';' } },\n    { 0x042F, 0x002F, 0x042F, 128, 21990, 21996, 21996, 21996, 22019, 19450, 19454, 19415, 22063, { 0, 0, 0, 0, 0 }, 94, 94, { 1251, 500, 10007, 866, ';' } },\n    { 0x0436, 0x0036, 0x0436, 227, 22066, 22072, 22072, 22072, 22097, 19482, 19486, 19458, 22122, { 0, 0, 0, 0, 0 }, 95, 95, { 1252, 500, 10000, 850, ',' } },\n    { 0x0437, 0x0037, 0x0437, 72, 22125, 22131, 22131, 22131, 22150, 19524, 19528, 19490, 22205, { 0, 0, 0, 0, 0 }, 96, 96, { 0, 500, 2, 1, ';' } },\n    { 0x0438, 0x0038, 0x0438, 67, 22208, 22214, 22214, 22214, 22238, 19553, 19557, 19532, 22259, { 0, 0, 0, 0, 0 }, 97, 97, { 1252, 20277, 10079, 850, ';' } },\n    { 0x0439, 0x0039, 0x0439, 93, 22262, 22268, 22268, 22268, 22282, 19586, 19590, 19561, 22313, { 0, 0, 0, 0, 0 }, 98, 98, { 0, 500, 2, 1, ',' } },\n    { 0x0441, 0x0041, 0x0441, 102, 22316, 22322, 22322, 22322, 22338, 19615, 19619, 19594, 22356, { 0, 0, 0, 0, 0 }, 99, 99, { 1252, 500, 10000, 437, ',' } },\n    { 0x0447, 0x0047, 0x0447, 93, 22359, 22365, 22365, 22365, 22382, 19657, 19661, 19623, 22313, { 0, 0, 0, 0, 0 }, 100, 100, { 0, 500, 2, 1, ',' } },\n    { 0x0449, 0x0049, 0x0449, 93, 22419, 22425, 22425, 22425, 22439, 19690, 19694, 19665, 22313, { 0, 0, 0, 0, 0 }, 101, 101, { 0, 500, 2, 1, ',' } },\n    { 0x044A, 0x004A, 0x044A, 93, 22479, 22485, 22485, 22485, 22500, 19727, 19731, 19698, 22313, { 0, 0, 0, 0, 0 }, 102, 102, { 0, 500, 2, 1, ',' } },\n    { 0x044B, 0x004B, 0x044B, 93, 22547, 22553, 22553, 22553, 22569, 19762, 19766, 19735, 22313, { 0, 0, 0, 0, 0 }, 103, 103, { 0, 500, 2, 1, ',' } },\n    { 0x044E, 0x004E, 0x044E, 93, 22600, 22606, 22606, 22606, 22622, 19797, 1871, 19770, 22313, { 0, 0, 0, 0, 0 }, 104, 104, { 0, 500, 2, 1, ',' } },\n    { 0x0456, 0x0056, 0x0456, 61, 22653, 22659, 22659, 22659, 22676, 19820, 19824, 19801, 20048, { 0, 0, 0, 0, 0 }, 105, 105, { 1252, 500, 10000, 850, ',' } },\n    { 0x0457, 0x0057, 0x0457, 93, 22693, 22700, 22700, 22700, 22716, 19859, 19828, 19828, 22313, { 0, 0, 0, 0, 0 }, 106, 106, { 0, 500, 2, 1, ',' } },\n    { 0x0801, 0x0001, 0x0801, 95, 22750, 22756, 22756, 22756, 22770, 22800, 18219, 18190, 22804, { 2, 1, 0, 0, 0 }, 107, 107, { 1256, 20420, 10004, 720, ';' } },\n    { 0x0804, 0x0004, 0x0804, 42, 22807, 22813, 22813, 22813, 22829, 18312, 18316, 18320, 11080, { 0, 0, 0, 0, 0 }, 108, 108, { 936, 500, 10008, 936, ',' } },\n    { 0x0807, 0x0007, 0x0807, 37, 22845, 22851, 22851, 22851, 22872, 22890, 18396, 18374, 11001, { 0, 0, 0, 0, 0 }, 109, 109, { 1252, 20273, 10000, 850, ';' } },\n    { 0x0809, 0x0009, 0x0809, 70, 22894, 22900, 22900, 22900, 22900, 22925, 18449, 18434, 22929, { 0, 0, 0, 0, 0 }, 110, 110, { 1252, 20285, 10000, 850, ',' } },\n    { 0x080A, 0x000A, 0x080A, 141, 22932, 22938, 22938, 22938, 22955, 22974, 18477, 18453, 22978, { 0, 0, 0, 0, 0 }, 111, 111, { 1252, 20284, 10000, 850, ',' } },\n    { 0x080C, 0x000C, 0x080C, 17, 22981, 22987, 22987, 22987, 23004, 23025, 18527, 5977, 23029, { 0, 0, 0, 0, 0 }, 112, 112, { 1252, 20297, 10000, 850, ';' } },\n    { 0x0810, 0x0010, 0x0810, 37, 23032, 23038, 23038, 23038, 23060, 23080, 18643, 18619, 11001, { 0, 0, 0, 0, 0 }, 113, 113, { 1252, 500, 10000, 850, ';' } },\n    { 0x0813, 0x0013, 0x0813, 17, 23084, 23090, 23090, 23090, 23106, 23127, 18729, 18705, 23029, { 0, 0, 0, 0, 0 }, 114, 114, { 1252, 500, 10000, 850, ';' } },\n    { 0x0814, 0x0014, 0x0814, 150, 23131, 23137, 23137, 23137, 23164, 23186, 23190, 23194, 20853, { 0, 0, 0, 0, 0 }, 115, 115, { 1252, 20277, 10000, 850, ';' } },\n    { 0x0816, 0x0016, 0x0816, 166, 23197, 23203, 23203, 23203, 23225, 23247, 18814, 18785, 23251, { 0, 0, 0, 0, 0 }, 116, 116, { 1252, 500, 10000, 850, ';' } },\n    { 0x081D, 0x001D, 0x081D, 63, 23254, 23260, 23260, 23260, 23278, 23296, 18989, 18966, 20373, { 0, 0, 0, 0, 0 }, 117, 117, { 1252, 20278, 10000, 850, ';' } },\n    { 0x0C01, 0x0001, 0x0C01, 58, 23300, 23306, 23306, 23306, 23321, 23345, 18219, 18190, 23349, { 16777216, 0, 0, 0, 0 }, 118, 118, { 1256, 20420, 10004, 720, ';' } },\n    { 0x0C04, 0x7C04, 0x0C04, 85, 23352, 23358, 23358, 23358, 23392, 23429, 18316, 18320, 23433, { 0, 0, 0, 0, 0 }, 119, 119, { 950, 500, 10002, 950, ',' } },\n    { 0x0C07, 0x0007, 0x0C07, 10, 23436, 23442, 23442, 23442, 23459, 23481, 18396, 18374, 23485, { 0, 0, 0, 0, 0 }, 120, 120, { 1252, 20273, 10000, 850, ';' } },\n    { 0x0C09, 0x0009, 0x0C09, 11, 23488, 23494, 23494, 23494, 23494, 23514, 18449, 18434, 23518, { 0, 0, 0, 0, 0 }, 121, 121, { 1252, 500, 10000, 850, ',' } },\n    { 0x0C0A, 0x000A, 0x0C0A, 61, 23521, 23527, 23527, 23527, 23543, 23562, 18477, 18453, 20048, { 0, 0, 0, 0, 0 }, 122, 122, { 1252, 20284, 10000, 850, ';' } },\n    { 0x0C0C, 0x000C, 0x0C0C, 32, 23566, 23572, 23572, 23572, 23588, 23607, 18527, 5977, 23611, { 0, 0, 0, 0, 0 }, 123, 123, { 1252, 20297, 10000, 850, ';' } },\n    { 0x1001, 0x0001, 0x1001, 122, 23614, 23620, 23620, 23620, 23635, 23663, 18219, 18190, 23667, { 16777216, 0, 0, 0, 0 }, 124, 124, { 1256, 20420, 10004, 720, ';' } },\n    { 0x1004, 0x0004, 0x1004, 179, 23670, 23676, 23676, 23676, 23696, 23715, 18316, 18320, 23719, { 0, 0, 0, 0, 0 }, 125, 125, { 936, 500, 10008, 936, ',' } },\n    { 0x1007, 0x0007, 0x1007, 120, 23722, 23728, 23728, 23728, 23748, 23768, 18396, 18374, 23772, { 0, 0, 0, 0, 0 }, 126, 126, { 1252, 20273, 10000, 850, ';' } },\n    { 0x1009, 0x0009, 0x1009, 32, 23775, 23781, 23781, 23781, 23781, 23798, 18449, 18434, 23611, { 0, 0, 0, 0, 0 }, 127, 127, { 1252, 37, 10000, 850, ',' } },\n    { 0x100A, 0x000A, 0x100A, 82, 23802, 23808, 23808, 23808, 23828, 23849, 18477, 18453, 23853, { 0, 0, 0, 0, 0 }, 128, 128, { 1252, 20284, 10000, 850, ',' } },\n    { 0x100C, 0x000C, 0x100C, 37, 23856, 23862, 23862, 23862, 23883, 23902, 18527, 5977, 11001, { 0, 0, 0, 0, 0 }, 129, 129, { 1252, 20297, 10000, 850, ';' } },\n    { 0x1401, 0x0001, 0x1401, 55, 23906, 23912, 23912, 23912, 23929, 23961, 18219, 18190, 23965, { 16777216, 0, 0, 0, 0 }, 130, 130, { 1256, 20420, 10004, 720, ';' } },\n    { 0x1404, 0x0004, 0x1404, 132, 23968, 23974, 23974, 23974, 24003, 24040, 18316, 18320, 24044, { 0, 0, 0, 0, 0 }, 131, 131, { 950, 500, 10002, 950, ',' } },\n    { 0x1409, 0x0009, 0x1409, 154, 24047, 24053, 24053, 24053, 24053, 24075, 18449, 18434, 24079, { 0, 0, 0, 0, 0 }, 132, 132, { 1252, 500, 10000, 850, ',' } },\n    { 0x140A, 0x000A, 0x140A, 44, 24082, 24088, 24088, 24088, 24109, 24131, 18477, 18453, 24135, { 0, 0, 0, 0, 0 }, 133, 133, { 1252, 20284, 10000, 850, ',' } },\n    { 0x140C, 0x000C, 0x140C, 120, 24138, 24144, 24144, 24144, 24164, 24187, 18527, 5977, 23772, { 0, 0, 0, 0, 0 }, 134, 134, { 1252, 20297, 10000, 850, ';' } },\n    { 0x1801, 0x0001, 0x1801, 123, 24191, 24197, 24197, 24197, 24214, 24244, 18219, 18190, 24248, { 16777216, 0, 0, 0, 0 }, 135, 135, { 1256, 20420, 10004, 720, ';' } },\n    { 0x1809, 0x0009, 0x1809, 91, 24251, 24257, 24257, 24257, 24257, 24275, 18449, 18434, 24279, { 0, 0, 0, 0, 0 }, 136, 136, { 1252, 500, 10000, 850, ',' } },\n    { 0x180A, 0x000A, 0x180A, 156, 24282, 24288, 24288, 24288, 24305, 24324, 18477, 18453, 24328, { 0, 0, 0, 0, 0 }, 137, 137, { 1252, 20284, 10000, 850, ',' } },\n    { 0x1C01, 0x0001, 0x1C01, 202, 24331, 24337, 24337, 24337, 24354, 24380, 18219, 18190, 24384, { 16777216, 0, 0, 0, 0 }, 138, 138, { 1256, 20420, 10004, 720, ';' } },\n    { 0x1C09, 0x0009, 0x1C09, 227, 24387, 24393, 24393, 24393, 24393, 24416, 18449, 18434, 22122, { 0, 0, 0, 0, 0 }, 139, 139, { 1252, 500, 10000, 437, ',' } },\n    { 0x1C0A, 0x000A, 0x1C0A, 54, 24420, 24426, 24426, 24426, 24455, 24488, 18477, 18453, 24492, { 0, 0, 0, 0, 0 }, 140, 140, { 1252, 20284, 10000, 850, ',' } },\n    { 0x2001, 0x0001, 0x2001, 155, 24495, 24501, 24501, 24501, 24515, 24541, 18219, 18190, 24545, { 16777216, 0, 0, 0, 0 }, 141, 141, { 1256, 20420, 10004, 720, ';' } },\n    { 0x200A, 0x000A, 0x200A, 217, 24548, 24554, 24554, 24554, 24574, 24595, 18477, 18453, 24599, { 0, 0, 0, 0, 0 }, 142, 142, { 1252, 20284, 10000, 850, ',' } },\n    { 0x2401, 0x0001, 0x2401, 224, 24602, 24608, 24608, 24608, 24623, 24651, 18219, 18190, 24655, { 16777216, 0, 0, 0, 0 }, 143, 143, { 1256, 20420, 10004, 720, ';' } },\n    { 0x240A, 0x000A, 0x240A, 43, 24658, 24664, 24664, 24664, 24683, 24703, 18477, 18453, 24707, { 0, 0, 0, 0, 0 }, 144, 144, { 1252, 20284, 10000, 850, ',' } },\n    { 0x2801, 0x0001, 0x2801, 191, 24710, 24716, 24716, 24716, 24731, 24759, 18219, 18190, 24763, { 16777216, 0, 0, 0, 0 }, 145, 145, { 1256, 20420, 10004, 720, ';' } },\n    { 0x280A, 0x000A, 0x280A, 157, 24766, 24772, 24772, 24772, 24787, 24804, 18477, 18453, 24808, { 0, 0, 0, 0, 0 }, 146, 146, { 1252, 20284, 10000, 850, ',' } },\n    { 0x2C01, 0x0001, 0x2C01, 100, 24811, 24817, 24817, 24817, 24833, 24863, 18219, 18190, 24867, { 16777216, 0, 0, 0, 0 }, 147, 147, { 1256, 20420, 10004, 720, ';' } },\n    { 0x2C09, 0x0009, 0x2C09, 205, 24870, 24876, 24876, 24876, 24876, 24906, 18449, 18434, 24910, { 0, 0, 0, 0, 0 }, 148, 148, { 1252, 500, 10000, 850, ';' } },\n    { 0x2C0A, 0x000A, 0x2C0A, 8, 24913, 24919, 24919, 24919, 24939, 24960, 18477, 18453, 24964, { 0, 0, 0, 0, 0 }, 149, 149, { 1252, 20284, 10000, 850, ',' } },\n    { 0x3001, 0x0001, 0x3001, 114, 24967, 24973, 24973, 24973, 24990, 25018, 18219, 18190, 25022, { 16777216, 0, 0, 0, 0 }, 150, 150, { 1256, 20420, 10004, 720, ';' } },\n    { 0x3009, 0x0009, 0x3009, 229, 25025, 25031, 25031, 25031, 25031, 25050, 18449, 18434, 25054, { 0, 0, 0, 0, 0 }, 151, 151, { 1252, 500, 10000, 437, ',' } },\n    { 0x300A, 0x000A, 0x300A, 56, 25057, 25063, 25063, 25063, 25081, 25100, 18477, 18453, 25104, { 0, 0, 0, 0, 0 }, 152, 152, { 1252, 20284, 10000, 850, ',' } },\n    { 0x3401, 0x0001, 0x3401, 110, 25107, 25113, 25113, 25113, 25129, 25159, 18219, 18190, 25163, { 16777216, 0, 0, 0, 0 }, 153, 153, { 1256, 20420, 10004, 720, ';' } },\n    { 0x3409, 0x0009, 0x3409, 160, 25166, 25172, 25172, 25172, 25172, 25194, 18449, 18434, 25198, { 0, 0, 0, 0, 0 }, 154, 154, { 1252, 500, 10000, 437, ',' } },\n    { 0x340A, 0x000A, 0x340A, 40, 25201, 25207, 25207, 25207, 25223, 25240, 18477, 18453, 25244, { 0, 0, 0, 0, 0 }, 155, 155, { 1252, 20284, 10000, 850, ',' } },\n    { 0x3801, 0x0001, 0x3801, 0, 25247, 25253, 25253, 25253, 25283, 25347, 18219, 18190, 25351, { 16777216, 0, 0, 0, 0 }, 156, 156, { 1256, 20420, 10004, 720, ';' } },\n    { 0x380A, 0x000A, 0x380A, 213, 25354, 25360, 25360, 25360, 25378, 25397, 18477, 18453, 25401, { 0, 0, 0, 0, 0 }, 157, 157, { 1252, 20284, 10000, 850, ',' } },\n    { 0x3C01, 0x0001, 0x3C01, 20, 25404, 25410, 25410, 25410, 25427, 25459, 18219, 18190, 25463, { 16777216, 0, 0, 0, 0 }, 158, 158, { 1256, 20420, 10004, 720, ';' } },\n    { 0x3C0A, 0x000A, 0x3C0A, 168, 25466, 25472, 25472, 25472, 25491, 25511, 18477, 18453, 25515, { 0, 0, 0, 0, 0 }, 159, 159, { 1252, 20284, 10000, 850, ',' } },\n    { 0x4001, 0x0001, 0x4001, 169, 25518, 25524, 25524, 25524, 25539, 25563, 18219, 18190, 25567, { 16777216, 0, 0, 0, 0 }, 160, 160, { 1256, 20420, 10004, 720, ';' } },\n    { 0x400A, 0x000A, 0x400A, 25, 25570, 25576, 25576, 25576, 25594, 25613, 18477, 18453, 25617, { 0, 0, 0, 0, 0 }, 161, 161, { 1252, 20284, 10000, 850, ',' } },\n    { 0x440A, 0x000A, 0x440A, 190, 25620, 25626, 25626, 25626, 25648, 25671, 18477, 18453, 25675, { 0, 0, 0, 0, 0 }, 162, 162, { 1252, 20284, 10000, 850, ',' } },\n    { 0x480A, 0x000A, 0x480A, 87, 25678, 25684, 25684, 25684, 25703, 25723, 18477, 18453, 25727, { 0, 0, 0, 0, 0 }, 163, 163, { 1252, 20284, 10000, 850, ',' } },\n    { 0x4C0A, 0x000A, 0x4C0A, 148, 25730, 25736, 25736, 25736, 25756, 25777, 18477, 18453, 25781, { 0, 0, 0, 0, 0 }, 164, 164, { 1252, 20284, 10000, 850, ',' } },\n    { 0x500A, 0x000A, 0x500A, 165, 25784, 25790, 25790, 25790, 25812, 25835, 18477, 18453, 25839, { 0, 0, 0, 0, 0 }, 165, 165, { 1252, 20284, 10000, 850, ',' } },\n    { 0x7C04, 0x007F, 0x0000, -1, 25842, 20057, 18297, 18297, 18305, 20090, 18316, 18320, 0, { 0, 0, 0, 0, 0 }, 166, 166, { 950, 500, 10002, 950, ',' } }\n};\n\nstatic const CultureInfoNameEntry culture_name_entries[] =\n{\n    { 19458, 42 },\n    { 25849, 95 },\n    { 18190, 0 },\n    { 25855, 156 },\n    { 25861, 158 },\n    { 25867, 130 },\n    { 25873, 118 },\n    { 25879, 107 },\n    { 25885, 147 },\n    { 25891, 153 },\n    { 25897, 150 },\n    { 25903, 124 },\n    { 25909, 135 },\n    { 25915, 141 },\n    { 25921, 160 },\n    { 25927, 54 },\n    { 25933, 145 },\n    { 25939, 138 },\n    { 25945, 143 },\n    { 19128, 32 },\n    { 25951, 85 },\n    { 18223, 1 },\n    { 25957, 55 },\n    { 18263, 2 },\n    { 25963, 56 },\n    { 18323, 4 },\n    { 25969, 58 },\n    { 18350, 5 },\n    { 25975, 59 },\n    { 18374, 6 },\n    { 25981, 120 },\n    { 25987, 109 },\n    { 25993, 60 },\n    { 25999, 126 },\n    { 18400, 7 },\n    { 26005, 61 },\n    { 18434, 8 },\n    { 26011, 121 },\n    { 26017, 127 },\n    { 26023, 110 },\n    { 26029, 136 },\n    { 26035, 132 },\n    { 26041, 154 },\n    { 26047, 148 },\n    { 26053, 62 },\n    { 26059, 139 },\n    { 26065, 151 },\n    { 18453, 9 },\n    { 26071, 149 },\n    { 26077, 161 },\n    { 26083, 155 },\n    { 26089, 144 },\n    { 26095, 133 },\n    { 26101, 140 },\n    { 26107, 152 },\n    { 26113, 122 },\n    { 26119, 128 },\n    { 26125, 163 },\n    { 26131, 111 },\n    { 26137, 164 },\n    { 26143, 137 },\n    { 26149, 146 },\n    { 26155, 165 },\n    { 26161, 159 },\n    { 26167, 162 },\n    { 26173, 157 },\n    { 26179, 142 },\n    { 19204, 34 },\n    { 26185, 87 },\n    { 19389, 40 },\n    { 26191, 93 },\n    { 19291, 37 },\n    { 26197, 90 },\n    { 18481, 10 },\n    { 26203, 63 },\n    { 19532, 44 },\n    { 26209, 97 },\n    { 5977, 11 },\n    { 26215, 112 },\n    { 26221, 123 },\n    { 26227, 129 },\n    { 26233, 64 },\n    { 26239, 134 },\n    { 19801, 52 },\n    { 26245, 105 },\n    { 19623, 47 },\n    { 26251, 100 },\n    { 18531, 12 },\n    { 26257, 65 },\n    { 19561, 45 },\n    { 26263, 98 },\n    { 18881, 24 },\n    { 26269, 77 },\n    { 18560, 13 },\n    { 26275, 66 },\n    { 19354, 39 },\n    { 26281, 92 },\n    { 19047, 30 },\n    { 26287, 83 },\n    { 18588, 14 },\n    { 26293, 67 },\n    { 18619, 15 },\n    { 26299, 113 },\n    { 26305, 68 },\n    { 18647, 16 },\n    { 26311, 69 },\n    { 19490, 43 },\n    { 26317, 96 },\n    { 19735, 50 },\n    { 26323, 103 },\n    { 18677, 17 },\n    { 26329, 70 },\n    { 19828, 53 },\n    { 26335, 106 },\n    { 19259, 36 },\n    { 26342, 89 },\n    { 19230, 35 },\n    { 26348, 88 },\n    { 19415, 41 },\n    { 26354, 94 },\n    { 19770, 51 },\n    { 26360, 104 },\n    { 26366, 72 },\n    { 18705, 18 },\n    { 26372, 114 },\n    { 26378, 71 },\n    { 26384, 115 },\n    { 18733, 19 },\n    { 18760, 20 },\n    { 26390, 73 },\n    { 18785, 21 },\n    { 26396, 74 },\n    { 26402, 116 },\n    { 18818, 22 },\n    { 26408, 75 },\n    { 18847, 23 },\n    { 26414, 76 },\n    { 18910, 25 },\n    { 26420, 78 },\n    { 19169, 33 },\n    { 26426, 86 },\n    { 18939, 26 },\n    { 26432, 79 },\n    { 18966, 27 },\n    { 26438, 117 },\n    { 26444, 80 },\n    { 19594, 46 },\n    { 26450, 99 },\n    { 19665, 48 },\n    { 26456, 101 },\n    { 19698, 49 },\n    { 26462, 102 },\n    { 18993, 28 },\n    { 26468, 81 },\n    { 19019, 29 },\n    { 26474, 82 },\n    { 19086, 31 },\n    { 26480, 84 },\n    { 19321, 38 },\n    { 26486, 91 },\n    { 26492, 3 },\n    { 26499, 166 },\n    { 26506, 108 },\n    { 26512, 119 },\n    { 26518, 131 },\n    { 26524, 125 },\n    { 26530, 57 }\n};\n\nstatic const RegionInfoEntry region_entries[] =\n{\n    { 0, 0, 25351, 343, 343, 26536, 343, 26557, 26561 },\n    { 0, 1, 26589, 343, 343, 26592, 343, 26604, 26608 },\n    { 0, 2, 26616, 343, 343, 26619, 343, 26639, 26643 },\n    { 0, 3, 26665, 343, 343, 26668, 343, 26639, 26643 },\n    { 0, 4, 21204, 343, 343, 26677, 343, 26685, 26689 },\n    { 0, 5, 465, 343, 343, 26702, 343, 26710, 26714 },\n    { 0, 6, 26728, 343, 343, 26731, 343, 26752, 26756 },\n    { 0, 7, 26785, 343, 343, 26788, 343, 26795, 26799 },\n    { 0, 8, 24964, 343, 343, 26814, 343, 24759, 26824 },\n    { 0, 9, 26839, 343, 343, 26842, 343, 26857, 26861 },\n    { 0, 10, 23485, 343, 343, 26871, 343, 26879, 26883 },\n    { 0, 11, 23518, 343, 343, 26888, 343, 26898, 26902 },\n    { 0, 12, 26920, 343, 343, 26923, 343, 26929, 26933 },\n    { 0, 13, 26948, 343, 343, 26951, 343, 26962, 26966 },\n    { 0, 14, 26986, 343, 343, 26989, 343, 27012, 27016 },\n    { 0, 15, 27052, 343, 343, 27055, 343, 27064, 27068 },\n    { 0, 16, 27084, 343, 343, 27087, 343, 27098, 27102 },\n    { 0, 17, 23029, 343, 343, 27118, 343, 26879, 26883 },\n    { 0, 18, 27126, 343, 343, 27129, 343, 27142, 27146 },\n    { 0, 19, 20005, 343, 343, 27162, 343, 27171, 27175 },\n    { 0, 20, 25463, 343, 343, 27193, 343, 27201, 27205 },\n    { 0, 21, 27220, 343, 343, 27223, 343, 27231, 27235 },\n    { 0, 22, 27249, 343, 343, 27252, 343, 27142, 27146 },\n    { 0, 23, 27258, 343, 343, 27261, 343, 27269, 27273 },\n    { 0, 24, 27289, 343, 343, 27292, 343, 27299, 27303 },\n    { 0, 25, 25617, 343, 343, 27317, 343, 27325, 27329 },\n    { 0, 26, 20943, 343, 343, 27339, 343, 27346, 27350 },\n    { 0, 27, 27365, 343, 343, 27368, 343, 27376, 27380 },\n    { 0, 28, 27396, 343, 343, 27399, 343, 27413, 27417 },\n    { 0, 29, 27433, 343, 343, 27436, 343, 27445, 27449 },\n    { 0, 30, 21555, 343, 343, 27464, 343, 27472, 27476 },\n    { 0, 31, 27494, 343, 343, 27497, 343, 27504, 27508 },\n    { 0, 32, 23611, 343, 343, 27522, 343, 27529, 27533 },\n    { 0, 33, 27549, 343, 343, 27552, 343, 26898, 26902 },\n    { 0, 34, 27566, 343, 343, 27569, 343, 27602, 27606 },\n    { 0, 35, 27632, 343, 343, 27635, 343, 27660, 27664 },\n    { 0, 36, 27679, 343, 343, 27682, 343, 27660, 27664 },\n    { 0, 37, 11001, 343, 343, 27688, 343, 27700, 27704 },\n    { 0, 38, 27716, 343, 343, 27719, 343, 27142, 27146 },\n    { 0, 39, 27734, 343, 343, 27737, 343, 27750, 27754 },\n    { 0, 40, 25244, 343, 343, 27773, 343, 27779, 27783 },\n    { 0, 41, 27796, 343, 343, 27799, 343, 27660, 27664 },\n    { 0, 42, 11080, 343, 343, 27808, 343, 27814, 27818 },\n    { 0, 43, 24707, 343, 343, 27840, 343, 27849, 27853 },\n    { 0, 44, 24135, 343, 343, 27868, 343, 18032, 27879 },\n    { 0, 45, 27897, 343, 343, 27900, 343, 27905, 27909 },\n    { 0, 46, 27920, 343, 343, 27923, 343, 27934, 27938 },\n    { 0, 47, 27956, 343, 343, 27959, 343, 26898, 26902 },\n    { 0, 48, 27976, 343, 343, 27979, 343, 27986, 27990 },\n    { 0, 49, 20156, 343, 343, 28003, 343, 28018, 28022 },\n    { 0, 50, 4300, 343, 343, 28044, 343, 26879, 26883 },\n    { 0, 51, 28052, 343, 343, 28055, 343, 28064, 28068 },\n    { 0, 52, 20198, 343, 343, 28083, 343, 28091, 28095 },\n    { 0, 53, 28108, 343, 343, 28111, 343, 26639, 26643 },\n    { 0, 54, 24492, 343, 343, 28120, 343, 28139, 28143 },\n    { 0, 55, 23965, 343, 343, 28158, 343, 28166, 28170 },\n    { 0, 56, 25104, 343, 343, 28185, 343, 28193, 28197 },\n    { 0, 57, 21653, 343, 343, 28211, 343, 28219, 28223 },\n    { 0, 58, 23349, 343, 343, 28238, 343, 28244, 28248 },\n    { 0, 59, 28263, 343, 343, 28266, 343, 28281, 28285 },\n    { 0, 60, 28301, 343, 343, 28304, 343, 28312, 28316 },\n    { 0, 61, 20048, 343, 343, 28331, 343, 26879, 26883 },\n    { 0, 62, 28337, 343, 343, 28340, 343, 28349, 28353 },\n    { 0, 63, 20373, 343, 343, 28368, 343, 26879, 26883 },\n    { 0, 64, 28376, 343, 343, 28379, 343, 28384, 28388 },\n    { 0, 65, 28400, 343, 343, 28403, 343, 28420, 28424 },\n    { 0, 66, 28447, 343, 343, 28450, 343, 26857, 26861 },\n    { 0, 67, 22259, 343, 343, 28461, 343, 28091, 28095 },\n    { 0, 68, 20417, 343, 343, 28475, 343, 26879, 26883 },\n    { 0, 69, 28482, 343, 343, 28485, 343, 27660, 27664 },\n    { 0, 70, 22929, 343, 343, 28491, 343, 28506, 28510 },\n    { 0, 71, 28533, 343, 343, 28536, 343, 26639, 26643 },\n    { 0, 72, 22205, 343, 343, 28544, 343, 28552, 28556 },\n    { 0, 73, 28570, 343, 343, 28573, 343, 26879, 26883 },\n    { 0, 74, 28587, 343, 343, 28590, 343, 28596, 28600 },\n    { 0, 75, 28611, 343, 343, 28614, 343, 28624, 28628 },\n    { 0, 76, 28644, 343, 343, 28647, 343, 28091, 28095 },\n    { 0, 77, 28657, 343, 343, 28660, 343, 28667, 28671 },\n    { 0, 78, 28685, 343, 343, 28688, 343, 28695, 28699 },\n    { 0, 79, 28712, 343, 343, 28715, 343, 26879, 26883 },\n    { 0, 80, 28726, 343, 343, 28729, 343, 27660, 27664 },\n    { 0, 81, 20299, 343, 343, 28747, 343, 26879, 26883 },\n    { 0, 82, 23853, 343, 343, 28754, 343, 28764, 28768 },\n    { 0, 83, 28786, 343, 343, 28789, 343, 26857, 26861 },\n    { 0, 84, 28794, 343, 343, 28797, 343, 28804, 28808 },\n    { 0, 85, 23433, 343, 343, 28822, 343, 28846, 28850 },\n    { 0, 86, 28867, 343, 343, 28870, 343, 26898, 26902 },\n    { 0, 87, 25727, 343, 343, 28904, 343, 28913, 28917 },\n    { 0, 88, 21095, 343, 343, 28933, 343, 28941, 28945 },\n    { 0, 89, 20518, 343, 343, 28959, 343, 28967, 28971 },\n    { 0, 90, 21420, 343, 343, 28988, 343, 28998, 29002 },\n    { 0, 91, 24279, 343, 343, 29020, 343, 26879, 26883 },\n    { 0, 92, 20466, 343, 343, 29028, 343, 29035, 29039 },\n    { 0, 93, 22313, 343, 343, 29058, 343, 29064, 29068 },\n    { 0, 94, 29081, 343, 343, 29084, 343, 26857, 26861 },\n    { 0, 95, 22804, 343, 343, 29115, 343, 29120, 29124 },\n    { 0, 96, 21799, 343, 343, 29136, 343, 29141, 29145 },\n    { 0, 97, 20567, 343, 343, 29158, 343, 29166, 29170 },\n    { 0, 98, 20610, 343, 343, 29186, 343, 26879, 26883 },\n    { 0, 99, 29192, 343, 343, 29195, 343, 29203, 29207 },\n    { 0, 100, 24867, 343, 343, 29223, 343, 29230, 29234 },\n    { 0, 101, 20655, 343, 343, 29250, 343, 29256, 29260 },\n    { 0, 102, 22356, 343, 343, 29273, 343, 29279, 29283 },\n    { 0, 103, 29299, 343, 343, 29302, 343, 29313, 29317 },\n    { 0, 104, 29331, 343, 343, 29334, 343, 29343, 29347 },\n    { 0, 105, 29362, 343, 343, 29365, 343, 26898, 26902 },\n    { 0, 106, 29374, 343, 343, 29377, 343, 29385, 29389 },\n    { 0, 107, 29402, 343, 343, 29405, 343, 26639, 26643 },\n    { 0, 108, 29427, 343, 343, 29430, 343, 29442, 29446 },\n    { 0, 109, 20710, 343, 343, 29463, 343, 29475, 29479 },\n    { 0, 110, 25163, 343, 343, 29496, 343, 29503, 29507 },\n    { 0, 111, 29521, 343, 343, 29524, 343, 29539, 29543 },\n    { 0, 112, 29565, 343, 343, 29568, 343, 29579, 29583 },\n    { 0, 113, 29600, 343, 343, 29603, 343, 29608, 29612 },\n    { 0, 114, 25022, 343, 343, 29624, 343, 29632, 29636 },\n    { 0, 115, 29651, 343, 343, 29654, 343, 26639, 26643 },\n    { 0, 116, 29666, 343, 343, 29669, 343, 27700, 27704 },\n    { 0, 117, 29683, 343, 343, 29686, 343, 29696, 29700 },\n    { 0, 118, 29716, 343, 343, 29719, 343, 29727, 29731 },\n    { 0, 119, 21751, 343, 343, 29747, 343, 29757, 29761 },\n    { 0, 120, 23772, 343, 343, 29777, 343, 26879, 26883 },\n    { 0, 121, 21699, 343, 343, 29788, 343, 29795, 29799 },\n    { 0, 122, 23667, 343, 343, 29812, 343, 29818, 29822 },\n    { 0, 123, 24248, 343, 343, 29835, 343, 28281, 28285 },\n    { 0, 124, 29843, 343, 343, 29846, 343, 26879, 26883 },\n    { 0, 125, 7437, 343, 343, 29853, 343, 29861, 29865 },\n    { 0, 126, 29878, 343, 343, 29881, 343, 29892, 29896 },\n    { 0, 127, 29913, 343, 343, 29916, 343, 26857, 26861 },\n    { 0, 128, 22063, 343, 343, 29933, 343, 29943, 29947 },\n    { 0, 129, 29964, 343, 343, 29967, 343, 27142, 27146 },\n    { 0, 130, 29972, 343, 343, 29975, 343, 29983, 29987 },\n    { 0, 131, 30000, 343, 343, 30003, 343, 30012, 30016 },\n    { 0, 132, 24044, 343, 343, 30033, 343, 30052, 30056 },\n    { 0, 133, 30069, 343, 343, 30072, 343, 26857, 26861 },\n    { 0, 134, 30097, 343, 343, 30100, 343, 26879, 26883 },\n    { 0, 135, 30111, 343, 343, 30114, 343, 30125, 30129 },\n    { 0, 136, 30148, 343, 343, 30151, 343, 26639, 26643 },\n    { 0, 137, 30162, 343, 343, 30165, 343, 30171, 30175 },\n    { 0, 138, 30188, 343, 343, 30191, 343, 30201, 30205 },\n    { 0, 139, 30221, 343, 343, 30224, 343, 30233, 30237 },\n    { 0, 140, 30261, 343, 343, 30264, 343, 30271, 30275 },\n    { 0, 141, 22978, 343, 343, 30289, 343, 30296, 30300 },\n    { 0, 142, 30313, 343, 343, 30316, 343, 30325, 30329 },\n    { 0, 143, 30347, 343, 343, 30350, 343, 30361, 30365 },\n    { 0, 144, 30384, 343, 343, 30387, 343, 30401, 30405 },\n    { 0, 145, 30415, 343, 343, 30418, 343, 27142, 27146 },\n    { 0, 146, 30424, 343, 343, 30427, 343, 26898, 26902 },\n    { 0, 147, 30442, 343, 343, 30445, 343, 30453, 30457 },\n    { 0, 148, 25781, 343, 343, 30472, 343, 30482, 30486 },\n    { 0, 149, 20762, 343, 343, 30509, 343, 26879, 26883 },\n    { 0, 150, 20853, 343, 343, 30521, 343, 27413, 27417 },\n    { 0, 151, 30528, 343, 343, 30531, 343, 30537, 30541 },\n    { 0, 152, 30556, 343, 343, 30559, 343, 26898, 26902 },\n    { 0, 153, 30565, 343, 343, 30568, 343, 27750, 27754 },\n    { 0, 154, 24079, 343, 343, 30573, 343, 27750, 27754 },\n    { 0, 155, 24545, 343, 343, 30585, 343, 30590, 30594 },\n    { 0, 156, 24328, 343, 343, 30604, 343, 30611, 30615 },\n    { 0, 157, 24808, 343, 343, 30633, 343, 30638, 30642 },\n    { 0, 158, 30661, 343, 343, 30664, 343, 30401, 30405 },\n    { 0, 159, 30681, 343, 343, 30684, 343, 30701, 30705 },\n    { 0, 160, 25198, 343, 343, 30727, 343, 18136, 30739 },\n    { 0, 161, 30755, 343, 343, 30758, 343, 30767, 30771 },\n    { 0, 162, 20894, 343, 343, 30786, 343, 30793, 30797 },\n    { 0, 163, 468, 343, 343, 30810, 343, 26879, 26883 },\n    { 0, 164, 30836, 343, 343, 30839, 343, 27750, 27754 },\n    { 0, 165, 25839, 343, 343, 30848, 343, 26857, 26861 },\n    { 0, 166, 23251, 343, 343, 30860, 343, 26879, 26883 },\n    { 0, 167, 30869, 343, 343, 30872, 343, 26857, 26861 },\n    { 0, 168, 25515, 343, 343, 30878, 343, 30887, 30891 },\n    { 0, 169, 25567, 343, 343, 30908, 343, 30914, 30918 },\n    { 0, 170, 30930, 343, 343, 30933, 343, 26879, 26883 },\n    { 0, 171, 20991, 343, 343, 30942, 343, 30950, 30954 },\n    { 0, 172, 21047, 343, 343, 30967, 343, 30974, 30978 },\n    { 0, 173, 31004, 343, 343, 31007, 343, 31014, 31018 },\n    { 0, 174, 10998, 343, 343, 31032, 343, 31045, 31049 },\n    { 0, 175, 31061, 343, 343, 31064, 343, 31080, 31084 },\n    { 0, 176, 31107, 343, 343, 31110, 343, 31121, 31125 },\n    { 0, 177, 31142, 343, 343, 31145, 343, 31151, 31155 },\n    { 0, 178, 21248, 343, 343, 31170, 343, 31177, 31181 },\n    { 0, 179, 23719, 343, 343, 31195, 343, 31205, 31209 },\n    { 0, 180, 31226, 343, 343, 31229, 343, 31242, 31246 },\n    { 0, 181, 21611, 343, 343, 31265, 343, 17910, 31274 },\n    { 0, 182, 31289, 343, 343, 31292, 343, 27413, 27417 },\n    { 0, 183, 21156, 343, 343, 31315, 343, 31324, 31328 },\n    { 0, 184, 31342, 343, 343, 31345, 343, 31358, 31362 },\n    { 0, 185, 31381, 343, 343, 31384, 343, 26879, 26883 },\n    { 0, 186, 31395, 343, 343, 31398, 343, 27142, 27146 },\n    { 0, 187, 31406, 343, 343, 31409, 343, 31417, 31421 },\n    { 0, 188, 31437, 343, 343, 31440, 343, 31449, 31453 },\n    { 0, 189, 31470, 343, 343, 31473, 343, 31495, 31499 },\n    { 0, 190, 25675, 343, 343, 31527, 343, 18180, 31539 },\n    { 0, 191, 24763, 343, 343, 31557, 343, 31563, 31567 },\n    { 0, 192, 31580, 343, 343, 31583, 343, 31593, 31597 },\n    { 0, 193, 31617, 343, 343, 31620, 343, 26857, 26861 },\n    { 0, 194, 31645, 343, 343, 31648, 343, 27660, 27664 },\n    { 0, 195, 31653, 343, 343, 31656, 343, 26879, 26883 },\n    { 0, 196, 31684, 343, 343, 31687, 343, 27142, 27146 },\n    { 0, 197, 21313, 343, 343, 31692, 343, 31701, 31705 },\n    { 0, 198, 31715, 343, 343, 31718, 343, 31729, 31733 },\n    { 0, 199, 31751, 343, 343, 31754, 343, 27750, 27754 },\n    { 0, 200, 17896, 343, 343, 31762, 343, 26857, 26861 },\n    { 0, 201, 31774, 343, 343, 31777, 343, 31790, 31794 },\n    { 0, 202, 24384, 343, 343, 31813, 343, 31821, 31825 },\n    { 0, 203, 31840, 343, 343, 31843, 343, 31849, 31853 },\n    { 0, 204, 21359, 343, 343, 31868, 343, 31875, 31879 },\n    { 0, 205, 24910, 343, 343, 31892, 343, 31912, 31916 },\n    { 0, 206, 31943, 343, 343, 31946, 343, 26898, 26902 },\n    { 0, 207, 20094, 343, 343, 31953, 343, 31960, 31964 },\n    { 0, 208, 31982, 343, 343, 31985, 343, 31994, 31998 },\n    { 0, 209, 21487, 343, 343, 32017, 343, 32025, 32029 },\n    { 0, 210, 32047, 343, 343, 32050, 343, 32057, 32061 },\n    { 0, 211, 32078, 343, 343, 32081, 343, 26857, 26861 },\n    { 0, 212, 20332, 343, 343, 32118, 343, 26857, 26861 },\n    { 0, 213, 25401, 343, 343, 32132, 343, 32140, 32144 },\n    { 0, 214, 32166, 343, 343, 32169, 343, 32180, 32184 },\n    { 0, 215, 32199, 343, 343, 32202, 343, 26879, 26883 },\n    { 0, 216, 32210, 343, 343, 32213, 343, 26639, 26643 },\n    { 0, 217, 24599, 343, 343, 32246, 343, 32256, 32260 },\n    { 0, 218, 32279, 343, 343, 32282, 343, 26857, 26861 },\n    { 0, 219, 1619, 343, 343, 32305, 343, 26857, 26861 },\n    { 0, 220, 21857, 343, 343, 32325, 343, 32333, 32337 },\n    { 0, 221, 32353, 343, 343, 32356, 343, 32364, 32368 },\n    { 0, 222, 32381, 343, 343, 32384, 343, 30401, 30405 },\n    { 0, 223, 32402, 343, 343, 32405, 343, 32411, 32415 },\n    { 0, 224, 24655, 343, 343, 32434, 343, 32440, 32444 },\n    { 0, 225, 32456, 343, 343, 32459, 343, 26879, 26883 },\n    { 0, 226, 32467, 343, 343, 32470, 343, 32481, 32485 },\n    { 0, 227, 22122, 343, 343, 32509, 343, 32522, 32526 },\n    { 0, 228, 32545, 343, 343, 32548, 343, 32555, 32559 },\n    { 0, 229, 25054, 343, 343, 32574, 343, 32583, 32587 }\n};\n\nstatic const RegionInfoNameEntry region_name_entries[] =\n{\n    { 25351, 0 },\n    { 26589, 1 },\n    { 26616, 2 },\n    { 26665, 3 },\n    { 21204, 4 },\n    { 465, 5 },\n    { 26728, 6 },\n    { 26785, 7 },\n    { 24964, 8 },\n    { 26839, 9 },\n    { 23485, 10 },\n    { 23518, 11 },\n    { 26920, 12 },\n    { 26948, 13 },\n    { 26986, 14 },\n    { 27052, 15 },\n    { 27084, 16 },\n    { 23029, 17 },\n    { 27126, 18 },\n    { 20005, 19 },\n    { 25463, 20 },\n    { 27220, 21 },\n    { 27249, 22 },\n    { 27258, 23 },\n    { 27289, 24 },\n    { 25617, 25 },\n    { 20943, 26 },\n    { 27365, 27 },\n    { 27396, 28 },\n    { 27433, 29 },\n    { 21555, 30 },\n    { 27494, 31 },\n    { 23611, 32 },\n    { 27549, 33 },\n    { 27566, 34 },\n    { 27632, 35 },\n    { 27679, 36 },\n    { 11001, 37 },\n    { 27716, 38 },\n    { 27734, 39 },\n    { 25244, 40 },\n    { 27796, 41 },\n    { 11080, 42 },\n    { 24707, 43 },\n    { 24135, 44 },\n    { 27897, 45 },\n    { 27920, 46 },\n    { 27956, 47 },\n    { 27976, 48 },\n    { 20156, 49 },\n    { 4300, 50 },\n    { 28052, 51 },\n    { 20198, 52 },\n    { 28108, 53 },\n    { 24492, 54 },\n    { 23965, 55 },\n    { 25104, 56 },\n    { 21653, 57 },\n    { 23349, 58 },\n    { 28263, 59 },\n    { 28301, 60 },\n    { 20048, 61 },\n    { 28337, 62 },\n    { 20373, 63 },\n    { 28376, 64 },\n    { 28400, 65 },\n    { 28447, 66 },\n    { 22259, 67 },\n    { 20417, 68 },\n    { 28482, 69 },\n    { 22929, 70 },\n    { 28533, 71 },\n    { 22205, 72 },\n    { 28570, 73 },\n    { 28587, 74 },\n    { 28611, 75 },\n    { 28644, 76 },\n    { 28657, 77 },\n    { 28685, 78 },\n    { 28712, 79 },\n    { 28726, 80 },\n    { 20299, 81 },\n    { 23853, 82 },\n    { 28786, 83 },\n    { 28794, 84 },\n    { 23433, 85 },\n    { 28867, 86 },\n    { 25727, 87 },\n    { 21095, 88 },\n    { 20518, 89 },\n    { 21420, 90 },\n    { 24279, 91 },\n    { 20466, 92 },\n    { 22313, 93 },\n    { 29081, 94 },\n    { 22804, 95 },\n    { 21799, 96 },\n    { 20567, 97 },\n    { 20610, 98 },\n    { 29192, 99 },\n    { 24867, 100 },\n    { 20655, 101 },\n    { 22356, 102 },\n    { 29299, 103 },\n    { 29331, 104 },\n    { 29362, 105 },\n    { 29374, 106 },\n    { 29402, 107 },\n    { 29427, 108 },\n    { 20710, 109 },\n    { 25163, 110 },\n    { 29521, 111 },\n    { 29565, 112 },\n    { 29600, 113 },\n    { 25022, 114 },\n    { 29651, 115 },\n    { 29666, 116 },\n    { 29683, 117 },\n    { 29716, 118 },\n    { 21751, 119 },\n    { 23772, 120 },\n    { 21699, 121 },\n    { 23667, 122 },\n    { 24248, 123 },\n    { 29843, 124 },\n    { 7437, 125 },\n    { 29878, 126 },\n    { 29913, 127 },\n    { 22063, 128 },\n    { 29964, 129 },\n    { 29972, 130 },\n    { 30000, 131 },\n    { 24044, 132 },\n    { 30069, 133 },\n    { 30097, 134 },\n    { 30111, 135 },\n    { 30148, 136 },\n    { 30162, 137 },\n    { 30188, 138 },\n    { 30221, 139 },\n    { 30261, 140 },\n    { 22978, 141 },\n    { 30313, 142 },\n    { 30347, 143 },\n    { 30384, 144 },\n    { 30415, 145 },\n    { 30424, 146 },\n    { 30442, 147 },\n    { 25781, 148 },\n    { 20762, 149 },\n    { 20853, 150 },\n    { 30528, 151 },\n    { 30556, 152 },\n    { 30565, 153 },\n    { 24079, 154 },\n    { 24545, 155 },\n    { 24328, 156 },\n    { 24808, 157 },\n    { 30661, 158 },\n    { 30681, 159 },\n    { 25198, 160 },\n    { 30755, 161 },\n    { 20894, 162 },\n    { 468, 163 },\n    { 30836, 164 },\n    { 25839, 165 },\n    { 23251, 166 },\n    { 30869, 167 },\n    { 25515, 168 },\n    { 25567, 169 },\n    { 30930, 170 },\n    { 20991, 171 },\n    { 21047, 172 },\n    { 31004, 173 },\n    { 10998, 174 },\n    { 31061, 175 },\n    { 31107, 176 },\n    { 31142, 177 },\n    { 21248, 178 },\n    { 23719, 179 },\n    { 31226, 180 },\n    { 21611, 181 },\n    { 31289, 182 },\n    { 21156, 183 },\n    { 31342, 184 },\n    { 31381, 185 },\n    { 31395, 186 },\n    { 31406, 187 },\n    { 31437, 188 },\n    { 31470, 189 },\n    { 25675, 190 },\n    { 24763, 191 },\n    { 31580, 192 },\n    { 31617, 193 },\n    { 31645, 194 },\n    { 31653, 195 },\n    { 31684, 196 },\n    { 21313, 197 },\n    { 31715, 198 },\n    { 31751, 199 },\n    { 17896, 200 },\n    { 31774, 201 },\n    { 24384, 202 },\n    { 31840, 203 },\n    { 21359, 204 },\n    { 24910, 205 },\n    { 31943, 206 },\n    { 20094, 207 },\n    { 31982, 208 },\n    { 21487, 209 },\n    { 32047, 210 },\n    { 32078, 211 },\n    { 20332, 212 },\n    { 25401, 213 },\n    { 32166, 214 },\n    { 32199, 215 },\n    { 32210, 216 },\n    { 24599, 217 },\n    { 32279, 218 },\n    { 1619, 219 },\n    { 21857, 220 },\n    { 32353, 221 },\n    { 32381, 222 },\n    { 32402, 223 },\n    { 24655, 224 },\n    { 32456, 225 },\n    { 32467, 226 },\n    { 22122, 227 },\n    { 32545, 228 },\n    { 25054, 229 }\n};\n\nstatic const char locale_strings[] =\n{\n    \"\\0\"\n    \"d MMMM, yyyy h:mm:ss t\\0\"\n    \"d MMMM, yyyy\\0\"\n    \"d/M/yyyy\\0\"\n    \"h:mm:ss t\\0\"\n    \"h:mm t\\0\"\n    \"MMMM, yyyy\\0\"\n    \"d MMMM\\0\"\n    \"\\xd8\\xb5\\0\"\n    \"\\xd9\\x85\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd8\\xad\\xd8\\xaf\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xa7\\xd8\\xab\\xd9\\x86\\xd9\\x8a\\xd9\\x86\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xab\\xd9\\x84\\xd8\\xa7\\xd8\\xab\\xd8\\xa7\\xd8\\xa1\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd8\\xb1\\xd8\\xa8\\xd8\\xb9\\xd8\\xa7\\xd8\\xa1\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xae\\xd9\\x85\\xd9\\x8a\\xd8\\xb3\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xac\\xd9\\x85\\xd8\\xb9\\xd8\\xa9\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb3\\xd8\\xa8\\xd8\\xaa\\0\"\n    \"\\xd8\\xad\\0\"\n    \"\\xd9\\x86\\0\"\n    \"\\xd8\\xab\\0\"\n    \"\\xd8\\xb1\\0\"\n    \"\\xd8\\xae\\0\"\n    \"\\xd8\\xac\\0\"\n    \"\\xd8\\xb3\\0\"\n    \"\\xd9\\x8a\\xd9\\x86\\xd8\\xa7\\xd9\\x8a\\xd8\\xb1\\0\"\n    \"\\xd9\\x81\\xd8\\xa8\\xd8\\xb1\\xd8\\xa7\\xd9\\x8a\\xd8\\xb1\\0\"\n    \"\\xd9\\x85\\xd8\\xa7\\xd8\\xb1\\xd8\\xb3\\0\"\n    \"\\xd8\\xa3\\xd8\\xa8\\xd8\\xb1\\xd9\\x8a\\xd9\\x84\\0\"\n    \"\\xd9\\x85\\xd8\\xa7\\xd9\\x8a\\xd9\\x88\\0\"\n    \"\\xd9\\x8a\\xd9\\x88\\xd9\\x86\\xd9\\x8a\\xd9\\x88\\0\"\n    \"\\xd9\\x8a\\xd9\\x88\\xd9\\x84\\xd9\\x8a\\xd9\\x88\\0\"\n    \"\\xd8\\xa3\\xd8\\xba\\xd8\\xb3\\xd8\\xb7\\xd8\\xb3\\0\"\n    \"\\xd8\\xb3\\xd8\\xa8\\xd8\\xaa\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd8\\xa3\\xd9\\x83\\xd8\\xaa\\xd9\\x88\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd9\\x86\\xd9\\x88\\xd9\\x81\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd8\\xaf\\xd9\\x8a\\xd8\\xb3\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\0\"\n    \"/\\0\"\n    \":\\0\"\n    \"yy/MM/dd\\0\"\n    \"yyyy MMMM d \\0\"\n    \"HH:mm\\0\"\n    \"HH:mm:ss z\\0\"\n    \"dd MMMM yyyy HH:mm:ss\\0\"\n    \"dd MMMM yyyy\\0\"\n    \"dd.M.yyyy '\\xd0\\xb3.'\\0\"\n    \"HH:mm:ss\\0\"\n    \"MMMM yyyy\\0\"\n    \"dd MMMM\\0\"\n    \"AM\\0\"\n    \"PM\\0\"\n    \"\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd0\\xbb\\xd1\\x8f\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd0\\xbb\\xd0\\xbd\\xd0\\xb8\\xd0\\xba\\0\"\n    \"\\xd0\\xb2\\xd1\\x82\\xd0\\xbe\\xd1\\x80\\xd0\\xbd\\xd0\\xb8\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd1\\x80\\xd1\\x8f\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82\\xd0\\xb2\\xd1\\x8a\\xd1\\x80\\xd1\\x82\\xd1\\x8a\\xd0\\xba\\0\"\n    \"\\xd0\\xbf\\xd0\\xb5\\xd1\\x82\\xd1\\x8a\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd1\\x8a\\xd0\\xb1\\xd0\\xbe\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4.\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd0\\xbd.\\0\"\n    \"\\xd0\\xb2\\xd1\\x82.\\0\"\n    \"\\xd1\\x81\\xd1\\x80.\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82\\xd0\\xb2.\\0\"\n    \"\\xd0\\xbf\\xd0\\xb5\\xd1\\x82.\\0\"\n    \"\\xd1\\x81\\xd1\\x8a\\xd0\\xb1.\\0\"\n    \"\\xd1\\x8f\\xd0\\xbd\\xd1\\x83\\xd0\\xb0\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd1\\x84\\xd0\\xb5\\xd0\\xb2\\xd1\\x80\\xd1\\x83\\xd0\\xb0\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x80\\xd1\\x82\\0\"\n    \"\\xd0\\xb0\\xd0\\xbf\\xd1\\x80\\xd0\\xb8\\xd0\\xbb\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd0\\xb9\\0\"\n    \"\\xd1\\x8e\\xd0\\xbd\\xd0\\xb8\\0\"\n    \"\\xd1\\x8e\\xd0\\xbb\\xd0\\xb8\\0\"\n    \"\\xd0\\xb0\\xd0\\xb2\\xd0\\xb3\\xd1\\x83\\xd1\\x81\\xd1\\x82\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbf\\xd1\\x82\\xd0\\xb5\\xd0\\xbc\\xd0\\xb2\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd0\\xbe\\xd0\\xba\\xd1\\x82\\xd0\\xbe\\xd0\\xbc\\xd0\\xb2\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd0\\xbd\\xd0\\xbe\\xd0\\xb5\\xd0\\xbc\\xd0\\xb2\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd0\\xba\\xd0\\xb5\\xd0\\xbc\\xd0\\xb2\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd1\\x8f\\xd0\\xbd.\\0\"\n    \"\\xd1\\x84\\xd0\\xb5\\xd0\\xb2.\\0\"\n    \"\\xd0\\xb0\\xd0\\xbf\\xd1\\x80.\\0\"\n    \"\\xd0\\xb0\\xd0\\xb2\\xd0\\xb3.\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbf.\\0\"\n    \"\\xd0\\xbe\\xd0\\xba\\xd1\\x82.\\0\"\n    \"\\xd0\\xbd\\xd0\\xbe\\xd0\\xb5\\xd0\\xbc.\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd0\\xba.\\0\"\n    \"dd.MM.yy\\0\"\n    \"d MMMM yyyy HH:mm:ss z\\0\"\n    \"d MMMM yyyy\\0\"\n    \"dd/MM/yy\\0\"\n    \"diumenge\\0\"\n    \"dilluns\\0\"\n    \"dimarts\\0\"\n    \"dimecres\\0\"\n    \"dijous\\0\"\n    \"divendres\\0\"\n    \"dissabte\\0\"\n    \"dg.\\0\"\n    \"dl.\\0\"\n    \"dt.\\0\"\n    \"dc.\\0\"\n    \"dj.\\0\"\n    \"dv.\\0\"\n    \"ds.\\0\"\n    \"gener\\0\"\n    \"febrer\\0\"\n    \"mar\\xc3\\xa7\\0\"\n    \"abril\\0\"\n    \"maig\\0\"\n    \"juny\\0\"\n    \"juliol\\0\"\n    \"agost\\0\"\n    \"setembre\\0\"\n    \"octubre\\0\"\n    \"novembre\\0\"\n    \"desembre\\0\"\n    \"gen.\\0\"\n    \"feb.\\0\"\n    \"abr.\\0\"\n    \"jul.\\0\"\n    \"ag.\\0\"\n    \"set.\\0\"\n    \"oct.\\0\"\n    \"nov.\\0\"\n    \"des.\\0\"\n    \"yyyy MMMM d  HH:mm:ss z\\0\"\n    \"yyyy MMMM\\0\"\n    \"MMMM dd\\0\"\n    \"\\xe4\\xb8\\x8a\\xe5\\x8d\\x88\\0\"\n    \"\\xe4\\xb8\\x8b\\xe5\\x8d\\x88\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe6\\x97\\xa5\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe4\\xb8\\x80\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe4\\xba\\x8c\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe4\\xb8\\x89\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe5\\x9b\\x9b\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe4\\xba\\x94\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe5\\x85\\xad\\0\"\n    \"\\xe6\\x97\\xa5\\0\"\n    \"\\xe4\\xb8\\x80\\0\"\n    \"\\xe4\\xba\\x8c\\0\"\n    \"\\xe4\\xb8\\x89\\0\"\n    \"\\xe5\\x9b\\x9b\\0\"\n    \"\\xe4\\xba\\x94\\0\"\n    \"\\xe5\\x85\\xad\\0\"\n    \"\\xe4\\xb8\\x80\\xe6\\x9c\\x88\\0\"\n    \"\\xe4\\xba\\x8c\\xe6\\x9c\\x88\\0\"\n    \"\\xe4\\xb8\\x89\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x9b\\x9b\\xe6\\x9c\\x88\\0\"\n    \"\\xe4\\xba\\x94\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x85\\xad\\xe6\\x9c\\x88\\0\"\n    \"\\xe4\\xb8\\x83\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x85\\xab\\xe6\\x9c\\x88\\0\"\n    \"\\xe4\\xb9\\x9d\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x8d\\x81\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x8d\\x81\\xe4\\xb8\\x80\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x8d\\x81\\xe4\\xba\\x8c\\xe6\\x9c\\x88\\0\"\n    \"d. MMMM yyyy H:mm:ss z\\0\"\n    \"d. MMMM yyyy\\0\"\n    \"d.M.yy\\0\"\n    \"H:mm:ss z\\0\"\n    \"H:mm\\0\"\n    \"d. MMMM\\0\"\n    \"dop.\\0\"\n    \"odp.\\0\"\n    \"ned\\xc4\\x9ble\\0\"\n    \"pond\\xc4\\x9bl\\xc3\\xad\\0\"\n    \"\\xc3\\xbater\\xc3\\xbd\\0\"\n    \"st\\xc5\\x99\\x65\\x64\\x61\\0\"\n    \"\\xc4\\x8dtvrtek\\0\"\n    \"p\\xc3\\xa1tek\\0\"\n    \"sobota\\0\"\n    \"ne\\0\"\n    \"po\\0\"\n    \"\\xc3\\xbat\\0\"\n    \"st\\0\"\n    \"\\xc4\\x8dt\\0\"\n    \"p\\xc3\\xa1\\0\"\n    \"so\\0\"\n    \"leden\\0\"\n    \"\\xc3\\xbanor\\0\"\n    \"b\\xc5\\x99\\x65zen\\0\"\n    \"duben\\0\"\n    \"kv\\xc4\\x9bten\\0\"\n    \"\\xc4\\x8d\\x65rven\\0\"\n    \"\\xc4\\x8d\\x65rvenec\\0\"\n    \"srpen\\0\"\n    \"z\\xc3\\xa1\\xc5\\x99\\xc3\\xad\\0\"\n    \"\\xc5\\x99\\xc3\\xadjen\\0\"\n    \"listopad\\0\"\n    \"prosinec\\0\"\n    \"I\\0\"\n    \"II\\0\"\n    \"III\\0\"\n    \"IV\\0\"\n    \"V\\0\"\n    \"VI\\0\"\n    \"VII\\0\"\n    \"VIII\\0\"\n    \"IX\\0\"\n    \"X\\0\"\n    \"XI\\0\"\n    \"XII\\0\"\n    \"d. MMM yyyy HH:mm:ss\\0\"\n    \"d. MMM yyyy\\0\"\n    \"dd-MM-yyyy\\0\"\n    \"dd. MMMM\\0\"\n    \"s\\xc3\\xb8ndag\\0\"\n    \"mandag\\0\"\n    \"tirsdag\\0\"\n    \"onsdag\\0\"\n    \"torsdag\\0\"\n    \"fredag\\0\"\n    \"l\\xc3\\xb8rdag\\0\"\n    \"s\\xc3\\xb8n\\0\"\n    \"man\\0\"\n    \"tir\\0\"\n    \"ons\\0\"\n    \"tor\\0\"\n    \"fre\\0\"\n    \"l\\xc3\\xb8r\\0\"\n    \"januar\\0\"\n    \"februar\\0\"\n    \"marts\\0\"\n    \"april\\0\"\n    \"maj\\0\"\n    \"juni\\0\"\n    \"juli\\0\"\n    \"august\\0\"\n    \"september\\0\"\n    \"oktober\\0\"\n    \"november\\0\"\n    \"december\\0\"\n    \"jan\\0\"\n    \"feb\\0\"\n    \"mar\\0\"\n    \"apr\\0\"\n    \"jun\\0\"\n    \"jul\\0\"\n    \"aug\\0\"\n    \"sep\\0\"\n    \"okt\\0\"\n    \"nov\\0\"\n    \"dec\\0\"\n    \"dd-MM-yy\\0\"\n    \"d. MMMM yyyy HH:mm:ss\\0\"\n    \"dd.MM.yyyy\\0\"\n    \"vorm.\\0\"\n    \"nachm.\\0\"\n    \"Sonntag\\0\"\n    \"Montag\\0\"\n    \"Dienstag\\0\"\n    \"Mittwoch\\0\"\n    \"Donnerstag\\0\"\n    \"Freitag\\0\"\n    \"Samstag\\0\"\n    \"So\\0\"\n    \"Mo\\0\"\n    \"Di\\0\"\n    \"Mi\\0\"\n    \"Do\\0\"\n    \"Fr\\0\"\n    \"Sa\\0\"\n    \"Januar\\0\"\n    \"Februar\\0\"\n    \"M\\xc3\\xa4rz\\0\"\n    \"April\\0\"\n    \"Mai\\0\"\n    \"Juni\\0\"\n    \"Juli\\0\"\n    \"August\\0\"\n    \"September\\0\"\n    \"Oktober\\0\"\n    \"November\\0\"\n    \"Dezember\\0\"\n    \"Jan\\0\"\n    \"Feb\\0\"\n    \"Mrz\\0\"\n    \"Apr\\0\"\n    \"Jun\\0\"\n    \"Jul\\0\"\n    \"Aug\\0\"\n    \"Sep\\0\"\n    \"Okt\\0\"\n    \"Nov\\0\"\n    \"Dez\\0\"\n    \"dd MMMM yyyy h:mm:ss tt\\0\"\n    \"h:mm:ss tt\\0\"\n    \"\\xce\\xa0\\xce\\x9c\\0\"\n    \"\\xce\\x9c\\xce\\x9c\\0\"\n    \"\\xce\\x9a\\xcf\\x85\\xcf\\x81\\xce\\xb9\\xce\\xb1\\xce\\xba\\xce\\xae\\0\"\n    \"\\xce\\x94\\xce\\xb5\\xcf\\x85\\xcf\\x84\\xce\\xad\\xcf\\x81\\xce\\xb1\\0\"\n    \"\\xce\\xa4\\xcf\\x81\\xce\\xaf\\xcf\\x84\\xce\\xb7\\0\"\n    \"\\xce\\xa4\\xce\\xb5\\xcf\\x84\\xce\\xac\\xcf\\x81\\xcf\\x84\\xce\\xb7\\0\"\n    \"\\xce\\xa0\\xce\\xad\\xce\\xbc\\xcf\\x80\\xcf\\x84\\xce\\xb7\\0\"\n    \"\\xce\\xa0\\xce\\xb1\\xcf\\x81\\xce\\xb1\\xcf\\x83\\xce\\xba\\xce\\xb5\\xcf\\x85\\xce\\xae\\0\"\n    \"\\xce\\xa3\\xce\\xac\\xce\\xb2\\xce\\xb2\\xce\\xb1\\xcf\\x84\\xce\\xbf\\0\"\n    \"\\xce\\x9a\\xcf\\x85\\xcf\\x81\\0\"\n    \"\\xce\\x94\\xce\\xb5\\xcf\\x85\\0\"\n    \"\\xce\\xa4\\xcf\\x81\\xce\\xb9\\0\"\n    \"\\xce\\xa4\\xce\\xb5\\xcf\\x84\\0\"\n    \"\\xce\\xa0\\xce\\xb5\\xce\\xbc\\0\"\n    \"\\xce\\xa0\\xce\\xb1\\xcf\\x81\\0\"\n    \"\\xce\\xa3\\xce\\xb1\\xce\\xb2\\0\"\n    \"\\xce\\x99\\xce\\xb1\\xce\\xbd\\xce\\xbf\\xcf\\x85\\xce\\xac\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\xa6\\xce\\xb5\\xce\\xb2\\xcf\\x81\\xce\\xbf\\xcf\\x85\\xce\\xac\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x9c\\xce\\xac\\xcf\\x81\\xcf\\x84\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x91\\xcf\\x80\\xcf\\x81\\xce\\xaf\\xce\\xbb\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x9c\\xce\\xac\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x99\\xce\\xbf\\xcf\\x8d\\xce\\xbd\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x99\\xce\\xbf\\xcf\\x8d\\xce\\xbb\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x91\\xcf\\x8d\\xce\\xb3\\xce\\xbf\\xcf\\x85\\xcf\\x83\\xcf\\x84\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\xa3\\xce\\xb5\\xcf\\x80\\xcf\\x84\\xce\\xad\\xce\\xbc\\xce\\xb2\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x9f\\xce\\xba\\xcf\\x84\\xcf\\x8e\\xce\\xb2\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x9d\\xce\\xbf\\xce\\xad\\xce\\xbc\\xce\\xb2\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x94\\xce\\xb5\\xce\\xba\\xce\\xad\\xce\\xbc\\xce\\xb2\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x99\\xce\\xb1\\xce\\xbd\\0\"\n    \"\\xce\\xa6\\xce\\xb5\\xce\\xb2\\0\"\n    \"\\xce\\x9c\\xce\\xb1\\xcf\\x81\\0\"\n    \"\\xce\\x91\\xcf\\x80\\xcf\\x81\\0\"\n    \"\\xce\\x9c\\xce\\xb1\\xcf\\x8a\\0\"\n    \"\\xce\\x99\\xce\\xbf\\xcf\\x85\\xce\\xbd\\0\"\n    \"\\xce\\x99\\xce\\xbf\\xcf\\x85\\xce\\xbb\\0\"\n    \"\\xce\\x91\\xcf\\x85\\xce\\xb3\\0\"\n    \"\\xce\\xa3\\xce\\xb5\\xcf\\x80\\0\"\n    \"\\xce\\x9f\\xce\\xba\\xcf\\x84\\0\"\n    \"\\xce\\x9d\\xce\\xbf\\xce\\xb5\\0\"\n    \"\\xce\\x94\\xce\\xb5\\xce\\xba\\0\"\n    \"dd/MM/yyyy\\0\"\n    \"h:mm:ss t z\\0\"\n    \"dddd, MMMM dd, yyyy h:mm:ss tt\\0\"\n    \"dddd, MMMM dd, yyyy\\0\"\n    \"M/d/yy\\0\"\n    \"h:mm tt\\0\"\n    \"MMMM d\\0\"\n    \"Sunday\\0\"\n    \"Monday\\0\"\n    \"Tuesday\\0\"\n    \"Wednesday\\0\"\n    \"Thursday\\0\"\n    \"Friday\\0\"\n    \"Saturday\\0\"\n    \"Sun\\0\"\n    \"Mon\\0\"\n    \"Tue\\0\"\n    \"Wed\\0\"\n    \"Thu\\0\"\n    \"Fri\\0\"\n    \"Sat\\0\"\n    \"January\\0\"\n    \"February\\0\"\n    \"March\\0\"\n    \"May\\0\"\n    \"June\\0\"\n    \"July\\0\"\n    \"October\\0\"\n    \"December\\0\"\n    \"Mar\\0\"\n    \"Oct\\0\"\n    \"Dec\\0\"\n    \"MMMM dd, yyyy\\0\"\n    \"dddd, dd MMMM, yyyy\\0\"\n    \"dd, MMMM, yyyy\\0\"\n    \"hh:mm tt\\0\"\n    \"hh:mm:ss tt\\0\"\n    \"H:mm:ss\\0\"\n    \"d' de 'MMMM' de 'yyyy hh:mm:ss tt\\0\"\n    \"d' de 'MMMM' de 'yyyy\\0\"\n    \"MM/dd/yyyy\\0\"\n    \"MMMM\\0\"\n    \"d' de 'MMMM\\0\"\n    \"a.m.\\0\"\n    \"p.m.\\0\"\n    \"domingo\\0\"\n    \"lunes\\0\"\n    \"martes\\0\"\n    \"mi\\xc3\\xa9rcoles\\0\"\n    \"jueves\\0\"\n    \"viernes\\0\"\n    \"s\\xc3\\xa1\\x62\\x61\\x64o\\0\"\n    \"dom\\0\"\n    \"lun\\0\"\n    \"mi\\xc3\\xa9\\0\"\n    \"jue\\0\"\n    \"vie\\0\"\n    \"s\\xc3\\xa1\\x62\\0\"\n    \"enero\\0\"\n    \"febrero\\0\"\n    \"marzo\\0\"\n    \"mayo\\0\"\n    \"junio\\0\"\n    \"julio\\0\"\n    \"agosto\\0\"\n    \"septiembre\\0\"\n    \"noviembre\\0\"\n    \"diciembre\\0\"\n    \"ene\\0\"\n    \"abr\\0\"\n    \"may\\0\"\n    \"ago\\0\"\n    \"oct\\0\"\n    \"dic\\0\"\n    \"d/MM/yy\\0\"\n    \"d. MMMM'ta 'yyyy H:mm:ss\\0\"\n    \"d. MMMM'ta 'yyyy\\0\"\n    \"d.M.yyyy\\0\"\n    \"MMMM'ta'yyyy\\0\"\n    \"d. MMMM'ta'\\0\"\n    \"sunnuntai\\0\"\n    \"maanantai\\0\"\n    \"tiistai\\0\"\n    \"keskiviikko\\0\"\n    \"torstai\\0\"\n    \"perjantai\\0\"\n    \"lauantai\\0\"\n    \"su\\0\"\n    \"ma\\0\"\n    \"ti\\0\"\n    \"ke\\0\"\n    \"to\\0\"\n    \"pe\\0\"\n    \"la\\0\"\n    \"tammikuu\\0\"\n    \"helmikuu\\0\"\n    \"maaliskuu\\0\"\n    \"huhtikuu\\0\"\n    \"toukokuu\\0\"\n    \"kes\\xc3\\xa4kuu\\0\"\n    \"hein\\xc3\\xa4kuu\\0\"\n    \"elokuu\\0\"\n    \"syyskuu\\0\"\n    \"lokakuu\\0\"\n    \"marraskuu\\0\"\n    \"joulukuu\\0\"\n    \"tammi\\0\"\n    \"helmi\\0\"\n    \"maalis\\0\"\n    \"huhti\\0\"\n    \"touko\\0\"\n    \"kes\\xc3\\xa4\\0\"\n    \"hein\\xc3\\xa4\\0\"\n    \"elo\\0\"\n    \"syys\\0\"\n    \"loka\\0\"\n    \"marras\\0\"\n    \"joulu\\0\"\n    \"dddd d MMMM yyyy HH:mm:ss\\0\"\n    \"dddd d MMMM yyyy\\0\"\n    \"dimanche\\0\"\n    \"lundi\\0\"\n    \"mardi\\0\"\n    \"mercredi\\0\"\n    \"jeudi\\0\"\n    \"vendredi\\0\"\n    \"samedi\\0\"\n    \"dim.\\0\"\n    \"lun.\\0\"\n    \"mar.\\0\"\n    \"mer.\\0\"\n    \"jeu.\\0\"\n    \"ven.\\0\"\n    \"sam.\\0\"\n    \"janvier\\0\"\n    \"f\\xc3\\xa9vrier\\0\"\n    \"mars\\0\"\n    \"avril\\0\"\n    \"mai\\0\"\n    \"juin\\0\"\n    \"juillet\\0\"\n    \"ao\\xc3\\xbbt\\0\"\n    \"septembre\\0\"\n    \"octobre\\0\"\n    \"d\\xc3\\xa9\\x63\\x65mbre\\0\"\n    \"janv.\\0\"\n    \"f\\xc3\\xa9vr.\\0\"\n    \"avr.\\0\"\n    \"juil.\\0\"\n    \"sept.\\0\"\n    \"d\\xc3\\xa9\\x63.\\0\"\n    \"d/MM/yyyy\\0\"\n    \"HH:mm:ss d MMMM yyyy\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\xa8\\xd7\\x90\\xd7\\xa9\\xd7\\x95\\xd7\\x9f\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\xa9\\xd7\\xa0\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\xa9\\xd7\\x9c\\xd7\\x99\\xd7\\xa9\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\xa8\\xd7\\x91\\xd7\\x99\\xd7\\xa2\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\x97\\xd7\\x9e\\xd7\\x99\\xd7\\xa9\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\xa9\\xd7\\x99\\xd7\\xa9\\xd7\\x99\\0\"\n    \"\\xd7\\xa9\\xd7\\x91\\xd7\\xaa\\0\"\n    \"\\xd7\\x90\\0\"\n    \"\\xd7\\x91\\0\"\n    \"\\xd7\\x92\\0\"\n    \"\\xd7\\x93\\0\"\n    \"\\xd7\\x94\\0\"\n    \"\\xd7\\x95\\0\"\n    \"\\xd7\\xa9\\0\"\n    \"\\xd7\\x99\\xd7\\xa0\\xd7\\x95\\xd7\\x90\\xd7\\xa8\\0\"\n    \"\\xd7\\xa4\\xd7\\x91\\xd7\\xa8\\xd7\\x95\\xd7\\x90\\xd7\\xa8\\0\"\n    \"\\xd7\\x9e\\xd7\\xa8\\xd7\\xa5\\0\"\n    \"\\xd7\\x90\\xd7\\xa4\\xd7\\xa8\\xd7\\x99\\xd7\\x9c\\0\"\n    \"\\xd7\\x9e\\xd7\\x90\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\xa0\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9c\\xd7\\x99\\0\"\n    \"\\xd7\\x90\\xd7\\x95\\xd7\\x92\\xd7\\x95\\xd7\\xa1\\xd7\\x98\\0\"\n    \"\\xd7\\xa1\\xd7\\xa4\\xd7\\x98\\xd7\\x9e\\xd7\\x91\\xd7\\xa8\\0\"\n    \"\\xd7\\x90\\xd7\\x95\\xd7\\xa7\\xd7\\x98\\xd7\\x95\\xd7\\x91\\xd7\\xa8\\0\"\n    \"\\xd7\\xa0\\xd7\\x95\\xd7\\x91\\xd7\\x9e\\xd7\\x91\\xd7\\xa8\\0\"\n    \"\\xd7\\x93\\xd7\\xa6\\xd7\\x9e\\xd7\\x91\\xd7\\xa8\\0\"\n    \"\\xd7\\x99\\xd7\\xa0\\xd7\\x95\\0\"\n    \"\\xd7\\xa4\\xd7\\x91\\xd7\\xa8\\0\"\n    \"\\xd7\\x90\\xd7\\xa4\\xd7\\xa8\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\xa0\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9c\\0\"\n    \"\\xd7\\x90\\xd7\\x95\\xd7\\x92\\0\"\n    \"\\xd7\\xa1\\xd7\\xa4\\xd7\\x98\\0\"\n    \"\\xd7\\x90\\xd7\\x95\\xd7\\xa7\\0\"\n    \"\\xd7\\xa0\\xd7\\x95\\xd7\\x91\\0\"\n    \"\\xd7\\x93\\xd7\\xa6\\xd7\\x9e\\0\"\n    \"yyyy. MMMM d. H:mm:ss\\0\"\n    \"yyyy. MMMM d.\\0\"\n    \"yyyy. MM. dd.\\0\"\n    \"yyyy. MMMM\\0\"\n    \"MMMM d.\\0\"\n    \"DE\\0\"\n    \"DU\\0\"\n    \"vas\\xc3\\xa1rnap\\0\"\n    \"h\\xc3\\xa9tf\\xc5\\x91\\0\"\n    \"kedd\\0\"\n    \"szerda\\0\"\n    \"cs\\xc3\\xbct\\xc3\\xb6rt\\xc3\\xb6k\\0\"\n    \"p\\xc3\\xa9ntek\\0\"\n    \"szombat\\0\"\n    \"H\\0\"\n    \"K\\0\"\n    \"Sze\\0\"\n    \"Cs\\0\"\n    \"P\\0\"\n    \"Szo\\0\"\n    \"janu\\xc3\\xa1r\\0\"\n    \"febru\\xc3\\xa1r\\0\"\n    \"m\\xc3\\xa1rcius\\0\"\n    \"\\xc3\\xa1prilis\\0\"\n    \"m\\xc3\\xa1jus\\0\"\n    \"j\\xc3\\xbanius\\0\"\n    \"j\\xc3\\xbalius\\0\"\n    \"augusztus\\0\"\n    \"szeptember\\0\"\n    \"okt\\xc3\\xb3\\x62\\x65r\\0\"\n    \"jan.\\0\"\n    \"febr.\\0\"\n    \"m\\xc3\\xa1rc.\\0\"\n    \"\\xc3\\xa1pr.\\0\"\n    \"m\\xc3\\xa1j.\\0\"\n    \"j\\xc3\\xban.\\0\"\n    \"j\\xc3\\xbal.\\0\"\n    \"aug.\\0\"\n    \"szept.\\0\"\n    \"okt.\\0\"\n    \"dec.\\0\"\n    \"yyyy.MM.dd.\\0\"\n    \"sunnudagur\\0\"\n    \"m\\xc3\\xa1nudagur\\0\"\n    \"\\xc3\\xberi\\xc3\\xb0judagur\\0\"\n    \"mi\\xc3\\xb0vikudagur\\0\"\n    \"fimmtudagur\\0\"\n    \"f\\xc3\\xb6studagur\\0\"\n    \"laugardagur\\0\"\n    \"sun\\0\"\n    \"m\\xc3\\xa1n\\0\"\n    \"\\xc3\\xberi\\0\"\n    \"mi\\xc3\\xb0\\0\"\n    \"fim\\0\"\n    \"f\\xc3\\xb6s\\0\"\n    \"lau\\0\"\n    \"jan\\xc3\\xba\\x61r\\0\"\n    \"febr\\xc3\\xba\\x61r\\0\"\n    \"apr\\xc3\\xadl\\0\"\n    \"ma\\xc3\\xad\\0\"\n    \"j\\xc3\\xban\\xc3\\xad\\0\"\n    \"j\\xc3\\xbal\\xc3\\xad\\0\"\n    \"\\xc3\\xa1g\\xc3\\xbast\\0\"\n    \"n\\xc3\\xb3vember\\0\"\n    \"desember\\0\"\n    \"j\\xc3\\xban\\0\"\n    \"j\\xc3\\xbal\\0\"\n    \"\\xc3\\xa1g\\xc3\\xba\\0\"\n    \"n\\xc3\\xb3v\\0\"\n    \"des\\0\"\n    \"dd MMMM yyyy HH:mm:ss z\\0\"\n    \"m.\\0\"\n    \"p.\\0\"\n    \"domenica\\0\"\n    \"luned\\xc3\\xac\\0\"\n    \"marted\\xc3\\xac\\0\"\n    \"mercoled\\xc3\\xac\\0\"\n    \"gioved\\xc3\\xac\\0\"\n    \"venerd\\xc3\\xac\\0\"\n    \"sabato\\0\"\n    \"mer\\0\"\n    \"gio\\0\"\n    \"ven\\0\"\n    \"sab\\0\"\n    \"gennaio\\0\"\n    \"febbraio\\0\"\n    \"aprile\\0\"\n    \"maggio\\0\"\n    \"giugno\\0\"\n    \"luglio\\0\"\n    \"settembre\\0\"\n    \"ottobre\\0\"\n    \"dicembre\\0\"\n    \"gen\\0\"\n    \"mag\\0\"\n    \"giu\\0\"\n    \"lug\\0\"\n    \"set\\0\"\n    \"ott\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5' H:mm:ss\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5'\\0\"\n    \"yyyy/MM/dd\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'\\0\"\n    \"M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5'\\0\"\n    \"\\xe5\\x8d\\x88\\xe5\\x89\\x8d\\0\"\n    \"\\xe5\\x8d\\x88\\xe5\\xbe\\x8c\\0\"\n    \"\\xe6\\x97\\xa5\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe6\\x9c\\x88\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe7\\x81\\xab\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe6\\xb0\\xb4\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe6\\x9c\\xa8\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe9\\x87\\x91\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe5\\x9c\\x9f\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe6\\x9c\\x88\\0\"\n    \"\\xe7\\x81\\xab\\0\"\n    \"\\xe6\\xb0\\xb4\\0\"\n    \"\\xe6\\x9c\\xa8\\0\"\n    \"\\xe9\\x87\\x91\\0\"\n    \"\\xe5\\x9c\\x9f\\0\"\n    \"1\\xe6\\x9c\\x88\\0\"\n    \"2\\xe6\\x9c\\x88\\0\"\n    \"3\\xe6\\x9c\\x88\\0\"\n    \"4\\xe6\\x9c\\x88\\0\"\n    \"5\\xe6\\x9c\\x88\\0\"\n    \"6\\xe6\\x9c\\x88\\0\"\n    \"7\\xe6\\x9c\\x88\\0\"\n    \"8\\xe6\\x9c\\x88\\0\"\n    \"9\\xe6\\x9c\\x88\\0\"\n    \"10\\xe6\\x9c\\x88\\0\"\n    \"11\\xe6\\x9c\\x88\\0\"\n    \"12\\xe6\\x9c\\x88\\0\"\n    \"1\\0\"\n    \"2\\0\"\n    \"3\\0\"\n    \"4\\0\"\n    \"5\\0\"\n    \"6\\0\"\n    \"7\\0\"\n    \"8\\0\"\n    \"9\\0\"\n    \"10\\0\"\n    \"11\\0\"\n    \"12\\0\"\n    \"yy/M/d\\0\"\n    \"yyyy/M/d\\0\"\n    \"yy/MM/dd' ('ddd')'\\0\"\n    \"yy/M/d' ('ddd')'\\0\"\n    \"yyyy/M/d' ('ddd')'\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MM'\\xe6\\x9c\\x88'dd'\\xe6\\x97\\xa5'\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5' dddd\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MM'\\xe6\\x9c\\x88'dd'\\xe6\\x97\\xa5' dddd\\0\"\n    \"tt h:mm\\0\"\n    \"tt hh:mm\\0\"\n    \"tt h:mm:ss\\0\"\n    \"tt hh:mm:ss\\0\"\n    \"yyyy'\\xeb\\x85\\x84' M'\\xec\\x9b\\x94' d'\\xec\\x9d\\xbc' EE t hh'\\xec\\x8b\\x9c' mm'\\xeb\\xb6\\x84' ss'\\xec\\xb4\\x88'\\0\"\n    \"yyyy'\\xeb\\x85\\x84' M'\\xec\\x9b\\x94' d'\\xec\\x9d\\xbc' EE\\0\"\n    \"yy-MM-dd\\0\"\n    \"t hh'\\xec\\x8b\\x9c' mm'\\xeb\\xb6\\x84' ss'\\xec\\xb4\\x88'\\0\"\n    \"t hh'\\xec\\x8b\\x9c' mm'\\xeb\\xb6\\x84'\\0\"\n    \"yyyy'\\xeb\\x85\\x84' M'\\xec\\x9b\\x94'\\0\"\n    \"M'\\xec\\x9b\\x94' d'\\xec\\x9d\\xbc'\\0\"\n    \"\\xec\\x98\\xa4\\xec\\xa0\\x84\\0\"\n    \"\\xec\\x98\\xa4\\xed\\x9b\\x84\\0\"\n    \"\\xec\\x9d\\xbc\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xec\\x9b\\x94\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xed\\x99\\x94\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xec\\x88\\x98\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xeb\\xaa\\xa9\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xea\\xb8\\x88\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xed\\x86\\xa0\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xec\\x9d\\xbc\\0\"\n    \"\\xec\\x9b\\x94\\0\"\n    \"\\xed\\x99\\x94\\0\"\n    \"\\xec\\x88\\x98\\0\"\n    \"\\xeb\\xaa\\xa9\\0\"\n    \"\\xea\\xb8\\x88\\0\"\n    \"\\xed\\x86\\xa0\\0\"\n    \"1\\xec\\x9b\\x94\\0\"\n    \"2\\xec\\x9b\\x94\\0\"\n    \"3\\xec\\x9b\\x94\\0\"\n    \"4\\xec\\x9b\\x94\\0\"\n    \"5\\xec\\x9b\\x94\\0\"\n    \"6\\xec\\x9b\\x94\\0\"\n    \"7\\xec\\x9b\\x94\\0\"\n    \"8\\xec\\x9b\\x94\\0\"\n    \"9\\xec\\x9b\\x94\\0\"\n    \"10\\xec\\x9b\\x94\\0\"\n    \"11\\xec\\x9b\\x94\\0\"\n    \"12\\xec\\x9b\\x94\\0\"\n    \"d MMMM yyyy H:mm:ss z\\0\"\n    \"d-M-yy\\0\"\n    \"zondag\\0\"\n    \"maandag\\0\"\n    \"dinsdag\\0\"\n    \"woensdag\\0\"\n    \"donderdag\\0\"\n    \"vrijdag\\0\"\n    \"zaterdag\\0\"\n    \"zo\\0\"\n    \"di\\0\"\n    \"wo\\0\"\n    \"do\\0\"\n    \"vr\\0\"\n    \"za\\0\"\n    \"januari\\0\"\n    \"februari\\0\"\n    \"maart\\0\"\n    \"mei\\0\"\n    \"augustus\\0\"\n    \"mrt\\0\"\n    \"d. MMMM yyyy HH.mm.ss z\\0\"\n    \"HH.mm.ss z\\0\"\n    \"HH.mm\\0\"\n    \"s\\xc3\\xb8\\0\"\n    \"on\\0\"\n    \"fr\\0\"\n    \"l\\xc3\\xb8\\0\"\n    \"d MMMM yyyy HH:mm:ss\\0\"\n    \"yyyy-MM-dd\\0\"\n    \"niedziela\\0\"\n    \"poniedzia\\xc5\\x82\\x65k\\0\"\n    \"wtorek\\0\"\n    \"\\xc5\\x9broda\\0\"\n    \"czwartek\\0\"\n    \"pi\\xc4\\x85tek\\0\"\n    \"N\\0\"\n    \"Pn\\0\"\n    \"Wt\\0\"\n    \"\\xc5\\x9ar\\0\"\n    \"Cz\\0\"\n    \"Pt\\0\"\n    \"stycze\\xc5\\x84\\0\"\n    \"luty\\0\"\n    \"marzec\\0\"\n    \"kwiecie\\xc5\\x84\\0\"\n    \"czerwiec\\0\"\n    \"lipiec\\0\"\n    \"sierpie\\xc5\\x84\\0\"\n    \"wrzesie\\xc5\\x84\\0\"\n    \"pa\\xc5\\xba\\x64ziernik\\0\"\n    \"grudzie\\xc5\\x84\\0\"\n    \"sty\\0\"\n    \"lut\\0\"\n    \"kwi\\0\"\n    \"cze\\0\"\n    \"lip\\0\"\n    \"sie\\0\"\n    \"wrz\\0\"\n    \"pa\\xc5\\xba\\0\"\n    \"lis\\0\"\n    \"gru\\0\"\n    \"d' de 'MMMM' de 'yyyy HH:mm:ss z\\0\"\n    \"segunda-feira\\0\"\n    \"ter\\xc3\\xa7\\x61-feira\\0\"\n    \"quarta-feira\\0\"\n    \"quinta-feira\\0\"\n    \"sexta-feira\\0\"\n    \"seg\\0\"\n    \"ter\\0\"\n    \"qua\\0\"\n    \"qui\\0\"\n    \"sex\\0\"\n    \"janeiro\\0\"\n    \"fevereiro\\0\"\n    \"mar\\xc3\\xa7o\\0\"\n    \"maio\\0\"\n    \"junho\\0\"\n    \"julho\\0\"\n    \"setembro\\0\"\n    \"outubro\\0\"\n    \"novembro\\0\"\n    \"dezembro\\0\"\n    \"fev\\0\"\n    \"out\\0\"\n    \"dez\\0\"\n    \"duminic\\xc4\\x83\\0\"\n    \"luni\\0\"\n    \"mar\\xc5\\xa3i\\0\"\n    \"miercuri\\0\"\n    \"joi\\0\"\n    \"vineri\\0\"\n    \"s\\xc3\\xaemb\\xc4\\x83t\\xc4\\x83\\0\"\n    \"D\\0\"\n    \"L\\0\"\n    \"Ma\\0\"\n    \"J\\0\"\n    \"S\\0\"\n    \"ianuarie\\0\"\n    \"februarie\\0\"\n    \"martie\\0\"\n    \"aprilie\\0\"\n    \"iunie\\0\"\n    \"iulie\\0\"\n    \"septembrie\\0\"\n    \"octombrie\\0\"\n    \"noiembrie\\0\"\n    \"decembrie\\0\"\n    \"Ian\\0\"\n    \"Iun\\0\"\n    \"Iul\\0\"\n    \"d MMMM yyyy '\\xd0\\xb3.' H:mm:ss\\0\"\n    \"d MMMM yyyy '\\xd0\\xb3.'\\0\"\n    \"MMMM yyyy '\\xd0\\xb3.'\\0\"\n    \"\\xd0\\xb2\\xd0\\xbe\\xd1\\x81\\xd0\\xba\\xd1\\x80\\xd0\\xb5\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\xd0\\xb5\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd0\\xbb\\xd1\\x8c\\xd0\\xbd\\xd0\\xb8\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd1\\x80\\xd0\\xb5\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\xd0\\xb3\\0\"\n    \"\\xd0\\xbf\\xd1\\x8f\\xd1\\x82\\xd0\\xbd\\xd0\\xb8\\xd1\\x86\\xd0\\xb0\\0\"\n    \"\\xd1\\x81\\xd1\\x83\\xd0\\xb1\\xd0\\xb1\\xd0\\xbe\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd0\\x92\\xd1\\x81\\0\"\n    \"\\xd0\\x9f\\xd0\\xbd\\0\"\n    \"\\xd0\\x92\\xd1\\x82\\0\"\n    \"\\xd0\\xa1\\xd1\\x80\\0\"\n    \"\\xd0\\xa7\\xd1\\x82\\0\"\n    \"\\xd0\\x9f\\xd1\\x82\\0\"\n    \"\\xd0\\xa1\\xd0\\xb1\\0\"\n    \"\\xd0\\xaf\\xd0\\xbd\\xd0\\xb2\\xd0\\xb0\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd0\\xa4\\xd0\\xb5\\xd0\\xb2\\xd1\\x80\\xd0\\xb0\\xd0\\xbb\\xd1\\x8c\\0\"\n    \"\\xd0\\x9c\\xd0\\xb0\\xd1\\x80\\xd1\\x82\\0\"\n    \"\\xd0\\x90\\xd0\\xbf\\xd1\\x80\\xd0\\xb5\\xd0\\xbb\\xd1\\x8c\\0\"\n    \"\\xd0\\x9c\\xd0\\xb0\\xd0\\xb9\\0\"\n    \"\\xd0\\x98\\xd1\\x8e\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\x98\\xd1\\x8e\\xd0\\xbb\\xd1\\x8c\\0\"\n    \"\\xd0\\x90\\xd0\\xb2\\xd0\\xb3\\xd1\\x83\\xd1\\x81\\xd1\\x82\\0\"\n    \"\\xd0\\xa1\\xd0\\xb5\\xd0\\xbd\\xd1\\x82\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd0\\x9e\\xd0\\xba\\xd1\\x82\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd0\\x9d\\xd0\\xbe\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd0\\x94\\xd0\\xb5\\xd0\\xba\\xd0\\xb0\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd1\\x8f\\xd0\\xbd\\xd0\\xb2\\0\"\n    \"\\xd1\\x84\\xd0\\xb5\\xd0\\xb2\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xb0\\xd0\\xbf\\xd1\\x80\\0\"\n    \"\\xd0\\xb8\\xd1\\x8e\\xd0\\xbd\\0\"\n    \"\\xd0\\xb8\\xd1\\x8e\\xd0\\xbb\\0\"\n    \"\\xd0\\xb0\\xd0\\xb2\\xd0\\xb3\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\0\"\n    \"\\xd0\\xbe\\xd0\\xba\\xd1\\x82\\0\"\n    \"\\xd0\\xbd\\xd0\\xbe\\xd1\\x8f\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd0\\xba\\0\"\n    \"yyyy. MMMM dd H:mm:ss\\0\"\n    \"yyyy. MMMM dd\\0\"\n    \"nedjelja\\0\"\n    \"ponedjeljak\\0\"\n    \"utorak\\0\"\n    \"srijeda\\0\"\n    \"\\xc4\\x8d\\x65tvrtak\\0\"\n    \"petak\\0\"\n    \"subota\\0\"\n    \"ned\\0\"\n    \"pon\\0\"\n    \"uto\\0\"\n    \"sri\\0\"\n    \"\\xc4\\x8d\\x65t\\0\"\n    \"pet\\0\"\n    \"sub\\0\"\n    \"sije\\xc4\\x8d\\x61nj\\0\"\n    \"velja\\xc4\\x8d\\x61\\0\"\n    \"o\\xc5\\xbeujak\\0\"\n    \"travanj\\0\"\n    \"svibanj\\0\"\n    \"lipanj\\0\"\n    \"srpanj\\0\"\n    \"kolovoz\\0\"\n    \"rujan\\0\"\n    \"studeni\\0\"\n    \"prosinac\\0\"\n    \"sij\\0\"\n    \"vel\\0\"\n    \"o\\xc5\\xbeu\\0\"\n    \"tra\\0\"\n    \"svi\\0\"\n    \"srp\\0\"\n    \"kol\\0\"\n    \"ruj\\0\"\n    \"stu\\0\"\n    \"pro\\0\"\n    \"yyyy.MM.dd\\0\"\n    \"d. MMMM yyyy H:mm:ss\\0\"\n    \"d. M. yyyy\\0\"\n    \"Nede\\xc4\\xbe\\x61\\0\"\n    \"Pondelok\\0\"\n    \"Utorok\\0\"\n    \"Streda\\0\"\n    \"\\xc5\\xa0tvrtok\\0\"\n    \"Piatok\\0\"\n    \"Sobota\\0\"\n    \"Ne\\0\"\n    \"Po\\0\"\n    \"Ut\\0\"\n    \"St\\0\"\n    \"\\xc5\\xa0t\\0\"\n    \"Pi\\0\"\n    \"marec\\0\"\n    \"m\\xc3\\xa1j\\0\"\n    \"dd MMMM yyyy h:mm:ss.tt\\0\"\n    \"h:mm:ss.tt\\0\"\n    \"h.mm.t\\0\"\n    \"PD\\0\"\n    \"MD\\0\"\n    \"e diel\\0\"\n    \"e h\\xc3\\xabn\\xc3\\xab\\0\"\n    \"e mart\\xc3\\xab\\0\"\n    \"e m\\xc3\\xabrkur\\xc3\\xab\\0\"\n    \"e enjte\\0\"\n    \"e premte\\0\"\n    \"e shtun\\xc3\\xab\\0\"\n    \"Die\\0\"\n    \"H\\xc3\\xabn\\0\"\n    \"M\\xc3\\xabr\\0\"\n    \"Enj\\0\"\n    \"Pre\\0\"\n    \"Sht\\0\"\n    \"janar\\0\"\n    \"shkurt\\0\"\n    \"prill\\0\"\n    \"qershor\\0\"\n    \"korrik\\0\"\n    \"gusht\\0\"\n    \"shtator\\0\"\n    \"tetor\\0\"\n    \"n\\xc3\\xabntor\\0\"\n    \"dhjetor\\0\"\n    \"Shk\\0\"\n    \"Pri\\0\"\n    \"Maj\\0\"\n    \"Qer\\0\"\n    \"Kor\\0\"\n    \"Gsh\\0\"\n    \"Tet\\0\"\n    \"N\\xc3\\xabn\\0\"\n    \"Dhj\\0\"\n    \"h.mm.ss.t z\\0\"\n    \"'den 'd MMM yyyy HH.mm.ss z\\0\"\n    \"'den 'd MMM yyyy\\0\"\n    \"fm\\0\"\n    \"em\\0\"\n    \"s\\xc3\\xb6ndag\\0\"\n    \"m\\xc3\\xa5ndag\\0\"\n    \"tisdag\\0\"\n    \"l\\xc3\\xb6rdag\\0\"\n    \"s\\xc3\\xb6\\0\"\n    \"m\\xc3\\xa5\\0\"\n    \"l\\xc3\\xb6\\0\"\n    \"augusti\\0\"\n    \"d MMMM yyyy, H:mm:ss\\0\"\n    \"\\xe0\\xb8\\x81\\xe0\\xb9\\x88\\xe0\\xb8\\xad\\xe0\\xb8\\x99\\xe0\\xb9\\x80\\xe0\\xb8\\x97\\xe0\\xb8\\xb5\\xe0\\xb9\\x88\\xe0\\xb8\\xa2\\xe0\\xb8\\x87\\0\"\n    \"\\xe0\\xb8\\xab\\xe0\\xb8\\xa5\\xe0\\xb8\\xb1\\xe0\\xb8\\x87\\xe0\\xb9\\x80\\xe0\\xb8\\x97\\xe0\\xb8\\xb5\\xe0\\xb9\\x88\\xe0\\xb8\\xa2\\xe0\\xb8\\x87\\0\"\n    \"\\xe0\\xb8\\xa7\\xe0\\xb8\\xb1\\xe0\\xb8\\x99\\xe0\\xb8\\xad\\xe0\\xb8\\xb2\\xe0\\xb8\\x97\\xe0\\xb8\\xb4\\xe0\\xb8\\x95\\xe0\\xb8\\xa2\\xe0\\xb9\\x8c\\0\"\n    \"\\xe0\\xb8\\xa7\\xe0\\xb8\\xb1\\xe0\\xb8\\x99\\xe0\\xb8\\x88\\xe0\\xb8\\xb1\\xe0\\xb8\\x99\\xe0\\xb8\\x97\\xe0\\xb8\\xa3\\xe0\\xb9\\x8c\\0\"\n    \"\\xe0\\xb8\\xa7\\xe0\\xb8\\xb1\\xe0\\xb8\\x99\\xe0\\xb8\\xad\\xe0\\xb8\\xb1\\xe0\\xb8\\x87\\xe0\\xb8\\x84\\xe0\\xb8\\xb2\\xe0\\xb8\\xa3\\0\"\n    \"\\xe0\\xb8\\xa7\\xe0\\xb8\\xb1\\xe0\\xb8\\x99\\xe0\\xb8\\x9e\\xe0\\xb8\\xb8\\xe0\\xb8\\x98\\0\"\n    \"\\xe0\\xb8\\xa7\\xe0\\xb8\\xb1\\xe0\\xb8\\x99\\xe0\\xb8\\x9e\\xe0\\xb8\\xa4\\xe0\\xb8\\xab\\xe0\\xb8\\xb1\\xe0\\xb8\\xaa\\xe0\\xb8\\x9a\\xe0\\xb8\\x94\\xe0\\xb8\\xb5\\0\"\n    \"\\xe0\\xb8\\xa7\\xe0\\xb8\\xb1\\xe0\\xb8\\x99\\xe0\\xb8\\xa8\\xe0\\xb8\\xb8\\xe0\\xb8\\x81\\xe0\\xb8\\xa3\\xe0\\xb9\\x8c\\0\"\n    \"\\xe0\\xb8\\xa7\\xe0\\xb8\\xb1\\xe0\\xb8\\x99\\xe0\\xb9\\x80\\xe0\\xb8\\xaa\\xe0\\xb8\\xb2\\xe0\\xb8\\xa3\\xe0\\xb9\\x8c\\0\"\n    \"\\xe0\\xb8\\xad\\xe0\\xb8\\xb2.\\0\"\n    \"\\xe0\\xb8\\x88.\\0\"\n    \"\\xe0\\xb8\\xad.\\0\"\n    \"\\xe0\\xb8\\x9e.\\0\"\n    \"\\xe0\\xb8\\x9e\\xe0\\xb8\\xa4.\\0\"\n    \"\\xe0\\xb8\\xa8.\\0\"\n    \"\\xe0\\xb8\\xaa.\\0\"\n    \"\\xe0\\xb8\\xa1\\xe0\\xb8\\x81\\xe0\\xb8\\xa3\\xe0\\xb8\\xb2\\xe0\\xb8\\x84\\xe0\\xb8\\xa1\\0\"\n    \"\\xe0\\xb8\\x81\\xe0\\xb8\\xb8\\xe0\\xb8\\xa1\\xe0\\xb8\\xa0\\xe0\\xb8\\xb2\\xe0\\xb8\\x9e\\xe0\\xb8\\xb1\\xe0\\xb8\\x99\\xe0\\xb8\\x98\\xe0\\xb9\\x8c\\0\"\n    \"\\xe0\\xb8\\xa1\\xe0\\xb8\\xb5\\xe0\\xb8\\x99\\xe0\\xb8\\xb2\\xe0\\xb8\\x84\\xe0\\xb8\\xa1\\0\"\n    \"\\xe0\\xb9\\x80\\xe0\\xb8\\xa1\\xe0\\xb8\\xa9\\xe0\\xb8\\xb2\\xe0\\xb8\\xa2\\xe0\\xb8\\x99\\0\"\n    \"\\xe0\\xb8\\x9e\\xe0\\xb8\\xa4\\xe0\\xb8\\xa9\\xe0\\xb8\\xa0\\xe0\\xb8\\xb2\\xe0\\xb8\\x84\\xe0\\xb8\\xa1\\0\"\n    \"\\xe0\\xb8\\xa1\\xe0\\xb8\\xb4\\xe0\\xb8\\x96\\xe0\\xb8\\xb8\\xe0\\xb8\\x99\\xe0\\xb8\\xb2\\xe0\\xb8\\xa2\\xe0\\xb8\\x99\\0\"\n    \"\\xe0\\xb8\\x81\\xe0\\xb8\\xa3\\xe0\\xb8\\x81\\xe0\\xb8\\x8e\\xe0\\xb8\\xb2\\xe0\\xb8\\x84\\xe0\\xb8\\xa1\\0\"\n    \"\\xe0\\xb8\\xaa\\xe0\\xb8\\xb4\\xe0\\xb8\\x87\\xe0\\xb8\\xab\\xe0\\xb8\\xb2\\xe0\\xb8\\x84\\xe0\\xb8\\xa1\\0\"\n    \"\\xe0\\xb8\\x81\\xe0\\xb8\\xb1\\xe0\\xb8\\x99\\xe0\\xb8\\xa2\\xe0\\xb8\\xb2\\xe0\\xb8\\xa2\\xe0\\xb8\\x99\\0\"\n    \"\\xe0\\xb8\\x95\\xe0\\xb8\\xb8\\xe0\\xb8\\xa5\\xe0\\xb8\\xb2\\xe0\\xb8\\x84\\xe0\\xb8\\xa1\\0\"\n    \"\\xe0\\xb8\\x9e\\xe0\\xb8\\xa4\\xe0\\xb8\\xa8\\xe0\\xb8\\x88\\xe0\\xb8\\xb4\\xe0\\xb8\\x81\\xe0\\xb8\\xb2\\xe0\\xb8\\xa2\\xe0\\xb8\\x99\\0\"\n    \"\\xe0\\xb8\\x98\\xe0\\xb8\\xb1\\xe0\\xb8\\x99\\xe0\\xb8\\xa7\\xe0\\xb8\\xb2\\xe0\\xb8\\x84\\xe0\\xb8\\xa1\\0\"\n    \"\\xe0\\xb8\\xa1.\\xe0\\xb8\\x84.\\0\"\n    \"\\xe0\\xb8\\x81.\\xe0\\xb8\\x9e.\\0\"\n    \"\\xe0\\xb8\\xa1\\xe0\\xb8\\xb5.\\xe0\\xb8\\x84.\\0\"\n    \"\\xe0\\xb9\\x80\\xe0\\xb8\\xa1.\\xe0\\xb8\\xa2.\\0\"\n    \"\\xe0\\xb8\\x9e.\\xe0\\xb8\\x84.\\0\"\n    \"\\xe0\\xb8\\xa1\\xe0\\xb8\\xb4.\\xe0\\xb8\\xa2.\\0\"\n    \"\\xe0\\xb8\\x81.\\xe0\\xb8\\x84.\\0\"\n    \"\\xe0\\xb8\\xaa.\\xe0\\xb8\\x84.\\0\"\n    \"\\xe0\\xb8\\x81.\\xe0\\xb8\\xa2.\\0\"\n    \"\\xe0\\xb8\\x95.\\xe0\\xb8\\x84.\\0\"\n    \"\\xe0\\xb8\\x9e.\\xe0\\xb8\\xa2.\\0\"\n    \"\\xe0\\xb8\\x98.\\xe0\\xb8\\x84.\\0\"\n    \"H' \\xe0\\xb8\\x99\\xe0\\xb8\\xb2\\xe0\\xb8\\xac\\xe0\\xb8\\xb4\\xe0\\xb8\\x81\\xe0\\xb8\\xb2 'm' \\xe0\\xb8\\x99\\xe0\\xb8\\xb2\\xe0\\xb8\\x97\\xe0\\xb8\\xb5'\\0\"\n    \"dd MMMM yyyy EEEE HH:mm:ss\\0\"\n    \"dd MMMM yyyy EEEE\\0\"\n    \"Pazar\\0\"\n    \"Pazartesi\\0\"\n    \"Sal\\xc4\\xb1\\0\"\n    \"\\xc3\\x87\\x61r\\xc5\\x9f\\x61mba\\0\"\n    \"Per\\xc5\\x9f\\x65mbe\\0\"\n    \"Cuma\\0\"\n    \"Cumartesi\\0\"\n    \"Paz\\0\"\n    \"Pzt\\0\"\n    \"Sal\\0\"\n    \"\\xc3\\x87\\x61r\\0\"\n    \"Per\\0\"\n    \"Cum\\0\"\n    \"Cmt\\0\"\n    \"Ocak\\0\"\n    \"\\xc5\\x9eubat\\0\"\n    \"Mart\\0\"\n    \"Nisan\\0\"\n    \"May\\xc4\\xb1s\\0\"\n    \"Haziran\\0\"\n    \"Temmuz\\0\"\n    \"A\\xc4\\x9fustos\\0\"\n    \"Eyl\\xc3\\xbcl\\0\"\n    \"Ekim\\0\"\n    \"Kas\\xc4\\xb1m\\0\"\n    \"Aral\\xc4\\xb1k\\0\"\n    \"Oca\\0\"\n    \"\\xc5\\x9eub\\0\"\n    \"Nis\\0\"\n    \"Haz\\0\"\n    \"Tem\\0\"\n    \"A\\xc4\\x9fu\\0\"\n    \"Eyl\\0\"\n    \"Eki\\0\"\n    \"Kas\\0\"\n    \"Ara\\0\"\n    \"Minggu\\0\"\n    \"Senin\\0\"\n    \"Selasa\\0\"\n    \"Rabu\\0\"\n    \"Kamis\\0\"\n    \"Jumat\\0\"\n    \"Sabtu\\0\"\n    \"Min\\0\"\n    \"Sen\\0\"\n    \"Sel\\0\"\n    \"Rab\\0\"\n    \"Kam\\0\"\n    \"Jum\\0\"\n    \"Sab\\0\"\n    \"Januari\\0\"\n    \"Februari\\0\"\n    \"Maret\\0\"\n    \"Mei\\0\"\n    \"Agustus\\0\"\n    \"Desember\\0\"\n    \"Agu\\0\"\n    \"Des\\0\"\n    \"d MMMM yyyy H:mm:ss\\0\"\n    \"MMMM yyyy '\\xd1\\x80.'\\0\"\n    \"\\xd0\\x9d\\xd0\\xb5\\xd0\\xb4\\xd1\\x96\\xd0\\xbb\\xd1\\x8f\\0\"\n    \"\\xd0\\x9f\\xd0\\xbe\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd1\\x96\\xd0\\xbb\\xd0\\xbe\\xd0\\xba\\0\"\n    \"\\xd0\\x92\\xd1\\x96\\xd0\\xb2\\xd1\\x82\\xd0\\xbe\\xd1\\x80\\xd0\\xbe\\xd0\\xba\\0\"\n    \"\\xd0\\xa1\\xd0\\xb5\\xd1\\x80\\xd0\\xb5\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd0\\xa7\\xd0\\xb5\\xd1\\x82\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\0\"\n    \"\\xd0\\x9f'\\xd1\\x8f\\xd1\\x82\\xd0\\xbd\\xd0\\xb8\\xd1\\x86\\xd1\\x8f\\0\"\n    \"\\xd0\\xa1\\xd1\\x83\\xd0\\xb1\\xd0\\xbe\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd0\\x9d\\xd0\\xb4\\0\"\n    \"\\xd1\\x81\\xd1\\x96\\xd1\\x87\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xbb\\xd1\\x8e\\xd1\\x82\\xd0\\xbe\\xd0\\xb3\\xd0\\xbe\\0\"\n    \"\\xd0\\xb1\\xd0\\xb5\\xd1\\x80\\xd0\\xb5\\xd0\\xb7\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xba\\xd0\\xb2\\xd1\\x96\\xd1\\x82\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd1\\x82\\xd1\\x80\\xd0\\xb0\\xd0\\xb2\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x80\\xd0\\xb2\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xbb\\xd0\\xb8\\xd0\\xbf\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd1\\x80\\xd0\\xbf\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\xd0\\xb5\\xd1\\x81\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xb6\\xd0\\xbe\\xd0\\xb2\\xd1\\x82\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xbb\\xd0\\xb8\\xd1\\x81\\xd1\\x82\\xd0\\xbe\\xd0\\xbf\\xd0\\xb0\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd0\\xb3\\xd1\\x80\\xd1\\x83\\xd0\\xb4\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd1\\x81\\xd1\\x96\\xd1\\x87\\0\"\n    \"\\xd0\\xbb\\xd1\\x8e\\xd1\\x82\\0\"\n    \"\\xd0\\xb1\\xd0\\xb5\\xd1\\x80\\0\"\n    \"\\xd0\\xba\\xd0\\xb2\\xd1\\x96\\xd1\\x82\\0\"\n    \"\\xd1\\x82\\xd1\\x80\\xd0\\xb0\\xd0\\xb2\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x80\\xd0\\xb2\\0\"\n    \"\\xd0\\xbb\\xd0\\xb8\\xd0\\xbf\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd1\\x80\\xd0\\xbf\\0\"\n    \"\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\0\"\n    \"\\xd0\\xb6\\xd0\\xbe\\xd0\\xb2\\xd1\\x82\\0\"\n    \"\\xd0\\xbb\\xd0\\xb8\\xd1\\x81\\xd1\\x82\\0\"\n    \"\\xd0\\xb3\\xd1\\x80\\xd1\\x83\\xd0\\xb4\\0\"\n    \"d MMMM yyyy HH.mm.ss z\\0\"\n    \"\\xd0\\xbd\\xd1\\x8f\\xd0\\xb4\\xd0\\xb7\\xd0\\xb5\\xd0\\xbb\\xd1\\x8f\\0\"\n    \"\\xd0\\xbf\\xd0\\xb0\\xd0\\xbd\\xd1\\x8f\\xd0\\xb4\\xd0\\xb7\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\xd0\\xba\\0\"\n    \"\\xd0\\xb0\\xd1\\x9e\\xd1\\x82\\xd0\\xbe\\xd1\\x80\\xd0\\xb0\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd1\\x80\\xd0\\xb0\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd0\\xb0\\xd1\\x86\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\0\"\n    \"\\xd0\\xbf\\xd1\\x8f\\xd1\\x82\\xd0\\xbd\\xd1\\x96\\xd1\\x86\\xd0\\xb0\\0\"\n    \"\\xd1\\x81\\xd1\\x83\\xd0\\xb1\\xd0\\xbe\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd0\\xbd\\xd0\\xb4\\0\"\n    \"\\xd0\\xbf\\xd0\\xbd\\0\"\n    \"\\xd0\\xb0\\xd1\\x9e\\0\"\n    \"\\xd1\\x81\\xd1\\x80\\0\"\n    \"\\xd1\\x87\\xd1\\x86\\0\"\n    \"\\xd0\\xbf\\xd1\\x82\\0\"\n    \"\\xd1\\x81\\xd0\\xb1\\0\"\n    \"\\xd1\\x81\\xd1\\x82\\xd1\\x83\\xd0\\xb4\\xd0\\xb7\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xbb\\xd1\\x8e\\xd1\\x82\\xd1\\x8b\\0\"\n    \"\\xd1\\x81\\xd0\\xb0\\xd0\\xba\\xd0\\xb0\\xd0\\xb2\\xd1\\x96\\xd0\\xba\\0\"\n    \"\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\xd1\\x81\\xd0\\xb0\\xd0\\xb2\\xd1\\x96\\xd0\\xba\\0\"\n    \"\\xd1\\x87\\xd1\\x8d\\xd1\\x80\\xd0\\xb2\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xbb\\xd1\\x96\\xd0\\xbf\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xb6\\xd0\\xbd\\xd1\\x96\\xd0\\xb2\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\xd0\\xb0\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xba\\xd0\\xb0\\xd1\\x81\\xd1\\x82\\xd1\\x80\\xd1\\x8b\\xd1\\x87\\xd0\\xbd\\xd1\\x96\\xd0\\xba\\0\"\n    \"\\xd0\\xbb\\xd1\\x96\\xd1\\x81\\xd1\\x82\\xd0\\xb0\\xd0\\xbf\\xd0\\xb0\\xd0\\xb4\\0\"\n    \"\\xd1\\x81\\xd0\\xbd\\xd0\\xb5\\xd0\\xb6\\xd0\\xb0\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd1\\x81\\xd1\\x82\\xd1\\x83\\0\"\n    \"\\xd1\\x81\\xd0\\xb0\\xd0\\xba\\0\"\n    \"\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd1\\x8d\\xd1\\x80\\0\"\n    \"\\xd0\\xbb\\xd1\\x96\\xd0\\xbf\\0\"\n    \"\\xd0\\xb6\\xd0\\xbd\\xd1\\x96\\0\"\n    \"\\xd0\\xba\\xd0\\xb0\\xd1\\x81\\0\"\n    \"\\xd0\\xbb\\xd1\\x96\\xd1\\x81\\0\"\n    \"\\xd1\\x81\\xd0\\xbd\\xd0\\xb5\\0\"\n    \"dd. MMMM yyyy H:mm:ss\\0\"\n    \"dd. MMMM yyyy\\0\"\n    \"nedelja\\0\"\n    \"ponedeljek\\0\"\n    \"torek\\0\"\n    \"sreda\\0\"\n    \"\\xc4\\x8d\\x65trtek\\0\"\n    \"petek\\0\"\n    \"sre\\0\"\n    \"sob\\0\"\n    \"junij\\0\"\n    \"julij\\0\"\n    \"avgust\\0\"\n    \"avg\\0\"\n    \"yy.M.d\\0\"\n    \"d.MM.yyyy\\0\"\n    \"d, MMMM\\0\"\n    \"p\\xc3\\xbchap\\xc3\\xa4\\x65v\\0\"\n    \"esmasp\\xc3\\xa4\\x65v\\0\"\n    \"teisip\\xc3\\xa4\\x65v\\0\"\n    \"kolmap\\xc3\\xa4\\x65v\\0\"\n    \"neljap\\xc3\\xa4\\x65v\\0\"\n    \"reede\\0\"\n    \"laup\\xc3\\xa4\\x65v\\0\"\n    \"E\\0\"\n    \"T\\0\"\n    \"R\\0\"\n    \"jaanuar\\0\"\n    \"veebruar\\0\"\n    \"m\\xc3\\xa4rts\\0\"\n    \"aprill\\0\"\n    \"juuni\\0\"\n    \"juuli\\0\"\n    \"oktoober\\0\"\n    \"detsember\\0\"\n    \"jaan\\0\"\n    \"veebr\\0\"\n    \"sept\\0\"\n    \"dets\\0\"\n    \"yyyy'. gada 'd. MMMM H:mm:ss\\0\"\n    \"yyyy'. gada 'd. MMMM\\0\"\n    \"yyyy'. gada 'MMMM\\0\"\n    \"sv\\xc4\\x93tdiena\\0\"\n    \"pirmdiena\\0\"\n    \"otrdiena\\0\"\n    \"tre\\xc5\\xa1\\x64iena\\0\"\n    \"ceturtdiena\\0\"\n    \"piektdiena\\0\"\n    \"sestdiena\\0\"\n    \"Sv\\0\"\n    \"O\\0\"\n    \"C\\0\"\n    \"Pk\\0\"\n    \"janv\\xc4\\x81ris\\0\"\n    \"febru\\xc4\\x81ris\\0\"\n    \"apr\\xc4\\xablis\\0\"\n    \"maijs\\0\"\n    \"j\\xc5\\xabnijs\\0\"\n    \"j\\xc5\\xablijs\\0\"\n    \"augusts\\0\"\n    \"septembris\\0\"\n    \"oktobris\\0\"\n    \"novembris\\0\"\n    \"decembris\\0\"\n    \"J\\xc5\\xabn\\0\"\n    \"J\\xc5\\xabl\\0\"\n    \"yy.d.M\\0\"\n    \"yyyy 'm.' MMMM d 'd.' HH:mm:ss z\\0\"\n    \"yyyy 'm.' MMMM d 'd.'\\0\"\n    \"yyyy 'm.' MMMM\\0\"\n    \"MMMM d 'd.'\\0\"\n    \"Sekmadienis\\0\"\n    \"Pirmadienis\\0\"\n    \"Antradienis\\0\"\n    \"Tre\\xc4\\x8diadienis\\0\"\n    \"Ketvirtadienis\\0\"\n    \"Penktadienis\\0\"\n    \"\\xc5\\xa0\\x65\\xc5\\xa1tadienis\\0\"\n    \"Sk\\0\"\n    \"Pr\\0\"\n    \"An\\0\"\n    \"Tr\\0\"\n    \"Kt\\0\"\n    \"Sausio\\0\"\n    \"Vasario\\0\"\n    \"Kovo\\0\"\n    \"Baland\\xc5\\xbeio\\0\"\n    \"Gegu\\xc5\\xbe\\xc4\\x97s\\0\"\n    \"Bir\\xc5\\xbe\\x65lio\\0\"\n    \"Liepos\\0\"\n    \"Rugpj\\xc5\\xab\\xc4\\x8dio\\0\"\n    \"Rugs\\xc4\\x97jo\\0\"\n    \"Spalio\\0\"\n    \"Lapkri\\xc4\\x8dio\\0\"\n    \"Gruod\\xc5\\xbeio\\0\"\n    \"Sau\\0\"\n    \"Vas\\0\"\n    \"Kov\\0\"\n    \"Bal\\0\"\n    \"Geg\\0\"\n    \"Bir\\0\"\n    \"Lie\\0\"\n    \"Rgp\\0\"\n    \"Rgs\\0\"\n    \"Spa\\0\"\n    \"Lap\\0\"\n    \"Grd\\0\"\n    \"d MMMM yyyy hh:mm:ss tt\\0\"\n    \"M/d/yyyy\\0\"\n    \"\\xd9\\x82.\\xd8\\xb8.\\0\"\n    \"\\xd8\\xa8.\\xd8\\xb8.\\0\"\n    \"\\xdb\\x8c\\xda\\xa9\\xe2\\x80\\x8c\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xd8\\xaf\\xd9\\x88\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xd8\\xb3\\xd9\\x87\\xe2\\x80\\x8c\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xda\\x86\\xd9\\x87\\xd8\\xa7\\xd8\\xb1\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xd9\\xbe\\xd9\\x86\\xd8\\xac\\xe2\\x80\\x8c\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xd8\\xac\\xd9\\x85\\xd8\\xb9\\xd9\\x87\\0\"\n    \"\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xdb\\x8c.\\0\"\n    \"\\xd8\\xaf.\\0\"\n    \"\\xd8\\xb3.\\0\"\n    \"\\xda\\x86.\\0\"\n    \"\\xd9\\xbe.\\0\"\n    \"\\xd8\\xac.\\0\"\n    \"\\xd8\\xb4.\\0\"\n    \"\\xda\\x98\\xd8\\xa7\\xd9\\x86\\xd9\\x88\\xdb\\x8c\\xd9\\x87\\0\"\n    \"\\xd9\\x81\\xd9\\x88\\xd8\\xb1\\xdb\\x8c\\xd9\\x87\\0\"\n    \"\\xd8\\xa2\\xd9\\x88\\xd8\\xb1\\xdb\\x8c\\xd9\\x84\\0\"\n    \"\\xd9\\x85\\xd9\\x87\\0\"\n    \"\\xda\\x98\\xd9\\x88\\xd8\\xa6\\xd9\\x86\\0\"\n    \"\\xda\\x98\\xd9\\x88\\xd8\\xa6\\xdb\\x8c\\xd9\\x87\\0\"\n    \"\\xd8\\xa7\\xd9\\x88\\xd8\\xaa\\0\"\n    \"\\xd8\\xb3\\xd9\\xbe\\xd8\\xaa\\xd8\\xa7\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd8\\xa7\\xda\\xa9\\xd8\\xaa\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd9\\x86\\xd9\\x88\\xd8\\xa7\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd8\\xaf\\xd8\\xb3\\xd8\\xa7\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xda\\x98\\xd8\\xa7\\xd9\\x86\\0\"\n    \"\\xd9\\x81\\xd9\\x88\\xd8\\xb1\\0\"\n    \"\\xd9\\x85\\xd8\\xa7\\xd8\\xb1\\0\"\n    \"\\xd8\\xa2\\xd9\\x88\\xd8\\xb1\\0\"\n    \"\\xd9\\x85\\xd9\\x80\\xd9\\x87\\0\"\n    \"\\xda\\x98\\xd9\\x88\\xd9\\x86\\0\"\n    \"\\xda\\x98\\xd9\\x88\\xdb\\x8c\\0\"\n    \"\\xd8\\xb3\\xd9\\xbe\\xd8\\xaa\\0\"\n    \"\\xd8\\xa7\\xda\\xa9\\xd8\\xaa\\0\"\n    \"\\xd9\\x86\\xd9\\x88\\xd8\\xa7\\0\"\n    \"\\xd8\\xaf\\xd8\\xb3\\xd8\\xa7\\0\"\n    \"yyyy/MM/d\\0\"\n    \"HH:mm:ss (z)\\0\"\n    \"h:mm:ss tt dd MMMM yyyy\\0\"\n    \"SA\\0\"\n    \"CH\\0\"\n    \"Ch\\xe1\\xbb\\xa7 nh\\xe1\\xba\\xadt\\0\"\n    \"Th\\xe1\\xbb\\xa9 hai\\0\"\n    \"Th\\xe1\\xbb\\xa9 ba\\0\"\n    \"Th\\xe1\\xbb\\xa9 t\\xc6\\xb0\\0\"\n    \"Th\\xe1\\xbb\\xa9 n\\xc4\\x83m\\0\"\n    \"Th\\xe1\\xbb\\xa9 s\\xc3\\xa1u\\0\"\n    \"Th\\xe1\\xbb\\xa9 b\\xe1\\xba\\xa3y\\0\"\n    \"CN\\0\"\n    \"Th 2\\0\"\n    \"Th 3\\0\"\n    \"Th 4\\0\"\n    \"Th 5\\0\"\n    \"Th 6\\0\"\n    \"Th 7\\0\"\n    \"Th\\xc3\\xa1ng m\\xe1\\xbb\\x99t\\0\"\n    \"Th\\xc3\\xa1ng hai\\0\"\n    \"Th\\xc3\\xa1ng ba\\0\"\n    \"Th\\xc3\\xa1ng t\\xc6\\xb0\\0\"\n    \"Th\\xc3\\xa1ng n\\xc4\\x83m\\0\"\n    \"Th\\xc3\\xa1ng s\\xc3\\xa1u\\0\"\n    \"Th\\xc3\\xa1ng b\\xe1\\xba\\xa3y\\0\"\n    \"Th\\xc3\\xa1ng t\\xc3\\xa1m\\0\"\n    \"Th\\xc3\\xa1ng ch\\xc3\\xadn\\0\"\n    \"Th\\xc3\\xa1ng m\\xc6\\xb0\\xe1\\xbb\\x9di\\0\"\n    \"Th\\xc3\\xa1ng m\\xc6\\xb0\\xe1\\xbb\\x9di m\\xe1\\xbb\\x99t\\0\"\n    \"Th\\xc3\\xa1ng m\\xc6\\xb0\\xe1\\xbb\\x9di hai\\0\"\n    \"Thg 1\\0\"\n    \"Thg 2\\0\"\n    \"Thg 3\\0\"\n    \"Thg 4\\0\"\n    \"Thg 5\\0\"\n    \"Thg 6\\0\"\n    \"Thg 7\\0\"\n    \"Thg 8\\0\"\n    \"Thg 9\\0\"\n    \"Thg 10\\0\"\n    \"Thg 11\\0\"\n    \"Thg 12\\0\"\n    \"MMMM dd, yyyy H:mm:ss\\0\"\n    \"\\xd4\\xb1\\xd5\\xbc\\xe2\\x80\\xa4\\0\"\n    \"\\xd4\\xb5\\xd6\\x80\\xe2\\x80\\xa4\\0\"\n    \"\\xd4\\xbf\\xd5\\xab\\xd6\\x80\\xd5\\xa1\\xd5\\xaf\\xd5\\xab\\0\"\n    \"\\xd4\\xb5\\xd6\\x80\\xd5\\xaf\\xd5\\xb8\\xd6\\x82\\xd5\\xb7\\xd5\\xa1\\xd5\\xa2\\xd5\\xa9\\xd5\\xab\\0\"\n    \"\\xd4\\xb5\\xd6\\x80\\xd5\\xa5\\xd6\\x84\\xd5\\xb7\\xd5\\xa1\\xd5\\xa2\\xd5\\xa9\\xd5\\xab\\0\"\n    \"\\xd5\\x89\\xd5\\xb8\\xd6\\x80\\xd5\\xa5\\xd6\\x84\\xd5\\xb7\\xd5\\xa1\\xd5\\xa2\\xd5\\xa9\\xd5\\xab\\0\"\n    \"\\xd5\\x80\\xd5\\xab\\xd5\\xb6\\xd5\\xa3\\xd5\\xb7\\xd5\\xa1\\xd5\\xa2\\xd5\\xa9\\xd5\\xab\\0\"\n    \"\\xd5\\x88\\xd6\\x82\\xd6\\x80\\xd5\\xa2\\xd5\\xa1\\xd5\\xa9\\0\"\n    \"\\xd5\\x87\\xd5\\xa1\\xd5\\xa2\\xd5\\xa1\\xd5\\xa9\\0\"\n    \"\\xd4\\xbf\\xd5\\xab\\xd6\\x80\\0\"\n    \"\\xd4\\xb5\\xd6\\x80\\xd5\\xaf\\0\"\n    \"\\xd4\\xb5\\xd6\\x80\\xd6\\x84\\0\"\n    \"\\xd5\\x89\\xd5\\xb8\\xd6\\x80\\0\"\n    \"\\xd5\\x80\\xd5\\xb6\\xd5\\xa3\\0\"\n    \"\\xd5\\x88\\xd6\\x82\\xd6\\x80\\0\"\n    \"\\xd5\\x87\\xd5\\xa1\\xd5\\xa2\\0\"\n    \"\\xd5\\x85\\xd5\\xb8\\xd6\\x82\\xd5\\xb6\\xd5\\xb8\\xd6\\x82\\xd5\\xa1\\xd6\\x80\\0\"\n    \"\\xd5\\x93\\xd5\\xa5\\xd5\\xbf\\xd6\\x80\\xd5\\xb8\\xd6\\x82\\xd5\\xa1\\xd6\\x80\\0\"\n    \"\\xd5\\x84\\xd5\\xa1\\xd6\\x80\\xd5\\xbf\\0\"\n    \"\\xd4\\xb1\\xd5\\xba\\xd6\\x80\\xd5\\xab\\xd5\\xac\\0\"\n    \"\\xd5\\x84\\xd5\\xa1\\xd5\\xb5\\xd5\\xab\\xd5\\xbd\\0\"\n    \"\\xd5\\x85\\xd5\\xb8\\xd6\\x82\\xd5\\xb6\\xd5\\xab\\xd5\\xbd\\0\"\n    \"\\xd5\\x85\\xd5\\xb8\\xd6\\x82\\xd5\\xac\\xd5\\xab\\xd5\\xbd\\0\"\n    \"\\xd5\\x95\\xd5\\xa3\\xd5\\xb8\\xd5\\xbd\\xd5\\xbf\\xd5\\xb8\\xd5\\xbd\\0\"\n    \"\\xd5\\x8d\\xd5\\xa5\\xd5\\xba\\xd5\\xbf\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\0\"\n    \"\\xd5\\x80\\xd5\\xb8\\xd5\\xaf\\xd5\\xbf\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\0\"\n    \"\\xd5\\x86\\xd5\\xb8\\xd5\\xb5\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\0\"\n    \"\\xd4\\xb4\\xd5\\xa5\\xd5\\xaf\\xd5\\xbf\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\0\"\n    \"\\xd5\\x85\\xd5\\xb6\\xd6\\x80\\0\"\n    \"\\xd5\\x93\\xd5\\xbf\\xd6\\x80\\0\"\n    \"\\xd5\\x84\\xd6\\x80\\xd5\\xbf\\0\"\n    \"\\xd4\\xb1\\xd5\\xba\\xd6\\x80\\0\"\n    \"\\xd5\\x84\\xd5\\xb5\\xd5\\xbd\\0\"\n    \"\\xd5\\x85\\xd5\\xb6\\xd5\\xbd\\0\"\n    \"\\xd5\\x85\\xd5\\xac\\xd5\\xbd\\0\"\n    \"\\xd5\\x95\\xd5\\xa3\\xd5\\xbd\\0\"\n    \"\\xd5\\x8d\\xd5\\xa5\\xd5\\xba\\0\"\n    \"\\xd5\\x80\\xd5\\xb8\\xd5\\xaf\\0\"\n    \"\\xd5\\x86\\xd5\\xb8\\xd5\\xb5\\0\"\n    \"\\xd4\\xb4\\xd5\\xa5\\xd5\\xaf\\0\"\n    \"MM/dd/yy\\0\"\n    \"igandea\\0\"\n    \"astelehena\\0\"\n    \"asteartea\\0\"\n    \"asteazkena\\0\"\n    \"osteguna\\0\"\n    \"ostirala\\0\"\n    \"larunbata\\0\"\n    \"ig\\0\"\n    \"al\\0\"\n    \"as\\0\"\n    \"az\\0\"\n    \"og\\0\"\n    \"or\\0\"\n    \"lr\\0\"\n    \"urtarrila\\0\"\n    \"otsaila\\0\"\n    \"martxoa\\0\"\n    \"apirila\\0\"\n    \"maiatza\\0\"\n    \"ekaina\\0\"\n    \"uztaila\\0\"\n    \"abuztua\\0\"\n    \"iraila\\0\"\n    \"urria\\0\"\n    \"azaroa\\0\"\n    \"abendua\\0\"\n    \"urt\\0\"\n    \"ots\\0\"\n    \"api\\0\"\n    \"eka\\0\"\n    \"uzt\\0\"\n    \"abu\\0\"\n    \"ira\\0\"\n    \"urr\\0\"\n    \"aza\\0\"\n    \"abe\\0\"\n    \"\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82\\xd0\\xb2\\xd1\\x80\\xd1\\x82\\xd0\\xbe\\xd0\\xba\\0\"\n    \"\\xd0\\xbf\\xd0\\xb5\\xd1\\x82\\xd0\\xbe\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd0\\xb0\\xd0\\xb1\\xd0\\xbe\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd1\\x81\\xd1\\x80\\xd0\\xb5.\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82.\\0\"\n    \"\\xd1\\x81\\xd0\\xb0\\xd0\\xb1.\\0\"\n    \"\\xd1\\x98\\xd0\\xb0\\xd0\\xbd\\xd1\\x83\\xd0\\xb0\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x98\\0\"\n    \"\\xd1\\x98\\xd1\\x83\\xd0\\xbd\\xd0\\xb8\\0\"\n    \"\\xd1\\x98\\xd1\\x83\\xd0\\xbb\\xd0\\xb8\\0\"\n    \"\\xd1\\x98\\xd0\\xb0\\xd0\\xbd.\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x80.\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x98.\\0\"\n    \"\\xd1\\x98\\xd1\\x83\\xd0\\xbd.\\0\"\n    \"\\xd1\\x98\\xd1\\x83\\xd0\\xbb.\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbf\\xd1\\x82.\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd0\\xba\\xd0\\xb5\\xd0\\xbc.\\0\"\n    \"dd.M.yy\\0\"\n    \"VM\\0\"\n    \"NM\\0\"\n    \"Sondag\\0\"\n    \"Maandag\\0\"\n    \"Dinsdag\\0\"\n    \"Woensdag\\0\"\n    \"Donderdag\\0\"\n    \"Vrydag\\0\"\n    \"Saterdag\\0\"\n    \"Wo\\0\"\n    \"Vr\\0\"\n    \"Januarie\\0\"\n    \"Februarie\\0\"\n    \"Maart\\0\"\n    \"Junie\\0\"\n    \"Julie\\0\"\n    \"Augustus\\0\"\n    \"y MMMM d HH:mm:ss z\\0\"\n    \"y MMMM d\\0\"\n    \"y MMMM\\0\"\n    \"\\xe1\\x83\\x93\\xe1\\x83\\x98\\xe1\\x83\\x9a\\xe1\\x83\\x98\\xe1\\x83\\xa1\\0\"\n    \"\\xe1\\x83\\xa1\\xe1\\x83\\x90\\xe1\\x83\\xa6\\xe1\\x83\\x90\\xe1\\x83\\x9b\\xe1\\x83\\x9d\\xe1\\x83\\xa1\\0\"\n    \"d. MMM yyyy HH:mm:ss z\\0\"\n    \"m\\xc3\\xa1nadagur\\0\"\n    \"t\\xc3\\xbdsdagur\\0\"\n    \"mikudagur\\0\"\n    \"h\\xc3\\xb3sdagur\\0\"\n    \"fr\\xc3\\xadggjadagur\\0\"\n    \"leygardagur\\0\"\n    \"t\\xc3\\xbds\\0\"\n    \"mik\\0\"\n    \"h\\xc3\\xb3s\\0\"\n    \"fr\\xc3\\xad\\0\"\n    \"ley\\0\"\n    \"\\xe0\\xa4\\xaa\\xe0\\xa5\\x82\\xe0\\xa4\\xb0\\xe0\\xa5\\x8d\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb9\\xe0\\xa5\\x8d\\xe0\\xa4\\xa8\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\xaa\\xe0\\xa4\\xb0\\xe0\\xa4\\xbe\\xe0\\xa4\\xb9\\xe0\\xa5\\x8d\\xe0\\xa4\\xa8\\0\"\n    \"\\xe0\\xa4\\xb0\\xe0\\xa4\\xb5\\xe0\\xa4\\xbf\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa5\\x8b\\xe0\\xa4\\xae\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x82\\xe0\\xa4\\x97\\xe0\\xa4\\xb2\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xac\\xe0\\xa5\\x81\\xe0\\xa4\\xa7\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x97\\xe0\\xa5\\x81\\xe0\\xa4\\xb0\\xe0\\xa5\\x81\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb6\\xe0\\xa5\\x81\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb6\\xe0\\xa4\\xa8\\xe0\\xa4\\xbf\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb0\\xe0\\xa4\\xb5\\xe0\\xa4\\xbf\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa5\\x8b\\xe0\\xa4\\xae\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x82\\xe0\\xa4\\x97\\xe0\\xa4\\xb2\\0\"\n    \"\\xe0\\xa4\\xac\\xe0\\xa5\\x81\\xe0\\xa4\\xa7\\0\"\n    \"\\xe0\\xa4\\x97\\xe0\\xa5\\x81\\xe0\\xa4\\xb0\\xe0\\xa5\\x81\\0\"\n    \"\\xe0\\xa4\\xb6\\xe0\\xa5\\x81\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb6\\xe0\\xa4\\xa8\\xe0\\xa4\\xbf\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa4\\xa8\\xe0\\xa4\\xb5\\xe0\\xa4\\xb0\\xe0\\xa5\\x80\\0\"\n    \"\\xe0\\xa4\\xab\\xe0\\xa4\\xb0\\xe0\\xa4\\xb5\\xe0\\xa4\\xb0\\xe0\\xa5\\x80\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa5\\x8d\\xe0\\xa4\\x9a\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa5\\x88\\xe0\\xa4\\xb2\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x88\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa5\\x82\\xe0\\xa4\\xa8\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa5\\x81\\xe0\\xa4\\xb2\\xe0\\xa4\\xbe\\xe0\\xa4\\x88\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\x97\\xe0\\xa4\\xb8\\xe0\\xa5\\x8d\\xe0\\xa4\\xa4\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa4\\xbf\\xe0\\xa4\\xa4\\xe0\\xa4\\xae\\xe0\\xa5\\x8d\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\xa4\\xe0\\xa5\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa4\\xb5\\xe0\\xa4\\xae\\xe0\\xa5\\x8d\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xa6\\xe0\\xa4\\xbf\\xe0\\xa4\\xb8\\xe0\\xa4\\xae\\xe0\\xa5\\x8d\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"Jumapili\\0\"\n    \"Jumatatu\\0\"\n    \"Jumanne\\0\"\n    \"Jumatano\\0\"\n    \"Alhamisi\\0\"\n    \"Ijumaa\\0\"\n    \"Jumamosi\\0\"\n    \"Jpi\\0\"\n    \"Jtt\\0\"\n    \"Jnn\\0\"\n    \"Jtn\\0\"\n    \"Alh\\0\"\n    \"Iju\\0\"\n    \"Jmo\\0\"\n    \"Machi\\0\"\n    \"Aprili\\0\"\n    \"Julai\\0\"\n    \"Agosti\\0\"\n    \"Septemba\\0\"\n    \"Oktoba\\0\"\n    \"Novemba\\0\"\n    \"Desemba\\0\"\n    \"Ago\\0\"\n    \"\\xe0\\xaa\\xaa\\xe0\\xab\\x82\\xe0\\xaa\\xb0\\xe0\\xab\\x8d\\xe0\\xaa\\xb5\\xc2\\xa0\\xe0\\xaa\\xae\\xe0\\xaa\\xa7\\xe0\\xab\\x8d\\xe0\\xaa\\xaf\\xe0\\xaa\\xbe\\xe0\\xaa\\xb9\\xe0\\xab\\x8d\\xe0\\xaa\\xa8\\0\"\n    \"\\xe0\\xaa\\x89\\xe0\\xaa\\xa4\\xe0\\xab\\x8d\\xe0\\xaa\\xa4\\xe0\\xaa\\xb0\\xc2\\xa0\\xe0\\xaa\\xae\\xe0\\xaa\\xa7\\xe0\\xab\\x8d\\xe0\\xaa\\xaf\\xe0\\xaa\\xbe\\xe0\\xaa\\xb9\\xe0\\xab\\x8d\\xe0\\xaa\\xa8\\0\"\n    \"\\xe0\\xaa\\xb0\\xe0\\xaa\\xb5\\xe0\\xaa\\xbf\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xb8\\xe0\\xab\\x8b\\xe0\\xaa\\xae\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xae\\xe0\\xaa\\x82\\xe0\\xaa\\x97\\xe0\\xaa\\xb3\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xac\\xe0\\xab\\x81\\xe0\\xaa\\xa7\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\x97\\xe0\\xab\\x81\\xe0\\xaa\\xb0\\xe0\\xab\\x81\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xb6\\xe0\\xab\\x81\\xe0\\xaa\\x95\\xe0\\xab\\x8d\\xe0\\xaa\\xb0\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xb6\\xe0\\xaa\\xa8\\xe0\\xaa\\xbf\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xb0\\xe0\\xaa\\xb5\\xe0\\xaa\\xbf\\0\"\n    \"\\xe0\\xaa\\xb8\\xe0\\xab\\x8b\\xe0\\xaa\\xae\\0\"\n    \"\\xe0\\xaa\\xae\\xe0\\xaa\\x82\\xe0\\xaa\\x97\\xe0\\xaa\\xb3\\0\"\n    \"\\xe0\\xaa\\xac\\xe0\\xab\\x81\\xe0\\xaa\\xa7\\0\"\n    \"\\xe0\\xaa\\x97\\xe0\\xab\\x81\\xe0\\xaa\\xb0\\xe0\\xab\\x81\\0\"\n    \"\\xe0\\xaa\\xb6\\xe0\\xab\\x81\\xe0\\xaa\\x95\\xe0\\xab\\x8d\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xb6\\xe0\\xaa\\xa8\\xe0\\xaa\\xbf\\0\"\n    \"\\xe0\\xaa\\x9c\\xe0\\xaa\\xbe\\xe0\\xaa\\xa8\\xe0\\xab\\x8d\\xe0\\xaa\\xaf\\xe0\\xab\\x81\\xe0\\xaa\\x86\\xe0\\xaa\\xb0\\xe0\\xab\\x80\\0\"\n    \"\\xe0\\xaa\\xab\\xe0\\xab\\x87\\xe0\\xaa\\xac\\xe0\\xab\\x8d\\xe0\\xaa\\xb0\\xe0\\xab\\x81\\xe0\\xaa\\x86\\xe0\\xaa\\xb0\\xe0\\xab\\x80\\0\"\n    \"\\xe0\\xaa\\xae\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\xe0\\xab\\x8d\\xe0\\xaa\\x9a\\0\"\n    \"\\xe0\\xaa\\x8f\\xe0\\xaa\\xaa\\xe0\\xab\\x8d\\xe0\\xaa\\xb0\\xe0\\xaa\\xbf\\xe0\\xaa\\xb2\\0\"\n    \"\\xe0\\xaa\\xae\\xe0\\xab\\x87\\0\"\n    \"\\xe0\\xaa\\x9c\\xe0\\xab\\x82\\xe0\\xaa\\xa8\\0\"\n    \"\\xe0\\xaa\\x9c\\xe0\\xab\\x81\\xe0\\xaa\\xb2\\xe0\\xaa\\xbe\\xe0\\xaa\\x88\\0\"\n    \"\\xe0\\xaa\\x91\\xe0\\xaa\\x97\\xe0\\xaa\\xb8\\xe0\\xab\\x8d\\xe0\\xaa\\x9f\\0\"\n    \"\\xe0\\xaa\\xb8\\xe0\\xaa\\xaa\\xe0\\xab\\x8d\\xe0\\xaa\\x9f\\xe0\\xab\\x87\\xe0\\xaa\\xae\\xe0\\xab\\x8d\\xe0\\xaa\\xac\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\x91\\xe0\\xaa\\x95\\xe0\\xab\\x8d\\xe0\\xaa\\x9f\\xe0\\xab\\x8d\\xe0\\xaa\\xac\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xa8\\xe0\\xaa\\xb5\\xe0\\xab\\x87\\xe0\\xaa\\xae\\xe0\\xab\\x8d\\xe0\\xaa\\xac\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xa1\\xe0\\xaa\\xbf\\xe0\\xaa\\xb8\\xe0\\xab\\x87\\xe0\\xaa\\xae\\xe0\\xab\\x8d\\xe0\\xaa\\xac\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\x9c\\xe0\\xaa\\xbe\\xe0\\xaa\\xa8\\xe0\\xab\\x8d\\xe0\\xaa\\xaf\\xe0\\xab\\x81\\0\"\n    \"\\xe0\\xaa\\xab\\xe0\\xab\\x87\\xe0\\xaa\\xac\\xe0\\xab\\x8d\\xe0\\xaa\\xb0\\xe0\\xab\\x81\\0\"\n    \"\\xe0\\xaa\\xb8\\xe0\\xaa\\xaa\\xe0\\xab\\x8d\\xe0\\xaa\\x9f\\xe0\\xab\\x87\\0\"\n    \"\\xe0\\xaa\\x91\\xe0\\xaa\\x95\\xe0\\xab\\x8d\\xe0\\xaa\\x9f\\xe0\\xab\\x8b\\0\"\n    \"\\xe0\\xaa\\xa8\\xe0\\xaa\\xb5\\xe0\\xab\\x87\\0\"\n    \"\\xe0\\xaa\\xa1\\xe0\\xaa\\xbf\\xe0\\xaa\\xb8\\xe0\\xab\\x87\\0\"\n    \"\\xe0\\xae\\x95\\xe0\\xae\\xbe\\xe0\\xae\\xb2\\xe0\\xaf\\x88\\0\"\n    \"\\xe0\\xae\\xae\\xe0\\xae\\xbe\\xe0\\xae\\xb2\\xe0\\xaf\\x88\\0\"\n    \"\\xe0\\xae\\x9e\\xe0\\xae\\xbe\\xe0\\xae\\xaf\\xe0\\xae\\xbf\\xe0\\xae\\xb1\\xe0\\xaf\\x81\\0\"\n    \"\\xe0\\xae\\xa4\\xe0\\xae\\xbf\\xe0\\xae\\x99\\xe0\\xaf\\x8d\\xe0\\xae\\x95\\xe0\\xae\\xb3\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x9a\\xe0\\xaf\\x86\\xe0\\xae\\xb5\\xe0\\xaf\\x8d\\xe0\\xae\\xb5\\xe0\\xae\\xbe\\xe0\\xae\\xaf\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\xaa\\xe0\\xaf\\x81\\xe0\\xae\\xa4\\xe0\\xae\\xa9\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\xb5\\xe0\\xae\\xbf\\xe0\\xae\\xaf\\xe0\\xae\\xbe\\xe0\\xae\\xb4\\xe0\\xae\\xa9\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\xb5\\xe0\\xaf\\x86\\xe0\\xae\\xb3\\xe0\\xaf\\x8d\\xe0\\xae\\xb3\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\x9a\\xe0\\xae\\xa9\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\x9e\\xe0\\xae\\xbe\\0\"\n    \"\\xe0\\xae\\xa4\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\x9a\\xe0\\xaf\\x86\\0\"\n    \"\\xe0\\xae\\xaa\\xe0\\xaf\\x81\\0\"\n    \"\\xe0\\xae\\xb5\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\xb5\\xe0\\xaf\\x86\\0\"\n    \"\\xe0\\xae\\x9a\\0\"\n    \"\\xe0\\xae\\x9c\\xe0\\xae\\xa9\\xe0\\xae\\xb5\\xe0\\xae\\xb0\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\xaa\\xe0\\xae\\xbf\\xe0\\xae\\xaa\\xe0\\xaf\\x8d\\xe0\\xae\\xb0\\xe0\\xae\\xb5\\xe0\\xae\\xb0\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\xae\\xe0\\xae\\xbe\\xe0\\xae\\xb0\\xe0\\xaf\\x8d\\xe0\\xae\\x9a\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x8f\\xe0\\xae\\xaa\\xe0\\xaf\\x8d\\xe0\\xae\\xb0\\xe0\\xae\\xb2\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\xae\\xe0\\xaf\\x87\\0\"\n    \"\\xe0\\xae\\x9c\\xe0\\xaf\\x82\\xe0\\xae\\xa9\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x9c\\xe0\\xaf\\x82\\xe0\\xae\\xb2\\xe0\\xaf\\x88\\0\"\n    \"\\xe0\\xae\\x86\\xe0\\xae\\x95\\xe0\\xae\\xb8\\xe0\\xaf\\x8d\\xe0\\xae\\x9f\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x9a\\xe0\\xaf\\x86\\xe0\\xae\\xaa\\xe0\\xaf\\x8d\\xe0\\xae\\x9f\\xe0\\xae\\xae\\xe0\\xaf\\x8d\\xe0\\xae\\xaa\\xe0\\xae\\xb0\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x85\\xe0\\xae\\x95\\xe0\\xaf\\x8d\\xe0\\xae\\x9f\\xe0\\xaf\\x8b\\xe0\\xae\\xaa\\xe0\\xae\\xb0\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\xa8\\xe0\\xae\\xb5\\xe0\\xae\\xae\\xe0\\xaf\\x8d\\xe0\\xae\\xaa\\xe0\\xae\\xb0\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x9f\\xe0\\xae\\xbf\\xe0\\xae\\x9a\\xe0\\xae\\xae\\xe0\\xaf\\x8d\\xe0\\xae\\xaa\\xe0\\xae\\xb0\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x9c\\xe0\\xae\\xa9.\\0\"\n    \"\\xe0\\xae\\xaa\\xe0\\xae\\xbf\\xe0\\xae\\xaa\\xe0\\xaf\\x8d.\\0\"\n    \"\\xe0\\xae\\xae\\xe0\\xae\\xbe\\xe0\\xae\\xb0\\xe0\\xaf\\x8d.\\0\"\n    \"\\xe0\\xae\\x8f\\xe0\\xae\\xaa\\xe0\\xaf\\x8d.\\0\"\n    \"\\xe0\\xae\\x86\\xe0\\xae\\x95.\\0\"\n    \"\\xe0\\xae\\x9a\\xe0\\xaf\\x86\\xe0\\xae\\xaa\\xe0\\xaf\\x8d.\\0\"\n    \"\\xe0\\xae\\x85\\xe0\\xae\\x95\\xe0\\xaf\\x8d.\\0\"\n    \"\\xe0\\xae\\xa8\\xe0\\xae\\xb5.\\0\"\n    \"\\xe0\\xae\\x9f\\xe0\\xae\\xbf\\xe0\\xae\\x9a.\\0\"\n    \"\\xe0\\xb0\\xaa\\xe0\\xb1\\x82\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb9\\xe0\\xb1\\x8d\\xe0\\xb0\\xa8\\0\"\n    \"\\xe0\\xb0\\x85\\xe0\\xb0\\xaa\\xe0\\xb0\\xb0\\xe0\\xb0\\xbe\\xe0\\xb0\\xb9\\xe0\\xb1\\x8d\\xe0\\xb0\\xa8\\0\"\n    \"\\xe0\\xb0\\x86\\xe0\\xb0\\xa6\\xe0\\xb0\\xbf\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\xb8\\xe0\\xb1\\x8b\\xe0\\xb0\\xae\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\xae\\xe0\\xb0\\x82\\xe0\\xb0\\x97\\xe0\\xb0\\xb3\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\xac\\xe0\\xb1\\x81\\xe0\\xb0\\xa7\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\x97\\xe0\\xb1\\x81\\xe0\\xb0\\xb0\\xe0\\xb1\\x81\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\xb6\\xe0\\xb1\\x81\\xe0\\xb0\\x95\\xe0\\xb1\\x8d\\xe0\\xb0\\xb0\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\xb6\\xe0\\xb0\\xa8\\xe0\\xb0\\xbf\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\x86\\xe0\\xb0\\xa6\\xe0\\xb0\\xbf\\0\"\n    \"\\xe0\\xb0\\xb8\\xe0\\xb1\\x8b\\xe0\\xb0\\xae\\0\"\n    \"\\xe0\\xb0\\xae\\xe0\\xb0\\x82\\xe0\\xb0\\x97\\xe0\\xb0\\xb3\\0\"\n    \"\\xe0\\xb0\\xac\\xe0\\xb1\\x81\\xe0\\xb0\\xa7\\0\"\n    \"\\xe0\\xb0\\x97\\xe0\\xb1\\x81\\xe0\\xb0\\xb0\\xe0\\xb1\\x81\\0\"\n    \"\\xe0\\xb0\\xb6\\xe0\\xb1\\x81\\xe0\\xb0\\x95\\xe0\\xb1\\x8d\\xe0\\xb0\\xb0\\0\"\n    \"\\xe0\\xb0\\xb6\\xe0\\xb0\\xa8\\xe0\\xb0\\xbf\\0\"\n    \"\\xe0\\xb0\\x9c\\xe0\\xb0\\xa8\\xe0\\xb0\\xb5\\xe0\\xb0\\xb0\\xe0\\xb0\\xbf\\0\"\n    \"\\xe0\\xb0\\xab\\xe0\\xb0\\xbf\\xe0\\xb0\\xac\\xe0\\xb1\\x8d\\xe0\\xb0\\xb0\\xe0\\xb0\\xb5\\xe0\\xb0\\xb0\\xe0\\xb0\\xbf\\0\"\n    \"\\xe0\\xb0\\xae\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\xe0\\xb0\\x9a\\xe0\\xb0\\xbf\\0\"\n    \"\\xe0\\xb0\\x8f\\xe0\\xb0\\xaa\\xe0\\xb1\\x8d\\xe0\\xb0\\xb0\\xe0\\xb0\\xbf\\xe0\\xb0\\xb2\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb0\\xae\\xe0\\xb1\\x87\\0\"\n    \"\\xe0\\xb0\\x9c\\xe0\\xb1\\x82\\xe0\\xb0\\xa8\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb0\\x9c\\xe0\\xb1\\x82\\xe0\\xb0\\xb2\\xe0\\xb1\\x88\\0\"\n    \"\\xe0\\xb0\\x86\\xe0\\xb0\\x97\\xe0\\xb0\\xb8\\xe0\\xb1\\x8d\\xe0\\xb0\\x9f\\xe0\\xb1\\x81\\0\"\n    \"\\xe0\\xb0\\xb8\\xe0\\xb1\\x86\\xe0\\xb0\\xaa\\xe0\\xb1\\x8d\\xe0\\xb0\\x9f\\xe0\\xb1\\x86\\xe0\\xb0\\x82\\xe0\\xb0\\xac\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb0\\x85\\xe0\\xb0\\x95\\xe0\\xb1\\x8d\\xe0\\xb0\\x9f\\xe0\\xb1\\x8b\\xe0\\xb0\\xac\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb0\\xa8\\xe0\\xb0\\xb5\\xe0\\xb0\\x82\\xe0\\xb0\\xac\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb0\\xa1\\xe0\\xb0\\xbf\\xe0\\xb0\\xb8\\xe0\\xb1\\x86\\xe0\\xb0\\x82\\xe0\\xb0\\xac\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb2\\xaa\\xe0\\xb3\\x82\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb9\\xe0\\xb3\\x8d\\xe0\\xb2\\xa8\\0\"\n    \"\\xe0\\xb2\\x85\\xe0\\xb2\\xaa\\xe0\\xb2\\xb0\\xe0\\xb2\\xbe\\xe0\\xb2\\xb9\\xe0\\xb3\\x8d\\xe0\\xb2\\xa8\\0\"\n    \"\\xe0\\xb2\\xb0\\xe0\\xb2\\xb5\\xe0\\xb2\\xbf\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xb8\\xe0\\xb3\\x8b\\xe0\\xb2\\xae\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xae\\xe0\\xb2\\x82\\xe0\\xb2\\x97\\xe0\\xb2\\xb3\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xac\\xe0\\xb3\\x81\\xe0\\xb2\\xa7\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\x97\\xe0\\xb3\\x81\\xe0\\xb2\\xb0\\xe0\\xb3\\x81\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xb6\\xe0\\xb3\\x81\\xe0\\xb2\\x95\\xe0\\xb3\\x8d\\xe0\\xb2\\xb0\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xb6\\xe0\\xb2\\xa8\\xe0\\xb2\\xbf\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xb0.\\0\"\n    \"\\xe0\\xb2\\xb8\\xe0\\xb3\\x8b.\\0\"\n    \"\\xe0\\xb2\\xae\\xe0\\xb2\\x82.\\0\"\n    \"\\xe0\\xb2\\xac\\xe0\\xb3\\x81.\\0\"\n    \"\\xe0\\xb2\\x97\\xe0\\xb3\\x81.\\0\"\n    \"\\xe0\\xb2\\xb6\\xe0\\xb3\\x81.\\0\"\n    \"\\xe0\\xb2\\xb6\\xe0\\xb2\\xa8\\xe0\\xb2\\xbf.\\0\"\n    \"\\xe0\\xb2\\x9c\\xe0\\xb2\\xa8\\xe0\\xb2\\xb5\\xe0\\xb2\\xb0\\xe0\\xb3\\x80\\0\"\n    \"\\xe0\\xb2\\xab\\xe0\\xb3\\x86\\xe0\\xb2\\xac\\xe0\\xb3\\x8d\\xe0\\xb2\\xb0\\xe0\\xb2\\xb5\\xe0\\xb2\\xb0\\xe0\\xb3\\x80\\0\"\n    \"\\xe0\\xb2\\xae\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\xe0\\xb2\\x9a\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\x8e\\xe0\\xb2\\xaa\\xe0\\xb3\\x8d\\xe0\\xb2\\xb0\\xe0\\xb2\\xbf\\xe0\\xb2\\xb2\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\xae\\xe0\\xb3\\x86\\0\"\n    \"\\xe0\\xb2\\x9c\\xe0\\xb3\\x82\\xe0\\xb2\\xa8\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\x9c\\xe0\\xb3\\x81\\xe0\\xb2\\xb2\\xe0\\xb3\\x88\\0\"\n    \"\\xe0\\xb2\\x86\\xe0\\xb2\\x97\\xe0\\xb2\\xb8\\xe0\\xb3\\x8d\\xe0\\xb2\\x9f\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\xb8\\xe0\\xb2\\xaa\\xe0\\xb3\\x8d\\xe0\\xb2\\x9f\\xe0\\xb3\\x86\\xe0\\xb2\\x82\\xe0\\xb2\\xac\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\x85\\xe0\\xb2\\x95\\xe0\\xb3\\x8d\\xe0\\xb2\\x9f\\xe0\\xb3\\x8b\\xe0\\xb2\\xac\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\xa8\\xe0\\xb2\\xb5\\xe0\\xb3\\x86\\xe0\\xb2\\x82\\xe0\\xb2\\xac\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\xa1\\xe0\\xb2\\xbf\\xe0\\xb2\\xb8\\xe0\\xb3\\x86\\xe0\\xb2\\x82\\xe0\\xb2\\xac\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xa4\\xae.\\xe0\\xa4\\xaa\\xe0\\xa5\\x82.\\0\"\n    \"\\xe0\\xa4\\xae.\\xe0\\xa4\\xa8\\xe0\\xa4\\x82.\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x82\\xe0\\xa4\\x97\\xe0\\xa4\\xb3\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x82\\xe0\\xa4\\x97\\xe0\\xa4\\xb3\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa4\\xbe\\xe0\\xa4\\xa8\\xe0\\xa5\\x87\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa5\\x80\\0\"\n    \"\\xe0\\xa4\\xab\\xe0\\xa5\\x87\\xe0\\xa4\\xac\\xe0\\xa5\\x83\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa5\\x80\\0\"\n    \"\\xe0\\xa4\\x8f\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa4\\xbf\\xe0\\xa4\\xb2\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa5\\x87\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa5\\x81\\xe0\\xa4\\xb2\\xe0\\xa5\\x88\\0\"\n    \"\\xe0\\xa4\\x93\\xe0\\xa4\\x97\\xe0\\xa4\\xb8\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa5\\x87\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x87\\xe0\\xa4\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x93\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x8b\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa5\\x8b\\xe0\\xa4\\xb5\\xe0\\xa5\\x8d\\xe0\\xa4\\xb9\\xe0\\xa5\\x87\\xe0\\xa4\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xa1\\xe0\\xa4\\xbf\\xe0\\xa4\\xb8\\xe0\\xa5\\x87\\xe0\\xa4\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"Domingo\\0\"\n    \"Luns\\0\"\n    \"Martes\\0\"\n    \"M\\xc3\\xa9rcores\\0\"\n    \"Xoves\\0\"\n    \"Venres\\0\"\n    \"S\\xc3\\xa1\\x62\\x61\\x64o\\0\"\n    \"Dom\\0\"\n    \"Lun\\0\"\n    \"M\\xc3\\xa9r\\0\"\n    \"Xov\\0\"\n    \"Ven\\0\"\n    \"S\\xc3\\xa1\\x62\\0\"\n    \"Xaneiro\\0\"\n    \"Febreiro\\0\"\n    \"Marzo\\0\"\n    \"Abril\\0\"\n    \"Maio\\0\"\n    \"Xu\\xc3\\xb1o\\0\"\n    \"Xullo\\0\"\n    \"Agosto\\0\"\n    \"Setembro\\0\"\n    \"Outubro\\0\"\n    \"Novembro\\0\"\n    \"Decembro\\0\"\n    \"Xan\\0\"\n    \"Abr\\0\"\n    \"Xu\\xc3\\xb1\\0\"\n    \"Xul\\0\"\n    \"Set\\0\"\n    \"Out\\0\"\n    \"\\xe0\\xa4\\x86\\xe0\\xa4\\xa6\\xe0\\xa4\\xbf\\xe0\\xa4\\xa4\\xe0\\xa5\\x8d\\xe0\\xa4\\xaf\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x82\\xe0\\xa4\\x97\\xe0\\xa4\\xb3\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xab\\xe0\\xa5\\x87\\xe0\\xa4\\xac\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa5\\x81\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa5\\x80\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5' thh'\\xe6\\x99\\x82'mm'\\xe5\\x88\\x86'ss'\\xe7\\xa7\\x92'\\0\"\n    \"thh'\\xe6\\x99\\x82'mm'\\xe5\\x88\\x86'ss'\\xe7\\xa7\\x92'\\0\"\n    \"t h:mm\\0\"\n    \"dd-MMM-yy\\0\"\n    \"dd MMMM yyyy H.mm.ss\\0\"\n    \"H.mm.ss\\0\"\n    \"yyyy'\\xeb\\x85\\x84' M'\\xec\\x9b\\x94' d'\\xec\\x9d\\xbc' tt h'\\xec\\x8b\\x9c' mm'\\xeb\\xb6\\x84' ss'\\xec\\xb4\\x88'\\0\"\n    \"yyyy'\\xeb\\x85\\x84' M'\\xec\\x9b\\x94' d'\\xec\\x9d\\xbc'\\0\"\n    \"tt h'\\xec\\x8b\\x9c' mm'\\xeb\\xb6\\x84' ss'\\xec\\xb4\\x88'\\0\"\n    \"yyyy. MM. dd\\0\"\n    \"yy. MM. dd\\0\"\n    \"yyyy'\\xeb\\x85\\x84' MM'\\xec\\x9b\\x94' dd'\\xec\\x9d\\xbc'\\0\"\n    \"yy'\\xeb\\x85\\x84' M'\\xec\\x9b\\x94' d'\\xec\\x9d\\xbc'\\0\"\n    \"yy'\\xeb\\x85\\x84' MM'\\xec\\x9b\\x94' dd'\\xec\\x9d\\xbc'\\0\"\n    \"H'\\xec\\x8b\\x9c' m'\\xeb\\xb6\\x84'\\0\"\n    \"H'\\xec\\x8b\\x9c' mm'\\xeb\\xb6\\x84'\\0\"\n    \"HH'\\xec\\x8b\\x9c' mm'\\xeb\\xb6\\x84'\\0\"\n    \"tt h'\\xec\\x8b\\x9c' m'\\xeb\\xb6\\x84'\\0\"\n    \"tt h'\\xec\\x8b\\x9c' mm'\\xeb\\xb6\\x84'\\0\"\n    \"tt hh'\\xec\\x8b\\x9c' mm'\\xeb\\xb6\\x84'\\0\"\n    \"H'\\xec\\x8b\\x9c' m'\\xeb\\xb6\\x84' ss'\\xec\\xb4\\x88'\\0\"\n    \"HH'\\xec\\x8b\\x9c' mm'\\xeb\\xb6\\x84' ss'\\xec\\xb4\\x88'\\0\"\n    \"tt h'\\xec\\x8b\\x9c' m'\\xeb\\xb6\\x84' ss'\\xec\\xb4\\x88'\\0\"\n    \"tt hh'\\xec\\x8b\\x9c' mm'\\xeb\\xb6\\x84' ss'\\xec\\xb4\\x88'\\0\"\n    \"d-M-yyyy\\0\"\n    \"d' de 'MMMM' de 'yyyy HH:mm:ss\\0\"\n    \"H'h'm'min's's' z\\0\"\n    \"'den 'd MMM yyyy HH:mm:ss\\0\"\n    \"dd MMMM yyyy H:mm:ss\\0\"\n    \"yyyy 'm.' MMMM d 'd.' HH:mm:ss\\0\"\n    \"\\xd4\\xbf\\xd5\\xa5\\xe2\\x80\\xa4\\0\"\n    \"\\xd5\\x80\\xd5\\xb8\\xd6\\x82\\xd5\\xb6\\xd5\\xbe\\xd5\\xa1\\xd6\\x80\\0\"\n    \"\\xd5\\x93\\xd5\\xa5\\xd5\\xbf\\xd6\\x80\\xd5\\xbe\\xd5\\xa1\\xd6\\x80\\0\"\n    \"\\xd5\\x80\\xd5\\xb8\\xd6\\x82\\xd5\\xb6\\xd5\\xab\\xd5\\xbd\\0\"\n    \"\\xd5\\x80\\xd5\\xb8\\xd6\\x82\\xd5\\xac\\xd5\\xab\\xd5\\xbd\\0\"\n    \"\\xd5\\x80\\xd5\\xb6\\xd5\\xbe\\0\"\n    \"\\xd5\\x93\\xd5\\xbf\\xd5\\xbe\\0\"\n    \"\\xd5\\x80\\xd5\\xb6\\xd5\\xbd\\0\"\n    \"\\xd5\\x80\\xd5\\xac\\xd5\\xbd\\0\"\n    \"EEE, yyyy'eko' MMM'ren' dd'a' HH:mm:ss\\0\"\n    \"EEE, yyyy'eko' MMM'ren' dd'a'\\0\"\n    \"yyyy'eko' MMMM\\0\"\n    \"yy'-'MM'-'dd\\0\"\n    \"dd MMMM yyyy hh:mm:ss tt\\0\"\n    \"yyyy '\\xe1\\x83\\xac\\xe1\\x83\\x9a\\xe1\\x83\\x98\\xe1\\x83\\xa1' dd MM, dddd H:mm:ss\\0\"\n    \"yyyy '\\xe1\\x83\\xac\\xe1\\x83\\x9a\\xe1\\x83\\x98\\xe1\\x83\\xa1' dd MM, dddd\\0\"\n    \"d. MMM yyyy HH.mm.ss\\0\"\n    \"HH.mm.ss\\0\"\n    \"yyyy MMMM d  h.mm.ss tt\\0\"\n    \"h.mm.ss tt\\0\"\n    \"d MMMM yyyy hh:mm:ss t z\\0\"\n    \"d-MM-yy\\0\"\n    \"hh:mm:ss t z\\0\"\n    \"hh:mm t\\0\"\n    \"d MMMM yyyy h:mm:ss t z\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5' thh'\\xe6\\x97\\xb6'mm'\\xe5\\x88\\x86'ss'\\xe7\\xa7\\x92'\\0\"\n    \"yy-M-d\\0\"\n    \"thh'\\xe6\\x97\\xb6'mm'\\xe5\\x88\\x86'ss'\\xe7\\xa7\\x92'\\0\"\n    \"th:mm\\0\"\n    \"d' de 'MMMM' de 'yyyy H:mm:ss\\0\"\n    \"d MMMM, yyyy hh:mm:ss tt\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MM'\\xe6\\x9c\\x88'dd'\\xe6\\x97\\xa5' thh'\\xe6\\x99\\x82'mm'\\xe5\\x88\\x86'ss'\\xe7\\xa7\\x92'\\0\"\n    \"yy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5'\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MM'\\xe6\\x9c\\x88'\\0\"\n    \"MM'\\xe6\\x9c\\x88'dd'\\xe6\\x97\\xa5'\\0\"\n    \"dd. MMMM yyyy HH:mm:ss\\0\"\n    \"J\\xc3\\xa4nner\\0\"\n    \"J\\xc3\\xa4n\\0\"\n    \"M\\xc3\\xa4r\\0\"\n    \"d MMMM yyyy h:mm:ss tt\\0\"\n    \"dddd, dd' de 'MMMM' de 'yyyy H:mm:ss\\0\"\n    \"dddd, dd' de 'MMMM' de 'yyyy\\0\"\n    \"MMMM' de 'yyyy\\0\"\n    \"dd MMM yyyy t hh:mm:ss\\0\"\n    \"dd MMM yyyy\\0\"\n    \"t hh:mm:ss\\0\"\n    \"t hh:mm\\0\"\n    \"MMMM d, yyyy h:mm:ss tt\\0\"\n    \"MMMM d, yyyy\\0\"\n    \"d MMMM, yyyy H:mm:ss\\0\"\n    \"\\xd9\\x83\\xd8\\xa7\\xd9\\x86\\xd9\\x88\\xd9\\x86 \\xd8\\xa7\\xd9\\x84\\xd8\\xab\\xd8\\xa7\\xd9\\x86\\xd9\\x8a\\0\"\n    \"\\xd8\\xb4\\xd8\\xa8\\xd8\\xa7\\xd8\\xb7\\0\"\n    \"\\xd8\\xa2\\xd8\\xb0\\xd8\\xa7\\xd8\\xb1\\0\"\n    \"\\xd9\\x86\\xd9\\x8a\\xd8\\xb3\\xd8\\xa7\\xd9\\x86\\0\"\n    \"\\xd9\\x86\\xd9\\x88\\xd8\\xa7\\xd8\\xb1\\0\"\n    \"\\xd8\\xad\\xd8\\xb2\\xd9\\x8a\\xd8\\xb1\\xd8\\xa7\\xd9\\x86\\0\"\n    \"\\xd8\\xaa\\xd9\\x85\\xd9\\x88\\xd8\\xb2\\0\"\n    \"\\xd8\\xa2\\xd8\\xa8\\0\"\n    \"\\xd8\\xa3\\xd9\\x8a\\xd9\\x84\\xd9\\x88\\xd9\\x84\\0\"\n    \"\\xd8\\xaa\\xd8\\xb4\\xd8\\xb1\\xd9\\x8a\\xd9\\x86 \\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd9\\x88\\xd9\\x84\\0\"\n    \"\\xd8\\xaa\\xd8\\xb4\\xd8\\xb1\\xd9\\x8a\\xd9\\x86 \\xd8\\xa7\\xd9\\x84\\xd8\\xab\\xd8\\xa7\\xd9\\x86\\xd9\\x8a\\0\"\n    \"\\xd9\\x83\\xd8\\xa7\\xd9\\x86\\xd9\\x88\\xd9\\x86 \\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd9\\x88\\xd9\\x84\\0\"\n    \"\\xd8\\xa3\\xd9\\x8a\\xd8\\xa7\\xd8\\xb1\\0\"\n    \"dddd, dd MMMM yyyy hh:mm:ss tt\\0\"\n    \"dddd, dd MMMM yyyy\\0\"\n    \"dd' de 'MMMM' de 'yyyy hh:mm:ss tt\\0\"\n    \"dd' de 'MMMM' de 'yyyy\\0\"\n    \"dd' de 'MMMM\\0\"\n    \"\\xd9\\xab\\0\"\n    \"\\xd9\\xac\\0\"\n    \"\\xd9\\xaa\\0\"\n    \"\\xef\\xbf\\xbd\\0\"\n    \"\\xe2\\x80\\xb0\\0\"\n    \"-\\xe2\\x88\\x9e\\0\"\n    \"\\xe2\\x88\\x9e\\0\"\n    \"-\\0\"\n    \"+\\0\"\n    \",\\0\"\n    \"\\xc2\\xa0\\0\"\n    \"%\\0\"\n    \".\\0\"\n    \"NaN\\0\"\n    \"-Infinity\\0\"\n    \"Infinity\\0\"\n    \"\\xd8\\xb1.\\xd8\\xb3.\\xe2\\x80\\x8f\\0\"\n    \"\\xd0\\xbb\\xd0\\xb2.\\0\"\n    \"\\xe2\\x82\\xac\\0\"\n    \"NT$\\0\"\n    \"K\\xc4\\x8d\\0\"\n    \"kr\\0\"\n    \"$\\0\"\n    \"\\xe2\\x82\\xaa\\0\"\n    \"Ft\\0\"\n    \"kr.\\0\"\n    \"\\\\\\0\"\n    \"\\xef\\xbf\\xa6\\0\"\n    \"z\\xc5\\x82\\0\"\n    \"R$ \\0\"\n    \"lei\\0\"\n    \"\\xd1\\x80.\\0\"\n    \"Kn\\0\"\n    \"Lek\\0\"\n    \"\\xe0\\xb8\\xbf\\0\"\n    \"TL\\0\"\n    \"Rp\\0\"\n    \"\\xd0\\xb3\\xd1\\x80\\xd0\\xbd.\\0\"\n    \"SIT\\0\"\n    \"Ls\\0\"\n    \"Lt\\0\"\n    \"\\xef\\xb7\\xbc\\0\"\n    \"\\xc4\\x91\\0\"\n    \"Den\\0\"\n    \"\\xe0\\xa4\\xb0\\xe0\\xa5\\x81\\0\"\n    \"KSh\\0\"\n    \"\\xe0\\xaa\\xb0\\xe0\\xab\\x81\\0\"\n    \"\\xe0\\xae\\xb0\\xe0\\xaf\\x82\\0\"\n    \"\\xe0\\xb0\\xb0\\xe0\\xb1\\x82.\\0\"\n    \"\\xd8\\xaf.\\xd8\\xb9.\\xe2\\x80\\x8f\\0\"\n    \"\\xef\\xbf\\xa5\\0\"\n    \"'\\0\"\n    \"SFr.\\0\"\n    \"\\xc2\\xa3\\0\"\n    \"\\xd8\\xac.\\xd9\\x85.\\xe2\\x80\\x8f\\0\"\n    \"HK$\\0\"\n    \"\\xd8\\xaf.\\xd9\\x84.\\xe2\\x80\\x8f\\0\"\n    \"S$\\0\"\n    \"Q\\0\"\n    \"sFr.\\0\"\n    \"\\xd8\\xaf.\\xd8\\xac.\\xe2\\x80\\x8f\\0\"\n    \"CRC\\0\"\n    \"\\xd8\\xaf.\\xd9\\x85.\\xe2\\x80\\x8f\\0\"\n    \"B/\\0\"\n    \"\\xd8\\xaf.\\xd8\\xaa.\\xe2\\x80\\x8f\\0\"\n    \"RD$\\0\"\n    \"\\xd8\\xb1.\\xd8\\xb9.\\xe2\\x80\\x8f\\0\"\n    \"Bs\\0\"\n    \"\\xd8\\xb1.\\xd9\\x8a.\\xe2\\x80\\x8f\\0\"\n    \"\\xd9\\x84.\\xd8\\xb3.\\xe2\\x80\\x8f\\0\"\n    \"S/\\0\"\n    \"\\xd8\\xaf.\\xd8\\xa3.\\xe2\\x80\\x8f\\0\"\n    \"\\xd9\\x84.\\xd9\\x84.\\xe2\\x80\\x8f\\0\"\n    \"Z$\\0\"\n    \"S/.\\0\"\n    \"\\xd8\\xaf.\\xd9\\x83.\\xe2\\x80\\x8f\\0\"\n    \"PHP\\0\"\n    \"\\xd8\\xaf.\\xd8\\xa5.\\xe2\\x80\\x8f\\0\"\n    \"NU$\\0\"\n    \"\\xd8\\xaf.\\xd8\\xa8.\\xe2\\x80\\x8f\\0\"\n    \"Gs\\0\"\n    \"\\xd8\\xb1.\\xd9\\x82.\\xe2\\x80\\x8f\\0\"\n    \"$b\\0\"\n    \"SVC\\0\"\n    \"L.\\0\"\n    \"C$\\0\"\n    \"ar\\0\"\n    \"Arabic\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9\\0\"\n    \"ARA\\0\"\n    \"ara\\0\"\n    \"bg\\0\"\n    \"Bulgarian\\0\"\n    \"\\xd0\\x91\\xd1\\x8a\\xd0\\xbb\\xd0\\xb3\\xd0\\xb0\\xd1\\x80\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\0\"\n    \"BGR\\0\"\n    \"bul\\0\"\n    \"ca\\0\"\n    \"Catalan\\0\"\n    \"catal\\xc3\\xa0\\0\"\n    \"CAT\\0\"\n    \"cat\\0\"\n    \"zh-CHS\\0\"\n    \"Chinese\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87\\0\"\n    \"CHS\\0\"\n    \"zho\\0\"\n    \"zh\\0\"\n    \"cs\\0\"\n    \"Czech\\0\"\n    \"\\xc4\\x8c\\x65\\xc5\\xa1tina\\0\"\n    \"CSY\\0\"\n    \"ces\\0\"\n    \"da\\0\"\n    \"Danish\\0\"\n    \"Dansk\\0\"\n    \"DAN\\0\"\n    \"dan\\0\"\n    \"de\\0\"\n    \"German\\0\"\n    \"Deutsch\\0\"\n    \"DEU\\0\"\n    \"deu\\0\"\n    \"el\\0\"\n    \"Greek\\0\"\n    \"\\xce\\x95\\xce\\xbb\\xce\\xbb\\xce\\xb7\\xce\\xbd\\xce\\xb9\\xce\\xba\\xce\\xac\\0\"\n    \"ELL\\0\"\n    \"ell\\0\"\n    \"en\\0\"\n    \"English\\0\"\n    \"ENU\\0\"\n    \"eng\\0\"\n    \"es\\0\"\n    \"Spanish\\0\"\n    \"espa\\xc3\\xb1ol\\0\"\n    \"ESP\\0\"\n    \"spa\\0\"\n    \"fi\\0\"\n    \"Finnish\\0\"\n    \"suomi\\0\"\n    \"FIN\\0\"\n    \"fin\\0\"\n    \"French\\0\"\n    \"fran\\xc3\\xa7\\x61is\\0\"\n    \"FRA\\0\"\n    \"fra\\0\"\n    \"he\\0\"\n    \"Hebrew\\0\"\n    \"\\xd7\\xa2\\xd7\\x91\\xd7\\xa8\\xd7\\x99\\xd7\\xaa\\0\"\n    \"HEB\\0\"\n    \"heb\\0\"\n    \"hu\\0\"\n    \"Hungarian\\0\"\n    \"magyar\\0\"\n    \"HUN\\0\"\n    \"hun\\0\"\n    \"is\\0\"\n    \"Icelandic\\0\"\n    \"\\xc3\\xadslenska\\0\"\n    \"ISL\\0\"\n    \"isl\\0\"\n    \"it\\0\"\n    \"Italian\\0\"\n    \"italiano\\0\"\n    \"ITA\\0\"\n    \"ita\\0\"\n    \"ja\\0\"\n    \"Japanese\\0\"\n    \"\\xe6\\x97\\xa5\\xe6\\x9c\\xac\\xe8\\xaa\\x9e\\0\"\n    \"JPN\\0\"\n    \"jpn\\0\"\n    \"ko\\0\"\n    \"Korean\\0\"\n    \"\\xed\\x95\\x9c\\xea\\xb5\\xad\\xec\\x96\\xb4\\0\"\n    \"KOR\\0\"\n    \"kor\\0\"\n    \"nl\\0\"\n    \"Dutch\\0\"\n    \"Nederlands\\0\"\n    \"NLD\\0\"\n    \"nld\\0\"\n    \"no\\0\"\n    \"Norwegian\\0\"\n    \"norsk\\0\"\n    \"NOR\\0\"\n    \"nor\\0\"\n    \"pl\\0\"\n    \"Polish\\0\"\n    \"polski\\0\"\n    \"PLK\\0\"\n    \"pol\\0\"\n    \"pt\\0\"\n    \"Portuguese\\0\"\n    \"portugu\\xc3\\xaas\\0\"\n    \"PTB\\0\"\n    \"por\\0\"\n    \"ro\\0\"\n    \"Romanian\\0\"\n    \"Rom\\xc3\\xa2n\\xc4\\x83\\0\"\n    \"ROM\\0\"\n    \"ron\\0\"\n    \"ru\\0\"\n    \"Russian\\0\"\n    \"\\xd0\\xa0\\xd1\\x83\\xd1\\x81\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\xd0\\xb9\\0\"\n    \"RUS\\0\"\n    \"rus\\0\"\n    \"hr\\0\"\n    \"Croatian\\0\"\n    \"hrvatski\\0\"\n    \"HRV\\0\"\n    \"hrv\\0\"\n    \"sk\\0\"\n    \"Slovak\\0\"\n    \"slovensk\\xc3\\xbd\\0\"\n    \"SKY\\0\"\n    \"slk\\0\"\n    \"sq\\0\"\n    \"Albanian\\0\"\n    \"shqipe\\0\"\n    \"SQI\\0\"\n    \"sqi\\0\"\n    \"sv\\0\"\n    \"Swedish\\0\"\n    \"svenska\\0\"\n    \"SVE\\0\"\n    \"swe\\0\"\n    \"th\\0\"\n    \"Thai\\0\"\n    \"\\xe0\\xb9\\x84\\xe0\\xb8\\x97\\xe0\\xb8\\xa2\\0\"\n    \"THA\\0\"\n    \"tha\\0\"\n    \"tr\\0\"\n    \"Turkish\\0\"\n    \"T\\xc3\\xbcrk\\xc3\\xa7\\x65\\0\"\n    \"TRK\\0\"\n    \"tur\\0\"\n    \"id\\0\"\n    \"Indonesian\\0\"\n    \"Bahasa Indonesia\\0\"\n    \"IND\\0\"\n    \"ind\\0\"\n    \"uk\\0\"\n    \"Ukrainian\\0\"\n    \"\\xd0\\xa3\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\xd1\\x97\\xd0\\xbd\\xd1\\x81\\xd1\\x8c\\xd0\\xba\\xd0\\xb0\\0\"\n    \"UKR\\0\"\n    \"ukr\\0\"\n    \"be\\0\"\n    \"Belarusian\\0\"\n    \"\\xd0\\x91\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\xd1\\x80\\xd1\\x83\\xd1\\x81\\xd0\\xba\\xd1\\x96\\0\"\n    \"BEL\\0\"\n    \"bel\\0\"\n    \"sl\\0\"\n    \"Slovenian\\0\"\n    \"Sloven\\xc5\\xa1\\xc4\\x8dina\\0\"\n    \"SLV\\0\"\n    \"slv\\0\"\n    \"et\\0\"\n    \"Estonian\\0\"\n    \"Eesti\\0\"\n    \"ETI\\0\"\n    \"est\\0\"\n    \"lv\\0\"\n    \"Latvian\\0\"\n    \"latvie\\xc5\\xa1u\\0\"\n    \"LVI\\0\"\n    \"lav\\0\"\n    \"lt\\0\"\n    \"Lithuanian\\0\"\n    \"Lietuvi\\xc5\\xb3\\0\"\n    \"LTH\\0\"\n    \"lit\\0\"\n    \"fa\\0\"\n    \"Persian\\0\"\n    \"\\xd9\\x81\\xd8\\xa7\\xd8\\xb1\\xd8\\xb3\\xdb\\x8c\\0\"\n    \"FAR\\0\"\n    \"fas\\0\"\n    \"vi\\0\"\n    \"Vietnamese\\0\"\n    \"Ti\\xe1\\xba\\xbfng Vi\\xe1\\xbb\\x87t\\0\"\n    \"VIT\\0\"\n    \"hy\\0\"\n    \"Armenian\\0\"\n    \"\\xd5\\x80\\xd5\\xa1\\xd5\\xb5\\xd5\\xa5\\xd6\\x80\\xd5\\xa7\\xd5\\xb6\\0\"\n    \"HYE\\0\"\n    \"hye\\0\"\n    \"eu\\0\"\n    \"Basque\\0\"\n    \"euskara\\0\"\n    \"EUQ\\0\"\n    \"eus\\0\"\n    \"mk\\0\"\n    \"Macedonian\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd0\\xba\\xd0\\xb5\\xd0\\xb4\\xd0\\xbe\\xd0\\xbd\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\0\"\n    \"MKI\\0\"\n    \"mkd\\0\"\n    \"af\\0\"\n    \"Afrikaans\\0\"\n    \"Afrikaanse\\0\"\n    \"AFK\\0\"\n    \"afr\\0\"\n    \"ka\\0\"\n    \"Georgian\\0\"\n    \"\\xe1\\x83\\xa5\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x97\\xe1\\x83\\xa3\\xe1\\x83\\x9a\\xe1\\x83\\x98\\0\"\n    \"KAT\\0\"\n    \"kat\\0\"\n    \"fo\\0\"\n    \"Faroese\\0\"\n    \"f\\xc3\\xb8royskt\\0\"\n    \"FOS\\0\"\n    \"fao\\0\"\n    \"hi\\0\"\n    \"Hindi\\0\"\n    \"\\xe0\\xa4\\xb9\\xe0\\xa4\\xbf\\xe0\\xa4\\x82\\xe0\\xa4\\xa6\\xe0\\xa5\\x80\\0\"\n    \"HIN\\0\"\n    \"hin\\0\"\n    \"sw\\0\"\n    \"Swahili\\0\"\n    \"Kiswahili\\0\"\n    \"SWK\\0\"\n    \"swa\\0\"\n    \"gu\\0\"\n    \"Gujarati\\0\"\n    \"\\xe0\\xaa\\x97\\xe0\\xab\\x81\\xe0\\xaa\\x9c\\xe0\\xaa\\xb0\\xe0\\xaa\\xbe\\xe0\\xaa\\xa4\\xe0\\xab\\x80\\0\"\n    \"GUJ\\0\"\n    \"guj\\0\"\n    \"ta\\0\"\n    \"Tamil\\0\"\n    \"\\xe0\\xae\\xa4\\xe0\\xae\\xae\\xe0\\xae\\xbf\\xe0\\xae\\xb4\\xe0\\xaf\\x8d\\0\"\n    \"TAM\\0\"\n    \"tam\\0\"\n    \"te\\0\"\n    \"Telugu\\0\"\n    \"\\xe0\\xb0\\xa4\\xe0\\xb1\\x86\\xe0\\xb0\\xb2\\xe0\\xb1\\x81\\xe0\\xb0\\x97\\xe0\\xb1\\x81\\0\"\n    \"TEL\\0\"\n    \"tel\\0\"\n    \"kn\\0\"\n    \"Kannada\\0\"\n    \"\\xe0\\xb2\\x95\\xe0\\xb2\\xa8\\xe0\\xb3\\x8d\\xe0\\xb2\\xa8\\xe0\\xb2\\xa1\\0\"\n    \"KAN\\0\"\n    \"kan\\0\"\n    \"mr\\0\"\n    \"Marathi\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\xb0\\xe0\\xa4\\xbe\\xe0\\xa4\\xa0\\xe0\\xa5\\x80\\0\"\n    \"MAR\\0\"\n    \"gl\\0\"\n    \"Gallegan\\0\"\n    \"galego\\0\"\n    \"GLC\\0\"\n    \"glg\\0\"\n    \"kok\\0\"\n    \"Konkani\\0\"\n    \"\\xe0\\xa4\\x95\\xe0\\xa5\\x8b\\xe0\\xa4\\x82\\xe0\\xa4\\x95\\xe0\\xa4\\xa3\\xe0\\xa5\\x80\\0\"\n    \"KNK\\0\"\n    \"ar-SA\\0\"\n    \"Arabic (Saudi Arabia)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 \\xd8\\xa7\\xd9\\x84\\xd8\\xb3\\xd8\\xb9\\xd9\\x88\\xd8\\xaf\\xd9\\x8a\\xd8\\xa9)\\0\"\n    \"bg-BG\\0\"\n    \"Bulgarian (Bulgaria)\\0\"\n    \"\\xd0\\x91\\xd1\\x8a\\xd0\\xbb\\xd0\\xb3\\xd0\\xb0\\xd1\\x80\\xd1\\x81\\xd0\\xba\\xd0\\xb8 (\\xd0\\x91\\xd1\\x8a\\xd0\\xbb\\xd0\\xb3\\xd0\\xb0\\xd1\\x80\\xd0\\xb8\\xd1\\x8f)\\0\"\n    \"BG\\0\"\n    \"ca-ES\\0\"\n    \"Catalan (Spain)\\0\"\n    \"catal\\xc3\\xa0 (Espanya)\\0\"\n    \"ES\\0\"\n    \"zh-TW\\0\"\n    \"Chinese (Taiwan)\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87 (\\xe5\\x8f\\xb0\\xe6\\xb9\\xbe)\\0\"\n    \"CHT\\0\"\n    \"TW\\0\"\n    \"cs-CZ\\0\"\n    \"Czech (Czech Republic)\\0\"\n    \"\\xc4\\x8c\\x65\\xc5\\xa1tina (\\xc4\\x8c\\x65sk\\xc3\\xa1 republika)\\0\"\n    \"CZ\\0\"\n    \"da-DK\\0\"\n    \"Danish (Denmark)\\0\"\n    \"Dansk (Danmark)\\0\"\n    \"DK\\0\"\n    \"de-DE\\0\"\n    \"German (Germany)\\0\"\n    \"Deutsch (Deutschland)\\0\"\n    \"el-GR\\0\"\n    \"Greek (Greece)\\0\"\n    \"\\xce\\x95\\xce\\xbb\\xce\\xbb\\xce\\xb7\\xce\\xbd\\xce\\xb9\\xce\\xba\\xce\\xac (\\xce\\x95\\xce\\xbb\\xce\\xbb\\xce\\xac\\xce\\xb4\\xce\\xb1)\\0\"\n    \"GR\\0\"\n    \"en-US\\0\"\n    \"English (United States)\\0\"\n    \"US\\0\"\n    \"fi-FI\\0\"\n    \"Finnish (Finland)\\0\"\n    \"suomi (Suomi)\\0\"\n    \"FI\\0\"\n    \"fr-FR\\0\"\n    \"French (France)\\0\"\n    \"fran\\xc3\\xa7\\x61is (France)\\0\"\n    \"FR\\0\"\n    \"he-IL\\0\"\n    \"Hebrew (Israel)\\0\"\n    \"\\xd7\\xa2\\xd7\\x91\\xd7\\xa8\\xd7\\x99\\xd7\\xaa (\\xd7\\x99\\xd7\\xa9\\xd7\\xa8\\xd7\\x90\\xd7\\x9c)\\0\"\n    \"IL\\0\"\n    \"hu-HU\\0\"\n    \"Hungarian (Hungary)\\0\"\n    \"magyar (Magyarorsz\\xc3\\xa1g)\\0\"\n    \"HU\\0\"\n    \"is-IS\\0\"\n    \"Icelandic (Iceland)\\0\"\n    \"\\xc3\\xadslenska (\\xc3\\x8dsland)\\0\"\n    \"IS\\0\"\n    \"it-IT\\0\"\n    \"Italian (Italy)\\0\"\n    \"italiano (Italia)\\0\"\n    \"IT\\0\"\n    \"ja-JP\\0\"\n    \"Japanese (Japan)\\0\"\n    \"\\xe6\\x97\\xa5\\xe6\\x9c\\xac\\xe8\\xaa\\x9e (\\xe6\\x97\\xa5\\xe6\\x9c\\xac)\\0\"\n    \"JP\\0\"\n    \"ko-KR\\0\"\n    \"Korean (South Korea)\\0\"\n    \"\\xed\\x95\\x9c\\xea\\xb5\\xad\\xec\\x96\\xb4 (\\xeb\\x8c\\x80\\xed\\x95\\x9c\\xeb\\xaf\\xbc\\xea\\xb5\\xad)\\0\"\n    \"KR\\0\"\n    \"nl-NL\\0\"\n    \"Dutch (Netherlands)\\0\"\n    \"Nederlands (Nederland)\\0\"\n    \"NL\\0\"\n    \"nb-NO\\0\"\n    \"Norwegian Bokm?l (Norway)\\0\"\n    \"Norwegian Bokm\\xc3\\xa5l (Norway)\\0\"\n    \"norsk bokm\\xc3\\xa5l (Norge)\\0\"\n    \"nob\\0\"\n    \"nb\\0\"\n    \"NO\\0\"\n    \"pl-PL\\0\"\n    \"Polish (Poland)\\0\"\n    \"polski (Polska)\\0\"\n    \"PL\\0\"\n    \"pt-BR\\0\"\n    \"Portuguese (Brazil)\\0\"\n    \"portugu\\xc3\\xaas (Brasil)\\0\"\n    \"BR\\0\"\n    \"ro-RO\\0\"\n    \"Romanian (Romania)\\0\"\n    \"Rom\\xc3\\xa2n\\xc4\\x83 (Rom\\xc3\\xa2nia)\\0\"\n    \"RO\\0\"\n    \"ru-RU\\0\"\n    \"Russian (Russia)\\0\"\n    \"\\xd0\\xa0\\xd1\\x83\\xd1\\x81\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\xd0\\xb9 (\\xd0\\xa0\\xd0\\xbe\\xd1\\x81\\xd1\\x81\\xd0\\xb8\\xd1\\x8f)\\0\"\n    \"RU\\0\"\n    \"hr-HR\\0\"\n    \"Croatian (Croatia)\\0\"\n    \"hrvatski (Hrvatska)\\0\"\n    \"HR\\0\"\n    \"sk-SK\\0\"\n    \"Slovak (Slovakia)\\0\"\n    \"slovensk\\xc3\\xbd (Slovensk\\xc3\\xa1 republika)\\0\"\n    \"SK\\0\"\n    \"sq-AL\\0\"\n    \"Albanian (Albania)\\0\"\n    \"shqipe (Shqip\\xc3\\xabria)\\0\"\n    \"AL\\0\"\n    \"sv-SE\\0\"\n    \"Swedish (Sweden)\\0\"\n    \"svenska (Sverige)\\0\"\n    \"SE\\0\"\n    \"th-TH\\0\"\n    \"Thai (Thailand)\\0\"\n    \"\\xe0\\xb9\\x84\\xe0\\xb8\\x97\\xe0\\xb8\\xa2 (\\xe0\\xb8\\x9b\\xe0\\xb8\\xa3\\xe0\\xb8\\xb0\\xe0\\xb9\\x80\\xe0\\xb8\\x97\\xe0\\xb8\\xa8\\xe0\\xb9\\x84\\xe0\\xb8\\x97\\xe0\\xb8\\xa2)\\0\"\n    \"TH\\0\"\n    \"tr-TR\\0\"\n    \"Turkish (Turkey)\\0\"\n    \"T\\xc3\\xbcrk\\xc3\\xa7\\x65 (T\\xc3\\xbcrkiye)\\0\"\n    \"TR\\0\"\n    \"id-ID\\0\"\n    \"Indonesian (Indonesia)\\0\"\n    \"Bahasa Indonesia (Indonesia)\\0\"\n    \"ID\\0\"\n    \"uk-UA\\0\"\n    \"Ukrainian (Ukraine)\\0\"\n    \"\\xd0\\xa3\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\xd1\\x97\\xd0\\xbd\\xd1\\x81\\xd1\\x8c\\xd0\\xba\\xd0\\xb0 (\\xd0\\xa3\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\xd1\\x97\\xd0\\xbd\\xd0\\xb0)\\0\"\n    \"UA\\0\"\n    \"be-BY\\0\"\n    \"Belarusian (Belarus)\\0\"\n    \"\\xd0\\x91\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\xd1\\x80\\xd1\\x83\\xd1\\x81\\xd0\\xba\\xd1\\x96 (\\xd0\\x91\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\xd1\\x80\\xd1\\x83\\xd1\\x81\\xd1\\x8c)\\0\"\n    \"BY\\0\"\n    \"sl-SI\\0\"\n    \"Slovenian (Slovenia)\\0\"\n    \"Sloven\\xc5\\xa1\\xc4\\x8dina (Slovenija)\\0\"\n    \"SI\\0\"\n    \"et-EE\\0\"\n    \"Estonian (Estonia)\\0\"\n    \"Eesti (Eesti)\\0\"\n    \"EE\\0\"\n    \"lv-LV\\0\"\n    \"Latvian (Latvia)\\0\"\n    \"latvie\\xc5\\xa1u (Latvija)\\0\"\n    \"LV\\0\"\n    \"lt-LT\\0\"\n    \"Lithuanian (Lithuania)\\0\"\n    \"Lietuvi\\xc5\\xb3 (Lietuva)\\0\"\n    \"LT\\0\"\n    \"fa-IR\\0\"\n    \"Persian (Iran)\\0\"\n    \"\\xd9\\x81\\xd8\\xa7\\xd8\\xb1\\xd8\\xb3\\xdb\\x8c (\\xd8\\xa7\\xdb\\x8c\\xd8\\xb1\\xd8\\xa7\\xd9\\x86)\\0\"\n    \"IR\\0\"\n    \"vi-VN\\0\"\n    \"Vietnamese (Vietnam)\\0\"\n    \"Ti\\xe1\\xba\\xbfng Vi\\xe1\\xbb\\x87t (Vi\\xe1\\xbb\\x87t Nam)\\0\"\n    \"VN\\0\"\n    \"hy-AM\\0\"\n    \"Armenian (Armenia)\\0\"\n    \"\\xd5\\x80\\xd5\\xa1\\xd5\\xb5\\xd5\\xa5\\xd6\\x80\\xd5\\xa7\\xd5\\xb6 (\\xd5\\x80\\xd5\\xa1\\xd5\\xb5\\xd5\\xa1\\xd5\\xbd\\xd5\\xbf\\xd5\\xa1\\xd5\\xb6\\xd5\\xab \\xd5\\x80\\xd5\\xa1\\xd5\\xb6\\xd6\\x80\\xd5\\xa1\\xd5\\xba\\xd5\\xa5\\xd5\\xbf\\xd5\\xb8\\xd6\\x82\\xd5\\xa9\\xd5\\xab\\xd6\\x82\\xd5\\xb6)\\0\"\n    \"eu-ES\\0\"\n    \"Basque (Spain)\\0\"\n    \"euskara (Espainia)\\0\"\n    \"mk-MK\\0\"\n    \"Macedonian (Macedonia)\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd0\\xba\\xd0\\xb5\\xd0\\xb4\\xd0\\xbe\\xd0\\xbd\\xd1\\x81\\xd0\\xba\\xd0\\xb8 (\\xd0\\x9c\\xd0\\xb0\\xd0\\xba\\xd0\\xb5\\xd0\\xb4\\xd0\\xbe\\xd0\\xbd\\xd0\\xb8\\xd1\\x98\\xd0\\xb0)\\0\"\n    \"MK\\0\"\n    \"af-ZA\\0\"\n    \"Afrikaans (South Africa)\\0\"\n    \"Afrikaanse (Suid-Afrika)\\0\"\n    \"ZA\\0\"\n    \"ka-GE\\0\"\n    \"Georgian (Georgia)\\0\"\n    \"\\xe1\\x83\\xa5\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x97\\xe1\\x83\\xa3\\xe1\\x83\\x9a\\xe1\\x83\\x98 (\\xe1\\x83\\xa1\\xe1\\x83\\x90\\xe1\\x83\\xa5\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x97\\xe1\\x83\\x95\\xe1\\x83\\x94\\xe1\\x83\\x9a\\xe1\\x83\\x9d)\\0\"\n    \"GE\\0\"\n    \"fo-FO\\0\"\n    \"Faroese (Faroe Islands)\\0\"\n    \"f\\xc3\\xb8royskt (F\\xc3\\xb8royar)\\0\"\n    \"FO\\0\"\n    \"hi-IN\\0\"\n    \"Hindi (India)\\0\"\n    \"\\xe0\\xa4\\xb9\\xe0\\xa4\\xbf\\xe0\\xa4\\x82\\xe0\\xa4\\xa6\\xe0\\xa5\\x80 (\\xe0\\xa4\\xad\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa4\\xa4)\\0\"\n    \"IN\\0\"\n    \"sw-KE\\0\"\n    \"Swahili (Kenya)\\0\"\n    \"Kiswahili (Kenya)\\0\"\n    \"KE\\0\"\n    \"gu-IN\\0\"\n    \"Gujarati (India)\\0\"\n    \"\\xe0\\xaa\\x97\\xe0\\xab\\x81\\xe0\\xaa\\x9c\\xe0\\xaa\\xb0\\xe0\\xaa\\xbe\\xe0\\xaa\\xa4\\xe0\\xab\\x80 (\\xe0\\xaa\\xad\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\xe0\\xaa\\xa4)\\0\"\n    \"ta-IN\\0\"\n    \"Tamil (India)\\0\"\n    \"\\xe0\\xae\\xa4\\xe0\\xae\\xae\\xe0\\xae\\xbf\\xe0\\xae\\xb4\\xe0\\xaf\\x8d (\\xe0\\xae\\x87\\xe0\\xae\\xa8\\xe0\\xaf\\x8d\\xe0\\xae\\xa4\\xe0\\xae\\xbf\\xe0\\xae\\xaf\\xe0\\xae\\xbe)\\0\"\n    \"te-IN\\0\"\n    \"Telugu (India)\\0\"\n    \"\\xe0\\xb0\\xa4\\xe0\\xb1\\x86\\xe0\\xb0\\xb2\\xe0\\xb1\\x81\\xe0\\xb0\\x97\\xe0\\xb1\\x81 (\\xe0\\xb0\\xad\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\xa4 \\xe0\\xb0\\xa6\\xe0\\xb1\\x87\\xe0\\xb0\\xb3\\xe0\\xb1\\xa6)\\0\"\n    \"kn-IN\\0\"\n    \"Kannada (India)\\0\"\n    \"\\xe0\\xb2\\x95\\xe0\\xb2\\xa8\\xe0\\xb3\\x8d\\xe0\\xb2\\xa8\\xe0\\xb2\\xa1 (\\xe0\\xb2\\xad\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\xe0\\xb2\\xa4)\\0\"\n    \"mr-IN\\0\"\n    \"Marathi (India)\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\xb0\\xe0\\xa4\\xbe\\xe0\\xa4\\xa0\\xe0\\xa5\\x80 (\\xe0\\xa4\\xad\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa4\\xa4)\\0\"\n    \"gl-ES\\0\"\n    \"Gallegan (Spain)\\0\"\n    \"galego (Espa\\xc3\\xb1\\x61)\\0\"\n    \"kok-IN\\0\"\n    \"Konkani (India)\\0\"\n    \"\\xe0\\xa4\\x95\\xe0\\xa5\\x8b\\xe0\\xa4\\x82\\xe0\\xa4\\x95\\xe0\\xa4\\xa3\\xe0\\xa5\\x80 (\\xe0\\xa4\\xad\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa4\\xa4)\\0\"\n    \"ar-IQ\\0\"\n    \"Arabic (Iraq)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa7\\xd9\\x82)\\0\"\n    \"ARI\\0\"\n    \"IQ\\0\"\n    \"zh-CN\\0\"\n    \"Chinese (China)\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87 (\\xe4\\xb8\\xad\\xe5\\x9b\\xbd)\\0\"\n    \"de-CH\\0\"\n    \"German (Switzerland)\\0\"\n    \"Deutsch (Schweiz)\\0\"\n    \"DES\\0\"\n    \"en-GB\\0\"\n    \"English (United Kingdom)\\0\"\n    \"ENG\\0\"\n    \"GB\\0\"\n    \"es-MX\\0\"\n    \"Spanish (Mexico)\\0\"\n    \"espa\\xc3\\xb1ol (M\\xc3\\xa9xico)\\0\"\n    \"ESM\\0\"\n    \"MX\\0\"\n    \"fr-BE\\0\"\n    \"French (Belgium)\\0\"\n    \"fran\\xc3\\xa7\\x61is (Belgique)\\0\"\n    \"FRB\\0\"\n    \"BE\\0\"\n    \"it-CH\\0\"\n    \"Italian (Switzerland)\\0\"\n    \"italiano (Svizzera)\\0\"\n    \"ITS\\0\"\n    \"nl-BE\\0\"\n    \"Dutch (Belgium)\\0\"\n    \"Nederlands (Belgi\\xc3\\xab)\\0\"\n    \"NLB\\0\"\n    \"nn-NO\\0\"\n    \"Norwegian Nynorsk (Norway)\\0\"\n    \"norsk nynorsk (Noreg)\\0\"\n    \"NON\\0\"\n    \"nno\\0\"\n    \"nn\\0\"\n    \"pt-PT\\0\"\n    \"Portuguese (Portugal)\\0\"\n    \"portugu\\xc3\\xaas (Portugal)\\0\"\n    \"PTG\\0\"\n    \"PT\\0\"\n    \"sv-FI\\0\"\n    \"Swedish (Finland)\\0\"\n    \"svenska (Finland)\\0\"\n    \"SVF\\0\"\n    \"ar-EG\\0\"\n    \"Arabic (Egypt)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd9\\x85\\xd8\\xb5\\xd8\\xb1)\\0\"\n    \"ARE\\0\"\n    \"EG\\0\"\n    \"zh-HK\\0\"\n    \"Chinese (Hong Kong S.A.R., China)\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87 (\\xe4\\xb8\\xad\\xe5\\x9b\\xbd\\xe9\\xa6\\x99\\xe6\\xb8\\xaf\\xe7\\x89\\xb9\\xe5\\x88\\xab\\xe8\\xa1\\x8c\\xe6\\x94\\xbf\\xe5\\x8c\\xba)\\0\"\n    \"ZHH\\0\"\n    \"HK\\0\"\n    \"de-AT\\0\"\n    \"German (Austria)\\0\"\n    \"Deutsch (\\xc3\\x96sterreich)\\0\"\n    \"DEA\\0\"\n    \"AT\\0\"\n    \"en-AU\\0\"\n    \"English (Australia)\\0\"\n    \"ENA\\0\"\n    \"AU\\0\"\n    \"es-ES\\0\"\n    \"Spanish (Spain)\\0\"\n    \"espa\\xc3\\xb1ol (Espa\\xc3\\xb1\\x61)\\0\"\n    \"ESN\\0\"\n    \"fr-CA\\0\"\n    \"French (Canada)\\0\"\n    \"fran\\xc3\\xa7\\x61is (Canada)\\0\"\n    \"FRC\\0\"\n    \"CA\\0\"\n    \"ar-LY\\0\"\n    \"Arabic (Libya)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd9\\x84\\xd9\\x8a\\xd8\\xa8\\xd9\\x8a\\xd8\\xa7)\\0\"\n    \"ARL\\0\"\n    \"LY\\0\"\n    \"zh-SG\\0\"\n    \"Chinese (Singapore)\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87 (\\xe6\\x96\\xb0\\xe5\\x8a\\xa0\\xe5\\x9d\\xa1)\\0\"\n    \"ZHI\\0\"\n    \"SG\\0\"\n    \"de-LU\\0\"\n    \"German (Luxembourg)\\0\"\n    \"Deutsch (Luxemburg)\\0\"\n    \"DEL\\0\"\n    \"LU\\0\"\n    \"en-CA\\0\"\n    \"English (Canada)\\0\"\n    \"ENC\\0\"\n    \"es-GT\\0\"\n    \"Spanish (Guatemala)\\0\"\n    \"espa\\xc3\\xb1ol (Guatemala)\\0\"\n    \"ESG\\0\"\n    \"GT\\0\"\n    \"fr-CH\\0\"\n    \"French (Switzerland)\\0\"\n    \"fran\\xc3\\xa7\\x61is (Suisse)\\0\"\n    \"FRS\\0\"\n    \"ar-DZ\\0\"\n    \"Arabic (Algeria)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd8\\xac\\xd8\\xb2\\xd8\\xa7\\xd8\\xa6\\xd8\\xb1)\\0\"\n    \"ARG\\0\"\n    \"DZ\\0\"\n    \"zh-MO\\0\"\n    \"Chinese (Macao S.A.R. China)\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87 (\\xe4\\xb8\\xad\\xe5\\x9b\\xbd\\xe6\\xbe\\xb3\\xe9\\x97\\xa8\\xe7\\x89\\xb9\\xe5\\x88\\xab\\xe8\\xa1\\x8c\\xe6\\x94\\xbf\\xe5\\x8c\\xba)\\0\"\n    \"ZHM\\0\"\n    \"MO\\0\"\n    \"en-NZ\\0\"\n    \"English (New Zealand)\\0\"\n    \"ENZ\\0\"\n    \"NZ\\0\"\n    \"es-CR\\0\"\n    \"Spanish (Costa Rica)\\0\"\n    \"espa\\xc3\\xb1ol (Costa Rica)\\0\"\n    \"ESC\\0\"\n    \"CR\\0\"\n    \"fr-LU\\0\"\n    \"French (Luxembourg)\\0\"\n    \"fran\\xc3\\xa7\\x61is (Luxembourg)\\0\"\n    \"FRL\\0\"\n    \"ar-MA\\0\"\n    \"Arabic (Morocco)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd9\\x85\\xd8\\xba\\xd8\\xb1\\xd8\\xa8)\\0\"\n    \"ARM\\0\"\n    \"MA\\0\"\n    \"en-IE\\0\"\n    \"English (Ireland)\\0\"\n    \"ENI\\0\"\n    \"IE\\0\"\n    \"es-PA\\0\"\n    \"Spanish (Panama)\\0\"\n    \"espa\\xc3\\xb1ol (Panam\\xc3\\xa1)\\0\"\n    \"ESA\\0\"\n    \"PA\\0\"\n    \"ar-TN\\0\"\n    \"Arabic (Tunisia)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xaa\\xd9\\x88\\xd9\\x86\\xd8\\xb3)\\0\"\n    \"ART\\0\"\n    \"TN\\0\"\n    \"en-ZA\\0\"\n    \"English (South Africa)\\0\"\n    \"ENS\\0\"\n    \"es-DO\\0\"\n    \"Spanish (Dominican Republic)\\0\"\n    \"espa\\xc3\\xb1ol (Rep\\xc3\\xba\\x62lica Dominicana)\\0\"\n    \"ESD\\0\"\n    \"DO\\0\"\n    \"ar-OM\\0\"\n    \"Arabic (Oman)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xb9\\xd9\\x85\\xd8\\xa7\\xd9\\x86)\\0\"\n    \"ARO\\0\"\n    \"OM\\0\"\n    \"es-VE\\0\"\n    \"Spanish (Venezuela)\\0\"\n    \"espa\\xc3\\xb1ol (Venezuela)\\0\"\n    \"ESV\\0\"\n    \"VE\\0\"\n    \"ar-YE\\0\"\n    \"Arabic (Yemen)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd9\\x8a\\xd9\\x85\\xd9\\x86)\\0\"\n    \"ARY\\0\"\n    \"YE\\0\"\n    \"es-CO\\0\"\n    \"Spanish (Colombia)\\0\"\n    \"espa\\xc3\\xb1ol (Colombia)\\0\"\n    \"ESO\\0\"\n    \"CO\\0\"\n    \"ar-SY\\0\"\n    \"Arabic (Syria)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xb3\\xd9\\x88\\xd8\\xb1\\xd9\\x8a\\xd8\\xa9)\\0\"\n    \"ARS\\0\"\n    \"SY\\0\"\n    \"es-PE\\0\"\n    \"Spanish (Peru)\\0\"\n    \"espa\\xc3\\xb1ol (Per\\xc3\\xba)\\0\"\n    \"ESR\\0\"\n    \"PE\\0\"\n    \"ar-JO\\0\"\n    \"Arabic (Jordan)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd8\\xa7\\xd8\\xb1\\xd8\\xaf\\xd9\\x86)\\0\"\n    \"ARJ\\0\"\n    \"JO\\0\"\n    \"en-TT\\0\"\n    \"English (Trinidad and Tobago)\\0\"\n    \"ENT\\0\"\n    \"TT\\0\"\n    \"es-AR\\0\"\n    \"Spanish (Argentina)\\0\"\n    \"espa\\xc3\\xb1ol (Argentina)\\0\"\n    \"ESS\\0\"\n    \"AR\\0\"\n    \"ar-LB\\0\"\n    \"Arabic (Lebanon)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd9\\x84\\xd8\\xa8\\xd9\\x86\\xd8\\xa7\\xd9\\x86)\\0\"\n    \"ARB\\0\"\n    \"LB\\0\"\n    \"en-ZW\\0\"\n    \"English (Zimbabwe)\\0\"\n    \"ENW\\0\"\n    \"ZW\\0\"\n    \"es-EC\\0\"\n    \"Spanish (Ecuador)\\0\"\n    \"espa\\xc3\\xb1ol (Ecuador)\\0\"\n    \"ESF\\0\"\n    \"EC\\0\"\n    \"ar-KW\\0\"\n    \"Arabic (Kuwait)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd9\\x83\\xd9\\x88\\xd9\\x8a\\xd8\\xaa)\\0\"\n    \"ARK\\0\"\n    \"KW\\0\"\n    \"en-PH\\0\"\n    \"English (Philippines)\\0\"\n    \"ENP\\0\"\n    \"PH\\0\"\n    \"es-CL\\0\"\n    \"Spanish (Chile)\\0\"\n    \"espa\\xc3\\xb1ol (Chile)\\0\"\n    \"ESL\\0\"\n    \"CL\\0\"\n    \"ar-AE\\0\"\n    \"Arabic (United Arab Emirates)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd8\\xa7\\xd9\\x85\\xd8\\xa7\\xd8\\xb1\\xd8\\xa7\\xd8\\xaa \\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 \\xd8\\xa7\\xd9\\x84\\xd9\\x85\\xd8\\xaa\\xd8\\xad\\xd8\\xaf\\xd8\\xa9)\\0\"\n    \"ARU\\0\"\n    \"AE\\0\"\n    \"es-UY\\0\"\n    \"Spanish (Uruguay)\\0\"\n    \"espa\\xc3\\xb1ol (Uruguay)\\0\"\n    \"ESY\\0\"\n    \"UY\\0\"\n    \"ar-BH\\0\"\n    \"Arabic (Bahrain)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd8\\xa8\\xd8\\xad\\xd8\\xb1\\xd9\\x8a\\xd9\\x86)\\0\"\n    \"ARH\\0\"\n    \"BH\\0\"\n    \"es-PY\\0\"\n    \"Spanish (Paraguay)\\0\"\n    \"espa\\xc3\\xb1ol (Paraguay)\\0\"\n    \"ESZ\\0\"\n    \"PY\\0\"\n    \"ar-QA\\0\"\n    \"Arabic (Qatar)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd9\\x82\\xd8\\xb7\\xd8\\xb1)\\0\"\n    \"ARQ\\0\"\n    \"QA\\0\"\n    \"es-BO\\0\"\n    \"Spanish (Bolivia)\\0\"\n    \"espa\\xc3\\xb1ol (Bolivia)\\0\"\n    \"ESB\\0\"\n    \"BO\\0\"\n    \"es-SV\\0\"\n    \"Spanish (El Salvador)\\0\"\n    \"espa\\xc3\\xb1ol (El Salvador)\\0\"\n    \"ESE\\0\"\n    \"SV\\0\"\n    \"es-HN\\0\"\n    \"Spanish (Honduras)\\0\"\n    \"espa\\xc3\\xb1ol (Honduras)\\0\"\n    \"ESH\\0\"\n    \"HN\\0\"\n    \"es-NI\\0\"\n    \"Spanish (Nicaragua)\\0\"\n    \"espa\\xc3\\xb1ol (Nicaragua)\\0\"\n    \"ESI\\0\"\n    \"NI\\0\"\n    \"es-PR\\0\"\n    \"Spanish (Puerto Rico)\\0\"\n    \"espa\\xc3\\xb1ol (Puerto Rico)\\0\"\n    \"ESU\\0\"\n    \"PR\\0\"\n    \"zh-CHT\\0\"\n    \"af-za\\0\"\n    \"ar-ae\\0\"\n    \"ar-bh\\0\"\n    \"ar-dz\\0\"\n    \"ar-eg\\0\"\n    \"ar-iq\\0\"\n    \"ar-jo\\0\"\n    \"ar-kw\\0\"\n    \"ar-lb\\0\"\n    \"ar-ly\\0\"\n    \"ar-ma\\0\"\n    \"ar-om\\0\"\n    \"ar-qa\\0\"\n    \"ar-sa\\0\"\n    \"ar-sy\\0\"\n    \"ar-tn\\0\"\n    \"ar-ye\\0\"\n    \"be-by\\0\"\n    \"bg-bg\\0\"\n    \"ca-es\\0\"\n    \"cs-cz\\0\"\n    \"da-dk\\0\"\n    \"de-at\\0\"\n    \"de-ch\\0\"\n    \"de-de\\0\"\n    \"de-lu\\0\"\n    \"el-gr\\0\"\n    \"en-au\\0\"\n    \"en-ca\\0\"\n    \"en-gb\\0\"\n    \"en-ie\\0\"\n    \"en-nz\\0\"\n    \"en-ph\\0\"\n    \"en-tt\\0\"\n    \"en-us\\0\"\n    \"en-za\\0\"\n    \"en-zw\\0\"\n    \"es-ar\\0\"\n    \"es-bo\\0\"\n    \"es-cl\\0\"\n    \"es-co\\0\"\n    \"es-cr\\0\"\n    \"es-do\\0\"\n    \"es-ec\\0\"\n    \"es-es\\0\"\n    \"es-gt\\0\"\n    \"es-hn\\0\"\n    \"es-mx\\0\"\n    \"es-ni\\0\"\n    \"es-pa\\0\"\n    \"es-pe\\0\"\n    \"es-pr\\0\"\n    \"es-py\\0\"\n    \"es-sv\\0\"\n    \"es-uy\\0\"\n    \"es-ve\\0\"\n    \"et-ee\\0\"\n    \"eu-es\\0\"\n    \"fa-ir\\0\"\n    \"fi-fi\\0\"\n    \"fo-fo\\0\"\n    \"fr-be\\0\"\n    \"fr-ca\\0\"\n    \"fr-ch\\0\"\n    \"fr-fr\\0\"\n    \"fr-lu\\0\"\n    \"gl-es\\0\"\n    \"gu-in\\0\"\n    \"he-il\\0\"\n    \"hi-in\\0\"\n    \"hr-hr\\0\"\n    \"hu-hu\\0\"\n    \"hy-am\\0\"\n    \"id-id\\0\"\n    \"is-is\\0\"\n    \"it-ch\\0\"\n    \"it-it\\0\"\n    \"ja-jp\\0\"\n    \"ka-ge\\0\"\n    \"kn-in\\0\"\n    \"ko-kr\\0\"\n    \"kok-in\\0\"\n    \"lt-lt\\0\"\n    \"lv-lv\\0\"\n    \"mk-mk\\0\"\n    \"mr-in\\0\"\n    \"nb-no\\0\"\n    \"nl-be\\0\"\n    \"nl-nl\\0\"\n    \"nn-no\\0\"\n    \"pl-pl\\0\"\n    \"pt-br\\0\"\n    \"pt-pt\\0\"\n    \"ro-ro\\0\"\n    \"ru-ru\\0\"\n    \"sk-sk\\0\"\n    \"sl-si\\0\"\n    \"sq-al\\0\"\n    \"sv-fi\\0\"\n    \"sv-se\\0\"\n    \"sw-ke\\0\"\n    \"ta-in\\0\"\n    \"te-in\\0\"\n    \"th-th\\0\"\n    \"tr-tr\\0\"\n    \"uk-ua\\0\"\n    \"vi-vn\\0\"\n    \"zh-chs\\0\"\n    \"zh-cht\\0\"\n    \"zh-cn\\0\"\n    \"zh-hk\\0\"\n    \"zh-mo\\0\"\n    \"zh-sg\\0\"\n    \"zh-tw\\0\"\n    \"United Arab Emirates\\0\"\n    \"AED\\0\"\n    \"United Arab Emirates Dirham\\0\"\n    \"AF\\0\"\n    \"Afghanistan\\0\"\n    \"AFN\\0\"\n    \"Afghani\\0\"\n    \"AG\\0\"\n    \"Antigua and Barbuda\\0\"\n    \"XCD\\0\"\n    \"East Caribbean Dollar\\0\"\n    \"AI\\0\"\n    \"Anguilla\\0\"\n    \"Albania\\0\"\n    \"ALL\\0\"\n    \"Albanian Lek\\0\"\n    \"Armenia\\0\"\n    \"AMD\\0\"\n    \"Armenian Dram\\0\"\n    \"AN\\0\"\n    \"Netherlands Antilles\\0\"\n    \"ANG\\0\"\n    \"Netherlands Antillan Guilder\\0\"\n    \"AO\\0\"\n    \"Angola\\0\"\n    \"AOA\\0\"\n    \"Angolan Kwanza\\0\"\n    \"Argentina\\0\"\n    \"Argentine Peso\\0\"\n    \"AS\\0\"\n    \"American Samoa\\0\"\n    \"USD\\0\"\n    \"US Dollar\\0\"\n    \"Austria\\0\"\n    \"EUR\\0\"\n    \"Euro\\0\"\n    \"Australia\\0\"\n    \"AUD\\0\"\n    \"Australian Dollar\\0\"\n    \"AW\\0\"\n    \"Aruba\\0\"\n    \"AWG\\0\"\n    \"Aruban Guilder\\0\"\n    \"AZ\\0\"\n    \"Azerbaijan\\0\"\n    \"AZM\\0\"\n    \"Azerbaijanian Manat\\0\"\n    \"BA\\0\"\n    \"Bosnia and Herzegovina\\0\"\n    \"BAM\\0\"\n    \"Bosnia-Herzegovina Convertible Mark\\0\"\n    \"BB\\0\"\n    \"Barbados\\0\"\n    \"BBD\\0\"\n    \"Barbados Dollar\\0\"\n    \"BD\\0\"\n    \"Bangladesh\\0\"\n    \"BDT\\0\"\n    \"Bangladesh Taka\\0\"\n    \"Belgium\\0\"\n    \"BF\\0\"\n    \"Burkina Faso\\0\"\n    \"XOF\\0\"\n    \"CFA Franc BCEAO\\0\"\n    \"Bulgaria\\0\"\n    \"BGN\\0\"\n    \"Bulgarian New Lev\\0\"\n    \"Bahrain\\0\"\n    \"BHD\\0\"\n    \"Bahraini Dinar\\0\"\n    \"BI\\0\"\n    \"Burundi\\0\"\n    \"BIF\\0\"\n    \"Burundi Franc\\0\"\n    \"BJ\\0\"\n    \"Benin\\0\"\n    \"BM\\0\"\n    \"Bermuda\\0\"\n    \"BMD\\0\"\n    \"Bermudan Dollar\\0\"\n    \"BN\\0\"\n    \"Brunei\\0\"\n    \"BND\\0\"\n    \"Brunei Dollar\\0\"\n    \"Bolivia\\0\"\n    \"BOB\\0\"\n    \"Boliviano\\0\"\n    \"Brazil\\0\"\n    \"BRL\\0\"\n    \"Brazilian Real\\0\"\n    \"BS\\0\"\n    \"Bahamas\\0\"\n    \"BSD\\0\"\n    \"Bahamian Dollar\\0\"\n    \"BV\\0\"\n    \"Bouvet Island\\0\"\n    \"NOK\\0\"\n    \"Norwegian Krone\\0\"\n    \"BW\\0\"\n    \"Botswana\\0\"\n    \"BWP\\0\"\n    \"Botswanan Pula\\0\"\n    \"Belarus\\0\"\n    \"BYR\\0\"\n    \"Belarussian Ruble\\0\"\n    \"BZ\\0\"\n    \"Belize\\0\"\n    \"BZD\\0\"\n    \"Belize Dollar\\0\"\n    \"Canada\\0\"\n    \"CAD\\0\"\n    \"Canadian Dollar\\0\"\n    \"CC\\0\"\n    \"Cocos Islands\\0\"\n    \"CD\\0\"\n    \"Democratic Republic of the Congo\\0\"\n    \"CDF\\0\"\n    \"Congolese Franc Congolais\\0\"\n    \"CF\\0\"\n    \"Central African Republic\\0\"\n    \"XAF\\0\"\n    \"CFA Franc BEAC\\0\"\n    \"CG\\0\"\n    \"Congo\\0\"\n    \"Switzerland\\0\"\n    \"CHF\\0\"\n    \"Swiss Franc\\0\"\n    \"CI\\0\"\n    \"C\\xc3\\xb4te d'Ivoire\\0\"\n    \"CK\\0\"\n    \"Cook Islands\\0\"\n    \"NZD\\0\"\n    \"New Zealand Dollar\\0\"\n    \"Chile\\0\"\n    \"CLP\\0\"\n    \"Chilean Peso\\0\"\n    \"CM\\0\"\n    \"Cameroon\\0\"\n    \"China\\0\"\n    \"CNY\\0\"\n    \"Chinese Yuan Renminbi\\0\"\n    \"Colombia\\0\"\n    \"COP\\0\"\n    \"Colombian Peso\\0\"\n    \"Costa Rica\\0\"\n    \"Costa Rican Colon\\0\"\n    \"CU\\0\"\n    \"Cuba\\0\"\n    \"CUP\\0\"\n    \"Cuban Peso\\0\"\n    \"CV\\0\"\n    \"Cape Verde\\0\"\n    \"CVE\\0\"\n    \"Cape Verde Escudo\\0\"\n    \"CX\\0\"\n    \"Christmas Island\\0\"\n    \"CY\\0\"\n    \"Cyprus\\0\"\n    \"CYP\\0\"\n    \"Cyprus Pound\\0\"\n    \"Czech Republic\\0\"\n    \"CZK\\0\"\n    \"Czech Republic Koruna\\0\"\n    \"Germany\\0\"\n    \"DJ\\0\"\n    \"Djibouti\\0\"\n    \"DJF\\0\"\n    \"Djibouti Franc\\0\"\n    \"Denmark\\0\"\n    \"DKK\\0\"\n    \"Danish Krone\\0\"\n    \"DM\\0\"\n    \"Dominica\\0\"\n    \"Dominican Republic\\0\"\n    \"DOP\\0\"\n    \"Dominican Peso\\0\"\n    \"Algeria\\0\"\n    \"DZD\\0\"\n    \"Algerian Dinar\\0\"\n    \"Ecuador\\0\"\n    \"ECS\\0\"\n    \"Ecuador Sucre\\0\"\n    \"Estonia\\0\"\n    \"EEK\\0\"\n    \"Estonian Kroon\\0\"\n    \"Egypt\\0\"\n    \"EGP\\0\"\n    \"Egyptian Pound\\0\"\n    \"EH\\0\"\n    \"Western Sahara\\0\"\n    \"MAD\\0\"\n    \"Moroccan Dirham\\0\"\n    \"ER\\0\"\n    \"Eritrea\\0\"\n    \"ERN\\0\"\n    \"Eritrean Nakfa\\0\"\n    \"Spain\\0\"\n    \"ET\\0\"\n    \"Ethiopia\\0\"\n    \"ETB\\0\"\n    \"Ethiopian Birr\\0\"\n    \"Finland\\0\"\n    \"FJ\\0\"\n    \"Fiji\\0\"\n    \"FJD\\0\"\n    \"Fiji Dollar\\0\"\n    \"FK\\0\"\n    \"Falkland Islands\\0\"\n    \"FKP\\0\"\n    \"Falkland Islands Pound\\0\"\n    \"FM\\0\"\n    \"Micronesia\\0\"\n    \"Faroe Islands\\0\"\n    \"France\\0\"\n    \"GA\\0\"\n    \"Gabon\\0\"\n    \"United Kingdom\\0\"\n    \"GBP\\0\"\n    \"British Pound Sterling\\0\"\n    \"GD\\0\"\n    \"Grenada\\0\"\n    \"Georgia\\0\"\n    \"GEL\\0\"\n    \"Georgian Lari\\0\"\n    \"GF\\0\"\n    \"French Guiana\\0\"\n    \"GH\\0\"\n    \"Ghana\\0\"\n    \"GHC\\0\"\n    \"Ghana Cedi\\0\"\n    \"GI\\0\"\n    \"Gibraltar\\0\"\n    \"GIP\\0\"\n    \"Gibraltar Pound\\0\"\n    \"GL\\0\"\n    \"Greenland\\0\"\n    \"GM\\0\"\n    \"Gambia\\0\"\n    \"GMD\\0\"\n    \"Gambia Dalasi\\0\"\n    \"GN\\0\"\n    \"Guinea\\0\"\n    \"GNF\\0\"\n    \"Guinea Franc\\0\"\n    \"GP\\0\"\n    \"Guadeloupe\\0\"\n    \"GQ\\0\"\n    \"Equatorial Guinea\\0\"\n    \"Greece\\0\"\n    \"Guatemala\\0\"\n    \"GTQ\\0\"\n    \"Guatemala Quetzal\\0\"\n    \"GU\\0\"\n    \"Guam\\0\"\n    \"GY\\0\"\n    \"Guyana\\0\"\n    \"GYD\\0\"\n    \"Guyana Dollar\\0\"\n    \"Hong Kong S.A.R., China\\0\"\n    \"HKD\\0\"\n    \"Hong Kong Dollar\\0\"\n    \"HM\\0\"\n    \"Heard Island and McDonald Islands\\0\"\n    \"Honduras\\0\"\n    \"HNL\\0\"\n    \"Hoduras Lempira\\0\"\n    \"Croatia\\0\"\n    \"HRK\\0\"\n    \"Croatian Kuna\\0\"\n    \"Hungary\\0\"\n    \"HUF\\0\"\n    \"Hungarian Forint\\0\"\n    \"Indonesia\\0\"\n    \"IDR\\0\"\n    \"Indonesian Rupiah\\0\"\n    \"Ireland\\0\"\n    \"Israel\\0\"\n    \"ILS\\0\"\n    \"Israeli New Sheqel\\0\"\n    \"India\\0\"\n    \"INR\\0\"\n    \"Indian Rupee\\0\"\n    \"IO\\0\"\n    \"British Indian Ocean Territory\\0\"\n    \"Iraq\\0\"\n    \"IQD\\0\"\n    \"Iraqi Dinar\\0\"\n    \"Iran\\0\"\n    \"IRR\\0\"\n    \"Iranian Rial\\0\"\n    \"Iceland\\0\"\n    \"ISK\\0\"\n    \"Icelandic Krona\\0\"\n    \"Italy\\0\"\n    \"JM\\0\"\n    \"Jamaica\\0\"\n    \"JMD\\0\"\n    \"Jamaican Dollar\\0\"\n    \"Jordan\\0\"\n    \"JOD\\0\"\n    \"Jordanian Dinar\\0\"\n    \"Japan\\0\"\n    \"JPY\\0\"\n    \"Japanese Yen\\0\"\n    \"Kenya\\0\"\n    \"KES\\0\"\n    \"Kenyan Shilling\\0\"\n    \"KG\\0\"\n    \"Kyrgyzstan\\0\"\n    \"KGS\\0\"\n    \"Kyrgystan Som\\0\"\n    \"KH\\0\"\n    \"Cambodia\\0\"\n    \"KHR\\0\"\n    \"Cambodian Riel\\0\"\n    \"KI\\0\"\n    \"Kiribati\\0\"\n    \"KM\\0\"\n    \"Comoros\\0\"\n    \"KMF\\0\"\n    \"Comoro Franc\\0\"\n    \"KN\\0\"\n    \"Saint Kitts and Nevis\\0\"\n    \"KP\\0\"\n    \"North Korea\\0\"\n    \"KPW\\0\"\n    \"North Korean Won\\0\"\n    \"South Korea\\0\"\n    \"KRW\\0\"\n    \"South Korean Won\\0\"\n    \"Kuwait\\0\"\n    \"KWD\\0\"\n    \"Kuwaiti Dinar\\0\"\n    \"KY\\0\"\n    \"Cayman Islands\\0\"\n    \"KYD\\0\"\n    \"Cayman Islands Dollar\\0\"\n    \"KZ\\0\"\n    \"Kazakhstan\\0\"\n    \"KZT\\0\"\n    \"Kazakhstan Tenge\\0\"\n    \"LA\\0\"\n    \"Laos\\0\"\n    \"LAK\\0\"\n    \"Laotian Kip\\0\"\n    \"Lebanon\\0\"\n    \"LBP\\0\"\n    \"Lebanese Pound\\0\"\n    \"LC\\0\"\n    \"Saint Lucia\\0\"\n    \"LI\\0\"\n    \"Liechtenstein\\0\"\n    \"LK\\0\"\n    \"Sri Lanka\\0\"\n    \"LKR\\0\"\n    \"Sri Lanka Rupee\\0\"\n    \"LR\\0\"\n    \"Liberia\\0\"\n    \"LRD\\0\"\n    \"Liberian Dollar\\0\"\n    \"Lithuania\\0\"\n    \"LTL\\0\"\n    \"Lithuanian Lita\\0\"\n    \"Luxembourg\\0\"\n    \"Latvia\\0\"\n    \"LVL\\0\"\n    \"Latvian Lats\\0\"\n    \"Libya\\0\"\n    \"LYD\\0\"\n    \"Libyan Dinar\\0\"\n    \"Morocco\\0\"\n    \"MC\\0\"\n    \"Monaco\\0\"\n    \"Moldova\\0\"\n    \"MDL\\0\"\n    \"Moldovan Leu\\0\"\n    \"MG\\0\"\n    \"Madagascar\\0\"\n    \"MGF\\0\"\n    \"Madagascar Franc\\0\"\n    \"MH\\0\"\n    \"Marshall Islands\\0\"\n    \"Macedonia\\0\"\n    \"MKD\\0\"\n    \"Macedonian Denar\\0\"\n    \"ML\\0\"\n    \"Mali\\0\"\n    \"MM\\0\"\n    \"Myanmar\\0\"\n    \"MMK\\0\"\n    \"Myanmar Kyat\\0\"\n    \"MN\\0\"\n    \"Mongolia\\0\"\n    \"MNT\\0\"\n    \"Mongolian Tugrik\\0\"\n    \"Macao S.A.R. China\\0\"\n    \"MOP\\0\"\n    \"Macao Pataca\\0\"\n    \"MP\\0\"\n    \"Northern Mariana Islands\\0\"\n    \"MQ\\0\"\n    \"Martinique\\0\"\n    \"MR\\0\"\n    \"Mauritania\\0\"\n    \"MRO\\0\"\n    \"Mauritania Ouguiya\\0\"\n    \"MS\\0\"\n    \"Montserrat\\0\"\n    \"MT\\0\"\n    \"Malta\\0\"\n    \"MTL\\0\"\n    \"Maltese Lira\\0\"\n    \"MU\\0\"\n    \"Mauritius\\0\"\n    \"MUR\\0\"\n    \"Mauritius Rupee\\0\"\n    \"MV\\0\"\n    \"Maldives\\0\"\n    \"MVR\\0\"\n    \"Maldive Islands Rufiyaa\\0\"\n    \"MW\\0\"\n    \"Malawi\\0\"\n    \"MWK\\0\"\n    \"Malawi Kwacha\\0\"\n    \"Mexico\\0\"\n    \"MXN\\0\"\n    \"Mexican Peso\\0\"\n    \"MY\\0\"\n    \"Malaysia\\0\"\n    \"MYR\\0\"\n    \"Malaysian Ringgit\\0\"\n    \"MZ\\0\"\n    \"Mozambique\\0\"\n    \"MZM\\0\"\n    \"Mozambique Metical\\0\"\n    \"NC\\0\"\n    \"New Caledonia\\0\"\n    \"XPF\\0\"\n    \"CFP Franc\\0\"\n    \"NE\\0\"\n    \"Niger\\0\"\n    \"NF\\0\"\n    \"Norfolk Island\\0\"\n    \"NG\\0\"\n    \"Nigeria\\0\"\n    \"NGN\\0\"\n    \"Nigerian Naira\\0\"\n    \"Nicaragua\\0\"\n    \"NIO\\0\"\n    \"Nicaraguan Cordoba Oro\\0\"\n    \"Netherlands\\0\"\n    \"Norway\\0\"\n    \"NP\\0\"\n    \"Nepal\\0\"\n    \"NPR\\0\"\n    \"Nepalese Rupee\\0\"\n    \"NR\\0\"\n    \"Nauru\\0\"\n    \"NU\\0\"\n    \"Niue\\0\"\n    \"New Zealand\\0\"\n    \"Oman\\0\"\n    \"OMR\\0\"\n    \"Oman Rial\\0\"\n    \"Panama\\0\"\n    \"PAB\\0\"\n    \"Panamanian Balboa\\0\"\n    \"Peru\\0\"\n    \"PEN\\0\"\n    \"Peruvian Sol Nuevo\\0\"\n    \"PF\\0\"\n    \"French Polynesia\\0\"\n    \"PG\\0\"\n    \"Papua New Guinea\\0\"\n    \"PGK\\0\"\n    \"Papua New Guinea Kina\\0\"\n    \"Philippines\\0\"\n    \"Philippine Peso\\0\"\n    \"PK\\0\"\n    \"Pakistan\\0\"\n    \"PKR\\0\"\n    \"Pakistan Rupee\\0\"\n    \"Poland\\0\"\n    \"PLN\\0\"\n    \"Polish Zloty\\0\"\n    \"Saint Pierre and Miquelon\\0\"\n    \"PN\\0\"\n    \"Pitcairn\\0\"\n    \"Puerto Rico\\0\"\n    \"Portugal\\0\"\n    \"PW\\0\"\n    \"Palau\\0\"\n    \"Paraguay\\0\"\n    \"PYG\\0\"\n    \"Paraguay Guarani\\0\"\n    \"Qatar\\0\"\n    \"QAR\\0\"\n    \"Qatari Rial\\0\"\n    \"RE\\0\"\n    \"R\\xc3\\xa9union\\0\"\n    \"Romania\\0\"\n    \"ROL\\0\"\n    \"Romanian Leu\\0\"\n    \"Russia\\0\"\n    \"RUR\\0\"\n    \"Russian Ruble (1991-1998)\\0\"\n    \"RW\\0\"\n    \"Rwanda\\0\"\n    \"RWF\\0\"\n    \"Rwandan Franc\\0\"\n    \"Saudi Arabia\\0\"\n    \"SAR\\0\"\n    \"Saudi Riyal\\0\"\n    \"SB\\0\"\n    \"Solomon Islands\\0\"\n    \"SBD\\0\"\n    \"Solomon Islands Dollar\\0\"\n    \"SC\\0\"\n    \"Seychelles\\0\"\n    \"SCR\\0\"\n    \"Seychelles Rupee\\0\"\n    \"SD\\0\"\n    \"Sudan\\0\"\n    \"SDD\\0\"\n    \"Sudanese Dinar\\0\"\n    \"Sweden\\0\"\n    \"SEK\\0\"\n    \"Swedish Krona\\0\"\n    \"Singapore\\0\"\n    \"SGD\\0\"\n    \"Singapore Dollar\\0\"\n    \"SH\\0\"\n    \"Saint Helena\\0\"\n    \"SHP\\0\"\n    \"Saint Helena Pound\\0\"\n    \"Slovenia\\0\"\n    \"Slovenia Tolar\\0\"\n    \"SJ\\0\"\n    \"Svalbard and Jan Mayen\\0\"\n    \"Slovakia\\0\"\n    \"SKK\\0\"\n    \"Slovak Koruna\\0\"\n    \"SL\\0\"\n    \"Sierra Leone\\0\"\n    \"SLL\\0\"\n    \"Sierra Leone Leone\\0\"\n    \"SM\\0\"\n    \"San Marino\\0\"\n    \"SN\\0\"\n    \"Senegal\\0\"\n    \"SO\\0\"\n    \"Somalia\\0\"\n    \"SOS\\0\"\n    \"Somali Shilling\\0\"\n    \"SR\\0\"\n    \"Suriname\\0\"\n    \"SRG\\0\"\n    \"Suriname Guilder\\0\"\n    \"ST\\0\"\n    \"Sao Tome and Principe\\0\"\n    \"STD\\0\"\n    \"Sao Tome and Principe Dobra\\0\"\n    \"El Salvador\\0\"\n    \"El Salvador Colon\\0\"\n    \"Syria\\0\"\n    \"SYP\\0\"\n    \"Syrian Pound\\0\"\n    \"SZ\\0\"\n    \"Swaziland\\0\"\n    \"SZL\\0\"\n    \"Swaziland Lilangeni\\0\"\n    \"TC\\0\"\n    \"Turks and Caicos Islands\\0\"\n    \"TD\\0\"\n    \"Chad\\0\"\n    \"TF\\0\"\n    \"French Southern Territories\\0\"\n    \"TG\\0\"\n    \"Togo\\0\"\n    \"Thailand\\0\"\n    \"THB\\0\"\n    \"Thai Baht\\0\"\n    \"TJ\\0\"\n    \"Tajikistan\\0\"\n    \"TJS\\0\"\n    \"Tajikistan Somoni\\0\"\n    \"TK\\0\"\n    \"Tokelau\\0\"\n    \"Timor-Leste\\0\"\n    \"TM\\0\"\n    \"Turkmenistan\\0\"\n    \"TMM\\0\"\n    \"Turkmenistan Manat\\0\"\n    \"Tunisia\\0\"\n    \"TND\\0\"\n    \"Tunisian Dinar\\0\"\n    \"TO\\0\"\n    \"Tonga\\0\"\n    \"TOP\\0\"\n    \"Tonga Pa\\xc2\\xb4\\x61nga\\0\"\n    \"Turkey\\0\"\n    \"TRL\\0\"\n    \"Turkish Lira\\0\"\n    \"Trinidad and Tobago\\0\"\n    \"TTD\\0\"\n    \"Trinidad and Tobago Dollar\\0\"\n    \"TV\\0\"\n    \"Tuvalu\\0\"\n    \"Taiwan\\0\"\n    \"TWD\\0\"\n    \"Taiwan New Dollar\\0\"\n    \"TZ\\0\"\n    \"Tanzania\\0\"\n    \"TZS\\0\"\n    \"Tanzanian Shilling\\0\"\n    \"Ukraine\\0\"\n    \"UAH\\0\"\n    \"Ukrainian Hryvnia\\0\"\n    \"UG\\0\"\n    \"Uganda\\0\"\n    \"UGX\\0\"\n    \"Ugandan Shilling\\0\"\n    \"UM\\0\"\n    \"United States Minor Outlying Islands\\0\"\n    \"United States\\0\"\n    \"Uruguay\\0\"\n    \"UYU\\0\"\n    \"Uruguay Peso Uruguayo\\0\"\n    \"UZ\\0\"\n    \"Uzbekistan\\0\"\n    \"UZS\\0\"\n    \"Uzbekistan Sum\\0\"\n    \"VA\\0\"\n    \"Vatican\\0\"\n    \"VC\\0\"\n    \"Saint Vincent and the Grenadines\\0\"\n    \"Venezuela\\0\"\n    \"VEB\\0\"\n    \"Venezuelan Bolivar\\0\"\n    \"VG\\0\"\n    \"British Virgin Islands\\0\"\n    \"U.S. Virgin Islands\\0\"\n    \"Vietnam\\0\"\n    \"VND\\0\"\n    \"Vietnamese Dong\\0\"\n    \"VU\\0\"\n    \"Vanuatu\\0\"\n    \"VUV\\0\"\n    \"Vanuatu Vatu\\0\"\n    \"WF\\0\"\n    \"Wallis and Futuna\\0\"\n    \"WS\\0\"\n    \"Samoa\\0\"\n    \"WST\\0\"\n    \"Western Samoa Tala\\0\"\n    \"Yemen\\0\"\n    \"YER\\0\"\n    \"Yemeni Rial\\0\"\n    \"YT\\0\"\n    \"Mayotte\\0\"\n    \"YU\\0\"\n    \"Yugoslavia\\0\"\n    \"YUM\\0\"\n    \"Yugoslavian Noviy Dinar\\0\"\n    \"South Africa\\0\"\n    \"ZAR\\0\"\n    \"South African Rand\\0\"\n    \"ZM\\0\"\n    \"Zambia\\0\"\n    \"ZMK\\0\"\n    \"Zambian Kwacha\\0\"\n    \"Zimbabwe\\0\"\n    \"ZWD\\0\"\n    \"Zimbabwe Dollar\\0\"\n};\n\n#else\n\nstatic const DateTimeFormatEntry datetime_format_entries[] =\n{\n    { 1, 0, 0, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0 }, { 9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0 }, { 9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0 }, { 9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0 }, 0, 6, 185, 187, { 189, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 209, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 296, 307, { 318, 331, 352, 367, 378, 397, 408 }, { 421, 426, 431, 436, 441, 446, 451 }, { 456, 459, 462, 465, 468, 459, 465 }, { 471, 484, 501, 510, 521, 528, 535, 542, 555, 574, 591, 606, 0 }, { 471, 484, 501, 510, 521, 528, 535, 542, 555, 574, 591, 606, 0 }, { 623, 629, 501, 639, 521, 528, 535, 647, 655, 665, 673, 683, 0 }, { 623, 629, 501, 639, 521, 528, 535, 647, 655, 665, 673, 683, 0 }, 2, 1, 691, 187, { 693, 708, 724, 740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 757, 776, 794, 819, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 856, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 872, 878, { 884, 893, 901, 909, 918, 925, 935 }, { 944, 948, 952, 956, 960, 964, 968 }, { 972, 975, 978, 981, 984, 987, 990 }, { 993, 999, 1006, 1012, 1018, 1023, 1028, 1035, 1041, 1050, 1058, 1067, 0 }, { 993, 999, 1006, 1012, 1018, 1023, 1028, 1035, 1041, 1050, 1058, 1067, 0 }, { 1076, 1081, 1006, 1086, 1018, 1023, 1091, 1096, 1100, 1105, 1110, 1115, 0 }, { 1076, 1081, 1006, 1086, 1018, 1023, 1091, 1096, 1100, 1105, 1110, 1115, 0 }, 2, 1, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1140, 1163, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1195, 1204, 1211, { 1218, 1228, 1238, 1248, 1258, 1268, 1278 }, { 1288, 1295, 1302, 1309, 1316, 1323, 1330 }, { 1337, 1341, 1345, 1349, 1353, 1357, 1361 }, { 1365, 1372, 1379, 1386, 1393, 1400, 1407, 1414, 1421, 1428, 1435, 1445, 0 }, { 1365, 1372, 1379, 1386, 1393, 1400, 1407, 1414, 1421, 1428, 1435, 1445, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, 0, 0, 185, 187, { 1518, 1527, 1536, 1545, 1556, 1567, 1578, 1585, 1592, 1599, 0, 0, 0, 0 }, { 1608, 1630, 1658, 1686, 1701, 0, 0, 0, 0, 0 }, { 843, 251, 1722, 1730, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 1739, 1750, 0, 0, 0, 0, 0 }, { 1762, 1778, 1791, 1805, 0, 0, 0, 0 } },\n    { 1195, 1204, 1211, { 1218, 1228, 1238, 1248, 1258, 1268, 1278 }, { 1288, 1295, 1302, 1309, 1316, 1323, 1330 }, { 1337, 1341, 1345, 1349, 1353, 1357, 1361 }, { 1365, 1372, 1379, 1386, 1393, 1400, 1407, 1414, 1421, 1428, 1435, 1445, 0 }, { 1365, 1372, 1379, 1386, 1393, 1400, 1407, 1414, 1421, 1428, 1435, 1445, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, 0, 0, 185, 187, { 1518, 1527, 1536, 1545, 1556, 1567, 1578, 1585, 1592, 1599, 0, 0, 0, 0 }, { 1608, 1630, 1658, 1686, 1701, 0, 0, 0, 0, 0 }, { 843, 251, 1722, 1730, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 1739, 1750, 0, 0, 0, 0, 0 }, { 1762, 1778, 1791, 1805, 0, 0, 0, 0 } },\n    { 1812, 1820, 1823, { 1826, 1834, 1844, 1852, 1860, 1869, 1876 }, { 1883, 1886, 1889, 1893, 1896, 1900, 1904 }, { 1907, 1909, 1911, 1914, 1916, 1909, 1914 }, { 1919, 1925, 1931, 1939, 1945, 1953, 1961, 1971, 1977, 1985, 1993, 2002, 0 }, { 2011, 2017, 2024, 2032, 2038, 2046, 2054, 2064, 1977, 2070, 2078, 2088, 0 }, { 2097, 2101, 2106, 2111, 2115, 2120, 2125, 2130, 2134, 2140, 2146, 2150, 0 }, { 2097, 2101, 2106, 2111, 2115, 2120, 2125, 2130, 2134, 2140, 2146, 2150, 0 }, 2, 1, 691, 187, { 2154, 2165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2176, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 1820, 1823, { 2217, 2225, 2232, 2240, 2247, 2255, 2262 }, { 2270, 2275, 2279, 2283, 2287, 2291, 2295 }, { 1914, 2300, 2302, 2304, 2302, 2306, 2308 }, { 2310, 2317, 2325, 2331, 2337, 2341, 2346, 2351, 2358, 2368, 2376, 2385, 0 }, { 2310, 2317, 2325, 2331, 2337, 2341, 2346, 2351, 2358, 2368, 2376, 2385, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, 2, 1, 2438, 187, { 2440, 2451, 1556, 2460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2194, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 2471, 2477, { 2484, 2492, 2499, 2508, 2517, 2528, 2536 }, { 2544, 2547, 2550, 2553, 2556, 2559, 2562 }, { 1914, 2300, 2565, 2300, 2565, 2306, 1914 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, 2, 1, 691, 187, { 2154, 2696, 1556, 2705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 2738, 0, 0, 0, 0, 0, 0, 0 }, { 251, 2751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 2763, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 2778, 2785, { 2792, 2807, 2822, 2833, 2848, 2861, 2880 }, { 2895, 2902, 2909, 2916, 2923, 2930, 2937 }, { 2944, 2947, 2950, 2950, 2953, 2953, 2956 }, { 2959, 2980, 3003, 3018, 3035, 3046, 3061, 3076, 3095, 3118, 3137, 3156, 0 }, { 3177, 3198, 3221, 3236, 3253, 3264, 3279, 3294, 3313, 3336, 3355, 3374, 0 }, { 3395, 3402, 3409, 3416, 3423, 3430, 3439, 3448, 3455, 3462, 3469, 3476, 0 }, { 3395, 3402, 3409, 3416, 3423, 3430, 3439, 3448, 3455, 3462, 3469, 3476, 0 }, 2, 1, 185, 187, { 1120, 198, 3483, 189, 3490, 1556, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 848, 269, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 185, 187, { 3711, 3720, 3727, 3736, 1599, 1556, 3747, 0, 0, 0, 0, 0, 0, 0 }, { 3757, 3776, 3789, 3808, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 848, 269, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3821, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 1, 185, 187, { 198, 189, 4149, 3483, 4157, 2451, 2696, 1556, 0, 0, 0, 0, 0, 0 }, { 4164, 4192, 4219, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 4241, 4246, 4252, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 4260, 4268, 4277, 0, 0, 0, 0 }, { 4288, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 4303, 4307, { 4311, 4323, 4335, 4345, 4359, 4369, 4381 }, { 4392, 4395, 4398, 4401, 4404, 4407, 4410 }, { 1914, 2300, 2302, 4413, 2302, 1909, 2308 }, { 4415, 4424, 4433, 4443, 4452, 4461, 4470, 4480, 4487, 4495, 4503, 4513, 0 }, { 4522, 4533, 4544, 4556, 4567, 4578, 4589, 4601, 4610, 4620, 4630, 4642, 0 }, { 4653, 4659, 4665, 4672, 4678, 4684, 4690, 4697, 4701, 4706, 4711, 4718, 0 }, { 4653, 4659, 4665, 4672, 4678, 4684, 4690, 4697, 4701, 4706, 4711, 4718, 0 }, 2, 1, 691, 691, { 4724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2176, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4260, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 4733, 4742, 4748, 4754, 4763, 4769, 4778 }, { 4785, 4790, 4795, 4800, 4805, 4810, 4815 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, 0, 1, 185, 187, { 198, 189, 2696, 2451, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 3520, 4952, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 4246, 4961, 4971, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 4979, 4992, { 5003, 5021, 5035, 5053, 5071, 5089, 5105 }, { 5119, 5131, 5143, 5155, 5167, 5179, 5191 }, { 5198, 5203, 5208, 5213, 5218, 5223, 5228 }, { 5233, 5244, 5257, 5264, 5275, 5282, 5291, 5300, 5313, 5326, 5341, 5354, 0 }, { 5233, 5244, 5257, 5264, 5275, 5282, 5291, 5300, 5313, 5326, 5341, 5354, 0 }, { 5365, 5374, 5257, 5383, 5275, 5392, 5401, 5410, 5419, 5428, 5437, 5446, 0 }, { 5365, 5374, 5257, 5383, 5275, 5392, 5401, 5410, 5419, 5428, 5437, 5446, 0 }, 0, 0, 185, 187, { 198, 5455, 189, 209, 2451, 2440, 5468, 1556, 5481, 5498, 0, 0, 0, 0 }, { 5508, 5455, 5526, 5548, 5481, 0, 0, 0, 0, 0 }, { 251, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 257, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 5569, 5577, 5581, { 5585, 5595, 5603, 5608, 5615, 5628, 5636 }, { 3927, 5644, 4413, 5646, 5650, 1909, 5653 }, { 3927, 5644, 4413, 5657, 5650, 1909, 5657 }, { 5660, 5668, 5677, 5686, 5695, 5702, 5710, 5718, 5728, 5739, 2376, 2385, 0 }, { 5660, 5668, 5677, 5686, 5695, 5702, 5710, 5718, 5728, 5739, 2376, 2385, 0 }, { 5748, 5753, 5759, 5766, 5772, 5778, 5784, 5790, 5795, 5802, 1110, 5807, 0 }, { 5748, 5753, 5759, 5766, 5772, 5778, 5784, 5790, 5795, 5802, 1110, 5807, 0 }, 2, 1, 5812, 187, { 5815, 5829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5842, 5862, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5876, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 5887, 5892, { 5897, 5908, 5919, 5933, 5947, 5959, 5971 }, { 5983, 5988, 5994, 6000, 6006, 6011, 6017 }, { 1914, 2300, 6022, 2300, 2306, 2306, 2308 }, { 6025, 6033, 4837, 6042, 6049, 6054, 6061, 6068, 2358, 5739, 6076, 6086, 0 }, { 6025, 6033, 4837, 6042, 6049, 6054, 6061, 6068, 2358, 5739, 6076, 6086, 0 }, { 5748, 1081, 4795, 6095, 6049, 5778, 5784, 6100, 6107, 5802, 6112, 1115, 0 }, { 5748, 1081, 4795, 6095, 6049, 5778, 5784, 6100, 6107, 5802, 6112, 1115, 0 }, 2, 1, 691, 187, { 4724, 6118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 6130, 6139, 6147, 6156, 6167, 6176, 6185 }, { 6192, 6196, 2402, 6200, 6204, 6208, 6212 }, { 2565, 2308, 2300, 2300, 6216, 3927, 1914 }, { 6218, 6226, 3943, 6235, 6242, 6249, 6256, 3972, 6263, 6273, 6281, 6290, 0 }, { 6299, 6307, 4032, 6316, 6323, 6330, 6337, 4055, 6344, 6354, 1058, 6362, 0 }, { 6371, 2398, 2402, 2406, 6375, 6379, 6383, 6387, 6391, 6395, 2430, 6399, 0 }, { 6371, 2398, 2402, 2406, 6375, 6379, 6383, 6387, 6391, 6395, 2430, 6399, 0 }, 2, 1, 185, 187, { 198, 3490, 189, 6403, 3483, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 6411, 3520, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1195, 6420, 6427, { 6434, 6444, 6454, 6464, 6474, 6484, 6494 }, { 1337, 6504, 6508, 6512, 6516, 6520, 6524 }, { 1337, 6504, 6508, 6512, 6516, 6520, 6524 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 0, 185, 187, { 1545, 1599, 1578, 1518, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1608, 6555, 6579, 6606, 6635, 6659, 6688, 6708, 0, 0 }, { 843, 251, 1722, 1730, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 1739, 1750, 0, 0, 0, 0, 0 }, { 1762, 6733, 1791, 0, 0, 0, 0, 0 } },\n    { 6751, 6761, 6768, { 6775, 6785, 6795, 6805, 6815, 6825, 6835 }, { 6845, 6849, 6853, 6857, 6861, 6865, 6869 }, { 6845, 6849, 6853, 6857, 6861, 6865, 6869 }, { 6873, 6878, 6883, 6888, 6893, 6898, 6903, 6908, 6913, 6918, 6924, 6930, 0 }, { 6873, 6878, 6883, 6888, 6893, 6898, 6903, 6908, 6913, 6918, 6924, 6930, 0 }, { 6873, 6878, 6883, 6888, 6893, 6898, 6903, 6908, 6913, 6918, 6924, 6930, 0 }, { 6873, 6878, 6883, 6888, 6893, 6898, 6903, 6908, 6913, 6918, 6924, 6930, 0 }, 0, 0, 2438, 187, { 1556, 6936, 1585, 1527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 6945, 6974, 6998, 7025, 7047, 7078, 7104, 7135, 7161, 7188 }, { 1722, 1730, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1739, 1750, 848, 269, 0, 0, 0, 0, 0 }, { 7210, 7227, 7246, 0, 0, 0, 0, 0 } },\n    { 289, 7261, 7266, { 7271, 7278, 7286, 7294, 7303, 7313, 7321 }, { 7330, 4395, 7333, 7336, 7339, 7342, 7345 }, { 7348, 2300, 2565, 3643, 2565, 3927, 7348 }, { 7350, 7358, 7367, 2331, 7373, 2341, 2346, 7377, 2358, 2368, 2376, 2385, 0 }, { 7350, 7358, 7367, 2331, 7373, 2341, 2346, 7377, 2358, 2368, 2376, 2385, 0 }, { 2394, 2398, 7386, 2406, 7373, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 7386, 2406, 7373, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, 2, 1, 2438, 187, { 7390, 4157, 2451, 189, 2696, 7399, 1556, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 6411, 3520, 4952, 0, 0, 0, 0, 0, 0 }, { 251, 843, 4241, 7411, 7423, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 7435, 7450, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 7465, 7261, 7266, { 2217, 2225, 2232, 2240, 2247, 2255, 2262 }, { 7473, 7478, 7482, 7486, 7490, 7494, 7498 }, { 1914, 2300, 2302, 2304, 2302, 2306, 2308 }, { 2310, 2317, 4837, 2331, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2310, 2317, 4837, 2331, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, 0, 0, 691, 691, { 2154, 6118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2176, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 7507, 7517, 7531, 7538, 7545, 7554, 1876 }, { 7562, 7569, 7574, 7578, 7583, 7588, 7592 }, { 1907, 1909, 3643, 7597, 7600, 1909, 1914 }, { 7602, 7611, 7616, 7623, 2337, 7633, 7642, 7649, 7659, 7669, 1993, 7682, 0 }, { 7692, 7701, 7708, 7714, 7723, 7728, 7736, 7742, 7751, 7761, 7775, 7785, 0 }, { 7793, 7797, 2402, 7801, 2337, 7805, 7809, 7813, 7817, 7821, 2146, 7826, 0 }, { 7793, 7797, 2402, 7801, 2337, 7805, 7809, 7813, 7817, 7821, 2146, 7826, 0 }, 2, 1, 691, 187, { 2154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3821, 1820, 1823, { 3833, 7830, 7844, 7857, 7870, 7883, 3880 }, { 6192, 7895, 7899, 7903, 7907, 7911, 7915 }, { 2565, 1914, 2302, 7920, 7920, 1914, 1914 }, { 7922, 7930, 7940, 1012, 7947, 7952, 7958, 4055, 7964, 7973, 7981, 7990, 0 }, { 7922, 7930, 7940, 1012, 7947, 7952, 7958, 4055, 7964, 7973, 7981, 7990, 0 }, { 2394, 7999, 2402, 8003, 4848, 2410, 2414, 6387, 6391, 8007, 2430, 8011, 0 }, { 2394, 7999, 2402, 8003, 4848, 2410, 2414, 6387, 6391, 8007, 2430, 8011, 0 }, 0, 0, 185, 187, { 198, 189, 1120, 3483, 2451, 2440, 4157, 7390, 2696, 2154, 7399, 8015, 4724, 1556 }, { 4164, 4219, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4288, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 8022, 8025, { 8028, 8037, 4748, 8047, 8055, 8063, 8072 }, { 8078, 8081, 4395, 8085, 8088, 8092, 1904 }, { 2565, 6216, 2300, 2300, 6216, 3927, 1914 }, { 8095, 8103, 4837, 8110, 8117, 8122, 8132, 8140, 8146, 8156, 2376, 2385, 0 }, { 8095, 8103, 4837, 8110, 8117, 8122, 8132, 8140, 8146, 8156, 2376, 2385, 0 }, { 8164, 8171, 4837, 4912, 8117, 8177, 8184, 8140, 8189, 1105, 1110, 5807, 0 }, { 8164, 8171, 4837, 4912, 8117, 8177, 8184, 8140, 8189, 1105, 1110, 5807, 0 }, 2, 1, 2438, 187, { 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 8195, 8224, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 7261, 7266, { 8241, 8251, 8256, 8263, 8272, 8276, 8283 }, { 8294, 8298, 3699, 8302, 8306, 8310, 8314 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 8319, 8328, 8338, 8345, 4848, 8353, 8359, 2351, 8365, 8376, 8386, 8396, 0 }, { 8319, 8328, 8338, 8345, 4848, 8353, 8359, 2351, 8365, 8376, 8386, 8396, 0 }, { 8406, 1081, 4795, 6095, 4848, 8411, 8416, 5790, 4923, 1105, 1110, 5807, 0 }, { 8406, 1081, 4795, 6095, 4848, 8411, 8416, 5790, 4923, 1105, 1110, 5807, 0 }, 0, 1, 691, 187, { 2154, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 8421, 8441, { 8467, 8490, 352, 8513, 8524, 8539, 8554 }, { 8569, 8574, 8579, 8584, 8589, 8594, 8599 }, { 8604, 8607, 8604, 8610, 8613, 8607, 8610 }, { 8616, 8629, 8644, 8653, 8666, 8673, 8682, 8691, 8704, 8721, 8736, 8749, 0 }, { 8764, 8777, 8792, 8803, 8816, 8823, 8832, 8841, 8856, 8873, 8888, 8901, 0 }, { 8916, 8924, 8644, 8934, 8666, 8673, 8682, 8942, 8950, 8960, 8968, 8978, 0 }, { 8916, 8924, 8644, 8934, 8666, 8673, 8682, 8942, 8950, 8960, 8968, 8978, 0 }, 0, 1, 691, 187, { 2154, 2696, 8015, 2440, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 776, 757, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 1820, 1823, { 8986, 8995, 9007, 9014, 9022, 9032, 9038 }, { 9045, 9049, 9053, 9057, 9061, 9066, 9070 }, { 9074, 9076, 9078, 9080, 9082, 9076, 9080 }, { 9085, 9095, 9104, 9112, 9120, 9128, 9135, 9142, 9150, 1993, 9156, 9164, 0 }, { 9173, 9183, 9192, 9200, 9208, 9216, 9223, 9230, 9239, 7775, 9245, 9255, 0 }, { 9264, 9268, 9273, 9278, 9282, 7809, 2130, 9286, 9290, 2146, 9294, 2150, 0 }, { 9264, 9268, 9273, 9278, 9282, 7809, 2130, 9286, 9290, 2146, 9294, 2150, 0 }, 0, 1, 691, 187, { 9298, 9308, 9316, 9328, 9340, 9350, 9360, 1556, 0, 0, 0, 0, 0, 0 }, { 9372, 9386, 9401, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 1820, 1823, { 9421, 9429, 9438, 9445, 9452, 9461, 1876 }, { 1883, 1886, 9468, 1893, 9471, 9475, 1904 }, { 1907, 1909, 9478, 1914, 9480, 1909, 1914 }, { 5660, 5668, 9483, 6042, 9489, 9494, 9499, 2351, 2358, 5739, 2376, 2385, 0 }, { 9504, 9513, 7708, 9523, 9531, 9537, 9543, 9549, 9557, 9567, 9576, 9585, 0 }, { 2394, 2398, 2402, 2406, 9489, 9494, 9499, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 9489, 9494, 9499, 2418, 2422, 2426, 2430, 2434, 0 }, 2, 1, 691, 187, { 2154, 2165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 9594, 9603, { 9611, 9618, 9627, 9636, 9648, 9656, 9665 }, { 9675, 9679, 3699, 9684, 9689, 9693, 9697 }, { 2565, 5644, 2300, 2300, 9701, 1909, 1914 }, { 9703, 9709, 4837, 9716, 2337, 9722, 9730, 9737, 9743, 9751, 9757, 9765, 0 }, { 9703, 9709, 4837, 9716, 2337, 9722, 9730, 9737, 9743, 9751, 9757, 9765, 0 }, { 2651, 9773, 3699, 9777, 9781, 9785, 9789, 9793, 9697, 9797, 9801, 9806, 0 }, { 2651, 9773, 3699, 9777, 9781, 9785, 9789, 9793, 9697, 9797, 9801, 9806, 0 }, 0, 1, 691, 187, { 4724, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 9810, 9823, 9826, { 9829, 9837, 9845, 2240, 2247, 2255, 9852 }, { 9860, 9865, 9870, 2283, 2287, 2291, 9874 }, { 1914, 2300, 2302, 2304, 2302, 2306, 2308 }, { 7350, 7358, 4837, 2331, 2337, 2341, 2346, 9879, 2358, 2368, 2376, 2385, 0 }, { 7350, 7358, 4837, 2331, 2337, 2341, 2346, 9879, 2358, 2368, 2376, 2385, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, 2, 1, 2438, 187, { 1556, 6936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 9887, 9905, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 9928, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 9938, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 0, 0, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 0, 185, 187, { 1120, 3483, 189, 198, 1129, 9951, 1556, 0, 0, 0, 0, 0, 0, 0 }, { 3520, 9963, 9979, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 3532, 242, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 3540, 257, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 10021, 10026, { 10030, 10036, 10046, 10052, 10063, 10073, 10078 }, { 10088, 10092, 10096, 10100, 10105, 10109, 10113 }, { 1909, 1909, 1914, 10117, 1909, 7600, 7600 }, { 10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0 }, { 10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0 }, { 10201, 10205, 3699, 10210, 3668, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0 }, { 10201, 10205, 3699, 10210, 3668, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0 }, 0, 1, 691, 187, { 10243, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10253, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 10270, 10288, { 10306, 10317, 10330, 10339, 10346, 10359, 10368 }, { 10306, 10317, 10330, 10339, 10346, 10359, 10368 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 10377, 10388, 10399, 10408, 10419, 10426, 10433, 10446, 10455, 10466, 10479, 10490, 0 }, { 10377, 10388, 10399, 10408, 10419, 10426, 10433, 10446, 10455, 10466, 10479, 10490, 0 }, { 10377, 10388, 10399, 10408, 10419, 10426, 10433, 10446, 10455, 10466, 10479, 10490, 0 }, { 10377, 10388, 10399, 10408, 10419, 10426, 10433, 10446, 10455, 10466, 10479, 10490, 0 }, 0, 0, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 848, 269, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 10515, 10522, 10528, 10535, 10540, 10546, 10552 }, { 10558, 10562, 10566, 10570, 10574, 10578, 10582 }, { 2300, 1914, 1914, 10586, 4413, 3925, 1914 }, { 10588, 10596, 10605, 2588, 10611, 2598, 2603, 10615, 2615, 2625, 2633, 10623, 0 }, { 10588, 10596, 10605, 2588, 10611, 2598, 2603, 10615, 2615, 2625, 2633, 10623, 0 }, { 2651, 2655, 3699, 2664, 10611, 2668, 2672, 10632, 2680, 2684, 2688, 10636, 0 }, { 2651, 2655, 3699, 2664, 10611, 2668, 2672, 10632, 2680, 2684, 2688, 10636, 0 }, 0, 0, 185, 691, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10640, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 10659, 10664, { 10669, 10682, 10701, 10718, 10731, 10744, 10761 }, { 10774, 8574, 8579, 8584, 8589, 8594, 8599 }, { 10779, 8607, 8604, 8610, 8613, 8607, 8610 }, { 10782, 10795, 10806, 10823, 10838, 10853, 10868, 10881, 10896, 10913, 10928, 10945, 0 }, { 10960, 10971, 10984, 10999, 11012, 11025, 11038, 11049, 11062, 11077, 11090, 11109, 0 }, { 11122, 11129, 11136, 11143, 11150, 11157, 11164, 11171, 11178, 11185, 11192, 11199, 0 }, { 11122, 11129, 11136, 11143, 11150, 11157, 11164, 11171, 11178, 11185, 11192, 11199, 0 }, 0, 1, 691, 187, { 2154, 2696, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 11206, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 11224, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 11240, 11253, { 11266, 11281, 11302, 11317, 11330, 11343, 10761 }, { 421, 426, 11358, 436, 11363, 446, 451 }, { 456, 459, 11368, 465, 468, 459, 465 }, { 11371, 11388, 11397, 11412, 521, 11429, 11444, 11457, 11472, 11489, 11510, 11527, 0 }, { 11542, 11559, 11572, 11589, 8816, 11608, 11623, 11636, 11649, 11664, 11687, 11706, 0 }, { 11719, 11726, 11733, 11740, 521, 11747, 11754, 11761, 11768, 11775, 11782, 11789, 0 }, { 11719, 11726, 11733, 11740, 521, 11747, 11754, 11761, 11768, 11775, 11782, 11789, 0 }, 0, 0, 691, 187, { 2696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3520, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 11796, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 11810, 11815, { 11820, 11828, 11839, 11845, 11851, 11860, 1876 }, { 9045, 9049, 2287, 11866, 9061, 9066, 11870 }, { 9074, 9076, 11874, 9080, 9082, 9076, 9080 }, { 2310, 2317, 9483, 2331, 2337, 11876, 11882, 11888, 2358, 2368, 2376, 2385, 0 }, { 2310, 2317, 9483, 2331, 2337, 11876, 11882, 11888, 2358, 2368, 2376, 2385, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, 0, 1, 5812, 187, { 11899, 6118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 11911, 11931, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 11945, 11950, { 11955, 11966, 11977, 11988, 11999, 12010, 12016 }, { 1909, 9701, 2302, 4413, 1907, 10586, 2308 }, { 1909, 9701, 2302, 4413, 1907, 10586, 2308 }, { 12025, 12033, 12042, 12049, 4848, 12056, 12062, 2351, 2358, 12068, 2376, 12077, 0 }, { 12025, 12033, 12042, 12049, 4848, 12056, 12062, 2351, 2358, 12068, 2376, 12077, 0 }, { 12087, 12092, 12042, 2406, 4848, 12056, 12062, 2418, 12098, 2426, 2430, 12103, 0 }, { 12087, 12092, 12042, 2406, 4848, 12056, 12062, 2418, 12098, 2426, 2430, 12103, 0 }, 2, 1, 691, 187, { 2154, 6118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12108, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 12116, 12133, { 12147, 12158, 12168, 12177, 12188, 12200, 12211 }, { 12221, 12224, 12227, 12230, 12233, 12236, 12239 }, { 1914, 1909, 2304, 2302, 7600, 1909, 1914 }, { 12242, 12252, 12263, 12269, 12278, 12284, 12292, 12300, 12308, 12319, 12328, 12338, 0 }, { 12348, 12358, 2325, 12369, 12378, 12384, 12392, 12400, 12408, 12419, 12428, 12438, 0 }, { 12448, 12454, 12263, 12460, 12278, 12465, 12471, 12477, 4128, 12482, 4139, 12487, 0 }, { 12448, 12454, 12263, 12460, 12278, 12465, 12471, 12477, 4128, 12482, 4139, 12487, 0 }, 0, 1, 691, 187, { 2154, 12492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12512, 12539, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12560, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 12576, 11815, { 12582, 12594, 12606, 12618, 12632, 12647, 12660 }, { 12674, 12677, 12680, 12683, 12686, 12689, 9471 }, { 1914, 1909, 12692, 2302, 4413, 1909, 9480 }, { 12694, 12701, 12709, 12715, 12724, 12733, 12743, 12749, 12760, 12770, 12777, 12787, 0 }, { 12694, 12701, 12709, 12715, 12724, 12733, 12743, 12749, 12760, 12770, 12777, 12787, 0 }, { 12795, 12801, 12806, 12811, 12816, 12821, 12828, 12834, 12840, 12846, 12852, 12859, 0 }, { 12795, 12801, 12806, 12811, 12816, 12821, 12828, 12834, 12840, 12846, 12852, 12859, 0 }, 2, 1, 2438, 187, { 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12866, 12894, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 12926, 12938, { 12950, 12965, 12980, 12995, 13012, 13031, 13042 }, { 13053, 13060, 13067, 13074, 13081, 13088, 13095 }, { 0, 0, 0, 0, 0, 0, 0 }, { 13102, 13113, 8644, 13126, 8666, 13137, 13144, 8691, 13151, 13166, 13179, 13190, 0 }, { 13102, 13113, 8644, 13126, 8666, 13137, 13144, 8691, 13151, 13166, 13179, 13190, 0 }, { 13203, 13210, 13217, 13224, 8666, 13137, 13144, 13231, 13238, 13245, 13252, 13259, 0 }, { 13203, 13210, 13217, 13224, 8666, 13137, 13144, 13231, 13238, 13245, 13252, 13259, 0 }, 0, 0, 691, 187, { 2154, 2696, 8015, 2440, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 13266, 13284, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 13303, 13323, { 13340, 13353, 13366, 13382, 13399, 13414, 13423 }, { 13340, 13353, 13366, 13382, 13399, 13414, 13423 }, { 13432, 13435, 13438, 13441, 13444, 13447, 13450 }, { 13453, 13466, 13477, 13486, 13497, 13502, 13511, 13522, 13529, 13544, 13555, 13568, 0 }, { 13581, 13596, 13477, 13486, 13609, 13502, 13616, 13522, 13529, 13544, 13555, 13568, 0 }, { 13453, 13466, 13477, 13486, 13497, 13502, 13511, 13522, 13529, 13544, 13555, 13568, 0 }, { 13453, 13466, 13477, 13486, 13497, 13502, 13511, 13522, 13529, 13544, 13555, 13568, 0 }, 0, 6, 185, 187, { 198, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 13629, 13632, { 13635, 13648, 13658, 13667, 13677, 13688, 13699 }, { 13711, 13714, 13719, 13724, 13729, 13734, 13739 }, { 13711, 13744, 13747, 13750, 13753, 13756, 13759 }, { 13762, 13771, 13780, 13789, 13798, 13807, 13816, 13825, 13834, 13843, 13853, 13863, 0 }, { 13873, 13882, 13891, 13900, 13909, 13918, 13927, 13936, 13945, 13954, 13964, 13974, 0 }, { 13984, 13990, 13996, 14002, 14008, 14014, 14020, 14026, 14032, 14038, 14045, 14052, 0 }, { 13984, 13990, 13996, 14002, 14008, 14014, 14020, 14026, 14032, 14038, 14045, 14052, 0 }, 0, 1, 185, 187, { 198, 189, 2451, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 848, 269, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 14059, 14083, { 14107, 14120, 14141, 14160, 14181, 14200, 14213 }, { 14224, 14231, 14238, 14245, 14252, 14259, 14266 }, { 14273, 14276, 14276, 14279, 14282, 14285, 14290 }, { 14293, 14308, 14323, 14332, 14343, 14354, 14367, 14380, 14395, 14414, 14433, 14450, 0 }, { 14469, 14486, 14503, 14514, 14527, 14540, 14555, 14570, 14587, 14608, 14629, 14648, 0 }, { 14669, 14676, 14683, 14690, 14697, 14704, 14711, 14718, 14725, 14732, 14739, 14746, 0 }, { 14669, 14676, 14683, 14690, 14697, 14704, 14711, 14718, 14725, 14732, 14739, 14746, 0 }, 0, 1, 691, 187, { 2154, 2696, 14753, 198, 14763, 3490, 1556, 0, 0, 0, 0, 0, 0, 0 }, { 3808, 3502, 10640, 5455, 14774, 14785, 14797, 14814, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 14832, 14838, 14852, 14875, 14889, 14905, 14912 }, { 14921, 14924, 14929, 14935, 14939, 7600, 14944 }, { 6540, 6528, 6530, 6532, 6534, 6536, 6538 }, { 14948, 14955, 10132, 14962, 3668, 14968, 14974, 14980, 14987, 14996, 15004, 15011, 0 }, { 15018, 15025, 15032, 15037, 15043, 15047, 15052, 15057, 15064, 15073, 15081, 15088, 0 }, { 15095, 7999, 2402, 2406, 15043, 15099, 15103, 15107, 15111, 2426, 15115, 15119, 0 }, { 15095, 7999, 2402, 2406, 15043, 15099, 15103, 15107, 15111, 2426, 15115, 15119, 0 }, 0, 0, 691, 187, { 2154, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15123, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 15141, 15149, 15160, 15170, 15181, 15190, 15199 }, { 15209, 15213, 15217, 15221, 15225, 15229, 15233 }, { 15237, 12692, 12692, 12692, 2304, 2304, 2308 }, { 15239, 15249, 15257, 15265, 15273, 15281, 15288, 15296, 15304, 15311, 15317, 15324, 0 }, { 15332, 15343, 15352, 15361, 15370, 15379, 15387, 15396, 15405, 15413, 15420, 15428, 0 }, { 15437, 15442, 4795, 15447, 15452, 15457, 15462, 15467, 15472, 15477, 15482, 15487, 0 }, { 15437, 15442, 4795, 15447, 15452, 15457, 15462, 15467, 15472, 15477, 15482, 15487, 0 }, 2, 1, 185, 187, { 1545, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15503, 15530, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15551, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 15570, 15591, { 15608, 331, 352, 8513, 15621, 15638, 15649 }, { 15662, 15670, 15678, 15684, 15692, 15700, 15708 }, { 456, 459, 462, 465, 468, 459, 465 }, { 15716, 484, 501, 510, 15731, 15738, 15747, 542, 555, 574, 591, 606, 0 }, { 15716, 484, 501, 510, 15731, 15738, 15747, 542, 555, 574, 591, 606, 0 }, { 15756, 15764, 15772, 639, 15731, 15780, 15788, 647, 655, 665, 673, 683, 0 }, { 15756, 15764, 15772, 639, 15731, 15780, 15788, 647, 655, 665, 673, 683, 0 }, 0, 1, 691, 187, { 15796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10640, 5455, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15806, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 0, 0, { 15822, 15829, 15840, 15849, 15858, 15865, 15876 }, { 15886, 15890, 15894, 15898, 15902, 15905, 15909 }, { 0, 0, 0, 0, 0, 0, 0 }, { 15913, 15923, 15932, 15940, 15949, 15962, 15974, 15981, 15988, 15995, 16005, 16017, 0 }, { 15913, 15923, 15932, 15940, 15949, 15962, 15974, 15981, 15988, 15995, 16005, 16017, 0 }, { 16030, 16034, 16038, 16042, 16046, 16050, 16054, 16058, 16062, 16066, 16070, 16074, 0 }, { 16030, 16034, 16038, 16042, 16046, 16050, 16054, 16058, 16062, 16066, 16070, 16074, 0 }, 0, 0, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 0, 0, { 16108, 16113, 16119, 16129, 16141, 16149, 16160 }, { 16169, 16173, 16177, 16181, 16185, 16189, 16193 }, { 0, 0, 0, 0, 0, 0, 0 }, { 16197, 16207, 16217, 16224, 16231, 2598, 16236, 16243, 16250, 16259, 16267, 16275, 0 }, { 16197, 16207, 16217, 16224, 16231, 2598, 16236, 16243, 16250, 16259, 16267, 16275, 0 }, { 2651, 2655, 15909, 16283, 16287, 2668, 2672, 16291, 2680, 2684, 2688, 16295, 0 }, { 2651, 2655, 15909, 16283, 16287, 2668, 2672, 16291, 2680, 2684, 2688, 16295, 0 }, 0, 0, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 16299, 16305, 16316, 16129, 16141, 16149, 16160 }, { 16326, 16330, 16334, 16181, 16185, 16189, 16193 }, { 1914, 2300, 16338, 2302, 1914, 5644, 2300 }, { 16340, 16350, 16361, 16368, 16377, 16383, 16389, 16397, 16405, 16416, 16426, 16435, 0 }, { 16444, 16207, 16453, 16459, 16231, 2598, 16236, 16243, 16466, 16259, 16267, 16275, 0 }, { 2651, 2655, 16476, 2664, 16287, 2668, 2672, 16291, 2680, 2684, 2688, 16295, 0 }, { 2651, 2655, 16476, 2664, 16287, 2668, 2672, 16291, 2680, 2684, 2688, 16295, 0 }, 0, 0, 185, 187, { 3711, 16480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3757, 3776, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 16492, 16496, { 16500, 16507, 16515, 16523, 16532, 16542, 16549 }, { 2544, 16558, 2550, 16561, 2556, 16564, 2562 }, { 1914, 2300, 2565, 3643, 2565, 3927, 1914 }, { 16567, 16576, 16586, 2588, 10611, 16592, 16598, 16604, 2615, 2625, 2633, 10623, 0 }, { 16567, 16576, 16586, 2588, 10611, 16592, 16598, 16604, 2615, 2625, 2633, 10623, 0 }, { 2651, 2655, 3699, 2664, 10611, 2668, 2672, 2676, 2680, 2684, 2688, 10636, 0 }, { 2651, 2655, 3699, 2664, 10611, 2668, 2672, 2676, 2680, 2684, 2688, 10636, 0 }, 0, 0, 2438, 187, { 1556, 9951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10640, 5455, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 16613, 16629, 16654, 16682, 16710, 16738, 16766 }, { 16785, 16795, 16805, 16815, 16825, 16835, 16845 }, { 16855, 16859, 16863, 16859, 16867, 16871, 16875 }, { 16879, 16901, 16929, 16945, 16964, 16980, 16999, 17018, 17040, 17071, 17099, 17124, 0 }, { 16879, 16901, 16929, 16945, 16964, 16980, 16999, 17018, 17040, 17071, 17099, 17124, 0 }, { 17152, 17162, 17172, 17182, 17192, 17202, 17212, 17222, 17232, 17242, 17252, 17262, 0 }, { 17152, 17162, 17172, 17182, 17192, 17202, 17212, 17222, 17232, 17242, 17252, 17262, 0 }, 0, 1, 691, 187, { 2154, 17272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 222, 3808, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 17284, 17289, { 5897, 17294, 17305, 17315, 17325, 17335, 17349 }, { 17361, 17365, 17370, 17375, 17379, 17384, 17389 }, { 1914, 2300, 2302, 2300, 5644, 2306, 2308 }, { 2310, 2317, 4837, 6042, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2310, 2317, 4837, 6042, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, 2, 1, 2438, 187, { 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5508, 6118, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 17393, 17409, { 17419, 17438, 17457, 17479, 17498, 17520, 17545 }, { 17564, 17574, 17584, 17597, 17607, 17620, 17636 }, { 17646, 17650, 17657, 17664, 17671, 17678, 17685 }, { 17689, 17705, 17724, 17740, 17759, 17766, 17776, 17792, 17808, 17827, 17849, 17865, 0 }, { 17689, 17705, 17724, 17740, 17759, 17766, 17776, 17792, 17808, 17827, 17849, 17865, 0 }, { 17884, 17891, 17724, 17901, 17759, 17766, 17917, 17930, 17937, 17950, 17966, 17976, 0 }, { 17884, 17891, 17724, 17901, 17759, 17766, 17917, 17930, 17937, 17950, 17966, 17976, 0 }, 0, 0, 2438, 187, { 2440, 2451, 4157, 8015, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 17989, 18004, 18007, { 18010, 18019, 18028, 18038, 18048, 18058, 18070 }, { 18078, 18083, 18087, 18091, 18095, 18100, 18105 }, { 18109, 2302, 2302, 9701, 18109, 18112, 1914 }, { 18115, 18122, 18127, 2588, 18133, 18139, 18146, 18152, 18160, 18170, 18178, 18187, 0 }, { 18115, 18122, 18127, 2588, 18133, 18139, 18146, 18152, 18160, 18170, 18178, 18187, 0 }, { 2651, 18197, 3699, 2664, 18201, 18205, 18210, 18214, 18218, 18222, 2688, 18226, 0 }, { 2651, 18197, 3699, 2664, 18201, 18205, 18210, 18214, 18218, 18222, 2688, 18226, 0 }, 0, 0, 185, 187, { 198, 9951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 18231, 18257, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 18277, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 18295, 18300, { 18305, 18317, 18328, 18342, 18354, 18364, 18374 }, { 18385, 18390, 18395, 18400, 18405, 18410, 18415 }, { 1914, 3927, 2300, 6216, 2565, 16338, 2308 }, { 18420, 18437, 18450, 18464, 18477, 18490, 18503, 18517, 18529, 18543, 18557, 18571, 0 }, { 18420, 18437, 18450, 18464, 18477, 18490, 18503, 18517, 18529, 18543, 18557, 18571, 0 }, { 18584, 18591, 18596, 18601, 18605, 18610, 18615, 18620, 18625, 18632, 18637, 18643, 0 }, { 18584, 18591, 18596, 18601, 18605, 18610, 18615, 18620, 18625, 18632, 18637, 18643, 0 }, 2, 1, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 7261, 7266, { 18648, 18662, 18672, 18683, 18697, 18708, 18719 }, { 18732, 18737, 18742, 18749, 18755, 18761, 18767 }, { 2565, 2308, 2300, 7600, 2565, 12692, 1914 }, { 18772, 18780, 18788, 18795, 18804, 18814, 18824, 18830, 18838, 18853, 18871, 18879, 0 }, { 18772, 18780, 18788, 18795, 18804, 18814, 18824, 18830, 18838, 18853, 18871, 18879, 0 }, { 18887, 18891, 18788, 18897, 18901, 18906, 18824, 18912, 18917, 18924, 18931, 18936, 0 }, { 18887, 18891, 18788, 18897, 18901, 18906, 18824, 18912, 18917, 18924, 18931, 18936, 0 }, 2, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 18941, 18944, { 18948, 18953, 10528, 10535, 18959, 18966, 10552 }, { 18973, 18977, 10566, 10570, 18981, 10578, 10582 }, { 12692, 15237, 1914, 10586, 4413, 3925, 1914 }, { 10588, 10596, 18985, 2588, 10611, 2668, 18989, 18995, 2615, 2625, 2633, 19000, 0 }, { 10588, 10596, 18985, 2588, 10611, 2668, 18989, 18995, 2615, 2625, 2633, 19000, 0 }, { 2651, 2655, 18985, 2664, 10611, 2668, 2672, 19009, 2680, 2684, 2688, 16295, 0 }, { 2651, 2655, 18985, 2664, 10611, 2668, 2672, 19009, 2680, 2684, 2688, 16295, 0 }, 0, 0, 185, 187, { 14753, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 19013, 19035, { 19059, 19074, 19091, 19108, 19125, 19142, 19151 }, { 19162, 19168, 19174, 19180, 19186, 19192, 19198 }, { 19204, 19207, 8610, 8610, 19210, 19204, 8610 }, { 19213, 19226, 19237, 19250, 19261, 19272, 19285, 19296, 19307, 19324, 19335, 19348, 0 }, { 19213, 19226, 19237, 19250, 19261, 19272, 19285, 19296, 19307, 19324, 19335, 19348, 0 }, { 19367, 19375, 19383, 19391, 19399, 19407, 19415, 19423, 19431, 19439, 19447, 19455, 0 }, { 19367, 19375, 19383, 19391, 19399, 19407, 19415, 19423, 19431, 19439, 19447, 19455, 0 }, 0, 0, 185, 187, { 198, 19465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 19478, 19485, 19511, { 19539, 19546, 19553, 19560, 19567, 19574, 19581 }, { 19539, 19546, 19553, 19560, 19567, 19574, 19581 }, { 19204, 19207, 19588, 19588, 19210, 19204, 19591 }, { 19594, 19607, 501, 19622, 521, 19635, 19644, 542, 19653, 19670, 19685, 19698, 0 }, { 19594, 19607, 501, 19622, 521, 19635, 19644, 542, 19653, 19670, 19685, 19698, 0 }, { 19713, 15764, 15772, 639, 521, 19721, 19729, 647, 19737, 665, 19745, 683, 0 }, { 19713, 15764, 15772, 639, 521, 19721, 19729, 647, 19737, 665, 19745, 683, 0 }, 0, 0, 2438, 187, { 19753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 19762, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 19781, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 19797, 19806, 19815, 19823, 19832, 19841, 19848 }, { 19857, 19860, 19863, 19866, 19869, 19873, 19876 }, { 6530, 6532, 6534, 6536, 12692, 15237, 6528 }, { 10588, 10596, 19879, 19885, 10611, 2598, 18989, 19892, 16250, 19899, 16267, 19906, 0 }, { 10588, 10596, 19879, 19885, 10611, 2598, 18989, 19892, 16250, 19899, 16267, 19906, 0 }, { 2651, 2655, 18985, 2664, 10611, 2668, 2672, 19914, 2680, 2684, 2688, 10636, 0 }, { 2651, 2655, 18985, 2664, 10611, 2668, 2672, 19914, 2680, 2684, 2688, 10636, 0 }, 0, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 19918, 19928, 19937, 19946, 19957, 19967, 19972 }, { 19979, 19985, 19990, 19995, 20000, 10578, 20004 }, { 20009, 2565, 1914, 7600, 1909, 3925, 1914 }, { 14948, 14955, 10132, 14962, 3668, 20011, 20016, 20021, 14987, 14996, 15004, 15011, 0 }, { 14948, 14955, 10132, 14962, 3668, 20011, 20016, 20021, 14987, 14996, 15004, 15011, 0 }, { 20028, 20033, 3699, 2664, 3668, 20011, 20016, 20037, 10562, 2684, 20041, 20046, 0 }, { 20028, 20033, 3699, 2664, 3668, 20011, 20016, 20037, 10562, 2684, 20041, 20046, 0 }, 0, 0, 185, 187, { 1545, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20050, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 20069, 20097, { 20119, 20138, 20157, 20182, 20201, 20235, 20260 }, { 20279, 20289, 20299, 20315, 20325, 20350, 20366 }, { 20376, 20380, 20387, 20391, 20398, 20405, 20412 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, 0, 1, 2438, 691, { 2451, 4157, 2440, 2451, 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 4241, 20662, 20671, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 4260, 20679, 20691, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 1820, 1823, { 20702, 20718, 20737, 20759, 20778, 20797, 20825 }, { 20847, 20855, 20866, 20880, 20891, 20902, 20922 }, { 20936, 20940, 20947, 20954, 20964, 20971, 20984 }, { 20991, 21007, 21026, 21039, 21058, 21065, 21075, 21091, 21104, 21120, 21139, 21155, 0 }, { 20991, 21007, 21026, 21039, 21058, 21065, 21075, 21091, 21104, 21120, 21139, 21155, 0 }, { 20991, 21007, 21026, 21039, 21058, 21065, 21075, 21091, 21104, 21120, 21139, 21155, 0 }, { 20991, 21007, 21026, 21039, 21058, 21065, 21075, 21091, 21104, 21120, 21139, 21155, 0 }, 0, 0, 2438, 187, { 2451, 4157, 8015, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 21171, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1730, 1722, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1750, 1739, 848, 269, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 1820, 1823, { 21189, 21208, 21227, 21249, 21268, 21290, 21315 }, { 21334, 21344, 21354, 21367, 21377, 21390, 21406 }, { 21416, 21420, 21427, 21434, 21441, 21448, 21455 }, { 21459, 21487, 21515, 21531, 21550, 21557, 21567, 21583, 21599, 21627, 21649, 21671, 0 }, { 21459, 21487, 21515, 21531, 21550, 21557, 21567, 21583, 21599, 21627, 21649, 21671, 0 }, { 21696, 21715, 21515, 21531, 21550, 21557, 21567, 21734, 21741, 21757, 21773, 21783, 0 }, { 21696, 21715, 21515, 21531, 21550, 21557, 21567, 21734, 21741, 21757, 21773, 21783, 0 }, 0, 0, 2438, 187, { 2451, 4157, 8015, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 8022, 21796, { 21799, 21818, 21837, 21862, 21881, 21903, 21928 }, { 21947, 21957, 21967, 21983, 21993, 22006, 22022 }, { 22032, 22036, 22043, 22047, 22054, 22061, 22068 }, { 22072, 22094, 22125, 22147, 22166, 22173, 22183, 22199, 22215, 22246, 22268, 22290, 0 }, { 22072, 22094, 22125, 22147, 22166, 22173, 22183, 22199, 22215, 22246, 22268, 22290, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 0, 2438, 187, { 2451, 4157, 8015, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 22315, 22340, { 22365, 22384, 22406, 22431, 22447, 22469, 22488 }, { 22498, 22505, 22512, 22519, 22526, 22533, 22540 }, { 22498, 22505, 22512, 22519, 22526, 22533, 22540 }, { 22544, 22560, 22585, 22604, 22623, 22630, 22643, 22656, 22675, 22706, 22731, 22753, 0 }, { 22544, 22560, 22585, 22604, 22623, 22630, 22643, 22778, 22675, 22706, 22731, 22753, 0 }, { 22797, 22805, 22819, 22833, 22623, 22630, 22643, 22844, 22852, 22866, 22877, 22885, 0 }, { 22797, 22805, 22819, 22833, 22623, 22630, 22643, 22844, 22852, 22866, 22877, 22885, 0 }, 0, 0, 2438, 187, { 2440, 2451, 4157, 8015, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 22896, 22918, 22940, 22965, 22987, 23012, 23040 }, { 23062, 23072, 23082, 23095, 23105, 23118, 23134 }, { 23144, 23148, 23155, 23159, 23166, 23173, 23180 }, { 23184, 23200, 23225, 23244, 23266, 23273, 23286, 23299, 23318, 23349, 23374, 23393, 0 }, { 23184, 23200, 23225, 23244, 23266, 23273, 23418, 23299, 23318, 23349, 23374, 23393, 0 }, { 23431, 23438, 23225, 23454, 23266, 23273, 23418, 23299, 23470, 23492, 23508, 23518, 0 }, { 23431, 23438, 23225, 23454, 23266, 23273, 23418, 23299, 23470, 23492, 23508, 23518, 0 }, 0, 0, 2438, 187, { 2451, 4157, 8015, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 23534, 23553, 23572, 23594, 23613, 23635, 23660 }, { 23679, 23689, 23699, 23712, 23722, 23735, 23751 }, { 23761, 23765, 23772, 23779, 23786, 23793, 23800 }, { 23804, 23820, 23845, 23864, 23886, 23893, 23906, 23919, 23938, 23966, 23991, 24013, 0 }, { 23804, 23820, 23845, 23864, 23886, 23893, 23906, 23919, 23938, 23966, 23991, 24013, 0 }, { 24038, 24046, 24066, 24073, 23886, 24090, 24097, 24105, 24113, 24136, 24153, 24167, 0 }, { 24038, 24046, 24066, 24073, 23886, 24090, 24097, 24105, 24113, 24136, 24153, 24167, 0 }, 0, 0, 2438, 187, { 2451, 4157, 8015, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 24184, 1820, 1823, { 24192, 24220, 24254, 24282, 24310, 24341, 24378 }, { 24406, 24419, 24438, 24454, 24467, 24486, 24505 }, { 24515, 24522, 24529, 24536, 24543, 24556, 24563 }, { 24567, 24586, 24614, 24636, 24655, 24668, 24678, 24691, 24716, 24747, 24772, 24788, 0 }, { 24567, 24586, 24614, 24636, 24655, 24668, 24678, 24691, 24716, 24747, 24772, 24788, 0 }, { 24807, 24817, 24836, 24846, 24655, 24668, 24678, 24862, 24869, 24894, 24910, 24920, 0 }, { 24807, 24817, 24836, 24846, 24655, 24668, 24678, 24862, 24869, 24894, 24910, 24920, 0 }, 0, 0, 2438, 691, { 2451, 4157, 2696, 8015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 4241, 20662, 20671, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 4260, 20679, 20691, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 24933, 24961, { 24983, 25002, 25021, 25046, 25065, 25099, 25124 }, { 25143, 20289, 20299, 20315, 25153, 25178, 20366 }, { 0, 0, 0, 0, 0, 0, 0 }, { 25194, 25219, 25250, 25266, 20513, 20520, 20530, 25285, 25301, 25332, 25354, 25376, 0 }, { 25194, 25219, 25250, 25266, 20513, 20520, 20530, 25285, 25301, 25332, 25354, 25376, 0 }, { 25401, 25414, 25250, 25266, 20513, 20520, 20530, 25433, 25440, 25456, 25472, 25482, 0 }, { 25401, 25414, 25250, 25266, 20513, 20520, 20530, 25433, 25440, 25456, 25472, 25482, 0 }, 0, 0, 2438, 187, { 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 25495, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1722, 1730, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1739, 1750, 848, 0, 0, 0, 0, 0, 0 }, { 25514, 25522, 0, 0, 0, 0, 0, 0 } },\n    { 1, 1820, 1823, { 17419, 17438, 25532, 17479, 17498, 17520, 17545 }, { 17564, 17574, 25554, 17597, 17607, 17620, 17636 }, { 17646, 17650, 17657, 17664, 17671, 17678, 17685 }, { 25567, 25592, 17724, 25623, 25642, 17766, 25649, 25662, 25678, 25703, 25725, 25753, 0 }, { 25567, 25592, 17724, 25623, 25642, 17766, 25649, 25662, 25678, 25703, 25725, 25753, 0 }, { 25775, 25788, 17724, 25807, 25642, 17766, 25649, 25823, 25830, 25849, 25865, 25887, 0 }, { 25775, 25788, 17724, 25807, 25642, 17766, 25649, 25823, 25830, 25849, 25865, 25887, 0 }, 0, 0, 2438, 187, { 2440, 2451, 4157, 8015, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 25903, 25908, { 25913, 25920, 25931, 25944, 25957, 25968, 25981 }, { 25992, 25997, 26002, 26007, 26012, 26017, 26022 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540 }, { 26027, 26053, 26081, 26111, 26141, 26167, 26197, 26223, 26251, 26275, 26303, 26340, 0 }, { 26027, 26053, 26081, 26111, 26141, 26167, 26197, 26223, 26251, 26275, 26303, 26340, 0 }, { 26379, 26391, 26403, 26415, 26427, 26439, 26451, 26463, 26475, 26487, 26500, 26513, 0 }, { 26379, 26391, 26403, 26415, 26427, 26439, 26451, 26463, 26475, 26487, 26500, 26513, 0 }, 0, 0, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 26526, 26564, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 26596, 26620, 26642, { 26667, 26695, 26723, 26760, 26791, 26825, 26850 }, { 26884, 26900, 26916, 26941, 26960, 26982, 26995 }, { 27017, 27024, 27031, 27038, 27045, 27052, 27056 }, { 27066, 27100, 27137, 27171, 27205, 27236, 27273, 27310, 27350, 27384, 27418, 27467, 0 }, { 27066, 27100, 27137, 27171, 27205, 27236, 27273, 27310, 27350, 27384, 27418, 27467, 0 }, { 27516, 27529, 27542, 27555, 27568, 27581, 27594, 27607, 27620, 27633, 27649, 27665, 0 }, { 27516, 27529, 27542, 27555, 27568, 27581, 27594, 27607, 27620, 27633, 27649, 27665, 0 }, 0, 0, 185, 187, { 1518, 1527, 1536, 1567, 1556, 1545, 1585, 1578, 1592, 0, 0, 0, 0, 0 }, { 27681, 27724, 27772, 27804, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 27841, 1805, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 27874, 27883, 27893, 27905, 27918, 27927, 27939 }, { 27951, 27955, 27960, 27964, 27968, 27972, 27976 }, { 1914, 27980, 2300, 2300, 15237, 6216, 1914 }, { 27983, 27990, 27999, 28006, 2594, 28013, 28021, 28032, 28037, 28042, 28049, 28058, 0 }, { 27983, 27990, 27999, 28006, 2594, 28013, 28021, 28032, 28037, 28042, 28049, 28058, 0 }, { 28066, 28070, 27960, 28074, 2594, 28078, 28082, 28032, 28037, 28086, 28090, 28095, 0 }, { 28066, 28070, 27960, 28074, 2594, 28078, 28082, 28032, 28037, 28086, 28090, 28095, 0 }, 2, 1, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 28100, 28116, { 28132, 28154, 28167, 28186, 28196, 28227, 28243 }, { 28132, 28154, 28167, 28186, 28196, 28227, 28243 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540 }, { 28256, 28269, 28288, 28301, 28314, 28327, 28346, 28365, 28378, 28394, 28407, 28432, 0 }, { 28256, 28269, 28288, 28301, 28314, 28327, 28346, 28365, 28378, 28394, 28407, 28432, 0 }, { 28256, 28269, 28288, 28301, 28314, 28327, 28346, 28365, 28378, 28394, 28407, 28432, 0 }, { 28256, 28269, 28288, 28301, 28314, 28327, 28346, 28365, 28378, 28394, 28407, 28432, 0 }, 0, 0, 185, 187, { 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3520, 9963, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 28445, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 28480, 28505, { 28530, 28555, 28574, 28602, 28621, 28646, 28665 }, { 28530, 28555, 28574, 28602, 28621, 28646, 28665 }, { 28687, 28691, 28695, 28699, 28709, 28713, 28723 }, { 28727, 28746, 28762, 28775, 28788, 28810, 28829, 28851, 28867, 28883, 28896, 28912, 0 }, { 28727, 28746, 28762, 28775, 28788, 28810, 28829, 28851, 28867, 28883, 28896, 28912, 0 }, { 28928, 28937, 28946, 28955, 28964, 28973, 28985, 28994, 29003, 29012, 29021, 29030, 0 }, { 28928, 28937, 28946, 28955, 28964, 28973, 28985, 28994, 29003, 29012, 29021, 29030, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 29039, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 7261, 7266, { 3833, 29066, 3847, 29071, 29081, 29087, 3880 }, { 29094, 8298, 3699, 29098, 29103, 29107, 29111 }, { 2565, 2308, 2300, 2300, 29116, 3927, 1914 }, { 29118, 29126, 3943, 3949, 29135, 29140, 29146, 3972, 29152, 29161, 29169, 29178, 0 }, { 29187, 29195, 4032, 1012, 7947, 29204, 29210, 4055, 7964, 7973, 7981, 29216, 0 }, { 29225, 2655, 3699, 29229, 2594, 29233, 29238, 19914, 18218, 29242, 2688, 3707, 0 }, { 29225, 2655, 3699, 29229, 2594, 29233, 29238, 19914, 18218, 29242, 2688, 3707, 0 }, 2, 1, 185, 187, { 198, 17272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5508, 5455, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 29246, 29258, { 29270, 17438, 29298, 17479, 17498, 17520, 17545 }, { 17564, 17574, 25554, 17597, 17607, 17620, 17636 }, { 0, 0, 0, 0, 0, 0, 0 }, { 25567, 25592, 17724, 25623, 25642, 17766, 25649, 29317, 29333, 29361, 25725, 25753, 0 }, { 25567, 25592, 17724, 25623, 25642, 17766, 25649, 29317, 29333, 29361, 25725, 25753, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 0, 2438, 187, { 2440, 2451, 4157, 8015, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 29383, 29395, { 29404, 29420, 29436, 29464, 29480, 29523, 29548 }, { 29404, 29420, 29576, 29464, 29586, 29608, 29621 }, { 29631, 29635, 29639, 29643, 29647, 29660, 29667 }, { 29674, 29693, 29718, 29737, 29762, 29775, 29788, 29801, 29823, 29857, 29882, 29910, 0 }, { 29674, 29693, 29718, 29737, 29762, 29775, 29788, 29801, 29823, 29857, 29882, 29910, 0 }, { 29938, 29945, 29955, 29737, 29762, 29775, 29788, 29968, 29978, 29991, 30001, 30014, 0 }, { 29938, 29945, 29955, 29737, 29762, 29775, 29788, 29968, 29978, 29991, 30001, 30014, 0 }, 0, 1, 2438, 691, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20671, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20691, 269, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 30027, 30037, { 30050, 30060, 30067, 30080, 30090, 30100, 30110 }, { 30050, 30060, 30120, 30080, 30090, 30100, 30110 }, { 30130, 30134, 30138, 30142, 30146, 30150, 30154 }, { 30158, 30174, 30190, 30200, 30213, 30220, 30227, 30237, 30250, 30269, 30285, 30301, 0 }, { 30158, 30174, 30190, 30200, 30213, 30220, 30227, 30237, 30250, 30317, 30285, 30301, 0 }, { 30336, 30346, 30190, 30356, 30213, 30220, 30227, 30366, 30376, 30386, 30396, 30406, 0 }, { 30336, 30346, 30190, 30356, 30213, 30220, 30227, 30366, 30376, 30386, 30396, 30406, 0 }, 0, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 30416, 30426, { 30439, 30446, 30452, 30459, 30465, 30471, 30479 }, { 30489, 30493, 30497, 30501, 30505, 30509, 30513 }, { 12692, 12692, 12692, 12692, 12692, 12692, 12692 }, { 30519, 30528, 30537, 30542, 30548, 30554, 30560, 30567, 30573, 30582, 30591, 30599, 0 }, { 30519, 30528, 30537, 30542, 30548, 30554, 30560, 30567, 30573, 30582, 30591, 30599, 0 }, { 30608, 30612, 3699, 30616, 3668, 30620, 30624, 30628, 30633, 30637, 30643, 30647, 0 }, { 30608, 30612, 3699, 30616, 3668, 30620, 30624, 30628, 30633, 30637, 30643, 30647, 0 }, 0, 0, 2438, 187, { 2440, 2451, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 30651, 30692, { 30733, 30752, 30771, 30796, 30815, 30837, 30862 }, { 30881, 17574, 30891, 17597, 30907, 17620, 17636 }, { 30920, 17650, 30924, 17664, 30928, 17678, 17685 }, { 17689, 30935, 17724, 30963, 25642, 30982, 17776, 30992, 31008, 31039, 31061, 31086, 0 }, { 17689, 30935, 17724, 30963, 25642, 30982, 17776, 30992, 31008, 31039, 31061, 31086, 0 }, { 17689, 30935, 17724, 30963, 25642, 30982, 17776, 30992, 31008, 31039, 31061, 31086, 0 }, { 17689, 30935, 17724, 30963, 25642, 30982, 17776, 30992, 31008, 31039, 31061, 31086, 0 }, 0, 0, 185, 187, { 3711, 3720, 3727, 3736, 1599, 1556, 3747, 0, 0, 0, 0, 0, 0, 0 }, { 31111, 31131, 222, 10501, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 848, 269, 0, 0, 0, 0, 0 }, { 25522, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 0, 0, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 31145, 31152, 31161, 31176, 31187, 31196, 31203, 31210, 31217, 31228, 31241, 31254, 0 }, { 31145, 31152, 31161, 31176, 31187, 31196, 31203, 31210, 31217, 31228, 31241, 31254, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 6, 185, 187, { 1518, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3520, 4935, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 31259, 31266, 31272, 31279, 31290, 31298, 31307 }, { 31314, 8298, 3699, 31318, 31322, 31326, 10582 }, { 2308, 2308, 2300, 2300, 5644, 16338, 1914 }, { 3929, 31330, 31338, 3949, 3955, 31344, 31350, 3972, 31356, 31366, 31374, 31384, 0 }, { 3929, 31330, 31338, 3949, 3955, 31344, 31350, 3972, 31356, 31366, 31374, 31384, 0 }, { 31394, 31398, 3699, 29229, 3668, 31402, 31406, 19914, 18218, 2684, 31410, 16295, 0 }, { 31394, 31398, 3699, 29229, 3668, 31402, 31406, 19914, 18218, 2684, 31410, 16295, 0 }, 0, 0, 185, 187, { 3711, 16480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3757, 3776, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 0, 0, { 31414, 31421, 31429, 31436, 31443, 31451, 31459 }, { 31466, 31469, 31472, 31475, 31478, 31481, 31484 }, { 2308, 2308, 2302, 2308, 12692, 3925, 12692 }, { 31487, 31495, 31505, 31511, 31519, 31524, 31529, 31534, 31541, 19899, 31549, 31557, 0 }, { 31487, 31495, 31505, 31511, 31519, 31524, 31529, 31534, 31541, 19899, 31549, 31557, 0 }, { 2651, 31565, 3699, 31569, 3668, 30620, 30624, 31573, 3639, 2684, 31577, 16295, 0 }, { 2651, 31565, 3699, 31569, 3668, 30620, 30624, 31573, 3639, 2684, 31577, 16295, 0 }, 0, 0, 185, 187, { 1120, 17272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3789, 3808, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 31581, 31592, { 31602, 31620, 31635, 31657, 31670, 31684, 31701 }, { 31725, 31733, 31738, 31657, 31670, 31750, 31757 }, { 0, 0, 0, 0, 0, 0, 0 }, { 31771, 31793, 31809, 31829, 31843, 31860, 31875, 31892, 31906, 31919, 31938, 31952, 0 }, { 31771, 31793, 31809, 31829, 31843, 31860, 31875, 31892, 31906, 31919, 31938, 31952, 0 }, { 31971, 31986, 31995, 32008, 32015, 32025, 32033, 32043, 32050, 32056, 32068, 32075, 0 }, { 31971, 31986, 31995, 32008, 32015, 32025, 32033, 32043, 32050, 32056, 32068, 32075, 0 }, 0, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 0, 0, { 32087, 32095, 15840, 15849, 15858, 32106, 32116 }, { 16326, 15890, 15894, 15898, 15902, 16189, 32125 }, { 0, 0, 0, 0, 0, 0, 0 }, { 32129, 32138, 32148, 32156, 10611, 3672, 32164, 32170, 32179, 32188, 32197, 32206, 0 }, { 32129, 32138, 32148, 32156, 10611, 3672, 32164, 32170, 32179, 32188, 32197, 32206, 0 }, { 2651, 2655, 15909, 32215, 10611, 2668, 2672, 19914, 18218, 2684, 32219, 16295, 0 }, { 2651, 2655, 15909, 32215, 10611, 2668, 2672, 19914, 18218, 2684, 32219, 16295, 0 }, 0, 0, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 32223, 32236, 32241, { 32246, 32253, 32268, 32282, 32298, 32313, 32329 }, { 6212, 32344, 2402, 32348, 32352, 32356, 32360 }, { 1914, 12692, 2300, 1909, 1914, 2302, 12692 }, { 7350, 7358, 32364, 32371, 32378, 2341, 2346, 32383, 32393, 32404, 32413, 32423, 0 }, { 7350, 7358, 32364, 32371, 32378, 2341, 2346, 32383, 32393, 32404, 32413, 32423, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, 0, 0, 2438, 187, { 2440, 2451, 1556, 2460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32433, 2194, 11931, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 32452, 32457, { 32462, 32478, 32486, 32494, 32503, 32515, 32525 }, { 32535, 32541, 32547, 32551, 32555, 32563, 3639 }, { 0, 0, 0, 0, 0, 0, 0 }, { 32570, 32583, 32597, 32606, 32612, 32616, 32621, 32629, 16250, 32642, 16267, 16275, 0 }, { 32570, 32583, 32597, 32606, 32612, 32616, 32621, 32629, 16250, 32642, 16267, 16275, 0 }, { 32651, 2655, 32655, 16283, 32612, 32659, 2672, 32663, 2680, 32671, 2688, 16295, 0 }, { 32651, 2655, 32655, 16283, 32612, 32659, 2672, 32663, 2680, 32671, 2688, 16295, 0 }, 0, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 32677, 32700, 32707, { 32714, 32724, 32734, 32744, 32754, 32764, 32774 }, { 32784, 32791, 32798, 32805, 32812, 32819, 32826 }, { 32833, 32837, 32841, 32845, 32849, 32853, 32857 }, { 32861, 32868, 32875, 32882, 32889, 32896, 32903, 32910, 32917, 32924, 32931, 32941, 0 }, { 32861, 32868, 32875, 32882, 32889, 32896, 32903, 32910, 32917, 32924, 32931, 32941, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 0, 185, 187, { 1518, 1527, 1536, 1567, 1556, 1545, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32951, 32975, 33005, 33035, 33052, 0, 0, 0, 0, 0 }, { 1722, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1739, 848, 269, 0, 0, 0, 0, 0, 0 }, { 33075, 1805, 0, 0, 0, 0, 0, 0 } },\n    { 289, 0, 0, { 27951, 8298, 33092, 33099, 33109, 33114, 33121 }, { 33128, 6196, 33132, 4800, 33137, 33142, 33147 }, { 4392, 33152, 33155, 33158, 33161, 33164, 33167 }, { 33170, 33177, 33092, 33188, 33194, 33198, 33207, 33214, 33219, 33228, 33233, 33236, 0 }, { 33170, 33177, 33092, 33188, 33194, 33198, 33207, 33214, 33219, 33228, 33233, 33236, 0 }, { 33242, 33246, 33253, 28074, 33194, 33258, 33263, 33214, 33268, 33228, 33233, 33273, 0 }, { 33242, 33246, 33253, 28074, 33194, 33258, 33263, 33214, 33268, 33228, 33233, 33273, 0 }, 2, 1, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 33277, 33282, { 33287, 33295, 33305, 33315, 33324, 33334, 33342 }, { 33352, 33356, 33361, 33365, 33369, 33373, 33377 }, { 1914, 2300, 2565, 2300, 2565, 2306, 1914 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 33381, 33390, 33401, 33410, 33420, 0 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 33381, 33390, 33401, 33410, 33420, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, 0, 0, 185, 187, { 198, 189, 2696, 2451, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 4952, 3520, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 4246, 4961, 4971, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 33430, 33446, 33451, { 33456, 33481, 33510, 33535, 33548, 33563, 33580 }, { 33595, 33600, 33605, 33610, 33615, 33620, 8599 }, { 19210, 19210, 33625, 8610, 8613, 19210, 8610 }, { 33628, 33647, 33662, 33684, 33704, 33720, 33736, 33750, 33776, 33800, 33817, 33834, 0 }, { 33628, 33647, 33662, 33684, 33704, 33720, 33736, 33750, 33776, 33800, 33817, 33834, 0 }, { 33851, 33860, 33869, 33883, 33897, 33909, 33921, 33931, 33947, 33961, 33968, 33975, 0 }, { 33851, 33860, 33869, 33883, 33897, 33909, 33921, 33931, 33947, 33961, 33968, 33975, 0 }, 0, 1, 691, 187, { 2154, 4724, 1556, 33982, 33992, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 34005, 34040, 34069, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 34104, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 0, 0, { 34120, 34132, 34143, 34155, 34167, 34177, 34189 }, { 34204, 34209, 34214, 34219, 34224, 34229, 34234 }, { 0, 0, 0, 0, 0, 0, 0 }, { 34239, 34248, 34260, 34268, 34273, 34283, 34290, 34299, 34306, 34312, 34321, 34332, 0 }, { 34239, 34248, 34260, 34268, 34273, 34283, 34290, 34299, 34306, 34312, 34321, 34332, 0 }, { 34340, 34345, 34350, 34355, 34360, 34365, 34370, 34224, 34375, 34380, 34385, 34390, 0 }, { 34340, 34345, 34350, 34355, 34360, 34365, 34370, 34224, 34375, 34380, 34385, 34390, 0 }, 0, 0, 185, 187, { 1545, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20050, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 34395, 34406, 34408, { 34410, 34423, 34431, 34440, 34450, 34460, 34469 }, { 34481, 34485, 34489, 34493, 34497, 34501, 34505 }, { 2565, 2308, 2300, 7600, 12692, 5644, 1914 }, { 34509, 34523, 34534, 34543, 34554, 34566, 34580, 34592, 34605, 34618, 34630, 34643, 0 }, { 34509, 34523, 34534, 34543, 34554, 34566, 34580, 34592, 34605, 34618, 34630, 34643, 0 }, { 34657, 34662, 34668, 34674, 34679, 34685, 34691, 34696, 34702, 34707, 18931, 34713, 0 }, { 34657, 34662, 34668, 34674, 34679, 34685, 34691, 34696, 34702, 34707, 18931, 34713, 0 }, 2, 1, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 34719, 34741, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 0, 0, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0 }, { 9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0 }, { 9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0 }, { 9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0 }, 0, 0, 185, 187, { 189, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 209, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 296, 307, { 318, 331, 352, 367, 378, 397, 408 }, { 421, 426, 431, 436, 441, 446, 451 }, { 456, 459, 462, 465, 468, 459, 465 }, { 471, 484, 501, 510, 521, 528, 535, 542, 555, 574, 591, 606, 0 }, { 471, 484, 501, 510, 521, 528, 535, 542, 555, 574, 591, 606, 0 }, { 623, 629, 501, 639, 521, 528, 535, 647, 655, 665, 673, 683, 0 }, { 623, 629, 501, 639, 521, 528, 535, 647, 655, 665, 673, 683, 0 }, 2, 1, 691, 187, { 693, 708, 724, 740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 757, 776, 794, 819, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 856, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 872, 878, { 884, 893, 901, 909, 918, 925, 935 }, { 944, 948, 952, 956, 960, 964, 968 }, { 972, 975, 978, 981, 984, 987, 990 }, { 993, 999, 1006, 1012, 1018, 1023, 1028, 1035, 1041, 1050, 1058, 1067, 0 }, { 993, 999, 1006, 1012, 1018, 1023, 1028, 1035, 1041, 1050, 1058, 1067, 0 }, { 1076, 1081, 1006, 1086, 1018, 1023, 1091, 1096, 1100, 1105, 1110, 1115, 0 }, { 1076, 1081, 1006, 1086, 1018, 1023, 1091, 1096, 1100, 1105, 1110, 1115, 0 }, 2, 1, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1140, 1163, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1195, 1204, 1211, { 1218, 1228, 1238, 1248, 1258, 1268, 1278 }, { 34757, 34764, 34771, 34778, 34785, 34792, 34799 }, { 1337, 1341, 1345, 1349, 1353, 1357, 1361 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, 0, 0, 185, 187, { 1518, 1545, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1608, 6555, 1686, 34806, 0, 0, 0, 0, 0, 0 }, { 1730, 1722, 251, 843, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1750, 1739, 269, 848, 0, 0, 0, 0, 0 }, { 1762, 1778, 1791, 0, 0, 0, 0, 0 } },\n    { 1812, 1820, 1823, { 1826, 1834, 1844, 1852, 1860, 1869, 1876 }, { 1883, 1886, 1889, 1893, 1896, 1900, 1904 }, { 1907, 1909, 1911, 1914, 1916, 1909, 1914 }, { 1919, 1925, 1931, 1939, 1945, 1953, 1961, 1971, 1977, 1985, 1993, 2002, 0 }, { 2011, 2017, 2024, 2032, 2038, 2046, 2054, 2064, 1977, 2070, 2078, 2088, 0 }, { 2097, 2101, 2106, 2111, 2115, 2120, 2125, 2130, 2134, 2140, 2146, 2150, 0 }, { 2097, 2101, 2106, 2111, 2115, 2120, 2125, 2130, 2134, 2140, 2146, 2150, 0 }, 2, 1, 691, 187, { 2154, 2165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2176, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 1820, 1823, { 2217, 2225, 2232, 2240, 2247, 2255, 2262 }, { 2270, 2275, 2279, 2283, 2287, 2291, 2295 }, { 1914, 2300, 2302, 2304, 2302, 2306, 2308 }, { 2310, 2317, 2325, 2331, 2337, 2341, 2346, 2351, 2358, 2368, 2376, 2385, 0 }, { 2310, 2317, 2325, 2331, 2337, 2341, 2346, 2351, 2358, 2368, 2376, 2385, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, 2, 1, 2438, 187, { 2440, 2451, 1556, 2460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2194, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 2471, 2477, { 2484, 2492, 2499, 2508, 2517, 2528, 2536 }, { 2544, 2547, 2550, 2553, 2556, 2559, 2562 }, { 1914, 2300, 2565, 2300, 2565, 2306, 1914 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, 2, 1, 691, 187, { 2154, 2696, 1556, 2705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 2738, 0, 0, 0, 0, 0, 0, 0 }, { 251, 2751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 2763, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 2778, 2785, { 2792, 2807, 2822, 2833, 2848, 2861, 2880 }, { 2895, 2902, 2909, 2916, 2923, 2930, 2937 }, { 2944, 2947, 2950, 2950, 2953, 2953, 2956 }, { 2959, 2980, 3003, 3018, 3035, 3046, 3061, 3076, 3095, 3118, 3137, 3156, 0 }, { 3177, 3198, 3221, 3236, 3253, 3264, 3279, 3294, 3313, 3336, 3355, 3374, 0 }, { 3395, 3402, 3409, 3416, 3423, 3430, 3439, 3448, 3455, 3462, 3469, 3476, 0 }, { 3395, 3402, 3409, 3416, 3423, 3430, 3439, 3448, 3455, 3462, 3469, 3476, 0 }, 2, 1, 185, 187, { 1120, 198, 3483, 189, 3490, 1556, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 848, 269, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 185, 187, { 3711, 3720, 3727, 3736, 1599, 1556, 3747, 0, 0, 0, 0, 0, 0, 0 }, { 3757, 3776, 3789, 3808, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 848, 269, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 4303, 4307, { 4311, 4323, 4335, 4345, 4359, 4369, 4381 }, { 4392, 4395, 4398, 4401, 4404, 4407, 4410 }, { 1914, 2300, 2302, 4413, 2302, 1909, 2308 }, { 4415, 4424, 4433, 4443, 4452, 4461, 4470, 4480, 4487, 4495, 4503, 4513, 0 }, { 4522, 4533, 4544, 4556, 4567, 4578, 4589, 4601, 4610, 4620, 4630, 4642, 0 }, { 4653, 4659, 4665, 4672, 4678, 4684, 4690, 4697, 4701, 4706, 4711, 4718, 0 }, { 4653, 4659, 4665, 4672, 4678, 4684, 4690, 4697, 4701, 4706, 4711, 4718, 0 }, 2, 1, 691, 691, { 4724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2176, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4260, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 4733, 4742, 4748, 4754, 4763, 4769, 4778 }, { 4785, 4790, 4795, 4800, 4805, 4810, 4815 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, 2, 1, 185, 187, { 198, 189, 2696, 2451, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 3520, 4952, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 4246, 4961, 4971, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 4979, 4992, { 5003, 5021, 5035, 5053, 5071, 5089, 5105 }, { 5119, 5131, 5143, 5155, 5167, 5179, 5191 }, { 5198, 5203, 5208, 5213, 5218, 5223, 5228 }, { 5233, 5244, 5257, 5264, 5275, 5282, 5291, 5300, 5313, 5326, 5341, 5354, 0 }, { 5233, 5244, 5257, 5264, 5275, 5282, 5291, 5300, 5313, 5326, 5341, 5354, 0 }, { 5365, 5374, 5257, 5383, 5275, 5392, 5401, 5410, 5419, 5428, 5437, 5446, 0 }, { 5365, 5374, 5257, 5383, 5275, 5392, 5401, 5410, 5419, 5428, 5437, 5446, 0 }, 0, 0, 185, 187, { 198, 5455, 189, 209, 2451, 2440, 5468, 1556, 5481, 5498, 0, 0, 0, 0 }, { 5508, 5455, 5526, 5548, 5481, 0, 0, 0, 0, 0 }, { 251, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 257, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 5569, 5577, 5581, { 5585, 5595, 5603, 5608, 5615, 5628, 5636 }, { 3927, 5644, 4413, 5646, 5650, 1909, 5653 }, { 3927, 5644, 4413, 5657, 5650, 1909, 5657 }, { 5660, 5668, 5677, 5686, 5695, 5702, 5710, 5718, 5728, 5739, 2376, 2385, 0 }, { 5660, 5668, 5677, 5686, 5695, 5702, 5710, 5718, 5728, 5739, 2376, 2385, 0 }, { 5748, 5753, 5759, 5766, 5772, 5778, 5784, 5790, 5795, 5802, 1110, 5807, 0 }, { 5748, 5753, 5759, 5766, 5772, 5778, 5784, 5790, 5795, 5802, 1110, 5807, 0 }, 2, 1, 5812, 187, { 5815, 5829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5842, 5862, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5876, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 5887, 5892, { 5897, 5908, 5919, 5933, 5947, 5959, 5971 }, { 5983, 5988, 5994, 6000, 6006, 6011, 6017 }, { 1914, 2300, 6022, 2300, 2306, 2306, 2308 }, { 6025, 6033, 4837, 6042, 6049, 6054, 6061, 6068, 2358, 5739, 6076, 6086, 0 }, { 6025, 6033, 4837, 6042, 6049, 6054, 6061, 6068, 2358, 5739, 6076, 6086, 0 }, { 5748, 1081, 4795, 6095, 6049, 5778, 5784, 6100, 6107, 5802, 6112, 1115, 0 }, { 5748, 1081, 4795, 6095, 6049, 5778, 5784, 6100, 6107, 5802, 6112, 1115, 0 }, 2, 1, 691, 187, { 4724, 6118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 6130, 6139, 6147, 6156, 6167, 6176, 6185 }, { 6192, 6196, 2402, 6200, 6204, 6208, 6212 }, { 2565, 2308, 2300, 2300, 6216, 3927, 1914 }, { 6218, 6226, 3943, 6235, 6242, 6249, 6256, 3972, 6263, 6273, 6281, 6290, 0 }, { 6299, 6307, 4032, 6316, 6323, 6330, 6337, 4055, 6344, 6354, 1058, 6362, 0 }, { 6371, 2398, 2402, 2406, 6375, 6379, 6383, 6387, 6391, 6395, 2430, 6399, 0 }, { 6371, 2398, 2402, 2406, 6375, 6379, 6383, 6387, 6391, 6395, 2430, 6399, 0 }, 2, 1, 185, 187, { 198, 3490, 189, 6403, 3483, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 6411, 3520, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1195, 6420, 6427, { 6434, 6444, 6454, 6464, 6474, 6484, 6494 }, { 1337, 6504, 6508, 6512, 6516, 6520, 6524 }, { 1337, 6504, 6508, 6512, 6516, 6520, 6524 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 0, 185, 187, { 1545, 1599, 1578, 1518, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1608, 6555, 6579, 6606, 6635, 6659, 6688, 6708, 0, 0 }, { 843, 251, 1722, 1730, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 1739, 1750, 0, 0, 0, 0, 0 }, { 1762, 6733, 1791, 0, 0, 0, 0, 0 } },\n    { 6751, 6761, 6768, { 6775, 6785, 6795, 6805, 6815, 6825, 6835 }, { 6845, 6849, 6853, 6857, 6861, 6865, 6869 }, { 6845, 6849, 6853, 6857, 6861, 6865, 6869 }, { 6873, 6878, 6883, 6888, 6893, 6898, 6903, 6908, 6913, 6918, 6924, 6930, 0 }, { 6873, 6878, 6883, 6888, 6893, 6898, 6903, 6908, 6913, 6918, 6924, 6930, 0 }, { 6873, 6878, 6883, 6888, 6893, 6898, 6903, 6908, 6913, 6918, 6924, 6930, 0 }, { 6873, 6878, 6883, 6888, 6893, 6898, 6903, 6908, 6913, 6918, 6924, 6930, 0 }, 0, 0, 2438, 187, { 1556, 6936, 1585, 1527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 6945, 6974, 6998, 7025, 7047, 7078, 7104, 7135, 7161, 7188 }, { 1722, 1730, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1739, 1750, 848, 269, 0, 0, 0, 0, 0 }, { 7210, 7227, 7246, 0, 0, 0, 0, 0 } },\n    { 289, 7261, 7266, { 7271, 7278, 7286, 7294, 7303, 7313, 7321 }, { 7330, 4395, 7333, 7336, 7339, 7342, 7345 }, { 7348, 2300, 2565, 3643, 2565, 3927, 7348 }, { 7350, 7358, 7367, 2331, 7373, 2341, 2346, 7377, 2358, 2368, 2376, 2385, 0 }, { 7350, 7358, 7367, 2331, 7373, 2341, 2346, 7377, 2358, 2368, 2376, 2385, 0 }, { 2394, 2398, 7386, 2406, 7373, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 7386, 2406, 7373, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, 2, 1, 2438, 187, { 7390, 4157, 2451, 189, 2696, 7399, 1556, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 6411, 3520, 4952, 0, 0, 0, 0, 0, 0 }, { 251, 843, 4241, 7411, 7423, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 7435, 7450, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 7465, 7261, 7266, { 2217, 2225, 2232, 2240, 2247, 2255, 2262 }, { 7473, 7478, 7482, 7486, 7490, 7494, 7498 }, { 1914, 2300, 2302, 2304, 2302, 2306, 2308 }, { 2310, 2317, 4837, 2331, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2310, 2317, 4837, 2331, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, 2, 1, 691, 691, { 2154, 6118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2176, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 7507, 7517, 7531, 7538, 7545, 7554, 1876 }, { 7562, 7569, 7574, 7578, 7583, 7588, 7592 }, { 1907, 1909, 3643, 7597, 7600, 1909, 1914 }, { 7602, 7611, 7616, 7623, 2337, 7633, 7642, 7649, 7659, 7669, 1993, 7682, 0 }, { 7692, 7701, 7708, 7714, 7723, 7728, 7736, 7742, 7751, 7761, 7775, 7785, 0 }, { 7793, 7797, 2402, 7801, 2337, 7805, 7809, 7813, 7817, 7821, 2146, 7826, 0 }, { 7793, 7797, 2402, 7801, 2337, 7805, 7809, 7813, 7817, 7821, 2146, 7826, 0 }, 2, 1, 691, 187, { 2154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3821, 1820, 1823, { 3833, 7830, 7844, 7857, 7870, 7883, 3880 }, { 6192, 7895, 7899, 7903, 7907, 7911, 7915 }, { 2565, 1914, 2302, 7920, 7920, 1914, 1914 }, { 7922, 7930, 7940, 1012, 7947, 7952, 7958, 4055, 7964, 7973, 7981, 7990, 0 }, { 7922, 7930, 7940, 1012, 7947, 7952, 7958, 4055, 7964, 7973, 7981, 7990, 0 }, { 2394, 7999, 2402, 8003, 4848, 2410, 2414, 6387, 6391, 8007, 2430, 8011, 0 }, { 2394, 7999, 2402, 8003, 4848, 2410, 2414, 6387, 6391, 8007, 2430, 8011, 0 }, 0, 0, 185, 187, { 198, 189, 1120, 3483, 2451, 2440, 4157, 7390, 2696, 2154, 7399, 8015, 4724, 1556 }, { 4164, 4219, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4288, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 8022, 8025, { 8028, 8037, 4748, 8047, 8055, 8063, 8072 }, { 8078, 8081, 4395, 8085, 8088, 8092, 1904 }, { 2565, 6216, 2300, 2300, 6216, 3927, 1914 }, { 8095, 8103, 4837, 8110, 8117, 8122, 8132, 8140, 8146, 8156, 2376, 2385, 0 }, { 8095, 8103, 4837, 8110, 8117, 8122, 8132, 8140, 8146, 8156, 2376, 2385, 0 }, { 8164, 8171, 4837, 4912, 8117, 8177, 8184, 8140, 8189, 1105, 1110, 5807, 0 }, { 8164, 8171, 4837, 4912, 8117, 8177, 8184, 8140, 8189, 1105, 1110, 5807, 0 }, 2, 1, 2438, 187, { 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 8195, 8224, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 7261, 7266, { 8241, 8251, 8256, 8263, 8272, 8276, 8283 }, { 8294, 8298, 3699, 8302, 8306, 8310, 8314 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 8319, 8328, 8338, 8345, 4848, 8353, 8359, 2351, 8365, 8376, 8386, 8396, 0 }, { 8319, 8328, 8338, 8345, 4848, 8353, 8359, 2351, 8365, 8376, 8386, 8396, 0 }, { 8406, 1081, 4795, 6095, 4848, 8411, 8416, 5790, 4923, 1105, 1110, 5807, 0 }, { 8406, 1081, 4795, 6095, 4848, 8411, 8416, 5790, 4923, 1105, 1110, 5807, 0 }, 0, 1, 691, 187, { 2154, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 8421, 8441, { 8467, 8490, 352, 8513, 8524, 8539, 8554 }, { 8569, 8574, 8579, 8584, 8589, 8594, 8599 }, { 8604, 8607, 8604, 8610, 8613, 8607, 8610 }, { 8616, 8629, 8644, 8653, 8666, 8673, 8682, 8691, 8704, 8721, 8736, 8749, 0 }, { 8764, 8777, 8792, 8803, 8816, 8823, 8832, 8841, 8856, 8873, 8888, 8901, 0 }, { 8916, 8924, 8644, 8934, 8666, 8673, 8682, 8942, 8950, 8960, 8968, 8978, 0 }, { 8916, 8924, 8644, 8934, 8666, 8673, 8682, 8942, 8950, 8960, 8968, 8978, 0 }, 0, 1, 691, 187, { 2154, 2696, 8015, 2440, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 776, 757, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 1820, 1823, { 8986, 8995, 9007, 9014, 9022, 9032, 9038 }, { 9045, 9049, 9053, 9057, 9061, 9066, 9070 }, { 9074, 9076, 9078, 9080, 9082, 9076, 9080 }, { 9085, 9095, 9104, 9112, 9120, 9128, 9135, 9142, 9150, 1993, 9156, 9164, 0 }, { 9173, 9183, 9192, 9200, 9208, 9216, 9223, 9230, 9239, 7775, 9245, 9255, 0 }, { 9264, 9268, 9273, 9278, 9282, 7809, 2130, 9286, 9290, 2146, 9294, 2150, 0 }, { 9264, 9268, 9273, 9278, 9282, 7809, 2130, 9286, 9290, 2146, 9294, 2150, 0 }, 0, 1, 691, 187, { 9298, 9308, 9316, 9328, 9340, 9350, 9360, 1556, 0, 0, 0, 0, 0, 0 }, { 9372, 9386, 9401, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 1820, 1823, { 9421, 9429, 9438, 9445, 9452, 9461, 1876 }, { 1883, 1886, 9468, 1893, 9471, 9475, 1904 }, { 1907, 1909, 9478, 1914, 9480, 1909, 1914 }, { 5660, 5668, 9483, 6042, 9489, 9494, 9499, 2351, 2358, 5739, 2376, 2385, 0 }, { 9504, 9513, 7708, 9523, 9531, 9537, 9543, 9549, 9557, 9567, 9576, 9585, 0 }, { 2394, 2398, 2402, 2406, 9489, 9494, 9499, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 9489, 9494, 9499, 2418, 2422, 2426, 2430, 2434, 0 }, 2, 1, 691, 187, { 2154, 2165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 9594, 9603, { 9611, 9618, 9627, 9636, 9648, 9656, 9665 }, { 9675, 9679, 3699, 9684, 9689, 9693, 9697 }, { 2565, 5644, 2300, 2300, 9701, 1909, 1914 }, { 9703, 9709, 4837, 9716, 2337, 9722, 9730, 9737, 9743, 9751, 9757, 9765, 0 }, { 9703, 9709, 4837, 9716, 2337, 9722, 9730, 9737, 9743, 9751, 9757, 9765, 0 }, { 2651, 9773, 3699, 9777, 9781, 9785, 9789, 9793, 9697, 9797, 9801, 9806, 0 }, { 2651, 9773, 3699, 9777, 9781, 9785, 9789, 9793, 9697, 9797, 9801, 9806, 0 }, 0, 1, 691, 187, { 4724, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 9810, 9823, 9826, { 9829, 9837, 9845, 2240, 2247, 2255, 9852 }, { 9860, 9865, 9870, 2283, 2287, 2291, 9874 }, { 1914, 2300, 2302, 2304, 2302, 2306, 2308 }, { 7350, 7358, 4837, 2331, 2337, 2341, 2346, 9879, 2358, 2368, 2376, 2385, 0 }, { 7350, 7358, 4837, 2331, 2337, 2341, 2346, 9879, 2358, 2368, 2376, 2385, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, 2, 1, 2438, 187, { 1556, 6936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 9887, 9905, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 9928, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 9938, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 0, 0, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 0, 185, 187, { 1120, 3483, 189, 198, 1129, 9951, 1556, 0, 0, 0, 0, 0, 0, 0 }, { 3520, 9963, 9979, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 3532, 242, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 3540, 257, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 10021, 10026, { 10030, 10036, 10046, 10052, 10063, 10073, 10078 }, { 10088, 10092, 10096, 10100, 10105, 10109, 10113 }, { 1909, 1909, 1914, 10117, 1909, 7600, 7600 }, { 10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0 }, { 10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0 }, { 10201, 10205, 3699, 10210, 3668, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0 }, { 10201, 10205, 3699, 10210, 3668, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0 }, 0, 1, 691, 187, { 10243, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10253, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 10270, 10288, { 10306, 10317, 10330, 10339, 10346, 10359, 10368 }, { 10306, 10317, 10330, 10339, 10346, 10359, 10368 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 10377, 10388, 10399, 10408, 10419, 10426, 10433, 10446, 10455, 10466, 10479, 10490, 0 }, { 10377, 10388, 10399, 10408, 10419, 10426, 10433, 10446, 10455, 10466, 10479, 10490, 0 }, { 10377, 10388, 10399, 10408, 10419, 10426, 10433, 10446, 10455, 10466, 10479, 10490, 0 }, { 10377, 10388, 10399, 10408, 10419, 10426, 10433, 10446, 10455, 10466, 10479, 10490, 0 }, 0, 0, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 848, 269, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 10515, 10522, 10528, 10535, 10540, 10546, 10552 }, { 10558, 10562, 10566, 10570, 10574, 10578, 10582 }, { 2300, 1914, 1914, 10586, 4413, 3925, 1914 }, { 10588, 10596, 10605, 2588, 10611, 2598, 2603, 10615, 2615, 2625, 2633, 10623, 0 }, { 10588, 10596, 10605, 2588, 10611, 2598, 2603, 10615, 2615, 2625, 2633, 10623, 0 }, { 2651, 2655, 3699, 2664, 10611, 2668, 2672, 10632, 2680, 2684, 2688, 10636, 0 }, { 2651, 2655, 3699, 2664, 10611, 2668, 2672, 10632, 2680, 2684, 2688, 10636, 0 }, 0, 0, 185, 691, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10640, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 10659, 10664, { 10669, 10682, 10701, 10718, 10731, 10744, 10761 }, { 10774, 8574, 8579, 8584, 8589, 8594, 8599 }, { 10779, 8607, 8604, 8610, 8613, 8607, 8610 }, { 10782, 10795, 10806, 10823, 10838, 10853, 10868, 10881, 10896, 10913, 10928, 10945, 0 }, { 10960, 10971, 10984, 10999, 11012, 11025, 11038, 11049, 11062, 11077, 11090, 11109, 0 }, { 11122, 11129, 11136, 11143, 11150, 11157, 11164, 11171, 11178, 11185, 11192, 11199, 0 }, { 11122, 11129, 11136, 11143, 11150, 11157, 11164, 11171, 11178, 11185, 11192, 11199, 0 }, 0, 1, 691, 187, { 2154, 2696, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 11206, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 11224, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 11240, 11253, { 11266, 11281, 11302, 11317, 11330, 11343, 10761 }, { 421, 426, 11358, 436, 11363, 446, 451 }, { 456, 459, 11368, 465, 468, 459, 465 }, { 11371, 11388, 11397, 11412, 521, 11429, 11444, 11457, 11472, 11489, 11510, 11527, 0 }, { 11542, 11559, 11572, 11589, 8816, 11608, 11623, 11636, 11649, 11664, 11687, 11706, 0 }, { 11719, 11726, 11733, 11740, 521, 11747, 11754, 11761, 11768, 11775, 11782, 11789, 0 }, { 11719, 11726, 11733, 11740, 521, 11747, 11754, 11761, 11768, 11775, 11782, 11789, 0 }, 0, 0, 691, 187, { 2696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3520, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 11796, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 11810, 11815, { 11820, 11828, 11839, 11845, 11851, 11860, 1876 }, { 9045, 9049, 2287, 11866, 9061, 9066, 11870 }, { 9074, 9076, 11874, 9080, 9082, 9076, 9080 }, { 2310, 2317, 9483, 2331, 2337, 11876, 11882, 11888, 2358, 2368, 2376, 2385, 0 }, { 2310, 2317, 9483, 2331, 2337, 11876, 11882, 11888, 2358, 2368, 2376, 2385, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, 0, 1, 5812, 187, { 11899, 6118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 11911, 11931, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 11945, 11950, { 11955, 11966, 11977, 11988, 11999, 12010, 12016 }, { 1909, 9701, 2302, 4413, 1907, 10586, 2308 }, { 1909, 9701, 2302, 4413, 1907, 10586, 2308 }, { 12025, 12033, 12042, 12049, 4848, 12056, 12062, 2351, 2358, 12068, 2376, 12077, 0 }, { 12025, 12033, 12042, 12049, 4848, 12056, 12062, 2351, 2358, 12068, 2376, 12077, 0 }, { 12087, 12092, 12042, 2406, 4848, 12056, 12062, 2418, 12098, 2426, 2430, 12103, 0 }, { 12087, 12092, 12042, 2406, 4848, 12056, 12062, 2418, 12098, 2426, 2430, 12103, 0 }, 2, 1, 691, 187, { 2154, 6118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12108, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 12116, 12133, { 12147, 12158, 12168, 12177, 12188, 12200, 12211 }, { 12221, 12224, 12227, 12230, 12233, 12236, 12239 }, { 1914, 1909, 2304, 2302, 7600, 1909, 1914 }, { 12242, 12252, 12263, 12269, 12278, 12284, 12292, 12300, 12308, 12319, 12328, 12338, 0 }, { 12348, 12358, 2325, 12369, 12378, 12384, 12392, 12400, 12408, 12419, 12428, 12438, 0 }, { 12448, 12454, 12263, 12460, 12278, 12465, 12471, 12477, 4128, 12482, 4139, 12487, 0 }, { 12448, 12454, 12263, 12460, 12278, 12465, 12471, 12477, 4128, 12482, 4139, 12487, 0 }, 0, 1, 691, 187, { 2154, 12492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12512, 12539, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12560, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 12576, 11815, { 12582, 12594, 12606, 12618, 12632, 12647, 12660 }, { 12674, 12677, 12680, 12683, 12686, 12689, 9471 }, { 1914, 1909, 12692, 2302, 4413, 1909, 9480 }, { 12694, 12701, 12709, 12715, 12724, 12733, 12743, 12749, 12760, 12770, 12777, 12787, 0 }, { 12694, 12701, 12709, 12715, 12724, 12733, 12743, 12749, 12760, 12770, 12777, 12787, 0 }, { 12795, 12801, 12806, 12811, 12816, 12821, 12828, 12834, 12840, 12846, 12852, 12859, 0 }, { 12795, 12801, 12806, 12811, 12816, 12821, 12828, 12834, 12840, 12846, 12852, 12859, 0 }, 2, 1, 2438, 187, { 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12866, 12894, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 12926, 12938, { 12950, 12965, 12980, 12995, 13012, 13031, 13042 }, { 13053, 13060, 13067, 13074, 13081, 13088, 13095 }, { 0, 0, 0, 0, 0, 0, 0 }, { 13102, 13113, 8644, 13126, 8666, 13137, 13144, 8691, 13151, 13166, 13179, 13190, 0 }, { 13102, 13113, 8644, 13126, 8666, 13137, 13144, 8691, 13151, 13166, 13179, 13190, 0 }, { 13203, 13210, 13217, 13224, 8666, 13137, 13144, 13231, 13238, 13245, 13252, 13259, 0 }, { 13203, 13210, 13217, 13224, 8666, 13137, 13144, 13231, 13238, 13245, 13252, 13259, 0 }, 0, 1, 691, 187, { 2154, 2696, 8015, 2440, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 13266, 13284, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 13303, 13323, { 13340, 13353, 13366, 13382, 13399, 13414, 13423 }, { 13340, 13353, 13366, 13382, 13399, 13414, 13423 }, { 13432, 13435, 13438, 13441, 13444, 13447, 13450 }, { 13453, 13466, 13477, 13486, 13497, 13502, 13511, 13522, 13529, 13544, 13555, 13568, 0 }, { 13581, 13596, 13477, 13486, 13609, 13502, 13616, 13522, 13529, 13544, 13555, 13568, 0 }, { 13453, 13466, 13477, 13486, 13497, 13502, 13511, 13522, 13529, 13544, 13555, 13568, 0 }, { 13453, 13466, 13477, 13486, 13497, 13502, 13511, 13522, 13529, 13544, 13555, 13568, 0 }, 0, 6, 185, 187, { 198, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 13629, 13632, { 13635, 13648, 13658, 13667, 13677, 13688, 13699 }, { 13711, 13714, 13719, 13724, 13729, 13734, 13739 }, { 13711, 13744, 13747, 13750, 13753, 13756, 13759 }, { 13762, 13771, 13780, 13789, 13798, 13807, 13816, 13825, 13834, 13843, 13853, 13863, 0 }, { 13873, 13882, 13891, 13900, 13909, 13918, 13927, 13936, 13945, 13954, 13964, 13974, 0 }, { 13984, 13990, 13996, 14002, 14008, 14014, 14020, 14026, 14032, 14038, 14045, 14052, 0 }, { 13984, 13990, 13996, 14002, 14008, 14014, 14020, 14026, 14032, 14038, 14045, 14052, 0 }, 0, 1, 185, 187, { 198, 189, 2451, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 848, 269, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 14059, 14083, { 14107, 14120, 14141, 14160, 14181, 14200, 14213 }, { 14224, 14231, 14238, 14245, 14252, 14259, 14266 }, { 14273, 14276, 14276, 14279, 14282, 14285, 14290 }, { 14293, 14308, 14323, 14332, 14343, 14354, 14367, 14380, 14395, 14414, 14433, 14450, 0 }, { 14469, 14486, 14503, 14514, 14527, 14540, 14555, 14570, 14587, 14608, 14629, 14648, 0 }, { 14669, 14676, 14683, 14690, 14697, 14704, 14711, 14718, 14725, 14732, 14739, 14746, 0 }, { 14669, 14676, 14683, 14690, 14697, 14704, 14711, 14718, 14725, 14732, 14739, 14746, 0 }, 0, 1, 691, 187, { 2154, 2696, 14753, 198, 14763, 3490, 1556, 0, 0, 0, 0, 0, 0, 0 }, { 3808, 3502, 10640, 5455, 14774, 14785, 14797, 14814, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 14832, 14838, 14852, 14875, 14889, 14905, 14912 }, { 14921, 14924, 14929, 14935, 14939, 7600, 14944 }, { 6540, 6528, 6530, 6532, 6534, 6536, 6538 }, { 14948, 14955, 10132, 14962, 3668, 14968, 14974, 14980, 14987, 14996, 15004, 15011, 0 }, { 15018, 15025, 15032, 15037, 15043, 15047, 15052, 15057, 15064, 15073, 15081, 15088, 0 }, { 15095, 7999, 2402, 2406, 15043, 15099, 15103, 15107, 15111, 2426, 15115, 15119, 0 }, { 15095, 7999, 2402, 2406, 15043, 15099, 15103, 15107, 15111, 2426, 15115, 15119, 0 }, 0, 1, 691, 187, { 2154, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15123, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 15141, 15149, 15160, 15170, 15181, 15190, 15199 }, { 15209, 15213, 15217, 15221, 15225, 15229, 15233 }, { 15237, 12692, 12692, 12692, 2304, 2304, 2308 }, { 15239, 15249, 15257, 15265, 15273, 15281, 15288, 15296, 15304, 15311, 15317, 15324, 0 }, { 15332, 15343, 15352, 15361, 15370, 15379, 15387, 15396, 15405, 15413, 15420, 15428, 0 }, { 15437, 15442, 4795, 15447, 15452, 15457, 15462, 15467, 15472, 15477, 15482, 15487, 0 }, { 15437, 15442, 4795, 15447, 15452, 15457, 15462, 15467, 15472, 15477, 15482, 15487, 0 }, 2, 1, 185, 187, { 1545, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15503, 15530, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15551, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 15570, 15591, { 15608, 331, 352, 8513, 15621, 15638, 15649 }, { 15662, 15670, 15678, 15684, 15692, 15700, 15708 }, { 456, 459, 462, 465, 468, 459, 465 }, { 15716, 484, 501, 510, 15731, 15738, 15747, 542, 555, 574, 591, 606, 0 }, { 15716, 484, 501, 510, 15731, 15738, 15747, 542, 555, 574, 591, 606, 0 }, { 15756, 15764, 15772, 639, 15731, 15780, 15788, 647, 655, 665, 673, 683, 0 }, { 15756, 15764, 15772, 639, 15731, 15780, 15788, 647, 655, 665, 673, 683, 0 }, 0, 1, 691, 187, { 15796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10640, 5455, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15806, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 0, 0, { 15822, 15829, 15840, 15849, 15858, 15865, 15876 }, { 15886, 15890, 15894, 15898, 15902, 15905, 15909 }, { 0, 0, 0, 0, 0, 0, 0 }, { 15913, 15923, 15932, 15940, 15949, 15962, 15974, 15981, 15988, 15995, 16005, 16017, 0 }, { 15913, 15923, 15932, 15940, 15949, 15962, 15974, 15981, 15988, 15995, 16005, 16017, 0 }, { 16030, 16034, 16038, 16042, 16046, 16050, 16054, 16058, 16062, 16066, 16070, 16074, 0 }, { 16030, 16034, 16038, 16042, 16046, 16050, 16054, 16058, 16062, 16066, 16070, 16074, 0 }, 0, 0, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 0, 0, { 16108, 16113, 16119, 16129, 16141, 16149, 16160 }, { 16169, 16173, 16177, 16181, 16185, 16189, 16193 }, { 0, 0, 0, 0, 0, 0, 0 }, { 16197, 16207, 16217, 16224, 16231, 2598, 16236, 16243, 16250, 16259, 16267, 16275, 0 }, { 16197, 16207, 16217, 16224, 16231, 2598, 16236, 16243, 16250, 16259, 16267, 16275, 0 }, { 2651, 2655, 15909, 16283, 16287, 2668, 2672, 16291, 2680, 2684, 2688, 16295, 0 }, { 2651, 2655, 15909, 16283, 16287, 2668, 2672, 16291, 2680, 2684, 2688, 16295, 0 }, 0, 0, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 16299, 16305, 16316, 16129, 16141, 16149, 16160 }, { 16326, 16330, 16334, 16181, 16185, 16189, 16193 }, { 1914, 2300, 16338, 2302, 1914, 5644, 2300 }, { 16340, 16350, 16361, 16368, 16377, 16383, 16389, 16397, 16405, 16416, 16426, 16435, 0 }, { 16444, 16207, 16453, 16459, 16231, 2598, 16236, 16243, 16466, 16259, 16267, 16275, 0 }, { 2651, 2655, 16476, 2664, 16287, 2668, 2672, 16291, 2680, 2684, 2688, 16295, 0 }, { 2651, 2655, 16476, 2664, 16287, 2668, 2672, 16291, 2680, 2684, 2688, 16295, 0 }, 0, 0, 185, 187, { 3711, 16480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3757, 3776, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 16492, 16496, { 16500, 16507, 16515, 16523, 16532, 16542, 16549 }, { 2544, 16558, 2550, 16561, 2556, 16564, 2562 }, { 1914, 2300, 2565, 3643, 2565, 3927, 1914 }, { 16567, 16576, 16586, 2588, 10611, 16592, 16598, 16604, 2615, 2625, 2633, 10623, 0 }, { 16567, 16576, 16586, 2588, 10611, 16592, 16598, 16604, 2615, 2625, 2633, 10623, 0 }, { 2651, 2655, 3699, 2664, 10611, 2668, 2672, 2676, 2680, 2684, 2688, 10636, 0 }, { 2651, 2655, 3699, 2664, 10611, 2668, 2672, 2676, 2680, 2684, 2688, 10636, 0 }, 0, 0, 2438, 187, { 1556, 9951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10640, 5455, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 16613, 16629, 16654, 16682, 16710, 16738, 16766 }, { 16785, 16795, 16805, 16815, 16825, 16835, 16845 }, { 16855, 16859, 16863, 16859, 16867, 16871, 16875 }, { 16879, 16901, 16929, 16945, 16964, 16980, 16999, 17018, 17040, 17071, 17099, 17124, 0 }, { 16879, 16901, 16929, 16945, 16964, 16980, 16999, 17018, 17040, 17071, 17099, 17124, 0 }, { 17152, 17162, 17172, 17182, 17192, 17202, 17212, 17222, 17232, 17242, 17252, 17262, 0 }, { 17152, 17162, 17172, 17182, 17192, 17202, 17212, 17222, 17232, 17242, 17252, 17262, 0 }, 0, 1, 691, 187, { 2154, 17272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 222, 3808, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 17284, 17289, { 5897, 17294, 17305, 17315, 17325, 17335, 17349 }, { 17361, 17365, 17370, 17375, 17379, 17384, 17389 }, { 1914, 2300, 2302, 2300, 5644, 2306, 2308 }, { 2310, 2317, 4837, 6042, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2310, 2317, 4837, 6042, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, 2, 1, 2438, 187, { 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5508, 6118, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 17393, 17409, { 17419, 17438, 17457, 17479, 17498, 17520, 17545 }, { 17564, 17574, 17584, 17597, 17607, 17620, 17636 }, { 17646, 17650, 17657, 17664, 17671, 17678, 17685 }, { 17689, 17705, 17724, 17740, 17759, 17766, 17776, 17792, 17808, 17827, 17849, 17865, 0 }, { 17689, 17705, 17724, 17740, 17759, 17766, 17776, 17792, 17808, 17827, 17849, 17865, 0 }, { 17884, 17891, 17724, 17901, 17759, 17766, 17917, 17930, 17937, 17950, 17966, 17976, 0 }, { 17884, 17891, 17724, 17901, 17759, 17766, 17917, 17930, 17937, 17950, 17966, 17976, 0 }, 0, 0, 2438, 187, { 2440, 2451, 4157, 8015, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 17989, 18004, 18007, { 18010, 18019, 18028, 18038, 18048, 18058, 18070 }, { 18078, 18083, 18087, 18091, 18095, 18100, 18105 }, { 18109, 2302, 2302, 9701, 18109, 18112, 1914 }, { 18115, 18122, 18127, 2588, 18133, 18139, 18146, 18152, 18160, 18170, 18178, 18187, 0 }, { 18115, 18122, 18127, 2588, 18133, 18139, 18146, 18152, 18160, 18170, 18178, 18187, 0 }, { 2651, 18197, 3699, 2664, 18201, 18205, 18210, 18214, 18218, 18222, 2688, 18226, 0 }, { 2651, 18197, 3699, 2664, 18201, 18205, 18210, 18214, 18218, 18222, 2688, 18226, 0 }, 0, 0, 185, 187, { 198, 9951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 18231, 18257, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 18277, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 18295, 18300, { 18305, 18317, 18328, 18342, 18354, 18364, 18374 }, { 18385, 18390, 18395, 18400, 18405, 18410, 18415 }, { 1914, 3927, 2300, 6216, 2565, 16338, 2308 }, { 18420, 18437, 18450, 18464, 18477, 18490, 18503, 18517, 18529, 18543, 18557, 18571, 0 }, { 18420, 18437, 18450, 18464, 18477, 18490, 18503, 18517, 18529, 18543, 18557, 18571, 0 }, { 18584, 18591, 18596, 18601, 18605, 18610, 18615, 18620, 18625, 18632, 18637, 18643, 0 }, { 18584, 18591, 18596, 18601, 18605, 18610, 18615, 18620, 18625, 18632, 18637, 18643, 0 }, 2, 1, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 19797, 19806, 19815, 19823, 19832, 19841, 19848 }, { 19857, 19860, 19863, 19866, 19869, 19873, 19876 }, { 6530, 6532, 6534, 6536, 12692, 15237, 6528 }, { 10588, 10596, 19879, 19885, 10611, 2598, 18989, 19892, 16250, 19899, 16267, 19906, 0 }, { 10588, 10596, 19879, 19885, 10611, 2598, 18989, 19892, 16250, 19899, 16267, 19906, 0 }, { 2651, 2655, 18985, 2664, 10611, 2668, 2672, 19914, 2680, 2684, 2688, 10636, 0 }, { 2651, 2655, 18985, 2664, 10611, 2668, 2672, 19914, 2680, 2684, 2688, 10636, 0 }, 0, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 19918, 19928, 19937, 19946, 19957, 19967, 19972 }, { 19979, 19985, 19990, 19995, 20000, 10578, 20004 }, { 20009, 2565, 1914, 7600, 1909, 3925, 1914 }, { 14948, 14955, 10132, 14962, 3668, 20011, 20016, 20021, 14987, 14996, 15004, 15011, 0 }, { 14948, 14955, 10132, 14962, 3668, 20011, 20016, 20021, 14987, 14996, 15004, 15011, 0 }, { 20028, 20033, 3699, 2664, 3668, 20011, 20016, 20037, 10562, 2684, 20041, 20046, 0 }, { 20028, 20033, 3699, 2664, 3668, 20011, 20016, 20037, 10562, 2684, 20041, 20046, 0 }, 0, 1, 185, 187, { 1545, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20050, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 20069, 20097, { 20119, 20138, 20157, 20182, 20201, 20235, 20260 }, { 20279, 20289, 20299, 20315, 20325, 20350, 20366 }, { 20376, 20380, 20387, 20391, 20398, 20405, 20412 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, 0, 0, 2438, 691, { 2451, 4157, 2440, 2451, 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 4241, 20662, 20671, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 4260, 20679, 20691, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 1820, 1823, { 21189, 21208, 21227, 21249, 21268, 21290, 21315 }, { 21334, 21344, 21354, 21367, 21377, 21390, 21406 }, { 21416, 21420, 21427, 21434, 21441, 21448, 21455 }, { 21459, 21487, 21515, 21531, 21550, 21557, 21567, 21583, 21599, 21627, 21649, 21671, 0 }, { 21459, 21487, 21515, 21531, 21550, 21557, 21567, 21583, 21599, 21627, 21649, 21671, 0 }, { 21696, 21715, 21515, 21531, 21550, 21557, 21567, 21734, 21741, 21757, 21773, 21783, 0 }, { 21696, 21715, 21515, 21531, 21550, 21557, 21567, 21734, 21741, 21757, 21773, 21783, 0 }, 0, 0, 2438, 187, { 2451, 4157, 8015, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 8022, 21796, { 21799, 21818, 21837, 21862, 21881, 21903, 21928 }, { 21947, 21957, 21967, 21983, 21993, 22006, 22022 }, { 22032, 22036, 22043, 22047, 22054, 22061, 22068 }, { 22072, 22094, 22125, 22147, 22166, 22173, 22183, 22199, 22215, 22246, 22268, 22290, 0 }, { 22072, 22094, 22125, 22147, 22166, 22173, 22183, 22199, 22215, 22246, 22268, 22290, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 0, 2438, 187, { 2451, 4157, 8015, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 22315, 22340, { 22365, 22384, 22406, 22431, 22447, 22469, 22488 }, { 22498, 22505, 22512, 22519, 22526, 22533, 22540 }, { 22498, 22505, 22512, 22519, 22526, 22533, 22540 }, { 22544, 22560, 22585, 22604, 22623, 22630, 22643, 22656, 22675, 22706, 22731, 22753, 0 }, { 22544, 22560, 22585, 22604, 22623, 22630, 22643, 22778, 22675, 22706, 22731, 22753, 0 }, { 22797, 22805, 22819, 22833, 22623, 22630, 22643, 22844, 22852, 22866, 22877, 22885, 0 }, { 22797, 22805, 22819, 22833, 22623, 22630, 22643, 22844, 22852, 22866, 22877, 22885, 0 }, 0, 0, 2438, 187, { 2440, 2451, 4157, 8015, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 22896, 22918, 22940, 22965, 22987, 23012, 23040 }, { 23062, 23072, 23082, 23095, 23105, 23118, 23134 }, { 23144, 23148, 23155, 23159, 23166, 23173, 23180 }, { 23184, 23200, 23225, 23244, 23266, 23273, 23286, 23299, 23318, 23349, 23374, 23393, 0 }, { 23184, 23200, 23225, 23244, 23266, 23273, 23418, 23299, 23318, 23349, 23374, 23393, 0 }, { 23431, 23438, 23225, 23454, 23266, 23273, 23418, 23299, 23470, 23492, 23508, 23518, 0 }, { 23431, 23438, 23225, 23454, 23266, 23273, 23418, 23299, 23470, 23492, 23508, 23518, 0 }, 0, 0, 2438, 187, { 2451, 4157, 8015, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 23534, 23553, 23572, 23594, 23613, 23635, 23660 }, { 23679, 23689, 23699, 23712, 23722, 23735, 23751 }, { 23761, 23765, 23772, 23779, 23786, 23793, 23800 }, { 23804, 23820, 23845, 23864, 23886, 23893, 23906, 23919, 23938, 23966, 23991, 24013, 0 }, { 23804, 23820, 23845, 23864, 23886, 23893, 23906, 23919, 23938, 23966, 23991, 24013, 0 }, { 24038, 24046, 24066, 24073, 23886, 24090, 24097, 24105, 24113, 24136, 24153, 24167, 0 }, { 24038, 24046, 24066, 24073, 23886, 24090, 24097, 24105, 24113, 24136, 24153, 24167, 0 }, 0, 0, 2438, 187, { 2451, 4157, 8015, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 24184, 1820, 1823, { 24192, 24220, 24254, 24282, 24310, 24341, 24378 }, { 24406, 24419, 24438, 24454, 24467, 24486, 24505 }, { 24515, 24522, 24529, 24536, 24543, 24556, 24563 }, { 24567, 24586, 24614, 24636, 24655, 24668, 24678, 24691, 24716, 24747, 24772, 24788, 0 }, { 24567, 24586, 24614, 24636, 24655, 24668, 24678, 24691, 24716, 24747, 24772, 24788, 0 }, { 24807, 24817, 24836, 24846, 24655, 24668, 24678, 24862, 24869, 24894, 24910, 24920, 0 }, { 24807, 24817, 24836, 24846, 24655, 24668, 24678, 24862, 24869, 24894, 24910, 24920, 0 }, 0, 0, 2438, 691, { 2451, 4157, 2696, 8015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 4241, 20662, 20671, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 4260, 20679, 20691, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 24933, 24961, { 24983, 25002, 25021, 25046, 25065, 25099, 25124 }, { 25143, 20289, 20299, 20315, 25153, 25178, 20366 }, { 0, 0, 0, 0, 0, 0, 0 }, { 25194, 25219, 25250, 25266, 20513, 20520, 20530, 25285, 25301, 25332, 25354, 25376, 0 }, { 25194, 25219, 25250, 25266, 20513, 20520, 20530, 25285, 25301, 25332, 25354, 25376, 0 }, { 25401, 25414, 25250, 25266, 20513, 20520, 20530, 25433, 25440, 25456, 25472, 25482, 0 }, { 25401, 25414, 25250, 25266, 20513, 20520, 20530, 25433, 25440, 25456, 25472, 25482, 0 }, 0, 0, 2438, 187, { 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 25495, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1722, 1730, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1739, 1750, 848, 0, 0, 0, 0, 0, 0 }, { 25514, 25522, 0, 0, 0, 0, 0, 0 } },\n    { 1, 1820, 1823, { 17419, 17438, 25532, 17479, 17498, 17520, 17545 }, { 17564, 17574, 25554, 17597, 17607, 17620, 17636 }, { 17646, 17650, 17657, 17664, 17671, 17678, 17685 }, { 25567, 25592, 17724, 25623, 25642, 17766, 25649, 25662, 25678, 25703, 25725, 25753, 0 }, { 25567, 25592, 17724, 25623, 25642, 17766, 25649, 25662, 25678, 25703, 25725, 25753, 0 }, { 25775, 25788, 17724, 25807, 25642, 17766, 25649, 25823, 25830, 25849, 25865, 25887, 0 }, { 25775, 25788, 17724, 25807, 25642, 17766, 25649, 25823, 25830, 25849, 25865, 25887, 0 }, 0, 0, 2438, 187, { 2440, 2451, 4157, 8015, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 26596, 26620, 26642, { 26667, 26695, 26723, 26760, 26791, 26825, 26850 }, { 26884, 26900, 26916, 26941, 26960, 26982, 26995 }, { 27017, 27024, 27031, 27038, 27045, 27052, 27056 }, { 27066, 27100, 27137, 27171, 27205, 27236, 27273, 27310, 27350, 27384, 27418, 27467, 0 }, { 27066, 27100, 27137, 27171, 27205, 27236, 27273, 27310, 27350, 27384, 27418, 27467, 0 }, { 27516, 27529, 27542, 27555, 27568, 27581, 27594, 27607, 27620, 27633, 27649, 27665, 0 }, { 27516, 27529, 27542, 27555, 27568, 27581, 27594, 27607, 27620, 27633, 27649, 27665, 0 }, 0, 0, 185, 187, { 1518, 1527, 1536, 1567, 1556, 1545, 1585, 1578, 1592, 0, 0, 0, 0, 0 }, { 27681, 27724, 27772, 27804, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 27841, 1805, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 27874, 27883, 27893, 27905, 27918, 27927, 27939 }, { 27951, 27955, 27960, 27964, 27968, 27972, 27976 }, { 1914, 27980, 2300, 2300, 15237, 6216, 1914 }, { 27983, 27990, 27999, 28006, 2594, 28013, 28021, 28032, 28037, 28042, 28049, 28058, 0 }, { 27983, 27990, 27999, 28006, 2594, 28013, 28021, 28032, 28037, 28042, 28049, 28058, 0 }, { 28066, 28070, 27960, 28074, 2594, 28078, 28082, 28032, 28037, 28086, 28090, 28095, 0 }, { 28066, 28070, 27960, 28074, 2594, 28078, 28082, 28032, 28037, 28086, 28090, 28095, 0 }, 2, 1, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 28100, 28116, { 28132, 28154, 28167, 28186, 28196, 28227, 28243 }, { 28132, 28154, 28167, 28186, 28196, 28227, 28243 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540 }, { 28256, 28269, 28288, 28301, 28314, 28327, 28346, 28365, 28378, 28394, 28407, 28432, 0 }, { 28256, 28269, 28288, 28301, 28314, 28327, 28346, 28365, 28378, 28394, 28407, 28432, 0 }, { 28256, 28269, 28288, 28301, 28314, 28327, 28346, 28365, 28378, 28394, 28407, 28432, 0 }, { 28256, 28269, 28288, 28301, 28314, 28327, 28346, 28365, 28378, 28394, 28407, 28432, 0 }, 0, 0, 185, 187, { 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3520, 9963, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 28445, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 28480, 28505, { 28530, 28555, 28574, 28602, 28621, 28646, 28665 }, { 28530, 28555, 28574, 28602, 28621, 28646, 28665 }, { 28687, 28691, 28695, 28699, 28709, 28713, 28723 }, { 28727, 28746, 28762, 28775, 28788, 28810, 28829, 28851, 28867, 28883, 28896, 28912, 0 }, { 28727, 28746, 28762, 28775, 28788, 28810, 28829, 28851, 28867, 28883, 28896, 28912, 0 }, { 28928, 28937, 28946, 28955, 28964, 28973, 28985, 28994, 29003, 29012, 29021, 29030, 0 }, { 28928, 28937, 28946, 28955, 28964, 28973, 28985, 28994, 29003, 29012, 29021, 29030, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 29039, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 7261, 7266, { 3833, 29066, 3847, 29071, 29081, 29087, 3880 }, { 29094, 8298, 3699, 29098, 29103, 29107, 29111 }, { 2565, 2308, 2300, 2300, 29116, 3927, 1914 }, { 29118, 29126, 3943, 3949, 29135, 29140, 29146, 3972, 29152, 29161, 29169, 29178, 0 }, { 29187, 29195, 4032, 1012, 7947, 29204, 29210, 4055, 7964, 7973, 7981, 29216, 0 }, { 29225, 2655, 3699, 29229, 2594, 29233, 29238, 19914, 18218, 29242, 2688, 3707, 0 }, { 29225, 2655, 3699, 29229, 2594, 29233, 29238, 19914, 18218, 29242, 2688, 3707, 0 }, 2, 1, 185, 187, { 198, 17272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5508, 5455, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 29246, 29258, { 29270, 17438, 29298, 17479, 17498, 17520, 17545 }, { 17564, 17574, 25554, 17597, 17607, 17620, 17636 }, { 0, 0, 0, 0, 0, 0, 0 }, { 25567, 25592, 17724, 25623, 25642, 17766, 25649, 29317, 29333, 29361, 25725, 25753, 0 }, { 25567, 25592, 17724, 25623, 25642, 17766, 25649, 29317, 29333, 29361, 25725, 25753, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 0, 2438, 187, { 2440, 2451, 4157, 8015, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 1730, 1722, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 1750, 1739, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 29383, 29395, { 29404, 29420, 29436, 29464, 29480, 29523, 29548 }, { 29404, 29420, 29576, 29464, 29586, 29608, 29621 }, { 29631, 29635, 29639, 29643, 29647, 29660, 29667 }, { 29674, 29693, 29718, 29737, 29762, 29775, 29788, 29801, 29823, 29857, 29882, 29910, 0 }, { 29674, 29693, 29718, 29737, 29762, 29775, 29788, 29801, 29823, 29857, 29882, 29910, 0 }, { 29938, 29945, 29955, 29737, 29762, 29775, 29788, 29968, 29978, 29991, 30001, 30014, 0 }, { 29938, 29945, 29955, 29737, 29762, 29775, 29788, 29968, 29978, 29991, 30001, 30014, 0 }, 0, 1, 2438, 691, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20671, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20691, 269, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 30027, 30037, { 30050, 30060, 30067, 30080, 30090, 30100, 30110 }, { 30050, 30060, 30120, 30080, 30090, 30100, 30110 }, { 30130, 30134, 30138, 30142, 30146, 30150, 30154 }, { 30158, 30174, 30190, 30200, 30213, 30220, 30227, 30237, 30250, 30269, 30285, 30301, 0 }, { 30158, 30174, 30190, 30200, 30213, 30220, 30227, 30237, 30250, 30317, 30285, 30301, 0 }, { 30336, 30346, 30190, 30356, 30213, 30220, 30227, 30366, 30376, 30386, 30396, 30406, 0 }, { 30336, 30346, 30190, 30356, 30213, 30220, 30227, 30366, 30376, 30386, 30396, 30406, 0 }, 0, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 30651, 30692, { 30733, 30752, 30771, 30796, 30815, 30837, 30862 }, { 30881, 17574, 30891, 17597, 30907, 17620, 17636 }, { 30920, 17650, 30924, 17664, 30928, 17678, 17685 }, { 17689, 30935, 17724, 30963, 25642, 30982, 17776, 30992, 31008, 31039, 31061, 31086, 0 }, { 17689, 30935, 17724, 30963, 25642, 30982, 17776, 30992, 31008, 31039, 31061, 31086, 0 }, { 17689, 30935, 17724, 30963, 25642, 30982, 17776, 30992, 31008, 31039, 31061, 31086, 0 }, { 17689, 30935, 17724, 30963, 25642, 30982, 17776, 30992, 31008, 31039, 31061, 31086, 0 }, 0, 0, 185, 187, { 3711, 3720, 3727, 3736, 1599, 1556, 3747, 0, 0, 0, 0, 0, 0, 0 }, { 31111, 31131, 222, 10501, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 848, 269, 0, 0, 0, 0, 0 }, { 25522, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 0, 0, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 31145, 31152, 31161, 31176, 31187, 31196, 31203, 31210, 31217, 31228, 31241, 31254, 0 }, { 31145, 31152, 31161, 31176, 31187, 31196, 31203, 31210, 31217, 31228, 31241, 31254, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 6, 185, 187, { 1518, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3520, 4935, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 31259, 31266, 31272, 31279, 31290, 31298, 31307 }, { 31314, 8298, 3699, 31318, 31322, 31326, 10582 }, { 2308, 2308, 2300, 2300, 5644, 16338, 1914 }, { 3929, 31330, 31338, 3949, 3955, 31344, 31350, 3972, 31356, 31366, 31374, 31384, 0 }, { 3929, 31330, 31338, 3949, 3955, 31344, 31350, 3972, 31356, 31366, 31374, 31384, 0 }, { 31394, 31398, 3699, 29229, 3668, 31402, 31406, 19914, 18218, 2684, 31410, 16295, 0 }, { 31394, 31398, 3699, 29229, 3668, 31402, 31406, 19914, 18218, 2684, 31410, 16295, 0 }, 0, 0, 185, 187, { 3711, 16480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3757, 3776, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 0, 0, { 31414, 31421, 31429, 31436, 31443, 31451, 31459 }, { 31466, 31469, 31472, 31475, 31478, 31481, 31484 }, { 2308, 2308, 2302, 2308, 12692, 3925, 12692 }, { 31487, 31495, 31505, 31511, 31519, 31524, 31529, 31534, 31541, 19899, 31549, 31557, 0 }, { 31487, 31495, 31505, 31511, 31519, 31524, 31529, 31534, 31541, 19899, 31549, 31557, 0 }, { 2651, 31565, 3699, 31569, 3668, 30620, 30624, 31573, 3639, 2684, 31577, 16295, 0 }, { 2651, 31565, 3699, 31569, 3668, 30620, 30624, 31573, 3639, 2684, 31577, 16295, 0 }, 0, 0, 185, 187, { 1120, 17272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3789, 3808, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 31581, 31592, { 31602, 31620, 31635, 31657, 31670, 31684, 31701 }, { 31725, 31733, 31738, 31657, 31670, 31750, 31757 }, { 0, 0, 0, 0, 0, 0, 0 }, { 31771, 31793, 31809, 31829, 31843, 31860, 31875, 31892, 31906, 31919, 31938, 31952, 0 }, { 31771, 31793, 31809, 31829, 31843, 31860, 31875, 31892, 31906, 31919, 31938, 31952, 0 }, { 31971, 31986, 31995, 32008, 32015, 32025, 32033, 32043, 32050, 32056, 32068, 32075, 0 }, { 31971, 31986, 31995, 32008, 32015, 32025, 32033, 32043, 32050, 32056, 32068, 32075, 0 }, 0, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 0, 0, { 32087, 32095, 15840, 15849, 15858, 32106, 32116 }, { 16326, 15890, 15894, 15898, 15902, 16189, 32125 }, { 0, 0, 0, 0, 0, 0, 0 }, { 32129, 32138, 32148, 32156, 10611, 3672, 32164, 32170, 32179, 32188, 32197, 32206, 0 }, { 32129, 32138, 32148, 32156, 10611, 3672, 32164, 32170, 32179, 32188, 32197, 32206, 0 }, { 2651, 2655, 15909, 32215, 10611, 2668, 2672, 19914, 18218, 2684, 32219, 16295, 0 }, { 2651, 2655, 15909, 32215, 10611, 2668, 2672, 19914, 18218, 2684, 32219, 16295, 0 }, 0, 0, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 32223, 32236, 32241, { 32246, 32253, 32268, 32282, 32298, 32313, 32329 }, { 6212, 32344, 2402, 32348, 32352, 32356, 32360 }, { 1914, 12692, 2300, 1909, 1914, 2302, 12692 }, { 7350, 7358, 32364, 32371, 32378, 2341, 2346, 32383, 32393, 32404, 32413, 32423, 0 }, { 7350, 7358, 32364, 32371, 32378, 2341, 2346, 32383, 32393, 32404, 32413, 32423, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, 0, 0, 2438, 187, { 2440, 2451, 1556, 2460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32433, 2194, 11931, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 32452, 32457, { 32462, 32478, 32486, 32494, 32503, 32515, 32525 }, { 32535, 32541, 32547, 32551, 32555, 32563, 3639 }, { 0, 0, 0, 0, 0, 0, 0 }, { 32570, 32583, 32597, 32606, 32612, 32616, 32621, 32629, 16250, 32642, 16267, 16275, 0 }, { 32570, 32583, 32597, 32606, 32612, 32616, 32621, 32629, 16250, 32642, 16267, 16275, 0 }, { 32651, 2655, 32655, 16283, 32612, 32659, 2672, 32663, 2680, 32671, 2688, 16295, 0 }, { 32651, 2655, 32655, 16283, 32612, 32659, 2672, 32663, 2680, 32671, 2688, 16295, 0 }, 0, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 32677, 32700, 32707, { 32714, 32724, 32734, 32744, 32754, 32764, 32774 }, { 32784, 32791, 32798, 32805, 32812, 32819, 32826 }, { 32833, 32837, 32841, 32845, 32849, 32853, 32857 }, { 32861, 32868, 32875, 32882, 32889, 32896, 32903, 32910, 32917, 32924, 32931, 32941, 0 }, { 32861, 32868, 32875, 32882, 32889, 32896, 32903, 32910, 32917, 32924, 32931, 32941, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540, 6542, 6544, 6546, 6549, 6552, 0 }, 0, 0, 185, 187, { 1518, 1527, 1536, 1567, 1556, 1545, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32951, 32975, 33005, 33035, 33052, 0, 0, 0, 0, 0 }, { 1722, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1739, 848, 269, 0, 0, 0, 0, 0, 0 }, { 33075, 1805, 0, 0, 0, 0, 0, 0 } },\n    { 289, 0, 0, { 27951, 8298, 33092, 33099, 33109, 33114, 33121 }, { 33128, 6196, 33132, 4800, 33137, 33142, 33147 }, { 4392, 33152, 33155, 33158, 33161, 33164, 33167 }, { 33170, 33177, 33092, 33188, 33194, 33198, 33207, 33214, 33219, 33228, 33233, 33236, 0 }, { 33170, 33177, 33092, 33188, 33194, 33198, 33207, 33214, 33219, 33228, 33233, 33236, 0 }, { 33242, 33246, 33253, 28074, 33194, 33258, 33263, 33214, 33268, 33228, 33233, 33273, 0 }, { 33242, 33246, 33253, 28074, 33194, 33258, 33263, 33214, 33268, 33228, 33233, 33273, 0 }, 2, 1, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16078, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 33430, 33446, 33451, { 33456, 33481, 33510, 33535, 33548, 33563, 33580 }, { 33595, 33600, 33605, 33610, 33615, 33620, 8599 }, { 19210, 19210, 33625, 8610, 8613, 19210, 8610 }, { 33628, 33647, 33662, 33684, 33704, 33720, 33736, 33750, 33776, 33800, 33817, 33834, 0 }, { 33628, 33647, 33662, 33684, 33704, 33720, 33736, 33750, 33776, 33800, 33817, 33834, 0 }, { 33851, 33860, 33869, 33883, 33897, 33909, 33921, 33931, 33947, 33961, 33968, 33975, 0 }, { 33851, 33860, 33869, 33883, 33897, 33909, 33921, 33931, 33947, 33961, 33968, 33975, 0 }, 0, 1, 691, 187, { 2154, 4724, 1556, 33982, 33992, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 34005, 34040, 34069, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 34104, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 0, 0, { 34120, 34132, 34143, 34155, 34167, 34177, 34189 }, { 34204, 34209, 34214, 34219, 34224, 34229, 34234 }, { 0, 0, 0, 0, 0, 0, 0 }, { 34239, 34248, 34260, 34268, 34273, 34283, 34290, 34299, 34306, 34312, 34321, 34332, 0 }, { 34239, 34248, 34260, 34268, 34273, 34283, 34290, 34299, 34306, 34312, 34321, 34332, 0 }, { 34340, 34345, 34350, 34355, 34360, 34365, 34370, 34224, 34375, 34380, 34385, 34390, 0 }, { 34340, 34345, 34350, 34355, 34360, 34365, 34370, 34224, 34375, 34380, 34385, 34390, 0 }, 0, 0, 185, 187, { 1545, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20050, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 34395, 34406, 34408, { 34410, 34423, 34431, 34440, 34450, 34460, 34469 }, { 34481, 34485, 34489, 34493, 34497, 34501, 34505 }, { 2565, 2308, 2300, 7600, 12692, 5644, 1914 }, { 34509, 34523, 34534, 34543, 34554, 34566, 34580, 34592, 34605, 34618, 34630, 34643, 0 }, { 34509, 34523, 34534, 34543, 34554, 34566, 34580, 34592, 34605, 34618, 34630, 34643, 0 }, { 34657, 34662, 34668, 34674, 34679, 34685, 34691, 34696, 34702, 34707, 18931, 34713, 0 }, { 34657, 34662, 34668, 34674, 34679, 34685, 34691, 34696, 34702, 34707, 18931, 34713, 0 }, 2, 1, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 34719, 34741, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, 0, 6, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1195, 1204, 1211, { 1218, 1228, 1238, 1248, 1258, 1268, 1278 }, { 1288, 1295, 1302, 1309, 1316, 1323, 1330 }, { 1337, 1341, 1345, 1349, 1353, 1357, 1361 }, { 1365, 1372, 1379, 1386, 1393, 1400, 1407, 1414, 1421, 1428, 1435, 1445, 0 }, { 1365, 1372, 1379, 1386, 1393, 1400, 1407, 1414, 1421, 1428, 1435, 1445, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, 0, 0, 185, 187, { 1518, 1527, 1536, 1545, 1556, 1567, 1578, 1585, 1592, 1599, 0, 0, 0, 0 }, { 1608, 1630, 1658, 1686, 1701, 0, 0, 0, 0, 0 }, { 843, 251, 1722, 1730, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 1739, 1750, 0, 0, 0, 0, 0 }, { 1762, 1778, 1791, 1805, 0, 0, 0, 0 } },\n    { 35112, 2471, 2477, { 2484, 2492, 2499, 2508, 2517, 2528, 2536 }, { 2544, 2547, 2550, 2553, 2556, 2559, 2562 }, { 1914, 2300, 2565, 2300, 2565, 2306, 1914 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, 2, 1, 691, 187, { 2154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 8022, 21796, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 2, 1, 185, 187, { 198, 189, 3483, 8015, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 3502, 10640, 0, 0, 0, 0, 0, 0 }, { 251, 843, 242, 3532, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 257, 3540, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3821, 7261, 7266, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 35121, 6196, 4795, 35126, 35132, 35137, 35141 }, { 2565, 2308, 2300, 29116, 3925, 3927, 1914 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 35147, 5753, 35151, 1086, 35156, 2410, 2414, 1096, 1100, 1105, 1110, 35160, 0 }, { 35147, 5753, 35151, 1086, 35156, 2410, 2414, 1096, 1100, 1105, 1110, 35160, 0 }, 0, 0, 185, 187, { 198, 3490, 189, 4149, 3483, 2451, 1556, 0, 0, 0, 0, 0, 0, 0 }, { 4164, 4219, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 3532, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 3540, 848, 269, 0, 0, 0, 0, 0 }, { 4288, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 4733, 4742, 4748, 4754, 4763, 4769, 4778 }, { 4785, 4790, 4795, 4800, 4805, 4810, 4815 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, 2, 1, 2438, 187, { 2451, 198, 189, 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 4246, 4961, 4971, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 35165, 1820, 1823, { 6130, 6139, 6147, 6156, 6167, 6176, 6185 }, { 6192, 6196, 2402, 6200, 6204, 6208, 6212 }, { 2565, 2308, 2300, 2300, 6216, 3927, 1914 }, { 6218, 6226, 3943, 6235, 6242, 6249, 6256, 3972, 6263, 6273, 6281, 6290, 0 }, { 6299, 6307, 4032, 6316, 6323, 6330, 6337, 4055, 6344, 6354, 1058, 6362, 0 }, { 6371, 2398, 2402, 2406, 6375, 6379, 6383, 6387, 6391, 6395, 2430, 6399, 0 }, { 6371, 2398, 2402, 2406, 6375, 6379, 6383, 6387, 6391, 6395, 2430, 6399, 0 }, 2, 1, 691, 187, { 2154, 14774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 35173, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 7261, 7266, { 7271, 7278, 7286, 7294, 7303, 7313, 7321 }, { 7330, 4395, 7333, 7336, 7339, 7342, 7345 }, { 7348, 2300, 2565, 3643, 2565, 3927, 7348 }, { 7350, 7358, 7367, 2331, 7373, 2341, 2346, 7377, 2358, 2368, 2376, 2385, 0 }, { 7350, 7358, 7367, 2331, 7373, 2341, 2346, 7377, 2358, 2368, 2376, 2385, 0 }, { 2394, 2398, 7386, 2406, 7373, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 7386, 2406, 7373, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, 2, 1, 185, 187, { 14753, 4149, 2451, 2696, 7399, 1556, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 3747, 3520, 5498, 0, 0, 0, 0, 0, 0 }, { 843, 251, 35183, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 35193, 35198, { 2217, 9837, 35203, 2240, 2247, 2255, 35210 }, { 2270, 9865, 35218, 2283, 2287, 2291, 35222 }, { 1914, 2300, 2302, 2304, 2302, 2306, 2308 }, { 2310, 2317, 4837, 2331, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2310, 2317, 4837, 2331, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, 2, 1, 691, 187, { 2154, 6118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2176, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3821, 7261, 7266, { 3833, 7830, 7844, 7857, 7870, 7883, 3880 }, { 6192, 7895, 7899, 7903, 7907, 7911, 7915 }, { 2565, 1914, 2302, 7920, 7920, 1914, 1914 }, { 35226, 35234, 35244, 3949, 29135, 35251, 35257, 3972, 29152, 29161, 29169, 35263, 0 }, { 35226, 35234, 35244, 3949, 29135, 35251, 35257, 3972, 29152, 29161, 29169, 35263, 0 }, { 2651, 20033, 3699, 29229, 2594, 2668, 2672, 19914, 18218, 29242, 2688, 2692, 0 }, { 2651, 20033, 3699, 29229, 2594, 2668, 2672, 19914, 18218, 29242, 2688, 2692, 0 }, 2, 1, 185, 187, { 198, 2154, 2440, 189, 2696, 2451, 1545, 1567, 1556, 1599, 35272, 6936, 0, 0 }, { 4219, 4164, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4288, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 9823, 9826, { 9829, 9837, 9845, 2240, 2247, 2255, 9852 }, { 9860, 9865, 9870, 2283, 2287, 2291, 9874 }, { 1914, 2300, 2302, 2304, 2302, 2306, 2308 }, { 7350, 7358, 4837, 2331, 2337, 2341, 2346, 9879, 2358, 2368, 2376, 2385, 0 }, { 7350, 7358, 4837, 2331, 2337, 2341, 2346, 9879, 2358, 2368, 2376, 2385, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 2418, 2422, 2426, 2430, 2434, 0 }, 2, 1, 2438, 187, { 2440, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 35281, 35292, 35316, 35346, 35363, 35385, 35394 }, { 14921, 14924, 14929, 14935, 14939, 7600, 14944 }, { 6540, 6528, 6530, 6532, 6534, 6536, 6538 }, { 35405, 35418, 501, 35431, 521, 35442, 35451, 542, 35460, 35477, 35492, 35505, 0 }, { 35405, 35418, 501, 35431, 521, 35442, 35451, 542, 35460, 35477, 35492, 35505, 0 }, { 15095, 7999, 2402, 2406, 15043, 15099, 15103, 15107, 15111, 2426, 15115, 15119, 0 }, { 15095, 7999, 2402, 2406, 15043, 15099, 15103, 15107, 15111, 2426, 15115, 15119, 0 }, 0, 1, 691, 187, { 2154, 2696, 8015, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3520, 5455, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 7261, 7266, { 18648, 18662, 18672, 18683, 18697, 18708, 18719 }, { 18732, 18737, 18742, 18749, 18755, 18761, 18767 }, { 2565, 2308, 2300, 7600, 2565, 12692, 1914 }, { 18772, 18780, 18788, 18795, 18804, 18814, 18824, 18830, 18838, 18853, 18871, 18879, 0 }, { 18772, 18780, 18788, 18795, 18804, 18814, 18824, 18830, 18838, 18853, 18871, 18879, 0 }, { 18887, 18891, 18788, 18897, 18901, 18906, 18824, 18912, 18917, 18924, 18931, 18936, 0 }, { 18887, 18891, 18788, 18897, 18901, 18906, 18824, 18912, 18917, 18924, 18931, 18936, 0 }, 2, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 35518, 35533, 35548, 35563, 35580, 35597, 35606 }, { 35617, 35624, 35631, 35638, 35645, 19574, 35652 }, { 35659, 19207, 8610, 8613, 8607, 19204, 19588 }, { 13102, 13113, 8644, 13126, 8666, 13137, 13144, 8691, 13151, 13166, 13179, 13190, 0 }, { 13102, 13113, 8644, 13126, 8666, 13137, 13144, 8691, 13151, 13166, 13179, 13190, 0 }, { 13203, 13210, 13217, 13224, 8666, 13137, 13144, 13231, 13238, 13245, 13252, 13259, 0 }, { 13203, 13210, 13217, 13224, 8666, 13137, 13144, 13231, 13238, 13245, 13252, 13259, 0 }, 0, 1, 185, 187, { 1545, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20050, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 20069, 20097, { 20119, 20138, 20157, 20182, 20201, 20235, 20260 }, { 20279, 20289, 20299, 20315, 20325, 20350, 20366 }, { 20376, 20380, 20387, 20391, 20398, 20405, 20412 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, { 20416, 20444, 20478, 20494, 20513, 20520, 20530, 20546, 20562, 20593, 20615, 20637, 0 }, 0, 5, 2438, 691, { 2451, 4157, 8015, 2440, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 4241, 20662, 20671, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 4260, 20679, 20691, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, 0, 6, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1195, 1204, 1211, { 1218, 1228, 1238, 1248, 1258, 1268, 1278 }, { 34757, 34764, 34771, 34778, 34785, 34792, 34799 }, { 1337, 1341, 1345, 1349, 1353, 1357, 1361 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, 0, 0, 185, 187, { 1120, 3483, 189, 1578, 1599, 1518, 1545, 1556, 0, 0, 0, 0, 0, 0 }, { 1608, 6555, 1686, 1701, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1762, 1778, 1791, 1805, 0, 0, 0, 0 } },\n    { 35112, 2471, 2477, { 2484, 2492, 2499, 2508, 2517, 2528, 2536 }, { 2544, 2547, 2550, 2553, 2556, 2559, 2562 }, { 1914, 2300, 2565, 2300, 2565, 2306, 1914 }, { 35791, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 35791, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 35799, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, { 35799, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, 2, 1, 691, 187, { 2154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 185, 187, { 14753, 4149, 3483, 1120, 189, 198, 3747, 5468, 1556, 1599, 1545, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 848, 269, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3821, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 2, 1, 185, 187, { 198, 189, 4149, 3483, 4157, 2451, 2696, 1556, 0, 0, 0, 0, 0, 0 }, { 4164, 4192, 4219, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 4241, 4246, 4252, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 4260, 4268, 4277, 0, 0, 0, 0 }, { 4288, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 4733, 4742, 4748, 4754, 4763, 4769, 4778 }, { 4785, 4790, 4795, 4800, 4805, 4810, 4815 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, 0, 0, 2438, 187, { 1556, 6936, 2451, 35804, 189, 3490, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3520, 1129, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 4246, 4961, 4971, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 35813, 18295, 18300, { 35826, 35834, 35842, 35850, 35862, 35871, 35883 }, { 18385, 18390, 18395, 18400, 18405, 18410, 18415 }, { 1914, 2300, 2565, 6216, 2565, 16338, 2308 }, { 18420, 18437, 18450, 18464, 18477, 18490, 18503, 18517, 18529, 18543, 18557, 18571, 0 }, { 18420, 18437, 18450, 18464, 18477, 18490, 18503, 18517, 18529, 18543, 18557, 18571, 0 }, { 35894, 35905, 35912, 35920, 35927, 35934, 35941, 35949, 35955, 35963, 35971, 35979, 0 }, { 35894, 35905, 35912, 35920, 35927, 35934, 35941, 35949, 35955, 35963, 35971, 35979, 0 }, 2, 1, 691, 187, { 4724, 2154, 8015, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 35986, 36012, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, 0, 6, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1195, 1204, 1211, { 1218, 1228, 1238, 1248, 1258, 1268, 1278 }, { 1288, 1295, 1302, 1309, 1316, 1323, 1330 }, { 1337, 1341, 1345, 1349, 1353, 1357, 1361 }, { 1365, 1372, 1379, 1386, 1393, 1400, 1407, 1414, 1421, 1428, 1435, 1445, 0 }, { 1365, 1372, 1379, 1386, 1393, 1400, 1407, 1414, 1421, 1428, 1435, 1445, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, 0, 0, 185, 187, { 1120, 3483, 189, 1578, 1599, 1518, 1545, 1556, 0, 0, 0, 0, 0, 0 }, { 1608, 6555, 1686, 34806, 0, 0, 0, 0, 0, 0 }, { 1722, 1730, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1739, 1750, 848, 269, 0, 0, 0, 0, 0 }, { 1762, 1778, 1791, 0, 0, 0, 0, 0 } },\n    { 35112, 2471, 2477, { 2484, 2492, 2499, 2508, 2517, 2528, 2536 }, { 2544, 2547, 2550, 2553, 2556, 2559, 2562 }, { 1914, 2300, 2565, 2300, 2565, 2306, 1914 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, 2, 1, 691, 187, { 2154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 2438, 187, { 1556, 198, 189, 3483, 6936, 36030, 3747, 14785, 1556, 0, 0, 0, 0, 0 }, { 3776, 31111, 36038, 6411, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 251, 843, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 269, 848, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 14753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 35165, 1820, 1823, { 4733, 4742, 4748, 4754, 4763, 4769, 4778 }, { 4785, 4790, 4795, 4800, 4805, 4810, 4815 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, 2, 1, 691, 187, { 2154, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 35173, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 1820, 1823, { 8986, 8995, 9007, 9014, 9022, 9032, 9038 }, { 9045, 9049, 9053, 9057, 9061, 9066, 9070 }, { 9074, 9076, 9078, 9080, 9082, 9076, 9080 }, { 9085, 9095, 9104, 9112, 9120, 9128, 9135, 9142, 9150, 1993, 9156, 9164, 0 }, { 9173, 9183, 9192, 9200, 9208, 9216, 9223, 9230, 9239, 7775, 9245, 9255, 0 }, { 9264, 9268, 9273, 9278, 9282, 7809, 2130, 9286, 9290, 2146, 9294, 2150, 0 }, { 9264, 9268, 9273, 9278, 9282, 7809, 2130, 9286, 9290, 2146, 9294, 2150, 0 }, 0, 1, 691, 187, { 9328, 36107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 9401, 9372, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 36131, 36142, 13477, 36153, 36164, 36171, 36180, 36193, 35739, 35752, 35765, 35778, 0 }, { 36131, 36142, 13477, 36153, 36164, 36171, 36180, 36193, 35739, 35752, 35765, 35778, 0 }, { 36131, 36142, 13477, 36153, 36164, 36171, 36180, 36193, 35739, 35752, 35765, 35778, 0 }, { 36131, 36142, 13477, 36153, 36164, 36171, 36180, 36193, 35739, 35752, 35765, 35778, 0 }, 0, 6, 2438, 187, { 2440, 2451, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 257, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1195, 1204, 1211, { 1218, 1228, 1238, 1248, 1258, 1268, 1278 }, { 34757, 34764, 34771, 34778, 34785, 34792, 34799 }, { 1337, 1341, 1345, 1349, 1353, 1357, 1361 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, 0, 0, 185, 187, { 1120, 3483, 189, 1578, 1599, 1518, 1545, 1556, 0, 0, 0, 0, 0, 0 }, { 1608, 36200, 36227, 2460, 1686, 34806, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1762, 1778, 1791, 1805, 0, 0, 0, 0 } },\n    { 35112, 2471, 2477, { 2484, 2492, 2499, 2508, 2517, 2528, 2536 }, { 2544, 2547, 2550, 2553, 2556, 2559, 2562 }, { 1914, 2300, 2565, 2300, 2565, 2306, 1914 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 2567, 2574, 2582, 2588, 2594, 2598, 2603, 2608, 2615, 2625, 2633, 2642, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, { 2651, 2655, 2659, 2664, 2594, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 0 }, 2, 1, 691, 187, { 2154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2719, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36243, 7261, 7266, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 185, 187, { 14753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36250, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 1, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 4733, 4742, 4748, 4754, 4763, 4769, 4778 }, { 4785, 4790, 4795, 4800, 4805, 4810, 4815 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, 2, 1, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36260, 36270, { 8986, 8995, 9007, 9014, 9022, 9032, 9038 }, { 9045, 9049, 9053, 9057, 9061, 9066, 9070 }, { 0, 0, 0, 0, 0, 0, 0 }, { 2310, 2317, 15032, 2331, 2337, 2341, 2346, 11888, 36278, 36288, 36296, 36305, 0 }, { 2310, 2317, 15032, 2331, 2337, 2341, 2346, 11888, 36278, 36288, 36296, 36305, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, 0, 1, 691, 187, { 9328, 36314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36329, 9386, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 35662, 35673, 13477, 35686, 36164, 35706, 36350, 36363, 36370, 35752, 36381, 36392, 0 }, { 35662, 35673, 13477, 35686, 36164, 35706, 36350, 36363, 36370, 35752, 36381, 36392, 0 }, { 35662, 35673, 13477, 35686, 36164, 35706, 36350, 36363, 36370, 35752, 36381, 36392, 0 }, { 35662, 35673, 13477, 35686, 36164, 35706, 36350, 36363, 36370, 35752, 36381, 36392, 0 }, 0, 6, 2438, 187, { 2440, 2451, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 257, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36243, 7261, 7266, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 2, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 3532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 3540, 0, 0, 0, 0, 0, 0, 0 }, { 36250, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36403, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 3736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36250, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 4733, 4742, 4748, 4754, 4763, 4769, 4778 }, { 4785, 4790, 4795, 4800, 4805, 4810, 4815 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4820, 4828, 4837, 4842, 4848, 4852, 4857, 4865, 4871, 4881, 1058, 4889, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, { 4899, 4905, 4837, 4912, 4848, 4852, 4917, 4865, 4923, 1105, 1110, 4929, 0 }, 2, 1, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4935, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36260, 36270, { 11820, 36411, 9007, 11845, 9022, 9032, 9038 }, { 9045, 9049, 9053, 11866, 9061, 9066, 9070 }, { 9074, 9076, 9078, 9080, 9082, 9076, 9080 }, { 2310, 2317, 15032, 2331, 2337, 2410, 2414, 11888, 36278, 36288, 36296, 36305, 0 }, { 2310, 2317, 15032, 2331, 2337, 2410, 2414, 11888, 36278, 36288, 36296, 36305, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, 0, 1, 691, 187, { 9298, 9328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36329, 9386, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 4246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 4268, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 36131, 36142, 13477, 36153, 36164, 36171, 36180, 36193, 35739, 35752, 35765, 35778, 0 }, { 36131, 36142, 13477, 36153, 36164, 36171, 36180, 36193, 35739, 35752, 35765, 35778, 0 }, { 36131, 36142, 13477, 36153, 36164, 36171, 36180, 36193, 35739, 35752, 35765, 35778, 0 }, { 36131, 36142, 13477, 36153, 36164, 36171, 36180, 36193, 35739, 35752, 35765, 35778, 0 }, 0, 0, 2438, 187, { 2440, 2451, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 257, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 1820, 1823, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 185, 187, { 1545, 9951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10640, 5455, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36250, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36422, 36440, { 36455, 36468, 36487, 36500, 36515, 36532, 10761 }, { 36543, 36550, 36557, 36564, 36571, 36578, 36585 }, { 456, 459, 36592, 465, 468, 459, 465 }, { 36595, 36608, 501, 510, 15731, 15738, 15747, 542, 36623, 36642, 36657, 36674, 0 }, { 36595, 36608, 501, 510, 15731, 15738, 15747, 542, 36623, 36642, 36657, 36674, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, 0, 1, 691, 187, { 9298, 9328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2194, 11931, 2719, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, 0, 6, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 848, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36243, 1820, 1823, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36250, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 24184, 36422, 36440, { 36455, 36468, 36487, 36500, 36515, 36532, 10761 }, { 36543, 36550, 36557, 36564, 36571, 36578, 36585 }, { 456, 459, 36592, 465, 468, 459, 465 }, { 36595, 36608, 501, 510, 15731, 15738, 15747, 542, 36623, 36642, 36657, 36674, 0 }, { 36595, 36608, 501, 510, 15731, 15738, 15747, 542, 36623, 36642, 36657, 36674, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, 0, 1, 691, 187, { 4724, 8015, 2165, 2154, 36768, 2696, 36777, 1556, 0, 0, 0, 0, 0, 0 }, { 2194, 11931, 2719, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, 0, 0, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 848, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 14753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36260, 36270, { 11820, 36411, 9007, 11845, 9022, 9032, 9038 }, { 9045, 9049, 9053, 11866, 9061, 9066, 9070 }, { 9074, 9076, 9078, 9080, 9082, 9076, 9080 }, { 2310, 2317, 15032, 2331, 2337, 2410, 2414, 11888, 36278, 36288, 36296, 36305, 0 }, { 2310, 2317, 15032, 2331, 2337, 2410, 2414, 11888, 36278, 36288, 36296, 36305, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, 0, 1, 691, 691, { 9298, 9328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36329, 9386, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, 0, 6, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 848, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 1820, 1823, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 185, 187, { 198, 14785, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10640, 5455, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36250, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 14753, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36422, 36440, { 36455, 36468, 36487, 8513, 36515, 36532, 10761 }, { 36543, 36550, 36557, 36788, 36571, 36578, 36585 }, { 456, 459, 36592, 465, 468, 459, 465 }, { 36595, 36608, 501, 510, 15731, 36719, 36726, 542, 36623, 36642, 36657, 36674, 0 }, { 36595, 36608, 501, 510, 15731, 36719, 36726, 542, 36623, 36642, 36657, 36674, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, 0, 1, 691, 187, { 9328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 9372, 9386, 9401, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, 0, 6, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 848, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36250, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36795, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36260, 36270, { 11820, 36411, 9007, 11845, 9022, 9032, 9038 }, { 9045, 9049, 9053, 11866, 9061, 9066, 9070 }, { 9074, 9076, 9078, 9080, 9082, 9076, 9080 }, { 2310, 2317, 15032, 2331, 2337, 2410, 2414, 11888, 36278, 36288, 36296, 36305, 0 }, { 2310, 2317, 15032, 2331, 2337, 2410, 2414, 11888, 36278, 36288, 36296, 36305, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, 0, 1, 691, 691, { 9298, 9328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36329, 9386, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, { 34944, 34968, 34977, 34986, 34997, 35006, 35019, 35028, 35033, 35044, 35066, 35090, 0 }, 0, 1, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 848, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 1820, 1823, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 185, 187, { 1120, 36805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10640, 5455, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36250, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 1, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36422, 36440, { 36455, 36468, 36487, 8513, 36515, 36532, 10761 }, { 36543, 36550, 36557, 36788, 36571, 36578, 36585 }, { 456, 459, 36592, 465, 468, 459, 465 }, { 36595, 36608, 501, 510, 15731, 36719, 36726, 542, 36623, 36642, 36657, 36674, 0 }, { 36595, 36608, 501, 510, 15731, 36719, 36726, 542, 36623, 36642, 36657, 36674, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, 0, 1, 691, 187, { 9298, 9308, 9316, 9328, 9340, 9350, 9360, 36817, 0, 0, 0, 0, 0, 0 }, { 9372, 9386, 9401, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, 0, 6, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 848, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 185, 187, { 198, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36250, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 1, 2438, 187, { 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36795, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, 0, 6, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 848, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 1, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 242, 3532, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 257, 3540, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, 0, 6, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 848, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 34826, 34829, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34832, 34843, 34858, 34875, 34892, 34905, 34918 }, { 34929, 34932, 34935, 34938, 34941, 13447, 13438 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, { 35662, 35673, 13477, 35686, 35697, 35706, 35717, 35728, 35739, 35752, 35765, 35778, 0 }, 0, 6, 185, 187, { 198, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 242, 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 257, 269, 848, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 8022, 21796, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 2438, 187, { 2440, 2451, 4157, 8015, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 5455, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 36829, 257, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 8022, 21796, { 3558, 3565, 3572, 3580, 3590, 3599, 3606 }, { 3615, 3619, 3623, 3627, 3631, 3635, 3639 }, { 1914, 2300, 2302, 3643, 2302, 2306, 1914 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 3645, 3653, 3662, 2588, 3668, 3672, 3677, 2608, 2615, 3682, 2633, 3690, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, { 2651, 2655, 3699, 2664, 3668, 2668, 2672, 2676, 2680, 3703, 2688, 3707, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3502, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36250, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36840, 36868, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36049, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 1120, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1180, 0, 0, 0, 0, 0, 0, 0 } },\n    { 36403, 872, 878, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 3736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36057, 36085, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3532, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36250, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 3833, 3841, 3847, 3854, 3865, 3872, 3880 }, { 3888, 3893, 3898, 3903, 3909, 3914, 3919 }, { 2565, 2308, 2300, 2300, 3925, 3927, 1914 }, { 3929, 3935, 3943, 3949, 3955, 3960, 3966, 3972, 3979, 3990, 3998, 4008, 0 }, { 4018, 4024, 4032, 1012, 4038, 4043, 4049, 4055, 4062, 1050, 4073, 4083, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, { 4093, 4098, 3898, 4103, 4108, 4113, 4118, 4123, 4128, 4134, 4139, 4144, 0 }, 0, 0, 185, 187, { 3711, 3720, 3727, 3736, 1599, 1556, 3747, 0, 0, 0, 0, 0, 0, 0 }, { 31111, 31131, 222, 10501, 0, 0, 0, 0, 0, 0 }, { 3532, 242, 843, 251, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3540, 257, 848, 269, 0, 0, 0, 0, 0 }, { 4288, 0, 0, 0, 0, 0, 0, 0 } },\n    { 24184, 36422, 36440, { 36455, 36468, 36487, 36500, 36515, 36532, 10761 }, { 36543, 36550, 36557, 36564, 36571, 36578, 36585 }, { 456, 459, 36592, 465, 468, 459, 465 }, { 36595, 36608, 501, 510, 15731, 15738, 15747, 542, 36623, 36642, 36657, 36674, 0 }, { 36595, 36608, 501, 510, 15731, 15738, 15747, 542, 36623, 36642, 36657, 36674, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, 0, 1, 691, 187, { 4724, 8015, 2165, 2154, 36768, 2696, 36777, 1556, 0, 0, 0, 0, 0, 0 }, { 2194, 11931, 2719, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36260, 36270, { 8986, 8995, 9007, 9014, 9022, 9032, 9038 }, { 9045, 9049, 9053, 9057, 9061, 9066, 9070 }, { 0, 0, 0, 0, 0, 0, 0 }, { 2310, 2317, 15032, 2331, 2337, 2341, 2346, 11888, 36278, 36288, 36296, 36305, 0 }, { 2310, 2317, 15032, 2331, 2337, 2341, 2346, 11888, 36278, 36288, 36296, 36305, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, 0, 1, 691, 187, { 9328, 36314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36329, 9386, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36422, 36440, { 36455, 36468, 36487, 8513, 36515, 36532, 10761 }, { 36543, 36550, 36557, 36788, 36571, 36578, 36585 }, { 456, 459, 36592, 465, 468, 459, 465 }, { 36595, 36608, 501, 510, 15731, 36719, 36726, 542, 36623, 36642, 36657, 36674, 0 }, { 36595, 36608, 501, 510, 15731, 36719, 36726, 542, 36623, 36642, 36657, 36674, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, 0, 1, 691, 187, { 9328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 9372, 9386, 9401, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36260, 36270, { 11820, 36411, 9007, 11845, 9022, 9032, 9038 }, { 9045, 9049, 9053, 11866, 9061, 9066, 9070 }, { 9074, 9076, 9078, 9080, 9082, 9076, 9080 }, { 2310, 2317, 15032, 2331, 2337, 2410, 2414, 11888, 36278, 36288, 36296, 36305, 0 }, { 2310, 2317, 15032, 2331, 2337, 2410, 2414, 11888, 36278, 36288, 36296, 36305, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, 0, 1, 691, 691, { 9298, 9328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36329, 9386, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 35281, 35292, 35316, 35346, 35363, 35385, 35394 }, { 14921, 14924, 14929, 14935, 14939, 7600, 14944 }, { 6540, 6528, 6530, 6532, 6534, 6536, 6538 }, { 35405, 35418, 501, 35431, 521, 35442, 35451, 542, 35460, 35477, 35492, 35505, 0 }, { 35405, 35418, 501, 35431, 521, 35442, 35451, 542, 35460, 35477, 35492, 35505, 0 }, { 15095, 7999, 2402, 2406, 15043, 15099, 15103, 15107, 15111, 2426, 15115, 15119, 0 }, { 15095, 7999, 2402, 2406, 15043, 15099, 15103, 15107, 15111, 2426, 15115, 15119, 0 }, 0, 1, 691, 187, { 2154, 2696, 8015, 189, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3520, 5455, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1195, 1204, 1211, { 1218, 1228, 1238, 1248, 1258, 1268, 1278 }, { 1288, 1295, 1302, 1309, 1316, 1323, 1330 }, { 1337, 1341, 1345, 1349, 1353, 1357, 1361 }, { 1365, 1372, 1379, 1386, 1393, 1400, 1407, 1414, 1421, 1428, 1435, 1445, 0 }, { 1365, 1372, 1379, 1386, 1393, 1400, 1407, 1414, 1421, 1428, 1435, 1445, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, 0, 0, 185, 187, { 1518, 1527, 1536, 1545, 1556, 1567, 1578, 1585, 1592, 1599, 0, 0, 0, 0 }, { 1608, 1630, 1658, 1686, 1701, 0, 0, 0, 0, 0 }, { 843, 251, 1722, 1730, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 1739, 1750, 0, 0, 0, 0, 0 }, { 1762, 1778, 1791, 1805, 0, 0, 0, 0 } },\n    { 1812, 35193, 35198, { 2217, 9837, 35203, 2240, 2247, 2255, 35210 }, { 2270, 9865, 35218, 2283, 2287, 2291, 35222 }, { 1914, 2300, 2302, 2304, 2302, 2306, 2308 }, { 2310, 2317, 4837, 2331, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2310, 2317, 4837, 2331, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, 2, 1, 691, 187, { 2154, 6118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2176, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36260, 36270, { 8986, 8995, 9007, 9014, 9022, 9032, 9038 }, { 9045, 9049, 9053, 9057, 9061, 9066, 9070 }, { 0, 0, 0, 0, 0, 0, 0 }, { 2310, 2317, 15032, 2331, 2337, 2341, 2346, 11888, 36278, 36288, 36296, 36305, 0 }, { 2310, 2317, 15032, 2331, 2337, 2341, 2346, 11888, 36278, 36288, 36296, 36305, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, { 2394, 2398, 2402, 2406, 2337, 2410, 2414, 11895, 2422, 2426, 2430, 2434, 0 }, 0, 1, 691, 187, { 9328, 36314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36329, 9386, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 1820, 1823, { 14832, 14838, 14852, 14875, 14889, 14905, 14912 }, { 14921, 14924, 14929, 14935, 14939, 7600, 14944 }, { 6540, 6528, 6530, 6532, 6534, 6536, 6538 }, { 14948, 14955, 10132, 14962, 3668, 14968, 14974, 14980, 14987, 14996, 15004, 15011, 0 }, { 15018, 15025, 15032, 15037, 15043, 15047, 15052, 15057, 15064, 15073, 15081, 15088, 0 }, { 15095, 7999, 2402, 2406, 15043, 15099, 15103, 15107, 15111, 2426, 15115, 15119, 0 }, { 15095, 7999, 2402, 2406, 15043, 15099, 15103, 15107, 15111, 2426, 15115, 15119, 0 }, 0, 1, 691, 187, { 2154, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15123, 3520, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 35518, 35533, 35548, 35563, 35580, 35597, 35606 }, { 35617, 35624, 35631, 35638, 35645, 19574, 35652 }, { 35659, 19207, 8610, 8613, 8607, 19204, 19588 }, { 13102, 13113, 8644, 13126, 8666, 13137, 13144, 8691, 13151, 13166, 13179, 13190, 0 }, { 13102, 13113, 8644, 13126, 8666, 13137, 13144, 8691, 13151, 13166, 13179, 13190, 0 }, { 13203, 13210, 13217, 13224, 8666, 13137, 13144, 13231, 13238, 13245, 13252, 13259, 0 }, { 13203, 13210, 13217, 13224, 8666, 13137, 13144, 13231, 13238, 13245, 13252, 13259, 0 }, 0, 1, 185, 187, { 1545, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20050, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 25903, 25908, { 25913, 25920, 25931, 25944, 25957, 25968, 25981 }, { 25992, 25997, 26002, 26007, 26012, 26017, 26022 }, { 6528, 6530, 6532, 6534, 6536, 6538, 6540 }, { 26027, 26053, 26081, 26111, 26141, 26167, 26197, 26223, 26251, 26275, 26303, 26340, 0 }, { 26027, 26053, 26081, 26111, 26141, 26167, 26197, 26223, 26251, 26275, 26303, 26340, 0 }, { 26379, 26391, 26403, 26415, 26427, 26439, 26451, 26463, 26475, 26487, 26500, 26513, 0 }, { 26379, 26391, 26403, 26415, 26427, 26439, 26451, 26463, 26475, 26487, 26500, 26513, 0 }, 0, 0, 2438, 187, { 1556, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 26526, 26564, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1195, 1204, 1211, { 1218, 1228, 1238, 1248, 1258, 1268, 1278 }, { 34757, 34764, 34771, 34778, 34785, 34792, 34799 }, { 1337, 1341, 1345, 1349, 1353, 1357, 1361 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, 0, 0, 185, 187, { 1120, 3483, 189, 1578, 1599, 1518, 1545, 1556, 0, 0, 0, 0, 0, 0 }, { 1608, 6555, 1686, 1701, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1762, 1778, 1791, 1805, 0, 0, 0, 0 } },\n    { 1195, 1204, 1211, { 1218, 1228, 1238, 1248, 1258, 1268, 1278 }, { 34757, 34764, 34771, 34778, 34785, 34792, 34799 }, { 1337, 1341, 1345, 1349, 1353, 1357, 1361 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, { 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1506, 1512, 0 }, 0, 0, 185, 187, { 1120, 3483, 189, 1578, 1599, 1518, 1545, 1556, 0, 0, 0, 0, 0, 0 }, { 1608, 6555, 1686, 1701, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 1762, 1778, 1791, 1805, 0, 0, 0, 0 } },\n    { 7465, 7261, 7266, { 2217, 2225, 2232, 2240, 2247, 2255, 2262 }, { 7473, 7478, 7482, 7486, 7490, 7494, 7498 }, { 1914, 2300, 2302, 2304, 2302, 2306, 2308 }, { 2310, 2317, 4837, 2331, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2310, 2317, 4837, 2331, 4848, 2341, 2346, 2351, 2358, 2368, 2376, 6086, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, { 2394, 2398, 2402, 2406, 4848, 2410, 2414, 2418, 2422, 2426, 2430, 7503, 0 }, 2, 1, 691, 691, { 2154, 6118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2176, 2194, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1812, 36422, 36440, { 36455, 36468, 36487, 8513, 36515, 36532, 10761 }, { 36543, 36550, 36557, 36788, 36571, 36578, 36585 }, { 456, 459, 36592, 465, 468, 459, 465 }, { 36595, 36608, 501, 510, 15731, 36719, 36726, 542, 36623, 36642, 36657, 36674, 0 }, { 36595, 36608, 501, 510, 15731, 36719, 36726, 542, 36623, 36642, 36657, 36674, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, { 36691, 36698, 36705, 36712, 15731, 36719, 36726, 36733, 36740, 36747, 36754, 36761, 0 }, 0, 1, 691, 691, { 9298, 9328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36329, 9386, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4268, 0, 0, 0, 0, 0, 0, 0, 0 }, { 36120, 0, 0, 0, 0, 0, 0, 0 } },\n    { 1, 12926, 12938, { 12950, 12965, 12980, 12995, 13012, 13031, 13042 }, { 13053, 13060, 13067, 13074, 13081, 13088, 13095 }, { 0, 0, 0, 0, 0, 0, 0 }, { 13102, 13113, 8644, 13126, 8666, 13137, 13144, 8691, 13151, 13166, 13179, 13190, 0 }, { 13102, 13113, 8644, 13126, 8666, 13137, 13144, 8691, 13151, 13166, 13179, 13190, 0 }, { 13203, 13210, 13217, 13224, 8666, 13137, 13144, 13231, 13238, 13245, 13252, 13259, 0 }, { 13203, 13210, 13217, 13224, 8666, 13137, 13144, 13231, 13238, 13245, 13252, 13259, 0 }, 0, 1, 691, 187, { 2154, 2696, 8015, 2440, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 13266, 13284, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 848, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 1820, 1823, { 19918, 19928, 19937, 19946, 19957, 19967, 19972 }, { 19979, 19985, 19990, 19995, 20000, 10578, 20004 }, { 20009, 2565, 1914, 7600, 1909, 3925, 1914 }, { 14948, 14955, 10132, 14962, 3668, 20011, 20016, 20021, 14987, 14996, 15004, 15011, 0 }, { 14948, 14955, 10132, 14962, 3668, 20011, 20016, 20021, 14987, 14996, 15004, 15011, 0 }, { 20028, 20033, 3699, 2664, 3668, 20011, 20016, 20037, 10562, 2684, 20041, 20046, 0 }, { 20028, 20033, 3699, 2664, 3668, 20011, 20016, 20037, 10562, 2684, 20041, 20046, 0 }, 0, 1, 185, 187, { 1545, 15492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20050, 16096, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12916, 0, 0, 0, 0, 0, 0, 0 } },\n    { 289, 30416, 30426, { 30439, 30446, 30452, 30459, 30465, 30471, 30479 }, { 30489, 30493, 30497, 30501, 30505, 30509, 30513 }, { 12692, 12692, 12692, 12692, 12692, 12692, 12692 }, { 30519, 30528, 30537, 30542, 30548, 30554, 30560, 30567, 30573, 30582, 30591, 30599, 0 }, { 30519, 30528, 30537, 30542, 30548, 30554, 30560, 30567, 30573, 30582, 30591, 30599, 0 }, { 30608, 30612, 3699, 30616, 3668, 30620, 30624, 30628, 30633, 30637, 30643, 30647, 0 }, { 30608, 30612, 3699, 30616, 3668, 30620, 30624, 30628, 30633, 30637, 30643, 30647, 0 }, 0, 0, 2438, 187, { 2440, 2451, 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10501, 222, 0, 0, 0, 0, 0, 0, 0, 0 }, { 843, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 848, 269, 0, 0, 0, 0, 0, 0, 0 }, { 278, 0, 0, 0, 0, 0, 0, 0 } },\n    { 3551, 0, 0, { 31414, 31421, 31429, 31436, 31443, 31451, 31459 }, { 31466, 31469, 31472, 31475, 31478, 31481, 31484 }, { 2308, 2308, 2302, 2308, 12692, 3925, 12692 }, { 31487, 31495, 31505, 31511, 31519, 31524, 31529, 31534, 31541, 19899, 31549, 31557, 0 }, { 31487, 31495, 31505, 31511, 31519, 31524, 31529, 31534, 31541, 19899, 31549, 31557, 0 }, { 2651, 31565, 3699, 31569, 3668, 30620, 30624, 31573, 3639, 2684, 31577, 16295, 0 }, { 2651, 31565, 3699, 31569, 3668, 30620, 30624, 31573, 3639, 2684, 31577, 16295, 0 }, 0, 0, 185, 187, { 1120, 17272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 3789, 3808, 0, 0, 0, 0, 0, 0, 0, 0 }, { 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 269, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2207, 0, 0, 0, 0, 0, 0, 0 } }\n};\n\n\nstatic const NumberFormatEntry number_format_entries[] =\n{\n    { 691, 36891, 691, 36891, 36893, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36951, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 36973, 36982, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 36990, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 2, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 36990, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 2, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36993, 36957, 36959, 36963, 36997, 37009, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37021, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37024, 37035, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37046, 37060, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 0, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 37094, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 36959, 36963, 37103, 37111, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37119, 36957, 36959, 36963, 36924, 36934, 2438, 37123, 2, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37128, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37021, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37075, 37131, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37141, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37145, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 0, 0, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37149, 37159, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 0, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 9, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37168, 36957, 36959, 36963, 37172, 37191, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37210, 36957, 36959, 36963, 37075, 37131, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 37213, 691, 37213, 37217, 36957, 36959, 36963, 37221, 37230, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 0, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37239, 36957, 37247, 36963, 37264, 37292, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37319, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 2, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 36959, 36963, 36997, 37009, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37322, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 36948, 37021, 36957, 37328, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37335, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37339, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 2, 2, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37343, 36957, 37346, 36963, 37369, 36934, 37385, 37393, 3, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37401, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37404, 36957, 37408, 36963, 36924, 36934, 2438, 36967, 5, 1, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37425, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37429, 37443, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 37456, 36963, 37470, 37482, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37493, 36957, 36959, 36963, 37496, 37507, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 0, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, 0 }, { 3, 0 } },\n    { 185, 36891, 185, 36891, 37517, 36903, 37526, 36921, 37537, 36934, 37552, 37393, 3, 0, 0, 0, 3, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37559, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37563, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 0, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37569, 37579, 2438, 36967, 8, 3, 7, 3, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37588, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36948, 691, 36948, 10586, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 10586, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 10586, 36957, 37595, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 10586, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 0, 36957, 37601, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37021, 36957, 37328, 36963, 36924, 36934, 2438, 36967, 2, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 36969, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 37328, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 36969, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37646, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 0, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 0, 36957, 37649, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37666, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 0, 36903, 36959, 36921, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37670, 36957, 37677, 36963, 36924, 36934, 2438, 36967, 12, 2, 1, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 0, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 0, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 2, 2, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 0, 36963, 36924, 36934, 2438, 36967, 12, 2, 1, 1, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 37704, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 0, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 36990, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 2, 0, 1, 1, 1, 2, 2, { 3, 0 }, { 3, 0 } },\n    { 691, 36891, 691, 36891, 37706, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37709, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 5, 1, 1, 1, 2, 2, 2, { 3, -1 }, { 3, 0 } },\n    { 36891, 691, 36891, 691, 37713, 36957, 37717, 36963, 36924, 36934, 2438, 36967, 2, 0, 1, 1, 1, 0, 2, { 3, 0 }, { 3, 0 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 0, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37754, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37762, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 1, { 3, 0 }, { 3, 0 } },\n    { 36891, 36948, 36891, 36948, 0, 36957, 0, 36963, 37103, 37111, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37769, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, 2 } },\n    { 36891, 691, 36891, 691, 37782, 36903, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37785, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 0, 36957, 0, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37789, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36948, 691, 36948, 10586, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37021, 36957, 37328, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 0 }, { 3, 0 } },\n    { 691, 36891, 691, 36891, 37789, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 36990, 36957, 0, 36963, 36924, 36934, 2438, 36967, 2, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, 0 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 0, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37239, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37793, 36957, 0, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37706, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 36893, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36951, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 36973, 36982, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37796, 36957, 37800, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36993, 36957, 36959, 36963, 36997, 37009, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37021, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37024, 37035, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37046, 37060, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 0, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 37094, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 36959, 36963, 37103, 37111, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37119, 36957, 36959, 36963, 36924, 36934, 2438, 37123, 2, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37128, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37021, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37075, 37131, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37141, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37145, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 0, 0, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37149, 37159, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37021, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 9, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37168, 36957, 36959, 36963, 37172, 37191, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37210, 36957, 36959, 36963, 37075, 37131, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 37213, 691, 37213, 37217, 36957, 36959, 36963, 37221, 37230, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 0, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37239, 36957, 37247, 36963, 37264, 37292, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37319, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 2, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 36959, 36963, 36997, 37009, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37322, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 36948, 37021, 36957, 37328, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37335, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37339, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 2, 2, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37343, 36957, 37346, 36963, 37369, 36934, 37385, 37393, 3, 0, 0, 0, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37401, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37404, 36957, 37408, 36963, 36924, 36934, 2438, 36967, 5, 1, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37425, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37429, 37443, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 37456, 36963, 37470, 37482, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37493, 36957, 36959, 36963, 37496, 37507, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37810, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, 0 }, { 3, 0 } },\n    { 185, 36891, 185, 36891, 37517, 36903, 37526, 36921, 37537, 36934, 37552, 37393, 3, 0, 0, 0, 3, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37559, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37563, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37817, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37569, 37579, 2438, 36967, 8, 3, 7, 3, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37588, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36948, 691, 36948, 10586, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 10586, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 10586, 36957, 37595, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 10586, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 0, 36957, 37601, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37021, 36957, 37328, 36963, 36924, 36934, 2438, 36967, 2, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 36969, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37021, 36957, 37328, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37666, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37822, 36903, 36959, 36921, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 37677, 36963, 36924, 36934, 2438, 36967, 12, 2, 1, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 0, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 2, 2, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 0, 36963, 36924, 36934, 2438, 36967, 12, 2, 1, 1, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 37704, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 36990, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 2, 0, 1, 1, 1, 2, 2, { 3, 0 }, { 3, 0 } },\n    { 691, 36891, 691, 36891, 37706, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37709, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 5, 1, 1, 1, 2, 2, 2, { 3, -1 }, { 3, 0 } },\n    { 36891, 691, 36891, 691, 37713, 36957, 37717, 36963, 36924, 36934, 2438, 36967, 2, 0, 1, 1, 1, 0, 2, { 3, 0 }, { 3, 0 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 0, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37754, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37762, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 1, { 3, 0 }, { 3, 0 } },\n    { 691, 36891, 691, 36891, 37769, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, 2 } },\n    { 36891, 691, 36891, 691, 37782, 36903, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37785, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37789, 36957, 0, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37789, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36948, 691, 36948, 10586, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37021, 36957, 37328, 36963, 36924, 36934, 2438, 36967, 12, 2, 0, 0, 1, 2, 2, { 3, 0 }, { 3, 0 } },\n    { 691, 36891, 691, 36891, 37789, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 36990, 36957, 0, 36963, 36924, 36934, 2438, 36967, 2, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, 0 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37239, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37793, 36957, 0, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37706, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37828, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37141, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 2, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 37838, 691, 37838, 37217, 36957, 36959, 36963, 37024, 37035, 2438, 36967, 2, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37706, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37103, 37111, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 37838, 691, 37838, 37217, 36957, 36959, 36963, 37075, 37131, 2438, 36967, 2, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 36948, 36969, 36957, 36959, 36963, 37149, 37159, 2438, 36967, 12, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37021, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 36959, 36963, 37075, 37131, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 37328, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37840, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 36969, 36957, 0, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37848, 36903, 36959, 36921, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37855, 36957, 37677, 36963, 36924, 36934, 2438, 36967, 12, 2, 1, 0, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 691, 36891, 691, 36891, 37859, 36903, 36959, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 37800, 36963, 36924, 36934, 2438, 36967, 0, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37024, 37035, 2438, 36967, 9, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37073, 36957, 36959, 36963, 37103, 37111, 2438, 36967, 15, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 37328, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37869, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 0, 0, 0, 3, 3, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 0, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37024, 37035, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 7920, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36948, 691, 36948, 37217, 36957, 36959, 36963, 37103, 37111, 2438, 36967, 2, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37879, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37882, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37892, 36957, 37800, 36963, 36924, 36934, 2438, 36967, 0, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 37838, 691, 37838, 0, 36957, 36959, 36963, 37024, 37035, 2438, 36967, 9, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37897, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 37103, 37111, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37879, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37901, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 36969, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37911, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 36969, 36957, 36959, 36963, 37103, 37111, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37879, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37915, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 3, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 10586, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37925, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37930, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 3, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37940, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 2, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37925, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37944, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37073, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37954, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37959, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37969, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37973, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37981, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 3, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37073, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37991, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37073, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 2, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 36969, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 38001, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 3, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37785, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37073, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 2, 0, 0, 0, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 38011, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37073, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 9, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 38021, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 3, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 38031, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 12, 2, 0, 0, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 38035, 36903, 36906, 36921, 36924, 36934, 2438, 36943, 3, 2, 0, 0, 3, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37642, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 12, 2, 1, 1, 1, 2, 2, { 3, 2 }, { 3, 2 } },\n    { 36891, 691, 36891, 691, 38045, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 1, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 2308, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 38048, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 1, 0, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37073, 36957, 36959, 36963, 37075, 37085, 2438, 36967, 0, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, 0 } },\n    { 36891, 691, 36891, 691, 37925, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37879, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 38051, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 38059, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37840, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 36990, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 2, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37021, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37879, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 37817, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37848, 36903, 36959, 36921, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 0, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 38064, 36957, 37800, 36963, 36924, 36934, 2438, 36967, 0, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 38064, 36957, 37800, 36963, 36924, 36934, 2438, 36967, 0, 0, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37021, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 9, 2, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 691, 36891, 691, 38059, 36957, 36959, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 37810, 36957, 0, 36963, 36924, 36934, 2438, 36967, 8, 3, 1, 1, 1, 2, 2, { 3, 0 }, { 3, 0 } },\n    { 36891, 36948, 36891, 36948, 37822, 36903, 36959, 36921, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 0, 2, { 3, -1 }, { 3, -1 } },\n    { 36891, 36948, 36891, 36948, 0, 36957, 0, 36963, 37103, 37111, 2438, 36967, 8, 3, 0, 0, 1, 2, 2, { 3, -1 }, { 3, -1 } },\n    { 691, 36891, 691, 36891, 37789, 36957, 0, 36963, 36924, 36934, 2438, 36967, 9, 2, 1, 1, 1, 2, 2, { 3, -1 }, { 3, -1 } }\n};\n\n\nstatic const CultureInfoEntry culture_entries[] =\n{\n    { 0x0001, 0x007F, 768, -1, 38068, 38071, 38078, 38093, 38097, 38068, 0, { 0, 0, 38101, 0 }, 0, 0, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x0002, 0x007F, 257, -1, 38129, 38132, 38142, 38161, 38165, 38129, 0, { 38169, 0, 0, 0 }, 1, 1, { 1251, 21025, 10007, 866, 0, ';' } },\n    { 0x0003, 0x007F, 257, -1, 38211, 38214, 38222, 38230, 38234, 38211, 0, { 38238, 0, 0, 0 }, 2, 2, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0004, 0x0004, 257, -1, 38258, 38265, 38293, 38300, 38304, 38308, 0, { 38311, 0, 0, 0 }, 3, 3, { 936, 500, 10008, 936, 0, ',' } },\n    { 0x0004, 0x7804, 257, -1, 38318, 38326, 38293, 38300, 38304, 38308, 0, { 38311, 0, 0, 0 }, 4, 4, { 936, 500, 10008, 936, 0, ',' } },\n    { 0x0005, 0x007F, 257, -1, 38347, 38350, 38356, 38366, 38370, 38347, 0, { 38374, 0, 0, 0 }, 5, 5, { 1250, 500, 10029, 852, 0, ';' } },\n    { 0x0006, 0x007F, 257, -1, 38400, 38403, 38410, 38416, 38420, 38400, 0, { 38424, 0, 0, 0 }, 6, 6, { 1252, 20277, 10000, 850, 0, ';' } },\n    { 0x0007, 0x007F, 257, -1, 38445, 38448, 38455, 38463, 38467, 38445, 0, { 38471, 0, 0, 0 }, 7, 7, { 1252, 20273, 10000, 850, 0, ';' } },\n    { 0x0008, 0x007F, 257, -1, 38496, 38499, 38505, 38522, 38526, 38496, 0, { 38530, 0, 0, 0 }, 8, 8, { 1253, 20273, 10006, 737, 0, ';' } },\n    { 0x0009, 0x007F, 257, -1, 38572, 38575, 38575, 38583, 38587, 38572, 0, { 38591, 0, 0, 0 }, 9, 9, { 1252, 37, 10000, 437, 0, ',' } },\n    { 0x000A, 0x007F, 257, -1, 38610, 38613, 38621, 38630, 38634, 38610, 0, { 38638, 0, 0, 0 }, 10, 10, { 1252, 20284, 10000, 850, 0, ';' } },\n    { 0x000B, 0x007F, 257, -1, 38660, 38663, 38671, 38677, 38681, 38660, 0, { 38685, 0, 0, 0 }, 11, 11, { 1252, 20278, 10000, 850, 0, ';' } },\n    { 0x000C, 0x007F, 257, -1, 38710, 38713, 38720, 38730, 38734, 38710, 0, { 38738, 0, 0, 0 }, 12, 12, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x000D, 0x007F, 257, -1, 38760, 38763, 38770, 38781, 38785, 38760, 0, { 38789, 0, 0, 0 }, 13, 13, { 1255, 500, 10005, 862, 1, ',' } },\n    { 0x000E, 0x007F, 257, -1, 38822, 38825, 38835, 38842, 38846, 38822, 0, { 38850, 0, 0, 0 }, 14, 14, { 1250, 500, 10029, 852, 0, ';' } },\n    { 0x000F, 0x007F, 257, -1, 38866, 38869, 38879, 38889, 38893, 38866, 0, { 38897, 0, 0, 0 }, 15, 15, { 1252, 20871, 10079, 850, 0, ';' } },\n    { 0x0010, 0x007F, 257, -1, 38917, 38920, 38928, 38937, 38941, 38917, 0, { 38945, 0, 0, 0 }, 16, 16, { 1252, 20280, 10000, 850, 0, ';' } },\n    { 0x0011, 0x007F, 257, -1, 38967, 38970, 38979, 38989, 38993, 38967, 0, { 38997, 0, 0, 0 }, 17, 17, { 932, 20290, 10001, 932, 0, ',' } },\n    { 0x0012, 0x007F, 257, -1, 39024, 39027, 39034, 39044, 39048, 39024, 0, { 39052, 0, 0, 0 }, 18, 18, { 949, 20833, 10003, 949, 0, ',' } },\n    { 0x0013, 0x007F, 257, -1, 39062, 39065, 39071, 39082, 39086, 39062, 0, { 39090, 0, 0, 0 }, 19, 19, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0014, 0x007F, 257, -1, 39112, 39115, 39125, 39131, 39135, 39139, 0, { 38424, 0, 0, 0 }, 20, 20, { 1252, 20277, 10000, 850, 0, ';' } },\n    { 0x0015, 0x007F, 257, -1, 39142, 39145, 39152, 39159, 39163, 39142, 0, { 39167, 0, 0, 0 }, 21, 21, { 1250, 20880, 10029, 852, 0, ';' } },\n    { 0x0016, 0x007F, 257, -1, 39191, 39194, 39205, 39216, 39220, 39191, 0, { 39224, 0, 0, 0 }, 22, 22, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0017, 0x007F, 257, -1, 39247, 39250, 39258, 39268, 39272, 39247, 0, { 39276, 0, 0, 0 }, 23, 23, { 1252, 20273, 10000, 850, 0, ';' } },\n    { 0x0018, 0x007F, 257, -1, 39296, 39299, 39308, 39317, 39321, 39296, 0, { 39325, 0, 0, 0 }, 24, 24, { 1250, 20880, 10029, 852, 0, ';' } },\n    { 0x0019, 0x007F, 257, -1, 39344, 39347, 39355, 39370, 39374, 39344, 0, { 39378, 0, 0, 0 }, 25, 25, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x001A, 0x007F, 257, -1, 39424, 39427, 39436, 39445, 39449, 39424, 0, { 39453, 0, 0, 0 }, 26, 26, { 1250, 500, 10082, 852, 0, ';' } },\n    { 0x001B, 0x007F, 257, -1, 12674, 39476, 39483, 39495, 39499, 12674, 0, { 39503, 0, 0, 0 }, 27, 27, { 1250, 20880, 10029, 852, 0, ';' } },\n    { 0x001C, 0x007F, 257, -1, 39527, 39530, 39539, 39545, 39549, 39527, 0, { 39553, 0, 0, 0 }, 28, 28, { 1250, 20880, 10029, 852, 0, ';' } },\n    { 0x001D, 0x007F, 257, -1, 39573, 39576, 39584, 39592, 39596, 39573, 0, { 38424, 0, 0, 0 }, 29, 29, { 1252, 20278, 10000, 850, 0, ';' } },\n    { 0x001E, 0x007F, 512, -1, 39600, 39603, 39608, 39618, 39622, 39600, 0, { 0, 39626, 0, 0 }, 30, 30, { 874, 20838, 10021, 874, 0, ',' } },\n    { 0x001F, 0x007F, 257, -1, 12683, 39657, 39665, 39674, 39678, 12683, 0, { 39682, 0, 0, 0 }, 31, 31, { 1254, 20905, 10081, 857, 0, ';' } },\n    { 0x0020, 0x007F, 257, -1, 39696, 39699, 39704, 39713, 39717, 39696, 0, { 39721, 0, 0, 0 }, 32, 32, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x0021, 0x007F, 257, -1, 39751, 39754, 39765, 39782, 39786, 39751, 0, { 39790, 0, 0, 0 }, 33, 33, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0022, 0x007F, 257, -1, 39809, 39812, 39822, 39843, 39847, 39809, 0, { 39851, 0, 0, 0 }, 34, 34, { 1251, 500, 10017, 866, 0, ';' } },\n    { 0x0023, 0x007F, 257, -1, 39897, 39900, 39911, 39932, 39936, 39897, 0, { 39940, 0, 0, 0 }, 35, 35, { 1251, 500, 10007, 866, 0, ';' } },\n    { 0x0024, 0x007F, 257, -1, 39982, 39985, 39995, 40009, 40013, 39982, 0, { 40017, 0, 0, 0 }, 36, 36, { 1250, 20880, 10029, 852, 0, ';' } },\n    { 0x0025, 0x007F, 257, -1, 40039, 40042, 40051, 40057, 40061, 40039, 0, { 40065, 0, 0, 0 }, 37, 37, { 1257, 500, 10029, 775, 0, ';' } },\n    { 0x0026, 0x007F, 257, -1, 40085, 40088, 40096, 40106, 40110, 40085, 0, { 40114, 0, 0, 0 }, 38, 38, { 1257, 500, 10029, 775, 0, ';' } },\n    { 0x0027, 0x007F, 257, -1, 40133, 40136, 40147, 40157, 40161, 40133, 0, { 40165, 0, 0, 0 }, 39, 39, { 1257, 500, 10029, 775, 0, ';' } },\n    { 0x0028, 0x007F, 257, -1, 40188, 40191, 40197, 40210, 40214, 40188, 0, { 0, 0, 0, 0 }, 40, 40, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x0029, 0x007F, 257, -1, 40218, 40221, 40229, 40240, 40244, 40218, 0, { 40248, 0, 0, 0 }, 41, 41, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x002A, 0x007F, 257, -1, 40272, 40275, 40286, 40301, 35137, 40272, 0, { 40305, 0, 0, 0 }, 42, 42, { 1258, 500, 10000, 1258, 0, ',' } },\n    { 0x002B, 0x007F, 257, -1, 40320, 40323, 40332, 40347, 40351, 40320, 0, { 40355, 0, 0, 0 }, 43, 43, { 0, 500, 2, 1, 0, ',' } },\n    { 0x002C, 0x007F, 257, -1, 40385, 40388, 40400, 40412, 40416, 40385, 0, { 40420, 0, 0, 0 }, 44, 44, { 1254, 20905, 10081, 857, 0, ';' } },\n    { 0x002D, 0x007F, 257, -1, 40439, 40442, 40449, 40457, 40461, 40439, 0, { 40465, 0, 0, 0 }, 45, 45, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x002F, 0x007F, 257, -1, 40485, 40488, 40499, 40520, 40524, 40485, 0, { 40528, 0, 0, 0 }, 46, 46, { 1251, 500, 10007, 866, 0, ';' } },\n    { 0x0032, 0x007F, 257, -1, 40572, 40575, 40582, 40591, 40595, 40572, 0, { 0, 0, 0, 0 }, 47, 47, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x0034, 0x007F, 257, -1, 40599, 40602, 40608, 40617, 40621, 40599, 0, { 0, 0, 0, 0 }, 48, 48, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x0035, 0x007F, 257, -1, 40625, 40628, 40633, 40641, 40645, 40625, 0, { 40649, 0, 0, 0 }, 49, 49, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x0036, 0x007F, 257, -1, 40670, 40673, 40673, 40683, 40687, 40670, 0, { 40691, 0, 0, 0 }, 50, 50, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x0037, 0x007F, 257, -1, 40711, 40714, 40723, 40745, 40749, 40711, 0, { 40753, 0, 0, 0 }, 51, 51, { 0, 500, 2, 1, 0, ';' } },\n    { 0x0038, 0x007F, 257, -1, 40818, 40821, 40829, 40839, 40843, 40818, 0, { 0, 0, 0, 0 }, 52, 52, { 1252, 20277, 10079, 850, 0, ';' } },\n    { 0x0039, 0x007F, 257, -1, 40847, 40850, 40856, 40872, 40876, 40847, 0, { 40880, 0, 0, 0 }, 53, 53, { 0, 500, 2, 1, 0, ',' } },\n    { 0x003A, 0x007F, 257, -1, 40933, 40936, 40944, 40950, 40954, 40933, 0, { 40958, 0, 0, 0 }, 54, 54, { 0, 500, 2, 1, 0, ',' } },\n    { 0x003B, 0x007F, 257, -1, 40979, 40982, 40996, 41013, 41017, 40979, 0, { 41021, 0, 0, 0 }, 55, 55, { 1252, 20277, 10000, 850, 0, ';' } },\n    { 0x003C, 0x007F, 257, -1, 41040, 41043, 41049, 41057, 41061, 41040, 0, { 41065, 0, 0, 0 }, 56, 56, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x003E, 0x007F, 257, -1, 41086, 41089, 41095, 41109, 41113, 41086, 0, { 41117, 0, 0, 0 }, 57, 57, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x003F, 0x007F, 257, -1, 41134, 41137, 41144, 41164, 41168, 41134, 0, { 41172, 0, 0, 0 }, 58, 58, { 0, 500, 2, 1, 0, ';' } },\n    { 0x0040, 0x007F, 257, -1, 41214, 41217, 41224, 41241, 41245, 41214, 0, { 41249, 0, 0, 0 }, 59, 59, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x0041, 0x007F, 257, -1, 41287, 41290, 41298, 41308, 41312, 41287, 0, { 41316, 0, 0, 0 }, 60, 60, { 1252, 500, 10000, 437, 0, ',' } },\n    { 0x0043, 0x007F, 257, -1, 41337, 41340, 41346, 41357, 41361, 41337, 0, { 41365, 0, 0, 0 }, 61, 61, { 1254, 500, 10029, 857, 0, ';' } },\n    { 0x0045, 0x007F, 257, -1, 41385, 41388, 41396, 41412, 41416, 41385, 0, { 41420, 0, 0, 0 }, 62, 62, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0046, 0x007F, 257, -1, 41485, 41488, 41496, 41515, 41519, 41485, 0, { 41523, 0, 0, 0 }, 63, 63, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0047, 0x007F, 257, -1, 41570, 41573, 41582, 41604, 41608, 41570, 0, { 41612, 0, 0, 0 }, 64, 64, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0048, 0x007F, 257, -1, 41668, 41671, 41677, 41693, 41697, 41668, 0, { 0, 0, 0, 0 }, 65, 65, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0049, 0x007F, 257, -1, 41701, 41704, 41710, 41726, 41730, 41701, 0, { 41734, 0, 0, 0 }, 66, 66, { 0, 500, 2, 1, 0, ',' } },\n    { 0x004A, 0x007F, 257, -1, 41799, 41802, 41809, 41828, 41832, 41799, 0, { 41836, 0, 0, 0 }, 67, 67, { 0, 500, 2, 1, 0, ',' } },\n    { 0x004B, 0x007F, 257, -1, 37319, 41901, 41909, 41925, 41929, 37319, 0, { 41933, 0, 0, 0 }, 68, 68, { 0, 500, 2, 1, 0, ',' } },\n    { 0x004C, 0x007F, 257, -1, 41998, 42001, 42011, 42030, 42034, 41998, 0, { 42038, 0, 0, 0 }, 69, 69, { 0, 500, 2, 1, 0, ',' } },\n    { 0x004D, 0x007F, 257, -1, 42082, 42085, 42094, 42116, 42120, 42082, 0, { 42124, 0, 0, 0 }, 70, 70, { 0, 500, 2, 1, 0, ',' } },\n    { 0x004E, 0x007F, 257, -1, 42177, 42180, 42188, 42204, 2402, 42177, 0, { 42208, 0, 0, 0 }, 71, 71, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0050, 0x007F, 257, -1, 42270, 42273, 42283, 42296, 42300, 42270, 0, { 42304, 0, 0, 0 }, 72, 72, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x0051, 0x007F, 257, -1, 42336, 42339, 42347, 42372, 42376, 42336, 0, { 0, 0, 0, 0 }, 73, 73, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0052, 0x007F, 257, -1, 42380, 42383, 42389, 42397, 42401, 42380, 0, { 42405, 0, 0, 0 }, 74, 74, { 1252, 20285, 10000, 850, 0, ',' } },\n    { 0x0053, 0x007F, 257, -1, 42421, 42424, 42430, 42446, 42450, 42421, 0, { 42454, 0, 0, 0 }, 75, 75, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0054, 0x007F, 257, -1, 42509, 42512, 42516, 42526, 42530, 42509, 0, { 42534, 0, 0, 0 }, 76, 76, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0056, 0x007F, 257, -1, 42580, 42583, 42592, 42599, 42603, 42580, 0, { 38945, 0, 0, 0 }, 77, 77, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0057, 0x007F, 257, -1, 42607, 42611, 42619, 42638, 42607, 42607, 0, { 0, 0, 0, 0 }, 78, 78, { 0, 500, 2, 1, 0, ',' } },\n    { 0x005B, 0x007F, 257, -1, 42642, 42645, 42653, 42669, 42673, 42642, 0, { 42677, 0, 0, 0 }, 79, 79, { 0, 500, 2, 1, 0, ',' } },\n    { 0x005E, 0x007F, 257, -1, 8022, 42736, 42744, 42757, 42761, 8022, 0, { 42765, 0, 0, 0 }, 80, 80, { 0, 500, 2, 1, 0, ';' } },\n    { 0x005F, 0x007F, 257, -1, 42810, 42814, 42838, 42848, 42810, 42810, 0, { 0, 0, 0, 0 }, 81, 81, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x0061, 0x007F, 257, -1, 1883, 42852, 42859, 42878, 42882, 1883, 0, { 42886, 0, 0, 0 }, 82, 82, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0063, 0x007F, 1024, -1, 42936, 42939, 42946, 42955, 42959, 42936, 0, { 0, 0, 0, 0 }, 83, 83, { 0, 500, 2, 1, 1, ';' } },\n    { 0x0064, 0x007F, 257, -1, 42963, 42967, 42967, 42976, 42963, 42963, 0, { 42980, 0, 0, 0 }, 84, 84, { 1252, 500, 10000, 437, 0, ',' } },\n    { 0x0068, 0x007F, 257, -1, 43003, 43006, 43006, 43012, 43016, 43003, 0, { 0, 0, 0, 0 }, 85, 85, { 1252, 37, 10000, 437, 0, ',' } },\n    { 0x006A, 0x007F, 257, -1, 43020, 43023, 43030, 43045, 43049, 43020, 0, { 0, 0, 0, 0 }, 86, 86, { 1252, 37, 10000, 437, 0, ',' } },\n    { 0x006C, 0x007F, 257, -1, 43053, 43057, 43072, 43089, 43053, 43053, 0, { 0, 0, 0, 0 }, 87, 87, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x006F, 0x007F, 257, -1, 43093, 43096, 43108, 43120, 43124, 43093, 0, { 43128, 0, 0, 0 }, 88, 88, { 1252, 20277, 10000, 850, 0, ';' } },\n    { 0x0070, 0x007F, 257, -1, 43155, 43158, 43158, 43163, 43167, 43155, 0, { 0, 0, 0, 0 }, 89, 89, { 1252, 37, 10000, 437, 0, ',' } },\n    { 0x0078, 0x007F, 257, -1, 43171, 43174, 43185, 43195, 43199, 43171, 0, { 43203, 0, 0, 0 }, 90, 90, { 0, 500, 2, 1, 0, ',' } },\n    { 0x007E, 0x007F, 257, -1, 43216, 43219, 43226, 43236, 43240, 43216, 0, { 43244, 0, 0, 0 }, 91, 91, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x0084, 0x007F, 257, -1, 43264, 43268, 43281, 43300, 43264, 43264, 0, { 43304, 0, 0, 0 }, 92, 92, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x0085, 0x007F, 257, -1, 43329, 43333, 43339, 43357, 43329, 43329, 0, { 0, 0, 0, 0 }, 93, 93, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x0087, 0x007F, 257, -1, 43361, 43364, 43364, 43376, 43380, 43361, 0, { 0, 0, 0, 0 }, 94, 94, { 1252, 37, 10000, 437, 0, ';' } },\n    { 0x0091, 0x007F, 257, -1, 43384, 43387, 43403, 43413, 43417, 43384, 0, { 43421, 0, 0, 0 }, 95, 95, { 1252, 20285, 10000, 850, 0, ',' } },\n    { 0x0401, 0x0001, 768, 95, 43446, 43452, 43474, 38093, 38097, 38068, 13629, { 0, 0, 38101, 0 }, 96, 96, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x0402, 0x0002, 257, 11, 43538, 43544, 43565, 38161, 38165, 38129, 43603, { 38169, 0, 0, 0 }, 97, 97, { 1251, 21025, 10007, 866, 0, ';' } },\n    { 0x0403, 0x0003, 257, 31, 43606, 43612, 43628, 38230, 38234, 38211, 43646, { 38238, 0, 0, 0 }, 98, 98, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0404, 0x7C04, 257, 107, 43649, 43655, 43677, 43693, 38304, 38308, 43697, { 43700, 0, 0, 0 }, 99, 99, { 950, 500, 10002, 950, 0, ',' } },\n    { 0x0405, 0x0005, 257, 23, 43707, 43713, 43736, 38366, 38370, 38347, 43766, { 38374, 0, 0, 0 }, 100, 100, { 1250, 500, 10029, 852, 0, ';' } },\n    { 0x0406, 0x0006, 257, 25, 43769, 43775, 43792, 38416, 38420, 38400, 43808, { 38424, 0, 0, 0 }, 101, 101, { 1252, 20277, 10000, 850, 0, ';' } },\n    { 0x0407, 0x0007, 257, 24, 43811, 43817, 43834, 38463, 38467, 38445, 43856, { 38471, 0, 0, 0 }, 102, 102, { 1252, 20273, 10000, 850, 0, ';' } },\n    { 0x0408, 0x0008, 257, 39, 43859, 43865, 43880, 38522, 38526, 38496, 43912, { 38530, 0, 0, 0 }, 103, 103, { 1253, 20273, 10006, 737, 0, ';' } },\n    { 0x0409, 0x0009, 257, 109, 43915, 43921, 43921, 38583, 38587, 38572, 43945, { 38591, 0, 0, 0 }, 104, 104, { 1252, 37, 10000, 437, 0, ',' } },\n    { 0x040B, 0x000B, 257, 33, 43948, 43954, 43972, 38677, 38681, 38660, 43986, { 38685, 0, 0, 0 }, 105, 105, { 1252, 20278, 10000, 850, 0, ';' } },\n    { 0x040C, 0x000C, 257, 35, 43989, 43995, 44011, 38730, 38734, 38710, 44030, { 38738, 0, 0, 0 }, 106, 106, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x040D, 0x000D, 257, 47, 44033, 44039, 44055, 38781, 38785, 38760, 44079, { 38789, 0, 0, 0 }, 107, 107, { 1255, 500, 10005, 862, 1, ',' } },\n    { 0x040E, 0x000E, 257, 44, 44082, 44088, 44108, 38842, 38846, 38822, 44131, { 38850, 0, 0, 0 }, 108, 108, { 1250, 500, 10029, 852, 0, ';' } },\n    { 0x040F, 0x000F, 257, 51, 44134, 44140, 44160, 38889, 38893, 38866, 44180, { 38897, 0, 0, 0 }, 109, 109, { 1252, 20871, 10079, 850, 0, ';' } },\n    { 0x0410, 0x0010, 257, 52, 44183, 44189, 44205, 38937, 38941, 38917, 44223, { 38945, 0, 0, 0 }, 110, 110, { 1252, 20280, 10000, 850, 0, ';' } },\n    { 0x0411, 0x0011, 257, 55, 44226, 44232, 44249, 38989, 38993, 38967, 44268, { 38997, 0, 0, 0 }, 111, 111, { 932, 20290, 10001, 932, 0, ',' } },\n    { 0x0412, 0x0012, 257, 58, 44271, 44277, 44298, 39044, 39048, 39024, 44323, { 39052, 0, 0, 0 }, 112, 112, { 949, 20833, 10003, 949, 0, ',' } },\n    { 0x0413, 0x0013, 257, 77, 44326, 44332, 44352, 39082, 39086, 39062, 44375, { 39090, 0, 0, 0 }, 113, 113, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0414, 0x7C14, 257, 78, 44378, 44384, 44411, 39131, 39135, 39139, 44433, { 38424, 0, 0, 0 }, 114, 114, { 1252, 20277, 10000, 850, 0, ';' } },\n    { 0x0415, 0x0015, 257, 86, 44436, 44442, 44458, 39159, 39163, 39142, 44474, { 39167, 0, 0, 0 }, 115, 115, { 1250, 20880, 10029, 852, 0, ';' } },\n    { 0x0416, 0x0016, 257, 14, 44477, 44483, 44503, 39216, 39220, 39191, 44523, { 39224, 0, 0, 0 }, 116, 116, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0417, 0x0017, 257, 18, 44526, 44532, 44554, 39268, 39272, 39247, 13632, { 39276, 0, 0, 0 }, 117, 117, { 1252, 20273, 10000, 850, 0, ';' } },\n    { 0x0418, 0x0018, 257, 91, 44573, 44579, 44598, 39317, 39321, 39296, 44618, { 39325, 0, 0, 0 }, 118, 118, { 1250, 20880, 10029, 852, 0, ';' } },\n    { 0x0419, 0x0019, 257, 93, 44621, 44627, 44644, 39370, 39374, 39344, 44674, { 39378, 0, 0, 0 }, 119, 119, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x041A, 0x001A, 257, 43, 44677, 44683, 44702, 39445, 39449, 39424, 44722, { 39453, 0, 0, 0 }, 120, 120, { 1250, 500, 10082, 852, 0, ';' } },\n    { 0x041B, 0x001B, 257, 99, 44725, 44731, 44749, 39495, 39499, 12674, 44773, { 39503, 0, 0, 0 }, 121, 121, { 1250, 20880, 10029, 852, 0, ';' } },\n    { 0x041C, 0x001C, 257, 2, 44776, 44782, 44801, 39545, 39549, 39527, 44819, { 39553, 0, 0, 0 }, 122, 122, { 1250, 20880, 10029, 852, 0, ';' } },\n    { 0x041D, 0x001D, 257, 96, 44822, 44828, 44845, 39592, 39596, 39573, 44863, { 38424, 0, 0, 0 }, 123, 123, { 1252, 20278, 10000, 850, 0, ';' } },\n    { 0x041E, 0x001E, 512, 102, 44866, 44872, 44888, 39618, 39622, 39600, 44910, { 0, 39626, 0, 0 }, 124, 124, { 874, 20838, 10021, 874, 0, ',' } },\n    { 0x041F, 0x001F, 257, 105, 44913, 44919, 44936, 39674, 39678, 12683, 44956, { 39682, 0, 0, 0 }, 125, 125, { 1254, 20905, 10081, 857, 0, ';' } },\n    { 0x0420, 0x0020, 257, 85, 44959, 44965, 44981, 39713, 39717, 39696, 45007, { 39721, 0, 0, 0 }, 126, 126, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x0421, 0x0021, 257, 45, 45010, 45016, 45039, 39782, 39786, 39751, 45068, { 39790, 0, 0, 0 }, 127, 127, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0422, 0x0022, 257, 108, 45071, 45077, 45097, 39843, 39847, 39809, 45135, { 39851, 0, 0, 0 }, 128, 128, { 1251, 500, 10017, 866, 0, ';' } },\n    { 0x0423, 0x0023, 257, 15, 45138, 45144, 45165, 39932, 39936, 39897, 45205, { 39940, 0, 0, 0 }, 129, 129, { 1251, 500, 10007, 866, 0, ';' } },\n    { 0x0424, 0x0024, 257, 98, 45208, 45214, 45235, 40009, 40013, 39982, 45261, { 40017, 0, 0, 0 }, 130, 130, { 1250, 20880, 10029, 852, 0, ';' } },\n    { 0x0425, 0x0025, 257, 29, 45264, 45270, 45289, 40057, 40061, 40039, 45303, { 40065, 0, 0, 0 }, 131, 131, { 1257, 500, 10029, 775, 0, ';' } },\n    { 0x0426, 0x0026, 257, 66, 45306, 45312, 45329, 40106, 40110, 40085, 45349, { 40114, 0, 0, 0 }, 132, 132, { 1257, 500, 10029, 775, 0, ';' } },\n    { 0x0427, 0x0027, 257, 64, 45352, 45358, 45381, 40157, 40161, 40133, 45401, { 40165, 0, 0, 0 }, 133, 133, { 1257, 500, 10029, 775, 0, ';' } },\n    { 0x0428, 0x7C28, 257, 103, 45404, 45415, 45444, 40210, 40214, 40188, 45480, { 0, 0, 0, 0 }, 134, 134, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x0429, 0x0029, 257, 50, 45483, 45489, 45504, 40240, 40244, 40218, 45528, { 40248, 0, 0, 0 }, 135, 135, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x042A, 0x002A, 257, 113, 45531, 45537, 45558, 40301, 35137, 40272, 45586, { 40305, 0, 0, 0 }, 136, 136, { 1258, 500, 10000, 1258, 0, ',' } },\n    { 0x042B, 0x002B, 257, 3, 45589, 45595, 45614, 40347, 40351, 40320, 1820, { 40355, 0, 0, 0 }, 137, 137, { 0, 500, 2, 1, 0, ',' } },\n    { 0x042C, 0x782C, 257, 7, 45648, 45659, 45691, 40412, 40416, 40385, 45717, { 40420, 0, 0, 0 }, 138, 138, { 1254, 20905, 10081, 857, 0, ';' } },\n    { 0x042D, 0x002D, 257, 31, 45720, 45726, 45741, 40457, 40461, 40439, 43646, { 40465, 0, 0, 0 }, 139, 139, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x042F, 0x002F, 257, 71, 45760, 45766, 45789, 40520, 40524, 40485, 45833, { 40528, 0, 0, 0 }, 140, 140, { 1251, 500, 10007, 866, 0, ';' } },\n    { 0x0432, 0x0032, 257, 115, 45836, 45842, 40582, 40591, 40595, 40572, 45864, { 0, 0, 0, 0 }, 141, 141, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x0434, 0x0034, 257, 115, 45867, 45873, 40608, 40617, 40621, 40599, 45864, { 0, 0, 0, 0 }, 142, 142, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x0435, 0x0035, 257, 115, 45894, 45900, 45920, 40641, 40645, 40625, 45864, { 40649, 0, 0, 0 }, 143, 143, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x0436, 0x0036, 257, 115, 45945, 45951, 45976, 40683, 40687, 40670, 45864, { 40691, 0, 0, 0 }, 144, 144, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x0437, 0x0037, 257, 37, 46000, 46006, 46025, 40745, 40749, 40711, 46080, { 40753, 0, 0, 0 }, 145, 145, { 0, 500, 2, 1, 0, ';' } },\n    { 0x0438, 0x0038, 257, 34, 46083, 46089, 46113, 40839, 40843, 40818, 46134, { 0, 0, 0, 0 }, 146, 146, { 1252, 20277, 10079, 850, 0, ';' } },\n    { 0x0439, 0x0039, 257, 48, 46137, 46143, 46157, 40872, 40876, 40847, 46188, { 40880, 0, 0, 0 }, 147, 147, { 0, 500, 2, 1, 0, ',' } },\n    { 0x043A, 0x003A, 257, 73, 46191, 46197, 46213, 40950, 40954, 40933, 46227, { 40958, 0, 0, 0 }, 148, 148, { 0, 500, 2, 1, 0, ',' } },\n    { 0x043B, 0x003B, 257, 78, 46230, 46236, 46259, 41013, 41017, 40979, 44433, { 41021, 0, 0, 0 }, 149, 149, { 1252, 20277, 10000, 850, 0, ';' } },\n    { 0x0441, 0x0041, 257, 56, 46284, 46290, 46306, 41308, 41312, 41287, 46324, { 41316, 0, 0, 0 }, 150, 150, { 1252, 500, 10000, 437, 0, ',' } },\n    { 0x0443, 0x7C43, 257, 111, 46327, 46338, 46364, 41357, 41361, 41337, 46390, { 41365, 0, 0, 0 }, 151, 151, { 1254, 500, 10029, 857, 0, ';' } },\n    { 0x0445, 0x0045, 257, 48, 46393, 46399, 46415, 41412, 41416, 41385, 46188, { 41420, 0, 0, 0 }, 152, 152, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0447, 0x0047, 257, 48, 46446, 46452, 46469, 41604, 41608, 41570, 46188, { 41612, 0, 0, 0 }, 153, 153, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0448, 0x0048, 257, 48, 46506, 46512, 46526, 41693, 41697, 41668, 46188, { 0, 0, 0, 0 }, 154, 154, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0449, 0x0049, 257, 48, 46557, 46563, 46577, 41726, 41730, 41701, 46188, { 41734, 0, 0, 0 }, 155, 155, { 0, 500, 2, 1, 0, ',' } },\n    { 0x044A, 0x004A, 257, 48, 46617, 46623, 46638, 41828, 41832, 41799, 46188, { 41836, 0, 0, 0 }, 156, 156, { 0, 500, 2, 1, 0, ',' } },\n    { 0x044B, 0x004B, 257, 48, 46685, 46691, 46707, 41925, 41929, 37319, 46188, { 41933, 0, 0, 0 }, 157, 157, { 0, 500, 2, 1, 0, ',' } },\n    { 0x044C, 0x004C, 257, 48, 46738, 46744, 46762, 42030, 42034, 41998, 46188, { 42038, 0, 0, 0 }, 158, 158, { 0, 500, 2, 1, 0, ',' } },\n    { 0x044D, 0x004D, 257, 48, 46802, 46808, 46825, 42116, 42120, 42082, 46188, { 42124, 0, 0, 0 }, 159, 159, { 0, 500, 2, 1, 0, ',' } },\n    { 0x044E, 0x004E, 257, 48, 46862, 46868, 46884, 42204, 2402, 42177, 46188, { 42208, 0, 0, 0 }, 160, 160, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0451, 0x0051, 257, 20, 46915, 46921, 46937, 42372, 42376, 42336, 13711, { 0, 0, 0, 0 }, 161, 161, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0452, 0x0052, 257, 36, 46983, 46989, 47012, 42397, 42401, 42380, 47039, { 42405, 0, 0, 0 }, 162, 162, { 1252, 20285, 10000, 850, 0, ',' } },\n    { 0x0453, 0x0053, 257, 57, 47042, 47048, 47065, 42446, 42450, 42421, 47105, { 42454, 0, 0, 0 }, 163, 163, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0454, 0x0054, 257, 60, 47108, 47114, 47125, 42526, 42530, 42509, 47147, { 42534, 0, 0, 0 }, 164, 164, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0456, 0x0056, 257, 31, 47150, 47156, 47173, 42599, 42603, 42580, 43646, { 38945, 0, 0, 0 }, 165, 165, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0457, 0x0057, 257, 48, 47190, 47197, 47213, 42638, 42607, 42607, 46188, { 0, 0, 0, 0 }, 166, 166, { 0, 500, 2, 1, 0, ',' } },\n    { 0x045B, 0x005B, 257, 63, 47247, 47253, 47273, 42669, 42673, 42642, 47323, { 42677, 0, 0, 0 }, 167, 167, { 0, 500, 2, 1, 0, ',' } },\n    { 0x045E, 0x005E, 257, 32, 47326, 47332, 47351, 42757, 42761, 8022, 47382, { 42765, 0, 0, 0 }, 168, 168, { 0, 500, 2, 1, 0, ';' } },\n    { 0x0461, 0x0061, 257, 79, 47385, 47391, 47406, 42878, 42882, 1883, 47443, { 42886, 0, 0, 0 }, 169, 169, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0463, 0x0063, 1024, 1, 47446, 47452, 47473, 42955, 42959, 42936, 47503, { 0, 0, 0, 0 }, 170, 170, { 0, 500, 2, 1, 1, ';' } },\n    { 0x0464, 0x0064, 257, 84, 47506, 47513, 47536, 42976, 42963, 42963, 47557, { 42980, 0, 0, 0 }, 171, 171, { 1252, 500, 10000, 437, 0, ',' } },\n    { 0x0468, 0x7C68, 257, 75, 47560, 47571, 47594, 43012, 43016, 43003, 47611, { 0, 0, 0, 0 }, 172, 172, { 1252, 37, 10000, 437, 0, ',' } },\n    { 0x046A, 0x006A, 257, 75, 47614, 47620, 47637, 43045, 43049, 43020, 47611, { 0, 0, 0, 0 }, 173, 173, { 1252, 37, 10000, 437, 0, ',' } },\n    { 0x046C, 0x006C, 257, 115, 47683, 47690, 43072, 43089, 43053, 43053, 45864, { 0, 0, 0, 0 }, 174, 174, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x046F, 0x006F, 257, 38, 47720, 47726, 47750, 43120, 43124, 43093, 47781, { 43128, 0, 0, 0 }, 175, 175, { 1252, 20277, 10000, 850, 0, ';' } },\n    { 0x0470, 0x0070, 257, 75, 47784, 47790, 47790, 43163, 43167, 43155, 47611, { 0, 0, 0, 0 }, 176, 176, { 1252, 37, 10000, 437, 0, ',' } },\n    { 0x0478, 0x0078, 257, 20, 47805, 47811, 47830, 43195, 43199, 43171, 13711, { 43203, 0, 0, 0 }, 177, 177, { 0, 500, 2, 1, 0, ',' } },\n    { 0x047E, 0x007E, 257, 35, 47849, 47855, 47871, 43236, 43240, 43216, 44030, { 43244, 0, 0, 0 }, 178, 178, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x0485, 0x0085, 257, 93, 47890, 47897, 43339, 43357, 43329, 43329, 44674, { 0, 0, 0, 0 }, 179, 179, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x0487, 0x0087, 257, 94, 47912, 47918, 47918, 43376, 43380, 43361, 47939, { 0, 0, 0, 0 }, 180, 180, { 1252, 37, 10000, 437, 0, ';' } },\n    { 0x0491, 0x0091, 257, 36, 47942, 47948, 47981, 43413, 43417, 43384, 47039, { 43421, 0, 0, 0 }, 181, 181, { 1252, 20285, 10000, 850, 0, ',' } },\n    { 0x0801, 0x0001, 257, 49, 48017, 48023, 48037, 48067, 38097, 38068, 48071, { 48074, 0, 0, 0 }, 182, 182, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x0804, 0x0004, 257, 20, 48106, 38326, 48112, 38300, 38304, 38308, 13711, { 38311, 0, 0, 0 }, 183, 183, { 936, 500, 10008, 936, 0, ',' } },\n    { 0x0807, 0x0007, 257, 18, 48128, 48134, 48155, 48173, 38467, 38445, 13632, { 38471, 0, 0, 0 }, 184, 184, { 1252, 20273, 10000, 850, 0, ';' } },\n    { 0x0809, 0x0009, 257, 36, 48177, 48183, 48183, 48208, 38587, 38572, 47039, { 38591, 0, 0, 0 }, 185, 185, { 1252, 20285, 10000, 850, 0, ',' } },\n    { 0x080A, 0x000A, 257, 74, 48212, 48218, 48235, 48254, 38634, 38610, 48258, { 38945, 0, 0, 0 }, 186, 186, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x080C, 0x000C, 257, 10, 48261, 48267, 48284, 48305, 38734, 38710, 48309, { 38738, 0, 0, 0 }, 187, 187, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x0810, 0x0010, 257, 18, 48312, 48318, 48340, 48360, 38941, 38917, 13632, { 38945, 0, 0, 0 }, 188, 188, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0813, 0x0013, 257, 10, 48364, 48370, 48386, 48407, 39086, 39062, 48309, { 39090, 0, 0, 0 }, 189, 189, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x0814, 0x7814, 257, 78, 48411, 48417, 48444, 48460, 48464, 48468, 44433, { 38424, 0, 0, 0 }, 190, 190, { 1252, 20277, 10000, 850, 0, ';' } },\n    { 0x0816, 0x0016, 257, 88, 48471, 48477, 48499, 48521, 39220, 39191, 48525, { 39224, 0, 0, 0 }, 191, 191, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x081D, 0x001D, 257, 33, 48528, 48534, 48552, 48570, 39596, 39573, 43986, { 38424, 0, 0, 0 }, 192, 192, { 1252, 20278, 10000, 850, 0, ';' } },\n    { 0x082C, 0x742C, 257, 7, 48574, 48585, 45691, 48620, 40416, 40385, 45717, { 40420, 0, 0, 0 }, 193, 193, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x083C, 0x003C, 257, 46, 48624, 48630, 48646, 41057, 41061, 41040, 48662, { 41065, 0, 0, 0 }, 194, 194, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x0843, 0x7843, 257, 111, 48665, 48676, 46364, 41357, 41361, 41337, 46390, { 48705, 0, 0, 0 }, 195, 195, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x0845, 0x0045, 257, 9, 48743, 48749, 48770, 48813, 41416, 41385, 48817, { 41420, 0, 0, 0 }, 196, 196, { 0, 500, 2, 1, 0, ',' } },\n    { 0x0C01, 0x0001, 257, 30, 48820, 48826, 48841, 48865, 38097, 38068, 48869, { 48074, 0, 0, 0 }, 197, 197, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x0C04, 0x7C04, 257, 41, 48872, 48878, 48921, 48958, 38304, 38308, 48962, { 43700, 0, 0, 0 }, 198, 198, { 950, 500, 10002, 950, 0, ',' } },\n    { 0x0C07, 0x0007, 257, 5, 48965, 48971, 48988, 49010, 38467, 38445, 49014, { 38471, 0, 0, 0 }, 199, 199, { 1252, 20273, 10000, 850, 0, ';' } },\n    { 0x0C09, 0x0009, 257, 6, 49017, 49023, 49023, 49043, 38587, 38572, 49047, { 38591, 0, 0, 0 }, 200, 200, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x0C0A, 0x000A, 257, 31, 49050, 49056, 49072, 49091, 38634, 38610, 43646, { 38638, 0, 0, 0 }, 201, 201, { 1252, 20284, 10000, 850, 0, ';' } },\n    { 0x0C0C, 0x000C, 257, 17, 49095, 49101, 49117, 49136, 38734, 38710, 49140, { 49143, 0, 0, 0 }, 202, 202, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x0C3B, 0x003B, 257, 33, 49165, 49171, 49195, 49221, 49225, 40979, 43986, { 41021, 0, 0, 0 }, 203, 203, { 1252, 20278, 10000, 850, 0, ';' } },\n    { 0x1001, 0x0001, 257, 67, 49229, 49235, 49250, 49278, 38097, 38068, 49282, { 48074, 0, 0, 0 }, 204, 204, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x1004, 0x0004, 257, 97, 49285, 49291, 49323, 49342, 38304, 38308, 49346, { 38311, 0, 0, 0 }, 205, 205, { 936, 500, 10008, 936, 0, ',' } },\n    { 0x1007, 0x0007, 257, 65, 49349, 49355, 49375, 49395, 38467, 38445, 49399, { 38471, 0, 0, 0 }, 206, 206, { 1252, 20273, 10000, 850, 0, ';' } },\n    { 0x1009, 0x0009, 257, 17, 49402, 49408, 49408, 49425, 38587, 38572, 49140, { 38591, 0, 0, 0 }, 207, 207, { 1252, 37, 10000, 850, 0, ',' } },\n    { 0x100A, 0x000A, 257, 40, 49429, 49435, 49455, 49476, 38634, 38610, 49480, { 38638, 0, 0, 0 }, 208, 208, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x100C, 0x000C, 257, 18, 49483, 49489, 49510, 49529, 38734, 38710, 13632, { 38738, 0, 0, 0 }, 209, 209, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x101A, 0x001A, 257, 8, 49533, 49539, 49573, 49604, 49608, 39424, 49612, { 39453, 0, 0, 0 }, 210, 210, { 1250, 870, 10082, 852, 0, ';' } },\n    { 0x1401, 0x0001, 257, 27, 49615, 49621, 49638, 49670, 38097, 38068, 49674, { 48074, 0, 0, 0 }, 211, 211, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x1404, 0x7C04, 257, 72, 49677, 49683, 49722, 49759, 38304, 38308, 49763, { 43700, 0, 0, 0 }, 212, 212, { 950, 500, 10002, 950, 0, ',' } },\n    { 0x1407, 0x0007, 257, 62, 49766, 49772, 49795, 49819, 38467, 38445, 49823, { 38471, 0, 0, 0 }, 213, 213, { 1252, 20273, 10000, 850, 0, ';' } },\n    { 0x1409, 0x0009, 257, 80, 49826, 49832, 49832, 49854, 38587, 38572, 49858, { 38591, 0, 0, 0 }, 214, 214, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x140A, 0x000A, 257, 22, 49861, 49867, 49888, 49910, 38634, 38610, 49914, { 38638, 0, 0, 0 }, 215, 215, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x140C, 0x000C, 257, 65, 49917, 49923, 49943, 49966, 38734, 38710, 49399, { 38738, 0, 0, 0 }, 216, 216, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x141A, 0x681A, 257, 8, 49970, 49981, 50021, 50052, 50056, 50060, 49612, { 50063, 0, 0, 0 }, 217, 217, { 1250, 870, 10082, 852, 0, ';' } },\n    { 0x1801, 0x0001, 257, 68, 50086, 50092, 50109, 50139, 38097, 38068, 50143, { 48074, 0, 0, 0 }, 218, 218, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x1809, 0x0009, 257, 46, 50146, 50152, 50152, 50170, 38587, 38572, 48662, { 38591, 0, 0, 0 }, 219, 219, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x180A, 0x000A, 257, 82, 50174, 50180, 50197, 50216, 38634, 38610, 50220, { 38638, 0, 0, 0 }, 220, 220, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x180C, 0x000C, 257, 69, 50223, 50229, 50245, 50264, 38734, 38710, 50268, { 38738, 0, 0, 0 }, 221, 221, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x181A, 0x701A, 257, 8, 50271, 50282, 50322, 50374, 50378, 50382, 49612, { 50063, 0, 0, 0 }, 222, 222, { 1250, 870, 10082, 852, 0, ';' } },\n    { 0x1C01, 0x0001, 257, 104, 50385, 50391, 50408, 50434, 38097, 38068, 50438, { 48074, 0, 0, 0 }, 223, 223, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x1C09, 0x0009, 257, 115, 50441, 50447, 50447, 50470, 38587, 38572, 45864, { 38591, 0, 0, 0 }, 224, 224, { 1252, 500, 10000, 437, 0, ',' } },\n    { 0x1C0A, 0x000A, 257, 26, 50474, 50480, 50509, 50542, 38634, 38610, 50546, { 38638, 0, 0, 0 }, 225, 225, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x1C1A, 0x6C1A, 257, 8, 50549, 50560, 50322, 50603, 50607, 50382, 49612, { 40528, 0, 0, 0 }, 226, 226, { 1251, 21025, 10007, 855, 0, ';' } },\n    { 0x2001, 0x0001, 257, 81, 50611, 50617, 50631, 50659, 38097, 38068, 50663, { 48074, 0, 0, 0 }, 227, 227, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x2009, 0x0009, 257, 53, 50666, 50672, 50672, 50690, 38587, 38572, 50694, { 38591, 0, 0, 0 }, 228, 228, { 1252, 500, 10000, 850, 0, ',' } },\n    { 0x200A, 0x000A, 257, 112, 50697, 50703, 50723, 50744, 38634, 38610, 50748, { 38638, 0, 0, 0 }, 229, 229, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x201A, 0x641A, 257, 8, 50751, 50762, 50021, 50805, 50809, 50060, 49612, { 40528, 0, 0, 0 }, 230, 230, { 1251, 870, 10082, 855, 0, ';' } },\n    { 0x2401, 0x0001, 257, 114, 50813, 50819, 50834, 50862, 38097, 38068, 50866, { 48074, 0, 0, 0 }, 231, 231, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x240A, 0x000A, 257, 21, 50869, 50875, 50894, 50914, 38634, 38610, 50918, { 38638, 0, 0, 0 }, 232, 232, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x241A, 0x701A, 257, 92, 50921, 50932, 50956, 50984, 2130, 50382, 50988, { 50063, 0, 0, 0 }, 233, 233, { 1250, 500, 10029, 852, 0, ';' } },\n    { 0x2801, 0x0001, 257, 101, 50991, 50997, 51012, 51040, 38097, 38068, 51044, { 48074, 0, 0, 0 }, 234, 234, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x2809, 0x0009, 257, 16, 51047, 51053, 51053, 51070, 38587, 38572, 51074, { 38591, 0, 0, 0 }, 235, 235, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x280A, 0x000A, 257, 83, 51077, 51083, 51098, 51115, 38634, 38610, 51119, { 38638, 0, 0, 0 }, 236, 236, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x281A, 0x6C1A, 257, 92, 51122, 51133, 50956, 51160, 2130, 50382, 50988, { 40528, 0, 0, 0 }, 237, 237, { 1251, 21025, 10007, 855, 0, ';' } },\n    { 0x2C01, 0x0001, 257, 54, 51164, 51170, 51186, 51216, 38097, 38068, 51220, { 48074, 0, 0, 0 }, 238, 238, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x2C09, 0x0009, 257, 106, 51223, 51229, 51229, 51259, 38587, 38572, 51263, { 38591, 0, 0, 0 }, 239, 239, { 1252, 500, 10000, 850, 0, ';' } },\n    { 0x2C0A, 0x000A, 257, 4, 51266, 51272, 51292, 51313, 38634, 38610, 51317, { 38638, 0, 0, 0 }, 240, 240, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x2C1A, 0x701A, 257, 70, 51320, 51331, 51359, 51392, 2130, 50382, 51396, { 50063, 0, 0, 0 }, 241, 241, { 1250, 500, 10029, 852, 0, ';' } },\n    { 0x3001, 0x0001, 257, 61, 51399, 51405, 51422, 51450, 38097, 38068, 51454, { 48074, 0, 0, 0 }, 242, 242, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x3009, 0x0009, 257, 116, 51457, 51463, 51463, 51482, 38587, 38572, 51486, { 38591, 0, 0, 0 }, 243, 243, { 1252, 500, 10000, 437, 0, ',' } },\n    { 0x300A, 0x000A, 257, 28, 51489, 51495, 51513, 51532, 38634, 38610, 51536, { 38638, 0, 0, 0 }, 244, 244, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x301A, 0x6C1A, 257, 70, 51539, 51550, 51359, 51581, 2130, 50382, 51396, { 40528, 0, 0, 0 }, 245, 245, { 1251, 21025, 10007, 855, 0, ';' } },\n    { 0x3401, 0x0001, 257, 59, 51585, 51591, 51607, 51637, 38097, 38068, 51641, { 48074, 0, 0, 0 }, 246, 246, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x3409, 0x0009, 257, 84, 51644, 51650, 51650, 51672, 38587, 38572, 47557, { 38591, 0, 0, 0 }, 247, 247, { 1252, 500, 10000, 437, 0, ',' } },\n    { 0x340A, 0x000A, 257, 19, 51676, 51682, 51698, 51715, 38634, 38610, 51719, { 38638, 0, 0, 0 }, 248, 248, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x3801, 0x0001, 257, 0, 51722, 51728, 51758, 51822, 38097, 38068, 51826, { 48074, 0, 0, 0 }, 249, 249, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x380A, 0x000A, 257, 110, 51829, 51835, 51853, 51872, 38634, 38610, 51876, { 38638, 0, 0, 0 }, 250, 250, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x3C01, 0x0001, 257, 12, 51879, 51885, 51902, 51934, 38097, 38068, 51938, { 48074, 0, 0, 0 }, 251, 251, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x3C0A, 0x000A, 257, 89, 51941, 51947, 51966, 51986, 38634, 38610, 51990, { 38638, 0, 0, 0 }, 252, 252, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x4001, 0x0001, 257, 90, 51993, 51999, 52014, 52038, 38097, 38068, 52042, { 48074, 0, 0, 0 }, 253, 253, { 1256, 20420, 10004, 720, 1, ';' } },\n    { 0x4009, 0x0009, 257, 48, 52045, 52051, 52051, 52067, 38587, 38572, 46188, { 38591, 0, 0, 0 }, 254, 254, { 1252, 37, 10000, 437, 0, ',' } },\n    { 0x400A, 0x000A, 257, 13, 52071, 52077, 52095, 52114, 38634, 38610, 52118, { 38638, 0, 0, 0 }, 255, 255, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x440A, 0x000A, 257, 100, 52121, 52127, 52149, 52172, 38634, 38610, 52176, { 38638, 0, 0, 0 }, 256, 256, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x4809, 0x0009, 257, 97, 52179, 52185, 52185, 52205, 38587, 38572, 49346, { 38591, 0, 0, 0 }, 257, 257, { 1252, 37, 10000, 437, 0, ',' } },\n    { 0x480A, 0x000A, 257, 42, 52209, 52215, 52234, 52254, 38634, 38610, 52258, { 38638, 0, 0, 0 }, 258, 258, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x4C0A, 0x000A, 257, 76, 52261, 52267, 52287, 52308, 38634, 38610, 52312, { 38638, 0, 0, 0 }, 259, 259, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x500A, 0x000A, 257, 87, 52315, 52321, 52343, 52366, 38634, 38610, 52370, { 38638, 0, 0, 0 }, 260, 260, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x540A, 0x000A, 257, 109, 52373, 52379, 52403, 52429, 38634, 38610, 43945, { 38638, 0, 0, 0 }, 261, 261, { 1252, 20284, 10000, 850, 0, ',' } },\n    { 0x641A, 0x781A, 257, -1, 52433, 52441, 52460, 50805, 50809, 50060, 0, { 40528, 0, 0, 0 }, 262, 262, { 1251, 870, 10082, 855, 0, ';' } },\n    { 0x681A, 0x781A, 257, -1, 52469, 52477, 52460, 50052, 50056, 50060, 0, { 50063, 0, 0, 0 }, 263, 263, { 1250, 870, 10082, 852, 0, ';' } },\n    { 0x6C1A, 0x7C1A, 257, -1, 52493, 52501, 52520, 51160, 2130, 50382, 0, { 40528, 0, 0, 0 }, 264, 264, { 1251, 21025, 10007, 855, 0, ';' } },\n    { 0x701A, 0x7C1A, 257, -1, 52533, 52541, 52520, 50984, 2130, 50382, 0, { 50063, 0, 0, 0 }, 265, 265, { 1250, 500, 10029, 852, 0, ';' } },\n    { 0x742C, 0x002C, 257, -1, 52557, 52565, 40400, 48620, 40416, 40385, 0, { 40420, 0, 0, 0 }, 266, 266, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x7804, 0x007F, 257, -1, 38308, 38326, 38293, 38300, 38304, 38308, 0, { 38311, 0, 0, 0 }, 267, 267, { 936, 500, 10008, 936, 0, ',' } },\n    { 0x7814, 0x0014, 257, -1, 48468, 52588, 52606, 48460, 48464, 48468, 0, { 38424, 0, 0, 0 }, 268, 268, { 1252, 20277, 10000, 850, 0, ';' } },\n    { 0x781A, 0x007F, 257, -1, 50060, 52614, 52460, 50052, 50056, 50060, 0, { 50063, 0, 0, 0 }, 269, 269, { 1250, 870, 10082, 852, 0, ';' } },\n    { 0x782C, 0x002C, 257, -1, 52622, 52630, 40400, 40412, 40416, 40385, 0, { 40420, 0, 0, 0 }, 270, 270, { 1254, 20905, 10081, 857, 0, ';' } },\n    { 0x7843, 0x0043, 257, -1, 52650, 52658, 41346, 41357, 41361, 41337, 0, { 48705, 0, 0, 0 }, 271, 271, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x7850, 0x0050, 257, -1, 52675, 52683, 42283, 52704, 42300, 42270, 0, { 42304, 0, 0, 0 }, 272, 272, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x7C04, 0x7804, 257, -1, 52708, 43655, 38293, 43693, 38304, 38308, 0, { 43700, 0, 0, 0 }, 273, 273, { 950, 500, 10002, 950, 0, ',' } },\n    { 0x7C04, 0x7C04, 257, -1, 52716, 52723, 38293, 43693, 38304, 38308, 0, { 43700, 0, 0, 0 }, 274, 274, { 950, 500, 10002, 950, 0, ',' } },\n    { 0x7C14, 0x0014, 257, -1, 39139, 52752, 52770, 39131, 39135, 39139, 0, { 38424, 0, 0, 0 }, 275, 275, { 1252, 20277, 10000, 850, 0, ';' } },\n    { 0x7C1A, 0x007F, 257, -1, 50382, 52784, 52520, 52792, 2130, 50382, 0, { 40528, 0, 0, 0 }, 276, 276, { 1250, 500, 10029, 852, 0, ';' } },\n    { 0x7C28, 0x0028, 257, -1, 52796, 52804, 40197, 40210, 40214, 40188, 0, { 0, 0, 0, 0 }, 277, 277, { 1251, 20880, 10007, 866, 0, ';' } },\n    { 0x7C43, 0x0043, 257, -1, 52821, 52829, 41346, 41357, 41361, 41337, 0, { 41365, 0, 0, 0 }, 278, 278, { 1254, 500, 10029, 857, 0, ';' } },\n    { 0x7C5F, 0x005F, 257, -1, 52843, 52852, 42838, 42848, 42810, 42810, 0, { 0, 0, 0, 0 }, 279, 279, { 1252, 20297, 10000, 850, 0, ';' } },\n    { 0x7C68, 0x0068, 257, -1, 52884, 52892, 43006, 43012, 43016, 43003, 0, { 0, 0, 0, 0 }, 280, 280, { 1252, 37, 10000, 437, 0, ',' } }\n};\n\n\nstatic const CultureInfoNameEntry culture_name_entries[] =\n{\n    { 40670, 50 },   /* af */\n    { 52906, 144 },  /* af-za */\n    { 8022, 80 },    /* am */\n    { 52912, 168 },  /* am-et */\n    { 38068, 0 },    /* ar */\n    { 52918, 249 },  /* ar-ae */\n    { 52924, 251 },  /* ar-bh */\n    { 52930, 211 },  /* ar-dz */\n    { 52936, 197 },  /* ar-eg */\n    { 52942, 182 },  /* ar-iq */\n    { 52948, 238 },  /* ar-jo */\n    { 52954, 246 },  /* ar-kw */\n    { 52960, 242 },  /* ar-lb */\n    { 52966, 204 },  /* ar-ly */\n    { 52972, 218 },  /* ar-ma */\n    { 52978, 227 },  /* ar-om */\n    { 52984, 253 },  /* ar-qa */\n    { 52990, 96 },   /* ar-sa */\n    { 52996, 234 },  /* ar-sy */\n    { 53002, 223 },  /* ar-tn */\n    { 53008, 231 },  /* ar-ye */\n    { 42082, 70 },   /* as */\n    { 53014, 159 },  /* as-in */\n    { 40385, 44 },   /* az */\n    { 53020, 266 },  /* az-cyrl */\n    { 53028, 193 },  /* az-cyrl-az */\n    { 53039, 270 },  /* az-latn */\n    { 53047, 138 },  /* az-latn-az */\n    { 39897, 35 },   /* be */\n    { 53058, 129 },  /* be-by */\n    { 38129, 1 },    /* bg */\n    { 53064, 97 },   /* bg-bg */\n    { 41385, 62 },   /* bn */\n    { 53070, 196 },  /* bn-bd */\n    { 53076, 152 },  /* bn-in */\n    { 42336, 73 },   /* bo */\n    { 53082, 161 },  /* bo-cn */\n    { 43216, 91 },   /* br */\n    { 53088, 178 },  /* br-fr */\n    { 50060, 269 },  /* bs */\n    { 53094, 262 },  /* bs-cyrl */\n    { 53102, 230 },  /* bs-cyrl-ba */\n    { 53113, 263 },  /* bs-latn */\n    { 53121, 217 },  /* bs-latn-ba */\n    { 38211, 2 },    /* ca */\n    { 53132, 98 },   /* ca-es */\n    { 38347, 5 },    /* cs */\n    { 53138, 100 },  /* cs-cz */\n    { 42380, 74 },   /* cy */\n    { 53144, 162 },  /* cy-gb */\n    { 38400, 6 },    /* da */\n    { 53150, 101 },  /* da-dk */\n    { 38445, 7 },    /* de */\n    { 53156, 199 },  /* de-at */\n    { 53162, 184 },  /* de-ch */\n    { 53168, 102 },  /* de-de */\n    { 53174, 213 },  /* de-li */\n    { 53180, 206 },  /* de-lu */\n    { 38496, 8 },    /* el */\n    { 53186, 103 },  /* el-gr */\n    { 38572, 9 },    /* en */\n    { 53192, 200 },  /* en-au */\n    { 53198, 235 },  /* en-bz */\n    { 53204, 207 },  /* en-ca */\n    { 53210, 185 },  /* en-gb */\n    { 53216, 219 },  /* en-ie */\n    { 53222, 254 },  /* en-in */\n    { 53228, 228 },  /* en-jm */\n    { 53234, 214 },  /* en-nz */\n    { 53240, 247 },  /* en-ph */\n    { 53246, 257 },  /* en-sg */\n    { 53252, 239 },  /* en-tt */\n    { 53258, 104 },  /* en-us */\n    { 53264, 224 },  /* en-za */\n    { 53270, 243 },  /* en-zw */\n    { 38610, 10 },   /* es */\n    { 53276, 240 },  /* es-ar */\n    { 53282, 255 },  /* es-bo */\n    { 53288, 248 },  /* es-cl */\n    { 53294, 232 },  /* es-co */\n    { 53300, 215 },  /* es-cr */\n    { 53306, 225 },  /* es-do */\n    { 53312, 244 },  /* es-ec */\n    { 53318, 201 },  /* es-es */\n    { 53324, 208 },  /* es-gt */\n    { 53330, 258 },  /* es-hn */\n    { 53336, 186 },  /* es-mx */\n    { 53342, 259 },  /* es-ni */\n    { 53348, 220 },  /* es-pa */\n    { 53354, 236 },  /* es-pe */\n    { 53360, 260 },  /* es-pr */\n    { 53366, 252 },  /* es-py */\n    { 53372, 256 },  /* es-sv */\n    { 53378, 261 },  /* es-us */\n    { 53384, 250 },  /* es-uy */\n    { 53390, 229 },  /* es-ve */\n    { 40039, 37 },   /* et */\n    { 53396, 131 },  /* et-ee */\n    { 40439, 45 },   /* eu */\n    { 53402, 139 },  /* eu-es */\n    { 40218, 41 },   /* fa */\n    { 53408, 135 },  /* fa-ir */\n    { 38660, 11 },   /* fi */\n    { 53414, 105 },  /* fi-fi */\n    { 42963, 84 },   /* fil */\n    { 53420, 171 },  /* fil-ph */\n    { 40818, 52 },   /* fo */\n    { 53427, 146 },  /* fo-fo */\n    { 38710, 12 },   /* fr */\n    { 53433, 187 },  /* fr-be */\n    { 53439, 202 },  /* fr-ca */\n    { 53445, 209 },  /* fr-ch */\n    { 53451, 106 },  /* fr-fr */\n    { 53457, 216 },  /* fr-lu */\n    { 53463, 221 },  /* fr-mc */\n    { 41040, 56 },   /* ga */\n    { 53469, 194 },  /* ga-ie */\n    { 43384, 95 },   /* gd */\n    { 53475, 181 },  /* gd-gb */\n    { 42580, 77 },   /* gl */\n    { 53481, 165 },  /* gl-es */\n    { 43264, 92 },   /* gsw */\n    { 41570, 64 },   /* gu */\n    { 53487, 153 },  /* gu-in */\n    { 43003, 85 },   /* ha */\n    { 53493, 280 },  /* ha-latn */\n    { 53501, 172 },  /* ha-latn-ng */\n    { 38760, 13 },   /* he */\n    { 53512, 107 },  /* he-il */\n    { 40847, 53 },   /* hi */\n    { 53518, 147 },  /* hi-in */\n    { 39424, 26 },   /* hr */\n    { 53524, 210 },  /* hr-ba */\n    { 53530, 120 },  /* hr-hr */\n    { 38822, 14 },   /* hu */\n    { 53536, 108 },  /* hu-hu */\n    { 40320, 43 },   /* hy */\n    { 53542, 137 },  /* hy-am */\n    { 39751, 33 },   /* id */\n    { 53548, 127 },  /* id-id */\n    { 43155, 89 },   /* ig */\n    { 53554, 176 },  /* ig-ng */\n    { 43171, 90 },   /* ii */\n    { 53560, 177 },  /* ii-cn */\n    { 38866, 15 },   /* is */\n    { 53566, 109 },  /* is-is */\n    { 38917, 16 },   /* it */\n    { 53572, 188 },  /* it-ch */\n    { 53578, 110 },  /* it-it */\n    { 38967, 17 },   /* ja */\n    { 53584, 111 },  /* ja-jp */\n    { 40711, 51 },   /* ka */\n    { 53590, 145 },  /* ka-ge */\n    { 41134, 58 },   /* kk */\n    { 43093, 88 },   /* kl */\n    { 53596, 175 },  /* kl-gl */\n    { 42421, 75 },   /* km */\n    { 53602, 163 },  /* km-kh */\n    { 37319, 68 },   /* kn */\n    { 53608, 157 },  /* kn-in */\n    { 39024, 18 },   /* ko */\n    { 53614, 112 },  /* ko-kr */\n    { 42607, 78 },   /* kok */\n    { 53620, 166 },  /* kok-in */\n    { 41214, 59 },   /* ky */\n    { 42509, 76 },   /* lo */\n    { 53627, 164 },  /* lo-la */\n    { 40133, 39 },   /* lt */\n    { 53633, 133 },  /* lt-lt */\n    { 40085, 38 },   /* lv */\n    { 53639, 132 },  /* lv-lv */\n    { 40485, 46 },   /* mk */\n    { 53645, 140 },  /* mk-mk */\n    { 41998, 69 },   /* ml */\n    { 53651, 158 },  /* ml-in */\n    { 42270, 72 },   /* mn */\n    { 53657, 272 },  /* mn-cyrl */\n    { 42177, 71 },   /* mr */\n    { 53665, 160 },  /* mr-in */\n    { 41086, 57 },   /* ms */\n    { 40933, 54 },   /* mt */\n    { 53671, 148 },  /* mt-mt */\n    { 39139, 275 },  /* nb */\n    { 53677, 114 },  /* nb-no */\n    { 1883, 82 },    /* ne */\n    { 53683, 169 },  /* ne-np */\n    { 39062, 19 },   /* nl */\n    { 53689, 189 },  /* nl-be */\n    { 53695, 113 },  /* nl-nl */\n    { 48468, 268 },  /* nn */\n    { 53701, 190 },  /* nn-no */\n    { 39112, 20 },   /* no */\n    { 43053, 87 },   /* nso */\n    { 53707, 174 },  /* nso-za */\n    { 41668, 65 },   /* or */\n    { 53714, 154 },  /* or-in */\n    { 41485, 63 },   /* pa */\n    { 39142, 21 },   /* pl */\n    { 53720, 115 },  /* pl-pl */\n    { 42936, 83 },   /* ps */\n    { 53726, 170 },  /* ps-af */\n    { 39191, 22 },   /* pt */\n    { 53732, 116 },  /* pt-br */\n    { 53738, 191 },  /* pt-pt */\n    { 39247, 23 },   /* rm */\n    { 53744, 117 },  /* rm-ch */\n    { 39296, 24 },   /* ro */\n    { 53750, 118 },  /* ro-ro */\n    { 39344, 25 },   /* ru */\n    { 53756, 119 },  /* ru-ru */\n    { 43361, 94 },   /* rw */\n    { 53762, 180 },  /* rw-rw */\n    { 43329, 93 },   /* sah */\n    { 53768, 179 },  /* sah-ru */\n    { 40979, 55 },   /* se */\n    { 53775, 203 },  /* se-fi */\n    { 53781, 149 },  /* se-no */\n    { 42642, 79 },   /* si */\n    { 53787, 167 },  /* si-lk */\n    { 12674, 27 },   /* sk */\n    { 53793, 121 },  /* sk-sk */\n    { 39982, 36 },   /* sl */\n    { 53799, 130 },  /* sl-si */\n    { 39527, 28 },   /* sq */\n    { 53805, 122 },  /* sq-al */\n    { 50382, 276 },  /* sr */\n    { 53811, 264 },  /* sr-cyrl */\n    { 53819, 226 },  /* sr-cyrl-ba */\n    { 53830, 245 },  /* sr-cyrl-me */\n    { 53841, 237 },  /* sr-cyrl-rs */\n    { 53852, 265 },  /* sr-latn */\n    { 53860, 222 },  /* sr-latn-ba */\n    { 53871, 241 },  /* sr-latn-me */\n    { 53882, 233 },  /* sr-latn-rs */\n    { 39573, 29 },   /* sv */\n    { 53893, 192 },  /* sv-fi */\n    { 53899, 123 },  /* sv-se */\n    { 41287, 60 },   /* sw */\n    { 53905, 150 },  /* sw-ke */\n    { 41701, 66 },   /* ta */\n    { 53911, 155 },  /* ta-in */\n    { 41799, 67 },   /* te */\n    { 53917, 156 },  /* te-in */\n    { 40188, 40 },   /* tg */\n    { 53923, 277 },  /* tg-cyrl */\n    { 53931, 134 },  /* tg-cyrl-tj */\n    { 39600, 30 },   /* th */\n    { 53942, 124 },  /* th-th */\n    { 40572, 47 },   /* tn */\n    { 53948, 141 },  /* tn-za */\n    { 12683, 31 },   /* tr */\n    { 53954, 125 },  /* tr-tr */\n    { 42810, 81 },   /* tzm */\n    { 53960, 279 },  /* tzm-latn */\n    { 39809, 34 },   /* uk */\n    { 53969, 128 },  /* uk-ua */\n    { 39696, 32 },   /* ur */\n    { 53975, 126 },  /* ur-pk */\n    { 41337, 61 },   /* uz */\n    { 53981, 271 },  /* uz-cyrl */\n    { 53989, 195 },  /* uz-cyrl-uz */\n    { 54000, 278 },  /* uz-latn */\n    { 54008, 151 },  /* uz-latn-uz */\n    { 40272, 42 },   /* vi */\n    { 54019, 136 },  /* vi-vn */\n    { 40599, 48 },   /* xh */\n    { 54025, 142 },  /* xh-za */\n    { 43020, 86 },   /* yo */\n    { 54031, 173 },  /* yo-ng */\n    { 38308, 267 },  /* zh */\n    { 54037, 3 },    /* zh-chs */\n    { 54044, 274 },  /* zh-cht */\n    { 54051, 183 },  /* zh-cn */\n    { 54057, 4 },    /* zh-hans */\n    { 54065, 273 },  /* zh-hant */\n    { 54073, 198 },  /* zh-hk */\n    { 54079, 212 },  /* zh-mo */\n    { 54085, 205 },  /* zh-sg */\n    { 54091, 99 },   /* zh-tw */\n    { 40625, 49 },   /* zu */\n    { 54097, 143 }   /* zu-za */\n};\n\n\nstatic const RegionInfoEntry region_entries[] =\n{\n    { 224, 51826, 48865, 48865, 54103, 54124, 38011, 54171, 54175, 54203 },\n    { 3, 47503, 54227, 54227, 54231, 54243, 37782, 54262, 54266, 54281 },\n    { 6, 44819, 54294, 54294, 54298, 54306, 37322, 54316, 54320, 54333 },\n    { 7, 1820, 50139, 50139, 54347, 54355, 37563, 54372, 54376, 54390 },\n    { 11, 51317, 49670, 49670, 54416, 54416, 37073, 51040, 54426, 54441 },\n    { 14, 49014, 54456, 54456, 54460, 54468, 36969, 54480, 54484, 54484 },\n    { 12, 49047, 54489, 54489, 54493, 54493, 37073, 54503, 54507, 54507 },\n    { 5, 45717, 40412, 40412, 54525, 54536, 37817, 54548, 54552, 54570 },\n    { 25, 49612, 54590, 54590, 54594, 54617, 37879, 54637, 54641, 54677 },\n    { 23, 48817, 54697, 54697, 54701, 54712, 37855, 54737, 54741, 54758 },\n    { 21, 48309, 39932, 39932, 54799, 54807, 36969, 54480, 54484, 54816 },\n    { 35, 43603, 38161, 38161, 54821, 54830, 36951, 54847, 54851, 54865 },\n    { 17, 51938, 54891, 54891, 54895, 54903, 38021, 54918, 54922, 54937 },\n    { 26, 52118, 54961, 54961, 54965, 54965, 38045, 42372, 54973, 54992 },\n    { 32, 44523, 55002, 55002, 55006, 55013, 37210, 55020, 55024, 55039 },\n    { 29, 45205, 55055, 55055, 55059, 55067, 37425, 55084, 55088, 55105 },\n    { 24, 51074, 55137, 55137, 55141, 55141, 37073, 55148, 55152, 55152 },\n    { 39, 49140, 55166, 55166, 55170, 55170, 37073, 55177, 55181, 55197 },\n    { 223, 13632, 55213, 55213, 55217, 55229, 37217, 37217, 55236, 55248 },\n    { 46, 51719, 55262, 55262, 55266, 55266, 37073, 55272, 55276, 55289 },\n    { 45, 13711, 55302, 55302, 55306, 55312, 36990, 55331, 55335, 55348 },\n    { 51, 50918, 55367, 55367, 55371, 55371, 37073, 55380, 55384, 55399 },\n    { 54, 49914, 55415, 55415, 55419, 55419, 37897, 55430, 55434, 55453 },\n    { 75, 43766, 55474, 55474, 55478, 55493, 36993, 55511, 55515, 55537 },\n    { 94, 43856, 38463, 38463, 55552, 55560, 36969, 54480, 54484, 54484 },\n    { 61, 43808, 55572, 55572, 55576, 55584, 37021, 55592, 55596, 55609 },\n    { 65, 50546, 55621, 55621, 55625, 55644, 37073, 55666, 55670, 55685 },\n    { 4, 49674, 55701, 55701, 55705, 55713, 37882, 55728, 55732, 55747 },\n    { 66, 51536, 55771, 55771, 55775, 55775, 37073, 55783, 55787, 55797 },\n    { 70, 45303, 52429, 52429, 55819, 55827, 36969, 54480, 54484, 54816 },\n    { 67, 48869, 55833, 55833, 55837, 55843, 37859, 55850, 55854, 55869 },\n    { 217, 43646, 38630, 38630, 55887, 55893, 36969, 54480, 54484, 54816 },\n    { 73, 47382, 55901, 55901, 55905, 55914, 37762, 55930, 55934, 55949 },\n    { 77, 43986, 38677, 38677, 55975, 55983, 36969, 54480, 54484, 54816 },\n    { 81, 46134, 55989, 55989, 55993, 56007, 37021, 55592, 55596, 56016 },\n    { 84, 44030, 38730, 38730, 56029, 56029, 36969, 54480, 54484, 54816 },\n    { 242, 47039, 56036, 56036, 56040, 56055, 37706, 56072, 56076, 56099 },\n    { 88, 46080, 56121, 56121, 56125, 56133, 0, 56164, 56168, 56182 },\n    { 93, 47781, 56217, 56217, 56221, 56231, 37021, 55592, 55596, 56248 },\n    { 98, 43912, 56268, 56268, 56272, 56279, 36969, 54480, 54484, 56292 },\n    { 99, 49480, 56301, 56301, 56305, 56305, 7920, 56315, 56319, 56338 },\n    { 104, 48962, 56359, 56359, 56363, 56383, 37073, 56411, 56415, 56432 },\n    { 106, 52258, 56439, 56439, 56443, 56443, 2308, 56452, 56456, 56473 },\n    { 108, 44722, 39445, 39445, 56492, 56500, 37319, 56509, 56513, 56527 },\n    { 109, 44131, 38842, 38842, 56541, 56549, 37128, 56563, 56567, 56584 },\n    { 111, 45068, 56598, 56598, 56602, 56602, 37401, 56612, 56616, 56634 },\n    { 68, 48662, 56651, 56651, 56655, 56663, 36969, 54480, 54484, 54484 },\n    { 117, 44079, 56669, 56669, 56673, 56680, 37119, 56691, 56695, 56714 },\n    { 113, 46188, 39782, 39782, 56721, 56727, 37642, 56740, 56744, 56757 },\n    { 121, 48071, 56792, 56792, 56796, 56801, 37828, 56814, 56818, 56830 },\n    { 116, 45528, 56852, 56852, 56856, 56861, 37517, 56872, 56876, 56889 },\n    { 110, 44180, 38889, 38889, 56909, 56917, 37021, 56925, 56929, 56946 },\n    { 118, 44223, 38937, 38937, 56962, 56968, 36969, 54480, 54484, 54484 },\n    { 124, 50694, 56975, 56975, 56979, 56979, 37073, 56987, 56991, 56991 },\n    { 126, 51220, 57007, 57007, 57011, 57018, 37981, 57031, 57035, 57051 },\n    { 122, 44268, 38989, 38989, 57073, 57079, 37141, 57086, 57090, 57103 },\n    { 129, 46324, 57113, 57113, 57117, 57117, 37666, 57123, 57127, 57143 },\n    { 40, 47105, 42446, 42446, 57161, 57170, 37709, 57192, 57196, 57211 },\n    { 134, 44323, 39044, 39044, 57243, 57255, 37145, 57268, 57272, 57289 },\n    { 136, 51641, 57306, 57306, 57310, 57317, 38001, 57330, 57334, 57348 },\n    { 138, 47147, 42526, 42526, 57370, 42516, 37713, 57375, 57379, 57391 },\n    { 139, 51454, 57411, 57411, 57415, 57423, 37991, 57434, 57438, 57453 },\n    { 145, 49823, 57475, 57475, 57479, 57479, 0, 37217, 55236, 57493 },\n    { 42, 47323, 57511, 57511, 57515, 57525, 37754, 57557, 57561, 57578 },\n    { 141, 45401, 57626, 57626, 57630, 57640, 37493, 57648, 57652, 57669 },\n    { 147, 49399, 57684, 57684, 57688, 57699, 36969, 54480, 54484, 54484 },\n    { 140, 45349, 57709, 57709, 57713, 57720, 36969, 54480, 54484, 57728 },\n    { 148, 49282, 57733, 57733, 57737, 57743, 37869, 57754, 57758, 57771 },\n    { 159, 50143, 42204, 42204, 57791, 57799, 37901, 57812, 57816, 57832 },\n    { 158, 50268, 57852, 57852, 57856, 57856, 36969, 54480, 54484, 54816 },\n    { 270, 51396, 57863, 57863, 57867, 57878, 36969, 54480, 54484, 57896 },\n    { 19618, 45833, 57901, 57901, 57905, 57915, 37588, 57901, 57936, 57953 },\n    { 151, 49763, 57985, 57985, 57989, 58005, 37892, 58033, 58037, 58053 },\n    { 163, 46227, 40950, 40950, 58063, 58063, 36969, 54480, 54484, 58069 },\n    { 166, 48258, 58074, 58074, 58078, 58085, 37073, 58093, 58097, 58110 },\n    { 175, 47611, 58124, 58124, 58128, 58136, 37789, 58145, 58149, 58164 },\n    { 182, 52312, 58170, 58170, 58174, 58174, 38048, 58184, 58188, 58208 },\n    { 176, 44375, 39082, 39082, 58231, 58243, 36969, 54480, 54484, 54484 },\n    { 177, 44433, 39131, 39131, 58253, 58260, 37021, 58266, 58270, 58286 },\n    { 178, 47443, 58300, 58300, 58304, 58310, 37769, 58326, 58330, 58345 },\n    { 183, 49858, 58386, 58386, 58390, 58390, 37073, 58402, 58406, 58406 },\n    { 164, 50663, 58425, 58425, 58429, 58434, 37930, 58445, 58449, 58460 },\n    { 192, 50220, 41515, 41515, 58480, 58487, 37911, 58495, 58499, 58517 },\n    { 187, 51119, 58534, 58534, 58538, 58543, 37969, 58549, 58553, 58572 },\n    { 201, 47557, 58590, 58590, 58594, 58606, 37785, 58616, 58620, 58620 },\n    { 190, 45007, 58636, 58636, 58640, 58649, 37343, 58664, 58668, 58684 },\n    { 191, 44474, 58712, 58712, 58716, 58723, 37168, 58730, 58734, 58747 },\n    { 202, 52370, 58761, 58761, 58765, 58765, 37073, 55783, 55787, 55797 },\n    { 193, 48525, 58777, 58777, 58781, 58781, 36969, 54480, 54484, 54484 },\n    { 185, 51990, 58790, 58790, 58794, 58794, 38031, 58803, 58807, 58826 },\n    { 197, 52042, 58845, 58845, 58849, 58855, 38035, 58862, 58866, 58878 },\n    { 200, 44618, 58896, 58896, 58900, 58908, 0, 58917, 58921, 58934 },\n    { 271, 50988, 52792, 52792, 58948, 58955, 37954, 58968, 58972, 58986 },\n    { 203, 44674, 39370, 39370, 58999, 59006, 37239, 59019, 59023, 59037 },\n    { 204, 47939, 59069, 59069, 59073, 59073, 37793, 59080, 59084, 0 },\n    { 205, 13629, 59098, 59098, 59102, 59115, 36893, 59162, 59166, 59178 },\n    { 221, 44863, 59198, 59198, 59202, 59209, 37021, 59217, 59221, 59235 },\n    { 215, 49346, 59248, 59248, 59252, 59262, 37073, 59272, 59276, 59293 },\n    { 212, 45261, 59306, 59306, 59310, 59319, 36969, 54480, 54484, 59329 },\n    { 143, 44773, 59334, 59334, 59338, 59347, 36969, 54480, 54484, 54484 },\n    { 72, 52176, 40009, 40009, 59357, 59357, 37073, 55783, 55787, 55797 },\n    { 222, 51044, 59369, 59369, 59373, 59379, 37959, 59390, 59394, 59407 },\n    { 227, 44910, 39618, 39618, 59427, 39608, 37335, 59436, 59440, 59450 },\n    { 228, 45480, 59469, 59469, 59473, 59484, 37810, 59505, 59509, 59528 },\n    { 234, 50438, 59541, 59541, 59545, 59553, 37915, 59562, 59566, 59581 },\n    { 235, 44956, 59602, 59602, 59606, 59613, 37339, 59622, 59626, 59639 },\n    { 225, 51263, 59653, 59653, 59657, 59657, 37073, 59677, 59681, 59681 },\n    { 237, 43697, 59708, 59708, 59712, 59719, 37796, 59726, 59730, 59748 },\n    { 241, 45135, 39843, 39843, 59758, 59766, 37404, 59781, 59785, 59803 },\n    { 244, 43945, 59837, 59837, 59841, 59841, 37073, 55783, 55787, 55787 },\n    { 246, 51876, 59855, 59855, 59859, 59859, 37073, 59867, 59871, 59886 },\n    { 247, 46390, 41357, 41357, 59900, 59911, 37822, 59924, 59928, 59943 },\n    { 249, 50748, 59962, 59962, 59966, 59966, 37940, 59976, 59980, 60000 },\n    { 251, 45586, 60020, 60020, 60024, 60032, 37559, 60043, 60047, 60063 },\n    { 261, 50866, 60082, 60082, 60086, 60092, 37944, 60103, 60107, 60119 },\n    { 209, 45864, 60137, 60137, 60141, 0, 10586, 60154, 60158, 0 },\n    { 264, 51486, 60177, 60177, 60181, 60181, 37073, 55783, 55787, 55787 }\n};\n\n\nstatic const RegionInfoNameEntry region_name_entries[] =\n{\n    { 51826, 0 },    /* AE */\n    { 47503, 1 },    /* AF */\n    { 44819, 2 },    /* AL */\n    { 1820, 3 },     /* AM */\n    { 51317, 4 },    /* AR */\n    { 49014, 5 },    /* AT */\n    { 49047, 6 },    /* AU */\n    { 45717, 7 },    /* AZ */\n    { 49612, 8 },    /* BA */\n    { 48817, 9 },    /* BD */\n    { 48309, 10 },   /* BE */\n    { 43603, 11 },   /* BG */\n    { 51938, 12 },   /* BH */\n    { 52118, 13 },   /* BO */\n    { 44523, 14 },   /* BR */\n    { 45205, 15 },   /* BY */\n    { 51074, 16 },   /* BZ */\n    { 49140, 17 },   /* CA */\n    { 13632, 18 },   /* CH */\n    { 51719, 19 },   /* CL */\n    { 13711, 20 },   /* CN */\n    { 50918, 21 },   /* CO */\n    { 49914, 22 },   /* CR */\n    { 43766, 23 },   /* CZ */\n    { 43856, 24 },   /* DE */\n    { 43808, 25 },   /* DK */\n    { 50546, 26 },   /* DO */\n    { 49674, 27 },   /* DZ */\n    { 51536, 28 },   /* EC */\n    { 45303, 29 },   /* EE */\n    { 48869, 30 },   /* EG */\n    { 43646, 31 },   /* ES */\n    { 47382, 32 },   /* ET */\n    { 43986, 33 },   /* FI */\n    { 46134, 34 },   /* FO */\n    { 44030, 35 },   /* FR */\n    { 47039, 36 },   /* GB */\n    { 46080, 37 },   /* GE */\n    { 47781, 38 },   /* GL */\n    { 43912, 39 },   /* GR */\n    { 49480, 40 },   /* GT */\n    { 48962, 41 },   /* HK */\n    { 52258, 42 },   /* HN */\n    { 44722, 43 },   /* HR */\n    { 44131, 44 },   /* HU */\n    { 45068, 45 },   /* ID */\n    { 48662, 46 },   /* IE */\n    { 44079, 47 },   /* IL */\n    { 46188, 48 },   /* IN */\n    { 48071, 49 },   /* IQ */\n    { 45528, 50 },   /* IR */\n    { 44180, 51 },   /* IS */\n    { 44223, 52 },   /* IT */\n    { 50694, 53 },   /* JM */\n    { 51220, 54 },   /* JO */\n    { 44268, 55 },   /* JP */\n    { 46324, 56 },   /* KE */\n    { 47105, 57 },   /* KH */\n    { 44323, 58 },   /* KR */\n    { 51641, 59 },   /* KW */\n    { 47147, 60 },   /* LA */\n    { 51454, 61 },   /* LB */\n    { 49823, 62 },   /* LI */\n    { 47323, 63 },   /* LK */\n    { 45401, 64 },   /* LT */\n    { 49399, 65 },   /* LU */\n    { 45349, 66 },   /* LV */\n    { 49282, 67 },   /* LY */\n    { 50143, 68 },   /* MA */\n    { 50268, 69 },   /* MC */\n    { 51396, 70 },   /* ME */\n    { 45833, 71 },   /* MK */\n    { 49763, 72 },   /* MO */\n    { 46227, 73 },   /* MT */\n    { 48258, 74 },   /* MX */\n    { 47611, 75 },   /* NG */\n    { 52312, 76 },   /* NI */\n    { 44375, 77 },   /* NL */\n    { 44433, 78 },   /* NO */\n    { 47443, 79 },   /* NP */\n    { 49858, 80 },   /* NZ */\n    { 50663, 81 },   /* OM */\n    { 50220, 82 },   /* PA */\n    { 51119, 83 },   /* PE */\n    { 47557, 84 },   /* PH */\n    { 45007, 85 },   /* PK */\n    { 44474, 86 },   /* PL */\n    { 52370, 87 },   /* PR */\n    { 48525, 88 },   /* PT */\n    { 51990, 89 },   /* PY */\n    { 52042, 90 },   /* QA */\n    { 44618, 91 },   /* RO */\n    { 50988, 92 },   /* RS */\n    { 44674, 93 },   /* RU */\n    { 47939, 94 },   /* RW */\n    { 13629, 95 },   /* SA */\n    { 44863, 96 },   /* SE */\n    { 49346, 97 },   /* SG */\n    { 45261, 98 },   /* SI */\n    { 44773, 99 },   /* SK */\n    { 52176, 100 },  /* SV */\n    { 51044, 101 },  /* SY */\n    { 44910, 102 },  /* TH */\n    { 45480, 103 },  /* TJ */\n    { 50438, 104 },  /* TN */\n    { 44956, 105 },  /* TR */\n    { 51263, 106 },  /* TT */\n    { 43697, 107 },  /* TW */\n    { 45135, 108 },  /* UA */\n    { 43945, 109 },  /* US */\n    { 51876, 110 },  /* UY */\n    { 46390, 111 },  /* UZ */\n    { 50748, 112 },  /* VE */\n    { 45586, 113 },  /* VN */\n    { 50866, 114 },  /* YE */\n    { 45864, 115 },  /* ZA */\n    { 51486, 116 }   /* ZW */\n};\n\n\nstatic const char locale_strings[] =\n{\n    \"\\0\"\n    \"dd MMMM\\0\"\n    \"\\xd9\\x85\\xd8\\xad\\xd8\\xb1\\xd9\\x85\\0\"\n    \"\\xd8\\xb5\\xd9\\x81\\xd8\\xb1\\0\"\n    \"\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xb9 \\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd9\\x88\\xd9\\x84\\0\"\n    \"\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xb9 \\xd8\\xa7\\xd9\\x84\\xd8\\xa2\\xd8\\xae\\xd8\\xb1\\0\"\n    \"\\xd8\\xac\\xd9\\x85\\xd8\\xa7\\xd8\\xaf\\xd9\\x89 \\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd9\\x88\\xd9\\x84\\xd9\\x89\\0\"\n    \"\\xd8\\xac\\xd9\\x85\\xd8\\xa7\\xd8\\xaf\\xd9\\x89 \\xd8\\xa7\\xd9\\x84\\xd8\\xa2\\xd8\\xae\\xd8\\xb1\\xd8\\xa9\\0\"\n    \"\\xd8\\xb1\\xd8\\xac\\xd8\\xa8\\0\"\n    \"\\xd8\\xb4\\xd8\\xb9\\xd8\\xa8\\xd8\\xa7\\xd9\\x86\\0\"\n    \"\\xd8\\xb1\\xd9\\x85\\xd8\\xb6\\xd8\\xa7\\xd9\\x86\\0\"\n    \"\\xd8\\xb4\\xd9\\x88\\xd8\\xa7\\xd9\\x84\\0\"\n    \"\\xd8\\xb0\\xd9\\x88 \\xd8\\xa7\\xd9\\x84\\xd9\\x82\\xd8\\xb9\\xd8\\xaf\\xd8\\xa9\\0\"\n    \"\\xd8\\xb0\\xd9\\x88 \\xd8\\xa7\\xd9\\x84\\xd8\\xad\\xd8\\xac\\xd8\\xa9\\0\"\n    \"/\\0\"\n    \":\\0\"\n    \"dd/MM/yy\\0\"\n    \"dd/MM/yyyy\\0\"\n    \"dd/MMMM/yyyy\\0\"\n    \"dddd, dd MMMM, yyyy\\0\"\n    \"hh:mm tt\\0\"\n    \"HH:mm\\0\"\n    \"hh:mm:ss tt\\0\"\n    \"HH:mm:ss\\0\"\n    \"MMMM, yyyy\\0\"\n    \"d MMMM\\0\"\n    \"\\xd0\\xbf\\xd1\\x80.\\xd0\\xbe\\xd0\\xb1.\\0\"\n    \"\\xd1\\x81\\xd0\\xbb.\\xd0\\xbe\\xd0\\xb1.\\0\"\n    \"\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd0\\xbb\\xd1\\x8f\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd0\\xbb\\xd0\\xbd\\xd0\\xb8\\xd0\\xba\\0\"\n    \"\\xd0\\xb2\\xd1\\x82\\xd0\\xbe\\xd1\\x80\\xd0\\xbd\\xd0\\xb8\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd1\\x80\\xd1\\x8f\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82\\xd0\\xb2\\xd1\\x8a\\xd1\\x80\\xd1\\x82\\xd1\\x8a\\xd0\\xba\\0\"\n    \"\\xd0\\xbf\\xd0\\xb5\\xd1\\x82\\xd1\\x8a\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd1\\x8a\\xd0\\xb1\\xd0\\xbe\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd0\\xbd\\xd0\\xb4\\0\"\n    \"\\xd0\\xbf\\xd0\\xbd\\0\"\n    \"\\xd0\\xb2\\xd1\\x82\\0\"\n    \"\\xd1\\x81\\xd1\\x80\\0\"\n    \"\\xd1\\x87\\xd1\\x82\\0\"\n    \"\\xd0\\xbf\\xd1\\x82\\0\"\n    \"\\xd1\\x81\\xd0\\xb1\\0\"\n    \"\\xd0\\xbd\\0\"\n    \"\\xd0\\xbf\\0\"\n    \"\\xd0\\xb2\\0\"\n    \"\\xd1\\x81\\0\"\n    \"\\xd1\\x87\\0\"\n    \"\\xd1\\x8f\\xd0\\xbd\\xd1\\x83\\xd0\\xb0\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd1\\x84\\xd0\\xb5\\xd0\\xb2\\xd1\\x80\\xd1\\x83\\xd0\\xb0\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x80\\xd1\\x82\\0\"\n    \"\\xd0\\xb0\\xd0\\xbf\\xd1\\x80\\xd0\\xb8\\xd0\\xbb\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd0\\xb9\\0\"\n    \"\\xd1\\x8e\\xd0\\xbd\\xd0\\xb8\\0\"\n    \"\\xd1\\x8e\\xd0\\xbb\\xd0\\xb8\\0\"\n    \"\\xd0\\xb0\\xd0\\xb2\\xd0\\xb3\\xd1\\x83\\xd1\\x81\\xd1\\x82\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbf\\xd1\\x82\\xd0\\xb5\\xd0\\xbc\\xd0\\xb2\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd0\\xbe\\xd0\\xba\\xd1\\x82\\xd0\\xbe\\xd0\\xbc\\xd0\\xb2\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd0\\xbd\\xd0\\xbe\\xd0\\xb5\\xd0\\xbc\\xd0\\xb2\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd0\\xba\\xd0\\xb5\\xd0\\xbc\\xd0\\xb2\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd1\\x8f\\xd0\\xbd.\\0\"\n    \"\\xd1\\x84\\xd0\\xb5\\xd0\\xb2\\xd1\\x80.\\0\"\n    \"\\xd0\\xb0\\xd0\\xbf\\xd1\\x80.\\0\"\n    \"\\xd0\\xb0\\xd0\\xb2\\xd0\\xb3.\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbf\\xd1\\x82.\\0\"\n    \"\\xd0\\xbe\\xd0\\xba\\xd1\\x82.\\0\"\n    \"\\xd0\\xbd\\xd0\\xbe\\xd0\\xb5\\xd0\\xbc.\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd0\\xba.\\0\"\n    \".\\0\"\n    \"d.M.yyyy '\\xd0\\xb3.'\\0\"\n    \"dd.M.yyyy '\\xd0\\xb3.'\\0\"\n    \"d.MM.yyyy '\\xd0\\xb3.'\\0\"\n    \"dd.MM.yyyy '\\xd0\\xb3.'\\0\"\n    \"dd MMMM yyyy '\\xd0\\xb3.'\\0\"\n    \"d MMMM yyyy '\\xd0\\xb3.'\\0\"\n    \"dddd, dd MMMM yyyy '\\xd0\\xb3.'\\0\"\n    \"dddd, d MMMM yyyy '\\xd0\\xb3.'\\0\"\n    \"H:mm\\0\"\n    \"H:mm:ss\\0\"\n    \"MMMM yyyy '\\xd0\\xb3.'\\0\"\n    \"a. m.\\0\"\n    \"p. m.\\0\"\n    \"diumenge\\0\"\n    \"dilluns\\0\"\n    \"dimarts\\0\"\n    \"dimecres\\0\"\n    \"dijous\\0\"\n    \"divendres\\0\"\n    \"dissabte\\0\"\n    \"dg.\\0\"\n    \"dl.\\0\"\n    \"dt.\\0\"\n    \"dc.\\0\"\n    \"dj.\\0\"\n    \"dv.\\0\"\n    \"ds.\\0\"\n    \"dg\\0\"\n    \"dl\\0\"\n    \"dt\\0\"\n    \"dc\\0\"\n    \"dj\\0\"\n    \"dv\\0\"\n    \"ds\\0\"\n    \"gener\\0\"\n    \"febrer\\0\"\n    \"mar\\xc3\\xa7\\0\"\n    \"abril\\0\"\n    \"maig\\0\"\n    \"juny\\0\"\n    \"juliol\\0\"\n    \"agost\\0\"\n    \"setembre\\0\"\n    \"octubre\\0\"\n    \"novembre\\0\"\n    \"desembre\\0\"\n    \"gen.\\0\"\n    \"feb.\\0\"\n    \"abr.\\0\"\n    \"jul.\\0\"\n    \"ag.\\0\"\n    \"set.\\0\"\n    \"oct.\\0\"\n    \"nov.\\0\"\n    \"des.\\0\"\n    \"d/M/yyyy\\0\"\n    \"d MMM yyyy\\0\"\n    \"dddd, d MMMM 'de' yyyy\\0\"\n    \"d MMMM 'de' yyyy\\0\"\n    \"MMMM 'de' yyyy\\0\"\n    \"M\\xe6\\x9c\\x88\\x64\\xe6\\x97\\xa5\\0\"\n    \"\\xe4\\xb8\\x8a\\xe5\\x8d\\x88\\0\"\n    \"\\xe4\\xb8\\x8b\\xe5\\x8d\\x88\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe6\\x97\\xa5\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe4\\xb8\\x80\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe4\\xba\\x8c\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe4\\xb8\\x89\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe5\\x9b\\x9b\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe4\\xba\\x94\\0\"\n    \"\\xe6\\x98\\x9f\\xe6\\x9c\\x9f\\xe5\\x85\\xad\\0\"\n    \"\\xe5\\x91\\xa8\\xe6\\x97\\xa5\\0\"\n    \"\\xe5\\x91\\xa8\\xe4\\xb8\\x80\\0\"\n    \"\\xe5\\x91\\xa8\\xe4\\xba\\x8c\\0\"\n    \"\\xe5\\x91\\xa8\\xe4\\xb8\\x89\\0\"\n    \"\\xe5\\x91\\xa8\\xe5\\x9b\\x9b\\0\"\n    \"\\xe5\\x91\\xa8\\xe4\\xba\\x94\\0\"\n    \"\\xe5\\x91\\xa8\\xe5\\x85\\xad\\0\"\n    \"\\xe6\\x97\\xa5\\0\"\n    \"\\xe4\\xb8\\x80\\0\"\n    \"\\xe4\\xba\\x8c\\0\"\n    \"\\xe4\\xb8\\x89\\0\"\n    \"\\xe5\\x9b\\x9b\\0\"\n    \"\\xe4\\xba\\x94\\0\"\n    \"\\xe5\\x85\\xad\\0\"\n    \"\\xe4\\xb8\\x80\\xe6\\x9c\\x88\\0\"\n    \"\\xe4\\xba\\x8c\\xe6\\x9c\\x88\\0\"\n    \"\\xe4\\xb8\\x89\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x9b\\x9b\\xe6\\x9c\\x88\\0\"\n    \"\\xe4\\xba\\x94\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x85\\xad\\xe6\\x9c\\x88\\0\"\n    \"\\xe4\\xb8\\x83\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x85\\xab\\xe6\\x9c\\x88\\0\"\n    \"\\xe4\\xb9\\x9d\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x8d\\x81\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x8d\\x81\\xe4\\xb8\\x80\\xe6\\x9c\\x88\\0\"\n    \"\\xe5\\x8d\\x81\\xe4\\xba\\x8c\\xe6\\x9c\\x88\\0\"\n    \"1\\xe6\\x9c\\x88\\0\"\n    \"2\\xe6\\x9c\\x88\\0\"\n    \"3\\xe6\\x9c\\x88\\0\"\n    \"4\\xe6\\x9c\\x88\\0\"\n    \"5\\xe6\\x9c\\x88\\0\"\n    \"6\\xe6\\x9c\\x88\\0\"\n    \"7\\xe6\\x9c\\x88\\0\"\n    \"8\\xe6\\x9c\\x88\\0\"\n    \"9\\xe6\\x9c\\x88\\0\"\n    \"10\\xe6\\x9c\\x88\\0\"\n    \"11\\xe6\\x9c\\x88\\0\"\n    \"12\\xe6\\x9c\\x88\\0\"\n    \"yyyy/M/d\\0\"\n    \"yyyy-M-d\\0\"\n    \"yyyy.M.d\\0\"\n    \"yyyy/MM/dd\\0\"\n    \"yyyy-MM-dd\\0\"\n    \"yyyy.MM.dd\\0\"\n    \"yy/M/d\\0\"\n    \"yy-M-d\\0\"\n    \"yy.M.d\\0\"\n    \"yy/MM/dd\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5'\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5', dddd\\0\"\n    \"dddd, yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5'\\0\"\n    \"yyyy\\xe5\\xb9\\xb4MMMd\\xe6\\x97\\xa5\\0\"\n    \"yyyy\\xe5\\xb9\\xb4MMMd\\xe6\\x97\\xa5, dddd\\0\"\n    \"tt h:mm\\0\"\n    \"tt hh:mm\\0\"\n    \"tt h:mm:ss\\0\"\n    \"tt hh:mm:ss\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MMM\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MMMM\\0\"\n    \"yyyy.M\\0\"\n    \"d. MMMM\\0\"\n    \"AM\\0\"\n    \"PM\\0\"\n    \"ned\\xc4\\x9ble\\0\"\n    \"pond\\xc4\\x9bl\\xc3\\xad\\0\"\n    \"\\xc3\\xbater\\xc3\\xbd\\0\"\n    \"st\\xc5\\x99\\x65\\x64\\x61\\0\"\n    \"\\xc4\\x8dtvrtek\\0\"\n    \"p\\xc3\\xa1tek\\0\"\n    \"sobota\\0\"\n    \"ne\\0\"\n    \"po\\0\"\n    \"\\xc3\\xbat\\0\"\n    \"st\\0\"\n    \"\\xc4\\x8dt\\0\"\n    \"p\\xc3\\xa1\\0\"\n    \"so\\0\"\n    \"N\\0\"\n    \"P\\0\"\n    \"\\xc3\\x9a\\0\"\n    \"S\\0\"\n    \"\\xc4\\x8c\\0\"\n    \"leden\\0\"\n    \"\\xc3\\xbanor\\0\"\n    \"b\\xc5\\x99\\x65zen\\0\"\n    \"duben\\0\"\n    \"kv\\xc4\\x9bten\\0\"\n    \"\\xc4\\x8d\\x65rven\\0\"\n    \"\\xc4\\x8d\\x65rvenec\\0\"\n    \"srpen\\0\"\n    \"z\\xc3\\xa1\\xc5\\x99\\xc3\\xad\\0\"\n    \"\\xc5\\x99\\xc3\\xadjen\\0\"\n    \"listopad\\0\"\n    \"prosinec\\0\"\n    \"ledna\\0\"\n    \"\\xc3\\xbanora\\0\"\n    \"b\\xc5\\x99\\x65zna\\0\"\n    \"dubna\\0\"\n    \"kv\\xc4\\x9btna\\0\"\n    \"\\xc4\\x8d\\x65rvna\\0\"\n    \"\\xc4\\x8d\\x65rvence\\0\"\n    \"srpna\\0\"\n    \"\\xc5\\x99\\xc3\\xadjna\\0\"\n    \"listopadu\\0\"\n    \"prosince\\0\"\n    \"led\\0\"\n    \"\\xc3\\xbano\\0\"\n    \"b\\xc5\\x99\\x65\\0\"\n    \"dub\\0\"\n    \"kv\\xc4\\x9b\\0\"\n    \"\\xc4\\x8dvn\\0\"\n    \"\\xc4\\x8dvc\\0\"\n    \"srp\\0\"\n    \"z\\xc3\\xa1\\xc5\\x99\\0\"\n    \"\\xc5\\x99\\xc3\\xadj\\0\"\n    \"lis\\0\"\n    \"pro\\0\"\n    \"dd.MM.yyyy\\0\"\n    \"d. M. yyyy\\0\"\n    \"dddd d. MMMM yyyy\\0\"\n    \"d. MMMM yyyy\\0\"\n    \"MMMM yyyy\\0\"\n    \"s\\xc3\\xb8ndag\\0\"\n    \"mandag\\0\"\n    \"tirsdag\\0\"\n    \"onsdag\\0\"\n    \"torsdag\\0\"\n    \"fredag\\0\"\n    \"l\\xc3\\xb8rdag\\0\"\n    \"s\\xc3\\xb8n\\0\"\n    \"man\\0\"\n    \"tir\\0\"\n    \"ons\\0\"\n    \"tor\\0\"\n    \"fre\\0\"\n    \"l\\xc3\\xb8r\\0\"\n    \"M\\0\"\n    \"T\\0\"\n    \"O\\0\"\n    \"F\\0\"\n    \"L\\0\"\n    \"januar\\0\"\n    \"februar\\0\"\n    \"marts\\0\"\n    \"april\\0\"\n    \"maj\\0\"\n    \"juni\\0\"\n    \"juli\\0\"\n    \"august\\0\"\n    \"september\\0\"\n    \"oktober\\0\"\n    \"november\\0\"\n    \"december\\0\"\n    \"jan\\0\"\n    \"feb\\0\"\n    \"mar\\0\"\n    \"apr\\0\"\n    \"jun\\0\"\n    \"jul\\0\"\n    \"aug\\0\"\n    \"sep\\0\"\n    \"okt\\0\"\n    \"nov\\0\"\n    \"dec\\0\"\n    \"-\\0\"\n    \"dd-MM-yyyy\\0\"\n    \"dd-MM-yy\\0\"\n    \"yyyy MM dd\\0\"\n    \"vorm.\\0\"\n    \"nachm.\\0\"\n    \"Sonntag\\0\"\n    \"Montag\\0\"\n    \"Dienstag\\0\"\n    \"Mittwoch\\0\"\n    \"Donnerstag\\0\"\n    \"Freitag\\0\"\n    \"Samstag\\0\"\n    \"So\\0\"\n    \"Mo\\0\"\n    \"Di\\0\"\n    \"Mi\\0\"\n    \"Do\\0\"\n    \"Fr\\0\"\n    \"Sa\\0\"\n    \"D\\0\"\n    \"Januar\\0\"\n    \"Februar\\0\"\n    \"M\\xc3\\xa4rz\\0\"\n    \"April\\0\"\n    \"Mai\\0\"\n    \"Juni\\0\"\n    \"Juli\\0\"\n    \"August\\0\"\n    \"September\\0\"\n    \"Oktober\\0\"\n    \"November\\0\"\n    \"Dezember\\0\"\n    \"Jan\\0\"\n    \"Feb\\0\"\n    \"M\\xc3\\xa4r\\0\"\n    \"Apr\\0\"\n    \"Jun\\0\"\n    \"Jul\\0\"\n    \"Aug\\0\"\n    \"Sep\\0\"\n    \"Okt\\0\"\n    \"Nov\\0\"\n    \"Dez\\0\"\n    \"dd.MM.yy\\0\"\n    \"dd. MMM. yyyy\\0\"\n    \"dddd, d. MMMM yyyy\\0\"\n    \"d. MMM. yyyy\\0\"\n    \"HH:mm' Uhr'\\0\"\n    \"HH:mm:ss' Uhr'\\0\"\n    \"\\xcf\\x80.\\xce\\xbc.\\0\"\n    \"\\xce\\xbc.\\xce\\xbc.\\0\"\n    \"\\xce\\x9a\\xcf\\x85\\xcf\\x81\\xce\\xb9\\xce\\xb1\\xce\\xba\\xce\\xae\\0\"\n    \"\\xce\\x94\\xce\\xb5\\xcf\\x85\\xcf\\x84\\xce\\xad\\xcf\\x81\\xce\\xb1\\0\"\n    \"\\xce\\xa4\\xcf\\x81\\xce\\xaf\\xcf\\x84\\xce\\xb7\\0\"\n    \"\\xce\\xa4\\xce\\xb5\\xcf\\x84\\xce\\xac\\xcf\\x81\\xcf\\x84\\xce\\xb7\\0\"\n    \"\\xce\\xa0\\xce\\xad\\xce\\xbc\\xcf\\x80\\xcf\\x84\\xce\\xb7\\0\"\n    \"\\xce\\xa0\\xce\\xb1\\xcf\\x81\\xce\\xb1\\xcf\\x83\\xce\\xba\\xce\\xb5\\xcf\\x85\\xce\\xae\\0\"\n    \"\\xce\\xa3\\xce\\xac\\xce\\xb2\\xce\\xb2\\xce\\xb1\\xcf\\x84\\xce\\xbf\\0\"\n    \"\\xce\\x9a\\xcf\\x85\\xcf\\x81\\0\"\n    \"\\xce\\x94\\xce\\xb5\\xcf\\x85\\0\"\n    \"\\xce\\xa4\\xcf\\x81\\xce\\xaf\\0\"\n    \"\\xce\\xa4\\xce\\xb5\\xcf\\x84\\0\"\n    \"\\xce\\xa0\\xce\\xad\\xce\\xbc\\0\"\n    \"\\xce\\xa0\\xce\\xb1\\xcf\\x81\\0\"\n    \"\\xce\\xa3\\xce\\xac\\xce\\xb2\\0\"\n    \"\\xce\\x9a\\0\"\n    \"\\xce\\x94\\0\"\n    \"\\xce\\xa4\\0\"\n    \"\\xce\\xa0\\0\"\n    \"\\xce\\xa3\\0\"\n    \"\\xce\\x99\\xce\\xb1\\xce\\xbd\\xce\\xbf\\xcf\\x85\\xce\\xac\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\xa6\\xce\\xb5\\xce\\xb2\\xcf\\x81\\xce\\xbf\\xcf\\x85\\xce\\xac\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x9c\\xce\\xac\\xcf\\x81\\xcf\\x84\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x91\\xcf\\x80\\xcf\\x81\\xce\\xaf\\xce\\xbb\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x9c\\xce\\xac\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x99\\xce\\xbf\\xcf\\x8d\\xce\\xbd\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x99\\xce\\xbf\\xcf\\x8d\\xce\\xbb\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x91\\xcf\\x8d\\xce\\xb3\\xce\\xbf\\xcf\\x85\\xcf\\x83\\xcf\\x84\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\xa3\\xce\\xb5\\xcf\\x80\\xcf\\x84\\xce\\xad\\xce\\xbc\\xce\\xb2\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x9f\\xce\\xba\\xcf\\x84\\xcf\\x8e\\xce\\xb2\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x9d\\xce\\xbf\\xce\\xad\\xce\\xbc\\xce\\xb2\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x94\\xce\\xb5\\xce\\xba\\xce\\xad\\xce\\xbc\\xce\\xb2\\xcf\\x81\\xce\\xb9\\xce\\xbf\\xcf\\x82\\0\"\n    \"\\xce\\x99\\xce\\xb1\\xce\\xbd\\xce\\xbf\\xcf\\x85\\xce\\xb1\\xcf\\x81\\xce\\xaf\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\xa6\\xce\\xb5\\xce\\xb2\\xcf\\x81\\xce\\xbf\\xcf\\x85\\xce\\xb1\\xcf\\x81\\xce\\xaf\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\x9c\\xce\\xb1\\xcf\\x81\\xcf\\x84\\xce\\xaf\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\x91\\xcf\\x80\\xcf\\x81\\xce\\xb9\\xce\\xbb\\xce\\xaf\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\x9c\\xce\\xb1\\xce\\x90\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\x99\\xce\\xbf\\xcf\\x85\\xce\\xbd\\xce\\xaf\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\x99\\xce\\xbf\\xcf\\x85\\xce\\xbb\\xce\\xaf\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\x91\\xcf\\x85\\xce\\xb3\\xce\\xbf\\xcf\\x8d\\xcf\\x83\\xcf\\x84\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\xa3\\xce\\xb5\\xcf\\x80\\xcf\\x84\\xce\\xb5\\xce\\xbc\\xce\\xb2\\xcf\\x81\\xce\\xaf\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\x9f\\xce\\xba\\xcf\\x84\\xcf\\x89\\xce\\xb2\\xcf\\x81\\xce\\xaf\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\x9d\\xce\\xbf\\xce\\xb5\\xce\\xbc\\xce\\xb2\\xcf\\x81\\xce\\xaf\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\x94\\xce\\xb5\\xce\\xba\\xce\\xb5\\xce\\xbc\\xce\\xb2\\xcf\\x81\\xce\\xaf\\xce\\xbf\\xcf\\x85\\0\"\n    \"\\xce\\x99\\xce\\xb1\\xce\\xbd\\0\"\n    \"\\xce\\xa6\\xce\\xb5\\xce\\xb2\\0\"\n    \"\\xce\\x9c\\xce\\xac\\xcf\\x81\\0\"\n    \"\\xce\\x91\\xcf\\x80\\xcf\\x81\\0\"\n    \"\\xce\\x9c\\xce\\xac\\xce\\xb9\\0\"\n    \"\\xce\\x99\\xce\\xbf\\xcf\\x8d\\xce\\xbd\\0\"\n    \"\\xce\\x99\\xce\\xbf\\xcf\\x8d\\xce\\xbb\\0\"\n    \"\\xce\\x91\\xcf\\x8d\\xce\\xb3\\0\"\n    \"\\xce\\xa3\\xce\\xb5\\xcf\\x80\\0\"\n    \"\\xce\\x9f\\xce\\xba\\xcf\\x84\\0\"\n    \"\\xce\\x9d\\xce\\xbf\\xce\\xad\\0\"\n    \"\\xce\\x94\\xce\\xb5\\xce\\xba\\0\"\n    \"d/M/yy\\0\"\n    \"dd/MMM/yyyy\\0\"\n    \"dddd, d MMMM yyyy\\0\"\n    \"d MMMM yyyy\\0\"\n    \"h:mm tt\\0\"\n    \"h:mm:ss tt\\0\"\n    \"MMMM d\\0\"\n    \"Sunday\\0\"\n    \"Monday\\0\"\n    \"Tuesday\\0\"\n    \"Wednesday\\0\"\n    \"Thursday\\0\"\n    \"Friday\\0\"\n    \"Saturday\\0\"\n    \"Sun\\0\"\n    \"Mon\\0\"\n    \"Tue\\0\"\n    \"Wed\\0\"\n    \"Thu\\0\"\n    \"Fri\\0\"\n    \"Sat\\0\"\n    \"W\\0\"\n    \"January\\0\"\n    \"February\\0\"\n    \"March\\0\"\n    \"May\\0\"\n    \"June\\0\"\n    \"July\\0\"\n    \"October\\0\"\n    \"December\\0\"\n    \"Mar\\0\"\n    \"Oct\\0\"\n    \"Dec\\0\"\n    \"M/d/yyyy\\0\"\n    \"M/d/yy\\0\"\n    \"MM/dd/yy\\0\"\n    \"MM/dd/yyyy\\0\"\n    \"dd-MMM-yy\\0\"\n    \"dddd, MMMM d, yyyy\\0\"\n    \"MMMM d, yyyy\\0\"\n    \"dddd, d MMMM, yyyy\\0\"\n    \"d MMMM, yyyy\\0\"\n    \"d 'de' MMMM\\0\"\n    \"domingo\\0\"\n    \"lunes\\0\"\n    \"martes\\0\"\n    \"mi\\xc3\\xa9rcoles\\0\"\n    \"jueves\\0\"\n    \"viernes\\0\"\n    \"s\\xc3\\xa1\\x62\\x61\\x64o\\0\"\n    \"Dom.\\0\"\n    \"Lun.\\0\"\n    \"Mar.\\0\"\n    \"Mi\\xc3\\xa9.\\0\"\n    \"Jue.\\0\"\n    \"Vie.\\0\"\n    \"S\\xc3\\xa1\\x62.\\0\"\n    \"J\\0\"\n    \"V\\0\"\n    \"Enero\\0\"\n    \"Febrero\\0\"\n    \"Marzo\\0\"\n    \"Abril\\0\"\n    \"Mayo\\0\"\n    \"Junio\\0\"\n    \"Julio\\0\"\n    \"Agosto\\0\"\n    \"Septiembre\\0\"\n    \"Octubre\\0\"\n    \"Noviembre\\0\"\n    \"Diciembre\\0\"\n    \"enero\\0\"\n    \"febrero\\0\"\n    \"marzo\\0\"\n    \"mayo\\0\"\n    \"junio\\0\"\n    \"julio\\0\"\n    \"agosto\\0\"\n    \"septiembre\\0\"\n    \"noviembre\\0\"\n    \"diciembre\\0\"\n    \"Ene.\\0\"\n    \"Feb.\\0\"\n    \"Abr.\\0\"\n    \"May.\\0\"\n    \"Jun.\\0\"\n    \"Jul.\\0\"\n    \"Ago.\\0\"\n    \"Sept.\\0\"\n    \"Oct.\\0\"\n    \"Nov.\\0\"\n    \"Dic.\\0\"\n    \"d/MM/yy\\0\"\n    \"d-M-yy\\0\"\n    \"dddd, d' de 'MMMM' de 'yyyy\\0\"\n    \"dddd d' de 'MMMM' de 'yyyy\\0\"\n    \"d' de 'MMMM' de 'yyyy\\0\"\n    \"H.mm\\0\"\n    \"HH.mm\\0\"\n    \"HH'H'mm\\0\"\n    \"H.mm.ss\\0\"\n    \"HH.mm.ss\\0\"\n    \"HH'H'mm.ss\\0\"\n    \"MMMM' de 'yyyy\\0\"\n    \"ap.\\0\"\n    \"ip.\\0\"\n    \"sunnuntaina\\0\"\n    \"maanantaina\\0\"\n    \"tiistaina\\0\"\n    \"keskiviikkona\\0\"\n    \"torstaina\\0\"\n    \"perjantaina\\0\"\n    \"lauantaina\\0\"\n    \"su\\0\"\n    \"ma\\0\"\n    \"ti\\0\"\n    \"ke\\0\"\n    \"to\\0\"\n    \"pe\\0\"\n    \"la\\0\"\n    \"K\\0\"\n    \"tammikuu\\0\"\n    \"helmikuu\\0\"\n    \"maaliskuu\\0\"\n    \"huhtikuu\\0\"\n    \"toukokuu\\0\"\n    \"kes\\xc3\\xa4kuu\\0\"\n    \"hein\\xc3\\xa4kuu\\0\"\n    \"elokuu\\0\"\n    \"syyskuu\\0\"\n    \"lokakuu\\0\"\n    \"marraskuu\\0\"\n    \"joulukuu\\0\"\n    \"tammikuuta\\0\"\n    \"helmikuuta\\0\"\n    \"maaliskuuta\\0\"\n    \"huhtikuuta\\0\"\n    \"toukokuuta\\0\"\n    \"kes\\xc3\\xa4kuuta\\0\"\n    \"hein\\xc3\\xa4kuuta\\0\"\n    \"elokuuta\\0\"\n    \"syyskuuta\\0\"\n    \"lokakuuta\\0\"\n    \"marraskuuta\\0\"\n    \"joulukuuta\\0\"\n    \"tammi\\0\"\n    \"helmi\\0\"\n    \"maalis\\0\"\n    \"huhti\\0\"\n    \"touko\\0\"\n    \"kes\\xc3\\xa4\\0\"\n    \"hein\\xc3\\xa4\\0\"\n    \"elo\\0\"\n    \"syys\\0\"\n    \"loka\\0\"\n    \"marras\\0\"\n    \"joulu\\0\"\n    \"d.M.yyyy\\0\"\n    \"dimanche\\0\"\n    \"lundi\\0\"\n    \"mardi\\0\"\n    \"mercredi\\0\"\n    \"jeudi\\0\"\n    \"vendredi\\0\"\n    \"samedi\\0\"\n    \"dim.\\0\"\n    \"lun.\\0\"\n    \"mar.\\0\"\n    \"mer.\\0\"\n    \"jeu.\\0\"\n    \"ven.\\0\"\n    \"sam.\\0\"\n    \"janvier\\0\"\n    \"f\\xc3\\xa9vrier\\0\"\n    \"mars\\0\"\n    \"avril\\0\"\n    \"mai\\0\"\n    \"juin\\0\"\n    \"juillet\\0\"\n    \"ao\\xc3\\xbbt\\0\"\n    \"septembre\\0\"\n    \"octobre\\0\"\n    \"d\\xc3\\xa9\\x63\\x65mbre\\0\"\n    \"janv.\\0\"\n    \"f\\xc3\\xa9vr.\\0\"\n    \"avr.\\0\"\n    \"juil.\\0\"\n    \"sept.\\0\"\n    \"d\\xc3\\xa9\\x63.\\0\"\n    \"dddd d MMMM yyyy\\0\"\n    \"d MMM yy\\0\"\n    \"HH' h 'mm\\0\"\n    \"HH'h'mm\\0\"\n    \"\\xd7\\x9c\\xd7\\xa4\\xd7\\xa0\\xd7\\x94\\xd7\\xb4\\xd7\\xa6\\0\"\n    \"\\xd7\\x90\\xd7\\x97\\xd7\\x94\\xd7\\xb4\\xd7\\xa6\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\xa8\\xd7\\x90\\xd7\\xa9\\xd7\\x95\\xd7\\x9f\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\xa9\\xd7\\xa0\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\xa9\\xd7\\x9c\\xd7\\x99\\xd7\\xa9\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\xa8\\xd7\\x91\\xd7\\x99\\xd7\\xa2\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\x97\\xd7\\x9e\\xd7\\x99\\xd7\\xa9\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\xa9\\xd7\\x99\\xd7\\xa9\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\xa9\\xd7\\x91\\xd7\\xaa\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\x90\\xd7\\xb3\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\x91\\xd7\\xb3\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\x92\\xd7\\xb3\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\x93\\xd7\\xb3\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\x94\\xd7\\xb3\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9d \\xd7\\x95\\xd7\\xb3\\0\"\n    \"\\xd7\\xa9\\xd7\\x91\\xd7\\xaa\\0\"\n    \"\\xd7\\x90\\xd7\\xb3\\0\"\n    \"\\xd7\\x91\\xd7\\xb3\\0\"\n    \"\\xd7\\x92\\xd7\\xb3\\0\"\n    \"\\xd7\\x93\\xd7\\xb3\\0\"\n    \"\\xd7\\x94\\xd7\\xb3\\0\"\n    \"\\xd7\\x95\\xd7\\xb3\\0\"\n    \"\\xd7\\xa9\\xd7\\xb3\\0\"\n    \"\\xd7\\x99\\xd7\\xa0\\xd7\\x95\\xd7\\x90\\xd7\\xa8\\0\"\n    \"\\xd7\\xa4\\xd7\\x91\\xd7\\xa8\\xd7\\x95\\xd7\\x90\\xd7\\xa8\\0\"\n    \"\\xd7\\x9e\\xd7\\xa8\\xd7\\xa5\\0\"\n    \"\\xd7\\x90\\xd7\\xa4\\xd7\\xa8\\xd7\\x99\\xd7\\x9c\\0\"\n    \"\\xd7\\x9e\\xd7\\x90\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\xa0\\xd7\\x99\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9c\\xd7\\x99\\0\"\n    \"\\xd7\\x90\\xd7\\x95\\xd7\\x92\\xd7\\x95\\xd7\\xa1\\xd7\\x98\\0\"\n    \"\\xd7\\xa1\\xd7\\xa4\\xd7\\x98\\xd7\\x9e\\xd7\\x91\\xd7\\xa8\\0\"\n    \"\\xd7\\x90\\xd7\\x95\\xd7\\xa7\\xd7\\x98\\xd7\\x95\\xd7\\x91\\xd7\\xa8\\0\"\n    \"\\xd7\\xa0\\xd7\\x95\\xd7\\x91\\xd7\\x9e\\xd7\\x91\\xd7\\xa8\\0\"\n    \"\\xd7\\x93\\xd7\\xa6\\xd7\\x9e\\xd7\\x91\\xd7\\xa8\\0\"\n    \"\\xd7\\x99\\xd7\\xa0\\xd7\\x95\\xd7\\xb3\\0\"\n    \"\\xd7\\xa4\\xd7\\x91\\xd7\\xa8\\xd7\\xb3\\0\"\n    \"\\xd7\\x90\\xd7\\xa4\\xd7\\xa8\\xd7\\xb3\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\xa0\\xd7\\xb3\\0\"\n    \"\\xd7\\x99\\xd7\\x95\\xd7\\x9c\\xd7\\xb3\\0\"\n    \"\\xd7\\x90\\xd7\\x95\\xd7\\x92\\xd7\\xb3\\0\"\n    \"\\xd7\\xa1\\xd7\\xa4\\xd7\\x98\\xd7\\xb3\\0\"\n    \"\\xd7\\x90\\xd7\\x95\\xd7\\xa7\\xd7\\xb3\\0\"\n    \"\\xd7\\xa0\\xd7\\x95\\xd7\\x91\\xd7\\xb3\\0\"\n    \"\\xd7\\x93\\xd7\\xa6\\xd7\\x9e\\xd7\\xb3\\0\"\n    \"dd MMMM yyyy\\0\"\n    \"dd-MMMM-yyyy\\0\"\n    \"dd '\\xd7\\x91'MMMM yyyy\\0\"\n    \"dd MMM yy\\0\"\n    \"dddd dd MMMM yyyy\\0\"\n    \"dddd dd '\\xd7\\x91'MMMM yyyy\\0\"\n    \"ddd dd '\\xd7\\x91'MMMM yyyy\\0\"\n    \"MMMM d.\\0\"\n    \"de.\\0\"\n    \"du.\\0\"\n    \"vas\\xc3\\xa1rnap\\0\"\n    \"h\\xc3\\xa9tf\\xc5\\x91\\0\"\n    \"kedd\\0\"\n    \"szerda\\0\"\n    \"cs\\xc3\\xbct\\xc3\\xb6rt\\xc3\\xb6k\\0\"\n    \"p\\xc3\\xa9ntek\\0\"\n    \"szombat\\0\"\n    \"H\\0\"\n    \"Sze\\0\"\n    \"Cs\\0\"\n    \"Szo\\0\"\n    \"Sz\\0\"\n    \"janu\\xc3\\xa1r\\0\"\n    \"febru\\xc3\\xa1r\\0\"\n    \"m\\xc3\\xa1rcius\\0\"\n    \"\\xc3\\xa1prilis\\0\"\n    \"m\\xc3\\xa1jus\\0\"\n    \"j\\xc3\\xbanius\\0\"\n    \"j\\xc3\\xbalius\\0\"\n    \"augusztus\\0\"\n    \"szeptember\\0\"\n    \"okt\\xc3\\xb3\\x62\\x65r\\0\"\n    \"jan.\\0\"\n    \"febr.\\0\"\n    \"m\\xc3\\xa1rc.\\0\"\n    \"\\xc3\\xa1pr.\\0\"\n    \"m\\xc3\\xa1j.\\0\"\n    \"j\\xc3\\xban.\\0\"\n    \"j\\xc3\\xbal.\\0\"\n    \"aug.\\0\"\n    \"szept.\\0\"\n    \"okt.\\0\"\n    \"dec.\\0\"\n    \". \\0\"\n    \"yyyy. MM. dd.\\0\"\n    \"yyyy. MMM d.\\0\"\n    \"yyyy. MMMM d., dddd\\0\"\n    \"yyyy. MMMM d.\\0\"\n    \"yyyy. MMMM\\0\"\n    \"f.h.\\0\"\n    \"e.h.\\0\"\n    \"sunnudagur\\0\"\n    \"m\\xc3\\xa1nudagur\\0\"\n    \"\\xc3\\xberi\\xc3\\xb0judagur\\0\"\n    \"mi\\xc3\\xb0vikudagur\\0\"\n    \"fimmtudagur\\0\"\n    \"f\\xc3\\xb6studagur\\0\"\n    \"laugardagur\\0\"\n    \"sun.\\0\"\n    \"m\\xc3\\xa1n.\\0\"\n    \"\\xc3\\xberi.\\0\"\n    \"mi\\xc3\\xb0.\\0\"\n    \"fim.\\0\"\n    \"f\\xc3\\xb6s.\\0\"\n    \"lau.\\0\"\n    \"\\xc3\\x9e\\0\"\n    \"jan\\xc3\\xba\\x61r\\0\"\n    \"febr\\xc3\\xba\\x61r\\0\"\n    \"apr\\xc3\\xadl\\0\"\n    \"ma\\xc3\\xad\\0\"\n    \"j\\xc3\\xban\\xc3\\xad\\0\"\n    \"j\\xc3\\xbal\\xc3\\xad\\0\"\n    \"\\xc3\\xa1g\\xc3\\xbast\\0\"\n    \"n\\xc3\\xb3vember\\0\"\n    \"desember\\0\"\n    \"apr.\\0\"\n    \"\\xc3\\xa1g\\xc3\\xba.\\0\"\n    \"sep.\\0\"\n    \"n\\xc3\\xb3v.\\0\"\n    \"d. MMM yyyy\\0\"\n    \"domenica\\0\"\n    \"luned\\xc3\\xac\\0\"\n    \"marted\\xc3\\xac\\0\"\n    \"mercoled\\xc3\\xac\\0\"\n    \"gioved\\xc3\\xac\\0\"\n    \"venerd\\xc3\\xac\\0\"\n    \"sabato\\0\"\n    \"dom\\0\"\n    \"lun\\0\"\n    \"mer\\0\"\n    \"gio\\0\"\n    \"ven\\0\"\n    \"sab\\0\"\n    \"G\\0\"\n    \"Gennaio\\0\"\n    \"Febbraio\\0\"\n    \"Aprile\\0\"\n    \"Maggio\\0\"\n    \"Giugno\\0\"\n    \"Luglio\\0\"\n    \"Settembre\\0\"\n    \"Ottobre\\0\"\n    \"Novembre\\0\"\n    \"Dicembre\\0\"\n    \"gennaio\\0\"\n    \"febbraio\\0\"\n    \"aprile\\0\"\n    \"maggio\\0\"\n    \"giugno\\0\"\n    \"luglio\\0\"\n    \"settembre\\0\"\n    \"ottobre\\0\"\n    \"dicembre\\0\"\n    \"gen\\0\"\n    \"mag\\0\"\n    \"giu\\0\"\n    \"lug\\0\"\n    \"ago\\0\"\n    \"set\\0\"\n    \"ott\\0\"\n    \"dic\\0\"\n    \"dd.M.yy\\0\"\n    \"d-MMM-yy\\0\"\n    \"\\xe5\\x8d\\x88\\xe5\\x89\\x8d\\0\"\n    \"\\xe5\\x8d\\x88\\xe5\\xbe\\x8c\\0\"\n    \"\\xe6\\x97\\xa5\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe6\\x9c\\x88\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe7\\x81\\xab\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe6\\xb0\\xb4\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe6\\x9c\\xa8\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe9\\x87\\x91\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe5\\x9c\\x9f\\xe6\\x9b\\x9c\\xe6\\x97\\xa5\\0\"\n    \"\\xe6\\x9c\\x88\\0\"\n    \"\\xe7\\x81\\xab\\0\"\n    \"\\xe6\\xb0\\xb4\\0\"\n    \"\\xe6\\x9c\\xa8\\0\"\n    \"\\xe9\\x87\\x91\\0\"\n    \"\\xe5\\x9c\\x9f\\0\"\n    \"1\\0\"\n    \"2\\0\"\n    \"3\\0\"\n    \"4\\0\"\n    \"5\\0\"\n    \"6\\0\"\n    \"7\\0\"\n    \"8\\0\"\n    \"9\\0\"\n    \"10\\0\"\n    \"11\\0\"\n    \"12\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MM'\\xe6\\x9c\\x88'dd'\\xe6\\x97\\xa5'\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5 'dddd\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MM'\\xe6\\x9c\\x88'dd'\\xe6\\x97\\xa5 'dddd\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MMM'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5'\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MMM'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5 'dddd\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MMMMd'\\xe6\\x97\\xa5'\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MMMMd'\\xe6\\x97\\xa5 'dddd\\0\"\n    \"yyyy'\\xe5\\xb9\\xb4'MMM'\\xe6\\x9c\\x88'\\0\"\n    \"M\\xec\\x9b\\x94 d\\xec\\x9d\\xbc\\0\"\n    \"\\xec\\x98\\xa4\\xec\\xa0\\x84\\0\"\n    \"\\xec\\x98\\xa4\\xed\\x9b\\x84\\0\"\n    \"\\xec\\x9d\\xbc\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xec\\x9b\\x94\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xed\\x99\\x94\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xec\\x88\\x98\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xeb\\xaa\\xa9\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xea\\xb8\\x88\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xed\\x86\\xa0\\xec\\x9a\\x94\\xec\\x9d\\xbc\\0\"\n    \"\\xec\\x9d\\xbc\\0\"\n    \"\\xec\\x9b\\x94\\0\"\n    \"\\xed\\x99\\x94\\0\"\n    \"\\xec\\x88\\x98\\0\"\n    \"\\xeb\\xaa\\xa9\\0\"\n    \"\\xea\\xb8\\x88\\0\"\n    \"\\xed\\x86\\xa0\\0\"\n    \"1\\xec\\x9b\\x94\\0\"\n    \"2\\xec\\x9b\\x94\\0\"\n    \"3\\xec\\x9b\\x94\\0\"\n    \"4\\xec\\x9b\\x94\\0\"\n    \"5\\xec\\x9b\\x94\\0\"\n    \"6\\xec\\x9b\\x94\\0\"\n    \"7\\xec\\x9b\\x94\\0\"\n    \"8\\xec\\x9b\\x94\\0\"\n    \"9\\xec\\x9b\\x94\\0\"\n    \"10\\xec\\x9b\\x94\\0\"\n    \"11\\xec\\x9b\\x94\\0\"\n    \"12\\xec\\x9b\\x94\\0\"\n    \"yy-MM-dd\\0\"\n    \"yyyy'\\xeb\\x85\\x84' M'\\xec\\x9b\\x94' d'\\xec\\x9d\\xbc' dddd\\0\"\n    \"yyyy'\\xeb\\x85\\x84' M'\\xec\\x9b\\x94' d'\\xec\\x9d\\xbc'\\0\"\n    \"yy'\\xeb\\x85\\x84' M'\\xec\\x9b\\x94' d'\\xec\\x9d\\xbc' dddd\\0\"\n    \"yy'\\xeb\\x85\\x84' M'\\xec\\x9b\\x94' d'\\xec\\x9d\\xbc'\\0\"\n    \"yyyy'\\xeb\\x85\\x84' MM'\\xec\\x9b\\x94' dd'\\xec\\x9d\\xbc' dddd\\0\"\n    \"yyyy'\\xeb\\x85\\x84' MM'\\xec\\x9b\\x94' dd'\\xec\\x9d\\xbc'\\0\"\n    \"yyyy'\\xeb\\x85\\x84 'MMM'\\xec\\x9b\\x94 'd'\\xec\\x9d\\xbc 'dddd\\0\"\n    \"yyyy'\\xeb\\x85\\x84 'MMM'\\xec\\x9b\\x94 'd'\\xec\\x9d\\xbc'\\0\"\n    \"yyyy'\\xeb\\x85\\x84 'MMMM d'\\xec\\x9d\\xbc 'dddd\\0\"\n    \"yyyy'\\xeb\\x85\\x84 'MMMM d'\\xec\\x9d\\xbc'\\0\"\n    \"yyyy'\\xeb\\x85\\x84' M'\\xec\\x9b\\x94'\\0\"\n    \"yyyy'\\xeb\\x85\\x84' MMM'\\xec\\x9b\\x94'\\0\"\n    \"yyyy'\\xeb\\x85\\x84' MMMM\\0\"\n    \"a.m.\\0\"\n    \"p.m.\\0\"\n    \"zondag\\0\"\n    \"maandag\\0\"\n    \"dinsdag\\0\"\n    \"woensdag\\0\"\n    \"donderdag\\0\"\n    \"vrijdag\\0\"\n    \"zaterdag\\0\"\n    \"zo\\0\"\n    \"di\\0\"\n    \"wo\\0\"\n    \"do\\0\"\n    \"vr\\0\"\n    \"za\\0\"\n    \"Z\\0\"\n    \"januari\\0\"\n    \"februari\\0\"\n    \"maart\\0\"\n    \"mei\\0\"\n    \"augustus\\0\"\n    \"mrt\\0\"\n    \"d-M-yyyy\\0\"\n    \"dd.MMM.yyyy\\0\"\n    \"HH.mm' uur'\\0\"\n    \"HH:mm' uur'\\0\"\n    \"HH.mm.ss' uur'\\0\"\n    \"HH:mm:ss' uur'\\0\"\n    \"d.MMMM.\\0\"\n    \"s\\xc3\\xb8.\\0\"\n    \"ma.\\0\"\n    \"ti.\\0\"\n    \"on.\\0\"\n    \"to.\\0\"\n    \"fr.\\0\"\n    \"l\\xc3\\xb8.\\0\"\n    \"des\\0\"\n    \"niedziela\\0\"\n    \"poniedzia\\xc5\\x82\\x65k\\0\"\n    \"wtorek\\0\"\n    \"\\xc5\\x9broda\\0\"\n    \"czwartek\\0\"\n    \"pi\\xc4\\x85tek\\0\"\n    \"niedz.\\0\"\n    \"pon.\\0\"\n    \"wt.\\0\"\n    \"\\xc5\\x9br.\\0\"\n    \"czw.\\0\"\n    \"pt.\\0\"\n    \"sob.\\0\"\n    \"\\xc5\\x9a\\0\"\n    \"C\\0\"\n    \"stycze\\xc5\\x84\\0\"\n    \"luty\\0\"\n    \"marzec\\0\"\n    \"kwiecie\\xc5\\x84\\0\"\n    \"czerwiec\\0\"\n    \"lipiec\\0\"\n    \"sierpie\\xc5\\x84\\0\"\n    \"wrzesie\\xc5\\x84\\0\"\n    \"pa\\xc5\\xba\\x64ziernik\\0\"\n    \"grudzie\\xc5\\x84\\0\"\n    \"stycznia\\0\"\n    \"lutego\\0\"\n    \"marca\\0\"\n    \"kwietnia\\0\"\n    \"maja\\0\"\n    \"czerwca\\0\"\n    \"lipca\\0\"\n    \"sierpnia\\0\"\n    \"wrze\\xc5\\x9bnia\\0\"\n    \"pa\\xc5\\xba\\x64ziernika\\0\"\n    \"listopada\\0\"\n    \"grudnia\\0\"\n    \"sty\\0\"\n    \"lut\\0\"\n    \"kwi\\0\"\n    \"cze\\0\"\n    \"lip\\0\"\n    \"sie\\0\"\n    \"wrz\\0\"\n    \"pa\\xc5\\xba\\0\"\n    \"gru\\0\"\n    \"segunda-feira\\0\"\n    \"ter\\xc3\\xa7\\x61-feira\\0\"\n    \"quarta-feira\\0\"\n    \"quinta-feira\\0\"\n    \"sexta-feira\\0\"\n    \"seg\\0\"\n    \"ter\\0\"\n    \"qua\\0\"\n    \"qui\\0\"\n    \"sex\\0\"\n    \"s\\xc3\\xa1\\x62\\0\"\n    \"Q\\0\"\n    \"janeiro\\0\"\n    \"fevereiro\\0\"\n    \"mar\\xc3\\xa7o\\0\"\n    \"maio\\0\"\n    \"junho\\0\"\n    \"julho\\0\"\n    \"setembro\\0\"\n    \"outubro\\0\"\n    \"novembro\\0\"\n    \"dezembro\\0\"\n    \"fev\\0\"\n    \"abr\\0\"\n    \"out\\0\"\n    \"dez\\0\"\n    \"d.M.yy\\0\"\n    \"am\\0\"\n    \"sm\\0\"\n    \"dumengia\\0\"\n    \"glindesdi\\0\"\n    \"mesemna\\0\"\n    \"gievgia\\0\"\n    \"venderdi\\0\"\n    \"sonda\\0\"\n    \"du\\0\"\n    \"gli\\0\"\n    \"me\\0\"\n    \"gie\\0\"\n    \"ve\\0\"\n    \"schaner\\0\"\n    \"favrer\\0\"\n    \"avrigl\\0\"\n    \"matg\\0\"\n    \"zercladur\\0\"\n    \"fanadur\\0\"\n    \"avust\\0\"\n    \"settember\\0\"\n    \"october\\0\"\n    \"schan.\\0\"\n    \"favr.\\0\"\n    \"zercl.\\0\"\n    \"fan.\\0\"\n    \"sett.\\0\"\n    \"dddd, 'ils' d 'da' MMMM yyyy\\0\"\n    \"d 'da' MMMM yyyy\\0\"\n    \"duminic\\xc4\\x83\\0\"\n    \"luni\\0\"\n    \"mar\\xc8\\x9bi\\0\"\n    \"miercuri\\0\"\n    \"joi\\0\"\n    \"vineri\\0\"\n    \"s\\xc3\\xa2mb\\xc4\\x83t\\xc4\\x83\\0\"\n    \"Dum\\0\"\n    \"Lun\\0\"\n    \"Mie\\0\"\n    \"Joi\\0\"\n    \"Vin\\0\"\n    \"S\\xc3\\xa2m\\0\"\n    \"ianuarie\\0\"\n    \"februarie\\0\"\n    \"martie\\0\"\n    \"aprilie\\0\"\n    \"iunie\\0\"\n    \"iulie\\0\"\n    \"septembrie\\0\"\n    \"octombrie\\0\"\n    \"noiembrie\\0\"\n    \"decembrie\\0\"\n    \"ian.\\0\"\n    \"iun.\\0\"\n    \"iul.\\0\"\n    \"\\xd0\\xb4\\xd0\\xbe \\xd0\\xbf\\xd0\\xbe\\xd0\\xbb\\xd1\\x83\\xd0\\xb4\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd1\\x81\\xd0\\xbb\\xd0\\xb5 \\xd0\\xbf\\xd0\\xbe\\xd0\\xbb\\xd1\\x83\\xd0\\xb4\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xb2\\xd0\\xbe\\xd1\\x81\\xd0\\xba\\xd1\\x80\\xd0\\xb5\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\xd0\\xb5\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd0\\xbb\\xd1\\x8c\\xd0\\xbd\\xd0\\xb8\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd1\\x80\\xd0\\xb5\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\xd0\\xb3\\0\"\n    \"\\xd0\\xbf\\xd1\\x8f\\xd1\\x82\\xd0\\xbd\\xd0\\xb8\\xd1\\x86\\xd0\\xb0\\0\"\n    \"\\xd1\\x81\\xd1\\x83\\xd0\\xb1\\xd0\\xb1\\xd0\\xbe\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd0\\x92\\xd1\\x81\\0\"\n    \"\\xd0\\x9f\\xd0\\xbd\\0\"\n    \"\\xd0\\x92\\xd1\\x82\\0\"\n    \"\\xd0\\xa1\\xd1\\x80\\0\"\n    \"\\xd0\\xa7\\xd1\\x82\\0\"\n    \"\\xd0\\x9f\\xd1\\x82\\0\"\n    \"\\xd0\\xa1\\xd0\\xb1\\0\"\n    \"\\xd0\\x92\\0\"\n    \"\\xd0\\x9f\\0\"\n    \"\\xd0\\xa1\\0\"\n    \"\\xd0\\xa7\\0\"\n    \"\\xd0\\xaf\\xd0\\xbd\\xd0\\xb2\\xd0\\xb0\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd0\\xa4\\xd0\\xb5\\xd0\\xb2\\xd1\\x80\\xd0\\xb0\\xd0\\xbb\\xd1\\x8c\\0\"\n    \"\\xd0\\x9c\\xd0\\xb0\\xd1\\x80\\xd1\\x82\\0\"\n    \"\\xd0\\x90\\xd0\\xbf\\xd1\\x80\\xd0\\xb5\\xd0\\xbb\\xd1\\x8c\\0\"\n    \"\\xd0\\x9c\\xd0\\xb0\\xd0\\xb9\\0\"\n    \"\\xd0\\x98\\xd1\\x8e\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\x98\\xd1\\x8e\\xd0\\xbb\\xd1\\x8c\\0\"\n    \"\\xd0\\x90\\xd0\\xb2\\xd0\\xb3\\xd1\\x83\\xd1\\x81\\xd1\\x82\\0\"\n    \"\\xd0\\xa1\\xd0\\xb5\\xd0\\xbd\\xd1\\x82\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd0\\x9e\\xd0\\xba\\xd1\\x82\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd0\\x9d\\xd0\\xbe\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd0\\x94\\xd0\\xb5\\xd0\\xba\\xd0\\xb0\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd1\\x8f\\xd0\\xbd\\xd0\\xb2\\xd0\\xb0\\xd1\\x80\\xd1\\x8f\\0\"\n    \"\\xd1\\x84\\xd0\\xb5\\xd0\\xb2\\xd1\\x80\\xd0\\xb0\\xd0\\xbb\\xd1\\x8f\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x80\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd0\\xb0\\xd0\\xbf\\xd1\\x80\\xd0\\xb5\\xd0\\xbb\\xd1\\x8f\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x8f\\0\"\n    \"\\xd0\\xb8\\xd1\\x8e\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xb8\\xd1\\x8e\\xd0\\xbb\\xd1\\x8f\\0\"\n    \"\\xd0\\xb0\\xd0\\xb2\\xd0\\xb3\\xd1\\x83\\xd1\\x81\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd1\\x82\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8f\\0\"\n    \"\\xd0\\xbe\\xd0\\xba\\xd1\\x82\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8f\\0\"\n    \"\\xd0\\xbd\\xd0\\xbe\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8f\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd0\\xba\\xd0\\xb0\\xd0\\xb1\\xd1\\x80\\xd1\\x8f\\0\"\n    \"\\xd0\\xaf\\xd0\\xbd\\xd0\\xb2.\\0\"\n    \"\\xd0\\xa4\\xd0\\xb5\\xd0\\xb2\\xd1\\x80.\\0\"\n    \"\\xd0\\x90\\xd0\\xbf\\xd1\\x80.\\0\"\n    \"\\xd0\\x90\\xd0\\xb2\\xd0\\xb3.\\0\"\n    \"\\xd0\\xa1\\xd0\\xb5\\xd0\\xbd\\xd1\\x82.\\0\"\n    \"\\xd0\\x9e\\xd0\\xba\\xd1\\x82.\\0\"\n    \"\\xd0\\x9d\\xd0\\xbe\\xd1\\x8f\\xd0\\xb1.\\0\"\n    \"\\xd0\\x94\\xd0\\xb5\\xd0\\xba.\\0\"\n    \"nedjelja\\0\"\n    \"ponedjeljak\\0\"\n    \"utorak\\0\"\n    \"srijeda\\0\"\n    \"\\xc4\\x8d\\x65tvrtak\\0\"\n    \"petak\\0\"\n    \"subota\\0\"\n    \"ned\\0\"\n    \"pon\\0\"\n    \"uto\\0\"\n    \"sri\\0\"\n    \"\\xc4\\x8d\\x65t\\0\"\n    \"pet\\0\"\n    \"sub\\0\"\n    \"n\\0\"\n    \"p\\0\"\n    \"u\\0\"\n    \"s\\0\"\n    \"\\xc4\\x8d\\0\"\n    \"sije\\xc4\\x8d\\x61nj\\0\"\n    \"velja\\xc4\\x8d\\x61\\0\"\n    \"o\\xc5\\xbeujak\\0\"\n    \"travanj\\0\"\n    \"svibanj\\0\"\n    \"lipanj\\0\"\n    \"srpanj\\0\"\n    \"kolovoz\\0\"\n    \"rujan\\0\"\n    \"studeni\\0\"\n    \"prosinac\\0\"\n    \"sije\\xc4\\x8dnja\\0\"\n    \"velja\\xc4\\x8d\\x65\\0\"\n    \"o\\xc5\\xbeujka\\0\"\n    \"travnja\\0\"\n    \"svibnja\\0\"\n    \"lipnja\\0\"\n    \"srpnja\\0\"\n    \"kolovoza\\0\"\n    \"rujna\\0\"\n    \"studenoga\\0\"\n    \"prosinca\\0\"\n    \"sij\\0\"\n    \"velj\\0\"\n    \"o\\xc5\\xbeu\\0\"\n    \"tra\\0\"\n    \"svi\\0\"\n    \"kol\\0\"\n    \"ruj\\0\"\n    \"stu\\0\"\n    \"d.M.yyyy.\\0\"\n    \"d.M.yy.\\0\"\n    \"d. M. yyyy.\\0\"\n    \"dd.MM.yyyy.\\0\"\n    \"d. M. yy.\\0\"\n    \"dd.MM.yy.\\0\"\n    \"dd. MM. yy.\\0\"\n    \"d. MMMM yyyy.\\0\"\n    \"dd. MMMM yyyy.\\0\"\n    \"dddd, d. MMMM yyyy.\\0\"\n    \"nede\\xc4\\xbe\\x61\\0\"\n    \"pondelok\\0\"\n    \"utorok\\0\"\n    \"streda\\0\"\n    \"\\xc5\\xa1tvrtok\\0\"\n    \"piatok\\0\"\n    \"ut\\0\"\n    \"\\xc5\\xa1t\\0\"\n    \"pi\\0\"\n    \"U\\0\"\n    \"\\xc5\\xa0\\0\"\n    \"marec\\0\"\n    \"m\\xc3\\xa1j\\0\"\n    \"j\\xc3\\xban\\0\"\n    \"j\\xc3\\xbal\\0\"\n    \"janu\\xc3\\xa1ra\\0\"\n    \"febru\\xc3\\xa1ra\\0\"\n    \"apr\\xc3\\xadla\\0\"\n    \"m\\xc3\\xa1ja\\0\"\n    \"j\\xc3\\xbana\\0\"\n    \"j\\xc3\\xbala\\0\"\n    \"augusta\\0\"\n    \"septembra\\0\"\n    \"okt\\xc3\\xb3\\x62ra\\0\"\n    \"novembra\\0\"\n    \"decembra\\0\"\n    \"paradite\\0\"\n    \"pasdite\\0\"\n    \"e diel\\0\"\n    \"e h\\xc3\\xabn\\xc3\\xab\\0\"\n    \"e mart\\xc3\\xab\\0\"\n    \"e m\\xc3\\xabrkur\\xc3\\xab\\0\"\n    \"e enjte\\0\"\n    \"e premte\\0\"\n    \"e shtun\\xc3\\xab\\0\"\n    \"Die\\0\"\n    \"H\\xc3\\xabn\\0\"\n    \"M\\xc3\\xabr\\0\"\n    \"Enj\\0\"\n    \"Pre\\0\"\n    \"Sht\\0\"\n    \"E\\0\"\n    \"janar\\0\"\n    \"shkurt\\0\"\n    \"prill\\0\"\n    \"qershor\\0\"\n    \"korrik\\0\"\n    \"gusht\\0\"\n    \"shtator\\0\"\n    \"tetor\\0\"\n    \"n\\xc3\\xabntor\\0\"\n    \"dhjetor\\0\"\n    \"Shk\\0\"\n    \"Pri\\0\"\n    \"Maj\\0\"\n    \"Qer\\0\"\n    \"Kor\\0\"\n    \"Gsh\\0\"\n    \"Tet\\0\"\n    \"N\\xc3\\xabn\\0\"\n    \"Dhj\\0\"\n    \"'den 'd MMMM\\0\"\n    \"FM\\0\"\n    \"EM\\0\"\n    \"s\\xc3\\xb6ndag\\0\"\n    \"m\\xc3\\xa5ndag\\0\"\n    \"tisdag\\0\"\n    \"l\\xc3\\xb6rdag\\0\"\n    \"s\\xc3\\xb6n\\0\"\n    \"m\\xc3\\xa5n\\0\"\n    \"tis\\0\"\n    \"l\\xc3\\xb6r\\0\"\n    \"augusti\\0\"\n    \"'den 'd MMMM yyyy\\0\"\n    \"dddd' den 'd MMMM yyyy\\0\"\n    \"'kl 'H:mm\\0\"\n    \"'kl 'H:mm:ss\\0\"\n    \"dd MMM yyyy\\0\"\n    \"ddd d MMMM yyyy\\0\"\n    \"'\\xe0\\xb8\\xa7\\xe0\\xb8\\xb1\\xe0\\xb8\\x99'dddd'\\xe0\\xb8\\x97\\xe0\\xb8\\xb5\\xe0\\xb9\\x88' d MMMM gg yyyy\\0\"\n    \"\\xc3\\x96\\xc3\\x96\\0\"\n    \"\\xc3\\x96S\\0\"\n    \"Pazar\\0\"\n    \"Pazartesi\\0\"\n    \"Sal\\xc4\\xb1\\0\"\n    \"\\xc3\\x87\\x61r\\xc5\\x9f\\x61mba\\0\"\n    \"Per\\xc5\\x9f\\x65mbe\\0\"\n    \"Cuma\\0\"\n    \"Cumartesi\\0\"\n    \"Paz\\0\"\n    \"Pzt\\0\"\n    \"Sal\\0\"\n    \"\\xc3\\x87\\x61r\\0\"\n    \"Per\\0\"\n    \"Cum\\0\"\n    \"Cmt\\0\"\n    \"\\xc3\\x87\\0\"\n    \"Ocak\\0\"\n    \"\\xc5\\x9eubat\\0\"\n    \"Mart\\0\"\n    \"Nisan\\0\"\n    \"May\\xc4\\xb1s\\0\"\n    \"Haziran\\0\"\n    \"Temmuz\\0\"\n    \"A\\xc4\\x9fustos\\0\"\n    \"Eyl\\xc3\\xbcl\\0\"\n    \"Ekim\\0\"\n    \"Kas\\xc4\\xb1m\\0\"\n    \"Aral\\xc4\\xb1k\\0\"\n    \"Oca\\0\"\n    \"\\xc5\\x9eub\\0\"\n    \"Nis\\0\"\n    \"Haz\\0\"\n    \"Tem\\0\"\n    \"A\\xc4\\x9fu\\0\"\n    \"Eyl\\0\"\n    \"Eki\\0\"\n    \"Kas\\0\"\n    \"Ara\\0\"\n    \"d.MM.yyyy\\0\"\n    \"d MMMM yyyy dddd\\0\"\n    \"\\xd9\\x82\\xd8\\xa8\\xd9\\x84 \\xd8\\xaf\\xd9\\x88\\xd9\\xbe\\xdb\\x81\\xd8\\xb1\\0\"\n    \"\\xd8\\xa8\\xd8\\xb9\\xd8\\xaf \\xd8\\xaf\\xd9\\x88\\xd9\\xbe\\xdb\\x81\\xd8\\xb1\\0\"\n    \"\\xd8\\xa7\\xd8\\xaa\\xd9\\x88\\xd8\\xa7\\xd8\\xb1\\0\"\n    \"\\xd8\\xb3\\xd9\\x88\\xd9\\x85\\xd9\\x88\\xd8\\xa7\\xd8\\xb1\\0\"\n    \"\\xd9\\x85\\xd9\\x86\\xda\\xaf\\xd9\\x84\\0\"\n    \"\\xd8\\xa8\\xd8\\xaf\\xda\\xbe\\0\"\n    \"\\xd8\\xac\\xd9\\x85\\xd8\\xb9\\xd8\\xb1\\xd8\\xa7\\xd8\\xaa\\0\"\n    \"\\xd8\\xac\\xd9\\x85\\xd8\\xb9\\xdb\\x81\\0\"\n    \"\\xdb\\x81\\xd9\\x81\\xd8\\xaa\\xdb\\x81\\0\"\n    \"\\xd8\\xac\\xd9\\x86\\xd9\\x88\\xd8\\xb1\\xdb\\x8c\\0\"\n    \"\\xd9\\x81\\xd8\\xb1\\xd9\\x88\\xd8\\xb1\\xdb\\x8c\\0\"\n    \"\\xd9\\x85\\xd8\\xa7\\xd8\\xb1\\xda\\x86\\0\"\n    \"\\xd8\\xa7\\xd9\\xbe\\xd8\\xb1\\xdb\\x8c\\xd9\\x84\\0\"\n    \"\\xd9\\x85\\xd8\\xa6\\xdb\\x8c\\0\"\n    \"\\xd8\\xac\\xd9\\x88\\xd9\\x86\\0\"\n    \"\\xd8\\xac\\xd9\\x88\\xd9\\x84\\xd8\\xa7\\xd8\\xa6\\xdb\\x8c\\0\"\n    \"\\xd8\\xa7\\xda\\xaf\\xd8\\xb3\\xd8\\xaa\\0\"\n    \"\\xd8\\xb3\\xd8\\xaa\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd8\\xa7\\xda\\xa9\\xd8\\xaa\\xd9\\x88\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd9\\x86\\xd9\\x88\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd8\\xaf\\xd8\\xb3\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"dd MMMM, yyyy\\0\"\n    \"Minggu\\0\"\n    \"Senin\\0\"\n    \"Selasa\\0\"\n    \"Rabu\\0\"\n    \"Kamis\\0\"\n    \"Jumat\\0\"\n    \"Sabtu\\0\"\n    \"Min\\0\"\n    \"Sen\\0\"\n    \"Sel\\0\"\n    \"Rab\\0\"\n    \"Kam\\0\"\n    \"Jum\\0\"\n    \"Sab\\0\"\n    \"R\\0\"\n    \"Januari\\0\"\n    \"Februari\\0\"\n    \"Maret\\0\"\n    \"Mei\\0\"\n    \"Agustus\\0\"\n    \"Desember\\0\"\n    \"Agt\\0\"\n    \"Des\\0\"\n    \"dddd, dd MMMM yyyy\\0\"\n    \"\\xd0\\xb4\\xd0\\xbf\\0\"\n    \"\\xd0\\xbf\\xd0\\xbf\\0\"\n    \"\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd1\\x96\\xd0\\xbb\\xd1\\x8f\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd1\\x96\\xd0\\xbb\\xd0\\xbe\\xd0\\xba\\0\"\n    \"\\xd0\\xb2\\xd1\\x96\\xd0\\xb2\\xd1\\x82\\xd0\\xbe\\xd1\\x80\\xd0\\xbe\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd1\\x80\\xd0\\xb5\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\0\"\n    \"\\xd0\\xbf\\xca\\xbc\\xd1\\x8f\\xd1\\x82\\xd0\\xbd\\xd0\\xb8\\xd1\\x86\\xd1\\x8f\\0\"\n    \"\\xd1\\x81\\xd1\\x83\\xd0\\xb1\\xd0\\xbe\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd0\\x9d\\xd0\\xb4\\0\"\n    \"\\xd0\\x9d\\0\"\n    \"\\xd0\\xa1\\xd1\\x96\\xd1\\x87\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\x9b\\xd1\\x8e\\xd1\\x82\\xd0\\xb8\\xd0\\xb9\\0\"\n    \"\\xd0\\x91\\xd0\\xb5\\xd1\\x80\\xd0\\xb5\\xd0\\xb7\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\x9a\\xd0\\xb2\\xd1\\x96\\xd1\\x82\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xa2\\xd1\\x80\\xd0\\xb0\\xd0\\xb2\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xa7\\xd0\\xb5\\xd1\\x80\\xd0\\xb2\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\x9b\\xd0\\xb8\\xd0\\xbf\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xa1\\xd0\\xb5\\xd1\\x80\\xd0\\xbf\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\x92\\xd0\\xb5\\xd1\\x80\\xd0\\xb5\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\x96\\xd0\\xbe\\xd0\\xb2\\xd1\\x82\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\x9b\\xd0\\xb8\\xd1\\x81\\xd1\\x82\\xd0\\xbe\\xd0\\xbf\\xd0\\xb0\\xd0\\xb4\\0\"\n    \"\\xd0\\x93\\xd1\\x80\\xd1\\x83\\xd0\\xb4\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd1\\x81\\xd1\\x96\\xd1\\x87\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xbb\\xd1\\x8e\\xd1\\x82\\xd0\\xbe\\xd0\\xb3\\xd0\\xbe\\0\"\n    \"\\xd0\\xb1\\xd0\\xb5\\xd1\\x80\\xd0\\xb5\\xd0\\xb7\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xba\\xd0\\xb2\\xd1\\x96\\xd1\\x82\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd1\\x82\\xd1\\x80\\xd0\\xb0\\xd0\\xb2\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x80\\xd0\\xb2\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xbb\\xd0\\xb8\\xd0\\xbf\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd1\\x80\\xd0\\xbf\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\xd0\\xb5\\xd1\\x81\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xb6\\xd0\\xbe\\xd0\\xb2\\xd1\\x82\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xbb\\xd0\\xb8\\xd1\\x81\\xd1\\x82\\xd0\\xbe\\xd0\\xbf\\xd0\\xb0\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd0\\xb3\\xd1\\x80\\xd1\\x83\\xd0\\xb4\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xa1\\xd1\\x96\\xd1\\x87\\0\"\n    \"\\xd0\\x9b\\xd1\\x8e\\xd1\\x82\\0\"\n    \"\\xd0\\x91\\xd0\\xb5\\xd1\\x80\\0\"\n    \"\\xd0\\x9a\\xd0\\xb2\\xd1\\x96\\0\"\n    \"\\xd0\\xa2\\xd1\\x80\\xd0\\xb0\\0\"\n    \"\\xd0\\xa7\\xd0\\xb5\\xd1\\x80\\0\"\n    \"\\xd0\\x9b\\xd0\\xb8\\xd0\\xbf\\0\"\n    \"\\xd0\\xa1\\xd0\\xb5\\xd1\\x80\\0\"\n    \"\\xd0\\x92\\xd0\\xb5\\xd1\\x80\\0\"\n    \"\\xd0\\x96\\xd0\\xbe\\xd0\\xb2\\0\"\n    \"\\xd0\\x9b\\xd0\\xb8\\xd1\\x81\\0\"\n    \"\\xd0\\x93\\xd1\\x80\\xd1\\x83\\0\"\n    \"d MMMM yyyy' \\xd1\\x80.'\\0\"\n    \"MMMM yyyy' \\xd1\\x80.'\\0\"\n    \"\\xd1\\x80\\xd0\\xb0\\xd0\\xbd\\xd1\\x96\\xd1\\x86\\xd1\\x8b\\0\"\n    \"\\xd0\\xb2\\xd0\\xb5\\xd1\\x87\\xd0\\xb0\\xd1\\x80\\xd0\\xb0\\0\"\n    \"\\xd0\\xbd\\xd1\\x8f\\xd0\\xb4\\xd0\\xb7\\xd0\\xb5\\xd0\\xbb\\xd1\\x8f\\0\"\n    \"\\xd0\\xbf\\xd0\\xb0\\xd0\\xbd\\xd1\\x8f\\xd0\\xb4\\xd0\\xb7\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\xd0\\xba\\0\"\n    \"\\xd0\\xb0\\xd1\\x9e\\xd1\\x82\\xd0\\xbe\\xd1\\x80\\xd0\\xb0\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd1\\x80\\xd0\\xb0\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd0\\xb0\\xd1\\x86\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\0\"\n    \"\\xd0\\xbf\\xd1\\x8f\\xd1\\x82\\xd0\\xbd\\xd1\\x96\\xd1\\x86\\xd0\\xb0\\0\"\n    \"\\xd0\\xb0\\xd1\\x9e\\0\"\n    \"\\xd1\\x87\\xd1\\x86\\0\"\n    \"\\xd0\\xb0\\0\"\n    \"\\xd1\\x81\\xd1\\x82\\xd1\\x83\\xd0\\xb4\\xd0\\xb7\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xbb\\xd1\\x8e\\xd1\\x82\\xd1\\x8b\\0\"\n    \"\\xd1\\x81\\xd0\\xb0\\xd0\\xba\\xd0\\xb0\\xd0\\xb2\\xd1\\x96\\xd0\\xba\\0\"\n    \"\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\xd1\\x81\\xd0\\xb0\\xd0\\xb2\\xd1\\x96\\xd0\\xba\\0\"\n    \"\\xd1\\x87\\xd1\\x8d\\xd1\\x80\\xd0\\xb2\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xbb\\xd1\\x96\\xd0\\xbf\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xb6\\xd0\\xbd\\xd1\\x96\\xd0\\xb2\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\xd0\\xb0\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xba\\xd0\\xb0\\xd1\\x81\\xd1\\x82\\xd1\\x80\\xd1\\x8b\\xd1\\x87\\xd0\\xbd\\xd1\\x96\\xd0\\xba\\0\"\n    \"\\xd0\\xbb\\xd1\\x96\\xd1\\x81\\xd1\\x82\\xd0\\xb0\\xd0\\xbf\\xd0\\xb0\\xd0\\xb4\\0\"\n    \"\\xd1\\x81\\xd0\\xbd\\xd0\\xb5\\xd0\\xb6\\xd0\\xb0\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd1\\x81\\xd1\\x82\\xd1\\x83\\xd0\\xb4\\xd0\\xb7\\xd0\\xb5\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xbb\\xd1\\x8e\\xd1\\x82\\xd0\\xb0\\xd0\\xb3\\xd0\\xb0\\0\"\n    \"\\xd1\\x81\\xd0\\xb0\\xd0\\xba\\xd0\\xb0\\xd0\\xb2\\xd1\\x96\\xd0\\xba\\xd0\\xb0\\0\"\n    \"\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\xd1\\x81\\xd0\\xb0\\xd0\\xb2\\xd1\\x96\\xd0\\xba\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd1\\x8d\\xd1\\x80\\xd0\\xb2\\xd0\\xb5\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xbb\\xd1\\x96\\xd0\\xbf\\xd0\\xb5\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xb6\\xd0\\xbd\\xd1\\x96\\xd1\\x9e\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\xd0\\xb0\\xd1\\x81\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd0\\xba\\xd0\\xb0\\xd1\\x81\\xd1\\x82\\xd1\\x80\\xd1\\x8b\\xd1\\x87\\xd0\\xbd\\xd1\\x96\\xd0\\xba\\xd0\\xb0\\0\"\n    \"\\xd0\\xbb\\xd1\\x96\\xd1\\x81\\xd1\\x82\\xd0\\xb0\\xd0\\xbf\\xd0\\xb0\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd1\\x81\\xd0\\xbd\\xd0\\xb5\\xd0\\xb6\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"\\xd1\\x81\\xd1\\x82\\xd1\\x83\\0\"\n    \"\\xd0\\xbb\\xd1\\x8e\\xd1\\x82\\0\"\n    \"\\xd1\\x81\\xd0\\xb0\\xd0\\xba\\0\"\n    \"\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd1\\x8d\\xd1\\x80\\0\"\n    \"\\xd0\\xbb\\xd1\\x96\\xd0\\xbf\\0\"\n    \"\\xd0\\xb6\\xd0\\xbd\\xd1\\x96\\0\"\n    \"\\xd0\\xb2\\xd0\\xb5\\xd1\\x80\\0\"\n    \"\\xd0\\xba\\xd0\\xb0\\xd1\\x81\\0\"\n    \"\\xd0\\xbb\\xd1\\x96\\xd1\\x81\\0\"\n    \"\\xd1\\x81\\xd0\\xbd\\xd0\\xb5\\0\"\n    \"MMMM yyyy \\xd0\\xb3.\\0\"\n    \"dop.\\0\"\n    \"pop.\\0\"\n    \"nedelja\\0\"\n    \"ponedeljek\\0\"\n    \"torek\\0\"\n    \"sreda\\0\"\n    \"\\xc4\\x8d\\x65trtek\\0\"\n    \"petek\\0\"\n    \"sre\\0\"\n    \"sob\\0\"\n    \"t\\0\"\n    \"junij\\0\"\n    \"julij\\0\"\n    \"avgust\\0\"\n    \"avg\\0\"\n    \"d. MM. yyyy\\0\"\n    \"dddd, dd. MMMM yyyy\\0\"\n    \"dd. MMMM yyyy\\0\"\n    \"e.k.\\0\"\n    \"p.k.\\0\"\n    \"p\\xc3\\xbchap\\xc3\\xa4\\x65v\\0\"\n    \"esmasp\\xc3\\xa4\\x65v\\0\"\n    \"teisip\\xc3\\xa4\\x65v\\0\"\n    \"kolmap\\xc3\\xa4\\x65v\\0\"\n    \"neljap\\xc3\\xa4\\x65v\\0\"\n    \"reede\\0\"\n    \"laup\\xc3\\xa4\\x65v\\0\"\n    \"jaanuar\\0\"\n    \"veebruar\\0\"\n    \"m\\xc3\\xa4rts\\0\"\n    \"aprill\\0\"\n    \"juuni\\0\"\n    \"juuli\\0\"\n    \"oktoober\\0\"\n    \"detsember\\0\"\n    \"jaan\\0\"\n    \"veebr\\0\"\n    \"sept\\0\"\n    \"dets\\0\"\n    \"H:mm.ss\\0\"\n    \"priek\\xc5\\xa1pusdien\\xc4\\x81\\0\"\n    \"p\\xc4\\x93\\x63pusdien\\xc4\\x81\\0\"\n    \"sv\\xc4\\x93tdiena\\0\"\n    \"pirmdiena\\0\"\n    \"otrdiena\\0\"\n    \"tre\\xc5\\xa1\\x64iena\\0\"\n    \"ceturtdiena\\0\"\n    \"piektdiena\\0\"\n    \"sestdiena\\0\"\n    \"Sv\\0\"\n    \"Pr\\0\"\n    \"Ot\\0\"\n    \"Tr\\0\"\n    \"Ce\\0\"\n    \"Pk\\0\"\n    \"Se\\0\"\n    \"Janv\\xc4\\x81ris\\0\"\n    \"Febru\\xc4\\x81ris\\0\"\n    \"Marts\\0\"\n    \"Apr\\xc4\\xablis\\0\"\n    \"Maijs\\0\"\n    \"J\\xc5\\xabnijs\\0\"\n    \"J\\xc5\\xablijs\\0\"\n    \"Augusts\\0\"\n    \"Septembris\\0\"\n    \"Oktobris\\0\"\n    \"Novembris\\0\"\n    \"Decembris\\0\"\n    \"janv\\xc4\\x81ris\\0\"\n    \"febru\\xc4\\x81ris\\0\"\n    \"apr\\xc4\\xablis\\0\"\n    \"maijs\\0\"\n    \"j\\xc5\\xabnijs\\0\"\n    \"j\\xc5\\xablijs\\0\"\n    \"augusts\\0\"\n    \"septembris\\0\"\n    \"oktobris\\0\"\n    \"novembris\\0\"\n    \"decembris\\0\"\n    \"Janv.\\0\"\n    \"Febr.\\0\"\n    \"Apr.\\0\"\n    \"J\\xc5\\xabn.\\0\"\n    \"J\\xc5\\xabl.\\0\"\n    \"Aug.\\0\"\n    \"Okt.\\0\"\n    \"Dec.\\0\"\n    \"yyyy. 'gada' d. MMM\\0\"\n    \"dddd, yyyy. 'gada' d. MMMM\\0\"\n    \"yyyy. 'gada' d. MMMM\\0\"\n    \"yyyy. 'g'. MMMM\\0\"\n    \"pr.p.\\0\"\n    \"sekmadienis\\0\"\n    \"pirmadienis\\0\"\n    \"antradienis\\0\"\n    \"tre\\xc4\\x8diadienis\\0\"\n    \"ketvirtadienis\\0\"\n    \"penktadienis\\0\"\n    \"\\xc5\\xa1\\x65\\xc5\\xa1tadienis\\0\"\n    \"sk\\0\"\n    \"pr\\0\"\n    \"an\\0\"\n    \"tr\\0\"\n    \"kt\\0\"\n    \"pn\\0\"\n    \"A\\0\"\n    \"sausis\\0\"\n    \"vasaris\\0\"\n    \"kovas\\0\"\n    \"balandis\\0\"\n    \"gegu\\xc5\\xbe\\xc4\\x97\\0\"\n    \"bir\\xc5\\xbe\\x65lis\\0\"\n    \"liepa\\0\"\n    \"rugpj\\xc5\\xabtis\\0\"\n    \"rugs\\xc4\\x97jis\\0\"\n    \"spalis\\0\"\n    \"lapkritis\\0\"\n    \"gruodis\\0\"\n    \"saus.\\0\"\n    \"vas.\\0\"\n    \"kov.\\0\"\n    \"bal.\\0\"\n    \"geg.\\0\"\n    \"bir\\xc5\\xbe.\\0\"\n    \"liep.\\0\"\n    \"rugp.\\0\"\n    \"rugs.\\0\"\n    \"spal.\\0\"\n    \"lapkr.\\0\"\n    \"gruod.\\0\"\n    \"yyyy 'm'. MMMM d 'd'., dddd\\0\"\n    \"yyyy 'm'. MMMM d 'd'.\\0\"\n    \"yyyy MMMM\\0\"\n    \"\\xd0\\xbf\\xd0\\xb5. \\xd1\\x87\\xd0\\xbe.\\0\"\n    \"\\xd0\\xbf\\xd0\\xb0. \\xd1\\x87\\xd0\\xbe.\\0\"\n    \"\\xd0\\xaf\\xd0\\xba\\xd1\\x88\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb5\\0\"\n    \"\\xd0\\x94\\xd1\\x83\\xd1\\x88\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb5\\0\"\n    \"\\xd0\\xa1\\xd0\\xb5\\xd1\\x88\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb5\\0\"\n    \"\\xd0\\xa7\\xd0\\xbe\\xd1\\x80\\xd1\\x88\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb5\\0\"\n    \"\\xd0\\x9f\\xd0\\xb0\\xd0\\xbd\\xd2\\xb7\\xd1\\x88\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb5\\0\"\n    \"\\xd2\\xb6\\xd1\\x83\\xd0\\xbc\\xd1\\x8a\\xd0\\xb0\\0\"\n    \"\\xd0\\xa8\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb5\\0\"\n    \"\\xd0\\xaf\\xd1\\x88\\xd0\\xb1\\0\"\n    \"\\xd0\\x94\\xd1\\x88\\xd0\\xb1\\0\"\n    \"\\xd0\\xa1\\xd1\\x88\\xd0\\xb1\\0\"\n    \"\\xd0\\xa7\\xd1\\x88\\xd0\\xb1\\0\"\n    \"\\xd0\\x9f\\xd1\\x88\\xd0\\xb1\\0\"\n    \"\\xd2\\xb6\\xd0\\xbc\\xd1\\x8a\\0\"\n    \"\\xd0\\xa8\\xd0\\xbd\\xd0\\xb1\\0\"\n    \"\\xd0\\xaf\\xd0\\xbd\\xd0\\xb2\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xa4\\xd0\\xb5\\xd0\\xb2\\xd1\\x80\\xd0\\xb0\\xd0\\xbb\\0\"\n    \"\\xd0\\x90\\xd0\\xbf\\xd1\\x80\\xd0\\xb5\\xd0\\xbb\\0\"\n    \"\\xd0\\x98\\xd1\\x8e\\xd0\\xbd\\0\"\n    \"\\xd0\\x98\\xd1\\x8e\\xd0\\xbb\\0\"\n    \"\\xd0\\xa1\\xd0\\xb5\\xd0\\xbd\\xd1\\x82\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\0\"\n    \"\\xd0\\x9e\\xd0\\xba\\xd1\\x82\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\0\"\n    \"\\xd0\\x9d\\xd0\\xbe\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\0\"\n    \"\\xd0\\x94\\xd0\\xb5\\xd0\\xba\\xd0\\xb0\\xd0\\xb1\\xd1\\x80\\0\"\n    \"\\xd0\\xaf\\xd0\\xbd\\xd0\\xb2\\0\"\n    \"\\xd0\\xa4\\xd0\\xb5\\xd0\\xb2\\0\"\n    \"\\xd0\\x9c\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x90\\xd0\\xbf\\xd1\\x80\\0\"\n    \"\\xd0\\x90\\xd0\\xb2\\xd0\\xb3\\0\"\n    \"\\xd0\\xa1\\xd0\\xb5\\xd0\\xbd\\0\"\n    \"\\xd0\\x9e\\xd0\\xba\\xd1\\x82\\0\"\n    \"\\xd0\\x9d\\xd0\\xbe\\xd1\\x8f\\0\"\n    \"\\xd0\\x94\\xd0\\xb5\\xd0\\xba\\0\"\n    \"d MMMM yyyy' \\xd1\\x81.'\\0\"\n    \"dd MMMM yyyy' \\xd1\\x81.'\\0\"\n    \"\\xd9\\x82\\xd8\\xa8\\xd9\\x84\\xe2\\x80\\x8c\\xd8\\xa7\\xd8\\xb2\\xd8\\xb8\\xd9\\x87\\xd8\\xb1\\0\"\n    \"\\xd8\\xa8\\xd8\\xb9\\xd8\\xaf\\xd8\\xa7\\xd8\\xb2\\xd8\\xb8\\xd9\\x87\\xd8\\xb1\\0\"\n    \"\\xdb\\x8c\\xda\\xa9\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xd8\\xaf\\xd9\\x88\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xd8\\xb3\\xd9\\x87\\xe2\\x80\\x8c\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xda\\x86\\xd9\\x87\\xd8\\xa7\\xd8\\xb1\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xd9\\xbe\\xd9\\x86\\xd8\\xac\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xd8\\xac\\xd9\\x85\\xd8\\xb9\\xd9\\x87\\0\"\n    \"\\xd8\\xb4\\xd9\\x86\\xd8\\xa8\\xd9\\x87\\0\"\n    \"\\xdb\\x8c\\0\"\n    \"\\xd8\\xaf\\0\"\n    \"\\xd8\\xb3\\0\"\n    \"\\xda\\x86\\0\"\n    \"\\xd9\\xbe\\0\"\n    \"\\xd8\\xac\\0\"\n    \"\\xd8\\xb4\\0\"\n    \"\\xda\\x98\\xd8\\xa7\\xd9\\x86\\xd9\\x88\\xdb\\x8c\\xd9\\x87\\0\"\n    \"\\xd9\\x81\\xd9\\x88\\xd8\\xb1\\xdb\\x8c\\xd9\\x87\\0\"\n    \"\\xd9\\x85\\xd8\\xa7\\xd8\\xb1\\xd8\\xb3\\0\"\n    \"\\xd8\\xa2\\xd9\\x88\\xd8\\xb1\\xdb\\x8c\\xd9\\x84\\0\"\n    \"\\xd9\\x85\\xd9\\x87\\0\"\n    \"\\xda\\x98\\xd9\\x88\\xd8\\xa6\\xd9\\x86\\0\"\n    \"\\xda\\x98\\xd9\\x88\\xd8\\xa6\\xdb\\x8c\\xd9\\x87\\0\"\n    \"\\xd8\\xa7\\xd9\\x88\\xd8\\xaa\\0\"\n    \"\\xd8\\xb3\\xd9\\xbe\\xd8\\xaa\\xd8\\xa7\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd8\\xa7\\xda\\xa9\\xd8\\xaa\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd9\\x86\\xd9\\x88\\xd8\\xa7\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd8\\xaf\\xd8\\xb3\\xd8\\xa7\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xda\\x98\\xd8\\xa7\\xd9\\x86\\xd9\\x88\\xdb\\x8c\\xd9\\x87\\xd9\\x94\\0\"\n    \"\\xd9\\x81\\xd9\\x88\\xd8\\xb1\\xdb\\x8c\\xd9\\x87\\xd9\\x94\\0\"\n    \"\\xd9\\x85\\xd9\\x87\\xd9\\x94\\0\"\n    \"\\xda\\x98\\xd9\\x88\\xd8\\xa6\\xdb\\x8c\\xd9\\x87\\xd9\\x94\\0\"\n    \"SA\\0\"\n    \"CH\\0\"\n    \"Ch\\xe1\\xbb\\xa7 Nh\\xe1\\xba\\xadt\\0\"\n    \"Th\\xe1\\xbb\\xa9 Hai\\0\"\n    \"Th\\xe1\\xbb\\xa9 Ba\\0\"\n    \"Th\\xe1\\xbb\\xa9 T\\xc6\\xb0\\0\"\n    \"Th\\xe1\\xbb\\xa9 N\\xc4\\x83m\\0\"\n    \"Th\\xe1\\xbb\\xa9 S\\xc3\\xa1u\\0\"\n    \"Th\\xe1\\xbb\\xa9 B\\xe1\\xba\\xa3y\\0\"\n    \"CN\\0\"\n    \"Th 2\\0\"\n    \"Th 3\\0\"\n    \"Th 4\\0\"\n    \"Th 5\\0\"\n    \"Th 6\\0\"\n    \"Th 7\\0\"\n    \"T2\\0\"\n    \"T3\\0\"\n    \"T4\\0\"\n    \"T5\\0\"\n    \"T6\\0\"\n    \"T7\\0\"\n    \"Th\\xc3\\xa1ng 1\\0\"\n    \"Th\\xc3\\xa1ng 2\\0\"\n    \"Th\\xc3\\xa1ng 3\\0\"\n    \"Th\\xc3\\xa1ng 4\\0\"\n    \"Th\\xc3\\xa1ng 5\\0\"\n    \"Th\\xc3\\xa1ng 6\\0\"\n    \"Th\\xc3\\xa1ng 7\\0\"\n    \"Th\\xc3\\xa1ng 8\\0\"\n    \"Th\\xc3\\xa1ng 9\\0\"\n    \"Th\\xc3\\xa1ng 10\\0\"\n    \"Th\\xc3\\xa1ng 11\\0\"\n    \"Th\\xc3\\xa1ng 12\\0\"\n    \"th\\xc3\\xa1ng 1\\0\"\n    \"th\\xc3\\xa1ng 2\\0\"\n    \"th\\xc3\\xa1ng 3\\0\"\n    \"th\\xc3\\xa1ng 4\\0\"\n    \"th\\xc3\\xa1ng 5\\0\"\n    \"th\\xc3\\xa1ng 6\\0\"\n    \"th\\xc3\\xa1ng 7\\0\"\n    \"th\\xc3\\xa1ng 8\\0\"\n    \"th\\xc3\\xa1ng 9\\0\"\n    \"th\\xc3\\xa1ng 10\\0\"\n    \"th\\xc3\\xa1ng 11\\0\"\n    \"th\\xc3\\xa1ng 12\\0\"\n    \"Thg 1\\0\"\n    \"Thg 2\\0\"\n    \"Thg 3\\0\"\n    \"Thg 4\\0\"\n    \"Thg 5\\0\"\n    \"Thg 6\\0\"\n    \"Thg 7\\0\"\n    \"Thg 8\\0\"\n    \"Thg 9\\0\"\n    \"Thg 10\\0\"\n    \"Thg 11\\0\"\n    \"Thg 12\\0\"\n    \"\\xd5\\xaf\\xd5\\xa5\\xd5\\xbd\\xd6\\x85\\xd6\\x80\\xd5\\xab\\xd6\\x81 \\xd5\\xa1\\xd5\\xbc\\xd5\\xa1\\xd5\\xbb\\0\"\n    \"\\xd5\\xaf\\xd5\\xa5\\xd5\\xbd\\xd6\\x85\\xd6\\x80\\xd5\\xab\\xd6\\x81 \\xd5\\xb0\\xd5\\xa5\\xd5\\xbf\\xd5\\xb8\\0\"\n    \"\\xd5\\xaf\\xd5\\xab\\xd6\\x80\\xd5\\xa1\\xd5\\xaf\\xd5\\xab\\0\"\n    \"\\xd5\\xa5\\xd6\\x80\\xd5\\xaf\\xd5\\xb8\\xd6\\x82\\xd5\\xb7\\xd5\\xa1\\xd5\\xa2\\xd5\\xa9\\xd5\\xab\\0\"\n    \"\\xd5\\xa5\\xd6\\x80\\xd5\\xa5\\xd6\\x84\\xd5\\xb7\\xd5\\xa1\\xd5\\xa2\\xd5\\xa9\\xd5\\xab\\0\"\n    \"\\xd5\\xb9\\xd5\\xb8\\xd6\\x80\\xd5\\xa5\\xd6\\x84\\xd5\\xb7\\xd5\\xa1\\xd5\\xa2\\xd5\\xa9\\xd5\\xab\\0\"\n    \"\\xd5\\xb0\\xd5\\xab\\xd5\\xb6\\xd5\\xa3\\xd5\\xb7\\xd5\\xa1\\xd5\\xa2\\xd5\\xa9\\xd5\\xab\\0\"\n    \"\\xd5\\xb8\\xd6\\x82\\xd6\\x80\\xd5\\xa2\\xd5\\xa1\\xd5\\xa9\\0\"\n    \"\\xd5\\xb7\\xd5\\xa1\\xd5\\xa2\\xd5\\xa1\\xd5\\xa9\\0\"\n    \"\\xd5\\xaf\\xd5\\xab\\xd6\\x80\\0\"\n    \"\\xd5\\xa5\\xd6\\x80\\xd5\\xaf\\0\"\n    \"\\xd5\\xa5\\xd6\\x80\\xd6\\x84\\0\"\n    \"\\xd5\\xb9\\xd6\\x80\\xd6\\x84\\0\"\n    \"\\xd5\\xb0\\xd5\\xb6\\xd5\\xa3\\0\"\n    \"\\xd5\\xb8\\xd6\\x82\\xd6\\x80\\0\"\n    \"\\xd5\\xb7\\xd5\\xa2\\xd5\\xa9\\0\"\n    \"\\xd4\\xbf\\0\"\n    \"\\xd4\\xb5\\0\"\n    \"\\xd5\\x89\\0\"\n    \"\\xd5\\x80\\0\"\n    \"\\xd5\\x88\\xd6\\x82\\0\"\n    \"\\xd5\\x87\\0\"\n    \"\\xd5\\xb0\\xd5\\xb8\\xd6\\x82\\xd5\\xb6\\xd5\\xbe\\xd5\\xa1\\xd6\\x80\\0\"\n    \"\\xd6\\x83\\xd5\\xa5\\xd5\\xbf\\xd6\\x80\\xd5\\xbe\\xd5\\xa1\\xd6\\x80\\0\"\n    \"\\xd5\\xb4\\xd5\\xa1\\xd6\\x80\\xd5\\xbf\\0\"\n    \"\\xd5\\xa1\\xd5\\xba\\xd6\\x80\\xd5\\xab\\xd5\\xac\\0\"\n    \"\\xd5\\xb4\\xd5\\xa1\\xd5\\xb5\\xd5\\xab\\xd5\\xbd\\0\"\n    \"\\xd5\\xb0\\xd5\\xb8\\xd6\\x82\\xd5\\xb6\\xd5\\xab\\xd5\\xbd\\0\"\n    \"\\xd5\\xb0\\xd5\\xb8\\xd6\\x82\\xd5\\xac\\xd5\\xab\\xd5\\xbd\\0\"\n    \"\\xd6\\x85\\xd5\\xa3\\xd5\\xb8\\xd5\\xbd\\xd5\\xbf\\xd5\\xb8\\xd5\\xbd\\0\"\n    \"\\xd5\\xbd\\xd5\\xa5\\xd5\\xba\\xd5\\xbf\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\0\"\n    \"\\xd5\\xb0\\xd5\\xb8\\xd5\\xaf\\xd5\\xbf\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\0\"\n    \"\\xd5\\xb6\\xd5\\xb8\\xd5\\xb5\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\0\"\n    \"\\xd5\\xa4\\xd5\\xa5\\xd5\\xaf\\xd5\\xbf\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\0\"\n    \"\\xd5\\xb0\\xd5\\xb8\\xd6\\x82\\xd5\\xb6\\xd5\\xbe\\xd5\\xa1\\xd6\\x80\\xd5\\xab\\0\"\n    \"\\xd6\\x83\\xd5\\xa5\\xd5\\xbf\\xd6\\x80\\xd5\\xbe\\xd5\\xa1\\xd6\\x80\\xd5\\xab\\0\"\n    \"\\xd5\\xb4\\xd5\\xa1\\xd6\\x80\\xd5\\xbf\\xd5\\xab\\0\"\n    \"\\xd5\\xa1\\xd5\\xba\\xd6\\x80\\xd5\\xab\\xd5\\xac\\xd5\\xab\\0\"\n    \"\\xd5\\xb4\\xd5\\xa1\\xd5\\xb5\\xd5\\xab\\xd5\\xbd\\xd5\\xab\\0\"\n    \"\\xd5\\xb0\\xd5\\xb8\\xd6\\x82\\xd5\\xb6\\xd5\\xab\\xd5\\xbd\\xd5\\xab\\0\"\n    \"\\xd5\\xb0\\xd5\\xb8\\xd6\\x82\\xd5\\xac\\xd5\\xab\\xd5\\xbd\\xd5\\xab\\0\"\n    \"\\xd6\\x85\\xd5\\xa3\\xd5\\xb8\\xd5\\xbd\\xd5\\xbf\\xd5\\xb8\\xd5\\xbd\\xd5\\xab\\0\"\n    \"\\xd5\\xbd\\xd5\\xa5\\xd5\\xba\\xd5\\xbf\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\xd5\\xab\\0\"\n    \"\\xd5\\xb0\\xd5\\xb8\\xd5\\xaf\\xd5\\xbf\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\xd5\\xab\\0\"\n    \"\\xd5\\xb6\\xd5\\xb8\\xd5\\xb5\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\xd5\\xab\\0\"\n    \"\\xd5\\xa4\\xd5\\xa5\\xd5\\xaf\\xd5\\xbf\\xd5\\xa5\\xd5\\xb4\\xd5\\xa2\\xd5\\xa5\\xd6\\x80\\xd5\\xab\\0\"\n    \"\\xd5\\xb0\\xd5\\xb6\\xd5\\xbe\\0\"\n    \"\\xd6\\x83\\xd5\\xbf\\xd5\\xbe\\0\"\n    \"\\xd5\\xb4\\xd6\\x80\\xd5\\xbf\\0\"\n    \"\\xd5\\xa1\\xd5\\xba\\xd6\\x80\\0\"\n    \"\\xd5\\xb4\\xd5\\xb5\\xd5\\xbd\\0\"\n    \"\\xd5\\xb0\\xd5\\xb6\\xd5\\xbd\\0\"\n    \"\\xd5\\xb0\\xd5\\xac\\xd5\\xbd\\0\"\n    \"\\xd6\\x85\\xd5\\xa3\\xd5\\xbd\\0\"\n    \"\\xd5\\xbd\\xd5\\xba\\xd5\\xbf\\0\"\n    \"\\xd5\\xb0\\xd5\\xaf\\xd5\\xbf\\0\"\n    \"\\xd5\\xb6\\xd5\\xb5\\xd5\\xb4\\0\"\n    \"\\xd5\\xa4\\xd5\\xaf\\xd5\\xbf\\0\"\n    \"d/MM/yyyy\\0\"\n    \"d/MMM/yyyy\\0\"\n    \"d-MMM-yyyy\\0\"\n    \"dd-MMM-yyyy\\0\"\n    \"ddd, d-MMMM-yyyy\\0\"\n    \"ddd, dd-MMMM-yyyy\\0\"\n    \"bazar\\0\"\n    \"bazar ert\\xc9\\x99si\\0\"\n    \"\\xc3\\xa7\\xc9\\x99r\\xc5\\x9f\\xc9\\x99nb\\xc9\\x99 ax\\xc5\\x9f\\x61m\\xc4\\xb1\\0\"\n    \"\\xc3\\xa7\\xc9\\x99r\\xc5\\x9f\\xc9\\x99nb\\xc9\\x99\\0\"\n    \"c\\xc3\\xbcm\\xc9\\x99 ax\\xc5\\x9f\\x61m\\xc4\\xb1\\0\"\n    \"c\\xc3\\xbcm\\xc9\\x99\\0\"\n    \"\\xc5\\x9f\\xc9\\x99nb\\xc9\\x99\\0\"\n    \"B.\\0\"\n    \"B.E.\\0\"\n    \"\\xc3\\x87.A.\\0\"\n    \"\\xc3\\x87.\\0\"\n    \"C.A.\\0\"\n    \"\\xc5\\x9e.\\0\"\n    \"Yanvar\\0\"\n    \"Fevral\\0\"\n    \"Aprel\\0\"\n    \"\\xc4\\xb0yun\\0\"\n    \"\\xc4\\xb0yul\\0\"\n    \"Avqust\\0\"\n    \"Sentyabr\\0\"\n    \"Oktyabr\\0\"\n    \"Noyabr\\0\"\n    \"Dekabr\\0\"\n    \"yanvar\\0\"\n    \"fevral\\0\"\n    \"mart\\0\"\n    \"aprel\\0\"\n    \"may\\0\"\n    \"iyun\\0\"\n    \"iyul\\0\"\n    \"avqust\\0\"\n    \"sentyabr\\0\"\n    \"oktyabr\\0\"\n    \"noyabr\\0\"\n    \"dekabr\\0\"\n    \"yan\\0\"\n    \"iyn\\0\"\n    \"iyl\\0\"\n    \"avq\\0\"\n    \"sen\\0\"\n    \"noy\\0\"\n    \"dek\\0\"\n    \"d MMMM yyyy, dddd\\0\"\n    \"igandea\\0\"\n    \"astelehena\\0\"\n    \"asteartea\\0\"\n    \"asteazkena\\0\"\n    \"osteguna\\0\"\n    \"ostirala\\0\"\n    \"larunbata\\0\"\n    \"ig.\\0\"\n    \"al.\\0\"\n    \"ar.\\0\"\n    \"az.\\0\"\n    \"og.\\0\"\n    \"or.\\0\"\n    \"lr.\\0\"\n    \"I\\0\"\n    \"urtarrila\\0\"\n    \"otsaila\\0\"\n    \"martxoa\\0\"\n    \"apirila\\0\"\n    \"maiatza\\0\"\n    \"ekaina\\0\"\n    \"uztaila\\0\"\n    \"abuztua\\0\"\n    \"iraila\\0\"\n    \"urria\\0\"\n    \"azaroa\\0\"\n    \"abendua\\0\"\n    \"urtarrilak\\0\"\n    \"otsailak\\0\"\n    \"martxoak\\0\"\n    \"apirilak\\0\"\n    \"maiatzak\\0\"\n    \"ekainak\\0\"\n    \"uztailak\\0\"\n    \"abuztuak\\0\"\n    \"irailak\\0\"\n    \"urriak\\0\"\n    \"azaroak\\0\"\n    \"abenduak\\0\"\n    \"urt.\\0\"\n    \"ots.\\0\"\n    \"api.\\0\"\n    \"mai.\\0\"\n    \"eka.\\0\"\n    \"uzt.\\0\"\n    \"abu.\\0\"\n    \"ira.\\0\"\n    \"urr.\\0\"\n    \"aza.\\0\"\n    \"abe.\\0\"\n    \"yyyy MMM d\\0\"\n    \"yyyy('e')'ko' MMMM d, dddd\\0\"\n    \"yyyy('e')'ko' MMMM d\\0\"\n    \"yyyy('e')'ko' MMMM\\0\"\n    \"\\xd0\\xbf\\xd1\\x80\\xd0\\xb5\\xd1\\x82\\xd0\\xbf\\xd0\\xbb\\xd0\\xb0\\xd0\\xb4\\xd0\\xbd\\xd0\\xb5\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd0\\xbf\\xd0\\xbb\\xd0\\xb0\\xd0\\xb4\\xd0\\xbd\\xd0\\xb5\\0\"\n    \"\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82\\xd0\\xb2\\xd1\\x80\\xd1\\x82\\xd0\\xbe\\xd0\\xba\\0\"\n    \"\\xd0\\xbf\\xd0\\xb5\\xd1\\x82\\xd0\\xbe\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd0\\xb0\\xd0\\xb1\\xd0\\xbe\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4.\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd0\\xbd.\\0\"\n    \"\\xd0\\xb2\\xd1\\x82.\\0\"\n    \"\\xd1\\x81\\xd1\\x80\\xd0\\xb5.\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82.\\0\"\n    \"\\xd0\\xbf\\xd0\\xb5\\xd1\\x82.\\0\"\n    \"\\xd1\\x81\\xd0\\xb0\\xd0\\xb1.\\0\"\n    \"\\xd1\\x98\\xd0\\xb0\\xd0\\xbd\\xd1\\x83\\xd0\\xb0\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x98\\0\"\n    \"\\xd1\\x98\\xd1\\x83\\xd0\\xbd\\xd0\\xb8\\0\"\n    \"\\xd1\\x98\\xd1\\x83\\xd0\\xbb\\xd0\\xb8\\0\"\n    \"\\xd1\\x98\\xd0\\xb0\\xd0\\xbd.\\0\"\n    \"\\xd1\\x84\\xd0\\xb5\\xd0\\xb2.\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x80.\\0\"\n    \"\\xd1\\x98\\xd1\\x83\\xd0\\xbd.\\0\"\n    \"\\xd1\\x98\\xd1\\x83\\xd0\\xbb.\\0\"\n    \"dd.M.yyyy\\0\"\n    \"MMMM yyyy '\\xd0\\xb3'.\\0\"\n    \"Tshipi\\0\"\n    \"Mosopulogo\\0\"\n    \"Labobedi\\0\"\n    \"Laboraro\\0\"\n    \"Labone\\0\"\n    \"Labotlhano\\0\"\n    \"Matlhatso\\0\"\n    \"Tsh\\0\"\n    \"Mos\\0\"\n    \"Bed\\0\"\n    \"Rar\\0\"\n    \"Ne\\0\"\n    \"Tla\\0\"\n    \"Mat\\0\"\n    \"Ferikgong\\0\"\n    \"Tlhakole\\0\"\n    \"Mopitlo\\0\"\n    \"Moranang\\0\"\n    \"Motsheganang\\0\"\n    \"Seetebosigo\\0\"\n    \"Phukwi\\0\"\n    \"Phatwe\\0\"\n    \"Lwetse\\0\"\n    \"Diphalane\\0\"\n    \"Ngwanatsele\\0\"\n    \"Sedimonthole\\0\"\n    \"Fer\\0\"\n    \"Tlh\\0\"\n    \"Mop\\0\"\n    \"Mor\\0\"\n    \"Mot\\0\"\n    \"See\\0\"\n    \"Phu\\0\"\n    \"Pha\\0\"\n    \"Lwe\\0\"\n    \"Dip\\0\"\n    \"Ngw\\0\"\n    \"Sed\\0\"\n    \"yyyy MMMM d, dddd\\0\"\n    \"yyyy MMMM d\\0\"\n    \"Cawe\\0\"\n    \"Mvulo\\0\"\n    \"Lwesibini\\0\"\n    \"Lwesithathu\\0\"\n    \"Lwesine\\0\"\n    \"Lwesihlanu\\0\"\n    \"Mgqibelo\\0\"\n    \"Caw\\0\"\n    \"Mvu\\0\"\n    \"Bin\\0\"\n    \"Tha\\0\"\n    \"Sin\\0\"\n    \"Hla\\0\"\n    \"Mgq\\0\"\n    \"Janyuwari\\0\"\n    \"Februwari\\0\"\n    \"Matshi\\0\"\n    \"Epreli\\0\"\n    \"Meyi\\0\"\n    \"Julayi\\0\"\n    \"Agasti\\0\"\n    \"Septemba\\0\"\n    \"Okthoba\\0\"\n    \"Novemba\\0\"\n    \"Disemba\\0\"\n    \"Epr\\0\"\n    \"Mey\\0\"\n    \"Aga\\0\"\n    \"Dis\\0\"\n    \"Sonto\\0\"\n    \"Msombuluko\\0\"\n    \"Lwesibili\\0\"\n    \"Son\\0\"\n    \"Mso\\0\"\n    \"Bil\\0\"\n    \"B\\0\"\n    \"uJanuwari\\0\"\n    \"uFebruwari\\0\"\n    \"uMashi\\0\"\n    \"u-Apreli\\0\"\n    \"uMeyi\\0\"\n    \"uJuni\\0\"\n    \"uJulayi\\0\"\n    \"uAgasti\\0\"\n    \"uSepthemba\\0\"\n    \"u-Okthoba\\0\"\n    \"uNovemba\\0\"\n    \"uDisemba\\0\"\n    \"Januwari\\0\"\n    \"Mashi\\0\"\n    \"Apreli\\0\"\n    \"Septhemba\\0\"\n    \"Mas\\0\"\n    \"MMM d, yyyy\\0\"\n    \"vm.\\0\"\n    \"nm.\\0\"\n    \"Sondag\\0\"\n    \"Maandag\\0\"\n    \"Dinsdag\\0\"\n    \"Woensdag\\0\"\n    \"Donderdag\\0\"\n    \"Vrydag\\0\"\n    \"Saterdag\\0\"\n    \"Ma\\0\"\n    \"Wo\\0\"\n    \"Vr\\0\"\n    \"Januarie\\0\"\n    \"Februarie\\0\"\n    \"Maart\\0\"\n    \"Junie\\0\"\n    \"Julie\\0\"\n    \"Augustus\\0\"\n    \"\\xe1\\x83\\x99\\xe1\\x83\\x95\\xe1\\x83\\x98\\xe1\\x83\\xa0\\xe1\\x83\\x90\\0\"\n    \"\\xe1\\x83\\x9d\\xe1\\x83\\xa0\\xe1\\x83\\xa8\\xe1\\x83\\x90\\xe1\\x83\\x91\\xe1\\x83\\x90\\xe1\\x83\\x97\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\xa1\\xe1\\x83\\x90\\xe1\\x83\\x9b\\xe1\\x83\\xa8\\xe1\\x83\\x90\\xe1\\x83\\x91\\xe1\\x83\\x90\\xe1\\x83\\x97\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x9d\\xe1\\x83\\x97\\xe1\\x83\\xae\\xe1\\x83\\xa8\\xe1\\x83\\x90\\xe1\\x83\\x91\\xe1\\x83\\x90\\xe1\\x83\\x97\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\xae\\xe1\\x83\\xa3\\xe1\\x83\\x97\\xe1\\x83\\xa8\\xe1\\x83\\x90\\xe1\\x83\\x91\\xe1\\x83\\x90\\xe1\\x83\\x97\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x9e\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x90\\xe1\\x83\\xa1\\xe1\\x83\\x99\\xe1\\x83\\x94\\xe1\\x83\\x95\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\xa8\\xe1\\x83\\x90\\xe1\\x83\\x91\\xe1\\x83\\x90\\xe1\\x83\\x97\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x99\\xe1\\x83\\x95\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x9d\\xe1\\x83\\xa0\\xe1\\x83\\xa8\\0\"\n    \"\\xe1\\x83\\xa1\\xe1\\x83\\x90\\xe1\\x83\\x9b\\0\"\n    \"\\xe1\\x83\\x9d\\xe1\\x83\\x97\\xe1\\x83\\xae\\0\"\n    \"\\xe1\\x83\\xae\\xe1\\x83\\xa3\\xe1\\x83\\x97\\0\"\n    \"\\xe1\\x83\\x9e\\xe1\\x83\\x90\\xe1\\x83\\xa0\\0\"\n    \"\\xe1\\x83\\xa8\\xe1\\x83\\x90\\xe1\\x83\\x91\\0\"\n    \"\\xe1\\x83\\x99\\0\"\n    \"\\xe1\\x83\\x9d\\0\"\n    \"\\xe1\\x83\\xa1\\0\"\n    \"\\xe1\\x83\\xae\\0\"\n    \"\\xe1\\x83\\x9e\\0\"\n    \"\\xe1\\x83\\xa8\\0\"\n    \"\\xe1\\x83\\x98\\xe1\\x83\\x90\\xe1\\x83\\x9c\\xe1\\x83\\x95\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x97\\xe1\\x83\\x94\\xe1\\x83\\x91\\xe1\\x83\\x94\\xe1\\x83\\xa0\\xe1\\x83\\x95\\xe1\\x83\\x90\\xe1\\x83\\x9a\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x9b\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\xa2\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x90\\xe1\\x83\\x9e\\xe1\\x83\\xa0\\xe1\\x83\\x98\\xe1\\x83\\x9a\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x9b\\xe1\\x83\\x90\\xe1\\x83\\x98\\xe1\\x83\\xa1\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x98\\xe1\\x83\\x95\\xe1\\x83\\x9c\\xe1\\x83\\x98\\xe1\\x83\\xa1\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x98\\xe1\\x83\\x95\\xe1\\x83\\x9a\\xe1\\x83\\x98\\xe1\\x83\\xa1\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x90\\xe1\\x83\\x92\\xe1\\x83\\x95\\xe1\\x83\\x98\\xe1\\x83\\xa1\\xe1\\x83\\xa2\\xe1\\x83\\x9d\\0\"\n    \"\\xe1\\x83\\xa1\\xe1\\x83\\x94\\xe1\\x83\\xa5\\xe1\\x83\\xa2\\xe1\\x83\\x94\\xe1\\x83\\x9b\\xe1\\x83\\x91\\xe1\\x83\\x94\\xe1\\x83\\xa0\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x9d\\xe1\\x83\\xa5\\xe1\\x83\\xa2\\xe1\\x83\\x9d\\xe1\\x83\\x9b\\xe1\\x83\\x91\\xe1\\x83\\x94\\xe1\\x83\\xa0\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x9c\\xe1\\x83\\x9d\\xe1\\x83\\x94\\xe1\\x83\\x9b\\xe1\\x83\\x91\\xe1\\x83\\x94\\xe1\\x83\\xa0\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x93\\xe1\\x83\\x94\\xe1\\x83\\x99\\xe1\\x83\\x94\\xe1\\x83\\x9b\\xe1\\x83\\x91\\xe1\\x83\\x94\\xe1\\x83\\xa0\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x98\\xe1\\x83\\x90\\xe1\\x83\\x9c\\0\"\n    \"\\xe1\\x83\\x97\\xe1\\x83\\x94\\xe1\\x83\\x91\\0\"\n    \"\\xe1\\x83\\x9b\\xe1\\x83\\x90\\xe1\\x83\\xa0\\0\"\n    \"\\xe1\\x83\\x90\\xe1\\x83\\x9e\\xe1\\x83\\xa0\\0\"\n    \"\\xe1\\x83\\x9b\\xe1\\x83\\x90\\xe1\\x83\\x98\\0\"\n    \"\\xe1\\x83\\x98\\xe1\\x83\\x95\\xe1\\x83\\x9c\\0\"\n    \"\\xe1\\x83\\x98\\xe1\\x83\\x95\\xe1\\x83\\x9a\\0\"\n    \"\\xe1\\x83\\x90\\xe1\\x83\\x92\\xe1\\x83\\x95\\0\"\n    \"\\xe1\\x83\\xa1\\xe1\\x83\\x94\\xe1\\x83\\xa5\\0\"\n    \"\\xe1\\x83\\x9d\\xe1\\x83\\xa5\\xe1\\x83\\xa2\\0\"\n    \"\\xe1\\x83\\x9c\\xe1\\x83\\x9d\\xe1\\x83\\x94\\0\"\n    \"\\xe1\\x83\\x93\\xe1\\x83\\x94\\xe1\\x83\\x99\\0\"\n    \"d MMM, yyyy\\0\"\n    \"f.p.\\0\"\n    \"s.p.\\0\"\n    \"m\\xc3\\xa1nadagur\\0\"\n    \"t\\xc3\\xbdsdagur\\0\"\n    \"mikudagur\\0\"\n    \"h\\xc3\\xb3sdagur\\0\"\n    \"fr\\xc3\\xadggjadagur\\0\"\n    \"leygardagur\\0\"\n    \"sun\\0\"\n    \"m\\xc3\\xa1n\\0\"\n    \"t\\xc3\\xbds\\0\"\n    \"mik\\0\"\n    \"h\\xc3\\xb3s\\0\"\n    \"fr\\xc3\\xad\\0\"\n    \"ley\\0\"\n    \"\\xe0\\xa4\\xaa\\xe0\\xa5\\x82\\xe0\\xa4\\xb0\\xe0\\xa5\\x8d\\xe0\\xa4\\xb5\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\xaa\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb0\\xe0\\xa4\\xb5\\xe0\\xa4\\xbf\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa5\\x8b\\xe0\\xa4\\xae\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x82\\xe0\\xa4\\x97\\xe0\\xa4\\xb2\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xac\\xe0\\xa5\\x81\\xe0\\xa4\\xa7\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x97\\xe0\\xa5\\x81\\xe0\\xa4\\xb0\\xe0\\xa5\\x81\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb6\\xe0\\xa5\\x81\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb6\\xe0\\xa4\\xa8\\xe0\\xa4\\xbf\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb0\\xe0\\xa4\\xb5\\xe0\\xa4\\xbf\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa5\\x8b\\xe0\\xa4\\xae\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x82\\xe0\\xa4\\x97\\xe0\\xa4\\xb2\\0\"\n    \"\\xe0\\xa4\\xac\\xe0\\xa5\\x81\\xe0\\xa4\\xa7\\0\"\n    \"\\xe0\\xa4\\x97\\xe0\\xa5\\x81\\xe0\\xa4\\xb0\\xe0\\xa5\\x81\\0\"\n    \"\\xe0\\xa4\\xb6\\xe0\\xa5\\x81\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb6\\xe0\\xa4\\xa8\\xe0\\xa4\\xbf\\0\"\n    \"\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa5\\x8b\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x82\\0\"\n    \"\\xe0\\xa4\\xac\\xe0\\xa5\\x81\\0\"\n    \"\\xe0\\xa4\\x97\\xe0\\xa5\\x81\\0\"\n    \"\\xe0\\xa4\\xb6\\xe0\\xa5\\x81\\0\"\n    \"\\xe0\\xa4\\xb6\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa4\\xa8\\xe0\\xa4\\xb5\\xe0\\xa4\\xb0\\xe0\\xa5\\x80\\0\"\n    \"\\xe0\\xa4\\xab\\xe0\\xa4\\xbc\\xe0\\xa4\\xb0\\xe0\\xa4\\xb5\\xe0\\xa4\\xb0\\xe0\\xa5\\x80\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa5\\x8d\\xe0\\xa4\\x9a\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa5\\x88\\xe0\\xa4\\xb2\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x88\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa5\\x82\\xe0\\xa4\\xa8\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa5\\x81\\xe0\\xa4\\xb2\\xe0\\xa4\\xbe\\xe0\\xa4\\x88\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\x97\\xe0\\xa4\\xb8\\xe0\\xa5\\x8d\\xe0\\xa4\\xa4\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa4\\xbf\\xe0\\xa4\\xa4\\xe0\\xa4\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa4\\xb5\\xe0\\xa4\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xa6\\xe0\\xa4\\xbf\\xe0\\xa4\\xb8\\xe0\\xa4\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa4\\xa8\\0\"\n    \"\\xe0\\xa4\\xab\\xe0\\xa4\\xbc\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa5\\x88\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa5\\x81\\xe0\\xa4\\xb2\\xe0\\xa4\\xbe\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\x97\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa4\\xbf\\xe0\\xa4\\xa4\\xe0\\xa4\\x82\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x82\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa4\\xb5\\xe0\\xa4\\x82\\0\"\n    \"\\xe0\\xa4\\xa6\\xe0\\xa4\\xbf\\xe0\\xa4\\xb8\\xe0\\xa4\\x82\\0\"\n    \"d 'ta'\\xe2\\x80\\x99 MMMM\\0\"\n    \"QN\\0\"\n    \"WN\\0\"\n    \"Il-\\xc4\\xa6\\x61\\x64\\x64\\0\"\n    \"It-Tnejn\\0\"\n    \"It-Tlieta\\0\"\n    \"L-Erbg\\xc4\\xa7\\x61\\0\"\n    \"Il-\\xc4\\xa6\\x61mis\\0\"\n    \"Il-\\xc4\\xa0img\\xc4\\xa7\\x61\\0\"\n    \"Is-Sibt\\0\"\n    \"\\xc4\\xa6\\x61\\x64\\0\"\n    \"Tne\\0\"\n    \"Tli\\0\"\n    \"Erb\\0\"\n    \"\\xc4\\xa6\\x61m\\0\"\n    \"\\xc4\\xa0im\\0\"\n    \"Sib\\0\"\n    \"\\xc4\\xa6\\0\"\n    \"\\xc4\\xa0\\0\"\n    \"Jannar\\0\"\n    \"Frar\\0\"\n    \"Marzu\\0\"\n    \"Mejju\\0\"\n    \"\\xc4\\xa0unju\\0\"\n    \"Lulju\\0\"\n    \"Awwissu\\0\"\n    \"Settembru\\0\"\n    \"Ottubru\\0\"\n    \"Novembru\\0\"\n    \"Di\\xc4\\x8b\\x65mbru\\0\"\n    \"Fra\\0\"\n    \"Mej\\0\"\n    \"\\xc4\\xa0un\\0\"\n    \"Lul\\0\"\n    \"Aww\\0\"\n    \"Set\\0\"\n    \"Ott\\0\"\n    \"Di\\xc4\\x8b\\0\"\n    \"dddd, d 'ta'\\xe2\\x80\\x99 MMMM yyyy\\0\"\n    \"d 'ta'\\xe2\\x80\\x99 MMMM yyyy\\0\"\n    \"MMMM 'ta'\\xe2\\x80\\x99 yyyy\\0\"\n    \"i.b.\\0\"\n    \"e.b.\\0\"\n    \"sotnabeaivi\\0\"\n    \"vuoss\\xc3\\xa1rga\\0\"\n    \"ma\\xc5\\x8b\\xc5\\x8b\\x65\\x62\\xc3\\xa1rga\\0\"\n    \"gaskavahkku\\0\"\n    \"duorasdat\\0\"\n    \"bearjadat\\0\"\n    \"l\\xc3\\xa1vvardat\\0\"\n    \"sotn\\0\"\n    \"vuos\\0\"\n    \"ma\\xc5\\x8b\\0\"\n    \"gask\\0\"\n    \"duor\\0\"\n    \"bear\\0\"\n    \"l\\xc3\\xa1v\\0\"\n    \"o\\xc4\\x91\\xc4\\x91\\x61jagem\\xc3\\xa1nnu\\0\"\n    \"guovvam\\xc3\\xa1nnu\\0\"\n    \"njuk\\xc4\\x8d\\x61m\\xc3\\xa1nnu\\0\"\n    \"cuo\\xc5\\x8bom\\xc3\\xa1nnu\\0\"\n    \"miessem\\xc3\\xa1nnu\\0\"\n    \"geassem\\xc3\\xa1nnu\\0\"\n    \"suoidnem\\xc3\\xa1nnu\\0\"\n    \"borgem\\xc3\\xa1nnu\\0\"\n    \"\\xc4\\x8d\\x61k\\xc4\\x8d\\x61m\\xc3\\xa1nnu\\0\"\n    \"golggotm\\xc3\\xa1nnu\\0\"\n    \"sk\\xc3\\xa1\\x62mam\\xc3\\xa1nnu\\0\"\n    \"juovlam\\xc3\\xa1nnu\\0\"\n    \"o\\xc4\\x91\\xc4\\x91j\\0\"\n    \"guov\\0\"\n    \"njuk\\0\"\n    \"cuo\\0\"\n    \"mies\\0\"\n    \"geas\\0\"\n    \"suoi\\0\"\n    \"borg\\0\"\n    \"\\xc4\\x8d\\x61k\\xc4\\x8d\\0\"\n    \"golg\\0\"\n    \"sk\\xc3\\xa1\\x62\\0\"\n    \"juov\\0\"\n    \"D\\xc3\\xa9 Domhnaigh\\0\"\n    \"D\\xc3\\xa9 Luain\\0\"\n    \"D\\xc3\\xa9 M\\xc3\\xa1irt\\0\"\n    \"D\\xc3\\xa9 C\\xc3\\xa9\\x61\\x64\\x61oin\\0\"\n    \"D\\xc3\\xa9\\x61rdaoin\\0\"\n    \"D\\xc3\\xa9 hAoine\\0\"\n    \"D\\xc3\\xa9 Sathairn\\0\"\n    \"Domh\\0\"\n    \"Luan\\0\"\n    \"M\\xc3\\xa1irt\\0\"\n    \"C\\xc3\\xa9\\x61\\x64\\0\"\n    \"D\\xc3\\xa9\\x61r\\0\"\n    \"Aoine\\0\"\n    \"Sath\\0\"\n    \"Ean\\xc3\\xa1ir\\0\"\n    \"Feabhra\\0\"\n    \"M\\xc3\\xa1rta\\0\"\n    \"Aibre\\xc3\\xa1n\\0\"\n    \"Bealtaine\\0\"\n    \"Meitheamh\\0\"\n    \"I\\xc3\\xbail\\0\"\n    \"L\\xc3\\xbanasa\\0\"\n    \"Me\\xc3\\xa1n F\\xc3\\xb3mhair\\0\"\n    \"Deireadh F\\xc3\\xb3mhair\\0\"\n    \"Samhain\\0\"\n    \"Nollaig\\0\"\n    \"Ean\\0\"\n    \"Feabh\\0\"\n    \"Aib\\0\"\n    \"Beal\\0\"\n    \"Meith\\0\"\n    \"L\\xc3\\xban\\0\"\n    \"MF\\xc3\\xb3mh\\0\"\n    \"DF\\xc3\\xb3mh\\0\"\n    \"Samh\\0\"\n    \"Noll\\0\"\n    \"pg\\0\"\n    \"ptg\\0\"\n    \"Ahad\\0\"\n    \"Isnin\\0\"\n    \"Khamis\\0\"\n    \"Jumaat\\0\"\n    \"Ahd\\0\"\n    \"Isn\\0\"\n    \"Kha\\0\"\n    \"Mac\\0\"\n    \"Julai\\0\"\n    \"Ogos\\0\"\n    \"Disember\\0\"\n    \"Ogo\\0\"\n    \"\\xd1\\x82\\xd2\\xaf\\xd1\\x81\\xd0\\xba\\xd0\\xb5 \\xd0\\xb4\\xd0\\xb5\\xd0\\xb9\\xd1\\x96\\xd0\\xbd\\0\"\n    \"\\xd1\\x82\\xd2\\xaf\\xd1\\x81\\xd1\\x82\\xd0\\xb5\\xd0\\xbd \\xd0\\xba\\xd0\\xb5\\xd0\\xb9\\xd1\\x96\\xd0\\xbd\\0\"\n    \"\\xd0\\xb6\\xd0\\xb5\\xd0\\xba\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd1\\x96\\0\"\n    \"\\xd0\\xb4\\xd1\\x83\\xd0\\xb9\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd0\\xb1\\xd1\\x96\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xb9\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd0\\xb1\\xd1\\x96\\0\"\n    \"\\xd1\\x81\\xd3\\x99\\xd1\\x80\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd0\\xb1\\xd1\\x96\\0\"\n    \"\\xd0\\xb1\\xd0\\xb5\\xd0\\xb9\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd0\\xb1\\xd1\\x96\\0\"\n    \"\\xd0\\xb6\\xd2\\xb1\\xd0\\xbc\\xd0\\xb0\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd0\\xb1\\xd1\\x96\\0\"\n    \"\\xd0\\xb6\\xd1\\x81.\\0\"\n    \"\\xd0\\xb4\\xd1\\x81.\\0\"\n    \"\\xd1\\x81\\xd1\\x81.\\0\"\n    \"\\xd1\\x81\\xd1\\x80.\\0\"\n    \"\\xd0\\xb1\\xd1\\x81.\\0\"\n    \"\\xd0\\xb6\\xd0\\xbc.\\0\"\n    \"\\xd1\\x81\\xd0\\xb1.\\0\"\n    \"\\xd0\\x96\\0\"\n    \"\\xd0\\x94\\0\"\n    \"\\xd0\\x91\\0\"\n    \"\\xd2\\x9b\\xd0\\xb0\\xd2\\xa3\\xd1\\x82\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xb0\\xd2\\x9b\\xd0\\xbf\\xd0\\xb0\\xd0\\xbd\\0\"\n    \"\\xd0\\xbd\\xd0\\xb0\\xd1\\x83\\xd1\\x80\\xd1\\x8b\\xd0\\xb7\\0\"\n    \"\\xd1\\x81\\xd3\\x99\\xd1\\x83\\xd1\\x96\\xd1\\x80\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd0\\xbc\\xd1\\x8b\\xd1\\x80\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x83\\xd1\\x81\\xd1\\x8b\\xd0\\xbc\\0\"\n    \"\\xd1\\x88\\xd1\\x96\\xd0\\xbb\\xd0\\xb4\\xd0\\xb5\\0\"\n    \"\\xd1\\x82\\xd0\\xb0\\xd0\\xbc\\xd1\\x8b\\xd0\\xb7\\0\"\n    \"\\xd2\\x9b\\xd1\\x8b\\xd1\\x80\\xd0\\xba\\xd2\\xaf\\xd0\\xb9\\xd0\\xb5\\xd0\\xba\\0\"\n    \"\\xd2\\x9b\\xd0\\xb0\\xd0\\xb7\\xd0\\xb0\\xd0\\xbd\\0\"\n    \"\\xd2\\x9b\\xd0\\xb0\\xd1\\x80\\xd0\\xb0\\xd1\\x88\\xd0\\xb0\\0\"\n    \"\\xd0\\xb6\\xd0\\xb5\\xd0\\xbb\\xd1\\x82\\xd0\\xbe\\xd2\\x9b\\xd1\\x81\\xd0\\xb0\\xd0\\xbd\\0\"\n    \"\\xd2\\x9b\\xd0\\xb0\\xd2\\xa3.\\0\"\n    \"\\xd0\\xb0\\xd2\\x9b\\xd0\\xbf.\\0\"\n    \"\\xd0\\xbd\\xd0\\xb0\\xd1\\x83.\\0\"\n    \"\\xd1\\x81\\xd3\\x99\\xd1\\x83.\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd0\\xbc.\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x83.\\0\"\n    \"\\xd1\\x88\\xd1\\x96\\xd0\\xbb.\\0\"\n    \"\\xd1\\x82\\xd0\\xb0\\xd0\\xbc.\\0\"\n    \"\\xd2\\x9b\\xd1\\x8b\\xd1\\x80.\\0\"\n    \"\\xd2\\x9b\\xd0\\xb0\\xd0\\xb7.\\0\"\n    \"\\xd2\\x9b\\xd0\\xb0\\xd1\\x80.\\0\"\n    \"\\xd0\\xb6\\xd0\\xb5\\xd0\\xbb\\xd1\\x82.\\0\"\n    \"yyyy, dd-MMM\\0\"\n    \"d-MMMM\\0\"\n    \"\\xd1\\x82\\xd2\\xaf\\xd1\\x88\\xd0\\xba\\xd3\\xa9 \\xd1\\x87\\xd0\\xb5\\xd0\\xb9\\xd0\\xb8\\xd0\\xbd\\xd0\\xba\\xd0\\xb8\\0\"\n    \"\\xd1\\x82\\xd2\\xaf\\xd1\\x88\\xd1\\x82\\xd3\\xa9\\xd0\\xbd \\xd0\\xba\\xd0\\xb8\\xd0\\xb9\\xd0\\xb8\\xd0\\xbd\\xd0\\xba\\xd0\\xb8\\0\"\n    \"\\xd0\\x96\\xd0\\xb5\\xd0\\xba\\0\"\n    \"\\xd0\\x94\\xd2\\xaf\\xd0\\xb9\\0\"\n    \"\\xd0\\xa8\\xd0\\xb5\\xd0\\xb9\\0\"\n    \"\\xd0\\xa8\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x91\\xd0\\xb5\\xd0\\xb9\\0\"\n    \"\\xd0\\x96\\xd1\\x83\\xd0\\xbc\\0\"\n    \"\\xd0\\x98\\xd1\\x88\\xd0\\xbc\\0\"\n    \"\\xd0\\xa8\\0\"\n    \"\\xd0\\x98\\0\"\n    \"\\xd1\\x8f\\xd0\\xbd\\xd0\\xb2\\xd0\\xb0\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd1\\x84\\xd0\\xb5\\xd0\\xb2\\xd1\\x80\\xd0\\xb0\\xd0\\xbb\\xd1\\x8c\\0\"\n    \"\\xd0\\xb0\\xd0\\xbf\\xd1\\x80\\xd0\\xb5\\xd0\\xbb\\xd1\\x8c\\0\"\n    \"\\xd0\\xb8\\xd1\\x8e\\xd0\\xbd\\xd1\\x8c\\0\"\n    \"\\xd0\\xb8\\xd1\\x8e\\xd0\\xbb\\xd1\\x8c\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd1\\x82\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd0\\xbe\\xd0\\xba\\xd1\\x82\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd0\\xbd\\xd0\\xbe\\xd1\\x8f\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd0\\xba\\xd0\\xb0\\xd0\\xb1\\xd1\\x80\\xd1\\x8c\\0\"\n    \"\\xd1\\x8f\\xd0\\xbd\\xd0\\xb2.\\0\"\n    \"\\xd0\\xb8\\xd1\\x8e\\xd0\\xbd.\\0\"\n    \"\\xd0\\xb8\\xd1\\x8e\\xd0\\xbb.\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbd.\\0\"\n    \"\\xd0\\xbd\\xd0\\xbe\\xd1\\x8f.\\0\"\n    \"d-MMM yy\\0\"\n    \"dd-MMMM yyyy'-\\xd0\\xb6.'\\0\"\n    \"MMMM yyyy'-\\xd0\\xb6.'\\0\"\n    \"Jumapili\\0\"\n    \"Jumatatu\\0\"\n    \"Jumanne\\0\"\n    \"Jumatano\\0\"\n    \"Alhamisi\\0\"\n    \"Ijumaa\\0\"\n    \"Jumamosi\\0\"\n    \"J2\\0\"\n    \"J3\\0\"\n    \"J4\\0\"\n    \"J5\\0\"\n    \"Alh\\0\"\n    \"Ij\\0\"\n    \"J1\\0\"\n    \"Machi\\0\"\n    \"Aprili\\0\"\n    \"Agosti\\0\"\n    \"Oktoba\\0\"\n    \"Desemba\\0\"\n    \"Ago\\0\"\n    \"yakshanba\\0\"\n    \"dushanba\\0\"\n    \"seshanba\\0\"\n    \"chorshanba\\0\"\n    \"payshanba\\0\"\n    \"juma\\0\"\n    \"shanba\\0\"\n    \"Yaksh\\0\"\n    \"Dush\\0\"\n    \"Sesh\\0\"\n    \"Chor\\0\"\n    \"Pay\\0\"\n    \"Shan\\0\"\n    \"Y\\0\"\n    \"Iyun\\0\"\n    \"Iyul\\0\"\n    \"Avgust\\0\"\n    \"Yanv\\0\"\n    \"Fev\\0\"\n    \"Avg\\0\"\n    \"Noya\\0\"\n    \"Dek\\0\"\n    \"dddd, yyyy MMMM dd\\0\"\n    \"\\xe0\\xa6\\xaa\\xe0\\xa7\\x82\\xe0\\xa6\\xb0\\xe0\\xa7\\x8d\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\xb9\\xe0\\xa7\\x8d\\xe0\\xa6\\xa3\\0\"\n    \"\\xe0\\xa6\\x85\\xe0\\xa6\\xaa\\xe0\\xa6\\xb0\\xe0\\xa6\\xbe\\xe0\\xa6\\xb9\\xe0\\xa7\\x8d\\xe0\\xa6\\xa3\\0\"\n    \"\\xe0\\xa6\\xb0\\xe0\\xa6\\xac\\xe0\\xa6\\xbf\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\xb8\\xe0\\xa7\\x8b\\xe0\\xa6\\xae\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\xae\\xe0\\xa6\\x99\\xe0\\xa7\\x8d\\xe0\\xa6\\x97\\xe0\\xa6\\xb2\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa7\\x81\\xe0\\xa6\\xa7\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa7\\x83\\xe0\\xa6\\xb9\\xe0\\xa6\\xb7\\xe0\\xa7\\x8d\\xe0\\xa6\\xaa\\xe0\\xa6\\xa4\\xe0\\xa6\\xbf\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\xb6\\xe0\\xa7\\x81\\xe0\\xa6\\x95\\xe0\\xa7\\x8d\\xe0\\xa6\\xb0\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\xb6\\xe0\\xa6\\xa8\\xe0\\xa6\\xbf\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\xb0\\xe0\\xa6\\xac\\xe0\\xa6\\xbf\\0\"\n    \"\\xe0\\xa6\\xb8\\xe0\\xa7\\x8b\\xe0\\xa6\\xae\\0\"\n    \"\\xe0\\xa6\\xae\\xe0\\xa6\\x99\\xe0\\xa7\\x8d\\xe0\\xa6\\x97\\xe0\\xa6\\xb2\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa7\\x81\\xe0\\xa6\\xa7\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa7\\x83\\xe0\\xa6\\xb9\\xe0\\xa6\\xb8\\xe0\\xa7\\x8d\\xe0\\xa6\\xaa\\xe0\\xa6\\xa4\\xe0\\xa6\\xbf\\0\"\n    \"\\xe0\\xa6\\xb6\\xe0\\xa7\\x81\\xe0\\xa6\\x95\\xe0\\xa7\\x8d\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\xb6\\xe0\\xa6\\xa8\\xe0\\xa6\\xbf\\0\"\n    \"\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\xb8\\xe0\\xa7\\x8b\\0\"\n    \"\\xe0\\xa6\\xae\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa7\\x81\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa7\\x83\\0\"\n    \"\\xe0\\xa6\\xb6\\xe0\\xa7\\x81\\0\"\n    \"\\xe0\\xa6\\xb6\\0\"\n    \"\\xe0\\xa6\\x9c\\xe0\\xa6\\xbe\\xe0\\xa6\\xa8\\xe0\\xa7\\x81\\xe0\\xa6\\xaf\\xe0\\xa6\\xbc\\xe0\\xa6\\xbe\\xe0\\xa6\\xb0\\xe0\\xa7\\x80\\0\"\n    \"\\xe0\\xa6\\xab\\xe0\\xa7\\x87\\xe0\\xa6\\xac\\xe0\\xa7\\x8d\\xe0\\xa6\\xb0\\xe0\\xa7\\x81\\xe0\\xa6\\xaf\\xe0\\xa6\\xbc\\xe0\\xa6\\xbe\\xe0\\xa6\\xb0\\xe0\\xa7\\x80\\0\"\n    \"\\xe0\\xa6\\xae\\xe0\\xa6\\xbe\\xe0\\xa6\\xb0\\xe0\\xa7\\x8d\\xe0\\xa6\\x9a\\0\"\n    \"\\xe0\\xa6\\x8f\\xe0\\xa6\\xaa\\xe0\\xa7\\x8d\\xe0\\xa6\\xb0\\xe0\\xa6\\xbf\\xe0\\xa6\\xb2\\0\"\n    \"\\xe0\\xa6\\xae\\xe0\\xa7\\x87\\0\"\n    \"\\xe0\\xa6\\x9c\\xe0\\xa7\\x81\\xe0\\xa6\\xa8\\0\"\n    \"\\xe0\\xa6\\x9c\\xe0\\xa7\\x81\\xe0\\xa6\\xb2\\xe0\\xa6\\xbe\\xe0\\xa6\\x87\\0\"\n    \"\\xe0\\xa6\\x86\\xe0\\xa6\\x97\\xe0\\xa6\\xb8\\xe0\\xa7\\x8d\\xe0\\xa6\\x9f\\0\"\n    \"\\xe0\\xa6\\xb8\\xe0\\xa7\\x87\\xe0\\xa6\\xaa\\xe0\\xa7\\x8d\\xe0\\xa6\\x9f\\xe0\\xa7\\x87\\xe0\\xa6\\xae\\xe0\\xa7\\x8d\\xe0\\xa6\\xac\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\x85\\xe0\\xa6\\x95\\xe0\\xa7\\x8d\\xe0\\xa6\\x9f\\xe0\\xa7\\x8b\\xe0\\xa6\\xac\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\xa8\\xe0\\xa6\\xad\\xe0\\xa7\\x87\\xe0\\xa6\\xae\\xe0\\xa7\\x8d\\xe0\\xa6\\xac\\xe0\\xa6\\xb0\\0\"\n    \"\\xe0\\xa6\\xa1\\xe0\\xa6\\xbf\\xe0\\xa6\\xb8\\xe0\\xa7\\x87\\xe0\\xa6\\xae\\xe0\\xa7\\x8d\\xe0\\xa6\\xac\\xe0\\xa6\\xb0\\0\"\n    \"tt hh.mm\\0\"\n    \"tt h.mm\\0\"\n    \"tt hh.mm.ss\\0\"\n    \"tt h.mm.ss\\0\"\n    \"\\xe0\\xa8\\x90\\xe0\\xa8\\xa4\\xe0\\xa8\\xb5\\xe0\\xa8\\xbe\\xe0\\xa8\\xb0\\0\"\n    \"\\xe0\\xa8\\xb8\\xe0\\xa9\\x8b\\xe0\\xa8\\xae\\xe0\\xa8\\xb5\\xe0\\xa8\\xbe\\xe0\\xa8\\xb0\\0\"\n    \"\\xe0\\xa8\\xae\\xe0\\xa9\\xb0\\xe0\\xa8\\x97\\xe0\\xa8\\xb2\\xe0\\xa8\\xb5\\xe0\\xa8\\xbe\\xe0\\xa8\\xb0\\0\"\n    \"\\xe0\\xa8\\xac\\xe0\\xa9\\x81\\xe0\\xa8\\xa7\\xe0\\xa8\\xb5\\xe0\\xa8\\xbe\\xe0\\xa8\\xb0\\0\"\n    \"\\xe0\\xa8\\xb5\\xe0\\xa9\\x80\\xe0\\xa8\\xb0\\xe0\\xa8\\xb5\\xe0\\xa8\\xbe\\xe0\\xa8\\xb0\\0\"\n    \"\\xe0\\xa8\\xb8\\xe0\\xa8\\xbc\\xe0\\xa9\\x81\\xe0\\xa9\\xb1\\xe0\\xa8\\x95\\xe0\\xa8\\xb0\\xe0\\xa8\\xb5\\xe0\\xa8\\xbe\\xe0\\xa8\\xb0\\0\"\n    \"\\xe0\\xa8\\xb8\\xe0\\xa8\\xbc\\xe0\\xa8\\xa8\\xe0\\xa9\\x80\\xe0\\xa8\\xb5\\xe0\\xa8\\xbe\\xe0\\xa8\\xb0\\0\"\n    \"\\xe0\\xa8\\x90\\xe0\\xa8\\xa4.\\0\"\n    \"\\xe0\\xa8\\xb8\\xe0\\xa9\\x8b\\xe0\\xa8\\xae.\\0\"\n    \"\\xe0\\xa8\\xae\\xe0\\xa9\\xb0\\xe0\\xa8\\x97\\xe0\\xa8\\xb2.\\0\"\n    \"\\xe0\\xa8\\xac\\xe0\\xa9\\x81\\xe0\\xa8\\xa7.\\0\"\n    \"\\xe0\\xa8\\xb5\\xe0\\xa9\\x80\\xe0\\xa8\\xb0.\\0\"\n    \"\\xe0\\xa8\\xb8\\xe0\\xa8\\xbc\\xe0\\xa9\\x81\\xe0\\xa9\\xb1\\xe0\\xa8\\x95\\xe0\\xa8\\xb0.\\0\"\n    \"\\xe0\\xa8\\xb8\\xe0\\xa8\\xbc\\xe0\\xa8\\xa8\\xe0\\xa9\\x80.\\0\"\n    \"\\xe0\\xa8\\x90\\0\"\n    \"\\xe0\\xa8\\xb8\\xe0\\xa9\\x8b\\0\"\n    \"\\xe0\\xa8\\xae\\xe0\\xa9\\xb0\\0\"\n    \"\\xe0\\xa8\\xac\\xe0\\xa9\\x81\\xe0\\xa9\\xb1\\0\"\n    \"\\xe0\\xa8\\xb5\\xe0\\xa9\\x80\\0\"\n    \"\\xe0\\xa8\\xb8\\xe0\\xa8\\xbc\\xe0\\xa9\\x81\\xe0\\xa9\\xb1\\0\"\n    \"\\xe0\\xa8\\xb8\\xe0\\xa8\\xbc\\0\"\n    \"\\xe0\\xa8\\x9c\\xe0\\xa8\\xa8\\xe0\\xa8\\xb5\\xe0\\xa8\\xb0\\xe0\\xa9\\x80\\0\"\n    \"\\xe0\\xa8\\xab\\xe0\\xa8\\xbc\\xe0\\xa8\\xb0\\xe0\\xa8\\xb5\\xe0\\xa8\\xb0\\xe0\\xa9\\x80\\0\"\n    \"\\xe0\\xa8\\xae\\xe0\\xa8\\xbe\\xe0\\xa8\\xb0\\xe0\\xa8\\x9a\\0\"\n    \"\\xe0\\xa8\\x85\\xe0\\xa8\\xaa\\xe0\\xa9\\x8d\\xe0\\xa8\\xb0\\xe0\\xa9\\x88\\xe0\\xa8\\xb2\\0\"\n    \"\\xe0\\xa8\\xae\\xe0\\xa8\\x88\\0\"\n    \"\\xe0\\xa8\\x9c\\xe0\\xa9\\x82\\xe0\\xa8\\xa8\\0\"\n    \"\\xe0\\xa8\\x9c\\xe0\\xa9\\x81\\xe0\\xa8\\xb2\\xe0\\xa8\\xbe\\xe0\\xa8\\x88\\0\"\n    \"\\xe0\\xa8\\x85\\xe0\\xa8\\x97\\xe0\\xa8\\xb8\\xe0\\xa8\\xa4\\0\"\n    \"\\xe0\\xa8\\xb8\\xe0\\xa8\\xa4\\xe0\\xa9\\xb0\\xe0\\xa8\\xac\\xe0\\xa8\\xb0\\0\"\n    \"\\xe0\\xa8\\x85\\xe0\\xa8\\x95\\xe0\\xa8\\xa4\\xe0\\xa9\\x82\\xe0\\xa8\\xac\\xe0\\xa8\\xb0\\0\"\n    \"\\xe0\\xa8\\xa8\\xe0\\xa8\\xb5\\xe0\\xa9\\xb0\\xe0\\xa8\\xac\\xe0\\xa8\\xb0\\0\"\n    \"\\xe0\\xa8\\xa6\\xe0\\xa8\\xb8\\xe0\\xa9\\xb0\\xe0\\xa8\\xac\\xe0\\xa8\\xb0\\0\"\n    \"dd MMMM yyyy dddd\\0\"\n    \"\\xe0\\xaa\\xb0\\xe0\\xaa\\xb5\\xe0\\xaa\\xbf\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xb8\\xe0\\xab\\x8b\\xe0\\xaa\\xae\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xae\\xe0\\xaa\\x82\\xe0\\xaa\\x97\\xe0\\xaa\\xb3\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xac\\xe0\\xab\\x81\\xe0\\xaa\\xa7\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\x97\\xe0\\xab\\x81\\xe0\\xaa\\xb0\\xe0\\xab\\x81\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xb6\\xe0\\xab\\x81\\xe0\\xaa\\x95\\xe0\\xab\\x8d\\xe0\\xaa\\xb0\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xb6\\xe0\\xaa\\xa8\\xe0\\xaa\\xbf\\xe0\\xaa\\xb5\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xb0\\xe0\\xaa\\xb5\\xe0\\xaa\\xbf\\0\"\n    \"\\xe0\\xaa\\xb8\\xe0\\xab\\x8b\\xe0\\xaa\\xae\\0\"\n    \"\\xe0\\xaa\\xae\\xe0\\xaa\\x82\\xe0\\xaa\\x97\\xe0\\xaa\\xb3\\0\"\n    \"\\xe0\\xaa\\xac\\xe0\\xab\\x81\\xe0\\xaa\\xa7\\0\"\n    \"\\xe0\\xaa\\x97\\xe0\\xab\\x81\\xe0\\xaa\\xb0\\xe0\\xab\\x81\\0\"\n    \"\\xe0\\xaa\\xb6\\xe0\\xab\\x81\\xe0\\xaa\\x95\\xe0\\xab\\x8d\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xb6\\xe0\\xaa\\xa8\\xe0\\xaa\\xbf\\0\"\n    \"\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xb8\\xe0\\xab\\x8b\\0\"\n    \"\\xe0\\xaa\\xae\\xe0\\xaa\\x82\\0\"\n    \"\\xe0\\xaa\\xac\\xe0\\xab\\x81\\0\"\n    \"\\xe0\\xaa\\x97\\xe0\\xab\\x81\\0\"\n    \"\\xe0\\xaa\\xb6\\xe0\\xab\\x81\\0\"\n    \"\\xe0\\xaa\\xb6\\0\"\n    \"\\xe0\\xaa\\x9c\\xe0\\xaa\\xbe\\xe0\\xaa\\xa8\\xe0\\xab\\x8d\\xe0\\xaa\\xaf\\xe0\\xab\\x81\\xe0\\xaa\\x86\\xe0\\xaa\\xb0\\xe0\\xab\\x80\\0\"\n    \"\\xe0\\xaa\\xab\\xe0\\xab\\x87\\xe0\\xaa\\xac\\xe0\\xab\\x8d\\xe0\\xaa\\xb0\\xe0\\xab\\x81\\xe0\\xaa\\x86\\xe0\\xaa\\xb0\\xe0\\xab\\x80\\0\"\n    \"\\xe0\\xaa\\xae\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\xe0\\xab\\x8d\\xe0\\xaa\\x9a\\0\"\n    \"\\xe0\\xaa\\x8f\\xe0\\xaa\\xaa\\xe0\\xab\\x8d\\xe0\\xaa\\xb0\\xe0\\xaa\\xbf\\xe0\\xaa\\xb2\\0\"\n    \"\\xe0\\xaa\\xae\\xe0\\xab\\x87\\0\"\n    \"\\xe0\\xaa\\x9c\\xe0\\xab\\x82\\xe0\\xaa\\xa8\\0\"\n    \"\\xe0\\xaa\\x9c\\xe0\\xab\\x81\\xe0\\xaa\\xb2\\xe0\\xaa\\xbe\\xe0\\xaa\\x88\\0\"\n    \"\\xe0\\xaa\\x91\\xe0\\xaa\\x97\\xe0\\xaa\\xb8\\xe0\\xab\\x8d\\xe0\\xaa\\x9f\\0\"\n    \"\\xe0\\xaa\\xb8\\xe0\\xaa\\xaa\\xe0\\xab\\x8d\\xe0\\xaa\\x9f\\xe0\\xab\\x87\\xe0\\xaa\\xae\\xe0\\xab\\x8d\\xe0\\xaa\\xac\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\x91\\xe0\\xaa\\x95\\xe0\\xab\\x8d\\xe0\\xaa\\x9f\\xe0\\xab\\x8b\\xe0\\xaa\\xac\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xa8\\xe0\\xaa\\xb5\\xe0\\xab\\x87\\xe0\\xaa\\xae\\xe0\\xab\\x8d\\xe0\\xaa\\xac\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\xa1\\xe0\\xaa\\xbf\\xe0\\xaa\\xb8\\xe0\\xab\\x87\\xe0\\xaa\\xae\\xe0\\xab\\x8d\\xe0\\xaa\\xac\\xe0\\xaa\\xb0\\0\"\n    \"\\xe0\\xaa\\x9c\\xe0\\xaa\\xbe\\xe0\\xaa\\xa8\\xe0\\xab\\x8d\\xe0\\xaa\\xaf\\xe0\\xab\\x81\\0\"\n    \"\\xe0\\xaa\\xab\\xe0\\xab\\x87\\xe0\\xaa\\xac\\xe0\\xab\\x8d\\xe0\\xaa\\xb0\\xe0\\xab\\x81\\0\"\n    \"\\xe0\\xaa\\x91\\xe0\\xaa\\x97\\0\"\n    \"\\xe0\\xaa\\xb8\\xe0\\xaa\\xaa\\xe0\\xab\\x8d\\xe0\\xaa\\x9f\\xe0\\xab\\x87\\0\"\n    \"\\xe0\\xaa\\x91\\xe0\\xaa\\x95\\xe0\\xab\\x8d\\xe0\\xaa\\x9f\\xe0\\xab\\x8b\\0\"\n    \"\\xe0\\xaa\\xa8\\xe0\\xaa\\xb5\\xe0\\xab\\x87\\0\"\n    \"\\xe0\\xaa\\xa1\\xe0\\xaa\\xbf\\xe0\\xaa\\xb8\\xe0\\xab\\x87\\0\"\n    \"pm\\0\"\n    \"\\xe0\\xac\\xb0\\xe0\\xac\\xac\\xe0\\xac\\xbf\\xe0\\xac\\xac\\xe0\\xac\\xbe\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\xb8\\xe0\\xad\\x8b\\xe0\\xac\\xae\\xe0\\xac\\xac\\xe0\\xac\\xbe\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\xae\\xe0\\xac\\x99\\xe0\\xad\\x8d\\xe0\\xac\\x97\\xe0\\xac\\xb3\\xe0\\xac\\xac\\xe0\\xac\\xbe\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\xac\\xe0\\xad\\x81\\xe0\\xac\\xa7\\xe0\\xac\\xac\\xe0\\xac\\xbe\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\x97\\xe0\\xad\\x81\\xe0\\xac\\xb0\\xe0\\xad\\x81\\xe0\\xac\\xac\\xe0\\xac\\xbe\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\xb6\\xe0\\xad\\x81\\xe0\\xac\\x95\\xe0\\xad\\x8d\\xe0\\xac\\xb0\\xe0\\xac\\xac\\xe0\\xac\\xbe\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\xb6\\xe0\\xac\\xa8\\xe0\\xac\\xbf\\xe0\\xac\\xac\\xe0\\xac\\xbe\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\xb0\\xe0\\xac\\xac\\xe0\\xac\\xbf\\0\"\n    \"\\xe0\\xac\\xb8\\xe0\\xad\\x8b\\xe0\\xac\\xae\\0\"\n    \"\\xe0\\xac\\xae\\xe0\\xac\\x99\\xe0\\xad\\x8d\\xe0\\xac\\x97\\xe0\\xac\\xb3\\0\"\n    \"\\xe0\\xac\\xac\\xe0\\xad\\x81\\xe0\\xac\\xa7\\0\"\n    \"\\xe0\\xac\\x97\\xe0\\xad\\x81\\xe0\\xac\\xb0\\xe0\\xad\\x81\\0\"\n    \"\\xe0\\xac\\xb6\\xe0\\xad\\x81\\xe0\\xac\\x95\\xe0\\xad\\x8d\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\xb6\\xe0\\xac\\xa8\\xe0\\xac\\xbf\\0\"\n    \"\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\xb8\\xe0\\xad\\x8b\\0\"\n    \"\\xe0\\xac\\xae\\0\"\n    \"\\xe0\\xac\\xac\\xe0\\xad\\x81\\0\"\n    \"\\xe0\\xac\\x97\\xe0\\xad\\x81\\0\"\n    \"\\xe0\\xac\\xb6\\xe0\\xad\\x81\\0\"\n    \"\\xe0\\xac\\xb6\\0\"\n    \"\\xe0\\xac\\x9c\\xe0\\xac\\xbe\\xe0\\xac\\xa8\\xe0\\xad\\x81\\xe0\\xac\\x86\\xe0\\xac\\xb0\\xe0\\xad\\x80\\0\"\n    \"\\xe0\\xac\\xab\\xe0\\xad\\x87\\xe0\\xac\\xac\\xe0\\xad\\x8d\\xe0\\xac\\xb0\\xe0\\xad\\x81\\xe0\\xad\\x9f\\xe0\\xac\\xbe\\xe0\\xac\\xb0\\xe0\\xad\\x80\\0\"\n    \"\\xe0\\xac\\xae\\xe0\\xac\\xbe\\xe0\\xac\\xb0\\xe0\\xad\\x8d\\xe0\\xac\\x9a\\xe0\\xad\\x8d\\xe0\\xac\\x9a\\0\"\n    \"\\xe0\\xac\\x85\\xe0\\xac\\xaa\\xe0\\xad\\x8d\\xe0\\xac\\xb0\\xe0\\xad\\x87\\xe0\\xac\\xb2\\0\"\n    \"\\xe0\\xac\\xae\\xe0\\xad\\x87\\0\"\n    \"\\xe0\\xac\\x9c\\xe0\\xad\\x81\\xe0\\xac\\xa8\\0\"\n    \"\\xe0\\xac\\x9c\\xe0\\xad\\x81\\xe0\\xac\\xb2\\xe0\\xac\\xbe\\xe0\\xac\\x87\\0\"\n    \"\\xe0\\xac\\x85\\xe0\\xac\\x97\\xe0\\xac\\xb7\\xe0\\xad\\x8d\\xe0\\xac\\x9f\\0\"\n    \"\\xe0\\xac\\xb8\\xe0\\xad\\x87\\xe0\\xac\\xaa\\xe0\\xad\\x8d\\xe0\\xac\\x9f\\xe0\\xad\\x87\\xe0\\xac\\xae\\xe0\\xad\\x8d\\xe0\\xac\\xac\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\x85\\xe0\\xac\\x95\\xe0\\xad\\x8d\\xe0\\xac\\x9f\\xe0\\xad\\x8b\\xe0\\xac\\xac\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\xa8\\xe0\\xac\\xad\\xe0\\xad\\x87\\xe0\\xac\\xae\\xe0\\xad\\x8d\\xe0\\xac\\xac\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xac\\xa1\\xe0\\xac\\xbf\\xe0\\xac\\xb8\\xe0\\xad\\x87\\xe0\\xac\\xae\\xe0\\xad\\x8d\\xe0\\xac\\xac\\xe0\\xac\\xb0\\0\"\n    \"\\xe0\\xae\\xae\\xe0\\xaf\\x81\\xe0\\xae\\xb1\\xe0\\xaf\\x8d\\xe0\\xae\\xaa\\xe0\\xae\\x95\\xe0\\xae\\xb2\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\xaa\\xe0\\xae\\xbf\\xe0\\xae\\xb1\\xe0\\xaf\\x8d\\xe0\\xae\\xaa\\xe0\\xae\\x95\\xe0\\xae\\xb2\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x9e\\xe0\\xae\\xbe\\xe0\\xae\\xaf\\xe0\\xae\\xbf\\xe0\\xae\\xb1\\xe0\\xaf\\x81\\0\"\n    \"\\xe0\\xae\\xa4\\xe0\\xae\\xbf\\xe0\\xae\\x99\\xe0\\xaf\\x8d\\xe0\\xae\\x95\\xe0\\xae\\xb3\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x9a\\xe0\\xaf\\x86\\xe0\\xae\\xb5\\xe0\\xaf\\x8d\\xe0\\xae\\xb5\\xe0\\xae\\xbe\\xe0\\xae\\xaf\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\xaa\\xe0\\xaf\\x81\\xe0\\xae\\xa4\\xe0\\xae\\xa9\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\xb5\\xe0\\xae\\xbf\\xe0\\xae\\xaf\\xe0\\xae\\xbe\\xe0\\xae\\xb4\\xe0\\xae\\xa9\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\xb5\\xe0\\xaf\\x86\\xe0\\xae\\xb3\\xe0\\xaf\\x8d\\xe0\\xae\\xb3\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\x9a\\xe0\\xae\\xa9\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\x9e\\xe0\\xae\\xbe\\0\"\n    \"\\xe0\\xae\\xa4\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\x9a\\xe0\\xaf\\x86\\0\"\n    \"\\xe0\\xae\\xaa\\xe0\\xaf\\x81\\0\"\n    \"\\xe0\\xae\\xb5\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\xb5\\xe0\\xaf\\x86\\0\"\n    \"\\xe0\\xae\\x9a\\0\"\n    \"\\xe0\\xae\\x9c\\xe0\\xae\\xa9\\xe0\\xae\\xb5\\xe0\\xae\\xb0\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\xaa\\xe0\\xae\\xbf\\xe0\\xae\\xaa\\xe0\\xaf\\x8d\\xe0\\xae\\xb0\\xe0\\xae\\xb5\\xe0\\xae\\xb0\\xe0\\xae\\xbf\\0\"\n    \"\\xe0\\xae\\xae\\xe0\\xae\\xbe\\xe0\\xae\\xb0\\xe0\\xaf\\x8d\\xe0\\xae\\x9a\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x8f\\xe0\\xae\\xaa\\xe0\\xaf\\x8d\\xe0\\xae\\xb0\\xe0\\xae\\xb2\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\xae\\xe0\\xaf\\x87\\0\"\n    \"\\xe0\\xae\\x9c\\xe0\\xaf\\x82\\xe0\\xae\\xa9\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x9c\\xe0\\xaf\\x82\\xe0\\xae\\xb2\\xe0\\xaf\\x88\\0\"\n    \"\\xe0\\xae\\x86\\xe0\\xae\\x95\\xe0\\xae\\xb8\\xe0\\xaf\\x8d\\xe0\\xae\\x9f\\xe0\\xaf\\x81\\0\"\n    \"\\xe0\\xae\\x9a\\xe0\\xaf\\x86\\xe0\\xae\\xaa\\xe0\\xaf\\x8d\\xe0\\xae\\x9f\\xe0\\xae\\xae\\xe0\\xaf\\x8d\\xe0\\xae\\xaa\\xe0\\xae\\xb0\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x85\\xe0\\xae\\x95\\xe0\\xaf\\x8d\\xe0\\xae\\x9f\\xe0\\xaf\\x8b\\xe0\\xae\\xaa\\xe0\\xae\\xb0\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\xa8\\xe0\\xae\\xb5\\xe0\\xae\\xae\\xe0\\xaf\\x8d\\xe0\\xae\\xaa\\xe0\\xae\\xb0\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x9f\\xe0\\xae\\xbf\\xe0\\xae\\x9a\\xe0\\xae\\xae\\xe0\\xaf\\x8d\\xe0\\xae\\xaa\\xe0\\xae\\xb0\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x86\\xe0\\xae\\x95\\xe0\\xae\\xb8\\xe0\\xaf\\x8d\\xe0\\xae\\x9f\\xe0\\xaf\\x8d\\0\"\n    \"\\xe0\\xae\\x9c\\xe0\\xae\\xa9.\\0\"\n    \"\\xe0\\xae\\xaa\\xe0\\xae\\xbf\\xe0\\xae\\xaa\\xe0\\xaf\\x8d.\\0\"\n    \"\\xe0\\xae\\xae\\xe0\\xae\\xbe\\xe0\\xae\\xb0\\xe0\\xaf\\x8d.\\0\"\n    \"\\xe0\\xae\\x8f\\xe0\\xae\\xaa\\xe0\\xaf\\x8d.\\0\"\n    \"\\xe0\\xae\\x86\\xe0\\xae\\x95.\\0\"\n    \"\\xe0\\xae\\x9a\\xe0\\xaf\\x86\\xe0\\xae\\xaa\\xe0\\xaf\\x8d.\\0\"\n    \"\\xe0\\xae\\x85\\xe0\\xae\\x95\\xe0\\xaf\\x8d.\\0\"\n    \"\\xe0\\xae\\xa8\\xe0\\xae\\xb5.\\0\"\n    \"\\xe0\\xae\\x9f\\xe0\\xae\\xbf\\xe0\\xae\\x9a.\\0\"\n    \"\\xe0\\xb0\\x86\\xe0\\xb0\\xa6\\xe0\\xb0\\xbf\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\xb8\\xe0\\xb1\\x8b\\xe0\\xb0\\xae\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\xae\\xe0\\xb0\\x82\\xe0\\xb0\\x97\\xe0\\xb0\\xb3\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\xac\\xe0\\xb1\\x81\\xe0\\xb0\\xa7\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\x97\\xe0\\xb1\\x81\\xe0\\xb0\\xb0\\xe0\\xb1\\x81\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\xb6\\xe0\\xb1\\x81\\xe0\\xb0\\x95\\xe0\\xb1\\x8d\\xe0\\xb0\\xb0\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\xb6\\xe0\\xb0\\xa8\\xe0\\xb0\\xbf\\xe0\\xb0\\xb5\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\x86\\xe0\\xb0\\xa6\\xe0\\xb0\\xbf\\0\"\n    \"\\xe0\\xb0\\xb8\\xe0\\xb1\\x8b\\xe0\\xb0\\xae\\0\"\n    \"\\xe0\\xb0\\xae\\xe0\\xb0\\x82\\xe0\\xb0\\x97\\xe0\\xb0\\xb3\\0\"\n    \"\\xe0\\xb0\\xac\\xe0\\xb1\\x81\\xe0\\xb0\\xa7\\0\"\n    \"\\xe0\\xb0\\x97\\xe0\\xb1\\x81\\xe0\\xb0\\xb0\\xe0\\xb1\\x81\\0\"\n    \"\\xe0\\xb0\\xb6\\xe0\\xb1\\x81\\xe0\\xb0\\x95\\xe0\\xb1\\x8d\\xe0\\xb0\\xb0\\0\"\n    \"\\xe0\\xb0\\xb6\\xe0\\xb0\\xa8\\xe0\\xb0\\xbf\\0\"\n    \"\\xe0\\xb0\\x86\\0\"\n    \"\\xe0\\xb0\\xb8\\xe0\\xb1\\x8b\\0\"\n    \"\\xe0\\xb0\\xae\\0\"\n    \"\\xe0\\xb0\\xac\\xe0\\xb1\\x81\\0\"\n    \"\\xe0\\xb0\\x97\\xe0\\xb1\\x81\\0\"\n    \"\\xe0\\xb0\\xb6\\xe0\\xb1\\x81\\0\"\n    \"\\xe0\\xb0\\xb6\\0\"\n    \"\\xe0\\xb0\\x9c\\xe0\\xb0\\xa8\\xe0\\xb0\\xb5\\xe0\\xb0\\xb0\\xe0\\xb0\\xbf\\0\"\n    \"\\xe0\\xb0\\xab\\xe0\\xb0\\xbf\\xe0\\xb0\\xac\\xe0\\xb1\\x8d\\xe0\\xb0\\xb0\\xe0\\xb0\\xb5\\xe0\\xb0\\xb0\\xe0\\xb0\\xbf\\0\"\n    \"\\xe0\\xb0\\xae\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\xe0\\xb0\\x9a\\xe0\\xb0\\xbf\\0\"\n    \"\\xe0\\xb0\\x8e\\xe0\\xb0\\xaa\\xe0\\xb1\\x8d\\xe0\\xb0\\xb0\\xe0\\xb0\\xbf\\xe0\\xb0\\xb2\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb0\\xae\\xe0\\xb1\\x87\\0\"\n    \"\\xe0\\xb0\\x9c\\xe0\\xb1\\x82\\xe0\\xb0\\xa8\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb0\\x9c\\xe0\\xb1\\x82\\xe0\\xb0\\xb2\\xe0\\xb1\\x88\\0\"\n    \"\\xe0\\xb0\\x86\\xe0\\xb0\\x97\\xe0\\xb0\\xb8\\xe0\\xb1\\x8d\\xe0\\xb0\\x9f\\xe0\\xb1\\x81\\0\"\n    \"\\xe0\\xb0\\xb8\\xe0\\xb1\\x86\\xe0\\xb0\\xaa\\xe0\\xb1\\x8d\\xe0\\xb0\\x9f\\xe0\\xb1\\x86\\xe0\\xb0\\x82\\xe0\\xb0\\xac\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb0\\x85\\xe0\\xb0\\x95\\xe0\\xb1\\x8d\\xe0\\xb0\\x9f\\xe0\\xb1\\x8b\\xe0\\xb0\\xac\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb0\\xa8\\xe0\\xb0\\xb5\\xe0\\xb0\\x82\\xe0\\xb0\\xac\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb0\\xa1\\xe0\\xb0\\xbf\\xe0\\xb0\\xb8\\xe0\\xb1\\x86\\xe0\\xb0\\x82\\xe0\\xb0\\xac\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\0\"\n    \"\\xe0\\xb0\\x9c\\xe0\\xb1\\x81\\xe0\\xb0\\xb2\\xe0\\xb1\\x88\\0\"\n    \"\\xe0\\xb0\\x9c\\xe0\\xb0\\xa8\\0\"\n    \"\\xe0\\xb0\\xab\\xe0\\xb0\\xbf\\xe0\\xb0\\xac\\xe0\\xb1\\x8d\\xe0\\xb0\\xb0\\0\"\n    \"\\xe0\\xb0\\x8f\\xe0\\xb0\\xaa\\xe0\\xb1\\x8d\\xe0\\xb0\\xb0\\xe0\\xb0\\xbf\\0\"\n    \"\\xe0\\xb0\\xb8\\xe0\\xb1\\x86\\xe0\\xb0\\xaa\\xe0\\xb1\\x8d\\xe0\\xb0\\x9f\\xe0\\xb1\\x86\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\x85\\xe0\\xb0\\x95\\xe0\\xb1\\x8d\\xe0\\xb0\\x9f\\xe0\\xb1\\x8b\\0\"\n    \"\\xe0\\xb0\\xa8\\xe0\\xb0\\xb5\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb0\\xa1\\xe0\\xb0\\xbf\\xe0\\xb0\\xb8\\xe0\\xb1\\x86\\xe0\\xb0\\x82\\0\"\n    \"\\xe0\\xb2\\xb0\\xe0\\xb2\\xb5\\xe0\\xb2\\xbf\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xb8\\xe0\\xb3\\x8b\\xe0\\xb2\\xae\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xae\\xe0\\xb2\\x82\\xe0\\xb2\\x97\\xe0\\xb2\\xb3\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xac\\xe0\\xb3\\x81\\xe0\\xb2\\xa7\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\x97\\xe0\\xb3\\x81\\xe0\\xb2\\xb0\\xe0\\xb3\\x81\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xb6\\xe0\\xb3\\x81\\xe0\\xb2\\x95\\xe0\\xb3\\x8d\\xe0\\xb2\\xb0\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xb6\\xe0\\xb2\\xa8\\xe0\\xb2\\xbf\\xe0\\xb2\\xb5\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xb0\\xe0\\xb2\\xb5\\xe0\\xb2\\xbf\\0\"\n    \"\\xe0\\xb2\\xb8\\xe0\\xb3\\x8b\\xe0\\xb2\\xae\\0\"\n    \"\\xe0\\xb2\\xae\\xe0\\xb2\\x82\\xe0\\xb2\\x97\\xe0\\xb2\\xb3\\0\"\n    \"\\xe0\\xb2\\xac\\xe0\\xb3\\x81\\xe0\\xb2\\xa7\\0\"\n    \"\\xe0\\xb2\\x97\\xe0\\xb3\\x81\\xe0\\xb2\\xb0\\xe0\\xb3\\x81\\0\"\n    \"\\xe0\\xb2\\xb6\\xe0\\xb3\\x81\\xe0\\xb2\\x95\\xe0\\xb3\\x8d\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xb6\\xe0\\xb2\\xa8\\xe0\\xb2\\xbf\\0\"\n    \"\\xe0\\xb2\\xb0\\0\"\n    \"\\xe0\\xb2\\xb8\\xe0\\xb3\\x8b\\0\"\n    \"\\xe0\\xb2\\xae\\xe0\\xb2\\x82\\0\"\n    \"\\xe0\\xb2\\xac\\xe0\\xb3\\x81\\0\"\n    \"\\xe0\\xb2\\x97\\xe0\\xb3\\x81\\0\"\n    \"\\xe0\\xb2\\xb6\\xe0\\xb3\\x81\\0\"\n    \"\\xe0\\xb2\\xb6\\0\"\n    \"\\xe0\\xb2\\x9c\\xe0\\xb2\\xa8\\xe0\\xb2\\xb5\\xe0\\xb2\\xb0\\xe0\\xb2\\xbf\\0\"\n    \"\\xe0\\xb2\\xab\\xe0\\xb3\\x86\\xe0\\xb2\\xac\\xe0\\xb3\\x8d\\xe0\\xb2\\xb0\\xe0\\xb2\\xb5\\xe0\\xb2\\xb0\\xe0\\xb2\\xbf\\0\"\n    \"\\xe0\\xb2\\xae\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\xe0\\xb2\\x9a\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\x8f\\xe0\\xb2\\xaa\\xe0\\xb3\\x8d\\xe0\\xb2\\xb0\\xe0\\xb2\\xbf\\xe0\\xb2\\xb2\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\xae\\xe0\\xb3\\x87\\0\"\n    \"\\xe0\\xb2\\x9c\\xe0\\xb3\\x82\\xe0\\xb2\\xa8\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\x9c\\xe0\\xb3\\x81\\xe0\\xb2\\xb2\\xe0\\xb3\\x88\\0\"\n    \"\\xe0\\xb2\\x86\\xe0\\xb2\\x97\\xe0\\xb2\\xb8\\xe0\\xb3\\x8d\\xe0\\xb2\\x9f\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\xb8\\xe0\\xb2\\xaa\\xe0\\xb3\\x8d\\xe0\\xb2\\x9f\\xe0\\xb3\\x86\\xe0\\xb2\\x82\\xe0\\xb2\\xac\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\x85\\xe0\\xb2\\x95\\xe0\\xb3\\x8d\\xe0\\xb2\\x9f\\xe0\\xb3\\x8b\\xe0\\xb2\\xac\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\xa8\\xe0\\xb2\\xb5\\xe0\\xb3\\x86\\xe0\\xb2\\x82\\xe0\\xb2\\xac\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\xa1\\xe0\\xb2\\xbf\\xe0\\xb2\\xb8\\xe0\\xb3\\x86\\xe0\\xb2\\x82\\xe0\\xb2\\xac\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\0\"\n    \"\\xe0\\xb2\\x9c\\xe0\\xb2\\xa8.\\0\"\n    \"\\xe0\\xb2\\xab\\xe0\\xb3\\x86\\xe0\\xb2\\xac\\xe0\\xb3\\x8d\\xe0\\xb2\\xb0\\xe0\\xb3\\x81.\\0\"\n    \"\\xe0\\xb2\\xae\\xe0\\xb2\\xbe\\0\"\n    \"\\xe0\\xb2\\x8f\\xe0\\xb2\\xaa\\xe0\\xb3\\x8d\\xe0\\xb2\\xb0\\xe0\\xb2\\xbf.\\0\"\n    \"\\xe0\\xb2\\x9c\\xe0\\xb3\\x82\\0\"\n    \"\\xe0\\xb2\\x9c\\xe0\\xb3\\x81.\\0\"\n    \"\\xe0\\xb2\\x86\\xe0\\xb2\\x97.\\0\"\n    \"\\xe0\\xb2\\xb8\\xe0\\xb3\\x86\\xe0\\xb2\\xaa\\xe0\\xb3\\x8d\\xe0\\xb2\\x9f\\xe0\\xb3\\x86\\xe0\\xb2\\x82.\\0\"\n    \"\\xe0\\xb2\\x85\\xe0\\xb2\\x95\\xe0\\xb3\\x8d\\xe0\\xb2\\x9f\\xe0\\xb3\\x8b.\\0\"\n    \"\\xe0\\xb2\\xa8\\xe0\\xb2\\xb5\\xe0\\xb3\\x86\\xe0\\xb2\\x82.\\0\"\n    \"\\xe0\\xb2\\xa1\\xe0\\xb2\\xbf\\xe0\\xb2\\xb8\\xe0\\xb3\\x86\\xe0\\xb2\\x82.\\0\"\n    \"MMMM dd\\0\"\n    \"\\xe0\\xb4\\x9e\\xe0\\xb4\\xbe\\xe0\\xb4\\xaf\\xe0\\xb4\\xb1\\xe0\\xb4\\xbe\\xe0\\xb4\\xb4\\xe0\\xb5\\x8d\\xe2\\x80\\x8c\\xe0\\xb4\\x9a\\0\"\n    \"\\xe0\\xb4\\xa4\\xe0\\xb4\\xbf\\xe0\\xb4\\x99\\xe0\\xb5\\x8d\\xe0\\xb4\\x95\\xe0\\xb4\\xb3\\xe0\\xb4\\xbe\\xe0\\xb4\\xb4\\xe0\\xb5\\x8d\\xe2\\x80\\x8c\\xe0\\xb4\\x9a\\0\"\n    \"\\xe0\\xb4\\x9a\\xe0\\xb5\\x8a\\xe0\\xb4\\xb5\\xe0\\xb5\\x8d\\xe0\\xb4\\xb5\\xe0\\xb4\\xbe\\xe0\\xb4\\xb4\\xe0\\xb5\\x8d\\xe0\\xb4\\x9a\\0\"\n    \"\\xe0\\xb4\\xac\\xe0\\xb5\\x81\\xe0\\xb4\\xa7\\xe0\\xb4\\xa8\\xe0\\xb4\\xbe\\xe0\\xb4\\xb4\\xe0\\xb5\\x8d\\xe2\\x80\\x8c\\xe0\\xb4\\x9a\\0\"\n    \"\\xe0\\xb4\\xb5\\xe0\\xb5\\x8d\\xe0\\xb4\\xaf\\xe0\\xb4\\xbe\\xe0\\xb4\\xb4\\xe0\\xb4\\xbe\\xe0\\xb4\\xb4\\xe0\\xb5\\x8d\\xe2\\x80\\x8c\\xe0\\xb4\\x9a\\0\"\n    \"\\xe0\\xb4\\xb5\\xe0\\xb5\\x86\\xe0\\xb4\\xb3\\xe0\\xb5\\x8d\\xe0\\xb4\\xb3\\xe0\\xb4\\xbf\\xe0\\xb4\\xaf\\xe0\\xb4\\xbe\\xe0\\xb4\\xb4\\xe0\\xb5\\x8d\\xe2\\x80\\x8c\\xe0\\xb4\\x9a\\0\"\n    \"\\xe0\\xb4\\xb6\\xe0\\xb4\\xa8\\xe0\\xb4\\xbf\\xe0\\xb4\\xaf\\xe0\\xb4\\xbe\\xe0\\xb4\\xb4\\xe0\\xb5\\x8d\\xe2\\x80\\x8c\\xe0\\xb4\\x9a\\0\"\n    \"\\xe0\\xb4\\x9e\\xe0\\xb4\\xbe\\xe0\\xb4\\xaf\\xe0\\xb5\\xbc\\0\"\n    \"\\xe0\\xb4\\xa4\\xe0\\xb4\\xbf\\xe0\\xb4\\x99\\xe0\\xb5\\x8d\\xe0\\xb4\\x95\\xe0\\xb5\\xbe\\0\"\n    \"\\xe0\\xb4\\x9a\\xe0\\xb5\\x8a\\xe0\\xb4\\xb5\\xe0\\xb5\\x8d\\xe0\\xb4\\xb5\\0\"\n    \"\\xe0\\xb4\\xac\\xe0\\xb5\\x81\\xe0\\xb4\\xa7\\xe0\\xb5\\xbb\\0\"\n    \"\\xe0\\xb4\\xb5\\xe0\\xb5\\x8d\\xe0\\xb4\\xaf\\xe0\\xb4\\xbe\\xe0\\xb4\\xb4\\xe0\\xb4\\x82\\0\"\n    \"\\xe0\\xb4\\xb5\\xe0\\xb5\\x86\\xe0\\xb4\\xb3\\xe0\\xb5\\x8d\\xe0\\xb4\\xb3\\xe0\\xb4\\xbf\\0\"\n    \"\\xe0\\xb4\\xb6\\xe0\\xb4\\xa8\\xe0\\xb4\\xbf\\0\"\n    \"\\xe0\\xb4\\x9e\\xe0\\xb4\\xbe\\0\"\n    \"\\xe0\\xb4\\xa4\\xe0\\xb4\\xbf\\0\"\n    \"\\xe0\\xb4\\x9a\\xe0\\xb5\\x8a\\0\"\n    \"\\xe0\\xb4\\xac\\xe0\\xb5\\x81\\0\"\n    \"\\xe0\\xb4\\xb5\\xe0\\xb5\\x8d\\xe0\\xb4\\xaf\\xe0\\xb4\\xbe\\0\"\n    \"\\xe0\\xb4\\xb5\\xe0\\xb5\\x86\\0\"\n    \"\\xe0\\xb4\\xb6\\0\"\n    \"\\xe0\\xb4\\x9c\\xe0\\xb4\\xa8\\xe0\\xb5\\x81\\xe0\\xb4\\xb5\\xe0\\xb4\\xb0\\xe0\\xb4\\xbf\\0\"\n    \"\\xe0\\xb4\\xab\\xe0\\xb5\\x86\\xe0\\xb4\\xac\\xe0\\xb5\\x8d\\xe0\\xb4\\xb0\\xe0\\xb5\\x81\\xe0\\xb4\\xb5\\xe0\\xb4\\xb0\\xe0\\xb4\\xbf\\0\"\n    \"\\xe0\\xb4\\xae\\xe0\\xb4\\xbe\\xe0\\xb5\\xbc\\xe0\\xb4\\x9a\\xe0\\xb5\\x8d\\xe0\\xb4\\x9a\\xe0\\xb5\\x8d\\0\"\n    \"\\xe0\\xb4\\x8f\\xe0\\xb4\\xaa\\xe0\\xb5\\x8d\\xe0\\xb4\\xb0\\xe0\\xb4\\xbf\\xe0\\xb5\\xbd\\0\"\n    \"\\xe0\\xb4\\xae\\xe0\\xb5\\x87\\xe0\\xb4\\xaf\\xe0\\xb5\\x8d\\0\"\n    \"\\xe0\\xb4\\x9c\\xe0\\xb5\\x82\\xe0\\xb5\\xba\\0\"\n    \"\\xe0\\xb4\\x9c\\xe0\\xb5\\x82\\xe0\\xb4\\xb2\\xe0\\xb5\\x88\\0\"\n    \"\\xe0\\xb4\\x86\\xe0\\xb4\\x97\\xe0\\xb4\\xb8\\xe0\\xb5\\x8d\\xe0\\xb4\\xb1\\xe0\\xb5\\x8d\\xe0\\xb4\\xb1\\xe0\\xb5\\x8d\\0\"\n    \"\\xe0\\xb4\\xb8\\xe0\\xb5\\x86\\xe0\\xb4\\xaa\\xe0\\xb5\\x8d\\xe0\\xb4\\xb1\\xe0\\xb5\\x8d\\xe0\\xb4\\xb1\\xe0\\xb4\\x82\\xe0\\xb4\\xac\\xe0\\xb5\\xbc\\0\"\n    \"\\xe0\\xb4\\x92\\xe0\\xb4\\x95\\xe0\\xb5\\x8d\\xe2\\x80\\x8c\\xe0\\xb4\\x9f\\xe0\\xb5\\x8b\\xe0\\xb4\\xac\\xe0\\xb5\\xbc\\0\"\n    \"\\xe0\\xb4\\xa8\\xe0\\xb4\\xb5\\xe0\\xb4\\x82\\xe0\\xb4\\xac\\xe0\\xb5\\xbc\\0\"\n    \"\\xe0\\xb4\\xa1\\xe0\\xb4\\xbf\\xe0\\xb4\\xb8\\xe0\\xb4\\x82\\xe0\\xb4\\xac\\xe0\\xb5\\xbc\\0\"\n    \"\\xe0\\xb4\\x9c\\xe0\\xb4\\xa8\\xe0\\xb5\\x81\\0\"\n    \"\\xe0\\xb4\\xab\\xe0\\xb5\\x86\\xe0\\xb4\\xac\\xe0\\xb5\\x8d\\xe0\\xb4\\xb0\\xe0\\xb5\\x81\\0\"\n    \"\\xe0\\xb4\\xae\\xe0\\xb4\\xbe\\xe0\\xb5\\xbc\\0\"\n    \"\\xe0\\xb4\\x8f\\xe0\\xb4\\xaa\\xe0\\xb5\\x8d\\xe0\\xb4\\xb0\\xe0\\xb4\\xbf\\0\"\n    \"\\xe0\\xb4\\x93\\xe0\\xb4\\x97\\0\"\n    \"\\xe0\\xb4\\xb8\\xe0\\xb5\\x86\\xe0\\xb4\\xaa\\xe0\\xb5\\x8d\\xe0\\xb4\\xb1\\xe0\\xb5\\x8d\\xe0\\xb4\\xb1\\xe0\\xb4\\x82\\0\"\n    \"\\xe0\\xb4\\x92\\xe0\\xb4\\x95\\xe0\\xb5\\x8d\\xe0\\xb4\\x9f\\xe0\\xb5\\x8b\\0\"\n    \"\\xe0\\xb4\\xa8\\xe0\\xb4\\xb5\\xe0\\xb4\\x82\\0\"\n    \"\\xe0\\xb4\\xa1\\xe0\\xb4\\xbf\\xe0\\xb4\\xb8\\xe0\\xb4\\x82\\0\"\n    \"\\xe0\\xa6\\xaa\\xe0\\xa7\\x82\\xe0\\xa7\\xb0\\xe0\\xa7\\x8d\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\xb9\\xe0\\xa7\\x8d\\xe0\\xa6\\xa3\\0\"\n    \"\\xe0\\xa6\\x85\\xe0\\xa6\\xaa\\xe0\\xa7\\xb0\\xe0\\xa6\\xbe\\xe0\\xa6\\xb9\\xe0\\xa7\\x8d\\xe0\\xa6\\xa3\\0\"\n    \"\\xe0\\xa6\\xa6\\xe0\\xa7\\x87\\xe0\\xa6\\x93\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa6\\xb8\\xe0\\xa7\\x8b\\xe0\\xa6\\xae\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa6\\xae\\xe0\\xa6\\x99\\xe0\\xa7\\x8d\\xe0\\xa6\\x97\\xe0\\xa6\\xb2\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa7\\x81\\xe0\\xa6\\xa7\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa7\\x83\\xe0\\xa6\\xb9\\xe0\\xa6\\xb7\\xe0\\xa7\\x8d\\xe0\\xa6\\xaa\\xe0\\xa6\\xa4\\xe0\\xa6\\xbf\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa6\\xb6\\xe0\\xa7\\x81\\xe0\\xa6\\x95\\xe0\\xa7\\x8d\\xe0\\xa7\\xb0\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa6\\xb6\\xe0\\xa6\\xa8\\xe0\\xa6\\xbf\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa7\\xb0\\xe0\\xa6\\xac\\xe0\\xa6\\xbf\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa7\\x83\\xe0\\xa6\\xb9\\xe0\\xa6\\xb7\\xe0\\xa7\\x8d\\xe0\\xa6\\xaa\\xe0\\xa6\\xa4\\xe0\\xa6\\xbf\\0\"\n    \"\\xe0\\xa6\\xb6\\xe0\\xa7\\x81\\xe0\\xa6\\x95\\xe0\\xa7\\x8d\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa6\\x9c\\xe0\\xa6\\xbe\\xe0\\xa6\\xa8\\xe0\\xa7\\x81\\xe0\\xa7\\xb1\\xe0\\xa6\\xbe\\xe0\\xa7\\xb0\\xe0\\xa7\\x80\\0\"\n    \"\\xe0\\xa6\\xab\\xe0\\xa7\\x87\\xe0\\xa6\\xac\\xe0\\xa7\\x8d\\xe0\\xa7\\xb0\\xe0\\xa7\\x81\\xe0\\xa7\\xb1\\xe0\\xa6\\xbe\\xe0\\xa7\\xb0\\xe0\\xa7\\x80\\0\"\n    \"\\xe0\\xa6\\xae\\xe0\\xa6\\xbe\\xe0\\xa7\\xb0\\xe0\\xa7\\x8d\\xe0\\xa6\\x9a\\0\"\n    \"\\xe0\\xa6\\x8f\\xe0\\xa6\\xaa\\xe0\\xa7\\x8d\\xe0\\xa7\\xb0\\xe0\\xa6\\xbf\\xe0\\xa6\\xb2\\0\"\n    \"\\xe0\\xa6\\x86\\xe0\\xa6\\x97\\xe0\\xa6\\xb7\\xe0\\xa7\\x8d\\xe0\\xa6\\x9f\\0\"\n    \"\\xe0\\xa6\\x9b\\xe0\\xa7\\x87\\xe0\\xa6\\xaa\\xe0\\xa7\\x8d\\xe0\\xa6\\xa4\\xe0\\xa7\\x87\\xe0\\xa6\\xae\\xe0\\xa7\\x8d\\xe0\\xa6\\xac\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa6\\x85\\xe0\\xa6\\x95\\xe0\\xa7\\x8d\\xe0\\xa6\\x9f\\xe0\\xa7\\x8b\\xe0\\xa6\\xac\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa6\\xa8\\xe0\\xa7\\xb1\\xe0\\xa7\\x87\\xe0\\xa6\\xae\\xe0\\xa7\\x8d\\xe0\\xa6\\xac\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa6\\xa1\\xe0\\xa6\\xbf\\xe0\\xa6\\x9a\\xe0\\xa7\\x87\\xe0\\xa6\\xae\\xe0\\xa7\\x8d\\xe0\\xa6\\xac\\xe0\\xa7\\xb0\\0\"\n    \"\\xe0\\xa6\\x9c\\xe0\\xa6\\xbe\\xe0\\xa6\\xa8\\xe0\\xa7\\x81\\0\"\n    \"\\xe0\\xa6\\xab\\xe0\\xa7\\x87\\xe0\\xa6\\xac\\xe0\\xa7\\x8d\\xe0\\xa7\\xb0\\xe0\\xa7\\x81\\0\"\n    \"\\xe0\\xa6\\x86\\xe0\\xa6\\x97\\0\"\n    \"\\xe0\\xa6\\xb8\\xe0\\xa7\\x87\\xe0\\xa6\\xaa\\xe0\\xa7\\x8d\\xe0\\xa6\\x9f\\0\"\n    \"\\xe0\\xa6\\x85\\xe0\\xa6\\x95\\xe0\\xa7\\x8d\\xe0\\xa6\\x9f\\xe0\\xa7\\x8b\\0\"\n    \"\\xe0\\xa6\\xa8\\xe0\\xa6\\xad\\xe0\\xa7\\x87\\0\"\n    \"\\xe0\\xa6\\xa1\\xe0\\xa6\\xbf\\xe0\\xa6\\xb8\\xe0\\xa7\\x87\\0\"\n    \"yyyy,MMMM dd, dddd\\0\"\n    \"MMMM,yy\\0\"\n    \"MMMM,yyyy\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x82\\xe0\\xa4\\x97\\xe0\\xa4\\xb3\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x82\\xe0\\xa4\\x97\\xe0\\xa4\\xb3\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa4\\xbe\\xe0\\xa4\\xa8\\xe0\\xa5\\x87\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa5\\x80\\0\"\n    \"\\xe0\\xa4\\xab\\xe0\\xa5\\x87\\xe0\\xa4\\xac\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa5\\x81\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa5\\x80\\0\"\n    \"\\xe0\\xa4\\x8f\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa4\\xbf\\xe0\\xa4\\xb2\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa5\\x87\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa5\\x81\\xe0\\xa4\\xb2\\xe0\\xa5\\x88\\0\"\n    \"\\xe0\\xa4\\x91\\xe0\\xa4\\x97\\xe0\\xa4\\xb8\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x87\\xe0\\xa4\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x91\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x8b\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa5\\x8b\\xe0\\xa4\\xb5\\xe0\\xa5\\x8d\\xe0\\xa4\\xb9\\xe0\\xa5\\x87\\xe0\\xa4\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xa1\\xe0\\xa4\\xbf\\xe0\\xa4\\xb8\\xe0\\xa5\\x87\\xe0\\xa4\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa4\\xbe\\xe0\\xa4\\xa8\\xe0\\xa5\\x87\\0\"\n    \"\\xe0\\xa4\\xab\\xe0\\xa5\\x87\\xe0\\xa4\\xac\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa5\\x81\\0\"\n    \"\\xe0\\xa4\\x8f\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa4\\xbf\\0\"\n    \"\\xe0\\xa4\\x91\\xe0\\xa4\\x97\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x87\\xe0\\xa4\\x82\\0\"\n    \"\\xe0\\xa4\\x91\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x8b\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa5\\x8b\\xe0\\xa4\\xb5\\xe0\\xa5\\x8d\\xe0\\xa4\\xb9\\xe0\\xa5\\x87\\xe0\\xa4\\x82\\0\"\n    \"\\xe0\\xa4\\xa1\\xe0\\xa4\\xbf\\xe0\\xa4\\xb8\\xe0\\xa5\\x87\\xe0\\xa4\\x82\\0\"\n    \"\\xd2\\xae\\xd3\\xa8\\0\"\n    \"\\xd2\\xae\\xd0\\xa5\\0\"\n    \"\\xd0\\xbd\\xd1\\x8f\\xd0\\xbc\\0\"\n    \"\\xd0\\xb4\\xd0\\xb0\\xd0\\xb2\\xd0\\xb0\\xd0\\xb0\\0\"\n    \"\\xd0\\xbc\\xd1\\x8f\\xd0\\xb3\\xd0\\xbc\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xbb\\xd1\\x85\\xd0\\xb0\\xd0\\xb3\\xd0\\xb2\\xd0\\xb0\\0\"\n    \"\\xd0\\xbf\\xd2\\xaf\\xd1\\x80\\xd1\\x8d\\xd0\\xb2\\0\"\n    \"\\xd0\\xb1\\xd0\\xb0\\xd0\\xb0\\xd1\\x81\\xd0\\xb0\\xd0\\xbd\\0\"\n    \"\\xd0\\xb1\\xd1\\x8f\\xd0\\xbc\\xd0\\xb1\\xd0\\xb0\\0\"\n    \"\\xd0\\x9d\\xd1\\x8f\\0\"\n    \"\\xd0\\x94\\xd0\\xb0\\0\"\n    \"\\xd0\\x9c\\xd1\\x8f\\0\"\n    \"\\xd0\\x9b\\xd1\\x85\\0\"\n    \"\\xd0\\x9f\\xd2\\xaf\\0\"\n    \"\\xd0\\x91\\xd0\\xb0\\0\"\n    \"\\xd0\\x91\\xd1\\x8f\\0\"\n    \"\\xd0\\x9d\\xd1\\x8d\\xd0\\xb3\\xd0\\xb4\\xd2\\xaf\\xd0\\xb3\\xd1\\x8d\\xd1\\x8d\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xa5\\xd0\\xbe\\xd1\\x91\\xd1\\x80\\xd0\\xb4\\xd1\\x83\\xd0\\xb3\\xd0\\xb0\\xd0\\xb0\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x93\\xd1\\x83\\xd1\\x80\\xd0\\xb0\\xd0\\xb2\\xd0\\xb4\\xd1\\x83\\xd0\\xb3\\xd0\\xb0\\xd0\\xb0\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x94\\xd3\\xa9\\xd1\\x80\\xd3\\xa9\\xd0\\xb2\\xd0\\xb4\\xd2\\xaf\\xd0\\xb3\\xd1\\x8d\\xd1\\x8d\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xa2\\xd0\\xb0\\xd0\\xb2\\xd0\\xb4\\xd1\\x83\\xd0\\xb3\\xd0\\xb0\\xd0\\xb0\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x97\\xd1\\x83\\xd1\\x80\\xd0\\xb3\\xd0\\xb0\\xd0\\xb4\\xd1\\x83\\xd0\\xb3\\xd0\\xb0\\xd0\\xb0\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x94\\xd0\\xbe\\xd0\\xbb\\xd0\\xb4\\xd1\\x83\\xd0\\xb3\\xd0\\xb0\\xd0\\xb0\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x9d\\xd0\\xb0\\xd0\\xb9\\xd0\\xbc\\xd0\\xb4\\xd1\\x83\\xd0\\xb3\\xd0\\xb0\\xd0\\xb0\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x95\\xd1\\x81\\xd0\\xb4\\xd2\\xaf\\xd0\\xb3\\xd1\\x8d\\xd1\\x8d\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x90\\xd1\\x80\\xd0\\xb0\\xd0\\xb2\\xd0\\xb4\\xd1\\x83\\xd0\\xb3\\xd0\\xb0\\xd0\\xb0\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x90\\xd1\\x80\\xd0\\xb2\\xd0\\xb0\\xd0\\xbd \\xd0\\xbd\\xd1\\x8d\\xd0\\xb3\\xd0\\xb4\\xd2\\xaf\\xd0\\xb3\\xd1\\x8d\\xd1\\x8d\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x90\\xd1\\x80\\xd0\\xb2\\xd0\\xb0\\xd0\\xbd \\xd1\\x85\\xd0\\xbe\\xd1\\x91\\xd1\\x80\\xd0\\xb4\\xd1\\x83\\xd0\\xb3\\xd0\\xb0\\xd0\\xb0\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"1-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"2-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"3-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"4-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"5-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"6-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"7-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"8-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"9-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"10-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"11-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"12-\\xd1\\x80 \\xd1\\x81\\xd0\\xb0\\xd1\\x80\\0\"\n    \"dddd, yyyy '\\xd0\\xbe\\xd0\\xbd\\xd1\\x8b' MM '\\xd1\\x81\\xd0\\xb0\\xd1\\x80\\xd1\\x8b\\xd0\\xbd' d\\0\"\n    \"yyyy '\\xd0\\xbe\\xd0\\xbd\\xd1\\x8b' MM '\\xd1\\x81\\xd0\\xb0\\xd1\\x80\\xd1\\x8b\\xd0\\xbd' d\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8bM\\xe0\\xbd\\x9a\\xe0\\xbd\\xba\\xe0\\xbd\\xa6\\xe0\\xbc\\x8b\\x64\\0\"\n    \"\\xe0\\xbd\\xa6\\xe0\\xbe\\x94\\xe0\\xbc\\x8b\\xe0\\xbd\\x91\\xe0\\xbe\\xb2\\xe0\\xbd\\xbc\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x95\\xe0\\xbe\\xb1\\xe0\\xbd\\xb2\\xe0\\xbc\\x8b\\xe0\\xbd\\x91\\xe0\\xbe\\xb2\\xe0\\xbd\\xbc\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x82\\xe0\\xbd\\x9f\\xe0\\xbd\\xa0\\xe0\\xbc\\x8b\\xe0\\xbd\\x89\\xe0\\xbd\\xb2\\xe0\\xbc\\x8b\\xe0\\xbd\\x98\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x82\\xe0\\xbd\\x9f\\xe0\\xbd\\xa0\\xe0\\xbc\\x8b\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x82\\xe0\\xbd\\x9f\\xe0\\xbd\\xa0\\xe0\\xbc\\x8b\\xe0\\xbd\\x98\\xe0\\xbd\\xb2\\xe0\\xbd\\x82\\xe0\\xbc\\x8b\\xe0\\xbd\\x91\\xe0\\xbd\\x98\\xe0\\xbd\\xa2\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x82\\xe0\\xbd\\x9f\\xe0\\xbd\\xa0\\xe0\\xbc\\x8b\\xe0\\xbd\\xa7\\xe0\\xbe\\xb3\\xe0\\xbd\\x82\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x82\\xe0\\xbd\\x9f\\xe0\\xbd\\xa0\\xe0\\xbc\\x8b\\xe0\\xbd\\x95\\xe0\\xbd\\xb4\\xe0\\xbd\\xa2\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbd\\xb4\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x82\\xe0\\xbd\\x9f\\xe0\\xbd\\xa0\\xe0\\xbc\\x8b\\xe0\\xbd\\xa6\\xe0\\xbd\\x84\\xe0\\xbd\\xa6\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x82\\xe0\\xbd\\x9f\\xe0\\xbd\\xa0\\xe0\\xbc\\x8b\\xe0\\xbd\\xa6\\xe0\\xbe\\xa4\\xe0\\xbd\\xba\\xe0\\xbd\\x93\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x89\\xe0\\xbd\\xb2\\xe0\\xbc\\x8b\\xe0\\xbd\\x98\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x98\\xe0\\xbd\\xb2\\xe0\\xbd\\x82\\xe0\\xbc\\x8b\\xe0\\xbd\\x91\\xe0\\xbd\\x98\\xe0\\xbd\\xa2\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\xa7\\xe0\\xbe\\xb3\\xe0\\xbd\\x82\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x95\\xe0\\xbd\\xb4\\xe0\\xbd\\xa2\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbd\\xb4\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\xa6\\xe0\\xbd\\x84\\xe0\\xbd\\xa6\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\xa6\\xe0\\xbe\\xa4\\xe0\\xbd\\xba\\xe0\\xbd\\x93\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x89\\xe0\\xbd\\xb2\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\0\"\n    \"\\xe0\\xbd\\x98\\xe0\\xbd\\xb2\\0\"\n    \"\\xe0\\xbd\\xa7\\xe0\\xbe\\xb3\\0\"\n    \"\\xe0\\xbd\\x95\\xe0\\xbd\\xb4\\0\"\n    \"\\xe0\\xbd\\xa6\\0\"\n    \"\\xe0\\xbd\\xa6\\xe0\\xbe\\xa4\\xe0\\xbd\\xba\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\x91\\xe0\\xbd\\x84\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbd\\xbc\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\x82\\xe0\\xbd\\x89\\xe0\\xbd\\xb2\\xe0\\xbd\\xa6\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\xa6\\xe0\\xbd\\xb4\\xe0\\xbd\\x98\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbd\\x9e\\xe0\\xbd\\xb2\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\xa3\\xe0\\xbe\\x94\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\x91\\xe0\\xbe\\xb2\\xe0\\xbd\\xb4\\xe0\\xbd\\x82\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbd\\x91\\xe0\\xbd\\xb4\\xe0\\xbd\\x93\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbd\\xa2\\xe0\\xbe\\x92\\xe0\\xbe\\xb1\\xe0\\xbd\\x91\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\x91\\xe0\\xbd\\x82\\xe0\\xbd\\xb4\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbd\\x85\\xe0\\xbd\\xb4\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbd\\x85\\xe0\\xbd\\xb4\\xe0\\xbc\\x8b\\xe0\\xbd\\x82\\xe0\\xbd\\x85\\xe0\\xbd\\xb2\\xe0\\xbd\\x82\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbc\\x8b\\xe0\\xbd\\x96\\xe0\\xbd\\x85\\xe0\\xbd\\xb4\\xe0\\xbc\\x8b\\xe0\\xbd\\x82\\xe0\\xbd\\x89\\xe0\\xbd\\xb2\\xe0\\xbd\\xa6\\xe0\\xbc\\x8b\\xe0\\xbd\\x94\\xe0\\xbc\\x8b\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa1\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa2\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa3\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa4\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa5\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa6\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa7\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa8\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa9\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa1\\xe0\\xbc\\xa0\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa1\\xe0\\xbc\\xa1\\0\"\n    \"\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b\\xe0\\xbc\\xa1\\xe0\\xbc\\xa2\\0\"\n    \"yyyy'\\xe0\\xbd\\xa3\\xe0\\xbd\\xbc\\xe0\\xbd\\xa0\\xe0\\xbd\\xb2\\xe0\\xbc\\x8b\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3' M'\\xe0\\xbd\\x9a\\xe0\\xbd\\xba\\xe0\\xbd\\xa6' d\\0\"\n    \"yyyy'\\xe0\\xbd\\xa3\\xe0\\xbd\\xbc\\xe0\\xbd\\xa0\\xe0\\xbd\\xb2\\xe0\\xbc\\x8b\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3' M'\\xe0\\xbd\\x9a\\xe0\\xbd\\xba\\xe0\\xbd\\xa6' d dddd\\0\"\n    \"yyyy\\xe0\\xbd\\xa3\\xe0\\xbd\\xbc\\xe0\\xbd\\xa0\\xe0\\xbd\\xb2\\xe0\\xbc\\x8b\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3 MMM d\\0\"\n    \"yyyy\\xe0\\xbd\\xa3\\xe0\\xbd\\xbc\\xe0\\xbd\\xa0\\xe0\\xbd\\xb2\\xe0\\xbc\\x8b\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3 MMM d dddd\\0\"\n    \"yyyy'\\xe0\\xbd\\xa3\\xe0\\xbd\\xbc\\xe0\\xbd\\xa0\\xe0\\xbd\\xb2\\xe0\\xbc\\x8b\\xe0\\xbd\\x9f\\xe0\\xbe\\xb3\\xe0\\xbc\\x8b' M\\0\"\n    \"Dydd Sul\\0\"\n    \"Dydd Llun\\0\"\n    \"Dydd Mawrth\\0\"\n    \"Dydd Mercher\\0\"\n    \"Dydd Iau\\0\"\n    \"Dydd Gwener\\0\"\n    \"Dydd Sadwrn\\0\"\n    \"Sul\\0\"\n    \"Llun\\0\"\n    \"Maw\\0\"\n    \"Mer\\0\"\n    \"Iau\\0\"\n    \"Gwe\\0\"\n    \"Sad\\0\"\n    \"Ll\\0\"\n    \"Ionawr\\0\"\n    \"Chwefror\\0\"\n    \"Mawrth\\0\"\n    \"Ebrill\\0\"\n    \"Mehefin\\0\"\n    \"Gorffennaf\\0\"\n    \"Awst\\0\"\n    \"Medi\\0\"\n    \"Hydref\\0\"\n    \"Tachwedd\\0\"\n    \"Rhagfyr\\0\"\n    \"Ion\\0\"\n    \"Chw\\0\"\n    \"Ebr\\0\"\n    \"Meh\\0\"\n    \"Gor\\0\"\n    \"Hyd\\0\"\n    \"Tach\\0\"\n    \"Rhag\\0\"\n    \"\\xe1\\x9e\\x96\\xe1\\x9f\\x92\\xe1\\x9e\\x9a\\xe1\\x9e\\xb9\\xe1\\x9e\\x80\\0\"\n    \"\\xe1\\x9e\\x9b\\xe1\\x9f\\x92\\xe1\\x9e\\x84\\xe1\\x9e\\xb6\\xe1\\x9e\\x85\\0\"\n    \"\\xe1\\x9e\\xa2\\xe1\\x9e\\xb6\\xe1\\x9e\\x91\\xe1\\x9e\\xb7\\xe1\\x9e\\x8f\\xe1\\x9f\\x92\\xe1\\x9e\\x99\\0\"\n    \"\\xe1\\x9e\\x85\\xe1\\x9e\\x93\\xe1\\x9f\\x92\\xe1\\x9e\\x91\\0\"\n    \"\\xe1\\x9e\\xa2\\xe1\\x9e\\x84\\xe1\\x9f\\x92\\xe1\\x9e\\x82\\xe1\\x9e\\xb6\\xe1\\x9e\\x9a\\0\"\n    \"\\xe1\\x9e\\x96\\xe1\\x9e\\xbb\\xe1\\x9e\\x92\\0\"\n    \"\\xe1\\x9e\\x96\\xe1\\x9f\\x92\\xe1\\x9e\\x9a\\xe1\\x9e\\xa0\\xe1\\x9e\\x9f\\xe1\\x9f\\x92\\xe1\\x9e\\x94\\xe1\\x9e\\x8f\\xe1\\x9e\\xb7\\xe1\\x9f\\x8d\\0\"\n    \"\\xe1\\x9e\\x9f\\xe1\\x9e\\xbb\\xe1\\x9e\\x80\\xe1\\x9f\\x92\\xe1\\x9e\\x9a\\0\"\n    \"\\xe1\\x9e\\x9f\\xe1\\x9f\\x85\\xe1\\x9e\\x9a\\xe1\\x9f\\x8d\\0\"\n    \"\\xe1\\x9e\\x98\\xe1\\x9e\\x80\\xe1\\x9e\\x9a\\xe1\\x9e\\xb6\\0\"\n    \"\\xe1\\x9e\\x80\\xe1\\x9e\\xbb\\xe1\\x9e\\x98\\xe1\\x9f\\x92\\xe1\\x9e\\x97\\xe1\\x9f\\x88\\0\"\n    \"\\xe1\\x9e\\x98\\xe1\\x9e\\xb8\\xe1\\x9e\\x93\\xe1\\x9e\\xb6\\0\"\n    \"\\xe1\\x9e\\x98\\xe1\\x9f\\x81\\xe1\\x9e\\x9f\\xe1\\x9e\\xb6\\0\"\n    \"\\xe1\\x9e\\xa7\\xe1\\x9e\\x9f\\xe1\\x9e\\x97\\xe1\\x9e\\xb6\\0\"\n    \"\\xe1\\x9e\\x98\\xe1\\x9e\\xb7\\xe1\\x9e\\x90\\xe1\\x9e\\xbb\\xe1\\x9e\\x93\\xe1\\x9e\\xb6\\0\"\n    \"\\xe1\\x9e\\x80\\xe1\\x9e\\x80\\xe1\\x9f\\x92\\xe1\\x9e\\x80\\xe1\\x9e\\x8a\\xe1\\x9e\\xb6\\0\"\n    \"\\xe1\\x9e\\x9f\\xe1\\x9e\\xb8\\xe1\\x9e\\xa0\\xe1\\x9e\\xb6\\0\"\n    \"\\xe1\\x9e\\x80\\xe1\\x9e\\x89\\xe1\\x9f\\x92\\xe1\\x9e\\x89\\xe1\\x9e\\xb6\\0\"\n    \"\\xe1\\x9e\\x8f\\xe1\\x9e\\xbb\\xe1\\x9e\\x9b\\xe1\\x9e\\xb6\\0\"\n    \"\\xe1\\x9e\\x9c\\xe1\\x9e\\xb7\\xe1\\x9e\\x85\\xe1\\x9f\\x92\\xe1\\x9e\\x86\\xe1\\x9e\\xb7\\xe1\\x9e\\x80\\xe1\\x9e\\xb6\\0\"\n    \"\\xe1\\x9e\\x92\\xe1\\x9f\\x92\\xe1\\x9e\\x93\\xe1\\x9e\\xbc\\0\"\n    \"'\\xe1\\x9e\\x81\\xe1\\x9f\\x82' MM '\\xe1\\x9e\\x86\\xe1\\x9f\\x92\\xe1\\x9e\\x93\\xe1\\x9e\\xb6\\xe1\\x9f\\x86' yyyy\\0\"\n    \"\\xe0\\xba\\x81\\xe0\\xbb\\x88\\xe0\\xba\\xad\\xe0\\xba\\x99\\xe0\\xba\\x97\\xe0\\xbb\\x88\\xe0\\xba\\xbd\\xe0\\xba\\x87\\0\"\n    \"\\xe0\\xba\\xab\\xe0\\xba\\xbc\\xe0\\xba\\xb1\\xe0\\xba\\x87\\xe0\\xba\\x97\\xe0\\xbb\\x88\\xe0\\xba\\xbd\\xe0\\xba\\x87\\0\"\n    \"\\xe0\\xba\\xa7\\xe0\\xba\\xb1\\xe0\\xba\\x99\\xe0\\xba\\xad\\xe0\\xba\\xb2\\xe0\\xba\\x97\\xe0\\xba\\xb4\\xe0\\xba\\x94\\0\"\n    \"\\xe0\\xba\\xa7\\xe0\\xba\\xb1\\xe0\\xba\\x99\\xe0\\xba\\x88\\xe0\\xba\\xb1\\xe0\\xba\\x99\\0\"\n    \"\\xe0\\xba\\xa7\\xe0\\xba\\xb1\\xe0\\xba\\x99\\xe0\\xba\\xad\\xe0\\xba\\xb1\\xe0\\xba\\x87\\xe0\\xba\\x84\\xe0\\xba\\xb2\\xe0\\xba\\x99\\0\"\n    \"\\xe0\\xba\\xa7\\xe0\\xba\\xb1\\xe0\\xba\\x99\\xe0\\xba\\x9e\\xe0\\xba\\xb8\\xe0\\xba\\x94\\0\"\n    \"\\xe0\\xba\\xa7\\xe0\\xba\\xb1\\xe0\\xba\\x99\\xe0\\xba\\x9e\\xe0\\xba\\xb0\\xe0\\xba\\xab\\xe0\\xba\\xb1\\xe0\\xba\\x94\\0\"\n    \"\\xe0\\xba\\xa7\\xe0\\xba\\xb1\\xe0\\xba\\x99\\xe0\\xba\\xaa\\xe0\\xba\\xb8\\xe0\\xba\\x81\\0\"\n    \"\\xe0\\xba\\xa7\\xe0\\xba\\xb1\\xe0\\xba\\x99\\xe0\\xbb\\x80\\xe0\\xba\\xaa\\xe0\\xba\\xbb\\xe0\\xba\\xb2\\0\"\n    \"\\xe0\\xba\\x97\\0\"\n    \"\\xe0\\xba\\x88\\0\"\n    \"\\xe0\\xba\\x84\\0\"\n    \"\\xe2\\x80\\x8b\\xe0\\xba\\x9e\\xe0\\xba\\xb8\\0\"\n    \"\\xe0\\xba\\x9e\\0\"\n    \"\\xe2\\x80\\x8b\\xe0\\xba\\xaa\\xe0\\xba\\xb8\\0\"\n    \"\\xe0\\xba\\xaa\\0\"\n    \"\\xe0\\xba\\xa1\\xe0\\xba\\xb1\\xe0\\xba\\x87\\xe0\\xba\\x81\\xe0\\xba\\xad\\xe0\\xba\\x99\\0\"\n    \"\\xe0\\xba\\x81\\xe0\\xba\\xb8\\xe0\\xba\\xa1\\xe0\\xba\\x9e\\xe0\\xba\\xb2\\0\"\n    \"\\xe0\\xba\\xa1\\xe0\\xba\\xb5\\xe0\\xba\\x99\\xe0\\xba\\xb2\\0\"\n    \"\\xe0\\xbb\\x80\\xe0\\xba\\xa1\\xe0\\xba\\xaa\\xe0\\xba\\xb2\\0\"\n    \"\\xe0\\xba\\x9e\\xe0\\xba\\xb6\\xe0\\xba\\x94\\xe0\\xba\\xaa\\xe0\\xba\\xb0\\xe0\\xba\\x9e\\xe0\\xba\\xb2\\0\"\n    \"\\xe0\\xba\\xa1\\xe0\\xba\\xb4\\xe0\\xba\\x96\\xe0\\xba\\xb8\\xe0\\xba\\x99\\xe0\\xba\\xb2\\0\"\n    \"\\xe0\\xba\\x81\\xe0\\xbb\\x8d\\xe0\\xba\\xa5\\xe0\\xba\\xb0\\xe0\\xba\\x81\\xe0\\xba\\xbb\\xe0\\xba\\x94\\0\"\n    \"\\xe0\\xba\\xaa\\xe0\\xba\\xb4\\xe0\\xba\\x87\\xe0\\xba\\xab\\xe0\\xba\\xb2\\0\"\n    \"\\xe0\\xba\\x81\\xe0\\xba\\xb1\\xe0\\xba\\x99\\xe0\\xba\\x8d\\xe0\\xba\\xb2\\0\"\n    \"\\xe0\\xba\\x95\\xe0\\xba\\xb8\\xe0\\xba\\xa5\\xe0\\xba\\xb2\\0\"\n    \"\\xe0\\xba\\x9e\\xe0\\xba\\xb0\\xe0\\xba\\x88\\xe0\\xba\\xb4\\xe0\\xba\\x81\\0\"\n    \"\\xe0\\xba\\x97\\xe0\\xba\\xb1\\xe0\\xba\\x99\\xe0\\xba\\xa7\\xe0\\xba\\xb2\\0\"\n    \"\\xe0\\xba\\xa1.\\xe0\\xba\\x81.\\0\"\n    \"\\xe0\\xba\\x81.\\xe0\\xba\\x9e.\\0\"\n    \"\\xe0\\xba\\xa1.\\xe0\\xba\\x99.\\0\"\n    \"\\xe0\\xba\\xa1.\\xe0\\xba\\xaa.\\0\"\n    \"\\xe0\\xba\\x9e.\\xe0\\xba\\x9e.\\0\"\n    \"\\xe0\\xba\\xa1\\xe0\\xba\\xb4.\\xe0\\xba\\x96.\\0\"\n    \"\\xe0\\xba\\x81.\\xe0\\xba\\xa5.\\0\"\n    \"\\xe0\\xba\\xaa.\\xe0\\xba\\xab.\\0\"\n    \"\\xe0\\xba\\x81.\\xe0\\xba\\x8d.\\0\"\n    \"\\xe0\\xba\\x95.\\xe0\\xba\\xa5.\\0\"\n    \"\\xe0\\xba\\x9e.\\xe0\\xba\\x88.\\0\"\n    \"\\xe0\\xba\\x97.\\xe0\\xba\\xa7.\\0\"\n    \"dddd \\xe0\\xba\\x97\\xe0\\xba\\xb5 d MMMM gg yyyy\\0\"\n    \"luns\\0\"\n    \"m\\xc3\\xa9rcores\\0\"\n    \"xoves\\0\"\n    \"venres\\0\"\n    \"Dom\\0\"\n    \"M\\xc3\\xa9r\\0\"\n    \"Xov\\0\"\n    \"Ven\\0\"\n    \"S\\xc3\\xa1\\x62\\0\"\n    \"X\\0\"\n    \"Xaneiro\\0\"\n    \"Febreiro\\0\"\n    \"Maio\\0\"\n    \"Xu\\xc3\\xb1o\\0\"\n    \"Xullo\\0\"\n    \"Setembro\\0\"\n    \"Outubro\\0\"\n    \"Novembro\\0\"\n    \"Decembro\\0\"\n    \"xaneiro\\0\"\n    \"febreiro\\0\"\n    \"xu\\xc3\\xb1o\\0\"\n    \"xullo\\0\"\n    \"decembro\\0\"\n    \"Xan\\0\"\n    \"Abr\\0\"\n    \"Xu\\xc3\\xb1\\0\"\n    \"Xul\\0\"\n    \"Out\\0\"\n    \"\\xe0\\xa4\\xae.\\xe0\\xa4\\xaa\\xe0\\xa5\\x82.\\0\"\n    \"\\xe0\\xa4\\xae.\\xe0\\xa4\\xa8\\xe0\\xa4\\x82.\\0\"\n    \"\\xe0\\xa4\\x86\\xe0\\xa4\\xa6\\xe0\\xa4\\xbf\\xe0\\xa4\\xa4\\xe0\\xa5\\x8d\\xe0\\xa4\\xaf\\xe0\\xa4\\xb5\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x82\\xe0\\xa4\\x97\\xe0\\xa4\\xb3\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x93\\xe0\\xa4\\x97\\xe0\\xa4\\xb8\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa5\\x87\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x87\\xe0\\xa4\\x82\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x93\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x8b\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xb6\\xb4\\xe0\\xb7\\x99.\\xe0\\xb7\\x80.\\0\"\n    \"\\xe0\\xb6\\xb4.\\xe0\\xb7\\x80.\\0\"\n    \"\\xe0\\xb6\\x89\\xe0\\xb6\\xbb\\xe0\\xb7\\x92\\xe0\\xb6\\xaf\\xe0\\xb7\\x8f\\0\"\n    \"\\xe0\\xb7\\x83\\xe0\\xb6\\xb3\\xe0\\xb7\\x94\\xe0\\xb6\\xaf\\xe0\\xb7\\x8f\\0\"\n    \"\\xe0\\xb6\\x85\\xe0\\xb6\\x9f\\xe0\\xb7\\x84\\xe0\\xb6\\xbb\\xe0\\xb7\\x94\\xe0\\xb7\\x80\\xe0\\xb7\\x8f\\xe0\\xb6\\xaf\\xe0\\xb7\\x8f\\0\"\n    \"\\xe0\\xb6\\xb6\\xe0\\xb6\\xaf\\xe0\\xb7\\x8f\\xe0\\xb6\\xaf\\xe0\\xb7\\x8f\\0\"\n    \"\\xe0\\xb6\\xb6\\xe0\\xb7\\x8a\\xe2\\x80\\x8d\\xe0\\xb6\\xbb\\xe0\\xb7\\x84\\xe0\\xb7\\x83\\xe0\\xb7\\x8a\\xe0\\xb6\\xb4\\xe0\\xb6\\xad\\xe0\\xb7\\x92\\xe0\\xb6\\xb1\\xe0\\xb7\\x8a\\xe0\\xb6\\xaf\\xe0\\xb7\\x8f\\0\"\n    \"\\xe0\\xb7\\x83\\xe0\\xb7\\x92\\xe0\\xb6\\x9a\\xe0\\xb7\\x94\\xe0\\xb6\\xbb\\xe0\\xb7\\x8f\\xe0\\xb6\\xaf\\xe0\\xb7\\x8f\\0\"\n    \"\\xe0\\xb7\\x83\\xe0\\xb7\\x99\\xe0\\xb6\\xb1\\xe0\\xb7\\x83\\xe0\\xb7\\x94\\xe0\\xb6\\xbb\\xe0\\xb7\\x8f\\xe0\\xb6\\xaf\\xe0\\xb7\\x8f\\0\"\n    \"\\xe0\\xb6\\x85\\xe0\\xb6\\x9f\\xe0\\xb7\\x84\\0\"\n    \"\\xe0\\xb6\\xb6\\xe0\\xb7\\x8a\\xe2\\x80\\x8d\\xe0\\xb6\\xbb\\xe0\\xb7\\x84\\xe0\\xb7\\x83\\xe0\\xb7\\x8a\\0\"\n    \"\\xe0\\xb7\\x83\\xe0\\xb7\\x92\\xe0\\xb6\\x9a\\xe0\\xb7\\x94\\0\"\n    \"\\xe0\\xb7\\x83\\xe0\\xb7\\x99\\xe0\\xb6\\xb1\\0\"\n    \"\\xe0\\xb6\\x89\\0\"\n    \"\\xe0\\xb7\\x83\\0\"\n    \"\\xe0\\xb6\\x85\\0\"\n    \"\\xe0\\xb6\\xb6\\0\"\n    \"\\xe0\\xb6\\xb6\\xe0\\xb7\\x8a\\xe2\\x80\\x8d\\xe0\\xb6\\xbb\\0\"\n    \"\\xe0\\xb7\\x83\\xe0\\xb7\\x92\\0\"\n    \"\\xe0\\xb7\\x83\\xe0\\xb7\\x99\\0\"\n    \"\\xe0\\xb6\\xa2\\xe0\\xb6\\xb1\\xe0\\xb7\\x80\\xe0\\xb7\\x8f\\xe0\\xb6\\xbb\\xe0\\xb7\\x92\\0\"\n    \"\\xe0\\xb6\\xb4\\xe0\\xb7\\x99\\xe0\\xb6\\xb6\\xe0\\xb6\\xbb\\xe0\\xb7\\x80\\xe0\\xb7\\x8f\\xe0\\xb6\\xbb\\xe0\\xb7\\x92\\0\"\n    \"\\xe0\\xb6\\xb8\\xe0\\xb7\\x8f\\xe0\\xb6\\xbb\\xe0\\xb7\\x8a\\xe0\\xb6\\xad\\xe0\\xb7\\x94\\0\"\n    \"\\xe0\\xb6\\x85\\xe0\\xb6\\xb4\\xe0\\xb7\\x8a\\xe2\\x80\\x8d\\xe0\\xb6\\xbb\\xe0\\xb7\\x9a\\xe0\\xb6\\xbd\\xe0\\xb7\\x8a\\0\"\n    \"\\xe0\\xb6\\xb8\\xe0\\xb7\\x90\\xe0\\xb6\\xba\\xe0\\xb7\\x92\\0\"\n    \"\\xe0\\xb6\\xa2\\xe0\\xb7\\x96\\xe0\\xb6\\xb1\\xe0\\xb7\\x92\\0\"\n    \"\\xe0\\xb6\\xa2\\xe0\\xb7\\x96\\xe0\\xb6\\xbd\\xe0\\xb7\\x92\\0\"\n    \"\\xe0\\xb6\\x85\\xe0\\xb6\\x9c\\xe0\\xb7\\x9d\\xe0\\xb7\\x83\\xe0\\xb7\\x8a\\xe0\\xb6\\xad\\xe0\\xb7\\x94\\0\"\n    \"\\xe0\\xb7\\x83\\xe0\\xb7\\x90\\xe0\\xb6\\xb4\\xe0\\xb7\\x8a\\xe0\\xb6\\xad\\xe0\\xb7\\x90\\xe0\\xb6\\xb8\\xe0\\xb7\\x8a\\xe0\\xb6\\xb6\\xe0\\xb6\\xbb\\xe0\\xb7\\x8a\\0\"\n    \"\\xe0\\xb6\\x94\\xe0\\xb6\\x9a\\xe0\\xb7\\x8a\\xe0\\xb6\\xad\\xe0\\xb7\\x9d\\xe0\\xb6\\xb6\\xe0\\xb6\\xbb\\xe0\\xb7\\x8a\\0\"\n    \"\\xe0\\xb6\\xb1\\xe0\\xb7\\x9c\\xe0\\xb7\\x80\\xe0\\xb7\\x90\\xe0\\xb6\\xb8\\xe0\\xb7\\x8a\\xe0\\xb6\\xb6\\xe0\\xb6\\xbb\\xe0\\xb7\\x8a\\0\"\n    \"\\xe0\\xb6\\xaf\\xe0\\xb7\\x99\\xe0\\xb7\\x83\\xe0\\xb7\\x90\\xe0\\xb6\\xb8\\xe0\\xb7\\x8a\\xe0\\xb6\\xb6\\xe0\\xb6\\xbb\\xe0\\xb7\\x8a\\0\"\n    \"\\xe0\\xb6\\xa2\\xe0\\xb6\\xb1\\0\"\n    \"\\xe0\\xb6\\xb4\\xe0\\xb7\\x99\\xe0\\xb6\\xb6\\0\"\n    \"\\xe0\\xb6\\xb8\\xe0\\xb7\\x8f\\xe0\\xb6\\xbb\\xe0\\xb7\\x8a\\0\"\n    \"\\xe0\\xb6\\x85\\xe0\\xb6\\x9c\\xe0\\xb7\\x9d\\0\"\n    \"\\xe0\\xb7\\x83\\xe0\\xb7\\x90\\xe0\\xb6\\xb4\\xe0\\xb7\\x8a\\0\"\n    \"\\xe0\\xb6\\x94\\xe0\\xb6\\x9a\\xe0\\xb7\\x8a\\0\"\n    \"\\xe0\\xb6\\xb1\\xe0\\xb7\\x9c\\xe0\\xb7\\x80\\xe0\\xb7\\x90\\0\"\n    \"\\xe0\\xb6\\xaf\\xe0\\xb7\\x99\\xe0\\xb7\\x83\\xe0\\xb7\\x90\\0\"\n    \"\\xe1\\x8c\\xa5\\xe1\\x8b\\x8b\\xe1\\x89\\xb5\\0\"\n    \"\\xe1\\x8a\\xa8\\xe1\\x88\\xb0\\xe1\\x8b\\x93\\xe1\\x89\\xb5\\0\"\n    \"\\xe1\\x8a\\xa5\\xe1\\x88\\x91\\xe1\\x8b\\xb5\\0\"\n    \"\\xe1\\x88\\xb0\\xe1\\x8a\\x9e\\0\"\n    \"\\xe1\\x88\\x9b\\xe1\\x8a\\xad\\xe1\\x88\\xb0\\xe1\\x8a\\x9e\\0\"\n    \"\\xe1\\x88\\xa8\\xe1\\x89\\xa1\\xe1\\x8b\\x95\\0\"\n    \"\\xe1\\x88\\x90\\xe1\\x88\\x99\\xe1\\x88\\xb5\\0\"\n    \"\\xe1\\x8b\\x93\\xe1\\x88\\xad\\xe1\\x89\\xa5\\0\"\n    \"\\xe1\\x89\\x85\\xe1\\x8b\\xb3\\xe1\\x88\\x9c\\0\"\n    \"\\xe1\\x88\\x9b\\xe1\\x8a\\xad\\xe1\\x88\\xb0\\0\"\n    \"\\xe1\\x8a\\xa5\\0\"\n    \"\\xe1\\x88\\xb0\\0\"\n    \"\\xe1\\x88\\x9b\\0\"\n    \"\\xe1\\x88\\xa8\\0\"\n    \"\\xe1\\x88\\x90\\0\"\n    \"\\xe1\\x8b\\x93\\0\"\n    \"\\xe1\\x89\\x85\\0\"\n    \"\\xe1\\x8c\\x83\\xe1\\x8a\\x95\\xe1\\x8b\\xa9\\xe1\\x8b\\x88\\xe1\\x88\\xaa\\0\"\n    \"\\xe1\\x8d\\x8c\\xe1\\x89\\xa5\\xe1\\x88\\xa9\\xe1\\x8b\\x88\\xe1\\x88\\xaa\\0\"\n    \"\\xe1\\x88\\x9b\\xe1\\x88\\xad\\xe1\\x89\\xbd\\0\"\n    \"\\xe1\\x8a\\xa4\\xe1\\x8d\\x95\\xe1\\x88\\xaa\\xe1\\x88\\x8d\\0\"\n    \"\\xe1\\x88\\x9c\\xe1\\x8b\\xad\\0\"\n    \"\\xe1\\x8c\\x81\\xe1\\x8a\\x95\\0\"\n    \"\\xe1\\x8c\\x81\\xe1\\x88\\x8b\\xe1\\x8b\\xad\\0\"\n    \"\\xe1\\x8a\\xa6\\xe1\\x8c\\x88\\xe1\\x88\\xb5\\xe1\\x89\\xb5\\0\"\n    \"\\xe1\\x88\\xb4\\xe1\\x8d\\x95\\xe1\\x89\\xb4\\xe1\\x88\\x9d\\xe1\\x89\\xa0\\xe1\\x88\\xad\\0\"\n    \"\\xe1\\x8a\\xa6\\xe1\\x8a\\xad\\xe1\\x89\\xb6\\xe1\\x89\\xa0\\xe1\\x88\\xad\\0\"\n    \"\\xe1\\x8a\\x96\\xe1\\x89\\xac\\xe1\\x88\\x9d\\xe1\\x89\\xa0\\xe1\\x88\\xad\\0\"\n    \"\\xe1\\x8b\\xb2\\xe1\\x88\\xb4\\xe1\\x88\\x9d\\xe1\\x89\\xa0\\xe1\\x88\\xad\\0\"\n    \"\\xe1\\x8a\\xa6\\xe1\\x8a\\xad\\xe1\\x89\\xb0\\xe1\\x8b\\x8d\\xe1\\x89\\xa0\\xe1\\x88\\xad\\0\"\n    \"\\xe1\\x8c\\x83\\xe1\\x8a\\x95\\xe1\\x8b\\xa9\\0\"\n    \"\\xe1\\x8d\\x8c\\xe1\\x89\\xa5\\xe1\\x88\\xa9\\0\"\n    \"\\xe1\\x8a\\xa4\\xe1\\x8d\\x95\\xe1\\x88\\xaa\\0\"\n    \"\\xe1\\x8a\\xa6\\xe1\\x8c\\x88\\xe1\\x88\\xb5\\0\"\n    \"\\xe1\\x88\\xb4\\xe1\\x8d\\x95\\xe1\\x89\\xb4\\0\"\n    \"\\xe1\\x8a\\xa6\\xe1\\x8a\\xad\\xe1\\x89\\xb6\\0\"\n    \"\\xe1\\x8a\\x96\\xe1\\x89\\xac\\xe1\\x88\\x9d\\0\"\n    \"\\xe1\\x8b\\xb2\\xe1\\x88\\xb4\\xe1\\x88\\x9d\\0\"\n    \"Zdat azal\\0\"\n    \"\\xe1\\xb8\\x8c\\x65\\x66\\x66ir aza\\0\"\n    \"Asamas\\0\"\n    \"Aynas\\0\"\n    \"Asinas\\0\"\n    \"Akras\\0\"\n    \"Akwas\\0\"\n    \"Asimwas\\0\"\n    \"Asi\\xe1\\xb8\\x8dyas\\0\"\n    \"Asa\\0\"\n    \"Ayn\\0\"\n    \"Asn\\0\"\n    \"Akr\\0\"\n    \"Akw\\0\"\n    \"Asm\\0\"\n    \"As\\xe1\\xb8\\x8d\\0\"\n    \"Yennayer\\0\"\n    \"Yebrayer\\0\"\n    \"Mars\\0\"\n    \"Ibrir\\0\"\n    \"Mayyu\\0\"\n    \"Yunyu\\0\"\n    \"Yulyuz\\0\"\n    \"\\xc6\\x94uct\\0\"\n    \"Cutanbir\\0\"\n    \"K\\xe1\\xb9\\xaduber\\0\"\n    \"Nwanbir\\0\"\n    \"Dujanbir\\0\"\n    \"Yen\\0\"\n    \"Yeb\\0\"\n    \"Ibr\\0\"\n    \"Yun\\0\"\n    \"Yul\\0\"\n    \"\\xc6\\x94uc\\0\"\n    \"Cut\\0\"\n    \"K\\xe1\\xb9\\xadu\\0\"\n    \"Nwa\\0\"\n    \"Duj\\0\"\n    \"\\xe0\\xa4\\xaa\\xe0\\xa5\\x82\\xe0\\xa4\\xb0\\xe0\\xa5\\x8d\\xe0\\xa4\\xb5 \\xe0\\xa4\\xae\\xe0\\xa4\\xa7\\xe0\\xa5\\x8d\\xe0\\xa4\\xaf\\xe0\\xa4\\xbe\\xe0\\xa4\\xa8\\xe0\\xa5\\x8d\\xe0\\xa4\\xb9\\0\"\n    \"\\xe0\\xa4\\x89\\xe0\\xa4\\xa4\\xe0\\xa5\\x8d\\xe0\\xa4\\xa4\\xe0\\xa4\\xb0 \\xe0\\xa4\\xae\\xe0\\xa4\\xa7\\xe0\\xa5\\x8d\\xe0\\xa4\\xaf\\xe0\\xa4\\xbe\\xe0\\xa4\\xa8\\xe0\\xa5\\x8d\\xe0\\xa4\\xb9\\0\"\n    \"\\xe0\\xa4\\x86\\xe0\\xa4\\x87\\xe0\\xa4\\xa4\\xe0\\xa4\\xac\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa5\\x8b\\xe0\\xa4\\xae\\xe0\\xa4\\xac\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x99\\xe0\\xa5\\x8d\\xe0\\xa4\\x97\\xe0\\xa4\\xb2\\xe0\\xa4\\xac\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xac\\xe0\\xa5\\x81\\xe0\\xa4\\xa7\\xe0\\xa4\\xac\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xac\\xe0\\xa4\\xbf\\xe0\\xa4\\xb9\\xe0\\xa5\\x80\\xe0\\xa4\\xac\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb6\\xe0\\xa5\\x81\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa4\\xac\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xb6\\xe0\\xa4\\xa8\\xe0\\xa4\\xbf\\xe0\\xa4\\xac\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x86\\xe0\\xa4\\x87\\xe0\\xa4\\xa4\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\x99\\xe0\\xa5\\x8d\\xe0\\xa4\\x97\\xe0\\xa4\\xb2\\0\"\n    \"\\xe0\\xa4\\xac\\xe0\\xa4\\xbf\\xe0\\xa4\\xb9\\xe0\\xa5\\x80\\0\"\n    \"\\xe0\\xa4\\x86\\0\"\n    \"\\xe0\\xa4\\xae\\0\"\n    \"\\xe0\\xa4\\xac\\xe0\\xa4\\xbf\\0\"\n    \"\\xe0\\xa4\\xab\\xe0\\xa5\\x87\\xe0\\xa4\\xac\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa5\\x81\\xe0\\xa4\\x85\\xe0\\xa4\\xb0\\xe0\\xa5\\x80\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa4\\xbf\\xe0\\xa4\\xb2\\0\"\n    \"\\xe0\\xa4\\x9c\\xe0\\xa5\\x81\\xe0\\xa4\\xa8\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\x97\\xe0\\xa4\\xb8\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\0\"\n    \"\\xe0\\xa4\\xb8\\xe0\\xa5\\x87\\xe0\\xa4\\xaa\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x87\\xe0\\xa4\\xae\\xe0\\xa5\\x8d\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\x85\\xe0\\xa4\\x95\\xe0\\xa5\\x8d\\xe0\\xa4\\x9f\\xe0\\xa5\\x8b\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa5\\x8b\\xe0\\xa4\\xad\\xe0\\xa5\\x87\\xe0\\xa4\\xae\\xe0\\xa5\\x8d\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"\\xe0\\xa4\\xa1\\xe0\\xa4\\xbf\\xe0\\xa4\\xb8\\xe0\\xa5\\x87\\xe0\\xa4\\xae\\xe0\\xa5\\x8d\\xe0\\xa4\\xac\\xe0\\xa4\\xb0\\0\"\n    \"dddd, MMMM dd, yyyy\\0\"\n    \"MMMM dd, yyyy\\0\"\n    \"\\xd9\\x88\\xd8\\xb1\\xdb\\x8c\\0\"\n    \"\\xd8\\xba\\xd9\\x88\\xdb\\x8c\\xdb\\x8c\\0\"\n    \"\\xd8\\xba\\xd8\\xa8\\xd8\\xb1\\xda\\xab\\xd9\\x88\\xd9\\x84\\xdb\\x8c\\0\"\n    \"\\xda\\x86\\xd9\\x86\\xda\\xab\\xd8\\xa7\\xda\\x9a\\0\"\n    \"\\xd8\\xb2\\xd9\\x85\\xd8\\xb1\\xdb\\x8c\\0\"\n    \"\\xd9\\x88\\xda\\x96\\xdb\\x8c\\0\"\n    \"\\xd8\\xaa\\xd9\\x84\\xd9\\x87\\0\"\n    \"\\xd9\\x84\\xda\\x93\\xd9\\x85\\0\"\n    \"\\xd9\\x84\\xdb\\x8c\\xd9\\x86\\xd8\\xaf\\xdb\\x8d\\0\"\n    \"\\xd9\\x85\\xd8\\xb1\\xd8\\xba\\xd9\\x88\\xd9\\x85\\xdb\\x8c\\0\"\n    \"\\xd8\\xb3\\xd9\\x84\\xd9\\x88\\xd8\\xa7\\xd8\\xba\\xd9\\x87\\0\"\n    \"\\xda\\xa9\\xd8\\xa8\\0\"\n    \"Linggo\\0\"\n    \"Lunes\\0\"\n    \"Martes\\0\"\n    \"Miyerkules\\0\"\n    \"Huwebes\\0\"\n    \"Biyernes\\0\"\n    \"Sabado\\0\"\n    \"Lin\\0\"\n    \"Miy\\0\"\n    \"Huw\\0\"\n    \"Biy\\0\"\n    \"Pebrero\\0\"\n    \"Marso\\0\"\n    \"Hunyo\\0\"\n    \"Hulyo\\0\"\n    \"Setyembre\\0\"\n    \"Oktubre\\0\"\n    \"Nobyembre\\0\"\n    \"Disyembre\\0\"\n    \"Ene\\0\"\n    \"Peb\\0\"\n    \"Hun\\0\"\n    \"Hul\\0\"\n    \"Nob\\0\"\n    \"Lahadi\\0\"\n    \"Litinin\\0\"\n    \"Talata\\0\"\n    \"Laraba\\0\"\n    \"Alhamis\\0\"\n    \"Jumma'a\\0\"\n    \"Asabar\\0\"\n    \"Lh\\0\"\n    \"Li\\0\"\n    \"Ta\\0\"\n    \"Lr\\0\"\n    \"Al\\0\"\n    \"Ju\\0\"\n    \"As\\0\"\n    \"Janairu\\0\"\n    \"Faburairu\\0\"\n    \"Maris\\0\"\n    \"Afirilu\\0\"\n    \"Mayu\\0\"\n    \"Yuni\\0\"\n    \"Yuli\\0\"\n    \"Agusta\\0\"\n    \"Satumba\\0\"\n    \"Nuwamba\\0\"\n    \"Disamba\\0\"\n    \"Fab\\0\"\n    \"Afi\\0\"\n    \"Agu\\0\"\n    \"Nuw\\0\"\n    \"\\xc3\\x80\\xc3\\xa1r\\xe1\\xbb\\x8d\\xcc\\x80\\0\"\n    \"\\xe1\\xbb\\x8c\\xcc\\x80s\\xc3\\xa1n\\0\"\n    \"\\xe1\\xbb\\x8cj\\xe1\\xbb\\x8d\\xcc\\x81 \\xc3\\x80\\xc3\\xack\\xc3\\xba\\0\"\n    \"\\xe1\\xbb\\x8cj\\xe1\\xbb\\x8d\\xcc\\x81 Aj\\xc3\\xa9\\0\"\n    \"\\xe1\\xbb\\x8cj\\xe1\\xbb\\x8d\\xcc\\x81 \\xc3\\x8cs\\xe1\\xba\\xb9\\xcc\\x81gun\\0\"\n    \"\\xe1\\xbb\\x8cj\\xe1\\xbb\\x8d\\xcc\\x81r\\xc3\\xba\\0\"\n    \"\\xe1\\xbb\\x8cj\\xe1\\xbb\\x8d\\xcc\\x81\\x62\\xe1\\xbb\\x8d\\0\"\n    \"\\xe1\\xbb\\x8cj\\xe1\\xbb\\x8d\\xcc\\x81 \\xe1\\xba\\xb8t\\xc3\\xac\\0\"\n    \"\\xe1\\xbb\\x8cj\\xe1\\xbb\\x8d\\xcc\\x81 \\xc3\\x80\\x62\\xc3\\xa1m\\xe1\\xba\\xb9\\xcc\\x81ta\\0\"\n    \"\\xc3\\x80\\xc3\\xack\\xc3\\xba\\0\"\n    \"Aj\\xc3\\xa9\\0\"\n    \"\\xc3\\x8cs\\xe1\\xba\\xb9\\xcc\\x81gun\\0\"\n    \"\\xe1\\xba\\xb8t\\xc3\\xac\\0\"\n    \"\\xc3\\x80\\x62\\xc3\\xa1m\\xe1\\xba\\xb9\\xcc\\x81ta\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 \\xe1\\xb9\\xa2\\xe1\\xba\\xb9\\xcc\\x81r\\xe1\\xba\\xb9\\xcc\\x81\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 \\xc3\\x88r\\xc3\\xa8l\\xc3\\xa8\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 \\xe1\\xba\\xb8r\\xe1\\xba\\xb9\\xcc\\x80n\\xc3\\xa0\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 \\xc3\\x8cgb\\xc3\\xa9\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 \\xe1\\xba\\xb8\\xcc\\x80\\x62ibi\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 \\xc3\\x92k\\xc3\\xba\\x64u\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 Ag\\xe1\\xba\\xb9m\\xe1\\xbb\\x8d\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 \\xc3\\x92g\\xc3\\xban\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 Owewe\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 \\xe1\\xbb\\x8c\\xcc\\x80w\\xc3\\xa0r\\xc3\\xa0\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 B\\xc3\\xa9l\\xc3\\xba\\0\"\n    \"O\\xe1\\xb9\\xa3\\xc3\\xb9 \\xe1\\xbb\\x8c\\xcc\\x80p\\xe1\\xba\\xb9\\xcc\\x80\\0\"\n    \"\\xe1\\xb9\\xa2\\xe1\\xba\\xb9\\xcc\\x81r\\xe1\\xba\\xb9\\xcc\\x81\\0\"\n    \"\\xc3\\x88r\\xc3\\xa8l\\xc3\\xa8\\0\"\n    \"\\xe1\\xba\\xb8r\\xe1\\xba\\xb9\\xcc\\x80n\\xc3\\xa0\\0\"\n    \"\\xc3\\x8cgb\\xc3\\xa9\\0\"\n    \"\\xe1\\xba\\xb8\\xcc\\x80\\x62ibi\\0\"\n    \"\\xc3\\x92k\\xc3\\xba\\x64u\\0\"\n    \"Ag\\xe1\\xba\\xb9m\\xe1\\xbb\\x8d\\0\"\n    \"\\xc3\\x92g\\xc3\\xban\\0\"\n    \"Owewe\\0\"\n    \"\\xe1\\xbb\\x8c\\xcc\\x80w\\xc3\\xa0r\\xc3\\xa0\\0\"\n    \"B\\xc3\\xa9l\\xc3\\xba\\0\"\n    \"\\xe1\\xbb\\x8c\\xcc\\x80p\\xe1\\xba\\xb9\\xcc\\x80\\0\"\n    \"Sontaga\\0\"\n    \"Mosupalogo\\0\"\n    \"Labohlano\\0\"\n    \"Mokibelo\\0\"\n    \"Mok\\0\"\n    \"Janaware\\0\"\n    \"Feberware\\0\"\n    \"Mat\\xc5\\xa1he\\0\"\n    \"Aporele\\0\"\n    \"Julae\\0\"\n    \"Agostose\\0\"\n    \"Setemere\\0\"\n    \"Oktobore\\0\"\n    \"Nofemere\\0\"\n    \"Disemere\\0\"\n    \"Apo\\0\"\n    \"Nof\\0\"\n    \"MMMM d'.-at'\\0\"\n    \"u.t.\\0\"\n    \"u.k.\\0\"\n    \"sabaat\\0\"\n    \"ataasinngorneq\\0\"\n    \"marlunngorneq\\0\"\n    \"pingasunngorneq\\0\"\n    \"sisamanngorneq\\0\"\n    \"tallimanngorneq\\0\"\n    \"arfininngorneq\\0\"\n    \"ata\\0\"\n    \"pin\\0\"\n    \"sis\\0\"\n    \"tal\\0\"\n    \"arf\\0\"\n    \"martsi\\0\"\n    \"aprili\\0\"\n    \"maji\\0\"\n    \"augustusi\\0\"\n    \"septemberi\\0\"\n    \"oktoberi\\0\"\n    \"novemberi\\0\"\n    \"decemberi\\0\"\n    \"MMMM d'.-at, 'yyyy\\0\"\n    \"A.M.\\0\"\n    \"P.M.\\0\"\n    \"Mb\\xe1\\xbb\\x8ds\\xe1\\xbb\\x8b \\xe1\\xbb\\xa4ka\\0\"\n    \"M\\xe1\\xbb\\x8dnde\\0\"\n    \"Tiuzdee\\0\"\n    \"Wenezdee\\0\"\n    \"T\\xe1\\xbb\\x8d\\xe1\\xbb\\x8dzdee\\0\"\n    \"Fra\\xe1\\xbb\\x8b\\x64\\x65\\x65\\0\"\n    \"Sat\\xe1\\xbb\\x8d\\x64\\x65\\x65\\0\"\n    \"\\xe1\\xbb\\xa4ka\\0\"\n    \"M\\xe1\\xbb\\x8dn\\0\"\n    \"Tiu\\0\"\n    \"Wen\\0\"\n    \"T\\xe1\\xbb\\x8d\\xe1\\xbb\\x8d\\0\"\n    \"Fra\\xe1\\xbb\\x8b\\0\"\n    \"Jen\\xe1\\xbb\\xa5war\\xe1\\xbb\\x8b\\0\"\n    \"Febr\\xe1\\xbb\\xa5war\\xe1\\xbb\\x8b\\0\"\n    \"Maach\\xe1\\xbb\\x8b\\0\"\n    \"Eprel\\0\"\n    \"Mee\\0\"\n    \"Juun\\0\"\n    \"Jula\\xe1\\xbb\\x8b\\0\"\n    \"\\xe1\\xbb\\x8cg\\xe1\\xbb\\x8d\\xe1\\xbb\\x8dst\\0\"\n    \"\\xe1\\xbb\\x8cktoba\\0\"\n    \"Jen\\0\"\n    \"Maa\\0\"\n    \"Juu\\0\"\n    \"\\xe1\\xbb\\x8cg\\xe1\\xbb\\x8d\\0\"\n    \"\\xe1\\xbb\\x8ckt\\0\"\n    \"M\\xe2\\x80\\x99 \\xea\\x86\\xaa\\xe2\\x80\\x99\\x64\\xe2\\x80\\x99 \\xea\\x91\\x8d\\xe2\\x80\\x99\\0\"\n    \"\\xea\\x8e\\xb8\\xea\\x84\\x91\\0\"\n    \"\\xea\\x81\\xaf\\xea\\x8b\\x92\\0\"\n    \"\\xea\\x91\\xad\\xea\\x86\\x8f\\xea\\x91\\x8d\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x8a\\x82\\xea\\x8b\\x8d\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x8a\\x82\\xea\\x91\\x8d\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x8a\\x82\\xea\\x8c\\x95\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x8a\\x82\\xea\\x87\\x96\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x8a\\x82\\xea\\x89\\xac\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x8a\\x82\\xea\\x83\\x98\\0\"\n    \"\\xea\\x91\\xad\\xea\\x86\\x8f\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x8b\\x8d\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x91\\x8d\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x8c\\x95\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x87\\x96\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x89\\xac\\0\"\n    \"\\xea\\x86\\x8f\\xea\\x83\\x98\\0\"\n    \"\\xea\\x86\\x8f\\0\"\n    \"\\xea\\x8b\\x8d\\0\"\n    \"\\xea\\x91\\x8d\\0\"\n    \"\\xea\\x8c\\x95\\0\"\n    \"\\xea\\x87\\x96\\0\"\n    \"\\xea\\x89\\xac\\0\"\n    \"\\xea\\x83\\x98\\0\"\n    \"\\xea\\x8b\\x8d\\xea\\x86\\xaa\\0\"\n    \"\\xea\\x91\\x8d\\xea\\x86\\xaa\\0\"\n    \"\\xea\\x8c\\x95\\xea\\x86\\xaa\\0\"\n    \"\\xea\\x87\\x96\\xea\\x86\\xaa\\0\"\n    \"\\xea\\x89\\xac\\xea\\x86\\xaa\\0\"\n    \"\\xea\\x83\\x98\\xea\\x86\\xaa\\0\"\n    \"\\xea\\x8f\\x83\\xea\\x86\\xaa\\0\"\n    \"\\xea\\x89\\x86\\xea\\x86\\xaa\\0\"\n    \"\\xea\\x88\\xac\\xea\\x86\\xaa\\0\"\n    \"\\xea\\x8a\\xb0\\xea\\x86\\xaa\\0\"\n    \"\\xea\\x8a\\xb0\\xea\\x8a\\xaa\\xea\\x86\\xaa\\0\"\n    \"\\xea\\x8a\\xb0\\xea\\x91\\x8b\\xea\\x86\\xaa\\0\"\n    \"yyyy'\\xea\\x88\\x8e' M'\\xea\\x86\\xaa' d'\\xea\\x91\\x8d'\\0\"\n    \"dddd, yyyy'\\xea\\x88\\x8e' M'\\xea\\x86\\xaa' d'\\xea\\x91\\x8d'\\0\"\n    \"yyyy'\\xea\\x88\\x8e' M'\\xea\\x86\\xaa' d'\\xea\\x91\\x8d', dddd\\0\"\n    \"yyyy\\xea\\x88\\x8e MMM d\\xea\\x91\\x8d\\0\"\n    \"dddd, yyyy\\xea\\x88\\x8e MMM d\\xea\\x91\\x8d\\0\"\n    \"yyyy'\\xea\\x88\\x8e' M'\\xea\\x86\\xaa'\\0\"\n    \"Meurzh\\0\"\n    \"Merc\\xca\\xbcher\\0\"\n    \"Yaou\\0\"\n    \"Gwener\\0\"\n    \"Sadorn\\0\"\n    \"sul\\0\"\n    \"meu.\\0\"\n    \"yaou\\0\"\n    \"gwe.\\0\"\n    \"sad.\\0\"\n    \"lu\\0\"\n    \"mz\\0\"\n    \"mc\\0\"\n    \"ya\\0\"\n    \"gw\\0\"\n    \"sa\\0\"\n    \"Genver\\0\"\n    \"C\\xca\\xbchwevrer\\0\"\n    \"Ebrel\\0\"\n    \"Mae\\0\"\n    \"Mezheven\\0\"\n    \"Gouere\\0\"\n    \"Eost\\0\"\n    \"Gwengolo\\0\"\n    \"Here\\0\"\n    \"Du\\0\"\n    \"Kerzu\\0\"\n    \"Gen\\0\"\n    \"C\\xca\\xbchwe\\0\"\n    \"Meur\\0\"\n    \"Mezh\\0\"\n    \"Goue\\0\"\n    \"Gwen\\0\"\n    \"Ker\\0\"\n    \"v.m.\\0\"\n    \"n.m.\\0\"\n    \"Sunntig\\0\"\n    \"M\\xc3\\xa4\\xc3\\xa4ntig\\0\"\n    \"Ziischtig\\0\"\n    \"Mittwuch\\0\"\n    \"Dunschtig\\0\"\n    \"Friitig\\0\"\n    \"Samschtig\\0\"\n    \"Su.\\0\"\n    \"M\\xc3\\xa4.\\0\"\n    \"Zi.\\0\"\n    \"Mi.\\0\"\n    \"Du.\\0\"\n    \"Fr.\\0\"\n    \"Sa.\\0\"\n    \"Auguscht\\0\"\n    \"Sept\\xc3\\xa4mber\\0\"\n    \"Oktoober\\0\"\n    \"Nov\\xc3\\xa4mber\\0\"\n    \"Dez\\xc3\\xa4mber\\0\"\n    \"MMMM d \\xd0\\xba\\xd2\\xaf\\xd0\\xbd\\xd1\\x8d\\0\"\n    \"\\xd0\\xad\\xd0\\x98\\0\"\n    \"\\xd0\\xad\\xd0\\x9a\\0\"\n    \"\\xd0\\x91\\xd0\\xb0\\xd1\\x81\\xd0\\xba\\xd1\\x8b\\xd2\\xbb\\xd1\\x8b\\xd0\\xb0\\xd0\\xbd\\xd0\\xbd\\xd1\\x8c\\xd0\\xb0\\0\"\n    \"\\xd0\\x91\\xd1\\x8d\\xd0\\xbd\\xd0\\xb8\\xd0\\xb4\\xd0\\xb8\\xd1\\x8d\\xd0\\xbb\\xd0\\xb8\\xd0\\xbd\\xd0\\xbd\\xd1\\x8c\\xd0\\xb8\\xd0\\xba\\0\"\n    \"\\xd0\\x9e\\xd0\\xbf\\xd1\\x82\\xd1\\x83\\xd0\\xbe\\xd1\\x80\\xd1\\x83\\xd0\\xbd\\xd0\\xbd\\xd1\\x8c\\xd1\\x83\\xd0\\xba\\0\"\n    \"\\xd0\\xa1\\xd1\\x8d\\xd1\\x80\\xd1\\x8d\\xd0\\xb4\\xd1\\x8d\\0\"\n    \"\\xd0\\xa7\\xd1\\x8d\\xd0\\xbf\\xd0\\xbf\\xd0\\xb8\\xd1\\x8d\\xd1\\x80\\0\"\n    \"\\xd0\\x91\\xd1\\x8d\\xd1\\x8d\\xd1\\x82\\xd0\\xb8\\xd2\\xa5\\xd1\\x81\\xd1\\x8d\\0\"\n    \"\\xd0\\xa1\\xd1\\x83\\xd0\\xb1\\xd1\\x83\\xd0\\xbe\\xd1\\x82\\xd0\\xb0\\0\"\n    \"\\xd0\\x91\\xd1\\x81\\0\"\n    \"\\xd0\\x91\\xd0\\xbd\\0\"\n    \"\\xd0\\x9e\\xd0\\xbf\\0\"\n    \"\\xd0\\xa1\\xd1\\x8d\\0\"\n    \"\\xd0\\xa7\\xd0\\xbf\\0\"\n    \"\\xd0\\x91\\xd1\\x8d\\0\"\n    \"\\xd0\\x9e\\0\"\n    \"\\xd0\\xa2\\xd0\\xbe\\xd1\\x85\\xd1\\x81\\xd1\\x83\\xd0\\xbd\\xd0\\xbd\\xd1\\x8c\\xd1\\x83\\0\"\n    \"\\xd0\\x9e\\xd0\\xbb\\xd1\\x83\\xd0\\xbd\\xd0\\xbd\\xd1\\x8c\\xd1\\x83\\0\"\n    \"\\xd0\\x9a\\xd1\\x83\\xd0\\xbb\\xd1\\x83\\xd0\\xbd \\xd1\\x82\\xd1\\x83\\xd1\\x82\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\x9c\\xd1\\x83\\xd1\\x83\\xd1\\x81 \\xd1\\x83\\xd1\\x81\\xd1\\x82\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xab\\xd0\\xb0\\xd0\\xbc \\xd1\\x8b\\xd0\\xb9\\xd1\\x8b\\xd0\\xbd\\0\"\n    \"\\xd0\\x91\\xd1\\x8d\\xd1\\x81 \\xd1\\x8b\\xd0\\xb9\\xd1\\x8b\\xd0\\xbd\\0\"\n    \"\\xd0\\x9e\\xd1\\x82 \\xd1\\x8b\\xd0\\xb9\\xd1\\x8b\\xd0\\xbd\\0\"\n    \"\\xd0\\x90\\xd1\\x82\\xd1\\x8b\\xd1\\x80\\xd0\\xb4\\xd1\\x8c\\xd1\\x8b\\xd1\\x85 \\xd1\\x8b\\xd0\\xb9\\xd1\\x8b\\xd0\\xbd\\0\"\n    \"\\xd0\\x91\\xd0\\xb0\\xd0\\xbb\\xd0\\xb0\\xd2\\x95\\xd0\\xb0\\xd0\\xbd \\xd1\\x8b\\xd0\\xb9\\xd1\\x8b\\xd0\\xbd\\0\"\n    \"\\xd0\\x90\\xd0\\xbb\\xd1\\x82\\xd1\\x8b\\xd0\\xbd\\xd0\\xbd\\xd1\\x8c\\xd1\\x8b\\0\"\n    \"\\xd0\\xa1\\xd1\\x8d\\xd1\\x82\\xd0\\xb8\\xd0\\xbd\\xd0\\xbd\\xd1\\x8c\\xd0\\xb8\\0\"\n    \"\\xd0\\x90\\xd1\\x85\\xd1\\x81\\xd1\\x8b\\xd0\\xbd\\xd0\\xbd\\xd1\\x8c\\xd1\\x8b\\0\"\n    \"\\xd0\\xa2\\xd0\\xbe\\xd1\\x85\\xd1\\x81\\0\"\n    \"\\xd0\\x9e\\xd0\\xbb\\xd1\\x83\\xd0\\xbd\\0\"\n    \"\\xd0\\x9a\\xd0\\xbb\\xd0\\xbd_\\xd1\\x82\\xd1\\x82\\xd1\\x80\\0\"\n    \"\\xd0\\x9c\\xd1\\x83\\xd1\\x81_\\xd1\\x83\\xd1\\x81\\xd1\\x82\\0\"\n    \"\\xd0\\xab\\xd0\\xb0\\xd0\\xbc_\\xd0\\xb9\\xd0\\xbd\\0\"\n    \"\\xd0\\x91\\xd1\\x8d\\xd1\\x81_\\xd0\\xb9\\xd0\\xbd\\0\"\n    \"\\xd0\\x9e\\xd1\\x82_\\xd0\\xb9\\xd0\\xbd\\0\"\n    \"\\xd0\\x90\\xd1\\x82\\xd1\\x80\\xd0\\xb4\\xd1\\x8c_\\xd0\\xb9\\xd0\\xbd\\0\"\n    \"\\xd0\\x91\\xd0\\xbb\\xd2\\x95\\xd0\\xbd_\\xd0\\xb9\\xd0\\xbd\\0\"\n    \"\\xd0\\x90\\xd0\\xbb\\xd1\\x82\\0\"\n    \"\\xd0\\xa1\\xd1\\x8d\\xd1\\x82\\0\"\n    \"\\xd0\\x90\\xd1\\x85\\xd1\\x81\\0\"\n    \"yyyy MM d\\0\"\n    \"dd yyyy MM d\\0\"\n    \"dddd, yyyy '\\xd1\\x81.' MMMM d '\\xd0\\xba\\xd2\\xaf\\xd0\\xbd\\xd1\\x8d'\\0\"\n    \"yyyy '\\xd1\\x81.' MMMM d '\\xd0\\xba\\xd2\\xaf\\xd0\\xbd\\xd1\\x8d'\\0\"\n    \"dddd, MMMM d '\\xd0\\xba\\xd2\\xaf\\xd0\\xbd\\xd1\\x8d' yyyy '\\xd1\\x81.'\\0\"\n    \"yyyy '\\xd1\\x81.' MMMM\\0\"\n    \"Ku cyumweru\\0\"\n    \"Kuwa mbere\\0\"\n    \"Kuwa kabiri\\0\"\n    \"Kuwa gatatu\\0\"\n    \"Kuwa kane\\0\"\n    \"Kuwa gatanu\\0\"\n    \"Kuwa gatandatu\\0\"\n    \"cyu.\\0\"\n    \"mbe.\\0\"\n    \"kab.\\0\"\n    \"gtu.\\0\"\n    \"kan.\\0\"\n    \"gnu.\\0\"\n    \"gnd.\\0\"\n    \"Mutarama\\0\"\n    \"Gashyantare\\0\"\n    \"Werurwe\\0\"\n    \"Mata\\0\"\n    \"Gicuransi\\0\"\n    \"Kamena\\0\"\n    \"Nyakanga\\0\"\n    \"Kanama\\0\"\n    \"Nzeli\\0\"\n    \"Ukwakira\\0\"\n    \"Ugushyingo\\0\"\n    \"Ukuboza\\0\"\n    \"mut.\\0\"\n    \"gas.\\0\"\n    \"wer.\\0\"\n    \"mat.\\0\"\n    \"gic.\\0\"\n    \"kam.\\0\"\n    \"nya.\\0\"\n    \"nze.\\0\"\n    \"ukw.\\0\"\n    \"ugu.\\0\"\n    \"uku.\\0\"\n    \"d'mh' MMMM\\0\"\n    \"m\\0\"\n    \"f\\0\"\n    \"DiD\\xc3\\xb2mhnaich\\0\"\n    \"DiLuain\\0\"\n    \"DiM\\xc3\\xa0irt\\0\"\n    \"DiCiadain\\0\"\n    \"Diardaoin\\0\"\n    \"DihAoine\\0\"\n    \"DiSathairne\\0\"\n    \"DiD\\0\"\n    \"DiL\\0\"\n    \"DiM\\0\"\n    \"DiC\\0\"\n    \"Dia\\0\"\n    \"Dih\\0\"\n    \"DiS\\0\"\n    \"Am Faoilleach\\0\"\n    \"An Gearran\\0\"\n    \"Am M\\xc3\\xa0rt\\0\"\n    \"An Giblean\\0\"\n    \"An C\\xc3\\xa8itean\\0\"\n    \"An t-\\xc3\\x92gmhios\\0\"\n    \"An t-Iuchar\\0\"\n    \"An L\\xc3\\xb9nastal\\0\"\n    \"An t-Sultain\\0\"\n    \"An D\\xc3\\xa0mhair\\0\"\n    \"An t-Samhain\\0\"\n    \"An D\\xc3\\xb9\\x62hlachd\\0\"\n    \"Faoi\\0\"\n    \"Gearr\\0\"\n    \"M\\xc3\\xa0rt\\0\"\n    \"Gibl\\0\"\n    \"C\\xc3\\xa8it\\0\"\n    \"\\xc3\\x92gmh\\0\"\n    \"Iuch\\0\"\n    \"L\\xc3\\xb9na\\0\"\n    \"Sult\\0\"\n    \"D\\xc3\\xa0mh\\0\"\n    \"D\\xc3\\xb9\\x62h\\0\"\n    \"dddd, d'mh' MMMM yyyy\\0\"\n    \"d'mh' MMMM yyyy\\0\"\n    \"\\xe9\\x80\\xb1\\xe6\\x97\\xa5\\0\"\n    \"\\xe9\\x80\\xb1\\xe4\\xb8\\x80\\0\"\n    \"\\xe9\\x80\\xb1\\xe4\\xba\\x8c\\0\"\n    \"\\xe9\\x80\\xb1\\xe4\\xb8\\x89\\0\"\n    \"\\xe9\\x80\\xb1\\xe5\\x9b\\x9b\\0\"\n    \"\\xe9\\x80\\xb1\\xe4\\xba\\x94\\0\"\n    \"\\xe9\\x80\\xb1\\xe5\\x85\\xad\\0\"\n    \"dddd yyyy\\xe5\\xb9\\xb4MMMd\\xe6\\x97\\xa5\\0\"\n    \"\\xd8\\xb5\\0\"\n    \"\\xd9\\x85\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd8\\xad\\xd8\\xaf\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xa7\\xd8\\xab\\xd9\\x86\\xd9\\x8a\\xd9\\x86\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xab\\xd9\\x84\\xd8\\xa7\\xd8\\xab\\xd8\\xa7\\xd8\\xa1\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd8\\xb1\\xd8\\xa8\\xd8\\xb9\\xd8\\xa7\\xd8\\xa1\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xae\\xd9\\x85\\xd9\\x8a\\xd8\\xb3\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xac\\xd9\\x85\\xd8\\xb9\\xd8\\xa9\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb3\\xd8\\xa8\\xd8\\xaa\\0\"\n    \"\\xd8\\xad\\0\"\n    \"\\xd9\\x86\\0\"\n    \"\\xd8\\xab\\0\"\n    \"\\xd8\\xb1\\0\"\n    \"\\xd8\\xae\\0\"\n    \"\\xd9\\x83\\xd8\\xa7\\xd9\\x86\\xd9\\x88\\xd9\\x86 \\xd8\\xa7\\xd9\\x84\\xd8\\xab\\xd8\\xa7\\xd9\\x86\\xd9\\x8a\\0\"\n    \"\\xd8\\xb4\\xd8\\xa8\\xd8\\xa7\\xd8\\xb7\\0\"\n    \"\\xd8\\xa2\\xd8\\xb0\\xd8\\xa7\\xd8\\xb1\\0\"\n    \"\\xd9\\x86\\xd9\\x8a\\xd8\\xb3\\xd8\\xa7\\xd9\\x86\\0\"\n    \"\\xd8\\xa3\\xd9\\x8a\\xd8\\xa7\\xd8\\xb1\\0\"\n    \"\\xd8\\xad\\xd8\\xb2\\xd9\\x8a\\xd8\\xb1\\xd8\\xa7\\xd9\\x86\\0\"\n    \"\\xd8\\xaa\\xd9\\x85\\xd9\\x88\\xd8\\xb2\\0\"\n    \"\\xd8\\xa2\\xd8\\xa8\\0\"\n    \"\\xd8\\xa3\\xd9\\x8a\\xd9\\x84\\xd9\\x88\\xd9\\x84\\0\"\n    \"\\xd8\\xaa\\xd8\\xb4\\xd8\\xb1\\xd9\\x8a\\xd9\\x86 \\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd9\\x88\\xd9\\x84\\0\"\n    \"\\xd8\\xaa\\xd8\\xb4\\xd8\\xb1\\xd9\\x8a\\xd9\\x86 \\xd8\\xa7\\xd9\\x84\\xd8\\xab\\xd8\\xa7\\xd9\\x86\\xd9\\x8a\\0\"\n    \"\\xd9\\x83\\xd8\\xa7\\xd9\\x86\\xd9\\x88\\xd9\\x86 \\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd9\\x88\\xd9\\x84\\0\"\n    \"dd.MMMM.\\0\"\n    \"dom.\\0\"\n    \"mi\\xc3\\xa9.\\0\"\n    \"jue.\\0\"\n    \"vie\\0\"\n    \"s\\xc3\\xa1\\x62.\\0\"\n    \"en.\\0\"\n    \"mzo.\\0\"\n    \"my.\\0\"\n    \"dic.\\0\"\n    \"dd.MMMM\\0\"\n    \"MMMM.yyyy\\0\"\n    \"H.mm' u.'\\0\"\n    \"f.m.\\0\"\n    \"e.m.\\0\"\n    \"tysdag\\0\"\n    \"laurdag\\0\"\n    \"tys\\0\"\n    \"lau\\0\"\n    \"Janeiro\\0\"\n    \"Fevereiro\\0\"\n    \"Mar\\xc3\\xa7o\\0\"\n    \"Junho\\0\"\n    \"Julho\\0\"\n    \"Dezembro\\0\"\n    \"yy.MM.dd\\0\"\n    \"\\xd0\\xb1\\xd0\\xb0\\xd0\\xb7\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xb1\\xd0\\xb0\\xd0\\xb7\\xd0\\xb0\\xd1\\x80 \\xd0\\xb5\\xd1\\x80\\xd1\\x82\\xd3\\x99\\xd1\\x81\\xd0\\xb8\\0\"\n    \"\\xd1\\x87\\xd3\\x99\\xd1\\x80\\xd1\\x88\\xd3\\x99\\xd0\\xbd\\xd0\\xb1\\xd3\\x99 \\xd0\\xb0\\xd1\\x85\\xd1\\x88\\xd0\\xb0\\xd0\\xbc\\xd1\\x8b\\0\"\n    \"\\xd1\\x87\\xd3\\x99\\xd1\\x80\\xd1\\x88\\xd3\\x99\\xd0\\xbd\\xd0\\xb1\\xd3\\x99\\0\"\n    \"\\xd2\\xb9\\xd2\\xaf\\xd0\\xbc\\xd3\\x99 \\xd0\\xb0\\xd1\\x85\\xd1\\x88\\xd0\\xb0\\xd0\\xbc\\xd1\\x8b\\0\"\n    \"\\xd2\\xb9\\xd2\\xaf\\xd0\\xbc\\xd3\\x99\\0\"\n    \"\\xd1\\x88\\xd3\\x99\\xd0\\xbd\\xd0\\xb1\\xd3\\x99\\0\"\n    \"\\xd1\\x98\\xd0\\xb0\\xd0\\xbd\\xd0\\xb2\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd1\\x84\\xd0\\xb5\\xd0\\xb2\\xd1\\x80\\xd0\\xb0\\xd0\\xbb\\0\"\n    \"\\xd0\\xb0\\xd0\\xbf\\xd1\\x80\\xd0\\xb5\\xd0\\xbb\\0\"\n    \"\\xd0\\xb8\\xd1\\x98\\xd1\\x83\\xd0\\xbd\\0\"\n    \"\\xd0\\xb8\\xd1\\x98\\xd1\\x83\\xd0\\xbb\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbd\\xd1\\x82\\xd1\\x98\\xd0\\xb0\\xd0\\xb1\\xd1\\x80\\0\"\n    \"\\xd0\\xbe\\xd0\\xba\\xd1\\x82\\xd1\\x98\\xd0\\xb0\\xd0\\xb1\\xd1\\x80\\0\"\n    \"\\xd0\\xbd\\xd0\\xbe\\xd1\\x98\\xd0\\xb0\\xd0\\xb1\\xd1\\x80\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd0\\xba\\xd0\\xb0\\xd0\\xb1\\xd1\\x80\\0\"\n    \"\\xd1\\x8f\\xd0\\xba\\xd1\\x88\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb0\\0\"\n    \"\\xd0\\xb4\\xd1\\x83\\xd1\\x88\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb0\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd1\\x88\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd0\\xbe\\xd1\\x80\\xd1\\x88\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb0\\0\"\n    \"\\xd0\\xbf\\xd0\\xb0\\xd0\\xb9\\xd1\\x88\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb0\\0\"\n    \"\\xd0\\xb6\\xd1\\x83\\xd0\\xbc\\xd0\\xb0\\0\"\n    \"\\xd1\\x88\\xd0\\xb0\\xd0\\xbd\\xd0\\xb1\\xd0\\xb0\\0\"\n    \"\\xd0\\xaf\\xd0\\xba\\xd1\\x88\\0\"\n    \"\\xd0\\x94\\xd1\\x83\\xd1\\x88\\0\"\n    \"\\xd0\\xa1\\xd0\\xb5\\xd1\\x88\\0\"\n    \"\\xd0\\xa7\\xd0\\xbe\\xd1\\x80\\0\"\n    \"\\xd0\\x9f\\xd0\\xb0\\xd0\\xb9\\0\"\n    \"\\xd0\\xa8\\xd0\\xb0\\xd0\\xbd\\0\"\n    \"\\xd0\\xaf\\0\"\n    \"\\xd9\\x8a\\xd9\\x86\\xd8\\xa7\\xd9\\x8a\\xd8\\xb1\\0\"\n    \"\\xd9\\x81\\xd8\\xa8\\xd8\\xb1\\xd8\\xa7\\xd9\\x8a\\xd8\\xb1\\0\"\n    \"\\xd8\\xa3\\xd8\\xa8\\xd8\\xb1\\xd9\\x8a\\xd9\\x84\\0\"\n    \"\\xd9\\x85\\xd8\\xa7\\xd9\\x8a\\xd9\\x88\\0\"\n    \"\\xd9\\x8a\\xd9\\x88\\xd9\\x86\\xd9\\x8a\\xd9\\x88\\0\"\n    \"\\xd9\\x8a\\xd9\\x88\\xd9\\x84\\xd9\\x8a\\xd9\\x88\\0\"\n    \"\\xd8\\xa3\\xd8\\xba\\xd8\\xb3\\xd8\\xb7\\xd8\\xb3\\0\"\n    \"\\xd8\\xb3\\xd8\\xa8\\xd8\\xaa\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd8\\xa3\\xd9\\x83\\xd8\\xaa\\xd9\\x88\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd9\\x86\\xd9\\x88\\xd9\\x81\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd8\\xaf\\xd9\\x8a\\xd8\\xb3\\xd9\\x85\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"J\\xc3\\xa4nner\\0\"\n    \"J\\xc3\\xa4n\\0\"\n    \"yy MM dd\\0\"\n    \"MMMM d'. b.'\\0\"\n    \"aejlege\\0\"\n    \"m\\xc3\\xa5\\x61nta\\0\"\n    \"d\\xc3\\xa4jsta\\0\"\n    \"gaskevahkoe\\0\"\n    \"d\\xc3\\xa5\\x61rsta\\0\"\n    \"bearjadahke\\0\"\n    \"laavadahke\\0\"\n    \"o\\xc4\\x91\\xc4\\x91\\x61jage\\0\"\n    \"guovva\\0\"\n    \"njuk\\xc4\\x8d\\x61\\0\"\n    \"cuo\\xc5\\x8bo\\0\"\n    \"miesse\\0\"\n    \"geasse\\0\"\n    \"suoidne\\0\"\n    \"borge\\0\"\n    \"\\xc4\\x8d\\x61k\\xc4\\x8d\\x61\\0\"\n    \"golggot\\0\"\n    \"sk\\xc3\\xa1\\x62ma\\0\"\n    \"juovla\\0\"\n    \"dddd', 'MMMM d'. b. 'yyyy\\0\"\n    \"MMMM d'. b. 'yyyy\\0\"\n    \"M/dd/yy\\0\"\n    \"MMMM-dd-yy\\0\"\n    \"dd-MMMM\\0\"\n    \"dddd, d 'de' MMMM 'de' yyyy\\0\"\n    \"d 'de' MMMM 'de' yyyy\\0\"\n    \"d. MMM yyyy.\\0\"\n    \"MMMM yyyy.\\0\"\n    \"\\xd8\\xac\\xd8\\xa7\\xd9\\x86\\xd9\\x81\\xd9\\x8a\\0\"\n    \"\\xd9\\x81\\xd9\\x8a\\xd9\\x81\\xd8\\xb1\\xd9\\x8a\\0\"\n    \"\\xd8\\xa3\\xd9\\x81\\xd8\\xb1\\xd9\\x8a\\xd9\\x84\\0\"\n    \"\\xd9\\x85\\xd8\\xa7\\xd9\\x8a\\0\"\n    \"\\xd8\\xac\\xd9\\x88\\xd8\\xa7\\xd9\\x86\\0\"\n    \"\\xd8\\xac\\xd9\\x88\\xd9\\x8a\\xd9\\x84\\xd9\\x8a\\xd8\\xa9\\0\"\n    \"\\xd8\\xa3\\xd9\\x88\\xd8\\xaa\\0\"\n    \"dddd yyyy'\\xe5\\xb9\\xb4'M'\\xe6\\x9c\\x88'd'\\xe6\\x97\\xa5'\\0\"\n    \"dddd yyyy MM dd\\0\"\n    \"d/MMMM\\0\"\n    \"MMMM/yyyy\\0\"\n    \"pre podne\\0\"\n    \"popodne\\0\"\n    \"septembar\\0\"\n    \"oktobar\\0\"\n    \"novembar\\0\"\n    \"decembar\\0\"\n    \"dd. MMM. yyyy.\\0\"\n    \"dddd, dd. MMMM yyyy.\\0\"\n    \"\\xd9\\x8a\\xd9\\x88\\xd9\\x84\\xd9\\x8a\\xd9\\x88\\xd8\\xb2\\0\"\n    \"\\xd8\\xba\\xd8\\xb4\\xd8\\xaa\\0\"\n    \"\\xd8\\xb4\\xd8\\xaa\\xd9\\x86\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd9\\x86\\xd9\\x88\\xd9\\x86\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"\\xd8\\xaf\\xd8\\xac\\xd9\\x86\\xd8\\xa8\\xd8\\xb1\\0\"\n    \"MMMM/dd\\0\"\n    \"ponedeljak\\0\"\n    \"\\xd0\\xbf\\xd1\\x80\\xd0\\xb5 \\xd0\\xbf\\xd0\\xbe\\xd0\\xb4\\xd0\\xbd\\xd0\\xb5\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd0\\xbf\\xd0\\xbe\\xd0\\xb4\\xd0\\xbd\\xd0\\xb5\\0\"\n    \"\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd1\\x99\\xd0\\xb0\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd1\\x99\\xd0\\xb0\\xd0\\xba\\0\"\n    \"\\xd1\\x83\\xd1\\x82\\xd0\\xbe\\xd1\\x80\\xd0\\xb0\\xd0\\xba\\0\"\n    \"\\xd1\\x81\\xd1\\x80\\xd0\\xb8\\xd1\\x98\\xd0\\xb5\\xd0\\xb4\\xd0\\xb0\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82\\xd0\\xb2\\xd1\\x80\\xd1\\x82\\xd0\\xb0\\xd0\\xba\\0\"\n    \"\\xd0\\xbf\\xd0\\xb5\\xd1\\x82\\xd0\\xb0\\xd0\\xba\\0\"\n    \"\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\0\"\n    \"\\xd0\\xbf\\xd0\\xbe\\xd0\\xbd\\0\"\n    \"\\xd1\\x83\\xd1\\x82\\xd0\\xbe\\0\"\n    \"\\xd1\\x81\\xd1\\x80\\xd0\\xb8\\0\"\n    \"\\xd1\\x87\\xd0\\xb5\\xd1\\x82\\0\"\n    \"\\xd0\\xbf\\xd0\\xb5\\xd1\\x82\\0\"\n    \"\\xd1\\x81\\xd1\\x83\\xd0\\xb1\\0\"\n    \"\\xd1\\x83\\0\"\n    \"\\xd1\\x98\\xd0\\xb0\\xd0\\xbd\\xd1\\x83\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd1\\x84\\xd0\\xb5\\xd0\\xb1\\xd1\\x80\\xd1\\x83\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbf\\xd1\\x82\\xd0\\xb5\\xd0\\xbc\\xd0\\xb1\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xbe\\xd0\\xba\\xd1\\x82\\xd0\\xbe\\xd0\\xb1\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xbd\\xd0\\xbe\\xd0\\xb2\\xd0\\xb5\\xd0\\xbc\\xd0\\xb1\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd1\\x86\\xd0\\xb5\\xd0\\xbc\\xd0\\xb1\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd1\\x98\\xd0\\xb0\\xd0\\xbd\\0\"\n    \"\\xd1\\x84\\xd0\\xb5\\xd0\\xb1\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd1\\x80\\0\"\n    \"\\xd0\\xb0\\xd0\\xbf\\xd1\\x80\\0\"\n    \"\\xd1\\x98\\xd1\\x83\\xd0\\xbd\\0\"\n    \"\\xd1\\x98\\xd1\\x83\\xd0\\xbb\\0\"\n    \"\\xd0\\xb0\\xd0\\xb2\\xd0\\xb3\\0\"\n    \"\\xd1\\x81\\xd0\\xb5\\xd0\\xbf\\0\"\n    \"\\xd0\\xbe\\xd0\\xba\\xd1\\x82\\0\"\n    \"\\xd0\\xbd\\xd0\\xbe\\xd0\\xb2\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd1\\x86\\0\"\n    \"d. M. yy\\0\"\n    \"dd. MM. yy\\0\"\n    \"\\xd1\\x81\\xd1\\x80\\xd0\\xb5\\0\"\n    \"MMMM-yyyy\\0\"\n    \"dd MMM,yyyy\\0\"\n    \"yyyy-MM-dd.\\0\"\n    \"h.mm.ss tt\\0\"\n    \"dddd dd 'de' MMMM 'de' yyyy\\0\"\n    \"dd 'de' MMMM 'de' yyyy\\0\"\n    \",\\0\"\n    \"\\xd8\\xb1.\\xd8\\xb3.\\xe2\\x80\\x8f\\0\"\n    \"\\xd9\\xaa\\0\"\n    \"\\xd9\\x84\\xd9\\x8a\\xd8\\xb3\\xc2\\xa0\\xd8\\xb1\\xd9\\x82\\xd9\\x85\\0\"\n    \"\\xd8\\x89\\0\"\n    \"-Infinity\\0\"\n    \"Infinity\\0\"\n    \"\\xe2\\x80\\x8f+\\0\"\n    \"\\xc2\\xa0\\0\"\n    \"\\xd0\\xbb\\xd0\\xb2.\\0\"\n    \"%\\0\"\n    \"NaN\\0\"\n    \"\\xe2\\x80\\xb0\\0\"\n    \"+\\0\"\n    \"\\xe2\\x82\\xac\\0\"\n    \"-Infinit\\0\"\n    \"Infinit\\0\"\n    \"\\xc2\\xa5\\0\"\n    \"K\\xc4\\x8d\\0\"\n    \"-nekone\\xc4\\x8dno\\0\"\n    \"+nekone\\xc4\\x8dno\\0\"\n    \"kr\\0\"\n    \"-unendlich\\0\"\n    \"+unendlich\\0\"\n    \"-\\xce\\x86\\xcf\\x80\\xce\\xb5\\xce\\xb9\\xcf\\x81\\xce\\xbf\\0\"\n    \"\\xce\\x86\\xcf\\x80\\xce\\xb5\\xce\\xb9\\xcf\\x81\\xce\\xbf\\0\"\n    \"$\\0\"\n    \"-Infinito\\0\"\n    \"Infinito\\0\"\n    \"ep\\xc3\\xa4luku\\0\"\n    \"-Infini\\0\"\n    \"+Infini\\0\"\n    \"\\xe2\\x82\\xaa\\0\"\n    \"\\xe2\\x80\\x8e+\\0\"\n    \"Ft\\0\"\n    \"+Infinito\\0\"\n    \"\\xef\\xbf\\xa5\\0\"\n    \"\\xe2\\x82\\xa9\\0\"\n    \"-oneindig\\0\"\n    \"oneindig\\0\"\n    \"z\\xc5\\x82\\0\"\n    \"-niesko\\xc5\\x84\\x63zono\\xc5\\x9b\\xc4\\x87\\0\"\n    \"+niesko\\xc5\\x84\\x63zono\\xc5\\x9b\\xc4\\x87\\0\"\n    \"R$\\0\"\n    \"\\xe2\\x80\\x99\\0\"\n    \"CHF\\0\"\n    \"-infinit\\0\"\n    \"+infinit\\0\"\n    \"\\xd1\\x80\\xd1\\x83\\xd0\\xb1.\\0\"\n    \"\\xd0\\xbd\\xd0\\xb5\\xc2\\xa0\\xd1\\x87\\xd0\\xb8\\xd1\\x81\\xd0\\xbb\\xd0\\xbe\\0\"\n    \"-\\xd0\\xb1\\xd0\\xb5\\xd1\\x81\\xd0\\xba\\xd0\\xbe\\xd0\\xbd\\xd0\\xb5\\xd1\\x87\\xd0\\xbd\\xd0\\xbe\\xd1\\x81\\xd1\\x82\\xd1\\x8c\\0\"\n    \"\\xd0\\xb1\\xd0\\xb5\\xd1\\x81\\xd0\\xba\\xd0\\xbe\\xd0\\xbd\\xd0\\xb5\\xd1\\x87\\xd0\\xbd\\xd0\\xbe\\xd1\\x81\\xd1\\x82\\xd1\\x8c\\0\"\n    \"kn\\0\"\n    \"Lek\\xc3\\xab\\0\"\n    \"\\xc2\\xa4\\xc2\\xa4\\xc2\\xa4\\0\"\n    \"\\xe0\\xb8\\xbf\\0\"\n    \"\\xe2\\x82\\xba\\0\"\n    \"Rs\\0\"\n    \"\\xdb\\x8c\\xdb\\x81\\xc2\\xa0\\xd8\\xb9\\xd8\\xaf\\xd8\\xaf\\xc2\\xa0\\xd9\\x86\\xdb\\x81\\xdb\\x8c\\xda\\xba\\0\"\n    \"\\xe2\\x80\\x8e-\\xe2\\x80\\x8eInfinity\\0\"\n    \"\\xe2\\x80\\x8e-\\xe2\\x80\\x8e\\0\"\n    \"\\xe2\\x80\\x8e+\\xe2\\x80\\x8e\\0\"\n    \"Rp\\0\"\n    \"\\xe2\\x82\\xb4\\0\"\n    \"\\xd0\\x9d\\xd0\\xb5\\xc2\\xa0\\xd1\\x87\\xd0\\xb8\\xd1\\x81\\xd0\\xbb\\xd0\\xbe\\0\"\n    \"\\xd1\\x80.\\0\"\n    \"-neskon\\xc4\\x8dnost\\0\"\n    \"neskon\\xc4\\x8dnost\\0\"\n    \"nav\\xc2\\xa0skaitlis\\0\"\n    \"-bezgal\\xc4\\xab\\x62\\x61\\0\"\n    \"bezgal\\xc4\\xab\\x62\\x61\\0\"\n    \"Lt\\0\"\n    \"-begalyb\\xc4\\x97\\0\"\n    \"begalyb\\xc4\\x97\\0\"\n    \"\\xd8\\xb1\\xdb\\x8c\\xd8\\xa7\\xd9\\x84\\0\"\n    \"\\xd9\\x86\\xd8\\xa7\\xd8\\xb9\\xd8\\xaf\\xd8\\xaf\\0\"\n    \"\\xe2\\x80\\x8e\\xe2\\x88\\x92Infinity\\0\"\n    \"\\xe2\\x80\\x8e\\xe2\\x88\\x92\\0\"\n    \"\\xe2\\x82\\xab\\0\"\n    \"\\xd5\\xa4\\xd6\\x80.\\0\"\n    \"-Infinitu\\0\"\n    \"Infinitu\\0\"\n    \"\\xd0\\xb4\\xd0\\xb5\\xd0\\xbd\\0\"\n    \"I-NaN\\0\"\n    \"\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xc2\\xa0\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x98\\xe1\\x83\\xa1\\xc2\\xa0\\xe1\\x83\\xa0\\xe1\\x83\\x98\\xe1\\x83\\xaa\\xe1\\x83\\xae\\xe1\\x83\\x95\\xe1\\x83\\x98\\0\"\n    \"\\xe2\\x82\\xb9\\0\"\n    \"RM\\0\"\n    \"\\xd1\\x81\\xd0\\xb0\\xd0\\xbd\\xc2\\xa0\\xd1\\x8d\\xd0\\xbc\\xd0\\xb5\\xd1\\x81\\0\"\n    \"Ksh\\0\"\n    \"\\xe0\\xa6\\x9f\\xe0\\xa6\\xbe\\0\"\n    \"\\xe0\\xa6\\xb8\\xe0\\xa6\\x82\\xe0\\xa6\\x96\\xe0\\xa7\\x8d\\xe0\\xa6\\xaf\\xe0\\xa6\\xbe\\xc2\\xa0\\xe0\\xa6\\xa8\\xe0\\xa6\\xbe\\0\"\n    \"`\\0\"\n    \"\\xc2\\xa3\\0\"\n    \"\\xe1\\x9f\\x9b\\0\"\n    \"\\xe2\\x82\\xad\\0\"\n    \"\\xe0\\xba\\x9a\\xe0\\xbb\\x8d\\xe0\\xbb\\x88\\xe0\\xbb\\x81\\xe0\\xba\\xa1\\xe0\\xbb\\x88\\xe0\\xba\\x99\\xe0\\xbb\\x82\\xe0\\xba\\x95\\xe0\\xbb\\x80\\xe0\\xba\\xa5\\xe0\\xba\\x81\\0\"\n    \"\\xe0\\xb6\\xbb\\xe0\\xb7\\x94.\\0\"\n    \"\\xe1\\x89\\xa5\\xe1\\x88\\xad\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa5\\x87\\xe0\\xa4\\xb0\\xe0\\xa5\\x82\\0\"\n    \"\\xd8\\x8b\\0\"\n    \"\\xe2\\x82\\xb1\\0\"\n    \"\\xe2\\x82\\xa6\\0\"\n    \"RF\\0\"\n    \"NT$\\0\"\n    \"\\xe9\\x9d\\x9e\\xe6\\x95\\xb8\\xe5\\x80\\xbc\\0\"\n    \"\\xd1\\x81\\xd0\\xbe\\xd0\\xbc\\0\"\n    \"man.\\0\"\n    \"so\\xca\\xbbm\\0\"\n    \"\\xd8\\xaf.\\xd8\\xb9.\\xe2\\x80\\x8f\\0\"\n    \"'\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd0\\xbd.\\0\"\n    \"\\xd1\\x81\\xd1\\x9e\\xd0\\xbc\\0\"\n    \"\\xe0\\xa7\\xb3\\0\"\n    \"\\xd8\\xac.\\xd9\\x85.\\xe2\\x80\\x8f\\0\"\n    \"\\xd8\\xaf.\\xd9\\x84.\\xe2\\x80\\x8f\\0\"\n    \"KM\\0\"\n    \"\\xd8\\xaf.\\xd8\\xac.\\xe2\\x80\\x8f\\0\"\n    \"MOP$\\0\"\n    \"\\xe2\\x82\\xa1\\0\"\n    \"\\xd8\\xaf.\\xd9\\x85.\\xe2\\x80\\x8f\\0\"\n    \"B/.\\0\"\n    \"\\xd8\\xaf.\\xd8\\xaa.\\xe2\\x80\\x8f\\0\"\n    \"\\xd0\\x9a\\xd0\\x9c\\0\"\n    \"\\xd8\\xb1.\\xd8\\xb9.\\xe2\\x80\\x8f\\0\"\n    \"Bs.\\0\"\n    \"\\xd8\\xb1.\\xd9\\x8a.\\xe2\\x80\\x8f\\0\"\n    \"din.\\0\"\n    \"\\xd9\\x84.\\xd8\\xb3.\\xe2\\x80\\x8f\\0\"\n    \"S/.\\0\"\n    \"\\xd0\\xb4\\xd0\\xb8\\xd0\\xbd.\\0\"\n    \"\\xd8\\xaf.\\xd8\\xa3.\\xe2\\x80\\x8f\\0\"\n    \"\\xd9\\x84.\\xd9\\x84.\\xe2\\x80\\x8f\\0\"\n    \"\\xd8\\xaf.\\xd9\\x83.\\xe2\\x80\\x8f\\0\"\n    \"\\xd8\\xaf.\\xd8\\xa5.\\xe2\\x80\\x8f\\0\"\n    \"\\xd8\\xaf.\\xd8\\xa8.\\xe2\\x80\\x8f\\0\"\n    \"\\xe2\\x82\\xb2\\0\"\n    \"\\xd8\\xb1.\\xd9\\x82.\\xe2\\x80\\x8f\\0\"\n    \"Bs\\0\"\n    \"C$\\0\"\n    \"\\xd0\\x94\\xd0\\xb8\\xd0\\xbd.\\0\"\n    \"Din.\\0\"\n    \"HK$\\0\"\n    \"ar\\0\"\n    \"Arabic\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9\\0\"\n    \"ARA\\0\"\n    \"ara\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xaa\\xd9\\x82\\xd9\\x88\\xd9\\x8a\\xd9\\x85 \\xd8\\xa7\\xd9\\x84\\xd9\\x87\\xd8\\xac\\xd8\\xb1\\xd9\\x8a\\0\"\n    \"bg\\0\"\n    \"Bulgarian\\0\"\n    \"\\xd0\\xb1\\xd1\\x8a\\xd0\\xbb\\xd0\\xb3\\xd0\\xb0\\xd1\\x80\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\0\"\n    \"BGR\\0\"\n    \"bul\\0\"\n    \"\\xd0\\x93\\xd1\\x80\\xd0\\xb8\\xd0\\xb3\\xd0\\xbe\\xd1\\x80\\xd0\\xb8\\xd0\\xb0\\xd0\\xbd\\xd1\\x81\\xd0\\xba\\xd0\\xb8 \\xd0\\xba\\xd0\\xb0\\xd0\\xbb\\xd0\\xb5\\xd0\\xbd\\xd0\\xb4\\xd0\\xb0\\xd1\\x80\\0\"\n    \"ca\\0\"\n    \"Catalan\\0\"\n    \"catal\\xc3\\xa0\\0\"\n    \"CAT\\0\"\n    \"cat\\0\"\n    \"calendari gregori\\xc3\\xa0\\0\"\n    \"zh-CHS\\0\"\n    \"Chinese (Simplified) Legacy\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87\\0\"\n    \"CHS\\0\"\n    \"zho\\0\"\n    \"zh\\0\"\n    \"\\xe5\\x85\\xac\\xe5\\x8e\\x86\\0\"\n    \"zh-Hans\\0\"\n    \"Chinese (Simplified)\\0\"\n    \"cs\\0\"\n    \"Czech\\0\"\n    \"\\xc4\\x8d\\x65\\xc5\\xa1tina\\0\"\n    \"CSY\\0\"\n    \"ces\\0\"\n    \"Gregori\\xc3\\xa1nsk\\xc3\\xbd kalend\\xc3\\xa1\\xc5\\x99\\0\"\n    \"da\\0\"\n    \"Danish\\0\"\n    \"dansk\\0\"\n    \"DAN\\0\"\n    \"dan\\0\"\n    \"gregoriansk kalender\\0\"\n    \"de\\0\"\n    \"German\\0\"\n    \"Deutsch\\0\"\n    \"DEU\\0\"\n    \"deu\\0\"\n    \"Gregorianischer Kalender\\0\"\n    \"el\\0\"\n    \"Greek\\0\"\n    \"\\xce\\x95\\xce\\xbb\\xce\\xbb\\xce\\xb7\\xce\\xbd\\xce\\xb9\\xce\\xba\\xce\\xac\\0\"\n    \"ELL\\0\"\n    \"ell\\0\"\n    \"\\xce\\x93\\xcf\\x81\\xce\\xb7\\xce\\xb3\\xce\\xbf\\xcf\\x81\\xce\\xb9\\xce\\xb1\\xce\\xbd\\xcf\\x8c \\xce\\xb7\\xce\\xbc\\xce\\xb5\\xcf\\x81\\xce\\xbf\\xce\\xbb\\xcf\\x8c\\xce\\xb3\\xce\\xb9\\xce\\xbf\\0\"\n    \"en\\0\"\n    \"English\\0\"\n    \"ENU\\0\"\n    \"eng\\0\"\n    \"Gregorian Calendar\\0\"\n    \"es\\0\"\n    \"Spanish\\0\"\n    \"espa\\xc3\\xb1ol\\0\"\n    \"ESP\\0\"\n    \"spa\\0\"\n    \"calendario gregoriano\\0\"\n    \"fi\\0\"\n    \"Finnish\\0\"\n    \"suomi\\0\"\n    \"FIN\\0\"\n    \"fin\\0\"\n    \"gregoriaaninen kalenteri\\0\"\n    \"fr\\0\"\n    \"French\\0\"\n    \"fran\\xc3\\xa7\\x61is\\0\"\n    \"FRA\\0\"\n    \"fra\\0\"\n    \"calendrier gr\\xc3\\xa9gorien\\0\"\n    \"he\\0\"\n    \"Hebrew\\0\"\n    \"\\xd7\\xa2\\xd7\\x91\\xd7\\xa8\\xd7\\x99\\xd7\\xaa\\0\"\n    \"HEB\\0\"\n    \"heb\\0\"\n    \"\\xd7\\x9c\\xd7\\x95\\xd7\\x97 \\xd7\\xa9\\xd7\\xa0\\xd7\\x94 \\xd7\\x92\\xd7\\xa8\\xd7\\x92\\xd7\\x95\\xd7\\xa8\\xd7\\x99\\xd7\\x90\\xd7\\xa0\\xd7\\x99\\0\"\n    \"hu\\0\"\n    \"Hungarian\\0\"\n    \"magyar\\0\"\n    \"HUN\\0\"\n    \"hun\\0\"\n    \"Gergely-napt\\xc3\\xa1r\\0\"\n    \"is\\0\"\n    \"Icelandic\\0\"\n    \"\\xc3\\xadslenska\\0\"\n    \"ISL\\0\"\n    \"isl\\0\"\n    \"Gregor\\xc3\\xadskt dagatal\\0\"\n    \"it\\0\"\n    \"Italian\\0\"\n    \"italiano\\0\"\n    \"ITA\\0\"\n    \"ita\\0\"\n    \"Calendario gregoriano\\0\"\n    \"ja\\0\"\n    \"Japanese\\0\"\n    \"\\xe6\\x97\\xa5\\xe6\\x9c\\xac\\xe8\\xaa\\x9e\\0\"\n    \"JPN\\0\"\n    \"jpn\\0\"\n    \"\\xe8\\xa5\\xbf\\xe6\\x9a\\xa6(\\xe3\\x82\\xb0\\xe3\\x83\\xac\\xe3\\x82\\xb4\\xe3\\x83\\xaa\\xe3\\x82\\xaa\\xe6\\x9a\\xa6)\\0\"\n    \"ko\\0\"\n    \"Korean\\0\"\n    \"\\xed\\x95\\x9c\\xea\\xb5\\xad\\xec\\x96\\xb4\\0\"\n    \"KOR\\0\"\n    \"kor\\0\"\n    \"\\xed\\x83\\x9c\\xec\\x96\\x91\\xeb\\xa0\\xa5\\0\"\n    \"nl\\0\"\n    \"Dutch\\0\"\n    \"Nederlands\\0\"\n    \"NLD\\0\"\n    \"nld\\0\"\n    \"Gregoriaanse kalender\\0\"\n    \"no\\0\"\n    \"Norwegian\\0\"\n    \"norsk\\0\"\n    \"NOR\\0\"\n    \"nob\\0\"\n    \"nb\\0\"\n    \"pl\\0\"\n    \"Polish\\0\"\n    \"polski\\0\"\n    \"PLK\\0\"\n    \"pol\\0\"\n    \"kalendarz gregoria\\xc5\\x84ski\\0\"\n    \"pt\\0\"\n    \"Portuguese\\0\"\n    \"portugu\\xc3\\xaas\\0\"\n    \"PTB\\0\"\n    \"por\\0\"\n    \"Calend\\xc3\\xa1rio Gregoriano\\0\"\n    \"rm\\0\"\n    \"Romansh\\0\"\n    \"rumantsch\\0\"\n    \"RMC\\0\"\n    \"roh\\0\"\n    \"chalender gregorian\\0\"\n    \"ro\\0\"\n    \"Romanian\\0\"\n    \"rom\\xc3\\xa2n\\xc4\\x83\\0\"\n    \"ROM\\0\"\n    \"ron\\0\"\n    \"calendar gregorian\\0\"\n    \"ru\\0\"\n    \"Russian\\0\"\n    \"\\xd1\\x80\\xd1\\x83\\xd1\\x81\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\xd0\\xb9\\0\"\n    \"RUS\\0\"\n    \"rus\\0\"\n    \"\\xd0\\x93\\xd1\\x80\\xd0\\xb8\\xd0\\xb3\\xd0\\xbe\\xd1\\x80\\xd0\\xb8\\xd0\\xb0\\xd0\\xbd\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\xd0\\xb9 \\xd0\\xba\\xd0\\xb0\\xd0\\xbb\\xd0\\xb5\\xd0\\xbd\\xd0\\xb4\\xd0\\xb0\\xd1\\x80\\xd1\\x8c\\0\"\n    \"hr\\0\"\n    \"Croatian\\0\"\n    \"hrvatski\\0\"\n    \"HRV\\0\"\n    \"hrv\\0\"\n    \"gregorijanski kalendar\\0\"\n    \"Slovak\\0\"\n    \"sloven\\xc4\\x8dina\\0\"\n    \"SKY\\0\"\n    \"slk\\0\"\n    \"Gregori\\xc3\\xa1nsky kalend\\xc3\\xa1r\\0\"\n    \"sq\\0\"\n    \"Albanian\\0\"\n    \"Shqip\\0\"\n    \"SQI\\0\"\n    \"sqi\\0\"\n    \"Kalendari Gregorian\\0\"\n    \"sv\\0\"\n    \"Swedish\\0\"\n    \"svenska\\0\"\n    \"SVE\\0\"\n    \"swe\\0\"\n    \"th\\0\"\n    \"Thai\\0\"\n    \"\\xe0\\xb9\\x84\\xe0\\xb8\\x97\\xe0\\xb8\\xa2\\0\"\n    \"THA\\0\"\n    \"tha\\0\"\n    \"\\xe0\\xb8\\x9b\\xe0\\xb8\\x8f\\xe0\\xb8\\xb4\\xe0\\xb8\\x97\\xe0\\xb8\\xb4\\xe0\\xb8\\x99\\xe0\\xb8\\x9e\\xe0\\xb8\\xb8\\xe0\\xb8\\x97\\xe0\\xb8\\x98\\0\"\n    \"Turkish\\0\"\n    \"T\\xc3\\xbcrk\\xc3\\xa7\\x65\\0\"\n    \"TRK\\0\"\n    \"tur\\0\"\n    \"Miladi Takvim\\0\"\n    \"ur\\0\"\n    \"Urdu\\0\"\n    \"\\xd8\\xa7\\xd8\\xb1\\xd8\\xaf\\xd9\\x88\\0\"\n    \"URD\\0\"\n    \"urd\\0\"\n    \"\\xd8\\xac\\xd8\\xa7\\xd8\\xb1\\xd8\\xac\\xdb\\x8c\\xd8\\xa7\\xd8\\xa6\\xdb\\x8c \\xda\\xa9\\xdb\\x8c\\xd9\\x84\\xd9\\x86\\xda\\x88\\xd8\\xb1\\0\"\n    \"id\\0\"\n    \"Indonesian\\0\"\n    \"Bahasa Indonesia\\0\"\n    \"IND\\0\"\n    \"ind\\0\"\n    \"Kalender Gregorian\\0\"\n    \"uk\\0\"\n    \"Ukrainian\\0\"\n    \"\\xd1\\x83\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\xd1\\x97\\xd0\\xbd\\xd1\\x81\\xd1\\x8c\\xd0\\xba\\xd0\\xb0\\0\"\n    \"UKR\\0\"\n    \"ukr\\0\"\n    \"\\xd0\\x93\\xd1\\x80\\xd0\\xb8\\xd0\\xb3\\xd0\\xbe\\xd1\\x80\\xd1\\x96\\xd0\\xb0\\xd0\\xbd\\xd1\\x81\\xd1\\x8c\\xd0\\xba\\xd0\\xb8\\xd0\\xb9 \\xd0\\xba\\xd0\\xb0\\xd0\\xbb\\xd0\\xb5\\xd0\\xbd\\xd0\\xb4\\xd0\\xb0\\xd1\\x80\\0\"\n    \"be\\0\"\n    \"Belarusian\\0\"\n    \"\\xd0\\xb1\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\xd1\\x80\\xd1\\x83\\xd1\\x81\\xd0\\xba\\xd0\\xb0\\xd1\\x8f\\0\"\n    \"BEL\\0\"\n    \"bel\\0\"\n    \"\\xd0\\xb3\\xd1\\x80\\xd1\\x8d\\xd0\\xb3\\xd0\\xb0\\xd1\\x80\\xd1\\x8b\\xd1\\x8f\\xd0\\xbd\\xd1\\x81\\xd0\\xba\\xd1\\x96 \\xd0\\xba\\xd0\\xb0\\xd0\\xbb\\xd1\\x8f\\xd0\\xbd\\xd0\\xb4\\xd0\\xb0\\xd1\\x80\\0\"\n    \"sl\\0\"\n    \"Slovenian\\0\"\n    \"sloven\\xc5\\xa1\\xc4\\x8dina\\0\"\n    \"SLV\\0\"\n    \"slv\\0\"\n    \"gregorijanski koledar\\0\"\n    \"et\\0\"\n    \"Estonian\\0\"\n    \"eesti\\0\"\n    \"ETI\\0\"\n    \"est\\0\"\n    \"Gregoriuse kalender\\0\"\n    \"lv\\0\"\n    \"Latvian\\0\"\n    \"latvie\\xc5\\xa1u\\0\"\n    \"LVI\\0\"\n    \"lav\\0\"\n    \"Gregora kalend\\xc4\\x81rs\\0\"\n    \"lt\\0\"\n    \"Lithuanian\\0\"\n    \"lietuvi\\xc5\\xb3\\0\"\n    \"LTH\\0\"\n    \"lit\\0\"\n    \"Grigaliaus kalendorius\\0\"\n    \"tg\\0\"\n    \"Tajik\\0\"\n    \"\\xd0\\xa2\\xd0\\xbe\\xd2\\xb7\\xd0\\xb8\\xd0\\xba\\xd3\\xa3\\0\"\n    \"TAJ\\0\"\n    \"tgk\\0\"\n    \"fa\\0\"\n    \"Persian\\0\"\n    \"\\xd9\\x81\\xd8\\xa7\\xd8\\xb1\\xd8\\xb3\\xdb\\x8c\\0\"\n    \"FAR\\0\"\n    \"fas\\0\"\n    \"\\xd8\\xaa\\xd9\\x82\\xd9\\x88\\xdb\\x8c\\xd9\\x85 \\xd9\\x85\\xdb\\x8c\\xd9\\x84\\xd8\\xa7\\xd8\\xaf\\xdb\\x8c\\0\"\n    \"vi\\0\"\n    \"Vietnamese\\0\"\n    \"Ti\\xe1\\xba\\xbfng Vi\\xe1\\xbb\\x87t\\0\"\n    \"VIT\\0\"\n    \"L\\xe1\\xbb\\x8b\\x63h Gregory\\0\"\n    \"hy\\0\"\n    \"Armenian\\0\"\n    \"\\xd5\\xb0\\xd5\\xa1\\xd5\\xb5\\xd5\\xa5\\xd6\\x80\\xd5\\xa5\\xd5\\xb6\\0\"\n    \"HYE\\0\"\n    \"hye\\0\"\n    \"\\xd4\\xb3\\xd6\\x80\\xd5\\xab\\xd5\\xa3\\xd5\\xb8\\xd6\\x80\\xd5\\xb5\\xd5\\xa1\\xd5\\xb6 \\xd5\\xbf\\xd5\\xb8\\xd5\\xb4\\xd5\\xa1\\xd6\\x80\\0\"\n    \"az\\0\"\n    \"Azerbaijani\\0\"\n    \"az\\xc9\\x99rbaycan\\0\"\n    \"AZE\\0\"\n    \"aze\\0\"\n    \"Qreqorian T\\xc9\\x99qvimi\\0\"\n    \"eu\\0\"\n    \"Basque\\0\"\n    \"euskara\\0\"\n    \"EUQ\\0\"\n    \"eus\\0\"\n    \"Egutegi gregoriarra\\0\"\n    \"mk\\0\"\n    \"Macedonian\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd0\\xba\\xd0\\xb5\\xd0\\xb4\\xd0\\xbe\\xd0\\xbd\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\0\"\n    \"MKI\\0\"\n    \"mkd\\0\"\n    \"\\xd0\\x93\\xd1\\x80\\xd0\\xb5\\xd0\\xb3\\xd0\\xbe\\xd1\\x80\\xd0\\xb8\\xd1\\x98\\xd0\\xb0\\xd0\\xbd\\xd1\\x81\\xd0\\xba\\xd0\\xb8 \\xd0\\xba\\xd0\\xb0\\xd0\\xbb\\xd0\\xb5\\xd0\\xbd\\xd0\\xb4\\xd0\\xb0\\xd1\\x80\\0\"\n    \"tn\\0\"\n    \"Tswana\\0\"\n    \"Setswana\\0\"\n    \"TSN\\0\"\n    \"tsn\\0\"\n    \"xh\\0\"\n    \"Xhosa\\0\"\n    \"isiXhosa\\0\"\n    \"XHO\\0\"\n    \"xho\\0\"\n    \"zu\\0\"\n    \"Zulu\\0\"\n    \"isiZulu\\0\"\n    \"ZUL\\0\"\n    \"zul\\0\"\n    \"i-Gregorian Calender\\0\"\n    \"af\\0\"\n    \"Afrikaans\\0\"\n    \"AFK\\0\"\n    \"afr\\0\"\n    \"Gregoriese kalender\\0\"\n    \"ka\\0\"\n    \"Georgian\\0\"\n    \"\\xe1\\x83\\xa5\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x97\\xe1\\x83\\xa3\\xe1\\x83\\x9a\\xe1\\x83\\x98\\0\"\n    \"KAT\\0\"\n    \"kat\\0\"\n    \"\\xe1\\x83\\x92\\xe1\\x83\\xa0\\xe1\\x83\\x98\\xe1\\x83\\x92\\xe1\\x83\\x9d\\xe1\\x83\\xa0\\xe1\\x83\\x98\\xe1\\x83\\x90\\xe1\\x83\\x9c\\xe1\\x83\\xa3\\xe1\\x83\\x9a\\xe1\\x83\\x98 \\xe1\\x83\\x99\\xe1\\x83\\x90\\xe1\\x83\\x9a\\xe1\\x83\\x94\\xe1\\x83\\x9c\\xe1\\x83\\x93\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x98\\0\"\n    \"fo\\0\"\n    \"Faroese\\0\"\n    \"f\\xc3\\xb8royskt\\0\"\n    \"FOS\\0\"\n    \"fao\\0\"\n    \"hi\\0\"\n    \"Hindi\\0\"\n    \"\\xe0\\xa4\\xb9\\xe0\\xa4\\xbf\\xe0\\xa4\\x82\\xe0\\xa4\\xa6\\xe0\\xa5\\x80\\0\"\n    \"HIN\\0\"\n    \"hin\\0\"\n    \"\\xe0\\xa4\\x97\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa5\\x87\\xe0\\xa4\\x97\\xe0\\xa5\\x8b\\xe0\\xa4\\xb0\\xe0\\xa4\\xbf\\xe0\\xa4\\xaf\\xe0\\xa4\\xa8 \\xe0\\xa4\\x95\\xe0\\xa5\\x88\\xe0\\xa4\\xb2\\xe0\\xa5\\x87\\xe0\\xa4\\x82\\xe0\\xa4\\xa1\\xe0\\xa4\\xb0\\0\"\n    \"mt\\0\"\n    \"Maltese\\0\"\n    \"Malti\\0\"\n    \"MLT\\0\"\n    \"mlt\\0\"\n    \"Kalendarju Gregorjan\\0\"\n    \"se\\0\"\n    \"Northern Sami\\0\"\n    \"davvis\\xc3\\xa1megiella\\0\"\n    \"SME\\0\"\n    \"sme\\0\"\n    \"gregoria kaleander\\0\"\n    \"ga\\0\"\n    \"Irish\\0\"\n    \"Gaeilge\\0\"\n    \"IRE\\0\"\n    \"gle\\0\"\n    \"F\\xc3\\xa9ilire Greag\\xc3\\xb3rach\\0\"\n    \"ms\\0\"\n    \"Malay\\0\"\n    \"Bahasa Melayu\\0\"\n    \"MSL\\0\"\n    \"msa\\0\"\n    \"Kalendar Gregory\\0\"\n    \"kk\\0\"\n    \"Kazakh\\0\"\n    \"\\xd2\\x9b\\xd0\\xb0\\xd0\\xb7\\xd0\\xb0\\xd2\\x9b \\xd1\\x82\\xd1\\x96\\xd0\\xbb\\xd1\\x96\\0\"\n    \"KKZ\\0\"\n    \"kaz\\0\"\n    \"\\xd0\\x93\\xd1\\x80\\xd0\\xb5\\xd0\\xb3\\xd0\\xbe\\xd1\\x80\\xd0\\xb8\\xd0\\xb0\\xd0\\xbd\\xd0\\xb4\\xd1\\x8b\\xd2\\x9b \\xd0\\xba\\xd2\\xaf\\xd0\\xbd\\xd1\\x82\\xd1\\x96\\xd0\\xb7\\xd0\\xb1\\xd0\\xb5\\0\"\n    \"ky\\0\"\n    \"Kyrgyz\\0\"\n    \"\\xd0\\xba\\xd1\\x8b\\xd1\\x80\\xd0\\xb3\\xd1\\x8b\\xd0\\xb7\\xd1\\x87\\xd0\\xb0\\0\"\n    \"KYR\\0\"\n    \"kir\\0\"\n    \"\\xd0\\x93\\xd1\\x80\\xd0\\xb8\\xd0\\xb3\\xd0\\xbe\\xd1\\x80\\xd0\\xb8\\xd0\\xb0\\xd0\\xbd \\xd0\\xba\\xd0\\xb0\\xd0\\xbb\\xd0\\xb5\\xd0\\xbd\\xd0\\xb4\\xd0\\xb0\\xd1\\x80\\xd1\\x8b\\0\"\n    \"sw\\0\"\n    \"Swahili\\0\"\n    \"Kiswahili\\0\"\n    \"SWK\\0\"\n    \"swa\\0\"\n    \"Kalenda ya Kigregori\\0\"\n    \"uz\\0\"\n    \"Uzbek\\0\"\n    \"o\\xca\\xbbzbekcha\\0\"\n    \"UZB\\0\"\n    \"uzb\\0\"\n    \"Grigorian kalendari\\0\"\n    \"bn\\0\"\n    \"Bengali\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\x82\\xe0\\xa6\\xb2\\xe0\\xa6\\xbe\\0\"\n    \"BNG\\0\"\n    \"bng\\0\"\n    \"\\xe0\\xa6\\x97\\xe0\\xa7\\x8d\\xe0\\xa6\\xb0\\xe0\\xa6\\xbf\\xe0\\xa6\\x97\\xe0\\xa7\\x8b\\xe0\\xa6\\xb0\\xe0\\xa6\\xbf\\xe0\\xa6\\xaf\\xe0\\xa6\\xbc\\xe0\\xa6\\xbe\\xe0\\xa6\\xa8 \\xe0\\xa6\\xac\\xe0\\xa6\\xb0\\xe0\\xa7\\x8d\\xe0\\xa6\\xb7\\xe0\\xa6\\xaa\\xe0\\xa6\\x9e\\xe0\\xa7\\x8d\\xe0\\xa6\\x9c\\xe0\\xa7\\x80\\0\"\n    \"pa\\0\"\n    \"Punjabi\\0\"\n    \"\\xe0\\xa8\\xaa\\xe0\\xa9\\xb0\\xe0\\xa8\\x9c\\xe0\\xa8\\xbe\\xe0\\xa8\\xac\\xe0\\xa9\\x80\\0\"\n    \"PAN\\0\"\n    \"pan\\0\"\n    \"\\xe0\\xa8\\x97\\xe0\\xa8\\xb0\\xe0\\xa9\\x80\\xe0\\xa8\\x9c\\xe0\\xa9\\x8b\\xe0\\xa8\\xb0\\xe0\\xa9\\x80\\xe0\\xa8\\x85\\xe0\\xa8\\xa8 \\xe0\\xa8\\x95\\xe0\\xa9\\x88\\xe0\\xa8\\xb2\\xe0\\xa9\\xb0\\xe0\\xa8\\xa1\\xe0\\xa8\\xb0\\0\"\n    \"gu\\0\"\n    \"Gujarati\\0\"\n    \"\\xe0\\xaa\\x97\\xe0\\xab\\x81\\xe0\\xaa\\x9c\\xe0\\xaa\\xb0\\xe0\\xaa\\xbe\\xe0\\xaa\\xa4\\xe0\\xab\\x80\\0\"\n    \"GUJ\\0\"\n    \"guj\\0\"\n    \"\\xe0\\xaa\\x97\\xe0\\xab\\x8d\\xe0\\xaa\\xb0\\xe0\\xab\\x87\\xe0\\xaa\\x97\\xe0\\xab\\x8b\\xe0\\xaa\\xb0\\xe0\\xaa\\xbf\\xe0\\xaa\\xaf\\xe0\\xaa\\xa8 \\xe0\\xaa\\x95\\xe0\\xab\\x87\\xe0\\xaa\\xb2\\xe0\\xab\\x87\\xe0\\xaa\\xa8\\xe0\\xab\\x8d\\xe0\\xaa\\xa1\\xe0\\xaa\\xb0\\0\"\n    \"or\\0\"\n    \"Oriya\\0\"\n    \"\\xe0\\xac\\x93\\xe0\\xac\\xa1\\xe0\\xac\\xbc\\xe0\\xac\\xbf\\xe0\\xac\\x86\\0\"\n    \"ORI\\0\"\n    \"ori\\0\"\n    \"ta\\0\"\n    \"Tamil\\0\"\n    \"\\xe0\\xae\\xa4\\xe0\\xae\\xae\\xe0\\xae\\xbf\\xe0\\xae\\xb4\\xe0\\xaf\\x8d\\0\"\n    \"TAM\\0\"\n    \"tam\\0\"\n    \"\\xe0\\xae\\x95\\xe0\\xae\\xbf\\xe0\\xae\\xb0\\xe0\\xae\\xbf\\xe0\\xae\\x95\\xe0\\xaf\\x8b\\xe0\\xae\\xb0\\xe0\\xae\\xbf\\xe0\\xae\\xaf\\xe0\\xae\\xa9\\xe0\\xaf\\x8d \\xe0\\xae\\xa8\\xe0\\xae\\xbe\\xe0\\xae\\xb3\\xe0\\xaf\\x8d\\xe0\\xae\\x95\\xe0\\xae\\xbe\\xe0\\xae\\x9f\\xe0\\xaf\\x8d\\xe0\\xae\\x9f\\xe0\\xae\\xbf\\0\"\n    \"te\\0\"\n    \"Telugu\\0\"\n    \"\\xe0\\xb0\\xa4\\xe0\\xb1\\x86\\xe0\\xb0\\xb2\\xe0\\xb1\\x81\\xe0\\xb0\\x97\\xe0\\xb1\\x81\\0\"\n    \"TEL\\0\"\n    \"tel\\0\"\n    \"\\xe0\\xb0\\x97\\xe0\\xb1\\x8d\\xe0\\xb0\\xb0\\xe0\\xb1\\x87\\xe0\\xb0\\x97\\xe0\\xb1\\x8b\\xe0\\xb0\\xb0\\xe0\\xb0\\xbf\\xe0\\xb0\\xaf\\xe0\\xb0\\xa8\\xe0\\xb1\\x8d \\xe0\\xb0\\x95\\xe0\\xb1\\x8d\\xe0\\xb0\\xaf\\xe0\\xb0\\xbe\\xe0\\xb0\\xb2\\xe0\\xb1\\x86\\xe0\\xb0\\x82\\xe0\\xb0\\xa1\\xe0\\xb0\\xb0\\xe0\\xb1\\x8d\\0\"\n    \"Kannada\\0\"\n    \"\\xe0\\xb2\\x95\\xe0\\xb2\\xa8\\xe0\\xb3\\x8d\\xe0\\xb2\\xa8\\xe0\\xb2\\xa1\\0\"\n    \"KDI\\0\"\n    \"kan\\0\"\n    \"\\xe0\\xb2\\x97\\xe0\\xb3\\x8d\\xe0\\xb2\\xb0\\xe0\\xb2\\xbf\\xe0\\xb2\\x97\\xe0\\xb3\\x8b\\xe0\\xb2\\xb0\\xe0\\xb2\\xbf\\xe0\\xb2\\xaf\\xe0\\xb2\\xa8\\xe0\\xb3\\x8d \\xe0\\xb2\\x95\\xe0\\xb3\\x8d\\xe0\\xb2\\xaf\\xe0\\xb2\\xbe\\xe0\\xb2\\xb2\\xe0\\xb3\\x86\\xe0\\xb2\\x82\\xe0\\xb2\\xa1\\xe0\\xb2\\xb0\\xe0\\xb3\\x8d\\0\"\n    \"ml\\0\"\n    \"Malayalam\\0\"\n    \"\\xe0\\xb4\\xae\\xe0\\xb4\\xb2\\xe0\\xb4\\xaf\\xe0\\xb4\\xbe\\xe0\\xb4\\xb3\\xe0\\xb4\\x82\\0\"\n    \"MYM\\0\"\n    \"mym\\0\"\n    \"\\xe0\\xb4\\x87\\xe0\\xb4\\x82\\xe0\\xb4\\x97\\xe0\\xb5\\x8d\\xe0\\xb4\\xb2\\xe0\\xb5\\x80\\xe0\\xb4\\xb7\\xe0\\xb5\\x8d \\xe0\\xb4\\x95\\xe0\\xb4\\xb2\\xe0\\xb4\\xa3\\xe0\\xb5\\x8d\\xe0\\xb4\\x9f\\xe0\\xb5\\xbc\\0\"\n    \"as\\0\"\n    \"Assamese\\0\"\n    \"\\xe0\\xa6\\x85\\xe0\\xa6\\xb8\\xe0\\xa6\\xae\\xe0\\xa7\\x80\\xe0\\xa6\\xaf\\xe0\\xa6\\xbc\\xe0\\xa6\\xbe\\0\"\n    \"ASM\\0\"\n    \"asm\\0\"\n    \"\\xe0\\xa6\\x97\\xe0\\xa7\\x8d\\xe0\\xa7\\xb0\\xe0\\xa6\\xbf\\xe0\\xa6\\x97\\xe0\\xa7\\x8b\\xe0\\xa7\\xb0\\xe0\\xa7\\x80\\xe0\\xa6\\xaf\\xe0\\xa6\\xbc \\xe0\\xa6\\xaa\\xe0\\xa6\\x9e\\xe0\\xa7\\x8d\\xe0\\xa6\\x9c\\xe0\\xa6\\xbf\\xe0\\xa6\\x95\\xe0\\xa6\\xbe\\0\"\n    \"mr\\0\"\n    \"Marathi\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\xb0\\xe0\\xa4\\xbe\\xe0\\xa4\\xa0\\xe0\\xa5\\x80\\0\"\n    \"MAR\\0\"\n    \"\\xe0\\xa4\\x97\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa5\\x87\\xe0\\xa4\\x97\\xe0\\xa5\\x8b\\xe0\\xa4\\xb0\\xe0\\xa4\\xbf\\xe0\\xa4\\xaf\\xe0\\xa4\\xa8 \\xe0\\xa4\\xa6\\xe0\\xa4\\xbf\\xe0\\xa4\\xa8\\xe0\\xa4\\xa6\\xe0\\xa4\\xb0\\xe0\\xa5\\x8d\\xe0\\xa4\\xb6\\xe0\\xa4\\xbf\\xe0\\xa4\\x95\\xe0\\xa4\\xbe\\0\"\n    \"mn\\0\"\n    \"Mongolian\\0\"\n    \"\\xd0\\xbc\\xd0\\xbe\\xd0\\xbd\\xd0\\xb3\\xd0\\xbe\\xd0\\xbb\\0\"\n    \"MON\\0\"\n    \"mon\\0\"\n    \"\\xd0\\xb3\\xd1\\x80\\xd0\\xb5\\xd0\\xb3\\xd0\\xbe\\xd1\\x80\\xd0\\xb8\\xd0\\xb9\\xd0\\xbd \\xd1\\x85\\xd1\\x83\\xd0\\xb0\\xd0\\xbd\\xd0\\xbb\\xd0\\xb8\\0\"\n    \"bo\\0\"\n    \"Tibetan\\0\"\n    \"\\xe0\\xbd\\x94\\xe0\\xbd\\xbc\\xe0\\xbd\\x91\\xe0\\xbc\\x8b\\xe0\\xbd\\xa6\\xe0\\xbe\\x90\\xe0\\xbd\\x91\\xe0\\xbc\\x8b\\0\"\n    \"BOB\\0\"\n    \"bod\\0\"\n    \"cy\\0\"\n    \"Welsh\\0\"\n    \"Cymraeg\\0\"\n    \"CYM\\0\"\n    \"cym\\0\"\n    \"Calendr Gregori\\0\"\n    \"km\\0\"\n    \"Khmer\\0\"\n    \"\\xe1\\x9e\\x81\\xe1\\x9f\\x92\\xe1\\x9e\\x98\\xe1\\x9f\\x82\\xe1\\x9e\\x9a\\0\"\n    \"KHM\\0\"\n    \"khm\\0\"\n    \"\\xe1\\x9e\\x94\\xe1\\x9f\\x92\\xe1\\x9e\\x9a\\xe1\\x9e\\x8f\\xe1\\x9e\\xb7\\xe1\\x9e\\x91\\xe1\\x9e\\xb7\\xe1\\x9e\\x93\\xe2\\x80\\x8b\\xe1\\x9e\\xa0\\xe1\\x9f\\x92\\xe1\\x9e\\x9f\\xe1\\x9e\\x80\\xe1\\x9e\\xa0\\xe1\\x9f\\x92\\xe1\\x9e\\x9f\\xe1\\x9f\\x8a\\xe1\\x9e\\xb8\\0\"\n    \"lo\\0\"\n    \"Lao\\0\"\n    \"\\xe0\\xba\\xa5\\xe0\\xba\\xb2\\xe0\\xba\\xa7\\0\"\n    \"LAO\\0\"\n    \"lao\\0\"\n    \"\\xe0\\xba\\x9b\\xe0\\xba\\xb0\\xe0\\xba\\x95\\xe0\\xba\\xb4\\xe0\\xba\\x97\\xe0\\xba\\xb4\\xe0\\xba\\x99\\xe0\\xbb\\x80\\xe0\\xba\\x81\\xe0\\xba\\xa3\\xe0\\xbb\\x82\\xe0\\xba\\x81\\xe0\\xba\\xa3\\xe0\\xba\\xbd\\xe0\\xba\\x99\\0\"\n    \"gl\\0\"\n    \"Galician\\0\"\n    \"galego\\0\"\n    \"GLC\\0\"\n    \"glg\\0\"\n    \"kok\\0\"\n    \"Konkani\\0\"\n    \"\\xe0\\xa4\\x95\\xe0\\xa5\\x8b\\xe0\\xa4\\x82\\xe0\\xa4\\x95\\xe0\\xa4\\xa3\\xe0\\xa5\\x80\\0\"\n    \"KNK\\0\"\n    \"si\\0\"\n    \"Sinhala\\0\"\n    \"\\xe0\\xb7\\x83\\xe0\\xb7\\x92\\xe0\\xb6\\x82\\xe0\\xb7\\x84\\xe0\\xb6\\xbd\\0\"\n    \"SIN\\0\"\n    \"sin\\0\"\n    \"\\xe0\\xb6\\x9c\\xe0\\xb7\\x8a\\xe2\\x80\\x8d\\xe0\\xb6\\xbb\\xe0\\xb7\\x99\\xe0\\xb6\\x9c\\xe0\\xb6\\xbb\\xe0\\xb7\\x92\\xe0\\xb6\\xba\\xe0\\xb7\\x8f\\xe0\\xb6\\xb1\\xe0\\xb7\\x94 \\xe0\\xb6\\xaf\\xe0\\xb7\\x92\\xe0\\xb6\\xb1\\xe0\\xb6\\xaf\\xe0\\xb7\\x83\\xe0\\xb7\\x94\\xe0\\xb6\\xb1\\0\"\n    \"Amharic\\0\"\n    \"\\xe1\\x8a\\xa0\\xe1\\x88\\x9b\\xe1\\x88\\xad\\xe1\\x8a\\x9b\\0\"\n    \"AMH\\0\"\n    \"amh\\0\"\n    \"\\xe1\\x8b\\xa8\\xe1\\x8c\\x8d\\xe1\\x88\\xaa\\xe1\\x8c\\x8e\\xe1\\x88\\xaa\\xe1\\x8b\\xab\\xe1\\x8a\\x95 \\xe1\\x89\\x80\\xe1\\x8a\\x95 \\xe1\\x8a\\xa0\\xe1\\x89\\x86\\xe1\\x8c\\xa3\\xe1\\x8c\\xa0\\xe1\\x88\\xad\\0\"\n    \"tzm\\0\"\n    \"Central Atlas Tamazight\\0\"\n    \"Tamazi\\xc9\\xa3t\\0\"\n    \"TZM\\0\"\n    \"Nepali\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa5\\x87\\xe0\\xa4\\xaa\\xe0\\xa4\\xbe\\xe0\\xa4\\xb2\\xe0\\xa5\\x80\\0\"\n    \"NEP\\0\"\n    \"nep\\0\"\n    \"\\xe0\\xa4\\x97\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa5\\x87\\xe0\\xa4\\x97\\xe0\\xa5\\x8b\\xe0\\xa4\\xb0\\xe0\\xa4\\xbf\\xe0\\xa4\\xaf\\xe0\\xa4\\xa8 \\xe0\\xa4\\xaa\\xe0\\xa4\\xbe\\xe0\\xa4\\xa4\\xe0\\xa5\\x8d\\xe0\\xa4\\xb0\\xe0\\xa5\\x8b\\0\"\n    \"ps\\0\"\n    \"Pashto\\0\"\n    \"\\xd9\\xbe\\xda\\x9a\\xd8\\xaa\\xd9\\x88\\0\"\n    \"PAS\\0\"\n    \"pus\\0\"\n    \"fil\\0\"\n    \"Filipino\\0\"\n    \"FPO\\0\"\n    \"Kalendaryong Gregorian\\0\"\n    \"ha\\0\"\n    \"Hausa\\0\"\n    \"HAU\\0\"\n    \"hau\\0\"\n    \"yo\\0\"\n    \"Yoruba\\0\"\n    \"\\xc3\\x88\\x64\\xc3\\xa8 Yor\\xc3\\xb9\\x62\\xc3\\xa1\\0\"\n    \"YOR\\0\"\n    \"yor\\0\"\n    \"nso\\0\"\n    \"Northern Sotho\\0\"\n    \"Sesotho sa Leboa\\0\"\n    \"NSO\\0\"\n    \"kl\\0\"\n    \"Kalaallisut\\0\"\n    \"kalaallisut\\0\"\n    \"KAL\\0\"\n    \"kal\\0\"\n    \"gregorianskit ullorsiutaat\\0\"\n    \"ig\\0\"\n    \"Igbo\\0\"\n    \"IBO\\0\"\n    \"ibo\\0\"\n    \"ii\\0\"\n    \"Sichuan Yi\\0\"\n    \"\\xea\\x86\\x88\\xea\\x8c\\xa0\\xea\\x89\\x99\\0\"\n    \"III\\0\"\n    \"iii\\0\"\n    \"\\xea\\x84\\x89\\xea\\x89\\xbb\\xea\\x83\\x85\\xea\\x91\\x8d\\0\"\n    \"br\\0\"\n    \"Breton\\0\"\n    \"brezhoneg\\0\"\n    \"BRE\\0\"\n    \"bre\\0\"\n    \"deiziadur gregorian\\0\"\n    \"gsw\\0\"\n    \"Swiss German\\0\"\n    \"Schwiizert\\xc3\\xbc\\xc3\\xbctsch\\0\"\n    \"GSW\\0\"\n    \"Gregoriaanisch Kal\\xc3\\xa4nder\\0\"\n    \"sah\\0\"\n    \"Sakha\\0\"\n    \"\\xd1\\x81\\xd0\\xb0\\xd1\\x85\\xd0\\xb0 \\xd1\\x82\\xd1\\x8b\\xd0\\xbb\\xd0\\xb0\\0\"\n    \"SAH\\0\"\n    \"rw\\0\"\n    \"Kinyarwanda\\0\"\n    \"KIN\\0\"\n    \"kin\\0\"\n    \"gd\\0\"\n    \"Scottish Gaelic\\0\"\n    \"G\\xc3\\xa0idhlig\\0\"\n    \"GLA\\0\"\n    \"gla\\0\"\n    \"Am M\\xc3\\xacosachan Griogarach\\0\"\n    \"ar-SA\\0\"\n    \"Arabic (Saudi Arabia)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd9\\x85\\xd9\\x85\\xd9\\x84\\xd9\\x83\\xd8\\xa9 \\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 \\xd8\\xa7\\xd9\\x84\\xd8\\xb3\\xd8\\xb9\\xd9\\x88\\xd8\\xaf\\xd9\\x8a\\xd8\\xa9)\\0\"\n    \"bg-BG\\0\"\n    \"Bulgarian (Bulgaria)\\0\"\n    \"\\xd0\\xb1\\xd1\\x8a\\xd0\\xbb\\xd0\\xb3\\xd0\\xb0\\xd1\\x80\\xd1\\x81\\xd0\\xba\\xd0\\xb8 (\\xd0\\x91\\xd1\\x8a\\xd0\\xbb\\xd0\\xb3\\xd0\\xb0\\xd1\\x80\\xd0\\xb8\\xd1\\x8f)\\0\"\n    \"BG\\0\"\n    \"ca-ES\\0\"\n    \"Catalan (Spain)\\0\"\n    \"catal\\xc3\\xa0 (Espanya)\\0\"\n    \"ES\\0\"\n    \"zh-TW\\0\"\n    \"Chinese (Traditional)\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87 (\\xe5\\x8f\\xb0\\xe6\\xb9\\xbe)\\0\"\n    \"CHT\\0\"\n    \"TW\\0\"\n    \"\\xe5\\x85\\xac\\xe6\\x9b\\x86\\0\"\n    \"cs-CZ\\0\"\n    \"Czech (Czech Republic)\\0\"\n    \"\\xc4\\x8d\\x65\\xc5\\xa1tina (\\xc4\\x8c\\x65sk\\xc3\\xa1 republika)\\0\"\n    \"CZ\\0\"\n    \"da-DK\\0\"\n    \"Danish (Denmark)\\0\"\n    \"dansk (Danmark)\\0\"\n    \"DK\\0\"\n    \"de-DE\\0\"\n    \"German (Germany)\\0\"\n    \"Deutsch (Deutschland)\\0\"\n    \"DE\\0\"\n    \"el-GR\\0\"\n    \"Greek (Greece)\\0\"\n    \"\\xce\\x95\\xce\\xbb\\xce\\xbb\\xce\\xb7\\xce\\xbd\\xce\\xb9\\xce\\xba\\xce\\xac (\\xce\\x95\\xce\\xbb\\xce\\xbb\\xce\\xac\\xce\\xb4\\xce\\xb1)\\0\"\n    \"GR\\0\"\n    \"en-US\\0\"\n    \"English (United States)\\0\"\n    \"US\\0\"\n    \"fi-FI\\0\"\n    \"Finnish (Finland)\\0\"\n    \"suomi (Suomi)\\0\"\n    \"FI\\0\"\n    \"fr-FR\\0\"\n    \"French (France)\\0\"\n    \"fran\\xc3\\xa7\\x61is (France)\\0\"\n    \"FR\\0\"\n    \"he-IL\\0\"\n    \"Hebrew (Israel)\\0\"\n    \"\\xd7\\xa2\\xd7\\x91\\xd7\\xa8\\xd7\\x99\\xd7\\xaa (\\xd7\\x99\\xd7\\xa9\\xd7\\xa8\\xd7\\x90\\xd7\\x9c)\\0\"\n    \"IL\\0\"\n    \"hu-HU\\0\"\n    \"Hungarian (Hungary)\\0\"\n    \"magyar (Magyarorsz\\xc3\\xa1g)\\0\"\n    \"HU\\0\"\n    \"is-IS\\0\"\n    \"Icelandic (Iceland)\\0\"\n    \"\\xc3\\xadslenska (\\xc3\\x8dsland)\\0\"\n    \"IS\\0\"\n    \"it-IT\\0\"\n    \"Italian (Italy)\\0\"\n    \"italiano (Italia)\\0\"\n    \"IT\\0\"\n    \"ja-JP\\0\"\n    \"Japanese (Japan)\\0\"\n    \"\\xe6\\x97\\xa5\\xe6\\x9c\\xac\\xe8\\xaa\\x9e (\\xe6\\x97\\xa5\\xe6\\x9c\\xac)\\0\"\n    \"JP\\0\"\n    \"ko-KR\\0\"\n    \"Korean (South Korea)\\0\"\n    \"\\xed\\x95\\x9c\\xea\\xb5\\xad\\xec\\x96\\xb4 (\\xeb\\x8c\\x80\\xed\\x95\\x9c\\xeb\\xaf\\xbc\\xea\\xb5\\xad)\\0\"\n    \"KR\\0\"\n    \"nl-NL\\0\"\n    \"Dutch (Netherlands)\\0\"\n    \"Nederlands (Nederland)\\0\"\n    \"NL\\0\"\n    \"nb-NO\\0\"\n    \"Norwegian Bokm\\xc3\\xa5l (Norway)\\0\"\n    \"norsk bokm\\xc3\\xa5l (Norge)\\0\"\n    \"NO\\0\"\n    \"pl-PL\\0\"\n    \"Polish (Poland)\\0\"\n    \"polski (Polska)\\0\"\n    \"PL\\0\"\n    \"pt-BR\\0\"\n    \"Portuguese (Brazil)\\0\"\n    \"portugu\\xc3\\xaas (Brasil)\\0\"\n    \"BR\\0\"\n    \"rm-CH\\0\"\n    \"Romansh (Switzerland)\\0\"\n    \"rumantsch (Svizra)\\0\"\n    \"ro-RO\\0\"\n    \"Romanian (Romania)\\0\"\n    \"rom\\xc3\\xa2n\\xc4\\x83 (Rom\\xc3\\xa2nia)\\0\"\n    \"RO\\0\"\n    \"ru-RU\\0\"\n    \"Russian (Russia)\\0\"\n    \"\\xd1\\x80\\xd1\\x83\\xd1\\x81\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\xd0\\xb9 (\\xd0\\xa0\\xd0\\xbe\\xd1\\x81\\xd1\\x81\\xd0\\xb8\\xd1\\x8f)\\0\"\n    \"RU\\0\"\n    \"hr-HR\\0\"\n    \"Croatian (Croatia)\\0\"\n    \"hrvatski (Hrvatska)\\0\"\n    \"HR\\0\"\n    \"sk-SK\\0\"\n    \"Slovak (Slovakia)\\0\"\n    \"sloven\\xc4\\x8dina (Slovensko)\\0\"\n    \"SK\\0\"\n    \"sq-AL\\0\"\n    \"Albanian (Albania)\\0\"\n    \"Shqip (Shqip\\xc3\\xabri)\\0\"\n    \"AL\\0\"\n    \"sv-SE\\0\"\n    \"Swedish (Sweden)\\0\"\n    \"svenska (Sverige)\\0\"\n    \"SE\\0\"\n    \"th-TH\\0\"\n    \"Thai (Thailand)\\0\"\n    \"\\xe0\\xb9\\x84\\xe0\\xb8\\x97\\xe0\\xb8\\xa2 (\\xe0\\xb9\\x84\\xe0\\xb8\\x97\\xe0\\xb8\\xa2)\\0\"\n    \"TH\\0\"\n    \"tr-TR\\0\"\n    \"Turkish (Turkey)\\0\"\n    \"T\\xc3\\xbcrk\\xc3\\xa7\\x65 (T\\xc3\\xbcrkiye)\\0\"\n    \"TR\\0\"\n    \"ur-PK\\0\"\n    \"Urdu (Pakistan)\\0\"\n    \"\\xd8\\xa7\\xd8\\xb1\\xd8\\xaf\\xd9\\x88 (\\xd9\\xbe\\xd8\\xa7\\xda\\xa9\\xd8\\xb3\\xd8\\xaa\\xd8\\xa7\\xd9\\x86)\\0\"\n    \"PK\\0\"\n    \"id-ID\\0\"\n    \"Indonesian (Indonesia)\\0\"\n    \"Bahasa Indonesia (Indonesia)\\0\"\n    \"ID\\0\"\n    \"uk-UA\\0\"\n    \"Ukrainian (Ukraine)\\0\"\n    \"\\xd1\\x83\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\xd1\\x97\\xd0\\xbd\\xd1\\x81\\xd1\\x8c\\xd0\\xba\\xd0\\xb0 (\\xd0\\xa3\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\xd1\\x97\\xd0\\xbd\\xd0\\xb0)\\0\"\n    \"UA\\0\"\n    \"be-BY\\0\"\n    \"Belarusian (Belarus)\\0\"\n    \"\\xd0\\xb1\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\xd1\\x80\\xd1\\x83\\xd1\\x81\\xd0\\xba\\xd0\\xb0\\xd1\\x8f (\\xd0\\x91\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\xd1\\x80\\xd1\\x83\\xd1\\x81\\xd1\\x8c)\\0\"\n    \"BY\\0\"\n    \"sl-SI\\0\"\n    \"Slovenian (Slovenia)\\0\"\n    \"sloven\\xc5\\xa1\\xc4\\x8dina (Slovenija)\\0\"\n    \"SI\\0\"\n    \"et-EE\\0\"\n    \"Estonian (Estonia)\\0\"\n    \"eesti (Eesti)\\0\"\n    \"EE\\0\"\n    \"lv-LV\\0\"\n    \"Latvian (Latvia)\\0\"\n    \"latvie\\xc5\\xa1u (Latvija)\\0\"\n    \"LV\\0\"\n    \"lt-LT\\0\"\n    \"Lithuanian (Lithuania)\\0\"\n    \"lietuvi\\xc5\\xb3 (Lietuva)\\0\"\n    \"LT\\0\"\n    \"tg-Cyrl-TJ\\0\"\n    \"Tajik (Cyrillic, Tajikistan)\\0\"\n    \"\\xd0\\xa2\\xd0\\xbe\\xd2\\xb7\\xd0\\xb8\\xd0\\xba\\xd3\\xa3 (\\xd0\\xa2\\xd0\\xbe\\xd2\\xb7\\xd0\\xb8\\xd0\\xba\\xd0\\xb8\\xd1\\x81\\xd1\\x82\\xd0\\xbe\\xd0\\xbd)\\0\"\n    \"TJ\\0\"\n    \"fa-IR\\0\"\n    \"Persian (Iran)\\0\"\n    \"\\xd9\\x81\\xd8\\xa7\\xd8\\xb1\\xd8\\xb3\\xdb\\x8c (\\xd8\\xa7\\xdb\\x8c\\xd8\\xb1\\xd8\\xa7\\xd9\\x86)\\0\"\n    \"IR\\0\"\n    \"vi-VN\\0\"\n    \"Vietnamese (Vietnam)\\0\"\n    \"Ti\\xe1\\xba\\xbfng Vi\\xe1\\xbb\\x87t (Vi\\xe1\\xbb\\x87t Nam)\\0\"\n    \"VN\\0\"\n    \"hy-AM\\0\"\n    \"Armenian (Armenia)\\0\"\n    \"\\xd5\\xb0\\xd5\\xa1\\xd5\\xb5\\xd5\\xa5\\xd6\\x80\\xd5\\xa5\\xd5\\xb6 (\\xd5\\x80\\xd5\\xa1\\xd5\\xb5\\xd5\\xa1\\xd5\\xbd\\xd5\\xbf\\xd5\\xa1\\xd5\\xb6)\\0\"\n    \"az-Latn-AZ\\0\"\n    \"Azerbaijani (Latin, Azerbaijan)\\0\"\n    \"az\\xc9\\x99rbaycan (Az\\xc9\\x99rbaycan)\\0\"\n    \"AZ\\0\"\n    \"eu-ES\\0\"\n    \"Basque (Spain)\\0\"\n    \"euskara (Espainia)\\0\"\n    \"mk-MK\\0\"\n    \"Macedonian (Macedonia)\\0\"\n    \"\\xd0\\xbc\\xd0\\xb0\\xd0\\xba\\xd0\\xb5\\xd0\\xb4\\xd0\\xbe\\xd0\\xbd\\xd1\\x81\\xd0\\xba\\xd0\\xb8 (\\xd0\\x9c\\xd0\\xb0\\xd0\\xba\\xd0\\xb5\\xd0\\xb4\\xd0\\xbe\\xd0\\xbd\\xd0\\xb8\\xd1\\x98\\xd0\\xb0)\\0\"\n    \"MK\\0\"\n    \"tn-ZA\\0\"\n    \"Tswana (South Africa)\\0\"\n    \"ZA\\0\"\n    \"xh-ZA\\0\"\n    \"Xhosa (South Africa)\\0\"\n    \"zu-ZA\\0\"\n    \"Zulu (South Africa)\\0\"\n    \"isiZulu (i-South Africa)\\0\"\n    \"af-ZA\\0\"\n    \"Afrikaans (South Africa)\\0\"\n    \"Afrikaans (Suid-Afrika)\\0\"\n    \"ka-GE\\0\"\n    \"Georgian (Georgia)\\0\"\n    \"\\xe1\\x83\\xa5\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x97\\xe1\\x83\\xa3\\xe1\\x83\\x9a\\xe1\\x83\\x98 (\\xe1\\x83\\xa1\\xe1\\x83\\x90\\xe1\\x83\\xa5\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x97\\xe1\\x83\\x95\\xe1\\x83\\x94\\xe1\\x83\\x9a\\xe1\\x83\\x9d)\\0\"\n    \"GE\\0\"\n    \"fo-FO\\0\"\n    \"Faroese (Faroe Islands)\\0\"\n    \"f\\xc3\\xb8royskt (F\\xc3\\xb8royar)\\0\"\n    \"FO\\0\"\n    \"hi-IN\\0\"\n    \"Hindi (India)\\0\"\n    \"\\xe0\\xa4\\xb9\\xe0\\xa4\\xbf\\xe0\\xa4\\x82\\xe0\\xa4\\xa6\\xe0\\xa5\\x80 (\\xe0\\xa4\\xad\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa4\\xa4)\\0\"\n    \"IN\\0\"\n    \"mt-MT\\0\"\n    \"Maltese (Malta)\\0\"\n    \"Malti (Malta)\\0\"\n    \"MT\\0\"\n    \"se-NO\\0\"\n    \"Northern Sami (Norway)\\0\"\n    \"davvis\\xc3\\xa1megiella (Norga)\\0\"\n    \"sw-KE\\0\"\n    \"Swahili (Kenya)\\0\"\n    \"Kiswahili (Kenya)\\0\"\n    \"KE\\0\"\n    \"uz-Latn-UZ\\0\"\n    \"Uzbek (Latin, Uzbekistan)\\0\"\n    \"o\\xca\\xbbzbekcha (O\\xca\\xbbzbekiston)\\0\"\n    \"UZ\\0\"\n    \"bn-IN\\0\"\n    \"Bengali (India)\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\x82\\xe0\\xa6\\xb2\\xe0\\xa6\\xbe (\\xe0\\xa6\\xad\\xe0\\xa6\\xbe\\xe0\\xa6\\xb0\\xe0\\xa6\\xa4)\\0\"\n    \"gu-IN\\0\"\n    \"Gujarati (India)\\0\"\n    \"\\xe0\\xaa\\x97\\xe0\\xab\\x81\\xe0\\xaa\\x9c\\xe0\\xaa\\xb0\\xe0\\xaa\\xbe\\xe0\\xaa\\xa4\\xe0\\xab\\x80 (\\xe0\\xaa\\xad\\xe0\\xaa\\xbe\\xe0\\xaa\\xb0\\xe0\\xaa\\xa4)\\0\"\n    \"or-IN\\0\"\n    \"Oriya (India)\\0\"\n    \"\\xe0\\xac\\x93\\xe0\\xac\\xa1\\xe0\\xac\\xbc\\xe0\\xac\\xbf\\xe0\\xac\\x86 (\\xe0\\xac\\xad\\xe0\\xac\\xbe\\xe0\\xac\\xb0\\xe0\\xac\\xa4)\\0\"\n    \"ta-IN\\0\"\n    \"Tamil (India)\\0\"\n    \"\\xe0\\xae\\xa4\\xe0\\xae\\xae\\xe0\\xae\\xbf\\xe0\\xae\\xb4\\xe0\\xaf\\x8d (\\xe0\\xae\\x87\\xe0\\xae\\xa8\\xe0\\xaf\\x8d\\xe0\\xae\\xa4\\xe0\\xae\\xbf\\xe0\\xae\\xaf\\xe0\\xae\\xbe)\\0\"\n    \"te-IN\\0\"\n    \"Telugu (India)\\0\"\n    \"\\xe0\\xb0\\xa4\\xe0\\xb1\\x86\\xe0\\xb0\\xb2\\xe0\\xb1\\x81\\xe0\\xb0\\x97\\xe0\\xb1\\x81 (\\xe0\\xb0\\xad\\xe0\\xb0\\xbe\\xe0\\xb0\\xb0\\xe0\\xb0\\xa4 \\xe0\\xb0\\xa6\\xe0\\xb1\\x87\\xe0\\xb0\\xb6\\xe0\\xb0\\x82)\\0\"\n    \"kn-IN\\0\"\n    \"Kannada (India)\\0\"\n    \"\\xe0\\xb2\\x95\\xe0\\xb2\\xa8\\xe0\\xb3\\x8d\\xe0\\xb2\\xa8\\xe0\\xb2\\xa1 (\\xe0\\xb2\\xad\\xe0\\xb2\\xbe\\xe0\\xb2\\xb0\\xe0\\xb2\\xa4)\\0\"\n    \"ml-IN\\0\"\n    \"Malayalam (India)\\0\"\n    \"\\xe0\\xb4\\xae\\xe0\\xb4\\xb2\\xe0\\xb4\\xaf\\xe0\\xb4\\xbe\\xe0\\xb4\\xb3\\xe0\\xb4\\x82 (\\xe0\\xb4\\x87\\xe0\\xb4\\xa8\\xe0\\xb5\\x8d\\xe0\\xb4\\xa4\\xe0\\xb5\\x8d\\xe0\\xb4\\xaf)\\0\"\n    \"as-IN\\0\"\n    \"Assamese (India)\\0\"\n    \"\\xe0\\xa6\\x85\\xe0\\xa6\\xb8\\xe0\\xa6\\xae\\xe0\\xa7\\x80\\xe0\\xa6\\xaf\\xe0\\xa6\\xbc\\xe0\\xa6\\xbe (\\xe0\\xa6\\xad\\xe0\\xa6\\xbe\\xe0\\xa7\\xb0\\xe0\\xa6\\xa4)\\0\"\n    \"mr-IN\\0\"\n    \"Marathi (India)\\0\"\n    \"\\xe0\\xa4\\xae\\xe0\\xa4\\xb0\\xe0\\xa4\\xbe\\xe0\\xa4\\xa0\\xe0\\xa5\\x80 (\\xe0\\xa4\\xad\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa4\\xa4)\\0\"\n    \"bo-CN\\0\"\n    \"Tibetan (China)\\0\"\n    \"\\xe0\\xbd\\x94\\xe0\\xbd\\xbc\\xe0\\xbd\\x91\\xe0\\xbc\\x8b\\xe0\\xbd\\xa6\\xe0\\xbe\\x90\\xe0\\xbd\\x91\\xe0\\xbc\\x8b (\\xe0\\xbd\\xa2\\xe0\\xbe\\x92\\xe0\\xbe\\xb1\\xe0\\xbc\\x8b\\xe0\\xbd\\x93\\xe0\\xbd\\x82)\\0\"\n    \"cy-GB\\0\"\n    \"Welsh (United Kingdom)\\0\"\n    \"Cymraeg (Y Deyrnas Unedig)\\0\"\n    \"GB\\0\"\n    \"km-KH\\0\"\n    \"Khmer (Cambodia)\\0\"\n    \"\\xe1\\x9e\\x81\\xe1\\x9f\\x92\\xe1\\x9e\\x98\\xe1\\x9f\\x82\\xe1\\x9e\\x9a (\\xe1\\x9e\\x80\\xe1\\x9e\\x98\\xe1\\x9f\\x92\\xe1\\x9e\\x96\\xe1\\x9e\\xbb\\xe1\\x9e\\x87\\xe1\\x9e\\xb6)\\0\"\n    \"KH\\0\"\n    \"lo-LA\\0\"\n    \"Lao (Laos)\\0\"\n    \"\\xe0\\xba\\xa5\\xe0\\xba\\xb2\\xe0\\xba\\xa7 (\\xe0\\xba\\xa5\\xe0\\xba\\xb2\\xe0\\xba\\xa7)\\0\"\n    \"LA\\0\"\n    \"gl-ES\\0\"\n    \"Galician (Spain)\\0\"\n    \"galego (Espa\\xc3\\xb1\\x61)\\0\"\n    \"kok-IN\\0\"\n    \"Konkani (India)\\0\"\n    \"\\xe0\\xa4\\x95\\xe0\\xa5\\x8b\\xe0\\xa4\\x82\\xe0\\xa4\\x95\\xe0\\xa4\\xa3\\xe0\\xa5\\x80 (\\xe0\\xa4\\xad\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa4\\xa4)\\0\"\n    \"si-LK\\0\"\n    \"Sinhala (Sri Lanka)\\0\"\n    \"\\xe0\\xb7\\x83\\xe0\\xb7\\x92\\xe0\\xb6\\x82\\xe0\\xb7\\x84\\xe0\\xb6\\xbd (\\xe0\\xb7\\x81\\xe0\\xb7\\x8a\\xe2\\x80\\x8d\\xe0\\xb6\\xbb\\xe0\\xb7\\x93 \\xe0\\xb6\\xbd\\xe0\\xb6\\x82\\xe0\\xb6\\x9a\\xe0\\xb7\\x8f\\xe0\\xb7\\x80)\\0\"\n    \"LK\\0\"\n    \"am-ET\\0\"\n    \"Amharic (Ethiopia)\\0\"\n    \"\\xe1\\x8a\\xa0\\xe1\\x88\\x9b\\xe1\\x88\\xad\\xe1\\x8a\\x9b (\\xe1\\x8a\\xa2\\xe1\\x89\\xb5\\xe1\\x8b\\xae\\xe1\\x8c\\xb5\\xe1\\x8b\\xab)\\0\"\n    \"ET\\0\"\n    \"ne-NP\\0\"\n    \"Nepali (Nepal)\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa5\\x87\\xe0\\xa4\\xaa\\xe0\\xa4\\xbe\\xe0\\xa4\\xb2\\xe0\\xa5\\x80 (\\xe0\\xa4\\xa8\\xe0\\xa5\\x87\\xe0\\xa4\\xaa\\xe0\\xa4\\xbe\\xe0\\xa4\\xb2)\\0\"\n    \"NP\\0\"\n    \"ps-AF\\0\"\n    \"Pashto (Afghanistan)\\0\"\n    \"\\xd9\\xbe\\xda\\x9a\\xd8\\xaa\\xd9\\x88 (\\xd8\\xa7\\xd9\\x81\\xd8\\xba\\xd8\\xa7\\xd9\\x86\\xd8\\xb3\\xd8\\xaa\\xd8\\xa7\\xd9\\x86)\\0\"\n    \"AF\\0\"\n    \"fil-PH\\0\"\n    \"Filipino (Philippines)\\0\"\n    \"Filipino (Pilipinas)\\0\"\n    \"PH\\0\"\n    \"ha-Latn-NG\\0\"\n    \"Hausa (Latin, Nigeria)\\0\"\n    \"Hausa (Najeriya)\\0\"\n    \"NG\\0\"\n    \"yo-NG\\0\"\n    \"Yoruba (Nigeria)\\0\"\n    \"\\xc3\\x88\\x64\\xc3\\xa8 Yor\\xc3\\xb9\\x62\\xc3\\xa1 (Or\\xc3\\xadl\\xe1\\xba\\xb9\\xcc\\x81\\xc3\\xa8\\x64\\x65 N\\xc3\\xa0\\xc3\\xacj\\xc3\\xadr\\xc3\\xad\\xc3\\xa0)\\0\"\n    \"nso-ZA\\0\"\n    \"Northern Sotho (South Africa)\\0\"\n    \"kl-GL\\0\"\n    \"Kalaallisut (Greenland)\\0\"\n    \"kalaallisut (Kalaallit Nunaat)\\0\"\n    \"GL\\0\"\n    \"ig-NG\\0\"\n    \"Igbo (Nigeria)\\0\"\n    \"ii-CN\\0\"\n    \"Sichuan Yi (China)\\0\"\n    \"\\xea\\x86\\x88\\xea\\x8c\\xa0\\xea\\x89\\x99 (\\xea\\x8d\\x8f\\xea\\x87\\xa9)\\0\"\n    \"br-FR\\0\"\n    \"Breton (France)\\0\"\n    \"brezhoneg (Fra\\xc3\\xb1s)\\0\"\n    \"sah-RU\\0\"\n    \"Sakha (Russia)\\0\"\n    \"rw-RW\\0\"\n    \"Kinyarwanda (Rwanda)\\0\"\n    \"RW\\0\"\n    \"gd-GB\\0\"\n    \"Scottish Gaelic (United Kingdom)\\0\"\n    \"G\\xc3\\xa0idhlig (An R\\xc3\\xacoghachd Aonaichte)\\0\"\n    \"ar-IQ\\0\"\n    \"Arabic (Iraq)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa7\\xd9\\x82)\\0\"\n    \"ARI\\0\"\n    \"IQ\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xaa\\xd9\\x82\\xd9\\x88\\xd9\\x8a\\xd9\\x85 \\xd8\\xa7\\xd9\\x84\\xd9\\x85\\xd9\\x8a\\xd9\\x84\\xd8\\xa7\\xd8\\xaf\\xd9\\x8a\\0\"\n    \"zh-CN\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87 (\\xe4\\xb8\\xad\\xe5\\x9b\\xbd)\\0\"\n    \"de-CH\\0\"\n    \"German (Switzerland)\\0\"\n    \"Deutsch (Schweiz)\\0\"\n    \"DES\\0\"\n    \"en-GB\\0\"\n    \"English (United Kingdom)\\0\"\n    \"ENG\\0\"\n    \"es-MX\\0\"\n    \"Spanish (Mexico)\\0\"\n    \"espa\\xc3\\xb1ol (M\\xc3\\xa9xico)\\0\"\n    \"ESM\\0\"\n    \"MX\\0\"\n    \"fr-BE\\0\"\n    \"French (Belgium)\\0\"\n    \"fran\\xc3\\xa7\\x61is (Belgique)\\0\"\n    \"FRB\\0\"\n    \"BE\\0\"\n    \"it-CH\\0\"\n    \"Italian (Switzerland)\\0\"\n    \"italiano (Svizzera)\\0\"\n    \"ITS\\0\"\n    \"nl-BE\\0\"\n    \"Dutch (Belgium)\\0\"\n    \"Nederlands (Belgi\\xc3\\xab)\\0\"\n    \"NLB\\0\"\n    \"nn-NO\\0\"\n    \"Norwegian Nynorsk (Norway)\\0\"\n    \"nynorsk (Noreg)\\0\"\n    \"NON\\0\"\n    \"nno\\0\"\n    \"nn\\0\"\n    \"pt-PT\\0\"\n    \"Portuguese (Portugal)\\0\"\n    \"portugu\\xc3\\xaas (Portugal)\\0\"\n    \"PTG\\0\"\n    \"PT\\0\"\n    \"sv-FI\\0\"\n    \"Swedish (Finland)\\0\"\n    \"svenska (Finland)\\0\"\n    \"SVF\\0\"\n    \"az-Cyrl-AZ\\0\"\n    \"Azerbaijani (Cyrillic, Azerbaijan)\\0\"\n    \"AZC\\0\"\n    \"ga-IE\\0\"\n    \"Irish (Ireland)\\0\"\n    \"Gaeilge (\\xc3\\x89ire)\\0\"\n    \"IE\\0\"\n    \"uz-Cyrl-UZ\\0\"\n    \"Uzbek (Cyrillic, Uzbekistan)\\0\"\n    \"\\xd0\\x93\\xd1\\x80\\xd0\\xb8\\xd0\\xb3\\xd0\\xbe\\xd1\\x80\\xd0\\xb8\\xd0\\xb0\\xd0\\xbd \\xd0\\xba\\xd0\\xb0\\xd0\\xbb\\xd0\\xb5\\xd0\\xbd\\xd0\\xb4\\xd0\\xb0\\xd1\\x80\\xd0\\xb8\\0\"\n    \"bn-BD\\0\"\n    \"Bengali (Bangladesh)\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\x82\\xe0\\xa6\\xb2\\xe0\\xa6\\xbe (\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\x82\\xe0\\xa6\\xb2\\xe0\\xa6\\xbe\\xe0\\xa6\\xa6\\xe0\\xa7\\x87\\xe0\\xa6\\xb6)\\0\"\n    \"BNB\\0\"\n    \"BD\\0\"\n    \"ar-EG\\0\"\n    \"Arabic (Egypt)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd9\\x85\\xd8\\xb5\\xd8\\xb1)\\0\"\n    \"ARE\\0\"\n    \"EG\\0\"\n    \"zh-HK\\0\"\n    \"Chinese (Traditional, Hong Kong SAR China)\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87 (\\xe4\\xb8\\xad\\xe5\\x9b\\xbd\\xe9\\xa6\\x99\\xe6\\xb8\\xaf\\xe7\\x89\\xb9\\xe5\\x88\\xab\\xe8\\xa1\\x8c\\xe6\\x94\\xbf\\xe5\\x8c\\xba)\\0\"\n    \"ZHH\\0\"\n    \"HK\\0\"\n    \"de-AT\\0\"\n    \"German (Austria)\\0\"\n    \"Deutsch (\\xc3\\x96sterreich)\\0\"\n    \"DEA\\0\"\n    \"AT\\0\"\n    \"en-AU\\0\"\n    \"English (Australia)\\0\"\n    \"ENA\\0\"\n    \"AU\\0\"\n    \"es-ES\\0\"\n    \"Spanish (Spain)\\0\"\n    \"espa\\xc3\\xb1ol (Espa\\xc3\\xb1\\x61)\\0\"\n    \"ESN\\0\"\n    \"fr-CA\\0\"\n    \"French (Canada)\\0\"\n    \"fran\\xc3\\xa7\\x61is (Canada)\\0\"\n    \"FRC\\0\"\n    \"CA\\0\"\n    \"Calendrier gr\\xc3\\xa9gorien\\0\"\n    \"se-FI\\0\"\n    \"Northern Sami (Finland)\\0\"\n    \"davvis\\xc3\\xa1megiella (Suopma)\\0\"\n    \"SMG\\0\"\n    \"smg\\0\"\n    \"ar-LY\\0\"\n    \"Arabic (Libya)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd9\\x84\\xd9\\x8a\\xd8\\xa8\\xd9\\x8a\\xd8\\xa7)\\0\"\n    \"ARL\\0\"\n    \"LY\\0\"\n    \"zh-SG\\0\"\n    \"Chinese (Simplified, Singapore)\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87 (\\xe6\\x96\\xb0\\xe5\\x8a\\xa0\\xe5\\x9d\\xa1)\\0\"\n    \"ZHI\\0\"\n    \"SG\\0\"\n    \"de-LU\\0\"\n    \"German (Luxembourg)\\0\"\n    \"Deutsch (Luxemburg)\\0\"\n    \"DEL\\0\"\n    \"LU\\0\"\n    \"en-CA\\0\"\n    \"English (Canada)\\0\"\n    \"ENC\\0\"\n    \"es-GT\\0\"\n    \"Spanish (Guatemala)\\0\"\n    \"espa\\xc3\\xb1ol (Guatemala)\\0\"\n    \"ESG\\0\"\n    \"GT\\0\"\n    \"fr-CH\\0\"\n    \"French (Switzerland)\\0\"\n    \"fran\\xc3\\xa7\\x61is (Suisse)\\0\"\n    \"FRS\\0\"\n    \"hr-BA\\0\"\n    \"Croatian (Bosnia and Herzegovina)\\0\"\n    \"hrvatski (Bosna i Hercegovina)\\0\"\n    \"HRB\\0\"\n    \"hrb\\0\"\n    \"BA\\0\"\n    \"ar-DZ\\0\"\n    \"Arabic (Algeria)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd8\\xac\\xd8\\xb2\\xd8\\xa7\\xd8\\xa6\\xd8\\xb1)\\0\"\n    \"ARG\\0\"\n    \"DZ\\0\"\n    \"zh-MO\\0\"\n    \"Chinese (Traditional, Macau SAR China)\\0\"\n    \"\\xe4\\xb8\\xad\\xe6\\x96\\x87 (\\xe4\\xb8\\xad\\xe5\\x9b\\xbd\\xe6\\xbe\\xb3\\xe9\\x97\\xa8\\xe7\\x89\\xb9\\xe5\\x88\\xab\\xe8\\xa1\\x8c\\xe6\\x94\\xbf\\xe5\\x8c\\xba)\\0\"\n    \"ZHM\\0\"\n    \"MO\\0\"\n    \"de-LI\\0\"\n    \"German (Liechtenstein)\\0\"\n    \"Deutsch (Liechtenstein)\\0\"\n    \"DEC\\0\"\n    \"LI\\0\"\n    \"en-NZ\\0\"\n    \"English (New Zealand)\\0\"\n    \"ENZ\\0\"\n    \"NZ\\0\"\n    \"es-CR\\0\"\n    \"Spanish (Costa Rica)\\0\"\n    \"espa\\xc3\\xb1ol (Costa Rica)\\0\"\n    \"ESC\\0\"\n    \"CR\\0\"\n    \"fr-LU\\0\"\n    \"French (Luxembourg)\\0\"\n    \"fran\\xc3\\xa7\\x61is (Luxembourg)\\0\"\n    \"FRL\\0\"\n    \"bs-Latn-BA\\0\"\n    \"Bosnian (Latin, Bosnia and Herzegovina)\\0\"\n    \"bosanski (Bosna i Hercegovina)\\0\"\n    \"BSB\\0\"\n    \"bsb\\0\"\n    \"bs\\0\"\n    \"Gregorijanski kalendar\\0\"\n    \"ar-MA\\0\"\n    \"Arabic (Morocco)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd9\\x85\\xd8\\xba\\xd8\\xb1\\xd8\\xa8)\\0\"\n    \"ARM\\0\"\n    \"MA\\0\"\n    \"en-IE\\0\"\n    \"English (Ireland)\\0\"\n    \"ENI\\0\"\n    \"es-PA\\0\"\n    \"Spanish (Panama)\\0\"\n    \"espa\\xc3\\xb1ol (Panam\\xc3\\xa1)\\0\"\n    \"ESA\\0\"\n    \"PA\\0\"\n    \"fr-MC\\0\"\n    \"French (Monaco)\\0\"\n    \"fran\\xc3\\xa7\\x61is (Monaco)\\0\"\n    \"FRM\\0\"\n    \"MC\\0\"\n    \"sr-Latn-BA\\0\"\n    \"Serbian (Latin, Bosnia and Herzegovina)\\0\"\n    \"\\xd0\\xa1\\xd1\\x80\\xd0\\xbf\\xd1\\x81\\xd0\\xba\\xd0\\xb8 (\\xd0\\x91\\xd0\\xbe\\xd1\\x81\\xd0\\xbd\\xd0\\xb0 \\xd0\\xb8 \\xd0\\xa5\\xd0\\xb5\\xd1\\x80\\xd1\\x86\\xd0\\xb5\\xd0\\xb3\\xd0\\xbe\\xd0\\xb2\\xd0\\xb8\\xd0\\xbd\\xd0\\xb0)\\0\"\n    \"SRS\\0\"\n    \"srs\\0\"\n    \"sr\\0\"\n    \"ar-TN\\0\"\n    \"Arabic (Tunisia)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xaa\\xd9\\x88\\xd9\\x86\\xd8\\xb3)\\0\"\n    \"ART\\0\"\n    \"TN\\0\"\n    \"en-ZA\\0\"\n    \"English (South Africa)\\0\"\n    \"ENS\\0\"\n    \"es-DO\\0\"\n    \"Spanish (Dominican Republic)\\0\"\n    \"espa\\xc3\\xb1ol (Rep\\xc3\\xba\\x62lica Dominicana)\\0\"\n    \"ESD\\0\"\n    \"DO\\0\"\n    \"sr-Cyrl-BA\\0\"\n    \"Serbian (Cyrillic, Bosnia and Herzegovina)\\0\"\n    \"SRN\\0\"\n    \"srn\\0\"\n    \"ar-OM\\0\"\n    \"Arabic (Oman)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xb9\\xd9\\x8f\\xd9\\x85\\xd8\\xa7\\xd9\\x86)\\0\"\n    \"ARO\\0\"\n    \"OM\\0\"\n    \"en-JM\\0\"\n    \"English (Jamaica)\\0\"\n    \"ENJ\\0\"\n    \"JM\\0\"\n    \"es-VE\\0\"\n    \"Spanish (Venezuela)\\0\"\n    \"espa\\xc3\\xb1ol (Venezuela)\\0\"\n    \"ESV\\0\"\n    \"VE\\0\"\n    \"bs-Cyrl-BA\\0\"\n    \"Bosnian (Cyrillic, Bosnia and Herzegovina)\\0\"\n    \"BSC\\0\"\n    \"bsc\\0\"\n    \"ar-YE\\0\"\n    \"Arabic (Yemen)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd9\\x8a\\xd9\\x85\\xd9\\x86)\\0\"\n    \"ARY\\0\"\n    \"YE\\0\"\n    \"es-CO\\0\"\n    \"Spanish (Colombia)\\0\"\n    \"espa\\xc3\\xb1ol (Colombia)\\0\"\n    \"ESO\\0\"\n    \"CO\\0\"\n    \"sr-Latn-RS\\0\"\n    \"Serbian (Latin, Serbia)\\0\"\n    \"\\xd0\\xa1\\xd1\\x80\\xd0\\xbf\\xd1\\x81\\xd0\\xba\\xd0\\xb8 (\\xd0\\xa1\\xd1\\x80\\xd0\\xb1\\xd0\\xb8\\xd1\\x98\\xd0\\xb0)\\0\"\n    \"SRM\\0\"\n    \"RS\\0\"\n    \"ar-SY\\0\"\n    \"Arabic (Syria)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xb3\\xd9\\x88\\xd8\\xb1\\xd9\\x8a\\xd8\\xa7)\\0\"\n    \"ARS\\0\"\n    \"SY\\0\"\n    \"en-BZ\\0\"\n    \"English (Belize)\\0\"\n    \"ENL\\0\"\n    \"BZ\\0\"\n    \"es-PE\\0\"\n    \"Spanish (Peru)\\0\"\n    \"espa\\xc3\\xb1ol (Per\\xc3\\xba)\\0\"\n    \"ESR\\0\"\n    \"PE\\0\"\n    \"sr-Cyrl-RS\\0\"\n    \"Serbian (Cyrillic, Serbia)\\0\"\n    \"SRO\\0\"\n    \"ar-JO\\0\"\n    \"Arabic (Jordan)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd8\\xb1\\xd8\\xaf\\xd9\\x86)\\0\"\n    \"ARJ\\0\"\n    \"JO\\0\"\n    \"en-TT\\0\"\n    \"English (Trinidad and Tobago)\\0\"\n    \"ENT\\0\"\n    \"TT\\0\"\n    \"es-AR\\0\"\n    \"Spanish (Argentina)\\0\"\n    \"espa\\xc3\\xb1ol (Argentina)\\0\"\n    \"ESS\\0\"\n    \"AR\\0\"\n    \"sr-Latn-ME\\0\"\n    \"Serbian (Latin, Montenegro)\\0\"\n    \"\\xd0\\xa1\\xd1\\x80\\xd0\\xbf\\xd1\\x81\\xd0\\xba\\xd0\\xb8 (\\xd0\\xa6\\xd1\\x80\\xd0\\xbd\\xd0\\xb0 \\xd0\\x93\\xd0\\xbe\\xd1\\x80\\xd0\\xb0)\\0\"\n    \"SRP\\0\"\n    \"ME\\0\"\n    \"ar-LB\\0\"\n    \"Arabic (Lebanon)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd9\\x84\\xd8\\xa8\\xd9\\x86\\xd8\\xa7\\xd9\\x86)\\0\"\n    \"ARB\\0\"\n    \"LB\\0\"\n    \"en-ZW\\0\"\n    \"English (Zimbabwe)\\0\"\n    \"ENW\\0\"\n    \"ZW\\0\"\n    \"es-EC\\0\"\n    \"Spanish (Ecuador)\\0\"\n    \"espa\\xc3\\xb1ol (Ecuador)\\0\"\n    \"ESF\\0\"\n    \"EC\\0\"\n    \"sr-Cyrl-ME\\0\"\n    \"Serbian (Cyrillic, Montenegro)\\0\"\n    \"SRQ\\0\"\n    \"ar-KW\\0\"\n    \"Arabic (Kuwait)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd9\\x83\\xd9\\x88\\xd9\\x8a\\xd8\\xaa)\\0\"\n    \"ARK\\0\"\n    \"KW\\0\"\n    \"en-PH\\0\"\n    \"English (Philippines)\\0\"\n    \"ENP\\0\"\n    \"es-CL\\0\"\n    \"Spanish (Chile)\\0\"\n    \"espa\\xc3\\xb1ol (Chile)\\0\"\n    \"ESL\\0\"\n    \"CL\\0\"\n    \"ar-AE\\0\"\n    \"Arabic (United Arab Emirates)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd8\\xa5\\xd9\\x85\\xd8\\xa7\\xd8\\xb1\\xd8\\xa7\\xd8\\xaa \\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 \\xd8\\xa7\\xd9\\x84\\xd9\\x85\\xd8\\xaa\\xd8\\xad\\xd8\\xaf\\xd8\\xa9)\\0\"\n    \"ARU\\0\"\n    \"AE\\0\"\n    \"es-UY\\0\"\n    \"Spanish (Uruguay)\\0\"\n    \"espa\\xc3\\xb1ol (Uruguay)\\0\"\n    \"ESY\\0\"\n    \"UY\\0\"\n    \"ar-BH\\0\"\n    \"Arabic (Bahrain)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd8\\xa7\\xd9\\x84\\xd8\\xa8\\xd8\\xad\\xd8\\xb1\\xd9\\x8a\\xd9\\x86)\\0\"\n    \"ARH\\0\"\n    \"BH\\0\"\n    \"es-PY\\0\"\n    \"Spanish (Paraguay)\\0\"\n    \"espa\\xc3\\xb1ol (Paraguay)\\0\"\n    \"ESZ\\0\"\n    \"PY\\0\"\n    \"ar-QA\\0\"\n    \"Arabic (Qatar)\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 (\\xd9\\x82\\xd8\\xb7\\xd8\\xb1)\\0\"\n    \"ARQ\\0\"\n    \"QA\\0\"\n    \"en-IN\\0\"\n    \"English (India)\\0\"\n    \"ENN\\0\"\n    \"es-BO\\0\"\n    \"Spanish (Bolivia)\\0\"\n    \"espa\\xc3\\xb1ol (Bolivia)\\0\"\n    \"ESB\\0\"\n    \"BO\\0\"\n    \"es-SV\\0\"\n    \"Spanish (El Salvador)\\0\"\n    \"espa\\xc3\\xb1ol (El Salvador)\\0\"\n    \"ESE\\0\"\n    \"SV\\0\"\n    \"en-SG\\0\"\n    \"English (Singapore)\\0\"\n    \"ENE\\0\"\n    \"es-HN\\0\"\n    \"Spanish (Honduras)\\0\"\n    \"espa\\xc3\\xb1ol (Honduras)\\0\"\n    \"ESH\\0\"\n    \"HN\\0\"\n    \"es-NI\\0\"\n    \"Spanish (Nicaragua)\\0\"\n    \"espa\\xc3\\xb1ol (Nicaragua)\\0\"\n    \"ESI\\0\"\n    \"NI\\0\"\n    \"es-PR\\0\"\n    \"Spanish (Puerto Rico)\\0\"\n    \"espa\\xc3\\xb1ol (Puerto Rico)\\0\"\n    \"ESU\\0\"\n    \"PR\\0\"\n    \"es-US\\0\"\n    \"Spanish (United States)\\0\"\n    \"espa\\xc3\\xb1ol (Estados Unidos)\\0\"\n    \"EST\\0\"\n    \"bs-Cyrl\\0\"\n    \"Bosnian (Cyrillic)\\0\"\n    \"bosanski\\0\"\n    \"bs-Latn\\0\"\n    \"Bosnian (Latin)\\0\"\n    \"sr-Cyrl\\0\"\n    \"Serbian (Cyrillic)\\0\"\n    \"\\xd0\\xa1\\xd1\\x80\\xd0\\xbf\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\0\"\n    \"sr-Latn\\0\"\n    \"Serbian (Latin)\\0\"\n    \"az-Cyrl\\0\"\n    \"Azerbaijani (Cyrillic)\\0\"\n    \"Norwegian Nynorsk\\0\"\n    \"nynorsk\\0\"\n    \"Bosnian\\0\"\n    \"az-Latn\\0\"\n    \"Azerbaijani (Latin)\\0\"\n    \"uz-Cyrl\\0\"\n    \"Uzbek (Cyrillic)\\0\"\n    \"mn-Cyrl\\0\"\n    \"Mongolian (Cyrillic)\\0\"\n    \"MNN\\0\"\n    \"zh-Hant\\0\"\n    \"zh-CHT\\0\"\n    \"Chinese (Traditional) Legacy\\0\"\n    \"Norwegian Bokm\\xc3\\xa5l\\0\"\n    \"norsk bokm\\xc3\\xa5l\\0\"\n    \"Serbian\\0\"\n    \"SRB\\0\"\n    \"tg-Cyrl\\0\"\n    \"Tajik (Cyrillic)\\0\"\n    \"uz-Latn\\0\"\n    \"Uzbek (Latin)\\0\"\n    \"tzm-Latn\\0\"\n    \"Central Atlas Tamazight (Latin)\\0\"\n    \"ha-Latn\\0\"\n    \"Hausa (Latin)\\0\"\n    \"af-za\\0\"\n    \"am-et\\0\"\n    \"ar-ae\\0\"\n    \"ar-bh\\0\"\n    \"ar-dz\\0\"\n    \"ar-eg\\0\"\n    \"ar-iq\\0\"\n    \"ar-jo\\0\"\n    \"ar-kw\\0\"\n    \"ar-lb\\0\"\n    \"ar-ly\\0\"\n    \"ar-ma\\0\"\n    \"ar-om\\0\"\n    \"ar-qa\\0\"\n    \"ar-sa\\0\"\n    \"ar-sy\\0\"\n    \"ar-tn\\0\"\n    \"ar-ye\\0\"\n    \"as-in\\0\"\n    \"az-cyrl\\0\"\n    \"az-cyrl-az\\0\"\n    \"az-latn\\0\"\n    \"az-latn-az\\0\"\n    \"be-by\\0\"\n    \"bg-bg\\0\"\n    \"bn-bd\\0\"\n    \"bn-in\\0\"\n    \"bo-cn\\0\"\n    \"br-fr\\0\"\n    \"bs-cyrl\\0\"\n    \"bs-cyrl-ba\\0\"\n    \"bs-latn\\0\"\n    \"bs-latn-ba\\0\"\n    \"ca-es\\0\"\n    \"cs-cz\\0\"\n    \"cy-gb\\0\"\n    \"da-dk\\0\"\n    \"de-at\\0\"\n    \"de-ch\\0\"\n    \"de-de\\0\"\n    \"de-li\\0\"\n    \"de-lu\\0\"\n    \"el-gr\\0\"\n    \"en-au\\0\"\n    \"en-bz\\0\"\n    \"en-ca\\0\"\n    \"en-gb\\0\"\n    \"en-ie\\0\"\n    \"en-in\\0\"\n    \"en-jm\\0\"\n    \"en-nz\\0\"\n    \"en-ph\\0\"\n    \"en-sg\\0\"\n    \"en-tt\\0\"\n    \"en-us\\0\"\n    \"en-za\\0\"\n    \"en-zw\\0\"\n    \"es-ar\\0\"\n    \"es-bo\\0\"\n    \"es-cl\\0\"\n    \"es-co\\0\"\n    \"es-cr\\0\"\n    \"es-do\\0\"\n    \"es-ec\\0\"\n    \"es-es\\0\"\n    \"es-gt\\0\"\n    \"es-hn\\0\"\n    \"es-mx\\0\"\n    \"es-ni\\0\"\n    \"es-pa\\0\"\n    \"es-pe\\0\"\n    \"es-pr\\0\"\n    \"es-py\\0\"\n    \"es-sv\\0\"\n    \"es-us\\0\"\n    \"es-uy\\0\"\n    \"es-ve\\0\"\n    \"et-ee\\0\"\n    \"eu-es\\0\"\n    \"fa-ir\\0\"\n    \"fi-fi\\0\"\n    \"fil-ph\\0\"\n    \"fo-fo\\0\"\n    \"fr-be\\0\"\n    \"fr-ca\\0\"\n    \"fr-ch\\0\"\n    \"fr-fr\\0\"\n    \"fr-lu\\0\"\n    \"fr-mc\\0\"\n    \"ga-ie\\0\"\n    \"gd-gb\\0\"\n    \"gl-es\\0\"\n    \"gu-in\\0\"\n    \"ha-latn\\0\"\n    \"ha-latn-ng\\0\"\n    \"he-il\\0\"\n    \"hi-in\\0\"\n    \"hr-ba\\0\"\n    \"hr-hr\\0\"\n    \"hu-hu\\0\"\n    \"hy-am\\0\"\n    \"id-id\\0\"\n    \"ig-ng\\0\"\n    \"ii-cn\\0\"\n    \"is-is\\0\"\n    \"it-ch\\0\"\n    \"it-it\\0\"\n    \"ja-jp\\0\"\n    \"ka-ge\\0\"\n    \"kl-gl\\0\"\n    \"km-kh\\0\"\n    \"kn-in\\0\"\n    \"ko-kr\\0\"\n    \"kok-in\\0\"\n    \"lo-la\\0\"\n    \"lt-lt\\0\"\n    \"lv-lv\\0\"\n    \"mk-mk\\0\"\n    \"ml-in\\0\"\n    \"mn-cyrl\\0\"\n    \"mr-in\\0\"\n    \"mt-mt\\0\"\n    \"nb-no\\0\"\n    \"ne-np\\0\"\n    \"nl-be\\0\"\n    \"nl-nl\\0\"\n    \"nn-no\\0\"\n    \"nso-za\\0\"\n    \"or-in\\0\"\n    \"pl-pl\\0\"\n    \"ps-af\\0\"\n    \"pt-br\\0\"\n    \"pt-pt\\0\"\n    \"rm-ch\\0\"\n    \"ro-ro\\0\"\n    \"ru-ru\\0\"\n    \"rw-rw\\0\"\n    \"sah-ru\\0\"\n    \"se-fi\\0\"\n    \"se-no\\0\"\n    \"si-lk\\0\"\n    \"sk-sk\\0\"\n    \"sl-si\\0\"\n    \"sq-al\\0\"\n    \"sr-cyrl\\0\"\n    \"sr-cyrl-ba\\0\"\n    \"sr-cyrl-me\\0\"\n    \"sr-cyrl-rs\\0\"\n    \"sr-latn\\0\"\n    \"sr-latn-ba\\0\"\n    \"sr-latn-me\\0\"\n    \"sr-latn-rs\\0\"\n    \"sv-fi\\0\"\n    \"sv-se\\0\"\n    \"sw-ke\\0\"\n    \"ta-in\\0\"\n    \"te-in\\0\"\n    \"tg-cyrl\\0\"\n    \"tg-cyrl-tj\\0\"\n    \"th-th\\0\"\n    \"tn-za\\0\"\n    \"tr-tr\\0\"\n    \"tzm-latn\\0\"\n    \"uk-ua\\0\"\n    \"ur-pk\\0\"\n    \"uz-cyrl\\0\"\n    \"uz-cyrl-uz\\0\"\n    \"uz-latn\\0\"\n    \"uz-latn-uz\\0\"\n    \"vi-vn\\0\"\n    \"xh-za\\0\"\n    \"yo-ng\\0\"\n    \"zh-chs\\0\"\n    \"zh-cht\\0\"\n    \"zh-cn\\0\"\n    \"zh-hans\\0\"\n    \"zh-hant\\0\"\n    \"zh-hk\\0\"\n    \"zh-mo\\0\"\n    \"zh-sg\\0\"\n    \"zh-tw\\0\"\n    \"zu-za\\0\"\n    \"United Arab Emirates\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xa5\\xd9\\x85\\xd8\\xa7\\xd8\\xb1\\xd8\\xa7\\xd8\\xaa \\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 \\xd8\\xa7\\xd9\\x84\\xd9\\x85\\xd8\\xaa\\xd8\\xad\\xd8\\xaf\\xd8\\xa9\\0\"\n    \"AED\\0\"\n    \"United Arab Emirates Dirham\\0\"\n    \"\\xd8\\xaf\\xd8\\xb1\\xd9\\x87\\xd9\\x85 \\xd8\\xa5\\xd9\\x85\\xd8\\xa7\\xd8\\xb1\\xd8\\xa7\\xd8\\xaa\\xd9\\x8a\\0\"\n    \"AFG\\0\"\n    \"Afghanistan\\0\"\n    \"\\xd8\\xa7\\xd9\\x81\\xd8\\xba\\xd8\\xa7\\xd9\\x86\\xd8\\xb3\\xd8\\xaa\\xd8\\xa7\\xd9\\x86\\0\"\n    \"AFN\\0\"\n    \"Afghan Afghani\\0\"\n    \"\\xd8\\xa7\\xd9\\x81\\xd8\\xba\\xd8\\xa7\\xd9\\x86\\xdb\\x8d\\0\"\n    \"ALB\\0\"\n    \"Albania\\0\"\n    \"Shqip\\xc3\\xabri\\0\"\n    \"ALL\\0\"\n    \"Albanian Lek\\0\"\n    \"Leku shqiptar\\0\"\n    \"Armenia\\0\"\n    \"\\xd5\\x80\\xd5\\xa1\\xd5\\xb5\\xd5\\xa1\\xd5\\xbd\\xd5\\xbf\\xd5\\xa1\\xd5\\xb6\\0\"\n    \"AMD\\0\"\n    \"Armenian Dram\\0\"\n    \"\\xd5\\x80\\xd5\\xa1\\xd5\\xb5\\xd5\\xaf\\xd5\\xa1\\xd5\\xaf\\xd5\\xa1\\xd5\\xb6 \\xd5\\xa4\\xd6\\x80\\xd5\\xa1\\xd5\\xb4\\0\"\n    \"Argentina\\0\"\n    \"Argentine Peso\\0\"\n    \"peso argentino\\0\"\n    \"AUT\\0\"\n    \"Austria\\0\"\n    \"\\xc3\\x96sterreich\\0\"\n    \"EUR\\0\"\n    \"Euro\\0\"\n    \"AUS\\0\"\n    \"Australia\\0\"\n    \"AUD\\0\"\n    \"Australian Dollar\\0\"\n    \"Azerbaijan\\0\"\n    \"Az\\xc9\\x99rbaycan\\0\"\n    \"AZN\\0\"\n    \"Azerbaijani Manat\\0\"\n    \"Az\\xc9\\x99rbaycan Manat\\xc4\\xb1\\0\"\n    \"BIH\\0\"\n    \"Bosnia and Herzegovina\\0\"\n    \"Bosna i Hercegovina\\0\"\n    \"BAM\\0\"\n    \"Bosnia-Herzegovina Convertible Mark\\0\"\n    \"konvertibilna marka\\0\"\n    \"BGD\\0\"\n    \"Bangladesh\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\x82\\xe0\\xa6\\xb2\\xe0\\xa6\\xbe\\xe0\\xa6\\xa6\\xe0\\xa7\\x87\\xe0\\xa6\\xb6\\0\"\n    \"BDT\\0\"\n    \"Bangladeshi Taka\\0\"\n    \"\\xe0\\xa6\\xac\\xe0\\xa6\\xbe\\xe0\\xa6\\x82\\xe0\\xa6\\xb2\\xe0\\xa6\\xbe\\xe0\\xa6\\xa6\\xe0\\xa7\\x87\\xe0\\xa6\\xb6\\xe0\\xa7\\x80 \\xe0\\xa6\\x9f\\xe0\\xa6\\xbe\\xe0\\xa6\\x95\\xe0\\xa6\\xbe\\0\"\n    \"Belgium\\0\"\n    \"Belgique\\0\"\n    \"euro\\0\"\n    \"Bulgaria\\0\"\n    \"\\xd0\\x91\\xd1\\x8a\\xd0\\xbb\\xd0\\xb3\\xd0\\xb0\\xd1\\x80\\xd0\\xb8\\xd1\\x8f\\0\"\n    \"BGN\\0\"\n    \"Bulgarian Lev\\0\"\n    \"\\xd0\\x91\\xd1\\x8a\\xd0\\xbb\\xd0\\xb3\\xd0\\xb0\\xd1\\x80\\xd1\\x81\\xd0\\xba\\xd0\\xb8 \\xd0\\xbb\\xd0\\xb5\\xd0\\xb2\\0\"\n    \"BHR\\0\"\n    \"Bahrain\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xa8\\xd8\\xad\\xd8\\xb1\\xd9\\x8a\\xd9\\x86\\0\"\n    \"BHD\\0\"\n    \"Bahraini Dinar\\0\"\n    \"\\xd8\\xaf\\xd9\\x8a\\xd9\\x86\\xd8\\xa7\\xd8\\xb1 \\xd8\\xa8\\xd8\\xad\\xd8\\xb1\\xd9\\x8a\\xd9\\x86\\xd9\\x8a\\0\"\n    \"BOL\\0\"\n    \"Bolivia\\0\"\n    \"Bolivian Boliviano\\0\"\n    \"boliviano\\0\"\n    \"BRA\\0\"\n    \"Brazil\\0\"\n    \"Brasil\\0\"\n    \"BRL\\0\"\n    \"Brazilian Real\\0\"\n    \"Real brasileiro\\0\"\n    \"BLR\\0\"\n    \"Belarus\\0\"\n    \"\\xd0\\x91\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\xd1\\x80\\xd1\\x83\\xd1\\x81\\xd1\\x8c\\0\"\n    \"BYR\\0\"\n    \"Belarusian Ruble\\0\"\n    \"\\xd0\\xb1\\xd0\\xb5\\xd0\\xbb\\xd0\\xb0\\xd1\\x80\\xd1\\x83\\xd1\\x81\\xd0\\xba\\xd1\\x96 \\xd1\\x80\\xd1\\x83\\xd0\\xb1\\xd0\\xb5\\xd0\\xbb\\xd1\\x8c\\0\"\n    \"BLZ\\0\"\n    \"Belize\\0\"\n    \"BZD\\0\"\n    \"Belize Dollar\\0\"\n    \"CAN\\0\"\n    \"Canada\\0\"\n    \"CAD\\0\"\n    \"Canadian Dollar\\0\"\n    \"dollar canadien\\0\"\n    \"CHE\\0\"\n    \"Switzerland\\0\"\n    \"Svizra\\0\"\n    \"Swiss Franc\\0\"\n    \"franc svizzer\\0\"\n    \"CHL\\0\"\n    \"Chile\\0\"\n    \"CLP\\0\"\n    \"Chilean Peso\\0\"\n    \"peso chileno\\0\"\n    \"CHN\\0\"\n    \"China\\0\"\n    \"\\xe0\\xbd\\xa2\\xe0\\xbe\\x92\\xe0\\xbe\\xb1\\xe0\\xbc\\x8b\\xe0\\xbd\\x93\\xe0\\xbd\\x82\\0\"\n    \"CNY\\0\"\n    \"Chinese Yuan\\0\"\n    \"\\xe0\\xbd\\xa1\\xe0\\xbd\\xb4\\xe0\\xbc\\x8b\\xe0\\xbd\\xa8\\xe0\\xbd\\x93\\xe0\\xbc\\x8b\\0\"\n    \"COL\\0\"\n    \"Colombia\\0\"\n    \"COP\\0\"\n    \"Colombian Peso\\0\"\n    \"peso colombiano\\0\"\n    \"CRI\\0\"\n    \"Costa Rica\\0\"\n    \"CRC\\0\"\n    \"Costa Rican Col\\xc3\\xb3n\\0\"\n    \"col\\xc3\\xb3n costarricense\\0\"\n    \"CZE\\0\"\n    \"Czech Republic\\0\"\n    \"\\xc4\\x8c\\x65sk\\xc3\\xa1 republika\\0\"\n    \"CZK\\0\"\n    \"Czech Republic Koruna\\0\"\n    \"\\xc4\\x8d\\x65sk\\xc3\\xa1 koruna\\0\"\n    \"Germany\\0\"\n    \"Deutschland\\0\"\n    \"DNK\\0\"\n    \"Denmark\\0\"\n    \"Danmark\\0\"\n    \"DKK\\0\"\n    \"Danish Krone\\0\"\n    \"Dansk krone\\0\"\n    \"DOM\\0\"\n    \"Dominican Republic\\0\"\n    \"Rep\\xc3\\xba\\x62lica Dominicana\\0\"\n    \"DOP\\0\"\n    \"Dominican Peso\\0\"\n    \"peso dominicano\\0\"\n    \"DZA\\0\"\n    \"Algeria\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xac\\xd8\\xb2\\xd8\\xa7\\xd8\\xa6\\xd8\\xb1\\0\"\n    \"DZD\\0\"\n    \"Algerian Dinar\\0\"\n    \"\\xd8\\xaf\\xd9\\x8a\\xd9\\x86\\xd8\\xa7\\xd8\\xb1 \\xd8\\xac\\xd8\\xb2\\xd8\\xa7\\xd8\\xa6\\xd8\\xb1\\xd9\\x8a\\0\"\n    \"ECU\\0\"\n    \"Ecuador\\0\"\n    \"USD\\0\"\n    \"US Dollar\\0\"\n    \"d\\xc3\\xb3lar estadounidense\\0\"\n    \"Estonia\\0\"\n    \"Eesti\\0\"\n    \"EGY\\0\"\n    \"Egypt\\0\"\n    \"\\xd9\\x85\\xd8\\xb5\\xd8\\xb1\\0\"\n    \"EGP\\0\"\n    \"Egyptian Pound\\0\"\n    \"\\xd8\\xac\\xd9\\x86\\xd9\\x8a\\xd9\\x87 \\xd9\\x85\\xd8\\xb5\\xd8\\xb1\\xd9\\x8a\\0\"\n    \"Spain\\0\"\n    \"Espanya\\0\"\n    \"ETH\\0\"\n    \"Ethiopia\\0\"\n    \"\\xe1\\x8a\\xa2\\xe1\\x89\\xb5\\xe1\\x8b\\xae\\xe1\\x8c\\xb5\\xe1\\x8b\\xab\\0\"\n    \"ETB\\0\"\n    \"Ethiopian Birr\\0\"\n    \"\\xe1\\x8b\\xa8\\xe1\\x8a\\xa2\\xe1\\x89\\xb5\\xe1\\x8b\\xae\\xe1\\x8c\\xb5\\xe1\\x8b\\xab \\xe1\\x89\\xa5\\xe1\\x88\\xad\\0\"\n    \"Finland\\0\"\n    \"Suomi\\0\"\n    \"FRO\\0\"\n    \"Faroe Islands\\0\"\n    \"F\\xc3\\xb8royar\\0\"\n    \"donsk kr\\xc3\\xb3na\\0\"\n    \"France\\0\"\n    \"GBR\\0\"\n    \"United Kingdom\\0\"\n    \"Y Deyrnas Unedig\\0\"\n    \"GBP\\0\"\n    \"British Pound Sterling\\0\"\n    \"Punt Sterling Prydain\\0\"\n    \"GEO\\0\"\n    \"Georgia\\0\"\n    \"\\xe1\\x83\\xa1\\xe1\\x83\\x90\\xe1\\x83\\xa5\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x97\\xe1\\x83\\x95\\xe1\\x83\\x94\\xe1\\x83\\x9a\\xe1\\x83\\x9d\\0\"\n    \"GEL\\0\"\n    \"Georgian Lari\\0\"\n    \"\\xe1\\x83\\xa5\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x97\\xe1\\x83\\xa3\\xe1\\x83\\x9a\\xe1\\x83\\x98 \\xe1\\x83\\x9a\\xe1\\x83\\x90\\xe1\\x83\\xa0\\xe1\\x83\\x98\\0\"\n    \"GRL\\0\"\n    \"Greenland\\0\"\n    \"Kalaallit Nunaat\\0\"\n    \"danmarkimut koruuni\\0\"\n    \"GRC\\0\"\n    \"Greece\\0\"\n    \"\\xce\\x95\\xce\\xbb\\xce\\xbb\\xce\\xac\\xce\\xb4\\xce\\xb1\\0\"\n    \"\\xce\\x95\\xcf\\x85\\xcf\\x81\\xcf\\x8e\\0\"\n    \"GTM\\0\"\n    \"Guatemala\\0\"\n    \"GTQ\\0\"\n    \"Guatemalan Quetzal\\0\"\n    \"quetzal guatemalteco\\0\"\n    \"HKG\\0\"\n    \"Hong Kong SAR China\\0\"\n    \"\\xe4\\xb8\\xad\\xe5\\x9b\\xbd\\xe9\\xa6\\x99\\xe6\\xb8\\xaf\\xe7\\x89\\xb9\\xe5\\x88\\xab\\xe8\\xa1\\x8c\\xe6\\x94\\xbf\\xe5\\x8c\\xba\\0\"\n    \"HKD\\0\"\n    \"Hong Kong Dollar\\0\"\n    \"\\xe6\\xb8\\xaf\\xe5\\x85\\x83\\0\"\n    \"HND\\0\"\n    \"Honduras\\0\"\n    \"HNL\\0\"\n    \"Honduran Lempira\\0\"\n    \"lempira hondure\\xc3\\xb1o\\0\"\n    \"Croatia\\0\"\n    \"Hrvatska\\0\"\n    \"HRK\\0\"\n    \"Croatian Kuna\\0\"\n    \"hrvatska kuna\\0\"\n    \"Hungary\\0\"\n    \"Magyarorsz\\xc3\\xa1g\\0\"\n    \"HUF\\0\"\n    \"Hungarian Forint\\0\"\n    \"magyar forint\\0\"\n    \"IDN\\0\"\n    \"Indonesia\\0\"\n    \"IDR\\0\"\n    \"Indonesian Rupiah\\0\"\n    \"Rupiah Indonesia\\0\"\n    \"IRL\\0\"\n    \"Ireland\\0\"\n    \"\\xc3\\x89ire\\0\"\n    \"ISR\\0\"\n    \"Israel\\0\"\n    \"\\xd7\\x99\\xd7\\xa9\\xd7\\xa8\\xd7\\x90\\xd7\\x9c\\0\"\n    \"ILS\\0\"\n    \"Israeli New Sheqel\\0\"\n    \"\\xd7\\xa9\\xd7\\xb4\\xd7\\x97\\0\"\n    \"India\\0\"\n    \"\\xe0\\xa4\\xad\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa4\\xa4\\0\"\n    \"INR\\0\"\n    \"Indian Rupee\\0\"\n    \"\\xe0\\xa4\\xad\\xe0\\xa4\\xbe\\xe0\\xa4\\xb0\\xe0\\xa4\\xa4\\xe0\\xa5\\x80\\xe0\\xa4\\xaf \\xe0\\xa4\\xb0\\xe0\\xa5\\x81\\xe0\\xa4\\xaa\\xe0\\xa4\\xaf\\xe0\\xa4\\xbe\\0\"\n    \"IRQ\\0\"\n    \"Iraq\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa7\\xd9\\x82\\0\"\n    \"IQD\\0\"\n    \"Iraqi Dinar\\0\"\n    \"\\xd8\\xaf\\xd9\\x8a\\xd9\\x86\\xd8\\xa7\\xd8\\xb1 \\xd8\\xb9\\xd8\\xb1\\xd8\\xa7\\xd9\\x82\\xd9\\x8a\\0\"\n    \"IRN\\0\"\n    \"Iran\\0\"\n    \"\\xd8\\xa7\\xdb\\x8c\\xd8\\xb1\\xd8\\xa7\\xd9\\x86\\0\"\n    \"IRR\\0\"\n    \"Iranian Rial\\0\"\n    \"\\xd8\\xb1\\xdb\\x8c\\xd8\\xa7\\xd9\\x84 \\xd8\\xa7\\xdb\\x8c\\xd8\\xb1\\xd8\\xa7\\xd9\\x86\\0\"\n    \"Iceland\\0\"\n    \"\\xc3\\x8dsland\\0\"\n    \"ISK\\0\"\n    \"Icelandic Kr\\xc3\\xb3na\\0\"\n    \"\\xc3\\x8dslensk kr\\xc3\\xb3na\\0\"\n    \"Italy\\0\"\n    \"Italia\\0\"\n    \"JAM\\0\"\n    \"Jamaica\\0\"\n    \"JMD\\0\"\n    \"Jamaican Dollar\\0\"\n    \"JOR\\0\"\n    \"Jordan\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd8\\xa3\\xd8\\xb1\\xd8\\xaf\\xd9\\x86\\0\"\n    \"JOD\\0\"\n    \"Jordanian Dinar\\0\"\n    \"\\xd8\\xaf\\xd9\\x8a\\xd9\\x86\\xd8\\xa7\\xd8\\xb1 \\xd8\\xa3\\xd8\\xb1\\xd8\\xaf\\xd9\\x86\\xd9\\x8a\\0\"\n    \"Japan\\0\"\n    \"\\xe6\\x97\\xa5\\xe6\\x9c\\xac\\0\"\n    \"JPY\\0\"\n    \"Japanese Yen\\0\"\n    \"\\xe6\\x97\\xa5\\xe6\\x9c\\xac\\xe5\\x86\\x86\\0\"\n    \"KEN\\0\"\n    \"Kenya\\0\"\n    \"KES\\0\"\n    \"Kenyan Shilling\\0\"\n    \"shilingi ya Kenya\\0\"\n    \"Cambodia\\0\"\n    \"\\xe1\\x9e\\x80\\xe1\\x9e\\x98\\xe1\\x9f\\x92\\xe1\\x9e\\x96\\xe1\\x9e\\xbb\\xe1\\x9e\\x87\\xe1\\x9e\\xb6\\0\"\n    \"KHR\\0\"\n    \"Cambodian Riel\\0\"\n    \"\\xe1\\x9e\\x9a\\xe1\\x9f\\x80\\xe1\\x9e\\x9b \\xe1\\x9e\\x80\\xe1\\x9e\\x98\\xe1\\x9f\\x92\\xe1\\x9e\\x96\\xe1\\x9e\\xbb\\xe1\\x9e\\x87\\xe1\\x9e\\xb6\\0\"\n    \"South Korea\\0\"\n    \"\\xeb\\x8c\\x80\\xed\\x95\\x9c\\xeb\\xaf\\xbc\\xea\\xb5\\xad\\0\"\n    \"KRW\\0\"\n    \"South Korean Won\\0\"\n    \"\\xeb\\x8c\\x80\\xed\\x95\\x9c\\xeb\\xaf\\xbc\\xea\\xb5\\xad \\xec\\x9b\\x90\\0\"\n    \"KWT\\0\"\n    \"Kuwait\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd9\\x83\\xd9\\x88\\xd9\\x8a\\xd8\\xaa\\0\"\n    \"KWD\\0\"\n    \"Kuwaiti Dinar\\0\"\n    \"\\xd8\\xaf\\xd9\\x8a\\xd9\\x86\\xd8\\xa7\\xd8\\xb1 \\xd9\\x83\\xd9\\x88\\xd9\\x8a\\xd8\\xaa\\xd9\\x8a\\0\"\n    \"Laos\\0\"\n    \"LAK\\0\"\n    \"Laotian Kip\\0\"\n    \"\\xe0\\xba\\x81\\xe0\\xba\\xb5\\xe0\\xba\\x9a \\xe0\\xba\\xa5\\xe0\\xba\\xb2\\xe0\\xba\\xa7\\0\"\n    \"LBN\\0\"\n    \"Lebanon\\0\"\n    \"\\xd9\\x84\\xd8\\xa8\\xd9\\x86\\xd8\\xa7\\xd9\\x86\\0\"\n    \"LBP\\0\"\n    \"Lebanese Pound\\0\"\n    \"\\xd8\\xac\\xd9\\x86\\xd9\\x8a\\xd8\\xa9 \\xd9\\x84\\xd8\\xa8\\xd9\\x86\\xd8\\xa7\\xd9\\x86\\xd9\\x8a\\0\"\n    \"LIE\\0\"\n    \"Liechtenstein\\0\"\n    \"Schweizer Franken\\0\"\n    \"LKA\\0\"\n    \"Sri Lanka\\0\"\n    \"\\xe0\\xb7\\x81\\xe0\\xb7\\x8a\\xe2\\x80\\x8d\\xe0\\xb6\\xbb\\xe0\\xb7\\x93 \\xe0\\xb6\\xbd\\xe0\\xb6\\x82\\xe0\\xb6\\x9a\\xe0\\xb7\\x8f\\xe0\\xb7\\x80\\0\"\n    \"LKR\\0\"\n    \"Sri Lankan Rupee\\0\"\n    \"\\xe0\\xb7\\x81\\xe0\\xb7\\x8a\\xe2\\x80\\x8d\\xe0\\xb6\\xbb\\xe0\\xb7\\x93 \\xe0\\xb6\\xbd\\xe0\\xb6\\x82\\xe0\\xb6\\x9a\\xe0\\xb7\\x8f \\xe0\\xb6\\xbb\\xe0\\xb7\\x94\\xe0\\xb6\\xb4\\xe0\\xb7\\x92\\xe0\\xb6\\xba\\xe0\\xb6\\xbd\\0\"\n    \"LTU\\0\"\n    \"Lithuania\\0\"\n    \"Lietuva\\0\"\n    \"LTL\\0\"\n    \"Lithuanian Litas\\0\"\n    \"Lietuvos litas\\0\"\n    \"LUX\\0\"\n    \"Luxembourg\\0\"\n    \"Luxemburg\\0\"\n    \"LVA\\0\"\n    \"Latvia\\0\"\n    \"Latvija\\0\"\n    \"eiro\\0\"\n    \"LBY\\0\"\n    \"Libya\\0\"\n    \"\\xd9\\x84\\xd9\\x8a\\xd8\\xa8\\xd9\\x8a\\xd8\\xa7\\0\"\n    \"LYD\\0\"\n    \"Libyan Dinar\\0\"\n    \"\\xd8\\xaf\\xd9\\x8a\\xd9\\x86\\xd8\\xa7\\xd8\\xb1 \\xd9\\x84\\xd9\\x8a\\xd8\\xa8\\xd9\\x8a\\0\"\n    \"Morocco\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd9\\x85\\xd8\\xba\\xd8\\xb1\\xd8\\xa8\\0\"\n    \"MAD\\0\"\n    \"Moroccan Dirham\\0\"\n    \"\\xd8\\xaf\\xd8\\xb1\\xd9\\x87\\xd9\\x85 \\xd9\\x85\\xd8\\xba\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\0\"\n    \"MCO\\0\"\n    \"Monaco\\0\"\n    \"MNE\\0\"\n    \"Montenegro\\0\"\n    \"\\xd0\\xa6\\xd1\\x80\\xd0\\xbd\\xd0\\xb0 \\xd0\\x93\\xd0\\xbe\\xd1\\x80\\xd0\\xb0\\0\"\n    \"Evro\\0\"\n    \"MKD\\0\"\n    \"Macedonia\\0\"\n    \"\\xd0\\x9c\\xd0\\xb0\\xd0\\xba\\xd0\\xb5\\xd0\\xb4\\xd0\\xbe\\xd0\\xbd\\xd0\\xb8\\xd1\\x98\\xd0\\xb0\\0\"\n    \"Macedonian Denar\\0\"\n    \"\\xd0\\x9c\\xd0\\xb0\\xd0\\xba\\xd0\\xb5\\xd0\\xb4\\xd0\\xbe\\xd0\\xbd\\xd1\\x81\\xd0\\xba\\xd0\\xb8 \\xd0\\xb4\\xd0\\xb5\\xd0\\xbd\\xd0\\xb0\\xd1\\x80\\0\"\n    \"MAC\\0\"\n    \"Macau SAR China\\0\"\n    \"\\xe4\\xb8\\xad\\xe5\\x9b\\xbd\\xe6\\xbe\\xb3\\xe9\\x97\\xa8\\xe7\\x89\\xb9\\xe5\\x88\\xab\\xe8\\xa1\\x8c\\xe6\\x94\\xbf\\xe5\\x8c\\xba\\0\"\n    \"MOP\\0\"\n    \"Macanese Pataca\\0\"\n    \"\\xe6\\xbe\\xb3\\xe9\\x96\\x80\\xe5\\x85\\x83\\0\"\n    \"Malta\\0\"\n    \"Ewro\\0\"\n    \"MEX\\0\"\n    \"Mexico\\0\"\n    \"M\\xc3\\xa9xico\\0\"\n    \"MXN\\0\"\n    \"Mexican Peso\\0\"\n    \"peso mexicano\\0\"\n    \"NGA\\0\"\n    \"Nigeria\\0\"\n    \"Najeriya\\0\"\n    \"NGN\\0\"\n    \"Nigerian Naira\\0\"\n    \"Naira\\0\"\n    \"NIC\\0\"\n    \"Nicaragua\\0\"\n    \"NIO\\0\"\n    \"Nicaraguan C\\xc3\\xb3rdoba\\0\"\n    \"c\\xc3\\xb3rdoba nicarag\\xc3\\xbc\\x65nse\\0\"\n    \"Netherlands\\0\"\n    \"Nederland\\0\"\n    \"Norway\\0\"\n    \"Norge\\0\"\n    \"NOK\\0\"\n    \"Norwegian Krone\\0\"\n    \"norske kroner\\0\"\n    \"NPL\\0\"\n    \"Nepal\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa5\\x87\\xe0\\xa4\\xaa\\xe0\\xa4\\xbe\\xe0\\xa4\\xb2\\0\"\n    \"NPR\\0\"\n    \"Nepalese Rupee\\0\"\n    \"\\xe0\\xa4\\xa8\\xe0\\xa5\\x87\\xe0\\xa4\\xaa\\xe0\\xa4\\xbe\\xe0\\xa4\\xb2\\xe0\\xa5\\x80 \\xe0\\xa4\\xb0\\xe0\\xa5\\x82\\xe0\\xa4\\xaa\\xe0\\xa5\\x88\\xe0\\xa4\\xaf\\xe0\\xa4\\xbe\\xe0\\xa4\\x81\\0\"\n    \"NZL\\0\"\n    \"New Zealand\\0\"\n    \"NZD\\0\"\n    \"New Zealand Dollar\\0\"\n    \"OMN\\0\"\n    \"Oman\\0\"\n    \"\\xd8\\xb9\\xd9\\x8f\\xd9\\x85\\xd8\\xa7\\xd9\\x86\\0\"\n    \"OMR\\0\"\n    \"Omani Rial\\0\"\n    \"\\xd8\\xb1\\xd9\\x8a\\xd8\\xa7\\xd9\\x84 \\xd8\\xb9\\xd9\\x85\\xd8\\xa7\\xd9\\x86\\xd9\\x8a\\0\"\n    \"Panama\\0\"\n    \"Panam\\xc3\\xa1\\0\"\n    \"PAB\\0\"\n    \"Panamanian Balboa\\0\"\n    \"balboa paname\\xc3\\xb1o\\0\"\n    \"PER\\0\"\n    \"Peru\\0\"\n    \"Per\\xc3\\xba\\0\"\n    \"PEN\\0\"\n    \"Peruvian Nuevo Sol\\0\"\n    \"nuevo sol peruano\\0\"\n    \"PHL\\0\"\n    \"Philippines\\0\"\n    \"Pilipinas\\0\"\n    \"PHP\\0\"\n    \"Philippine Peso\\0\"\n    \"PAK\\0\"\n    \"Pakistan\\0\"\n    \"\\xd9\\xbe\\xd8\\xa7\\xda\\xa9\\xd8\\xb3\\xd8\\xaa\\xd8\\xa7\\xd9\\x86\\0\"\n    \"PKR\\0\"\n    \"Pakistani Rupee\\0\"\n    \"\\xd9\\xbe\\xd8\\xa7\\xda\\xa9\\xd8\\xb3\\xd8\\xaa\\xd8\\xa7\\xd9\\x86\\xdb\\x8c \\xd8\\xb1\\xd9\\x88\\xd9\\xbe\\xdb\\x8c\\xdb\\x81\\0\"\n    \"POL\\0\"\n    \"Poland\\0\"\n    \"Polska\\0\"\n    \"PLN\\0\"\n    \"Polish Zloty\\0\"\n    \"z\\xc5\\x82oty polski\\0\"\n    \"PRI\\0\"\n    \"Puerto Rico\\0\"\n    \"PRT\\0\"\n    \"Portugal\\0\"\n    \"PRY\\0\"\n    \"Paraguay\\0\"\n    \"PYG\\0\"\n    \"Paraguayan Guarani\\0\"\n    \"guaran\\xc3\\xad paraguayo\\0\"\n    \"QAT\\0\"\n    \"Qatar\\0\"\n    \"\\xd9\\x82\\xd8\\xb7\\xd8\\xb1\\0\"\n    \"QAR\\0\"\n    \"Qatari Rial\\0\"\n    \"\\xd8\\xb1\\xd9\\x8a\\xd8\\xa7\\xd9\\x84 \\xd9\\x82\\xd8\\xb7\\xd8\\xb1\\xd9\\x8a\\0\"\n    \"ROU\\0\"\n    \"Romania\\0\"\n    \"Rom\\xc3\\xa2nia\\0\"\n    \"RON\\0\"\n    \"Romanian Leu\\0\"\n    \"leu rom\\xc3\\xa2nesc\\0\"\n    \"Serbia\\0\"\n    \"\\xd0\\xa1\\xd1\\x80\\xd0\\xb1\\xd0\\xb8\\xd1\\x98\\xd0\\xb0\\0\"\n    \"RSD\\0\"\n    \"Serbian Dinar\\0\"\n    \"Srpski dinar\\0\"\n    \"Russia\\0\"\n    \"\\xd0\\xa0\\xd0\\xbe\\xd1\\x81\\xd1\\x81\\xd0\\xb8\\xd1\\x8f\\0\"\n    \"RUB\\0\"\n    \"Russian Ruble\\0\"\n    \"\\xd0\\xa0\\xd0\\xbe\\xd1\\x81\\xd1\\x81\\xd0\\xb8\\xd0\\xb9\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\xd0\\xb9 \\xd1\\x80\\xd1\\x83\\xd0\\xb1\\xd0\\xbb\\xd1\\x8c\\0\"\n    \"RWA\\0\"\n    \"Rwanda\\0\"\n    \"RWF\\0\"\n    \"Rwandan Franc\\0\"\n    \"SAU\\0\"\n    \"Saudi Arabia\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd9\\x85\\xd9\\x85\\xd9\\x84\\xd9\\x83\\xd8\\xa9 \\xd8\\xa7\\xd9\\x84\\xd8\\xb9\\xd8\\xb1\\xd8\\xa8\\xd9\\x8a\\xd8\\xa9 \\xd8\\xa7\\xd9\\x84\\xd8\\xb3\\xd8\\xb9\\xd9\\x88\\xd8\\xaf\\xd9\\x8a\\xd8\\xa9\\0\"\n    \"SAR\\0\"\n    \"Saudi Riyal\\0\"\n    \"\\xd8\\xb1\\xd9\\x8a\\xd8\\xa7\\xd9\\x84 \\xd8\\xb3\\xd8\\xb9\\xd9\\x88\\xd8\\xaf\\xd9\\x8a\\0\"\n    \"SWE\\0\"\n    \"Sweden\\0\"\n    \"Sverige\\0\"\n    \"SEK\\0\"\n    \"Swedish Krona\\0\"\n    \"svensk krona\\0\"\n    \"SGP\\0\"\n    \"Singapore\\0\"\n    \"\\xe6\\x96\\xb0\\xe5\\x8a\\xa0\\xe5\\x9d\\xa1\\0\"\n    \"SGD\\0\"\n    \"Singapore Dollar\\0\"\n    \"\\xe6\\x96\\xb0\\xe5\\x8a\\xa0\\xe5\\x9d\\xa1\\xe5\\x85\\x83\\0\"\n    \"SVN\\0\"\n    \"Slovenia\\0\"\n    \"Slovenija\\0\"\n    \"evro\\0\"\n    \"SVK\\0\"\n    \"Slovakia\\0\"\n    \"Slovensko\\0\"\n    \"El Salvador\\0\"\n    \"SYR\\0\"\n    \"Syria\\0\"\n    \"\\xd8\\xb3\\xd9\\x88\\xd8\\xb1\\xd9\\x8a\\xd8\\xa7\\0\"\n    \"SYP\\0\"\n    \"Syrian Pound\\0\"\n    \"\\xd9\\x84\\xd9\\x8a\\xd8\\xb1\\xd8\\xa9 \\xd8\\xb3\\xd9\\x88\\xd8\\xb1\\xd9\\x8a\\xd8\\xa9\\0\"\n    \"Thailand\\0\"\n    \"THB\\0\"\n    \"Thai Baht\\0\"\n    \"\\xe0\\xb8\\x9a\\xe0\\xb8\\xb2\\xe0\\xb8\\x97\\xe0\\xb9\\x84\\xe0\\xb8\\x97\\xe0\\xb8\\xa2\\0\"\n    \"TJK\\0\"\n    \"Tajikistan\\0\"\n    \"\\xd0\\xa2\\xd0\\xbe\\xd2\\xb7\\xd0\\xb8\\xd0\\xba\\xd0\\xb8\\xd1\\x81\\xd1\\x82\\xd0\\xbe\\xd0\\xbd\\0\"\n    \"TJS\\0\"\n    \"Tajikistani Somoni\\0\"\n    \"\\xd0\\xa1\\xd0\\xbe\\xd0\\xbc\\xd0\\xbe\\xd0\\xbd\\xd3\\xa3\\0\"\n    \"TUN\\0\"\n    \"Tunisia\\0\"\n    \"\\xd8\\xaa\\xd9\\x88\\xd9\\x86\\xd8\\xb3\\0\"\n    \"TND\\0\"\n    \"Tunisian Dinar\\0\"\n    \"\\xd8\\xaf\\xd9\\x8a\\xd9\\x86\\xd8\\xa7\\xd8\\xb1\\xd8\\xaa\\xd9\\x88\\xd9\\x86\\xd8\\xb3\\xd9\\x8a\\0\"\n    \"TUR\\0\"\n    \"Turkey\\0\"\n    \"T\\xc3\\xbcrkiye\\0\"\n    \"TRY\\0\"\n    \"Turkish Lira\\0\"\n    \"T\\xc3\\xbcrk Liras\\xc4\\xb1\\0\"\n    \"TTO\\0\"\n    \"Trinidad and Tobago\\0\"\n    \"TTD\\0\"\n    \"Trinidad and Tobago Dollar\\0\"\n    \"TWN\\0\"\n    \"Taiwan\\0\"\n    \"\\xe5\\x8f\\xb0\\xe6\\xb9\\xbe\\0\"\n    \"TWD\\0\"\n    \"New Taiwan Dollar\\0\"\n    \"\\xe6\\x96\\xb0\\xe8\\x87\\xba\\xe5\\xb9\\xa3\\0\"\n    \"Ukraine\\0\"\n    \"\\xd0\\xa3\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\xd1\\x97\\xd0\\xbd\\xd0\\xb0\\0\"\n    \"UAH\\0\"\n    \"Ukrainian Hryvnia\\0\"\n    \"\\xd1\\x83\\xd0\\xba\\xd1\\x80\\xd0\\xb0\\xd1\\x97\\xd0\\xbd\\xd1\\x81\\xd1\\x8c\\xd0\\xba\\xd0\\xb0 \\xd0\\xb3\\xd1\\x80\\xd0\\xb8\\xd0\\xb2\\xd0\\xbd\\xd1\\x8f\\0\"\n    \"USA\\0\"\n    \"United States\\0\"\n    \"URY\\0\"\n    \"Uruguay\\0\"\n    \"UYU\\0\"\n    \"Uruguayan Peso\\0\"\n    \"peso uruguayo\\0\"\n    \"Uzbekistan\\0\"\n    \"O\\xca\\xbbzbekiston\\0\"\n    \"UZS\\0\"\n    \"Uzbekistan Som\\0\"\n    \"O\\xca\\xbbzbekiston so\\xca\\xbbm\\0\"\n    \"VEN\\0\"\n    \"Venezuela\\0\"\n    \"VEF\\0\"\n    \"Venezuelan Bol\\xc3\\xadvar\\0\"\n    \"bol\\xc3\\xadvar venezolano\\0\"\n    \"VNM\\0\"\n    \"Vietnam\\0\"\n    \"Vi\\xe1\\xbb\\x87t Nam\\0\"\n    \"VND\\0\"\n    \"Vietnamese Dong\\0\"\n    \"\\xc4\\x90\\xe1\\xbb\\x93ng Vi\\xe1\\xbb\\x87t Nam\\0\"\n    \"YEM\\0\"\n    \"Yemen\\0\"\n    \"\\xd8\\xa7\\xd9\\x84\\xd9\\x8a\\xd9\\x85\\xd9\\x86\\0\"\n    \"YER\\0\"\n    \"Yemeni Rial\\0\"\n    \"\\xd8\\xb1\\xd9\\x8a\\xd8\\xa7\\xd9\\x84 \\xd9\\x8a\\xd9\\x85\\xd9\\x86\\xd9\\x8a\\0\"\n    \"ZAF\\0\"\n    \"South Africa\\0\"\n    \"ZAR\\0\"\n    \"South African Rand\\0\"\n    \"ZWE\\0\"\n    \"Zimbabwe\\0\"\n};\n\n#endif\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/RegionInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Globalization/CultureInfoInternals.h\"\n#include \"icalls/mscorlib/System.Globalization/CultureInfoTables.h\"\n#include \"icalls/mscorlib/System.Globalization/RegionInfo.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/String.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Globalization\n{\n    static bool ConstructRegion(Il2CppRegionInfo* regionInfo, const RegionInfoEntry* ri)\n    {\n#if NET_4_0\n        regionInfo->geo_id = ri->geo_id;\n#else\n        regionInfo->region_id = ri->region_id;\n#endif\n        IL2CPP_OBJECT_SETREF(regionInfo, iso2name, vm::String::New(idx2string(ri->iso2name)));\n        IL2CPP_OBJECT_SETREF(regionInfo, iso3name, vm::String::New(idx2string(ri->iso3name)));\n        IL2CPP_OBJECT_SETREF(regionInfo, win3name, vm::String::New(idx2string(ri->win3name)));\n        IL2CPP_OBJECT_SETREF(regionInfo, english_name, vm::String::New(idx2string(ri->english_name)));\n        IL2CPP_OBJECT_SETREF(regionInfo, currency_symbol, vm::String::New(idx2string(ri->currency_symbol)));\n        IL2CPP_OBJECT_SETREF(regionInfo, iso_currency_symbol, vm::String::New(idx2string(ri->iso_currency_symbol)));\n        IL2CPP_OBJECT_SETREF(regionInfo, currency_english_name, vm::String::New(idx2string(ri->currency_english_name)));\n\n        return true;\n    }\n\n    static int RegionNameLocator(const void *a, const void *b)\n    {\n        const char* aa = (const char*)a;\n        const RegionInfoNameEntry* bb = (const RegionInfoNameEntry*)b;\n\n        return strcmp(aa, idx2string(bb->name));\n    }\n\n    bool RegionInfo::construct_internal_region_from_name(Il2CppRegionInfo* regionInfo, Il2CppString* name)\n    {\n        std::string n = utils::StringUtils::Utf16ToUtf8(utils::StringUtils::GetChars(name));\n        RegionInfoNameEntry* nameEntry = (RegionInfoNameEntry*)bsearch(n.c_str(), region_name_entries, NUM_REGION_ENTRIES,\n                sizeof(RegionInfoNameEntry), RegionNameLocator);\n\n        if (nameEntry == NULL)\n            return false;\n\n        return ConstructRegion(regionInfo, &region_entries[nameEntry->region_entry_index]);\n    }\n} /* namespace Globalization */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Globalization/RegionInfo.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Globalization\n{\n    class LIBIL2CPP_CODEGEN_API RegionInfo\n    {\n    public:\n        static bool construct_internal_region_from_name(Il2CppRegionInfo* regionInfo, Il2CppString* name);\n    };\n} /* namespace Globalization */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.IO/DriveInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.IO/DriveInfo.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace IO\n{\n    bool DriveInfo::GetDiskFreeSpaceInternal(Il2CppString* pathName, uint64_t* freeBytesAvail, uint64_t* totalNumberOfBytes, uint64_t* totalNumberOfFreeBytes, MonoIOError* error)\n    {\n        NOT_SUPPORTED_IL2CPP(DriveInfo::GetDiskFreeSpaceInternal, \"This icall is not supported by il2cpp.\");\n\n        return false;\n    }\n\n    uint32_t DriveInfo::GetDriveTypeInternal(Il2CppString* rootPathName)\n    {\n        NOT_SUPPORTED_IL2CPP(DriveInfo::GetDriveTypeInternal, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n#if NET_4_0\n    Il2CppString* DriveInfo::GetDriveFormat(Il2CppString* rootPathName)\n    {\n        NOT_IMPLEMENTED_ICALL(DriveInfo::GetDriveFormat);\n        IL2CPP_UNREACHABLE;\n        return NULL;\n    }\n\n#endif\n} /* namespace IO */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.IO/DriveInfo.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\ntypedef int32_t MonoIOError;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace IO\n{\n    class LIBIL2CPP_CODEGEN_API DriveInfo\n    {\n    public:\n        static uint32_t GetDriveTypeInternal(Il2CppString* rootPathName);\n        static bool GetDiskFreeSpaceInternal(Il2CppString* pathName, uint64_t* freeBytesAvail, uint64_t* totalNumberOfBytes, uint64_t* totalNumberOfFreeBytes, MonoIOError* error);\n#if NET_4_0\n        static Il2CppString* GetDriveFormat(Il2CppString* rootPathName);\n#endif\n    };\n} /* namespace IO */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.IO/MonoIO.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"icalls/mscorlib/System.IO/MonoIO.h\"\n#include \"os/Directory.h\"\n#include \"os/ErrorCodes.h\"\n#include \"os/File.h\"\n#include \"utils/PathUtils.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Path.h\"\n#include \"vm/String.h\"\n#include \"vm/Exception.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace IO\n{\n    Il2CppChar MonoIO::get_AltDirectorySeparatorChar(void)\n    {\n#if IL2CPP_COMPILER_MSVC\n        return '/'; /* forward slash */\n#else\n        return '/'; /* slash, same as DirectorySeparatorChar */\n#endif\n    }\n\n    bool MonoIO::Close(Il2CppIntPtr handle, int *error)\n    {\n        il2cpp::os::FileHandle* fileHandle = (il2cpp::os::FileHandle*)handle.m_value;\n\n        return il2cpp::os::File::Close(fileHandle, error);\n    }\n\n    bool MonoIO::CopyFile(Il2CppString *src, Il2CppString *dest, bool overwrite, int *error)\n    {\n        const std::string srcString(il2cpp::utils::StringUtils::Utf16ToUtf8(src->chars));\n        const std::string destString(il2cpp::utils::StringUtils::Utf16ToUtf8(dest->chars));\n\n        return il2cpp::os::File::CopyFile(srcString, destString, overwrite, error);\n    }\n\n    Il2CppIntPtr MonoIO::get_ConsoleError(void)\n    {\n        Il2CppIntPtr ret;\n        ret.m_value = il2cpp::os::File::GetStdError();\n        return ret;\n    }\n\n    Il2CppIntPtr  MonoIO::get_ConsoleInput(void)\n    {\n        Il2CppIntPtr ret;\n        ret.m_value = il2cpp::os::File::GetStdInput();\n        return ret;\n    }\n\n    Il2CppIntPtr  MonoIO::get_ConsoleOutput(void)\n    {\n        Il2CppIntPtr ret;\n        ret.m_value = il2cpp::os::File::GetStdOutput();\n        return ret;\n    }\n\n    bool MonoIO::CreateDirectory(Il2CppString* path, int32_t* error)\n    {\n        return il2cpp::os::Directory::Create(il2cpp::utils::StringUtils::Utf16ToUtf8(path->chars), error);\n    }\n\n    bool MonoIO::DeleteFile(Il2CppString *path, int *error)\n    {\n        return il2cpp::os::File::DeleteFile(il2cpp::utils::StringUtils::Utf16ToUtf8(path->chars), error);\n    }\n\n    Il2CppChar MonoIO::get_DirectorySeparatorChar(void)\n    {\n        return IL2CPP_DIR_SEPARATOR;\n    }\n\n    Il2CppString * MonoIO::GetCurrentDirectory(int *error)\n    {\n        return vm::String::New(il2cpp::os::Directory::GetCurrent(error).c_str());\n    }\n\n    int MonoIO::GetFileAttributes(Il2CppString* path, int* error)\n    {\n        return il2cpp::os::File::GetFileAttributes(il2cpp::utils::StringUtils::Utf16ToUtf8(path->chars), error);\n    }\n\n    bool MonoIO::GetFileStat(Il2CppString* path, FileStat * stat, int32_t* error)\n    {\n        os::FileStat fileStat;\n\n        const bool ret = il2cpp::os::File::GetFileStat(il2cpp::utils::StringUtils::Utf16ToUtf8(path->chars), &fileStat, error);\n\n        if (ret)\n        {\n#if !NET_4_0\n            stat->name = vm::String::New(fileStat.name.c_str());\n#endif\n            stat->attributes = fileStat.attributes;\n            stat->length = fileStat.length;\n            stat->creation_time = fileStat.creation_time;\n            stat->last_access_time = fileStat.last_access_time;\n            stat->last_write_time = fileStat.last_write_time;\n        }\n\n        return ret;\n    }\n\n    int MonoIO::GetFileType(Il2CppIntPtr handle, int *error)\n    {\n        il2cpp::os::FileHandle* h = (il2cpp::os::FileHandle*)handle.m_value;\n        return il2cpp::os::File::GetFileType(h);\n    }\n\n    int64_t MonoIO::GetLength(Il2CppIntPtr handle, int *error)\n    {\n        il2cpp::os::FileHandle* h = (il2cpp::os::FileHandle*)handle.m_value;\n        return il2cpp::os::File::GetLength(h, error);\n    }\n\n    Il2CppIntPtr MonoIO::Open(Il2CppString *filename, int mode, int access_mode, int share, int options, int *error)\n    {\n        Il2CppIntPtr ret;\n        ret.m_value = il2cpp::os::File::Open(il2cpp::utils::StringUtils::Utf16ToUtf8(filename->chars), mode, access_mode, share, options, error);\n        return ret;\n    }\n\n    Il2CppChar MonoIO::get_PathSeparator(void)\n    {\n#if IL2CPP_COMPILER_MSVC\n        return ';'; /* semicolon */\n#else\n        return ':'; /* colon */\n#endif\n    }\n\n    int MonoIO::Read(Il2CppIntPtr handle, Il2CppArray *dest, int dest_offset, int count, int *error)\n    {\n        IL2CPP_ASSERT(dest != NULL);\n\n        *error = 0; // ERROR_SUCCESS\n\n        if (((uint32_t)dest_offset + count) > il2cpp::vm::Array::GetLength(dest))\n            return 0;\n\n        il2cpp::os::FileHandle* h = (il2cpp::os::FileHandle*)handle.m_value;\n\n        char *buffer = il2cpp_array_addr(dest, char, dest_offset);\n\n        return il2cpp::os::File::Read(h, buffer, count, error);\n    }\n\n    bool MonoIO::SetCurrentDirectory(Il2CppString* path, int* error)\n    {\n        return il2cpp::os::Directory::SetCurrent(il2cpp::utils::StringUtils::Utf16ToUtf8(path->chars), error);\n    }\n\n    bool MonoIO::SetLength(Il2CppIntPtr handle, int64_t length, int *error)\n    {\n        il2cpp::os::FileHandle* fileHandle = (il2cpp::os::FileHandle*)handle.m_value;\n        return il2cpp::os::File::SetLength(fileHandle, length, error);\n    }\n\n    int64_t MonoIO::Seek(Il2CppIntPtr handle, int64_t offset, int origin, int *error)\n    {\n        il2cpp::os::FileHandle* fileHandle = (il2cpp::os::FileHandle*)handle.m_value;\n        return il2cpp::os::File::Seek(fileHandle, offset, origin, error);\n    }\n\n    int MonoIO::Write(Il2CppIntPtr handle, Il2CppArray * src, int src_offset, int count, int * error)\n    {\n        IL2CPP_ASSERT(src != NULL);\n\n        *error = 0; // ERROR_SUCCESS\n\n        if ((uint32_t)(src_offset + count) > il2cpp::vm::Array::GetLength(src))\n            return 0;\n\n        il2cpp::os::FileHandle* h = (il2cpp::os::FileHandle*)handle.m_value;\n        char *buffer = il2cpp_array_addr(src, char, src_offset);\n\n        return il2cpp::os::File::Write(h, buffer, count, error);\n    }\n\n    Il2CppChar MonoIO::get_VolumeSeparatorChar(void)\n    {\n#if IL2CPP_COMPILER_MSVC\n        return ':'; /* colon */\n#else\n        return '/'; /* forward slash */\n#endif\n    }\n\n    bool MonoIO::RemoveDirectory(Il2CppString* path, MonoIOError* error)\n    {\n        return il2cpp::os::Directory::Remove(il2cpp::utils::StringUtils::Utf16ToUtf8(path->chars), error);\n    }\n\n    Il2CppArray* MonoIO::GetFileSystemEntries(Il2CppString* path, Il2CppString* path_with_pattern, int32_t attrs, int32_t mask, MonoIOError* error)\n    {\n        const std::string pathString(il2cpp::utils::StringUtils::Utf16ToUtf8(path->chars));\n        const std::string pathPatternString(il2cpp::utils::StringUtils::Utf16ToUtf8(path_with_pattern->chars));\n\n        const std::set<std::string> entries(il2cpp::os::Directory::GetFileSystemEntries(pathString, pathPatternString, attrs, mask, error));\n\n        Il2CppClass *klass = il2cpp::vm::Class::GetArrayClass(il2cpp_defaults.string_class, 1);\n        Il2CppArray* array = (Il2CppArray*)il2cpp::vm::Array::NewSpecific(klass, (il2cpp_array_size_t)entries.size());\n\n        size_t index = 0;\n\n        for (std::set<std::string>::const_iterator entry = entries.begin(), end = entries.end(); entry  != end; ++entry)\n            il2cpp_array_setref(array, index++, il2cpp::vm::String::New(entry->c_str()));\n\n        return array;\n    }\n\n    bool MonoIO::MoveFile(Il2CppString* src, Il2CppString* dest, MonoIOError* error)\n    {\n        const std::string srcString(il2cpp::utils::StringUtils::Utf16ToUtf8(src->chars));\n        const std::string destString(il2cpp::utils::StringUtils::Utf16ToUtf8(dest->chars));\n\n        return il2cpp::os::File::MoveFile(srcString, destString, error);\n    }\n\n    bool MonoIO::ReplaceFile(Il2CppString* sourceFileName, Il2CppString* destinationFileName, Il2CppString* destinationBackupFileName, bool ignoreMetadataErrors, MonoIOError* error)\n    {\n        const std::string srcString(il2cpp::utils::StringUtils::Utf16ToUtf8(sourceFileName->chars));\n        const std::string destString(il2cpp::utils::StringUtils::Utf16ToUtf8(destinationFileName->chars));\n        const std::string destBackupString(destinationBackupFileName ? il2cpp::utils::StringUtils::Utf16ToUtf8(destinationBackupFileName->chars) : \"\");\n\n        return il2cpp::os::File::ReplaceFile(srcString, destString, destBackupString, ignoreMetadataErrors, error);\n    }\n\n    bool MonoIO::SetFileAttributes(Il2CppString* path, FileAttributes attrs, MonoIOError* error)\n    {\n        return il2cpp::os::File::SetFileAttributes(il2cpp::utils::StringUtils::Utf16ToUtf8(path->chars), (UnityPalFileAttributes)attrs, error);\n    }\n\n    bool MonoIO::Flush(Il2CppIntPtr handle, MonoIOError* error)\n    {\n        il2cpp::os::FileHandle* fileHandle = (il2cpp::os::FileHandle*)handle.m_value;\n        return il2cpp::os::File::Flush(fileHandle, error);\n    }\n\n    bool MonoIO::SetFileTime(Il2CppIntPtr handle, int64_t creation_time, int64_t last_access_time, int64_t last_write_time, MonoIOError* error)\n    {\n        il2cpp::os::FileHandle* fileHandle = (il2cpp::os::FileHandle*)handle.m_value;\n        return il2cpp::os::File::SetFileTime(fileHandle, creation_time, last_access_time, last_write_time, error);\n    }\n\n    void MonoIO::Lock(Il2CppIntPtr handle, int64_t position, int64_t length, MonoIOError* error)\n    {\n        il2cpp::os::FileHandle* fileHandle = (il2cpp::os::FileHandle*)handle.m_value;\n        return il2cpp::os::File::Lock(fileHandle, position, length, error);\n    }\n\n    void MonoIO::Unlock(Il2CppIntPtr handle, int64_t position, int64_t length, MonoIOError* error)\n    {\n        il2cpp::os::FileHandle* fileHandle = (il2cpp::os::FileHandle*)handle.m_value;\n        return il2cpp::os::File::Unlock(fileHandle, position, length, error);\n    }\n\n    bool MonoIO::CreatePipe(Il2CppIntPtr* read_handle, Il2CppIntPtr* write_handle)\n    {\n        MonoIOError error;\n        return CreatePipe40(read_handle, write_handle, &error);\n    }\n\n    bool MonoIO::DuplicateHandle(Il2CppIntPtr source_process_handle, Il2CppIntPtr source_handle, Il2CppIntPtr target_process_handle, Il2CppIntPtr* target_handle, int32_t access, int32_t inherit, int32_t options)\n    {\n        MonoIOError error;\n        return DuplicateHandle40(source_process_handle, source_handle, target_process_handle, target_handle, access, inherit, options, &error);\n    }\n\n// This is never called from Mono.\n    int32_t MonoIO::GetTempPath(Il2CppString** path)\n    {\n        const std::string tempPath(il2cpp::vm::Path::GetTempPath());\n        *path = vm::String::New(tempPath.c_str());\n        return utils::StringUtils::GetLength(*path);\n    }\n\n    bool MonoIO::CreatePipe40(Il2CppIntPtr* read_handle, Il2CppIntPtr* write_handle, MonoIOError* error)\n    {\n        il2cpp::os::FileHandle** input = (il2cpp::os::FileHandle**)&read_handle->m_value;\n        il2cpp::os::FileHandle** output = (il2cpp::os::FileHandle**)&write_handle->m_value;\n\n#if IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE\n        vm::Exception::Raise(vm::Exception::GetNotSupportedException(\"Pipes are not supported on WinRT based platforms.\"));\n#else\n        return il2cpp::os::File::CreatePipe(input, output, error);\n#endif\n    }\n\n    bool MonoIO::DuplicateHandle40(Il2CppIntPtr source_process_handle, Il2CppIntPtr source_handle, Il2CppIntPtr target_process_handle, Il2CppIntPtr* target_handle, int32_t access, int32_t inherit, int32_t options, MonoIOError* error)\n    {\n        il2cpp::os::FileHandle* spHandle = (il2cpp::os::FileHandle*)source_process_handle.m_value;\n        il2cpp::os::FileHandle* sHandle = (il2cpp::os::FileHandle*)source_handle.m_value;\n        il2cpp::os::FileHandle* tpHandle = (il2cpp::os::FileHandle*)target_process_handle.m_value;\n        il2cpp::os::FileHandle** tHandle = (il2cpp::os::FileHandle**)&target_handle->m_value;\n        return il2cpp::os::File::DuplicateHandle(spHandle, sHandle, tpHandle, tHandle, access, inherit, options, error);\n    }\n\n    bool MonoIO::RemapPath(Il2CppString* path, Il2CppString** newPath)\n    {\n        *newPath = NULL;\n        return false;\n    }\n\n#if NET_4_0\n\n    static int32_t CloseFindHandle(os::Directory::FindHandle* findHandle)\n    {\n        int32_t result = findHandle->CloseOSHandle();\n\n        findHandle->~FindHandle();\n        utils::Memory::Free(findHandle);\n\n        return result;\n    }\n\n    int32_t MonoIO::FindClose(Il2CppIntPtr handle)\n    {\n        return CloseFindHandle(static_cast<os::Directory::FindHandle*>(handle.m_value));\n    }\n\n    Il2CppString* PrepareFindResult(os::Directory::FindHandle* findHandle, Il2CppNativeString& fileName, int32_t* resultAttributes, MonoIOError* error)\n    {\n        while (fileName.empty() || fileName == IL2CPP_NATIVE_STRING(\".\") || fileName == IL2CPP_NATIVE_STRING(\"..\"))\n        {\n            os::ErrorCode findError = os::Directory::FindNextFile(findHandle, &fileName, resultAttributes);\n            if (findError != os::kErrorCodeSuccess)\n            {\n                if (findError != os::kErrorCodeNoMoreFiles)\n                    *error = findError;\n\n                return NULL;\n            }\n        }\n\n        // Convert file name to UTF16\n        DECLARE_NATIVE_STRING_AS_STRING_VIEW_OF_IL2CPP_CHARS(fileNameIl2CppChars, fileName);\n        DECLARE_NATIVE_STRING_AS_STRING_VIEW_OF_IL2CPP_CHARS(directoryNameIl2CppChars, findHandle->directoryPath);\n\n        // Allocate result string\n        Il2CppString* result = vm::String::NewSize(static_cast<int32_t>(directoryNameIl2CppChars.Length() + fileNameIl2CppChars.Length() + 1));\n        Il2CppChar* targetBuffer = utils::StringUtils::GetChars(result);\n\n        // Copy in directory name\n        memcpy(targetBuffer, directoryNameIl2CppChars.Str(), sizeof(Il2CppChar) * directoryNameIl2CppChars.Length());\n\n        // Copy in directory separator\n        targetBuffer[directoryNameIl2CppChars.Length()] = IL2CPP_DIR_SEPARATOR;\n\n        // Copy in file name\n        memcpy(targetBuffer + directoryNameIl2CppChars.Length() + 1, fileNameIl2CppChars.Str(), sizeof(Il2CppChar) * fileNameIl2CppChars.Length());\n\n        *error = os::kErrorCodeSuccess;\n        return result;\n    }\n\n    Il2CppString* MonoIO::FindFirst(Il2CppString* path, Il2CppString* pathWithPattern, int32_t* resultAttributes, MonoIOError* error, Il2CppIntPtr* handle)\n    {\n        DECLARE_IL2CPP_STRING_AS_STRING_VIEW_OF_NATIVE_CHARS(pathWithPatternNative, pathWithPattern);\n        os::Directory::FindHandle* findHandle = new(utils::Memory::Malloc(sizeof(os::Directory::FindHandle))) os::Directory::FindHandle(pathWithPatternNative);\n\n        Il2CppNativeString fileName;\n        os::ErrorCode findError = os::Directory::FindFirstFile(findHandle, pathWithPatternNative, &fileName, resultAttributes);\n        if (findError != os::kErrorCodeSuccess)\n        {\n            // mscorlib expects no error if we didn't find any files\n            if (findError != os::kErrorCodeFileNotFound && findError != os::kErrorCodeNoMoreFiles)\n                *error = findError;\n\n            return NULL;\n        }\n\n        handle->m_value = findHandle;\n        Il2CppString* result = PrepareFindResult(findHandle, fileName, resultAttributes, error);\n\n        if (result == NULL)\n        {\n            handle->m_value = NULL;\n            CloseFindHandle(findHandle);\n        }\n\n        return result;\n    }\n\n    Il2CppString* MonoIO::FindNext(Il2CppIntPtr handle, int32_t* resultAttributes, MonoIOError* error)\n    {\n        Il2CppNativeString fileName;\n        os::Directory::FindHandle* findHandle = static_cast<os::Directory::FindHandle*>(handle.m_value);\n        return PrepareFindResult(findHandle, fileName, resultAttributes, error);\n    }\n\n    void MonoIO::DumpHandles()\n    {\n        NOT_IMPLEMENTED_ICALL(MonoIO::DumpHandles);\n        IL2CPP_UNREACHABLE;\n    }\n\n#endif\n} /* namespace IO */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.IO/MonoIO.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppArray;\nstruct Il2CppString;\n\ntypedef int32_t MonoIOError;\ntypedef int32_t FileAttributes;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace IO\n{\n    struct FileStat\n    {\n#if !NET_4_0\n        Il2CppString *name;\n#endif\n        int32_t attributes;\n        int64_t length;\n        int64_t creation_time;\n        int64_t last_access_time;\n        int64_t last_write_time;\n    };\n\n    class LIBIL2CPP_CODEGEN_API MonoIO\n    {\n    public:\n        static bool Close(Il2CppIntPtr handle, int *error);\n        static bool CopyFile(Il2CppString* src, Il2CppString* dest, bool overwrite, MonoIOError* error);\n        static bool CreateDirectory(Il2CppString* path, MonoIOError* error);\n        static bool CreatePipe(Il2CppIntPtr* read_handle, Il2CppIntPtr* write_handle);\n        static bool DeleteFile(Il2CppString* path, MonoIOError* error);\n        static bool DuplicateHandle(Il2CppIntPtr source_process_handle, Il2CppIntPtr source_handle, Il2CppIntPtr target_process_handle, Il2CppIntPtr* target_handle, int32_t access, int32_t inherit, int32_t options);\n        static bool Flush(Il2CppIntPtr handle, MonoIOError* error);\n        static Il2CppString* GetCurrentDirectory(MonoIOError* error);\n        static FileAttributes GetFileAttributes(Il2CppString* path, MonoIOError* error);\n        static bool GetFileStat(Il2CppString* path, FileStat * stat, int32_t* error);\n        static Il2CppArray* GetFileSystemEntries(Il2CppString* path, Il2CppString* path_with_pattern, int32_t attrs, int32_t mask, MonoIOError* error);\n        static int GetFileType(Il2CppIntPtr handle, int *error);\n        static int64_t GetLength(Il2CppIntPtr handle, int *error);\n        static int32_t GetTempPath(Il2CppString** path);\n        static void Lock(Il2CppIntPtr handle, int64_t position, int64_t length, MonoIOError* error);\n        static bool MoveFile(Il2CppString* src, Il2CppString* dest, MonoIOError* error);\n        static Il2CppIntPtr Open(Il2CppString *filename, int mode, int access_mode, int share, int options, int *error);\n        static int Read(Il2CppIntPtr handle, Il2CppArray *dest, int dest_offset, int count, int *error);\n        static bool RemoveDirectory(Il2CppString* path, MonoIOError* error);\n        static bool ReplaceFile(Il2CppString* sourceFileName, Il2CppString* destinationFileName, Il2CppString* destinationBackupFileName, bool ignoreMetadataErrors, MonoIOError* error);\n        static int64_t Seek(Il2CppIntPtr handle, int64_t offset, int origin, int *error);\n        static bool SetCurrentDirectory(Il2CppString* path, int* error);\n        static bool SetFileAttributes(Il2CppString* path, FileAttributes attrs, MonoIOError* error);\n        static bool SetFileTime(Il2CppIntPtr handle, int64_t creation_time, int64_t last_access_time, int64_t last_write_time, MonoIOError* error);\n        static bool SetLength(Il2CppIntPtr handle, int64_t length, int *error);\n        static void Unlock(Il2CppIntPtr handle, int64_t position, int64_t length, MonoIOError* error);\n        static int Write(Il2CppIntPtr handle, Il2CppArray * src, int src_offset, int count, int * error);\n        static Il2CppChar get_AltDirectorySeparatorChar(void);\n        static Il2CppIntPtr get_ConsoleError(void);\n        static Il2CppIntPtr get_ConsoleInput(void);\n        static Il2CppIntPtr get_ConsoleOutput(void);\n        static Il2CppChar get_DirectorySeparatorChar(void);\n        static Il2CppChar get_PathSeparator(void);\n        static Il2CppChar get_VolumeSeparatorChar(void);\n        static bool CreatePipe40(Il2CppIntPtr* read_handle, Il2CppIntPtr* write_handle, MonoIOError* error);\n        static bool DuplicateHandle40(Il2CppIntPtr source_process_handle, Il2CppIntPtr source_handle, Il2CppIntPtr target_process_handle, Il2CppIntPtr* target_handle, int32_t access, int32_t inherit, int32_t options, MonoIOError* error);\n        static bool RemapPath(Il2CppString* path, Il2CppString** newPath);\n\n#if NET_4_0\n        static int32_t FindClose(Il2CppIntPtr handle);\n        static Il2CppString* FindFirst(Il2CppString* path, Il2CppString* pathWithPattern, int32_t* resultAttributes, MonoIOError* error, Il2CppIntPtr* handle);\n        static Il2CppString* FindNext(Il2CppIntPtr handle, int32_t* result_attr, MonoIOError* error);\n        static void DumpHandles();\n#endif\n    };\n} /* namespace IO */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.IO/Path.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.IO/Path.h\"\n#include \"vm/Path.h\"\n#include \"vm/String.h\"\n\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace IO\n{\n    Il2CppString* Path::get_temp_path()\n    {\n        return il2cpp::vm::String::New(il2cpp::vm::Path::GetTempPath().c_str());\n    }\n} /* namespace IO */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.IO/Path.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace IO\n{\n    class LIBIL2CPP_CODEGEN_API Path\n    {\n    public:\n        static Il2CppString* get_temp_path();\n    };\n} /* namespace IO */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/Assembly.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <stddef.h>\n#include <vector>\n#include <algorithm>\n#include \"icalls/mscorlib/System.Reflection/Assembly.h\"\n#include \"icalls/mscorlib/System.Reflection/Module.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/PathUtils.h\"\n#include \"os/File.h\"\n#include \"os/MemoryMappedFile.h\"\n#include \"os/Mutex.h\"\n#include \"os/Path.h\"\n#include \"utils/Memory.h\"\n#include \"utils/Runtime.h\"\n#include \"vm/Array.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/AssemblyName.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Field.h\"\n#include \"vm/Image.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Object.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/String.h\"\n#include \"vm/Type.h\"\n#include \"vm/Array.h\"\n#include \"class-internals.h\"\n#include <limits>\n\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    Il2CppString* Assembly::get_fullname(Il2CppReflectionAssembly *assembly)\n    {\n        return vm::String::New(vm::AssemblyName::AssemblyNameToString(assembly->assembly->aname).c_str());\n    }\n\n    Il2CppString*  Assembly::get_location(Il2CppReflectionAssembly *assembly)\n    {\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(Assembly::get_location, \"Assembly::get_location is not functional on il2cpp\");\n        return vm::String::New(\"\");\n    }\n\n    Il2CppReflectionAssembly* Assembly::GetEntryAssembly()\n    {\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(Assembly::GetEntryAssembly, \"In the case of Unity this is always NULL. For a normal exe this is the assembly with Main.\");\n        return NULL;\n    }\n\n    Il2CppReflectionAssembly* Assembly::GetExecutingAssembly()\n    {\n        return vm::Reflection::GetAssemblyObject(MetadataCache::GetAssemblyFromIndex(vm::Image::GetExecutingImage()->assemblyIndex));\n    }\n\n#define CHECK_IF_NULL(v)    \\\n    if ( (v) == NULL && throwOnError ) \\\n        Exception::Raise (Exception::GetTypeLoadException ()); \\\n    if ( (v) == NULL ) \\\n        return NULL;\n\n    Il2CppReflectionType* Assembly::InternalGetType(Il2CppReflectionAssembly *assembly, mscorlib_System_Reflection_Module *, Il2CppString* name, bool throwOnError, bool ignoreCase)\n    {\n        std::string str = utils::StringUtils::Utf16ToUtf8(utils::StringUtils::GetChars(name));\n\n        il2cpp::vm::TypeNameParseInfo info;\n        il2cpp::vm::TypeNameParser parser(str, info, false);\n\n        if (!parser.Parse())\n        {\n            if (throwOnError)\n                Exception::Raise(Exception::GetTypeLoadException());\n            else\n                return NULL;\n        }\n\n        CHECK_IF_NULL(assembly);\n\n        Il2CppImage *image = (Il2CppImage*)vm::Assembly::GetImage(assembly->assembly);\n\n        CHECK_IF_NULL(image);\n\n        Il2CppClass *klass = Image::FromTypeNameParseInfo(image, info, ignoreCase);\n\n        CHECK_IF_NULL(klass);\n\n        il2cpp::vm::Class::Init(klass);\n\n        const Il2CppType *type = Class::GetType(klass, info);\n\n        CHECK_IF_NULL(type);\n\n        return il2cpp::vm::Reflection::GetTypeObject(type);\n    }\n\n    Il2CppReflectionAssembly* Assembly::load_with_partial_name(Il2CppString* name, mscorlib_System_Security_Policy_Evidence*  evidence)\n    {\n        const Il2CppAssembly* assembly = vm::Assembly::GetLoadedAssembly(il2cpp::utils::StringUtils::Utf16ToUtf8(name->chars).c_str());\n        if (assembly != NULL)\n            return vm::Reflection::GetAssemblyObject(assembly);\n\n        return NULL;\n    }\n\n    void Assembly::FillName(Il2CppReflectionAssembly * ass, mscorlib_System_Reflection_AssemblyName * aname)\n    {\n        Il2CppObject* assemblyNameObject = reinterpret_cast<Il2CppObject*>(aname);\n        Il2CppClass* assemblyNameType = assemblyNameObject->klass;\n        const Il2CppAssemblyName* assemblyName = &ass->assembly->aname;\n\n        // System.Reflection.AssemblyName is not protected from stripping. Since this call will be used\n        // very rarely, instead of including that type to stripper excludes, let's instead set fields only\n        // if they're there.\n        FieldInfo* assemblyNameField = Class::GetFieldFromName(assemblyNameType, \"name\");\n        FieldInfo* codebaseField = Class::GetFieldFromName(assemblyNameType, \"codebase\");\n\n        if (assemblyNameField != NULL)\n            Field::SetValue(assemblyNameObject, assemblyNameField, String::New(MetadataCache::GetStringFromIndex(assemblyName->nameIndex)));\n\n        if (codebaseField != NULL)\n            Field::SetValue(assemblyNameObject, codebaseField, get_code_base(ass, false));\n\n        FieldInfo* field = Class::GetFieldFromName(assemblyNameType, \"major\");\n        if (field != NULL)\n        {\n            int32_t major = assemblyName->major;\n            Field::SetValue(assemblyNameObject, field, &major);\n        }\n\n        field = Class::GetFieldFromName(assemblyNameType, \"minor\");\n        if (field != NULL)\n        {\n            int32_t minor = assemblyName->minor;\n            Field::SetValue(assemblyNameObject, field, &minor);\n        }\n\n        field = Class::GetFieldFromName(assemblyNameType, \"build\");\n        if (field != NULL)\n        {\n            int32_t build = assemblyName->build;\n            Field::SetValue(assemblyNameObject, field, &build);\n        }\n\n        field = Class::GetFieldFromName(assemblyNameType, \"revision\");\n        if (field != NULL)\n        {\n            int32_t revision = assemblyName->revision;\n            Field::SetValue(assemblyNameObject, field, &revision);\n        }\n\n        field = Class::GetFieldFromName(assemblyNameType, \"cultureinfo\");\n        if (field != NULL)\n        {\n            Il2CppClass* cultureInfoType = Class::FromIl2CppType(field->type);\n            FieldInfo* invariantCultureField = Class::GetFieldFromName(cultureInfoType, \"invariant_culture_info\");\n            Il2CppObject* invariantCulture = NULL;\n\n            if (invariantCultureField != NULL)\n                Field::StaticGetValue(invariantCultureField, &invariantCulture);\n\n            Field::SetValue(assemblyNameObject, field, invariantCulture);\n        }\n\n        field = Class::GetFieldFromName(assemblyNameType, \"flags\");\n        if (field != NULL)\n            Field::SetValue(assemblyNameObject, field, const_cast<void*>((const void*)&assemblyName->flags));\n\n        field = Class::GetFieldFromName(assemblyNameType, \"hashalg\");\n        if (field != NULL)\n            Field::SetValue(assemblyNameObject, field, const_cast<void*>((const void*)&assemblyName->hash_alg));\n\n        field = Class::GetFieldFromName(assemblyNameType, \"keypair\");\n        if (field != NULL)\n            Field::SetValue(assemblyNameObject, field, NULL);\n\n        field = Class::GetFieldFromName(assemblyNameType, \"publicKey\");\n        if (field != NULL)\n            Field::SetValue(assemblyNameObject, field, Array::New(il2cpp_defaults.byte_class, 0));\n\n        field = Class::GetFieldFromName(assemblyNameType, \"keyToken\");\n        if (field != NULL)\n        {\n            Il2CppArray* keyTokenManaged = NULL;\n\n            // Set it to non-null only if public key token is not all zeroes\n            for (int i = 0; i < kPublicKeyByteLength; i++)\n            {\n                if (assemblyName->publicKeyToken[i] != 0)\n                {\n                    keyTokenManaged = Array::New(il2cpp_defaults.byte_class, kPublicKeyByteLength);\n                    memcpy(il2cpp::vm::Array::GetFirstElementAddress(keyTokenManaged), assemblyName->publicKeyToken, kPublicKeyByteLength);\n                    break;\n                }\n            }\n\n            Field::SetValue(assemblyNameObject, field, keyTokenManaged);\n        }\n\n        field = Class::GetFieldFromName(assemblyNameType, \"versioncompat\");\n        if (field != NULL)\n        {\n            int32_t kSameProcess = 2;\n            Field::SetValue(assemblyNameObject, field, &kSameProcess);\n        }\n\n        field = Class::GetFieldFromName(assemblyNameType, \"version\");\n        if (field != NULL)\n        {\n            Il2CppClass* versionType = Class::FromIl2CppType(field->type);\n            Il2CppObject* version = Object::New(versionType);\n\n            FieldInfo* versionField = Class::GetFieldFromName(versionType, \"_Major\");\n            if (versionField != NULL)\n            {\n                int32_t major = assemblyName->major;\n                Field::SetValue(version, versionField, &major);\n            }\n\n            versionField = Class::GetFieldFromName(versionType, \"_Minor\");\n            if (versionField != NULL)\n            {\n                int32_t minor = assemblyName->minor;\n                Field::SetValue(version, versionField, &minor);\n            }\n\n            versionField = Class::GetFieldFromName(versionType, \"_Build\");\n            if (versionField != NULL)\n            {\n                int32_t build = assemblyName->build;\n                Field::SetValue(version, versionField, &build);\n            }\n\n            versionField = Class::GetFieldFromName(versionType, \"_Revision\");\n            if (versionField != NULL)\n            {\n                int32_t revision = assemblyName->revision;\n                Field::SetValue(version, versionField, &revision);\n            }\n\n            Field::SetValue(assemblyNameObject, field, version);\n        }\n\n        field = Class::GetFieldFromName(assemblyNameType, \"processor_architecture\");\n        if (field != NULL)\n        {\n            int32_t kMSILArchitecture = 1;\n            Field::SetValue(assemblyNameObject, field, &kMSILArchitecture);\n        }\n    }\n\n    Il2CppArray* Assembly::GetModulesInternal(Il2CppReflectionAssembly * thisPtr)\n    {\n        Il2CppArray* arr = vm::Array::New(il2cpp_defaults.module_class, 1);\n        il2cpp_array_setref(arr, 0, vm::Reflection::GetModuleObject(vm::Assembly::GetImage(thisPtr->assembly)));\n        return arr;\n    }\n\n    bool Assembly::LoadPermissions(mscorlib_System_Reflection_Assembly * a, Il2CppIntPtr* minimum, int32_t* minLength, Il2CppIntPtr* optional, int32_t* optLength, Il2CppIntPtr* refused, int32_t* refLength)\n    {\n        NOT_IMPLEMENTED_ICALL(Assembly::LoadPermissions);\n        return false;\n    }\n\n    Il2CppReflectionAssembly* Assembly::GetCallingAssembly()\n    {\n        return vm::Reflection::GetAssemblyObject(MetadataCache::GetAssemblyFromIndex(Image::GetCallingImage()->assemblyIndex));\n    }\n\n    Il2CppString* Assembly::get_code_base(Il2CppReflectionAssembly * assembly, bool escaped)\n    {\n        std::string executableDirectory = utils::PathUtils::DirectoryName(os::Path::GetExecutablePath());\n        std::replace(executableDirectory.begin(), executableDirectory.end(), '\\\\', '/');\n        return vm::String::New(utils::StringUtils::Printf(\"file://%s/%s.dll\", executableDirectory.c_str(), MetadataCache::GetStringFromIndex(assembly->assembly->aname.nameIndex)).c_str());\n    }\n\n    Il2CppArray* Assembly::GetTypes(Il2CppReflectionAssembly* thisPtr, bool exportedOnly)\n    {\n        const Il2CppImage* image = MetadataCache::GetImageFromIndex(thisPtr->assembly->imageIndex);\n        return Module::InternalGetTypes(vm::Reflection::GetModuleObject(image));\n    }\n\n    Il2CppString* Assembly::InternalImageRuntimeVersion(Il2CppAssembly* self)\n    {\n        NOT_SUPPORTED_IL2CPP(Assembly::InternalImageRuntimeVersion, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    Il2CppReflectionMethod* Assembly::get_EntryPoint(Il2CppReflectionAssembly* self)\n    {\n        const MethodInfo* method = Image::GetEntryPoint(MetadataCache::GetImageFromIndex(self->assembly->imageIndex));\n        if (method == NULL)\n            return NULL;\n\n        return il2cpp::vm::Reflection::GetMethodObject(method, NULL);\n    }\n\n    bool Assembly::get_global_assembly_cache(Il2CppAssembly* self)\n    {\n        return false;\n    }\n\n    Il2CppObject* Assembly::GetFilesInternal(Il2CppAssembly* self, Il2CppString* name, bool getResourceModules)\n    {\n        // Some code paths in mscorlib (e.g. Encoding.GetEncoding) will expect this icall to return NULL. If it\n        // instead throws a NotSupportedException, the mscorlib code path changes, and we see some IL2CPP-specific bugs.\n        return NULL;\n    }\n\n    void Assembly::InternalGetAssemblyName(Il2CppString* assemblyFile, Il2CppAssemblyName* aname)\n    {\n        NOT_SUPPORTED_IL2CPP(Assembly::InternalGetAssemblyName, \"This icall is not supported by il2cpp.\");\n    }\n\n    Il2CppReflectionAssembly* Assembly::LoadFrom(Il2CppString* assemblyFile, bool refonly)\n    {\n        assert(!refonly && \"This icall is not supported by il2cpp when refonly=true\");\n\n        // Our implementation is going to behave a bit different.  We can't actually load any assembly.  If we didn't know about the assembly at conversion time,\n        // then we won't be able to do anything.\n        // On the other hand, if the name of the assembly matches the name of an assembly that we converted, then lets return the assembly that we know about.\n        std::string utf8Path = utils::StringUtils::Utf16ToUtf8(utils::StringUtils::GetChars(assemblyFile));\n        std::string fileName = utils::PathUtils::BasenameNoExtension(utf8Path);\n\n        const Il2CppAssembly* foundAssembly = MetadataCache::GetAssemblyByName(fileName);\n\n        if (!foundAssembly)\n        {\n            vm::Exception::Raise(vm::Exception::GetFileLoadException(fileName.c_str()));\n            IL2CPP_UNREACHABLE;\n        }\n\n        return vm::Reflection::GetAssemblyObject(foundAssembly);\n    }\n\n    Il2CppArray* Assembly::GetNamespaces(Il2CppAssembly* self)\n    {\n        NOT_SUPPORTED_IL2CPP(Assembly::GetNamespaces, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    Il2CppArray* Assembly::GetReferencedAssemblies(Il2CppReflectionAssembly* self)\n    {\n        vm::AssemblyNameVector referencedAssemblies;\n        vm::Assembly::GetReferencedAssemblies(self->assembly, &referencedAssemblies);\n        Il2CppArray* result = Array::New(il2cpp_defaults.assembly_name_class, (il2cpp_array_size_t)referencedAssemblies.size());\n        size_t index = 0;\n        for (vm::AssemblyNameVector::const_iterator aname = referencedAssemblies.begin(); aname != referencedAssemblies.end(); ++aname)\n        {\n            Il2CppReflectionAssemblyName* reflectionAssemblyName = vm::Reflection::GetAssemblyNameObject(*aname);\n            il2cpp_array_set(result, Il2CppReflectionAssemblyName*, index, reflectionAssemblyName);\n            index++;\n        }\n\n        return result;\n    }\n\n    static void* LoadResourceFile(Il2CppReflectionAssembly* assembly)\n    {\n        std::string resourcesDirectory = utils::PathUtils::Combine(utils::Runtime::GetDataDir(), utils::StringView<char>(\"Resources\"));\n\n        std::string resourceFileName(MetadataCache::GetImageFromIndex(assembly->assembly->imageIndex)->name);\n        resourceFileName += \"-resources.dat\";\n\n        std::string resourceFilePath = utils::PathUtils::Combine(resourcesDirectory, resourceFileName);\n\n        int error = 0;\n        os::FileHandle* handle = os::File::Open(resourceFilePath, kFileModeOpen, kFileAccessRead, kFileShareRead, kFileOptionsNone, &error);\n        if (error != 0)\n            return NULL;\n\n        void* fileBuffer = os::MemoryMappedFile::Map(handle);\n\n        os::File::Close(handle, &error);\n        if (error != 0)\n        {\n            os::MemoryMappedFile::Unmap(fileBuffer);\n            fileBuffer = NULL;\n            return NULL;\n        }\n\n        return fileBuffer;\n    }\n\n    static os::Mutex s_ResourceDataMutex;\n\n    static void* LoadResourceData(Il2CppReflectionAssembly* assembly, EmbeddedResourceRecord record)\n    {\n        os::AutoLock lock(&s_ResourceDataMutex);\n\n        void* resourceData = vm::Image::GetCachedResourceData(record.image, record.name);\n        if (resourceData != NULL)\n            return resourceData;\n\n        void* fileBuffer = vm::Image::GetCachedMemoryMappedResourceFile(assembly);\n        if (fileBuffer == NULL)\n        {\n            fileBuffer = LoadResourceFile(assembly);\n            if (fileBuffer == NULL)\n                return NULL;\n\n            vm::Image::CacheMemoryMappedResourceFile(assembly, fileBuffer);\n        }\n\n        resourceData = (uint8_t*)fileBuffer + record.offset;\n\n        vm::Image::CacheResourceData(record, resourceData);\n\n        return resourceData;\n    }\n\n    static int ReadFromBuffer(uint8_t* buffer, int offset, int size, void* output)\n    {\n        memcpy(output, buffer + offset, size);\n\n        return size;\n    }\n\n    static std::vector<EmbeddedResourceRecord> GetResourceRecords(Il2CppReflectionAssembly* assembly)\n    {\n        std::vector<EmbeddedResourceRecord> resourceRecords;\n\n        void* fileBuffer = vm::Image::GetCachedMemoryMappedResourceFile(assembly);\n        if (fileBuffer == NULL)\n        {\n            fileBuffer = LoadResourceFile(assembly);\n            if (fileBuffer == NULL)\n                return resourceRecords;\n\n            vm::Image::CacheMemoryMappedResourceFile(assembly, fileBuffer);\n        }\n\n        int32_t resourceRecordsSize = 0;\n        uint32_t bytesRead = ReadFromBuffer((uint8_t*)fileBuffer, 0, sizeof(int32_t), &resourceRecordsSize);\n\n        int32_t currentResourceDataOffset = bytesRead + resourceRecordsSize;\n\n        int32_t numberOfResources = 0;\n        bytesRead += ReadFromBuffer((uint8_t*)fileBuffer, bytesRead, sizeof(int32_t), &numberOfResources);\n        for (int resourceIndex = 0; resourceIndex < numberOfResources; ++resourceIndex)\n        {\n            uint32_t resourceDataSize = 0;\n            bytesRead += ReadFromBuffer((uint8_t*)fileBuffer, bytesRead, sizeof(int32_t), &resourceDataSize);\n\n            int32_t resourceNameSize = 0;\n            bytesRead += ReadFromBuffer((uint8_t*)fileBuffer, bytesRead, sizeof(int32_t), &resourceNameSize);\n\n            std::vector<char> resourceName(resourceNameSize);\n            bytesRead += ReadFromBuffer((uint8_t*)fileBuffer, bytesRead, resourceNameSize, &resourceName[0]);\n\n            resourceRecords.push_back(EmbeddedResourceRecord(MetadataCache::GetImageFromIndex(assembly->assembly->imageIndex), std::string(resourceName.begin(), resourceName.end()), currentResourceDataOffset, resourceDataSize));\n\n            currentResourceDataOffset += resourceDataSize;\n        }\n\n        return resourceRecords;\n    }\n\n    Il2CppArray* Assembly::GetManifestResourceNames(Il2CppReflectionAssembly* assembly)\n    {\n        std::vector<EmbeddedResourceRecord> resourceRecords = GetResourceRecords(assembly);\n\n        IL2CPP_ASSERT(resourceRecords.size() <= static_cast<size_t>(std::numeric_limits<il2cpp_array_size_t>::max()));\n        Il2CppArray* resourceNameArray = vm::Array::New(il2cpp_defaults.string_class, static_cast<il2cpp_array_size_t>(resourceRecords.size()));\n        for (size_t i = 0; i < resourceRecords.size(); ++i)\n            il2cpp_array_setref(resourceNameArray, i, vm::String::New(resourceRecords[i].name.c_str()));\n\n        return resourceNameArray;\n    }\n\n    class ResourceNameMatcher\n    {\n    public:\n        ResourceNameMatcher(const std::string& resourceNameToFind) : needle(resourceNameToFind)\n        {}\n\n        bool operator()(const EmbeddedResourceRecord& data) const\n        {\n            return data.name == needle;\n        }\n\n    private:\n        std::string needle;\n    };\n\n    bool Assembly::GetManifestResourceInfoInternal(Il2CppReflectionAssembly* assembly, Il2CppString* name, Il2CppManifestResourceInfo* info)\n    {\n        std::vector<EmbeddedResourceRecord> resourceRecords = GetResourceRecords(assembly);\n        if (std::find_if(resourceRecords.begin(), resourceRecords.end(), ResourceNameMatcher(utils::StringUtils::Utf16ToUtf8(name->chars))) != resourceRecords.end())\n        {\n            info->location = RESOURCE_LOCATION_EMBEDDED | RESOURCE_LOCATION_IN_MANIFEST;\n\n            NOT_IMPLEMENTED_ICALL_NO_ASSERT(Assembly::GetManifestResourceInfoInternal, \"We have not yet implemented file or assembly resources.\");\n\n            return true;\n        }\n\n        return false;\n    }\n\n    Il2CppIntPtr Assembly::GetManifestResourceInternal(Il2CppReflectionAssembly* assembly, Il2CppString* name, int* size, Il2CppReflectionModule** module)\n    {\n        std::vector<EmbeddedResourceRecord> resourceRecords = GetResourceRecords(assembly);\n        std::vector<EmbeddedResourceRecord>::iterator resource = std::find_if(resourceRecords.begin(), resourceRecords.end(), ResourceNameMatcher(utils::StringUtils::Utf16ToUtf8(name->chars)));\n        if (resource != resourceRecords.end())\n        {\n            *module = vm::Reflection::GetModuleObject(MetadataCache::GetImageFromIndex(assembly->assembly->imageIndex));\n            *size = resource->size;\n            Il2CppIntPtr result;\n            result.m_value = LoadResourceData(assembly, *resource);\n            return result;\n        }\n\n        return Il2CppIntPtr::Zero;\n    }\n\n    int32_t Assembly::MonoDebugger_GetMethodToken(void* /* System.Reflection.MethodBase */ method)\n    {\n        NOT_SUPPORTED_IL2CPP(Assembly::MonoDebugger_GetMethodToken, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    Il2CppReflectionModule* Assembly::GetManifestModuleInternal(Il2CppAssembly* self)\n    {\n        NOT_SUPPORTED_IL2CPP(Assembly::GetManifestModuleInternal, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    bool Assembly::get_ReflectionOnly(Il2CppAssembly* self)\n    {\n        // It doesn't mean anything to have a reflection only assembly in il2cpp since we can't load a managed assembly that we didn't convert.  So let's always return false.\n        return false;\n    }\n\n#if NET_4_0\n    Il2CppString* Assembly::GetAotId()\n    {\n        return NULL;\n    }\n\n#endif\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/Assembly.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppString;\nstruct Il2CppAssemblyName;\nstruct Il2CppReflectionAssembly;\nstruct mscorlib_System_Reflection_Assembly;\nstruct mscorlib_System_Reflection_Module;\nstruct mscorlib_System_Security_Policy_Evidence;\nstruct mscorlib_System_Reflection_AssemblyName;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API Assembly\n    {\n    public:\n        static Il2CppReflectionAssembly* GetExecutingAssembly();\n        static Il2CppReflectionAssembly* GetEntryAssembly();\n        static Il2CppReflectionAssembly* GetCallingAssembly();\n        static void FillName(Il2CppReflectionAssembly* ass, mscorlib_System_Reflection_AssemblyName* aname);\n        static Il2CppObject* GetFilesInternal(Il2CppAssembly* self, Il2CppString* name, bool getResourceModules);\n        static Il2CppReflectionModule* GetManifestModuleInternal(Il2CppAssembly* self);\n        static bool GetManifestResourceInfoInternal(Il2CppReflectionAssembly* assembly, Il2CppString* name, Il2CppManifestResourceInfo* info);\n        static Il2CppIntPtr GetManifestResourceInternal(Il2CppReflectionAssembly* assembly, Il2CppString* name, int* size, Il2CppReflectionModule** module);\n        static Il2CppArray* GetManifestResourceNames(Il2CppReflectionAssembly* assembly);\n        static Il2CppArray* GetModulesInternal(Il2CppReflectionAssembly* thisPtr);\n        static Il2CppArray* GetNamespaces(Il2CppAssembly* self);\n        static Il2CppArray* GetReferencedAssemblies(Il2CppReflectionAssembly* self);\n        static void InternalGetAssemblyName(Il2CppString* assemblyFile, Il2CppAssemblyName* aname);\n        static Il2CppReflectionType* InternalGetType(Il2CppReflectionAssembly* , mscorlib_System_Reflection_Module* , Il2CppString* , bool, bool);\n        static Il2CppString* InternalImageRuntimeVersion(Il2CppAssembly* self);\n        static Il2CppReflectionAssembly* LoadFrom(Il2CppString* assemblyFile, bool refonly);\n        static bool LoadPermissions(mscorlib_System_Reflection_Assembly* a, Il2CppIntPtr* minimum, int32_t* minLength, Il2CppIntPtr* optional, int32_t* optLength, Il2CppIntPtr* refused, int32_t* refLength);\n        static int32_t MonoDebugger_GetMethodToken(void* /* System.Reflection.MethodBase */ method);\n        static Il2CppReflectionMethod* get_EntryPoint(Il2CppReflectionAssembly* self);\n        static bool get_ReflectionOnly(Il2CppAssembly* self);\n        static Il2CppString* get_code_base(Il2CppReflectionAssembly* assembly, bool escaped);\n        static Il2CppString* get_fullname(Il2CppReflectionAssembly *ass);\n        static bool get_global_assembly_cache(Il2CppAssembly* self);\n        static Il2CppString* get_location(Il2CppReflectionAssembly *assembly);\n        static Il2CppReflectionAssembly* load_with_partial_name(Il2CppString* name, mscorlib_System_Security_Policy_Evidence* evidence);\n        static Il2CppArray* GetTypes(Il2CppReflectionAssembly* thisPtr, bool exportedOnly);\n\n#if NET_4_0\n        static Il2CppString* GetAotId();\n#endif\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/AssemblyName.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"mono-structs.h\"\n\n#include \"icalls/mscorlib/System.Reflection/AssemblyName.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Object.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/String.h\"\n#include \"vm/Type.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/AssemblyName.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm-utils/VmStringUtils.h\"\n\nusing il2cpp::vm::Array;\nusing il2cpp::vm::Class;\nusing il2cpp::vm::Object;\nusing il2cpp::vm::Runtime;\nusing il2cpp::vm::String;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    bool AssemblyName::ParseName(Il2CppReflectionAssemblyName* aname, Il2CppString* assemblyName)\n    {\n        return vm::AssemblyName::ParseName(aname, utils::StringUtils::Utf16ToUtf8(utils::StringUtils::GetChars(assemblyName)));\n    }\n\n#if NET_4_0\n    void AssemblyName::get_public_token(uint8_t* token, uint8_t* pubkey, int32_t len)\n    {\n        NOT_IMPLEMENTED_ICALL(AssemblyName::get_public_token);\n        IL2CPP_UNREACHABLE;\n    }\n\n    char hexChar(uint8_t value)\n    {\n        if (value < 10)\n            return '0' + value;\n        else\n            return 'A' + (value - 10);\n    }\n\n    Il2CppMonoAssemblyName* AssemblyName::GetNativeName(Il2CppIntPtr assembly_ptr)\n    {\n        Il2CppAssembly *assembly = (Il2CppAssembly*)assembly_ptr.m_value;\n\n        Il2CppMonoAssemblyName *aname = (Il2CppMonoAssemblyName*)il2cpp::vm::Reflection::GetMonoAssemblyName(assembly);\n        if (aname)\n        {\n            return aname;\n        }\n        else\n        {\n            aname = (Il2CppMonoAssemblyName*)IL2CPP_MALLOC_ZERO(sizeof(Il2CppMonoAssemblyName));\n            aname->name.m_value = (void*)il2cpp::vm::MetadataCache::GetStringFromIndex(assembly->aname.nameIndex);\n            aname->culture.m_value = (void*)il2cpp::vm::MetadataCache::GetStringFromIndex(assembly->aname.cultureIndex);\n            aname->hash_value.m_value = (void*)il2cpp::vm::MetadataCache::GetStringFromIndex(assembly->aname.hashValueIndex);\n            aname->public_key.m_value = (void*)il2cpp::vm::MetadataCache::GetStringFromIndex(assembly->aname.publicKeyIndex);\n            aname->hash_alg = assembly->aname.hash_alg;\n            aname->hash_len = assembly->aname.hash_len;\n            aname->flags = assembly->aname.flags;\n            aname->major = assembly->aname.major;\n            aname->minor = assembly->aname.minor;\n            aname->build = assembly->aname.build;\n            aname->revision = assembly->aname.revision;\n\n            //Mono public key token is stored as hexadecimal characters\n            if (assembly->aname.publicKeyToken[0])\n            {\n                int j = 0;\n                for (int i = 0; i < kPublicKeyByteLength; ++i)\n                {\n                    uint8_t value = assembly->aname.publicKeyToken[i];\n                    aname->public_key_token.padding[j++] = hexChar((value & 0xF0) >> 4);\n                    aname->public_key_token.padding[j++] = hexChar(value & 0x0F);\n                }\n            }\n\n            il2cpp::vm::Reflection::SetMonoAssemblyName(assembly, aname);\n            return aname;\n        }\n    }\n\n    bool AssemblyName::ParseAssemblyName(Il2CppIntPtr namePtr, Il2CppMonoAssemblyName* aname, bool* is_version_defined, bool* is_token_defined)\n    {\n        std::string name((char*)namePtr.m_value);\n\n        il2cpp::vm::TypeNameParseInfo info;\n        il2cpp::vm::TypeNameParser parser(name, info, false);\n\n        if (!parser.ParseAssembly())\n            return false;\n\n        if (is_version_defined)\n        {\n            *is_version_defined = false;\n            size_t index = name.find(\"Version\");\n            if (index != std::string::npos)\n                *is_version_defined = true;\n        }\n\n        if (is_token_defined)\n        {\n            *is_token_defined = false;\n            size_t index = name.find(\"PublicKeyToken\");\n            if (index != std::string::npos)\n                *is_token_defined = true;\n        }\n\n        const il2cpp::vm::TypeNameParseInfo::AssemblyName& parsedName = info.assembly_name();\n\n        aname->name.m_value = il2cpp::utils::StringUtils::StringDuplicate(parsedName.name.c_str());\n        if (utils::VmStringUtils::CaseInsensitiveEquals(parsedName.culture.c_str(), \"neutral\")) // culture names are case insensitive\n            aname->culture.m_value = NULL;\n        else\n            aname->culture.m_value = il2cpp::utils::StringUtils::StringDuplicate(parsedName.culture.c_str());\n\n        aname->hash_value.m_value = il2cpp::utils::StringUtils::StringDuplicate(parsedName.hash_value.c_str());\n        aname->public_key.m_value = il2cpp::utils::StringUtils::StringDuplicate(parsedName.public_key.c_str());\n\n        for (int i = 0; i < il2cpp::vm::kPublicKeyTokenLength; ++i)\n            aname->public_key_token.padding[i] = parsedName.public_key_token[i];\n\n        aname->hash_alg = parsedName.hash_alg;\n        aname->hash_len = parsedName.hash_len;\n        aname->flags = parsedName.flags;\n        aname->major = parsedName.major;\n        aname->minor = parsedName.minor;\n        aname->build = parsedName.build;\n        aname->revision = parsedName.revision;\n\n        return true;\n    }\n\n#endif\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/AssemblyName.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\nstruct Il2CppReflectionAssemblyName;\nstruct Il2CppMonoAssemblyName;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API AssemblyName\n    {\n    public:\n        static bool ParseName(Il2CppReflectionAssemblyName* aname, Il2CppString* assemblyName);\n#if NET_4_0\n        static void get_public_token(uint8_t* token, uint8_t* pubkey, int32_t len);\n        static Il2CppMonoAssemblyName* GetNativeName(Il2CppIntPtr assembly_ptr);\n        static bool ParseAssemblyName(Il2CppIntPtr name, Il2CppMonoAssemblyName* aname, bool* is_version_defined, bool* is_token_defined);\n#endif\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/CustomAttributeData.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"CustomAttributeData.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    void CustomAttributeData::ResolveArgumentsInternal(Il2CppObject* ctor, Il2CppObject* assembly, Il2CppIntPtr data, uint32_t data_length, Il2CppArray** ctorArgs, Il2CppArray** namedArgs)\n    {\n        NOT_IMPLEMENTED_ICALL(CustomAttributeData::ResolveArgumentsInternal);\n        IL2CPP_UNREACHABLE;\n    }\n} // namespace Reflection\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/CustomAttributeData.h",
    "content": "#if NET_4_0\n#pragma once\n\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API CustomAttributeData\n    {\n    public:\n        static void ResolveArgumentsInternal(Il2CppObject* ctor, Il2CppObject* assembly, Il2CppIntPtr data, uint32_t data_length, Il2CppArray** ctorArgs, Il2CppArray** namedArgs);\n    };\n} // namespace Reflection\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/EventInfo.cpp",
    "content": "#if NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"il2cpp-api.h\"\n#include \"EventInfo.h\"\n#include \"vm/Class.h\"\n#include \"vm/Reflection.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    Il2CppReflectionEvent* EventInfo::internal_from_handle_type(Il2CppIntPtr handlePtr, Il2CppIntPtr typePtr)\n    {\n        Il2CppClass *klass;\n\n        IL2CPP_ASSERT(handlePtr.m_value);\n        ::EventInfo *handle = (::EventInfo*)handlePtr.m_value;\n        Il2CppType *type = (Il2CppType*)typePtr.m_value;\n\n        if (!type)\n        {\n            klass = handle->parent;\n        }\n        else\n        {\n            klass = il2cpp_class_from_il2cpp_type(type);\n\n            bool found = klass == handle->parent || il2cpp::vm::Class::HasParent(klass, handle->parent);\n            if (!found)\n                /* Managed code will throw an exception */\n                return NULL;\n        }\n\n        Il2CppReflectionEvent *result = il2cpp::vm::Reflection::GetEventObject(klass, handle);\n        return result;\n    }\n} // namespace Reflection\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/EventInfo.h",
    "content": "#pragma once\n\n#if NET_4_0\n\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API EventInfo\n    {\n    public:\n        static Il2CppReflectionEvent* internal_from_handle_type(Il2CppIntPtr event_handle, Il2CppIntPtr type_handle);\n    };\n} // namespace Reflection\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/FieldInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include <stddef.h>\n\n#include \"icalls/mscorlib/System.Reflection/FieldInfo.h\"\n\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Reflection.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    Il2CppArray* FieldInfo::GetTypeModifiers(Il2CppReflectionField* field, bool optional)\n    {\n        NOT_SUPPORTED_IL2CPP(FieldInfo::GetTypeModifiers, \"GetOptionalCustomModifiers and GetRequiredCustomModifiers are not supported.\");\n        return NULL;\n    }\n\n    Il2CppReflectionMarshal* FieldInfo::GetUnmanagedMarshal(Il2CppReflectionField* field)\n    {\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(FieldInfo::GetUnmanagedMarshal, \"This should only be needed for types with a MarshalAsAttribute\");\n        return NULL;\n    }\n\n    Il2CppReflectionField* FieldInfo::internal_from_handle_type(Il2CppIntPtr field_handle, Il2CppIntPtr type_handle)\n    {\n        ::FieldInfo* fieldInfo = (::FieldInfo*)field_handle.m_value;\n        Il2CppType* il2cppType = (Il2CppType*)type_handle.m_value;\n\n        if (il2cppType == NULL)\n            return vm::Reflection::GetFieldObject(fieldInfo->parent, fieldInfo);\n\n        for (Il2CppClass* k = vm::Class::FromIl2CppType(il2cppType); k; k = k->parent)\n        {\n            if (k == fieldInfo->parent)\n                return vm::Reflection::GetFieldObject(fieldInfo->parent, fieldInfo);\n        }\n\n        return NULL;\n    }\n\n#if NET_4_0\n    Il2CppObject* FieldInfo::get_marshal_info(Il2CppObject* _this)\n    {\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(FieldInfo::get_marshal_info, \"We currently don't store marshal information in metadata\");\n        return NULL;\n    }\n\n#endif\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/FieldInfo.h",
    "content": "#pragma once\n\n#include \"object-internals.h\"\n#include \"il2cpp-config.h\"\n\nstruct Il2CppReflectionField;\nstruct Il2CppReflectionMarshal;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API FieldInfo\n    {\n    public:\n        static Il2CppReflectionMarshal* GetUnmanagedMarshal(Il2CppReflectionField* field);\n        static Il2CppReflectionField* internal_from_handle_type(Il2CppIntPtr field_handle, Il2CppIntPtr type_handle);\n        static Il2CppArray* GetTypeModifiers(Il2CppReflectionField* field, bool optional);\n#if NET_4_0\n        static Il2CppObject* get_marshal_info(Il2CppObject* _this);\n#endif\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MemberInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Reflection/MemberInfo.h\"\n#include \"vm/Exception.h\"\n#include \"object-internals.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Field.h\"\n#include \"vm/Property.h\"\n#include \"vm/Method.h\"\n#include \"vm/Event.h\"\n#include \"vm/Type.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    int32_t MemberInfo::get_MetadataToken(Il2CppObject* /* System.Reflection.MemberInfo */ self)\n    {\n        if (vm::Reflection::IsField(self))\n        {\n            Il2CppReflectionField* field = (Il2CppReflectionField*)self;\n            return vm::Field::GetToken(field->field);\n        }\n        else if (vm::Reflection::IsAnyMethod(self))\n        {\n            Il2CppReflectionMethod* method = (Il2CppReflectionMethod*)self;\n            return vm::Method::GetToken(method->method);\n        }\n        else if (vm::Reflection::IsProperty(self))\n        {\n            Il2CppReflectionProperty* prop = (Il2CppReflectionProperty*)self;\n            return vm::Property::GetToken(prop->property);\n        }\n        else if (vm::Reflection::IsEvent(self))\n        {\n            Il2CppReflectionMonoEvent* eventInfo = (Il2CppReflectionMonoEvent*)self;\n            return vm::Event::GetToken(eventInfo->eventInfo);\n        }\n        else if (vm::Reflection::IsType(self))\n        {\n            Il2CppReflectionType* type = (Il2CppReflectionType*)self;\n            return vm::Type::GetToken(type->type);\n        }\n        else\n        {\n            NOT_SUPPORTED_IL2CPP(MemberInfo::get_MetadataToken, \"This icall is not supported by il2cpp.\");\n        }\n\n        return 0;\n    }\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MemberInfo.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API MemberInfo\n    {\n    public:\n        static int32_t get_MetadataToken(Il2CppObject* /* System.Reflection.MemberInfo */ self);\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MethodBase.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <stddef.h>\n#include \"icalls/mscorlib/System.Reflection/MethodBase.h\"\n#include \"class-internals.h\"\n#include \"il2cpp-api.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/StackTrace.h\"\n#include \"vm/MetadataCache.h\"\n#include \"metadata/GenericMetadata.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    static Il2CppClass* il2cpp_class_get_generic_type_definition(Il2CppClass *klass)\n    {\n        return klass->generic_class ? il2cpp::vm::GenericClass::GetTypeDefinition(klass->generic_class) : klass;\n    }\n\n    Il2CppReflectionMethod * MethodBase::GetMethodFromHandleInternalType(Il2CppIntPtr method, Il2CppIntPtr type)\n    {\n        Il2CppClass *klass = NULL;\n        MethodInfo* methodInfo = (MethodInfo*)method.m_value;\n        if (type.m_value)\n        {\n            klass = vm::Class::FromIl2CppType((Il2CppType*)type.m_value);\n            if (il2cpp_class_get_generic_type_definition(methodInfo->declaring_type) != il2cpp_class_get_generic_type_definition(klass))\n                return NULL;\n\n            // See the VerifyTwoArgumentGetMethodFromHandleWithGenericType for the failing test. Once we have support for inflating methods\n            // we can implement this case as well and make that test pass.\n            if (methodInfo->declaring_type != klass)\n                NOT_IMPLEMENTED_ICALL(MethodBase::GetMethodFromHandleInternalType);\n        }\n        else\n        {\n            klass = methodInfo->declaring_type;\n        }\n        return il2cpp::vm::Reflection::GetMethodObject(methodInfo, klass);\n    }\n\n    Il2CppReflectionMethod* MethodBase::GetCurrentMethod()\n    {\n        NOT_SUPPORTED_IL2CPP(MethodBase::GetCurrentMethod, \"This icall is not supported by il2cpp. Use the il2cpp_codegen_get_method_object intrinsic instead.\");\n\n        return NULL;\n    }\n\n    void* /* System.Reflection.MethodBody */ MethodBase::GetMethodBodyInternal(Il2CppIntPtr handle)\n    {\n        NOT_SUPPORTED_IL2CPP(MethodBase::GetMethodBodyInternal, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n#if NET_4_0\n\n    static const MethodInfo* il2cpp_method_get_equivalent_method(const MethodInfo *method, Il2CppClass *klass)\n    {\n        int offset = -1, i;\n\n        if (method->is_inflated)\n        {\n            const Il2CppGenericContext *context = il2cpp::vm::MetadataCache::GetMethodGenericContext(method);\n            if (context->method_inst)\n            {\n                const MethodInfo *result;\n\n                //MonoMethodInflated *inflated = (MonoMethodInflated*)method;\n                //method is inflated, we should inflate it on the other class\n                Il2CppGenericContext newCtx;\n                newCtx.method_inst = context->method_inst;\n                newCtx.class_inst = context->class_inst;\n                if (klass->generic_class)\n                {\n                    newCtx.class_inst = klass->generic_class->context.class_inst;\n                }\n                else if (klass->genericContainerIndex != kGenericContainerIndexInvalid)\n                {\n                    NOT_IMPLEMENTED(il2cpp_method_get_equivalent_method: generic_container_case);\n                    //const Il2CppGenericContainer *genericContainer = il2cpp::vm::MetadataCache::GetGenericContainerFromIndex(klass->genericContainerIndex);\n                    //newCtx.class_inst = genericContainer->context.class_inst;\n                }\n\n                result = il2cpp::metadata::GenericMetadata::Inflate(method, klass, &newCtx);\n                return result;\n            }\n        }\n\n        il2cpp::vm::Class::SetupMethods(method->declaring_type);\n\n        for (i = 0; i < method->declaring_type->method_count; ++i)\n        {\n            if (method->declaring_type->methods[i] == method)\n            {\n                offset = i;\n                break;\n            }\n        }\n\n        il2cpp::vm::Class::SetupMethods(klass);\n\n        IL2CPP_ASSERT(offset >= 0 && offset < klass->method_count);\n        return klass->methods[offset];\n    }\n\n    Il2CppReflectionMethod* MethodBase::GetMethodFromHandleInternalType_native(Il2CppIntPtr method_handle, Il2CppIntPtr type_handle, bool genericCheck)\n    {\n        Il2CppReflectionMethod *res = NULL;\n        Il2CppClass *klass;\n        const MethodInfo *method = (const MethodInfo*)method_handle.m_value;\n        if (type_handle.m_value && genericCheck)\n        {\n            klass = il2cpp_class_from_il2cpp_type((Il2CppType*)type_handle.m_value);\n            if (il2cpp_class_get_generic_type_definition(method->declaring_type) != il2cpp_class_get_generic_type_definition(klass))\n                return NULL;\n\n            if (method->declaring_type != klass)\n            {\n                method = il2cpp_method_get_equivalent_method(method, klass);\n                if (!method)\n                    return NULL;\n            }\n        }\n        else if (type_handle.m_value)\n            klass = il2cpp_class_from_il2cpp_type((Il2CppType*)type_handle.m_value);\n        else\n            klass = method->declaring_type;\n\n        res = il2cpp_method_get_object(method, klass);\n        return res;\n    }\n\n#endif\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MethodBase.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API MethodBase\n    {\n    public:\n        static Il2CppReflectionMethod* GetCurrentMethod();\n        static void* /* System.Reflection.MethodBody */ GetMethodBodyInternal(Il2CppIntPtr handle);\n        static Il2CppReflectionMethod* GetMethodFromHandleInternalType(Il2CppIntPtr method, Il2CppIntPtr type);\n\n#if NET_4_0\n        static Il2CppReflectionMethod* GetMethodFromHandleInternalType_native(Il2CppIntPtr method_handle, Il2CppIntPtr type_handle, bool genericCheck);\n#endif\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/Module.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <stddef.h>\n#include \"icalls/mscorlib/System.Reflection/Module.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Module.h\"\n#include \"vm/Image.h\"\n#include \"vm/Array.h\"\n#include \"class-internals.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/String.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    Il2CppArray* Module::InternalGetTypes(Il2CppReflectionModule * self)\n    {\n        vm::TypeVector types;\n        vm::Image::GetTypes(self->image, true, &types);\n        Il2CppArray* result = vm::Array::New(il2cpp_defaults.monotype_class, (il2cpp_array_size_t)types.size());\n        size_t index = 0;\n        for (vm::TypeVector::const_iterator type = types.begin(); type != types.end(); ++type)\n        {\n            Il2CppReflectionType* reflectionType = vm::Reflection::GetTypeObject((*type)->byval_arg);\n            il2cpp_array_set(result, Il2CppReflectionType*, index, reflectionType);\n            index++;\n        }\n\n        return result;\n    }\n\n    Il2CppString* Module::GetGuidInternal(mscorlib_System_Reflection_Module * thisPtr)\n    {\n        return il2cpp::vm::String::New(\"00000000-0000-0000-0000-000000000000\");\n    }\n\n    Il2CppIntPtr Module::GetHINSTANCE(mscorlib_System_Reflection_Module * thisPtr)\n    {\n        NOT_IMPLEMENTED_ICALL(Module::GetHINSTANCE);\n        return Il2CppIntPtr();\n    }\n\n    int32_t Module::get_MetadataToken(Il2CppReflectionModule* self)\n    {\n        return vm::Module::GetToken(self->image);\n    }\n\n    int32_t Module::GetMDStreamVersion(Il2CppIntPtr module_handle)\n    {\n        NOT_SUPPORTED_IL2CPP(Module::GetMDStreamVersion, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    Il2CppReflectionType* Module::GetGlobalType(Il2CppReflectionModule* self)\n    {\n        NOT_SUPPORTED_IL2CPP(Module::GetGlobalType, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    Il2CppIntPtr Module::ResolveTypeToken(Il2CppIntPtr module, int32_t token, Il2CppArray* type_args, Il2CppArray* method_args, ResolveTokenError* error)\n    {\n        NOT_SUPPORTED_IL2CPP(Module::ResolveTypeToken, \"This icall is not supported by il2cpp.\");\n\n        return Il2CppIntPtr();\n    }\n\n    Il2CppIntPtr Module::ResolveMethodToken(Il2CppIntPtr module, int32_t token, Il2CppArray* type_args, Il2CppArray* method_args, ResolveTokenError* error)\n    {\n        NOT_SUPPORTED_IL2CPP(Module::ResolveMethodToken, \"This icall is not supported by il2cpp.\");\n\n        return Il2CppIntPtr();\n    }\n\n    Il2CppIntPtr Module::ResolveFieldToken(Il2CppIntPtr module, int32_t token, Il2CppArray* type_args, Il2CppArray* method_args, ResolveTokenError* error)\n    {\n        NOT_SUPPORTED_IL2CPP(Module::ResolveFieldToken, \"This icall is not supported by il2cpp.\");\n\n        return Il2CppIntPtr();\n    }\n\n    Il2CppString* Module::ResolveStringToken(Il2CppIntPtr module, int32_t token, ResolveTokenError* error)\n    {\n        NOT_SUPPORTED_IL2CPP(Module::ResolveStringToken, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    void* /* System.Reflection.MemberInfo */ Module::ResolveMemberToken(Il2CppIntPtr module, int32_t token, Il2CppArray* type_args, Il2CppArray* method_args, ResolveTokenError* error)\n    {\n        NOT_SUPPORTED_IL2CPP(Module::ResolveMemberToken, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    Il2CppArray* Module::ResolveSignature(Il2CppIntPtr module, int32_t metadataToken, ResolveTokenError* error)\n    {\n        NOT_SUPPORTED_IL2CPP(Module::ResolveSignature, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    void Module::GetPEKind(Il2CppIntPtr module, PortableExecutableKinds* peKind, ImageFileMachine* machine)\n    {\n        NOT_SUPPORTED_IL2CPP(Module::GetPEKind, \"This icall is not supported by il2cpp.\");\n    }\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/Module.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppArray;\nstruct Il2CppString;\nstruct mscorlib_System_Reflection_Module;\n\ntypedef int32_t PortableExecutableKinds;\ntypedef int32_t ImageFileMachine;\ntypedef int32_t ResolveTokenError;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API Module\n    {\n    public:\n        static Il2CppReflectionType* GetGlobalType(Il2CppReflectionModule* self);\n        static Il2CppString* GetGuidInternal(mscorlib_System_Reflection_Module * thisPtr);\n        static int32_t GetMDStreamVersion(Il2CppIntPtr module_handle);\n        static void GetPEKind(Il2CppIntPtr module, PortableExecutableKinds* peKind, ImageFileMachine* machine);\n        static Il2CppArray* InternalGetTypes(Il2CppReflectionModule * self);\n        static Il2CppIntPtr ResolveFieldToken(Il2CppIntPtr module, int32_t token, Il2CppArray* type_args, Il2CppArray* method_args, ResolveTokenError* error);\n        static void* /* System.Reflection.MemberInfo */ ResolveMemberToken(Il2CppIntPtr module, int32_t token, Il2CppArray* type_args, Il2CppArray* method_args, ResolveTokenError* error);\n        static Il2CppIntPtr ResolveMethodToken(Il2CppIntPtr module, int32_t token, Il2CppArray* type_args, Il2CppArray* method_args, ResolveTokenError* error);\n        static Il2CppArray* ResolveSignature(Il2CppIntPtr module, int32_t metadataToken, ResolveTokenError* error);\n        static Il2CppString* ResolveStringToken(Il2CppIntPtr module, int32_t token, ResolveTokenError* error);\n        static Il2CppIntPtr ResolveTypeToken(Il2CppIntPtr module, int32_t token, Il2CppArray* type_args, Il2CppArray* method_args, ResolveTokenError* error);\n        static int32_t get_MetadataToken(Il2CppReflectionModule* self);\n        static Il2CppIntPtr GetHINSTANCE(mscorlib_System_Reflection_Module * thisPtr);\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoCMethod.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Reflection/MonoCMethod.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    Il2CppObject* MonoCMethod::InternalInvoke(void* /* System.Reflection.MonoCMethod */ self, Il2CppObject* obj, Il2CppArray* parameters, Il2CppException** exc)\n    {\n        NOT_SUPPORTED_IL2CPP(MonoCMethod::InternalInvoke, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n#if NET_4_0\n    int32_t MonoCMethod::get_core_clr_security_level(Il2CppObject* _this)\n    {\n        NOT_IMPLEMENTED_ICALL(MonoCMethod::get_core_clr_security_level);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n\n#endif\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoCMethod.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API MonoCMethod\n    {\n    public:\n        static Il2CppObject* InternalInvoke(void* /* System.Reflection.MonoCMethod */ self, Il2CppObject* obj, Il2CppArray* parameters, Il2CppException** exc);\n#if NET_4_0\n        static int32_t get_core_clr_security_level(Il2CppObject* _this);\n#endif\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoEventInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include <stddef.h>\n#include \"icalls/mscorlib/System.Reflection/MonoEventInfo.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/String.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    void MonoEventInfo::get_event_info(Il2CppReflectionMonoEvent* event, Il2CppReflectionMonoEventInfo* eventInfo)\n    {\n        eventInfo->declaringType = vm::Reflection::GetTypeObject(event->eventInfo->parent->byval_arg);\n        eventInfo->reflectedType = event->reflectedType;\n        eventInfo->name = vm::String::New(event->eventInfo->name);\n\n        Il2CppClass* reflectedTypeInfo = vm::Class::FromIl2CppType(event->reflectedType->type);\n        eventInfo->addMethod = event->eventInfo->add != NULL ? vm::Reflection::GetMethodObject(event->eventInfo->add, reflectedTypeInfo) : NULL;\n        eventInfo->removeMethod = event->eventInfo->remove != NULL ? vm::Reflection::GetMethodObject(event->eventInfo->remove, reflectedTypeInfo) : NULL;\n        eventInfo->raiseMethod = event->eventInfo->raise != NULL ? vm::Reflection::GetMethodObject(event->eventInfo->raise, reflectedTypeInfo) : NULL;\n        eventInfo->eventAttributes = event->eventInfo->eventType->attrs;\n        eventInfo->otherMethods = vm::Array::NewCached(il2cpp_defaults.method_info_class, 0); // Empty for now\n    }\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoEventInfo.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppReflectionMonoEvent;\nstruct Il2CppReflectionMonoEventInfo;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API MonoEventInfo\n    {\n    public:\n        static void get_event_info(Il2CppReflectionMonoEvent* event, Il2CppReflectionMonoEventInfo* eventInfo);\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoField.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <stddef.h>\n#include \"icalls/mscorlib/System.Reflection/MonoField.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Class.h\"\n#include \"vm/Field.h\"\n#include \"vm/Object.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Type.h\"\n#include \"vm/Exception.h\"\n#include \"class-internals.h\"\n#include \"tabledefs.h\"\n#include \"vm-utils/BlobReader.h\"\n\nusing namespace il2cpp::vm;\nusing il2cpp::utils::StringUtils;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    Il2CppReflectionType * MonoField::GetParentType(Il2CppReflectionField * field, bool declaring)\n    {\n        Il2CppClass *parent;\n\n        parent = declaring ? field->field->parent : field->klass;\n\n        return il2cpp::vm::Reflection::GetTypeObject(parent->byval_arg);\n    }\n\n    int32_t MonoField::GetFieldOffset(Il2CppReflectionField * field)\n    {\n        return field->field->offset - sizeof(Il2CppObject);\n    }\n\n    Il2CppObject* MonoField::GetValueInternal(Il2CppReflectionField * field, Il2CppObject * obj)\n    {\n        return vm::Field::GetValueObject(field->field, obj);\n    }\n\n    void MonoField::SetValueInternal(Il2CppReflectionField* field, Il2CppObject* obj, Il2CppObject* value)\n    {\n        FieldInfo* fieldInfo = field->field;\n        Il2CppClass* fieldType = Class::FromIl2CppType(fieldInfo->type);\n\n#ifndef NET_4_0 //This check is done in managed code in .NET 4.5+\n        if (value != NULL && !Class::IsAssignableFrom(fieldType, value->klass))\n        {\n            Exception::Raise(Exception::GetArgumentException(\"value\",\n                    utils::StringUtils::Printf(\"Object of type '%s' cannot be converted to type '%s'.\",\n                        Type::GetName(value->klass->byval_arg, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME).c_str(),\n                        Type::GetName(fieldInfo->type, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME).c_str()\n                        ).c_str()));\n        }\n#endif\n\n        uint8_t* fieldAddress;\n\n        if (fieldInfo->type->attrs & FIELD_ATTRIBUTE_STATIC)\n        {\n            if (fieldInfo->offset == THREAD_STATIC_FIELD_OFFSET)\n            {\n                NOT_IMPLEMENTED(Field::StaticSetValue);\n            }\n\n            Runtime::ClassInit(fieldInfo->parent);\n            fieldAddress = static_cast<uint8_t*>(fieldInfo->parent->static_fields) + fieldInfo->offset;\n        }\n        else\n        {\n            IL2CPP_ASSERT(obj);\n            fieldAddress = reinterpret_cast<uint8_t*>(obj) + fieldInfo->offset;\n        }\n\n        if (fieldType->valuetype)\n        {\n            if (!Class::IsNullable(fieldType))\n            {\n                uint32_t fieldSize = Class::GetInstanceSize(fieldType) - sizeof(Il2CppObject);\n\n                if (value != NULL)\n                {\n                    memcpy(fieldAddress, Object::Unbox(value), fieldSize);\n                }\n                else\n                {\n                    // Setting value type to null is defined to zero it out\n                    memset(fieldAddress, 0, fieldSize);\n                }\n            }\n            else\n            {\n                Il2CppClass* nullableArg = Class::GetNullableArgument(fieldType);\n                uint32_t valueSize = Class::GetInstanceSize(nullableArg) - sizeof(Il2CppObject);\n\n                if (value != NULL)\n                {\n                    memcpy(fieldAddress, Object::Unbox(value), valueSize);\n                    *(fieldAddress + valueSize) = true;\n                }\n                else\n                {\n                    *(fieldAddress + valueSize) = false;\n                }\n            }\n        }\n        else\n        {\n            memcpy(fieldAddress, &value, sizeof(Il2CppObject*));\n        }\n    }\n\n    Il2CppObject* MonoField::GetRawConstantValue(Il2CppReflectionField* field)\n    {\n        FieldInfo* fieldInfo = field->field;\n\n        if (!(fieldInfo->type->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT))\n            Exception::Raise(Exception::GetInvalidOperationException(NULL));\n\n        const Il2CppType* type = NULL;\n        const char* data = Class::GetFieldDefaultValue(fieldInfo, &type);\n\n        switch (type->type)\n        {\n            case IL2CPP_TYPE_U1:\n            case IL2CPP_TYPE_I1:\n            case IL2CPP_TYPE_BOOLEAN:\n            case IL2CPP_TYPE_U2:\n            case IL2CPP_TYPE_I2:\n            case IL2CPP_TYPE_CHAR:\n            case IL2CPP_TYPE_U4:\n            case IL2CPP_TYPE_I4:\n            case IL2CPP_TYPE_R4:\n            case IL2CPP_TYPE_U8:\n            case IL2CPP_TYPE_I8:\n            case IL2CPP_TYPE_R8:\n            {\n                Il2CppObject* obj = Object::New(Class::FromIl2CppType(type));\n                utils::BlobReader::GetConstantValueFromBlob(type->type, data, Object::Unbox(obj));\n                return obj;\n            }\n            case IL2CPP_TYPE_STRING:\n            case IL2CPP_TYPE_CLASS:\n            case IL2CPP_TYPE_OBJECT:\n            case IL2CPP_TYPE_GENERICINST:\n            {\n                Il2CppObject* obj = NULL;\n                utils::BlobReader::GetConstantValueFromBlob(type->type, data, &obj);\n                return obj;\n            }\n            default:\n                Exception::Raise(Exception::GetInvalidOperationException(StringUtils::Printf(\"Attempting to get raw constant value for field of type %d\", type).c_str()));\n        }\n\n        return NULL;\n    }\n\n#if NET_4_0\n    int32_t MonoField::get_core_clr_security_level(Il2CppObject* _this)\n    {\n        NOT_IMPLEMENTED_ICALL(MonoField::get_core_clr_security_level);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n\n    Il2CppObject* MonoField::ResolveType(Il2CppObject* _this)\n    {\n        NOT_IMPLEMENTED_ICALL(MonoField::ResolveType);\n        IL2CPP_UNREACHABLE;\n        return NULL;\n    }\n\n#endif\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoField.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct mscorlib_System_Reflection_FieldInfo;\nstruct mscorlib_System_Reflection_Emit_UnmanagedMarshal;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API MonoField\n    {\n    public:\n        static int32_t GetFieldOffset(Il2CppReflectionField * thisPtr);\n        static Il2CppReflectionType * GetParentType(Il2CppReflectionField * field, bool declaring);\n        static Il2CppObject* GetRawConstantValue(Il2CppReflectionField* field);\n        static Il2CppObject * GetValueInternal(Il2CppReflectionField * thisPtr, Il2CppObject * obj);\n        static void SetValueInternal(Il2CppReflectionField * fi, Il2CppObject * obj, Il2CppObject * value);\n\n#if NET_4_0\n        static int32_t get_core_clr_security_level(Il2CppObject* _this);\n        static Il2CppObject* ResolveType(Il2CppObject* _this);\n#endif\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoGenericCMethod.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Reflection/MonoGenericCMethod.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    Il2CppReflectionType* MonoGenericCMethod::get_ReflectedType(void* /* System.Reflection.MonoGenericCMethod */ self)\n    {\n        NOT_SUPPORTED_IL2CPP(MonoGenericCMethod::get_ReflectedType, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoGenericCMethod.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API MonoGenericCMethod\n    {\n    public:\n        static Il2CppReflectionType* get_ReflectedType(void* /* System.Reflection.MonoGenericCMethod */ self);\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoGenericClass.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <stddef.h>\n#include \"icalls/mscorlib/System.Reflection/MonoGenericClass.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    void MonoGenericClass::initialize(mscorlib_System_Reflection_MonoGenericClass * thisPtr, Il2CppArray* methods, Il2CppArray* ctors, Il2CppArray* fields, Il2CppArray* properties, Il2CppArray* events)\n    {\n        NOT_IMPLEMENTED_ICALL(MonoGenericClass::initialize);\n    }\n\n#if NET_4_0\n    void MonoGenericClass::initialize40(Il2CppObject* _this, Il2CppArray* fields)\n    {\n        NOT_IMPLEMENTED_ICALL(MonoGenericClass::initialize40);\n        IL2CPP_UNREACHABLE;\n    }\n\n    void MonoGenericClass::register_with_runtime(Il2CppObject* type)\n    {\n        NOT_IMPLEMENTED_ICALL(MonoGenericClass::register_with_runtime);\n        IL2CPP_UNREACHABLE;\n    }\n\n#endif\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoGenericClass.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppArray;\nstruct mscorlib_System_Reflection_MonoGenericClass;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API MonoGenericClass\n    {\n    public:\n        static void initialize(mscorlib_System_Reflection_MonoGenericClass * thisPtr, Il2CppArray* methods, Il2CppArray* ctors, Il2CppArray* fields, Il2CppArray* properties, Il2CppArray* events);\n#if NET_4_0\n        static void initialize40(Il2CppObject* _this, Il2CppArray* fields);\n        static void register_with_runtime(Il2CppObject* type);\n#endif\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoGenericMethod.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Reflection/MonoGenericMethod.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    Il2CppReflectionType* MonoGenericMethod::get_ReflectedType(void* /* System.Reflection.MonoGenericMethod */ self)\n    {\n        NOT_SUPPORTED_IL2CPP(MonoGenericMethod::get_ReflectedType, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoGenericMethod.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API MonoGenericMethod\n    {\n    public:\n        static Il2CppReflectionType* get_ReflectedType(void* /* System.Reflection.MonoGenericMethod */ self);\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoMethod.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <stddef.h>\n#include <string>\n#include <sstream>\n#include \"icalls/mscorlib/System.Reflection/MonoMethod.h\"\n#include \"tabledefs.h\"\n#include \"class-internals.h\"\n#include \"metadata/Il2CppTypeVector.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/GenericContainer.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Method.h\"\n#include \"vm/Object.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/String.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Type.h\"\n#include \"vm/GenericClass.h\"\n\nusing namespace il2cpp::vm;\nusing il2cpp::metadata::Il2CppTypeVector;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    Il2CppReflectionMethod* MonoMethod::get_base_definition(Il2CppReflectionMethod *m)\n    {\n        const MethodInfo *method = m->method;\n        Il2CppClass *klass = method->declaring_type;\n\n        if (klass == NULL)\n            return m;\n\n        if (!(method->flags & METHOD_ATTRIBUTE_VIRTUAL) || Class::IsInterface(klass) || method->flags & METHOD_ATTRIBUTE_NEW_SLOT)\n            return m;\n\n        /*if(klass->generic_class)\n            klass = klass->generic_class->container_class;*/\n\n        for (Il2CppClass* parent = klass->parent; parent != NULL; parent = parent->parent)\n        {\n            if (parent->vtable_count <= method->slot)\n                break;\n            klass = parent;\n        }\n\n        if (klass == method->declaring_type)\n            return m;\n\n        il2cpp::vm::Class::Init(klass);\n\n        const MethodInfo *result = klass->vtable[method->slot].method;\n\n        if (result == NULL)\n        {\n            void *iterator = NULL;\n\n            for (result = Class::GetMethods(klass, &iterator); result != NULL; result = Class::GetMethods(klass, &iterator))\n                if (result->slot == method->slot)\n                    break;\n        }\n\n        if (result == NULL)\n            return m;\n\n        return il2cpp::vm::Reflection::GetMethodObject(result, klass);\n    }\n\n    bool MonoMethod::get_IsGenericMethod(Il2CppReflectionMethod* method)\n    {\n        // if we are a generic method definition\n        if (method->method->is_generic)\n            return true;\n\n        // is_inflated is true when a method is a generic instance or it's declaring type is a generic instance type.\n        // Only return true here if we are a generic instance method\n        if (method->method->is_inflated)\n        {\n            const Il2CppGenericContext* context = MetadataCache::GetMethodGenericContext(method->method);\n            return context != NULL && context->method_inst != NULL;\n        }\n\n        return false;\n    }\n\n    Il2CppString *  MonoMethod::get_name(Il2CppReflectionMethod * m)\n    {\n        const MethodInfo *method = m->method;\n\n        IL2CPP_OBJECT_SETREF(m, name, String::New(method->name));\n        return m->name;\n    }\n\n    mscorlib_System_Runtime_InteropServices_DllImportAttribute * MonoMethod::GetDllImportAttribute(Il2CppIntPtr)\n    {\n        //Todo: [DllImport] is an pseudo attribute. it doesn't exist in the metadata as an attribute, but as a flag on a method.\n        //however, if you use reflection to ask for attributes, it does get reported, so what needs to happen is we create an attribute\n        //instanec on the fly and populate it with the data in the metadata. Turns out that if you call GetCustomAttributes() that ends\n        //up calling this function. For now, we will just return an attribute, but not yet populate it with the correct data.\n\n        Il2CppClass* typeInfo = Class::FromName(il2cpp_defaults.corlib, \"System.Runtime.InteropServices\", \"DllImportAttribute\");\n        IL2CPP_ASSERT(typeInfo != NULL);\n\n        return (mscorlib_System_Runtime_InteropServices_DllImportAttribute*)il2cpp::vm::Object::New(typeInfo);\n    }\n\n    Il2CppArray* MonoMethod::GetGenericArguments(Il2CppReflectionMethod* method)\n    {\n        uint32_t count = 0;\n        Il2CppArray* res = NULL;\n        const MethodInfo* methodInfo = method->method;\n        if (methodInfo->is_inflated)\n        {\n            const Il2CppGenericContext* context = MetadataCache::GetMethodGenericContext(methodInfo);\n            if (context && context->method_inst)\n            {\n                const Il2CppGenericInst *inst = context->method_inst;\n                count = inst->type_argc;\n                res = Array::New(il2cpp_defaults.systemtype_class, count);\n\n                for (uint32_t i = 0; i < count; i++)\n                    il2cpp_array_setref(res, i, il2cpp::vm::Reflection::GetTypeObject(inst->type_argv[i]));\n\n                return res;\n            }\n\n            // method is inflated because it's owner is a generic instance type, extract method definition out of the method\n            IL2CPP_ASSERT(methodInfo->is_generic);\n            methodInfo = methodInfo->genericMethod->methodDefinition;\n        }\n\n        const Il2CppGenericContainer *container = MetadataCache::GetMethodGenericContainer(methodInfo);\n\n        count = container != NULL ? container->type_argc : 0;\n        res = Array::New(il2cpp_defaults.systemtype_class, count);\n\n        for (uint32_t i = 0; i < count; i++)\n        {\n            const Il2CppGenericParameter *param = GenericContainer::GetGenericParameter(container, i);\n            Il2CppClass *pklass = Class::FromGenericParameter(param);\n            il2cpp_array_setref(res, i, il2cpp::vm::Reflection::GetTypeObject(pklass->byval_arg));\n        }\n\n        return res;\n    }\n\n    Il2CppObject * MonoMethod::InternalInvoke(Il2CppReflectionMethod * method, Il2CppObject * thisPtr, Il2CppArray * params, Il2CppObject * * exc)\n    {\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(MonoMethod::InternalInvoke, \"Audit and look over commented code. Work in progress.\");\n/*\n     * Invoke from reflection is supposed to always be a virtual call (the API\n     * is stupid), mono_runtime_invoke_*() calls the provided method, allowing\n     * greater flexibility.\n     */\n        const MethodInfo *m = method->method;\n        int pcount;\n        void *obj = thisPtr;\n\n        *exc = NULL;\n\n        if (!(m->flags & METHOD_ATTRIBUTE_STATIC))\n        {\n            if (thisPtr)\n            {\n                //if (!mono_class_vtable_full (mono_object_domain (method), m->klass, FALSE)) {\n                //  mono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_class_get_exception_for_failure (m->klass));\n                //  return NULL;\n                //}\n\n                if (!Object::IsInst(thisPtr, m->declaring_type))\n                {\n                    IL2CPP_ASSERT(0);\n                    //mono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Object does not match target type.\"));\n                    return NULL;\n                }\n\n                m = Object::GetVirtualMethod(thisPtr, m);\n            }\n            else\n#if IL2CPP_ENABLE_MONO_BUG_EMULATION    // Mono doesn't throw on null 'this' if it's an instance constructor, and class libs depend on this behaviour\n            if (strcmp(m->name, \".ctor\"))\n#endif\n            {\n                Exception::Raise(Exception::GetTargetException(\"Non-static method requires a target\"));\n            }\n        }\n\n        pcount = params ? il2cpp::vm::Array::GetLength(params) : 0;\n        if (pcount != m->parameters_count)\n        {\n            IL2CPP_ASSERT(0);\n            //mono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name (mono_defaults.corlib, \"System.Reflection\", \"TargetParameterCountException\"));\n            return NULL;\n        }\n\n        // TODO: Add check for abstract once types have flags\n        //if ((m->declaring_type->flags & TYPE_ATTRIBUTE_ABSTRACT) && !strcmp (m->name, \".ctor\") && !this) {\n        //  mono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Cannot invoke constructor of an abstract class.\"));\n        //  return NULL;\n        //}\n\n        if (m->declaring_type->rank && !strcmp(m->name, \".ctor\"))\n        {\n            int i;\n            il2cpp_array_size_t *lengths;\n            il2cpp_array_size_t *lower_bounds;\n            pcount = il2cpp::vm::Array::GetLength(params);\n            lengths = (il2cpp_array_size_t*)alloca(sizeof(il2cpp_array_size_t) * pcount);\n            for (i = 0; i < pcount; ++i)\n                lengths[i] = *(il2cpp_array_size_t*)((char*)il2cpp_array_get(params, void*, i) + sizeof(Il2CppObject));\n\n            if (m->declaring_type->rank == pcount)\n            {\n                /* Only lengths provided. */\n                lower_bounds = NULL;\n            }\n            else\n            {\n                IL2CPP_ASSERT(pcount == (m->declaring_type->rank * 2));\n                /* lower bounds are first. */\n                lower_bounds = lengths;\n                lengths += m->declaring_type->rank;\n            }\n\n            return (Il2CppObject*)il2cpp::vm::Array::NewFull(m->declaring_type, lengths, lower_bounds);\n        }\n\n        // If a managed exception was thrown, we need raise it here because Runtime::Invoke catches the exception and returns a pointer to it.\n        Il2CppException* exception = NULL;\n\n        Il2CppObject *result = il2cpp::vm::Runtime::InvokeArray(m, obj, params, &exception);\n\n        if (exception)\n            Exception::Raise(exception);\n\n        return result;\n    }\n\n    bool MonoMethod::get_IsGenericMethodDefinition(Il2CppReflectionMethod* method)\n    {\n        return method->method->is_generic;\n    }\n\n    static std::string FormatExceptionMessageForNonConstructableGenericMethod(const MethodInfo* method, const Il2CppTypeVector& genericArguments)\n    {\n        std::string message;\n        message += \"Failed to construct generic method '\";\n        message += Type::GetName(method->declaring_type->byval_arg, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME);\n        message += \"::\";\n        message += Method::GetName(method);\n        message += \"' with generic arguments [\";\n        for (Il2CppTypeVector::const_iterator iter = genericArguments.begin(); iter != genericArguments.end(); ++iter)\n        {\n            if (iter != genericArguments.begin())\n                message += \", \";\n            message += Type::GetName(*iter, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME);\n        }\n        message += \"] at runtime.\";\n\n        return message;\n    }\n\n    Il2CppReflectionMethod* MonoMethod::MakeGenericMethod_impl(Il2CppReflectionMethod* method, Il2CppArray* genericArgumentTypes)\n    {\n        const MethodInfo* genericMethodDefinition = method->method;\n\n        if (!genericMethodDefinition->is_generic)\n        {\n            std::string message; // what's the point of this ?\n            Exception::Raise(Exception::GetInvalidOperationException(message.c_str()));\n        }\n\n        uint32_t arrayLength = Array::GetLength(genericArgumentTypes);\n        Il2CppTypeVector genericArguments;\n        genericArguments.reserve(arrayLength);\n\n        for (uint32_t i = 0; i < arrayLength; i++)\n        {\n            Il2CppReflectionType* genericArgumentType = il2cpp_array_get(genericArgumentTypes, Il2CppReflectionType*, i);\n            genericArguments.push_back(genericArgumentType->type);\n        }\n\n        const MethodInfo* genericInstanceMethod = MetadataCache::GetGenericInstanceMethod(genericMethodDefinition, genericArguments);\n\n        if (!genericInstanceMethod)\n        {\n            Exception::Raise(Exception::GetNotSupportedException(FormatExceptionMessageForNonConstructableGenericMethod(genericMethodDefinition, genericArguments).c_str()));\n            return NULL;\n        }\n\n        return il2cpp::vm::Reflection::GetMethodObject(genericInstanceMethod, NULL);\n    }\n\n    Il2CppReflectionMethod* MonoMethod::GetGenericMethodDefinition_impl(Il2CppReflectionMethod* method)\n    {\n        if (method->method->is_generic)\n            return method;\n\n        if (!method->method->is_inflated)\n            return NULL;\n\n        const MethodInfo* methodDefinition = MetadataCache::GetGenericMethodDefinition(method->method);\n        IL2CPP_ASSERT(methodDefinition);\n\n        if (!methodDefinition->is_generic)\n            return NULL;\n\n\n        const Il2CppGenericContext* methodContext = MetadataCache::GetMethodGenericContext(method->method);\n        IL2CPP_ASSERT(methodContext);\n\n        if (methodContext->class_inst)\n        {\n            NOT_IMPLEMENTED_ICALL(MonoMethod::GetGenericMethodDefinition_impl);\n        }\n\n        return il2cpp::vm::Reflection::GetMethodObject(const_cast<MethodInfo*>(methodDefinition), NULL);\n    }\n\n#if NET_4_0\n    int32_t MonoMethod::get_core_clr_security_level(Il2CppObject* _this)\n    {\n        NOT_IMPLEMENTED_ICALL(MonoMethod::get_core_clr_security_level);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n\n    Il2CppReflectionMethod* MonoMethod::get_base_method(Il2CppReflectionMethod* method, bool definition)\n    {\n        // On the C# side, MonoMethod.GetBaseDefinition is the only caller of this icall that passes definition=true,\n        // so we can do the equivalent call that net20 would do, which would be to call get_base_definition.\n        //\n        // When definition=false.  This is called by MonoMethod.GetBaseMethod, which is internal, and seems to\n        // only be called by some GetCustomAttributes(true) calls.  There is only a small difference in the behavior of this method\n        // when definition is false.\n        const MethodInfo *method2 = method->method;\n        Il2CppClass *klass = method2->declaring_type;\n\n        if (klass == NULL)\n            return method;\n\n        if (!(method2->flags & METHOD_ATTRIBUTE_VIRTUAL) || Class::IsInterface(klass) || method2->flags & METHOD_ATTRIBUTE_NEW_SLOT)\n            return method;\n\n        /*if(klass->generic_class)\n        klass = klass->generic_class->container_class;*/\n\n        if (definition)\n        {\n            for (Il2CppClass* parent = klass->parent; parent != NULL; parent = parent->parent)\n            {\n                if (parent->vtable_count <= method2->slot)\n                    break;\n                klass = parent;\n            }\n        }\n        else\n        {\n            if (!klass->parent)\n            {\n                IL2CPP_ASSERT(klass == il2cpp_defaults.object_class);\n                return method;\n            }\n\n            klass = klass->parent;\n        }\n\n        if (klass == method2->declaring_type)\n            return method;\n\n        il2cpp::vm::Class::Init(klass);\n\n        const MethodInfo *result = klass->vtable[method2->slot].method;\n\n        if (result == NULL)\n        {\n            void *iterator = NULL;\n\n            for (result = Class::GetMethods(klass, &iterator); result != NULL; result = Class::GetMethods(klass, &iterator))\n                if (result->slot == method2->slot)\n                    break;\n        }\n\n        if (result == NULL)\n            return method;\n\n        return il2cpp::vm::Reflection::GetMethodObject(result, klass);\n    }\n\n    void MonoMethod::GetPInvoke(Il2CppReflectionMethod* _this, int32_t* flags, Il2CppString** entryPoint, Il2CppString** dllName)\n    {\n        // we don't keep these around in metadata\n        *flags = 0;\n        *dllName = *entryPoint = vm::String::Empty(); // TODO: Write barrier here!\n    }\n\n#endif\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoMethod.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct mscorlib_System_Runtime_InteropServices_DllImportAttribute;\nstruct mscorlib_System_Reflection_MethodInfo;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API MonoMethod\n    {\n    public:\n        static mscorlib_System_Runtime_InteropServices_DllImportAttribute * GetDllImportAttribute(Il2CppIntPtr);\n        static Il2CppArray * GetGenericArguments(Il2CppReflectionMethod *);\n        static Il2CppReflectionMethod* GetGenericMethodDefinition_impl(Il2CppReflectionMethod* method);\n        static Il2CppObject * InternalInvoke(Il2CppReflectionMethod * method, Il2CppObject * thisPtr, Il2CppArray * params, Il2CppObject * * exc);\n        static bool get_IsGenericMethod(Il2CppReflectionMethod *);\n        static bool get_IsGenericMethodDefinition(Il2CppReflectionMethod *);\n        static Il2CppReflectionMethod* get_base_definition(Il2CppReflectionMethod *);\n        static Il2CppString *  get_name(Il2CppReflectionMethod * m);\n        static Il2CppReflectionMethod* MakeGenericMethod_impl(Il2CppReflectionMethod *, Il2CppArray *);\n\n#if NET_4_0\n        static int32_t get_core_clr_security_level(Il2CppObject* _this);\n        static Il2CppReflectionMethod* get_base_method(Il2CppReflectionMethod* method, bool definition);\n        static void GetPInvoke(Il2CppReflectionMethod* _this, int32_t* flags, Il2CppString** entryPoint, Il2CppString** dllName);\n#endif\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoMethodInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <stddef.h>\n#include \"icalls/mscorlib/System.Reflection/MonoMethodInfo.h\"\n#include \"class-internals.h\"\n#include \"vm/Class.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Exception.h\"\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    void MonoMethodInfo::get_method_info(Il2CppIntPtr methodPtr, Il2CppMethodInfo *info)\n    {\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(MonoMethodInfo::get_method_info, \"Audit and look over commented code. Work in progress.\");\n\n        MethodInfo* method = (MethodInfo*)methodPtr.m_value;\n        //MonoMethodSignature* sig;\n\n        //sig = mono_method_signature (method);\n        //if (!sig) {\n        //  IL2CPP_ASSERT(mono_loader_get_last_error ());\n        //  mono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n        //}\n\n        IL2CPP_STRUCT_SETREF(info, parent, il2cpp::vm::Reflection::GetTypeObject(method->declaring_type->byval_arg));\n        if (method->return_type)\n            IL2CPP_STRUCT_SETREF(info, ret, il2cpp::vm::Reflection::GetTypeObject(method->return_type));\n        info->attrs = method->flags;\n        info->implattrs = method->iflags;\n        //if (sig->call_convention == MONO_CALL_DEFAULT)\n        //  info->callconv = sig->sentinelpos >= 0 ? 2 : 1;\n        //else {\n        //  if (sig->call_convention == MONO_CALL_VARARG || sig->sentinelpos >= 0)\n        //      info->callconv = 2;\n        //  else\n        //      info->callconv = 1;\n        //}\n        //info->callconv |= (sig->hasthis << 5) | (sig->explicit_this << 6);\n    }\n\n    Il2CppArray * MonoMethodInfo::get_parameter_info(Il2CppIntPtr methodPtr, Il2CppReflectionMethod *member)\n    {\n        MethodInfo* method = (MethodInfo*)methodPtr.m_value;\n        return il2cpp::vm::Reflection::GetParamObjects(method, member->reftype ? Class::FromIl2CppType(member->reftype->type) : NULL);\n    }\n\n    void* /* System.Reflection.Emit.UnmanagedMarshal */ MonoMethodInfo::get_retval_marshal(Il2CppIntPtr handle)\n    {\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(MonoMethodInfo::get_retval_marshal, \"This icall is not supported by il2cpp.\");\n\n        return NULL;\n    }\n\n#if NET_4_0\n    int32_t MonoMethodInfo::get_method_attributes(Il2CppIntPtr methodPtr)\n    {\n        MethodInfo* method = (MethodInfo*)methodPtr.m_value;\n        return method->flags;\n    }\n\n#endif\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoMethodInfo.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API MonoMethodInfo\n    {\n    public:\n        static void get_method_info(Il2CppIntPtr methodPtr, Il2CppMethodInfo* info);\n        static void* /* System.Reflection.Emit.UnmanagedMarshal */ get_retval_marshal(Il2CppIntPtr handle);\n        static Il2CppArray* get_parameter_info(Il2CppIntPtr methodPtr, Il2CppReflectionMethod* member);\n\n#if NET_4_0\n        static int32_t get_method_attributes(Il2CppIntPtr methodPtr);\n#endif\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoPropertyInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <stddef.h>\n#include \"icalls/mscorlib/System.Reflection/MonoPropertyInfo.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/String.h\"\n#include \"vm/Exception.h\"\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    void MonoPropertyInfo::get_property_info(Il2CppReflectionProperty *property, Il2CppPropertyInfo *info, PInfo req_info)\n    {\n        if ((req_info & PInfo_ReflectedType) != 0)\n            IL2CPP_STRUCT_SETREF(info, parent, vm::Reflection::GetTypeObject(property->klass->byval_arg));\n        else if ((req_info & PInfo_DeclaringType) != 0)\n        {\n#if !NET_4_0\n            IL2CPP_STRUCT_SETREF(info, parent, vm::Reflection::GetTypeObject(property->property->parent->byval_arg));\n#else\n            IL2CPP_STRUCT_SETREF(info, declaringType, vm::Reflection::GetTypeObject(property->property->parent->byval_arg));\n#endif\n        }\n\n        if ((req_info & PInfo_Name) != 0)\n            IL2CPP_STRUCT_SETREF(info, name, vm::String::New(property->property->name));\n\n        if ((req_info & PInfo_Attributes) != 0)\n            info->attrs = property->property->attrs;\n\n        if ((req_info & PInfo_GetMethod) != 0)\n            IL2CPP_STRUCT_SETREF(info, get, property->property->get ?\n                vm::Reflection::GetMethodObject(property->property->get, property->klass) : NULL);\n\n        if ((req_info & PInfo_SetMethod) != 0)\n            IL2CPP_STRUCT_SETREF(info, set, property->property->set ?\n                vm::Reflection::GetMethodObject(property->property->set, property->klass) : NULL);\n        /*\n         * There may be other methods defined for properties, though, it seems they are not exposed\n         * in the reflection API\n         */\n    }\n\n    Il2CppArray* MonoPropertyInfo::GetTypeModifiers(void* /* System.Reflection.MonoProperty */ prop, bool optional)\n    {\n        NOT_SUPPORTED_IL2CPP(MonoPropertyInfo::GetTypeModifiers, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n#if NET_4_0\n    Il2CppObject* MonoPropertyInfo::get_default_value(Il2CppReflectionProperty* prop)\n    {\n        NOT_IMPLEMENTED_ICALL(MonoPropertyInfo::get_default_value);\n        IL2CPP_UNREACHABLE;\n        return NULL;\n    }\n\n#endif\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/MonoPropertyInfo.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppReflectionProperty;\nstruct Il2CppPropertyInfo;\nstruct Il2CppArray;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    typedef enum\n    {\n        PInfo_Attributes = 1,\n        PInfo_GetMethod  = 1 << 1,\n        PInfo_SetMethod  = 1 << 2,\n        PInfo_ReflectedType = 1 << 3,\n        PInfo_DeclaringType = 1 << 4,\n        PInfo_Name = 1 << 5\n    } PInfo;\n\n    class LIBIL2CPP_CODEGEN_API MonoPropertyInfo\n    {\n    public:\n        static Il2CppArray* GetTypeModifiers(void* /* System.Reflection.MonoProperty */ prop, bool optional);\n        static void get_property_info(Il2CppReflectionProperty *property, Il2CppPropertyInfo *info, PInfo req_info);\n\n#if NET_4_0\n        static Il2CppObject* get_default_value(Il2CppReflectionProperty* prop);\n#endif\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/ParameterInfo.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Reflection/ParameterInfo.h\"\n#include \"vm/Exception.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    int32_t ParameterInfo::GetMetadataToken(Il2CppReflectionParameter* self)\n    {\n        //ReturnParameter Parameter infos are constructed at runtime.\n        if (self->PositionImpl == -1)\n            return 0x8000000; // This is what mono returns as a fixed value.\n\n        Il2CppReflectionMethod* method = (Il2CppReflectionMethod*)self->MemberImpl;\n        const ::ParameterInfo* info = &method->method->parameters[self->PositionImpl];\n        return (int32_t)info->token;\n    }\n\n    Il2CppArray* ParameterInfo::GetTypeModifiers(void* /* System.Reflection.ParameterInfo */ self, bool optional)\n    {\n        NOT_SUPPORTED_IL2CPP(ParameterInfo::GetTypeModifiers, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/ParameterInfo.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API ParameterInfo\n    {\n    public:\n        static Il2CppArray* GetTypeModifiers(void* /* System.Reflection.ParameterInfo */ self, bool optional);\n        static int32_t GetMetadataToken(Il2CppReflectionParameter* self);\n    };\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/PropertyInfo.cpp",
    "content": "#if NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"il2cpp-api.h\"\n#include \"PropertyInfo.h\"\n#include \"vm/Class.h\"\n#include \"vm/Reflection.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    Il2CppReflectionProperty* PropertyInfo::internal_from_handle_type(Il2CppIntPtr handlePtr, Il2CppIntPtr typePtr)\n    {\n        Il2CppClass *klass;\n\n        IL2CPP_ASSERT(handlePtr.m_value);\n\n        ::PropertyInfo *handle = (::PropertyInfo*)handlePtr.m_value;\n        Il2CppType *type = (Il2CppType*)typePtr.m_value;\n\n        if (!type)\n        {\n            klass = handle->parent;\n        }\n        else\n        {\n            klass = il2cpp_class_from_il2cpp_type(type);\n\n            bool found = klass == handle->parent || il2cpp::vm::Class::HasParent(klass, handle->parent);\n            if (!found)\n                /* Managed code will throw an exception */\n                return NULL;\n        }\n\n        Il2CppReflectionProperty *result = il2cpp::vm::Reflection::GetPropertyObject(klass, handle);\n        return result;\n    }\n} // namespace Reflection\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/PropertyInfo.h",
    "content": "#pragma once\n\n#if NET_4_0\n\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API PropertyInfo\n    {\n    public:\n        static Il2CppReflectionProperty* internal_from_handle_type(Il2CppIntPtr event_handle, Il2CppIntPtr type_handle);\n    };\n} // namespace Reflection\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/RtFieldInfo.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"RtFieldInfo.h\"\n#include \"icalls/mscorlib/System.Reflection/MonoField.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    Il2CppObject* RtFieldInfo::UnsafeGetValue(Il2CppReflectionField* _this, Il2CppObject* obj)\n    {\n        // In mono's icall-def.h file, this maps to the same icall as MonoField.GetValueInternal\n        // so our implementation will do the same\n        return MonoField::GetValueInternal(_this, obj);\n    }\n} // namespace Reflection\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection/RtFieldInfo.h",
    "content": "#pragma once\n#if NET_4_0\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\n    class LIBIL2CPP_CODEGEN_API RtFieldInfo\n    {\n    public:\n        static Il2CppObject* UnsafeGetValue(Il2CppReflectionField* _this, Il2CppObject* obj);\n    };\n} // namespace Reflection\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/AssemblyBuilder.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/AssemblyBuilder.h\"\n\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    void AssemblyBuilder::basic_init(mscorlib_System_Reflection_Emit_AssemblyBuilder *)\n    {\n        NOT_SUPPORTED_SRE(AssemblyBuilder::basic_init);\n    }\n\n    mscorlib_System_Reflection_Module* AssemblyBuilder::InternalAddModule(mscorlib_System_Reflection_Emit_AssemblyBuilder * thisPtr, Il2CppString* fileName)\n    {\n        NOT_SUPPORTED_SRE(AssemblyBuilder::InternalAddModule);\n        return NULL;\n    }\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/AssemblyBuilder.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppString;\nstruct mscorlib_System_Reflection_Emit_AssemblyBuilder;\nstruct mscorlib_System_Reflection_Module;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    class LIBIL2CPP_CODEGEN_API AssemblyBuilder\n    {\n    public:\n        static void basic_init(mscorlib_System_Reflection_Emit_AssemblyBuilder*);\n        static mscorlib_System_Reflection_Module* InternalAddModule(mscorlib_System_Reflection_Emit_AssemblyBuilder * thisPtr, Il2CppString* fileName);\n    };\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/CustomAttributeBuilder.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Reflection.Emit/CustomAttributeBuilder.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    Il2CppArray* CustomAttributeBuilder::GetBlob(Il2CppAssembly* asmb, void* /* System.Reflection.ConstructorInfo */ con, Il2CppArray* constructorArgs, Il2CppArray* namedProperties, Il2CppArray* propertyValues, Il2CppArray* namedFields, Il2CppArray* fieldValues)\n    {\n        NOT_SUPPORTED_SRE(CustomAttributeBuilder::GetBlob);\n        return NULL;\n    }\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/CustomAttributeBuilder.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    class LIBIL2CPP_CODEGEN_API CustomAttributeBuilder\n    {\n    public:\n        static Il2CppArray* GetBlob(Il2CppAssembly* asmb, void* /* System.Reflection.ConstructorInfo */ con, Il2CppArray* constructorArgs, Il2CppArray* namedProperties, Il2CppArray* propertyValues, Il2CppArray* namedFields, Il2CppArray* fieldValues);\n    };\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/DerivedType.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/DerivedType.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    void DerivedType::create_unmanaged_type(Il2CppReflectionType* type)\n    {\n        NOT_SUPPORTED_SRE(DerivedType::create_unmanaged_type);\n    }\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/DerivedType.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppReflectionType;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    class LIBIL2CPP_CODEGEN_API DerivedType\n    {\n    public:\n        static void create_unmanaged_type(Il2CppReflectionType* type);\n    };\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/DynamicMethod.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/DynamicMethod.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    void DynamicMethod::create_dynamic_method(Il2CppReflectionDynamicMethod*, Il2CppReflectionDynamicMethod*)\n    {\n        NOT_SUPPORTED_SRE(DynamicMethod::create_dynamic_method);\n    }\n\n    void DynamicMethod::destroy_dynamic_method(Il2CppReflectionDynamicMethod*, Il2CppReflectionDynamicMethod*)\n    {\n        NOT_SUPPORTED_SRE(DynamicMethod::destroy_dynamic_method);\n    }\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/DynamicMethod.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppReflectionDynamicMethod;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    class LIBIL2CPP_CODEGEN_API DynamicMethod\n    {\n    public:\n        static void create_dynamic_method(Il2CppReflectionDynamicMethod*, Il2CppReflectionDynamicMethod*);\n        static void destroy_dynamic_method(Il2CppReflectionDynamicMethod*, Il2CppReflectionDynamicMethod*);\n    };\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/EnumBuilder.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/EnumBuilder.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    void EnumBuilder::setup_enum_type(Il2CppReflectionType *enumtype, Il2CppReflectionType* t)\n    {\n        NOT_SUPPORTED_SRE(EnumBuilder::setup_enum_type);\n    }\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/EnumBuilder.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppReflectionType;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    class LIBIL2CPP_CODEGEN_API EnumBuilder\n    {\n    public:\n        static void setup_enum_type(Il2CppReflectionType *enumtype, Il2CppReflectionType* t);\n    };\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/GenericTypeParameterBuilder.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/GenericTypeParameterBuilder.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    void GenericTypeParameterBuilder::initialize(Il2CppReflectionGenericParam* genericParameter)\n    {\n        NOT_SUPPORTED_SRE(GenericTypeParameterBuilder::initialize);\n    }\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/GenericTypeParameterBuilder.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppReflectionGenericParam;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    class LIBIL2CPP_CODEGEN_API GenericTypeParameterBuilder\n    {\n    public:\n        static void initialize(Il2CppReflectionGenericParam* genericParameter);\n    };\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/MethodBuilder.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/MethodBuilder.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    Il2CppReflectionMethod* MethodBuilder::MakeGenericMethod(Il2CppReflectionMethod*, Il2CppArray*)\n    {\n        NOT_SUPPORTED_SRE(MethodBuilder::MakeGenericMethod);\n        return NULL;\n    }\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/MethodBuilder.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppArray;\nstruct Il2CppReflectionMethod;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    class LIBIL2CPP_CODEGEN_API MethodBuilder\n    {\n    public:\n        static Il2CppReflectionMethod* MakeGenericMethod(Il2CppReflectionMethod*, Il2CppArray*);\n    };\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/ModuleBuilder.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/ModuleBuilder.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    void ModuleBuilder::basic_init(Il2CppReflectionModuleBuilder*)\n    {\n        NOT_SUPPORTED_SRE(ModuleBuilder::basic_init);\n    }\n\n    void ModuleBuilder::RegisterToken(Il2CppReflectionModuleBuilder*, Il2CppObject*, int)\n    {\n        NOT_SUPPORTED_SRE(ModuleBuilder::RegisterToken);\n    }\n\n    void ModuleBuilder::set_wrappers_type(Il2CppReflectionModuleBuilder*, Il2CppReflectionType*)\n    {\n        NOT_SUPPORTED_SRE(ModuleBuilder::set_wrappers_type);\n    }\n\n    Il2CppReflectionType * ModuleBuilder::create_modified_type(Il2CppReflectionTypeBuilder*, Il2CppString*)\n    {\n        NOT_SUPPORTED_SRE(ModuleBuilder::create_modified_type);\n        return NULL;\n    }\n\n    int32_t ModuleBuilder::getUSIndex(Il2CppReflectionModuleBuilder*, Il2CppString* str)\n    {\n        NOT_SUPPORTED_SRE(ModuleBuilder::getUSIndex);\n        return 0;\n    }\n\n    int32_t ModuleBuilder::getToken(Il2CppReflectionModuleBuilder*, Il2CppObject * obj)\n    {\n        NOT_SUPPORTED_SRE(ModuleBuilder::getToken);\n        return 0;\n    }\n\n    int32_t ModuleBuilder::getMethodToken(Il2CppReflectionModuleBuilder*, Il2CppReflectionMethod*, Il2CppArray*)\n    {\n        NOT_SUPPORTED_SRE(ModuleBuilder::getMethodToken);\n        return 0;\n    }\n\n    void ModuleBuilder::build_metadata(Il2CppReflectionModuleBuilder*)\n    {\n        NOT_SUPPORTED_SRE(ModuleBuilder::build_metadata);\n    }\n\n    void ModuleBuilder::WriteToFile(Il2CppReflectionModuleBuilder*, Il2CppIntPtr)\n    {\n        NOT_SUPPORTED_SRE(ModuleBuilder::WriteToFile);\n    }\n\n#if NET_4_0\n    int32_t ModuleBuilder::getMethodToken40(Il2CppObject* mb, Il2CppObject* method, Il2CppArray* opt_param_types)\n    {\n        NOT_IMPLEMENTED_ICALL(ModuleBuilder::getMethodToken40);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n\n    int32_t ModuleBuilder::getToken40(Il2CppObject* mb, Il2CppObject* obj, bool create_open_instance)\n    {\n        NOT_IMPLEMENTED_ICALL(ModuleBuilder::getToken40);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n\n    Il2CppObject* ModuleBuilder::GetRegisteredToken(Il2CppObject* _this, int32_t token)\n    {\n        NOT_IMPLEMENTED_ICALL(ModuleBuilder::GetRegisteredToken);\n        IL2CPP_UNREACHABLE;\n        return NULL;\n    }\n\n#endif\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/ModuleBuilder.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppArray;\nstruct Il2CppString;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionModuleBuilder;\nstruct Il2CppReflectionTypeBuilder;\nstruct Il2CppReflectionType;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    class LIBIL2CPP_CODEGEN_API ModuleBuilder\n    {\n    public:\n        static void RegisterToken(Il2CppReflectionModuleBuilder*, Il2CppObject*, int);\n        static void WriteToFile(Il2CppReflectionModuleBuilder*, Il2CppIntPtr);\n        static void basic_init(Il2CppReflectionModuleBuilder*);\n        static void build_metadata(Il2CppReflectionModuleBuilder*);\n        static Il2CppReflectionType * create_modified_type(Il2CppReflectionTypeBuilder*, Il2CppString*);\n        static int32_t getToken(Il2CppReflectionModuleBuilder*, Il2CppObject*);\n        static int32_t getUSIndex(Il2CppReflectionModuleBuilder*, Il2CppString*);\n        static void set_wrappers_type(Il2CppReflectionModuleBuilder*, Il2CppReflectionType*);\n        static int32_t getMethodToken(Il2CppReflectionModuleBuilder*, Il2CppReflectionMethod*, Il2CppArray*);\n#if NET_4_0\n        static int32_t getMethodToken40(Il2CppObject* mb, Il2CppObject* method, Il2CppArray* opt_param_types);\n        static int32_t getToken40(Il2CppObject* mb, Il2CppObject* obj, bool create_open_instance);\n        static Il2CppObject* GetRegisteredToken(Il2CppObject* _this, int32_t token);\n#endif\n    };\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/SignatureHelper.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/SignatureHelper.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    Il2CppArray* SignatureHelper::get_signature_local(Il2CppReflectionSigHelper*)\n    {\n        NOT_SUPPORTED_SRE(SignatureHelper::get_signature_local);\n        return NULL;\n    }\n\n    Il2CppArray* SignatureHelper::get_signature_field(Il2CppReflectionSigHelper*)\n    {\n        NOT_SUPPORTED_SRE(SignatureHelper::get_signature_field);\n        return NULL;\n    }\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/SignatureHelper.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppArray;\nstruct Il2CppReflectionSigHelper;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    class LIBIL2CPP_CODEGEN_API SignatureHelper\n    {\n    public:\n        static Il2CppArray* get_signature_field(Il2CppReflectionSigHelper*);\n        static Il2CppArray* get_signature_local(Il2CppReflectionSigHelper*);\n    };\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/SymbolType.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"SymbolType.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    void SymbolType::create_unmanaged_type(Il2CppObject* type)\n    {\n        NOT_IMPLEMENTED_ICALL(SymbolType::create_unmanaged_type);\n        IL2CPP_UNREACHABLE;\n    }\n} // namespace Emit\n} // namespace Reflection\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/SymbolType.h",
    "content": "#if NET_4_0\n#pragma once\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    class LIBIL2CPP_CODEGEN_API SymbolType\n    {\n    public:\n        static void create_unmanaged_type(Il2CppObject* type);\n    };\n} // namespace Emit\n} // namespace Reflection\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/TypeBuilder.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Reflection.Emit/TypeBuilder.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    void TypeBuilder::create_generic_class(Il2CppReflectionTypeBuilder*)\n    {\n        NOT_SUPPORTED_SRE(TypeBuilder::create_generic_class);\n    }\n\n    Il2CppReflectionType* TypeBuilder::create_runtime_class(Il2CppReflectionTypeBuilder*, Il2CppReflectionTypeBuilder*)\n    {\n        NOT_SUPPORTED_SRE(TypeBuilder::create_runtime_class);\n        return NULL;\n    }\n\n    Il2CppReflectionEvent* TypeBuilder::get_event_info(Il2CppReflectionTypeBuilder*, Il2CppReflectionEventBuilder*)\n    {\n        NOT_SUPPORTED_SRE(TypeBuilder::get_event_info);\n        return NULL;\n    }\n\n    bool TypeBuilder::get_IsGenericParameter(Il2CppReflectionTypeBuilder*)\n    {\n        NOT_SUPPORTED_SRE(TypeBuilder::get_IsGenericParameter);\n        return false;\n    }\n\n    void TypeBuilder::setup_internal_class(Il2CppReflectionTypeBuilder*, Il2CppReflectionTypeBuilder*)\n    {\n        NOT_SUPPORTED_SRE(TypeBuilder::setup_internal_class);\n    }\n\n    void TypeBuilder::create_internal_class(Il2CppReflectionTypeBuilder* tb)\n    {\n        NOT_SUPPORTED_SRE(TypeBuilder::create_internal_class);\n    }\n\n    void TypeBuilder::setup_generic_class(Il2CppReflectionTypeBuilder*)\n    {\n        NOT_SUPPORTED_SRE(TypeBuilder::setup_generic_class);\n    }\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Reflection.Emit/TypeBuilder.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppReflectionEvent;\nstruct Il2CppReflectionEventBuilder;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionTypeBuilder;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Reflection\n{\nnamespace Emit\n{\n    class LIBIL2CPP_CODEGEN_API TypeBuilder\n    {\n    public:\n        static void create_generic_class(Il2CppReflectionTypeBuilder*);\n        static void create_internal_class(Il2CppReflectionTypeBuilder*);\n        static Il2CppReflectionType* create_runtime_class(Il2CppReflectionTypeBuilder*, Il2CppReflectionTypeBuilder*);\n        static bool get_IsGenericParameter(Il2CppReflectionTypeBuilder*);\n        static Il2CppReflectionEvent* get_event_info(Il2CppReflectionTypeBuilder*, Il2CppReflectionEventBuilder*);\n        static void setup_generic_class(Il2CppReflectionTypeBuilder*);\n        static void setup_internal_class(Il2CppReflectionTypeBuilder*, Il2CppReflectionTypeBuilder*);\n    };\n} /* namespace Emit */\n} /* namespace Reflection */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.CompilerServices/RuntimeHelpers.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <memory>\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"tabledefs.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Field.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Type.h\"\n#include \"icalls/mscorlib/System.Runtime.CompilerServices/RuntimeHelpers.h\"\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace CompilerServices\n{\n    int RuntimeHelpers::get_OffsetToStringData(void)\n    {\n        return offsetof(Il2CppString, chars);\n    }\n\n    void RuntimeHelpers::InitializeArray(Il2CppArray * array, Il2CppIntPtr ptr)\n    {\n        FieldInfo* field_handle = (FieldInfo*)ptr.m_value;\n        Il2CppClass *klass = array->klass;\n        uint32_t size = Array::GetElementSize(klass);\n        const Il2CppType *type = Type::GetUnderlyingType(klass->element_class->byval_arg);\n\n        const char *field_data;\n\n        if (Type::IsReference(type) || (type->type == IL2CPP_TYPE_VALUETYPE && (!Type::GetClass(type) || Type::GetClass(type)->has_references)))\n        {\n            Il2CppException *exc = Exception::GetArgumentException(\"array\",\n                    \"Cannot initialize array containing references\");\n            Exception::Raise(exc);\n        }\n\n        if (!(field_handle->type->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA))\n        {\n            Il2CppException *exc = Exception::GetArgumentException(\"field_handle\", \"Field doesn't have an RVA\");\n            Exception::Raise(exc);\n        }\n\n        size *= array->max_length;\n        field_data = Field::GetData(field_handle);\n\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(RuntimeHelpers::InitializeArray, \"Check type size\");\n        //int align;\n        //if (size > mono_type_size (field_handle->type, &align)) {\n        //  MonoException *exc = mono_get_exception_argument(\"field_handle\",\n        //      \"Field not large enough to fill array\");\n        //  mono_raise_exception (exc);\n        //}\n\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(RuntimeHelpers::InitializeArray, \"Ignoring Endianess\");\n        memcpy(il2cpp_array_addr(array, char, 0), field_data, size);\n    }\n\n    Il2CppObject* RuntimeHelpers::GetObjectValue(Il2CppObject* obj)\n    {\n        NOT_SUPPORTED_IL2CPP(RuntimeHelpers::GetObjectValue, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    void RuntimeHelpers::RunClassConstructor(Il2CppIntPtr type)\n    {\n        IL2CPP_CHECK_ARG_NULL(type.m_value);\n\n        Il2CppClass* klass = Class::FromIl2CppType((const Il2CppType*)type.m_value);\n        //MONO_CHECK_ARG(handle, klass);\n\n        il2cpp::vm::Runtime::ClassInit(klass);\n    }\n\n    void RuntimeHelpers::RunModuleConstructor(Il2CppIntPtr module)\n    {\n        NOT_SUPPORTED_IL2CPP(RuntimeHelpers::RunModuleConstructor, \"This icall is not supported by il2cpp.\");\n    }\n\n#if NET_4_0\n    bool RuntimeHelpers::SufficientExecutionStack()\n    {\n        NOT_IMPLEMENTED_ICALL(RuntimeHelpers::SufficientExecutionStack);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n#endif\n} /* namespace CompilerServices */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.CompilerServices/RuntimeHelpers.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace CompilerServices\n{\n    class LIBIL2CPP_CODEGEN_API RuntimeHelpers\n    {\n    public:\n        static Il2CppObject* GetObjectValue(Il2CppObject* obj);\n        static void RunClassConstructor(Il2CppIntPtr type);\n        static void RunModuleConstructor(Il2CppIntPtr module);\n        static int get_OffsetToStringData(void);\n        static void InitializeArray(Il2CppArray* arr, Il2CppIntPtr ptr);\n\n#if NET_4_0\n        static bool SufficientExecutionStack();\n#endif\n    };\n} /* namespace CompilerServices */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.InteropServices/GCHandle.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"icalls/mscorlib/System.Runtime.InteropServices/GCHandle.h\"\n#include \"gc/GCHandle.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace InteropServices\n{\n    bool GCHandle::CheckCurrentDomain(int32_t handle)\n    {\n        return true; // il2cpp doesn't support multiple domains\n    }\n\n    void GCHandle::FreeHandle(int32_t handle)\n    {\n        gc::GCHandle::Free(handle);\n    }\n\n    static inline Il2CppIntPtr MakeIntPtr(uint8_t* value)\n    {\n        Il2CppIntPtr ptr;\n        ptr.m_value = reinterpret_cast<void*>(value);\n        return ptr;\n    }\n\n// Returns -2 if gchandle is not pinned\n    Il2CppIntPtr GCHandle::GetAddrOfPinnedObject(int32_t handle)\n    {\n        gc::GCHandleType type = gc::GCHandle::GetHandleType(handle);\n\n        if (type != gc::HANDLE_PINNED)\n            return MakeIntPtr(reinterpret_cast<uint8_t*>(-2)); // mscorlib on managed land expects us to return \"-2\" as IntPtr if this condition occurs\n\n        Il2CppObject* obj = gc::GCHandle::GetTarget(handle);\n        if (obj == NULL)\n            return MakeIntPtr(NULL);\n\n        ptrdiff_t offset;\n\n        if (obj->klass->rank > 0)\n        {\n            // Pointer to first array element\n            offset = kIl2CppSizeOfArray;\n        }\n        else if (obj->klass->byval_arg->type == IL2CPP_TYPE_STRING)\n        {\n            // Pointer to first character\n            offset = offsetof(Il2CppString, chars);\n        }\n        else\n        {\n            // Pointer to struct in boxed object\n            offset = sizeof(Il2CppObject);\n        }\n\n        return MakeIntPtr(reinterpret_cast<uint8_t*>(obj) + offset);\n    }\n\n    Il2CppObject* GCHandle::GetTarget(int32_t handle)\n    {\n        return gc::GCHandle::GetTarget(handle);\n    }\n\n    static inline bool IsObjectPinnable(Il2CppObject* obj)\n    {\n        if (obj == NULL)\n            return true;\n\n        Il2CppClass* klass = obj->klass;\n        if (klass->byval_arg->type == IL2CPP_TYPE_ARRAY || klass->byval_arg->type == IL2CPP_TYPE_SZARRAY)\n        {\n            Il2CppClass* elementClass = klass->element_class;\n            return elementClass->is_blittable ||\n                elementClass->byval_arg->type == IL2CPP_TYPE_CHAR || // while \"char\" and \"bool\" are not blittable, we can still pin their arrays\n                elementClass->byval_arg->type == IL2CPP_TYPE_BOOLEAN;\n        }\n\n        if (klass->byval_arg->type == IL2CPP_TYPE_CHAR  || klass->byval_arg->type == IL2CPP_TYPE_BOOLEAN || klass->byval_arg->type == IL2CPP_TYPE_STRING)\n            return true;\n\n        return klass->is_blittable;\n    }\n\n    int32_t GCHandle::GetTargetHandle(Il2CppObject* obj, int32_t handle, int32_t type)\n    {\n        if (type == gc::HANDLE_PINNED && !IsObjectPinnable(obj))\n        {\n            Il2CppException* ex = vm::Exception::GetArgumentException(NULL, \"Object contains non-primitive or non-blittable data.\");\n            vm::Exception::Raise(ex);\n        }\n\n        return gc::GCHandle::GetTargetHandle(obj, handle, type);\n    }\n} /* namespace InteropServices */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.InteropServices/GCHandle.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace InteropServices\n{\n    class LIBIL2CPP_CODEGEN_API GCHandle\n    {\n    public:\n        static bool CheckCurrentDomain(int32_t handle);\n        static void FreeHandle(int32_t handle);\n        static Il2CppIntPtr GetAddrOfPinnedObject(int32_t handle);\n        static Il2CppObject * GetTarget(int32_t handle);\n        static int32_t GetTargetHandle(Il2CppObject * obj, int32_t handle, int32_t type);\n    };\n} /* namespace InteropServices */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.InteropServices/Marshal.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Runtime.InteropServices/Marshal.h\"\n\n#include \"class-internals.h\"\n#include \"tabledefs.h\"\n\n#include \"gc/GarbageCollector.h\"\n#include \"metadata/FieldLayout.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Field.h\"\n#include \"vm/Image.h\"\n#include \"vm/LastError.h\"\n#include \"vm/MarshalAlloc.h\"\n#include \"vm/Object.h\"\n#include \"vm/PlatformInvoke.h\"\n#include \"vm/RCW.h\"\n#include \"vm/String.h\"\n#include \"vm/Type.h\"\n#include \"utils/MarshalingUtils.h\"\n#include \"utils/StringUtils.h\"\n#include <sstream>\n#include <string>\n#include <sstream>\n#include <deque>\n\nusing namespace il2cpp::vm;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace InteropServices\n{\n    int32_t Marshal::AddRefInternal(Il2CppIntPtr pUnk)\n    {\n        return static_cast<Il2CppIUnknown*>(pUnk.m_value)->AddRef();\n    }\n\n    Il2CppIntPtr Marshal::AllocCoTaskMem(int32_t size)\n    {\n        Il2CppIntPtr result;\n        result.m_value = MarshalAlloc::Allocate(size);\n        return result;\n    }\n\n    Il2CppIntPtr Marshal::AllocHGlobal(Il2CppIntPtr size)\n    {\n        Il2CppIntPtr result;\n        result.m_value = MarshalAlloc::AllocateHGlobal((size_t)size.m_value);\n        return result;\n    }\n\n    void Marshal::copy_from_unmanaged(Il2CppIntPtr source, int startIndex, Il2CppArray * destination, int length)\n    {\n        uint32_t element_size = (uint32_t)il2cpp_array_element_size(destination->klass);\n        memcpy(il2cpp_array_addr_with_size(destination, element_size, startIndex), source.m_value, length * element_size);\n    }\n\n    void Marshal::copy_to_unmanaged(Il2CppArray * source, int32_t startIndex, Il2CppIntPtr destination, int32_t length)\n    {\n        uint32_t element_size = (uint32_t)il2cpp_array_element_size(source->klass);\n        memcpy(destination.m_value, il2cpp_array_addr_with_size(source, element_size, startIndex), length * element_size);\n    }\n\n    void Marshal::FreeBSTR(Il2CppIntPtr ptr)\n    {\n        NOT_SUPPORTED_IL2CPP(Marshal::StringToBSTR, \"BSTR icalls are not supported.\");\n    }\n\n    void Marshal::FreeCoTaskMem(Il2CppIntPtr ptr)\n    {\n        MarshalAlloc::Free(ptr.m_value);\n    }\n\n    void Marshal::FreeHGlobal(Il2CppIntPtr hglobal)\n    {\n        MarshalAlloc::FreeHGlobal(hglobal.m_value);\n    }\n\n    bool Marshal::IsComObject(Il2CppObject* o)\n    {\n        return o->klass->is_import_or_windows_runtime;\n    }\n\n    Il2CppIntPtr Marshal::GetCCW(Il2CppObject* o, Il2CppReflectionType * T)\n    {\n        NOT_SUPPORTED_IL2CPP(Marshal::GetCCW, \"COM icalls are not supported.\");\n        return Il2CppIntPtr::Zero;\n    }\n\n    int32_t Marshal::GetComSlotForMethodInfoInternal(mscorlib_System_Reflection_MemberInfo * m)\n    {\n        NOT_SUPPORTED_IL2CPP(Marshal::GetComSlotForMethodInfoInternal, \"COM icalls are not supported.\");\n        return 0;\n    }\n\n    Il2CppDelegate* Marshal::GetDelegateForFunctionPointerInternal(Il2CppIntPtr ptr, Il2CppReflectionType* t)\n    {\n        Il2CppClass* delegateType = il2cpp::vm::Class::FromIl2CppType(t->type);\n        return PlatformInvoke::MarshalFunctionPointerToDelegate(ptr.m_value, delegateType);\n    }\n\n    Il2CppIntPtr Marshal::GetFunctionPointerForDelegateInternal(Il2CppDelegate* d)\n    {\n        return vm::PlatformInvoke::MarshalDelegate(d);\n    }\n\n    Il2CppIntPtr Marshal::GetIDispatchForObjectInternal(Il2CppObject* o)\n    {\n        NOT_SUPPORTED_IL2CPP(Marshal::GetIDispatchForObjectInternal, \"COM icalls are not supported.\");\n        return Il2CppIntPtr::Zero;\n    }\n\n    Il2CppIntPtr Marshal::GetIUnknownForObjectInternal(Il2CppObject* o)\n    {\n        NOT_SUPPORTED_IL2CPP(Marshal::GetIUnknownForObjectInternal, \"This icall is not supported by il2cpp. Use the il2cpp_codegen_com_get_iunknown_for_object intrinsic instead.\");\n        return Il2CppIntPtr::Zero;\n    }\n\n    Il2CppObject* Marshal::GetObjectForCCW(Il2CppIntPtr pUnk)\n    {\n        if (pUnk.m_value == NULL)\n            return NULL;\n\n        return RCW::GetOrCreateFromIUnknown(static_cast<Il2CppIUnknown*>(pUnk.m_value), il2cpp_defaults.il2cpp_com_object_class);\n    }\n\n    Il2CppString* Marshal::PtrToStringBSTR(Il2CppIntPtr ptr)\n    {\n        NOT_SUPPORTED_IL2CPP(Marshal::PtrToStringBSTR, \"COM icalls are not supported.\");\n        return 0;\n    }\n\n    Il2CppString* Marshal::PtrToStringAnsi_mscorlib_System_String_mscorlib_System_IntPtr(Il2CppIntPtr ptr)\n    {\n        char* value = (char*)ptr.m_value;\n        if (value == NULL)\n            return NULL;\n        return String::New(value);\n    }\n\n    Il2CppString* Marshal::PtrToStringAnsi_mscorlib_System_String_mscorlib_System_IntPtr_mscorlib_System_Int32(Il2CppIntPtr ptr, int32_t len)\n    {\n        char* value = (char*)ptr.m_value;\n        if (value == NULL)\n            Exception::Raise(Exception::GetArgumentNullException(\"ptr\"));\n\n        return String::NewLen(value, len);\n    }\n\n    Il2CppString* Marshal::PtrToStringUni_mscorlib_System_String_mscorlib_System_IntPtr(Il2CppIntPtr ptr)\n    {\n        Il2CppChar* value = static_cast<Il2CppChar*>(ptr.m_value);\n        if (value == NULL)\n            return NULL;\n\n        int32_t len = 0;\n        Il2CppChar* t = value;\n\n        while (*t++)\n            len++;\n\n        return String::NewUtf16(value, len);\n    }\n\n    Il2CppString* Marshal::PtrToStringUni_mscorlib_System_String_mscorlib_System_IntPtr_mscorlib_System_Int32(Il2CppIntPtr ptr, int32_t len)\n    {\n        Il2CppChar* value = static_cast<Il2CppChar*>(ptr.m_value);\n        if (value == NULL)\n            Exception::Raise(Exception::GetArgumentNullException(\"ptr\"));\n\n        return String::NewUtf16(value, len);\n    }\n\n    Il2CppObject* Marshal::PtrToStructure(Il2CppIntPtr ptr, Il2CppReflectionType* structureType)\n    {\n        if (ptr.m_value == NULL)\n            return NULL;\n\n        if (structureType == NULL)\n            Exception::Raise(Exception::GetArgumentNullException(\"structureType\"));\n\n        Il2CppClass* type = Class::FromIl2CppType(structureType->type);\n\n        Il2CppTypeEnum typeType = structureType->type->type;\n\n        if (typeType == IL2CPP_TYPE_STRING || typeType == IL2CPP_TYPE_SZARRAY || (typeType == IL2CPP_TYPE_CLASS && !Class::HasDefaultConstructor(type)))\n        {\n            Exception::Raise(Exception::GetMissingMethodException(\"No parameterless constructor defined for this object.\"));\n        }\n\n        if (type->interopData != NULL && type->interopData->pinvokeMarshalFromNativeFunction != NULL)\n        {\n            Il2CppObject* result = Object::New(type);\n\n            if (typeType == IL2CPP_TYPE_CLASS)\n            {\n                typedef void (*Constructor)(Il2CppObject*);\n                Constructor ctor = reinterpret_cast<Constructor>(Class::GetMethodFromName(type, \".ctor\", 0)->methodPointer);\n                ctor(result);\n                utils::MarshalingUtils::MarshalStructFromNative(ptr.m_value, result, type->interopData);\n            }\n            else\n            {\n                utils::MarshalingUtils::MarshalStructFromNative(ptr.m_value, Object::Unbox(result), type->interopData);\n            }\n\n            return result;\n        }\n\n        // If there's no custom marshal function, it means it's either a primitive, or invalid argument\n        if (type->native_size != -1)\n        {\n            // We may also need to throw a NotSupportedException for an ArgIterator.\n            if (structureType->type->type == IL2CPP_TYPE_VOID)\n                Exception::Raise(Exception::GetNotSupportedException(\"Cannot dynamically create an instance of System.Void.\"));\n\n            // PtrToStructure is supposed to throw on enums\n            if (!type->enumtype)\n            {\n                Il2CppObject* result = Object::New(type);\n                memcpy(Object::Unbox(result), ptr.m_value, type->native_size);\n                return result;\n            }\n        }\n\n        // If we got this far, throw an exception\n\n        if (type->generic_class != NULL || type->is_generic)\n            Exception::Raise(Exception::GetArgumentException(\"structure\", \"The specified object must not be an instance of a generic type.\"));\n\n        Exception::Raise(Exception::GetArgumentException(\"structure\", \"The specified structure must be blittable or have layout information.\"));\n        return NULL;\n    }\n\n    void Marshal::PtrToStructureObject(Il2CppIntPtr ptr, Il2CppObject* structure)\n    {\n        if (ptr.m_value == NULL)\n            return;\n\n        if (structure == NULL)\n            Exception::Raise(Exception::GetArgumentNullException(\"structure\"));\n\n        Il2CppClass* type = structure->klass;\n\n        // This is only legal for classes.\n        if (type->byval_arg->type != IL2CPP_TYPE_CLASS)\n        {\n            Exception::Raise(Exception::GetArgumentException(\"structure\", \"The specified structure must be an instance of a formattable class.\"));\n        }\n\n        if (type->interopData != NULL && type->interopData->pinvokeMarshalFromNativeFunction != NULL)\n        {\n            utils::MarshalingUtils::MarshalStructFromNative(ptr.m_value, structure, type->interopData);\n            return;\n        }\n\n        if (type->generic_class || type->is_generic)\n            Exception::Raise(Exception::GetArgumentException(\"structure\", \"The specified object must not be an instance of a generic type.\"));\n\n        Exception::Raise(Exception::GetArgumentException(\"structure\", \"The specified structure must be blittable or have layout information.\"));\n    }\n\n    int32_t Marshal::QueryInterfaceInternal(Il2CppIntPtr pUnk, mscorlib_System_Guid * iid, Il2CppIntPtr* ppv)\n    {\n        NOT_SUPPORTED_IL2CPP(Marshal::QueryInterfaceInternal, \"COM icalls are not supported.\");\n        return 0;\n    }\n\n    template<typename T>\n    static inline T ReadValue(Il2CppIntPtr ptr, int32_t offset)\n    {\n        return *reinterpret_cast<T*>(static_cast<uint8_t*>(ptr.m_value) + offset);\n    }\n\n    uint8_t Marshal::ReadByte(Il2CppIntPtr ptr, int32_t ofs)\n    {\n        return ReadValue<uint8_t>(ptr, ofs);\n    }\n\n    int16_t Marshal::ReadInt16(Il2CppIntPtr ptr, int32_t ofs)\n    {\n        return ReadValue<int16_t>(ptr, ofs);\n    }\n\n    int32_t Marshal::ReadInt32(Il2CppIntPtr ptr, int32_t ofs)\n    {\n        return ReadValue<int32_t>(ptr, ofs);\n    }\n\n    int64_t Marshal::ReadInt64(Il2CppIntPtr ptr, int32_t ofs)\n    {\n        return ReadValue<int64_t>(ptr, ofs);\n    }\n\n    Il2CppIntPtr Marshal::ReadIntPtr(Il2CppIntPtr ptr, int32_t ofs)\n    {\n        return ReadValue<Il2CppIntPtr>(ptr, ofs);\n    }\n\n    int32_t Marshal::ReleaseInternal(Il2CppIntPtr pUnk)\n    {\n        return static_cast<Il2CppIUnknown*>(pUnk.m_value)->Release();\n    }\n\n    int32_t Marshal::ReleaseComObjectInternal(Il2CppObject* co)\n    {\n        // There's a check in mscorlib before calling this internal icall, so assert instead of full check is OK here.\n        IL2CPP_ASSERT(co->klass->is_import_or_windows_runtime);\n\n        // We can't really release the COM object directly, because it might have additional\n        // fields that cache different interfaces. So let's just call its finalizer here.\n        // In order to deal with the fact that this may get called from different threads\n        // at the same time, we (atomically) register a NULL finalizer, and if another finalizer\n        // was already registered, we call it. If there was no finalizer registered, it means\n        // that we lost the race and we should just carry on.\n        gc::GarbageCollector::FinalizerCallback oldFinalizer = gc::GarbageCollector::RegisterFinalizerWithCallback(co, NULL);\n        if (oldFinalizer != NULL)\n            oldFinalizer(co, NULL);\n\n        return 0;\n    }\n\n    int Marshal::SizeOf(Il2CppReflectionType* rtype)\n    {\n        if (rtype == NULL)\n            Exception::Raise(Exception::GetArgumentNullException(\"t\"));\n\n        Il2CppClass* typeInfo = Class::FromIl2CppType(rtype->type);\n\n        if (typeInfo->native_size != -1)\n        {\n            // SizeOf \"cannot\" get size of enums and strings\n            if (!typeInfo->enumtype && rtype->type->type != IL2CPP_TYPE_STRING)\n                return typeInfo->native_size;\n        }\n\n        // If we get to here, type does not have a native size\n        // So let's figure what kind of exception to throw\n\n        if (typeInfo->generic_class != NULL || typeInfo->is_generic)\n            Exception::Raise(Exception::GetArgumentException(\"t\", \"The t parameter is a generic type.\"));\n\n        std::string exceptionMessage = utils::StringUtils::Printf(\"Type \\'%s\\' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.\",\n                Type::GetName(rtype->type, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME).c_str());\n\n        Exception::Raise(Exception::GetArgumentException(NULL, exceptionMessage.c_str()));\n        return 0;\n    }\n\n    Il2CppIntPtr Marshal::StringToBSTR(Il2CppString* s)\n    {\n        NOT_SUPPORTED_IL2CPP(Marshal::StringToBSTR, \"BSTR icalls are not supported.\");\n        return Il2CppIntPtr::Zero;\n    }\n\n    Il2CppIntPtr Marshal::StringToHGlobalUni(Il2CppString* s)\n    {\n        if (s == NULL)\n            return Il2CppIntPtr::Zero;\n\n        int32_t size = utils::StringUtils::GetLength(s);\n        const Il2CppChar* utf16 = utils::StringUtils::GetChars(s);\n        size_t bytes = (size + 1) * 2;\n        Il2CppChar* cstr = static_cast<Il2CppChar*>(MarshalAlloc::AllocateHGlobal(bytes));\n        memcpy(cstr, utf16, bytes);\n        Il2CppIntPtr result;\n        result.m_value = cstr;\n        return result;\n    }\n\n    Il2CppIntPtr Marshal::StringToHGlobalAnsi(Il2CppString* s)\n    {\n        if (s == NULL)\n            return Il2CppIntPtr::Zero;\n\n        const Il2CppChar* utf16 = utils::StringUtils::GetChars(s);\n        std::string str = il2cpp::utils::StringUtils::Utf16ToUtf8(utf16);\n        char *cstr = (char*)MarshalAlloc::AllocateHGlobal(str.size() + 1);\n        strcpy(cstr, str.c_str());\n        Il2CppIntPtr result;\n        result.m_value = cstr;\n        return result;\n    }\n\n    void Marshal::StructureToPtr(Il2CppObject* structure, Il2CppIntPtr ptr, bool deleteOld)\n    {\n        if (structure == NULL)\n            Exception::Raise(Exception::GetArgumentNullException(\"structure\"));\n\n        if (ptr.m_value == NULL)\n            Exception::Raise(Exception::GetArgumentNullException(\"ptr\"));\n\n        Il2CppClass* type = structure->klass;\n\n        if (type->interopData != NULL && type->interopData->pinvokeMarshalToNativeFunction != NULL)\n        {\n            if (deleteOld)\n                utils::MarshalingUtils::MarshalFreeStruct(ptr.m_value, type->interopData);\n\n            void* objectPtr = (type->byval_arg->type == IL2CPP_TYPE_CLASS) ? structure : Object::Unbox(structure);\n            utils::MarshalingUtils::MarshalStructToNative(objectPtr, ptr.m_value, type->interopData);\n            return;\n        }\n\n        // If there's no custom marshal function, it means it's either a primitive, or invalid argument\n\n        if (type->native_size != -1)\n        {\n            // StructureToPtr is supposed to throw on strings and enums\n            if (!type->enumtype && type->byval_arg->type != IL2CPP_TYPE_STRING)\n            {\n                memcpy(ptr.m_value, Object::Unbox(structure), type->native_size);\n                return;\n            }\n        }\n\n        // If we got this far, throw an exception\n        Il2CppException* exception;\n\n        if (type->generic_class != NULL || type->is_generic)\n        {\n            exception = Exception::GetArgumentException(\"structure\", \"The specified object must not be an instance of a generic type.\");\n        }\n        else\n        {\n            exception = Exception::GetArgumentException(\"structure\", \"The specified structure must be blittable or have layout information.\");\n        }\n\n        Exception::Raise(exception);\n    }\n\n    template<typename T>\n    static inline void WriteValue(Il2CppIntPtr ptr, int32_t offset, T value)\n    {\n        *reinterpret_cast<T*>(static_cast<uint8_t*>(ptr.m_value) + offset) = value;\n    }\n\n    void Marshal::WriteByte(Il2CppIntPtr ptr, int32_t ofs, uint8_t val)\n    {\n        WriteValue(ptr, ofs, val);\n    }\n\n    void Marshal::WriteInt16(Il2CppIntPtr ptr, int32_t ofs, int16_t val)\n    {\n        WriteValue(ptr, ofs, val);\n    }\n\n    void Marshal::WriteInt32(Il2CppIntPtr ptr, int32_t ofs, int32_t val)\n    {\n        WriteValue(ptr, ofs, val);\n    }\n\n    void Marshal::WriteInt64(Il2CppIntPtr ptr, int32_t ofs, int64_t val)\n    {\n        WriteValue(ptr, ofs, val);\n    }\n\n    void Marshal::WriteIntPtr(Il2CppIntPtr ptr, int32_t ofs, Il2CppIntPtr val)\n    {\n        WriteValue(ptr, ofs, val);\n    }\n\n    void Marshal::DestroyStructure(Il2CppIntPtr ptr, Il2CppReflectionType* structureType)\n    {\n        if (ptr.m_value == NULL)\n            Exception::Raise(Exception::GetArgumentNullException(\"ptr\"));\n\n        if (structureType == NULL)\n            Exception::Raise(Exception::GetArgumentNullException(\"structureType\"));\n\n        Il2CppClass* type = Class::FromIl2CppType(structureType->type);\n\n        // If cleanup function exists, it will call it and return true\n        // In that case, we're done.\n        if (utils::MarshalingUtils::MarshalFreeStruct(ptr.m_value, type->interopData))\n            return;\n\n        if (type->is_generic)\n        {\n            Exception::Raise(Exception::GetArgumentException(\"structureType\", \"The specified type must not be an instance of a generic type.\"));\n        }\n\n        // Enums are blittable, but they don't have layout information, therefore Marshal.DestroyStructure is supposed to throw\n        if (!type->enumtype)\n        {\n            // Char and Boolean are not blittable, but they should not raise this exception, as we can call DestroyStructure on them without problems.\n            if (type->is_blittable || structureType->type->type == IL2CPP_TYPE_CHAR || structureType->type->type == IL2CPP_TYPE_BOOLEAN)\n                return;\n        }\n\n        // If we got this far, throw an exception\n        Exception::Raise(Exception::GetArgumentException(\"structureType\", \"The specified type must be blittable or have layout information.\"));\n    }\n\n    int32_t Marshal::GetLastWin32Error()\n    {\n        return vm::LastError::GetLastError();\n    }\n\n    static size_t RoundUpToMultiple(size_t numToRound, size_t multiple)\n    {\n        if (multiple == 0)\n            return numToRound;\n\n        size_t remainder = numToRound % multiple;\n        if (remainder == 0)\n            return numToRound;\n        return numToRound + multiple - remainder;\n    }\n\n    Il2CppIntPtr Marshal::OffsetOf(Il2CppReflectionType* t, Il2CppString* fieldName)\n    {\n        std::string fieldNameToFind = utils::StringUtils::Utf16ToUtf8(fieldName->chars);\n        Il2CppClass* type = Class::FromIl2CppType(t->type);\n\n        FieldInfo* field = vm::Class::GetFieldFromName(type, fieldNameToFind.c_str());\n        if (field == NULL || (vm::Field::GetFlags(field) & FIELD_ATTRIBUTE_STATIC))\n        {\n            std::stringstream message;\n            message << \"Field '\" << fieldNameToFind << \"' is not a marshaled member of the type '\" << type->name << \"'\";\n            vm::Exception::Raise(vm::Exception::GetArgumentException(\"fieldName\", message.str().c_str()));\n        }\n\n        // Order the base classes so the most base class is first.\n        std::deque<Il2CppClass*> inheritanceHierarchy;\n        while (type)\n        {\n            inheritanceHierarchy.push_front(type);\n            type = type->parent;\n        }\n\n        bool fieldFound = false;\n\n        size_t offset = 0;\n        FieldInfo* previousField = NULL;\n        for (std::deque<Il2CppClass*>::iterator it = inheritanceHierarchy.begin(); it < inheritanceHierarchy.end(); ++it)\n        {\n            type = *it;\n            void* iter = NULL;\n            while ((field = vm::Class::GetFields(type, &iter)))\n            {\n                if (vm::Field::GetFlags(field) & FIELD_ATTRIBUTE_STATIC)\n                    continue;\n\n                // Determine how much the previous field added to the offset.\n                if (previousField != NULL)\n                {\n                    if (!Type::IsStruct(previousField->type))\n                    {\n                        size_t managedOffset = field->offset - previousField->offset;\n                        if (type->packingSize == 0)\n                            offset += managedOffset;\n                        else if (managedOffset != 0) // overlapping fields have a zero offset\n                        {\n                            offset += vm::Class::GetFieldMarshaledSize(previousField);\n                            offset = RoundUpToMultiple(offset, std::min((int)type->packingSize, vm::Class::GetFieldMarshaledSize(field)));\n                        }\n                    }\n                    else\n                    {\n                        offset += Class::FromIl2CppType(previousField->type)->native_size;\n                    }\n                }\n                previousField = field;\n\n                if (fieldNameToFind == vm::Field::GetName(field))\n                {\n                    fieldFound = true;\n                    break;\n                }\n            }\n\n            if (fieldFound)\n                break;\n        }\n\n        Il2CppIntPtr offsetPtr;\n        offsetPtr.m_value = (void*)(offset);\n        return offsetPtr;\n    }\n\n    void Marshal::Prelink(Il2CppReflectionMethod* m)\n    {\n        NOT_SUPPORTED_IL2CPP(Marshal::Prelink, \"This icall is not supported by il2cpp.\");\n    }\n\n    void Marshal::PrelinkAll(Il2CppReflectionType* c)\n    {\n        NOT_SUPPORTED_IL2CPP(Marshal::PrelinkAll, \"This icall is not supported by il2cpp.\");\n    }\n\n    Il2CppIntPtr Marshal::ReAllocCoTaskMem(Il2CppIntPtr ptr, int32_t size)\n    {\n        Il2CppIntPtr result;\n        result.m_value = MarshalAlloc::ReAlloc(ptr.m_value, size);\n        return result;\n    }\n\n    Il2CppIntPtr Marshal::ReAllocHGlobal(Il2CppIntPtr ptr, Il2CppIntPtr size)\n    {\n        if (ptr.m_value == NULL)\n            Exception::RaiseOutOfMemoryException();\n\n        Il2CppIntPtr result;\n        result.m_value = MarshalAlloc::ReAllocHGlobal(ptr.m_value, (size_t)size.m_value);\n        return result;\n    }\n\n    Il2CppIntPtr Marshal::UnsafeAddrOfPinnedArrayElement(Il2CppArray* arr, int32_t index)\n    {\n        Il2CppIntPtr address;\n        address.m_value = il2cpp_array_addr_with_size(arr, il2cpp_array_element_size(arr->klass), index);\n        return address;\n    }\n\n#if NET_4_0\n\n    Il2CppIntPtr Marshal::BufferToBSTR(Il2CppArray* ptr, int32_t slen)\n    {\n        NOT_IMPLEMENTED_ICALL(Marshal::BufferToBSTR);\n        IL2CPP_UNREACHABLE;\n    }\n\n    int32_t Marshal::GetHRForException_WinRT(Il2CppException* e)\n    {\n        NOT_IMPLEMENTED_ICALL(Marshal::GetHRForException_WinRT);\n        IL2CPP_UNREACHABLE;\n    }\n\n    Il2CppIntPtr Marshal::GetRawIUnknownForComObjectNoAddRef(Il2CppObject* o)\n    {\n        IL2CPP_ASSERT(o->klass->is_import_or_windows_runtime);\n\n        Il2CppIntPtr result = { static_cast<Il2CppComObject*>(o)->identity };\n        return result;\n    }\n\n    Il2CppObject* Marshal::GetNativeActivationFactory(Il2CppObject* type)\n    {\n        NOT_IMPLEMENTED_ICALL(Marshal::GetNativeActivationFactory);\n        IL2CPP_UNREACHABLE;\n    }\n\n#endif\n} /* namespace InteropServices */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.InteropServices/Marshal.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct mscorlib_System_Guid;\nstruct mscorlib_System_Reflection_MemberInfo;\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace InteropServices\n{\n    class LIBIL2CPP_CODEGEN_API Marshal\n    {\n    public:\n        static int32_t GetLastWin32Error();\n        static int32_t AddRefInternal(Il2CppIntPtr pUnk);\n        static Il2CppIntPtr AllocCoTaskMem(int32_t size);\n        static Il2CppIntPtr AllocHGlobal(Il2CppIntPtr size);\n        static void DestroyStructure(Il2CppIntPtr ptr, Il2CppReflectionType* structureType);\n        static void FreeBSTR(Il2CppIntPtr ptr);\n        static void FreeCoTaskMem(Il2CppIntPtr ptr);\n        static void FreeHGlobal(Il2CppIntPtr hglobal);\n        static Il2CppIntPtr GetCCW(Il2CppObject* o, Il2CppReflectionType * T);\n        static int32_t GetComSlotForMethodInfoInternal(mscorlib_System_Reflection_MemberInfo * m);\n        static Il2CppDelegate* GetDelegateForFunctionPointerInternal(Il2CppIntPtr ptr, Il2CppReflectionType* t);\n        static Il2CppIntPtr GetFunctionPointerForDelegateInternal(Il2CppDelegate* d);\n        static Il2CppIntPtr GetIDispatchForObjectInternal(Il2CppObject* o);\n        static Il2CppIntPtr GetIUnknownForObjectInternal(Il2CppObject* o);\n        static Il2CppObject* GetObjectForCCW(Il2CppIntPtr pUnk);\n        static bool IsComObject(Il2CppObject* o);\n        static Il2CppIntPtr OffsetOf(Il2CppReflectionType* t, Il2CppString* fieldName);\n        static void Prelink(Il2CppReflectionMethod* m);\n        static void PrelinkAll(Il2CppReflectionType* c);\n        static Il2CppString* PtrToStringAnsi_mscorlib_System_String_mscorlib_System_IntPtr(Il2CppIntPtr ptr);\n        static Il2CppString* PtrToStringAnsi_mscorlib_System_String_mscorlib_System_IntPtr_mscorlib_System_Int32(Il2CppIntPtr ptr, int32_t len);\n        static Il2CppString* PtrToStringBSTR(Il2CppIntPtr ptr);\n        static Il2CppString* PtrToStringUni_mscorlib_System_String_mscorlib_System_IntPtr(Il2CppIntPtr ptr);\n        static Il2CppString* PtrToStringUni_mscorlib_System_String_mscorlib_System_IntPtr_mscorlib_System_Int32(Il2CppIntPtr ptr, int32_t len);\n        static Il2CppObject* PtrToStructure(Il2CppIntPtr ptr, Il2CppReflectionType * structureType);\n        static void PtrToStructureObject(Il2CppIntPtr ptr, Il2CppObject* structure);\n        static int32_t QueryInterfaceInternal(Il2CppIntPtr pUnk, mscorlib_System_Guid * iid, Il2CppIntPtr* ppv);\n        static Il2CppIntPtr ReAllocCoTaskMem(Il2CppIntPtr ptr, int32_t size);\n        static Il2CppIntPtr ReAllocHGlobal(Il2CppIntPtr ptr, Il2CppIntPtr size);\n        static uint8_t ReadByte(Il2CppIntPtr ptr, int32_t ofs);\n        static int16_t ReadInt16(Il2CppIntPtr ptr, int32_t ofs);\n        static int32_t ReadInt32(Il2CppIntPtr ptr, int32_t ofs);\n        static int64_t ReadInt64(Il2CppIntPtr ptr, int32_t ofs);\n        static Il2CppIntPtr ReadIntPtr(Il2CppIntPtr ptr, int32_t ofs);\n        static int32_t ReleaseComObjectInternal(Il2CppObject* co);\n        static int32_t ReleaseInternal(Il2CppIntPtr pUnk);\n        static int SizeOf(Il2CppReflectionType * rtype);\n        static Il2CppIntPtr StringToBSTR(Il2CppString* s);\n        static Il2CppIntPtr StringToHGlobalAnsi(Il2CppString* s);\n        static Il2CppIntPtr StringToHGlobalUni(Il2CppString* s);\n        static void StructureToPtr(Il2CppObject* structure, Il2CppIntPtr ptr, bool deleteOld);\n        static Il2CppIntPtr UnsafeAddrOfPinnedArrayElement(Il2CppArray* arr, int32_t index);\n        static void WriteByte(Il2CppIntPtr ptr, int32_t ofs, uint8_t val);\n        static void WriteInt16(Il2CppIntPtr ptr, int32_t ofs, int16_t val);\n        static void WriteInt32(Il2CppIntPtr ptr, int32_t ofs, int32_t val);\n        static void WriteInt64(Il2CppIntPtr ptr, int32_t ofs, int64_t val);\n        static void copy_from_unmanaged(Il2CppIntPtr, int, Il2CppArray *, int);\n        static void copy_to_unmanaged(Il2CppArray * source, int32_t startIndex, Il2CppIntPtr destination, int32_t length);\n        static void WriteIntPtr(Il2CppIntPtr ptr, int32_t ofs, Il2CppIntPtr val);\n\n#if NET_4_0\n        static Il2CppIntPtr BufferToBSTR(Il2CppArray* ptr, int32_t slen);\n#endif\n\n#if NET_4_0\n        static int32_t GetHRForException_WinRT(Il2CppException* e);\n        static Il2CppIntPtr GetRawIUnknownForComObjectNoAddRef(Il2CppObject* o);\n        static Il2CppObject* GetNativeActivationFactory(Il2CppObject* type);\n#endif\n    };\n} /* namespace InteropServices */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.InteropServices.WindowsRuntime/UnsafeNativeMethods.cpp",
    "content": "#if NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"UnsafeNativeMethods.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace InteropServices\n{\nnamespace WindowsRuntime\n{\n    bool UnsafeNativeMethods::RoOriginateLanguageException(int32_t error, Il2CppString* message, Il2CppIntPtr languageException)\n    {\n        NOT_IMPLEMENTED_ICALL(UnsafeNativeMethods::RoOriginateLanguageException);\n        IL2CPP_UNREACHABLE;\n    }\n\n    Il2CppChar* UnsafeNativeMethods::WindowsGetStringRawBuffer(Il2CppIntPtr hstring, uint32_t* length)\n    {\n        NOT_IMPLEMENTED_ICALL(UnsafeNativeMethods::WindowsGetStringRawBuffer);\n        IL2CPP_UNREACHABLE;\n    }\n\n    int32_t UnsafeNativeMethods::WindowsCreateString(Il2CppString* sourceString, int32_t length, Il2CppIntPtr* hstring)\n    {\n        NOT_IMPLEMENTED_ICALL(UnsafeNativeMethods::WindowsCreateString);\n        IL2CPP_UNREACHABLE;\n    }\n\n    int32_t UnsafeNativeMethods::WindowsDeleteString(Il2CppIntPtr hstring)\n    {\n        NOT_IMPLEMENTED_ICALL(UnsafeNativeMethods::WindowsDeleteString);\n        IL2CPP_UNREACHABLE;\n    }\n\n    Il2CppObject* UnsafeNativeMethods::GetRestrictedErrorInfo()\n    {\n        NOT_IMPLEMENTED_ICALL(UnsafeNativeMethods::GetRestrictedErrorInfo);\n        IL2CPP_UNREACHABLE;\n    }\n\n    void UnsafeNativeMethods::RoReportUnhandledError(Il2CppObject* error)\n    {\n        NOT_IMPLEMENTED_ICALL(UnsafeNativeMethods::RoReportUnhandledError);\n        IL2CPP_UNREACHABLE;\n    }\n} // namespace WindowsRuntime\n} // namespace InteropServices\n} // namespace Runtime\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.InteropServices.WindowsRuntime/UnsafeNativeMethods.h",
    "content": "#pragma once\n\n#if NET_4_0\n\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace InteropServices\n{\nnamespace WindowsRuntime\n{\n    class LIBIL2CPP_CODEGEN_API UnsafeNativeMethods\n    {\n    public:\n        static bool RoOriginateLanguageException(int32_t error, Il2CppString* message, Il2CppIntPtr languageException);\n        static Il2CppChar* WindowsGetStringRawBuffer(Il2CppIntPtr hstring, uint32_t* length);\n        static int32_t WindowsCreateString(Il2CppString* sourceString, int32_t length, Il2CppIntPtr* hstring);\n        static int32_t WindowsDeleteString(Il2CppIntPtr hstring);\n        static Il2CppObject* GetRestrictedErrorInfo();\n        static void RoReportUnhandledError(Il2CppObject* error);\n    };\n} // namespace WindowsRuntime\n} // namespace InteropServices\n} // namespace Runtime\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting/RemotingServices.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Runtime.Remoting/RemotingServices.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\n    Il2CppReflectionMethod* RemotingServices::GetVirtualMethod(Il2CppReflectionType*, Il2CppReflectionMethod*)\n    {\n        NOT_SUPPORTED_REMOTING(RemotingServices::GetVirtualMethod);\n        return NULL;\n    }\n\n    Il2CppObject* RemotingServices::InternalExecute(Il2CppReflectionMethod*, Il2CppObject*, Il2CppArray*, Il2CppArray**)\n    {\n        NOT_SUPPORTED_REMOTING(RemotingServices::InternalExecute);\n        return NULL;\n    }\n\n    bool RemotingServices::IsTransparentProxy(Il2CppObject*)\n    {\n        return false;\n    }\n} /* namespace Remoting */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting/RemotingServices.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppArray;\nstruct Il2CppObject;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionType;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\n    class LIBIL2CPP_CODEGEN_API RemotingServices\n    {\n    public:\n        static Il2CppReflectionMethod * GetVirtualMethod(Il2CppReflectionType*, Il2CppReflectionMethod*);\n        static Il2CppObject* InternalExecute(Il2CppReflectionMethod*, Il2CppObject*, Il2CppArray*, Il2CppArray**);\n        static bool IsTransparentProxy(Il2CppObject*);\n    };\n} /* namespace Remoting */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting.Activation/ActivationServices.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"il2cpp-api.h\"\n#include \"icalls/mscorlib/System.Runtime.Remoting.Activation/ActivationServices.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"metadata.h\"\n#include \"vm/Image.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\nnamespace Activation\n{\n    void ActivationServices::EnableProxyActivation(Il2CppReflectionType*, bool)\n    {\n        NOT_SUPPORTED_REMOTING(ActivationServices::EnableProxyActivation);\n    }\n\n    Il2CppObject* ActivationServices::AllocateUninitializedClassInstance(Il2CppReflectionType * type)\n    {\n        Il2CppClass* typeInfo = vm::Class::FromIl2CppType(type->type);\n\n        if (typeInfo == NULL)\n            return NULL;\n\n        il2cpp::vm::Class::Init(typeInfo);\n        return il2cpp_object_new(typeInfo);\n    }\n} /* namespace Activation */\n} /* namespace Remoting */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting.Activation/ActivationServices.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppObject;\nstruct Il2CppReflectionType;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\nnamespace Activation\n{\n    class LIBIL2CPP_CODEGEN_API ActivationServices\n    {\n    public:\n        static void EnableProxyActivation(Il2CppReflectionType*, bool);\n        static Il2CppObject * AllocateUninitializedClassInstance(Il2CppReflectionType*);\n    };\n} /* namespace Activation */\n} /* namespace Remoting */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting.Contexts/Context.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"Context.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\nnamespace Contexts\n{\n    void Context::RegisterContext(Il2CppObject* ctx)\n    {\n        NOT_IMPLEMENTED_ICALL(Context::RegisterContext);\n        IL2CPP_UNREACHABLE;\n    }\n\n    void Context::ReleaseContext(Il2CppObject* ctx)\n    {\n        NOT_IMPLEMENTED_ICALL(Context::ReleaseContext);\n        IL2CPP_UNREACHABLE;\n    }\n} // namespace Contexts\n} // namespace Remoting\n} // namespace Runtime\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting.Contexts/Context.h",
    "content": "#pragma once\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\nnamespace Contexts\n{\n    class LIBIL2CPP_CODEGEN_API Context\n    {\n    public:\n        static void RegisterContext(Il2CppObject* ctx);\n        static void ReleaseContext(Il2CppObject* ctx);\n    };\n} // namespace Contexts\n} // namespace Remoting\n} // namespace Runtime\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting.Messaging/AsyncResult.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"il2cpp-api.h\"\n#include \"AsyncResult.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/WaitHandle.h\"\n#include \"vm/ThreadPoolMs.h\"\n#include \"os/Event.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\nnamespace Messaging\n{\n    Il2CppObject* AsyncResult::Invoke(Il2CppObject* _this)\n    {\n        Il2CppAsyncCall *ac;\n        Il2CppObject *res;\n        Il2CppAsyncResult *ares = (Il2CppAsyncResult*)_this;\n\n        IL2CPP_ASSERT(ares);\n        IL2CPP_ASSERT(ares->async_delegate);\n\n        ac = (Il2CppAsyncCall*)ares->object_data;\n        if (!ac)\n        {\n            res = vm::Runtime::DelegateInvoke(ares->async_delegate, (void**)&ares->async_state, NULL);\n        }\n        else\n        {\n            il2cpp::os::EventHandle *wait_event = NULL;\n\n            ac->msg->exc = NULL;\n            res = il2cpp::vm::ThreadPoolMs::MessageInvoke((Il2CppObject*)ares->async_delegate->target, ac->msg, &ac->msg->exc, &ac->out_args);\n            IL2CPP_OBJECT_SETREF(ac, res, res);\n\n            il2cpp_monitor_enter((Il2CppObject*)ares);\n            ares->completed = 1;\n            if (ares->handle)\n                wait_event = (il2cpp::os::EventHandle*)il2cpp::vm::WaitHandle::GetPlatformHandle(ares->handle);\n\n            il2cpp_monitor_exit((Il2CppObject*)ares);\n\n            if (wait_event != NULL)\n                wait_event->Get().Set();\n\n            Il2CppException* completionException = NULL;\n\n            if (ac->cb_method)\n                vm::Runtime::Invoke(ac->cb_method, ac->cb_target, (void**)&ares, &completionException);\n\n            if (completionException != NULL)\n                vm::Exception::Raise(completionException);\n        }\n\n        return res;\n    }\n} // namespace Messaging\n} // namespace Remoting\n} // namespace Runtime\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting.Messaging/AsyncResult.h",
    "content": "#pragma once\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\nnamespace Messaging\n{\n    class LIBIL2CPP_CODEGEN_API AsyncResult\n    {\n    public:\n        static Il2CppObject* Invoke(Il2CppObject* _this);\n    };\n} // namespace Messaging\n} // namespace Remoting\n} // namespace Runtime\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting.Messaging/MonoMethodMessage.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"il2cpp-api.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"tabledefs.h\"\n#include \"icalls/mscorlib/System.Runtime.Remoting.Messaging/MonoMethodMessage.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Atomic.h\"\n#include \"vm/Array.h\"\n#include \"vm/String.h\"\n#include \"utils/dynamic_array.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\nnamespace Messaging\n{\n    void MonoMethodMessage::InitMessage(Il2CppMethodMessage *this_obj, Il2CppReflectionMethod *method, Il2CppArray *out_args)\n    {\n#if !NET_4_0\n        NOT_SUPPORTED_REMOTING(MonoMethodMessage::InitMessage);\n#else\n        static Il2CppClass *object_array_klass;\n        static Il2CppClass *byte_array_klass;\n        static Il2CppClass *string_array_klass;\n        Il2CppString *name;\n        Il2CppArray *arr;\n        int i, j;\n        unsigned char arg_type;\n\n        if (!object_array_klass)\n        {\n            Il2CppClass *klass;\n\n            klass = il2cpp_array_class_get(il2cpp_defaults.byte_class, 1);\n            IL2CPP_ASSERT(klass);\n            byte_array_klass = klass;\n\n            klass = il2cpp_array_class_get(il2cpp_defaults.string_class, 1);\n            IL2CPP_ASSERT(klass);\n            string_array_klass = klass;\n\n            klass = il2cpp_array_class_get(il2cpp_defaults.object_class, 1);\n            IL2CPP_ASSERT(klass);\n\n            il2cpp::vm::Atomic::ExchangePointer(&object_array_klass, klass);\n        }\n\n        IL2CPP_OBJECT_SETREF(this_obj, method, method);\n\n        arr = il2cpp_array_new(object_array_klass, method->method->parameters_count);\n\n        IL2CPP_OBJECT_SETREF(this_obj, args, arr);\n\n        arr = il2cpp_array_new(byte_array_klass, method->method->parameters_count);\n\n        IL2CPP_OBJECT_SETREF(this_obj, arg_types, arr);\n\n        this_obj->async_result = NULL;\n        this_obj->call_type = CallType_Sync;\n\n        il2cpp::utils::dynamic_array<const char*> names(method->method->parameters_count);\n\n        for (int i = 0; i < method->method->parameters_count; ++i)\n            names[i] = method->method->parameters[i].name;\n\n        arr = il2cpp_array_new(string_array_klass, method->method->parameters_count);\n\n        IL2CPP_OBJECT_SETREF(this_obj, names, arr);\n\n        for (i = 0; i < method->method->parameters_count; i++)\n        {\n            name = il2cpp::vm::String::New(names[i]);\n            il2cpp_array_setref(this_obj->names, i, name);\n        }\n\n        for (i = 0, j = 0; i < method->method->parameters_count; i++)\n        {\n            if (method->method->parameters[i].parameter_type->byref)\n            {\n                if (out_args)\n                {\n                    Il2CppObject* arg = (Il2CppObject*)il2cpp_array_get(out_args, void*, j);\n                    il2cpp_array_setref(this_obj->args, i, arg);\n                    j++;\n                }\n\n                arg_type = 2;\n                if (!(method->method->parameters[i].parameter_type->attrs & PARAM_ATTRIBUTE_OUT))\n                    arg_type |= 1;\n            }\n            else\n            {\n                arg_type = 1;\n                if (method->method->parameters[i].parameter_type->attrs & PARAM_ATTRIBUTE_OUT)\n                    arg_type |= 4;\n            }\n\n            il2cpp_array_set(this_obj->arg_types, unsigned char, i, arg_type);\n        }\n#endif\n    }\n} /* namespace Messaging */\n} /* namespace Remoting */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting.Messaging/MonoMethodMessage.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppArray;\nstruct Il2CppMethodMessage;\nstruct Il2CppReflectionMethod;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\nnamespace Messaging\n{\n    class LIBIL2CPP_CODEGEN_API MonoMethodMessage\n    {\n    public:\n        static void InitMessage(Il2CppMethodMessage*, Il2CppReflectionMethod*, Il2CppArray*);\n    };\n} /* namespace Messaging */\n} /* namespace Remoting */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting.Proxies/RealProxy.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Runtime.Remoting.Proxies/RealProxy.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\nnamespace Proxies\n{\n    Il2CppObject* RealProxy::InternalGetTransparentProxy(Il2CppObject*, Il2CppString*)\n    {\n        NOT_SUPPORTED_REMOTING(RealProxy::InternalGetTransparentProxy);\n        return NULL;\n    }\n\n    Il2CppReflectionType* RealProxy::InternalGetProxyType(Il2CppObject *)\n    {\n        NOT_SUPPORTED_REMOTING(RealProxy::InternalGetProxyType);\n        return NULL;\n    }\n} /* namespace Proxies */\n} /* namespace Remoting */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Remoting.Proxies/RealProxy.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppObject;\nstruct Il2CppReflectionType;\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Remoting\n{\nnamespace Proxies\n{\n    class LIBIL2CPP_CODEGEN_API RealProxy\n    {\n    public:\n        static Il2CppObject* InternalGetTransparentProxy(Il2CppObject*, Il2CppString*);\n        static Il2CppReflectionType* InternalGetProxyType(Il2CppObject*);\n    };\n} /* namespace Proxies */\n} /* namespace Remoting */\n} /* namespace Runtime */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Versioning/VersioningHelper.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"VersioningHelper.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Versioning\n{\n    int32_t VersioningHelper::GetRuntimeId()\n    {\n        NOT_IMPLEMENTED_ICALL(VersioningHelper::GetRuntimeId);\n        IL2CPP_UNREACHABLE;\n        return 0;\n    }\n} // namespace Versioning\n} // namespace Runtime\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Runtime.Versioning/VersioningHelper.h",
    "content": "#pragma once\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Versioning\n{\n    class LIBIL2CPP_CODEGEN_API VersioningHelper\n    {\n    public:\n        static int32_t GetRuntimeId();\n    };\n} // namespace Versioning\n} // namespace Runtime\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security/SecurityFrame.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Security/SecurityFrame.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\n    Il2CppArray * SecurityFrame::_GetSecurityStack(int32_t skip)\n    {\n        NOT_IMPLEMENTED_ICALL(SecurityManager::get_CheckExecutionRights);\n        return 0;\n    }\n\n    void* /* System.Security.RuntimeSecurityFrame */ SecurityFrame::_GetSecurityFrame(int32_t skip)\n    {\n        NOT_SUPPORTED_IL2CPP(SecurityFrame::_GetSecurityFrame, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security/SecurityFrame.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\nstruct Il2CppArray;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\n    class LIBIL2CPP_CODEGEN_API SecurityFrame\n    {\n    public:\n        static void* /* System.Security.RuntimeSecurityFrame */ _GetSecurityFrame(int32_t skip);\n        static Il2CppArray * _GetSecurityStack(int32_t skip);\n    };\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security/SecurityManager.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Security/SecurityManager.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\n    bool SecurityManager::get_CheckExecutionRights()\n    {\n        NOT_IMPLEMENTED_ICALL(SecurityManager::get_CheckExecutionRights);\n        return false;\n    }\n\n    bool SecurityManager::GetLinkDemandSecurity(mscorlib_System_Reflection_MethodBase * method, mscorlib_System_Security_RuntimeDeclSecurityActions * _____cdecl, mscorlib_System_Security_RuntimeDeclSecurityActions * mdecl)\n    {\n        NOT_IMPLEMENTED_ICALL(SecurityManager::GetLinkDemandSecurity);\n        return false;\n    }\n\n    bool SecurityManager::get_SecurityEnabled()\n    {\n        return false;\n    }\n\n    void SecurityManager::set_CheckExecutionRights(bool value)\n    {\n        NOT_SUPPORTED_IL2CPP(SecurityManager::set_CheckExecutionRights, \"This icall is not supported by il2cpp.\");\n    }\n\n    void SecurityManager::set_SecurityEnabled(bool value)\n    {\n        NOT_SUPPORTED_IL2CPP(SecurityManager::set_SecurityEnabled, \"This icall is not supported by il2cpp.\");\n    }\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security/SecurityManager.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct mscorlib_System_Reflection_MethodBase;\nstruct mscorlib_System_Security_RuntimeDeclSecurityActions;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\n    class LIBIL2CPP_CODEGEN_API SecurityManager\n    {\n    public:\n        static bool get_CheckExecutionRights();\n        static void set_CheckExecutionRights(bool value);\n        static void set_SecurityEnabled(bool value);\n        static bool GetLinkDemandSecurity(mscorlib_System_Reflection_MethodBase * method, mscorlib_System_Security_RuntimeDeclSecurityActions * _____cdecl, mscorlib_System_Security_RuntimeDeclSecurityActions * mdecl);\n        static bool get_SecurityEnabled();\n    };\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security.Cryptography/RNGCryptoServiceProvider.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"il2cpp-api.h\"\n#include \"vm/Array.h\"\n#include \"os/Cryptography.h\"\n#include \"utils/Memory.h\"\n#include \"icalls/mscorlib/System.Security.Cryptography/RNGCryptoServiceProvider.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\nnamespace Cryptography\n{\n    void RNGCryptoServiceProvider::RngClose(Il2CppIntPtr provider)\n    {\n        os::Cryptography::ReleaseCryptographyProvider(provider.m_value);\n    }\n\n    Il2CppIntPtr RNGCryptoServiceProvider::RngGetBytes(Il2CppIntPtr provider, Il2CppArray *data)\n    {\n        uint32_t len = il2cpp_array_length(data);\n        unsigned char* buf = il2cpp_array_addr(data, unsigned char, 0);\n\n        if (!os::Cryptography::FillBufferWithRandomBytes(provider.m_value, len, buf))\n        {\n            os::Cryptography::ReleaseCryptographyProvider(provider.m_value);\n            provider = RngInitialize(NULL);\n\n            if (!os::Cryptography::FillBufferWithRandomBytes(provider.m_value, len, buf))\n            {\n                os::Cryptography::ReleaseCryptographyProvider(provider.m_value);\n                return Il2CppIntPtr::Zero;\n            }\n        }\n\n        return provider;\n    }\n\n    Il2CppIntPtr RNGCryptoServiceProvider::RngInitialize(Il2CppArray *seed)\n    {\n        Il2CppIntPtr provider;\n        provider.m_value = os::Cryptography::GetCryptographyProvider();\n\n        if ((provider.m_value != 0) && seed)\n        {\n            uint32_t len = il2cpp_array_length(seed);\n            unsigned char *buf = il2cpp_array_addr(seed, unsigned char, 0);\n            unsigned char* data = (unsigned char*)IL2CPP_MALLOC(len);\n            if (data)\n            {\n                memcpy(data, buf, len);\n                os::Cryptography::FillBufferWithRandomBytes(provider.m_value, len, data);\n                memset(data, 0, len);\n                IL2CPP_FREE(data);\n            }\n        }\n\n        return provider;\n    }\n\n    bool RNGCryptoServiceProvider::RngOpen()\n    {\n        return os::Cryptography::OpenCryptographyProvider();\n    }\n} /* namespace Cryptography */\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security.Cryptography/RNGCryptoServiceProvider.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\nnamespace Cryptography\n{\n    class LIBIL2CPP_CODEGEN_API RNGCryptoServiceProvider\n    {\n    public:\n        static void RngClose(Il2CppIntPtr handle);\n        static Il2CppIntPtr RngGetBytes(Il2CppIntPtr, Il2CppArray *);\n        static Il2CppIntPtr RngInitialize(Il2CppArray *);\n        static bool RngOpen();\n    };\n} /* namespace Cryptography */\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security.Policy/Evidence.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Security.Policy/Evidence.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\nnamespace Policy\n{\n    bool Evidence::IsAuthenticodePresent(Il2CppAssembly* a)\n    {\n        NOT_SUPPORTED_IL2CPP(Evidence::IsAuthenticodePresent, \"This icall is not supported by il2cpp.\");\n\n        return false;\n    }\n} /* namespace Policy */\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security.Policy/Evidence.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\nnamespace Policy\n{\n    class LIBIL2CPP_CODEGEN_API Evidence\n    {\n    public:\n        static bool IsAuthenticodePresent(Il2CppAssembly* a);\n    };\n} /* namespace Policy */\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security.Principal/WindowsIdentity.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Security.Principal/WindowsIdentity.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\nnamespace Principal\n{\n    Il2CppString* WindowsIdentity::GetTokenName(Il2CppIntPtr token)\n    {\n        NOT_IMPLEMENTED_ICALL(WindowsIdentity::GetTokenName);\n        return 0;\n    }\n\n    Il2CppIntPtr WindowsIdentity::GetCurrentToken()\n    {\n        NOT_IMPLEMENTED_ICALL(WindowsIdentity::GetCurrentToken);\n        return Il2CppIntPtr();\n    }\n\n    Il2CppArray* WindowsIdentity::_GetRoles(Il2CppIntPtr token)\n    {\n        NOT_SUPPORTED_IL2CPP(WindowsIdentity::_GetRoles, \"This icall is not supported by il2cpp.\");\n\n        return 0;\n    }\n\n    Il2CppIntPtr WindowsIdentity::GetUserToken(Il2CppString* username)\n    {\n        NOT_SUPPORTED_IL2CPP(WindowsIdentity::GetUserToken, \"This icall is not supported by il2cpp.\");\n\n        return Il2CppIntPtr();\n    }\n} /* namespace Principal */\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security.Principal/WindowsIdentity.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\nnamespace Principal\n{\n    class LIBIL2CPP_CODEGEN_API WindowsIdentity\n    {\n    public:\n        static Il2CppIntPtr GetUserToken(Il2CppString* username);\n        static Il2CppArray* _GetRoles(Il2CppIntPtr token);\n        static Il2CppString* GetTokenName(Il2CppIntPtr token);\n        static Il2CppIntPtr GetCurrentToken();\n    };\n} /* namespace Principal */\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security.Principal/WindowsImpersonationContext.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Security.Principal/WindowsImpersonationContext.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\nnamespace Principal\n{\n    bool WindowsImpersonationContext::CloseToken(Il2CppIntPtr token)\n    {\n        NOT_SUPPORTED_IL2CPP(WindowsImpersonationContext::CloseToken, \"This icall is not supported by il2cpp.\");\n\n        return false;\n    }\n\n    Il2CppIntPtr WindowsImpersonationContext::DuplicateToken(Il2CppIntPtr token)\n    {\n        NOT_SUPPORTED_IL2CPP(WindowsImpersonationContext::DuplicateToken, \"This icall is not supported by il2cpp.\");\n\n        return Il2CppIntPtr();\n    }\n\n    bool WindowsImpersonationContext::SetCurrentToken(Il2CppIntPtr token)\n    {\n        NOT_SUPPORTED_IL2CPP(WindowsImpersonationContext::SetCurrentToken, \"This icall is not supported by il2cpp.\");\n\n        return false;\n    }\n\n    bool WindowsImpersonationContext::RevertToSelf()\n    {\n        NOT_SUPPORTED_IL2CPP(WindowsImpersonationContext::RevertToSelf, \"This icall is not supported by il2cpp.\");\n\n        return false;\n    }\n} /* namespace Principal */\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security.Principal/WindowsImpersonationContext.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\nnamespace Principal\n{\n    class LIBIL2CPP_CODEGEN_API WindowsImpersonationContext\n    {\n    public:\n        static bool RevertToSelf();\n        static Il2CppIntPtr DuplicateToken(Il2CppIntPtr token);\n        static bool SetCurrentToken(Il2CppIntPtr token);\n        static bool CloseToken(Il2CppIntPtr token);\n    };\n} /* namespace Principal */\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security.Principal/WindowsPrincipal.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Security.Principal/WindowsPrincipal.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\nnamespace Principal\n{\n    bool WindowsPrincipal::IsMemberOfGroupId(Il2CppIntPtr user, Il2CppIntPtr group)\n    {\n        NOT_SUPPORTED_IL2CPP(WindowsPrincipal::IsMemberOfGroupId, \"This icall is not supported by il2cpp.\");\n\n        return false;\n    }\n\n    bool WindowsPrincipal::IsMemberOfGroupName(Il2CppIntPtr user, Il2CppString* group)\n    {\n        NOT_SUPPORTED_IL2CPP(WindowsPrincipal::IsMemberOfGroupName, \"This icall is not supported by il2cpp.\");\n\n        return false;\n    }\n} /* namespace Principal */\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Security.Principal/WindowsPrincipal.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Security\n{\nnamespace Principal\n{\n    class LIBIL2CPP_CODEGEN_API WindowsPrincipal\n    {\n    public:\n        static bool IsMemberOfGroupName(Il2CppIntPtr user, Il2CppString* group);\n        static bool IsMemberOfGroupId(Il2CppIntPtr user, Il2CppIntPtr group);\n    };\n} /* namespace Principal */\n} /* namespace Security */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Text/Encoding.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Text/Encoding.h\"\n\n#include <ctype.h>\n#include <string>\n\n#include \"os/Encoding.h\"\n#include \"vm/String.h\"\n#include \"utils/StringUtils.h\"\n\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Text\n{\n    static const char *encodings[] =\n    {\n        (char*)1,\n        \"ascii\", \"us_ascii\", \"us\", \"ansi_x3.4_1968\",\n        \"ansi_x3.4_1986\", \"cp367\", \"csascii\", \"ibm367\",\n        \"iso_ir_6\", \"iso646_us\", \"iso_646.irv:1991\",\n        (char*)2,\n        \"utf_7\", \"csunicode11utf7\", \"unicode_1_1_utf_7\",\n        \"unicode_2_0_utf_7\", \"x_unicode_1_1_utf_7\",\n        \"x_unicode_2_0_utf_7\",\n        (char*)3,\n        \"utf_8\", \"unicode_1_1_utf_8\", \"unicode_2_0_utf_8\",\n        \"x_unicode_1_1_utf_8\", \"x_unicode_2_0_utf_8\",\n        (char*)4,\n        \"utf_16\", \"UTF_16LE\", \"ucs_2\", \"unicode\",\n        \"iso_10646_ucs2\",\n        (char*)5,\n        \"unicodefffe\", \"utf_16be\",\n        (char*)6,\n        \"iso_8859_1\",\n        (char*)0\n    };\n\n    Il2CppString* Encoding::InternalCodePage(int32_t *resultCodePage)\n    {\n        const int32_t want_name = *resultCodePage;\n\n        *resultCodePage = -1;\n\n        const std::string charSet = os::Encoding::GetCharSet();\n\n        std::string codepage(charSet);\n\n        for (size_t i = 0, length = codepage.length(); i < length; ++i)\n        {\n            char& c = codepage[i];\n\n            if (isalpha(c))\n                c = tolower(c);\n\n            if (c == '-')\n                c = '_';\n        }\n\n        // handle some common aliases\n        const char* p = encodings[0];\n        int code = 0;\n\n        for (size_t i = 0; p != 0;)\n        {\n            if ((size_t)p < 7)\n            {\n                code = (int)(size_t)p;\n                p = encodings[++i];\n                continue;\n            }\n\n            if (codepage == p)\n            {\n                *resultCodePage = code;\n                break;\n            }\n\n            p = encodings[++i];\n        }\n\n        if (codepage.find(\"utf_8\") != std::string::npos)\n            *resultCodePage |= 0x10000000;\n\n        if (want_name && *resultCodePage == -1)\n            return il2cpp::vm::String::NewWrapper(charSet.c_str());\n        else\n            return NULL;\n    }\n} /* namespace Text */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Text/Encoding.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include <stdint.h>\n\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Text\n{\n    class LIBIL2CPP_CODEGEN_API Encoding\n    {\n    public:\n        static Il2CppString* InternalCodePage(int32_t *codePage);\n    };\n} /* namespace Text */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Text/EncodingHelper.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"EncodingHelper.h\"\n\n#include \"Encoding.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Text\n{\n    Il2CppString* EncodingHelper::InternalCodePage(int32_t* code_page)\n    {\n        return Encoding::InternalCodePage(code_page);\n    }\n} // namespace Text\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Text/EncodingHelper.h",
    "content": "#pragma once\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Text\n{\n    class LIBIL2CPP_CODEGEN_API EncodingHelper\n    {\n    public:\n        static Il2CppString* InternalCodePage(int32_t* code_page);\n    };\n} // namespace Text\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Text/Normalization.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"Normalization.h\"\n#include \"icalls/mscorlib/Mono.Globalization.Unicode/Normalization.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Text\n{\n    void Normalization::load_normalization_resource(Il2CppIntPtr* props, Il2CppIntPtr* mappedChars, Il2CppIntPtr* charMapIndex, Il2CppIntPtr* helperIndex, Il2CppIntPtr* mapIdxToComposite, Il2CppIntPtr* combiningClass)\n    {\n        icalls::mscorlib::Mono::Globalization::Unicode::Normalization::load_normalization_resource(props, mappedChars, charMapIndex, helperIndex, mapIdxToComposite, combiningClass);\n    }\n} // namespace Text\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Text/Normalization.h",
    "content": "#pragma once\n#if NET_4_0\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Text\n{\n    class LIBIL2CPP_CODEGEN_API Normalization\n    {\n    public:\n        static void load_normalization_resource(Il2CppIntPtr* props, Il2CppIntPtr* mappedChars, Il2CppIntPtr* charMapIndex, Il2CppIntPtr* helperIndex, Il2CppIntPtr* mapIdxToComposite, Il2CppIntPtr* combiningClass);\n    };\n} // namespace Text\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/Interlocked.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Threading/Interlocked.h\"\n#include <ctype.h>\n#include \"os/Atomic.h\"\n#include \"os/Mutex.h\"\n#include \"vm/Exception.h\"\n\nusing namespace il2cpp::os;\n\nunion LongDoubleUnion\n{\n    int64_t l_val;\n    double d_val;\n};\n\nunion IntFloatUnion\n{\n    int32_t i_val;\n    float f_val;\n};\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n#if !IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT\n    static FastMutex m_Atomic64Mutex;\n#endif\n\n    void* Interlocked::CompareExchange_T(void** location, void* value, void* comparand)\n    {\n        return Atomic::CompareExchangePointer(location, value, comparand);\n    }\n\n    Il2CppIntPtr Interlocked::CompareExchangeIntPtr(Il2CppIntPtr* location, Il2CppIntPtr value, Il2CppIntPtr comparand)\n    {\n        Il2CppIntPtr result;\n        result.m_value = Atomic::CompareExchangePointer(&location->m_value, value.m_value, comparand.m_value);\n        return result;\n    }\n\n    int32_t Interlocked::CompareExchange(int32_t* location, int32_t value, int32_t comparand)\n    {\n        return Atomic::CompareExchange(location, value, comparand);\n    }\n\n    int64_t Interlocked::CompareExchange64(int64_t* location, int64_t value, int64_t comparand)\n    {\n#if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT\n        return Atomic::CompareExchange64(location, value, comparand);\n#else\n        FastAutoLock lock(&m_Atomic64Mutex);\n        int64_t orig = *location;\n        if (*location == comparand)\n            *location = value;\n\n        return orig;\n#endif\n    }\n\n    int32_t Interlocked::Add(int32_t* location1, int32_t value)\n    {\n        return Atomic::Add(location1, value);\n    }\n\n    int64_t Interlocked::Add64(int64_t* location1, int64_t value)\n    {\n#if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT\n        return Atomic::Add64(location1, value);\n#else\n        FastAutoLock lock(&m_Atomic64Mutex);\n        return *location1 += value;\n#endif\n    }\n\n    double Interlocked::CompareExchangeDouble(double* location1, double value, double comparand)\n    {\n        LongDoubleUnion val, ret, cmp;\n\n        cmp.d_val = comparand;\n        val.d_val = value;\n        ret.l_val = (int64_t)Atomic::CompareExchange64((int64_t*)location1, val.l_val, cmp.l_val);\n\n        return ret.d_val;\n    }\n\n    float Interlocked::CompareExchangeSingle(float* location1, float value, float comparand)\n    {\n        IntFloatUnion val, ret, cmp;\n\n        cmp.f_val = comparand;\n        val.f_val = value;\n        ret.i_val = (int32_t)Atomic::CompareExchange((int32_t*)location1, val.i_val, cmp.i_val);\n\n        return ret.f_val;\n    }\n\n    int32_t Interlocked::Increment(int32_t* value)\n    {\n        return Atomic::Increment(value);\n    }\n\n    int64_t Interlocked::Increment64(int64_t* location)\n    {\n#if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT\n        return Atomic::Increment64(location);\n#else\n        FastAutoLock lock(&m_Atomic64Mutex);\n        return ++(*location);\n#endif\n    }\n\n    int32_t Interlocked::Decrement(int32_t* location)\n    {\n        return Atomic::Decrement(location);\n    }\n\n    int64_t Interlocked::Decrement64(int64_t* location)\n    {\n#if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT\n        return Atomic::Decrement64(location);\n#else\n        FastAutoLock lock(&m_Atomic64Mutex);\n        return --(*location);\n#endif\n    }\n\n    double Interlocked::ExchangeDouble(double* location1, double value)\n    {\n        LongDoubleUnion val, ret;\n\n        val.d_val = value;\n        ret.l_val = (int64_t)Atomic::Exchange64((int64_t*)location1, val.l_val);\n\n        return ret.d_val;\n    }\n\n    Il2CppIntPtr Interlocked::ExchangeIntPtr(Il2CppIntPtr* location, Il2CppIntPtr value)\n    {\n        Il2CppIntPtr result;\n        result.m_value = Atomic::ExchangePointer(&location->m_value, value.m_value);\n        return result;\n    }\n\n    int32_t Interlocked::Exchange(int32_t* location1, int32_t value)\n    {\n        return Atomic::Exchange(location1, value);\n    }\n\n    int64_t Interlocked::Exchange64(int64_t* location1, int64_t value)\n    {\n#if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT\n        return Atomic::Exchange64(location1, value);\n#else\n        FastAutoLock lock(&m_Atomic64Mutex);\n        int64_t orig = *location1;\n        *location1 = value;\n        return orig;\n#endif\n    }\n\n    void* Interlocked::ExchangePointer(void** location1, void* value)\n    {\n        return Atomic::ExchangePointer(location1, value);\n    }\n\n    float Interlocked::ExchangeSingle(float* location1, float value)\n    {\n        IntFloatUnion val, ret;\n\n        val.f_val = value;\n        ret.i_val = (int32_t)Atomic::Exchange((int32_t*)location1, val.i_val);\n\n        return ret.f_val;\n    }\n\n    int64_t Interlocked::Read(int64_t* location)\n    {\n#if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT\n        return Atomic::Read64(location);\n#else\n        FastAutoLock lock(&m_Atomic64Mutex);\n        return *location;\n#endif\n    }\n\n#if NET_4_0\n    int32_t Interlocked::CompareExchange(int32_t* location1, int32_t value, int32_t comparand, bool* succeeded)\n    {\n        int32_t result = CompareExchange(location1, value, comparand);\n        *succeeded = result == comparand;\n        return result;\n    }\n\n#endif\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/Interlocked.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    class LIBIL2CPP_CODEGEN_API Interlocked\n    {\n    public:\n        static int32_t Add(int32_t* location1, int32_t value);\n        static int64_t Add64(int64_t* location1, int64_t value);\n        static int32_t CompareExchange(int32_t* location, int32_t value, int32_t comparand);\n        static int64_t CompareExchange64(int64_t* location1, int64_t value, int64_t comparand);\n        static double CompareExchangeDouble(double* location1, double value, double comparand);\n        static Il2CppIntPtr CompareExchangeIntPtr(Il2CppIntPtr* location, Il2CppIntPtr value, Il2CppIntPtr comparand);\n        static float CompareExchangeSingle(float* location1, float value, float comparand);\n        static void* CompareExchange_T(void** location, void* value, void* comparand);\n        static int32_t Decrement(int32_t* location);\n        static int64_t Decrement64(int64_t* location);\n        static Il2CppIntPtr ExchangeIntPtr(Il2CppIntPtr* location, Il2CppIntPtr value);\n        static int32_t Exchange(int32_t* location1, int32_t value);\n        static int64_t Exchange64(int64_t* location1, int64_t value);\n        static double ExchangeDouble(double* location1, double value);\n        static void* ExchangePointer(void** location1, void* value);\n        static float ExchangeSingle(float* location1, float value);\n        static int32_t Increment(int32_t* value);\n        static int64_t Increment64(int64_t* location);\n        static int64_t Read(int64_t* location);\n#if NET_4_0\n        static int32_t CompareExchange(int32_t* location1, int32_t value, int32_t comparand, bool* succeeded);\n#endif\n    };\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/InternalThread.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"InternalThread.h\"\n#include \"utils/Memory.h\"\n#include \"os/Mutex.h\"\n#include \"os/Thread.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    void InternalThread::Thread_free_internal(Il2CppInternalThread* _this, Il2CppIntPtr handle)\n    {\n        delete _this->synch_cs;\n        _this->synch_cs = NULL;\n\n        IL2CPP_FREE(_this->name);\n\n        delete static_cast<il2cpp::os::Thread*>(handle.m_value);\n        handle.m_value = NULL;\n    }\n} // namespace Threading\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/InternalThread.h",
    "content": "#pragma once\n#if NET_4_0\n#include \"object-internals.h\"\n\nstruct Il2CppInternalThread;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    class LIBIL2CPP_CODEGEN_API InternalThread\n    {\n    public:\n        static void Thread_free_internal(Il2CppInternalThread* _this, Il2CppIntPtr handle);\n    };\n} // namespace Threading\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/Monitor.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"icalls/mscorlib/System.Threading/Monitor.h\"\n#include \"vm/Monitor.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    void Monitor::Enter(Il2CppObject* obj)\n    {\n        IL2CPP_CHECK_ARG_NULL(obj);\n        il2cpp::vm::Monitor::Enter(obj);\n    }\n\n    void Monitor::Exit(Il2CppObject* obj)\n    {\n        IL2CPP_CHECK_ARG_NULL(obj);\n        il2cpp::vm::Monitor::Exit(obj);\n    }\n\n    bool Monitor::Monitor_test_synchronised(Il2CppObject* obj)\n    {\n        IL2CPP_CHECK_ARG_NULL(obj);\n        return il2cpp::vm::Monitor::IsAcquired(obj);\n    }\n\n    void Monitor::Monitor_pulse(Il2CppObject* obj)\n    {\n        IL2CPP_CHECK_ARG_NULL(obj);\n        il2cpp::vm::Monitor::Pulse(obj);\n    }\n\n    void Monitor::Monitor_pulse_all(Il2CppObject* obj)\n    {\n        IL2CPP_CHECK_ARG_NULL(obj);\n        il2cpp::vm::Monitor::PulseAll(obj);\n    }\n\n    bool Monitor::Monitor_wait(Il2CppObject* obj, int32_t ms)\n    {\n        IL2CPP_CHECK_ARG_NULL(obj);\n        return il2cpp::vm::Monitor::TryWait(obj, ms);\n    }\n\n    bool Monitor::Monitor_try_enter(Il2CppObject* obj, int32_t ms)\n    {\n        IL2CPP_CHECK_ARG_NULL(obj);\n        return il2cpp::vm::Monitor::TryEnter(obj, ms);\n    }\n\n#if NET_4_0\n    bool Monitor::Monitor_test_owner(Il2CppObject* obj)\n    {\n        NOT_IMPLEMENTED_ICALL(Monitor::Monitor_test_owner);\n        IL2CPP_UNREACHABLE;\n    }\n\n    void Monitor::enter_with_atomic_var(Il2CppObject* obj, bool* lockTaken)\n    {\n        IL2CPP_CHECK_ARG_NULL(obj);\n\n        if (*lockTaken)\n            vm::Exception::Raise(il2cpp::vm::Exception::GetArgumentException(\"lockTaken\", \"lockTaken must be false\"));\n\n        il2cpp::vm::Monitor::Enter(obj);\n        *lockTaken = true;\n    }\n\n    void Monitor::try_enter_with_atomic_var(Il2CppObject* obj, int32_t millisecondsTimeout, bool* lockTaken)\n    {\n        if (*lockTaken)\n            vm::Exception::Raise(il2cpp::vm::Exception::GetArgumentException(\"lockTaken\", \"lockTaken must be false\"));\n\n        *lockTaken = Monitor_try_enter(obj, millisecondsTimeout);\n    }\n\n#endif\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/Monitor.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    class LIBIL2CPP_CODEGEN_API Monitor\n    {\n    public:\n        static void Enter(Il2CppObject *);\n        static void Exit(Il2CppObject *);\n        static void Monitor_pulse(Il2CppObject* obj);\n        static void Monitor_pulse_all(Il2CppObject* obj);\n        static bool Monitor_test_synchronised(Il2CppObject* obj);\n        static bool Monitor_try_enter(Il2CppObject* obj, int32_t ms);\n        static bool Monitor_wait(Il2CppObject* obj, int32_t ms);\n#if NET_4_0\n        static bool Monitor_test_owner(Il2CppObject* obj);\n        static void enter_with_atomic_var(Il2CppObject* obj, bool* lockTaken);\n        static void try_enter_with_atomic_var(Il2CppObject* obj, int32_t millisecondsTimeout, bool* lockTaken);\n#endif\n    };\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/Mutex.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Threading/Mutex.h\"\n#include \"os/Mutex.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    Il2CppIntPtr Mutex::CreateMutex_internal(bool initiallyOwned, Il2CppString* name, bool* created)\n    {\n        *created = true;\n        il2cpp::os::Mutex* mutex = NULL;\n\n        if (name == NULL)\n        {\n            mutex = new il2cpp::os::Mutex();\n        }\n        else\n        {\n            NOT_SUPPORTED_IL2CPP(Mutex::CreateMutex_internal, \"Named mutexes are not supported\");\n        }\n\n        if (initiallyOwned)\n            mutex->Lock();\n\n        Il2CppIntPtr ret = { new il2cpp::os::MutexHandle(mutex) };\n        return ret;\n    }\n\n    bool Mutex::ReleaseMutex_internal(Il2CppIntPtr handle)\n    {\n        il2cpp::os::MutexHandle* mutex = (il2cpp::os::MutexHandle*)handle.m_value;\n        mutex->Get()->Unlock();\n        return true;\n    }\n\n    Il2CppIntPtr Mutex::OpenMutex_internal(Il2CppString* name, MutexRights rights, MonoIOError* error)\n    {\n        NOT_IMPLEMENTED_ICALL(Mutex::OpenMutex_internal);\n\n        return Il2CppIntPtr();\n    }\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/Mutex.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"object-internals.h\"\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    struct MonoIOError;\n\n    typedef int32_t MutexRights;\n\n    class LIBIL2CPP_CODEGEN_API Mutex\n    {\n    public:\n        static Il2CppIntPtr CreateMutex_internal(bool initiallyOwned, Il2CppString* name, bool* created);\n        static Il2CppIntPtr OpenMutex_internal(Il2CppString* name, MutexRights rights, MonoIOError* error);\n        static bool ReleaseMutex_internal(Il2CppIntPtr handle);\n    };\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/NativeEventCalls.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"icalls/mscorlib/System.Threading/NativeEventCalls.h\"\n#include \"os/Event.h\"\n#include \"vm/Exception.h\"\n\nusing namespace il2cpp::os;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    bool NativeEventCalls::ResetEvent_internal(Il2CppIntPtr handlePtr)\n    {\n        EventHandle* handle = (EventHandle*)handlePtr.m_value;\n        ErrorCode result = handle->Get().Reset();\n\n        return kErrorCodeSuccess == result;\n    }\n\n    bool NativeEventCalls::SetEvent_internal(Il2CppIntPtr handlePtr)\n    {\n        EventHandle* handle = (EventHandle*)handlePtr.m_value;\n        ErrorCode result = handle->Get().Set();\n\n        return kErrorCodeSuccess == result;\n    }\n\n#if !NET_4_0\n\n    Il2CppIntPtr NativeEventCalls::CreateEvent_internal(bool manualReset, bool signaled, Il2CppString* name, bool* created)\n    {\n        *created = true;\n        il2cpp::os::Event* event = NULL;\n\n        if (name == NULL)\n            event = new Event(manualReset, signaled);\n        else\n            NOT_SUPPORTED_IL2CPP(NativeEventCalls::CreateEvent_internal, \"Named events are not supported.\");\n\n        Il2CppIntPtr ret = { new EventHandle(event) };\n        return ret;\n    }\n\n    Il2CppIntPtr NativeEventCalls::OpenEvent_internal(Il2CppString* name, EventWaitHandleRights rights, MonoIOError* error)\n    {\n        NOT_IMPLEMENTED_ICALL(NativeEventCalls::OpenEvent_internal);\n        return Il2CppIntPtr();\n    }\n\n#else\n\n    Il2CppIntPtr NativeEventCalls::CreateEvent_internal(bool manual, bool initial, Il2CppString* name, int32_t *errorCode)\n    {\n        *errorCode = 0;\n        il2cpp::os::Event* event = NULL;\n\n        if (name == NULL)\n            event = new Event(manual, initial);\n        else\n            NOT_SUPPORTED_IL2CPP(NativeEventCalls::CreateEvent_internal, \"Named events are not supported.\");\n\n        Il2CppIntPtr ret = { new EventHandle(event) };\n        return ret;\n    }\n\n    Il2CppIntPtr NativeEventCalls::OpenEvent_internal(Il2CppString* name, EventWaitHandleRights rights, int32_t* errorCode)\n    {\n        NOT_IMPLEMENTED_ICALL(NativeEventCalls::OpenEvent_internal);\n        return Il2CppIntPtr();\n    }\n\n#endif\n\n    void NativeEventCalls::CloseEvent_internal(Il2CppIntPtr handlePtr)\n    {\n        Handle* handle = (Handle*)handlePtr.m_value;\n        // should we close or just delete\n        //handle->Close ();\n        delete handle;\n    }\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/NativeEventCalls.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"object-internals.h\"\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    struct MonoIOError;\n\n    typedef int32_t EventWaitHandleRights;\n\n    class LIBIL2CPP_CODEGEN_API NativeEventCalls\n    {\n    public:\n\n#if !NET_4_0\n        static Il2CppIntPtr CreateEvent_internal(bool manualReset, bool signaled, Il2CppString* name, bool* created);\n        static Il2CppIntPtr OpenEvent_internal(Il2CppString* name, EventWaitHandleRights rights, MonoIOError* error);\n#else\n        static Il2CppIntPtr CreateEvent_internal(bool manual, bool initial, Il2CppString* name, int32_t* errorCode);\n        static Il2CppIntPtr OpenEvent_internal(Il2CppString* name, EventWaitHandleRights rights, int32_t* errorCode);\n#endif\n\n        static bool ResetEvent_internal(Il2CppIntPtr handlePtr);\n        static bool SetEvent_internal(Il2CppIntPtr handlePtr);\n        static void CloseEvent_internal(Il2CppIntPtr handlePtr);\n    };\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/Thread.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <memory>\n#include \"icalls/mscorlib/System.Threading/Thread.h\"\n#include \"class-internals.h\"\n#include \"gc/GarbageCollector.h\"\n#include \"os/Atomic.h\"\n#include \"os/Thread.h\"\n#include \"os/Mutex.h\"\n#include \"os/Semaphore.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Array.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Object.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/String.h\"\n#include \"vm/Thread.h\"\n#include \"vm/Exception.h\"\n#include \"vm/String.h\"\n#include \"vm/StackTrace.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Atomic.h\"\n\nusing namespace il2cpp::vm;\nusing il2cpp::gc::GarbageCollector;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n#define NUM_CACHED_CULTURES 4\n#define CULTURES_START_IDX 0\n#define UICULTURES_START_IDX NUM_CACHED_CULTURES\n\n    static Il2CppObject* lookup_cached_culture(Il2CppThread *thisPtr, int32_t start_idx);\n    static void cache_culture(Il2CppThread *thisPtr, Il2CppObject *culture, int start_idx);\n\n\n    void Thread::ClrState(Il2CppThread* thisPtr, il2cpp::vm::ThreadState state)\n    {\n        il2cpp::vm::Thread::ClrState(thisPtr, state);\n    }\n\n    Il2CppThread * Thread::CurrentThread_internal(void)\n    {\n        return il2cpp::vm::Thread::Current();\n    }\n\n    int32_t Thread::GetDomainID()\n    {\n        return il2cpp::vm::Domain::GetCurrent()->domain_id;\n    }\n\n    il2cpp::vm::ThreadState Thread::GetState(Il2CppThread * thisPtr)\n    {\n        il2cpp::os::FastAutoLock lock(thisPtr->GetInternalThread()->synch_cs);\n        return (il2cpp::vm::ThreadState)thisPtr->GetInternalThread()->state;\n    }\n\n    bool Thread::Join_internal(Il2CppThread * thisPtr, int32_t ms, void* thread)\n    {\n        // Throw ThreadStateException if thread has not been started yet.\n        if (il2cpp::vm::Thread::GetState(thisPtr) & kThreadStateUnstarted)\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetThreadStateException(\"Thread has not been started.\"));\n\n        // Mark current thread as blocked.\n        Il2CppThread* currentThread = il2cpp::vm::Thread::Current();\n        SetState(currentThread, kThreadStateWaitSleepJoin);\n\n        // Join with other thread.\n        il2cpp::os::Thread* osThread = (il2cpp::os::Thread*)thisPtr->GetInternalThread()->handle;\n        IL2CPP_ASSERT(osThread != NULL);\n        il2cpp::os::WaitStatus status = osThread->Join(ms);\n\n        // Unblock current thread.\n        ClrState(currentThread, kThreadStateWaitSleepJoin);\n\n        if (status == il2cpp::os::kWaitStatusSuccess)\n            return true;\n\n        return false;\n    }\n\n    void Thread::ResetAbort_internal()\n    {\n        il2cpp::vm::Thread::ResetAbort(il2cpp::vm::Thread::Current());\n    }\n\n    Il2CppString* Thread::GetName_internal(Il2CppThread* thisPtr)\n    {\n        il2cpp::os::FastAutoLock lock(thisPtr->GetInternalThread()->synch_cs);\n\n        if (thisPtr->GetInternalThread()->name_len == 0)\n            return NULL;\n\n        return il2cpp::vm::String::NewUtf16(thisPtr->GetInternalThread()->name, thisPtr->GetInternalThread()->name_len);\n    }\n\n    void Thread::SetName_internal(Il2CppThread* thisPtr, Il2CppString* name)\n    {\n        vm::Thread::SetName(thisPtr, name);\n    }\n\n    void Thread::SetState(Il2CppThread* thisPtr, il2cpp::vm::ThreadState state)\n    {\n        il2cpp::os::FastAutoLock lock(thisPtr->GetInternalThread()->synch_cs);\n        il2cpp::vm::Thread::SetState(thisPtr, state);\n    }\n\n    void Thread::Sleep_internal(int32_t milliseconds)\n    {\n        Il2CppThread* thread = il2cpp::vm::Thread::Current();\n        SetState(thread, kThreadStateWaitSleepJoin);\n        il2cpp::os::Thread::Sleep(milliseconds, true);\n        ClrState(thread, kThreadStateWaitSleepJoin);\n    }\n\n    void Thread::Thread_init(Il2CppThread * thisPtr)\n    {\n        il2cpp::vm::Thread::Setup(thisPtr);\n    }\n\n    struct StartData\n    {\n        Il2CppThread* m_Thread;\n        Il2CppDomain* m_Domain;\n        Il2CppDelegate* m_Delegate;\n        Il2CppObject* m_StartArg;\n        il2cpp::os::Semaphore* m_Semaphore;\n    };\n\n    static void ThreadStart(void* arg)\n    {\n        StartData* startData = (StartData*)arg;\n\n        startData->m_Semaphore->Wait();\n\n        {\n            int temp = 0;\n            if (!GarbageCollector::RegisterThread(&temp))\n                IL2CPP_ASSERT(0 && \"GarbageCollector::RegisterThread failed\");\n\n            il2cpp::vm::StackTrace::InitializeStackTracesForCurrentThread();\n\n            il2cpp::vm::Thread::Initialize(startData->m_Thread, startData->m_Domain);\n            il2cpp::vm::Thread::SetState(startData->m_Thread, kThreadStateRunning);\n\n            try\n            {\n                Il2CppException* exc = NULL;\n                void* args[1] = { startData->m_StartArg };\n                Runtime::DelegateInvoke(startData->m_Delegate, args, &exc);\n\n                if (exc)\n                    Runtime::UnhandledException(exc);\n            }\n            catch (il2cpp::vm::Thread::NativeThreadAbortException)\n            {\n                // Nothing to do. We've successfully aborted the thread.\n                il2cpp::vm::Thread::SetState(startData->m_Thread, kThreadStateAborted);\n            }\n\n            il2cpp::vm::Thread::ClrState(startData->m_Thread, kThreadStateRunning);\n            il2cpp::vm::Thread::SetState(startData->m_Thread, kThreadStateStopped);\n            il2cpp::vm::Thread::Uninitialize(startData->m_Thread);\n\n            il2cpp::vm::StackTrace::CleanupStackTracesForCurrentThread();\n        }\n\n        delete startData->m_Semaphore;\n        GarbageCollector::FreeFixed(startData);\n    }\n\n    Il2CppIntPtr Thread::Thread_internal(Il2CppThread * thisPtr, Il2CppDelegate * start)\n    {\n        IL2CPP_ASSERT(thisPtr->GetInternalThread()->synch_cs != NULL);\n        il2cpp::os::FastAutoLock lock(thisPtr->GetInternalThread()->synch_cs);\n\n        if (il2cpp::vm::Thread::GetState(thisPtr) & kThreadStateAborted)\n        {\n            Il2CppIntPtr ret = { thisPtr->GetInternalThread()->handle };\n            return ret;\n        }\n\n        // use fixed GC memory since we are storing managed object pointers\n        StartData* startData = (StartData*)GarbageCollector::AllocateFixed(sizeof(StartData), NULL);\n        startData->m_Thread = thisPtr;\n        startData->m_Domain = Domain::GetCurrent();\n        startData->m_Delegate = start;\n        startData->m_StartArg = thisPtr->start_obj;\n        startData->m_Semaphore = new il2cpp::os::Semaphore(0);\n\n        il2cpp::os::Thread* thread = new il2cpp::os::Thread();\n        thread->SetStackSize(thisPtr->GetInternalThread()->stack_size);\n        thread->SetExplicitApartment(static_cast<il2cpp::os::ApartmentState>(thisPtr->GetInternalThread()->apartment_state));\n        il2cpp::os::ErrorCode status = thread->Run(&ThreadStart, startData);\n        if (status != il2cpp::os::kErrorCodeSuccess)\n        {\n            delete thread;\n            return Il2CppIntPtr::Zero;\n        }\n\n#if NET_4_0\n        uint32_t existingPriority = il2cpp::vm::Thread::GetPriority(thisPtr);\n#endif\n\n        thisPtr->GetInternalThread()->handle = thread;\n        thisPtr->GetInternalThread()->state &= ~kThreadStateUnstarted;\n        thisPtr->GetInternalThread()->tid = thread->Id();\n        thisPtr->GetInternalThread()->managed_id = il2cpp::vm::Thread::GetNewManagedId();\n\n        startData->m_Semaphore->Post(1, NULL);\n\n#if NET_4_0\n        il2cpp::vm::Thread::SetPriority(thisPtr, existingPriority);\n#endif\n\n        // this is just checked against 0 in the calling code\n        Il2CppIntPtr ret = { thisPtr->GetInternalThread()->handle };\n        return ret;\n    }\n\n#if !NET_4_0\n    void Thread::Thread_free_internal(Il2CppThread * thisPtr, Il2CppIntPtr handle)\n    {\n        delete thisPtr->GetInternalThread()->synch_cs;\n        thisPtr->GetInternalThread()->synch_cs = NULL;\n\n        IL2CPP_FREE(thisPtr->GetInternalThread()->name);\n\n        delete static_cast<il2cpp::os::Thread*>(handle.m_value);\n        handle.m_value = NULL;\n    }\n\n#endif\n\n    static void cache_culture(Il2CppThread *thisPtr, Il2CppObject *culture, int start_idx)\n    {\n        int i;\n        Il2CppObject *obj;\n        int free_slot = -1;\n        int same_domain_slot = -1;\n\n        il2cpp::os::FastAutoLock lock(thisPtr->GetInternalThread()->synch_cs);\n\n        if (!thisPtr->GetInternalThread()->cached_culture_info)\n            IL2CPP_OBJECT_SETREF(thisPtr->GetInternalThread(), cached_culture_info, il2cpp::vm::Array::NewCached(il2cpp_defaults.object_class, NUM_CACHED_CULTURES * 2));\n\n        for (i = start_idx; i < start_idx + NUM_CACHED_CULTURES; ++i)\n        {\n            obj = il2cpp_array_get(thisPtr->GetInternalThread()->cached_culture_info, Il2CppObject*, i);\n            /* Free entry */\n            if (!obj)\n            {\n                free_slot = i;\n                /* we continue, because there may be a slot used with the same domain */\n                continue;\n            }\n            /* Replace */\n            same_domain_slot = i;\n            break;\n        }\n        if (same_domain_slot >= 0)\n            il2cpp_array_setref(thisPtr->GetInternalThread()->cached_culture_info, same_domain_slot, culture);\n        else if (free_slot >= 0)\n            il2cpp_array_setref(thisPtr->GetInternalThread()->cached_culture_info, free_slot, culture);\n        /* we may want to replace an existing entry here, even when no suitable slot is found */\n    }\n\n    static Il2CppObject* lookup_cached_culture(Il2CppThread *thisPtr, int32_t start_idx)\n    {\n        Il2CppObject *res;\n        int i;\n\n        if (thisPtr->GetInternalThread()->cached_culture_info)\n        {\n            for (i = start_idx; i < start_idx + NUM_CACHED_CULTURES; ++i)\n            {\n                res = il2cpp_array_get(thisPtr->GetInternalThread()->cached_culture_info, Il2CppObject*, i);\n                if (res)\n                    return res;\n            }\n        }\n\n        return NULL;\n    }\n\n    void Thread::FreeLocalSlotValues(int32_t slot, bool use_thread_local)\n    {\n        NOT_IMPLEMENTED_ICALL(Thread::FreeLocalSlotValues);\n    }\n\n    mscorlib_System_Globalization_CultureInfo* Thread::GetCachedCurrentCulture(Il2CppThread* thisPtr)\n    {\n        return (mscorlib_System_Globalization_CultureInfo*)lookup_cached_culture(thisPtr, CULTURES_START_IDX);\n    }\n\n    void Thread::SetCachedCurrentCulture(Il2CppThread* thisPtr, Il2CppObject* culture)\n    {\n        cache_culture(thisPtr, culture, CULTURES_START_IDX);\n    }\n\n    mscorlib_System_Globalization_CultureInfo* Thread::GetCachedCurrentUICulture(Il2CppThread* thisPtr)\n    {\n        return (mscorlib_System_Globalization_CultureInfo*)lookup_cached_culture(thisPtr, UICULTURES_START_IDX);\n    }\n\n    void Thread::SetCachedCurrentUICulture(Il2CppThread* thisPtr, Il2CppObject* culture)\n    {\n        cache_culture(thisPtr, culture, UICULTURES_START_IDX);\n    }\n\n    static Il2CppArray* GetSerializedCulture(uint8_t*& data, uint32_t& length)\n    {\n        if (!data)\n            return NULL;\n\n        Il2CppArray* result = il2cpp::vm::Array::New(il2cpp_defaults.byte_class, length);\n        memcpy(il2cpp_array_addr(result, uint8_t, 0), data, length);\n\n        return result;\n    }\n\n    static void SetSerializedCulture(uint8_t*& data, uint32_t& length, Il2CppArray* culture)\n    {\n        if (data != NULL)\n            delete data;\n\n        int arrayLength = il2cpp::vm::Array::GetByteLength(culture);\n        data = new uint8_t[arrayLength];\n        length = arrayLength;\n        memcpy(data, il2cpp_array_addr(culture, uint8_t, 0), arrayLength);\n    }\n\n#if !NET_4_0\n    Il2CppArray* Thread::GetSerializedCurrentCulture(Il2CppThread* thisPtr)\n    {\n        il2cpp::os::FastAutoLock lock(thisPtr->synch_cs);\n        return GetSerializedCulture(thisPtr->serialized_culture_info, thisPtr->serialized_culture_info_len);\n    }\n\n    void Thread::SetSerializedCurrentCulture(Il2CppThread* thisPtr, Il2CppArray* culture)\n    {\n        il2cpp::os::FastAutoLock lock(thisPtr->synch_cs);\n        SetSerializedCulture(thisPtr->serialized_culture_info, thisPtr->serialized_culture_info_len, culture);\n    }\n\n    Il2CppArray* Thread::GetSerializedCurrentUICulture(Il2CppThread* thisPtr)\n    {\n        il2cpp::os::FastAutoLock lock(thisPtr->synch_cs);\n        return GetSerializedCulture(thisPtr->serialized_ui_culture_info, thisPtr->serialized_ui_culture_info_len);\n    }\n\n    void Thread::SetSerializedCurrentUICulture(Il2CppThread* thisPtr, Il2CppArray* culture)\n    {\n        il2cpp::os::FastAutoLock lock(thisPtr->synch_cs);\n        SetSerializedCulture(thisPtr->serialized_ui_culture_info, thisPtr->serialized_ui_culture_info_len, culture);\n    }\n\n#endif\n\n    int32_t Thread::GetNewManagedId_internal()\n    {\n        return il2cpp::vm::Thread::GetNewManagedId();\n    }\n\n    void Thread::Abort_internal(Il2CppThread* thisPtr, Il2CppObject* stateInfo)\n    {\n        il2cpp::vm::Thread::RequestAbort(thisPtr);\n    }\n\n    Il2CppObject* Thread::GetAbortExceptionState(void* /* System.Threading.Thread */ self)\n    {\n        NOT_SUPPORTED_IL2CPP(Thread::GetAbortExceptionState, \"Thread abortion is currently not implemented on IL2CPP; it is recommended to use safer mechanisms to terminate threads.\");\n        return 0;\n    }\n\n    void Thread::Interrupt_internal(Il2CppThread* thisPtr)\n    {\n        il2cpp::vm::Thread::RequestInterrupt(thisPtr);\n    }\n\n    void Thread::MemoryBarrier_()\n    {\n        il2cpp::os::Atomic::MemoryBarrier();\n    }\n\n    void Thread::Resume_internal(void* /* System.Threading.Thread */ self)\n    {\n        NOT_SUPPORTED_IL2CPP(Thread::Resume_internal, \"Thread suspension is obsolete and not supported on IL2CPP.\");\n    }\n\n    void Thread::SpinWait_nop()\n    {\n    }\n\n    void Thread::Suspend_internal(void* /* System.Threading.Thread */ self)\n    {\n        NOT_SUPPORTED_IL2CPP(Thread::Suspend_internal, \"Thread suspension is obsolete and not supported on IL2CPP.\");\n    }\n\n// Unlike Mono we cannot just do a memory read/write of the correct type and reuse that for the\n// floating-point types because we are compiling to C++ and have to account for its type conversion\n// rules. For example, if we read a double as a uint64_t and return it as such, the compiler will\n// perform a default conversion from uint64_t to double -- whereas what we want is to simply interpret\n// the memory contents as a double.\n\n    int8_t Thread::VolatileReadInt8(volatile void* address)\n    {\n        il2cpp::os::Atomic::MemoryBarrier();\n        return *reinterpret_cast<volatile int8_t*>(address);\n    }\n\n    int16_t Thread::VolatileReadInt16(volatile void* address)\n    {\n        il2cpp::os::Atomic::MemoryBarrier();\n        return *reinterpret_cast<volatile int16_t*>(address);\n    }\n\n    int32_t Thread::VolatileReadInt32(volatile void* address)\n    {\n        il2cpp::os::Atomic::MemoryBarrier();\n        return *reinterpret_cast<volatile int32_t*>(address);\n    }\n\n    int64_t Thread::VolatileReadInt64(volatile void* address)\n    {\n        il2cpp::os::Atomic::MemoryBarrier();\n        return *reinterpret_cast<volatile int64_t*>(address);\n    }\n\n    float Thread::VolatileReadFloat(volatile void* address)\n    {\n        il2cpp::os::Atomic::MemoryBarrier();\n        return *reinterpret_cast<volatile float*>(address);\n    }\n\n    double Thread::VolatileReadDouble(volatile void* address)\n    {\n        il2cpp::os::Atomic::MemoryBarrier();\n        return *reinterpret_cast<volatile double*>(address);\n    }\n\n    void* Thread::VolatileReadPtr(volatile void* address)\n    {\n        il2cpp::os::Atomic::MemoryBarrier();\n        return *reinterpret_cast<void* volatile*>(address);\n    }\n\n    Il2CppIntPtr Thread::VolatileReadIntPtr(volatile void* address)\n    {\n        Il2CppIntPtr result;\n        result.m_value = VolatileReadPtr(address);\n        return result;\n    }\n\n    void Thread::VolatileWriteInt8(volatile void* address, int8_t value)\n    {\n        *reinterpret_cast<volatile int8_t*>(address) = value;\n        il2cpp::os::Atomic::MemoryBarrier();\n    }\n\n    void Thread::VolatileWriteInt16(volatile void* address, int16_t value)\n    {\n        *reinterpret_cast<volatile int16_t*>(address) = value;\n        il2cpp::os::Atomic::MemoryBarrier();\n    }\n\n    void Thread::VolatileWriteInt32(volatile void* address, int32_t value)\n    {\n        *reinterpret_cast<volatile int32_t*>(address) = value;\n        il2cpp::os::Atomic::MemoryBarrier();\n    }\n\n    void Thread::VolatileWriteInt64(volatile void* address, int64_t value)\n    {\n        *reinterpret_cast<volatile int64_t*>(address) = value;\n        il2cpp::os::Atomic::MemoryBarrier();\n    }\n\n    void Thread::VolatileWriteFloat(volatile void* address, float value)\n    {\n        *reinterpret_cast<volatile float*>(address) = value;\n        il2cpp::os::Atomic::MemoryBarrier();\n    }\n\n    void Thread::VolatileWriteDouble(volatile void* address, double value)\n    {\n        *reinterpret_cast<volatile double*>(address) = value;\n        il2cpp::os::Atomic::MemoryBarrier();\n    }\n\n    void Thread::VolatileWritePtr(volatile void* address, void* value)\n    {\n        *reinterpret_cast<void* volatile*>(address) = value;\n        il2cpp::os::Atomic::MemoryBarrier();\n    }\n\n    void Thread::VolatileWriteIntPtr(volatile void* address, Il2CppIntPtr value)\n    {\n        VolatileWritePtr(address, value.m_value);\n    }\n\n#if NET_4_0\n\n    Il2CppArray* Thread::ByteArrayToCurrentDomain(Il2CppArray* arr)\n    {\n        NOT_IMPLEMENTED_ICALL(Thread::ByteArrayToCurrentDomain);\n        IL2CPP_UNREACHABLE;\n    }\n\n    Il2CppArray* Thread::ByteArrayToRootDomain(Il2CppArray* arr)\n    {\n        NOT_IMPLEMENTED_ICALL(Thread::ByteArrayToRootDomain);\n        IL2CPP_UNREACHABLE;\n    }\n\n    bool Thread::YieldInternal()\n    {\n        return vm::Thread::YieldInternal();\n    }\n\n    bool Thread::JoinInternal(Il2CppThread* _this, int32_t millisecondsTimeout)\n    {\n        return Join_internal(_this, millisecondsTimeout, NULL);\n    }\n\n    int32_t Thread::GetPriorityNative(Il2CppThread* _this)\n    {\n        return il2cpp::vm::Thread::GetPriority(_this);\n    }\n\n    int32_t Thread::SystemMaxStackStize()\n    {\n        NOT_IMPLEMENTED_ICALL(Thread::SystemMaxStackStize);\n        IL2CPP_UNREACHABLE;\n    }\n\n    Il2CppString* Thread::GetName_internal40(Il2CppInternalThread* thread)\n    {\n        il2cpp::os::FastAutoLock lock(thread->synch_cs);\n\n        if (thread->name_len == 0)\n            return NULL;\n\n        return il2cpp::vm::String::NewUtf16(thread->name, thread->name_len);\n    }\n\n    Il2CppInternalThread* Thread::CurrentInternalThread_internal()\n    {\n        return CurrentThread_internal()->GetInternalThread();\n    }\n\n    int32_t Thread::GetState40(Il2CppInternalThread* thread)\n    {\n        il2cpp::os::FastAutoLock lock(thread->synch_cs);\n        return (il2cpp::vm::ThreadState)thread->state;\n    }\n\n    void Thread::Abort_internal40(Il2CppInternalThread* thread, Il2CppObject* stateInfo)\n    {\n        il2cpp::vm::Thread::RequestAbort(thread);\n    }\n\n    void Thread::ClrState40(Il2CppInternalThread* thread, il2cpp::vm::ThreadState clr)\n    {\n        il2cpp::vm::Thread::ClrState(thread, clr);\n    }\n\n    void Thread::ConstructInternalThread(Il2CppThread* _this)\n    {\n        os::Thread* osThread = new os::Thread();\n\n        // Create managed object representing the current thread.\n\n        Il2CppInternalThread* internal = (Il2CppInternalThread*)Object::New(il2cpp_defaults.internal_thread_class);\n        internal->state = kThreadStateUnstarted;\n        internal->handle = osThread;\n        internal->tid = osThread->Id();\n        internal->synch_cs = new il2cpp::os::FastMutex();\n        internal->apartment_state = il2cpp::os::kApartmentStateUnknown;\n        internal->managed_id = GetNewManagedId_internal();\n        vm::Atomic::CompareExchangePointer<Il2CppInternalThread>(&_this->internal_thread, internal, NULL);\n    }\n\n    void Thread::GetStackTraces(Il2CppArray** threads, Il2CppArray** stack_frames)\n    {\n        NOT_IMPLEMENTED_ICALL(Thread::GetStackTraces);\n        IL2CPP_UNREACHABLE;\n    }\n\n    void Thread::InterruptInternal(Il2CppThread* _this)\n    {\n        Interrupt_internal(_this);\n    }\n\n    void Thread::ResetAbortNative(Il2CppObject* _this)\n    {\n        NOT_IMPLEMENTED_ICALL(Thread::ResetAbortNative);\n        IL2CPP_UNREACHABLE;\n    }\n\n    void Thread::ResumeInternal(Il2CppObject* _this)\n    {\n        NOT_SUPPORTED_IL2CPP(Thread::Resume_internal, \"Thread suspension is obsolete and not supported on IL2CPP.\");\n    }\n\n    void Thread::SetName_internal40(Il2CppInternalThread* thread, Il2CppString* name)\n    {\n        il2cpp::os::FastAutoLock lock(thread->synch_cs);\n\n        // Throw if already set.\n        if (thread->name_len != 0)\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetInvalidOperationException(\"Thread name can only be set once.\"));\n\n        // Store name.\n        thread->name_len = utils::StringUtils::GetLength(name);\n        thread->name = il2cpp::utils::StringUtils::StringDuplicate(utils::StringUtils::GetChars(name), thread->name_len);\n\n        // Hand over to OS layer, if thread has been started already.\n        if (thread->handle)\n        {\n            std::string utf8Name = il2cpp::utils::StringUtils::Utf16ToUtf8(thread->name);\n            thread->handle->SetName(utf8Name);\n        }\n    }\n\n    void Thread::SetPriorityNative(Il2CppThread* _this, int32_t priority)\n    {\n        vm::Thread::SetPriority(_this, priority);\n    }\n\n    void Thread::SetState40(Il2CppInternalThread* thread, il2cpp::vm::ThreadState state)\n    {\n        vm::Thread::SetState(thread, state);\n    }\n\n    void Thread::SleepInternal(int32_t millisecondsTimeout)\n    {\n        Sleep_internal(millisecondsTimeout);\n    }\n\n    void Thread::SuspendInternal(Il2CppObject* _this)\n    {\n        NOT_SUPPORTED_IL2CPP(Thread::SuspendInternal, \"Thread suspension is obsolete and not supported on IL2CPP.\");\n    }\n\n#endif\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/Thread.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"object-internals.h\"\n#include \"vm/Thread.h\"\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\nstruct Il2CppThread;\nstruct mscorlib_System_Globalization_CultureInfo;\nstruct Il2CppDelegate;\nstruct mscorlib_System_Threading_Thread;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    class LIBIL2CPP_CODEGEN_API Thread\n    {\n    public:\n        static int32_t GetDomainID();\n        static Il2CppThread * CurrentThread_internal();\n        static void ResetAbort_internal();\n        static void MemoryBarrier_();\n        static void SpinWait_nop();\n        static void Abort_internal(Il2CppThread* thisPtr, Il2CppObject* stateInfo);\n        static void ClrState(Il2CppThread* thisPtr, il2cpp::vm::ThreadState clr);\n        static void FreeLocalSlotValues(int32_t slot, bool use_thread_local);\n        static Il2CppObject* GetAbortExceptionState(void* /* System.Threading.Thread */ self);\n        static mscorlib_System_Globalization_CultureInfo * GetCachedCurrentCulture(Il2CppThread* thisPtr);\n        static mscorlib_System_Globalization_CultureInfo* GetCachedCurrentUICulture(Il2CppThread* thisPtr);\n        static Il2CppString* GetName_internal(Il2CppThread* thisPtr);\n        static void SetName_internal(Il2CppThread* thisPtr, Il2CppString* name);\n        static int32_t GetNewManagedId_internal();\n#if !NET_4_0\n        static Il2CppArray * GetSerializedCurrentCulture(Il2CppThread* thisPtr);\n        static Il2CppArray* GetSerializedCurrentUICulture(Il2CppThread* thisPtr);\n#endif\n        static il2cpp::vm::ThreadState GetState(Il2CppThread * thisPtr);\n        static void Interrupt_internal(Il2CppThread* thisPtr);\n        static bool Join_internal(Il2CppThread * thisPtr, int32_t ms, void* thread);\n        static void Resume_internal(void* /* System.Threading.Thread */ self);\n        static void SetCachedCurrentCulture(Il2CppThread *thisPtr, Il2CppObject* culture);\n        static void SetCachedCurrentUICulture(Il2CppThread* thisPtr, Il2CppObject* culture);\n#if !NET_4_0\n        static void SetSerializedCurrentCulture(Il2CppThread* thisPtr, Il2CppArray* culture);\n        static void SetSerializedCurrentUICulture(Il2CppThread* thisPtr, Il2CppArray* culture);\n#endif\n        static void SetState(Il2CppThread * thisPtr, il2cpp::vm::ThreadState state);\n        static void Sleep_internal(int32_t milliseconds);\n        static void Suspend_internal(void* /* System.Threading.Thread */ self);\n        static void Thread_init(Il2CppThread* thisPtr);\n        static Il2CppIntPtr Thread_internal(Il2CppThread* thisPtr, Il2CppDelegate * start);\n        static int8_t VolatileReadInt8(volatile void* address);\n        static int16_t VolatileReadInt16(volatile void* address);\n        static int32_t VolatileReadInt32(volatile void* address);\n        static int64_t VolatileReadInt64(volatile void* address);\n        static float VolatileReadFloat(volatile void* address);\n        static double VolatileReadDouble(volatile void* address);\n        static void* VolatileReadPtr(volatile void* address);\n        static Il2CppIntPtr VolatileReadIntPtr(volatile void* address);\n        static void VolatileWriteInt8(volatile void* address, int8_t value);\n        static void VolatileWriteInt16(volatile void* address, int16_t value);\n        static void VolatileWriteInt32(volatile void* address, int32_t value);\n        static void VolatileWriteInt64(volatile void* address, int64_t value);\n        static void VolatileWriteFloat(volatile void* address, float value);\n        static void VolatileWriteDouble(volatile void* address, double value);\n        static void VolatileWritePtr(volatile void* address, void* value);\n        static void VolatileWriteIntPtr(volatile void* address, Il2CppIntPtr value);\n#if !NET_4_0\n        static void Thread_free_internal(Il2CppThread* thisPtr, Il2CppIntPtr handle);\n#endif\n\n#if NET_4_0\n        static Il2CppArray* ByteArrayToCurrentDomain(Il2CppArray* arr);\n        static Il2CppArray* ByteArrayToRootDomain(Il2CppArray* arr);\n        static bool YieldInternal();\n        static bool JoinInternal(Il2CppThread* _this, int32_t millisecondsTimeout);\n        static int32_t GetPriorityNative(Il2CppThread* _this);\n        static int32_t SystemMaxStackStize();\n        static Il2CppString* GetName_internal40(Il2CppInternalThread* thread);\n        static Il2CppInternalThread* CurrentInternalThread_internal();\n        static int32_t GetState40(Il2CppInternalThread* thread);\n        static void Abort_internal40(Il2CppInternalThread* thread, Il2CppObject* stateInfo);\n        static void ClrState40(Il2CppInternalThread* thread, il2cpp::vm::ThreadState clr);\n        static void ConstructInternalThread(Il2CppThread* _this);\n        static void GetStackTraces(Il2CppArray** threads, Il2CppArray** stack_frames);\n        static void InterruptInternal(Il2CppThread* _this);\n        static void ResetAbortNative(Il2CppObject* _this);\n        static void ResumeInternal(Il2CppObject* _this);\n        static void SetName_internal40(Il2CppInternalThread* thread, Il2CppString* name);\n        static void SetPriorityNative(Il2CppThread* _this, int32_t priority);\n        static void SetState40(Il2CppInternalThread* thread, vm::ThreadState set);\n        static void SleepInternal(int32_t millisecondsTimeout);\n        static void SuspendInternal(Il2CppObject* _this);\n#endif\n    };\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/ThreadPool.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"icalls/mscorlib/System.Threading/ThreadPool.h\"\n#include \"os/Environment.h\"\n#include \"vm/Exception.h\"\n#include \"vm/ThreadPool.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    void ThreadPool::GetMaxThreads(int32_t* workerThreads, int32_t* completionPortThreads)\n    {\n        vm::ThreadPool::Configuration configuration = vm::ThreadPool::GetConfiguration();\n\n        if (workerThreads)\n            *workerThreads = configuration.maxThreads;\n        if (completionPortThreads)\n            *completionPortThreads = configuration.maxAsyncIOThreads;\n    }\n\n    void ThreadPool::GetMinThreads(int32_t* workerThreads, int32_t* completionPortThreads)\n    {\n        vm::ThreadPool::Configuration configuration = vm::ThreadPool::GetConfiguration();\n\n        if (workerThreads)\n            *workerThreads = configuration.minThreads;\n        if (completionPortThreads)\n            *completionPortThreads = configuration.minAsyncIOThreads;\n    }\n\n    bool ThreadPool::SetMinThreads(int32_t workerThreads, int32_t completionPortThreads)\n    {\n        vm::ThreadPool::Configuration configuration = vm::ThreadPool::GetConfiguration();\n\n        int numCoresAvailable = os::Environment::GetProcessorCount();\n        if (workerThreads < numCoresAvailable || workerThreads > configuration.maxThreads)\n            return false;\n        if (completionPortThreads < numCoresAvailable || completionPortThreads > configuration.maxAsyncIOThreads)\n            return false;\n\n        configuration.minThreads = workerThreads;\n        configuration.minAsyncIOThreads = completionPortThreads;\n\n        vm::ThreadPool::SetConfiguration(configuration);\n\n        return true;\n    }\n\n    bool ThreadPool::SetMaxThreads(int32_t workerThreads, int32_t completionPortThreads)\n    {\n        vm::ThreadPool::Configuration configuration = vm::ThreadPool::GetConfiguration();\n\n        if (workerThreads < configuration.minThreads)\n            return false;\n        if (completionPortThreads < configuration.minAsyncIOThreads)\n            return false;\n\n        configuration.maxThreads = workerThreads;\n        configuration.maxAsyncIOThreads = completionPortThreads;\n\n        vm::ThreadPool::SetConfiguration(configuration);\n\n        return true;\n    }\n\n    void ThreadPool::GetAvailableThreads(int32_t* workerThreads, int32_t* completionPortThreads)\n    {\n        vm::ThreadPool::Configuration configuration = vm::ThreadPool::GetConfiguration();\n\n        if (workerThreads)\n            *workerThreads = configuration.availableThreads;\n        if (completionPortThreads)\n            *completionPortThreads = configuration.availableAsyncIOThreads;\n    }\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/ThreadPool.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"object-internals.h\"\n#include \"il2cpp-config.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionField;\nstruct Il2CppArray;\nstruct Il2CppException;\nstruct Il2CppReflectionModule;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppAppDomain;\n\n#if NET_4_0\nstruct Il2CppNativeOverlapped;\n#endif\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    class LIBIL2CPP_CODEGEN_API ThreadPool\n    {\n    public:\n        static void GetAvailableThreads(int32_t* workerThreads, int32_t* completionPortThreads);\n        static void GetMinThreads(int32_t* workerThreads, int32_t* completionPortThreads);\n        static bool SetMaxThreads(int32_t workerThreads, int32_t completionPortThreads);\n        static bool SetMinThreads(int32_t workerThreads, int32_t completionPortThreads);\n        static void GetMaxThreads(int32_t* workerThreads, int32_t* completionPortThreads);\n    };\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/Timer.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n#include \"Timer.h\"\n#include \"os/Time.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    int64_t Timer::GetTimeMonotonic()\n    {\n        return os::Time::GetTicks100NanosecondsMonotonic();\n    }\n} // namespace Threading\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/Timer.h",
    "content": "#pragma once\n#if NET_4_0\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    class LIBIL2CPP_CODEGEN_API Timer\n    {\n    public:\n        static int64_t GetTimeMonotonic();\n    };\n} // namespace Threading\n} // namespace System\n} // namespace mscorlib\n} // namespace icalls\n} // namespace il2cpp\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/WaitHandle.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <vector>\n#include <algorithm>\n#include \"icalls/mscorlib/System.Threading/WaitHandle.h\"\n#include \"os/Mutex.h\"\n#include \"os/Thread.h\"\n#include \"vm/Thread.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Array.h\"\n#include \"vm/WaitHandle.h\"\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    std::vector<os::Handle*> ExtractOsWaitHandles(Il2CppArray* handles)\n    {\n        uint32_t numberOfHandles = vm::Array::GetLength(handles);\n\n        std::vector<os::Handle*> osWaitHandles(numberOfHandles);\n\n        for (uint32_t i = 0; i < numberOfHandles; ++i)\n        {\n            Il2CppObject* handle = il2cpp_array_get(handles, Il2CppObject*, i);\n            Il2CppWaitHandle* waitHandle = (Il2CppWaitHandle*)handle;\n            osWaitHandles[i] = vm::WaitHandle::GetPlatformHandle(waitHandle);\n        }\n\n        return osWaitHandles;\n    }\n\n    int32_t WaitHandle::WaitAny_internal(Il2CppArray* handles, int32_t ms, bool exitContext)\n    {\n        std::vector<os::Handle*> osWaitHandles = ExtractOsWaitHandles(handles);\n\n        vm::ThreadStateSetter state(vm::kThreadStateWaitSleepJoin);\n\n        int timeWaitedMs = 0;\n        while (ms == -1 || timeWaitedMs <= ms)\n        {\n            int32_t numberOfOsHandles = (int32_t)osWaitHandles.size();\n            for (int32_t i = 0; i < numberOfOsHandles; ++i)\n            {\n                if (osWaitHandles[i]->Wait(0))\n                    return i;\n            }\n\n            os::Thread::Sleep(m_waitIntervalMs, true);\n            timeWaitedMs += m_waitIntervalMs;\n        }\n\n        return 258; // WAIT_TIMEOUT value\n    }\n\n    bool WaitHandle::WaitOne_internal(Il2CppObject* unused, Il2CppIntPtr handlePtr, int32_t ms, bool exitContext)\n    {\n        il2cpp::os::Handle* handle = (il2cpp::os::Handle*)handlePtr.m_value;\n\n        vm::ThreadStateSetter state(vm::kThreadStateWaitSleepJoin);\n\n        // Check for pending interrupt before we go waiting.\n        il2cpp::vm::Thread::CheckCurrentThreadForInterruptAndThrowIfNecessary();\n\n        if (ms == -1)\n            return handle->Wait();\n\n        return handle->Wait(ms);\n    }\n\n    bool WaitHandle::WaitAll_internal(Il2CppArray* handles, int32_t ms, bool exitContext)\n    {\n        std::vector<os::Handle*> osWaitHandles = ExtractOsWaitHandles(handles);\n\n        vm::ThreadStateSetter state(vm::kThreadStateWaitSleepJoin);\n\n        int timeWaitedMs = 0;\n        while (ms == -1 || timeWaitedMs <= ms)\n        {\n            size_t numberOfOsHandles = osWaitHandles.size();\n            std::vector<os::Handle*> signaledHandles;\n            for (size_t i = 0; i < numberOfOsHandles; ++i)\n            {\n                if (osWaitHandles[i]->Wait(0))\n                    signaledHandles.push_back(osWaitHandles[i]);\n            }\n\n            if (signaledHandles.size() == numberOfOsHandles)\n                return true; // All handles have been signaled\n\n            for (size_t i = 0; i < signaledHandles.size(); ++i)\n                osWaitHandles.erase(std::remove(osWaitHandles.begin(), osWaitHandles.end(), signaledHandles[i]), osWaitHandles.end());\n\n            os::Thread::Sleep(m_waitIntervalMs, true);\n            timeWaitedMs += m_waitIntervalMs;\n        }\n\n        return false; // Timed out waiting for all handles to be signaled\n    }\n\n    bool WaitHandle::SignalAndWait_Internal(Il2CppIntPtr toSignal, Il2CppIntPtr toWaitOn, int32_t ms, bool exitContext)\n    {\n        os::Handle* toSignalOsHandle = (os::Handle*)toSignal.m_value;\n        toSignalOsHandle->Signal();\n\n        return WaitOne_internal(NULL, toWaitOn, ms, exitContext);\n    }\n\n#if NET_4_0\n    int32_t WaitHandle::SignalAndWait_Internal40(Il2CppIntPtr toSignal, Il2CppIntPtr toWaitOn, int32_t ms)\n    {\n        return SignalAndWait_Internal(toSignal, toWaitOn, ms, false) ? 0 : 1;\n    }\n\n    int32_t WaitHandle::WaitAll_internal40(Il2CppArray* handles, int32_t ms)\n    {\n        return WaitAll_internal(handles, ms, false) ? 0 : 258;\n    }\n\n    int32_t WaitHandle::WaitAny_internal40(Il2CppArray* handles, int32_t ms)\n    {\n        return WaitAny_internal(handles, ms, false);\n    }\n\n    int32_t WaitHandle::WaitOne_internal40(Il2CppIntPtr handle, int32_t ms)\n    {\n        return WaitOne_internal(NULL, handle, ms, false) ? 0 : 258;\n    }\n\n#endif\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/icalls/mscorlib/System.Threading/WaitHandle.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"object-internals.h\"\n#include \"il2cpp-config.h\"\n\nstruct Il2CppArray;\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace icalls\n{\nnamespace mscorlib\n{\nnamespace System\n{\nnamespace Threading\n{\n    class LIBIL2CPP_CODEGEN_API WaitHandle\n    {\n    public:\n        static bool SignalAndWait_Internal(Il2CppIntPtr toSignal, Il2CppIntPtr toWaitOn, int32_t ms, bool exitContext);\n        static bool WaitAll_internal(Il2CppArray* handles, int32_t ms, bool exitContext);\n        static int32_t WaitAny_internal(Il2CppArray* handles, int32_t ms, bool exitContext);\n        static bool WaitOne_internal(Il2CppObject* unused, Il2CppIntPtr handlePtr, int32_t ms, bool exitContext);\n#if NET_4_0\n        static int32_t SignalAndWait_Internal40(Il2CppIntPtr toSignal, Il2CppIntPtr toWaitOn, int32_t ms);\n        static int32_t WaitAll_internal40(Il2CppArray* handles, int32_t ms);\n        static int32_t WaitAny_internal40(Il2CppArray* handles, int32_t ms);\n        static int32_t WaitOne_internal40(Il2CppIntPtr handle, int32_t ms);\n#endif\n\n    private:\n        static const int m_waitIntervalMs = 10;\n    };\n} /* namespace Threading */\n} /* namespace System */\n} /* namespace mscorlib */\n} /* namespace icalls */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/il2cpp-api-functions.h",
    "content": "DO_API(void, il2cpp_init, (const char* domain_name));\nDO_API(void, il2cpp_init_utf16, (const Il2CppChar * domain_name));\nDO_API(void, il2cpp_shutdown, ());\nDO_API(void, il2cpp_set_config_dir, (const char *config_path));\nDO_API(void, il2cpp_set_data_dir, (const char *data_path));\nDO_API(void, il2cpp_set_temp_dir, (const char *temp_path));\nDO_API(void, il2cpp_set_commandline_arguments, (int argc, const char* const argv[], const char* basedir));\nDO_API(void, il2cpp_set_commandline_arguments_utf16, (int argc, const Il2CppChar * const argv[], const char* basedir));\nDO_API(void, il2cpp_set_config_utf16, (const Il2CppChar * executablePath));\nDO_API(void, il2cpp_set_config, (const char* executablePath));\n\nDO_API(void, il2cpp_set_memory_callbacks, (Il2CppMemoryCallbacks * callbacks));\nDO_API(const Il2CppImage*, il2cpp_get_corlib, ());\nDO_API(void, il2cpp_add_internal_call, (const char* name, Il2CppMethodPointer method));\nDO_API(Il2CppMethodPointer, il2cpp_resolve_icall, (const char* name));\n\nDO_API(void*, il2cpp_alloc, (size_t size));\nDO_API(void, il2cpp_free, (void* ptr));\n\n// array\nDO_API(Il2CppClass*, il2cpp_array_class_get, (Il2CppClass * element_class, uint32_t rank));\nDO_API(uint32_t, il2cpp_array_length, (Il2CppArray * array));\nDO_API(uint32_t, il2cpp_array_get_byte_length, (Il2CppArray * array));\nDO_API(Il2CppArray*, il2cpp_array_new, (Il2CppClass * elementTypeInfo, il2cpp_array_size_t length));\nDO_API(Il2CppArray*, il2cpp_array_new_specific, (Il2CppClass * arrayTypeInfo, il2cpp_array_size_t length));\nDO_API(Il2CppArray*, il2cpp_array_new_full, (Il2CppClass * array_class, il2cpp_array_size_t * lengths, il2cpp_array_size_t * lower_bounds));\nDO_API(Il2CppClass*, il2cpp_bounded_array_class_get, (Il2CppClass * element_class, uint32_t rank, bool bounded));\nDO_API(int, il2cpp_array_element_size, (const Il2CppClass * array_class));\n\n// assembly\nDO_API(const Il2CppImage*, il2cpp_assembly_get_image, (const Il2CppAssembly * assembly));\n\n// class\nDO_API(const Il2CppType*, il2cpp_class_enum_basetype, (Il2CppClass * klass));\nDO_API(bool, il2cpp_class_is_generic, (const Il2CppClass * klass));\nDO_API(bool, il2cpp_class_is_inflated, (const Il2CppClass * klass));\nDO_API(bool, il2cpp_class_is_assignable_from, (Il2CppClass * klass, Il2CppClass * oklass));\nDO_API(bool, il2cpp_class_is_subclass_of, (Il2CppClass * klass, Il2CppClass * klassc, bool check_interfaces));\nDO_API(bool, il2cpp_class_has_parent, (Il2CppClass * klass, Il2CppClass * klassc));\nDO_API(Il2CppClass*, il2cpp_class_from_il2cpp_type, (const Il2CppType * type));\nDO_API(Il2CppClass*, il2cpp_class_from_name, (const Il2CppImage * image, const char* namespaze, const char *name));\nDO_API(Il2CppClass*, il2cpp_class_from_system_type, (Il2CppReflectionType * type));\nDO_API(Il2CppClass*, il2cpp_class_get_element_class, (Il2CppClass * klass));\nDO_API(const EventInfo*, il2cpp_class_get_events, (Il2CppClass * klass, void* *iter));\nDO_API(FieldInfo*, il2cpp_class_get_fields, (Il2CppClass * klass, void* *iter));\nDO_API(Il2CppClass*, il2cpp_class_get_nested_types, (Il2CppClass * klass, void* *iter));\nDO_API(Il2CppClass*, il2cpp_class_get_interfaces, (Il2CppClass * klass, void* *iter));\nDO_API(const PropertyInfo*, il2cpp_class_get_properties, (Il2CppClass * klass, void* *iter));\nDO_API(const PropertyInfo*, il2cpp_class_get_property_from_name, (Il2CppClass * klass, const char *name));\nDO_API(FieldInfo*, il2cpp_class_get_field_from_name, (Il2CppClass * klass, const char *name));\nDO_API(const MethodInfo*, il2cpp_class_get_methods, (Il2CppClass * klass, void* *iter));\nDO_API(const MethodInfo*, il2cpp_class_get_method_from_name, (Il2CppClass * klass, const char* name, int argsCount));\nDO_API(const char*, il2cpp_class_get_name, (Il2CppClass * klass));\nDO_API(const char*, il2cpp_class_get_namespace, (Il2CppClass * klass));\nDO_API(Il2CppClass*, il2cpp_class_get_parent, (Il2CppClass * klass));\nDO_API(Il2CppClass*, il2cpp_class_get_declaring_type, (Il2CppClass * klass));\nDO_API(int32_t, il2cpp_class_instance_size, (Il2CppClass * klass));\nDO_API(size_t, il2cpp_class_num_fields, (const Il2CppClass * enumKlass));\nDO_API(bool, il2cpp_class_is_valuetype, (const Il2CppClass * klass));\nDO_API(int32_t, il2cpp_class_value_size, (Il2CppClass * klass, uint32_t * align));\nDO_API(bool, il2cpp_class_is_blittable, (const Il2CppClass * klass));\nDO_API(int, il2cpp_class_get_flags, (const Il2CppClass * klass));\nDO_API(bool, il2cpp_class_is_abstract, (const Il2CppClass * klass));\nDO_API(bool, il2cpp_class_is_interface, (const Il2CppClass * klass));\nDO_API(int, il2cpp_class_array_element_size, (const Il2CppClass * klass));\nDO_API(Il2CppClass*, il2cpp_class_from_type, (const Il2CppType * type));\nDO_API(const Il2CppType*, il2cpp_class_get_type, (Il2CppClass * klass));\nDO_API(bool, il2cpp_class_has_attribute, (Il2CppClass * klass, Il2CppClass * attr_class));\nDO_API(bool, il2cpp_class_has_references, (Il2CppClass * klass));\nDO_API(bool, il2cpp_class_is_enum, (const Il2CppClass * klass));\nDO_API(const Il2CppImage*, il2cpp_class_get_image, (Il2CppClass * klass));\nDO_API(const char*, il2cpp_class_get_assemblyname, (const Il2CppClass * klass));\n\n// testing only\nDO_API(size_t, il2cpp_class_get_bitmap_size, (const Il2CppClass * klass));\nDO_API(void, il2cpp_class_get_bitmap, (Il2CppClass * klass, size_t * bitmap));\n\n// stats\nDO_API(bool, il2cpp_stats_dump_to_file, (const char *path));\nDO_API(uint64_t, il2cpp_stats_get_value, (Il2CppStat stat));\n\n// domain\nDO_API(Il2CppDomain*, il2cpp_domain_get, ());\nDO_API(const Il2CppAssembly*, il2cpp_domain_assembly_open, (Il2CppDomain * domain, const char* name));\nDO_API(const Il2CppAssembly**, il2cpp_domain_get_assemblies, (const Il2CppDomain * domain, size_t * size));\n\n// exception\nDO_API(void, il2cpp_raise_exception, (Il2CppException*));\nDO_API(Il2CppException*, il2cpp_exception_from_name_msg, (const Il2CppImage * image, const char *name_space, const char *name, const char *msg));\nDO_API(Il2CppException*, il2cpp_get_exception_argument_null, (const char *arg));\nDO_API(void, il2cpp_format_exception, (const Il2CppException * ex, char* message, int message_size));\nDO_API(void, il2cpp_format_stack_trace, (const Il2CppException * ex, char* output, int output_size));\nDO_API(void, il2cpp_unhandled_exception, (Il2CppException*));\n\n// field\nDO_API(int, il2cpp_field_get_flags, (FieldInfo * field));\nDO_API(const char*, il2cpp_field_get_name, (FieldInfo * field));\nDO_API(Il2CppClass*, il2cpp_field_get_parent, (FieldInfo * field));\nDO_API(size_t, il2cpp_field_get_offset, (FieldInfo * field));\nDO_API(const Il2CppType*, il2cpp_field_get_type, (FieldInfo * field));\nDO_API(void, il2cpp_field_get_value, (Il2CppObject * obj, FieldInfo * field, void *value));\nDO_API(Il2CppObject*, il2cpp_field_get_value_object, (FieldInfo * field, Il2CppObject * obj));\nDO_API(bool, il2cpp_field_has_attribute, (FieldInfo * field, Il2CppClass * attr_class));\nDO_API(void, il2cpp_field_set_value, (Il2CppObject * obj, FieldInfo * field, void *value));\nDO_API(void, il2cpp_field_static_get_value, (FieldInfo * field, void *value));\nDO_API(void, il2cpp_field_static_set_value, (FieldInfo * field, void *value));\nDO_API(void, il2cpp_field_set_value_object, (Il2CppObject * instance, FieldInfo * field, Il2CppObject * value));\n\n// gc\nDO_API(void, il2cpp_gc_collect, (int maxGenerations));\nDO_API(int32_t, il2cpp_gc_collect_a_little, ());\nDO_API(void, il2cpp_gc_disable, ());\nDO_API(void, il2cpp_gc_enable, ());\nDO_API(int64_t, il2cpp_gc_get_used_size, ());\nDO_API(int64_t, il2cpp_gc_get_heap_size, ());\n\n// gchandle\nDO_API(uint32_t, il2cpp_gchandle_new, (Il2CppObject * obj, bool pinned));\nDO_API(uint32_t, il2cpp_gchandle_new_weakref, (Il2CppObject * obj, bool track_resurrection));\nDO_API(Il2CppObject*, il2cpp_gchandle_get_target , (uint32_t gchandle));\nDO_API(void, il2cpp_gchandle_free, (uint32_t gchandle));\n\n// liveness\nDO_API(void*, il2cpp_unity_liveness_calculation_begin, (Il2CppClass * filter, int max_object_count, il2cpp_register_object_callback callback, void* userdata, il2cpp_WorldChangedCallback onWorldStarted, il2cpp_WorldChangedCallback onWorldStopped));\nDO_API(void, il2cpp_unity_liveness_calculation_end, (void* state));\nDO_API(void, il2cpp_unity_liveness_calculation_from_root, (Il2CppObject * root, void* state));\nDO_API(void, il2cpp_unity_liveness_calculation_from_statics, (void* state));\n\n// method\nDO_API(const Il2CppType*, il2cpp_method_get_return_type, (const MethodInfo * method));\nDO_API(Il2CppClass*, il2cpp_method_get_declaring_type, (const MethodInfo * method));\nDO_API(const char*, il2cpp_method_get_name, (const MethodInfo * method));\nDO_API(Il2CppReflectionMethod*, il2cpp_method_get_object, (const MethodInfo * method, Il2CppClass * refclass));\nDO_API(bool, il2cpp_method_is_generic, (const MethodInfo * method));\nDO_API(bool, il2cpp_method_is_inflated, (const MethodInfo * method));\nDO_API(bool, il2cpp_method_is_instance, (const MethodInfo * method));\nDO_API(uint32_t, il2cpp_method_get_param_count, (const MethodInfo * method));\nDO_API(const Il2CppType*, il2cpp_method_get_param, (const MethodInfo * method, uint32_t index));\nDO_API(Il2CppClass*, il2cpp_method_get_class, (const MethodInfo * method));\nDO_API(bool, il2cpp_method_has_attribute, (const MethodInfo * method, Il2CppClass * attr_class));\nDO_API(uint32_t, il2cpp_method_get_flags, (const MethodInfo * method, uint32_t * iflags));\nDO_API(uint32_t, il2cpp_method_get_token, (const MethodInfo * method));\nDO_API(const char*, il2cpp_method_get_param_name, (const MethodInfo * method, uint32_t index));\n\n// profiler\n#if IL2CPP_ENABLE_PROFILER\n\nDO_API(void, il2cpp_profiler_install, (Il2CppProfiler * prof, Il2CppProfileFunc shutdown_callback));\nDO_API(void, il2cpp_profiler_set_events, (Il2CppProfileFlags events));\nDO_API(void, il2cpp_profiler_install_enter_leave, (Il2CppProfileMethodFunc enter, Il2CppProfileMethodFunc fleave));\nDO_API(void, il2cpp_profiler_install_allocation, (Il2CppProfileAllocFunc callback));\nDO_API(void, il2cpp_profiler_install_gc, (Il2CppProfileGCFunc callback, Il2CppProfileGCResizeFunc heap_resize_callback));\n\n#endif\n\n// property\nDO_API(uint32_t, il2cpp_property_get_flags, (PropertyInfo * prop));\nDO_API(const MethodInfo*, il2cpp_property_get_get_method, (PropertyInfo * prop));\nDO_API(const MethodInfo*, il2cpp_property_get_set_method, (PropertyInfo * prop));\nDO_API(const char*, il2cpp_property_get_name, (PropertyInfo * prop));\nDO_API(Il2CppClass*, il2cpp_property_get_parent, (PropertyInfo * prop));\n\n// object\nDO_API(Il2CppClass*, il2cpp_object_get_class, (Il2CppObject * obj));\nDO_API(uint32_t, il2cpp_object_get_size, (Il2CppObject * obj));\nDO_API(const MethodInfo*, il2cpp_object_get_virtual_method, (Il2CppObject * obj, const MethodInfo * method));\nDO_API(Il2CppObject*, il2cpp_object_new, (const Il2CppClass * klass));\nDO_API(void*, il2cpp_object_unbox, (Il2CppObject * obj));\n\nDO_API(Il2CppObject*, il2cpp_value_box, (Il2CppClass * klass, void* data));\n\n// monitor\nDO_API(void, il2cpp_monitor_enter, (Il2CppObject * obj));\nDO_API(bool, il2cpp_monitor_try_enter, (Il2CppObject * obj, uint32_t timeout));\nDO_API(void, il2cpp_monitor_exit, (Il2CppObject * obj));\nDO_API(void, il2cpp_monitor_pulse, (Il2CppObject * obj));\nDO_API(void, il2cpp_monitor_pulse_all, (Il2CppObject * obj));\nDO_API(void, il2cpp_monitor_wait, (Il2CppObject * obj));\nDO_API(bool, il2cpp_monitor_try_wait, (Il2CppObject * obj, uint32_t timeout));\n\n// runtime\nDO_API(Il2CppObject*, il2cpp_runtime_invoke, (const MethodInfo * method, void *obj, void **params, Il2CppException **exc));\nDO_API(Il2CppObject*, il2cpp_runtime_invoke_convert_args, (const MethodInfo * method, void *obj, Il2CppObject **params, int paramCount, Il2CppException **exc));\nDO_API(void, il2cpp_runtime_class_init, (Il2CppClass * klass));\nDO_API(void, il2cpp_runtime_object_init, (Il2CppObject * obj));\n\nDO_API(void, il2cpp_runtime_object_init_exception, (Il2CppObject * obj, Il2CppException** exc));\n\nDO_API(void, il2cpp_runtime_unhandled_exception_policy_set, (Il2CppRuntimeUnhandledExceptionPolicy value));\n\n// string\nDO_API(int32_t, il2cpp_string_length, (Il2CppString * str));\nDO_API(Il2CppChar*, il2cpp_string_chars, (Il2CppString * str));\nDO_API(Il2CppString*, il2cpp_string_new, (const char* str));\nDO_API(Il2CppString*, il2cpp_string_new_len, (const char* str, uint32_t length));\nDO_API(Il2CppString*, il2cpp_string_new_utf16, (const Il2CppChar * text, int32_t len));\nDO_API(Il2CppString*, il2cpp_string_new_wrapper, (const char* str));\nDO_API(Il2CppString*, il2cpp_string_intern, (Il2CppString * str));\nDO_API(Il2CppString*, il2cpp_string_is_interned, (Il2CppString * str));\n\n// thread\nDO_API(char*, il2cpp_thread_get_name, (Il2CppThread * thread, uint32_t * len));\nDO_API(Il2CppThread*, il2cpp_thread_current, ());\nDO_API(Il2CppThread*, il2cpp_thread_attach, (Il2CppDomain * domain));\nDO_API(void, il2cpp_thread_detach, (Il2CppThread * thread));\n\nDO_API(Il2CppThread**, il2cpp_thread_get_all_attached_threads, (size_t * size));\nDO_API(bool, il2cpp_is_vm_thread, (Il2CppThread * thread));\n\n// stacktrace\nDO_API(void, il2cpp_current_thread_walk_frame_stack, (Il2CppFrameWalkFunc func, void* user_data));\nDO_API(void, il2cpp_thread_walk_frame_stack, (Il2CppThread * thread, Il2CppFrameWalkFunc func, void* user_data));\nDO_API(bool, il2cpp_current_thread_get_top_frame, (Il2CppStackFrameInfo & frame));\nDO_API(bool, il2cpp_thread_get_top_frame, (Il2CppThread * thread, Il2CppStackFrameInfo & frame));\nDO_API(bool, il2cpp_current_thread_get_frame_at, (int32_t offset, Il2CppStackFrameInfo & frame));\nDO_API(bool, il2cpp_thread_get_frame_at, (Il2CppThread * thread, int32_t offset, Il2CppStackFrameInfo & frame));\nDO_API(int32_t, il2cpp_current_thread_get_stack_depth, ());\nDO_API(int32_t, il2cpp_thread_get_stack_depth, (Il2CppThread * thread));\n\n// type\nDO_API(Il2CppObject*, il2cpp_type_get_object, (const Il2CppType * type));\nDO_API(int, il2cpp_type_get_type, (const Il2CppType * type));\nDO_API(Il2CppClass*, il2cpp_type_get_class_or_element_class, (const Il2CppType * type));\nDO_API(char*, il2cpp_type_get_name, (const Il2CppType * type));\n\n// image\nDO_API(const Il2CppAssembly*, il2cpp_image_get_assembly, (const Il2CppImage * image));\nDO_API(const char*, il2cpp_image_get_name, (const Il2CppImage * image));\nDO_API(const char*, il2cpp_image_get_filename, (const Il2CppImage * image));\nDO_API(const MethodInfo*, il2cpp_image_get_entry_point, (const Il2CppImage * image));\n\n// Memory information\nDO_API(Il2CppManagedMemorySnapshot*, il2cpp_capture_memory_snapshot, ());\nDO_API(void, il2cpp_free_captured_memory_snapshot, (Il2CppManagedMemorySnapshot * snapshot));\n\nDO_API(void, il2cpp_set_find_plugin_callback, (Il2CppSetFindPlugInCallback method));\n\n// Logging\nDO_API(void, il2cpp_register_log_callback, (Il2CppLogCallback method));\n\n#if IL2CPP_DEBUGGER_ENABLED\n// debug\nDO_API(const Il2CppDebugTypeInfo*, il2cpp_debug_get_class_info, (const Il2CppClass * klass));\nDO_API(const Il2CppDebugDocument*, il2cpp_debug_class_get_document, (const Il2CppDebugTypeInfo * info));\nDO_API(const char*, il2cpp_debug_document_get_filename, (const Il2CppDebugDocument * document));\nDO_API(const char*, il2cpp_debug_document_get_directory, (const Il2CppDebugDocument * document));\nDO_API(const Il2CppDebugMethodInfo*, il2cpp_debug_get_method_info, (const MethodInfo * method));\nDO_API(const Il2CppDebugDocument*, il2cpp_debug_method_get_document, (const Il2CppDebugMethodInfo * info));\nDO_API(const int32_t*, il2cpp_debug_method_get_offset_table, (const Il2CppDebugMethodInfo * info));\nDO_API(size_t, il2cpp_debug_method_get_code_size, (const Il2CppDebugMethodInfo * info));\nDO_API(void, il2cpp_debug_update_frame_il_offset, (int32_t il_offset));\nDO_API(const Il2CppDebugLocalsInfo**, il2cpp_debug_method_get_locals_info, (const Il2CppDebugMethodInfo * info));\nDO_API(const Il2CppClass*, il2cpp_debug_local_get_type, (const Il2CppDebugLocalsInfo * info));\nDO_API(const char*, il2cpp_debug_local_get_name, (const Il2CppDebugLocalsInfo * info));\nDO_API(uint32_t, il2cpp_debug_local_get_start_offset, (const Il2CppDebugLocalsInfo * info));\nDO_API(uint32_t, il2cpp_debug_local_get_end_offset, (const Il2CppDebugLocalsInfo * info));\nDO_API(Il2CppObject*, il2cpp_debug_method_get_param_value, (const Il2CppStackFrameInfo * info, uint32_t position));\nDO_API(Il2CppObject*, il2cpp_debug_frame_get_local_value, (const Il2CppStackFrameInfo * info, uint32_t position));\nDO_API(void*, il2cpp_debug_method_get_breakpoint_data_at, (const Il2CppDebugMethodInfo * info, int64_t uid, int32_t offset));\nDO_API(void, il2cpp_debug_method_set_breakpoint_data_at, (const Il2CppDebugMethodInfo * info, uint64_t location, void *data));\nDO_API(void, il2cpp_debug_method_clear_breakpoint_data, (const Il2CppDebugMethodInfo * info));\nDO_API(void, il2cpp_debug_method_clear_breakpoint_data_at, (const Il2CppDebugMethodInfo * info, uint64_t location));\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/il2cpp-api-types.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <stddef.h>\n\nstruct Il2CppClass;\nstruct Il2CppType;\nstruct EventInfo;\nstruct MethodInfo;\nstruct FieldInfo;\nstruct PropertyInfo;\n\nstruct Il2CppAssembly;\nstruct Il2CppArray;\nstruct Il2CppDelegate;\nstruct Il2CppDomain;\nstruct Il2CppImage;\nstruct Il2CppException;\nstruct Il2CppProfiler;\nstruct Il2CppObject;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionType;\nstruct Il2CppString;\nstruct Il2CppThread;\nstruct Il2CppAsyncResult;\n\n#if IL2CPP_DEBUGGER_ENABLED\nstruct Il2CppDebugDocument;\nstruct Il2CppDebugTypeInfo;\nstruct Il2CppDebugMethodInfo;\nstruct Il2CppDebugLocalsInfo;\n#endif\n\nenum Il2CppProfileFlags\n{\n    IL2CPP_PROFILE_NONE = 0,\n    IL2CPP_PROFILE_APPDOMAIN_EVENTS = 1 << 0,\n    IL2CPP_PROFILE_ASSEMBLY_EVENTS  = 1 << 1,\n    IL2CPP_PROFILE_MODULE_EVENTS    = 1 << 2,\n    IL2CPP_PROFILE_CLASS_EVENTS     = 1 << 3,\n    IL2CPP_PROFILE_JIT_COMPILATION  = 1 << 4,\n    IL2CPP_PROFILE_INLINING         = 1 << 5,\n    IL2CPP_PROFILE_EXCEPTIONS       = 1 << 6,\n    IL2CPP_PROFILE_ALLOCATIONS      = 1 << 7,\n    IL2CPP_PROFILE_GC               = 1 << 8,\n    IL2CPP_PROFILE_THREADS          = 1 << 9,\n    IL2CPP_PROFILE_REMOTING         = 1 << 10,\n    IL2CPP_PROFILE_TRANSITIONS      = 1 << 11,\n    IL2CPP_PROFILE_ENTER_LEAVE      = 1 << 12,\n    IL2CPP_PROFILE_COVERAGE         = 1 << 13,\n    IL2CPP_PROFILE_INS_COVERAGE     = 1 << 14,\n    IL2CPP_PROFILE_STATISTICAL      = 1 << 15,\n    IL2CPP_PROFILE_METHOD_EVENTS    = 1 << 16,\n    IL2CPP_PROFILE_MONITOR_EVENTS   = 1 << 17,\n    IL2CPP_PROFILE_IOMAP_EVENTS = 1 << 18, /* this should likely be removed, too */\n    IL2CPP_PROFILE_GC_MOVES = 1 << 19\n};\n\nenum Il2CppGCEvent\n{\n    IL2CPP_GC_EVENT_START,\n    IL2CPP_GC_EVENT_MARK_START,\n    IL2CPP_GC_EVENT_MARK_END,\n    IL2CPP_GC_EVENT_RECLAIM_START,\n    IL2CPP_GC_EVENT_RECLAIM_END,\n    IL2CPP_GC_EVENT_END,\n    IL2CPP_GC_EVENT_PRE_STOP_WORLD,\n    IL2CPP_GC_EVENT_POST_STOP_WORLD,\n    IL2CPP_GC_EVENT_PRE_START_WORLD,\n    IL2CPP_GC_EVENT_POST_START_WORLD\n};\n\nenum Il2CppStat\n{\n    IL2CPP_STAT_NEW_OBJECT_COUNT,\n    IL2CPP_STAT_INITIALIZED_CLASS_COUNT,\n    //IL2CPP_STAT_GENERIC_VTABLE_COUNT,\n    //IL2CPP_STAT_USED_CLASS_COUNT,\n    IL2CPP_STAT_METHOD_COUNT,\n    //IL2CPP_STAT_CLASS_VTABLE_SIZE,\n    IL2CPP_STAT_CLASS_STATIC_DATA_SIZE,\n    IL2CPP_STAT_GENERIC_INSTANCE_COUNT,\n    IL2CPP_STAT_GENERIC_CLASS_COUNT,\n    IL2CPP_STAT_INFLATED_METHOD_COUNT,\n    IL2CPP_STAT_INFLATED_TYPE_COUNT,\n    //IL2CPP_STAT_DELEGATE_CREATIONS,\n    //IL2CPP_STAT_MINOR_GC_COUNT,\n    //IL2CPP_STAT_MAJOR_GC_COUNT,\n    //IL2CPP_STAT_MINOR_GC_TIME_USECS,\n    //IL2CPP_STAT_MAJOR_GC_TIME_USECS\n};\n\nenum StackFrameType\n{\n    FRAME_TYPE_MANAGED = 0,\n    FRAME_TYPE_DEBUGGER_INVOKE = 1,\n    FRAME_TYPE_MANAGED_TO_NATIVE = 2,\n    FRAME_TYPE_SENTINEL = 3\n};\n\nenum Il2CppRuntimeUnhandledExceptionPolicy\n{\n    IL2CPP_UNHANDLED_POLICY_LEGACY,\n    IL2CPP_UNHANDLED_POLICY_CURRENT\n};\n\nstruct Il2CppStackFrameInfo\n{\n    const MethodInfo *method;\n\n#if IL2CPP_DEBUGGER_ENABLED\n    int32_t id;\n    StackFrameType type;\n    uint32_t il_offset;\n    void *this_ptr;\n    void **params;\n    uint32_t params_count;\n    void **locals;\n    uint32_t locals_count;\n#endif\n};\n\n#if defined(RUNTIME_MONO)\n\n#include \"mono-api.h\"\n\n#endif // defined(RUNTIME_MONO)\n\ntypedef struct\n{\n    void* (*malloc_func)(size_t size);\n    void* (*aligned_malloc_func)(size_t size, size_t alignment);\n    void (*free_func)(void *ptr);\n    void (*aligned_free_func)(void *ptr);\n    void* (*calloc_func)(size_t nmemb, size_t size);\n    void* (*realloc_func)(void *ptr, size_t size);\n    void* (*aligned_realloc_func)(void *ptr, size_t size, size_t alignment);\n} Il2CppMemoryCallbacks;\n\n#if !__SNC__ // SNC doesn't like the following define: \"warning 1576: predefined meaning of __has_feature discarded\"\n#ifndef __has_feature // clang specific __has_feature check\n#define __has_feature(x) 0 // Compatibility with non-clang compilers.\n#endif\n#endif\n\n#if _MSC_VER\ntypedef wchar_t Il2CppChar;\n#elif __has_feature(cxx_unicode_literals)\ntypedef char16_t Il2CppChar;\n#else\ntypedef uint16_t Il2CppChar;\n#endif\n\n#if _MSC_VER\ntypedef wchar_t Il2CppNativeChar;\n#define IL2CPP_NATIVE_STRING(str) L##str\n#else\ntypedef char Il2CppNativeChar;\n#define IL2CPP_NATIVE_STRING(str) str\n#endif\n\ntypedef void (*il2cpp_register_object_callback)(Il2CppObject** arr, int size, void* userdata);\ntypedef void (*il2cpp_WorldChangedCallback)();\ntypedef void (*Il2CppFrameWalkFunc) (const Il2CppStackFrameInfo *info, void *user_data);\ntypedef void (*Il2CppProfileFunc) (Il2CppProfiler* prof);\ntypedef void (*Il2CppProfileMethodFunc) (Il2CppProfiler* prof, const MethodInfo *method);\ntypedef void (*Il2CppProfileAllocFunc) (Il2CppProfiler* prof, Il2CppObject *obj, Il2CppClass *klass);\ntypedef void (*Il2CppProfileGCFunc) (Il2CppProfiler* prof, Il2CppGCEvent event, int generation);\ntypedef void (*Il2CppProfileGCResizeFunc) (Il2CppProfiler* prof, int64_t new_size);\n\ntypedef const Il2CppNativeChar* (*Il2CppSetFindPlugInCallback)(const Il2CppNativeChar*);\ntypedef void (*Il2CppLogCallback)(const char*);\n\nstruct Il2CppManagedMemorySnapshot;\n\ntypedef void (*Il2CppMethodPointer)();\ntypedef int32_t il2cpp_array_size_t;\n"
  },
  {
    "path": "unity_decoder/libil2cpp/il2cpp-api.cpp",
    "content": "#include \"il2cpp-api.h\"\n#include \"object-internals.h\"\n\n#include \"vm/Array.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/Class.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Field.h\"\n#include \"vm/Image.h\"\n#include \"vm/InternalCalls.h\"\n#include \"vm/Liveness.h\"\n#include \"vm/MemoryInformation.h\"\n#include \"vm/Method.h\"\n#include \"vm/Monitor.h\"\n#include \"vm/Object.h\"\n#include \"vm/Path.h\"\n#include \"vm/PlatformInvoke.h\"\n#include \"vm/Profiler.h\"\n#include \"vm/Property.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/StackTrace.h\"\n#include \"vm/String.h\"\n#include \"vm/Thread.h\"\n#include \"vm/ThreadPool.h\"\n#include \"vm/Type.h\"\n#include \"utils/Exception.h\"\n#include \"utils/Logging.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/Runtime.h\"\n#include \"utils/Environment.h\"\n\n#if IL2CPP_DEBUGGER_ENABLED\n    #include \"il2cpp-debugger.h\"\n    #include \"vm/Debug.h\"\n#endif\n\n#include \"gc/GarbageCollector.h\"\n#include \"gc/GCHandle.h\"\n\n#include <locale.h>\n#include <fstream>\n\nusing namespace il2cpp::vm;\nusing il2cpp::utils::Memory;\nusing namespace il2cpp::gc;\n\n#if IL2CPP_API_DYNAMIC_NO_DLSYM\n#include <map>\n\nstruct SymbolCompare : public std::binary_function<char*, char*, bool>\n{\n    bool operator()(const char* lhs, const char* rhs) const\n    {\n        return strcmp(lhs, rhs) < 0;\n    }\n};\n\ntypedef std::map<const char*, void*, SymbolCompare> SymbolTable;\nstatic SymbolTable s_SymbolTable;\n\nstatic void RegisterAPIFunction(const char* name, void* symbol)\n{\n    s_SymbolTable.insert(std::make_pair(name, symbol));\n}\n\nvoid il2cpp_api_register_symbols(void)\n{\n    #define DO_API(r, n, p) RegisterAPIFunction(#n, (void*)n);\n    #include \"il2cpp-api-functions.h\"\n    #undef DO_API\n}\n\nvoid* il2cpp_api_lookup_symbol(const char* name)\n{\n    SymbolTable::iterator it = s_SymbolTable.find(name);\n    if (it != s_SymbolTable.end())\n    {\n        return it->second;\n    }\n    return NULL;\n}\n\n#endif // IL2CPP_API_DYNAMIC_NO_DLSYM\n\nvoid il2cpp_init(const char* domain_name)\n{\n    // Use environment's default locale\n    setlocale(LC_ALL, \"\");\n\n#if IL2CPP_DEBUGGER_ENABLED\n    if (!il2cpp_debugger_agent_is_initialized())\n        il2cpp_debugger_agent_init();\n#endif\n\n    // NOTE(gab): the runtime_version needs to change once we\n    // will support multiple runtimes.\n    // For now we default to the one used by unity and don't\n    // allow the callers to change it.\n#if NET_4_0\n    Runtime::Init(domain_name, \"v4.0.30319\");\n#else\n    Runtime::Init(domain_name, \"v2.0.50727\");\n#endif\n\n#if IL2CPP_DEBUGGER_ENABLED\n    il2cpp_debugger_notify_vm_start();\n#endif\n}\n\nvoid il2cpp_init_utf16(const Il2CppChar* domain_name)\n{\n    return il2cpp_init(il2cpp::utils::StringUtils::Utf16ToUtf8(domain_name).c_str());\n}\n\nvoid il2cpp_shutdown()\n{\n#if IL2CPP_DEBUGGER_ENABLED\n    il2cpp_debugger_notify_vm_death();\n#endif\n\n    Runtime::Shutdown();\n\n#if IL2CPP_DEBUGGER_ENABLED\n    il2cpp_debugger_agent_dispose();\n#endif\n}\n\nvoid il2cpp_set_config_dir(const char *config_path)\n{\n    il2cpp::vm::Runtime::SetConfigDir(config_path);\n}\n\nvoid il2cpp_set_data_dir(const char *data_path)\n{\n    il2cpp::utils::Runtime::SetDataDir(data_path);\n}\n\nvoid il2cpp_set_temp_dir(const char *temp_dir)\n{\n    il2cpp::vm::Path::SetTempPath(temp_dir);\n}\n\nvoid il2cpp_set_commandline_arguments(int argc, const char* const argv[], const char* basedir)\n{\n    il2cpp::utils::Environment::SetMainArgs(argv, argc);\n}\n\nvoid il2cpp_set_commandline_arguments_utf16(int argc, const Il2CppChar* const argv[], const char* basedir)\n{\n    il2cpp::utils::Environment::SetMainArgs(argv, argc);\n}\n\nvoid il2cpp_set_config_utf16(const Il2CppChar* executablePath)\n{\n    il2cpp::vm::Runtime::SetConfigUtf16(executablePath);\n}\n\nvoid il2cpp_set_config(const char* executablePath)\n{\n    il2cpp::vm::Runtime::SetConfig(executablePath);\n}\n\nvoid il2cpp_set_memory_callbacks(Il2CppMemoryCallbacks* callbacks)\n{\n    Memory::SetMemoryCallbacks(callbacks);\n}\n\nconst Il2CppImage* il2cpp_get_corlib()\n{\n    return Image::GetCorlib();\n}\n\nvoid il2cpp_add_internal_call(const char* name, Il2CppMethodPointer method)\n{\n    return InternalCalls::Add(name, method);\n}\n\nIl2CppMethodPointer il2cpp_resolve_icall(const char* name)\n{\n    return InternalCalls::Resolve(name);\n}\n\nvoid* il2cpp_alloc(size_t size)\n{\n    return IL2CPP_MALLOC(size);\n}\n\nvoid il2cpp_free(void* ptr)\n{\n    IL2CPP_FREE(ptr);\n}\n\n// array\n\nIl2CppClass *il2cpp_array_class_get(Il2CppClass *element_class, uint32_t rank)\n{\n    return Class::GetArrayClass(element_class, rank);\n}\n\nuint32_t il2cpp_array_length(Il2CppArray* array)\n{\n    return Array::GetLength(array);\n}\n\nuint32_t il2cpp_array_get_byte_length(Il2CppArray *array)\n{\n    return Array::GetByteLength(array);\n}\n\nIl2CppArray* il2cpp_array_new(Il2CppClass *elementTypeInfo, il2cpp_array_size_t length)\n{\n    return Array::New(elementTypeInfo, length);\n}\n\nIl2CppArray* il2cpp_array_new_specific(Il2CppClass *arrayTypeInfo, il2cpp_array_size_t length)\n{\n    return Array::NewSpecific(arrayTypeInfo, length);\n}\n\nIl2CppArray* il2cpp_array_new_full(Il2CppClass *array_class, il2cpp_array_size_t *lengths, il2cpp_array_size_t *lower_bounds)\n{\n    return Array::NewFull(array_class, lengths, lower_bounds);\n}\n\nIl2CppClass* il2cpp_bounded_array_class_get(Il2CppClass *element_class, uint32_t rank, bool bounded)\n{\n    return Class::GetBoundedArrayClass(element_class, rank, bounded);\n}\n\nint il2cpp_array_element_size(const Il2CppClass* klass)\n{\n    return Array::GetElementSize(klass);\n}\n\n// assembly\nconst Il2CppImage* il2cpp_assembly_get_image(const Il2CppAssembly *assembly)\n{\n    return Assembly::GetImage(assembly);\n}\n\n// class\n\nconst Il2CppType* il2cpp_class_enum_basetype(Il2CppClass *klass)\n{\n    return Class::GetEnumBaseType(klass);\n}\n\nIl2CppClass* il2cpp_class_from_system_type(Il2CppReflectionType *type)\n{\n    return Class::FromSystemType(type);\n}\n\nbool il2cpp_class_is_generic(const Il2CppClass *klass)\n{\n    return Class::IsGeneric(klass);\n}\n\nbool il2cpp_class_is_inflated(const Il2CppClass *klass)\n{\n    return Class::IsInflated(klass);\n}\n\nbool il2cpp_class_is_assignable_from(Il2CppClass *klass, Il2CppClass *oklass)\n{\n    return Class::IsAssignableFrom(klass, oklass);\n}\n\nbool il2cpp_class_is_subclass_of(Il2CppClass *klass, Il2CppClass *klassc, bool check_interfaces)\n{\n    return Class::IsSubclassOf(klass, klassc, check_interfaces);\n}\n\nbool il2cpp_class_has_parent(Il2CppClass *klass, Il2CppClass *klassc)\n{\n    return Class::HasParent(klass, klassc);\n}\n\nIl2CppClass* il2cpp_class_from_il2cpp_type(const Il2CppType* type)\n{\n    return Class::FromIl2CppType(type);\n}\n\nIl2CppClass* il2cpp_class_from_name(const Il2CppImage* image, const char* namespaze, const char *name)\n{\n    return Class::FromName(image, namespaze, name);\n}\n\nIl2CppClass* il2cpp_class_get_element_class(Il2CppClass *klass)\n{\n    return Class::GetElementClass(klass);\n}\n\nconst EventInfo* il2cpp_class_get_events(Il2CppClass *klass, void* *iter)\n{\n    return Class::GetEvents(klass, iter);\n}\n\nFieldInfo* il2cpp_class_get_fields(Il2CppClass *klass, void* *iter)\n{\n    return Class::GetFields(klass, iter);\n}\n\nIl2CppClass* il2cpp_class_get_nested_types(Il2CppClass *klass, void* *iter)\n{\n    return Class::GetNestedTypes(klass, iter);\n}\n\nIl2CppClass* il2cpp_class_get_interfaces(Il2CppClass *klass, void* *iter)\n{\n    return Class::GetInterfaces(klass, iter);\n}\n\nconst PropertyInfo* il2cpp_class_get_properties(Il2CppClass *klass, void* *iter)\n{\n    return Class::GetProperties(klass, iter);\n}\n\nconst PropertyInfo* il2cpp_class_get_property_from_name(Il2CppClass *klass, const char *name)\n{\n    return Class::GetPropertyFromName(klass, name);\n}\n\nFieldInfo* il2cpp_class_get_field_from_name(Il2CppClass* klass, const char *name)\n{\n    return Class::GetFieldFromName(klass, name);\n}\n\nconst MethodInfo* il2cpp_class_get_methods(Il2CppClass *klass, void* *iter)\n{\n    return Class::GetMethods(klass, iter);\n}\n\nconst MethodInfo* il2cpp_class_get_method_from_name(Il2CppClass *klass, const char* name, int argsCount)\n{\n    return Class::GetMethodFromName(klass, name, argsCount);\n}\n\nconst char* il2cpp_class_get_name(Il2CppClass *klass)\n{\n    return Class::GetName(klass);\n}\n\nconst char* il2cpp_class_get_namespace(Il2CppClass *klass)\n{\n    return Class::GetNamespace(klass);\n}\n\nIl2CppClass* il2cpp_class_get_parent(Il2CppClass *klass)\n{\n    return Class::GetParent(klass);\n}\n\nIl2CppClass* il2cpp_class_get_declaring_type(Il2CppClass* klass)\n{\n    return Class::GetDeclaringType(klass);\n}\n\nint32_t il2cpp_class_instance_size(Il2CppClass *klass)\n{\n    return Class::GetInstanceSize(klass);\n}\n\nsize_t il2cpp_class_num_fields(const Il2CppClass* klass)\n{\n    return Class::GetNumFields(klass);\n}\n\nbool il2cpp_class_is_valuetype(const Il2CppClass* klass)\n{\n    return Class::IsValuetype(klass);\n}\n\nbool il2cpp_class_is_blittable(const Il2CppClass* klass)\n{\n    return Class::IsBlittable(klass);\n}\n\nint32_t il2cpp_class_value_size(Il2CppClass *klass, uint32_t *align)\n{\n    return Class::GetValueSize(klass, align);\n}\n\nint il2cpp_class_get_flags(const Il2CppClass *klass)\n{\n    return Class::GetFlags(klass);\n}\n\nbool il2cpp_class_is_abstract(const Il2CppClass *klass)\n{\n    return Class::IsAbstract(klass);\n}\n\nbool il2cpp_class_is_interface(const Il2CppClass *klass)\n{\n    return Class::IsInterface(klass);\n}\n\nint il2cpp_class_array_element_size(const Il2CppClass *klass)\n{\n    return Class::GetArrayElementSize(klass);\n}\n\nIl2CppClass* il2cpp_class_from_type(const Il2CppType *type)\n{\n    return Class::FromIl2CppType(type);\n}\n\nconst Il2CppType* il2cpp_class_get_type(Il2CppClass *klass)\n{\n    return Class::GetType(klass);\n}\n\nbool il2cpp_class_has_attribute(Il2CppClass *klass, Il2CppClass *attr_class)\n{\n    return Class::HasAttribute(klass, attr_class);\n}\n\nbool il2cpp_class_has_references(Il2CppClass *klass)\n{\n    return Class::HasReferences(klass);\n}\n\nbool il2cpp_class_is_enum(const Il2CppClass *klass)\n{\n    return Class::IsEnum(klass);\n}\n\nconst Il2CppImage* il2cpp_class_get_image(Il2CppClass* klass)\n{\n    return Class::GetImage(klass);\n}\n\nconst char *il2cpp_class_get_assemblyname(const Il2CppClass *klass)\n{\n    return Class::GetAssemblyName(klass);\n}\n\n// testing only\nsize_t il2cpp_class_get_bitmap_size(const Il2CppClass *klass)\n{\n    return Class::GetBitmapSize(klass);\n}\n\nvoid il2cpp_class_get_bitmap(Il2CppClass *klass, size_t* bitmap)\n{\n    size_t dummy = 0;\n    Class::GetBitmap(klass, bitmap, dummy);\n}\n\n// stats\n\nextern Il2CppRuntimeStats il2cpp_runtime_stats;\n\nbool il2cpp_stats_dump_to_file(const char *path)\n{\n    std::fstream fs;\n\n    fs.open(path, std::fstream::out | std::fstream::trunc);\n\n    fs << \"New object count: \" << il2cpp_stats_get_value(IL2CPP_STAT_NEW_OBJECT_COUNT) << \"\\n\";\n    fs << \"Method count: \" << il2cpp_stats_get_value(IL2CPP_STAT_METHOD_COUNT) << \"\\n\";\n    fs << \"Class static data size: \" << il2cpp_stats_get_value(IL2CPP_STAT_CLASS_STATIC_DATA_SIZE) << \"\\n\";\n    fs << \"Inflated method count: \" << il2cpp_stats_get_value(IL2CPP_STAT_INFLATED_METHOD_COUNT) << \"\\n\";\n    fs << \"Inflated type count: \" << il2cpp_stats_get_value(IL2CPP_STAT_INFLATED_TYPE_COUNT) << \"\\n\";\n    fs << \"Initialized class count: \" << il2cpp_stats_get_value(IL2CPP_STAT_INITIALIZED_CLASS_COUNT) << \"\\n\";\n    fs << \"Generic instance count: \" << il2cpp_stats_get_value(IL2CPP_STAT_GENERIC_INSTANCE_COUNT) << \"\\n\";\n    fs << \"Generic class count: \" << il2cpp_stats_get_value(IL2CPP_STAT_GENERIC_CLASS_COUNT) << \"\\n\";\n\n    fs.close();\n\n    return true;\n}\n\nuint64_t il2cpp_stats_get_value(Il2CppStat stat)\n{\n    switch (stat)\n    {\n        case IL2CPP_STAT_NEW_OBJECT_COUNT:\n            return il2cpp_runtime_stats.new_object_count;\n\n        case IL2CPP_STAT_INITIALIZED_CLASS_COUNT:\n            return il2cpp_runtime_stats.initialized_class_count;\n\n        /*case IL2CPP_STAT_GENERIC_VTABLE_COUNT:\n            return il2cpp_runtime_stats.generic_vtable_count;\n\n        case IL2CPP_STAT_USED_CLASS_COUNT:\n            return il2cpp_runtime_stats.used_class_count;*/\n\n        case IL2CPP_STAT_METHOD_COUNT:\n            return il2cpp_runtime_stats.method_count;\n\n        /*case IL2CPP_STAT_CLASS_VTABLE_SIZE:\n            return il2cpp_runtime_stats.class_vtable_size;*/\n\n        case IL2CPP_STAT_CLASS_STATIC_DATA_SIZE:\n            return il2cpp_runtime_stats.class_static_data_size;\n\n        case IL2CPP_STAT_GENERIC_INSTANCE_COUNT:\n            return il2cpp_runtime_stats.generic_instance_count;\n\n        case IL2CPP_STAT_GENERIC_CLASS_COUNT:\n            return il2cpp_runtime_stats.generic_class_count;\n\n        case IL2CPP_STAT_INFLATED_METHOD_COUNT:\n            return il2cpp_runtime_stats.inflated_method_count;\n\n        case IL2CPP_STAT_INFLATED_TYPE_COUNT:\n            return il2cpp_runtime_stats.inflated_type_count;\n\n            /*case IL2CPP_STAT_DELEGATE_CREATIONS:\n                return il2cpp_runtime_stats.delegate_creations;\n\n            case IL2CPP_STAT_MINOR_GC_COUNT:\n                return il2cpp_runtime_stats.minor_gc_count;\n\n            case IL2CPP_STAT_MAJOR_GC_COUNT:\n                return il2cpp_runtime_stats.major_gc_count;\n\n            case IL2CPP_STAT_MINOR_GC_TIME_USECS:\n                return il2cpp_runtime_stats.minor_gc_time_usecs;\n\n            case IL2CPP_STAT_MAJOR_GC_TIME_USECS:\n                return il2cpp_runtime_stats.major_gc_time_usecs;*/\n    }\n\n    return 0;\n}\n\n// domain\nIl2CppDomain* il2cpp_domain_get()\n{\n    return Domain::GetCurrent();\n}\n\nconst Il2CppAssembly* il2cpp_domain_assembly_open(Il2CppDomain *domain, const char *name)\n{\n    return Assembly::Load(name);\n}\n\nconst Il2CppAssembly** il2cpp_domain_get_assemblies(const Il2CppDomain* domain, size_t* size)\n{\n    il2cpp::vm::AssemblyVector* assemblies = Assembly::GetAllAssemblies();\n    *size = assemblies->size();\n    return &(*assemblies)[0];\n}\n\n// exception\n\nvoid il2cpp_raise_exception(Il2CppException* exc)\n{\n    Exception::Raise(exc);\n}\n\nIl2CppException* il2cpp_exception_from_name_msg(const Il2CppImage* image, const char *name_space, const char *name, const char *msg)\n{\n    return Exception::FromNameMsg(image, name_space, name, msg);\n}\n\nIl2CppException* il2cpp_get_exception_argument_null(const char *arg)\n{\n    return Exception::GetArgumentNullException(arg);\n}\n\nvoid il2cpp_format_exception(const Il2CppException* ex, char* message, int message_size)\n{\n    strncpy(message, il2cpp::utils::Exception::FormatException(ex).c_str(), message_size);\n}\n\nvoid il2cpp_format_stack_trace(const Il2CppException* ex, char* output, int output_size)\n{\n    strncpy(output, il2cpp::utils::Exception::FormatStackTrace(ex).c_str(), output_size);\n}\n\nvoid il2cpp_unhandled_exception(Il2CppException* exc)\n{\n    Runtime::UnhandledException(exc);\n}\n\n// field\n\nconst char* il2cpp_field_get_name(FieldInfo *field)\n{\n    return Field::GetName(field);\n}\n\nint il2cpp_field_get_flags(FieldInfo *field)\n{\n    return Field::GetFlags(field);\n}\n\nIl2CppClass* il2cpp_field_get_parent(FieldInfo *field)\n{\n    return Field::GetParent(field);\n}\n\nsize_t il2cpp_field_get_offset(FieldInfo *field)\n{\n    return Field::GetOffset(field);\n}\n\nconst Il2CppType* il2cpp_field_get_type(FieldInfo *field)\n{\n    return Field::GetType(field);\n}\n\nvoid il2cpp_field_get_value(Il2CppObject *obj, FieldInfo *field, void *value)\n{\n    return Field::GetValue(obj, field, value);\n}\n\nIl2CppObject* il2cpp_field_get_value_object(FieldInfo *field, Il2CppObject *obj)\n{\n    return Field::GetValueObject(field, obj);\n}\n\nbool il2cpp_field_has_attribute(FieldInfo *field, Il2CppClass *attr_class)\n{\n    return Field::HasAttribute(field, attr_class);\n}\n\nvoid il2cpp_field_set_value(Il2CppObject *obj, FieldInfo *field, void *value)\n{\n    Field::SetValue(obj, field, value);\n}\n\nvoid il2cpp_field_set_value_object(Il2CppObject* objectInstance, FieldInfo* field, Il2CppObject* value)\n{\n    Field::SetInstanceFieldValueObject(objectInstance, field, value);\n}\n\nvoid il2cpp_field_static_get_value(FieldInfo *field, void *value)\n{\n    Field::StaticGetValue(field, value);\n}\n\nvoid il2cpp_field_static_set_value(FieldInfo *field, void *value)\n{\n    Field::StaticSetValue(field, value);\n}\n\n// gc\nvoid il2cpp_gc_collect(int maxGenerations)\n{\n    GarbageCollector::Collect(maxGenerations);\n}\n\nint32_t il2cpp_gc_collect_a_little()\n{\n    return GarbageCollector::CollectALittle();\n}\n\nvoid il2cpp_gc_enable()\n{\n    GarbageCollector::Enable();\n}\n\nvoid il2cpp_gc_disable()\n{\n    GarbageCollector::Disable();\n}\n\nint64_t il2cpp_gc_get_used_size()\n{\n    return GarbageCollector::GetUsedHeapSize();\n}\n\nint64_t il2cpp_gc_get_heap_size()\n{\n    return GarbageCollector::GetAllocatedHeapSize();\n}\n\n// gchandle\n\nuint32_t il2cpp_gchandle_new(Il2CppObject *obj, bool pinned)\n{\n    return GCHandle::New(obj, pinned);\n}\n\nuint32_t il2cpp_gchandle_new_weakref(Il2CppObject *obj, bool track_resurrection)\n{\n    return GCHandle::NewWeakref(obj, track_resurrection);\n}\n\nIl2CppObject* il2cpp_gchandle_get_target(uint32_t gchandle)\n{\n    return GCHandle::GetTarget(gchandle);\n}\n\nvoid il2cpp_gchandle_free(uint32_t gchandle)\n{\n    GCHandle::Free(gchandle);\n}\n\n// liveness\n\nvoid* il2cpp_unity_liveness_calculation_begin(Il2CppClass* filter, int max_object_count, il2cpp_register_object_callback callback, void* userdata, il2cpp_WorldChangedCallback onWorldStarted, il2cpp_WorldChangedCallback onWorldStopped)\n{\n    return Liveness::Begin(filter, max_object_count, callback, userdata, onWorldStarted, onWorldStopped);\n}\n\nvoid il2cpp_unity_liveness_calculation_end(void* state)\n{\n    Liveness::End(state);\n}\n\nvoid il2cpp_unity_liveness_calculation_from_root(Il2CppObject* root, void* state)\n{\n    Liveness::FromRoot(root, state);\n}\n\nvoid il2cpp_unity_liveness_calculation_from_statics(void* state)\n{\n    Liveness::FromStatics(state);\n}\n\n// method\n\nconst Il2CppType* il2cpp_method_get_return_type(const MethodInfo* method)\n{\n    return Method::GetReturnType(method);\n}\n\nIl2CppReflectionMethod* il2cpp_method_get_object(const MethodInfo *method, Il2CppClass *refclass)\n{\n    return Reflection::GetMethodObject(method, refclass);\n}\n\nconst char* il2cpp_method_get_name(const MethodInfo *method)\n{\n    return Method::GetName(method);\n}\n\nbool il2cpp_method_is_generic(const MethodInfo *method)\n{\n    return Method::IsGeneric(method);\n}\n\nbool il2cpp_method_is_inflated(const MethodInfo *method)\n{\n    return Method::IsInflated(method);\n}\n\nbool il2cpp_method_is_instance(const MethodInfo *method)\n{\n    return Method::IsInstance(method);\n}\n\nuint32_t il2cpp_method_get_param_count(const MethodInfo *method)\n{\n    return Method::GetParamCount(method);\n}\n\nconst Il2CppType* il2cpp_method_get_param(const MethodInfo *method, uint32_t index)\n{\n    return Method::GetParam(method, index);\n}\n\nIl2CppClass* il2cpp_method_get_class(const MethodInfo *method)\n{\n    return Method::GetClass(method);\n}\n\nbool il2cpp_method_has_attribute(const MethodInfo *method, Il2CppClass *attr_class)\n{\n    return Method::HasAttribute(method, attr_class);\n}\n\nIl2CppClass* il2cpp_method_get_declaring_type(const MethodInfo* method)\n{\n    return Method::GetDeclaringType(method);\n}\n\nuint32_t il2cpp_method_get_flags(const MethodInfo *method, uint32_t *iflags)\n{\n    if (iflags != 0)\n        *iflags = Method::GetImplementationFlags(method);\n\n    return Method::GetFlags(method);\n}\n\nuint32_t il2cpp_method_get_token(const MethodInfo *method)\n{\n    return Method::GetToken(method);\n}\n\nconst char *il2cpp_method_get_param_name(const MethodInfo *method, uint32_t index)\n{\n    return Method::GetParamName(method, index);\n}\n\n// profiler\n\n#if IL2CPP_ENABLE_PROFILER\n\nvoid il2cpp_profiler_install(Il2CppProfiler *prof, Il2CppProfileFunc shutdown_callback)\n{\n    Profiler::Install(prof, shutdown_callback);\n}\n\nvoid il2cpp_profiler_set_events(Il2CppProfileFlags events)\n{\n    Profiler::SetEvents(events);\n}\n\nvoid il2cpp_profiler_install_enter_leave(Il2CppProfileMethodFunc enter, Il2CppProfileMethodFunc fleave)\n{\n    Profiler::InstallEnterLeave(enter, fleave);\n}\n\nvoid il2cpp_profiler_install_allocation(Il2CppProfileAllocFunc callback)\n{\n    Profiler::InstallAllocation(callback);\n}\n\nvoid il2cpp_profiler_install_gc(Il2CppProfileGCFunc callback, Il2CppProfileGCResizeFunc heap_resize_callback)\n{\n    Profiler::InstallGC(callback, heap_resize_callback);\n}\n\n#endif\n\n// property\n\nconst char* il2cpp_property_get_name(PropertyInfo *prop)\n{\n    return Property::GetName(prop);\n}\n\nconst MethodInfo* il2cpp_property_get_get_method(PropertyInfo *prop)\n{\n    return Property::GetGetMethod(prop);\n}\n\nconst MethodInfo* il2cpp_property_get_set_method(PropertyInfo *prop)\n{\n    return Property::GetSetMethod(prop);\n}\n\nIl2CppClass* il2cpp_property_get_parent(PropertyInfo *prop)\n{\n    return Property::GetParent(prop);\n}\n\nuint32_t il2cpp_property_get_flags(PropertyInfo *prop)\n{\n    return Property::GetFlags(prop);\n}\n\n// object\n\nIl2CppClass* il2cpp_object_get_class(Il2CppObject* obj)\n{\n    return Object::GetClass(obj);\n}\n\nuint32_t il2cpp_object_get_size(Il2CppObject* obj)\n{\n    return Object::GetSize(obj);\n}\n\nconst MethodInfo* il2cpp_object_get_virtual_method(Il2CppObject *obj, const MethodInfo *method)\n{\n    return Object::GetVirtualMethod(obj, method);\n}\n\nIl2CppObject* il2cpp_object_new(const Il2CppClass *klass)\n{\n    try\n    {\n        return Object::New(const_cast<Il2CppClass*>(klass));\n    }\n    catch (const Il2CppExceptionWrapper&)\n    {\n        // If a static constructor throws, that exception will occur here.\n        // We don't want that to escape across the embedding API.\n        return NULL;\n    }\n}\n\nvoid* il2cpp_object_unbox(Il2CppObject* obj)\n{\n    return Object::Unbox(obj);\n}\n\nIl2CppObject* il2cpp_value_box(Il2CppClass *klass, void* data)\n{\n    return Object::Box(klass, data);\n}\n\n// monitor\nvoid il2cpp_monitor_enter(Il2CppObject* obj)\n{\n    Monitor::Enter(obj);\n}\n\nbool il2cpp_monitor_try_enter(Il2CppObject* obj, uint32_t timeout)\n{\n    return Monitor::TryEnter(obj, timeout);\n}\n\nvoid il2cpp_monitor_exit(Il2CppObject* obj)\n{\n    Monitor::Exit(obj);\n}\n\nvoid il2cpp_monitor_pulse(Il2CppObject* obj)\n{\n    Monitor::Pulse(obj);\n}\n\nvoid il2cpp_monitor_pulse_all(Il2CppObject* obj)\n{\n    Monitor::PulseAll(obj);\n}\n\nvoid il2cpp_monitor_wait(Il2CppObject* obj)\n{\n    Monitor::Wait(obj);\n}\n\nbool il2cpp_monitor_try_wait(Il2CppObject* obj, uint32_t timeout)\n{\n    return Monitor::TryWait(obj, timeout);\n}\n\n// runtime\n\nIl2CppObject* il2cpp_runtime_invoke_convert_args(const MethodInfo *method, void *obj, Il2CppObject **params, int paramCount, Il2CppException **exc)\n{\n    // Our embedding API has historically taken pointers to unboxed value types, rather than Il2CppObjects.\n    // However, with the introduction of adjustor thunks, our invokees expect us to pass them Il2CppObject*, or at least something that\n    // ressembles boxed value type. Since it's not going to access any of the Il2CppObject* fields,\n    // it's fine to just subtract sizeof(Il2CppObject) from obj pointer\n    if (method->declaring_type->valuetype)\n        obj = static_cast<Il2CppObject*>(obj) - 1;\n\n    return Runtime::InvokeConvertArgs(method, obj, params, paramCount, exc);\n}\n\nIl2CppObject* il2cpp_runtime_invoke(const MethodInfo *method,\n    void *obj, void **params, Il2CppException **exc)\n{\n    // Our embedding API has historically taken pointers to unboxed value types, rather than Il2CppObjects.\n    // However, with the introduction of adjustor thunks, our invokees expect us to pass them Il2CppObject*, or at least something that\n    // ressembles boxed value type. Since it's not going to access any of the Il2CppObject* fields,\n    // it's fine to just subtract sizeof(Il2CppObject) from obj pointer\n    if (method->declaring_type->valuetype)\n        obj = static_cast<Il2CppObject*>(obj) - 1;\n\n    return Runtime::Invoke(method, obj, params, exc);\n}\n\nvoid il2cpp_runtime_class_init(Il2CppClass* klass)\n{\n    return Runtime::ClassInit(klass);\n}\n\nvoid il2cpp_runtime_object_init(Il2CppObject *obj)\n{\n    Runtime::ObjectInit(obj);\n}\n\nvoid il2cpp_runtime_object_init_exception(Il2CppObject *obj, Il2CppException **exc)\n{\n    Runtime::ObjectInitException(obj, exc);\n}\n\nvoid il2cpp_runtime_unhandled_exception_policy_set(Il2CppRuntimeUnhandledExceptionPolicy value)\n{\n    Runtime::SetUnhandledExceptionPolicy(value);\n}\n\n// string\n\nint32_t il2cpp_string_length(Il2CppString* str)\n{\n    return il2cpp::utils::StringUtils::GetLength(str);\n}\n\nIl2CppChar* il2cpp_string_chars(Il2CppString* str)\n{\n    return il2cpp::utils::StringUtils::GetChars(str);\n}\n\n// Same as il2cpp_string_new_wrapper, because other normally takes a domain\nIl2CppString* il2cpp_string_new(const char* str)\n{\n    return String::New(str);\n}\n\nIl2CppString* il2cpp_string_new_wrapper(const char* str)\n{\n    return String::NewWrapper(str);\n}\n\nIl2CppString* il2cpp_string_new_utf16(const Il2CppChar *text, int32_t len)\n{\n    return String::NewUtf16(text, len);\n}\n\nIl2CppString* il2cpp_string_new_len(const char* str, uint32_t length)\n{\n    return String::NewLen(str, length);\n}\n\nIl2CppString* il2cpp_string_intern(Il2CppString* str)\n{\n    return String::Intern(str);\n}\n\nIl2CppString* il2cpp_string_is_interned(Il2CppString* str)\n{\n    return String::IsInterned(str);\n}\n\n// thread\n\nchar *il2cpp_thread_get_name(Il2CppThread *thread, uint32_t *len)\n{\n    return Thread::GetName(len);\n}\n\nIl2CppThread *il2cpp_thread_current()\n{\n    return Thread::Current();\n}\n\nIl2CppThread *il2cpp_thread_attach(Il2CppDomain *domain)\n{\n    return Thread::Attach(domain);\n}\n\nvoid il2cpp_thread_detach(Il2CppThread *thread)\n{\n    Thread::Detach(thread);\n}\n\nIl2CppThread **il2cpp_thread_get_all_attached_threads(size_t *size)\n{\n    return Thread::GetAllAttachedThreads(*size);\n}\n\nbool il2cpp_is_vm_thread(Il2CppThread *thread)\n{\n    return Thread::IsVmThread(thread);\n}\n\n// stacktrace\n\nvoid il2cpp_current_thread_walk_frame_stack(Il2CppFrameWalkFunc func, void* user_data)\n{\n    StackTrace::WalkFrameStack(func, user_data);\n}\n\nvoid il2cpp_thread_walk_frame_stack(Il2CppThread *thread, Il2CppFrameWalkFunc func, void *user_data)\n{\n    return StackTrace::WalkThreadFrameStack(thread, func, user_data);\n}\n\nbool il2cpp_current_thread_get_top_frame(Il2CppStackFrameInfo& frame)\n{\n    return StackTrace::GetTopStackFrame(frame);\n}\n\nbool il2cpp_thread_get_top_frame(Il2CppThread* thread, Il2CppStackFrameInfo& frame)\n{\n    return StackTrace::GetThreadTopStackFrame(thread, frame);\n}\n\nbool il2cpp_current_thread_get_frame_at(int32_t offset, Il2CppStackFrameInfo& frame)\n{\n    return StackTrace::GetStackFrameAt(offset, frame);\n}\n\nbool il2cpp_thread_get_frame_at(Il2CppThread* thread, int32_t offset, Il2CppStackFrameInfo& frame)\n{\n    return StackTrace::GetThreadStackFrameAt(thread, offset, frame);\n}\n\nint32_t il2cpp_current_thread_get_stack_depth()\n{\n    return static_cast<int32_t>(StackTrace::GetStackDepth());\n}\n\nint32_t il2cpp_thread_get_stack_depth(Il2CppThread *thread)\n{\n    return StackTrace::GetThreadStackDepth(thread);\n}\n\n// type\n\nIl2CppObject* il2cpp_type_get_object(const Il2CppType *type)\n{\n    return (Il2CppObject*)Reflection::GetTypeObject(type);\n}\n\nint il2cpp_type_get_type(const Il2CppType *type)\n{\n    return Type::GetType(type);\n}\n\nIl2CppClass* il2cpp_type_get_class_or_element_class(const Il2CppType *type)\n{\n    return Type::GetClassOrElementClass(type);\n}\n\nchar* il2cpp_type_get_name(const Il2CppType *type)\n{\n    std::string name = Type::GetName(type, IL2CPP_TYPE_NAME_FORMAT_IL);\n    char* buffer = static_cast<char*>(il2cpp_alloc(name.length() + 1));\n    memcpy(buffer, name.c_str(), name.length() + 1);\n\n    return buffer;\n}\n\n// image\n\nconst Il2CppAssembly* il2cpp_image_get_assembly(const Il2CppImage *image)\n{\n    return Image::GetAssembly(image);\n}\n\nconst char* il2cpp_image_get_name(const Il2CppImage *image)\n{\n    return Image::GetName(image);\n}\n\nconst char* il2cpp_image_get_filename(const Il2CppImage *image)\n{\n    return Image::GetFileName(image);\n}\n\nconst MethodInfo* il2cpp_image_get_entry_point(const Il2CppImage *image)\n{\n    return Image::GetEntryPoint(image);\n}\n\nIl2CppManagedMemorySnapshot* il2cpp_capture_memory_snapshot()\n{\n    return MemoryInformation::CaptureManagedMemorySnapshot();\n}\n\nvoid il2cpp_free_captured_memory_snapshot(Il2CppManagedMemorySnapshot* snapshot)\n{\n    MemoryInformation::FreeCapturedManagedMemorySnapshot(snapshot);\n}\n\nvoid il2cpp_set_find_plugin_callback(Il2CppSetFindPlugInCallback method)\n{\n    il2cpp::vm::PlatformInvoke::SetFindPluginCallback(method);\n}\n\n// Logging\n\nvoid il2cpp_register_log_callback(Il2CppLogCallback method)\n{\n    il2cpp::utils::Logging::SetLogCallback(method);\n}\n\n#if IL2CPP_DEBUGGER_ENABLED\n// debug\nconst Il2CppDebugTypeInfo* il2cpp_debug_get_class_info(const Il2CppClass *klass)\n{\n    return Class::GetDebugInfo(klass);\n}\n\nconst Il2CppDebugDocument* il2cpp_debug_class_get_document(const Il2CppDebugTypeInfo* info)\n{\n    return Debug::GetDocument(info);\n}\n\nconst char* il2cpp_debug_document_get_filename(const Il2CppDebugDocument* document)\n{\n    return Debug::DocumentGetFilename(document);\n}\n\nconst char* il2cpp_debug_document_get_directory(const Il2CppDebugDocument* document)\n{\n    return Debug::DocumentGetDirectory(document);\n}\n\nconst Il2CppDebugMethodInfo* il2cpp_debug_get_method_info(const MethodInfo *method)\n{\n    return Method::GetDebugInfo(method);\n}\n\nconst Il2CppDebugDocument* il2cpp_debug_method_get_document(const Il2CppDebugMethodInfo* info)\n{\n    return Debug::GetDocument(info);\n}\n\nconst int32_t* il2cpp_debug_method_get_offset_table(const Il2CppDebugMethodInfo* info)\n{\n    return Debug::GetOffsetTable(info);\n}\n\nsize_t il2cpp_debug_method_get_code_size(const Il2CppDebugMethodInfo* info)\n{\n    return Debug::GetCodeSize(info);\n}\n\nvoid il2cpp_debug_update_frame_il_offset(int32_t il_offset)\n{\n    Debug::UpdateFrameIlOffset(il_offset);\n}\n\nconst Il2CppDebugLocalsInfo **il2cpp_debug_method_get_locals_info(const Il2CppDebugMethodInfo* info)\n{\n    return Debug::GetLocalsInfo(info);\n}\n\nconst Il2CppClass *il2cpp_debug_local_get_type(const Il2CppDebugLocalsInfo *info)\n{\n    return Debug::GetType(info);\n}\n\nconst char *il2cpp_debug_local_get_name(const Il2CppDebugLocalsInfo *info)\n{\n    return Debug::GetName(info);\n}\n\nuint32_t il2cpp_debug_local_get_start_offset(const Il2CppDebugLocalsInfo *info)\n{\n    return Debug::GetStartOffset(info);\n}\n\nuint32_t il2cpp_debug_local_get_end_offset(const Il2CppDebugLocalsInfo *info)\n{\n    return Debug::GetEndOffset(info);\n}\n\nIl2CppObject *il2cpp_debug_method_get_param_value(const Il2CppStackFrameInfo *info, uint32_t position)\n{\n    return Debug::GetParamValue(info, position);\n}\n\nIl2CppObject *il2cpp_debug_frame_get_local_value(const Il2CppStackFrameInfo *info, uint32_t position)\n{\n    return Debug::GetLocalValue(info, position);\n}\n\nvoid *il2cpp_debug_method_get_breakpoint_data_at(const Il2CppDebugMethodInfo* info, int64_t uid, int32_t offset)\n{\n    return Debug::GetBreakpointDataAt(info, uid, offset);\n}\n\nvoid il2cpp_debug_method_set_breakpoint_data_at(const Il2CppDebugMethodInfo* info, uint64_t location, void *data)\n{\n    Debug::SetBreakpointDataAt(info, location, data);\n}\n\nvoid il2cpp_debug_method_clear_breakpoint_data(const Il2CppDebugMethodInfo* info)\n{\n    Debug::ClearBreakpointData(info);\n}\n\nvoid il2cpp_debug_method_clear_breakpoint_data_at(const Il2CppDebugMethodInfo* info, uint64_t location)\n{\n    Debug::ClearBreakpointDataAt(info, location);\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/il2cpp-api.h",
    "content": "#pragma once\n\n#include <stdint.h>\n\n#include \"il2cpp-config.h\"\n\n#if IL2CPP_API_DYNAMIC_NO_DLSYM\nextern \"C\"\n{\nIL2CPP_EXPORT void il2cpp_api_register_symbols(void);\nIL2CPP_EXPORT void* il2cpp_api_lookup_symbol(const char* name);\n}\n#endif\n\nextern \"C\"\n{\n#define DO_API(r, n, p)   IL2CPP_EXPORT r n p;\n#include \"il2cpp-api-functions.h\"\n#undef DO_API\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/il2cpp-config.h",
    "content": "#pragma once\n\n#include <assert.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdint.h>\n\n/* first setup platform defines*/\n#if defined(SN_TARGET_PSP2)\n    #define IL2CPP_TARGET_PSP2 1\n    #define _UNICODE 1\n    #define UNICODE 1\n    #include \"il2cpp-config-psp2.h\"\n#elif defined(SN_TARGET_ORBIS)\n    #define IL2CPP_TARGET_PS4 1\n    #define _UNICODE 1\n    #define UNICODE 1\n#elif defined(_MSC_VER)\n    #define IL2CPP_TARGET_WINDOWS 1\n    #if defined(_XBOX_ONE)\n        #define IL2CPP_TARGET_XBOXONE 1\n    #elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)\n        #define IL2CPP_TARGET_WINRT 1\n    #else\n        #define IL2CPP_TARGET_WINDOWS_DESKTOP 1\n    #endif\n    #define _UNICODE 1\n    #define UNICODE 1\n    #define STRICT 1\n#elif defined(__APPLE__)\n    #define IL2CPP_TARGET_DARWIN 1\n    #include \"TargetConditionals.h\"\n    #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR || TARGET_TVOS_SIMULATOR\n        #define IL2CPP_TARGET_IOS 1\n    #endif\n#elif defined(__ANDROID__)\n    #define IL2CPP_TARGET_ANDROID 1\n#elif defined(EMSCRIPTEN)\n    #define IL2CPP_TARGET_JAVASCRIPT 1\n#elif defined(TIZEN)\n    #define IL2CPP_TARGET_TIZEN 1\n#elif defined(__linux__)\n    #define IL2CPP_TARGET_LINUX 1\n#elif defined(NN_PLATFORM_CTR)\n    #define IL2CPP_TARGET_N3DS 1\n#elif defined(NN_BUILD_TARGET_PLATFORM_NX)\n    #define IL2CPP_TARGET_SWITCH 1\n#else\n    #error please define your target platform\n#endif\n\n#ifndef IL2CPP_TARGET_WINDOWS\n#define IL2CPP_TARGET_WINDOWS 0\n#endif\n\n#ifndef IL2CPP_TARGET_WINDOWS_DESKTOP\n#define IL2CPP_TARGET_WINDOWS_DESKTOP 0\n#endif\n\n#ifndef IL2CPP_TARGET_WINRT\n#define IL2CPP_TARGET_WINRT 0\n#endif\n\n#ifndef IL2CPP_TARGET_XBOXONE\n#define IL2CPP_TARGET_XBOXONE 0\n#endif\n\n#ifndef IL2CPP_TARGET_DARWIN\n#define IL2CPP_TARGET_DARWIN 0\n#endif\n\n#ifndef IL2CPP_TARGET_IOS\n#define IL2CPP_TARGET_IOS 0\n#endif\n\n#ifndef IL2CPP_TARGET_ANDROID\n#define IL2CPP_TARGET_ANDROID 0\n#endif\n\n#ifndef IL2CPP_TARGET_JAVASCRIPT\n#define IL2CPP_TARGET_JAVASCRIPT 0\n#endif\n\n#ifndef IL2CPP_TARGET_TIZEN\n#define IL2CPP_TARGET_TIZEN 0\n#endif\n\n#ifndef IL2CPP_TARGET_LINUX\n#define IL2CPP_TARGET_LINUX 0\n#endif\n\n#ifndef IL2CPP_TARGET_N3DS\n#define IL2CPP_TARGET_N3DS 0\n#endif\n\n#ifndef IL2CPP_TARGET_PS4\n#define IL2CPP_TARGET_PS4 0\n#endif\n\n#ifndef IL2CPP_TARGET_PSP2\n#define IL2CPP_TARGET_PSP2 0\n#endif\n\n#ifndef IL2CPP_TARGET_SWITCH\n#define IL2CPP_TARGET_SWITCH 0\n#endif\n\n#define IL2CPP_TARGET_POSIX (IL2CPP_TARGET_DARWIN || IL2CPP_TARGET_JAVASCRIPT || IL2CPP_TARGET_LINUX || IL2CPP_TARGET_ANDROID || IL2CPP_TARGET_PS4 || IL2CPP_TARGET_PSP2 || IL2CPP_TARGET_TIZEN)\n#define IL2CPP_COMPILER_MSVC (IL2CPP_TARGET_WINDOWS || IL2CPP_TARGET_XBOXONE)\n\n#ifndef IL2CPP_EXCEPTION_DISABLED\n#define IL2CPP_EXCEPTION_DISABLED 0\n#endif\n\n// If the platform loads il2cpp as a dynamic library but does not have dlsym (or equivalent) then\n// define IL2CPP_API_DYNAMIC_NO_DLSYM = 1 to add support for api function registration and symbol\n// lookup APIs, see il2cpp-api.cpp\n#ifndef IL2CPP_API_DYNAMIC_NO_DLSYM\n#define IL2CPP_API_DYNAMIC_NO_DLSYM 0\n#endif\n\n#ifdef _MSC_VER\n# include <malloc.h>\n# define IL2CPP_EXPORT __declspec(dllexport)\n# define IL2CPP_IMPORT __declspec(dllimport)\n#elif IL2CPP_TARGET_PSP2 || IL2CPP_TARGET_PS4\n# define IL2CPP_EXPORT __declspec(dllexport)\n# define IL2CPP_IMPORT __declspec(dllimport)\n#else\n# define IL2CPP_EXPORT __attribute__ ((visibility (\"default\")))\n# define IL2CPP_IMPORT\n#endif\n\n#ifdef LIBIL2CPP_EXPORT_CODEGEN_API\n# define LIBIL2CPP_CODEGEN_API IL2CPP_EXPORT\n#elif LIBIL2CPP_IMPORT_CODEGEN_API\n# define LIBIL2CPP_CODEGEN_API IL2CPP_IMPORT\n#else\n# define LIBIL2CPP_CODEGEN_API\n#endif\n\n#if IL2CPP_TARGET_WINDOWS || IL2CPP_TARGET_XBOXONE || IL2CPP_TARGET_WINRT\n#include <crtdbg.h>\n#define IL2CPP_ASSERT(expr) \\\n    _ASSERTE(expr)\n#else\n#define IL2CPP_ASSERT(expr) \\\n    assert(expr)\n#endif\n\n#if defined(__ARMCC_VERSION)\n    #include <assert.h>\n    #include <wchar.h>\n    #include <ctype.h>\n    #define INTPTR_MAX 2147483647\n#endif\n\n#if IL2CPP_TARGET_DARWIN\n    #define IL2CPP_METHOD_ATTR\n// the following gives more accurate managed stack traces, but may cause linker errors on ARMv7 builds\n// #define IL2CPP_METHOD_ATTR __attribute__((section (\"__TEXT,__managed,regular,pure_instructions\")))\n#else\n    #define IL2CPP_METHOD_ATTR\n#endif\n\n#if defined(_MSC_VER)\n    #if defined(_M_X64)\n        #define IL2CPP_SIZEOF_VOID_P 8\n    #elif defined(_M_IX86) || defined(_M_ARM)\n        #define IL2CPP_SIZEOF_VOID_P 4\n    #else\n        #error invalid windows architecture\n    #endif\n#elif defined(__GNUC__) || defined(__SNC__)\n    #if defined(__x86_64__)\n        #define IL2CPP_SIZEOF_VOID_P 8\n    #elif defined(__i386__)\n        #define IL2CPP_SIZEOF_VOID_P 4\n    #elif defined(EMSCRIPTEN)\n        #define IL2CPP_SIZEOF_VOID_P 4\n    #elif defined(__arm__)\n        #define IL2CPP_SIZEOF_VOID_P 4\n    #elif defined(__arm64__)\n        #define IL2CPP_SIZEOF_VOID_P 8\n    #else\n        #error invalid windows architecture\n    #endif\n#else\n    #error please define your target architecture size\n#endif\n\n#if defined(_MSC_VER)\n#define IL2CPP_CXX_ABI_MSVC 1\n#else\n#define IL2CPP_CXX_ABI_MSVC 0\n#endif\n\n#if IL2CPP_COMPILER_MSVC\n#define STDCALL __stdcall\n#define CDECL __cdecl\n#else\n#define STDCALL\n#define CDECL\n#endif\n\n#if IL2CPP_COMPILER_MSVC || defined(__ARMCC_VERSION)\n#define NORETURN __declspec(noreturn)\n#else\n#define NORETURN\n#endif\n\n#if IL2CPP_TARGET_IOS || IL2CPP_TARGET_ANDROID || IL2CPP_TARGET_DARWIN\n#define REAL_NORETURN __attribute__ ((noreturn))\n#else\n#define REAL_NORETURN NORETURN\n#endif\n\n#if IL2CPP_COMPILER_MSVC || defined(__ARMCC_VERSION)\n#define IL2CPP_NO_INLINE __declspec(noinline)\n#else\n#define IL2CPP_NO_INLINE __attribute__ ((noinline))\n#endif\n\n#if IL2CPP_COMPILER_MSVC\n#define NOVTABLE __declspec(novtable)\n#else\n#define NOVTABLE\n#endif\n\n#define IL2CPP_ENABLE_MONO_BUG_EMULATION 1\n\n// We currently use ALIGN_TYPE just for types decorated with IL2CPPStructAlignment, as it's needed for WebGL to properly align UnityEngine.Color.\n// On MSVC, it causes build issues on x86 since you cannot pass aligned type by value as an argument to a function:\n// error C2719: 'value': formal parameter with requested alignment of 16 won't be aligned\n// Since this isn't actually needed for Windows, and it's not a standard .NET feature but just IL2CPP extension, let's just turn it off on Windows\n#if defined(__GNUC__) || defined(__SNC__) || defined(__clang__)\n    #define ALIGN_OF(T) __alignof__(T)\n    #define ALIGN_TYPE(val) __attribute__((aligned(val)))\n    #define ALIGN_FIELD(val) ALIGN_TYPE(val)\n    #define FORCE_INLINE inline __attribute__ ((always_inline))\n#elif defined(_MSC_VER)\n    #define ALIGN_OF(T) __alignof(T)\n    #define ALIGN_TYPE(val)\n    #define ALIGN_FIELD(val) __declspec(align(val))\n    #define FORCE_INLINE __forceinline\n#else\n    #define ALIGN_TYPE(size)\n    #define ALIGN_FIELD(size)\n    #define FORCE_INLINE inline\n#endif\n\n#define IL2CPP_PAGE_SIZE 4096\n\n/* Trigger assert if 'ptr' is not aligned to 'alignment'. */\n#define ASSERT_ALIGNMENT(ptr, alignment) \\\n    IL2CPP_ASSERT((((ptrdiff_t) ptr) & (alignment - 1)) == 0 && \"Unaligned pointer!\")\n\n// 64-bit types are aligned to 8 bytes on 64-bit platforms and always on Windows\n#define IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT ((IL2CPP_SIZEOF_VOID_P == 8) || (IL2CPP_TARGET_WINDOWS))\n\n/* Debugging */\n#ifndef IL2CPP_DEBUG\n#define IL2CPP_DEBUG 0\n#endif\n\n#ifndef IL2CPP_DEVELOPMENT\n#define IL2CPP_DEVELOPMENT 0\n#endif\n\n/* Threading */\n#define IL2CPP_SUPPORT_THREADS !IL2CPP_TARGET_JAVASCRIPT\n\n#define IL2CPP_USE_STD_THREAD 0\n\n#define IL2CPP_THREADS_STD IL2CPP_USE_STD_THREAD\n#define IL2CPP_THREADS_PTHREAD (!IL2CPP_THREADS_STD && IL2CPP_TARGET_POSIX)\n#define IL2CPP_THREADS_WIN32 (!IL2CPP_THREADS_STD && IL2CPP_TARGET_WINDOWS)\n#define IL2CPP_THREADS_N3DS (!IL2CPP_THREADS_STD && IL2CPP_TARGET_N3DS)\n#define IL2CPP_THREADS_PS4 (!IL2CPP_THREADS_STD && IL2CPP_TARGET_PS4)\n#define IL2CPP_THREADS_PSP2 (!IL2CPP_THREADS_STD && IL2CPP_TARGET_PSP2)\n#define IL2CPP_THREADS_SWITCH (!IL2CPP_THREADS_STD && IL2CPP_TARGET_SWITCH)\n\n#define IL2CPP_THREADS_ALL_ACCESS (!IL2CPP_THREADS_STD && IL2CPP_TARGET_XBOXONE)\n\n#if (IL2CPP_SUPPORT_THREADS && (!IL2CPP_THREADS_STD && !IL2CPP_THREADS_PTHREAD && !IL2CPP_THREADS_WIN32 && !IL2CPP_THREADS_XBOXONE && !IL2CPP_THREADS_N3DS && !IL2CPP_THREADS_PS4 && !IL2CPP_THREADS_PSP2 && !IL2CPP_THREADS_SWITCH))\n#error \"No thread implementation defined\"\n#endif\n\n/* Platform support to cleanup attached threads even when native threads are not exited cleanly */\n#define IL2CPP_HAS_NATIVE_THREAD_CLEANUP (IL2CPP_THREADS_PTHREAD)\n\n#define IL2CPP_THREAD_IMPL_HAS_COM_APARTMENTS IL2CPP_TARGET_WINDOWS\n\n#if !defined(IL2CPP_ENABLE_PLATFORM_THREAD_STACKSIZE) && IL2CPP_TARGET_IOS\n#define IL2CPP_ENABLE_PLATFORM_THREAD_STACKSIZE 1\n#endif\n\n#define IL2CPP_ENABLE_STACKTRACES 1\n/* Platforms which use OS specific implementation to extract stracktrace */\n#if !defined(IL2CPP_ENABLE_NATIVE_STACKTRACES)\n#define IL2CPP_ENABLE_NATIVE_STACKTRACES (IL2CPP_TARGET_WINDOWS || IL2CPP_TARGET_LINUX || IL2CPP_TARGET_DARWIN || IL2CPP_TARGET_IOS || IL2CPP_TARGET_TIZEN || IL2CPP_TARGET_ANDROID)\n#endif\n\n/* Platforms which use stacktrace sentries */\n#define IL2CPP_ENABLE_STACKTRACE_SENTRIES (IL2CPP_TARGET_JAVASCRIPT || IL2CPP_TARGET_N3DS || IL2CPP_TARGET_SWITCH)\n\n#if (IL2CPP_ENABLE_STACKTRACES && !IL2CPP_ENABLE_NATIVE_STACKTRACES && !IL2CPP_ENABLE_STACKTRACE_SENTRIES)\n#error \"If stacktraces are supported, then either native stack traces must be supported, or usage of stacktrace sentries must be enabled!\"\n#endif\n\n#if (IL2CPP_ENABLE_NATIVE_STACKTRACES + IL2CPP_ENABLE_STACKTRACE_SENTRIES) > 1\n#error \"Only one type of stacktraces are allowed\"\n#endif\n\n#define IL2CPP_CAN_USE_MULTIPLE_SYMBOL_MAPS IL2CPP_TARGET_IOS\n\n/* Profiler */\n#ifndef IL2CPP_ENABLE_PROFILER\n#define IL2CPP_ENABLE_PROFILER 1\n#endif\n\n/* GC defines*/\n#define IL2CPP_GC_BOEHM 1\n#define IL2CPP_GC_NULL !IL2CPP_GC_BOEHM\n#define IL2CPP_ENABLE_DEFERRED_GC   IL2CPP_TARGET_JAVASCRIPT\n\n/* we always need to NULL pointer free memory with our current allocators */\n#define NEED_TO_ZERO_PTRFREE 1\n#define IL2CPP_HAS_GC_DESCRIPTORS 1\n\n#if defined(_MSC_VER)\n    #define IL2CPP_ZERO_LEN_ARRAY 0\n#else\n    #define IL2CPP_ZERO_LEN_ARRAY 0\n#endif\n\n#define IL2CPP_HAS_CXX_CONSTEXPR (__has_feature (cxx_constexpr))\n\n/* clang specific __has_builtin check */\n#ifndef __has_builtin\n    #define __has_builtin(x) 0 // Compatibility with non-clang compilers.\n#endif\n\n#if _MSC_VER\n#define IL2CPP_UNREACHABLE __assume(0)\n#elif __has_builtin(__builtin_unreachable)\n#define IL2CPP_UNREACHABLE __builtin_unreachable()\n#else\n#define IL2CPP_UNREACHABLE\n#endif\n\ntypedef uint32_t Il2CppMethodSlot;\n\n/* Debug macros */\n#define STRINGIZE(L)          #L\n#define MAKE_STRING(M, L)     M(L)\n#define $Line                   MAKE_STRING( STRINGIZE, __LINE__ )\n#define FIXME                   __FILE__ \"(\" $Line \") : FIXME: \"\n#define ICALLMESSAGE(name)      __FILE__ \"(\" $Line \") : FIXME: Missing internal call implementation: \" name\n#define RUNTIMEMESSAGE(name)    __FILE__ \"(\" $Line \") : FIXME: Missing runtime implementation: \" name\n#define NOTSUPPORTEDICALLMESSAGE(target, name, reason)  __FILE__ \"(\" $Line \") : Unsupported internal call for \" target \":\" name \" - \" reason\n\n// Keeping this for future usage if needed.\n//#if defined(_MSC_VER)\n//  #define PRAGMA_MESSAGE(value) __pragma(message(value))\n//#else\n//  #define PRAGMA_MESSAGE(value) _Pragma(STRINGIZE(value))\n//#endif\n#define PRAGMA_MESSAGE(value)\n\n#if !defined(EMSCRIPTEN)\n\n#define NOT_IMPLEMENTED_ICALL(func) \\\n    PRAGMA_MESSAGE(ICALLMESSAGE(#func)) \\\n    IL2CPP_ASSERT(0 && #func)\n#define NOT_IMPLEMENTED_ICALL_NO_ASSERT(func, reason) \\\n    PRAGMA_MESSAGE(ICALLMESSAGE(#func))\n\n#define NOT_IMPLEMENTED(func) \\\n    PRAGMA_MESSAGE(RUNTIMEMESSAGE(#func)) \\\n    IL2CPP_ASSERT(0 && #func)\n#define NOT_IMPLEMENTED_NO_ASSERT(func, reason) \\\n    PRAGMA_MESSAGE(RUNTIMEMESSAGE(#func))\n\n#else\n\n// emscripten's assert will throw an exception in js.\n// For now, we don't want that, so just printf and move on.\n    #define NOT_IMPLEMENTED_ICALL(func) \\\n    PRAGMA_MESSAGE(message(ICALLMESSAGE(#func))) \\\n    printf(\"Not implemented icall: %s\\n\", #func);\n#define NOT_IMPLEMENTED_ICALL_NO_ASSERT(func, reason) \\\n    PRAGMA_MESSAGE(message(ICALLMESSAGE(#func)))\n\n#define NOT_IMPLEMENTED(func) \\\n    PRAGMA_MESSAGE(message(RUNTIMEMESSAGE(#func))) \\\n    printf(\"Not implemented: %s\\n\", #func);\n#define NOT_IMPLEMENTED_NO_ASSERT(func, reason) \\\n    PRAGMA_MESSAGE(message(RUNTIMEMESSAGE(#func)))\n\n#endif\n\n#define NOT_SUPPORTED_IL2CPP(func, reason) \\\n    il2cpp::vm::Exception::Raise (il2cpp::vm::Exception::GetNotSupportedException ( NOTSUPPORTEDICALLMESSAGE (\"IL2CPP\", #func, #reason) ))\n\n#define NOT_SUPPORTED_SRE(func) \\\n    il2cpp::vm::Exception::Raise (il2cpp::vm::Exception::GetNotSupportedException ( NOTSUPPORTEDICALLMESSAGE (\"IL2CPP\", #func, \"System.Reflection.Emit is not supported.\") ))\n\n#define NOT_SUPPORTED_REMOTING(func) \\\n    il2cpp::vm::Exception::Raise (il2cpp::vm::Exception::GetNotSupportedException ( NOTSUPPORTEDICALLMESSAGE (\"IL2CPP\", #func, \"System.Runtime.Remoting is not supported.\") ))\n\n#if IL2CPP_TARGET_JAVASCRIPT\n#define NOT_SUPPORTED_WEBGL(func, reason) \\\n    il2cpp::vm::Exception::Raise (il2cpp::vm::Exception::GetNotSupportedException ( NOTSUPPORTEDICALLMESSAGE (\"WebGL\", #func, #reason) ))\n#else\n#define NOT_SUPPORTED_WEBGL(func, reason)\n#endif\n\n#if IL2CPP_COMPILER_MSVC\n    #define IL2CPP_DIR_SEPARATOR '\\\\'   /* backslash */\n#else\n    #define IL2CPP_DIR_SEPARATOR '/'    /* forward slash */\n#endif\n\n#ifndef IL2CPP_DEBUGGER_ENABLED\n    #define IL2CPP_DEBUGGER_ENABLED 0\n#endif\n\n#ifndef IL2CPP_DEBUGGER_LOG\n    #define IL2CPP_DEBUGGER_LOG 0\n#endif\n\n#ifndef IL2CPP_DISABLE_FULL_MESSAGES\n    #define IL2CPP_DISABLE_FULL_MESSAGES    1\n#endif\n\n#if IL2CPP_COMPILER_MSVC\n    #define IL2CPP_USE_GENERIC_SOCKET_IMPL  0\n#else\n    #define IL2CPP_USE_GENERIC_SOCKET_IMPL  (!IL2CPP_TARGET_POSIX || IL2CPP_TARGET_JAVASCRIPT) &&  (!IL2CPP_TARGET_SWITCH)\n#endif\n\n/* set by platforms that require special handling of SIGPIPE signalling during socket sends */\n#ifndef IL2CPP_USE_SEND_NOSIGNAL\n    #define IL2CPP_USE_SEND_NOSIGNAL 0\n#endif\n\n#define IL2CPP_USE_GENERIC_ENVIRONMENT  (!IL2CPP_TARGET_WINDOWS && !IL2CPP_TARGET_POSIX)\n\n#define IL2CPP_USE_GENERIC_COM  (!IL2CPP_TARGET_WINDOWS)\n#define IL2CPP_USE_GENERIC_COM_SAFEARRAYS   (!IL2CPP_TARGET_WINDOWS || IL2CPP_TARGET_XBOXONE)\n#define IL2CPP_USE_GENERIC_WINDOWSRUNTIME (!IL2CPP_TARGET_WINDOWS || RUNTIME_MONO || RUNTIME_NONE)\n\n#ifndef IL2CPP_USE_GENERIC_MEMORY_MAPPED_FILE\n#define IL2CPP_USE_GENERIC_MEMORY_MAPPED_FILE (IL2CPP_TARGET_XBOXONE || (!IL2CPP_TARGET_WINDOWS && !IL2CPP_TARGET_POSIX))\n#endif\n\n#define IL2CPP_SIZEOF_STRUCT_WITH_NO_INSTANCE_FIELDS 1\n#define IL2CPP_VALIDATE_FIELD_LAYOUT 0\n\n#if IL2CPP_COMPILER_MSVC    // Use stub \"return false\" implementation where it's not implemented\n#define IL2CPP_ISDEBUGGERPRESENT_IMPLEMENTED 1\n#else\n#define IL2CPP_ISDEBUGGERPRESENT_IMPLEMENTED 0\n#endif\n\n\n#ifndef IL2CPP_USE_POSIX_COND_TIMEDWAIT_REL\n#define IL2CPP_USE_POSIX_COND_TIMEDWAIT_REL ( IL2CPP_TARGET_DARWIN || IL2CPP_TARGET_ANDROID || IL2CPP_TARGET_PSP2 )\n#endif\n\ntemplate<bool value>\nstruct Il2CppStaticAssertHelper;\n\ntemplate<>\nstruct Il2CppStaticAssertHelper<true>\n{\n};\n\n#define Assert(x) do { (void)(x); IL2CPP_ASSERT(x); } while (false)\n#define Il2CppStaticAssert(...) do { Il2CppStaticAssertHelper<(__VA_ARGS__)>(); } while (false)\n\nconst int32_t kIl2CppInt32Min = INT32_MIN;\nconst int32_t kIl2CppInt32Max = INT32_MAX;\nconst uint32_t kIl2CppUInt32Max = UINT32_MAX;\nconst int64_t kIl2CppInt64Min = INT64_MIN;\nconst int64_t kIl2CppInt64Max = INT64_MAX;\nconst uint64_t kIl2CppUInt64Max = UINT64_MAX;\n\n#if IL2CPP_SIZEOF_VOID_P == 8\nconst intptr_t kIl2CppIntPtrMin = kIl2CppInt64Min;\nconst intptr_t kIl2CppIntPtrMax = kIl2CppInt64Max;\nconst uintptr_t kIl2CppUIntPtrMax = kIl2CppUInt64Max;\n#else\nconst intptr_t kIl2CppIntPtrMin = kIl2CppInt32Min;\nconst intptr_t kIl2CppIntPtrMax = kIl2CppInt32Max;\nconst uintptr_t kIl2CppUIntPtrMax = kIl2CppUInt32Max;\n#endif\n\nconst int ipv6AddressSize = 16;\n#define IL2CPP_SUPPORT_IPV6 !IL2CPP_TARGET_PS4 && !IL2CPP_TARGET_SWITCH\n\n// Android: \"There is no support for locales in the C library\" https://code.google.com/p/android/issues/detail?id=57313\n// PS4/PS2: strtol_d doesn't exist\n#define IL2CPP_SUPPORT_LOCALE_INDEPENDENT_PARSING (!IL2CPP_TARGET_ANDROID && !IL2CPP_TARGET_PS4 && !IL2CPP_TARGET_PSP2)\n\n#define NO_UNUSED_WARNING(expr) (void)(expr)\n\ntypedef int32_t il2cpp_hresult_t;\n\n// Sorted numerically!\n#define IL2CPP_S_OK                          ((il2cpp_hresult_t)0)\n#define IL2CPP_E_BOUNDS                      ((il2cpp_hresult_t)0x8000000B)\n#define IL2CPP_E_CHANGED_STATE               ((il2cpp_hresult_t)0x8000000C)\n#define IL2CPP_E_ILLEGAL_METHOD_CALL         ((il2cpp_hresult_t)0x8000000E)\n#define IL2CPP_RO_E_CLOSED                   ((il2cpp_hresult_t)0x80000013)\n#define IL2CPP_E_NOTIMPL                     ((il2cpp_hresult_t)0x80004001)\n#define IL2CPP_E_NOINTERFACE                 ((il2cpp_hresult_t)0x80004002)\n#define IL2CPP_E_POINTER                     ((il2cpp_hresult_t)0x80004003)\n#define IL2CPP_E_ABORT                       ((il2cpp_hresult_t)0x80004004)\n#define IL2CPP_E_FAIL                        ((il2cpp_hresult_t)0x80004005)\n#define IL2CPP_E_UNEXPECTED                  ((il2cpp_hresult_t)0x8000FFFF)\n#define IL2CPP_RPC_E_DISCONNECTED            ((il2cpp_hresult_t)0x80010108)\n#define IL2CPP_RPC_E_WRONG_THREAD            ((il2cpp_hresult_t)0x8001010E)\n#define IL2CPP_DISP_E_PARAMNOTFOUND          ((il2cpp_hresult_t)0x80020004)\n#define IL2CPP_REGDB_E_CLASSNOTREG           ((il2cpp_hresult_t)0x80040154)\n#define IL2CPP_E_ACCESS_DENIED               ((il2cpp_hresult_t)0x80070005)\n#define IL2CPP_E_OUTOFMEMORY                 ((il2cpp_hresult_t)0x8007000E)\n#define IL2CPP_E_INVALIDARG                  ((il2cpp_hresult_t)0x80070057)\n#define IL2CPP_COR_E_EXCEPTION               ((il2cpp_hresult_t)0x80131500)\n#define IL2CPP_COR_E_INVALIDOPERATION        ((il2cpp_hresult_t)0x80131509)\n#define IL2CPP_COR_E_PLATFORMNOTSUPPORTED    ((il2cpp_hresult_t)0x80131539)\n#define IL2CPP_COR_E_OPERATIONCANCELED       ((il2cpp_hresult_t)0x8013153B)\n#define IL2CPP_COR_E_OBJECTDISPOSED          ((il2cpp_hresult_t)0x80131622)\n\n#define IL2CPP_HR_SUCCEEDED(hr) (((il2cpp_hresult_t)(hr)) >= 0)\n#define IL2CPP_HR_FAILED(hr) (((il2cpp_hresult_t)(hr)) < 0)\n\n#include \"il2cpp-api-types.h\"\n\n#define IL2CPP_LITTLE_ENDIAN 1\n#define IL2CPP_BIG_ENDIAN 2\n#define IL2CPP_BYTE_ORDER IL2CPP_LITTLE_ENDIAN\n\n#if (defined(_MSC_VER) && _MSC_VER > 1600) || (__has_feature(cxx_override_control))\n#define IL2CPP_OVERRIDE override\n#define IL2CPP_FINAL final\n#else\n#define IL2CPP_OVERRIDE\n#define IL2CPP_FINAL\n#endif\n\n#if (__has_feature(cxx_deleted_functions) || (defined(_MSC_VER) && _MSC_VER >= 1800))\n#define IL2CPP_HAS_DELETED_FUNCTIONS 1\n#else\n#define IL2CPP_HAS_DELETED_FUNCTIONS 0\n#endif\n\n#if IL2CPP_TARGET_WINDOWS\nconst Il2CppChar kIl2CppNewLine[] = { '\\r', '\\n', '\\0' };\n#else\nconst Il2CppChar kIl2CppNewLine[] = { '\\n', '\\0' };\n#endif\n\n\n#if IL2CPP_TARGET_ANDROID && defined(__i386__)\n// On Android with x86, function pointers are not aligned, so we\n// need to use all of the bits when comparing them. Hence we mask\n// nothing.\n#define IL2CPP_POINTER_SPARE_BITS 0\n#else\n// On ARMv7 with Thumb instructions the lowest bit is always set.\n// With Thumb2 the second-to-lowest bit is also set. Mask both of\n// them off so that we can do a comparison properly based on the data\n// from the linker map file. On other architectures this operation should\n// not matter, as we assume these two bits are always zero because the pointer\n// will be aligned.\n#define IL2CPP_POINTER_SPARE_BITS 3\n#endif\n\n#define MAXIMUM_NESTED_GENERICS_EXCEPTION_MESSAGE \"IL2CPP encountered a managed type which it cannot convert ahead-of-time. The type uses generic or array types which are nested beyond the maximum depth which can be converted.\"\n#if IL2CPP_COMPILER_MSVC\n#define IL2CPP_ATTRIBUTE_WEAK\n#else\n#define IL2CPP_ATTRIBUTE_WEAK __attribute__((weak))\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/il2cpp-debugger.cpp",
    "content": "#if IL2CPP_DEBUGGER_ENABLED\n\n#include \"il2cpp-debugger.h\"\n\n#include \"debugger/agent.h\"\n#include \"debugger/command-line-parser.h\"\n\nusing namespace il2cpp;\n\nbool il2cpp_debugger_parse_command_line(int argc, char* argv[], char** host, int32_t* port, bool* print_help)\n{\n    debugger::CommandLineOptions options;\n    bool properArgumentsProvided = debugger::CommandLineParser::Parse(argc, argv, &options);\n\n    *print_help = options.print_help;\n\n    if (properArgumentsProvided)\n    {\n        *host = options.host;\n        *port = options.port;\n    }\n\n    return properArgumentsProvided;\n}\n\nvoid il2cpp_debugger_print_usage()\n{\n    debugger::CommandLineParser::PrintUsage(std::cout);\n}\n\nvoid il2cpp_debugger_agent_init()\n{\n    debugger::Agent::instance().Initialize(\n        debugger::AgentConfig::Default);\n}\n\nvoid il2cpp_debugger_agent_init(const char *host, int32_t port)\n{\n    debugger::AgentConfig config;\n\n    config.server = true;\n    config.host = host;\n    config.port = port;\n\n    debugger::Agent::instance().Initialize(config);\n}\n\nbool il2cpp_debugger_agent_is_initialized()\n{\n    return debugger::Agent::instance().IsInitialized();\n}\n\nvoid il2cpp_debugger_agent_dispose()\n{\n    debugger::Agent::instance().Dispose();\n}\n\nvoid il2cpp_debugger_notify_vm_start()\n{\n    debugger::Agent::instance().NotifyVmStart();\n}\n\nvoid il2cpp_debugger_notify_vm_death()\n{\n    debugger::Agent::instance().NotifyVmDeath();\n}\n\nvoid il2cpp_debugger_notify_user_break()\n{\n    debugger::Agent::instance().NotifyUserBreak();\n}\n\nvoid il2cpp_debugger_notify_appdomain_create(Il2CppDomain *domain)\n{\n    debugger::Agent::instance().NotifyAppDomainCreate(domain);\n}\n\nvoid il2cpp_debugger_notify_assembly_load(const Il2CppAssembly *assembly)\n{\n    debugger::Agent::instance().NotifyAssemblyLoad(assembly);\n}\n\nvoid il2cpp_debugger_sequence_point_hit(int64_t uid, int32_t offset)\n{\n    // TODO: this is time critical, it might make sense to inline it directly?\n    debugger::Agent::instance().SequencePointHit(uid, offset);\n}\n\nvoid il2cpp_debugger_notify_type_load(Il2CppClass *type)\n{\n    debugger::Agent::instance().NotifyTypeLoad(type);\n}\n\nvoid il2cpp_debugger_method_entry(const Il2CppStackFrameInfo &info)\n{\n    debugger::Agent::instance().OnMethodEntry(info);\n}\n\nvoid il2cpp_debugger_method_exit(const Il2CppStackFrameInfo &info)\n{\n    debugger::Agent::instance().OnMethodExit(info);\n}\n\nvoid il2cpp_debugger_notify_thread_attach(Il2CppThread *thread)\n{\n    debugger::Agent::instance().OnThreadAttach(thread);\n}\n\nvoid il2cpp_debugger_notify_thread_detach(Il2CppThread *thread)\n{\n    debugger::Agent::instance().OnThreadDetach(thread);\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/il2cpp-debugger.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\nstruct Il2CppClass;\nstruct MethodInfo;\nstruct Il2CppThread;\nstruct Il2CppDomain;\nstruct Il2CppAssembly;\nstruct Il2CppStackFrameInfo;\n\n#if IL2CPP_DEBUGGER_ENABLED\nvoid il2cpp_debugger_agent_init();\nvoid il2cpp_debugger_agent_init(const char *host, int32_t port);\nvoid il2cpp_debugger_agent_dispose();\nbool il2cpp_debugger_agent_is_initialized();\nbool il2cpp_debugger_parse_command_line(int argc, char* argv[], char** host, int32_t* port, bool* print_help);\nvoid il2cpp_debugger_print_usage();\n\nvoid il2cpp_debugger_notify_vm_start();\nvoid il2cpp_debugger_notify_vm_death();\nvoid il2cpp_debugger_notify_user_break();\nvoid il2cpp_debugger_notify_appdomain_create(Il2CppDomain *domain);\nvoid il2cpp_debugger_notify_assembly_load(const Il2CppAssembly *assembly);\nvoid il2cpp_debugger_sequence_point_hit(int64_t uid, int32_t offset);\nvoid il2cpp_debugger_notify_thread_attach(Il2CppThread *thread);\nvoid il2cpp_debugger_notify_thread_detach(Il2CppThread *thread);\nvoid il2cpp_debugger_notify_type_load(Il2CppClass *type);\nvoid il2cpp_debugger_method_entry(const Il2CppStackFrameInfo &info);\nvoid il2cpp_debugger_method_exit(const Il2CppStackFrameInfo &info);\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/il2cpp-metadata.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include <stdint.h>\n\n// This file contains the structures specifying how we store converted metadata.\n// These structures have 3 constraints:\n// 1. These structures will be stored in an external file, and as such must not contain any pointers.\n//    All references to other metadata should occur via an index into a corresponding table.\n// 2. These structures are assumed to be const. Either const structures in the binary or mapped as\n//    readonly memory from an external file. Do not add any 'calculated' fields which will be written to at runtime.\n// 3. These structures should be optimized for size. Other structures are used at runtime which can\n//    be larger to store cached information\n\ntypedef int32_t TypeIndex;\ntypedef int32_t TypeDefinitionIndex;\ntypedef int32_t FieldIndex;\ntypedef int32_t DefaultValueIndex;\ntypedef int32_t DefaultValueDataIndex;\ntypedef int32_t CustomAttributeIndex;\ntypedef int32_t ParameterIndex;\ntypedef int32_t MethodIndex;\ntypedef int32_t GenericMethodIndex;\ntypedef int32_t PropertyIndex;\ntypedef int32_t EventIndex;\ntypedef int32_t GenericContainerIndex;\ntypedef int32_t GenericParameterIndex;\ntypedef int16_t GenericParameterConstraintIndex;\ntypedef int32_t NestedTypeIndex;\ntypedef int32_t InterfacesIndex;\ntypedef int32_t VTableIndex;\ntypedef int32_t InterfaceOffsetIndex;\ntypedef int32_t RGCTXIndex;\ntypedef int32_t StringIndex;\ntypedef int32_t StringLiteralIndex;\ntypedef int32_t GenericInstIndex;\ntypedef int32_t ImageIndex;\ntypedef int32_t AssemblyIndex;\ntypedef int32_t InteropDataIndex;\n\nconst TypeIndex kTypeIndexInvalid = -1;\nconst TypeDefinitionIndex kTypeDefinitionIndexInvalid = -1;\nconst DefaultValueDataIndex kDefaultValueIndexNull = -1;\nconst EventIndex kEventIndexInvalid = -1;\nconst FieldIndex kFieldIndexInvalid = -1;\nconst MethodIndex kMethodIndexInvalid = -1;\nconst PropertyIndex kPropertyIndexInvalid = -1;\nconst GenericContainerIndex kGenericContainerIndexInvalid = -1;\nconst GenericParameterIndex kGenericParameterIndexInvalid = -1;\nconst RGCTXIndex kRGCTXIndexInvalid = -1;\nconst StringLiteralIndex kStringLiteralIndexInvalid = -1;\nconst InteropDataIndex kInteropDataIndexInvalid = -1;\n\n// Encoded index (1 bit)\n// MethodDef - 0\n// MethodSpec - 1\n// We use the top 3 bits to indicate what table to index into\n// Type              Binary            Hex\n// Il2CppClass          001               0x20000000\n// Il2CppType        010               0x40000000\n// MethodInfo        011               0x60000000\n// FieldInfo         100               0x80000000\n// StringLiteral     101               0xA0000000\n// MethodRef         110               0xC0000000\n\ntypedef uint32_t EncodedMethodIndex;\n\nenum Il2CppMetadataUsage\n{\n    kIl2CppMetadataUsageInvalid,\n    kIl2CppMetadataUsageTypeInfo,\n    kIl2CppMetadataUsageIl2CppType,\n    kIl2CppMetadataUsageMethodDef,\n    kIl2CppMetadataUsageFieldInfo,\n    kIl2CppMetadataUsageStringLiteral,\n    kIl2CppMetadataUsageMethodRef,\n};\n\nstatic inline Il2CppMetadataUsage GetEncodedIndexType(EncodedMethodIndex index)\n{\n    return (Il2CppMetadataUsage)((index & 0xE0000000) >> 29);\n}\n\nstatic inline uint32_t GetDecodedMethodIndex(EncodedMethodIndex index)\n{\n    return index & 0x1FFFFFFFU;\n}\n\nstruct Il2CppImage;\nstruct Il2CppType;\nstruct Il2CppTypeDefinitionMetadata;\n\nunion Il2CppRGCTXDefinitionData\n{\n    int32_t rgctxDataDummy;\n    MethodIndex methodIndex;\n    TypeIndex typeIndex;\n};\n\nenum Il2CppRGCTXDataType\n{\n    IL2CPP_RGCTX_DATA_INVALID,\n    IL2CPP_RGCTX_DATA_TYPE,\n    IL2CPP_RGCTX_DATA_CLASS,\n    IL2CPP_RGCTX_DATA_METHOD,\n    IL2CPP_RGCTX_DATA_ARRAY,\n};\n\nstruct Il2CppRGCTXDefinition\n{\n    Il2CppRGCTXDataType type;\n    Il2CppRGCTXDefinitionData data;\n};\n\nstruct Il2CppInterfaceOffsetPair\n{\n    TypeIndex interfaceTypeIndex;\n    int32_t offset;\n};\n\nstruct Il2CppTypeDefinition\n{\n    StringIndex nameIndex;\n    StringIndex namespaceIndex;\n    CustomAttributeIndex customAttributeIndex;\n    TypeIndex byvalTypeIndex;\n    TypeIndex byrefTypeIndex;\n\n    TypeIndex declaringTypeIndex;\n    TypeIndex parentIndex;\n    TypeIndex elementTypeIndex; // we can probably remove this one. Only used for enums\n\n    RGCTXIndex rgctxStartIndex;\n    int32_t rgctxCount;\n\n    GenericContainerIndex genericContainerIndex;\n\n    uint32_t flags;\n\n    FieldIndex fieldStart;\n    MethodIndex methodStart;\n    EventIndex eventStart;\n    PropertyIndex propertyStart;\n    NestedTypeIndex nestedTypesStart;\n    InterfacesIndex interfacesStart;\n    VTableIndex vtableStart;\n    InterfacesIndex interfaceOffsetsStart;\n\n    uint16_t method_count;\n    uint16_t property_count;\n    uint16_t field_count;\n    uint16_t event_count;\n    uint16_t nested_type_count;\n    uint16_t vtable_count;\n    uint16_t interfaces_count;\n    uint16_t interface_offsets_count;\n\n    // bitfield to portably encode boolean values as single bits\n    // 01 - valuetype;\n    // 02 - enumtype;\n    // 03 - has_finalize;\n    // 04 - has_cctor;\n    // 05 - is_blittable;\n    // 06 - is_import_or_windows_runtime;\n    // 07-10 - One of nine possible PackingSize values (0, 1, 2, 4, 8, 16, 32, 64, or 128)\n    uint32_t bitfield;\n    uint32_t token;\n};\n\nstruct Il2CppFieldDefinition\n{\n    StringIndex nameIndex;\n    TypeIndex typeIndex;\n    CustomAttributeIndex customAttributeIndex;\n    uint32_t token;\n};\n\nstruct Il2CppFieldDefaultValue\n{\n    FieldIndex fieldIndex;\n    TypeIndex typeIndex;\n    DefaultValueDataIndex dataIndex;\n};\n\nstruct Il2CppFieldMarshaledSize\n{\n    FieldIndex fieldIndex;\n    TypeIndex typeIndex;\n    int32_t size;\n};\n\nstruct Il2CppFieldRef\n{\n    TypeIndex typeIndex;\n    FieldIndex fieldIndex; // local offset into type fields\n};\n\nstruct Il2CppParameterDefinition\n{\n    StringIndex nameIndex;\n    uint32_t token;\n    CustomAttributeIndex customAttributeIndex;\n    TypeIndex typeIndex;\n};\n\nstruct Il2CppParameterDefaultValue\n{\n    ParameterIndex parameterIndex;\n    TypeIndex typeIndex;\n    DefaultValueDataIndex dataIndex;\n};\n\nstruct Il2CppMethodDefinition\n{\n    StringIndex nameIndex;\n    TypeDefinitionIndex declaringType;\n    TypeIndex returnType;\n    ParameterIndex parameterStart;\n    CustomAttributeIndex customAttributeIndex;\n    GenericContainerIndex genericContainerIndex;\n    MethodIndex methodIndex;\n    MethodIndex invokerIndex;\n    MethodIndex reversePInvokeWrapperIndex;\n    RGCTXIndex rgctxStartIndex;\n    int32_t rgctxCount;\n    uint32_t token;\n    uint16_t flags;\n    uint16_t iflags;\n    uint16_t slot;\n    uint16_t parameterCount;\n};\n\nstruct Il2CppEventDefinition\n{\n    StringIndex nameIndex;\n    TypeIndex typeIndex;\n    MethodIndex add;\n    MethodIndex remove;\n    MethodIndex raise;\n    CustomAttributeIndex customAttributeIndex;\n    uint32_t token;\n};\n\nstruct Il2CppPropertyDefinition\n{\n    StringIndex nameIndex;\n    MethodIndex get;\n    MethodIndex set;\n    uint32_t attrs;\n    CustomAttributeIndex customAttributeIndex;\n    uint32_t token;\n};\n\nstruct Il2CppMethodSpec\n{\n    MethodIndex methodDefinitionIndex;\n    GenericInstIndex classIndexIndex;\n    GenericInstIndex methodIndexIndex;\n};\n\nstruct Il2CppStringLiteral\n{\n    uint32_t length;\n    StringLiteralIndex dataIndex;\n};\n\nstruct Il2CppGenericMethodIndices\n{\n    MethodIndex methodIndex;\n    MethodIndex invokerIndex;\n};\n\nstruct Il2CppGenericMethodFunctionsDefinitions\n{\n    GenericMethodIndex genericMethodIndex;\n    Il2CppGenericMethodIndices indices;\n};\n\nconst int kPublicKeyByteLength = 8;\n\nstruct Il2CppAssemblyName\n{\n    StringIndex nameIndex;\n    StringIndex cultureIndex;\n    StringIndex hashValueIndex;\n    StringIndex publicKeyIndex;\n    uint32_t hash_alg;\n    int32_t hash_len;\n    uint32_t flags;\n    int32_t major;\n    int32_t minor;\n    int32_t build;\n    int32_t revision;\n    uint8_t publicKeyToken[kPublicKeyByteLength];\n};\n\nstruct Il2CppImageDefinition\n{\n    StringIndex nameIndex;\n    AssemblyIndex assemblyIndex;\n\n    TypeDefinitionIndex typeStart;\n    uint32_t typeCount;\n\n    TypeDefinitionIndex exportedTypeStart;\n    uint32_t exportedTypeCount;\n\n    MethodIndex entryPointIndex;\n    uint32_t token;\n};\n\nstruct Il2CppAssembly\n{\n    ImageIndex imageIndex;\n    CustomAttributeIndex customAttributeIndex;\n    int32_t referencedAssemblyStart;\n    int32_t referencedAssemblyCount;\n    Il2CppAssemblyName aname;\n};\n\nstruct Il2CppMetadataUsageList\n{\n    uint32_t start;\n    uint32_t count;\n};\n\nstruct Il2CppMetadataUsagePair\n{\n    uint32_t destinationIndex;\n    uint32_t encodedSourceIndex;\n};\n\nstruct Il2CppCustomAttributeTypeRange\n{\n    int32_t start;\n    int32_t count;\n};\n\nstruct Il2CppRange\n{\n    int32_t start;\n    int32_t length;\n};\n\nstruct Il2CppWindowsRuntimeTypeNamePair\n{\n    StringIndex nameIndex;\n    TypeIndex typeIndex;\n};\n\n#pragma pack(push, p1,4)\nstruct Il2CppGlobalMetadataHeader\n{\n    int32_t sanity;\n    int32_t version;\n    int32_t stringLiteralOffset; // string data for managed code\n    int32_t stringLiteralCount;\n    int32_t stringLiteralDataOffset;\n    int32_t stringLiteralDataCount;\n    int32_t stringOffset; // string data for metadata\n    int32_t stringCount;\n    int32_t eventsOffset; // Il2CppEventDefinition\n    int32_t eventsCount;\n    int32_t propertiesOffset; // Il2CppPropertyDefinition\n    int32_t propertiesCount;\n    int32_t methodsOffset; // Il2CppMethodDefinition\n    int32_t methodsCount;\n    int32_t parameterDefaultValuesOffset; // Il2CppParameterDefaultValue\n    int32_t parameterDefaultValuesCount;\n    int32_t fieldDefaultValuesOffset; // Il2CppFieldDefaultValue\n    int32_t fieldDefaultValuesCount;\n    int32_t fieldAndParameterDefaultValueDataOffset; // uint8_t\n    int32_t fieldAndParameterDefaultValueDataCount;\n    int32_t fieldMarshaledSizesOffset; // Il2CppFieldMarshaledSize\n    int32_t fieldMarshaledSizesCount;\n    int32_t parametersOffset; // Il2CppParameterDefinition\n    int32_t parametersCount;\n    int32_t fieldsOffset; // Il2CppFieldDefinition\n    int32_t fieldsCount;\n    int32_t genericParametersOffset; // Il2CppGenericParameter\n    int32_t genericParametersCount;\n    int32_t genericParameterConstraintsOffset; // TypeIndex\n    int32_t genericParameterConstraintsCount;\n    int32_t genericContainersOffset; // Il2CppGenericContainer\n    int32_t genericContainersCount;\n    int32_t nestedTypesOffset; // TypeDefinitionIndex\n    int32_t nestedTypesCount;\n    int32_t interfacesOffset; // TypeIndex\n    int32_t interfacesCount;\n    int32_t vtableMethodsOffset; // EncodedMethodIndex\n    int32_t vtableMethodsCount;\n    int32_t interfaceOffsetsOffset; // Il2CppInterfaceOffsetPair\n    int32_t interfaceOffsetsCount;\n    int32_t typeDefinitionsOffset; // Il2CppTypeDefinition\n    int32_t typeDefinitionsCount;\n    int32_t rgctxEntriesOffset; // Il2CppRGCTXDefinition\n    int32_t rgctxEntriesCount;\n    int32_t imagesOffset; // Il2CppImageDefinition\n    int32_t imagesCount;\n    int32_t assembliesOffset; // Il2CppAssemblyDefinition\n    int32_t assembliesCount;\n    int32_t metadataUsageListsOffset; // Il2CppMetadataUsageList\n    int32_t metadataUsageListsCount;\n    int32_t metadataUsagePairsOffset; // Il2CppMetadataUsagePair\n    int32_t metadataUsagePairsCount;\n    int32_t fieldRefsOffset; // Il2CppFieldRef\n    int32_t fieldRefsCount;\n    int32_t referencedAssembliesOffset; // int32_t\n    int32_t referencedAssembliesCount;\n    int32_t attributesInfoOffset; // Il2CppCustomAttributeTypeRange\n    int32_t attributesInfoCount;\n    int32_t attributeTypesOffset; // TypeIndex\n    int32_t attributeTypesCount;\n    int32_t unresolvedVirtualCallParameterTypesOffset; // TypeIndex\n    int32_t unresolvedVirtualCallParameterTypesCount;\n    int32_t unresolvedVirtualCallParameterRangesOffset; // Il2CppRange\n    int32_t unresolvedVirtualCallParameterRangesCount;\n    int32_t windowsRuntimeTypeNamesOffset; // Il2CppWindowsRuntimeTypeNamePair\n    int32_t windowsRuntimeTypeNamesSize;\n    int32_t exportedTypeDefinitionsOffset; // TypeDefinitionIndex\n    int32_t exportedTypeDefinitionsCount;\n};\n#pragma pack(pop, p1)\n\n#if RUNTIME_MONO\n\n#pragma pack(push, p1,4)\nstruct Il2CppGlobalMonoMetadataHeader\n{\n    int32_t sanity;\n    int32_t version;\n    int32_t stringOffset; // string data for metadata\n    int32_t stringCount;\n    int32_t methodInfoMappingOffset; // hash -> MonoMethodInfo mapping\n    int32_t methodInfoMappingCount;\n    int32_t genericMethodInfoMappingOffset; // hash -> generic MonoMethodInfo mapping\n    int32_t genericMethodInfoMappingCount;\n    int32_t rgctxIndicesOffset; // runtime generic context indices\n    int32_t rgctxIndicesCount;\n    int32_t rgctxInfoOffset; // runtime generic context info\n    int32_t rgctxInfoCount;\n    int32_t monoStringOffset; // mono strings\n    int32_t monoStringCount;\n    int32_t methodMetadataOffset; // method metadata\n    int32_t methodMetadataCount;\n    int32_t genericArgumentIndicesOffset; // generic argument indices\n    int32_t genericArgumentIndicesCount;\n    int32_t typeTableOffset; // type table\n    int32_t typeTableCount;\n    int32_t fieldTableOffset; // field table\n    int32_t fieldTableCount;\n    int32_t methodIndexTableOffset; // method index table\n    int32_t methodIndexTableCount;\n    int32_t genericMethodIndexTableOffset; // generic method index table\n    int32_t genericMethodIndexTableCount;\n    int32_t metaDataUsageListsTableOffset; // meta data usage lists table\n    int32_t metaDataUsageListsTableCount;\n    int32_t metaDataUsagePairsTableOffset; // meta data usage pairs table\n    int32_t metaDataUsagePairsTableCount;\n    int32_t assemblyNameTableOffset; // assembly names\n    int32_t assemblyNameTableCount;\n};\n#pragma pack(pop, p1)\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/il2cpp-string-types.h",
    "content": "#pragma once\n#include \"il2cpp-config.h\"\n#include <string>\n\ntypedef std::basic_string<Il2CppChar> UTF16String;\ntypedef std::basic_string<Il2CppNativeChar> Il2CppNativeString;\n"
  },
  {
    "path": "unity_decoder/libil2cpp/il2cpp-vm-support.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\n// This file is a compile-time abstraction for VM support needed by code in the os and utils namespaces that is used by both the\n// libil2cpp and the libmono runtimes. Code in those namespaces should never depend up on the vm namespace directly.\n\n#if defined(RUNTIME_MONO)\n    #include \"mono-api.h\"\n    #include \"il2cpp-mono-support.h\"\n    #include <cassert>\n    #define IL2CPP_VM_RAISE_EXCEPTION(exception) mono_raise_exception(exception)\n    #define IL2CPP_VM_RAISE_COM_EXCEPTION(hresult, defaultToCOMException) assert(false && \"COM exceptions are not implemented yet.\")\n    #define IL2CPP_VM_RAISE_IF_FAILED(hresult, defaultToCOMException) assert(false && \"COM exceptions are not implemented yet.\")\n    #define IL2CPP_VM_STRING_EMPTY() mono_string_empty(mono_domain_get())\n    #define IL2CPP_VM_STRING_NEW_UTF16(value, length) mono_string_new_utf16(mono_domain_get(), value, length)\n    #define IL2CPP_VM_STRING_NEW_LEN(value, length) mono_string_new_len(mono_domain_get(), value, length);\n    #define IL2CPP_VM_NOT_SUPPORTED(func, reason) mono_raise_exception(mono_get_exception_not_supported(NOTSUPPORTEDICALLMESSAGE (\"IL2CPP\", #func, #reason)))\n    #define IL2CPP_VM_METHOD_METADATA_FROM_INDEX(isGeneric, methodIndex) isGeneric ? GenericMethodFromIndex(methodIndex) : MethodFromIndex(methodIndex)\n    #define IL2CPP_VM_SHUTDOWN() do { if (mono_runtime_try_shutdown()) mono_runtime_quit(); } while(0)\n    #define IL2CPP_VM_GET_CREATE_CCW_EXCEPTION(ex) NULL\ntypedef MonoString VmString;\ntypedef MonoMethod VmMethod;\n#elif RUNTIME_NONE // OS layer compiled with no runtime\n    #define IL2CPP_VM_RAISE_EXCEPTION(exception) IL2CPP_ASSERT(0 && \"This is not implemented wihout a VM runtime backend.\")\n    #define IL2CPP_VM_RAISE_COM_EXCEPTION(hresult, defaultToCOMException) IL2CPP_ASSERT(0 && \"This is not implemented wihout a VM runtime backend.\")\n    #define IL2CPP_VM_RAISE_IF_FAILED(hresult, defaultToCOMException) IL2CPP_ASSERT(0 && \"This is not implemented wihout a VM runtime backend.\")\n    #define IL2CPP_VM_STRING_EMPTY() NULL\n    #define IL2CPP_VM_STRING_NEW_UTF16(value, length) NULL\n    #define IL2CPP_VM_STRING_NEW_LEN(value, length) NULL\n    #define IL2CPP_VM_NOT_SUPPORTED(func, reason) IL2CPP_ASSERT(0 && \"This is not implemented wihout a VM runtime backend.\")\n    #define IL2CPP_VM_METHOD_METADATA_FROM_INDEX(isGeneric, methodIndex) IL2CPP_ASSERT(0 && \"This is not implemented wihout a VM runtime backend.\")\n    #define IL2CPP_VM_SHUTDOWN() IL2CPP_ASSERT(0 && \"This is not implemented wihout a VM runtime backend.\")\n    #define IL2CPP_VM_GET_CREATE_CCW_EXCEPTION(ex) NULL\n#else // Assume the libil2cpp runtime\n    #include \"vm/Exception.h\"\n    #include \"vm/MetadataCache.h\"\n    #include \"vm/StackTrace.h\"\n    #include \"vm/String.h\"\n    #define IL2CPP_VM_RAISE_EXCEPTION(exception) il2cpp::vm::Exception::Raise(exception)\n    #define IL2CPP_VM_RAISE_COM_EXCEPTION(hresult, defaultToCOMException) il2cpp::vm::Exception::Raise(hresult, defaultToCOMException)\n    #define IL2CPP_VM_RAISE_IF_FAILED(hresult, defaultToCOMException) il2cpp::vm::Exception::RaiseIfFailed(hresult, defaultToCOMException)\n    #define IL2CPP_VM_STRING_EMPTY() il2cpp::vm::String::Empty()\n    #define IL2CPP_VM_STRING_NEW_UTF16(value, length) il2cpp::vm::String::NewUtf16(value, length)\n    #define IL2CPP_VM_STRING_NEW_LEN(value, length) il2cpp::vm::String::NewLen(value, length)\n    #define IL2CPP_VM_NOT_SUPPORTED(func, reason) NOT_SUPPORTED_IL2CPP(func, reason)\n    #define IL2CPP_VM_METHOD_METADATA_FROM_INDEX(isGeneric, methodIndex) il2cpp::vm::MetadataCache::GetMethodInfoFromMethodDefinitionIndex (methodIndex)\n    #define IL2CPP_VM_SHUTDOWN() il2cpp_shutdown()\n    #define IL2CPP_VM_GET_CREATE_CCW_EXCEPTION(ex) vm::CCW::GetOrCreate(reinterpret_cast<Il2CppObject*>(ex), Il2CppIUnknown::IID)\ntypedef Il2CppString VmString;\ntypedef MethodInfo VmMethod;\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/libil2cpp.def",
    "content": "LIBRARY libil2cpp.dll\nEXPORTS\n\nil2cpp_init\nil2cpp_shutdown\nil2cpp_set_config_dir\nil2cpp_set_data_dir\nil2cpp_set_temp_dir\nil2cpp_set_commandline_arguments\nil2cpp_set_memory_callbacks\nil2cpp_get_corlib\nil2cpp_add_internal_call\nil2cpp_resolve_icall\n\nil2cpp_alloc\nil2cpp_free\n\nil2cpp_array_class_get\nil2cpp_array_length\nil2cpp_array_get_byte_length\nil2cpp_array_new\nil2cpp_array_new_specific\nil2cpp_array_new_full\nil2cpp_bounded_array_class_get\nil2cpp_array_element_size\n\nil2cpp_assembly_get_image\n\nil2cpp_class_enum_basetype\nil2cpp_class_is_generic\nil2cpp_class_is_assignable_from\nil2cpp_class_is_subclass_of\nil2cpp_class_from_il2cpp_type\nil2cpp_class_from_name\nil2cpp_class_from_system_type\nil2cpp_class_get_declaring_type\nil2cpp_class_get_element_class\nil2cpp_class_get_fields\nil2cpp_class_get_nested_types\nil2cpp_class_get_field_from_name\nil2cpp_class_get_interfaces\nil2cpp_class_get_methods\nil2cpp_class_get_method_from_name\nil2cpp_class_get_name\nil2cpp_class_get_namespace\nil2cpp_class_get_parent\nil2cpp_class_get_properties\nil2cpp_class_get_property_from_name\nil2cpp_class_instance_size\nil2cpp_class_num_fields\nil2cpp_class_is_valuetype\nil2cpp_class_is_blittable\nil2cpp_class_value_size\nil2cpp_class_get_flags\nil2cpp_class_is_abstract\nil2cpp_class_is_interface\nil2cpp_class_array_element_size\nil2cpp_class_from_type\nil2cpp_class_get_type\nil2cpp_class_has_attribute\nil2cpp_class_has_references\nil2cpp_class_is_enum\nil2cpp_class_get_image\nil2cpp_class_get_assemblyname\n\nil2cpp_domain_get\nil2cpp_domain_assembly_open\n\nil2cpp_raise_exception\nil2cpp_exception_from_name_msg\nil2cpp_get_exception_argument_null\n\nil2cpp_field_get_flags\nil2cpp_field_get_name\nil2cpp_field_get_parent\nil2cpp_field_get_offset\nil2cpp_field_get_type\nil2cpp_field_get_value\nil2cpp_field_get_value_object\nil2cpp_field_has_attribute\nil2cpp_field_set_value\nil2cpp_field_static_get_value\nil2cpp_field_static_set_value\nil2cpp_field_set_value_object\n\nil2cpp_gc_collect\nil2cpp_gc_collect_a_little\nil2cpp_gc_disable\nil2cpp_gc_enable\nil2cpp_gc_get_used_size\nil2cpp_gc_get_heap_size\n\nil2cpp_gchandle_new\nil2cpp_gchandle_new_weakref\nil2cpp_gchandle_get_target\nil2cpp_gchandle_free\n\nil2cpp_unity_liveness_calculation_begin\nil2cpp_unity_liveness_calculation_end\nil2cpp_unity_liveness_calculation_from_root\nil2cpp_unity_liveness_calculation_from_statics\n\nil2cpp_method_get_return_type\nil2cpp_method_get_name\nil2cpp_method_get_object\nil2cpp_method_is_instance\nil2cpp_method_get_param_count\nil2cpp_method_get_param\nil2cpp_method_get_class\nil2cpp_method_has_attribute\n\nil2cpp_profiler_install\nil2cpp_profiler_set_events\nil2cpp_profiler_install_enter_leave\nil2cpp_profiler_install_allocation\nil2cpp_profiler_install_gc\n\nil2cpp_property_get_flags\nil2cpp_property_get_get_method\nil2cpp_property_get_set_method\nil2cpp_property_get_name\nil2cpp_property_get_parent\n\nil2cpp_object_get_class\nil2cpp_object_get_size\nil2cpp_object_get_virtual_method\nil2cpp_object_new\nil2cpp_object_unbox\n\nil2cpp_value_box\n\nil2cpp_runtime_invoke\nil2cpp_runtime_invoke_convert_args\nil2cpp_runtime_class_init\nil2cpp_runtime_object_init\nil2cpp_runtime_object_init_exception\nil2cpp_runtime_unhandled_exception_policy_set\n\nil2cpp_string_length\nil2cpp_string_chars\nil2cpp_string_new\nil2cpp_string_new_len\nil2cpp_string_new_utf16\nil2cpp_string_new_wrapper\n\nil2cpp_thread_current\nil2cpp_thread_attach\nil2cpp_thread_detach\n\nil2cpp_type_get_object\nil2cpp_type_get_type\nil2cpp_type_get_class_or_element_class\nil2cpp_type_get_name\n\n____visualizerHelpersPreventLinkerStripping @65535 NONAME DATA\n"
  },
  {
    "path": "unity_decoder/libil2cpp/libil2cpp.icalls",
    "content": "\n// Mono.Globalization.Unicode.Normalization\nMono.Globalization.Unicode.Normalization::load_normalization_resource(System.IntPtr&,System.IntPtr&,System.IntPtr&,System.IntPtr&,System.IntPtr&,System.IntPtr&) mscorlib::Mono::Globalization::Unicode::Normalization::load_normalization_resource\n\n// Mono.Interop.ComInteropProxy\nMono.Interop.ComInteropProxy::AddProxy(System.IntPtr,Mono.Interop.ComInteropProxy) mscorlib::Mono::Interop::ComInteropProxy::AddProxy\nMono.Interop.ComInteropProxy::FindProxy(System.IntPtr) mscorlib::Mono::Interop::ComInteropProxy::FindProxy\n\n// Mono.Runtime\nMono.Runtime::GetDisplayName() mscorlib::Mono::Runtime::GetDisplayName\nMono.Runtime::mono_runtime_install_handlers() mscorlib::Mono::Runtime::mono_runtime_install_handlers\nMono.Runtime::GetNativeStackTrace(System.Exception) mscorlib::Mono::Runtime::GetNativeStackTrace\n\n// Mono.Security.Cryptography.KeyPairPersistence\nMono.Security.Cryptography.KeyPairPersistence::_CanSecure(System.String) mscorlib::Mono::Security::Cryptography::KeyPairPersistence::_CanSecure\nMono.Security.Cryptography.KeyPairPersistence::_IsMachineProtected(System.String) mscorlib::Mono::Security::Cryptography::KeyPairPersistence::_IsMachineProtected\nMono.Security.Cryptography.KeyPairPersistence::_IsUserProtected(System.String) mscorlib::Mono::Security::Cryptography::KeyPairPersistence::_IsUserProtected\nMono.Security.Cryptography.KeyPairPersistence::_ProtectMachine(System.String) mscorlib::Mono::Security::Cryptography::KeyPairPersistence::_ProtectMachine\nMono.Security.Cryptography.KeyPairPersistence::_ProtectUser(System.String) mscorlib::Mono::Security::Cryptography::KeyPairPersistence::_ProtectUser\n\n// System.__ComObject\nSystem.__ComObject::CreateRCW(System.Type) mscorlib::System::__ComObject::CreateRCW\nSystem.__ComObject::GetInterfaceInternal(System.Type,System.Boolean) mscorlib::System::__ComObject::GetInterfaceInternal\nSystem.__ComObject::ReleaseInterfaces() mscorlib::System::__ComObject::ReleaseInterfaces\n\n// System.Activator\nSystem.Activator::CreateInstanceInternal(System.Type) mscorlib::System::Activator::CreateInstanceInternal\n\n// System.AppDomain\nSystem.AppDomain::createDomain(System.String,System.AppDomainSetup) mscorlib::System::AppDomain::createDomain\nSystem.AppDomain::ExecuteAssembly(System.Reflection.Assembly,System.String[]) mscorlib::System::AppDomain::ExecuteAssembly\nSystem.AppDomain::GetAssemblies(System.Boolean) mscorlib::System::AppDomain::GetAssemblies\nSystem.AppDomain::getCurDomain() mscorlib::System::AppDomain::getCurDomain\nSystem.AppDomain::GetData(System.String) mscorlib::System::AppDomain::GetData\nSystem.AppDomain::getFriendlyName() mscorlib::System::AppDomain::getFriendlyName\nSystem.AppDomain::getRootDomain() mscorlib::System::AppDomain::getRootDomain\nSystem.AppDomain::getSetup() mscorlib::System::AppDomain::getSetup\nSystem.AppDomain::InternalGetContext() mscorlib::System::AppDomain::InternalGetContext\nSystem.AppDomain::InternalGetDefaultContext() mscorlib::System::AppDomain::InternalGetDefaultContext\nSystem.AppDomain::InternalGetProcessGuid(System.String) mscorlib::System::AppDomain::InternalGetProcessGuid\nSystem.AppDomain::InternalIsFinalizingForUnload(System.Int32) mscorlib::System::AppDomain::InternalIsFinalizingForUnload\nSystem.AppDomain::InternalPopDomainRef() mscorlib::System::AppDomain::InternalPopDomainRef\nSystem.AppDomain::InternalPushDomainRef(System.AppDomain) mscorlib::System::AppDomain::InternalPushDomainRef\nSystem.AppDomain::InternalPushDomainRefByID(System.Int32) mscorlib::System::AppDomain::InternalPushDomainRefByID\nSystem.AppDomain::InternalSetContext(System.Runtime.Remoting.Contexts.Context) mscorlib::System::AppDomain::InternalSetContext\nSystem.AppDomain::InternalSetDomain(System.AppDomain) mscorlib::System::AppDomain::InternalSetDomain\nSystem.AppDomain::InternalSetDomainByID(System.Int32) mscorlib::System::AppDomain::InternalSetDomainByID\nSystem.AppDomain::InternalUnload(System.Int32) mscorlib::System::AppDomain::InternalUnload\nSystem.AppDomain::LoadAssembly(System.String,System.Security.Policy.Evidence,System.Boolean) mscorlib::System::AppDomain::LoadAssembly\nSystem.AppDomain::LoadAssemblyRaw(System.Byte[],System.Byte[],System.Security.Policy.Evidence,System.Boolean) mscorlib::System::AppDomain::LoadAssemblyRaw\nSystem.AppDomain::SetData(System.String,System.Object) mscorlib::System::AppDomain::SetData\nSystem.AppDomain::DoUnhandledException(System.Exception) mscorlib::System::AppDomain::DoUnhandledException\n\n// System.ArgIterator\nSystem.ArgIterator::IntGetNextArg() mscorlib::System::ArgIterator::IntGetNextArg_mscorlib_System_TypedReference\nSystem.ArgIterator::IntGetNextArg(System.IntPtr) mscorlib::System::ArgIterator::IntGetNextArg_mscorlib_System_TypedReference_mscorlib_System_IntPtr\nSystem.ArgIterator::IntGetNextArgType() mscorlib::System::ArgIterator::IntGetNextArgType\nSystem.ArgIterator::Setup(System.IntPtr,System.IntPtr) mscorlib::System::ArgIterator::Setup\n\n// System.Array\nSystem.Array::ClearInternal(System.Array,System.Int32,System.Int32) mscorlib::System::Array::ClearInternal\nSystem.Array::Clone() mscorlib::System::Array::Clone\nSystem.Array::CreateInstanceImpl(System.Type,System.Int32[],System.Int32[]) mscorlib::System::Array::CreateInstanceImpl\nSystem.Array::FastCopy(System.Array,System.Int32,System.Array,System.Int32,System.Int32) mscorlib::System::Array::FastCopy\nSystem.Array::GetLength(System.Int32) mscorlib::System::Array::GetLength\nSystem.Array::GetLowerBound(System.Int32) mscorlib::System::Array::GetLowerBound\nSystem.Array::GetRank() mscorlib::System::Array::GetRank\nSystem.Array::GetValue(System.Int32[]) mscorlib::System::Array::GetValue\nSystem.Array::GetValueImpl(System.Int32) mscorlib::System::Array::GetValueImpl\nSystem.Array::SetValue(System.Object,System.Int32[]) mscorlib::System::Array::SetValue\nSystem.Array::SetValueImpl(System.Object,System.Int32) mscorlib::System::Array::SetValueImpl\n\n// System.Buffer\nSystem.Buffer::BlockCopyInternal(System.Array,System.Int32,System.Array,System.Int32,System.Int32) mscorlib::System::Buffer::BlockCopyInternal\nSystem.Buffer::ByteLengthInternal(System.Array) mscorlib::System::Buffer::ByteLengthInternal\nSystem.Buffer::GetByteInternal(System.Array,System.Int32) mscorlib::System::Buffer::GetByteInternal\nSystem.Buffer::SetByteInternal(System.Array,System.Int32,System.Int32) mscorlib::System::Buffer::SetByteInternal\nSystem.Buffer::_GetByte(System.Array,System.Int32) mscorlib::System::Buffer::_GetByte\nSystem.Buffer::InternalBlockCopy(System.Array,System.Int32,System.Array,System.Int32,System.Int32) mscorlib::System::Buffer::InternalBlockCopy\nSystem.Buffer::_ByteLength(System.Array) mscorlib::System::Buffer::_ByteLength\nSystem.Buffer::_SetByte(System.Array,System.Int32,System.Byte) mscorlib::System::Buffer::_SetByte\n\n// System.Char\nSystem.Char::GetDataTablePointers(System.Byte*&,System.Byte*&,System.Double*&,System.UInt16*&,System.UInt16*&,System.UInt16*&,System.UInt16*&) mscorlib::System::Char::GetDataTablePointers\n\n// System.Configuration.DefaultConfig\nSystem.Configuration.DefaultConfig::get_bundled_machine_config() System::System::Configuration::DefaultConfig::get_bundled_machine_config\nSystem.Configuration.DefaultConfig::get_machine_config_path() System::System::Configuration::DefaultConfig::get_machine_config_path\n\n// System.Configuration.InternalConfigurationHost\nSystem.Configuration.InternalConfigurationHost::get_bundled_machine_config() System::System::Configuration::InternalConfigurationHost::get_bundled_machine_config\nSystem.Configuration.InternalConfigurationHost::get_bundled_app_config() System::Configuration::System::Configuration::InternalConfigurationHost::get_bundled_app_config\n\n// System.ConsoleDriver\nSystem.ConsoleDriver::InternalKeyAvailable(System.Int32) mscorlib::System::ConsoleDriver::InternalKeyAvailable\nSystem.ConsoleDriver::Isatty(System.IntPtr) mscorlib::System::ConsoleDriver::Isatty\nSystem.ConsoleDriver::SetBreak(System.Boolean) mscorlib::System::ConsoleDriver::SetBreak\nSystem.ConsoleDriver::SetEcho(System.Boolean) mscorlib::System::ConsoleDriver::SetEcho\nSystem.ConsoleDriver::TtySetup(System.String,System.String,System.Byte[]&,System.Int32*&) mscorlib::System::ConsoleDriver::TtySetup\n\n// System.Convert\nSystem.Convert::InternalFromBase64CharArray(System.Char[],System.Int32,System.Int32) mscorlib::System::Convert::InternalFromBase64CharArray\nSystem.Convert::InternalFromBase64String(System.String,System.Boolean) mscorlib::System::Convert::InternalFromBase64String\n\n// System.CurrentSystemTimeZone\nSystem.CurrentSystemTimeZone::GetTimeZoneData(System.Int32,System.Int64[]&,System.String[]&) mscorlib::System::CurrentSystemTimeZone::GetTimeZoneData\n\n// System.ComponentModel.Win32Exception\nSystem.ComponentModel.Win32Exception::W32ErrorMessage(System.Int32) System::System::ComponentModel::Win32Exception::W32ErrorMessage\n\n// System.DateTime\nSystem.DateTime::GetNow() mscorlib::System::DateTime::GetNow\nSystem.DateTime::GetTimeMonotonic() mscorlib::System::DateTime::GetTimeMonotonic\nSystem.DateTime::GetSystemTimeAsFileTime() mscorlib::System::DateTime::GetSystemTimeAsFileTime\n\n// System.Decimal\nSystem.Decimal::decimal2double(System.Decimal&) mscorlib::System::Decimal::decimal2double\nSystem.Decimal::decimal2Int64(System.Decimal&,System.Int64&) mscorlib::System::Decimal::decimal2Int64\nSystem.Decimal::decimal2string(System.Decimal&,System.Int32,System.Int32,System.Char[],System.Int32,System.Int32&,System.Int32&) mscorlib::System::Decimal::decimal2string\nSystem.Decimal::decimal2UInt64(System.Decimal&,System.UInt64&) mscorlib::System::Decimal::decimal2UInt64\nSystem.Decimal::decimalCompare(System.Decimal&,System.Decimal&) mscorlib::System::Decimal::decimalCompare\nSystem.Decimal::decimalDiv(System.Decimal&,System.Decimal&,System.Decimal&) mscorlib::System::Decimal::decimalDiv\nSystem.Decimal::decimalFloorAndTrunc(System.Decimal&,System.Int32) mscorlib::System::Decimal::decimalFloorAndTrunc\nSystem.Decimal::decimalIncr(System.Decimal&,System.Decimal&) mscorlib::System::Decimal::decimalIncr\nSystem.Decimal::decimalIntDiv(System.Decimal&,System.Decimal&,System.Decimal&) mscorlib::System::Decimal::decimalIntDiv\nSystem.Decimal::decimalMult(System.Decimal&,System.Decimal&) mscorlib::System::Decimal::decimalMult\nSystem.Decimal::decimalSetExponent(System.Decimal&,System.Int32) mscorlib::System::Decimal::decimalSetExponent\nSystem.Decimal::string2decimal(System.Decimal&,System.String,System.UInt32,System.Int32) mscorlib::System::Decimal::string2decimal\nSystem.Decimal::ToDouble(System.Decimal) mscorlib::System::Decimal::ToDouble\nSystem.Decimal::FCallCompare(System.Decimal&,System.Decimal&) mscorlib::System::Decimal::FCallCompare\nSystem.Decimal::FCallToInt32(System.Decimal) mscorlib::System::Decimal::FCallToInt32\nSystem.Decimal::GetHashCode() mscorlib::System::Decimal::GetHashCode\nSystem.Decimal::ToSingle(System.Decimal) mscorlib::System::Decimal::ToSingle\nSystem.Decimal::.ctor(System.Double) mscorlib::System::Decimal::ConstructorDouble\nSystem.Decimal::.ctor(System.Single) mscorlib::System::Decimal::ConstructorFloat\nSystem.Decimal::FCallAddSub(System.Decimal&,System.Decimal&,System.Byte) mscorlib::System::Decimal::FCallAddSub\nSystem.Decimal::FCallDivide(System.Decimal&,System.Decimal&) mscorlib::System::Decimal::FCallDivide\nSystem.Decimal::FCallFloor(System.Decimal&) mscorlib::System::Decimal::FCallFloor\nSystem.Decimal::FCallMultiply(System.Decimal&,System.Decimal&) mscorlib::System::Decimal::FCallMultiply\nSystem.Decimal::FCallRound(System.Decimal&,System.Int32) mscorlib::System::Decimal::FCallRound\nSystem.Decimal::FCallTruncate(System.Decimal&) mscorlib::System::Decimal::FCallTruncate\n\n// System.Delegate\nSystem.Delegate::CreateDelegate_internal(System.Type,System.Object,System.Reflection.MethodInfo,System.Boolean) mscorlib::System::Delegate::CreateDelegate_internal\nSystem.Delegate::SetMulticastInvoke() mscorlib::System::Delegate::SetMulticastInvoke\nSystem.Delegate::AllocDelegateLike_internal(System.Delegate) mscorlib::System::Delegate::AllocDelegateLike_internal\nSystem.Delegate::GetVirtualMethod_internal() mscorlib::System::Delegate::GetVirtualMethod_internal\n\n// System.Diagnostics.Debugger\nSystem.Diagnostics.Debugger::IsAttached_internal() mscorlib::System::Diagnostics::Debugger::IsAttached_internal\nSystem.Diagnostics.Debugger::IsLogging() mscorlib::System::Diagnostics::Debugger::IsLogging\nSystem.Diagnostics.Debugger::Log(System.Int32,System.String,System.String) mscorlib::System::Diagnostics::Debugger::Log\n\n// System.Diagnostics.DefaultTraceListener\nSystem.Diagnostics.DefaultTraceListener::WriteWindowsDebugString(System.String) System::System::Diagnostics::DefaultTraceListener::WriteWindowsDebugString\n\n// System.Diagnostics.FileVersionInfo\nSystem.Diagnostics.FileVersionInfo::GetVersionInfo_internal(System.String) System::System::Diagnostics::FileVersionInfo::GetVersionInfo_internal\n\n// System.Diagnostics.PerformanceCounter\nSystem.Diagnostics.PerformanceCounter::FreeData(System.IntPtr) System::System::Diagnostics::PerformanceCounter::FreeData\nSystem.Diagnostics.PerformanceCounter::GetImpl(System.String,System.String,System.String,System.String,System.Diagnostics.PerformanceCounterType&,System.Boolean&) System::System::Diagnostics::PerformanceCounter::GetImpl\nSystem.Diagnostics.PerformanceCounter::GetSample(System.IntPtr,System.Boolean,System.Diagnostics.CounterSample&) System::System::Diagnostics::PerformanceCounter::GetSample\nSystem.Diagnostics.PerformanceCounter::UpdateValue(System.IntPtr,System.Boolean,System.Int64) System::System::Diagnostics::PerformanceCounter::UpdateValue\n\n// System.Diagnostics.PerformanceCounterCategory\nSystem.Diagnostics.PerformanceCounterCategory::CategoryDelete(System.String) System::System::Diagnostics::PerformanceCounterCategory::CategoryDelete\nSystem.Diagnostics.PerformanceCounterCategory::CategoryHelpInternal(System.String,System.String) System::System::Diagnostics::PerformanceCounterCategory::CategoryHelpInternal\nSystem.Diagnostics.PerformanceCounterCategory::CounterCategoryExists(System.String,System.String,System.String) System::System::Diagnostics::PerformanceCounterCategory::CounterCategoryExists\nSystem.Diagnostics.PerformanceCounterCategory::Create(System.String,System.String,System.Diagnostics.PerformanceCounterCategoryType,System.Diagnostics.CounterCreationData[]) System::System::Diagnostics::PerformanceCounterCategory::Create\nSystem.Diagnostics.PerformanceCounterCategory::GetCategoryNames(System.String) System::System::Diagnostics::PerformanceCounterCategory::GetCategoryNames\nSystem.Diagnostics.PerformanceCounterCategory::GetCounterNames(System.String,System.String) System::System::Diagnostics::PerformanceCounterCategory::GetCounterNames\nSystem.Diagnostics.PerformanceCounterCategory::GetInstanceNames(System.String,System.String) System::System::Diagnostics::PerformanceCounterCategory::GetInstanceNames\nSystem.Diagnostics.PerformanceCounterCategory::InstanceExistsInternal(System.String,System.String,System.String) System::System::Diagnostics::PerformanceCounterCategory::InstanceExistsInternal\n\n// System.Diagnostics.Process\nSystem.Diagnostics.Process::CreateProcess_internal(System.Diagnostics.ProcessStartInfo,System.IntPtr,System.IntPtr,System.IntPtr,System.Diagnostics.Process/ProcInfo&) System::System::Diagnostics::Process::CreateProcess_internal\nSystem.Diagnostics.Process::ExitCode_internal(System.IntPtr) System::System::Diagnostics::Process::ExitCode_internal\nSystem.Diagnostics.Process::ExitTime_internal(System.IntPtr) System::System::Diagnostics::Process::ExitTime_internal\nSystem.Diagnostics.Process::GetModules_internal(System.IntPtr) System::System::Diagnostics::Process::GetModules_internal\nSystem.Diagnostics.Process::GetPid_internal() System::System::Diagnostics::Process::GetPid_internal\nSystem.Diagnostics.Process::GetPriorityClass(System.IntPtr,System.Int32&) System::System::Diagnostics::Process::GetPriorityClass\nSystem.Diagnostics.Process::GetProcess_internal(System.Int32) System::System::Diagnostics::Process::GetProcess_internal\nSystem.Diagnostics.Process::GetProcessData(System.Int32,System.Int32,System.Int32&) System::System::Diagnostics::Process::GetProcessData\nSystem.Diagnostics.Process::GetProcesses_internal() System::System::Diagnostics::Process::GetProcesses_internal\nSystem.Diagnostics.Process::GetWorkingSet_internal(System.IntPtr,System.Int32&,System.Int32&) System::System::Diagnostics::Process::GetWorkingSet_internal\nSystem.Diagnostics.Process::Kill_internal(System.IntPtr,System.Int32) System::System::Diagnostics::Process::Kill_internal\nSystem.Diagnostics.Process::Process_free_internal(System.IntPtr) System::System::Diagnostics::Process::Process_free_internal\nSystem.Diagnostics.Process::ProcessName_internal(System.IntPtr) System::System::Diagnostics::Process::ProcessName_internal\nSystem.Diagnostics.Process::SetPriorityClass(System.IntPtr,System.Int32,System.Int32&) System::System::Diagnostics::Process::SetPriorityClass\nSystem.Diagnostics.Process::SetWorkingSet_internal(System.IntPtr,System.Int32,System.Int32,System.Boolean) System::System::Diagnostics::Process::SetWorkingSet_internal\nSystem.Diagnostics.Process::ShellExecuteEx_internal(System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process/ProcInfo&) System::System::Diagnostics::Process::ShellExecuteEx_internal\nSystem.Diagnostics.Process::StartTime_internal(System.IntPtr) System::System::Diagnostics::Process::StartTime_internal\nSystem.Diagnostics.Process::Times(System.IntPtr,System.Int32) System::System::Diagnostics::Process::Times\nSystem.Diagnostics.Process::WaitForExit_internal(System.IntPtr,System.Int32) System::System::Diagnostics::Process::WaitForExit_internal\nSystem.Diagnostics.Process::WaitForInputIdle_internal(System.IntPtr,System.Int32) System::System::Diagnostics::Process::WaitForInputIdle_internal\n\n// System.Diagnostics.StackFrame\nSystem.Diagnostics.StackFrame::get_frame_info(System.Int32,System.Boolean,System.Reflection.MethodBase&,System.Int32&,System.Int32&,System.String&,System.Int32&,System.Int32&) mscorlib::System::Diagnostics::StackFrame::get_frame_info\n\n// System.Diagnostics.StackTrace\nSystem.Diagnostics.StackTrace::get_trace(System.Exception,System.Int32,System.Boolean) mscorlib::System::Diagnostics::StackTrace::get_trace\n\n// System.Diagnostics.Stopwatch\nSystem.Diagnostics.Stopwatch::GetTimestamp() System::System::Diagnostics::Stopwatch::GetTimestamp\n\n// System.Double\nSystem.Double::ParseImpl(System.Byte*,System.Double&) mscorlib::System::Double::ParseImpl\n\n// System.Enum\nSystem.Enum::compare_value_to(System.Object) mscorlib::System::Enum::compare_value_to\nSystem.Enum::get_hashcode() mscorlib::System::Enum::get_hashcode\nSystem.Enum::get_underlying_type(System.Type) mscorlib::System::Enum::get_underlying_type\nSystem.Enum::get_value() mscorlib::System::Enum::get_value\nSystem.Enum::ToObject(System.Type,System.Object) mscorlib::System::Enum::ToObject\nSystem.Enum::GetEnumValuesAndNames(System.RuntimeType,System.UInt64[]&,System.String[]&) mscorlib::System::Enum::GetEnumValuesAndNames\nSystem.Enum::InternalHasFlag(System.Enum) mscorlib::System::Enum::InternalHasFlag\nSystem.Enum::InternalCompareTo(System.Object,System.Object) mscorlib::System::Enum::InternalCompareTo\nSystem.Enum::InternalBoxEnum(System.RuntimeType,System.Int64) mscorlib::System::Enum::InternalBoxEnum\nSystem.Enum::InternalGetUnderlyingType(System.RuntimeType) mscorlib::System::Enum::InternalGetUnderlyingType\n\n// System.Environment\nSystem.Environment::Exit(System.Int32) mscorlib::System::Environment::Exit\nSystem.Environment::get_EmbeddingHostName() mscorlib::System::Environment::get_EmbeddingHostName\nSystem.Environment::get_ExitCode() mscorlib::System::Environment::get_ExitCode\nSystem.Environment::get_HasShutdownStarted() mscorlib::System::Environment::get_HasShutdownStarted\nSystem.Environment::get_MachineName() mscorlib::System::Environment::get_MachineName\nSystem.Environment::get_NewLine() mscorlib::System::Environment::get_NewLine\nSystem.Environment::get_Platform() mscorlib::System::Environment::get_Platform\nSystem.Environment::get_ProcessorCount() mscorlib::System::Environment::get_ProcessorCount\nSystem.Environment::get_SocketSecurityEnabled() mscorlib::System::Environment::get_SocketSecurityEnabled\nSystem.Environment::get_TickCount() mscorlib::System::Environment::get_TickCount\nSystem.Environment::get_UserName() mscorlib::System::Environment::get_UserName\nSystem.Environment::GetCommandLineArgs() mscorlib::System::Environment::GetCommandLineArgs\nSystem.Environment::GetEnvironmentVariableNames() mscorlib::System::Environment::GetEnvironmentVariableNames\nSystem.Environment::GetLogicalDrivesInternal() mscorlib::System::Environment::GetLogicalDrivesInternal\nSystem.Environment::GetMachineConfigPath() mscorlib::System::Environment::GetMachineConfigPath\nSystem.Environment::GetOSVersionString() mscorlib::System::Environment::GetOSVersionString\nSystem.Environment::GetWindowsFolderPath(System.Int32) mscorlib::System::Environment::GetWindowsFolderPath\nSystem.Environment::internalBroadcastSettingChange() mscorlib::System::Environment::internalBroadcastSettingChange\nSystem.Environment::internalGetEnvironmentVariable(System.String) mscorlib::System::Environment::internalGetEnvironmentVariable\nSystem.Environment::internalGetEnvironmentVariable_native(System.IntPtr) mscorlib::System::Environment::internalGetEnvironmentVariable_native\nSystem.Environment::internalGetGacPath() mscorlib::System::Environment::internalGetGacPath\nSystem.Environment::internalGetHome() mscorlib::System::Environment::internalGetHome\nSystem.Environment::InternalSetEnvironmentVariable(System.String,System.String) mscorlib::System::Environment::InternalSetEnvironmentVariable\nSystem.Environment::set_ExitCode(System.Int32) mscorlib::System::Environment::set_ExitCode\nSystem.Environment::GetIs64BitOperatingSystem() mscorlib::System::Environment::GetIs64BitOperatingSystem\nSystem.Environment::GetPageSize() mscorlib::System::Environment::GetPageSize\nSystem.Environment::GetNewLine() mscorlib::System::Environment::GetNewLine\nSystem.Environment::get_bundled_machine_config() mscorlib::System::Environment::get_bundled_machine_config\n\n// System.GC\nSystem.GC::CollectionCount(System.Int32) mscorlib::System::GC::CollectionCount\nSystem.GC::get_MaxGeneration() mscorlib::System::GC::get_MaxGeneration\nSystem.GC::GetGeneration(System.Object) mscorlib::System::GC::GetGeneration\nSystem.GC::GetTotalMemory(System.Boolean) mscorlib::System::GC::GetTotalMemory\nSystem.GC::InternalCollect(System.Int32) mscorlib::System::GC::InternalCollect\nSystem.GC::KeepAlive(System.Object) mscorlib::System::GC::KeepAlive\nSystem.GC::RecordPressure(System.Int64) mscorlib::System::GC::RecordPressure\nSystem.GC::ReRegisterForFinalize(System.Object) mscorlib::System::GC::ReRegisterForFinalize\nSystem.GC::SuppressFinalize(System.Object) mscorlib::System::GC::SuppressFinalize\nSystem.GC::WaitForPendingFinalizers() mscorlib::System::GC::WaitForPendingFinalizers\nSystem.GC::get_ephemeron_tombstone() mscorlib::System::GC::get_ephemeron_tombstone\nSystem.GC::register_ephemeron_array(System.Runtime.CompilerServices.Ephemeron[]) mscorlib::System::GC::register_ephemeron_array\nSystem.GC::GetCollectionCount(System.Int32) mscorlib::System::GC::GetCollectionCount\nSystem.GC::GetMaxGeneration() mscorlib::System::GC::GetMaxGeneration\nSystem.GC::_ReRegisterForFinalize(System.Object) mscorlib::System::GC::_ReRegisterForFinalize\nSystem.GC::_SuppressFinalize(System.Object) mscorlib::System::GC::_SuppressFinalize\n\n// System.Globalization.CompareInfo\nSystem.Globalization.CompareInfo::assign_sortkey(System.Object,System.String,System.Globalization.CompareOptions) mscorlib::System::Globalization::CompareInfo::assign_sortkey\nSystem.Globalization.CompareInfo::construct_compareinfo(System.String) mscorlib::System::Globalization::CompareInfo::construct_compareinfo\nSystem.Globalization.CompareInfo::free_internal_collator() mscorlib::System::Globalization::CompareInfo::free_internal_collator\nSystem.Globalization.CompareInfo::internal_compare(System.String,System.Int32,System.Int32,System.String,System.Int32,System.Int32,System.Globalization.CompareOptions) mscorlib::System::Globalization::CompareInfo::internal_compare\nSystem.Globalization.CompareInfo::internal_index(System.String,System.Int32,System.Int32,System.Char,System.Globalization.CompareOptions,System.Boolean) mscorlib::System::Globalization::CompareInfo::internal_index\nSystem.Globalization.CompareInfo::internal_index(System.String,System.Int32,System.Int32,System.String,System.Globalization.CompareOptions,System.Boolean) mscorlib::System::Globalization::CompareInfo::internal_index\n\n// System.Globalization.CultureInfo\nSystem.Globalization.CultureInfo::construct_datetime_format() mscorlib::System::Globalization::CultureInfo::construct_datetime_format\nSystem.Globalization.CultureInfo::construct_internal_locale_from_current_locale(System.Globalization.CultureInfo) mscorlib::System::Globalization::CultureInfo::construct_internal_locale_from_current_locale\nSystem.Globalization.CultureInfo::construct_internal_locale_from_lcid(System.Int32) mscorlib::System::Globalization::CultureInfo::construct_internal_locale_from_lcid\nSystem.Globalization.CultureInfo::construct_internal_locale_from_name(System.String) mscorlib::System::Globalization::CultureInfo::construct_internal_locale_from_name\nSystem.Globalization.CultureInfo::construct_internal_locale_from_specific_name(System.Globalization.CultureInfo,System.String) mscorlib::System::Globalization::CultureInfo::construct_internal_locale_from_specific_name\nSystem.Globalization.CultureInfo::construct_number_format() mscorlib::System::Globalization::CultureInfo::construct_number_format\nSystem.Globalization.CultureInfo::internal_get_cultures(System.Boolean,System.Boolean,System.Boolean) mscorlib::System::Globalization::CultureInfo::internal_get_cultures\nSystem.Globalization.CultureInfo::internal_is_lcid_neutral(System.Int32,System.Boolean&) mscorlib::System::Globalization::CultureInfo::internal_is_lcid_neutral\nSystem.Globalization.CultureInfo::get_current_locale_name() mscorlib::System::Globalization::CultureInfo::get_current_locale_name\n\n// System.Globalization.RegionInfo\nSystem.Globalization.RegionInfo::construct_internal_region_from_name(System.String) mscorlib::System::Globalization::RegionInfo::construct_internal_region_from_name\n\n// System.IO.DriveInfo\nSystem.IO.DriveInfo::GetDiskFreeSpaceInternal(System.String,System.UInt64&,System.UInt64&,System.UInt64&,System.IO.MonoIOError&) mscorlib::System::IO::DriveInfo::GetDiskFreeSpaceInternal\nSystem.IO.DriveInfo::GetDriveTypeInternal(System.String) mscorlib::System::IO::DriveInfo::GetDriveTypeInternal\nSystem.IO.DriveInfo::GetDriveFormat(System.String) mscorlib::System::IO::DriveInfo::GetDriveFormat\n\n// System.IO.FAMWatcher\nSystem.IO.FAMWatcher::InternalFAMNextEvent(System.IO.FAMConnection&,System.String&,System.Int32&,System.Int32&) System::System::IO::FAMWatcher::InternalFAMNextEvent\n\n// System.IO.FileSystemWatcher\nSystem.IO.FileSystemWatcher::InternalSupportsFSW() System::System::IO::FileSystemWatcher::InternalSupportsFSW\n\n// System.IO.InotifyWatcher\nSystem.IO.InotifyWatcher::AddWatch(System.IntPtr,System.String,System.IO.InotifyMask) System::System::IO::InotifyWatcher::AddWatch\nSystem.IO.InotifyWatcher::GetInotifyInstance() System::System::IO::InotifyWatcher::GetInotifyInstance\nSystem.IO.InotifyWatcher::RemoveWatch(System.IntPtr,System.Int32) System::System::IO::InotifyWatcher::RemoveWatch\n\n// System.IO.MonoIO\nSystem.IO.MonoIO::Close(System.IntPtr,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::Close\nSystem.IO.MonoIO::CopyFile(System.String,System.String,System.Boolean,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::CopyFile\nSystem.IO.MonoIO::CreateDirectory(System.String,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::CreateDirectory\nSystem.IO.MonoIO::CreatePipe(System.IntPtr&,System.IntPtr&) mscorlib::System::IO::MonoIO::CreatePipe\nSystem.IO.MonoIO::DeleteFile(System.String,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::DeleteFile\nSystem.IO.MonoIO::DuplicateHandle(System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr&,System.Int32,System.Int32,System.Int32) mscorlib::System::IO::MonoIO::DuplicateHandle\nSystem.IO.MonoIO::Flush(System.IntPtr,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::Flush\nSystem.IO.MonoIO::get_AltDirectorySeparatorChar() mscorlib::System::IO::MonoIO::get_AltDirectorySeparatorChar\nSystem.IO.MonoIO::get_ConsoleError() mscorlib::System::IO::MonoIO::get_ConsoleError\nSystem.IO.MonoIO::get_ConsoleInput() mscorlib::System::IO::MonoIO::get_ConsoleInput\nSystem.IO.MonoIO::get_ConsoleOutput() mscorlib::System::IO::MonoIO::get_ConsoleOutput\nSystem.IO.MonoIO::get_DirectorySeparatorChar() mscorlib::System::IO::MonoIO::get_DirectorySeparatorChar\nSystem.IO.MonoIO::get_PathSeparator() mscorlib::System::IO::MonoIO::get_PathSeparator\nSystem.IO.MonoIO::get_VolumeSeparatorChar() mscorlib::System::IO::MonoIO::get_VolumeSeparatorChar\nSystem.IO.MonoIO::GetCurrentDirectory(System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::GetCurrentDirectory\nSystem.IO.MonoIO::GetFileAttributes(System.String,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::GetFileAttributes\nSystem.IO.MonoIO::GetFileStat(System.String,System.IO.MonoIOStat&,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::GetFileStat\nSystem.IO.MonoIO::GetFileSystemEntries(System.String,System.String,System.Int32,System.Int32,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::GetFileSystemEntries\nSystem.IO.MonoIO::GetFileType(System.IntPtr,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::GetFileType\nSystem.IO.MonoIO::GetLength(System.IntPtr,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::GetLength\nSystem.IO.MonoIO::GetTempPath(System.String&) mscorlib::System::IO::MonoIO::GetTempPath\nSystem.IO.MonoIO::Lock(System.IntPtr,System.Int64,System.Int64,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::Lock\nSystem.IO.MonoIO::MoveFile(System.String,System.String,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::MoveFile\nSystem.IO.MonoIO::Open(System.String,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,System.IO.FileOptions,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::Open\nSystem.IO.MonoIO::Read(System.IntPtr,System.Byte[],System.Int32,System.Int32,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::Read\nSystem.IO.MonoIO::RemoveDirectory(System.String,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::RemoveDirectory\nSystem.IO.MonoIO::ReplaceFile(System.String,System.String,System.String,System.Boolean,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::ReplaceFile\nSystem.IO.MonoIO::Seek(System.IntPtr,System.Int64,System.IO.SeekOrigin,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::Seek\nSystem.IO.MonoIO::SetCurrentDirectory(System.String,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::SetCurrentDirectory\nSystem.IO.MonoIO::SetFileAttributes(System.String,System.IO.FileAttributes,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::SetFileAttributes\nSystem.IO.MonoIO::SetFileTime(System.IntPtr,System.Int64,System.Int64,System.Int64,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::SetFileTime\nSystem.IO.MonoIO::SetLength(System.IntPtr,System.Int64,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::SetLength\nSystem.IO.MonoIO::Unlock(System.IntPtr,System.Int64,System.Int64,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::Unlock\nSystem.IO.MonoIO::Write(System.IntPtr,System.Byte[],System.Int32,System.Int32,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::Write\nSystem.IO.MonoIO::CreatePipe(System.IntPtr&,System.IntPtr&,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::CreatePipe40\nSystem.IO.MonoIO::DuplicateHandle(System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr&,System.Int32,System.Int32,System.Int32,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::DuplicateHandle40\nSystem.IO.MonoIO::FindClose(System.IntPtr) mscorlib::System::IO::MonoIO::FindClose\nSystem.IO.MonoIO::FindFirst(System.String,System.String,System.IO.FileAttributes&,System.IO.MonoIOError&,System.IntPtr&) mscorlib::System::IO::MonoIO::FindFirst\nSystem.IO.MonoIO::FindNext(System.IntPtr,System.IO.FileAttributes&,System.IO.MonoIOError&) mscorlib::System::IO::MonoIO::FindNext\nSystem.IO.MonoIO::DumpHandles() mscorlib::System::IO::MonoIO::DumpHandles\nSystem.IO.MonoIO::RemapPath(System.String,System.String&) mscorlib::System::IO::MonoIO::RemapPath\n\n// System.IO.Path\nSystem.IO.Path::get_temp_path() mscorlib::System::IO::Path::get_temp_path\n\n// System.Math\nSystem.Math::Acos(System.Double) mscorlib::System::Math::Acos\nSystem.Math::Asin(System.Double) mscorlib::System::Math::Asin\nSystem.Math::Atan(System.Double) mscorlib::System::Math::Atan\nSystem.Math::Atan2(System.Double,System.Double) mscorlib::System::Math::Atan2\nSystem.Math::Cos(System.Double) mscorlib::System::Math::Cos\nSystem.Math::Cosh(System.Double) mscorlib::System::Math::Cosh\nSystem.Math::Exp(System.Double) mscorlib::System::Math::Exp\nSystem.Math::Floor(System.Double) mscorlib::System::Math::Floor\nSystem.Math::Log(System.Double) mscorlib::System::Math::Log\nSystem.Math::Log10(System.Double) mscorlib::System::Math::Log10\nSystem.Math::Pow(System.Double,System.Double) mscorlib::System::Math::Pow\nSystem.Math::Round(System.Double) mscorlib::System::Math::Round\nSystem.Math::Round2(System.Double,System.Int32,System.Boolean) mscorlib::System::Math::Round2\nSystem.Math::Sin(System.Double) mscorlib::System::Math::Sin\nSystem.Math::Sinh(System.Double) mscorlib::System::Math::Sinh\nSystem.Math::Sqrt(System.Double) mscorlib::System::Math::Sqrt\nSystem.Math::Tan(System.Double) mscorlib::System::Math::Tan\nSystem.Math::Tanh(System.Double) mscorlib::System::Math::Tanh\nSystem.Math::Abs(System.Double) mscorlib::System::Math::Abs\nSystem.Math::Ceiling(System.Double) mscorlib::System::Math::Ceiling\nSystem.Math::SplitFractionDouble(System.Double*) mscorlib::System::Math::SplitFractionDouble\nSystem.Math::Abs(System.Single) mscorlib::System::Math::Abs\n\n// System.MonoCustomAttrs\nSystem.MonoCustomAttrs::GetCustomAttributesDataInternal(System.Reflection.ICustomAttributeProvider) mscorlib::System::MonoCustomAttrs::GetCustomAttributesDataInternal\nSystem.MonoCustomAttrs::GetCustomAttributesInternal(System.Reflection.ICustomAttributeProvider,System.Type,System.Boolean) mscorlib::System::MonoCustomAttrs::GetCustomAttributesInternal\nSystem.MonoCustomAttrs::IsDefinedInternal(System.Reflection.ICustomAttributeProvider,System.Type) mscorlib::System::MonoCustomAttrs::IsDefinedInternal\n\n// System.MonoEnumInfo\nSystem.MonoEnumInfo::get_enum_info(System.Type,System.MonoEnumInfo&) mscorlib::System::MonoEnumInfo::get_enum_info\n\n// System.MonoType\nSystem.MonoType::get_Assembly() mscorlib::System::MonoType::get_Assembly\nSystem.MonoType::get_attributes(System.Type) mscorlib::System::MonoType::get_attributes\nSystem.MonoType::get_BaseType() mscorlib::System::MonoType::get_BaseType\nSystem.MonoType::get_DeclaringMethod() mscorlib::System::MonoType::get_DeclaringMethod\nSystem.MonoType::get_DeclaringType() mscorlib::System::MonoType::get_DeclaringType\nSystem.MonoType::get_IsGenericParameter() mscorlib::System::MonoType::get_IsGenericParameter\nSystem.MonoType::get_Module() mscorlib::System::MonoType::get_Module\nSystem.MonoType::get_Name() mscorlib::System::MonoType::get_Name\nSystem.MonoType::get_Namespace() mscorlib::System::MonoType::get_Namespace\nSystem.MonoType::GetArrayRank() mscorlib::System::MonoType::GetArrayRank\nSystem.MonoType::GetConstructors_internal(System.Reflection.BindingFlags,System.Type) mscorlib::System::MonoType::GetConstructors_internal\nSystem.MonoType::GetCorrespondingInflatedConstructor(System.Reflection.ConstructorInfo) mscorlib::System::MonoType::GetCorrespondingInflatedMethod\nSystem.MonoType::GetCorrespondingInflatedMethod(System.Reflection.MethodInfo) mscorlib::System::MonoType::GetCorrespondingInflatedMethod\nSystem.MonoType::GetElementType() mscorlib::System::MonoType::GetElementType\nSystem.MonoType::GetEvents_internal(System.Reflection.BindingFlags,System.Type) mscorlib::System::MonoType::GetEvents_internal\nSystem.MonoType::GetField(System.String,System.Reflection.BindingFlags) mscorlib::System::MonoType::GetField\nSystem.MonoType::GetFields_internal(System.Reflection.BindingFlags,System.Type) mscorlib::System::MonoType::GetFields_internal\nSystem.MonoType::getFullName(System.Boolean,System.Boolean) mscorlib::System::MonoType::getFullName\nSystem.MonoType::GetGenericArguments() mscorlib::System::MonoType::GetGenericArguments\nSystem.MonoType::GetInterfaces() mscorlib::System::MonoType::GetInterfaces\nSystem.MonoType::GetMethodsByName(System.String,System.Reflection.BindingFlags,System.Boolean,System.Type) mscorlib::System::MonoType::GetMethodsByName\nSystem.MonoType::GetNestedType(System.String,System.Reflection.BindingFlags) mscorlib::System::MonoType::GetNestedType\nSystem.MonoType::GetNestedTypes(System.Reflection.BindingFlags) mscorlib::System::MonoType::GetNestedTypes\nSystem.MonoType::GetPropertiesByName(System.String,System.Reflection.BindingFlags,System.Boolean,System.Type) mscorlib::System::MonoType::GetPropertiesByName\nSystem.MonoType::InternalGetEvent(System.String,System.Reflection.BindingFlags) mscorlib::System::MonoType::InternalGetEvent\nSystem.MonoType::IsByRefImpl() mscorlib::System::MonoType::IsByRefImpl\nSystem.MonoType::IsCOMObjectImpl() mscorlib::System::MonoType::IsCOMObjectImpl\nSystem.MonoType::IsPointerImpl() mscorlib::System::MonoType::IsPointerImpl\nSystem.MonoType::IsPrimitiveImpl() mscorlib::System::MonoType::IsPrimitiveImpl\nSystem.MonoType::type_from_obj(System.MonoType,System.Object) mscorlib::System::MonoType::type_from_obj\n\n// System.NumberFormatter\nSystem.NumberFormatter::GetFormatterTables(System.UInt64*&,System.Int32*&,System.Char*&,System.Char*&,System.Int64*&,System.Int32*&) mscorlib::System::NumberFormatter::GetFormatterTables\n\n// System.Net\nSystem.Net.Dns::GetHostByAddr_internal(System.String,System.String&,System.String[]&,System.String[]&) System::System::Net::Dns::GetHostByAddr\nSystem.Net.Dns::GetHostByName_internal(System.String,System.String&,System.String[]&,System.String[]&) System::System::Net::Dns::GetHostByName\nSystem.Net.Dns::GetHostName_internal(System.String&) System::System::Net::Dns::GetHostName\n\n// System.Net.Sockets\nSystem.Net.Sockets.Socket::Accept_internal(System.IntPtr,System.Int32&,System.Boolean) System::System::Net::Sockets::Socket::Accept\nSystem.Net.Sockets.Socket::Available_internal(System.IntPtr,System.Int32&) System::System::Net::Sockets::Socket::Available\nSystem.Net.Sockets.Socket::Bind_internal(System.IntPtr,System.Net.SocketAddress,System.Int32&) System::System::Net::Sockets::Socket::Bind\nSystem.Net.Sockets.Socket::Blocking_internal(System.IntPtr,System.Boolean,System.Int32&) System::System::Net::Sockets::Socket::Blocking\nSystem.Net.Sockets.Socket::Close_internal(System.IntPtr,System.Int32&) System::System::Net::Sockets::Socket::Close\nSystem.Net.Sockets.Socket::Connect_internal_real(System.IntPtr,System.Net.SocketAddress,System.Int32&) System::System::Net::Sockets::Socket::Connect\nSystem.Net.Sockets.Socket::Disconnect_internal(System.IntPtr,System.Boolean,System.Int32&) System::System::Net::Sockets::Socket::Disconnect\nSystem.Net.Sockets.Socket::GetSocketOption_arr_internal(System.IntPtr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,System.Byte[]&,System.Int32&) System::System::Net::Sockets::Socket::GetSocketOptionArray\nSystem.Net.Sockets.Socket::GetSocketOption_obj_internal(System.IntPtr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,System.Object&,System.Int32&) System::System::Net::Sockets::Socket::GetSocketOptionObj\nSystem.Net.Sockets.Socket::Listen_internal(System.IntPtr,System.Int32,System.Int32&) System::System::Net::Sockets::Socket::Listen\nSystem.Net.Sockets.Socket::LocalEndPoint_internal(System.IntPtr,System.Int32&) System::System::Net::Sockets::Socket::LocalEndPoint\nSystem.Net.Sockets.Socket::Poll_internal(System.IntPtr,System.Net.Sockets.SelectMode,System.Int32,System.Int32&) System::System::Net::Sockets::Socket::Poll\nSystem.Net.Sockets.Socket::Receive_internal(System.IntPtr,System.Net.Sockets.Socket/WSABUF[],System.Net.Sockets.SocketFlags,System.Int32&) System::System::Net::Sockets::Socket::ReceiveArray\nSystem.Net.Sockets.Socket::Receive_internal(System.IntPtr,System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Int32&) System::System::Net::Sockets::Socket::Receive\nSystem.Net.Sockets.Socket::RecvFrom_internal(System.IntPtr,System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.SocketAddress&,System.Int32&) System::System::Net::Sockets::Socket::RecvFrom\nSystem.Net.Sockets.Socket::RemoteEndPoint_internal(System.IntPtr,System.Int32&) System::System::Net::Sockets::Socket::RemoteEndPoint\nSystem.Net.Sockets.Socket::Select_internal(System.Net.Sockets.Socket[]&,System.Int32,System.Int32&) System::System::Net::Sockets::Socket::Select\nSystem.Net.Sockets.Socket::SendFile(System.IntPtr,System.String,System.Byte[],System.Byte[],System.Net.Sockets.TransmitFileOptions) System::System::Net::Sockets::Socket::SendFile\nSystem.Net.Sockets.Socket::SendTo_internal_real(System.IntPtr,System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.SocketAddress,System.Int32&) System::System::Net::Sockets::Socket::SendTo\nSystem.Net.Sockets.Socket::Send_internal(System.IntPtr,System.Net.Sockets.Socket/WSABUF[],System.Net.Sockets.SocketFlags,System.Int32&) System::System::Net::Sockets::Socket::SendArray\nSystem.Net.Sockets.Socket::Send_internal(System.IntPtr,System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Int32&) System::System::Net::Sockets::Socket::Send\nSystem.Net.Sockets.Socket::SetSocketOption_internal(System.IntPtr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,System.Object,System.Byte[],System.Int32,System.Int32&) System::System::Net::Sockets::Socket::SetSocketOption\nSystem.Net.Sockets.Socket::Shutdown_internal(System.IntPtr,System.Net.Sockets.SocketShutdown,System.Int32&) System::System::Net::Sockets::Socket::Shutdown\nSystem.Net.Sockets.Socket::Socket_internal(System.Net.Sockets.AddressFamily,System.Net.Sockets.SocketType,System.Net.Sockets.ProtocolType,System.Int32&) System::System::Net::Sockets::Socket::Socket_internal\nSystem.Net.Sockets.Socket::WSAIoctl(System.IntPtr,System.Int32,System.Byte[],System.Byte[],System.Int32&) System::System::Net::Sockets::Socket::WSAIoctl\nSystem.Net.Sockets.SocketException::WSAGetLastError_internal System::System::Net::Sockets::SocketException::WSAGetLastError\n\n// System.Object\nSystem.Object::GetType() mscorlib::System::Object::GetType\nSystem.Object::InternalGetHashCode(System.Object) mscorlib::System::Object::InternalGetHashCode\nSystem.Object::MemberwiseClone() mscorlib::System::Object::MemberwiseClone\nSystem.Object::obj_address() mscorlib::System::Object::obj_address\n\n// System.Reflection.Assembly\nSystem.Reflection.Assembly::FillName(System.Reflection.Assembly,System.Reflection.AssemblyName) mscorlib::System::Reflection::Assembly::FillName\nSystem.Reflection.Assembly::get_code_base(System.Boolean) mscorlib::System::Reflection::Assembly::get_code_base\nSystem.Reflection.Assembly::get_EntryPoint() mscorlib::System::Reflection::Assembly::get_EntryPoint\nSystem.Reflection.Assembly::get_fullname() mscorlib::System::Reflection::Assembly::get_fullname\nSystem.Reflection.Assembly::get_global_assembly_cache() mscorlib::System::Reflection::Assembly::get_global_assembly_cache\nSystem.Reflection.Assembly::get_location() mscorlib::System::Reflection::Assembly::get_location\nSystem.Reflection.Assembly::get_ReflectionOnly() mscorlib::System::Reflection::Assembly::get_ReflectionOnly\nSystem.Reflection.Assembly::GetCallingAssembly() mscorlib::System::Reflection::Assembly::GetCallingAssembly\nSystem.Reflection.Assembly::GetEntryAssembly() mscorlib::System::Reflection::Assembly::GetEntryAssembly\nSystem.Reflection.Assembly::GetExecutingAssembly() mscorlib::System::Reflection::Assembly::GetExecutingAssembly\nSystem.Reflection.Assembly::GetFilesInternal(System.String,System.Boolean) mscorlib::System::Reflection::Assembly::GetFilesInternal\nSystem.Reflection.Assembly::GetManifestModuleInternal() mscorlib::System::Reflection::Assembly::GetManifestModuleInternal\nSystem.Reflection.Assembly::GetManifestResourceInfoInternal(System.String,System.Reflection.ManifestResourceInfo) mscorlib::System::Reflection::Assembly::GetManifestResourceInfoInternal\nSystem.Reflection.Assembly::GetManifestResourceInternal(System.String,System.Int32&,System.Reflection.Module&) mscorlib::System::Reflection::Assembly::GetManifestResourceInternal\nSystem.Reflection.Assembly::GetManifestResourceNames() mscorlib::System::Reflection::Assembly::GetManifestResourceNames\nSystem.Reflection.Assembly::GetModulesInternal() mscorlib::System::Reflection::Assembly::GetModulesInternal\nSystem.Reflection.Assembly::GetNamespaces() mscorlib::System::Reflection::Assembly::GetNamespaces\nSystem.Reflection.Assembly::GetReferencedAssemblies() mscorlib::System::Reflection::Assembly::GetReferencedAssemblies\nSystem.Reflection.Assembly::GetTypes(System.Boolean) mscorlib::System::Reflection::Assembly::GetTypes\nSystem.Reflection.Assembly::InternalGetAssemblyName(System.String,System.Reflection.AssemblyName) mscorlib::System::Reflection::Assembly::InternalGetAssemblyName\nSystem.Reflection.Assembly::InternalGetType(System.Reflection.Module,System.String,System.Boolean,System.Boolean) mscorlib::System::Reflection::Assembly::InternalGetType\nSystem.Reflection.Assembly::InternalImageRuntimeVersion() mscorlib::System::Reflection::Assembly::InternalImageRuntimeVersion\nSystem.Reflection.Assembly::load_with_partial_name(System.String,System.Security.Policy.Evidence) mscorlib::System::Reflection::Assembly::load_with_partial_name\nSystem.Reflection.Assembly::LoadFrom(System.String,System.Boolean) mscorlib::System::Reflection::Assembly::LoadFrom\nSystem.Reflection.Assembly::LoadPermissions(System.Reflection.Assembly,System.IntPtr&,System.Int32&,System.IntPtr&,System.Int32&,System.IntPtr&,System.Int32&) mscorlib::System::Reflection::Assembly::LoadPermissions\nSystem.Reflection.Assembly::MonoDebugger_GetMethodToken(System.Reflection.MethodBase) mscorlib::System::Reflection::Assembly::MonoDebugger_GetMethodToken\nSystem.Reflection.Assembly::GetReferencedAssemblies(System.Reflection.Assembly) mscorlib::System::Reflection::Assembly::GetReferencedAssemblies\nSystem.Reflection.Assembly::GetAotId() mscorlib::System::Reflection::Assembly::GetAotId\n\n// System.Reflection.AssemblyName\nSystem.Reflection.AssemblyName::ParseName(System.Reflection.AssemblyName,System.String) mscorlib::System::Reflection::AssemblyName::ParseName\nSystem.Reflection.AssemblyName::get_public_token(System.Byte*,System.Byte*,System.Int32) mscorlib::System::Reflection::AssemblyName::get_public_token\nSystem.Reflection.AssemblyName::GetNativeName(System.IntPtr) mscorlib::System::Reflection::AssemblyName::GetNativeName\nSystem.Reflection.AssemblyName::ParseAssemblyName(System.IntPtr,Mono.MonoAssemblyName&,System.Boolean&,System.Boolean&) mscorlib::System::Reflection::AssemblyName::ParseAssemblyName\n\n// System.Reflection.Emit.AssemblyBuilder\nSystem.Reflection.Emit.AssemblyBuilder::basic_init(System.Reflection.Emit.AssemblyBuilder) mscorlib::System::Reflection::Emit::AssemblyBuilder::basic_init\nSystem.Reflection.Emit.AssemblyBuilder::InternalAddModule(System.String) mscorlib::System::Reflection::Emit::AssemblyBuilder::InternalAddModule\n\n// System.Reflection.Emit.CustomAttributeBuilder\nSystem.Reflection.Emit.CustomAttributeBuilder::GetBlob(System.Reflection.Assembly,System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]) mscorlib::System::Reflection::Emit::CustomAttributeBuilder::GetBlob\n\n// System.Reflection.Emit.DerivedType\nSystem.Reflection.Emit.DerivedType::create_unmanaged_type(System.Type) mscorlib::System::Reflection::Emit::DerivedType::create_unmanaged_type\n\n// System.Reflection.Emit.DynamicMethod\nSystem.Reflection.Emit.DynamicMethod::create_dynamic_method(System.Reflection.Emit.DynamicMethod) mscorlib::System::Reflection::Emit::DynamicMethod::create_dynamic_method\nSystem.Reflection.Emit.DynamicMethod::destroy_dynamic_method(System.Reflection.Emit.DynamicMethod) mscorlib::System::Reflection::Emit::DynamicMethod::destroy_dynamic_method\n\n// System.Reflection.Emit.EnumBuilder\nSystem.Reflection.Emit.EnumBuilder::setup_enum_type(System.Type) mscorlib::System::Reflection::Emit::EnumBuilder::setup_enum_type\n\n// System.Reflection.Emit.GenericTypeParameterBuilder\nSystem.Reflection.Emit.GenericTypeParameterBuilder::initialize() mscorlib::System::Reflection::Emit::GenericTypeParameterBuilder::initialize\n\n// System.Reflection.Emit.MethodBuilder\nSystem.Reflection.Emit.MethodBuilder::MakeGenericMethod(System.Type[]) mscorlib::System::Reflection::Emit::MethodBuilder::MakeGenericMethod\n\n// System.Reflection.Emit.ModuleBuilder\nSystem.Reflection.Emit.ModuleBuilder::basic_init(System.Reflection.Emit.ModuleBuilder) mscorlib::System::Reflection::Emit::ModuleBuilder::basic_init\nSystem.Reflection.Emit.ModuleBuilder::build_metadata(System.Reflection.Emit.ModuleBuilder) mscorlib::System::Reflection::Emit::ModuleBuilder::build_metadata\nSystem.Reflection.Emit.ModuleBuilder::create_modified_type(System.Reflection.Emit.TypeBuilder,System.String) mscorlib::System::Reflection::Emit::ModuleBuilder::create_modified_type\nSystem.Reflection.Emit.ModuleBuilder::getMethodToken(System.Reflection.Emit.ModuleBuilder,System.Reflection.MethodInfo,System.Type[]) mscorlib::System::Reflection::Emit::ModuleBuilder::getMethodToken\nSystem.Reflection.Emit.ModuleBuilder::getToken(System.Reflection.Emit.ModuleBuilder,System.Object) mscorlib::System::Reflection::Emit::ModuleBuilder::getToken\nSystem.Reflection.Emit.ModuleBuilder::getUSIndex(System.Reflection.Emit.ModuleBuilder,System.String) mscorlib::System::Reflection::Emit::ModuleBuilder::getUSIndex\nSystem.Reflection.Emit.ModuleBuilder::RegisterToken(System.Object,System.Int32) mscorlib::System::Reflection::Emit::ModuleBuilder::RegisterToken\nSystem.Reflection.Emit.ModuleBuilder::set_wrappers_type(System.Reflection.Emit.ModuleBuilder,System.Type) mscorlib::System::Reflection::Emit::ModuleBuilder::set_wrappers_type\nSystem.Reflection.Emit.ModuleBuilder::WriteToFile(System.IntPtr) mscorlib::System::Reflection::Emit::ModuleBuilder::WriteToFile\nSystem.Reflection.Emit.ModuleBuilder::getMethodToken(System.Reflection.Emit.ModuleBuilder,System.Reflection.MethodBase,System.Type[]) mscorlib::System::Reflection::Emit::ModuleBuilder::getMethodToken40\nSystem.Reflection.Emit.ModuleBuilder::getToken(System.Reflection.Emit.ModuleBuilder,System.Object,System.Boolean) mscorlib::System::Reflection::Emit::ModuleBuilder::getToken40\nSystem.Reflection.Emit.ModuleBuilder::GetRegisteredToken(System.Int32) mscorlib::System::Reflection::Emit::ModuleBuilder::GetRegisteredToken\n\n// System.Reflection.Emit.SignatureHelper\nSystem.Reflection.Emit.SignatureHelper::get_signature_field() mscorlib::System::Reflection::Emit::SignatureHelper::get_signature_field\nSystem.Reflection.Emit.SignatureHelper::get_signature_local() mscorlib::System::Reflection::Emit::SignatureHelper::get_signature_local\n\n// System.Reflection.Emit.TypeBuilder\nSystem.Reflection.Emit.TypeBuilder::create_generic_class() mscorlib::System::Reflection::Emit::TypeBuilder::create_generic_class\nSystem.Reflection.Emit.TypeBuilder::create_internal_class(System.Reflection.Emit.TypeBuilder) mscorlib::System::Reflection::Emit::TypeBuilder::create_internal_class\nSystem.Reflection.Emit.TypeBuilder::create_runtime_class(System.Reflection.Emit.TypeBuilder) mscorlib::System::Reflection::Emit::TypeBuilder::create_runtime_class\nSystem.Reflection.Emit.TypeBuilder::get_event_info(System.Reflection.Emit.EventBuilder) mscorlib::System::Reflection::Emit::TypeBuilder::get_event_info\nSystem.Reflection.Emit.TypeBuilder::get_IsGenericParameter() mscorlib::System::Reflection::Emit::TypeBuilder::get_IsGenericParameter\nSystem.Reflection.Emit.TypeBuilder::setup_generic_class() mscorlib::System::Reflection::Emit::TypeBuilder::setup_generic_class\nSystem.Reflection.Emit.TypeBuilder::setup_internal_class(System.Reflection.Emit.TypeBuilder) mscorlib::System::Reflection::Emit::TypeBuilder::setup_internal_class\nSystem.Reflection.Emit.TypeBuilder::create_runtime_class(System.Reflection.Emit.TypeBuilder) mscorlib::System::Reflection::Emit::TypeBuilder::create_runtime_class\n\n// System.Reflection.FieldInfo\nSystem.Reflection.FieldInfo::GetTypeModifiers(System.Boolean) mscorlib::System::Reflection::FieldInfo::GetTypeModifiers\nSystem.Reflection.FieldInfo::GetUnmanagedMarshal() mscorlib::System::Reflection::FieldInfo::GetUnmanagedMarshal\nSystem.Reflection.FieldInfo::internal_from_handle_type(System.IntPtr,System.IntPtr) mscorlib::System::Reflection::FieldInfo::internal_from_handle_type\nSystem.Reflection.FieldInfo::get_marshal_info() mscorlib::System::Reflection::FieldInfo::get_marshal_info\n\n// System.Reflection.MemberInfo\nSystem.Reflection.MemberInfo::get_MetadataToken() mscorlib::System::Reflection::MemberInfo::get_MetadataToken\n\n// System.Reflection.MethodBase\nSystem.Reflection.MethodBase::GetCurrentMethod() mscorlib::System::Reflection::MethodBase::GetCurrentMethod\nSystem.Reflection.MethodBase::GetMethodBodyInternal(System.IntPtr) mscorlib::System::Reflection::MethodBase::GetMethodBodyInternal\nSystem.Reflection.MethodBase::GetMethodFromHandleInternalType(System.IntPtr,System.IntPtr) mscorlib::System::Reflection::MethodBase::GetMethodFromHandleInternalType\nSystem.Reflection.MethodBase::GetMethodFromHandleInternalType_native(System.IntPtr,System.IntPtr,System.Boolean) mscorlib::System::Reflection::MethodBase::GetMethodFromHandleInternalType_native\n\n// System.Reflection.Module\nSystem.Reflection.Module::get_MetadataToken() mscorlib::System::Reflection::Module::get_MetadataToken\nSystem.Reflection.Module::GetGlobalType() mscorlib::System::Reflection::Module::GetGlobalType\nSystem.Reflection.Module::GetGuidInternal() mscorlib::System::Reflection::Module::GetGuidInternal\nSystem.Reflection.Module::GetHINSTANCE() mscorlib::System::Reflection::Module::GetHINSTANCE\nSystem.Reflection.Module::GetMDStreamVersion(System.IntPtr) mscorlib::System::Reflection::Module::GetMDStreamVersion\nSystem.Reflection.Module::GetPEKind(System.IntPtr,System.Reflection.PortableExecutableKinds&,System.Reflection.ImageFileMachine&) mscorlib::System::Reflection::Module::GetPEKind\nSystem.Reflection.Module::InternalGetTypes() mscorlib::System::Reflection::Module::InternalGetTypes\nSystem.Reflection.Module::ResolveFieldToken(System.IntPtr,System.Int32,System.IntPtr[],System.IntPtr[],System.Reflection.ResolveTokenError&) mscorlib::System::Reflection::Module::ResolveFieldToken\nSystem.Reflection.Module::ResolveMemberToken(System.IntPtr,System.Int32,System.IntPtr[],System.IntPtr[],System.Reflection.ResolveTokenError&) mscorlib::System::Reflection::Module::ResolveMemberToken\nSystem.Reflection.Module::ResolveMethodToken(System.IntPtr,System.Int32,System.IntPtr[],System.IntPtr[],System.Reflection.ResolveTokenError&) mscorlib::System::Reflection::Module::ResolveMethodToken\nSystem.Reflection.Module::ResolveSignature(System.IntPtr,System.Int32,System.Reflection.ResolveTokenError&) mscorlib::System::Reflection::Module::ResolveSignature\nSystem.Reflection.Module::ResolveStringToken(System.IntPtr,System.Int32,System.Reflection.ResolveTokenError&) mscorlib::System::Reflection::Module::ResolveStringToken\nSystem.Reflection.Module::ResolveTypeToken(System.IntPtr,System.Int32,System.IntPtr[],System.IntPtr[],System.Reflection.ResolveTokenError&) mscorlib::System::Reflection::Module::ResolveTypeToken\nSystem.Reflection.Module::get_MetadataToken(System.Reflection.Module) mscorlib::System::Reflection::Module::get_MetadataToken\n\n// System.Reflection.MonoCMethod\nSystem.Reflection.MonoCMethod::InternalInvoke(System.Object,System.Object[],System.Exception&) mscorlib::System::Reflection::MonoMethod::InternalInvoke\nSystem.Reflection.MonoCMethod::get_core_clr_security_level() mscorlib::System::Reflection::MonoCMethod::get_core_clr_security_level\n\n// System.Reflection.MonoEventInfo\nSystem.Reflection.MonoEventInfo::get_event_info(System.Reflection.MonoEvent,System.Reflection.MonoEventInfo&) mscorlib::System::Reflection::MonoEventInfo::get_event_info\n\n// System.Reflection.MonoField\nSystem.Reflection.MonoField::GetFieldOffset() mscorlib::System::Reflection::MonoField::GetFieldOffset\nSystem.Reflection.MonoField::GetParentType(System.Boolean) mscorlib::System::Reflection::MonoField::GetParentType\nSystem.Reflection.MonoField::GetRawConstantValue() mscorlib::System::Reflection::MonoField::GetRawConstantValue\nSystem.Reflection.MonoField::GetValueInternal(System.Object) mscorlib::System::Reflection::MonoField::GetValueInternal\nSystem.Reflection.MonoField::SetValueInternal(System.Reflection.FieldInfo,System.Object,System.Object) mscorlib::System::Reflection::MonoField::SetValueInternal\nSystem.Reflection.MonoField::get_core_clr_security_level() mscorlib::System::Reflection::MonoField::get_core_clr_security_level\nSystem.Reflection.MonoField::ResolveType() mscorlib::System::Reflection::MonoField::ResolveType\n\n// System.Reflection.MonoGenericClass\nSystem.Reflection.MonoGenericClass::initialize(System.Reflection.MethodInfo[],System.Reflection.ConstructorInfo[],System.Reflection.FieldInfo[],System.Reflection.PropertyInfo[],System.Reflection.EventInfo[]) mscorlib::System::Reflection::MonoGenericClass::initialize\nSystem.Reflection.MonoGenericClass::initialize(System.Reflection.FieldInfo[]) mscorlib::System::Reflection::MonoGenericClass::initialize40\nSystem.Reflection.MonoGenericClass::register_with_runtime(System.Type) mscorlib::System::Reflection::MonoGenericClass::register_with_runtime\n\n// System.Reflection.MonoGenericCMethod\nSystem.Reflection.MonoGenericCMethod::get_ReflectedType() mscorlib::System::Reflection::MonoGenericCMethod::get_ReflectedType\n\n// System.Reflection.MonoGenericMethod\nSystem.Reflection.MonoGenericMethod::get_ReflectedType() mscorlib::System::Reflection::MonoGenericMethod::get_ReflectedType\n\n// System.Reflection.MonoMethod\nSystem.Reflection.MonoMethod::get_base_definition(System.Reflection.MonoMethod) mscorlib::System::Reflection::MonoMethod::get_base_definition\nSystem.Reflection.MonoMethod::get_IsGenericMethod() mscorlib::System::Reflection::MonoMethod::get_IsGenericMethod\nSystem.Reflection.MonoMethod::get_IsGenericMethodDefinition() mscorlib::System::Reflection::MonoMethod::get_IsGenericMethodDefinition\nSystem.Reflection.MonoMethod::get_name(System.Reflection.MethodBase) mscorlib::System::Reflection::MonoMethod::get_name\nSystem.Reflection.MonoMethod::GetDllImportAttribute(System.IntPtr) mscorlib::System::Reflection::MonoMethod::GetDllImportAttribute\nSystem.Reflection.MonoMethod::GetGenericArguments() mscorlib::System::Reflection::MonoMethod::GetGenericArguments\nSystem.Reflection.MonoMethod::GetGenericMethodDefinition_impl() mscorlib::System::Reflection::MonoMethod::GetGenericMethodDefinition_impl\nSystem.Reflection.MonoMethod::InternalInvoke(System.Object,System.Object[],System.Exception&) mscorlib::System::Reflection::MonoMethod::InternalInvoke\nSystem.Reflection.MonoMethod::MakeGenericMethod_impl(System.Type[]) mscorlib::System::Reflection::MonoMethod::MakeGenericMethod_impl\nSystem.Reflection.MonoMethod::get_core_clr_security_level() mscorlib::System::Reflection::MonoMethod::get_core_clr_security_level\nSystem.Reflection.MonoMethod::get_base_method(System.Reflection.MonoMethod,System.Boolean) mscorlib::System::Reflection::MonoMethod::get_base_method\nSystem.Reflection.MonoMethod::GetPInvoke(System.Reflection.PInvokeAttributes&,System.String&,System.String&) mscorlib::System::Reflection::MonoMethod::GetPInvoke\n\n// System.Reflection.MonoMethodInfo\nSystem.Reflection.MonoMethodInfo::get_method_info(System.IntPtr,System.Reflection.MonoMethodInfo&) mscorlib::System::Reflection::MonoMethodInfo::get_method_info\nSystem.Reflection.MonoMethodInfo::get_parameter_info(System.IntPtr,System.Reflection.MemberInfo) mscorlib::System::Reflection::MonoMethodInfo::get_parameter_info\nSystem.Reflection.MonoMethodInfo::get_retval_marshal(System.IntPtr) mscorlib::System::Reflection::MonoMethodInfo::get_retval_marshal\nSystem.Reflection.MonoMethodInfo::get_method_attributes(System.IntPtr) mscorlib::System::Reflection::MonoMethodInfo::get_method_attributes\nSystem.Reflection.MonoMethodInfo::get_retval_marshal(System.IntPtr) mscorlib::System::Reflection::MonoMethodInfo::get_retval_marshal\n\n// System.Reflection.MonoPropertyInfo\nSystem.Reflection.MonoPropertyInfo::get_property_info(System.Reflection.MonoProperty,System.Reflection.MonoPropertyInfo&,System.Reflection.PInfo) mscorlib::System::Reflection::MonoPropertyInfo::get_property_info\nSystem.Reflection.MonoPropertyInfo::GetTypeModifiers(System.Reflection.MonoProperty,System.Boolean) mscorlib::System::Reflection::MonoPropertyInfo::GetTypeModifiers\nSystem.Reflection.MonoPropertyInfo::get_default_value(System.Reflection.MonoProperty) mscorlib::System::Reflection::MonoPropertyInfo::get_default_value\n\n// System.Reflection.ParameterInfo\nSystem.Reflection.ParameterInfo::GetMetadataToken() mscorlib::System::Reflection::ParameterInfo::GetMetadataToken\nSystem.Reflection.ParameterInfo::GetTypeModifiers(System.Boolean) mscorlib::System::Reflection::ParameterInfo::GetTypeModifiers\n\n// System.Runtime.CompilerServices.RuntimeHelpers\nSystem.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData() mscorlib::System::Runtime::CompilerServices::RuntimeHelpers::get_OffsetToStringData\nSystem.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(System.Object) mscorlib::System::Runtime::CompilerServices::RuntimeHelpers::GetObjectValue\nSystem.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(System.Array,System.IntPtr) mscorlib::System::Runtime::CompilerServices::RuntimeHelpers::InitializeArray\nSystem.Runtime.CompilerServices.RuntimeHelpers::RunClassConstructor(System.IntPtr) mscorlib::System::Runtime::CompilerServices::RuntimeHelpers::RunClassConstructor\nSystem.Runtime.CompilerServices.RuntimeHelpers::RunModuleConstructor(System.IntPtr) mscorlib::System::Runtime::CompilerServices::RuntimeHelpers::RunModuleConstructor\nSystem.Runtime.CompilerServices.RuntimeHelpers::SufficientExecutionStack() mscorlib::System::Runtime::CompilerServices::RuntimeHelpers::SufficientExecutionStack\n\n// System.Runtime.InteropServices.GCHandle\nSystem.Runtime.InteropServices.GCHandle::CheckCurrentDomain(System.Int32) mscorlib::System::Runtime::InteropServices::GCHandle::CheckCurrentDomain\nSystem.Runtime.InteropServices.GCHandle::FreeHandle(System.Int32) mscorlib::System::Runtime::InteropServices::GCHandle::FreeHandle\nSystem.Runtime.InteropServices.GCHandle::GetAddrOfPinnedObject(System.Int32) mscorlib::System::Runtime::InteropServices::GCHandle::GetAddrOfPinnedObject\nSystem.Runtime.InteropServices.GCHandle::GetTarget(System.Int32) mscorlib::System::Runtime::InteropServices::GCHandle::GetTarget\nSystem.Runtime.InteropServices.GCHandle::GetTargetHandle(System.Object,System.Int32,System.Runtime.InteropServices.GCHandleType) mscorlib::System::Runtime::InteropServices::GCHandle::GetTargetHandle\n\n// System.Runtime.InteropServices.Marshal\nSystem.Runtime.InteropServices.Marshal::AddRefInternal(System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::AddRefInternal\nSystem.Runtime.InteropServices.Marshal::AllocCoTaskMem(System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::AllocCoTaskMem\nSystem.Runtime.InteropServices.Marshal::AllocHGlobal(System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::AllocHGlobal\nSystem.Runtime.InteropServices.Marshal::copy_from_unmanaged(System.IntPtr,System.Int32,System.Array,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::copy_from_unmanaged\nSystem.Runtime.InteropServices.Marshal::copy_to_unmanaged(System.Array,System.Int32,System.IntPtr,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::copy_to_unmanaged\nSystem.Runtime.InteropServices.Marshal::DestroyStructure(System.IntPtr,System.Type) mscorlib::System::Runtime::InteropServices::Marshal::DestroyStructure\nSystem.Runtime.InteropServices.Marshal::FreeBSTR(System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::FreeBSTR\nSystem.Runtime.InteropServices.Marshal::FreeCoTaskMem(System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::FreeCoTaskMem\nSystem.Runtime.InteropServices.Marshal::FreeHGlobal(System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::FreeHGlobal\nSystem.Runtime.InteropServices.Marshal::GetCCW(System.Object,System.Type) mscorlib::System::Runtime::InteropServices::Marshal::GetCCW\nSystem.Runtime.InteropServices.Marshal::GetComSlotForMethodInfoInternal(System.Reflection.MemberInfo) mscorlib::System::Runtime::InteropServices::Marshal::GetComSlotForMethodInfoInternal\nSystem.Runtime.InteropServices.Marshal::GetDelegateForFunctionPointerInternal(System.IntPtr,System.Type) mscorlib::System::Runtime::InteropServices::Marshal::GetDelegateForFunctionPointerInternal\nSystem.Runtime.InteropServices.Marshal::GetFunctionPointerForDelegateInternal(System.Delegate) mscorlib::System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegateInternal\nSystem.Runtime.InteropServices.Marshal::GetIDispatchForObjectInternal(System.Object) mscorlib::System::Runtime::InteropServices::Marshal::GetIDispatchForObjectInternal\nSystem.Runtime.InteropServices.Marshal::GetIUnknownForObjectInternal(System.Object) mscorlib::System::Runtime::InteropServices::Marshal::GetIUnknownForObjectInternal\nSystem.Runtime.InteropServices.Marshal::GetLastWin32Error() mscorlib::System::Runtime::InteropServices::Marshal::GetLastWin32Error\nSystem.Runtime.InteropServices.Marshal::GetObjectForCCW(System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::GetObjectForCCW\nSystem.Runtime.InteropServices.Marshal::IsComObject(System.Object) mscorlib::System::Runtime::InteropServices::Marshal::IsComObject\nSystem.Runtime.InteropServices.Marshal::OffsetOf(System.Type,System.String) mscorlib::System::Runtime::InteropServices::Marshal::OffsetOf\nSystem.Runtime.InteropServices.Marshal::Prelink(System.Reflection.MethodInfo) mscorlib::System::Runtime::InteropServices::Marshal::Prelink\nSystem.Runtime.InteropServices.Marshal::PrelinkAll(System.Type) mscorlib::System::Runtime::InteropServices::Marshal::PrelinkAll\nSystem.Runtime.InteropServices.Marshal::PtrToStringAnsi(System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::PtrToStringAnsi_mscorlib_System_String_mscorlib_System_IntPtr\nSystem.Runtime.InteropServices.Marshal::PtrToStringAnsi(System.IntPtr,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::PtrToStringAnsi_mscorlib_System_String_mscorlib_System_IntPtr_mscorlib_System_Int32\nSystem.Runtime.InteropServices.Marshal::PtrToStringBSTR(System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::PtrToStringBSTR\nSystem.Runtime.InteropServices.Marshal::PtrToStringUni(System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::PtrToStringUni_mscorlib_System_String_mscorlib_System_IntPtr\nSystem.Runtime.InteropServices.Marshal::PtrToStringUni(System.IntPtr,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::PtrToStringUni_mscorlib_System_String_mscorlib_System_IntPtr_mscorlib_System_Int32\nSystem.Runtime.InteropServices.Marshal::PtrToStructure(System.IntPtr,System.Object) mscorlib::System::Runtime::InteropServices::Marshal::PtrToStructureObject\nSystem.Runtime.InteropServices.Marshal::PtrToStructure(System.IntPtr,System.Type) mscorlib::System::Runtime::InteropServices::Marshal::PtrToStructure\nSystem.Runtime.InteropServices.Marshal::QueryInterfaceInternal(System.IntPtr,System.Guid&,System.IntPtr&) mscorlib::System::Runtime::InteropServices::Marshal::QueryInterfaceInternal\nSystem.Runtime.InteropServices.Marshal::ReadByte(System.IntPtr,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::ReadByte\nSystem.Runtime.InteropServices.Marshal::ReadInt16(System.IntPtr,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::ReadInt16\nSystem.Runtime.InteropServices.Marshal::ReadInt32(System.IntPtr,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::ReadInt32\nSystem.Runtime.InteropServices.Marshal::ReadInt64(System.IntPtr,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::ReadInt64\nSystem.Runtime.InteropServices.Marshal::ReadIntPtr(System.IntPtr,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::ReadIntPtr\nSystem.Runtime.InteropServices.Marshal::ReAllocCoTaskMem(System.IntPtr,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::ReAllocCoTaskMem\nSystem.Runtime.InteropServices.Marshal::ReAllocHGlobal(System.IntPtr,System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::ReAllocHGlobal\nSystem.Runtime.InteropServices.Marshal::ReleaseComObjectInternal(System.Object) mscorlib::System::Runtime::InteropServices::Marshal::ReleaseComObjectInternal\nSystem.Runtime.InteropServices.Marshal::ReleaseInternal(System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::ReleaseInternal\nSystem.Runtime.InteropServices.Marshal::SizeOf(System.Type) mscorlib::System::Runtime::InteropServices::Marshal::SizeOf\nSystem.Runtime.InteropServices.Marshal::StringToBSTR(System.String) mscorlib::System::Runtime::InteropServices::Marshal::StringToBSTR\nSystem.Runtime.InteropServices.Marshal::StringToHGlobalAnsi(System.String) mscorlib::System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi\nSystem.Runtime.InteropServices.Marshal::StringToHGlobalUni(System.String) mscorlib::System::Runtime::InteropServices::Marshal::StringToHGlobalUni\nSystem.Runtime.InteropServices.Marshal::StructureToPtr(System.Object,System.IntPtr,System.Boolean) mscorlib::System::Runtime::InteropServices::Marshal::StructureToPtr\nSystem.Runtime.InteropServices.Marshal::UnsafeAddrOfPinnedArrayElement(System.Array,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::UnsafeAddrOfPinnedArrayElement\nSystem.Runtime.InteropServices.Marshal::WriteByte(System.IntPtr,System.Int32,System.Byte) mscorlib::System::Runtime::InteropServices::Marshal::WriteByte\nSystem.Runtime.InteropServices.Marshal::WriteInt16(System.IntPtr,System.Int32,System.Char) mscorlib::System::Runtime::InteropServices::Marshal::WriteInt16\nSystem.Runtime.InteropServices.Marshal::WriteInt16(System.IntPtr,System.Int32,System.Int16) mscorlib::System::Runtime::InteropServices::Marshal::WriteInt16\nSystem.Runtime.InteropServices.Marshal::WriteInt32(System.IntPtr,System.Int32,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::WriteInt32\nSystem.Runtime.InteropServices.Marshal::WriteInt64(System.IntPtr,System.Int32,System.Int64) mscorlib::System::Runtime::InteropServices::Marshal::WriteInt64\nSystem.Runtime.InteropServices.Marshal::WriteIntPtr(System.IntPtr,System.Int32,System.IntPtr) mscorlib::System::Runtime::InteropServices::Marshal::WriteIntPtr\nSystem.Runtime.InteropServices.Marshal::BufferToBSTR(System.Array,System.Int32) mscorlib::System::Runtime::InteropServices::Marshal::BufferToBSTR\nSystem.Runtime.InteropServices.Marshal::GetHRForException_WinRT(System.Exception) mscorlib::System::Runtime::InteropServices::Marshal::GetHRForException_WinRT\nSystem.Runtime.InteropServices.Marshal::GetRawIUnknownForComObjectNoAddRef(System.Object) mscorlib::System::Runtime::InteropServices::Marshal::GetRawIUnknownForComObjectNoAddRef\nSystem.Runtime.InteropServices.Marshal::GetNativeActivationFactory(System.Type) mscorlib::System::Runtime::InteropServices::Marshal::GetNativeActivationFactory\n\n// System.Runtime.Remoting.Activation.ActivationServices\nSystem.Runtime.Remoting.Activation.ActivationServices::AllocateUninitializedClassInstance(System.Type) mscorlib::System::Runtime::Remoting::Activation::ActivationServices::AllocateUninitializedClassInstance\nSystem.Runtime.Remoting.Activation.ActivationServices::EnableProxyActivation(System.Type,System.Boolean) mscorlib::System::Runtime::Remoting::Activation::ActivationServices::EnableProxyActivation\n\n// System.Runtime.Remoting.Messaging.MonoMethodMessage\nSystem.Runtime.Remoting.Messaging.MonoMethodMessage::InitMessage(System.Reflection.MonoMethod,System.Object[]) mscorlib::System::Runtime::Remoting::Messaging::MonoMethodMessage::InitMessage\n\n// System.Runtime.Remoting.Proxies.RealProxy\nSystem.Runtime.Remoting.Proxies.RealProxy::InternalGetProxyType(System.Object) mscorlib::System::Runtime::Remoting::Proxies::RealProxy::InternalGetProxyType\nSystem.Runtime.Remoting.Proxies.RealProxy::InternalGetTransparentProxy(System.String) mscorlib::System::Runtime::Remoting::Proxies::RealProxy::InternalGetTransparentProxy\n\n// System.Runtime.Remoting.RemotingServices\nSystem.Runtime.Remoting.RemotingServices::GetVirtualMethod(System.Type,System.Reflection.MethodBase) mscorlib::System::Runtime::Remoting::RemotingServices::GetVirtualMethod\nSystem.Runtime.Remoting.RemotingServices::InternalExecute(System.Reflection.MethodBase,System.Object,System.Object[],System.Object[]&) mscorlib::System::Runtime::Remoting::RemotingServices::InternalExecute\nSystem.Runtime.Remoting.RemotingServices::IsTransparentProxy(System.Object) mscorlib::System::Runtime::Remoting::RemotingServices::IsTransparentProxy\n\n// System.RuntimeMethodHandle\nSystem.RuntimeMethodHandle::GetFunctionPointer(System.IntPtr) mscorlib::System::RuntimeMethodHandle::GetFunctionPointer\n\n// System.Security.Cryptography.RNGCryptoServiceProvider\nSystem.Security.Cryptography.RNGCryptoServiceProvider::RngClose(System.IntPtr) mscorlib::System::Security::Cryptography::RNGCryptoServiceProvider::RngClose\nSystem.Security.Cryptography.RNGCryptoServiceProvider::RngGetBytes(System.IntPtr,System.Byte[]) mscorlib::System::Security::Cryptography::RNGCryptoServiceProvider::RngGetBytes\nSystem.Security.Cryptography.RNGCryptoServiceProvider::RngInitialize(System.Byte[]) mscorlib::System::Security::Cryptography::RNGCryptoServiceProvider::RngInitialize\nSystem.Security.Cryptography.RNGCryptoServiceProvider::RngOpen() mscorlib::System::Security::Cryptography::RNGCryptoServiceProvider::RngOpen\n\n// System.Security.Policy.Evidence\nSystem.Security.Policy.Evidence::IsAuthenticodePresent(System.Reflection.Assembly) mscorlib::System::Security::Policy::Evidence::IsAuthenticodePresent\n\n// System.Security.Principal.WindowsIdentity\nSystem.Security.Principal.WindowsIdentity::_GetRoles(System.IntPtr) mscorlib::System::Security::Principal::WindowsIdentity::_GetRoles\nSystem.Security.Principal.WindowsIdentity::GetCurrentToken() mscorlib::System::Security::Principal::WindowsIdentity::GetCurrentToken\nSystem.Security.Principal.WindowsIdentity::GetTokenName(System.IntPtr) mscorlib::System::Security::Principal::WindowsIdentity::GetTokenName\nSystem.Security.Principal.WindowsIdentity::GetUserToken(System.String) mscorlib::System::Security::Principal::WindowsIdentity::GetUserToken\n\n// System.Security.Principal.WindowsImpersonationContext\nSystem.Security.Principal.WindowsImpersonationContext::CloseToken(System.IntPtr) mscorlib::System::Security::Principal::WindowsImpersonationContext::CloseToken\nSystem.Security.Principal.WindowsImpersonationContext::DuplicateToken(System.IntPtr) mscorlib::System::Security::Principal::WindowsImpersonationContext::DuplicateToken\nSystem.Security.Principal.WindowsImpersonationContext::RevertToSelf() mscorlib::System::Security::Principal::WindowsImpersonationContext::RevertToSelf\nSystem.Security.Principal.WindowsImpersonationContext::SetCurrentToken(System.IntPtr) mscorlib::System::Security::Principal::WindowsImpersonationContext::SetCurrentToken\n\n// System.Security.Principal.WindowsPrincipal\nSystem.Security.Principal.WindowsPrincipal::IsMemberOfGroupId(System.IntPtr,System.IntPtr) mscorlib::System::Security::Principal::WindowsPrincipal::IsMemberOfGroupId\nSystem.Security.Principal.WindowsPrincipal::IsMemberOfGroupName(System.IntPtr,System.String) mscorlib::System::Security::Principal::WindowsPrincipal::IsMemberOfGroupName\n\n// System.Security.SecurityFrame\nSystem.Security.SecurityFrame::_GetSecurityFrame(System.Int32) mscorlib::System::Security::SecurityFrame::_GetSecurityFrame\nSystem.Security.SecurityFrame::_GetSecurityStack(System.Int32) mscorlib::System::Security::SecurityFrame::_GetSecurityStack\n\n// System.Security.SecurityManager\nSystem.Security.SecurityManager::get_CheckExecutionRights() mscorlib::System::Security::SecurityManager::get_CheckExecutionRights\nSystem.Security.SecurityManager::get_SecurityEnabled() mscorlib::System::Security::SecurityManager::get_SecurityEnabled\nSystem.Security.SecurityManager::GetLinkDemandSecurity(System.Reflection.MethodBase,System.Security.RuntimeDeclSecurityActions*,System.Security.RuntimeDeclSecurityActions*) mscorlib::System::Security::SecurityManager::GetLinkDemandSecurity\nSystem.Security.SecurityManager::set_CheckExecutionRights(System.Boolean) mscorlib::System::Security::SecurityManager::set_CheckExecutionRights\nSystem.Security.SecurityManager::set_SecurityEnabled(System.Boolean) mscorlib::System::Security::SecurityManager::set_SecurityEnabled\n\n//\nSystem.String::.ctor(System.Char*) mscorlib::System::String::RedirectToCreateString\nSystem.String::.ctor(System.Char*,System.Int32,System.Int32) mscorlib::System::String::RedirectToCreateString\nSystem.String::.ctor(System.Char,System.Int32) mscorlib::System::String::RedirectToCreateString\nSystem.String::.ctor(System.Char[]) mscorlib::System::String::RedirectToCreateString\nSystem.String::.ctor(System.Char[],System.Int32,System.Int32) mscorlib::System::String::RedirectToCreateString\nSystem.String::.ctor(System.SByte*) mscorlib::System::String::RedirectToCreateString\nSystem.String::.ctor(System.SByte*,System.Int32,System.Int32) mscorlib::System::String::RedirectToCreateString\nSystem.String::.ctor(System.SByte*,System.Int32,System.Int32,System.Text.Encoding) mscorlib::System::String::RedirectToCreateString\n\n// System.String\nSystem.String::InternalAllocateStr(System.Int32) mscorlib::System::String::InternalAllocateStr\nSystem.String::InternalIntern(System.String) mscorlib::System::String::InternalIntern\nSystem.String::InternalIsInterned(System.String) mscorlib::System::String::InternalIsInterned\nSystem.String::InternalSplit(System.Char[],System.Int32,System.Int32) mscorlib::System::String::InternalSplit\nSystem.String::FastAllocateString(System.Int32) mscorlib::System::String::FastAllocateString\n\n// System.Text.Encoding\nSystem.Text.Encoding::InternalCodePage(System.Int32&) mscorlib::System::Text::Encoding::InternalCodePage\n\n// System.Threading.Interlocked\nSystem.Threading.Interlocked::Add(System.Int32&,System.Int32) mscorlib::System::Threading::Interlocked::Add\nSystem.Threading.Interlocked::Add(System.Int64&,System.Int64) mscorlib::System::Threading::Interlocked::Add64\nSystem.Threading.Interlocked::CompareExchange(System.Double&,System.Double,System.Double) mscorlib::System::Threading::Interlocked::CompareExchangeDouble\nSystem.Threading.Interlocked::CompareExchange(System.Int32&,System.Int32,System.Int32) mscorlib::System::Threading::Interlocked::CompareExchange\nSystem.Threading.Interlocked::CompareExchange(System.Int64&,System.Int64,System.Int64) mscorlib::System::Threading::Interlocked::CompareExchange64\nSystem.Threading.Interlocked::CompareExchange(System.IntPtr&,System.IntPtr,System.IntPtr) mscorlib::System::Threading::Interlocked::CompareExchangeIntPtr\nSystem.Threading.Interlocked::CompareExchange(System.Object&,System.Object,System.Object) mscorlib::System::Threading::Interlocked::CompareExchange_T\nSystem.Threading.Interlocked::CompareExchange(System.Single&,System.Single,System.Single) mscorlib::System::Threading::Interlocked::CompareExchangeSingle\nSystem.Threading.Interlocked::CompareExchange(T&,T,T) mscorlib::System::Threading::Interlocked::CompareExchange_T\nSystem.Threading.Interlocked::Decrement(System.Int32&) mscorlib::System::Threading::Interlocked::Decrement\nSystem.Threading.Interlocked::Decrement(System.Int64&) mscorlib::System::Threading::Interlocked::Decrement64\nSystem.Threading.Interlocked::Exchange(T&,T,T) mscorlib::System::Threading::Interlocked::ExchangePointer\nSystem.Threading.Interlocked::Exchange(System.Double&,System.Double) mscorlib::System::Threading::Interlocked::ExchangeDouble\nSystem.Threading.Interlocked::Exchange(System.Int32&,System.Int32) mscorlib::System::Threading::Interlocked::Exchange\nSystem.Threading.Interlocked::Exchange(System.Int64&,System.Int64) mscorlib::System::Threading::Interlocked::Exchange64\nSystem.Threading.Interlocked::Exchange(System.IntPtr&,System.IntPtr) mscorlib::System::Threading::Interlocked::ExchangeIntPtr\nSystem.Threading.Interlocked::Exchange(System.Object&,System.Object) mscorlib::System::Threading::Interlocked::ExchangePointer\nSystem.Threading.Interlocked::Exchange(System.Single&,System.Single) mscorlib::System::Threading::Interlocked::ExchangeSingle\nSystem.Threading.Interlocked::Increment(System.Int32&) mscorlib::System::Threading::Interlocked::Increment\nSystem.Threading.Interlocked::Increment(System.Int64&) mscorlib::System::Threading::Interlocked::Increment64\nSystem.Threading.Interlocked::Read(System.Int64&) mscorlib::System::Threading::Interlocked::Read\nSystem.Threading.Interlocked::CompareExchange(System.Int32&,System.Int32,System.Int32,System.Boolean&) mscorlib::System::Threading::Interlocked::CompareExchange\n\n// System.Threading.Monitor\nSystem.Threading.Monitor::Enter(System.Object) mscorlib::System::Threading::Monitor::Enter\nSystem.Threading.Monitor::Exit(System.Object) mscorlib::System::Threading::Monitor::Exit\nSystem.Threading.Monitor::Monitor_pulse(System.Object) mscorlib::System::Threading::Monitor::Monitor_pulse\nSystem.Threading.Monitor::Monitor_pulse_all(System.Object) mscorlib::System::Threading::Monitor::Monitor_pulse_all\nSystem.Threading.Monitor::Monitor_test_synchronised(System.Object) mscorlib::System::Threading::Monitor::Monitor_test_synchronised\nSystem.Threading.Monitor::Monitor_try_enter(System.Object,System.Int32) mscorlib::System::Threading::Monitor::Monitor_try_enter\nSystem.Threading.Monitor::Monitor_wait(System.Object,System.Int32) mscorlib::System::Threading::Monitor::Monitor_wait\nSystem.Threading.Monitor::Monitor_test_owner(System.Object) mscorlib::System::Threading::Monitor::Monitor_test_owner\nSystem.Threading.Monitor::enter_with_atomic_var(System.Object,System.Boolean&) mscorlib::System::Threading::Monitor::enter_with_atomic_var\nSystem.Threading.Monitor::try_enter_with_atomic_var(System.Object,System.Int32,System.Boolean&) mscorlib::System::Threading::Monitor::try_enter_with_atomic_var\n\n// System.Threading.Mutex\nSystem.Threading.Mutex::CreateMutex_internal(System.Boolean,System.String,System.Boolean&) mscorlib::System::Threading::Mutex::CreateMutex_internal\nSystem.Threading.Mutex::OpenMutex_internal(System.String,System.Security.AccessControl.MutexRights,System.IO.MonoIOError&) mscorlib::System::Threading::Mutex::OpenMutex_internal\nSystem.Threading.Mutex::ReleaseMutex_internal(System.IntPtr) mscorlib::System::Threading::Mutex::ReleaseMutex_internal\n\n// System.Threading.NativeEventCalls\nSystem.Threading.NativeEventCalls::CloseEvent_internal(System.IntPtr) mscorlib::System::Threading::NativeEventCalls::CloseEvent_internal\nSystem.Threading.NativeEventCalls::CreateEvent_internal(System.Boolean,System.Boolean,System.String,System.Boolean&) mscorlib::System::Threading::NativeEventCalls::CreateEvent_internal\nSystem.Threading.NativeEventCalls::CreateEvent_internal(System.Boolean,System.Boolean,System.String,System.Int32&) mscorlib::System::Threading::NativeEventCalls::CreateEvent_internal\nSystem.Threading.NativeEventCalls::OpenEvent_internal(System.String,System.Security.AccessControl.EventWaitHandleRights,System.IO.MonoIOError&) mscorlib::System::Threading::NativeEventCalls::OpenEvent_internal\nSystem.Threading.NativeEventCalls::OpenEvent_internal(System.String,System.Security.AccessControl.EventWaitHandleRights,System.Int32&) mscorlib::System::Threading::NativeEventCalls::OpenEvent_internal\nSystem.Threading.NativeEventCalls::ResetEvent_internal(System.IntPtr) mscorlib::System::Threading::NativeEventCalls::ResetEvent_internal\nSystem.Threading.NativeEventCalls::SetEvent_internal(System.IntPtr) mscorlib::System::Threading::NativeEventCalls::SetEvent_internal\n\n// System.Threading.Semaphore\nSystem.Threading.Semaphore::CreateSemaphore_internal(System.Int32,System.Int32,System.String,System.Boolean&) System::System::Threading::Semaphore::CreateSemaphore_internal\nSystem.Threading.Semaphore::OpenSemaphore_internal(System.String,System.Security.AccessControl.SemaphoreRights,System.IO.MonoIOError&) System::System::Threading::Semaphore::OpenSemaphore_internal\nSystem.Threading.Semaphore::ReleaseSemaphore_internal(System.IntPtr,System.Int32,System.Boolean&) System::System::Threading::Semaphore::ReleaseSemaphore_internal\nSystem.Threading.Semaphore::CreateSemaphore_internal(System.Int32,System.Int32,System.String,System.Int32&) System::System::Threading::Semaphore::CreateSemaphore_internal40\nSystem.Threading.Semaphore::ReleaseSemaphore_internal(System.IntPtr,System.Int32,System.Int32&) System::System::Threading::Semaphore::ReleaseSemaphore_internal40\n\n// System.Threading.Thread\nSystem.Threading.Thread::Abort_internal(System.Object) mscorlib::System::Threading::Thread::Abort_internal\nSystem.Threading.Thread::ClrState(System.Threading.ThreadState) mscorlib::System::Threading::Thread::ClrState\nSystem.Threading.Thread::CurrentThread_internal() mscorlib::System::Threading::Thread::CurrentThread_internal\nSystem.Threading.Thread::FreeLocalSlotValues(System.Int32,System.Boolean) mscorlib::System::Threading::Thread::FreeLocalSlotValues\nSystem.Threading.Thread::GetAbortExceptionState() mscorlib::System::Threading::Thread::GetAbortExceptionState\nSystem.Threading.Thread::GetCachedCurrentCulture() mscorlib::System::Threading::Thread::GetCachedCurrentCulture\nSystem.Threading.Thread::GetCachedCurrentUICulture() mscorlib::System::Threading::Thread::GetCachedCurrentUICulture\nSystem.Threading.Thread::GetDomainID() mscorlib::System::Threading::Thread::GetDomainID\nSystem.Threading.Thread::GetName_internal() mscorlib::System::Threading::Thread::GetName_internal\nSystem.Threading.Thread::GetNewManagedId_internal() mscorlib::System::Threading::Thread::GetNewManagedId_internal\nSystem.Threading.Thread::GetSerializedCurrentCulture() mscorlib::System::Threading::Thread::GetSerializedCurrentCulture\nSystem.Threading.Thread::GetSerializedCurrentUICulture() mscorlib::System::Threading::Thread::GetSerializedCurrentUICulture\nSystem.Threading.Thread::GetState() mscorlib::System::Threading::Thread::GetState\nSystem.Threading.Thread::Interrupt_internal() mscorlib::System::Threading::Thread::Interrupt_internal\nSystem.Threading.Thread::Join_internal(System.Int32,System.IntPtr) mscorlib::System::Threading::Thread::Join_internal\nSystem.Threading.Thread::MemoryBarrier() mscorlib::System::Threading::Thread::MemoryBarrier_\nSystem.Threading.Thread::ResetAbort_internal() mscorlib::System::Threading::Thread::ResetAbort_internal\nSystem.Threading.Thread::Resume_internal() mscorlib::System::Threading::Thread::Resume_internal\nSystem.Threading.Thread::SetCachedCurrentCulture(System.Globalization.CultureInfo) mscorlib::System::Threading::Thread::SetCachedCurrentCulture\nSystem.Threading.Thread::SetCachedCurrentUICulture(System.Globalization.CultureInfo) mscorlib::System::Threading::Thread::SetCachedCurrentUICulture\nSystem.Threading.Thread::SetName_internal(System.String) mscorlib::System::Threading::Thread::SetName_internal\nSystem.Threading.Thread::SetSerializedCurrentCulture(System.Byte[]) mscorlib::System::Threading::Thread::SetSerializedCurrentCulture\nSystem.Threading.Thread::SetSerializedCurrentUICulture(System.Byte[]) mscorlib::System::Threading::Thread::SetSerializedCurrentUICulture\nSystem.Threading.Thread::SetState(System.Threading.ThreadState) mscorlib::System::Threading::Thread::SetState\nSystem.Threading.Thread::Sleep_internal(System.Int32) mscorlib::System::Threading::Thread::Sleep_internal\nSystem.Threading.Thread::SpinWait_nop() mscorlib::System::Threading::Thread::SpinWait_nop\nSystem.Threading.Thread::Suspend_internal() mscorlib::System::Threading::Thread::Suspend_internal\nSystem.Threading.Thread::Thread_free_internal(System.IntPtr) mscorlib::System::Threading::Thread::Thread_free_internal\nSystem.Threading.Thread::Thread_init() mscorlib::System::Threading::Thread::Thread_init\nSystem.Threading.Thread::Thread_internal(System.MulticastDelegate) mscorlib::System::Threading::Thread::Thread_internal\nSystem.Threading.Thread::VolatileRead(System.Byte&) mscorlib::System::Threading::Thread::VolatileReadInt8\nSystem.Threading.Thread::VolatileRead(System.Double&) mscorlib::System::Threading::Thread::VolatileReadDouble\nSystem.Threading.Thread::VolatileRead(System.Int16&) mscorlib::System::Threading::Thread::VolatileReadInt16\nSystem.Threading.Thread::VolatileRead(System.Int32&) mscorlib::System::Threading::Thread::VolatileReadInt32\nSystem.Threading.Thread::VolatileRead(System.Int64&) mscorlib::System::Threading::Thread::VolatileReadInt64\nSystem.Threading.Thread::VolatileRead(System.IntPtr&) mscorlib::System::Threading::Thread::VolatileReadIntPtr\nSystem.Threading.Thread::VolatileRead(System.Object&) mscorlib::System::Threading::Thread::VolatileReadPtr\nSystem.Threading.Thread::VolatileRead(System.SByte&) mscorlib::System::Threading::Thread::VolatileReadInt8\nSystem.Threading.Thread::VolatileRead(System.Single&) mscorlib::System::Threading::Thread::VolatileReadFloat\nSystem.Threading.Thread::VolatileRead(System.UInt16&) mscorlib::System::Threading::Thread::VolatileReadInt16\nSystem.Threading.Thread::VolatileRead(System.UInt32&) mscorlib::System::Threading::Thread::VolatileReadInt32\nSystem.Threading.Thread::VolatileRead(System.UInt64&) mscorlib::System::Threading::Thread::VolatileReadInt64\nSystem.Threading.Thread::VolatileRead(System.UIntPtr&) mscorlib::System::Threading::Thread::VolatileReadIntPtr\nSystem.Threading.Thread::VolatileWrite(System.Byte&,System.Byte) mscorlib::System::Threading::Thread::VolatileWriteInt8\nSystem.Threading.Thread::VolatileWrite(System.Double&,System.Double) mscorlib::System::Threading::Thread::VolatileWriteDouble\nSystem.Threading.Thread::VolatileWrite(System.Int16&,System.Int16) mscorlib::System::Threading::Thread::VolatileWriteInt16\nSystem.Threading.Thread::VolatileWrite(System.Int32&,System.Int32) mscorlib::System::Threading::Thread::VolatileWriteInt32\nSystem.Threading.Thread::VolatileWrite(System.Int64&,System.Int64) mscorlib::System::Threading::Thread::VolatileWriteInt64\nSystem.Threading.Thread::VolatileWrite(System.IntPtr&,System.IntPtr) mscorlib::System::Threading::Thread::VolatileWriteIntPtr\nSystem.Threading.Thread::VolatileWrite(System.Object&,System.Object) mscorlib::System::Threading::Thread::VolatileWritePtr\nSystem.Threading.Thread::VolatileWrite(System.SByte&,System.SByte) mscorlib::System::Threading::Thread::VolatileWriteInt8\nSystem.Threading.Thread::VolatileWrite(System.Single&,System.Single) mscorlib::System::Threading::Thread::VolatileWriteFloat\nSystem.Threading.Thread::VolatileWrite(System.UInt16&,System.UInt16) mscorlib::System::Threading::Thread::VolatileWriteInt16\nSystem.Threading.Thread::VolatileWrite(System.UInt32&,System.UInt32) mscorlib::System::Threading::Thread::VolatileWriteInt32\nSystem.Threading.Thread::VolatileWrite(System.UInt64&,System.UInt64) mscorlib::System::Threading::Thread::VolatileWriteInt64\nSystem.Threading.Thread::VolatileWrite(System.UIntPtr&,System.UIntPtr) mscorlib::System::Threading::Thread::VolatileWriteIntPtr\nSystem.Threading.Thread::ByteArrayToCurrentDomain(System.Byte[]) mscorlib::System::Threading::Thread::ByteArrayToCurrentDomain\nSystem.Threading.Thread::ByteArrayToRootDomain(System.Byte[]) mscorlib::System::Threading::Thread::ByteArrayToRootDomain\nSystem.Threading.Thread::YieldInternal() mscorlib::System::Threading::Thread::YieldInternal\nSystem.Threading.Thread::JoinInternal(System.Int32) mscorlib::System::Threading::Thread::JoinInternal\nSystem.Threading.Thread::GetPriorityNative() mscorlib::System::Threading::Thread::GetPriorityNative\nSystem.Threading.Thread::SystemMaxStackStize() mscorlib::System::Threading::Thread::SystemMaxStackStize\nSystem.Threading.Thread::GetName_internal(System.Threading.InternalThread) mscorlib::System::Threading::Thread::GetName_internal40\nSystem.Threading.Thread::CurrentInternalThread_internal() mscorlib::System::Threading::Thread::CurrentInternalThread_internal\nSystem.Threading.Thread::GetState(System.Threading.InternalThread) mscorlib::System::Threading::Thread::GetState40\nSystem.Threading.Thread::Abort_internal(System.Threading.InternalThread,System.Object) mscorlib::System::Threading::Thread::Abort_internal40\nSystem.Threading.Thread::ClrState(System.Threading.InternalThread,System.Threading.ThreadState) mscorlib::System::Threading::Thread::ClrState40\nSystem.Threading.Thread::ConstructInternalThread() mscorlib::System::Threading::Thread::ConstructInternalThread\nSystem.Threading.Thread::GetStackTraces(System.Threading.Thread[]&,System.Object[]&) mscorlib::System::Threading::Thread::GetStackTraces\nSystem.Threading.Thread::InterruptInternal() mscorlib::System::Threading::Thread::InterruptInternal\nSystem.Threading.Thread::ResetAbortNative() mscorlib::System::Threading::Thread::ResetAbortNative\nSystem.Threading.Thread::ResumeInternal() mscorlib::System::Threading::Thread::ResumeInternal\nSystem.Threading.Thread::SetName_internal(System.Threading.InternalThread,System.String) mscorlib::System::Threading::Thread::SetName_internal40\nSystem.Threading.Thread::SetPriorityNative(System.Int32) mscorlib::System::Threading::Thread::SetPriorityNative\nSystem.Threading.Thread::SetState(System.Threading.InternalThread,System.Threading.ThreadState) mscorlib::System::Threading::Thread::SetState40\nSystem.Threading.Thread::SleepInternal(System.Int32) mscorlib::System::Threading::Thread::SleepInternal\nSystem.Threading.Thread::SuspendInternal() mscorlib::System::Threading::Thread::SuspendInternal\n\n// System.Threading.ThreadPool\nSystem.Threading.ThreadPool::GetAvailableThreads(System.Int32&,System.Int32&) mscorlib::System::Threading::ThreadPool::GetAvailableThreads\nSystem.Threading.ThreadPool::GetMaxThreads(System.Int32&,System.Int32&) mscorlib::System::Threading::ThreadPool::GetMaxThreads\nSystem.Threading.ThreadPool::GetMinThreads(System.Int32&,System.Int32&) mscorlib::System::Threading::ThreadPool::GetMinThreads\nSystem.Threading.ThreadPool::SetMaxThreads(System.Int32,System.Int32) mscorlib::System::Threading::ThreadPool::SetMaxThreads\nSystem.Threading.ThreadPool::SetMinThreads(System.Int32,System.Int32) mscorlib::System::Threading::ThreadPool::SetMinThreads\nSystem.Threading.ThreadPool::BindIOCompletionCallbackNative(System.IntPtr) ves_icall_System_Threading_ThreadPool_BindIOCompletionCallbackNative\nSystem.Threading.ThreadPool::IsThreadPoolHosted() ves_icall_System_Threading_ThreadPool_IsThreadPoolHosted\nSystem.Threading.ThreadPool::NotifyWorkItemComplete() ves_icall_System_Threading_ThreadPool_NotifyWorkItemComplete\nSystem.Threading.ThreadPool::PostQueuedCompletionStatus(System.Threading.NativeOverlapped*) ves_icall_System_Threading_ThreadPool_PostQueuedCompletionStatus\nSystem.Threading.ThreadPool::RequestWorkerThread() ves_icall_System_Threading_ThreadPool_RequestWorkerThread\nSystem.Threading.ThreadPool::SetMaxThreadsNative(System.Int32,System.Int32) ves_icall_System_Threading_ThreadPool_SetMaxThreadsNative\nSystem.Threading.ThreadPool::SetMinThreadsNative(System.Int32,System.Int32) ves_icall_System_Threading_ThreadPool_SetMinThreadsNative\nSystem.Threading.ThreadPool::GetAvailableThreadsNative(System.Int32&,System.Int32&) ves_icall_System_Threading_ThreadPool_GetAvailableThreadsNative\nSystem.Threading.ThreadPool::GetMaxThreadsNative(System.Int32&,System.Int32&) ves_icall_System_Threading_ThreadPool_GetMaxThreadsNative\nSystem.Threading.ThreadPool::GetMinThreadsNative(System.Int32&,System.Int32&) ves_icall_System_Threading_ThreadPool_GetMinThreadsNative\nSystem.Threading.ThreadPool::InitializeVMTp(System.Boolean&) ves_icall_System_Threading_ThreadPool_InitializeVMTp\nSystem.Threading.ThreadPool::NotifyWorkItemProgressNative() ves_icall_System_Threading_ThreadPool_NotifyWorkItemProgressNative\nSystem.Threading.ThreadPool::ReportThreadStatus(System.Boolean) ves_icall_System_Threading_ThreadPool_ReportThreadStatus\n\n// System.Threading.WaitHandle\nSystem.Threading.WaitHandle::SignalAndWait_Internal(System.IntPtr,System.IntPtr,System.Int32,System.Boolean) mscorlib::System::Threading::WaitHandle::SignalAndWait_Internal\nSystem.Threading.WaitHandle::WaitAll_internal(System.Threading.WaitHandle[],System.Int32,System.Boolean) mscorlib::System::Threading::WaitHandle::WaitAll_internal\nSystem.Threading.WaitHandle::WaitAny_internal(System.Threading.WaitHandle[],System.Int32,System.Boolean) mscorlib::System::Threading::WaitHandle::WaitAny_internal\nSystem.Threading.WaitHandle::WaitOne_internal(System.IntPtr,System.Int32,System.Boolean) mscorlib::System::Threading::WaitHandle::WaitOne_internal\nSystem.Threading.WaitHandle::SignalAndWait_Internal(System.IntPtr,System.IntPtr,System.Int32) mscorlib::System::Threading::WaitHandle::SignalAndWait_Internal40\nSystem.Threading.WaitHandle::WaitAll_internal(System.Threading.WaitHandle[],System.Int32) mscorlib::System::Threading::WaitHandle::WaitAll_internal40\nSystem.Threading.WaitHandle::WaitAny_internal(System.Threading.WaitHandle[],System.Int32) mscorlib::System::Threading::WaitHandle::WaitAny_internal40\nSystem.Threading.WaitHandle::WaitOne_internal(System.IntPtr,System.Int32) mscorlib::System::Threading::WaitHandle::WaitOne_internal40\n\n// System.Type\nSystem.Type::EqualsInternal(System.Type) mscorlib::System::Type::EqualsInternal\nSystem.Type::get_IsGenericType() mscorlib::System::Type::get_IsGenericType\nSystem.Type::get_IsGenericTypeDefinition() mscorlib::System::Type::get_IsGenericTypeDefinition\nSystem.Type::GetGenericParameterAttributes() mscorlib::System::Type::GetGenericParameterAttributes\nSystem.Type::GetGenericParameterConstraints_impl() mscorlib::System::Type::GetGenericParameterConstraints_impl\nSystem.Type::GetGenericParameterPosition() mscorlib::System::Type::GetGenericParameterPosition\nSystem.Type::GetGenericTypeDefinition_impl() mscorlib::System::Type::GetGenericTypeDefinition_impl\nSystem.Type::GetInterfaceMapData(System.Type,System.Type,System.Reflection.MethodInfo[]&,System.Reflection.MethodInfo[]&) mscorlib::System::Type::GetInterfaceMapData\nSystem.Type::GetPacking(System.Int32&,System.Int32&) mscorlib::System::Type::GetPacking\nSystem.Type::GetTypeCodeInternal(System.Type) mscorlib::System::Type::GetTypeCodeInternal\nSystem.Type::internal_from_handle(System.IntPtr) mscorlib::System::Type::internal_from_handle\nSystem.Type::internal_from_name(System.String,System.Boolean,System.Boolean) mscorlib::System::Type::internal_from_name\nSystem.Type::IsArrayImpl(System.Type) mscorlib::System::Type::IsArrayImpl\nSystem.Type::IsInstanceOfType(System.Object) mscorlib::System::Type::IsInstanceOfType\nSystem.Type::make_array_type(System.Int32) mscorlib::System::Type::make_array_type\nSystem.Type::make_byref_type() mscorlib::System::Type::make_byref_type\nSystem.Type::MakeGenericType(System.Type,System.Type[]) mscorlib::System::Type::MakeGenericType\nSystem.Type::MakePointerType() mscorlib::System::Type::MakePointerType\nSystem.Type::type_is_assignable_from(System.Type,System.Type) mscorlib::System::Type::type_is_assignable_from\nSystem.Type::type_is_subtype_of(System.Type,System.Type,System.Boolean) mscorlib::System::Type::type_is_subtype_of\n\n// System.TypedReference\nSystem.TypedReference::ToObject(System.TypedReference) mscorlib::System::TypedReference::ToObject\nSystem.TypedReference::InternalToObject(System.Void*) mscorlib::System::TypedReference::InternalToObject\nSystem.TypedReference::MakeTypedReferenceInternal(System.Object,System.Reflection.FieldInfo[]) mscorlib::System::TypedReference::MakeTypedReferenceInternal\n\n// System.ValueType\nSystem.ValueType::InternalEquals(System.Object,System.Object,System.Object[]&) mscorlib::System::ValueType::InternalEquals\nSystem.ValueType::InternalGetHashCode(System.Object,System.Object[]&) mscorlib::System::ValueType::InternalGetHashCode\n\n// System.CLRConfig\nSystem.CLRConfig::CheckThrowUnobservedTaskExceptions() mscorlib::System::CLRConfig::CheckThrowUnobservedTaskExceptions\n\n// System.Exception\nSystem.Exception::nIsTransient(System.Int32) mscorlib::System::Exception::nIsTransient\nSystem.Exception::GetMethodFromStackTrace(System.Object) mscorlib::System::Exception::GetMethodFromStackTrace\n\n// System.Number\nSystem.Number::NumberBufferToDecimal(System.Byte*,System.Decimal&) mscorlib::System::Number::NumberBufferToDecimal\nSystem.Number::NumberBufferToDouble(System.Byte*,System.Double&) mscorlib::System::Number::NumberBufferToDouble\n\n// System.RuntimeType\nSystem.RuntimeType::IsTypeExportedToWindowsRuntime(System.RuntimeType) mscorlib::System::RuntimeType::IsTypeExportedToWindowsRuntime\nSystem.RuntimeType::IsWindowsRuntimeObjectType(System.RuntimeType) mscorlib::System::RuntimeType::IsWindowsRuntimeObjectType\nSystem.RuntimeType::get_core_clr_security_level() mscorlib::System::RuntimeType::get_core_clr_security_level\nSystem.RuntimeType::GetGenericParameterPosition() mscorlib::System::RuntimeType::GetGenericParameterPosition\nSystem.RuntimeType::CreateInstanceInternal(System.Type) mscorlib::System::RuntimeType::CreateInstanceInternal\nSystem.RuntimeType::GetGenericParameterAttributes() mscorlib::System::RuntimeType::GetGenericParameterAttributes\nSystem.RuntimeType::get_DeclaringMethod() mscorlib::System::RuntimeType::get_DeclaringMethod\nSystem.RuntimeType::GetConstructors_internal(System.Reflection.BindingFlags,System.Type) mscorlib::System::RuntimeType::GetConstructors_internal\nSystem.RuntimeType::GetEvents_internal(System.String,System.Reflection.BindingFlags,System.Type) mscorlib::System::RuntimeType::GetEvents_internal\nSystem.RuntimeType::GetFields_internal(System.String,System.Reflection.BindingFlags,System.Type) mscorlib::System::RuntimeType::GetFields_internal\nSystem.RuntimeType::GetMethodsByName(System.String,System.Reflection.BindingFlags,System.Boolean,System.Type) mscorlib::System::RuntimeType::GetMethodsByName\nSystem.RuntimeType::GetPropertiesByName(System.String,System.Reflection.BindingFlags,System.Boolean,System.Type) mscorlib::System::RuntimeType::GetPropertiesByName\nSystem.RuntimeType::GetNestedTypes_internal(System.String,System.Reflection.BindingFlags) mscorlib::System::RuntimeType::GetNestedTypes_internal\nSystem.RuntimeType::get_Name() mscorlib::System::RuntimeType::get_Name\nSystem.RuntimeType::get_Namespace() mscorlib::System::RuntimeType::get_Namespace\nSystem.RuntimeType::getFullName(System.Boolean,System.Boolean) mscorlib::System::RuntimeType::getFullName\nSystem.RuntimeType::get_DeclaringType() mscorlib::System::RuntimeType::get_DeclaringType\nSystem.RuntimeType::make_array_type(System.Int32) mscorlib::System::RuntimeType::make_array_type\nSystem.RuntimeType::make_byref_type() mscorlib::System::RuntimeType::make_byref_type\nSystem.RuntimeType::MakeGenericType(System.Type,System.Type[]) mscorlib::System::RuntimeType::MakeGenericType\nSystem.RuntimeType::MakePointerType(System.Type) mscorlib::System::RuntimeType::MakePointerType\nSystem.RuntimeType::GetGenericArgumentsInternal(System.Boolean) mscorlib::System::RuntimeType::GetGenericArgumentsInternal\nSystem.RuntimeType::GetGenericParameterConstraints_impl() mscorlib::System::RuntimeType::GetGenericParameterConstraints_impl\nSystem.RuntimeType::GetInterfaces() mscorlib::System::RuntimeType::GetInterfaces\nSystem.RuntimeType::GetTypeCodeImplInternal(System.Type) mscorlib::System::RuntimeType::GetTypeCodeImplInternal\nSystem.RuntimeType::GetInterfaceMapData(System.Type,System.Type,System.Reflection.MethodInfo[]&,System.Reflection.MethodInfo[]&) mscorlib::System::RuntimeType::GetInterfaceMapData\nSystem.RuntimeType::GetPacking(System.Int32&,System.Int32&) mscorlib::System::RuntimeType::GetPacking\nSystem.RuntimeType::GetConstructors_native(System.Reflection.BindingFlags) mscorlib::System::RuntimeType::GetConstructors_native\nSystem.RuntimeType::GetEvents_native(System.IntPtr,System.Reflection.BindingFlags) mscorlib::System::RuntimeType::GetEvents_native\nSystem.RuntimeType::GetFields_native(System.IntPtr,System.Reflection.BindingFlags) mscorlib::System::RuntimeType::GetFields_native\nSystem.RuntimeType::GetMethodsByName_native(System.IntPtr,System.Reflection.BindingFlags,System.Boolean) mscorlib::System::RuntimeType::GetMethodsByName_native\nSystem.RuntimeType::GetNestedTypes_native(System.IntPtr,System.Reflection.BindingFlags) mscorlib::System::RuntimeType::GetNestedTypes_native\nSystem.RuntimeType::GetPropertiesByName_native(System.IntPtr,System.Reflection.BindingFlags,System.Boolean) mscorlib::System::RuntimeType::GetPropertiesByName_native\n\n// System.RuntimeTypeHandle\nSystem.RuntimeTypeHandle::HasInstantiation(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::HasInstantiation\nSystem.RuntimeTypeHandle::IsArray(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::IsArray\nSystem.RuntimeTypeHandle::IsByRef(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::IsByRef\nSystem.RuntimeTypeHandle::IsComObject(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::IsComObject\nSystem.RuntimeTypeHandle::IsGenericTypeDefinition(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::IsGenericTypeDefinition\nSystem.RuntimeTypeHandle::IsGenericVariable(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::IsGenericVariable\nSystem.RuntimeTypeHandle::IsInstanceOfType(System.RuntimeType,System.Object) mscorlib::System::RuntimeTypeHandle::IsInstanceOfType\nSystem.RuntimeTypeHandle::IsPointer(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::IsPointer\nSystem.RuntimeTypeHandle::IsPrimitive(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::IsPrimitive\nSystem.RuntimeTypeHandle::type_is_assignable_from(System.Type,System.Type) mscorlib::System::RuntimeTypeHandle::type_is_assignable_from\nSystem.RuntimeTypeHandle::GetArrayRank(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::GetArrayRank\nSystem.RuntimeTypeHandle::GetMetadataToken(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::GetMetadataToken\nSystem.RuntimeTypeHandle::GetAssembly(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::GetAssembly\nSystem.RuntimeTypeHandle::GetModule(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::GetModule\nSystem.RuntimeTypeHandle::GetAttributes(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::GetAttributes\nSystem.RuntimeTypeHandle::GetBaseType(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::GetBaseType\nSystem.RuntimeTypeHandle::GetElementType(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::GetElementType\nSystem.RuntimeTypeHandle::GetGenericTypeDefinition_impl(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::GetGenericTypeDefinition_impl\nSystem.RuntimeTypeHandle::GetGenericParameterInfo(System.RuntimeType) mscorlib::System::RuntimeTypeHandle::GetGenericParameterInfo\n\n// System.TimeSpan\nSystem.TimeSpan::LegacyFormatMode() mscorlib::System::TimeSpan::LegacyFormatMode\n\n// System.MissingMemberException\nSystem.MissingMemberException::FormatSignature(System.Byte[]) mscorlib::System::MissingMemberException::FormatSignature\n\n// System.IOSelector\nSystem.IOSelector::Add(System.IntPtr,System.IOSelectorJob) ves_icall_System_IOSelector_Add\nSystem.IOSelector::Remove(System.IntPtr) ves_icall_System_IOSelector_Remove\n\n// System.RuntimeFieldHandle\nSystem.RuntimeFieldHandle::SetValueDirect(System.Reflection.RtFieldInfo,System.RuntimeType,System.Void*,System.Object,System.RuntimeType) mscorlib::System::RuntimeFieldHandle::SetValueDirect\nSystem.RuntimeFieldHandle::SetValueInternal(System.Reflection.FieldInfo,System.Object,System.Object) mscorlib::System::RuntimeFieldHandle::SetValueInternal\n\n// System.Threading.Volatile\nSystem.Threading.Volatile::Read(System.Byte&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.Boolean&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.Double&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.Int16&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.Int32&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.Int64&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.IntPtr&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.SByte&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.Single&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.UInt16&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.UInt32&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.UInt64&) mscorlib::System::Threading::Volatile::Read\nSystem.Threading.Volatile::Read(System.UIntPtr&) mscorlib::System::Threading::Volatile::Read\n\n// System.Threading.Timer\nSystem.Threading.Timer::GetTimeMonotonic() mscorlib::System::Threading::Timer::GetTimeMonotonic\n\n// System.Threading.InternalThread\nSystem.Threading.InternalThread::Thread_free_internal(System.IntPtr) mscorlib::System::Threading::InternalThread::Thread_free_internal\n\n// System.Diagnostics.Assert\nSystem.Diagnostics.Assert::ShowDefaultAssertDialog(System.String,System.String,System.String,System.String) mscorlib::System::Diagnostics::Assert::ShowDefaultAssertDialog\n\n// System.Globalization.CalendarData\nSystem.Globalization.CalendarData::fill_calendar_data(System.String,System.Int32) mscorlib::System::Globalization::CalendarData::fill_calendar_data\n\n// System.Globalization.CultureData\nSystem.Globalization.CultureData::fill_culture_data(System.Int32) mscorlib::System::Globalization::CultureData::fill_culture_data\nSystem.Globalization.CultureData::fill_number_data(System.Globalization.NumberFormatInfo,System.Int32) mscorlib::System::Globalization::CultureData::fill_number_data\n\n// System.IO.KqueueMonitor\nSystem.IO.KqueueMonitor::kevent_notimeout(System.Int32&,System.IntPtr,System.Int32,System.IntPtr,System.Int32) System::System::IO::KqueueMonitor::kevent_notimeout\n\n// System.Reflection.Emit.SymbolType\nSystem.Reflection.Emit.SymbolType::create_unmanaged_type(System.Type) mscorlib::System::Reflection::Emit::SymbolType::create_unmanaged_type\n\n// System.Reflection.RtFieldInfo\nSystem.Reflection.RtFieldInfo::UnsafeGetValue(System.Object) mscorlib::System::Reflection::RtFieldInfo::UnsafeGetValue\n\n// System.Reflection.CustomAttributeData\nSystem.Reflection.CustomAttributeData::ResolveArgumentsInternal(System.Reflection.ConstructorInfo,System.Reflection.Assembly,System.IntPtr,System.UInt32,System.Object[]&,System.Object[]&) mscorlib::System::Reflection::CustomAttributeData::ResolveArgumentsInternal\n\n// System.Runtime.Versioning.VersioningHelper\nSystem.Runtime.Versioning.VersioningHelper::GetRuntimeId() mscorlib::System::Runtime::Versioning::VersioningHelper::GetRuntimeId\n\n// System.Runtime.Remoting.Messaging.AsyncResult\nSystem.Runtime.Remoting.Messaging.AsyncResult::Invoke() mscorlib::System::Runtime::Remoting::Messaging::AsyncResult::Invoke\n\n// System.Text.EncodingHelper\nSystem.Text.EncodingHelper::InternalCodePage(System.Int32&) mscorlib::System::Text::EncodingHelper::InternalCodePage\n\n// System.Text.Normalization\nSystem.Text.Normalization::load_normalization_resource(System.IntPtr&,System.IntPtr&,System.IntPtr&,System.IntPtr&,System.IntPtr&,System.IntPtr&) mscorlib::System::Text::Normalization::load_normalization_resource\n\n// System.Runtime.Remoting.Contexts.Context\nSystem.Runtime.Remoting.Contexts.Context::RegisterContext(System.Runtime.Remoting.Contexts.Context) mscorlib::System::Runtime::Remoting::Contexts::Context::RegisterContext\nSystem.Runtime.Remoting.Contexts.Context::ReleaseContext(System.Runtime.Remoting.Contexts.Context) mscorlib::System::Runtime::Remoting::Contexts::Context::ReleaseContext\n\n// Microsoft.Win32.NativeMethods\nMicrosoft.Win32.NativeMethods::CloseProcess(System.IntPtr) System::Microsoft::Win32::NativeMethods::CloseProcess\nMicrosoft.Win32.NativeMethods::GetExitCodeProcess(System.IntPtr,System.Int32&) System::Microsoft::Win32::NativeMethods::GetExitCodeProcess\nMicrosoft.Win32.NativeMethods::GetProcessTimes(System.IntPtr,System.Int64&,System.Int64&,System.Int64&,System.Int64&) System::Microsoft::Win32::NativeMethods::GetProcessTimes\nMicrosoft.Win32.NativeMethods::GetProcessWorkingSetSize(System.IntPtr,System.IntPtr&,System.IntPtr&) System::Microsoft::Win32::NativeMethods::GetProcessWorkingSetSize\nMicrosoft.Win32.NativeMethods::SetPriorityClass(System.IntPtr,System.Int32) System::Microsoft::Win32::NativeMethods::SetPriorityClass\nMicrosoft.Win32.NativeMethods::SetProcessWorkingSetSize(System.IntPtr,System.IntPtr,System.IntPtr) System::Microsoft::Win32::NativeMethods::SetProcessWorkingSetSize\nMicrosoft.Win32.NativeMethods::TerminateProcess(System.IntPtr,System.Int32) System::Microsoft::Win32::NativeMethods::TerminateProcess\nMicrosoft.Win32.NativeMethods::GetPriorityClass(System.IntPtr) System::Microsoft::Win32::NativeMethods::GetPriorityClass\nMicrosoft.Win32.NativeMethods::WaitForInputIdle(System.IntPtr,System.Int32) System::Microsoft::Win32::NativeMethods::WaitForInputIdle\nMicrosoft.Win32.NativeMethods::GetCurrentProcess() System::Microsoft::Win32::NativeMethods::GetCurrentProcess\nMicrosoft.Win32.NativeMethods::GetCurrentProcessId() System::Microsoft::Win32::NativeMethods::GetCurrentProcessId\n\n// System.Net.NetworkInformation.MacOsIPInterfaceProperties\nSystem.Net.NetworkInformation.MacOsIPInterfaceProperties::ParseRouteInfo_internal(System.String,System.String[]&) System::System::Net::NetworkInformation::MacOsIPInterfaceProperties::ParseRouteInfo_internal\n\n// System.Net.Sockets.Socket\nSystem.Net.Sockets.Socket::SendFile_internal(System.IntPtr,System.String,System.Byte[],System.Byte[],System.Net.Sockets.TransmitFileOptions) System::System::Net::Sockets::Socket::SendFile_internal\nSystem.Net.Sockets.Socket::SupportsPortReuse(System.Net.Sockets.ProtocolType) System::System::Net::Sockets::Socket::SupportsPortReuse\nSystem.Net.Sockets.Socket::IOControl_internal(System.IntPtr,System.Int32,System.Byte[],System.Byte[],System.Int32&) System::System::Net::Sockets::Socket::IOControl_internal\nSystem.Net.Sockets.Socket::ReceiveFrom_internal(System.IntPtr,System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.SocketAddress&,System.Int32&) System::System::Net::Sockets::Socket::ReceiveFrom_internal\nSystem.Net.Sockets.Socket::SendTo_internal(System.IntPtr,System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.SocketAddress,System.Int32&) System::System::Net::Sockets::Socket::SendTo_internal\nSystem.Net.Sockets.Socket::LocalEndPoint_internal(System.IntPtr,System.Int32,System.Int32&) System::System::Net::Sockets::Socket::LocalEndPoint_internal\nSystem.Net.Sockets.Socket::RemoteEndPoint_internal(System.IntPtr,System.Int32,System.Int32&) System::System::Net::Sockets::Socket::RemoteEndPoint_internal\nSystem.Net.Sockets.Socket::cancel_blocking_socket_operation(System.Threading.Thread) System::System::Net::Sockets::Socket::cancel_blocking_socket_operation\nSystem.Net.Sockets.Socket::Connect_internal(System.IntPtr,System.Net.SocketAddress,System.Int32&) System::System::Net::Sockets::Socket::Connect_internal\n\n// System.IO.MemoryMappedFiles.MemoryMapImpl\nSystem.IO.MemoryMappedFiles.MemoryMapImpl::Unmap(System.IntPtr) System::Core::System::IO::MemoryMappedFiles::MemoryMapImpl::Unmap\nSystem.IO.MemoryMappedFiles.MemoryMapImpl::MapInternal(System.IntPtr,System.Int64,System.Int64&,System.IO.MemoryMappedFiles.MemoryMappedFileAccess,System.IntPtr&,System.IntPtr&) System::Core::System::IO::MemoryMappedFiles::MemoryMapImpl::MapInternal\nSystem.IO.MemoryMappedFiles.MemoryMapImpl::OpenFileInternal(System.String,System.IO.FileMode,System.String,System.Int64&,System.IO.MemoryMappedFiles.MemoryMappedFileAccess,System.IO.MemoryMappedFiles.MemoryMappedFileOptions,System.Int32&) System::Core::System::IO::MemoryMappedFiles::MemoryMapImpl::OpenFileInternal\nSystem.IO.MemoryMappedFiles.MemoryMapImpl::OpenHandleInternal(System.IntPtr,System.String,System.Int64&,System.IO.MemoryMappedFiles.MemoryMappedFileAccess,System.IO.MemoryMappedFiles.MemoryMappedFileOptions,System.Int32&) System::Core::System::IO::MemoryMappedFiles::MemoryMapImpl::OpenHandleInternal\nSystem.IO.MemoryMappedFiles.MemoryMapImpl::CloseMapping(System.IntPtr) System::Core::System::IO::MemoryMappedFiles::MemoryMapImpl::CloseMapping\nSystem.IO.MemoryMappedFiles.MemoryMapImpl::ConfigureHandleInheritability(System.IntPtr,System.IO.HandleInheritability) System::Core::System::IO::MemoryMappedFiles::MemoryMapImpl::ConfigureHandleInheritability\nSystem.IO.MemoryMappedFiles.MemoryMapImpl::Flush(System.IntPtr) System::Core::System::IO::MemoryMappedFiles::MemoryMapImpl::Flush\n\n// Mono.RuntimeClassHandle\nMono.RuntimeClassHandle::GetTypeFromClass(Mono.RuntimeStructs/MonoClass*) mscorlib::Mono::RuntimeClassHandle::GetTypeFromClass\n\n// Mono.SafeStringMarshal\nMono.SafeStringMarshal::StringToUtf8(System.String) mscorlib::Mono::SafeStringMarshal::StringToUtf8\nMono.SafeStringMarshal::GFree(System.IntPtr) mscorlib::Mono::SafeStringMarshal::GFree\n\n// System.Reflection.EventInfo\nSystem.Reflection.EventInfo::internal_from_handle_type(System.IntPtr,System.IntPtr) mscorlib::System::Reflection::EventInfo::internal_from_handle_type\n\n// System.Reflection.PropertyInfo\nSystem.Reflection.PropertyInfo::internal_from_handle_type(System.IntPtr,System.IntPtr) mscorlib::System::Reflection::PropertyInfo::internal_from_handle_type\n\n// Mono.RuntimeGPtrArrayHandle\nMono.RuntimeGPtrArrayHandle::GPtrArrayFree(Mono.RuntimeStructs/GPtrArray*) mscorlib::Mono::RuntimeGPtrArrayHandle::GPtrArrayFree\n\n// Mono.RuntimeMarshal\nMono.RuntimeMarshal::FreeAssemblyName(Mono.MonoAssemblyName&) mscorlib::Mono::RuntimeMarshal::FreeAssemblyName\n\n// System.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods\nSystem.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods::RoOriginateLanguageException(System.Int32,System.String,System.IntPtr) mscorlib::System::Runtime::InteropServices::WindowsRuntime::UnsafeNativeMethods::RoOriginateLanguageException\nSystem.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods::WindowsGetStringRawBuffer(System.IntPtr,System.UInt32*) mscorlib::System::Runtime::InteropServices::WindowsRuntime::UnsafeNativeMethods::WindowsGetStringRawBuffer\nSystem.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods::WindowsCreateString(System.String,System.Int32,System.IntPtr*) mscorlib::System::Runtime::InteropServices::WindowsRuntime::UnsafeNativeMethods::WindowsCreateString\nSystem.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods::WindowsDeleteString(System.IntPtr) mscorlib::System::Runtime::InteropServices::WindowsRuntime::UnsafeNativeMethods::WindowsDeleteString\nSystem.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods::GetRestrictedErrorInfo() mscorlib::System::Runtime::InteropServices::WindowsRuntime::UnsafeNativeMethods::GetRestrictedErrorInfo\nSystem.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods::RoReportUnhandledError(System.Runtime.InteropServices.WindowsRuntime.IRestrictedErrorInfo) mscorlib::System::Runtime::InteropServices::WindowsRuntime::UnsafeNativeMethods::RoReportUnhandledError\n\n// System.TimeZoneInfo\nSystem.TimeZoneInfo::UseRegistryForTimeZoneInformation() mscorlib::System::TimeZoneInfo::UseRegistryForTimeZoneInformation\n\n// Mono.Net.Security.MonoTlsProviderFactory\nMono.Net.Security.MonoTlsProviderFactory::IsBtlsSupported() System::Mono::Net::Security::MonoTlsProviderFactory::IsBtlsSupported\n\n// System.SizedReference\nSystem.SizedReference::GetApproximateSizeOfSizedRef(System.IntPtr) mscorlib::System::SizedReference::GetApproximateSizeOfSizedRef\nSystem.SizedReference::CreateSizedRef(System.Object) mscorlib::System::SizedReference::CreateSizedRef\nSystem.SizedReference::GetTargetOfSizedRef(System.IntPtr) mscorlib::System::SizedReference::GetTargetOfSizedRef\nSystem.SizedReference::FreeSizedRef(System.IntPtr) mscorlib::System::SizedReference::FreeSizedRef\n\n// System.Net.NetworkInformation.LinuxNetworkInterface\nSystem.Net.NetworkInformation.LinuxNetworkInterface::GetInterfaceAddresses(System.IntPtr&) System::System::Net::NetworkInformation::LinuxNetworkInterface::GetInterfaceAddresses\nSystem.Net.NetworkInformation.LinuxNetworkInterface::FreeInterfaceAddresses(System.IntPtr) System::System::Net::NetworkInformation::LinuxNetworkInterface::FreeInterfaceAddresses\nSystem.Net.NetworkInformation.LinuxNetworkInterface::InitializeInterfaceAddresses() System::System::Net::NetworkInformation::LinuxNetworkInterface::InitializeInterfaceAddresses\n\n"
  },
  {
    "path": "unity_decoder/libil2cpp/libil2cpp.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug45|ARM\">\n      <Configuration>Debug45</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug45|Win32\">\n      <Configuration>Debug45</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug45|x64\">\n      <Configuration>Debug45</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug_Tests|ARM\">\n      <Configuration>Debug_Tests</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug_Tests|Win32\">\n      <Configuration>Debug_Tests</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug_Tests|x64\">\n      <Configuration>Debug_Tests</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|ARM\">\n      <Configuration>Debug</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release45|ARM\">\n      <Configuration>Release45</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release45|Win32\">\n      <Configuration>Release45</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release45|x64\">\n      <Configuration>Release45</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|ARM\">\n      <Configuration>Release</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Debug45|ARM\">\n      <Configuration>WinRT-UWP-Debug45</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Debug45|Win32\">\n      <Configuration>WinRT-UWP-Debug45</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Debug45|x64\">\n      <Configuration>WinRT-UWP-Debug45</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Debug|ARM\">\n      <Configuration>WinRT-UWP-Debug</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Debug|Win32\">\n      <Configuration>WinRT-UWP-Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Debug|x64\">\n      <Configuration>WinRT-UWP-Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Release45|ARM\">\n      <Configuration>WinRT-UWP-Release45</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Release45|Win32\">\n      <Configuration>WinRT-UWP-Release45</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Release45|x64\">\n      <Configuration>WinRT-UWP-Release45</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Release|ARM\">\n      <Configuration>WinRT-UWP-Release</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Release|Win32\">\n      <Configuration>WinRT-UWP-Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"WinRT-UWP-Release|x64\">\n      <Configuration>WinRT-UWP-Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{848E3796-AAAC-4726-9B51-94FBFEB667B3}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>libil2cpp</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0.10240.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)'=='WinRT-UWP-Debug' OR '$(Configuration)'=='WinRT-UWP-Release'\">\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|ARM'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|ARM'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|ARM'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug_Tests|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug_Tests|ARM'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug_Tests|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|ARM'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|ARM'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|ARM'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n    <WindowsAppContainer>true</WindowsAppContainer>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|ARM'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|ARM'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|ARM'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug_Tests|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug_Tests|ARM'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug_Tests|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|ARM'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|ARM'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|ARM'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|Win32'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|ARM'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|Win32'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|Win32'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|ARM'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|ARM'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|Win32'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|ARM'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|Win32'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|Win32'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|ARM'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|ARM'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug_Tests|Win32'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|x64'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|x64'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|x64'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|x64'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|x64'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|x64'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=1;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|ARM'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=1;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=0;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=0;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|ARM'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=0;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|ARM'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=0;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug45|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=1;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=0;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Debug45|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=0;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug_Tests|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=1;IL2CPP_DEBUGGER_LOG=1;IL2CPP_UNIT_TESTS_ENABLED=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug_Tests|ARM'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=1;IL2CPP_DEBUGGER_LOG=1;IL2CPP_UNIT_TESTS_ENABLED=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug_Tests|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;IL2CPP_DEBUGGER_ENABLED=1;IL2CPP_DEBUGGER_LOG=1;IL2CPP_UNIT_TESTS_ENABLED=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <PreprocessToFile>false</PreprocessToFile>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <MinimalRebuild>false</MinimalRebuild>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n    <Lib>\n      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|ARM'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;_LIB;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;_LIB;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|ARM'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;_LIB;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|ARM'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;_LIB;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release45|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;_LIB;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='WinRT-UWP-Release45|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;_LIB;NET_4_0=1;%(PreprocessorDefinitions);_SCL_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>.\\..\\external\\boehmgc\\include;.\\;..\\libmono</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>\n      <AdditionalOptions>/we4002 %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"blob.h\" />\n    <ClInclude Include=\"char-conversions.h\" />\n    <ClInclude Include=\"class-internals.h\" />\n    <ClInclude Include=\"codegen\\il2cpp-codegen-common.h\" />\n    <ClInclude Include=\"codegen\\il2cpp-codegen-il2cpp.h\" />\n    <ClInclude Include=\"codegen\\il2cpp-codegen-mono.h\" />\n    <ClInclude Include=\"codegen\\il2cpp-codegen.h\" />\n    <ClInclude Include=\"debugger\\agent.h\" />\n    <ClInclude Include=\"debugger\\command-line-parser.h\" />\n    <ClInclude Include=\"debugger\\common.h\" />\n    <ClInclude Include=\"debugger\\data-buffer.h\" />\n    <ClInclude Include=\"debugger\\event-request.h\" />\n    <ClInclude Include=\"debugger\\id-bank.h\" />\n    <ClInclude Include=\"debugger\\il2cpp-api-test-forwarder.h\" />\n    <ClInclude Include=\"debugger\\meta.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\app-domain.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\array-ref.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\assembly.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\event-request.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\event.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\internal-error.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\method.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\module.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\object-ref.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\stack-frame.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\string-ref.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\thread.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\type.h\" />\n    <ClInclude Include=\"debugger\\protocol\\commands\\vm.h\" />\n    <ClInclude Include=\"debugger\\protocol\\events.h\" />\n    <ClInclude Include=\"debugger\\protocol\\globals.h\" />\n    <ClInclude Include=\"debugger\\protocol\\protocol-utils.h\" />\n    <ClInclude Include=\"debugger\\protocol\\protocol.h\" />\n    <ClInclude Include=\"debugger\\protocol\\utils.h\" />\n    <ClInclude Include=\"debugger\\thread-data.h\" />\n    <ClInclude Include=\"debugger\\transport-tcp.h\" />\n    <ClInclude Include=\"debugger\\transport.h\" />\n    <ClInclude Include=\"debugger\\variant.h\" />\n    <ClInclude Include=\"externals\\MonoPosixHelper.h\" />\n    <ClInclude Include=\"external\\google\\sparsehash\\densehashtable.h\" />\n    <ClInclude Include=\"external\\google\\sparsehash\\dense_hash_map.h\" />\n    <ClInclude Include=\"external\\google\\sparsehash\\dense_hash_set.h\" />\n    <ClInclude Include=\"external\\google\\sparsehash\\type_traits.h\" />\n    <ClInclude Include=\"external\\xamarin-android\\logger.h\" />\n    <ClInclude Include=\"external\\xamarin-android\\monodroid.h\" />\n    <ClInclude Include=\"external\\xamarin-android\\xamarin_getifaddrs.h\" />\n    <ClInclude Include=\"gc\\Allocator.h\" />\n    <ClInclude Include=\"gc\\AppendOnlyGCHashMap.h\" />\n    <ClInclude Include=\"gc\\GarbageCollector.h\" />\n    <ClInclude Include=\"gc\\GarbageCollectorImpl.h\" />\n    <ClInclude Include=\"gc\\GCHandle.h\" />\n    <ClInclude Include=\"gc\\gc_wrapper.h\" />\n    <ClInclude Include=\"gc\\WriteBarrier.h\" />\n    <ClInclude Include=\"icallincludes.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\Mono.Globalization.Unicode\\Normalization.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\Mono.Interop\\ComInteropProxy.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\Mono.Security.Cryptography\\KeyPairPersistence.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\Mono\\Runtime.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\Mono\\RuntimeClassHandle.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\Mono\\RuntimeGPtrArrayHandle.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\Mono\\RuntimeMarshal.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\Mono\\SafeStringMarshal.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Diagnostics\\Assert.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Diagnostics\\Debugger.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Diagnostics\\StackFrame.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Diagnostics\\StackTrace.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CalendarData.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CompareInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CompareOptions.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CultureData.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CultureInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CultureInfoInternals.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CultureInfoTables.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\RegionInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.IO\\DriveInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.IO\\MonoIO.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.IO\\Path.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\AssemblyBuilder.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\CustomAttributeBuilder.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\DerivedType.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\DynamicMethod.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\EnumBuilder.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\GenericTypeParameterBuilder.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\MethodBuilder.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\ModuleBuilder.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\SignatureHelper.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\SymbolType.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\TypeBuilder.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\Assembly.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\AssemblyName.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\CustomAttributeData.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\EventInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\FieldInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MemberInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MethodBase.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\Module.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoCMethod.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoEventInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoField.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericClass.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericCMethod.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericMethod.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoMethod.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoMethodInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoPropertyInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\ParameterInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\PropertyInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\RtFieldInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.CompilerServices\\RuntimeHelpers.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.InteropServices\\GCHandle.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.InteropServices\\Marshal.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Activation\\ActivationServices.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Contexts\\Context.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Messaging\\AsyncResult.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Messaging\\MonoMethodMessage.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Proxies\\RealProxy.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting\\RemotingServices.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Versioning\\VersioningHelper.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security.Cryptography\\RNGCryptoServiceProvider.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security.Policy\\Evidence.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsIdentity.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsImpersonationContext.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsPrincipal.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security\\SecurityFrame.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security\\SecurityManager.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Text\\Encoding.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Text\\EncodingHelper.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Text\\Normalization.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\Interlocked.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\InternalThread.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\Monitor.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\Mutex.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\NativeEventCalls.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\Thread.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\ThreadPool.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\Timer.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\WaitHandle.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Activator.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\AppDomain.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\ArgIterator.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Array.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Buffer.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Char.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\CLRConfig.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\ConsoleDriver.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Convert.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\CurrentSystemTimeZone.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\DateTime.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Decimal.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Delegate.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Double.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Enum.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Environment.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Exception.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\GC.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Math.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\MissingMemberException.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\MonoCustomAttrs.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\MonoEnumInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\MonoType.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Number.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\NumberFormatter.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Object.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\RuntimeFieldHandle.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\RuntimeMethodHandle.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\RuntimeType.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\RuntimeTypeHandle.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\String.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\TimeSpan.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\TimeZoneInfo.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Type.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\TypedReference.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\ValueType.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System\\__ComObject.h\" />\n    <ClInclude Include=\"icalls\\System.Configuration\\System.Configuration\\InternalConfigurationHost.h\" />\n    <ClInclude Include=\"icalls\\System.Core\\System.IO.MemoryMappedFiles\\MemoryMapImpl.h\" />\n    <ClInclude Include=\"icalls\\System\\Microsoft.Win32\\NativeMethods.h\" />\n    <ClInclude Include=\"icalls\\System\\System.ComponentModel\\Win32Exception.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Configuration\\DefaultConfig.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Configuration\\InternalConfigurationHost.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\DefaultTraceListener.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\FileVersionInfo.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\perfcounters-def.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounter.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounterCategory.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounterUtils.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\Process.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\Stopwatch.h\" />\n    <ClInclude Include=\"icalls\\System\\System.IO\\FAMWatcher.h\" />\n    <ClInclude Include=\"icalls\\System\\System.IO\\FileSystemWatcher.h\" />\n    <ClInclude Include=\"icalls\\System\\System.IO\\InotifyWatcher.h\" />\n    <ClInclude Include=\"icalls\\System\\System.IO\\KqueueMonitor.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Net.NetworkInformation\\LinuxNetworkInterface.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Net.NetworkInformation\\MacOsIPInterfaceProperties.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Net.Sockets\\Socket.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Net.Sockets\\SocketException.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Net\\Dns.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Threading\\Semaphore.h\" />\n    <ClInclude Include=\"icalls\\System\\System\\IOSelector.h\" />\n    <ClInclude Include=\"il2cpp-api-functions.h\" />\n    <ClInclude Include=\"il2cpp-api-types.h\" />\n    <ClInclude Include=\"il2cpp-api.h\" />\n    <ClInclude Include=\"il2cpp-config.h\" />\n    <ClInclude Include=\"il2cpp-debugger.h\" />\n    <ClInclude Include=\"il2cpp-metadata.h\" />\n    <ClInclude Include=\"il2cpp-string-types.h\" />\n    <ClInclude Include=\"il2cpp-vm-support.h\" />\n    <ClInclude Include=\"metadata.h\" />\n    <ClInclude Include=\"metadata\\ArrayMetadata.h\" />\n    <ClInclude Include=\"metadata\\FieldLayout.h\" />\n    <ClInclude Include=\"metadata\\GenericMetadata.h\" />\n    <ClInclude Include=\"metadata\\GenericMethod.h\" />\n    <ClInclude Include=\"metadata\\GenericSharing.h\" />\n    <ClInclude Include=\"metadata\\Il2CppGenericClassCompare.h\" />\n    <ClInclude Include=\"metadata\\Il2CppGenericClassHash.h\" />\n    <ClInclude Include=\"metadata\\Il2CppGenericContextCompare.h\" />\n    <ClInclude Include=\"metadata\\Il2CppGenericContextHash.h\" />\n    <ClInclude Include=\"metadata\\Il2CppGenericInstCompare.h\" />\n    <ClInclude Include=\"metadata\\Il2CppGenericInstHash.h\" />\n    <ClInclude Include=\"metadata\\Il2CppGenericMethodCompare.h\" />\n    <ClInclude Include=\"metadata\\Il2CppGenericMethodHash.h\" />\n    <ClInclude Include=\"metadata\\Il2CppSignatureCompare.h\" />\n    <ClInclude Include=\"metadata\\Il2CppSignatureHash.h\" />\n    <ClInclude Include=\"metadata\\Il2CppTypeCompare.h\" />\n    <ClInclude Include=\"metadata\\Il2CppTypeHash.h\" />\n    <ClInclude Include=\"metadata\\Il2CppTypeVector.h\" />\n    <ClInclude Include=\"mono-structs.h\" />\n    <ClInclude Include=\"mono-runtime\\il2cpp-callbacks.h\" />\n    <ClInclude Include=\"mono-runtime\\il2cpp-mapping.h\" />\n    <ClInclude Include=\"mono-runtime\\il2cpp-mono-support.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\ThreadPoolDataStructures.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\threadpool-ms-io-poll.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\threadpool-ms-io.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\threadpool-ms.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\ThreadPoolMacros.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\ThreadPoolMonitorThread.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\ThreadPoolWorkerThread.h\" />\n    <ClInclude Include=\"normalization-tables.h\" />\n    <ClInclude Include=\"number-formatter.h\" />\n    <ClInclude Include=\"object-internals.h\" />\n    <ClInclude Include=\"os\\Atomic.h\" />\n    <ClInclude Include=\"os\\c-api\\File-c-api.h\" />\n    <ClInclude Include=\"os\\c-api\\Allocator.h\" />\n    <ClInclude Include=\"os\\c-api\\NativeMethods-c-api.h\" />\n    <ClInclude Include=\"os\\c-api\\Path-c-api.h\" />\n    <ClInclude Include=\"os\\c-api\\Process-c-api.h\" />\n    <ClInclude Include=\"os\\c-api\\Time-c-api.h\" />\n    <ClInclude Include=\"os\\c-api\\TimeZone-c-api.h\" />\n    <ClInclude Include=\"os\\ConditionVariable.h\" />\n    <ClInclude Include=\"os\\Console.h\" />\n    <ClInclude Include=\"os\\CpuInfo.h\" />\n    <ClInclude Include=\"os\\Cryptography.h\" />\n    <ClInclude Include=\"os\\Debug.h\" />\n    <ClInclude Include=\"os\\Directory.h\" />\n    <ClInclude Include=\"os\\Encoding.h\" />\n    <ClInclude Include=\"os\\Environment.h\" />\n    <ClInclude Include=\"os\\Error.h\" />\n    <ClInclude Include=\"os\\ErrorCodes.h\" />\n    <ClInclude Include=\"os\\Event.h\" />\n    <ClInclude Include=\"os\\File.h\" />\n    <ClInclude Include=\"os\\Generic\\COM.cpp\" />\n    <ClInclude Include=\"os\\Generic\\SocketImpl.h\" />\n    <ClInclude Include=\"os\\Handle.h\" />\n    <ClInclude Include=\"os\\Image.h\" />\n    <ClInclude Include=\"os\\Initialize.h\" />\n    <ClInclude Include=\"os\\LastError.h\" />\n    <ClInclude Include=\"os\\LibraryLoader.h\" />\n    <ClInclude Include=\"os\\Locale.h\" />\n    <ClInclude Include=\"os\\MarshalAlloc.h\" />\n    <ClInclude Include=\"os\\MarshalStringAlloc.h\" />\n    <ClInclude Include=\"os\\MemoryMappedFile.h\" />\n    <ClInclude Include=\"os\\Messages.h\" />\n    <ClInclude Include=\"os\\Mutex.h\" />\n    <ClInclude Include=\"os\\NativeMethods.h\" />\n    <ClInclude Include=\"os\\Path.h\" />\n    <ClInclude Include=\"os\\Posix\\ConditionVariableImpl.h\" />\n    <ClInclude Include=\"os\\Posix\\EventImpl.h\" />\n    <ClInclude Include=\"os\\Posix\\MutexImpl.h\" />\n    <ClInclude Include=\"os\\Posix\\PosixHelpers.h\" />\n    <ClInclude Include=\"os\\Posix\\PosixWaitObject.h\" />\n    <ClInclude Include=\"os\\Posix\\SemaphoreImpl.h\" />\n    <ClInclude Include=\"os\\Posix\\SocketImpl.h\" />\n    <ClInclude Include=\"os\\Posix\\ThreadImpl.h\" />\n    <ClInclude Include=\"os\\Posix\\ThreadLocalValueImpl.h\" />\n    <ClInclude Include=\"os\\Posix\\FileHandle.h\" />\n    <ClInclude Include=\"os\\Process.h\" />\n    <ClInclude Include=\"os\\COM.h\" />\n    <ClInclude Include=\"os\\Semaphore.h\" />\n    <ClInclude Include=\"os\\Socket.h\" />\n    <ClInclude Include=\"os\\StackTrace.h\" />\n    <ClInclude Include=\"os\\Std\\ThreadImpl.h\" />\n    <ClInclude Include=\"os\\Thread.h\" />\n    <ClInclude Include=\"os\\ThreadLocalValue.h\" />\n    <ClInclude Include=\"os\\Time.h\" />\n    <ClInclude Include=\"os\\TimeZone.h\" />\n    <ClInclude Include=\"os\\WaitStatus.h\" />\n    <ClInclude Include=\"os\\Win32\\AtomicImpl.h\" />\n    <ClInclude Include=\"os\\Win32\\ConditionVariableImpl.h\" />\n    <ClInclude Include=\"os\\Win32\\EventImpl.h\" />\n    <ClInclude Include=\"os\\Win32\\MutexImpl.h\" />\n    <ClInclude Include=\"os\\Win32\\SemaphoreImpl.h\" />\n    <ClInclude Include=\"os\\Win32\\SocketImpl.h\" />\n    <ClInclude Include=\"os\\Win32\\ThreadImpl.h\" />\n    <ClInclude Include=\"os\\Win32\\ThreadLocalValueImpl.h\" />\n    <ClInclude Include=\"os\\Win32\\WindowsHeaders.h\" />\n    <ClInclude Include=\"os\\Win32\\WindowsHelpers.h\" />\n    <ClInclude Include=\"external\\zlib\\crc32.h\" />\n    <ClInclude Include=\"external\\zlib\\deflate.h\" />\n    <ClInclude Include=\"external\\zlib\\inffast.h\" />\n    <ClInclude Include=\"external\\zlib\\inffixed.h\" />\n    <ClInclude Include=\"external\\zlib\\inflate.h\" />\n    <ClInclude Include=\"external\\zlib\\inftrees.h\" />\n    <ClInclude Include=\"external\\zlib\\trees.h\" />\n    <ClInclude Include=\"external\\zlib\\zconf.h\" />\n    <ClInclude Include=\"external\\zlib\\zlib.h\" />\n    <ClInclude Include=\"external\\zlib\\zutil.h\" />\n    <ClInclude Include=\"os\\WindowsRuntime.h\" />\n    <ClInclude Include=\"os\\WinRT\\SynchronousOperation.h\" />\n    <ClInclude Include=\"os\\WinRT\\Win32ApiSharedEmulation.h\" />\n    <ClInclude Include=\"os\\WinRT\\Win32ApiWinRTEmulation.h\" />\n    <ClInclude Include=\"tabledefs.h\" />\n    <ClInclude Include=\"utils\\CallOnce.h\" />\n    <ClInclude Include=\"utils\\Collections.h\" />\n    <ClInclude Include=\"utils\\DirectoryUtils.h\" />\n    <ClInclude Include=\"utils\\dynamic_array.h\" />\n    <ClInclude Include=\"utils\\Environment.h\" />\n    <ClInclude Include=\"utils\\Exception.h\" />\n    <ClInclude Include=\"utils\\Il2CppHashMap.h\" />\n    <ClInclude Include=\"utils\\Il2CppHashSet.h\" />\n    <ClInclude Include=\"utils\\Functional.h\" />\n    <ClInclude Include=\"utils\\HashUtils.h\" />\n    <ClInclude Include=\"utils\\Il2CppHStringReference.h\" />\n    <ClInclude Include=\"utils\\KeyWrapper.h\" />\n    <ClInclude Include=\"utils\\Logging.h\" />\n    <ClInclude Include=\"utils\\MarshalingUtils.h\" />\n    <ClInclude Include=\"utils\\MathUtils.h\" />\n    <ClInclude Include=\"utils\\Memory.h\" />\n    <ClInclude Include=\"utils\\MemoryPool.h\" />\n    <ClInclude Include=\"utils\\NativeSymbol.h\" />\n    <ClInclude Include=\"utils\\NonCopyable.h\" />\n    <ClInclude Include=\"utils\\Output.h\" />\n    <ClInclude Include=\"utils\\RegisterRuntimeInitializeAndCleanup.h\" />\n    <ClInclude Include=\"utils\\Runtime.h\" />\n    <ClInclude Include=\"utils\\StringUtils.h\" />\n    <ClInclude Include=\"utils\\PathUtils.h\" />\n    <ClInclude Include=\"utils\\StringView.h\" />\n    <ClInclude Include=\"utils\\StringViewStream.h\" />\n    <ClInclude Include=\"utils\\ThreadSafeFreeList.h\" />\n    <ClInclude Include=\"utils\\MemoryRead.h\" />\n    <ClInclude Include=\"utils\\utf8-cpp\\source\\utf8\\core.h\" />\n    <ClInclude Include=\"utils\\utf8-cpp\\source\\utf8\\unchecked.h\" />\n    <ClInclude Include=\"vm-utils\\BlobReader.h\" />\n    <ClInclude Include=\"vm-utils\\NativeDelegateMethodCache.h\" />\n    <ClInclude Include=\"vm-utils\\NativeSymbol.h\" />\n    <ClInclude Include=\"vm-utils\\VmStringUtils.h\" />\n    <ClInclude Include=\"vm\\Array.h\" />\n    <ClInclude Include=\"vm\\Assembly.h\" />\n    <ClInclude Include=\"vm\\AssemblyName.h\" />\n    <ClInclude Include=\"vm\\Atomic.h\" />\n    <ClInclude Include=\"vm\\CachedCCWBase.h\" />\n    <ClInclude Include=\"vm\\CCW.h\" />\n    <ClInclude Include=\"vm\\Class.h\" />\n    <ClInclude Include=\"vm\\COM.h\" />\n    <ClInclude Include=\"vm\\ComUtils.h\" />\n    <ClInclude Include=\"vm\\Debug.h\" />\n    <ClInclude Include=\"vm\\Domain.h\" />\n    <ClInclude Include=\"vm\\Enum.h\" />\n    <ClInclude Include=\"vm\\Event.h\" />\n    <ClInclude Include=\"vm\\Exception.h\" />\n    <ClInclude Include=\"vm\\Field.h\" />\n    <ClInclude Include=\"vm\\GC.h\" />\n    <ClInclude Include=\"vm\\GenericClass.h\" />\n    <ClInclude Include=\"vm\\GenericContainer.h\" />\n    <ClInclude Include=\"vm\\Image.h\" />\n    <ClInclude Include=\"vm\\InternalCalls.h\" />\n    <ClInclude Include=\"vm\\LastError.h\" />\n    <ClInclude Include=\"vm\\LibraryLoader.h\" />\n    <ClInclude Include=\"vm\\Liveness.h\" />\n    <ClInclude Include=\"vm\\MarshalAlloc.h\" />\n    <ClInclude Include=\"vm\\MemoryInformation.h\" />\n    <ClInclude Include=\"vm\\MetadataAlloc.h\" />\n    <ClInclude Include=\"vm\\MetadataCache.h\" />\n    <ClInclude Include=\"vm\\MetadataLoader.h\" />\n    <ClInclude Include=\"vm\\MetadataLock.h\" />\n    <ClInclude Include=\"vm\\Method.h\" />\n    <ClInclude Include=\"vm\\Module.h\" />\n    <ClInclude Include=\"vm\\Monitor.h\" />\n    <ClInclude Include=\"vm\\NonCachedCCWBase.h\" />\n    <ClInclude Include=\"vm\\Object.h\" />\n    <ClInclude Include=\"vm\\Parameter.h\" />\n    <ClInclude Include=\"vm\\Path.h\" />\n    <ClInclude Include=\"vm\\PlatformInvoke.h\" />\n    <ClInclude Include=\"vm\\Profiler.h\" />\n    <ClInclude Include=\"vm\\Property.h\" />\n    <ClInclude Include=\"vm\\Random.h\" />\n    <ClInclude Include=\"vm\\RCW.h\" />\n    <ClInclude Include=\"vm\\Reflection.h\" />\n    <ClInclude Include=\"vm\\Runtime.h\" />\n    <ClInclude Include=\"vm\\StackTrace.h\" />\n    <ClInclude Include=\"vm\\String.h\" />\n    <ClInclude Include=\"vm\\Thread.h\" />\n    <ClInclude Include=\"vm\\ThreadPool.h\" />\n    <ClInclude Include=\"vm\\ThreadPoolMs.h\" />\n    <ClInclude Include=\"vm\\Type.h\" />\n    <ClInclude Include=\"vm\\WaitHandle.h\" />\n    <ClInclude Include=\"vm\\WindowsRuntime.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"char-conversions.cpp\" />\n    <ClCompile Include=\"class-internals.cpp\" />\n    <ClCompile Include=\"debugger\\agent.cpp\" />\n    <ClCompile Include=\"debugger\\command-line-parser.cpp\" />\n    <ClCompile Include=\"debugger\\data-buffer.cpp\" />\n    <ClCompile Include=\"debugger\\event-request.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\app-domain.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\array-ref.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\assembly.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\event-request.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\event.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\internal-error.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\method.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\module.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\object-ref.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\stack-frame.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\string-ref.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\thread.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\type.cpp\" />\n    <ClCompile Include=\"debugger\\handlers\\vm.cpp\" />\n    <ClCompile Include=\"debugger\\id-brank.cpp\" />\n    <ClCompile Include=\"debugger\\il2cpp-api-test-forwarder.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\app-domain.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\array-ref.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\assembly.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\event-request.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\event.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\internal-error.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\method.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\module.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\object-ref.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\stack-frame.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\string-ref.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\thread.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\type.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\commands\\vm.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\events.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\protocol.cpp\" />\n    <ClCompile Include=\"debugger\\protocol\\utils.cpp\" />\n    <ClCompile Include=\"debugger\\thread-data.cpp\" />\n    <ClCompile Include=\"debugger\\transport-tcp.cpp\" />\n    <ClCompile Include=\"debugger\\variant.cpp\" />\n    <ClCompile Include=\"externals\\MonoPosixHelper.cpp\" />\n    <ClCompile Include=\"external\\xamarin-android\\xamarin_getifaddrs.c\" />\n    <ClCompile Include=\"gc\\GarbageCollector.cpp\" />\n    <ClCompile Include=\"gc\\WriteBarrier.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\Mono.Globalization.Unicode\\Normalization.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\Mono.Interop\\ComInteropProxy.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\Mono.Security.Cryptography\\KeyPairPersistence.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\Mono\\Runtime.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\Mono\\RuntimeClassHandle.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\Mono\\RuntimeGPtrArrayHandle.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\Mono\\RuntimeMarshal.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\Mono\\SafeStringMarshal.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Diagnostics\\Assert.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Diagnostics\\Debugger.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Diagnostics\\StackFrame.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Diagnostics\\StackTrace.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Globalization\\CalendarData.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Globalization\\CompareInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Globalization\\CultureData.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Globalization\\CultureInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Globalization\\RegionInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.IO\\DriveInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.IO\\MonoIO.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.IO\\Path.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\AssemblyBuilder.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\CustomAttributeBuilder.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\DerivedType.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\DynamicMethod.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\EnumBuilder.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\GenericTypeParameterBuilder.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\MethodBuilder.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\ModuleBuilder.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\SignatureHelper.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\SymbolType.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\TypeBuilder.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\Assembly.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\AssemblyName.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\CustomAttributeData.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\EventInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\FieldInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MemberInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MethodBase.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\Module.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoCMethod.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoEventInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoField.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericClass.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericCMethod.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericMethod.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoMethod.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoMethodInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoPropertyInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\ParameterInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\PropertyInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\RtFieldInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.CompilerServices\\RuntimeHelpers.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.InteropServices\\GCHandle.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.InteropServices\\Marshal.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Activation\\ActivationServices.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Contexts\\Context.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Messaging\\AsyncResult.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Messaging\\MonoMethodMessage.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Proxies\\RealProxy.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting\\RemotingServices.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Versioning\\VersioningHelper.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security.Cryptography\\RNGCryptoServiceProvider.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security.Policy\\Evidence.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsIdentity.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsImpersonationContext.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsPrincipal.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security\\SecurityFrame.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security\\SecurityManager.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Text\\Encoding.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Text\\EncodingHelper.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Text\\Normalization.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\Interlocked.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\InternalThread.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\Monitor.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\Mutex.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\NativeEventCalls.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\Thread.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\ThreadPool.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\Timer.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\WaitHandle.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Activator.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\AppDomain.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\ArgIterator.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Array.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Buffer.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Char.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\CLRConfig.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\ConsoleDriver.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Convert.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\CurrentSystemTimeZone.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\DateTime.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Decimal.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Delegate.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Double.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Enum.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Environment.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Exception.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\GC.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Math.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\MissingMemberException.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\MonoCustomAttrs.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\MonoEnumInfo.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\MonoType.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Number.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\NumberFormatter.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Object.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\RuntimeFieldHandle.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\RuntimeMethodHandle.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\RuntimeType.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\RuntimeTypeHandle.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\String.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\TimeSpan.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Type.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\TypedReference.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\ValueType.cpp\" />\n    <ClCompile Include=\"icalls\\mscorlib\\System\\__ComObject.cpp\" />\n    <ClCompile Include=\"icalls\\System.Configuration\\System.Configuration\\InternalConfigurationHost.cpp\" />\n    <ClCompile Include=\"icalls\\System.Core\\System.IO.MemoryMappedFiles\\MemoryMapImpl.cpp\" />\n    <ClCompile Include=\"icalls\\System\\Microsoft.Win32\\NativeMethods.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.ComponentModel\\Win32Exception.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Configuration\\DefaultConfig.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Configuration\\InternalConfigurationHost.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\DefaultTraceListener.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\FileVersionInfo.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounter.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounterCategory.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounterUtils.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\Process.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\Stopwatch.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.IO\\FAMWatcher.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.IO\\FileSystemWatcher.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.IO\\InotifyWatcher.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.IO\\KqueueMonitor.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Net.NetworkInformation\\LinuxNetworkInterface.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Net.NetworkInformation\\MacOsIPInterfaceProperties.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Net.Sockets\\Socket.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Net.Sockets\\SocketException.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Net\\Dns.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Threading\\Semaphore.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System\\IOSelector.cpp\" />\n    <ClCompile Include=\"il2cpp-debugger.cpp\" />\n    <ClCompile Include=\"gc\\BoehmGC.cpp\" />\n    <ClCompile Include=\"gc\\GCHandle.cpp\" />\n    <ClCompile Include=\"gc\\NullGC.cpp\" />\n    <ClCompile Include=\"il2cpp-api.cpp\" />\n    <ClCompile Include=\"metadata\\ArrayMetadata.cpp\" />\n    <ClCompile Include=\"metadata\\FieldLayout.cpp\" />\n    <ClCompile Include=\"metadata\\GenericMetadata.cpp\" />\n    <ClCompile Include=\"metadata\\GenericMethod.cpp\" />\n    <ClCompile Include=\"metadata\\GenericSharing.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppGenericClassCompare.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppGenericClassHash.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppGenericContextCompare.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppGenericContextHash.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppGenericInstCompare.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppGenericInstHash.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppGenericMethodCompare.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppGenericMethodHash.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppSignatureCompare.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppSignatureHash.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppTypeCompare.cpp\" />\n    <ClCompile Include=\"metadata\\Il2CppTypeHash.cpp\" />\n    <ClCompile Include=\"mono-structs.cpp\" />\n    <ClCompile Include=\"mono-runtime\\il2cpp-callbacks.cpp\" />\n    <ClCompile Include=\"mono-runtime\\il2cpp-mono-support.cpp\" />\n    <ClCompile Include=\"mono\\ThreadPool\\threadpool-ms-io-poll.cpp\" />\n    <ClCompile Include=\"mono\\ThreadPool\\threadpool-ms-io.cpp\" />\n    <ClCompile Include=\"mono\\ThreadPool\\threadpool-ms.cpp\" />\n    <ClCompile Include=\"mono\\ThreadPool\\ThreadPoolMonitorThread.cpp\" />\n    <ClCompile Include=\"mono\\ThreadPool\\ThreadPoolWorkerThread.cpp\" />\n    <ClCompile Include=\"os\\Android\\StackTrace.cpp\" />\n    <ClCompile Include=\"os\\c-api\\Allocator.cpp\" />\n    <ClCompile Include=\"os\\ConditionVariable.cpp\" />\n    <ClCompile Include=\"os\\c-api\\File.cpp\" />\n    <ClCompile Include=\"os\\c-api\\NativeMethods.cpp\" />\n    <ClCompile Include=\"os\\c-api\\Path.cpp\" />\n    <ClCompile Include=\"os\\c-api\\Process.cpp\" />\n    <ClCompile Include=\"os\\c-api\\Time.cpp\" />\n    <ClCompile Include=\"os\\c-api\\TimeZone.cpp\" />\n    <ClCompile Include=\"os\\Debug.cpp\" />\n    <ClCompile Include=\"os\\Error.cpp\" />\n    <ClCompile Include=\"os\\Event.cpp\" />\n    <ClCompile Include=\"os\\Generic\\Environment.cpp\" />\n    <ClCompile Include=\"os\\Generic\\Initialize.cpp\" />\n    <ClCompile Include=\"os\\Generic\\MarshalStringAlloc.cpp\" />\n    <ClCompile Include=\"os\\Generic\\MemoryMappedFile.cpp\" />\n    <ClCompile Include=\"os\\Generic\\SocketImpl.cpp\" />\n    <ClCompile Include=\"os\\Generic\\WindowsRuntime.cpp\" />\n    <ClCompile Include=\"os\\Messages.cpp\" />\n    <ClCompile Include=\"os\\OSX\\Image.cpp\" />\n    <ClCompile Include=\"os\\OSX\\Process.cpp\" />\n    <ClCompile Include=\"os\\Path.cpp\" />\n    <ClCompile Include=\"os\\Posix\\ConditionVariableImpl.cpp\" />\n    <ClCompile Include=\"os\\Posix\\Console.cpp\" />\n    <ClCompile Include=\"os\\Posix\\CpuInfo.cpp\" />\n    <ClCompile Include=\"os\\Posix\\Cryptography.cpp\" />\n    <ClCompile Include=\"os\\Posix\\Directory.cpp\" />\n    <ClCompile Include=\"os\\Posix\\Environment.cpp\" />\n    <ClCompile Include=\"os\\Posix\\Image.cpp\" />\n    <ClCompile Include=\"os\\Posix\\LastError.cpp\" />\n    <ClCompile Include=\"os\\Posix\\Encoding.cpp\" />\n    <ClCompile Include=\"os\\Posix\\LibraryLoader.cpp\" />\n    <ClCompile Include=\"os\\Posix\\MarshalAlloc.cpp\" />\n    <ClCompile Include=\"os\\Posix\\Memory.cpp\" />\n    <ClCompile Include=\"os\\Posix\\MemoryMappedFile.cpp\" />\n    <ClCompile Include=\"os\\Posix\\NativeMethods.cpp\" />\n    <ClCompile Include=\"os\\Posix\\Path.cpp\" />\n    <ClCompile Include=\"os\\Posix\\PosixWaitObject.cpp\" />\n    <ClCompile Include=\"os\\Posix\\Process.cpp\" />\n    <ClCompile Include=\"os\\Posix\\SocketImpl.cpp\" />\n    <ClCompile Include=\"os\\Socket.cpp\" />\n    <ClCompile Include=\"os\\Win32\\COM.cpp\" />\n    <ClCompile Include=\"os\\Win32\\ConditionVariableImpl.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Console.cpp\" />\n    <ClCompile Include=\"os\\Win32\\CpuInfo.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Debug.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Directory.cpp\" />\n    <ClCompile Include=\"os\\Posix\\File.cpp\" />\n    <ClCompile Include=\"os\\Posix\\Time.cpp\" />\n    <ClCompile Include=\"os\\Posix\\TimeZone.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Cryptography.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Environment.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Encoding.cpp\" />\n    <ClCompile Include=\"os\\Win32\\File.cpp\" />\n    <ClCompile Include=\"os\\Posix\\Locale.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Image.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Initialize.cpp\" />\n    <ClCompile Include=\"os\\Win32\\LastError.cpp\" />\n    <ClCompile Include=\"os\\Win32\\LibraryLoader.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Locale.cpp\" />\n    <ClCompile Include=\"os\\Mutex.cpp\" />\n    <ClCompile Include=\"os\\Posix\\EventImpl.cpp\" />\n    <ClCompile Include=\"os\\Posix\\MutexImpl.cpp\" />\n    <ClCompile Include=\"os\\Posix\\SemaphoreImpl.cpp\" />\n    <ClCompile Include=\"os\\Posix\\ThreadImpl.cpp\" />\n    <ClCompile Include=\"os\\Posix\\ThreadLocalValueImpl.cpp\" />\n    <ClCompile Include=\"os\\Semaphore.cpp\" />\n    <ClCompile Include=\"os\\Std\\ThreadImpl.cpp\" />\n    <ClCompile Include=\"os\\Thread.cpp\" />\n    <ClCompile Include=\"os\\ThreadLocalValue.cpp\" />\n    <ClCompile Include=\"os\\Win32\\EventImpl.cpp\" />\n    <ClCompile Include=\"os\\Win32\\MarshalAlloc.cpp\" />\n    <ClCompile Include=\"os\\Win32\\MarshalStringAlloc.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Memory.cpp\" />\n    <ClCompile Include=\"os\\Win32\\MemoryMappedFile.cpp\" />\n    <ClCompile Include=\"os\\Win32\\MutexImpl.cpp\" />\n    <ClCompile Include=\"os\\Win32\\NativeMethods.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Path.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Process.cpp\" />\n    <ClCompile Include=\"os\\Win32\\SemaphoreImpl.cpp\" />\n    <ClCompile Include=\"os\\Win32\\SocketImpl.cpp\" />\n    <ClCompile Include=\"os\\Win32\\StackTrace.cpp\" />\n    <ClCompile Include=\"os\\Win32\\ThreadImpl.cpp\" />\n    <ClCompile Include=\"os\\Win32\\ThreadLocalValueImpl.cpp\" />\n    <ClCompile Include=\"os\\Win32\\Time.cpp\" />\n    <ClCompile Include=\"os\\Win32\\TimeZone.cpp\" />\n    <ClCompile Include=\"os\\Win32\\WindowsHelpers.cpp\" />\n    <ClCompile Include=\"external\\zlib\\adler32.c\" />\n    <ClCompile Include=\"external\\zlib\\compress.c\" />\n    <ClCompile Include=\"external\\zlib\\crc32.c\" />\n    <ClCompile Include=\"external\\zlib\\deflate.c\" />\n    <ClCompile Include=\"external\\zlib\\gzio.c\" />\n    <ClCompile Include=\"external\\zlib\\infback.c\" />\n    <ClCompile Include=\"external\\zlib\\inffast.c\" />\n    <ClCompile Include=\"external\\zlib\\inflate.c\" />\n    <ClCompile Include=\"external\\zlib\\inftrees.c\" />\n    <ClCompile Include=\"external\\zlib\\trees.c\" />\n    <ClCompile Include=\"external\\zlib\\uncompr.c\" />\n    <ClCompile Include=\"external\\zlib\\zutil.c\" />\n    <ClCompile Include=\"os\\Win32\\WindowsRuntime.cpp\" />\n    <ClCompile Include=\"os\\WinRT\\Cryptography.cpp\" />\n    <ClCompile Include=\"os\\WinRT\\Environment.cpp\" />\n    <ClCompile Include=\"os\\WinRT\\File.cpp\" />\n    <ClCompile Include=\"os\\WinRT\\Initialize.cpp\" />\n    <ClCompile Include=\"os\\WinRT\\Locale.cpp\" />\n    <ClCompile Include=\"os\\WinRT\\Process.cpp\" />\n    <ClCompile Include=\"os\\WinRT\\Win32ApiSharedEmulation.cpp\" />\n    <ClCompile Include=\"os\\WinRT\\Win32ApiWinRTEmulation.cpp\" />\n    <ClCompile Include=\"utils\\DirectoryUtils.cpp\" />\n    <ClCompile Include=\"utils\\Environment.cpp\" />\n    <ClCompile Include=\"utils\\Exception.cpp\" />\n    <ClCompile Include=\"utils\\Logging.cpp\" />\n    <ClCompile Include=\"utils\\MarshalingUtils.cpp\" />\n    <ClCompile Include=\"utils\\Memory.cpp\" />\n    <ClCompile Include=\"utils\\MemoryPool.cpp\" />\n    <ClCompile Include=\"utils\\Output.cpp\" />\n    <ClCompile Include=\"utils\\RegisterRuntimeInitializeAndCleanup.cpp\" />\n    <ClCompile Include=\"utils\\Runtime.cpp\" />\n    <ClCompile Include=\"utils\\StringUtils.cpp\" />\n    <ClCompile Include=\"utils\\PathUtils.cpp\" />\n    <ClCompile Include=\"vm-utils\\BlobReader.cpp\" />\n    <ClCompile Include=\"vm-utils\\NativeDelegateMethodCache.cpp\" />\n    <ClCompile Include=\"vm-utils\\NativeSymbol.cpp\" />\n    <ClCompile Include=\"vm-utils\\VmStringUtils.cpp\" />\n    <ClCompile Include=\"vm\\Array.cpp\" />\n    <ClCompile Include=\"vm\\Assembly.cpp\" />\n    <ClCompile Include=\"vm\\AssemblyName.cpp\" />\n    <ClCompile Include=\"vm\\Atomic.cpp\" />\n    <ClCompile Include=\"vm\\CCW.cpp\" />\n    <ClCompile Include=\"vm\\Class.cpp\" />\n    <ClCompile Include=\"vm\\COM.cpp\" />\n    <ClCompile Include=\"vm\\Debug.cpp\" />\n    <ClCompile Include=\"vm\\Domain.cpp\" />\n    <ClCompile Include=\"vm\\Enum.cpp\" />\n    <ClCompile Include=\"vm\\Event.cpp\" />\n    <ClCompile Include=\"vm\\Exception.cpp\" />\n    <ClCompile Include=\"vm\\Field.cpp\" />\n    <ClCompile Include=\"vm\\GenericClass.cpp\" />\n    <ClCompile Include=\"vm\\GenericContainer.cpp\" />\n    <ClCompile Include=\"vm\\Image.cpp\" />\n    <ClCompile Include=\"vm\\InternalCalls.cpp\" />\n    <ClCompile Include=\"vm\\LastError.cpp\" />\n    <ClCompile Include=\"vm\\LibraryLoader.cpp\" />\n    <ClCompile Include=\"vm\\Liveness.cpp\" />\n    <ClCompile Include=\"vm\\MarshalAlloc.cpp\" />\n    <ClCompile Include=\"vm\\MemoryInformation.cpp\" />\n    <ClCompile Include=\"vm\\MetadataAlloc.cpp\" />\n    <ClCompile Include=\"vm\\MetadataCache.cpp\" />\n    <ClCompile Include=\"vm\\MetadataLoader.cpp\" />\n    <ClCompile Include=\"vm\\Method.cpp\" />\n    <ClCompile Include=\"vm\\Module.cpp\" />\n    <ClCompile Include=\"vm\\Monitor.cpp\" />\n    <ClCompile Include=\"vm\\Object.cpp\" />\n    <ClCompile Include=\"vm\\Parameter.cpp\" />\n    <ClCompile Include=\"vm\\Path.cpp\" />\n    <ClCompile Include=\"vm\\PlatformInvoke.cpp\" />\n    <ClCompile Include=\"vm\\Profiler.cpp\" />\n    <ClCompile Include=\"vm\\Property.cpp\" />\n    <ClCompile Include=\"vm\\Random.cpp\" />\n    <ClCompile Include=\"vm\\RCW.cpp\" />\n    <ClCompile Include=\"vm\\Reflection.cpp\" />\n    <ClCompile Include=\"vm\\Runtime.cpp\" />\n    <ClCompile Include=\"vm\\StackTrace.cpp\" />\n    <ClCompile Include=\"vm\\String.cpp\" />\n    <ClCompile Include=\"vm\\Thread.cpp\" />\n    <ClCompile Include=\"vm\\ThreadPool.cpp\" />\n    <ClCompile Include=\"vm\\ThreadPoolMs.cpp\" />\n    <ClCompile Include=\"vm\\Type.cpp\" />\n    <ClCompile Include=\"vm\\WaitHandle.cpp\" />\n    <ClCompile Include=\"vm\\WindowsRuntime.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"libil2cpp.def\" />\n    <None Include=\"vm\\InternalCalls.inc\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "unity_decoder/libil2cpp/libil2cpp.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"il2cpp-api.cpp\" />\n    <ClCompile Include=\"vm\\Class.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\String.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Object.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Method.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Reflection.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Array.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Runtime.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Exception.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Thread.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\GenericClass.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Field.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\RegisterRuntimeInitializeAndCleanup.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\StringUtils.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\PathUtils.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\InternalCalls.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"gc\\BoehmGC.cpp\">\n      <Filter>gc</Filter>\n    </ClCompile>\n    <ClCompile Include=\"gc\\GCHandle.cpp\">\n      <Filter>gc</Filter>\n    </ClCompile>\n    <ClCompile Include=\"gc\\NullGC.cpp\">\n      <Filter>gc</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Image.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Assembly.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Type.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Profiler.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Liveness.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Domain.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"il2cpp-debugger.cpp\" />\n    <ClCompile Include=\"debugger\\agent.cpp\">\n      <Filter>debugger</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\transport-tcp.cpp\">\n      <Filter>debugger</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\data-buffer.cpp\">\n      <Filter>debugger</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\id-brank.cpp\">\n      <Filter>debugger</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\event-request.cpp\">\n      <Filter>debugger</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\utils.cpp\">\n      <Filter>debugger\\protocol</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\protocol.cpp\">\n      <Filter>debugger\\protocol</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\events.cpp\">\n      <Filter>debugger\\protocol</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\app-domain.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\event.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\event-request.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\internal-error.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\vm.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\app-domain.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\array-ref.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Memory.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\Memory.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Thread.cpp\">\n      <Filter>os</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\ThreadImpl.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\ThreadImpl.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\ThreadLocalValue.cpp\">\n      <Filter>os</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\ThreadLocalValueImpl.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\ThreadLocalValueImpl.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Semaphore.cpp\">\n      <Filter>os</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\SemaphoreImpl.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\SemaphoreImpl.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Mutex.cpp\">\n      <Filter>os</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\MutexImpl.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\MutexImpl.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Std\\ThreadImpl.cpp\">\n      <Filter>os\\Std</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Event.cpp\">\n      <Filter>os</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\EventImpl.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\EventImpl.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\assembly.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\event.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\event-request.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\internal-error.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\method.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\module.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\object-ref.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\stack-frame.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\string-ref.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\thread.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\type.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\handlers\\vm.cpp\">\n      <Filter>debugger\\handlers</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\object-ref.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\type.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\thread.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\assembly.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Debug.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\method.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\module.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\array-ref.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\stack-frame.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\protocol\\commands\\string-ref.cpp\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\Stopwatch.cpp\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClCompile>\n    <ClCompile Include=\"class-internals.cpp\" />\n    <ClCompile Include=\"debugger\\variant.cpp\">\n      <Filter>debugger</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\Directory.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Directory.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\File.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\File.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\Locale.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Locale.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\Mono\\Runtime.cpp\">\n      <Filter>icalls\\mscorlib\\Mono</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\Interlocked.cpp\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\Monitor.cpp\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\Mutex.cpp\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\NativeEventCalls.cpp\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\Thread.cpp\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\ThreadPool.cpp\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\WaitHandle.cpp\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Text\\Encoding.cpp\">\n      <Filter>icalls\\mscorlib\\System.Text</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsIdentity.cpp\">\n      <Filter>icalls\\mscorlib\\System.Security.Principal</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsImpersonationContext.cpp\">\n      <Filter>icalls\\mscorlib\\System.Security.Principal</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsPrincipal.cpp\">\n      <Filter>icalls\\mscorlib\\System.Security.Principal</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security.Policy\\Evidence.cpp\">\n      <Filter>icalls\\mscorlib\\System.Security.Policy</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\TimeZone.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Cryptography.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Time.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\Cryptography.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\Time.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\TimeZone.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\LibraryLoader.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\MarshalAlloc.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\MarshalAlloc.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\MarshalAlloc.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Net.Sockets\\Socket.cpp\">\n      <Filter>icalls\\System\\System.Net.Sockets</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Net.Sockets\\SocketException.cpp\">\n      <Filter>icalls\\System\\System.Net.Sockets</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.ComponentModel\\Win32Exception.cpp\">\n      <Filter>icalls\\System\\System.ComponentModel</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\DefaultTraceListener.cpp\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\FileVersionInfo.cpp\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\Process.cpp\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.IO\\FAMWatcher.cpp\">\n      <Filter>icalls\\System\\System.IO</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.IO\\FileSystemWatcher.cpp\">\n      <Filter>icalls\\System\\System.IO</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.IO\\InotifyWatcher.cpp\">\n      <Filter>icalls\\System\\System.IO</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Net\\Dns.cpp\">\n      <Filter>icalls\\System\\System.Net</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\ConsoleDriver.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Configuration\\DefaultConfig.cpp\">\n      <Filter>icalls\\System\\System.Configuration</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounter.cpp\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounterCategory.cpp\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\Path.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Path.cpp\">\n      <Filter>os</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Path.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Generic\\SocketImpl.cpp\">\n      <Filter>os\\Generic</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\SocketImpl.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Socket.cpp\">\n      <Filter>os</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Messages.cpp\">\n      <Filter>os</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Error.cpp\">\n      <Filter>os</Filter>\n    </ClCompile>\n    <ClCompile Include=\"gc\\WriteBarrier.cpp\">\n      <Filter>gc</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\thread-data.cpp\">\n      <Filter>debugger</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\command-line-parser.cpp\">\n      <Filter>debugger</Filter>\n    </ClCompile>\n    <ClCompile Include=\"debugger\\il2cpp-api-test-forwarder.cpp\">\n      <Filter>debugger</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Environment.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\Environment.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Generic\\Environment.cpp\">\n      <Filter>os\\Generic</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Console.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\Console.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\LastError.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\LastError.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\LastError.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\Encoding.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Encoding.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\StackTrace.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"externals\\MonoPosixHelper.cpp\">\n      <Filter>externals</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\adler32.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\compress.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\crc32.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\deflate.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\gzio.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\infback.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\inffast.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\inflate.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\inftrees.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\trees.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\uncompr.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\zlib\\zutil.c\">\n      <Filter>external\\zlib</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\PosixWaitObject.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\WindowsHelpers.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\SocketImpl.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Configuration\\InternalConfigurationHost.cpp\">\n      <Filter>icalls\\System\\System.Configuration</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Property.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Monitor.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\ThreadPool.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\WaitHandle.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppTypeCompare.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppGenericClassCompare.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppGenericClassHash.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppGenericContextCompare.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppGenericContextHash.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppGenericInstCompare.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppGenericInstHash.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppTypeHash.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\MetadataCache.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppGenericMethodCompare.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\MetadataCache.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppGenericMethodHash.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\GenericMetadata.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\ArrayMetadata.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\GenericMethod.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\GenericSharing.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\FieldLayout.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Debug.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Debug.cpp\">\n      <Filter>os</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\StackTrace.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\Memory.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\MemoryInformation.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Image.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\OSX\\Image.cpp\">\n      <Filter>os\\OSX</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\Image.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Generic\\MemoryMappedFile.cpp\">\n      <Filter>os\\Generic</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\MemoryMappedFile.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\MemoryMappedFile.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\MemoryPool.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\MetadataAlloc.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\MetadataLoader.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\GenericContainer.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\WinRT\\Cryptography.cpp\">\n      <Filter>os\\WinRT</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\WinRT\\Locale.cpp\">\n      <Filter>os\\WinRT</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\WinRT\\Environment.cpp\">\n      <Filter>os\\WinRT</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\WinRT\\Initialize.cpp\">\n      <Filter>os\\WinRT</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Generic\\Initialize.cpp\">\n      <Filter>os\\Generic</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Process.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\WinRT\\Process.cpp\">\n      <Filter>os\\WinRT</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Parameter.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\DirectoryUtils.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Atomic.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\LibraryLoader.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Event.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Module.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\AssemblyName.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Generic\\MarshalStringAlloc.cpp\">\n      <Filter>os\\Generic</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\MarshalStringAlloc.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\COM.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\RCW.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\CCW.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\COM.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"gc\\GarbageCollector.cpp\">\n      <Filter>gc</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounterUtils.cpp\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClCompile>\n    <ClCompile Include=\"char-conversions.cpp\" />\n    <ClCompile Include=\"vm\\WindowsRuntime.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\WindowsRuntime.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Generic\\WindowsRuntime.cpp\">\n      <Filter>os\\Generic</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Diagnostics\\Assert.cpp\">\n      <Filter>icalls\\mscorlib\\System.Diagnostics</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\CLRConfig.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Exception.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\RuntimeFieldHandle.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\RuntimeType.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\RuntimeTypeHandle.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\TimeSpan.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\MissingMemberException.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Number.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Globalization\\CalendarData.cpp\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Globalization\\CultureData.cpp\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\RtFieldInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\CustomAttributeData.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\SymbolType.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Contexts\\Context.cpp\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting.Contexts</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Messaging\\AsyncResult.cpp\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting.Messaging</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Versioning\\VersioningHelper.cpp\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Versioning</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Text\\Normalization.cpp\">\n      <Filter>icalls\\mscorlib\\System.Text</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Text\\EncodingHelper.cpp\">\n      <Filter>icalls\\mscorlib\\System.Text</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\InternalThread.cpp\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Threading\\Timer.cpp\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System.Configuration\\System.Configuration\\InternalConfigurationHost.cpp\">\n      <Filter>icalls\\System.Configuration\\System.Configuration</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System.Core\\System.IO.MemoryMappedFiles\\MemoryMapImpl.cpp\">\n      <Filter>icalls\\System.Core\\System.IO.MemoryMappedFiles</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Net.NetworkInformation\\MacOsIPInterfaceProperties.cpp\">\n      <Filter>icalls\\System\\System.Net.NetworkInformation</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System\\IOSelector.cpp\">\n      <Filter>icalls\\System\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.IO\\KqueueMonitor.cpp\">\n      <Filter>icalls\\System\\System.IO</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Enum.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\Microsoft.Win32\\NativeMethods.cpp\">\n      <Filter>icalls\\System\\Microsoft.Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\NativeMethods.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\NativeMethods.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\OSX\\Process.cpp\">\n      <Filter>os\\OSX</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppSignatureCompare.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"metadata\\Il2CppSignatureHash.cpp\">\n      <Filter>metadata</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\Output.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\Process.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\WinRT\\Win32ApiSharedEmulation.cpp\">\n      <Filter>os\\WinRT</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\WinRT\\Win32ApiWinRTEmulation.cpp\">\n      <Filter>os\\WinRT</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\WinRT\\File.cpp\">\n      <Filter>os\\WinRT</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\ConditionVariable.cpp\">\n      <Filter>os</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\ConditionVariableImpl.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\ConditionVariableImpl.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Random.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\CpuInfo.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Posix\\CpuInfo.cpp\">\n      <Filter>os\\Posix</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\Logging.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\Initialize.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\Mono\\RuntimeClassHandle.cpp\">\n      <Filter>icalls\\mscorlib\\Mono</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\Mono\\RuntimeGPtrArrayHandle.cpp\">\n      <Filter>icalls\\mscorlib\\Mono</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\Mono\\RuntimeMarshal.cpp\">\n      <Filter>icalls\\mscorlib\\Mono</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\Mono\\SafeStringMarshal.cpp\">\n      <Filter>icalls\\mscorlib\\Mono</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\EventInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\PropertyInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"mono-structs.cpp\" />\n    <ClCompile Include=\"vm\\ThreadPoolMs.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\MarshalingUtils.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"mono-runtime\\il2cpp-callbacks.cpp\" />\n    <ClCompile Include=\"mono-runtime\\il2cpp-mono-support.cpp\" />\n    <ClCompile Include=\"mono\\ThreadPool\\threadpool-ms-io-poll.cpp\" />\n    <ClCompile Include=\"mono\\ThreadPool\\threadpool-ms-io.cpp\" />\n    <ClCompile Include=\"mono\\ThreadPool\\threadpool-ms.cpp\" />\n    <ClCompile Include=\"mono\\ThreadPool\\ThreadPoolMonitorThread.cpp\" />\n    <ClCompile Include=\"mono\\ThreadPool\\ThreadPoolWorkerThread.cpp\" />\n    <ClCompile Include=\"icalls\\System\\System.Net.NetworkInformation\\LinuxNetworkInterface.cpp\">\n      <Filter>icalls\\System\\System.Net.NetworkInformation</Filter>\n    </ClCompile>\n    <ClCompile Include=\"external\\xamarin-android\\xamarin_getifaddrs.c\">\n      <Filter>external\\xamarin-android</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\Path.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Android\\StackTrace.cpp\">\n      <Filter>os\\Android</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\Runtime.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\Exception.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\c-api\\File.cpp\">\n      <Filter>os\\c-api</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\c-api\\NativeMethods.cpp\">\n      <Filter>os\\c-api</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\c-api\\Path.cpp\">\n      <Filter>os\\c-api</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\c-api\\Process.cpp\">\n      <Filter>os\\c-api</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\c-api\\Time.cpp\">\n      <Filter>os\\c-api</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\c-api\\TimeZone.cpp\">\n      <Filter>os\\c-api</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\c-api\\Allocator.cpp\">\n      <Filter>os\\c-api</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm-utils\\NativeSymbol.cpp\">\n      <Filter>vm-utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm-utils\\BlobReader.cpp\">\n      <Filter>vm-utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm-utils\\NativeDelegateMethodCache.cpp\">\n      <Filter>vm-utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm-utils\\VmStringUtils.cpp\">\n      <Filter>vm-utils</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utils\\Environment.cpp\">\n      <Filter>utils</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"blob.h\" />\n    <ClInclude Include=\"char-conversions.h\" />\n    <ClInclude Include=\"class-internals.h\" />\n    <ClInclude Include=\"il2cpp-config.h\" />\n    <ClInclude Include=\"metadata.h\" />\n    <ClInclude Include=\"number-formatter.h\" />\n    <ClInclude Include=\"object-internals.h\" />\n    <ClInclude Include=\"utils\\dynamic_array.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Type.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\MonoType.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Array.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Enum.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Math.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\MonoEnumInfo.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security.Cryptography\\RNGCryptoServiceProvider.h\">\n      <Filter>icalls\\mscorlib\\System.Security.Cryptography</Filter>\n    </ClInclude>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security.Cryptography\\RNGCryptoServiceProvider.cpp\">\n      <Filter>icalls\\mscorlib\\System.Security.Cryptography</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security\\SecurityFrame.cpp\">\n      <Filter>icalls\\mscorlib\\System.Security</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Security\\SecurityManager.cpp\">\n      <Filter>icalls\\mscorlib\\System.Security</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Proxies\\RealProxy.cpp\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting.Proxies</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Activation\\ActivationServices.cpp\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting.Activation</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Messaging\\MonoMethodMessage.cpp\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting.Messaging</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.Remoting\\RemotingServices.cpp\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.InteropServices\\GCHandle.cpp\">\n      <Filter>icalls\\mscorlib\\System.Runtime.InteropServices</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.InteropServices\\Marshal.cpp\">\n      <Filter>icalls\\mscorlib\\System.Runtime.InteropServices</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Runtime.CompilerServices\\RuntimeHelpers.cpp\">\n      <Filter>icalls\\mscorlib\\System.Runtime.CompilerServices</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\AssemblyBuilder.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\CustomAttributeBuilder.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\DerivedType.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\DynamicMethod.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\EnumBuilder.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\GenericTypeParameterBuilder.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\MethodBuilder.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\ModuleBuilder.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\SignatureHelper.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection.Emit\\TypeBuilder.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\Assembly.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\AssemblyName.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\FieldInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MemberInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MethodBase.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\Module.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoCMethod.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoEventInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoField.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericClass.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericCMethod.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericMethod.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoMethod.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoMethodInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\MonoPropertyInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Reflection\\ParameterInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.IO\\DriveInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.IO</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.IO\\MonoIO.cpp\">\n      <Filter>icalls\\mscorlib\\System.IO</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.IO\\Path.cpp\">\n      <Filter>icalls\\mscorlib\\System.IO</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Diagnostics\\Debugger.cpp\">\n      <Filter>icalls\\mscorlib\\System.Diagnostics</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Diagnostics\\StackFrame.cpp\">\n      <Filter>icalls\\mscorlib\\System.Diagnostics</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Diagnostics\\StackTrace.cpp\">\n      <Filter>icalls\\mscorlib\\System.Diagnostics</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Globalization\\CompareInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Globalization\\CultureInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System.Globalization\\RegionInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Activator.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\AppDomain.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\ArgIterator.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Array.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Buffer.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Char.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Convert.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\CurrentSystemTimeZone.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\DateTime.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Decimal.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Delegate.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Double.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Enum.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Environment.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\GC.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Math.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\MonoCustomAttrs.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\MonoEnumInfo.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\MonoType.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\NumberFormatter.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Object.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\RuntimeMethodHandle.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\String.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\Type.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\TypedReference.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\ValueType.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\System\\__ComObject.cpp\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\Mono.Globalization.Unicode\\Normalization.cpp\">\n      <Filter>icalls\\mscorlib\\Mono.Globalization.Unicode</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\Mono.Interop\\ComInteropProxy.cpp\">\n      <Filter>icalls\\mscorlib\\Mono.Interop</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\mscorlib\\Mono.Security.Cryptography\\KeyPairPersistence.cpp\">\n      <Filter>icalls\\mscorlib\\Mono.Security.Cryptography</Filter>\n    </ClCompile>\n    <ClCompile Include=\"icalls\\System\\System.Threading\\Semaphore.cpp\">\n      <Filter>icalls\\System\\System.Threading</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vm\\PlatformInvoke.cpp\">\n      <Filter>vm</Filter>\n    </ClCompile>\n    <ClCompile Include=\"os\\Win32\\LibraryLoader.cpp\">\n      <Filter>os\\Win32</Filter>\n    </ClCompile>\n    <ClInclude Include=\"os\\LibraryLoader.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\MarshalAlloc.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\MarshalAlloc.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Net.Sockets\\Socket.h\">\n      <Filter>icalls\\System\\System.Net.Sockets</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Net.Sockets\\SocketException.h\">\n      <Filter>icalls\\System\\System.Net.Sockets</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.ComponentModel\\Win32Exception.h\">\n      <Filter>icalls\\System\\System.ComponentModel</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\Process.h\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\DefaultTraceListener.h\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\FileVersionInfo.h\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.IO\\FAMWatcher.h\">\n      <Filter>icalls\\System\\System.IO</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.IO\\FileSystemWatcher.h\">\n      <Filter>icalls\\System\\System.IO</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.IO\\InotifyWatcher.h\">\n      <Filter>icalls\\System\\System.IO</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Net\\Dns.h\">\n      <Filter>icalls\\System\\System.Net</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Threading\\Semaphore.h\">\n      <Filter>icalls\\System\\System.Threading</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\ConsoleDriver.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Configuration\\DefaultConfig.h\">\n      <Filter>icalls\\System\\System.Configuration</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounter.h\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounterCategory.h\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Path.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\utf8-cpp\\source\\utf8\\unchecked.h\">\n      <Filter>utils\\utf8-cpp</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\utf8-cpp\\source\\utf8\\core.h\">\n      <Filter>utils\\utf8-cpp</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Generic\\SocketImpl.h\">\n      <Filter>os\\Generic</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Posix\\SocketImpl.h\">\n      <Filter>os\\Posix</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Posix\\FileHandle.h\">\n      <Filter>os\\Posix</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Socket.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Messages.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Error.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"gc\\WriteBarrier.h\">\n      <Filter>gc</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Locale.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\PlatformInvoke.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Threading\\Semaphore.h\">\n      <Filter>icalls\\System\\System.Threading</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Console.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\LastError.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Encoding.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\LastError.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\StackTrace.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"externals\\MonoPosixHelper.h\">\n      <Filter>externals</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\zlib\\crc32.h\">\n      <Filter>external\\zlib</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\zlib\\deflate.h\">\n      <Filter>external\\zlib</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\zlib\\inffast.h\">\n      <Filter>external\\zlib</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\zlib\\inffixed.h\">\n      <Filter>external\\zlib</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\zlib\\inflate.h\">\n      <Filter>external\\zlib</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\zlib\\inftrees.h\">\n      <Filter>external\\zlib</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\zlib\\trees.h\">\n      <Filter>external\\zlib</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\zlib\\zconf.h\">\n      <Filter>external\\zlib</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\zlib\\zlib.h\">\n      <Filter>external\\zlib</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\zlib\\zutil.h\">\n      <Filter>external\\zlib</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Posix\\PosixHelpers.h\">\n      <Filter>os\\Posix</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Posix\\PosixWaitObject.h\">\n      <Filter>os\\Posix</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Win32\\WindowsHelpers.h\">\n      <Filter>os\\Win32</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\ThreadSafeFreeList.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Win32\\SocketImpl.h\">\n      <Filter>os\\Win32</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Configuration\\InternalConfigurationHost.h\">\n      <Filter>icalls\\System\\System.Configuration</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Property.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Monitor.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\ThreadPool.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\WaitHandle.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppTypeCompare.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppGenericClassCompare.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppGenericClassHash.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppGenericContextCompare.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppGenericContextHash.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppGenericInstCompare.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppGenericInstHash.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppTypeHash.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\HashUtils.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\MetadataCache.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppTypeVector.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppGenericMethodCompare.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppGenericMethodHash.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\GenericMetadata.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\ArrayMetadata.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\GenericMethod.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\GenericSharing.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\MetadataCache.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\Collections.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\FieldLayout.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"normalization-tables.h\" />\n    <ClInclude Include=\"os\\Debug.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\Memory.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\MetadataLock.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\StackTrace.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\MathUtils.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\MemoryInformation.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"il2cpp-metadata.h\" />\n    <ClInclude Include=\"utils\\MemoryRead.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\MemoryMappedFile.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Image.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\MemoryPool.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\MetadataAlloc.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\MetadataLoader.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\GenericContainer.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\WinRT\\SynchronousOperation.h\">\n      <Filter>os\\WinRT</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Initialize.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Process.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Parameter.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\CallOnce.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\DirectoryUtils.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Atomic.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\LibraryLoader.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Event.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Module.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\AssemblyName.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\MarshalStringAlloc.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Generic\\COM.cpp\">\n      <Filter>os\\Generic</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\COM.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\WindowsRuntime.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\WindowsRuntime.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\RCW.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\CCW.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\ComUtils.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\COM.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\WindowsRuntime.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\WindowsRuntime.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"il2cpp-api-functions.h\" />\n    <ClInclude Include=\"gc\\GarbageCollector.h\">\n      <Filter>gc</Filter>\n    </ClInclude>\n    <ClInclude Include=\"gc\\GarbageCollectorImpl.h\">\n      <Filter>gc</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\GC.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\perfcounters-def.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\PerformanceCounterUtils.h\" />\n    <ClInclude Include=\"utils\\StringView.h\" />\n    <ClInclude Include=\"utils\\StringViewStream.h\" />\n    <ClInclude Include=\"icalls\\mscorlib\\System.Diagnostics\\Assert.h\">\n      <Filter>icalls\\mscorlib\\System.Diagnostics</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\CLRConfig.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Exception.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Number.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\RuntimeFieldHandle.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\RuntimeType.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\RuntimeTypeHandle.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\TimeSpan.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\MissingMemberException.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CultureData.h\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CalendarData.h\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\CustomAttributeData.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\RtFieldInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\SymbolType.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Contexts\\Context.h\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting.Contexts</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Messaging\\AsyncResult.h\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting.Messaging</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Versioning\\VersioningHelper.h\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Versioning</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Text\\EncodingHelper.h\">\n      <Filter>icalls\\mscorlib\\System.Text</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Text\\Normalization.h\">\n      <Filter>icalls\\mscorlib\\System.Text</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\Timer.h\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\InternalThread.h\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System.Configuration\\System.Configuration\\InternalConfigurationHost.h\">\n      <Filter>icalls\\System.Configuration\\System.Configuration</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System.Core\\System.IO.MemoryMappedFiles\\MemoryMapImpl.h\">\n      <Filter>icalls\\System.Core\\System.IO.MemoryMappedFiles</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Net.NetworkInformation\\MacOsIPInterfaceProperties.h\">\n      <Filter>icalls\\System\\System.Net.NetworkInformation</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System\\IOSelector.h\">\n      <Filter>icalls\\System\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.IO\\KqueueMonitor.h\">\n      <Filter>icalls\\System\\System.IO</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Enum.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\Microsoft.Win32\\NativeMethods.h\">\n      <Filter>icalls\\System\\Microsoft.Win32</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\NativeMethods.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppSignatureCompare.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"metadata\\Il2CppSignatureHash.h\">\n      <Filter>metadata</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\google\\sparsehash\\dense_hash_map.h\">\n      <Filter>external\\google\\sparsehash</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\google\\sparsehash\\densehashtable.h\">\n      <Filter>external\\google\\sparsehash</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\google\\sparsehash\\type_traits.h\">\n      <Filter>external\\google\\sparsehash</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\google\\sparsehash\\dense_hash_set.h\">\n      <Filter>external\\google\\sparsehash</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\Output.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\Il2CppHashMap.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\Il2CppHashSet.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\KeyWrapper.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\WinRT\\Win32ApiSharedEmulation.h\">\n      <Filter>os\\WinRT</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\WinRT\\Win32ApiWinRTEmulation.h\">\n      <Filter>os\\WinRT</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\ConditionVariable.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Win32\\ConditionVariableImpl.h\">\n      <Filter>os\\Win32</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Posix\\ConditionVariableImpl.h\">\n      <Filter>os\\Posix</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icallincludes.h\" />\n    <ClInclude Include=\"vm\\Random.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"codegen\\il2cpp-codegen-mono.h\">\n      <Filter>codegen</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\CpuInfo.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"il2cpp-string-types.h\" />\n    <ClInclude Include=\"gc\\AppendOnlyGCHashMap.h\">\n      <Filter>gc</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\Mono\\RuntimeClassHandle.h\">\n      <Filter>icalls\\mscorlib\\Mono</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\Mono\\RuntimeGPtrArrayHandle.h\">\n      <Filter>icalls\\mscorlib\\Mono</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\Mono\\RuntimeMarshal.h\">\n      <Filter>icalls\\mscorlib\\Mono</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\Mono\\SafeStringMarshal.h\">\n      <Filter>icalls\\mscorlib\\Mono</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\EventInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\PropertyInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"mono-structs.h\" />\n    <ClInclude Include=\"vm\\ThreadPoolMs.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\Logging.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\TimeZoneInfo.h\" />\n    <ClInclude Include=\"il2cpp-vm-support.h\" />\n    <ClInclude Include=\"mono-runtime\\il2cpp-callbacks.h\" />\n    <ClInclude Include=\"mono-runtime\\il2cpp-mapping.h\" />\n    <ClInclude Include=\"mono-runtime\\il2cpp-mono-support.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\ThreadPoolDataStructures.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\threadpool-ms-io-poll.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\threadpool-ms-io.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\threadpool-ms.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\ThreadPoolMacros.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\ThreadPoolMonitorThread.h\" />\n    <ClInclude Include=\"mono\\ThreadPool\\ThreadPoolWorkerThread.h\" />\n    <ClInclude Include=\"utils\\MarshalingUtils.h\" />\n    <ClInclude Include=\"utils\\NativeSymbol.h\" />\n    <ClInclude Include=\"vm\\CachedCCWBase.h\" />\n    <ClInclude Include=\"vm\\NonCachedCCWBase.h\" />\n    <ClInclude Include=\"icalls\\System\\System.Net.NetworkInformation\\LinuxNetworkInterface.h\">\n      <Filter>icalls\\System\\System.Net.NetworkInformation</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\xamarin-android\\logger.h\">\n      <Filter>external\\xamarin-android</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\xamarin-android\\monodroid.h\">\n      <Filter>external\\xamarin-android</Filter>\n    </ClInclude>\n    <ClInclude Include=\"external\\xamarin-android\\xamarin_getifaddrs.h\">\n      <Filter>external\\xamarin-android</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Path.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"codegen\\il2cpp-codegen-common.h\">\n      <Filter>codegen</Filter>\n    </ClInclude>\n    <ClInclude Include=\"codegen\\il2cpp-codegen-il2cpp.h\">\n      <Filter>codegen</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\Runtime.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\Exception.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\c-api\\File-c-api.h\">\n      <Filter>os\\c-api</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\c-api\\NativeMethods-c-api.h\">\n      <Filter>os\\c-api</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\c-api\\Path-c-api.h\">\n      <Filter>os\\c-api</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\c-api\\Process-c-api.h\">\n      <Filter>os\\c-api</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\c-api\\Time-c-api.h\">\n      <Filter>os\\c-api</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\c-api\\TimeZone-c-api.h\">\n      <Filter>os\\c-api</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\c-api\\Allocator.h\">\n      <Filter>os\\c-api</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm-utils\\NativeSymbol.h\">\n      <Filter>vm-utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm-utils\\BlobReader.h\">\n      <Filter>vm-utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm-utils\\NativeDelegateMethodCache.h\">\n      <Filter>vm-utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm-utils\\VmStringUtils.h\">\n      <Filter>vm-utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm-utils\\BlobReader.h\" />\n    <ClInclude Include=\"vm-utils\\NativeDelegateMethodCache.h\" />\n    <ClInclude Include=\"vm-utils\\NativeSymbol.h\" />\n    <ClInclude Include=\"vm-utils\\VmStringUtils.h\" />\n    <ClInclude Include=\"utils\\Environment.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"blob.h\" />\n    <ClInclude Include=\"char-conversions.h\" />\n    <ClInclude Include=\"class-internals.h\" />\n    <ClInclude Include=\"il2cpp-config.h\" />\n    <ClInclude Include=\"metadata.h\" />\n    <ClInclude Include=\"number-formatter.h\" />\n    <ClInclude Include=\"object-internals.h\" />\n    <ClInclude Include=\"tabledefs.h\" />\n    <ClInclude Include=\"il2cpp-api.h\" />\n    <ClInclude Include=\"vm\\Class.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\String.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Object.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Method.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Reflection.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Array.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Runtime.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Exception.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Thread.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\GenericClass.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Field.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\RegisterRuntimeInitializeAndCleanup.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\File.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\Functional.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\Il2CppHStringReference.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\StringUtils.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\PathUtils.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\InternalCalls.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"gc\\Allocator.h\">\n      <Filter>gc</Filter>\n    </ClInclude>\n    <ClInclude Include=\"gc\\gc_wrapper.h\">\n      <Filter>gc</Filter>\n    </ClInclude>\n    <ClInclude Include=\"gc\\GCHandle.h\">\n      <Filter>gc</Filter>\n    </ClInclude>\n    <ClInclude Include=\"codegen\\il2cpp-codegen.h\">\n      <Filter>codegen</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Time.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\TimeZone.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Image.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Assembly.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Type.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Directory.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\ErrorCodes.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Profiler.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Liveness.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Domain.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"il2cpp-api-types.h\" />\n    <ClInclude Include=\"il2cpp-debugger.h\" />\n    <ClInclude Include=\"debugger\\agent.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\common.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\transport.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\transport-tcp.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\data-buffer.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\id-bank.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\event-request.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\protocol.h\">\n      <Filter>debugger\\protocol</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\globals.h\">\n      <Filter>debugger\\protocol</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\utils.h\">\n      <Filter>debugger\\protocol</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\events.h\">\n      <Filter>debugger\\protocol</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\app-domain.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\array-ref.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\assembly.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\event.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\event-request.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\internal-error.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\method.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\module.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\object-ref.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\stack-frame.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\string-ref.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\ThreadLocalValue.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Thread.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Semaphore.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\WaitStatus.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"utils\\NonCopyable.h\">\n      <Filter>utils</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Posix\\ThreadImpl.h\">\n      <Filter>os\\Posix</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Win32\\ThreadImpl.h\">\n      <Filter>os\\Win32</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Win32\\ThreadLocalValueImpl.h\">\n      <Filter>os\\Win32</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Posix\\ThreadLocalValueImpl.h\">\n      <Filter>os\\Posix</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Win32\\WindowsHeaders.h\">\n      <Filter>os\\Win32</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Win32\\SemaphoreImpl.h\">\n      <Filter>os\\Win32</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Posix\\SemaphoreImpl.h\">\n      <Filter>os\\Posix</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Mutex.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Win32\\MutexImpl.h\">\n      <Filter>os\\Win32</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Posix\\MutexImpl.h\">\n      <Filter>os\\Posix</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Handle.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Std\\ThreadImpl.h\">\n      <Filter>os\\Std</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Event.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Win32\\EventImpl.h\">\n      <Filter>os\\Win32</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Posix\\EventImpl.h\">\n      <Filter>os\\Posix</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Atomic.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Win32\\AtomicImpl.h\">\n      <Filter>os\\Win32</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\thread.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\type.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\commands\\vm.h\">\n      <Filter>debugger\\protocol\\commands</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Debug.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\meta.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\protocol\\protocol-utils.h\">\n      <Filter>debugger\\protocol</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\System\\System.Diagnostics\\Stopwatch.h\">\n      <Filter>icalls\\System\\System.Diagnostics</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Cryptography.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\variant.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"os\\Environment.h\">\n      <Filter>os</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\thread-data.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\command-line-parser.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"debugger\\il2cpp-api-test-forwarder.h\">\n      <Filter>debugger</Filter>\n    </ClInclude>\n    <ClInclude Include=\"vm\\Environment.h\">\n      <Filter>vm</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\Mono\\Runtime.h\">\n      <Filter>icalls\\mscorlib\\Mono</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\Interlocked.h\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\Monitor.h\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\Mutex.h\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\NativeEventCalls.h\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\Thread.h\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\ThreadPool.h\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Threading\\WaitHandle.h\">\n      <Filter>icalls\\mscorlib\\System.Threading</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Text\\Encoding.h\">\n      <Filter>icalls\\mscorlib\\System.Text</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsIdentity.h\">\n      <Filter>icalls\\mscorlib\\System.Security.Principal</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsImpersonationContext.h\">\n      <Filter>icalls\\mscorlib\\System.Security.Principal</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security.Principal\\WindowsPrincipal.h\">\n      <Filter>icalls\\mscorlib\\System.Security.Principal</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security.Policy\\Evidence.h\">\n      <Filter>icalls\\mscorlib\\System.Security.Policy</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security.Cryptography\\RNGCryptoServiceProvider.h\">\n      <Filter>icalls\\mscorlib\\System.Security.Cryptography</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security\\SecurityFrame.h\">\n      <Filter>icalls\\mscorlib\\System.Security</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Security\\SecurityManager.h\">\n      <Filter>icalls\\mscorlib\\System.Security</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Proxies\\RealProxy.h\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting.Proxies</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Activation\\ActivationServices.h\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting.Activation</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Messaging\\MonoMethodMessage.h\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting.Messaging</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.Remoting\\RemotingServices.h\">\n      <Filter>icalls\\mscorlib\\System.Runtime.Remoting</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.InteropServices\\GCHandle.h\">\n      <Filter>icalls\\mscorlib\\System.Runtime.InteropServices</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.InteropServices\\Marshal.h\">\n      <Filter>icalls\\mscorlib\\System.Runtime.InteropServices</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Runtime.CompilerServices\\RuntimeHelpers.h\">\n      <Filter>icalls\\mscorlib\\System.Runtime.CompilerServices</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\AssemblyBuilder.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\CustomAttributeBuilder.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\DerivedType.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\DynamicMethod.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\EnumBuilder.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\GenericTypeParameterBuilder.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\MethodBuilder.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\ModuleBuilder.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\SignatureHelper.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection.Emit\\TypeBuilder.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection.Emit</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\Assembly.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\AssemblyName.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\FieldInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MemberInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MethodBase.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\Module.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoCMethod.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoEventInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoField.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericClass.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericCMethod.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoGenericMethod.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoMethod.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoMethodInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\MonoPropertyInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Reflection\\ParameterInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Reflection</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.IO\\DriveInfo.h\">\n      <Filter>icalls\\mscorlib\\System.IO</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.IO\\MonoIO.h\">\n      <Filter>icalls\\mscorlib\\System.IO</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.IO\\Path.h\">\n      <Filter>icalls\\mscorlib\\System.IO</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Diagnostics\\Debugger.h\">\n      <Filter>icalls\\mscorlib\\System.Diagnostics</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Diagnostics\\StackFrame.h\">\n      <Filter>icalls\\mscorlib\\System.Diagnostics</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Diagnostics\\StackTrace.h\">\n      <Filter>icalls\\mscorlib\\System.Diagnostics</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CompareInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CompareOptions.h\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CultureInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CultureInfoInternals.h\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\CultureInfoTables.h\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System.Globalization\\RegionInfo.h\">\n      <Filter>icalls\\mscorlib\\System.Globalization</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Activator.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\AppDomain.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\ArgIterator.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Array.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Buffer.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Char.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Convert.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\CurrentSystemTimeZone.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\DateTime.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Decimal.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Delegate.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Double.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Enum.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Environment.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\GC.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Math.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\MonoCustomAttrs.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\MonoEnumInfo.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\MonoType.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\NumberFormatter.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Object.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\RuntimeMethodHandle.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\String.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\Type.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\TypedReference.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\ValueType.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\System\\__ComObject.h\">\n      <Filter>icalls\\mscorlib\\System</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\Mono.Globalization.Unicode\\Normalization.h\">\n      <Filter>icalls\\mscorlib\\Mono.Globalization.Unicode</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\Mono.Interop\\ComInteropProxy.h\">\n      <Filter>icalls\\mscorlib\\Mono.Interop</Filter>\n    </ClInclude>\n    <ClInclude Include=\"icalls\\mscorlib\\Mono.Security.Cryptography\\KeyPairPersistence.h\">\n      <Filter>icalls\\mscorlib\\Mono.Security.Cryptography</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <Filter Include=\"icalls\">\n      <UniqueIdentifier>{d0a67431-31ec-4bbe-8701-8100f710d5f8}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\">\n      <UniqueIdentifier>{12a6451d-ca5e-4230-8d8b-1b3bb35f4e4c}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System\">\n      <UniqueIdentifier>{738658e0-940e-4050-b41b-99d6437759fb}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Security.Cryptography\">\n      <UniqueIdentifier>{b78baafa-5991-4293-8270-d25a884e64ba}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Reflection.Emit\">\n      <UniqueIdentifier>{0dd1f5b7-c97b-4294-bc4a-8de28eb89d78}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Reflection\">\n      <UniqueIdentifier>{0430ba0d-4c62-44b9-a5ce-3e64da2e486b}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Runtime.CompilerServices\">\n      <UniqueIdentifier>{51dd375a-cf90-496c-9c94-4674d2f48f42}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\Mono.Interop\">\n      <UniqueIdentifier>{8ef1b810-0910-4457-823a-ca2929779288}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.IO\">\n      <UniqueIdentifier>{e40bc88f-140f-4d9f-aa3e-293e4d36e194}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Runtime.InteropServices\">\n      <UniqueIdentifier>{7046bf2b-3ca4-4335-8814-97f903cc02d9}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"vm\">\n      <UniqueIdentifier>{180a504a-294c-44bb-ae0f-ad14ee9fd527}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\Mono.Security.Cryptography\">\n      <UniqueIdentifier>{8517adbc-a129-4978-a4ef-6aed73addc95}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Diagnostics\">\n      <UniqueIdentifier>{439ba954-2c07-40ef-b1af-c09d66d3e1ad}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Globalization\">\n      <UniqueIdentifier>{1f949457-47de-4a6b-85a8-43298921ce96}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Runtime.Remoting\">\n      <UniqueIdentifier>{e79916cc-3664-46d9-9281-a18428719ef3}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Activation\">\n      <UniqueIdentifier>{d7c6200b-3dd3-4800-8989-cdfb8e963722}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Proxies\">\n      <UniqueIdentifier>{8fcde566-0958-4c94-aef9-64c8b5bda310}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Security\">\n      <UniqueIdentifier>{413cf900-a6d8-4c43-9a83-842a4be111f5}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Security.Principal\">\n      <UniqueIdentifier>{c0c54006-b8f5-4471-85ab-56ae7f5e8677}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Text\">\n      <UniqueIdentifier>{ca5df3f1-bbd2-44a6-9b29-ad881606d8a1}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Threading\">\n      <UniqueIdentifier>{02da9909-10a6-4e6b-9b74-df93cc70eeca}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"utils\">\n      <UniqueIdentifier>{34bbb29c-1734-4c3a-8b51-7c6dc40736db}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"os\">\n      <UniqueIdentifier>{2063ebbb-cef5-45d1-8214-b9a063698429}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"codegen\">\n      <UniqueIdentifier>{027d0b2f-01ca-40ff-b405-8b832403c735}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"gc\">\n      <UniqueIdentifier>{a4e50a2b-8cc0-4b94-8ce4-61f0f0bda60a}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"debugger\">\n      <UniqueIdentifier>{aea99ed3-49d2-479a-a165-8a9df63c1eae}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"debugger\\protocol\">\n      <UniqueIdentifier>{fee96542-a7ef-456a-a3d5-54d524c39258}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"debugger\\protocol\\commands\">\n      <UniqueIdentifier>{89a08caa-c0c1-440d-b1f9-e9285efbb85c}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"debugger\\handlers\">\n      <UniqueIdentifier>{9c670285-c3d2-486a-8589-95e815a581b6}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System\">\n      <UniqueIdentifier>{d0df3daa-3047-43fb-9090-cf76f5b7f8dc}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System\\System.Diagnostics\">\n      <UniqueIdentifier>{14a9903f-d61e-4137-95b0-b78c6a553584}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"os\\Win32\">\n      <UniqueIdentifier>{ed74ed87-9f24-480e-a867-910c55f592c4}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"os\\Posix\">\n      <UniqueIdentifier>{40dfb16f-7299-4125-b03c-47b1a8fe8406}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"os\\Std\">\n      <UniqueIdentifier>{def4e741-6f7a-4655-89f0-2df2c2c80cff}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\Mono\">\n      <UniqueIdentifier>{fd7f312d-f13b-47dc-92c8-355a4a138276}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Messaging\">\n      <UniqueIdentifier>{999fdd8e-3a26-4a18-945d-335d829efb05}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\Mono.Globalization.Unicode\">\n      <UniqueIdentifier>{1575433e-5ea0-42da-8e34-ef74066fb9ae}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Security.Policy\">\n      <UniqueIdentifier>{a4f6cf11-3f99-418b-a476-5aef272b8302}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"os\\Generic\">\n      <UniqueIdentifier>{b94d665a-d61a-462c-954c-b41a750610e7}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System\\System.Threading\">\n      <UniqueIdentifier>{d510bb08-b41d-4fd5-925e-1097f01fa1cb}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System\\System.ComponentModel\">\n      <UniqueIdentifier>{f2f9fff2-0dd8-4aa7-92e0-9b2d7c3ee84a}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System\\System.IO\">\n      <UniqueIdentifier>{015bf5e3-9cbe-44e0-aedb-cb62ab085f32}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System\\System.Net\">\n      <UniqueIdentifier>{e04a3b73-3d05-478c-9265-0a21bc3b9cf1}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System\\System.Net.Sockets\">\n      <UniqueIdentifier>{f42dada5-8f7e-4824-8f35-5d674fde0260}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System\\System.Configuration\">\n      <UniqueIdentifier>{e8baedf4-38c9-407c-9565-ee80d8e6b6b3}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"utils\\utf8-cpp\">\n      <UniqueIdentifier>{68af634a-880a-476d-be5e-8a3bbddcf9c1}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"externals\">\n      <UniqueIdentifier>{6ed1563b-2499-4017-903a-8e8a58ac9d9d}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"external\">\n      <UniqueIdentifier>{86a616f5-da91-46be-ad81-de62af32f3fe}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"external\\zlib\">\n      <UniqueIdentifier>{05a3316c-38cc-475e-8c5f-e88f6b064dc7}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"metadata\">\n      <UniqueIdentifier>{6d114f22-0edb-4a93-a4b7-d96ca88f1535}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"os\\OSX\">\n      <UniqueIdentifier>{7c83bd52-b497-4e70-b977-0d000b1578de}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"os\\WinRT\">\n      <UniqueIdentifier>{6976f933-477a-486f-bbd5-2cf9bb1c964c}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"os\\Unity\">\n      <UniqueIdentifier>{0430df54-ee7b-4738-bea9-75626c882575}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Runtime.Remoting.Contexts\">\n      <UniqueIdentifier>{1cb9ee6f-bcb5-4532-85fb-a0d143f92f97}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\mscorlib\\System.Runtime.Versioning\">\n      <UniqueIdentifier>{63befc8d-e21a-4298-833c-7fee92721959}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System.Configuration\">\n      <UniqueIdentifier>{2caaeb5d-64a8-4a7a-b7d6-f3a34f6518ac}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System.Configuration\\System.Configuration\">\n      <UniqueIdentifier>{275c89c7-b7c2-44f1-9ef9-8a1ee72d4be5}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System.Core\">\n      <UniqueIdentifier>{a0b052a6-7577-438c-b228-ec9aa944aa34}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System.Core\\System.IO.MemoryMappedFiles\">\n      <UniqueIdentifier>{95cd4b03-aecf-40eb-bc1e-fbce3595ca45}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System\\System.Net.NetworkInformation\">\n      <UniqueIdentifier>{2917f620-4eeb-4519-8c89-b41c2acc1f0c}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System\\System\">\n      <UniqueIdentifier>{9d8ad3a4-09bc-495c-b303-141f8391e497}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"icalls\\System\\Microsoft.Win32\">\n      <UniqueIdentifier>{c5851c1d-3fab-4248-a54a-05bbd5690c37}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"mono\">\n      <UniqueIdentifier>{31d18c78-b7d7-4ffd-ac5b-afc9849ed2b2}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"external\\google\">\n      <UniqueIdentifier>{cb9dfdd5-8359-4a4b-a94c-d6bcb85032e2}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"external\\google\\sparsehash\">\n      <UniqueIdentifier>{b4723b4d-6f82-47d4-a565-c63585dc3646}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"mono\\ThreadPool\">\n      <UniqueIdentifier>{1f2821fc-c40c-40c8-ad24-200ee6b123fd}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"external\\xamarin-android\">\n      <UniqueIdentifier>{4862e90c-23f0-4fcf-a14b-787c976f6083}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"os\\Android\">\n      <UniqueIdentifier>{9b67d9fa-cf50-45a7-93fc-b2e25ac4e73a}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"os\\c-api\">\n      <UniqueIdentifier>{af05b2ca-3dde-4659-8af7-c9655f11d420}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"vm-utils\">\n      <UniqueIdentifier>{282f089e-e7a0-494c-8a4b-f56ca071fb01}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"vm\\InternalCalls.inc\">\n      <Filter>vm</Filter>\n    </None>\n    <None Include=\"libil2cpp.def\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/ArrayMetadata.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/Mutex.h\"\n#include \"vm/Class.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/Image.h\"\n#include \"vm/MetadataLock.h\"\n#include \"vm/Type.h\"\n#include \"metadata/ArrayMetadata.h\"\n#include \"metadata/GenericMetadata.h\"\n#include \"metadata/GenericMethod.h\"\n#include \"metadata/Il2CppGenericClassHash.h\"\n#include \"metadata/Il2CppGenericClassCompare.h\"\n#include \"metadata/Il2CppGenericInstCompare.h\"\n#include \"metadata/Il2CppGenericInstHash.h\"\n#include \"metadata/Il2CppTypeCompare.h\"\n#include \"metadata/Il2CppTypeHash.h\"\n#include \"vm/MetadataAlloc.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Runtime.h\"\n#include \"utils/Memory.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"utils/StringUtils.h\"\n#include \"class-internals.h\"\n#include \"tabledefs.h\"\n#include <sstream>\n#include <vector>\n#include <limits>\n\nusing namespace il2cpp::vm;\nusing il2cpp::os::FastAutoLock;\nusing il2cpp::utils::StringUtils;\nusing il2cpp::vm::MetadataCache;\n\nusing il2cpp::vm::MetadataCalloc;\nusing il2cpp::vm::MetadataMalloc;\n\nusing std::vector;\nusing std::pair;\n\n\n#if NET_4_0\nconst size_t kImplicitArrayInterfaceCount = 5;\n#else\nconst size_t kImplicitArrayInterfaceCount = 3;\n#endif\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    static const char* GetArrayName(const char* elementClassName, uint32_t rank, bool bounded)\n    {\n        std::string name;\n        name += elementClassName;\n        name += \"[\";\n        for (uint32_t i = 1; i < rank; i++)\n            name += \",\";\n        if (bounded)\n            name += \"*\";\n        name += \"]\";\n\n        return StringUtils::StringDuplicate(name.c_str());\n    }\n\n    static MethodInfo* ConstructArrayMethod(Il2CppClass* declaringType, const char* name, const Il2CppType* returnType, uint8_t parameterCount, const Il2CppType** parameterTypes)\n    {\n        MethodInfo* method = (MethodInfo*)MetadataCalloc(1, sizeof(MethodInfo));\n        method->declaring_type = declaringType;\n        method->flags = METHOD_ATTRIBUTE_PUBLIC;\n        method->iflags = METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL;\n        method->name = name;\n        method->slot = -1;\n        method->return_type = returnType;\n        method->parameters_count = parameterCount;\n        ParameterInfo* parameters = (ParameterInfo*)MetadataCalloc(parameterCount, sizeof(ParameterInfo));\n        for (uint8_t i = 0; i < parameterCount; i++)\n        {\n            parameters[i].position = i;\n            parameters[i].parameter_type = parameterTypes[i];\n            parameters[i].name = NULL;\n        }\n        method->parameters = parameters;\n\n        if (!strcmp(\".ctor\", name))\n        {\n            method->flags |= METHOD_ATTRIBUTE_RT_SPECIAL_NAME | METHOD_ATTRIBUTE_SPECIAL_NAME;\n        }\n        else\n        {\n            method->iflags |= METHOD_IMPL_ATTRIBUTE_RUNTIME;\n        }\n\n        ++il2cpp_runtime_stats.method_count;\n\n        return method;\n    }\n\n    struct GenericArrayMethod\n    {\n        std::string name;\n        const MethodInfo* method;\n        const MethodInfo* interfaceMethodDefinition;\n    };\n\n    typedef vector<GenericArrayMethod> GenericArrayMethods;\n    static GenericArrayMethods s_GenericArrayMethods;\n\n    static size_t GetArrayGenericMethodsCount();\n    static void PopulateArrayGenericMethods(Il2CppClass* klass, uint16_t offset, const GenericArrayMethods& genericArrayMethods);\n\n    static void CollectImplicitArrayInterfaces(Il2CppClass* elementClass, ::std::vector<Il2CppClass*>& interfaces);\n\n    static void SetupArrayMethods(Il2CppClass* arrayClass)\n    {\n        size_t methodIndex = 0;\n        uint8_t rank = arrayClass->rank;\n        ::std::vector<Il2CppClass*> interfaces;\n        CollectImplicitArrayInterfaces(arrayClass, interfaces);\n\n        size_t methodCount = 3 + (rank > 1 ? 2 : 1) + interfaces.size() * GetArrayGenericMethodsCount();\n        IL2CPP_ASSERT(methodCount <= std::numeric_limits<uint16_t>::max());\n        arrayClass->method_count = static_cast<uint16_t>(methodCount);\n        arrayClass->methods = (const MethodInfo**)MetadataCalloc(methodCount, sizeof(MethodInfo*));\n\n        const Il2CppType** parameters = (const Il2CppType**)alloca(rank * sizeof(Il2CppType*));\n        for (uint8_t i = 0; i < rank; i++)\n            parameters[i] = il2cpp_defaults.int32_class->byval_arg;\n        arrayClass->methods[methodIndex++] = ConstructArrayMethod(arrayClass, \".ctor\", il2cpp_defaults.void_class->byval_arg, rank, parameters);\n\n        if (rank > 1)\n        {\n            parameters = (const Il2CppType**)alloca(2 * rank * sizeof(Il2CppType*));\n            for (uint8_t i = 0; i < 2 * rank; i++)\n                parameters[i] = il2cpp_defaults.int32_class->byval_arg;\n            arrayClass->methods[methodIndex++] = ConstructArrayMethod(arrayClass, \".ctor\", il2cpp_defaults.void_class->byval_arg, 2 * rank, parameters);\n        }\n\n        parameters = (const Il2CppType**)alloca((rank + 1) * sizeof(Il2CppType*));\n        for (uint8_t i = 0; i < rank; i++)\n            parameters[i] = il2cpp_defaults.int32_class->byval_arg;\n        parameters[rank] = arrayClass->element_class->byval_arg;\n        arrayClass->methods[methodIndex++] = ConstructArrayMethod(arrayClass, \"Set\", il2cpp_defaults.void_class->byval_arg, rank + 1, parameters);\n\n        parameters = (const Il2CppType**)alloca(rank * sizeof(Il2CppType*));\n        for (uint8_t i = 0; i < rank; i++)\n            parameters[i] = il2cpp_defaults.int32_class->byval_arg;\n        arrayClass->methods[methodIndex++] = ConstructArrayMethod(arrayClass, \"Address\", arrayClass->element_class->this_arg, rank, parameters);\n\n        parameters = (const Il2CppType**)alloca(rank * sizeof(Il2CppType*));\n        for (uint8_t i = 0; i < rank; i++)\n            parameters[i] = il2cpp_defaults.int32_class->byval_arg;\n        arrayClass->methods[methodIndex++] = ConstructArrayMethod(arrayClass, \"Get\", arrayClass->element_class->byval_arg, rank, parameters);\n\n        IL2CPP_ASSERT(methodIndex <= std::numeric_limits<uint16_t>::max());\n        PopulateArrayGenericMethods(arrayClass, static_cast<uint16_t>(methodIndex), s_GenericArrayMethods);\n    }\n\n    static void CollectImplicitArrayInterfacesFromElementClass(Il2CppClass* elementClass, ::std::vector<Il2CppClass*>& interfaces)\n    {\n        while (elementClass != NULL)\n        {\n            interfaces.push_back(elementClass);\n            if (!elementClass->valuetype && elementClass != il2cpp_defaults.value_type_class && elementClass != il2cpp_defaults.enum_class)\n            {\n                void* iter = NULL;\n                while (Il2CppClass* itf = Class::GetInterfaces(elementClass, &iter))\n                    interfaces.push_back(itf);\n            }\n\n            if (elementClass->rank == 1)\n            {\n                ::std::vector<Il2CppClass*> elementInterfaces;\n                CollectImplicitArrayInterfacesFromElementClass(elementClass->element_class, elementInterfaces);\n\n                for (::std::vector<Il2CppClass*>::iterator iter = elementInterfaces.begin(); iter != elementInterfaces.end(); ++iter)\n                {\n                    Il2CppTypeVector genericArguments;\n                    genericArguments.push_back((*iter)->byval_arg);\n\n                    interfaces.push_back(Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ilist_class, genericArguments));\n                    interfaces.push_back(Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_icollection_class, genericArguments));\n                    interfaces.push_back(Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ienumerable_class, genericArguments));\n\n#if NET_4_0\n                    interfaces.push_back(Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ireadonlylist_class, genericArguments));\n                    interfaces.push_back(Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ireadonlycollection_class, genericArguments));\n#endif\n                }\n            }\n\n            elementClass = Class::GetParent(elementClass);\n            if (elementClass != NULL && (elementClass->valuetype || elementClass == il2cpp_defaults.value_type_class || elementClass == il2cpp_defaults.enum_class))\n                break;\n        }\n    }\n\n    static void CollectImplicitArrayInterfaces(Il2CppClass* arrayClass, ::std::vector<Il2CppClass*>& interfaces)\n    {\n        if (arrayClass->byval_arg->type != IL2CPP_TYPE_SZARRAY)\n            return;\n\n        CollectImplicitArrayInterfacesFromElementClass(arrayClass->element_class, interfaces);\n    }\n\n// note assuming list is ordered as IList, ICollection, IEnumerable\n\n    static void CollectGenericArrayMethods(GenericArrayMethods& genericArrayMethods)\n    {\n        const size_t kNumGenericArrayMethods = 13;\n        genericArrayMethods.reserve(kNumGenericArrayMethods);\n\n        void* iter = NULL;\n        while (const MethodInfo* method = Class::GetMethods(il2cpp_defaults.array_class, &iter))\n        {\n            if (strncmp(method->name, \"InternalArray__\", 15))\n                continue;\n\n            std::string name;\n            std::string methodName;\n\n            Il2CppClass* implementingInterface = NULL;\n            if (!strncmp(method->name, \"InternalArray__ICollection_\", 27))\n            {\n                implementingInterface = il2cpp_defaults.generic_icollection_class;\n                methodName = method->name + 27;\n                name = StringUtils::Printf(\"System.Collections.Generic.ICollection`1.%s\", method->name + 27);\n            }\n            else if (!strncmp(method->name, \"InternalArray__IEnumerable_\", 27))\n            {\n                implementingInterface = il2cpp_defaults.generic_ienumerable_class;\n                methodName = method->name + 27;\n                name = StringUtils::Printf(\"System.Collections.Generic.IEnumerable`1.%s\", method->name + 27);\n            }\n#if NET_4_0\n            else if (!strncmp(method->name, \"InternalArray__IReadOnlyList_\", 29))\n            {\n                implementingInterface = il2cpp_defaults.generic_ireadonlylist_class;\n                methodName = method->name + 29;\n                name = StringUtils::Printf(\"System.Collections.Generic.IReadOnlyList`1.%s\", method->name + 29);\n            }\n            else if (!strncmp(method->name, \"InternalArray__IReadOnlyCollection_\", 35))\n            {\n                implementingInterface = il2cpp_defaults.generic_ireadonlycollection_class;\n                methodName = method->name + 35;\n                name = StringUtils::Printf(\"System.Collections.Generic.IReadOnlyCollection`1.%s\", method->name + 35);\n            }\n#endif\n            else\n            {\n                implementingInterface = il2cpp_defaults.generic_ilist_class;\n                methodName = method->name + 15;\n                name = StringUtils::Printf(\"System.Collections.Generic.IList`1.%s\", method->name + 15);\n            }\n            const MethodInfo* matchingInterfacesMethod = NULL;\n            for (int methodIndex = 0; methodIndex < implementingInterface->method_count; methodIndex++)\n            {\n                const MethodInfo* interfaceMethod = implementingInterface->methods[methodIndex];\n                if (methodName == interfaceMethod->name)\n                    matchingInterfacesMethod = interfaceMethod;\n            }\n\n            if (matchingInterfacesMethod != NULL)\n            {\n                GenericArrayMethod generiArrayMethod = { name, method, matchingInterfacesMethod };\n                genericArrayMethods.push_back(generiArrayMethod);\n            }\n        }\n    }\n\n    static size_t GetArrayGenericMethodsCount()\n    {\n        if (s_GenericArrayMethods.size() == 0)\n            CollectGenericArrayMethods(s_GenericArrayMethods);\n\n        return s_GenericArrayMethods.size();\n    }\n\n    static MethodInfo* ConstructGenericArrayMethod(const GenericArrayMethod& genericArrayMethod, Il2CppClass* klass, Il2CppGenericContext* context)\n    {\n        MethodInfo* inflatedMethod = (MethodInfo*)MetadataCalloc(1, sizeof(MethodInfo));\n        inflatedMethod->name = StringUtils::StringDuplicate(genericArrayMethod.name.c_str());\n        inflatedMethod->declaring_type = klass;\n\n        const MethodInfo* methodToCopyDataFrom = genericArrayMethod.method;\n        if (genericArrayMethod.method->is_generic)\n        {\n            const Il2CppGenericMethod* genericMethod = MetadataCache::GetGenericMethod(genericArrayMethod.method, context->class_inst, context->method_inst);\n            methodToCopyDataFrom = GenericMethod::GetMethod(genericMethod);\n\n            inflatedMethod->is_inflated = true;\n            inflatedMethod->genericMethod = genericMethod;\n            inflatedMethod->rgctx_data = methodToCopyDataFrom->rgctx_data;\n        }\n\n        inflatedMethod->slot = methodToCopyDataFrom->slot;\n        inflatedMethod->parameters_count = methodToCopyDataFrom->parameters_count;\n        inflatedMethod->parameters = methodToCopyDataFrom->parameters;\n        inflatedMethod->return_type = methodToCopyDataFrom->return_type;\n\n        inflatedMethod->methodPointer = methodToCopyDataFrom->methodPointer;\n        inflatedMethod->invoker_method = methodToCopyDataFrom->invoker_method;\n\n        return inflatedMethod;\n    }\n\n    static void PopulateArrayGenericMethods(Il2CppClass* klass, uint16_t offset, const GenericArrayMethods& genericArrayMethods)\n    {\n        for (int i = 0; i < klass->interface_offsets_count; i++)\n        {\n            Il2CppClass* interfaceType = klass->interfaceOffsets[i].interfaceType;\n            if (!interfaceType->generic_class)\n                continue;\n\n            Il2CppClass* interfaceDefinition = GenericClass::GetTypeDefinition(interfaceType->generic_class);\n\n            Il2CppGenericContext context = { 0 };\n            Il2CppTypeVector types;\n            types.push_back(interfaceType->generic_class->context.class_inst->type_argv[0]);\n            context.method_inst = MetadataCache::GetGenericInst(types);\n\n            for (GenericArrayMethods::const_iterator iter = genericArrayMethods.begin(); iter != genericArrayMethods.end(); ++iter)\n            {\n                if (iter->interfaceMethodDefinition->declaring_type != interfaceDefinition)\n                    continue;\n\n                MethodInfo* arrayMethod = ConstructGenericArrayMethod(*iter, klass, &context);\n                klass->methods[offset++] = arrayMethod;\n\n                size_t vtableIndex = klass->interfaceOffsets[i].offset + iter->interfaceMethodDefinition->slot;\n                klass->vtable[vtableIndex].method = arrayMethod;\n                klass->vtable[vtableIndex].methodPtr = arrayMethod->methodPointer;\n            }\n        }\n    }\n\n    static void SetupArrayVTableAndInterfaceOffsets(Il2CppClass* klass)\n    {\n        Il2CppClass* arrayClass = Class::GetParent(klass);\n        size_t arrayInterfacesCount = arrayClass->interface_offsets_count;\n\n        ::std::vector<Il2CppClass*> interfaces;\n\n        if (klass->byval_arg->type == IL2CPP_TYPE_SZARRAY)\n        {\n            CollectImplicitArrayInterfaces(klass, interfaces);\n        }\n\n        Il2CppRuntimeInterfaceOffsetPair* newInterfaceOffsets = (Il2CppRuntimeInterfaceOffsetPair*)MetadataMalloc((arrayInterfacesCount + kImplicitArrayInterfaceCount * interfaces.size()) * sizeof(Il2CppRuntimeInterfaceOffsetPair));\n        memcpy(newInterfaceOffsets, arrayClass->interfaceOffsets, (arrayInterfacesCount) * sizeof(Il2CppRuntimeInterfaceOffsetPair));\n\n        int32_t arrayVTableSlot = arrayClass->vtable_count;\n        size_t slots = arrayVTableSlot + interfaces.size() * (il2cpp_defaults.generic_ilist_class->method_count + il2cpp_defaults.generic_icollection_class->method_count + il2cpp_defaults.generic_ienumerable_class->method_count);\n\n#if NET_4_0\n        slots += interfaces.size() * (il2cpp_defaults.generic_ireadonlylist_class->method_count + il2cpp_defaults.generic_ireadonlycollection_class->method_count);\n#endif\n\n        memcpy(klass->vtable, arrayClass->vtable, arrayVTableSlot * sizeof(VirtualInvokeData));\n\n        size_t index = arrayInterfacesCount;\n        int32_t vtableSlot = arrayVTableSlot;\n        for (::std::vector<Il2CppClass*>::iterator iter = interfaces.begin(); iter != interfaces.end(); iter++, index += kImplicitArrayInterfaceCount)\n        {\n            Il2CppTypeVector genericArguments;\n            genericArguments.push_back((*iter)->byval_arg);\n\n            newInterfaceOffsets[index].interfaceType = Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ilist_class, genericArguments);\n            newInterfaceOffsets[index].offset = vtableSlot;\n            vtableSlot += newInterfaceOffsets[index].interfaceType->method_count;\n\n            newInterfaceOffsets[index + 1].interfaceType = Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_icollection_class, genericArguments);\n            newInterfaceOffsets[index + 1].offset = vtableSlot;\n            vtableSlot += newInterfaceOffsets[index + 1].interfaceType->method_count;\n\n            newInterfaceOffsets[index + 2].interfaceType = Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ienumerable_class, genericArguments);\n            newInterfaceOffsets[index + 2].offset = vtableSlot;\n            vtableSlot += newInterfaceOffsets[index + 2].interfaceType->method_count;\n\n#if NET_4_0\n            newInterfaceOffsets[index + 3].interfaceType = Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ireadonlylist_class, genericArguments);\n            newInterfaceOffsets[index + 3].offset = vtableSlot;\n            vtableSlot += newInterfaceOffsets[index + 3].interfaceType->method_count;\n\n            newInterfaceOffsets[index + 4].interfaceType = Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ireadonlycollection_class, genericArguments);\n            newInterfaceOffsets[index + 4].offset = vtableSlot;\n            vtableSlot += newInterfaceOffsets[index + 4].interfaceType->method_count;\n#endif\n        }\n\n        size_t interfaceOffsetsCount = arrayInterfacesCount + kImplicitArrayInterfaceCount * interfaces.size();\n        IL2CPP_ASSERT(interfaceOffsetsCount <= std::numeric_limits<uint16_t>::max());\n        klass->interface_offsets_count = static_cast<uint16_t>(interfaceOffsetsCount);\n        klass->interfaceOffsets = newInterfaceOffsets;\n    }\n\n    void SetupCastClass(Il2CppClass *arrayType)\n    {\n        Il2CppClass *elementType = arrayType->element_class;\n\n        if (elementType->enumtype)\n            arrayType->castClass = elementType->element_class;\n        else\n            arrayType->castClass = elementType;\n\n        if (arrayType->castClass == il2cpp_defaults.sbyte_class)\n            arrayType->castClass = il2cpp_defaults.byte_class;\n        else if (arrayType->castClass == il2cpp_defaults.uint16_class)\n            arrayType->castClass = il2cpp_defaults.int16_class;\n        else if (arrayType->castClass == il2cpp_defaults.uint32_class)\n            arrayType->castClass = il2cpp_defaults.int32_class;\n        else if (arrayType->castClass == il2cpp_defaults.uint64_class)\n            arrayType->castClass = il2cpp_defaults.int64_class;\n#if IL2CPP_SIZEOF_VOID_P == 8\n        else if (arrayType->castClass == il2cpp_defaults.int_class ||\n                 arrayType->castClass == il2cpp_defaults.uint_class)\n            arrayType->castClass = il2cpp_defaults.int64_class;\n#else\n        else if (arrayType->castClass == il2cpp_defaults.int_class ||\n                 arrayType->castClass == il2cpp_defaults.uint_class)\n            arrayType->castClass = il2cpp_defaults.int32_class;\n#endif\n\n        arrayType->has_references = Type::IsReference(elementType->byval_arg) || elementType->has_references;\n    }\n\n    void ArrayMetadata::SetupArrayInterfaces(Il2CppClass* klass, const FastAutoLock& lock)\n    {\n        if (klass->byval_arg->type == IL2CPP_TYPE_SZARRAY)\n        {\n            Il2CppTypeVector genericArguments;\n            genericArguments.push_back(klass->element_class->byval_arg);\n\n            IL2CPP_ASSERT(klass->interfaces_count == kImplicitArrayInterfaceCount);\n            klass->implementedInterfaces = (Il2CppClass**)MetadataMalloc(klass->interfaces_count * sizeof(Il2CppClass*));\n            klass->implementedInterfaces[0] = Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ilist_class, genericArguments);\n            IL2CPP_ASSERT(klass->implementedInterfaces[0]);\n            klass->implementedInterfaces[1] = Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_icollection_class, genericArguments);\n            IL2CPP_ASSERT(klass->implementedInterfaces[1]);\n            klass->implementedInterfaces[2] = Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ienumerable_class, genericArguments);\n            IL2CPP_ASSERT(klass->implementedInterfaces[2]);\n#if NET_4_0\n            klass->implementedInterfaces[3] = Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ireadonlylist_class, genericArguments);\n            IL2CPP_ASSERT(klass->implementedInterfaces[3]);\n            klass->implementedInterfaces[4] = Class::GetInflatedGenericInstanceClass(il2cpp_defaults.generic_ireadonlycollection_class, genericArguments);\n            IL2CPP_ASSERT(klass->implementedInterfaces[4]);\n#endif\n        }\n    }\n\n    void ArrayMetadata::SetupArrayVTable(Il2CppClass* klass, const FastAutoLock& lock)\n    {\n        // we assume we are being called as part of Class::Init and that the element class has already been initialized\n        IL2CPP_ASSERT(klass->element_class->initialized);\n\n        SetupCastClass(klass);\n        SetupArrayVTableAndInterfaceOffsets(klass);\n        SetupArrayMethods(klass);\n    }\n\n    struct SZArrayClassHash\n    {\n        size_t operator()(const Il2CppClass* arrayClass) const\n        {\n            return Il2CppTypeHash::Hash(arrayClass->byval_arg);\n        }\n    };\n\n    struct SZArrayClassCompare\n    {\n        bool operator()(const Il2CppClass* arrayClass1, const Il2CppClass* arrayClass2) const\n        {\n            return Il2CppTypeEqualityComparer::AreEqual(arrayClass1->byval_arg, arrayClass2->byval_arg);\n        }\n    };\n\n    struct ArrayClassHash\n    {\n        size_t operator()(const std::pair<Il2CppClass*, uint32_t>& arrayClass) const\n        {\n            return Il2CppTypeHash::Hash(arrayClass.first->byval_arg) * arrayClass.second;\n        }\n    };\n\n    struct ArrayClassCompare\n    {\n        bool operator()(const std::pair<Il2CppClass*, uint32_t>& arrayClass1, const std::pair<Il2CppClass*, uint32_t>& arrayClass2) const\n        {\n            return Il2CppTypeEqualityComparer::AreEqual(arrayClass1.first->byval_arg, arrayClass2.first->byval_arg) && arrayClass1.second == arrayClass2.second;\n        }\n    };\n\n    typedef Il2CppHashMap<Il2CppClass*, Il2CppClass*, SZArrayClassHash, SZArrayClassCompare> SZArrayClassMap;\n    typedef Il2CppHashMap<std::pair<Il2CppClass*, uint32_t>, Il2CppClass*, ArrayClassHash, ArrayClassCompare> ArrayClassMap;\n\n    SZArrayClassMap s_SZArrayClassMap;\n    ArrayClassMap s_ArrayClassMap;\n\n    Il2CppClass* ArrayMetadata::GetBoundedArrayClass(Il2CppClass* elementClass, uint32_t rank, bool bounded)\n    {\n        FastAutoLock lock(&il2cpp::vm::g_MetadataLock);\n        NOT_IMPLEMENTED_NO_ASSERT(ArrayMetadata::GetBoundedArrayClass, \"Use more granular lock for looking up arrays, but then handle race between lookup, construction, and caching\");\n\n        IL2CPP_ASSERT(rank <= 255);\n\n        if (rank > 1)\n            bounded = false;\n\n        if (rank > 1 || bounded)\n        {\n            ArrayClassMap::const_iterator iter = s_ArrayClassMap.find(std::make_pair(elementClass, rank));\n            if (iter != s_ArrayClassMap.end())\n                return iter->second;\n        }\n        else\n        {\n            SZArrayClassMap::const_iterator iter = s_SZArrayClassMap.find(elementClass);\n            if (iter != s_SZArrayClassMap.end())\n                return iter->second;\n        }\n\n        Il2CppClass* arrayClass = il2cpp_defaults.array_class;\n        Class::Init(arrayClass);\n\n        //count number of virtual call slots for array class\n        ::std::vector<Il2CppClass*> interfaces;\n\n        if (rank <= 1 && !bounded)\n            CollectImplicitArrayInterfacesFromElementClass(elementClass, interfaces);\n\n        size_t slots = arrayClass->vtable_count + interfaces.size() * (il2cpp_defaults.generic_ilist_class->method_count + il2cpp_defaults.generic_icollection_class->method_count + il2cpp_defaults.generic_ienumerable_class->method_count);\n\n#if NET_4_0\n        slots += interfaces.size() * (il2cpp_defaults.generic_ireadonlylist_class->method_count + il2cpp_defaults.generic_ireadonlycollection_class->method_count);\n#endif\n\n        Il2CppClass* klass = (Il2CppClass*)MetadataCalloc(1, sizeof(Il2CppClass) + (slots * sizeof(VirtualInvokeData)));\n        klass->image = elementClass->image;\n        // can share the const char* since it's immutable\n        klass->namespaze = elementClass->namespaze;\n        klass->name = GetArrayName(elementClass->name, rank, bounded);\n\n        klass->parent = il2cpp_defaults.array_class;\n\n        klass->flags = TYPE_ATTRIBUTE_AUTO_LAYOUT | TYPE_ATTRIBUTE_ANSI_CLASS | TYPE_ATTRIBUTE_CLASS | TYPE_ATTRIBUTE_PUBLIC | TYPE_ATTRIBUTE_SEALED | TYPE_ATTRIBUTE_SERIALIZABLE;\n        klass->rank = rank;\n\n        klass->instance_size = Class::GetInstanceSize(arrayClass);\n        klass->vtable_count = static_cast<uint16_t>(slots);\n\n        // need this before we access the size or has_references\n        Class::SetupFields(elementClass);\n\n        klass->element_size = Class::GetArrayElementSize(elementClass);\n        klass->native_size = klass->thread_static_fields_offset = -1;\n\n        klass->has_references = Type::IsReference(elementClass->byval_arg) || elementClass->has_references;\n\n        klass->element_class = elementClass;\n\n        Il2CppType* thisArg = (Il2CppType*)MetadataCalloc(1, sizeof(Il2CppType));\n        Il2CppType* byValArg = (Il2CppType*)MetadataCalloc(1, sizeof(Il2CppType));\n\n        if (rank > 1 || bounded)\n        {\n            Il2CppArrayType *at = (Il2CppArrayType*)MetadataCalloc(1, sizeof(Il2CppArrayType));\n            byValArg->type = IL2CPP_TYPE_ARRAY;\n            byValArg->data.array = at;\n            at->etype = elementClass->byval_arg;\n            at->rank = rank;\n        }\n        else\n        {\n            byValArg->type = IL2CPP_TYPE_SZARRAY;\n            byValArg->data.type = elementClass->byval_arg;\n        }\n\n        memcpy(thisArg, byValArg, sizeof(Il2CppType));\n        thisArg->byref = 1;\n\n        klass->this_arg = thisArg;\n        klass->byval_arg = byValArg;\n\n        if (rank > 1 || bounded)\n        {\n            klass->interfaces_count = 0;\n        }\n        else\n        {\n            klass->interfaces_count = kImplicitArrayInterfaceCount;\n        }\n\n        klass->interopData = MetadataCache::GetInteropDataForType(klass->byval_arg);\n\n        if (rank > 1 || bounded)\n            s_ArrayClassMap.insert(std::make_pair(ArrayClassMap::key_type(std::make_pair(klass->element_class, klass->rank)), klass));\n        else\n            s_SZArrayClassMap.insert(std::make_pair(klass->element_class, klass));\n\n        return klass;\n    }\n\n    void ArrayMetadata::WalkSZArrays(ArrayTypeWalkCallback callback, void* context)\n    {\n        FastAutoLock lock(&il2cpp::vm::g_MetadataLock);\n\n        for (SZArrayClassMap::iterator it = s_SZArrayClassMap.begin(); it != s_SZArrayClassMap.end(); it++)\n        {\n            callback(it->second, context);\n        }\n    }\n\n    void ArrayMetadata::WalkArrays(ArrayTypeWalkCallback callback, void* context)\n    {\n        FastAutoLock lock(&il2cpp::vm::g_MetadataLock);\n\n        for (ArrayClassMap::iterator it = s_ArrayClassMap.begin(); it != s_ArrayClassMap.end(); it++)\n        {\n            callback(it->second, context);\n        }\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/ArrayMetadata.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"os/Mutex.h\"\nstruct Il2CppClass;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class ArrayMetadata\n    {\n    public:\n        static Il2CppClass* GetBoundedArrayClass(Il2CppClass* elementClass, uint32_t rank, bool bounded);\n\n        typedef void(*ArrayTypeWalkCallback)(Il2CppClass* type, void* context);\n        static void WalkSZArrays(ArrayTypeWalkCallback callback, void* context);\n        static void WalkArrays(ArrayTypeWalkCallback callback, void* context);\n\n        // called as part of Class::Init with lock held\n        static void SetupArrayInterfaces(Il2CppClass* klass, const il2cpp::os::FastAutoLock& lock);\n        static void SetupArrayVTable(Il2CppClass* klass, const il2cpp::os::FastAutoLock& lock);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/FieldLayout.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"vm/Class.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/Type.h\"\n#include \"metadata/FieldLayout.h\"\n#include <limits>\n\nusing il2cpp::vm::Class;\nusing il2cpp::vm::GenericClass;\nusing il2cpp::vm::Type;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    typedef void* voidptr_t;\n#define IL2CPP_ALIGN_STRUCT(type) struct type ## AlignStruct {uint8_t pad; type t; };\n\n    IL2CPP_ALIGN_STRUCT(voidptr_t)\n    IL2CPP_ALIGN_STRUCT(int8_t)\n    IL2CPP_ALIGN_STRUCT(int16_t)\n    IL2CPP_ALIGN_STRUCT(int32_t)\n    IL2CPP_ALIGN_STRUCT(int64_t)\n    IL2CPP_ALIGN_STRUCT(intptr_t)\n    IL2CPP_ALIGN_STRUCT(float)\n    IL2CPP_ALIGN_STRUCT(double)\n\n#define IL2CPP_ALIGN_OF(type) ((size_t)offsetof(type ## AlignStruct, t))\n\n    SizeAndAlignment FieldLayout::GetTypeSizeAndAlignment(const Il2CppType* type)\n    {\n        SizeAndAlignment sa = { 0 };\n        if (type->byref)\n        {\n            sa.size = sizeof(voidptr_t);\n            sa.alignment = IL2CPP_ALIGN_OF(voidptr_t);\n            return sa;\n        }\n\n        switch (type->type)\n        {\n            case IL2CPP_TYPE_I1:\n            case IL2CPP_TYPE_U1:\n            case IL2CPP_TYPE_BOOLEAN:\n                sa.size = sizeof(int8_t);\n                sa.alignment = IL2CPP_ALIGN_OF(int8_t);\n                return sa;\n            case IL2CPP_TYPE_I2:\n            case IL2CPP_TYPE_U2:\n            case IL2CPP_TYPE_CHAR:\n                sa.size = sizeof(int16_t);\n                sa.alignment = IL2CPP_ALIGN_OF(int16_t);\n                return sa;\n            case IL2CPP_TYPE_I4:\n            case IL2CPP_TYPE_U4:\n                sa.size = sizeof(int32_t);\n                sa.alignment = IL2CPP_ALIGN_OF(int32_t);\n                return sa;\n            case IL2CPP_TYPE_I8:\n            case IL2CPP_TYPE_U8:\n                sa.size = sizeof(int64_t);\n                sa.alignment = IL2CPP_ALIGN_OF(int64_t);\n                return sa;\n            case IL2CPP_TYPE_I:\n            case IL2CPP_TYPE_U:\n                // TODO should we use pointer or size_t here?\n                sa.size = sizeof(intptr_t);\n                sa.alignment = IL2CPP_ALIGN_OF(intptr_t);\n                return sa;\n            case IL2CPP_TYPE_R4:\n                sa.size = sizeof(float);\n                sa.alignment = IL2CPP_ALIGN_OF(float);\n                return sa;\n            case IL2CPP_TYPE_R8:\n                sa.size = sizeof(double);\n                sa.alignment = IL2CPP_ALIGN_OF(double);\n                return sa;\n            case IL2CPP_TYPE_PTR:\n            case IL2CPP_TYPE_FNPTR:\n            case IL2CPP_TYPE_STRING:\n            case IL2CPP_TYPE_SZARRAY:\n            case IL2CPP_TYPE_ARRAY:\n            case IL2CPP_TYPE_CLASS:\n            case IL2CPP_TYPE_OBJECT:\n            case IL2CPP_TYPE_VAR:\n            case IL2CPP_TYPE_MVAR:\n                sa.size = sizeof(voidptr_t);\n                sa.alignment = IL2CPP_ALIGN_OF(voidptr_t);\n                return sa;\n            case IL2CPP_TYPE_VALUETYPE:\n                if (Type::IsEnum(type))\n                {\n                    return GetTypeSizeAndAlignment(Class::GetEnumBaseType(Type::GetClass(type)));\n                }\n                else\n                {\n                    uint32_t alignment;\n                    sa.size = Class::GetValueSize(Type::GetClass(type), &alignment);\n                    sa.alignment = alignment;\n                    return sa;\n                }\n            case IL2CPP_TYPE_GENERICINST:\n            {\n                Il2CppGenericClass* gclass = type->data.generic_class;\n                Il2CppClass* container_class = GenericClass::GetTypeDefinition(gclass);\n\n                if (container_class != NULL && container_class->valuetype)\n                {\n                    if (container_class->enumtype)\n                    {\n                        return GetTypeSizeAndAlignment(Class::GetEnumBaseType(container_class));\n                    }\n                    else\n                    {\n                        uint32_t alignment;\n                        sa.size = Class::GetValueSize(Class::FromIl2CppType(type), &alignment);\n                        sa.alignment = alignment;\n                        return sa;\n                    }\n                }\n                else\n                {\n                    sa.size = sizeof(voidptr_t);\n                    sa.alignment = IL2CPP_ALIGN_OF(voidptr_t);\n                    return sa;\n                }\n            }\n            default:\n                IL2CPP_ASSERT(0);\n                break;\n        }\n        return sa;\n    }\n\n    static size_t AlignTo(size_t size, size_t alignment)\n    {\n        if (size & (alignment - 1))\n        {\n            size += alignment - 1;\n            size &= ~(alignment - 1);\n        }\n\n        return size;\n    }\n\n    void FieldLayout::LayoutFields(size_t parentSize, size_t actualParentSize, size_t parentAlignment, const metadata::Il2CppTypeVector& fieldTypes, FieldLayoutData& data)\n    {\n        data.classSize = parentSize;\n        data.actualClassSize = actualParentSize;\n        IL2CPP_ASSERT(parentAlignment <= std::numeric_limits<uint8_t>::max());\n        data.minimumAlignment = static_cast<uint8_t>(parentAlignment);\n        for (Il2CppTypeVector::const_iterator iter = fieldTypes.begin(); iter != fieldTypes.end(); ++iter)\n        {\n            SizeAndAlignment sa = GetTypeSizeAndAlignment(*iter);\n            size_t offset = data.actualClassSize;\n\n            offset += sa.alignment - 1;\n            offset &= ~(sa.alignment - 1);\n\n            data.FieldOffsets.push_back(offset);\n            data.actualClassSize = offset + sa.size;\n            data.minimumAlignment = std::max(data.minimumAlignment, (uint8_t)sa.alignment);\n        }\n\n        data.classSize = AlignTo(data.actualClassSize, data.minimumAlignment);\n\n        // C++ ABI difference between MS and Clang\n#if IL2CPP_CXX_ABI_MSVC\n        data.actualClassSize = data.classSize;\n#endif\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/FieldLayout.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include \"metadata/Il2CppTypeVector.h\"\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    struct SizeAndAlignment\n    {\n        size_t size;\n        uint8_t alignment;\n    };\n\n    class FieldLayout\n    {\n    public:\n        struct FieldLayoutData\n        {\n            std::vector<size_t> FieldOffsets;\n            size_t classSize;\n            size_t actualClassSize;\n            uint8_t minimumAlignment;\n        };\n\n        static void LayoutFields(size_t parentSize, size_t actualParentSize, size_t parentAlignment, const Il2CppTypeVector& fieldTypes, FieldLayoutData& data);\n        static SizeAndAlignment GetTypeSizeAndAlignment(const Il2CppType* type);\n    };\n} /* namespace metadata */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/GenericMetadata.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/Mutex.h\"\n#include \"vm/Class.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/Image.h\"\n#include \"vm/Type.h\"\n#include \"metadata/GenericMetadata.h\"\n#include \"metadata/GenericMethod.h\"\n#include \"metadata/Il2CppGenericClassHash.h\"\n#include \"metadata/Il2CppGenericClassCompare.h\"\n#include \"metadata/Il2CppGenericInstCompare.h\"\n#include \"metadata/Il2CppGenericInstHash.h\"\n#include \"metadata/Il2CppTypeCompare.h\"\n#include \"metadata/Il2CppTypeHash.h\"\n#include \"utils/Memory.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"utils/Il2CppHashSet.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/MetadataAlloc.h\"\n#include \"vm/MetadataCache.h\"\n#include \"class-internals.h\"\n#include \"tabledefs.h\"\n#include <sstream>\n#include <vector>\n\nusing namespace il2cpp::vm;\nusing il2cpp::metadata::GenericMethod;\nusing il2cpp::os::FastAutoLock;\nusing il2cpp::os::FastMutex;\nusing il2cpp::utils::StringUtils;\n\nusing std::vector;\nusing std::pair;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    ParameterInfo* GenericMetadata::InflateParameters(const ParameterInfo* parameters, uint8_t parameterCount, const Il2CppGenericContext* context, bool inflateMethodVars)\n    {\n        ParameterInfo* inflatedParameters = (ParameterInfo*)MetadataCalloc(parameterCount, sizeof(ParameterInfo));\n\n        for (uint8_t j = 0; j < parameterCount; j++)\n        {\n            const ParameterInfo* param = parameters + j;\n            ParameterInfo* param2 = inflatedParameters + j;\n\n            param2->name = param->name;\n            param2->position = param->position;\n            param2->parameter_type = InflateIfNeeded(param->parameter_type, context, inflateMethodVars);\n            param2->token = param->token;\n        }\n\n        return inflatedParameters;\n    }\n\n    const Il2CppType* GenericMetadata::InflateIfNeeded(const Il2CppType* type, const Il2CppGenericContext* context, bool inflateMethodVars)\n    {\n        switch (type->type)\n        {\n            case IL2CPP_TYPE_VAR:\n            {\n                Il2CppType* inflatedType = (Il2CppType*)MetadataMalloc(sizeof(Il2CppType));\n                const Il2CppGenericParameter* gp = Type::GetGenericParameter(type);\n                IL2CPP_ASSERT(context->class_inst);\n                IL2CPP_ASSERT(gp->num < context->class_inst->type_argc);\n\n                memcpy(inflatedType, context->class_inst->type_argv[gp->num], sizeof(Il2CppType));\n                inflatedType->byref = type->byref;\n                inflatedType->attrs = type->attrs;\n\n                ++il2cpp_runtime_stats.inflated_type_count;\n\n                return inflatedType;\n            }\n            case IL2CPP_TYPE_MVAR:\n            {\n                if (context->method_inst)\n                {\n                    Il2CppType* inflatedType = (Il2CppType*)MetadataMalloc(sizeof(Il2CppType));\n                    const Il2CppGenericParameter* gp = Type::GetGenericParameter(type);\n                    IL2CPP_ASSERT(gp->num < context->method_inst->type_argc);\n\n                    memcpy(inflatedType, context->method_inst->type_argv[gp->num], sizeof(Il2CppType));\n                    inflatedType->byref = type->byref;\n                    inflatedType->attrs = type->attrs;\n\n                    ++il2cpp_runtime_stats.inflated_type_count;\n\n                    return inflatedType;\n                }\n                return type;\n            }\n            case IL2CPP_TYPE_ARRAY:\n            {\n                Il2CppType* inflatedType = (Il2CppType*)MetadataMalloc(sizeof(Il2CppType));\n                memcpy(inflatedType, type, sizeof(Il2CppType));\n\n                Il2CppArrayType* arrayType = (Il2CppArrayType*)MetadataMalloc(sizeof(Il2CppArrayType));\n                memcpy(arrayType, type->data.array, sizeof(Il2CppArrayType));\n                arrayType->etype = InflateIfNeeded(type->data.array->etype, context, inflateMethodVars);\n\n                inflatedType->data.array = arrayType;\n\n                ++il2cpp_runtime_stats.inflated_type_count;\n\n                return inflatedType;\n            }\n            case IL2CPP_TYPE_SZARRAY:\n            {\n                Il2CppType* arrayType = (Il2CppType*)MetadataMalloc(sizeof(Il2CppType));\n                memcpy(arrayType, type, sizeof(Il2CppType));\n                arrayType->data.type = InflateIfNeeded(type->data.type, context, inflateMethodVars);\n\n                ++il2cpp_runtime_stats.inflated_type_count;\n\n                return arrayType;\n            }\n            case IL2CPP_TYPE_GENERICINST:\n            {\n                Il2CppType* genericType = (Il2CppType*)MetadataMalloc(sizeof(Il2CppType));\n                memcpy(genericType, type, sizeof(Il2CppType));\n\n                const Il2CppGenericInst* inst = type->data.generic_class->context.class_inst;\n\n                Il2CppTypeVector types;\n                for (uint32_t i = 0; i < inst->type_argc; i++)\n                    types.push_back(InflateIfNeeded(inst->type_argv[i], context, inflateMethodVars));\n\n                const Il2CppGenericInst* inflatedInst = MetadataCache::GetGenericInst(types);\n                genericType->data.generic_class = GenericMetadata::GetGenericClass(GenericClass::GetTypeDefinition(type->data.generic_class), inflatedInst);\n\n                ++il2cpp_runtime_stats.inflated_type_count;\n\n                return genericType;\n            }\n            default:\n                return type;\n        }\n    }\n\n    static os::FastMutex s_GenericClassMutex;\n    typedef Il2CppHashSet<Il2CppGenericClass*, Il2CppGenericClassHash, Il2CppGenericClassCompare> Il2CppGenericClassSet;\n    static Il2CppGenericClassSet s_GenericClassSet;\n\n\n    Il2CppGenericClass* GenericMetadata::GetGenericClass(Il2CppClass* containerClass, const Il2CppGenericInst* inst)\n    {\n        return GetGenericClass(MetadataCache::GetIndexForTypeDefinition(containerClass), inst);\n    }\n\n    Il2CppGenericClass* GenericMetadata::GetGenericClass(TypeDefinitionIndex elementClassIndex, const Il2CppGenericInst* inst)\n    {\n        // temporary inst to lookup a permanent one that may already exist\n        Il2CppGenericClass genericClass = { 0 };\n        genericClass.typeDefinitionIndex = elementClassIndex;\n        genericClass.context.class_inst = inst;\n\n        FastAutoLock lock(&s_GenericClassMutex);\n        Il2CppGenericClassSet::const_iterator iter = s_GenericClassSet.find(&genericClass);\n        if (iter != s_GenericClassSet.end())\n            return *iter;\n\n        Il2CppGenericClass* newClass = MetadataAllocGenericClass();\n        newClass->typeDefinitionIndex = elementClassIndex;\n        newClass->context.class_inst = inst;\n\n        s_GenericClassSet.insert(newClass);\n\n        ++il2cpp_runtime_stats.generic_class_count;\n\n        return newClass;\n    }\n\n    const MethodInfo* GenericMetadata::Inflate(const MethodInfo* methodDefinition, Il2CppClass* declaringClass, const Il2CppGenericContext* context)\n    {\n        const Il2CppGenericMethod* gmethod = MetadataCache::GetGenericMethod(methodDefinition, context->class_inst, context->method_inst);\n        return GenericMethod::GetMethod(gmethod);\n    }\n\n    static void RecursiveGenericDepthFor(const Il2CppGenericInst* inst, int& depth)\n    {\n        if (inst == NULL)\n            return;\n\n        int maximumDepth = depth;\n        for (size_t i = 0; i < inst->type_argc; i++)\n        {\n            if (inst->type_argv[i]->type == IL2CPP_TYPE_GENERICINST)\n            {\n                maximumDepth++;\n\n                int classInstDepth = 0;\n                RecursiveGenericDepthFor(inst->type_argv[i]->data.generic_class->context.class_inst, classInstDepth);\n\n                int methodInstDepth = 0;\n                RecursiveGenericDepthFor(inst->type_argv[i]->data.generic_class->context.method_inst, methodInstDepth);\n\n                maximumDepth += std::max(classInstDepth, methodInstDepth);\n            }\n        }\n\n        depth = maximumDepth;\n    }\n\n    static int RecursiveGenericDepthFor(const Il2CppGenericInst* inst)\n    {\n        int depth = 0;\n        RecursiveGenericDepthFor(inst, depth);\n        return depth;\n    }\n\n    const Il2CppGenericMethod* GenericMetadata::Inflate(const Il2CppGenericMethod* genericMethod, const Il2CppGenericContext* context)\n    {\n        const Il2CppGenericInst* classInst = genericMethod->context.class_inst;\n        const Il2CppGenericInst* methodInst = genericMethod->context.method_inst;\n        if (classInst)\n        {\n            Il2CppTypeVector classTypes;\n            for (size_t i = 0; i < classInst->type_argc; i++)\n                classTypes.push_back(GenericMetadata::InflateIfNeeded(classInst->type_argv[i], context, true));\n            classInst = MetadataCache::GetGenericInst(classTypes);\n        }\n\n        if (methodInst)\n        {\n            Il2CppTypeVector methodTypes;\n            for (size_t i = 0; i < methodInst->type_argc; i++)\n                methodTypes.push_back(GenericMetadata::InflateIfNeeded(methodInst->type_argv[i], context, true));\n            methodInst = MetadataCache::GetGenericInst(methodTypes);\n        }\n\n        // We have cases where we could infinitely recurse, inflating generics at runtime. This will lead to a stack overflow.\n        // As we do for code generation, let's cut this off at an arbitrary level. If something tries to execute code at this\n        // level, a crash will happen. We'll assume that this code won't actually be executed though.\n        if (RecursiveGenericDepthFor(classInst) > MaximumRuntimeGenericDepth || RecursiveGenericDepthFor(methodInst) > MaximumRuntimeGenericDepth)\n            return NULL;\n\n        return MetadataCache::GetGenericMethod(genericMethod->methodDefinition, classInst, methodInst);\n    }\n\n    Il2CppRGCTXData* GenericMetadata::InflateRGCTX(RGCTXIndex rgctxStartIndex, int16_t rgctxCount, const Il2CppGenericContext* context)\n    {\n        if (rgctxStartIndex == kRGCTXIndexInvalid)\n            return NULL;\n\n        Il2CppRGCTXData* dataValues = (Il2CppRGCTXData*)MetadataCalloc(rgctxCount, sizeof(Il2CppRGCTXData));\n        for (RGCTXIndex rgctxIndex = 0; rgctxIndex < rgctxCount; rgctxIndex++)\n        {\n            const Il2CppRGCTXDefinition* definitionData = MetadataCache::GetRGCTXDefinitionFromIndex(rgctxStartIndex + rgctxIndex);\n            switch (definitionData->type)\n            {\n                case IL2CPP_RGCTX_DATA_TYPE:\n                    dataValues[rgctxIndex].type = GenericMetadata::InflateIfNeeded(MetadataCache::GetIl2CppTypeFromIndex(definitionData->data.typeIndex), context, true);\n                    break;\n                case IL2CPP_RGCTX_DATA_CLASS:\n                    dataValues[rgctxIndex].klass = Class::FromIl2CppType(GenericMetadata::InflateIfNeeded(MetadataCache::GetIl2CppTypeFromIndex(definitionData->data.typeIndex), context, true));\n                    break;\n                case IL2CPP_RGCTX_DATA_METHOD:\n                    dataValues[rgctxIndex].method = GenericMethod::GetMethod(Inflate(MetadataCache::GetGenericMethodFromIndex(definitionData->data.methodIndex), context));\n                    break;\n                default:\n                    IL2CPP_ASSERT(0);\n            }\n        }\n\n        return dataValues;\n    }\n\n// temporary while we generate generics\n    void GenericMetadata::RegisterGenericClass(Il2CppGenericClass *gclass)\n    {\n        // don't lock, this should only be called from startup and temporarily\n        s_GenericClassSet.insert(gclass);\n    }\n\n    void GenericMetadata::WalkAllGenericClasses(GenericClassWalkCallback callback, void* context)\n    {\n        FastAutoLock lock(&s_GenericClassMutex);\n\n        for (Il2CppGenericClassSet::iterator it = s_GenericClassSet.begin(); it != s_GenericClassSet.end(); it++)\n        {\n            if ((*it).key->cached_class != NULL)\n                callback((*it).key->cached_class, context);\n        }\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/GenericMetadata.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-metadata.h\"\n#include \"metadata/Il2CppTypeVector.h\"\n\nstruct Il2CppGenericClass;\nstruct Il2CppGenericContext;\nstruct Il2CppGenericInst;\nstruct Il2CppGenericMethod;\nunion Il2CppRGCTXData;\nstruct Il2CppRGCTXDefinition;\nstruct Il2CppType;\nstruct MethodInfo;\nstruct ParameterInfo;\nstruct Il2CppClass;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class GenericMetadata\n    {\n    public:\n        static ParameterInfo* InflateParameters(const ParameterInfo* parameters, uint8_t parameterCount, const Il2CppGenericContext* context, bool inflateMethodVars);\n        static Il2CppGenericClass* GetGenericClass(Il2CppClass* elementClass, const Il2CppGenericInst* inst);\n        static Il2CppGenericClass* GetGenericClass(TypeDefinitionIndex elementClassIndex, const Il2CppGenericInst* inst);\n\n        static const MethodInfo* Inflate(const MethodInfo* methodDefinition, Il2CppClass* declaringClass, const Il2CppGenericContext* context);\n        static const Il2CppGenericMethod* Inflate(const Il2CppGenericMethod* genericMethod, const Il2CppGenericContext* context);\n\n        static Il2CppRGCTXData* InflateRGCTX(RGCTXIndex rgctxEntryIndex, int16_t rgctxEntryCount, const Il2CppGenericContext* context);\n\n        // temporary while we generate generics\n        static void RegisterGenericClass(Il2CppGenericClass *gclass);\n\n        static const Il2CppType* InflateIfNeeded(const Il2CppType* type, const Il2CppGenericContext* context, bool inflateMethodVars);\n\n        typedef void(*GenericClassWalkCallback)(Il2CppClass* type, void* context);\n        static void WalkAllGenericClasses(GenericClassWalkCallback callback, void* context);\n\n        static const int MaximumRuntimeGenericDepth = 8;\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/GenericMethod.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"metadata/GenericMetadata.h\"\n#include \"metadata/GenericMethod.h\"\n#include \"metadata/GenericSharing.h\"\n#include \"metadata/Il2CppGenericMethodCompare.h\"\n#include \"metadata/Il2CppGenericMethodHash.h\"\n#include \"os/Mutex.h\"\n#include \"utils/Memory.h\"\n#include \"vm/Class.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/MetadataAlloc.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/MetadataLock.h\"\n#include \"vm/Method.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Type.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"class-internals.h\"\n#include \"metadata.h\"\n#include <sstream>\n\nusing il2cpp::metadata::GenericMetadata;\nusing il2cpp::metadata::GenericSharing;\nusing il2cpp::os::FastAutoLock;\nusing il2cpp::vm::Class;\nusing il2cpp::vm::GenericClass;\nusing il2cpp::vm::MetadataCalloc;\nusing il2cpp::vm::MetadataCache;\nusing il2cpp::vm::Method;\nusing il2cpp::vm::Runtime;\nusing il2cpp::vm::Type;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    typedef Il2CppHashMap<const Il2CppGenericMethod*, MethodInfo*, Il2CppGenericMethodHash, Il2CppGenericMethodCompare> Il2CppGenericMethodMap;\n    static Il2CppGenericMethodMap s_GenericMethodMap;\n\n    const MethodInfo* GenericMethod::GetMethod(const Il2CppGenericMethod* gmethod)\n    {\n        FastAutoLock lock(&il2cpp::vm::g_MetadataLock);\n\n        // This can be NULL only when we have hit the generic recursion depth limit.\n        if (gmethod == NULL)\n            return NULL;\n\n        Il2CppGenericMethodMap::const_iterator iter = s_GenericMethodMap.find(gmethod);\n        if (iter != s_GenericMethodMap.end())\n            return iter->second;\n\n        const MethodInfo* methodDefinition = gmethod->methodDefinition;\n        Il2CppClass* declaringClass = methodDefinition->declaring_type;\n        if (gmethod->context.class_inst)\n        {\n            IL2CPP_ASSERT(!declaringClass->generic_class);\n            Il2CppGenericClass* genericClassDeclaringType = GenericMetadata::GetGenericClass(methodDefinition->declaring_type, gmethod->context.class_inst);\n            declaringClass = GenericClass::GetClass(genericClassDeclaringType);\n\n            // we may fail if we cannot construct generic type\n            if (!declaringClass)\n                return NULL;\n        }\n        MethodInfo* newMethod = (MethodInfo*)MetadataCalloc(1, sizeof(MethodInfo));\n\n        // we set this here because the initialization may recurse and try to retrieve the same generic method\n        // this is safe because we *always* take the lock when retrieving the MethodInfo from a generic method.\n        // if we move lock to only if MethodInfo needs constructed then we need to revisit this since we could return a partially initialized MethodInfo\n        s_GenericMethodMap.insert(std::make_pair(gmethod, newMethod));\n\n        newMethod->declaring_type = declaringClass;\n        newMethod->flags = methodDefinition->flags;\n        newMethod->iflags = methodDefinition->iflags;\n        newMethod->slot = methodDefinition->slot;\n        newMethod->name = methodDefinition->name;\n        newMethod->is_generic = false;\n        newMethod->is_inflated = true;\n        newMethod->customAttributeIndex = methodDefinition->customAttributeIndex;\n        newMethod->token = methodDefinition->token;\n\n        newMethod->return_type = GenericMetadata::InflateIfNeeded(methodDefinition->return_type, &gmethod->context, true);\n\n        newMethod->parameters_count = methodDefinition->parameters_count;\n        newMethod->parameters = GenericMetadata::InflateParameters(methodDefinition->parameters, methodDefinition->parameters_count, &gmethod->context, true);\n\n        newMethod->genericMethod = gmethod;\n\n        if (!gmethod->context.method_inst)\n        {\n            if (methodDefinition->is_generic)\n                newMethod->is_generic = true;\n\n            if (!declaringClass->generic_class)\n            {\n                const Il2CppGenericContainer* container = methodDefinition->genericContainer;\n                newMethod->genericContainer = container;\n            }\n\n            newMethod->methodDefinition = methodDefinition->methodDefinition;\n        }\n        else\n        {\n            // we only need RGCTX for generic instance methods\n            newMethod->rgctx_data = GenericMetadata::InflateRGCTX(methodDefinition->methodDefinition->rgctxStartIndex, methodDefinition->methodDefinition->rgctxCount, &gmethod->context);\n        }\n\n        newMethod->invoker_method = MetadataCache::GetInvokerMethodPointer(methodDefinition, &gmethod->context);\n        newMethod->methodPointer = MetadataCache::GetMethodPointer(methodDefinition, &gmethod->context);\n\n        ++il2cpp_runtime_stats.inflated_method_count;\n\n        return newMethod;\n    }\n\n    const Il2CppGenericContext* GenericMethod::GetContext(const Il2CppGenericMethod* gmethod)\n    {\n        return &gmethod->context;\n    }\n\n    static std::string FormatGenericArguments(const Il2CppGenericInst* inst)\n    {\n        std::ostringstream sstream;\n        if (inst)\n        {\n            sstream << \"<\";\n            for (size_t i = 0; i < inst->type_argc; ++i)\n            {\n                if (i != 0)\n                    sstream << \", \";\n                sstream << Type::GetName(inst->type_argv[i], IL2CPP_TYPE_NAME_FORMAT_FULL_NAME);\n            }\n            sstream << \">\";\n        }\n\n        return sstream.str();\n    }\n\n    std::string GenericMethod::GetFullName(const Il2CppGenericMethod* gmethod)\n    {\n        const MethodInfo* method = gmethod->methodDefinition;\n        std::ostringstream sstream;\n        sstream << Type::GetName(gmethod->methodDefinition->declaring_type->byval_arg, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME);\n        sstream << FormatGenericArguments(gmethod->context.class_inst);\n        sstream << \"::\";\n        sstream << Method::GetName(method);\n        sstream << FormatGenericArguments(gmethod->context.method_inst);\n\n        return sstream.str();\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/GenericMethod.h",
    "content": "#pragma once\n\n#include <string>\n\nstruct MethodInfo;\nstruct Il2CppGenericMethod;\nstruct Il2CppGenericContext;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class GenericMethod\n    {\n    public:\n        // exported\n\n    public:\n        //internal\n        static const MethodInfo* GetMethod(const Il2CppGenericMethod* gmethod);\n        static const Il2CppGenericContext* GetContext(const Il2CppGenericMethod* gmethod);\n        static std::string GetFullName(const Il2CppGenericMethod* gmethod);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/GenericSharing.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"metadata/GenericSharing.h\"\n#include \"vm/Type.h\"\n#include \"metadata.h\"\n\nusing il2cpp::vm::Type;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    bool GenericSharing::IsShareable(Il2CppGenericClass* gclass)\n    {\n        const Il2CppGenericInst* classInst = gclass->context.class_inst;\n        if (classInst)\n        {\n            for (uint32_t i = 0; i < classInst->type_argc; ++i)\n            {\n                if (!Type::IsReference(classInst->type_argv[i]))\n                    return false;\n            }\n        }\n\n        return true;\n    }\n\n    bool GenericSharing::IsShareable(Il2CppGenericMethod* gmethod)\n    {\n        const Il2CppGenericInst* methodInst = gmethod->context.method_inst;\n        if (methodInst)\n        {\n            for (uint32_t i = 0; i < methodInst->type_argc; ++i)\n            {\n                if (!Type::IsReference(methodInst->type_argv[i]))\n                    return false;\n            }\n        }\n\n        return true;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/GenericSharing.h",
    "content": "#pragma once\n\nstruct Il2CppGenericClass;\nstruct Il2CppGenericMethod;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class GenericSharing\n    {\n    public:\n        static bool IsShareable(Il2CppGenericClass* gclass);\n        static bool IsShareable(Il2CppGenericMethod* gmethod);\n    };\n} /* namespace metadata */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericClassCompare.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppGenericClassCompare.h\"\n#include \"Il2CppGenericInstCompare.h\"\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    bool Il2CppGenericClassCompare::operator()(const Il2CppGenericClass* gc1, const Il2CppGenericClass* gc2) const\n    {\n        return Compare(gc1, gc2);\n    }\n\n    bool Il2CppGenericClassCompare::Compare(const Il2CppGenericClass* gc1, const Il2CppGenericClass* gc2)\n    {\n        if (gc1->typeDefinitionIndex != gc2->typeDefinitionIndex)\n            return false;\n\n        return Il2CppGenericInstCompare::Compare(gc1->context.class_inst, gc2->context.class_inst);\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericClassCompare.h",
    "content": "#pragma once\n\n#include \"utils/KeyWrapper.h\"\n\nstruct Il2CppGenericClass;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class Il2CppGenericClassCompare\n    {\n    public:\n        bool operator()(const Il2CppGenericClass* t1, const Il2CppGenericClass* t2) const;\n        static bool Compare(const Il2CppGenericClass* t1, const Il2CppGenericClass* t2);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericClassHash.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppGenericClassHash.h\"\n#include \"Il2CppGenericContextHash.h\"\n#include \"Il2CppTypeHash.h\"\n#include \"utils/HashUtils.h\"\n\nusing il2cpp::utils::HashUtils;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    size_t Il2CppGenericClassHash::operator()(const Il2CppGenericClass* item) const\n    {\n        return Hash(item);\n    }\n\n    size_t Il2CppGenericClassHash::Hash(const Il2CppGenericClass* item)\n    {\n        size_t containerHash = item->typeDefinitionIndex;\n        size_t contextHash = Il2CppGenericContextHash::Hash(&item->context);\n\n        return HashUtils::Combine(containerHash, contextHash);\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericClassHash.h",
    "content": "#pragma once\n\nstruct Il2CppGenericClass;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class Il2CppGenericClassHash\n    {\n    public:\n        size_t operator()(const Il2CppGenericClass* ea) const;\n        static size_t Hash(const Il2CppGenericClass* t1);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericContextCompare.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppGenericContextCompare.h\"\n#include \"Il2CppGenericInstCompare.h\"\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    bool Il2CppGenericContextCompare::operator()(const Il2CppGenericContext* gc1, const Il2CppGenericContext* gc2) const\n    {\n        return Compare(gc1, gc2);\n    }\n\n    bool Il2CppGenericContextCompare::Compare(const Il2CppGenericContext* gc1, const Il2CppGenericContext* gc2)\n    {\n        NOT_IMPLEMENTED_NO_ASSERT(Il2CppGenericContextCompare::Compare, \"We should ensure GenericInst uniqueness and do direct comparison\");\n        // return gc1->class_inst == gc2->class_inst && gc1->method_inst == gc2->method_inst;\n\n        if ((!gc1->class_inst && gc2->class_inst) || (gc1->class_inst && !gc2->class_inst))\n            return false;\n        if ((!gc1->method_inst && gc2->method_inst) || (gc1->method_inst && !gc2->method_inst))\n            return false;\n\n        return (!gc1->class_inst || Il2CppGenericInstCompare::Compare(gc1->class_inst, gc2->class_inst)) &&\n            (!gc1->method_inst || Il2CppGenericInstCompare::Compare(gc1->method_inst, gc2->method_inst));\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericContextCompare.h",
    "content": "#pragma once\n\nstruct Il2CppGenericContext;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class Il2CppGenericContextCompare\n    {\n    public:\n        bool operator()(const Il2CppGenericContext* t1, const Il2CppGenericContext* t2) const;\n        static bool Compare(const Il2CppGenericContext* t1, const Il2CppGenericContext* t2);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericContextHash.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppGenericContextHash.h\"\n#include \"Il2CppGenericInstHash.h\"\n#include \"Il2CppTypeHash.h\"\n#include \"utils/HashUtils.h\"\n\nusing il2cpp::utils::HashUtils;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    size_t Il2CppGenericContextHash::operator()(const Il2CppGenericContext* context) const\n    {\n        return Hash(context);\n    }\n\n    size_t Il2CppGenericContextHash::Hash(const Il2CppGenericContext* context)\n    {\n        size_t classInstHash = 0;\n        size_t methodInstHash = 0;\n\n        if (context->class_inst)\n            classInstHash = Il2CppGenericInstHash::Hash(context->class_inst);\n        if (context->method_inst)\n            methodInstHash = Il2CppGenericInstHash::Hash(context->method_inst);\n\n        return HashUtils::Combine(classInstHash, methodInstHash);\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericContextHash.h",
    "content": "#pragma once\n\nstruct Il2CppGenericContext;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class Il2CppGenericContextHash\n    {\n    public:\n        size_t operator()(const Il2CppGenericContext* ea) const;\n        static size_t Hash(const Il2CppGenericContext* t1);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericInstCompare.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppGenericInstCompare.h\"\n#include \"Il2CppTypeCompare.h\"\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    bool Il2CppGenericInstCompare::operator()(const KeyWrapper<const Il2CppGenericInst*>& t1, const KeyWrapper<const Il2CppGenericInst*>& t2) const\n    {\n        return Compare(t1, t2);\n    }\n\n    bool Il2CppGenericInstCompare::Compare(const KeyWrapper<const Il2CppGenericInst*>& t1, const KeyWrapper<const Il2CppGenericInst*>& t2)\n    {\n        if (t1.type != t2.type)\n            return false;\n        else if (!t1.isNormal())\n            return true;\n\n        if (t1.key->type_argc != t2.key->type_argc)\n            return false;\n\n        for (size_t i = 0; i < t1.key->type_argc; ++i)\n        {\n            if (!Il2CppTypeEqualityComparer::AreEqual(t1.key->type_argv[i], t2.key->type_argv[i]))\n                return false;\n        }\n\n        return true;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericInstCompare.h",
    "content": "#pragma once\n\n#include \"utils/KeyWrapper.h\"\n\nstruct Il2CppGenericInst;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class Il2CppGenericInstCompare\n    {\n    public:\n        bool operator()(const KeyWrapper<const Il2CppGenericInst*>& t1, const KeyWrapper<const Il2CppGenericInst*>& t2) const;\n        static bool Compare(const KeyWrapper<const Il2CppGenericInst*>& t1, const KeyWrapper<const Il2CppGenericInst*>& t2);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericInstHash.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppGenericInstHash.h\"\n#include \"Il2CppTypeHash.h\"\n#include \"utils/HashUtils.h\"\n\nusing il2cpp::utils::HashUtils;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    size_t Il2CppGenericInstHash::operator()(const Il2CppGenericInst* item) const\n    {\n        return Hash(item);\n    }\n\n    size_t Il2CppGenericInstHash::Hash(const Il2CppGenericInst* item)\n    {\n        size_t hash = item->type_argc;\n        for (size_t i = 0; i < item->type_argc; ++i)\n            hash = HashUtils::Combine(hash, Il2CppTypeHash::Hash(item->type_argv[i]));\n\n        return hash;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericInstHash.h",
    "content": "#pragma once\n\nstruct Il2CppGenericInst;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class Il2CppGenericInstHash\n    {\n    public:\n        size_t operator()(const Il2CppGenericInst* ea) const;\n        static size_t Hash(const Il2CppGenericInst* t1);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericMethodCompare.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppGenericMethodCompare.h\"\n#include \"Il2CppGenericContextCompare.h\"\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    bool Il2CppGenericMethodCompare::operator()(const Il2CppGenericMethod* m1, const Il2CppGenericMethod* m2) const\n    {\n        return Equals(m1, m2);\n    }\n\n    bool Il2CppGenericMethodCompare::Equals(const Il2CppGenericMethod* m1, const Il2CppGenericMethod* m2)\n    {\n        if (m1->methodDefinition != m2->methodDefinition)\n            return false;\n\n        return Il2CppGenericContextCompare::Compare(&m1->context, &m2->context);\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericMethodCompare.h",
    "content": "#pragma once\n\n#include \"utils/KeyWrapper.h\"\n\nstruct Il2CppGenericMethod;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    struct Il2CppGenericMethodCompare\n    {\n        bool operator()(const Il2CppGenericMethod* m1, const Il2CppGenericMethod* m2) const;\n        static bool Equals(const Il2CppGenericMethod* m1, const Il2CppGenericMethod* m2);\n    };\n} /* namespace metadata */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericMethodHash.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppGenericMethodHash.h\"\n#include \"Il2CppGenericContextHash.h\"\n#include \"utils/HashUtils.h\"\n\nusing il2cpp::utils::HashUtils;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    size_t Il2CppGenericMethodHash::operator()(const Il2CppGenericMethod* method) const\n    {\n        return Hash(method);\n    }\n\n    size_t Il2CppGenericMethodHash::Hash(const Il2CppGenericMethod* method)\n    {\n        size_t tokenHash = method->methodDefinition->token;\n        size_t contextHash = Il2CppGenericContextHash::Hash(&method->context);\n\n        return HashUtils::Combine(tokenHash, contextHash);\n    }\n} /* namespace metadata */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppGenericMethodHash.h",
    "content": "#pragma once\n\nstruct Il2CppGenericMethod;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    struct Il2CppGenericMethodHash\n    {\n    public:\n        size_t operator()(const Il2CppGenericMethod* method) const;\n        static size_t Hash(const Il2CppGenericMethod* method);\n    };\n} /* namespace metadata */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppSignatureCompare.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppTypeCompare.h\"\n#include \"Il2CppSignatureCompare.h\"\n#include \"utils/KeyWrapper.h\"\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    bool Il2CppSignatureCompare::operator()(const il2cpp::utils::dynamic_array<const Il2CppType*>& s1, const il2cpp::utils::dynamic_array<const Il2CppType*>& s2) const\n    {\n        return Equals(s1, s2);\n    }\n\n    bool Il2CppSignatureCompare::Equals(const il2cpp::utils::dynamic_array<const Il2CppType*>& s1, const il2cpp::utils::dynamic_array<const Il2CppType*>& s2)\n    {\n        if (s1.size() != s2.size())\n            return false;\n\n        il2cpp::utils::dynamic_array<const Il2CppType*>::const_iterator s1Iter, s1End = s1.end(), s2Iter;\n\n        for (s1Iter = s1.begin(), s2Iter = s2.begin(); s1Iter != s1End; ++s1Iter, ++s2Iter)\n        {\n            if (!Il2CppTypeEqualityComparer::AreEqual(*s1Iter, *s2Iter))\n                return false;\n        }\n\n        return true;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppSignatureCompare.h",
    "content": "#pragma once\n\n#include \"utils/dynamic_array.h\"\n\nstruct Il2CppType;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    struct Il2CppSignatureCompare\n    {\n        bool operator()(const il2cpp::utils::dynamic_array<const Il2CppType*>& s1, const il2cpp::utils::dynamic_array<const Il2CppType*>& s2) const;\n        static bool Equals(const il2cpp::utils::dynamic_array<const Il2CppType*>& s1, const il2cpp::utils::dynamic_array<const Il2CppType*>& s2);\n    };\n} /* namespace metadata */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppSignatureHash.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppTypeHash.h\"\n#include \"Il2CppSignatureHash.h\"\n#include \"utils/HashUtils.h\"\n\nusing il2cpp::utils::HashUtils;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    size_t Il2CppSignatureHash::operator()(const il2cpp::utils::dynamic_array<const Il2CppType*>& signature) const\n    {\n        return Hash(signature);\n    }\n\n    size_t Il2CppSignatureHash::Hash(const il2cpp::utils::dynamic_array<const Il2CppType*>& signature)\n    {\n        il2cpp::utils::dynamic_array<const Il2CppType*>::const_iterator iter, end = signature.end();\n        size_t retVal = 0;\n\n        for (iter = signature.begin(); iter != end; ++iter)\n            retVal = HashUtils::Combine(retVal, Il2CppTypeHash::Hash(*iter));\n\n        return retVal;\n    }\n} /* namespace metadata */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppSignatureHash.h",
    "content": "#pragma once\n\n#include \"utils/dynamic_array.h\"\n\nstruct Il2CppType;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    struct Il2CppSignatureHash\n    {\n    public:\n        size_t operator()(const il2cpp::utils::dynamic_array<const Il2CppType*>& signature) const;\n        static size_t Hash(const il2cpp::utils::dynamic_array<const Il2CppType*>& signature);\n    };\n} /* namespace metadata */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppTypeCompare.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppTypeCompare.h\"\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    template<typename T>\n    static inline int Compare(const T& left, const T& right)\n    {\n        if (left == right)\n            return 0;\n\n        if (left < right)\n            return -1;\n\n        return 1;\n    }\n\n    static int Compare(const Il2CppType* t1, const Il2CppType* t2)\n    {\n        int result = Compare(t1->type, t2->type);\n        if (result != 0)\n            return result;\n\n        result = Compare(t1->byref, t2->byref);\n        if (result != 0)\n            return result;\n\n        switch (t1->type)\n        {\n            case IL2CPP_TYPE_VALUETYPE:\n            case IL2CPP_TYPE_CLASS:\n                return Compare(t1->data.klassIndex, t2->data.klassIndex);\n\n            case IL2CPP_TYPE_PTR:\n            case IL2CPP_TYPE_SZARRAY:\n                return Compare(t1->data.type, t2->data.type);\n\n            case IL2CPP_TYPE_ARRAY:\n            {\n                result = Compare(t1->data.array->rank, t2->data.array->rank);\n                if (result != 0)\n                    return result;\n\n                return Compare(t1->data.array->etype, t2->data.array->etype);\n            }\n            case IL2CPP_TYPE_GENERICINST:\n            {\n                const Il2CppGenericInst *i1 = t1->data.generic_class->context.class_inst;\n                const Il2CppGenericInst *i2 = t2->data.generic_class->context.class_inst;\n\n                // this happens when maximum generic recursion is hit\n                if (i1 == NULL || i2 == NULL)\n                {\n                    if (i1 == i2)\n                        return 0;\n                    return (i1 == NULL) ? -1 : 1;\n                }\n\n                result = Compare(i1->type_argc, i2->type_argc);\n                if (result != 0)\n                    return result;\n\n                result = Compare(t1->data.generic_class->typeDefinitionIndex, t2->data.generic_class->typeDefinitionIndex);\n                if (result != 0)\n                    return result;\n\n                /* FIXME: we should probably just compare the instance pointers directly.  */\n                for (uint32_t i = 0; i < i1->type_argc; ++i)\n                {\n                    result = Compare(i1->type_argv[i], i2->type_argv[i]);\n                    if (result != 0)\n                        return result;\n                }\n\n                return 0;\n            }\n            case IL2CPP_TYPE_VAR:\n            case IL2CPP_TYPE_MVAR:\n                return Compare(t1->data.genericParameterIndex, t2->data.genericParameterIndex);\n            default:\n                return 0;\n        }\n\n        NOT_IMPLEMENTED(Il2CppTypeEqualityComparer::compare);\n        return Compare(static_cast<const void*>(t1), static_cast<const void*>(t2));\n    }\n\n    bool Il2CppTypeEqualityComparer::AreEqual(const Il2CppType* t1, const Il2CppType* t2)\n    {\n        return Compare(t1, t2) == 0;\n    }\n\n    bool Il2CppTypeLess::operator()(const Il2CppType * t1, const Il2CppType * t2) const\n    {\n        return Compare(t1, t2) < 0;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppTypeCompare.h",
    "content": "#pragma once\n\n#include \"utils/KeyWrapper.h\"\n\nstruct Il2CppType;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class Il2CppTypeEqualityComparer\n    {\n    public:\n        bool operator()(const Il2CppType* t1, const Il2CppType* t2) const { return AreEqual(t1, t2); }\n        static bool AreEqual(const Il2CppType* t1, const Il2CppType* t2);\n    };\n\n    class Il2CppTypeLess\n    {\n    public:\n        bool operator()(const Il2CppType* t1, const Il2CppType* t2) const;\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppTypeHash.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"Il2CppTypeHash.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/HashUtils.h\"\n\nusing il2cpp::utils::HashUtils;\nusing il2cpp::utils::StringUtils;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    size_t Il2CppTypeHash::operator()(const Il2CppType* t1) const\n    {\n        return Hash(t1);\n    }\n\n    size_t Il2CppTypeHash::Hash(const Il2CppType* t1)\n    {\n        size_t hash = t1->type;\n\n        hash = HashUtils::Combine(hash, t1->byref);\n\n        switch (t1->type)\n        {\n            case IL2CPP_TYPE_VALUETYPE:\n            case IL2CPP_TYPE_CLASS:\n            {\n                return HashUtils::Combine(hash, t1->data.klassIndex);\n            }\n            case IL2CPP_TYPE_SZARRAY:\n            case IL2CPP_TYPE_PTR:\n            {\n                return HashUtils::Combine(hash, Hash(t1->data.type));\n            }\n            case IL2CPP_TYPE_GENERICINST:\n            {\n                const Il2CppGenericInst *inst = t1->data.generic_class->context.class_inst;\n                hash = HashUtils::Combine(hash, t1->data.generic_class->typeDefinitionIndex);\n                for (uint32_t i = 0; i < inst->type_argc; ++i)\n                {\n                    hash = HashUtils::Combine(hash, Hash(inst->type_argv[i]));\n                }\n                return hash;\n            }\n            default:\n                return hash;\n        }\n        return hash;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppTypeHash.h",
    "content": "#pragma once\n\nstruct Il2CppType;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    class Il2CppTypeHash\n    {\n    public:\n        size_t operator()(const Il2CppType* t1) const;\n        static size_t Hash(const Il2CppType* t1);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata/Il2CppTypeVector.h",
    "content": "#pragma once\n#include <vector>\n\nstruct Il2CppType;\n\nnamespace il2cpp\n{\nnamespace metadata\n{\n    typedef std::vector<const Il2CppType*> Il2CppTypeVector;\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/metadata.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"blob.h\"\n#include \"il2cpp-metadata.h\"\n\nstruct Il2CppClass;\nstruct MethodInfo;\nstruct Il2CppType;\n\nstruct Il2CppArrayType\n{\n    const Il2CppType* etype;\n    uint8_t rank;\n    uint8_t numsizes;\n    uint8_t numlobounds;\n    int *sizes;\n    int *lobounds;\n};\n\nstruct Il2CppGenericInst\n{\n    uint32_t type_argc;\n    const Il2CppType **type_argv;\n};\n\nstruct Il2CppGenericContext\n{\n    /* The instantiation corresponding to the class generic parameters */\n    const Il2CppGenericInst *class_inst;\n    /* The instantiation corresponding to the method generic parameters */\n    const Il2CppGenericInst *method_inst;\n};\n\nstruct Il2CppGenericParameter\n{\n    GenericContainerIndex ownerIndex;  /* Type or method this parameter was defined in. */\n    StringIndex nameIndex;\n    GenericParameterConstraintIndex constraintsStart;\n    int16_t constraintsCount;\n    uint16_t num;\n    uint16_t flags;\n};\n\nstruct Il2CppGenericContainer\n{\n    /* index of the generic type definition or the generic method definition corresponding to this container */\n    int32_t ownerIndex; // either index into Il2CppClass metadata array or Il2CppMethodDefinition array\n    int32_t type_argc;\n    /* If true, we're a generic method, otherwise a generic type definition. */\n    int32_t is_method;\n    /* Our type parameters. */\n    GenericParameterIndex genericParameterStart;\n};\n\nstruct Il2CppGenericClass\n{\n    TypeDefinitionIndex typeDefinitionIndex;    /* the generic type definition */\n    Il2CppGenericContext context;   /* a context that contains the type instantiation doesn't contain any method instantiation */\n    Il2CppClass *cached_class;  /* if present, the Il2CppClass corresponding to the instantiation.  */\n};\n\nstruct Il2CppGenericMethod\n{\n    const MethodInfo* methodDefinition;\n    Il2CppGenericContext context;\n};\n\nstruct Il2CppType\n{\n    union\n    {\n        // We have this dummy field first because pre C99 compilers (MSVC) can only initializer the first value in a union.\n        void* dummy;\n        TypeDefinitionIndex klassIndex; /* for VALUETYPE and CLASS */\n        const Il2CppType *type;   /* for PTR and SZARRAY */\n        Il2CppArrayType *array; /* for ARRAY */\n        //MonoMethodSignature *method;\n        GenericParameterIndex genericParameterIndex; /* for VAR and MVAR */\n        Il2CppGenericClass *generic_class; /* for GENERICINST */\n    } data;\n    unsigned int attrs    : 16; /* param attributes or field flags */\n    Il2CppTypeEnum type     : 8;\n    unsigned int num_mods : 6;  /* max 64 modifiers follow at the end */\n    unsigned int byref    : 1;\n    unsigned int pinned   : 1;  /* valid when included in a local var signature */\n    //MonoCustomMod modifiers [MONO_ZERO_LEN_ARRAY]; /* this may grow */\n};\n\ntypedef enum\n{\n    IL2CPP_CALL_DEFAULT,\n    IL2CPP_CALL_C,\n    IL2CPP_CALL_STDCALL,\n    IL2CPP_CALL_THISCALL,\n    IL2CPP_CALL_FASTCALL,\n    IL2CPP_CALL_VARARG\n} Il2CppCallConvention;\n\nenum Il2CppCharSet\n{\n    CHARSET_ANSI,\n    CHARSET_UNICODE\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/ThreadPoolDataStructures.h",
    "content": "#pragma once\n\n#if NET_4_0\n\n#include <vector>\n\n#include \"os/ConditionVariable.h\"\n#include \"os/Mutex.h\"\n\nstruct Il2CppDomain;\nstruct Il2CppInternalThread;\n\nunion ThreadPoolCounter\n{\n    struct\n    {\n        int16_t max_working; /* determined by heuristic */\n        int16_t active; /* executing worker_thread */\n        int16_t working; /* actively executing worker_thread, not parked */\n        int16_t parked; /* parked */\n    } _;\n    int64_t as_int64_t;\n};\n\nstruct ThreadPoolDomain\n{\n    Il2CppDomain* domain;\n    int32_t outstanding_request;\n};\n\nstruct ThreadPoolHillClimbing\n{\n    int32_t wave_period;\n    int32_t samples_to_measure;\n    double target_throughput_ratio;\n    double target_signal_to_noise_ratio;\n    double max_change_per_second;\n    double max_change_per_sample;\n    int32_t max_thread_wave_magnitude;\n    int32_t sample_interval_low;\n    double thread_magnitude_multiplier;\n    int32_t sample_interval_high;\n    double throughput_error_smoothing_factor;\n    double gain_exponent;\n    double max_sample_error;\n\n    double current_control_setting;\n    int64_t total_samples;\n    int16_t last_thread_count;\n    double elapsed_since_last_change;\n    double completions_since_last_change;\n\n    double average_throughput_noise;\n\n    double *samples;\n    double *thread_counts;\n\n    uint32_t current_sample_interval;\n    void* random_interval_generator;\n\n    int32_t accumulated_completion_count;\n    double accumulated_sample_duration;\n};\n\nstruct ThreadPool\n{\n    ThreadPoolCounter counters;\n\n    std::vector<ThreadPoolDomain*> domains;\n    il2cpp::os::FastMutex domains_lock;\n\n    std::vector<Il2CppInternalThread*> working_threads;\n    int32_t parked_threads_count;\n    il2cpp::os::ConditionVariable parked_threads_cond;\n    il2cpp::os::FastMutex active_threads_lock; /* protect access to working_threads and parked_threads */\n\n    uint32_t worker_creation_current_second;\n    uint32_t worker_creation_current_count;\n    il2cpp::os::FastMutex worker_creation_lock;\n\n    int32_t heuristic_completions;\n    int64_t heuristic_sample_start;\n    int64_t heuristic_last_dequeue; // ms\n    int64_t heuristic_last_adjustment; // ms\n    int64_t heuristic_adjustment_interval; // ms\n    ThreadPoolHillClimbing heuristic_hill_climbing;\n    il2cpp::os::Mutex heuristic_lock;\n\n    int32_t limit_worker_min;\n    int32_t limit_worker_max;\n    int32_t limit_io_min;\n    int32_t limit_io_max;\n\n    void* cpu_usage_state;\n    int32_t cpu_usage;\n\n    /* suspended by the debugger */\n    bool suspended;\n};\n\nenum ThreadPoolHeuristicStateTransition\n{\n    TRANSITION_WARMUP,\n    TRANSITION_INITIALIZING,\n    TRANSITION_RANDOM_MOVE,\n    TRANSITION_CLIMBING_MOVE,\n    TRANSITION_CHANGE_POINT,\n    TRANSITION_STABILIZING,\n    TRANSITION_STARVATION,\n    TRANSITION_THREAD_TIMED_OUT,\n    TRANSITION_UNDEFINED,\n};\n\n#endif // NET_4_0\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/ThreadPoolMacros.h",
    "content": "#pragma once\n\n#if NET_4_0\n\n#include \"vm/Atomic.h\"\n\n#define COUNTER_CHECK(counter) \\\n    do { \\\n        IL2CPP_ASSERT(counter._.max_working > 0); \\\n        IL2CPP_ASSERT(counter._.working >= 0); \\\n        IL2CPP_ASSERT(counter._.active >= 0); \\\n    } while (0)\n\n#define COUNTER_READ() (il2cpp::vm::Atomic::Read64 (&g_ThreadPool->counters.as_int64_t))\n\n#define COUNTER_ATOMIC(var, block) \\\n    do { \\\n        ThreadPoolCounter __old; \\\n        do { \\\n            IL2CPP_ASSERT(g_ThreadPool); \\\n            __old.as_int64_t = COUNTER_READ (); \\\n            (var) = __old; \\\n            { block; } \\\n            COUNTER_CHECK (var); \\\n        } while (il2cpp::vm::Atomic::CompareExchange64 (&g_ThreadPool->counters.as_int64_t, (var).as_int64_t, __old.as_int64_t) != __old.as_int64_t); \\\n    } while (0)\n\n#define COUNTER_TRY_ATOMIC(res, var, block) \\\n    do { \\\n        ThreadPoolCounter __old; \\\n        do { \\\n            IL2CPP_ASSERT(g_ThreadPool); \\\n            __old.as_int64_t = COUNTER_READ (); \\\n            (var) = __old; \\\n            (res) = false; \\\n            { block; } \\\n            COUNTER_CHECK (var); \\\n            (res) = il2cpp::vm::Atomic::CompareExchange64 (&g_ThreadPool->counters.as_int64_t, (var).as_int64_t, __old.as_int64_t) == __old.as_int64_t; \\\n        } while (0); \\\n    } while (0)\n\n#define CPU_USAGE_LOW 80\n#define CPU_USAGE_HIGH 95\n\n#endif // NET_4_0\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/ThreadPoolMonitorThread.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if NET_4_0\n\n#include \"gc/GarbageCollector.h\"\n#include \"mono/ThreadPool/threadpool-ms.h\"\n#include \"mono/ThreadPool/ThreadPoolDataStructures.h\"\n#include \"mono/ThreadPool/ThreadPoolMacros.h\"\n#include \"mono/ThreadPool/ThreadPoolMonitorThread.h\"\n#include \"mono/ThreadPool/ThreadPoolWorkerThread.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Thread.h\"\n#include \"os/Time.h\"\n\n#define MONITOR_INTERVAL 500 // ms\n#define MONITOR_MINIMAL_LIFETIME 60 * 1000 // ms\n\nstatic int32_t s_MonitorStatus = MONITOR_STATUS_NOT_RUNNING;\n\nMonitorStatus GetMonitorStatus()\n{\n    return static_cast<MonitorStatus>(s_MonitorStatus);\n}\n\nstatic int32_t cpu_info_usage(void* prev)\n{\n    // Note : Implementing CpuInfo on all platforms will be challenging, so for now we are going to cheat\n    // and always say it's low\n#if IL2CPP_ENABLE_CPU_INFO\n    return il2cpp::os::CpuInfo::Usage(prev);\n#else\n    return CPU_USAGE_LOW;\n#endif\n}\n\nstatic Il2CppException* mono_thread_interruption_checkpoint(void)\n{\n    // For now just do nothing.  The one place this is used doesn't care about the return value\n    return NULL;\n}\n\n/* LOCKING: threadpool->domains_lock must be held */\nstatic bool domain_any_has_request(void)\n{\n    unsigned int i;\n\n    for (i = 0; i < g_ThreadPool->domains.size(); ++i)\n    {\n        ThreadPoolDomain *tmp = g_ThreadPool->domains[i];\n        if (tmp->outstanding_request > 0)\n            return true;\n    }\n\n    return false;\n}\n\nstatic bool monitor_sufficient_delay_since_last_dequeue(void)\n{\n    int64_t threshold;\n\n    IL2CPP_ASSERT(g_ThreadPool);\n\n    if (g_ThreadPool->cpu_usage < CPU_USAGE_LOW)\n    {\n        threshold = MONITOR_INTERVAL;\n    }\n    else\n    {\n        ThreadPoolCounter counter;\n        counter.as_int64_t = COUNTER_READ();\n        threshold = counter._.max_working * MONITOR_INTERVAL * 2;\n    }\n\n    return il2cpp::os::Time::GetTicksMillisecondsMonotonic() >= g_ThreadPool->heuristic_last_dequeue + threshold;\n}\n\nstatic bool monitor_should_keep_running(void)\n{\n    static int64_t last_should_keep_running = -1;\n\n    IL2CPP_ASSERT(s_MonitorStatus == MONITOR_STATUS_WAITING_FOR_REQUEST || s_MonitorStatus == MONITOR_STATUS_REQUESTED);\n\n    if (il2cpp::vm::Atomic::Exchange(&s_MonitorStatus, MONITOR_STATUS_WAITING_FOR_REQUEST) == MONITOR_STATUS_WAITING_FOR_REQUEST)\n    {\n        bool should_keep_running = true, force_should_keep_running = false;\n\n        if (il2cpp::vm::Runtime::IsShuttingDown())\n        {\n            should_keep_running = false;\n        }\n        else\n        {\n            g_ThreadPool->domains_lock.Lock();\n            if (!domain_any_has_request())\n                should_keep_running = false;\n            g_ThreadPool->domains_lock.Unlock();\n\n            if (!should_keep_running)\n            {\n                if (last_should_keep_running == -1 || il2cpp::os::Time::GetTicks100NanosecondsMonotonic() - last_should_keep_running < MONITOR_MINIMAL_LIFETIME * 1000 * 10)\n                {\n                    should_keep_running = force_should_keep_running = true;\n                }\n            }\n        }\n\n        if (should_keep_running)\n        {\n            if (last_should_keep_running == -1 || !force_should_keep_running)\n                last_should_keep_running = il2cpp::os::Time::GetTicks100NanosecondsMonotonic();\n        }\n        else\n        {\n            last_should_keep_running = -1;\n            if (il2cpp::vm::Atomic::CompareExchange(&s_MonitorStatus, MONITOR_STATUS_NOT_RUNNING, MONITOR_STATUS_WAITING_FOR_REQUEST) == MONITOR_STATUS_WAITING_FOR_REQUEST)\n                return false;\n        }\n    }\n\n    IL2CPP_ASSERT(s_MonitorStatus == MONITOR_STATUS_WAITING_FOR_REQUEST || s_MonitorStatus == MONITOR_STATUS_REQUESTED);\n\n    return true;\n}\n\nstatic void monitor_thread(void* data)\n{\n    Il2CppInternalThread *current_thread = il2cpp::vm::Thread::CurrentInternal();\n    unsigned int i;\n\n    cpu_info_usage(g_ThreadPool->cpu_usage_state);\n\n    //mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, \"[%p] monitor thread, started\", mono_native_thread_id_get ());\n\n    do\n    {\n        ThreadPoolCounter counter;\n        bool limit_worker_max_reached;\n        int32_t interval_left = MONITOR_INTERVAL;\n        int32_t awake = 0; /* number of spurious awakes we tolerate before doing a round of rebalancing */\n\n        IL2CPP_ASSERT(s_MonitorStatus != MONITOR_STATUS_NOT_RUNNING);\n\n        il2cpp::gc::GarbageCollector::SetSkipThread(true);\n\n        do\n        {\n            int64_t ts;\n            bool alerted = false;\n\n            if (il2cpp::vm::Runtime::IsShuttingDown())\n                break;\n\n            ts = il2cpp::os::Time::GetTicksMillisecondsMonotonic();\n            il2cpp::vm::Thread::Sleep(interval_left);\n            /*if (mono_thread_info_sleep (interval_left, &alerted) == 0)\n            break;*/\n            interval_left -= (int32_t)(il2cpp::os::Time::GetTicksMillisecondsMonotonic() - ts);\n\n            il2cpp::gc::GarbageCollector::SetSkipThread(false);\n            if ((current_thread->state & (il2cpp::vm::kThreadStateStopRequested | il2cpp::vm::kThreadStateSuspendRequested)) != 0)\n                mono_thread_interruption_checkpoint();\n            il2cpp::gc::GarbageCollector::SetSkipThread(true);\n        }\n        while (interval_left > 0 && ++awake < 10);\n\n        il2cpp::gc::GarbageCollector::SetSkipThread(false);\n\n        if (g_ThreadPool->suspended)\n            continue;\n\n        if (il2cpp::vm::Runtime::IsShuttingDown())\n            continue;\n\n        g_ThreadPool->domains_lock.Lock();\n        if (!domain_any_has_request())\n        {\n            g_ThreadPool->domains_lock.Unlock();\n            continue;\n        }\n        g_ThreadPool->domains_lock.Unlock();\n\n        g_ThreadPool->cpu_usage = cpu_info_usage(g_ThreadPool->cpu_usage_state);\n\n        if (!monitor_sufficient_delay_since_last_dequeue())\n            continue;\n\n        limit_worker_max_reached = false;\n\n        COUNTER_ATOMIC(counter,\n        {\n            if (counter._.max_working >= g_ThreadPool->limit_worker_max)\n            {\n                limit_worker_max_reached = true;\n                break;\n            }\n            counter._.max_working++;\n        });\n\n        if (limit_worker_max_reached)\n            continue;\n\n        hill_climbing_force_change(counter._.max_working, TRANSITION_STARVATION);\n\n        for (i = 0; i < 5; ++i)\n        {\n            if (il2cpp::vm::Runtime::IsShuttingDown())\n                break;\n\n            if (worker_try_unpark())\n            {\n                //mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, \"[%p] monitor thread, unparked\", mono_native_thread_id_get ());\n                break;\n            }\n\n            if (worker_try_create())\n            {\n                //mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, \"[%p] monitor thread, created\", mono_native_thread_id_get ());\n                break;\n            }\n        }\n    }\n    while (monitor_should_keep_running());\n\n    //mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, \"[%p] monitor thread, finished\", mono_native_thread_id_get ());\n}\n\nvoid monitor_ensure_running()\n{\n    for (;;)\n    {\n        switch (s_MonitorStatus)\n        {\n            case MONITOR_STATUS_REQUESTED:\n                return;\n            case MONITOR_STATUS_WAITING_FOR_REQUEST:\n                il2cpp::vm::Atomic::CompareExchange(&s_MonitorStatus, MONITOR_STATUS_REQUESTED, MONITOR_STATUS_WAITING_FOR_REQUEST);\n                break;\n            case MONITOR_STATUS_NOT_RUNNING:\n                if (il2cpp::vm::Runtime::IsShuttingDown())\n                    return;\n                if (il2cpp::vm::Atomic::CompareExchange(&s_MonitorStatus, MONITOR_STATUS_REQUESTED, MONITOR_STATUS_NOT_RUNNING) == MONITOR_STATUS_NOT_RUNNING)\n                {\n                    if (!il2cpp::vm::Thread::CreateInternal(monitor_thread, NULL, true, SMALL_STACK))\n                        s_MonitorStatus = MONITOR_STATUS_NOT_RUNNING;\n\n                    return;\n                }\n                break;\n            default:\n                IL2CPP_ASSERT(0 && \"should not be reached\");\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/ThreadPoolMonitorThread.h",
    "content": "#pragma once\n\n#if NET_4_0\n\nenum MonitorStatus\n{\n    MONITOR_STATUS_REQUESTED,\n    MONITOR_STATUS_WAITING_FOR_REQUEST,\n    MONITOR_STATUS_NOT_RUNNING,\n};\n\nvoid monitor_ensure_running();\nMonitorStatus GetMonitorStatus();\n\n#endif // NET_4_0\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/ThreadPoolWorkerThread.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if NET_4_0\n\n#include \"gc/GarbageCollector.h\"\n#include \"mono/ThreadPool/threadpool-ms.h\"\n#include \"mono/ThreadPool/ThreadPoolDataStructures.h\"\n#include \"mono/ThreadPool/ThreadPoolMacros.h\"\n#include \"vm/String.h\"\n#include \"vm/Object.h\"\n#include \"vm/Random.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Thread.h\"\n#include \"os/Time.h\"\n\n#define WORKER_CREATION_MAX_PER_SEC 10\n\nstatic void remove_working_thread(Il2CppInternalThread *thread)\n{\n    int index = 0;\n    for (unsigned i = 0; i < g_ThreadPool->working_threads.size(); ++i)\n    {\n        if (g_ThreadPool->working_threads[i] == thread)\n        {\n            index = i;\n            break;\n        }\n    }\n    g_ThreadPool->working_threads.erase(g_ThreadPool->working_threads.begin() + index);\n}\n\n/*\n* mono_thread_info_install_interrupt: install an interruption token for the current thread.\n*\n*  - @callback: must be able to be called from another thread and always cancel the wait\n*  - @data: passed to the callback\n*  - @interrupted: will be set to TRUE if a token is already installed, FALSE otherwise\n*     if set to TRUE, it must mean that the thread is in interrupted state\n*/\nstatic void thread_info_install_interrupt(void(*callback)(void* data), void* data, bool *interrupted)\n{\n    // We can get by without this for the time being.  Not needed until we have cooperative threading\n}\n\nstatic void thread_info_uninstall_interrupt(bool *interrupted)\n{\n    // We can get by without this for the time being.  Not needed until we have cooperative threading\n}\n\nstatic void worker_wait_interrupt(void* data)\n{\n    g_ThreadPool->active_threads_lock.Lock();\n    g_ThreadPool->parked_threads_cond.Signal();\n    g_ThreadPool->active_threads_lock.Unlock();\n}\n\n/* return true if timeout, false otherwise (worker unpark or interrupt) */\nstatic bool worker_park(void)\n{\n    bool timeout = false;\n\n    //mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, \"[%p] current worker parking\", mono_native_thread_id_get ());\n\n    il2cpp::gc::GarbageCollector::SetSkipThread(true);\n\n    g_ThreadPool->active_threads_lock.Lock();\n\n    if (!il2cpp::vm::Runtime::IsShuttingDown())\n    {\n        static void* rand_handle = NULL;\n        Il2CppInternalThread *thread_internal;\n        bool interrupted = false;\n\n        if (!rand_handle)\n            rand_handle = il2cpp::vm::Random::Create();\n        IL2CPP_ASSERT(rand_handle);\n\n        thread_internal = il2cpp::vm::Thread::CurrentInternal();\n        IL2CPP_ASSERT(thread_internal);\n\n        g_ThreadPool->parked_threads_count += 1;\n        remove_working_thread(thread_internal);\n\n        thread_info_install_interrupt(worker_wait_interrupt, NULL, &interrupted);\n        if (interrupted)\n            goto done;\n\n        if (g_ThreadPool->parked_threads_cond.TimedWait(&g_ThreadPool->active_threads_lock, il2cpp::vm::Random::Next(&rand_handle, 5 * 1000, 60 * 1000)) != 0)\n            timeout = true;\n\n        thread_info_uninstall_interrupt(&interrupted);\n\n    done:\n        g_ThreadPool->working_threads.push_back(thread_internal);\n        g_ThreadPool->parked_threads_count -= 1;\n    }\n\n    g_ThreadPool->active_threads_lock.Unlock();\n\n    il2cpp::gc::GarbageCollector::SetSkipThread(false);\n\n    //mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, \"[%p] current worker unparking, timeout? %s\", mono_native_thread_id_get (), timeout ? \"yes\" : \"no\");\n\n    return timeout;\n}\n\n/* LOCKING: threadpool->domains_lock must be held */\nstatic ThreadPoolDomain* domain_get_next(ThreadPoolDomain *current)\n{\n    ThreadPoolDomain *tpdomain = NULL;\n    unsigned int len;\n\n    len = (unsigned int)g_ThreadPool->domains.size();\n    if (len > 0)\n    {\n        unsigned int i, current_idx = -1;\n        if (current)\n        {\n            for (i = 0; i < len; ++i)\n            {\n                if (current == g_ThreadPool->domains[i])\n                {\n                    current_idx = i;\n                    break;\n                }\n            }\n            IL2CPP_ASSERT(current_idx >= 0);\n        }\n        for (i = current_idx + 1; i < len + current_idx + 1; ++i)\n        {\n            ThreadPoolDomain *tmp = (ThreadPoolDomain*)g_ThreadPool->domains[i % len];\n            if (tmp->outstanding_request > 0)\n            {\n                tpdomain = tmp;\n                break;\n            }\n        }\n    }\n\n    return tpdomain;\n}\n\nstruct WorkerThreadStateHolder\n{\n    Il2CppInternalThread *thread;\n    ThreadPoolDomain* tpdomain;\n    ThreadPoolDomain* previous_tpdomain;\n    ThreadPoolCounter counter;\n    bool retire;\n\n    WorkerThreadStateHolder() :\n        thread(il2cpp::vm::Thread::CurrentInternal()),\n        tpdomain(NULL),\n        previous_tpdomain(NULL),\n        retire(false)\n    {\n        IL2CPP_ASSERT(thread);\n        il2cpp::vm::Thread::SetName(thread, il2cpp::vm::String::New(\"IL2CPP Threadpool worker\"));\n\n        il2cpp::os::FastAutoLock activeThreadsLock(&g_ThreadPool->active_threads_lock);\n        g_ThreadPool->working_threads.push_back(thread);\n    }\n\n    ~WorkerThreadStateHolder()\n    {\n        {\n            il2cpp::os::FastAutoLock activeThreadsLock(&g_ThreadPool->active_threads_lock);\n            remove_working_thread(thread);\n        }\n\n        COUNTER_ATOMIC(counter,\n        {\n            counter._.working--;\n            counter._.active--;\n        });\n    }\n};\n\nstruct WorkerThreadParkStateHolder\n{\n    ThreadPoolCounter& counter;\n    il2cpp::os::FastAutoUnlock domainUnlock;\n\n    WorkerThreadParkStateHolder(WorkerThreadStateHolder& workerThreadState) :\n        counter(workerThreadState.counter),\n        domainUnlock(&g_ThreadPool->domains_lock)\n    {\n        COUNTER_ATOMIC(counter,\n        {\n            counter._.working--;\n            counter._.parked++;\n        });\n    }\n\n    ~WorkerThreadParkStateHolder()\n    {\n        COUNTER_ATOMIC(counter,\n        {\n            counter._.working++;\n            counter._.parked--;\n        });\n    }\n};\n\nstruct WorkerThreadJobStateHolder\n{\n    ThreadPoolDomain* tpdomain;\n\n    WorkerThreadJobStateHolder(const WorkerThreadStateHolder& workerThreadState) :\n        tpdomain(workerThreadState.tpdomain)\n    {\n        tpdomain->outstanding_request--;\n        IL2CPP_ASSERT(tpdomain->outstanding_request >= 0);\n\n        IL2CPP_ASSERT(tpdomain->domain);\n        IL2CPP_ASSERT(tpdomain->domain->threadpool_jobs >= 0);\n        tpdomain->domain->threadpool_jobs++;\n    }\n\n    ~WorkerThreadJobStateHolder()\n    {\n        tpdomain->domain->threadpool_jobs--;\n        IL2CPP_ASSERT(tpdomain->domain->threadpool_jobs >= 0);\n    }\n};\n\nstatic void worker_thread(void* data)\n{\n    IL2CPP_ASSERT(g_ThreadPool);\n\n    WorkerThreadStateHolder workerThreadState;\n    il2cpp::os::FastAutoLock domainsLock(&g_ThreadPool->domains_lock);\n\n    while (!il2cpp::vm::Runtime::IsShuttingDown())\n    {\n        workerThreadState.previous_tpdomain = workerThreadState.tpdomain;\n\n        if (workerThreadState.retire || !(workerThreadState.tpdomain = domain_get_next(workerThreadState.previous_tpdomain)))\n        {\n            WorkerThreadParkStateHolder threadParkState(workerThreadState);\n\n            if (worker_park())\n                break;\n\n            workerThreadState.retire = false;\n            continue;\n        }\n\n        WorkerThreadJobStateHolder threadJobState(workerThreadState);\n        il2cpp::os::FastAutoUnlock domainUnlock(&g_ThreadPool->domains_lock);\n\n        Il2CppObject* res = il2cpp::vm::Runtime::InvokeWithThrow(il2cpp_defaults.threadpool_perform_wait_callback_method, NULL, NULL);\n        if (res && *(bool*)il2cpp::vm::Object::Unbox(res) == false)\n            workerThreadState.retire = true;\n\n        il2cpp::vm::Thread::ClrState(workerThreadState.thread, static_cast<il2cpp::vm::ThreadState>(~il2cpp::vm::kThreadStateBackground));\n        if (!il2cpp::vm::Thread::TestState(workerThreadState.thread, il2cpp::vm::kThreadStateBackground))\n            il2cpp::vm::Thread::SetState(workerThreadState.thread, il2cpp::vm::kThreadStateBackground);\n    }\n}\n\nbool worker_try_create()\n{\n    ThreadPoolCounter counter;\n    Il2CppInternalThread *thread;\n    int64_t current_ticks;\n    int32_t now;\n\n    il2cpp::os::FastAutoLock lock(&g_ThreadPool->worker_creation_lock);\n\n    current_ticks = il2cpp::os::Time::GetTicks100NanosecondsMonotonic();\n    now = (int32_t)(current_ticks / (10 * 1000 * 1000));\n\n    if (current_ticks != 0)\n    {\n        if (g_ThreadPool->worker_creation_current_second != now)\n        {\n            g_ThreadPool->worker_creation_current_second = now;\n            g_ThreadPool->worker_creation_current_count = 0;\n        }\n        else\n        {\n            IL2CPP_ASSERT(g_ThreadPool->worker_creation_current_count <= WORKER_CREATION_MAX_PER_SEC);\n            if (g_ThreadPool->worker_creation_current_count == WORKER_CREATION_MAX_PER_SEC)\n            {\n                // Worker creation failed because maximum number of workers already created in the last second\n                return false;\n            }\n        }\n    }\n\n    COUNTER_ATOMIC(counter,\n    {\n        if (counter._.working >= counter._.max_working)\n        {\n            // Worked creation failed because maximum number of workers are running\n            return false;\n        }\n        counter._.working++;\n        counter._.active++;\n    });\n\n    if ((thread = il2cpp::vm::Thread::CreateInternal(worker_thread, NULL, true, 0)) != NULL)\n    {\n        g_ThreadPool->worker_creation_current_count += 1;\n        return true;\n    }\n\n    // Failed creating native thread :(\n    COUNTER_ATOMIC(counter,\n    {\n        counter._.working--;\n        counter._.active--;\n    });\n\n    return false;\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/ThreadPoolWorkerThread.h",
    "content": "#pragma once\n\n#if NET_4_0\n\nbool worker_try_create();\n\n#endif // NET_4_0\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/threadpool-ms-io-poll.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if NET_4_0\n#include \"gc/GarbageCollector.h\"\n#include \"mono/ThreadPool/threadpool-ms-io-poll.h\"\n#include \"os/Socket.h\"\n#include \"utils/Memory.h\"\n#include \"vm/Thread.h\"\n#include \"vm/ThreadPool.h\"\n\n#include <vector>\n\nstatic std::vector<il2cpp::os::PollRequest> *poll_fds;\nstatic unsigned int poll_fds_capacity;\nstatic unsigned int poll_fds_size;\n\nstatic inline void\nPOLL_INIT_FD(il2cpp::os::PollRequest *poll_fd, int fd, il2cpp::os::PollFlags events)\n{\n    poll_fd->fd = fd;\n    poll_fd->events = events;\n    poll_fd->revents = il2cpp::os::kPollFlagsNone;\n}\n\nbool poll_init(int wakeup_pipe_fd)\n{\n    IL2CPP_ASSERT(wakeup_pipe_fd >= 0);\n\n    poll_fds_size = 1;\n    poll_fds_capacity = 64;\n\n    poll_fds = new std::vector<il2cpp::os::PollRequest>(poll_fds_capacity);\n\n    POLL_INIT_FD(&(*poll_fds)[0], wakeup_pipe_fd, il2cpp::os::kPollFlagsIn);\n\n    return true;\n}\n\nvoid poll_register_fd(int fd, int events, bool is_new)\n{\n    unsigned int i;\n    il2cpp::os::PollFlags poll_event;\n\n    IL2CPP_ASSERT(fd >= 0);\n    IL2CPP_ASSERT(poll_fds_size <= poll_fds_capacity);\n\n    IL2CPP_ASSERT((events & ~(EVENT_IN | EVENT_OUT)) == 0);\n\n    poll_event = il2cpp::os::kPollFlagsNone;\n    if (events & EVENT_IN)\n        poll_event |= il2cpp::os::kPollFlagsIn;\n    if (events & EVENT_OUT)\n        poll_event |= il2cpp::os::kPollFlagsOut;\n\n    for (i = 0; i < poll_fds_size; ++i)\n    {\n        if ((*poll_fds)[i].fd == fd)\n        {\n            IL2CPP_ASSERT(!is_new);\n            POLL_INIT_FD(&(*poll_fds)[i], fd, poll_event);\n            return;\n        }\n    }\n\n    IL2CPP_ASSERT(is_new);\n\n    for (i = 0; i < poll_fds_size; ++i)\n    {\n        if ((*poll_fds)[i].fd == -1)\n        {\n            POLL_INIT_FD(&(*poll_fds)[i], fd, poll_event);\n            return;\n        }\n    }\n\n    poll_fds_size += 1;\n\n    if (poll_fds_size > poll_fds_capacity)\n    {\n        poll_fds_capacity *= 2;\n        IL2CPP_ASSERT(poll_fds_size <= poll_fds_capacity);\n\n        poll_fds->reserve(poll_fds_capacity);\n    }\n\n    POLL_INIT_FD(&(*poll_fds)[poll_fds_size - 1], fd, poll_event);\n}\n\nvoid poll_remove_fd(int fd)\n{\n    unsigned int i;\n\n    IL2CPP_ASSERT(fd >= 0);\n\n    for (i = 0; i < poll_fds_size; ++i)\n    {\n        if ((*poll_fds)[i].fd == fd)\n        {\n            POLL_INIT_FD(&(*poll_fds)[i], -1, il2cpp::os::kPollFlagsNone);\n            break;\n        }\n    }\n\n    /* if we don't find the fd in poll_fds,\n     * it means we try to delete it twice */\n    IL2CPP_ASSERT(i < poll_fds_size);\n\n    /* if we find it again, it means we added\n     * it twice */\n    for (; i < poll_fds_size; ++i)\n        IL2CPP_ASSERT((*poll_fds)[i].fd != fd);\n\n    /* reduce the value of poll_fds_size so we\n     * do not keep it too big */\n    while (poll_fds_size > 1 && (*poll_fds)[poll_fds_size - 1].fd == -1)\n        poll_fds_size -= 1;\n}\n\nstatic inline int\npoll_mark_bad_fds(std::vector<il2cpp::os::PollRequest> *poll_fds, int poll_fds_size)\n{\n    int i, ready = 0;\n    int32_t result, error = 0;\n\n    for (i = 0; i < poll_fds_size; i++)\n    {\n        if ((*poll_fds)[i].fd == -1)\n            continue;\n\n        il2cpp::os::WaitStatus status = il2cpp::os::Socket::Poll((*poll_fds)[i], 0, &result, &error);\n\n        if (status == il2cpp::os::kWaitStatusFailure)\n        {\n            if ((il2cpp::os::SocketError)error == il2cpp::os::kInvalidHandle)\n            {\n                (*poll_fds)[i].revents |= il2cpp::os::kPollFlagsNVal;\n                ready++;\n            }\n        }\n        else if (result > 0)\n            ready++;\n    }\n\n    return ready;\n}\n\nint poll_event_wait(void (*callback)(int fd, int events, void* user_data), void* user_data)\n{\n    unsigned int i;\n\n    for (i = 0; i < poll_fds_size; ++i)\n        (*poll_fds)[i].revents = il2cpp::os::kPollFlagsNone;\n\n    il2cpp::gc::GarbageCollector::SetSkipThread(true);\n\n    int32_t ready;\n    int32_t error;\n    il2cpp::os::WaitStatus status = il2cpp::os::Socket::Poll((*poll_fds), poll_fds_size , -1, &ready, &error);\n\n    il2cpp::gc::GarbageCollector::SetSkipThread(false);\n\n    if (ready == -1 || status == il2cpp::os::kWaitStatusFailure)\n    {\n        /*\n         * Apart from EINTR, we only check EBADF, for the rest:\n         *  EINVAL: mono_poll() 'protects' us from descriptor\n         *      numbers above the limit if using select() by marking\n         *      then as POLLERR.  If a system poll() is being\n         *      used, the number of descriptor we're passing will not\n         *      be over sysconf(_SC_OPEN_MAX), as the error would have\n         *      happened when opening.\n         *\n         *  EFAULT: we own the memory pointed by pfds.\n         *  ENOMEM: we're doomed anyway\n         *\n         */\n\n        if ((il2cpp::os::SocketError)error == il2cpp::os::kInterrupted)\n        {\n            il2cpp::vm::Thread::CheckCurrentThreadForInterruptAndThrowIfNecessary();\n            ready = 0;\n        }\n        else if ((il2cpp::os::SocketError)error == il2cpp::os::kInvalidHandle)\n        {\n            ready = poll_mark_bad_fds(poll_fds, poll_fds_size);\n        }\n    }\n\n    if (ready == -1)\n        return -1;\n    if (ready == 0)\n        return 0;\n\n    IL2CPP_ASSERT(ready > 0);\n\n    for (i = 0; i < poll_fds_size; ++i)\n    {\n        int fd, events = 0;\n\n        if ((*poll_fds)[i].fd == -1)\n            continue;\n        if ((*poll_fds)[i].revents == 0)\n            continue;\n\n        fd = (int)(*poll_fds)[i].fd;\n        if ((*poll_fds)[i].revents & (il2cpp::os::kPollFlagsIn | il2cpp::os::kPollFlagsErr | il2cpp::os::kPollFlagsHup | il2cpp::os::kPollFlagsNVal))\n            events |= EVENT_IN;\n        if ((*poll_fds)[i].revents & (il2cpp::os::kPollFlagsOut | il2cpp::os::kPollFlagsErr | il2cpp::os::kPollFlagsHup | il2cpp::os::kPollFlagsNVal))\n            events |= EVENT_OUT;\n        if ((*poll_fds)[i].revents & (il2cpp::os::kPollFlagsErr | il2cpp::os::kPollFlagsHup | il2cpp::os::kPollFlagsNVal))\n            events |= EVENT_ERR;\n\n        callback(fd, events, user_data);\n\n        if (--ready == 0)\n            break;\n    }\n\n    return 0;\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/threadpool-ms-io-poll.h",
    "content": "#pragma once\n#if NET_4_0\n\n#include \"il2cpp-config.h\"\n\nbool poll_init(int wakeup_pipe_fd);\n\nvoid poll_register_fd(int fd, int events, bool is_new);\n\nint poll_event_wait(void(*callback)(int fd, int events, void* user_data), void* user_data);\n\nvoid poll_remove_fd(int fd);\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/threadpool-ms-io.cpp",
    "content": "/*\n * threadpool-ms-io.c: Microsoft IO threadpool runtime support\n *\n * Author:\n *\tLudovic Henry (ludovic.henry@xamarin.com)\n *\n * Copyright 2015 Xamarin, Inc (http://www.xamarin.com)\n * Licensed under the MIT license. See LICENSE file in the project root for full license information.\n */\n#include \"il2cpp-config.h\"\n\n#if NET_4_0\n\n#ifndef DISABLE_SOCKETS\n\n#if IL2CPP_PLATFORM_WIN32\n#include \"os/Win32/WindowsHeaders.h\"\n#else\n#include <errno.h>\n#include <fcntl.h>\n#endif\n\n#include <vector>\n\n#include \"gc/Allocator.h\"\n#include \"mono/ThreadPool/threadpool-ms.h\"\n#include \"mono/ThreadPool/threadpool-ms-io.h\"\n#include \"mono/ThreadPool/threadpool-ms-io-poll.h\"\n#include \"object-internals.h\"\n#include \"os/ConditionVariable.h\"\n#include \"os/Mutex.h\"\n#include \"os/Socket.h\"\n#include \"utils/CallOnce.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Thread.h\"\n#include \"vm/ThreadPool.h\"\n\n#define UPDATES_CAPACITY 128\n\ntypedef std::vector<Il2CppObject*, il2cpp::gc::Allocator<Il2CppObject*> > ManagedList;\n\nstruct ThreadPoolStateHasher\n{\n\tsize_t operator()(int thread) const\n\t{\n\t\treturn thread;\n\t}\n};\n\ntypedef Il2CppHashMap<int, ManagedList*, ThreadPoolStateHasher> ThreadPoolStateHash;\n\ntypedef enum {\n\tUPDATE_EMPTY = 0,\n\tUPDATE_ADD,\n\tUPDATE_REMOVE_SOCKET,\n\tUPDATE_REMOVE_DOMAIN,\n} ThreadPoolIOUpdateType;\n\ntypedef struct {\n\tint fd;\n\tIl2CppIOSelectorJob *job;\n} ThreadPoolIOUpdate_Add;\n\ntypedef struct {\n\tint fd;\n} ThreadPoolIOUpdate_RemoveSocket;\n\ntypedef struct {\n\tIl2CppDomain *domain;\n} ThreadPoolIOUpdate_RemoveDomain;\n\ntypedef struct {\n\tThreadPoolIOUpdateType type;\n\tunion {\n\t\tThreadPoolIOUpdate_Add add;\n\t\tThreadPoolIOUpdate_RemoveSocket remove_socket;\n\t\tThreadPoolIOUpdate_RemoveDomain remove_domain;\n\t} data;\n} ThreadPoolIOUpdate;\n\ntypedef struct {\n\til2cpp::vm::ThreadPool::ThreadPoolIOBackend backend;\n\n\tThreadPoolIOUpdate* updates;\n\tint updates_size;\n\til2cpp::os::FastMutex updates_lock;\n\til2cpp::os::ConditionVariable updates_cond;\n\til2cpp::os::Socket* wakeup_pipes [2];\n} ThreadPoolIO;\n\nstatic il2cpp::utils::OnceFlag lazy_init_io_status;\n\nstatic bool io_selector_running = false;\n\nstatic ThreadPoolIO* threadpool_io;\n\nstatic il2cpp::vm::ThreadPool::ThreadPoolIOBackend backend_poll = { poll_init, poll_register_fd, poll_remove_fd, poll_event_wait };\n\nstatic Il2CppIOSelectorJob* get_job_for_event (ManagedList *list, int32_t event)\n{\n\tIL2CPP_ASSERT(list);\n\tIl2CppIOSelectorJob* foundJob = NULL;\n\tint matchIndex = -1;\n\tfor (size_t i = 0; i < list->size(); i++)\n\t{\n\t\tIl2CppIOSelectorJob *job = (Il2CppIOSelectorJob*)(*list)[i];\n\t\tif (job->operation == event)\n\t\t{\n\t\t\tfoundJob = job;\n\t\t\tmatchIndex = (int)i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (foundJob == NULL)\n\t\treturn NULL;\n\n\tlist->erase(list->begin() + matchIndex);\n\n\treturn foundJob;\n}\n\nstatic int get_operations_for_jobs (ManagedList *list)\n{\n\tint operations = 0;\n\n\tfor (size_t i = 0; i < list->size(); i++)\n\t{\n\t\toperations |= ((Il2CppIOSelectorJob*)(*list)[i])->operation;\n\t}\n\n\treturn operations;\n}\n\nstatic void selector_thread_wakeup (void)\n{\n\tconst char msg = 'c';\n\n\tfor (;;)\n\t{\n\t\tint32_t written = 0;\n\t\tconst il2cpp::os::WaitStatus status = threadpool_io->wakeup_pipes[1]->Send((const uint8_t*)&msg, 1, il2cpp::os::kSocketFlagsNone, &written);\n\t\tif (written == 1)\n\t\t\tbreak;\n\t\tif (written == -1)\n\t\t{\n\t\t\t//g_warning (\"selector_thread_wakeup: write () failed, error (%d)\\n\", WSAGetLastError ());\n\t\t\tbreak;\n\t\t}\n\n\t\tif (status == il2cpp::os::kWaitStatusFailure)\n\t\t\tbreak;\n\t}\n}\n\nstatic void selector_thread_wakeup_drain_pipes (void)\n{\n\tuint8_t buffer [128];\n\n\tfor (;;) {\n\t\tint32_t received;\n\t\til2cpp::os::WaitStatus status = threadpool_io->wakeup_pipes[0]->Receive(buffer, 128, il2cpp::os::kSocketFlagsNone, &received);\n\t\tif (received == 0)\n\t\t\tbreak;\n\t\tif (status == il2cpp::os::kWaitStatusFailure)\n\t\t\tbreak;\n\t}\n}\n\ntypedef struct {\n\tIl2CppDomain *domain;\n\tThreadPoolStateHash *states;\n} FilterSockaresForDomainData;\n\nstatic void filter_jobs_for_domain (void* key, void* value, void* user_data)\n{\n\t//FilterSockaresForDomainData *data;\n\t//MonoMList *list = (MonoMList *)value, *element;\n\t//MonoDomain *domain;\n\t//MonoGHashTable *states;\n\n\t//IL2CPP_ASSERT(user_data);\n\t//data = (FilterSockaresForDomainData *)user_data;\n\t//domain = data->domain;\n\t//states = data->states;\n\n\t//for (element = list; element; element = mono_mlist_next (element)) {\n\t//\tIl2CppIOSelectorJob *job = (Il2CppIOSelectorJob*) mono_mlist_get_data (element);\n\t//\tif (il2cpp::vm::Domain::GetCurrent() == domain)\n\t//\t\tmono_mlist_set_data (element, NULL);\n\t//}\n\n\t///* we skip all the first elements which are NULL */\n\t//for (; list; list = mono_mlist_next (list)) {\n\t//\tif (mono_mlist_get_data (list))\n\t//\t\tbreak;\n\t//}\n\n\t//if (list) {\n\t//\tIL2CPP_ASSERT(mono_mlist_get_data (list));\n\n\t//\t/* we delete all the NULL elements after the first one */\n\t//\tfor (element = list; element;) {\n\t//\t\tMonoMList *next;\n\t//\t\tif (!(next = mono_mlist_next (element)))\n\t//\t\t\tbreak;\n\t//\t\tif (mono_mlist_get_data (next))\n\t//\t\t\telement = next;\n\t//\t\telse\n\t//\t\t\tmono_mlist_set_next (element, mono_mlist_next (next));\n\t//\t}\n\t//}\n\n\t//mono_g_hash_table_replace (states, key, list);\n\tNOT_IMPLEMENTED(\"TODO\");\n}\n\nstatic void wait_callback (int fd, int events, void* user_data)\n{\n\t//Il2CppError error;\n\n\tif (il2cpp::vm::Runtime::IsShuttingDown ())\n\t\treturn;\n\n\tif (fd == threadpool_io->wakeup_pipes [0]->GetDescriptor()) {\n\t\t//mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_THREADPOOL, \"io threadpool: wke\");\n\t\tselector_thread_wakeup_drain_pipes ();\n\t} else {\n\t\tThreadPoolStateHash *states;\n\t\tManagedList *list = NULL;\n\t\t//void* k;\n\t\tbool remove_fd = false;\n\t\tint operations;\n\n\t\tIL2CPP_ASSERT(user_data);\n\t\tstates = (ThreadPoolStateHash *)user_data;\n\n\t\t/*mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_THREADPOOL, \"io threadpool: cal fd %3d, events = %2s | %2s | %3s\",\n\t\t\tfd, (events & EVENT_IN) ? \"RD\" : \"..\", (events & EVENT_OUT) ? \"WR\" : \"..\", (events & EVENT_ERR) ? \"ERR\" : \"...\");*/\n\n\t\tThreadPoolStateHash::iterator iter = states->find(fd);\n\t\tbool exists = iter != states->end();\n\n\t\tif (!exists)\n\t\t\tIL2CPP_ASSERT(\"wait_callback: fd not found in states table\");\n\t\telse\n\t\t\tlist = iter->second;\n\n\t\tif (list && (events & EVENT_IN) != 0) {\n\t\t\tIl2CppIOSelectorJob *job = get_job_for_event (list, EVENT_IN);\n\t\t\tif (job) {\n\t\t\t\tthreadpool_ms_enqueue_work_item (il2cpp::vm::Domain::GetCurrent(), (Il2CppObject*) job);\n\t\t\t}\n\n\t\t}\n\t\tif (list && (events & EVENT_OUT) != 0) {\n\t\t\tIl2CppIOSelectorJob *job = get_job_for_event (list, EVENT_OUT);\n\t\t\tif (job) {\n\t\t\t\tthreadpool_ms_enqueue_work_item (il2cpp::vm::Domain::GetCurrent(), (Il2CppObject*) job);\n\t\t\t}\n\t\t}\n\n\t\tremove_fd = (events & EVENT_ERR) == EVENT_ERR;\n\t\tif (!remove_fd) {\n\t\t\t//mono_g_hash_table_replace (states, int_TO_POINTER (fd), list);\n\t\t\tstates->insert(ThreadPoolStateHash::value_type(fd, list));\n\n\t\t\toperations = get_operations_for_jobs (list);\n\n\t\t\t/*mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_THREADPOOL, \"io threadpool: res fd %3d, events = %2s | %2s | %3s\",\n\t\t\t\tfd, (operations & EVENT_IN) ? \"RD\" : \"..\", (operations & EVENT_OUT) ? \"WR\" : \"..\", (operations & EVENT_ERR) ? \"ERR\" : \"...\");*/\n\n\t\t\tthreadpool_io->backend.register_fd (fd, operations, false);\n\t\t} else {\n\t\t\t//mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_THREADPOOL, \"io threadpool: err fd %d\", fd);\n\t\t\tstates->erase(ThreadPoolStateHash::key_type(fd));\n\t\t\t//mono_g_hash_table_remove (states, int_TO_POINTER (fd));\n\n\t\t\tthreadpool_io->backend.remove_fd (fd);\n\t\t}\n\t}\n}\n\nstatic void selector_thread (void* data)\n{\n\t//Il2CppError error;\n\tThreadPoolStateHash *states;\n\n\tio_selector_running = true;\n\n\tif (il2cpp::vm::Runtime::IsShuttingDown ()) {\n\t\tio_selector_running = false;\n\t\treturn;\n\t}\n\n\tstates = new ThreadPoolStateHash();\n\t//states = mono_g_hash_table_new_type (g_direct_hash, g_direct_equal, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_THREAD_POOL, \"i/o thread pool states table\");\n\n\tfor (;;) {\n\t\tint i, j;\n\t\tint res;\n\n\t\tthreadpool_io->updates_lock.Lock();\n\n\t\tfor (i = 0; i < threadpool_io->updates_size; ++i) {\n\t\t\tThreadPoolIOUpdate *update = &threadpool_io->updates [i];\n\n\t\t\tswitch (update->type) {\n\t\t\tcase UPDATE_EMPTY:\n\t\t\t\tbreak;\n\t\t\tcase UPDATE_ADD: {\n\t\t\t\tint fd;\n\t\t\t\tint operations;\n\t\t\t\t//void* k;\n\t\t\t\tbool exists;\n\t\t\t\tManagedList *list = NULL;\n\t\t\t\tIl2CppIOSelectorJob *job;\n\n\t\t\t\tfd = update->data.add.fd;\n\t\t\t\tIL2CPP_ASSERT(fd >= 0);\n\n\t\t\t\tjob = update->data.add.job;\n\t\t\t\tIL2CPP_ASSERT(job);\n\n\t\t\t\tThreadPoolStateHash::iterator iter = states->find(fd);\n\t\t\t\texists = iter != states->end();\n\n\t\t\t\tif (!exists)\n\t\t\t\t\tlist = new ManagedList();\n\t\t\t\telse\n\t\t\t\t\tlist = iter->second;\n\n\t\t\t\t//exists = mono_g_hash_table_lookup_extended (states, int_TO_POINTER (fd), &k, (void**) &list);\n\t\t\t\tlist->push_back((Il2CppObject*)job);\n\t\t\t\tstates->insert(ThreadPoolStateHash::value_type(fd, list));\n\t\t\t\t//mono_g_hash_table_replace (states, int_TO_POINTER (fd), list);\n\n\t\t\t\toperations = get_operations_for_jobs (list);\n\n\t\t\t\t/*mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_THREADPOOL, \"io threadpool: %3s fd %3d, operations = %2s | %2s | %3s\",\n\t\t\t\t\texists ? \"mod\" : \"add\", fd, (operations & EVENT_IN) ? \"RD\" : \"..\", (operations & EVENT_OUT) ? \"WR\" : \"..\", (operations & EVENT_ERR) ? \"ERR\" : \"...\");*/\n\n\t\t\t\tthreadpool_io->backend.register_fd (fd, operations, !exists);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase UPDATE_REMOVE_SOCKET: {\n\t\t\t\tint fd;\n\t\t\t\t//void* k;\n\t\t\t\tManagedList *list = NULL;\n\n\t\t\t\tfd = update->data.remove_socket.fd;\n\t\t\t\tIL2CPP_ASSERT(fd >= 0);\n\n\t\t\t\tThreadPoolStateHash::iterator iter = states->find(fd);\n\t\t\t\tbool exists = iter != states->end();\n\n\t\t\t\t/*if (mono_g_hash_table_lookup_extended (states, int_TO_POINTER (fd), &k, (void**) &list))*/\n\t\t\t\tif (exists)\n\t\t\t\t{\n\t\t\t\t\tstates->erase(ThreadPoolStateHash::key_type(fd));\n\t\t\t\t\t//mono_g_hash_table_remove (states, int_TO_POINTER (fd));\n\n\t\t\t\t\tfor (j = i + 1; j < threadpool_io->updates_size; ++j) {\n\t\t\t\t\t\tThreadPoolIOUpdate *update = &threadpool_io->updates [j];\n\t\t\t\t\t\tif (update->type == UPDATE_ADD && update->data.add.fd == fd)\n\t\t\t\t\t\t\tmemset (update, 0, sizeof (ThreadPoolIOUpdate));\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (size_t i = 0; i < list->size(); i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tthreadpool_ms_enqueue_work_item(il2cpp::vm::Domain::GetCurrent(), (*list)[i]);\n\t\t\t\t\t}\n\n\t\t\t\t\tlist->clear();\n\n\t\t\t\t\t//mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_THREADPOOL, \"io threadpool: del fd %3d\", fd);\n\t\t\t\t\tthreadpool_io->backend.remove_fd (fd);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase UPDATE_REMOVE_DOMAIN: {\n\t\t\t\tIl2CppDomain *domain;\n\n\t\t\t\tdomain = update->data.remove_domain.domain;\n\t\t\t\tIL2CPP_ASSERT(domain);\n\n\t\t\t\tFilterSockaresForDomainData user_data = { domain, states };\n\t\t\t\t//mono_g_hash_table_foreach (states, filter_jobs_for_domain, &user_data);\n\n\t\t\t\tfor (j = i + 1; j < threadpool_io->updates_size; ++j) {\n\t\t\t\t\tThreadPoolIOUpdate *update = &threadpool_io->updates [j];\n\t\t\t\t\tif (update->type == UPDATE_ADD && il2cpp::vm::Domain::GetCurrent() == domain)\n\t\t\t\t\t\tmemset (update, 0, sizeof (ThreadPoolIOUpdate));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tIL2CPP_ASSERT(0 && \"Should not be reached\");\n\t\t\t}\n\t\t}\n\n\t\tthreadpool_io->updates_cond.Broadcast();\n\n\t\tif (threadpool_io->updates_size > 0) {\n\t\t\tthreadpool_io->updates_size = 0;\n\t\t\tmemset (threadpool_io->updates, 0, UPDATES_CAPACITY * sizeof (ThreadPoolIOUpdate));\n\t\t}\n\n\t\tthreadpool_io->updates_lock.Unlock();\n\n\t\t//mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_THREADPOOL, \"io threadpool: wai\");\n\n\t\tres = threadpool_io->backend.event_wait (wait_callback, states);\n\n\t\tif (res == -1 || il2cpp::vm::Runtime::IsShuttingDown ())\n\t\t\tbreak;\n\t}\n\n\tdelete states;\n\n\tio_selector_running = false;\n}\n\n/* Locking: threadpool_io->updates_lock must be held */\nstatic ThreadPoolIOUpdate* update_get_new (void)\n{\n\tThreadPoolIOUpdate *update = NULL;\n\tIL2CPP_ASSERT(threadpool_io->updates_size <= UPDATES_CAPACITY);\n\n\twhile (threadpool_io->updates_size == UPDATES_CAPACITY) {\n\t\t/* we wait for updates to be applied in the selector_thread and we loop\n\t\t * as long as none are available. if it happends too much, then we need\n\t\t * to increase UPDATES_CAPACITY */\n\t\tthreadpool_io->updates_cond.Wait(&threadpool_io->updates_lock);\n\t}\n\n\tIL2CPP_ASSERT(threadpool_io->updates_size < UPDATES_CAPACITY);\n\n\tupdate = &threadpool_io->updates [threadpool_io->updates_size ++];\n\n\treturn update;\n}\n\nstatic void wakeup_pipes_init(void)\n{\n\til2cpp::os::Socket serverSock(NULL);\n\n\tserverSock.Create(il2cpp::os::kAddressFamilyInterNetwork, il2cpp::os::kSocketTypeStream, il2cpp::os::kProtocolTypeTcp);\n\n\tthreadpool_io->wakeup_pipes[1] = new il2cpp::os::Socket(NULL);\n\til2cpp::os::WaitStatus status = threadpool_io->wakeup_pipes[1]->Create(il2cpp::os::kAddressFamilyInterNetwork, il2cpp::os::kSocketTypeStream, il2cpp::os::kProtocolTypeTcp);\n\tIL2CPP_ASSERT(status != il2cpp::os::kWaitStatusFailure);\n\n\tif (serverSock.Bind(\"127.0.0.1\", 0) == il2cpp::os::kWaitStatusFailure)\n\t{\n\t\tserverSock.Close();\n\t\tIL2CPP_ASSERT(0 && \"wakeup_pipes_init: bind () failed\");\n\t}\n\n\til2cpp::os::EndPointInfo info;\n\tmemset(&info, 0x00, sizeof(il2cpp::os::EndPointInfo));\n\tif (serverSock.GetLocalEndPointInfo(info) == il2cpp::os::kWaitStatusFailure)\n\t{\n\t\tserverSock.Close();\n\t\tIL2CPP_ASSERT(0 && \"wakeup_pipes_init: getsockname () failed\");\n\t}\n\n\tif (serverSock.Listen(1024) == il2cpp::os::kWaitStatusFailure)\n\t{\n\t\tserverSock.Close();\n\t\tIL2CPP_ASSERT(0 && \"wakeup_pipes_init: listen () failed\");\n\t}\n\n\tif (threadpool_io->wakeup_pipes[1]->Connect(info.data.inet.address, info.data.inet.port) == il2cpp::os::kWaitStatusFailure)\n\t{\n\t\tserverSock.Close();\n\t\tIL2CPP_ASSERT(0 && \"wakeup_pipes_init: connect () failed\");\n\t}\n\n\tstatus = serverSock.Accept(&threadpool_io->wakeup_pipes[0]);\n\tIL2CPP_ASSERT(status != il2cpp::os::kWaitStatusFailure);\n\n\tstatus = threadpool_io->wakeup_pipes[0]->SetBlocking(false);\n\n\tif (status == il2cpp::os::kWaitStatusFailure)\n\t{\n\t\tthreadpool_io->wakeup_pipes[0]->Close();\n\t\tserverSock.Close();\n\t}\n\n\tserverSock.Close();\n}\n\nstatic bool lazy_is_initialized()\n{\n\treturn lazy_init_io_status.IsSet();\n}\n\nstatic void initialize(void* args)\n{\n\tIL2CPP_ASSERT(!threadpool_io);\n\tthreadpool_io = new ThreadPoolIO();\n\tIL2CPP_ASSERT(threadpool_io);\n\n\tthreadpool_io->updates = (ThreadPoolIOUpdate*)il2cpp::gc::GarbageCollector::AllocateFixed(sizeof(ThreadPoolIOUpdate) * UPDATES_CAPACITY, NULL);\n\n\tthreadpool_io->updates_size = 0;\n\n\tthreadpool_io->backend = backend_poll;\n//\tif (g_getenv (\"MONO_ENABLE_AIO\") != NULL) {\n//#if defined(HAVE_EPOLL)\n//\t\tthreadpool_io->backend = backend_epoll;\n//#elif defined(HAVE_KQUEUE)\n//\t\tthreadpool_io->backend = backend_kqueue;\n//#endif\n//\t}\n\n\twakeup_pipes_init ();\n\n\tif (!threadpool_io->backend.init ((int)threadpool_io->wakeup_pipes [0]->GetDescriptor()))\n\t\tIL2CPP_ASSERT(0 && \"initialize: backend->init () failed\");\n\n\tif (!il2cpp::vm::Thread::CreateInternal(selector_thread, NULL, true, SMALL_STACK))\n\t\tIL2CPP_ASSERT(0 && \"initialize: vm::Thread::CreateInternal () failed \");\n}\n\nstatic void lazy_initialize()\n{\n\til2cpp::utils::CallOnce(lazy_init_io_status, initialize, NULL);\n}\n\nstatic void cleanup (void)\n{\n\t/* we make the assumption along the code that we are\n\t * cleaning up only if the runtime is shutting down */\n\tIL2CPP_ASSERT(il2cpp::vm::Runtime::IsShuttingDown ());\n\n\tselector_thread_wakeup ();\n\twhile (io_selector_running)\n\t\til2cpp::vm::Thread::Sleep(1000);\n}\n\nvoid threadpool_ms_io_cleanup (void)\n{\n\tif (lazy_init_io_status.IsSet())\n\t\tcleanup();\n}\n\nvoid ves_icall_System_IOSelector_Add (Il2CppIntPtr handle, Il2CppIOSelectorJob *job)\n{\n\tThreadPoolIOUpdate *update;\n\n\tIL2CPP_ASSERT(handle.m_value >= 0);\n\n\tIL2CPP_ASSERT((job->operation == EVENT_IN) ^ (job->operation == EVENT_OUT));\n\tIL2CPP_ASSERT(job->callback);\n\n\tif (il2cpp::vm::Runtime::IsShuttingDown ())\n\t\treturn;\n\t/*if (mono_domain_is_unloading (mono_object_domain (job)))\n\t\treturn;*/\n\n\tlazy_initialize ();\n\n\tthreadpool_io->updates_lock.Lock();\n\n\tupdate = update_get_new ();\n\n\til2cpp::os::SocketHandleWrapper socketHandle(il2cpp::os::PointerToSocketHandle(handle.m_value));\n\n\tupdate->type = UPDATE_ADD;\n\tupdate->data.add.fd = (int)socketHandle.GetSocket()->GetDescriptor();\n\tupdate->data.add.job = job;\n\til2cpp::os::Atomic::MemoryBarrier(); /* Ensure this is safely published before we wake up the selector */\n\n\tselector_thread_wakeup ();\n\n\tthreadpool_io->updates_lock.Unlock();\n}\n\nvoid ves_icall_System_IOSelector_Remove (Il2CppIntPtr handle)\n{\n\til2cpp::os::SocketHandleWrapper socketHandle(il2cpp::os::PointerToSocketHandle(handle.m_value));\n\tthreadpool_ms_io_remove_socket ((int)socketHandle.GetSocket()->GetDescriptor());\n}\n\nvoid threadpool_ms_io_remove_socket (int fd)\n{\n\tThreadPoolIOUpdate *update;\n\n\tif (!lazy_is_initialized ())\n\t\treturn;\n\n\tthreadpool_io->updates_lock.Lock();\n\n\tupdate = update_get_new ();\n\tupdate->type = UPDATE_REMOVE_SOCKET;\n\tupdate->data.add.fd = fd;\n\til2cpp::os::Atomic::MemoryBarrier(); /* Ensure this is safely published before we wake up the selector */\n\n\tselector_thread_wakeup ();\n\n\tthreadpool_io->updates_cond.Wait(&threadpool_io->updates_lock);\n\n\tthreadpool_io->updates_lock.Unlock();\n}\n\n#else\n\nvoid ves_icall_System_IOSelector_Add (Il2CppIntPtr handle, Il2CppIOSelectorJob *job)\n{\n\tIL2CPP_ASSERT(0 && \"Should not be called\");\n}\n\nvoid ves_icall_System_IOSelector_Remove (Il2CppIntPtr handle)\n{\n\tIL2CPP_ASSERT(0 && \"Should not be called\");\n}\n\nvoid threadpool_ms_io_cleanup (void)\n{\n\tIL2CPP_ASSERT(0 && \"Should not be called\");\n}\n\nvoid threadpool_ms_io_remove_socket (int fd)\n{\n\tIL2CPP_ASSERT(0 && \"Should not be called\");\n}\n\n#endif\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/threadpool-ms-io.h",
    "content": "#pragma once\n#if NET_4_0\n\n#include \"il2cpp-config.h\"\n\nstruct Il2CppIOSelectorJob;\nstruct Il2CppIntPtr;\n\nvoid threadpool_ms_io_remove_socket(int fd);\n//void mono_threadpool_ms_io_remove_domain_jobs (MonoDomain *domain);\nvoid threadpool_ms_io_cleanup(void);\n\nLIBIL2CPP_CODEGEN_API void ves_icall_System_IOSelector_Add(Il2CppIntPtr handle, Il2CppIOSelectorJob *job);\nLIBIL2CPP_CODEGEN_API void ves_icall_System_IOSelector_Remove(Il2CppIntPtr handle);\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/threadpool-ms.cpp",
    "content": "/*\n * threadpool-ms.c: Microsoft threadpool runtime support\n *\n * Author:\n *\tLudovic Henry (ludovic.henry@xamarin.com)\n *\n * Copyright 2015 Xamarin, Inc (http://www.xamarin.com)\n * Licensed under the MIT license. See LICENSE file in the project root for full license information.\n */\n\n//\n// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n//\n// Files:\n//  - src/vm/comthreadpool.cpp\n//  - src/vm/win32threadpoolcpp\n//  - src/vm/threadpoolrequest.cpp\n//  - src/vm/hillclimbing.cpp\n//\n// Ported from C++ to C and adjusted to Mono runtime\n\n#include \"il2cpp-config.h\"\n\n#if NET_4_0\n#include <stdlib.h>\n#define _USE_MATH_DEFINES // needed by MSVC to define math constants\n#include <algorithm>\n#include <cmath>\n#include <complex>\n\n#include \"il2cpp-api.h\"\n#include \"gc/GarbageCollector.h\"\n#include \"gc/GCHandle.h\"\n#include \"icalls/mscorlib/System.Threading/ThreadPool.h\"\n#include \"icalls/mscorlib/System.Runtime.Remoting.Messaging/MonoMethodMessage.h\"\n#include \"mono/ThreadPool/threadpool-ms.h\"\n#include \"mono/ThreadPool/threadpool-ms-io.h\"\n#include \"mono/ThreadPool/ThreadPoolDataStructures.h\"\n#include \"mono/ThreadPool/ThreadPoolMacros.h\"\n#include \"mono/ThreadPool/ThreadPoolMonitorThread.h\"\n#include \"mono/ThreadPool/ThreadPoolWorkerThread.h\"\n#include \"object-internals.h\"\n#include \"os/CpuInfo.h\"\n#include \"os/Environment.h\"\n#include \"os/Mutex.h\"\n#include \"os/Time.h\"\n#include \"utils/CallOnce.h\"\n#include \"vm/Atomic.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Object.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Random.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/String.h\"\n#include \"vm/Thread.h\"\n#include \"vm/ThreadPool.h\"\n#include \"vm/WaitHandle.h\"\n\n#ifndef CLAMP\n#define CLAMP(a,low,high) (((a) < (low)) ? (low) : (((a) > (high)) ? (high) : (a)))\n#endif\n\nThreadPool* g_ThreadPool;\n\n/* The exponent to apply to the gain. 1.0 means to use linear gain,\n * higher values will enhance large moves and damp small ones.\n * default: 2.0 */\n#define HILL_CLIMBING_GAIN_EXPONENT 2.0\n\n/* The 'cost' of a thread. 0 means drive for increased throughput regardless\n * of thread count, higher values bias more against higher thread counts.\n * default: 0.15 */\n#define HILL_CLIMBING_BIAS 0.15\n\n#define HILL_CLIMBING_WAVE_PERIOD 4\n#define HILL_CLIMBING_MAX_WAVE_MAGNITUDE 20\n#define HILL_CLIMBING_WAVE_MAGNITUDE_MULTIPLIER 1.0\n#define HILL_CLIMBING_WAVE_HISTORY_SIZE 8\n#define HILL_CLIMBING_TARGET_SIGNAL_TO_NOISE_RATIO 3.0\n#define HILL_CLIMBING_MAX_CHANGE_PER_SECOND 4\n#define HILL_CLIMBING_MAX_CHANGE_PER_SAMPLE 20\n#define HILL_CLIMBING_SAMPLE_INTERVAL_LOW 10\n#define HILL_CLIMBING_SAMPLE_INTERVAL_HIGH 200\n#define HILL_CLIMBING_ERROR_SMOOTHING_FACTOR 0.01\n#define HILL_CLIMBING_MAX_SAMPLE_ERROR_PERCENT 0.15\n\nstatic il2cpp::utils::OnceFlag lazy_init_status;\n\nstatic Il2CppMethodMessage *\nmono_method_call_message_new(MethodInfo *method, void* *params, MethodInfo *invoke,\n\tIl2CppDelegate **cb, Il2CppObject **state)\n{\n\tIl2CppDomain *domain = il2cpp::vm::Domain::GetCurrent();\n\tIl2CppMethodMessage *msg;\n\tint i, count;\n\n\tmsg = (Il2CppMethodMessage *)il2cpp::vm::Object::New(il2cpp_defaults.mono_method_message_class);\n\n\tif (invoke) {\n\t\tIl2CppReflectionMethod *rm = il2cpp::vm::Reflection::GetMethodObject(invoke, NULL);\n\t\til2cpp::icalls::mscorlib::System::Runtime::Remoting::Messaging::MonoMethodMessage::InitMessage(msg, rm, NULL);\n\t\tcount = method->parameters_count - 2;\n\t}\n\telse {\n\t\tIl2CppReflectionMethod *rm = il2cpp::vm::Reflection::GetMethodObject(method, NULL);\n\t\til2cpp::icalls::mscorlib::System::Runtime::Remoting::Messaging::MonoMethodMessage::InitMessage(msg, rm, NULL);\n\t\tcount = method->parameters_count;\n\t}\n\n\tfor (i = 0; i < count; i++) {\n\t\tvoid* vpos;\n\t\tIl2CppClass *klass;\n\t\tIl2CppObject *arg;\n\t\t\n\t\t\tvpos = params[i];\n\n\t\tklass = il2cpp_class_from_type(method->parameters[i].parameter_type);\n\t\targ = (Il2CppObject*)vpos;\n\n\t\til2cpp_array_setref(msg->args, i, arg);\n\t}\n\n\tif (cb != NULL && state != NULL) {\n\t\t*cb = (Il2CppDelegate *)params[i];\n\t\ti++;\n\t\t*state = (Il2CppObject *)params[i];\n\t}\n\n\treturn msg;\n}\n\nstatic void* cpu_info_create()\n{\n\t// Note : Implementing CpuInfo on all platforms will be challenging, so for now we are going to cheat\n\t// and not actually calculate the usage\n#if IL2CPP_ENABLE_CPU_INFO\n\treturn il2cpp::os::CpuInfo::Create();\n#else\n\treturn NULL;\n#endif\n}\n\nstatic void initialize(void* arg)\n{\n\tThreadPoolHillClimbing *hc;\n\t//const char *threads_per_cpu_env;\n\tint threads_per_cpu;\n\tint threads_count;\n\n\tIL2CPP_ASSERT(!g_ThreadPool);\n\tg_ThreadPool = new ThreadPool();\n\tIL2CPP_ASSERT(g_ThreadPool);\n\n\tg_ThreadPool->parked_threads_count = 0;\n\n\tg_ThreadPool->worker_creation_current_second = -1;\n\n\tg_ThreadPool->heuristic_adjustment_interval = 10;\n\n\til2cpp::vm::Random::Open();\n\n\thc = &g_ThreadPool->heuristic_hill_climbing;\n\n\thc->wave_period = HILL_CLIMBING_WAVE_PERIOD;\n\thc->max_thread_wave_magnitude = HILL_CLIMBING_MAX_WAVE_MAGNITUDE;\n\thc->thread_magnitude_multiplier = (double) HILL_CLIMBING_WAVE_MAGNITUDE_MULTIPLIER;\n\thc->samples_to_measure = hc->wave_period * HILL_CLIMBING_WAVE_HISTORY_SIZE;\n\thc->target_throughput_ratio = (double) HILL_CLIMBING_BIAS;\n\thc->target_signal_to_noise_ratio = (double) HILL_CLIMBING_TARGET_SIGNAL_TO_NOISE_RATIO;\n\thc->max_change_per_second = (double) HILL_CLIMBING_MAX_CHANGE_PER_SECOND;\n\thc->max_change_per_sample = (double) HILL_CLIMBING_MAX_CHANGE_PER_SAMPLE;\n\thc->sample_interval_low = HILL_CLIMBING_SAMPLE_INTERVAL_LOW;\n\thc->sample_interval_high = HILL_CLIMBING_SAMPLE_INTERVAL_HIGH;\n\thc->throughput_error_smoothing_factor = (double) HILL_CLIMBING_ERROR_SMOOTHING_FACTOR;\n\thc->gain_exponent = (double) HILL_CLIMBING_GAIN_EXPONENT;\n\thc->max_sample_error = (double) HILL_CLIMBING_MAX_SAMPLE_ERROR_PERCENT;\n\thc->current_control_setting = 0;\n\thc->total_samples = 0;\n\thc->last_thread_count = 0;\n\thc->average_throughput_noise = 0;\n\thc->elapsed_since_last_change = 0;\n\thc->accumulated_completion_count = 0;\n\thc->accumulated_sample_duration = 0;\n\thc->samples = (double*)IL2CPP_MALLOC_ZERO (sizeof(double) * hc->samples_to_measure);\n\thc->thread_counts = (double*)IL2CPP_MALLOC_ZERO(sizeof(double) * hc->samples_to_measure);\n\thc->random_interval_generator = il2cpp::vm::Random::Create ();\n\thc->current_sample_interval = il2cpp::vm::Random::Next (&hc->random_interval_generator, hc->sample_interval_low, hc->sample_interval_high);\n\n\t//std::string threads_per_cpu_env = il2cpp::os::Environment::GetEnvironmentVariable(\"IL2CPP_THREADS_PER_CPU\");\n\t//if (threads_per_cpu_env.empty())\n\tthreads_per_cpu = 1;\n\t/*else\n\t\tthreads_per_cpu = CLAMP (atoi (threads_per_cpu_env.c_str()), 1, 50);*/\n\n\tthreads_count = il2cpp::os::Environment::GetProcessorCount() * threads_per_cpu;\n\n\tg_ThreadPool->limit_worker_min = g_ThreadPool->limit_io_min = threads_count;\n\n#if IL2CPP_TARGET_ANDROID || IL2CPP_TARGET_IOS\n\tg_ThreadPool->limit_worker_max = g_ThreadPool->limit_io_max = CLAMP (threads_count * 100, std::min (threads_count, 200), std::max (threads_count, 200));\n#else\n\tg_ThreadPool->limit_worker_max = g_ThreadPool->limit_io_max = threads_count * 100;\n#endif\n\n\tg_ThreadPool->counters._.max_working = g_ThreadPool->limit_worker_min;\n\n\tg_ThreadPool->cpu_usage_state = cpu_info_create();\n\n\tg_ThreadPool->suspended = false;\n}\n\nstatic void lazy_initialize()\n{\n\til2cpp::utils::CallOnce(lazy_init_status, initialize, NULL);\n}\n\nstatic void worker_kill(Il2CppInternalThread* thread)\n{\n\tif (thread == il2cpp::vm::Thread::CurrentInternal())\n\t\treturn;\n\n\til2cpp::vm::Thread::Stop(thread);\n}\n\nstatic void cleanup (void)\n{\n\tunsigned int i;\n\n\t/* we make the assumption along the code that we are\n\t * cleaning up only if the runtime is shutting down */\n\tIL2CPP_ASSERT(il2cpp::vm::Runtime::IsShuttingDown ());\n\n\twhile (GetMonitorStatus() != MONITOR_STATUS_NOT_RUNNING)\n\t\til2cpp::vm::Thread::Sleep(1);\n\n\tstd::vector<Il2CppInternalThread*> working_threads;\n\n\tg_ThreadPool->active_threads_lock.Lock();\n\tworking_threads = g_ThreadPool->working_threads;\n\tg_ThreadPool->active_threads_lock.Unlock();\n\t\n\t/* stop all threadpool->working_threads */\n\tfor (i = 0; i < working_threads.size(); ++i)\n\t\tworker_kill (working_threads[i]);\n\n\t/* unpark all g_ThreadPool->parked_threads */\n\tg_ThreadPool->parked_threads_cond.Broadcast();\n}\n\nbool threadpool_ms_enqueue_work_item (Il2CppDomain *domain, Il2CppObject *work_item)\n{\n\tstatic Il2CppClass *threadpool_class = NULL;\n\tstatic MethodInfo *unsafe_queue_custom_work_item_method = NULL;\n\t//Il2CppDomain *current_domain;\n\tbool f;\n\tvoid* args [2];\n\n\tIL2CPP_ASSERT(work_item);\n\n\tif (!threadpool_class)\n\t\tthreadpool_class = il2cpp::vm::Class::FromName(il2cpp_defaults.corlib, \"System.Threading\", \"ThreadPool\");\n\n\tif (!unsafe_queue_custom_work_item_method)\n\t\tunsafe_queue_custom_work_item_method = (MethodInfo*)il2cpp::vm::Class::GetMethodFromName(threadpool_class, \"UnsafeQueueCustomWorkItem\", 2);\n\tIL2CPP_ASSERT(unsafe_queue_custom_work_item_method);\n\n\tf = false;\n\n\targs [0] = (void*) work_item;\n\targs [1] = (void*) &f;\n\n\tIl2CppObject *result = il2cpp::vm::Runtime::InvokeWithThrow(unsafe_queue_custom_work_item_method, NULL, args);\n\treturn true;\n}\n\n/* LOCKING: threadpool->domains_lock must be held */\nstatic ThreadPoolDomain* domain_get(Il2CppDomain *domain, bool create)\n{\n\tThreadPoolDomain *tpdomain = NULL;\n\tunsigned int i;\n\n\tIL2CPP_ASSERT(domain);\n\n\tfor (i = 0; i < g_ThreadPool->domains.size(); ++i) {\n\t\ttpdomain = g_ThreadPool->domains[i];\n\t\tif (tpdomain->domain == domain)\n\t\t\treturn tpdomain;\n\t}\n\n\tif (create) {\n\t\ttpdomain = new ThreadPoolDomain();\n\t\ttpdomain->domain = domain;\n\t\tg_ThreadPool->domains.push_back(tpdomain);\n\t}\n\n\treturn tpdomain;\n}\n\nbool worker_try_unpark()\n{\n\til2cpp::os::FastAutoLock lock(&g_ThreadPool->active_threads_lock);\n\n\tif (g_ThreadPool->parked_threads_count == 0)\n\t\treturn false;\n\n\tg_ThreadPool->parked_threads_cond.Signal();\n\treturn true;\n}\n\nstatic bool worker_request (Il2CppDomain *domain)\n{\n\tThreadPoolDomain *tpdomain;\n\n\tIL2CPP_ASSERT(domain);\n\tIL2CPP_ASSERT(g_ThreadPool);\n\n\tif (il2cpp::vm::Runtime::IsShuttingDown ())\n\t\treturn false;\n\n\tg_ThreadPool->domains_lock.Lock();\n\n\t/* synchronize check with worker_thread */\n\t//if (mono_domain_is_unloading (domain)) {\n\t\t//mono_coop_mutex_unlock (&threadpool->domains_lock);\n\t\t/*return false;\n\t}*/\n\n\ttpdomain = domain_get (domain, true);\n\tIL2CPP_ASSERT(tpdomain);\n\ttpdomain->outstanding_request ++;\n\n\t/*mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, \"[%p] request worker, domain = %p, outstanding_request = %d\",\n\t\tmono_native_thread_id_get (), tpdomain->domain, tpdomain->outstanding_request);*/\n\n\tg_ThreadPool->domains_lock.Unlock();\n\n\tif (g_ThreadPool->suspended)\n\t\treturn false;\n\n\tmonitor_ensure_running ();\n\n\tif (worker_try_unpark ()) {\n\t\t//mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, \"[%p] request worker, unparked\", mono_native_thread_id_get ());\n\t\treturn true;\n\t}\n\n\tif (worker_try_create ()) {\n\t\t//mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, \"[%p] request worker, created\", mono_native_thread_id_get ());\n\t\treturn true;\n\t}\n\n\t//mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, \"[%p] request worker, failed\", mono_native_thread_id_get ());\n\treturn false;\n}\n\nstatic void hill_climbing_change_thread_count (int16_t new_thread_count, ThreadPoolHeuristicStateTransition transition)\n{\n\tThreadPoolHillClimbing *hc;\n\n\tIL2CPP_ASSERT(g_ThreadPool);\n\n\thc = &g_ThreadPool->heuristic_hill_climbing;\n\n\t//mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_THREADPOOL, \"[%p] hill climbing, change max number of threads %d\", mono_native_thread_id_get (), new_thread_count);\n\n\thc->last_thread_count = new_thread_count;\n\thc->current_sample_interval = il2cpp::vm::Random::Next(&hc->random_interval_generator, hc->sample_interval_low, hc->sample_interval_high);\n\thc->elapsed_since_last_change = 0;\n\thc->completions_since_last_change = 0;\n}\n\nvoid hill_climbing_force_change (int16_t new_thread_count, ThreadPoolHeuristicStateTransition transition)\n{\n\tThreadPoolHillClimbing *hc;\n\n\tIL2CPP_ASSERT(g_ThreadPool);\n\n\thc = &g_ThreadPool->heuristic_hill_climbing;\n\n\tif (new_thread_count != hc->last_thread_count) {\n\t\thc->current_control_setting += new_thread_count - hc->last_thread_count;\n\t\thill_climbing_change_thread_count (new_thread_count, transition);\n\t}\n}\n\nstatic std::complex<double> hill_climbing_get_wave_component (double *samples, unsigned int sample_count, double period)\n{\n\tThreadPoolHillClimbing *hc;\n\tdouble w, cosine, sine, coeff, q0, q1, q2;\n\tunsigned int i;\n\n\tIL2CPP_ASSERT(g_ThreadPool);\n\tIL2CPP_ASSERT(sample_count >= period);\n\tIL2CPP_ASSERT(period >= 2);\n\n\thc = &g_ThreadPool->heuristic_hill_climbing;\n\n\tw = 2.0 * M_PI / period;\n\tcosine = cos (w);\n\tsine = sin (w);\n\tcoeff = 2.0 * cosine;\n\tq0 = q1 = q2 = 0;\n\n\tfor (i = 0; i < sample_count; ++i) {\n\t\tq0 = coeff * q1 - q2 + samples [(hc->total_samples - sample_count + i) % hc->samples_to_measure];\n\t\tq2 = q1;\n\t\tq1 = q0;\n\t}\n\n\treturn (std::complex<double> (q1 - q2 * cosine, (q2 * sine)) / ((double)sample_count));\n}\n\nstatic int16_t hill_climbing_update (int16_t current_thread_count, uint32_t sample_duration, int32_t completions, int64_t *adjustment_interval)\n{\n\tThreadPoolHillClimbing *hc;\n\tThreadPoolHeuristicStateTransition transition;\n\tdouble throughput;\n\tdouble throughput_error_estimate;\n\tdouble confidence;\n\tdouble move;\n\tdouble gain;\n\tint sample_index;\n\tint sample_count;\n\tint new_thread_wave_magnitude;\n\tint new_thread_count;\n\tstd::complex<double> thread_wave_component;\n\tstd::complex<double> throughput_wave_component;\n\tstd::complex<double> ratio;\n\n\tIL2CPP_ASSERT(g_ThreadPool);\n\tIL2CPP_ASSERT(adjustment_interval);\n\n\thc = &g_ThreadPool->heuristic_hill_climbing;\n\n\t/* If someone changed the thread count without telling us, update our records accordingly. */\n\tif (current_thread_count != hc->last_thread_count)\n\t\thill_climbing_force_change (current_thread_count, TRANSITION_INITIALIZING);\n\n\t/* Update the cumulative stats for this thread count */\n\thc->elapsed_since_last_change += sample_duration;\n\thc->completions_since_last_change += completions;\n\n\t/* Add in any data we've already collected about this sample */\n\tsample_duration += (uint32_t)hc->accumulated_sample_duration;\n\tcompletions += hc->accumulated_completion_count;\n\n\t/* We need to make sure we're collecting reasonably accurate data. Since we're just counting the end\n\t * of each work item, we are goinng to be missing some data about what really happened during the\n\t * sample interval. The count produced by each thread includes an initial work item that may have\n\t * started well before the start of the interval, and each thread may have been running some new\n\t * work item for some time before the end of the interval, which did not yet get counted. So\n\t * our count is going to be off by +/- threadCount workitems.\n\t *\n\t * The exception is that the thread that reported to us last time definitely wasn't running any work\n\t * at that time, and the thread that's reporting now definitely isn't running a work item now. So\n\t * we really only need to consider threadCount-1 threads.\n\t *\n\t * Thus the percent error in our count is +/- (threadCount-1)/numCompletions.\n\t *\n\t * We cannot rely on the frequency-domain analysis we'll be doing later to filter out this error, because\n\t * of the way it accumulates over time. If this sample is off by, say, 33% in the negative direction,\n\t * then the next one likely will be too. The one after that will include the sum of the completions\n\t * we missed in the previous samples, and so will be 33% positive. So every three samples we'll have\n\t * two \"low\" samples and one \"high\" sample. This will appear as periodic variation right in the frequency\n\t * range we're targeting, which will not be filtered by the frequency-domain translation. */\n\tif (hc->total_samples > 0 && ((current_thread_count - 1.0) / completions) >= hc->max_sample_error) {\n\t\t/* Not accurate enough yet. Let's accumulate the data so\n\t\t * far, and tell the ThreadPool to collect a little more. */\n\t\thc->accumulated_sample_duration = sample_duration;\n\t\thc->accumulated_completion_count = completions;\n\t\t*adjustment_interval = 10;\n\t\treturn current_thread_count;\n\t}\n\n\t/* We've got enouugh data for our sample; reset our accumulators for next time. */\n\thc->accumulated_sample_duration = 0;\n\thc->accumulated_completion_count = 0;\n\n\t/* Add the current thread count and throughput sample to our history. */\n\tthroughput = ((double) completions) / sample_duration;\n\n\tsample_index = hc->total_samples % hc->samples_to_measure;\n\thc->samples [sample_index] = throughput;\n\thc->thread_counts [sample_index] = current_thread_count;\n\thc->total_samples ++;\n\n\t/* Set up defaults for our metrics. */\n\tthroughput_error_estimate = 0;\n\tconfidence = 0;\n\n\ttransition = TRANSITION_WARMUP;\n\n\t/* How many samples will we use? It must be at least the three wave periods we're looking for, and it must also\n\t * be a whole multiple of the primary wave's period; otherwise the frequency we're looking for will fall between\n\t * two frequency bands in the Fourier analysis, and we won't be able to measure it accurately. */\n\tsample_count = ((int) std::min (hc->total_samples - 1, (int64_t)hc->samples_to_measure) / hc->wave_period) * hc->wave_period;\n\n\tif (sample_count > hc->wave_period) {\n\t\tint i;\n\t\tdouble average_throughput;\n\t\tdouble average_thread_count;\n\t\tdouble sample_sum = 0;\n\t\tdouble thread_sum = 0;\n\n\t\t/* Average the throughput and thread count samples, so we can scale the wave magnitudes later. */\n\t\tfor (i = 0; i < sample_count; ++i) {\n\t\t\tunsigned int j = (hc->total_samples - sample_count + i) % hc->samples_to_measure;\n\t\t\tsample_sum += hc->samples [j];\n\t\t\tthread_sum += hc->thread_counts [j];\n\t\t}\n\n\t\taverage_throughput = sample_sum / sample_count;\n\t\taverage_thread_count = thread_sum / sample_count;\n\n\t\tif (average_throughput > 0 && average_thread_count > 0) {\n\t\t\tdouble noise_for_confidence, adjacent_period_1, adjacent_period_2;\n\n\t\t\t/* Calculate the periods of the adjacent frequency bands we'll be using to\n\t\t\t * measure noise levels. We want the two adjacent Fourier frequency bands. */\n\t\t\tadjacent_period_1 = sample_count / (((double) sample_count) / ((double) hc->wave_period) + 1);\n\t\t\tadjacent_period_2 = sample_count / (((double) sample_count) / ((double) hc->wave_period) - 1);\n\n\t\t\t/* Get the the three different frequency components of the throughput (scaled by average\n\t\t\t * throughput). Our \"error\" estimate (the amount of noise that might be present in the\n\t\t\t * frequency band we're really interested in) is the average of the adjacent bands. */\n\n\t\t\tthroughput_wave_component = hill_climbing_get_wave_component(hc->samples, sample_count, hc->wave_period) / average_throughput;\n\t\t\t//throughput_wave_component = mono_double_complex_scalar_div (hill_climbing_get_wave_component (hc->samples, sample_count, hc->wave_period), average_throughput);\n\n\t\t\tthroughput_error_estimate = std::abs(hill_climbing_get_wave_component(hc->samples, sample_count, adjacent_period_1) / average_throughput);\n\t\t\t//throughput_error_estimate = cabs (mono_double_complex_scalar_div (hill_climbing_get_wave_component (hc->samples, sample_count, adjacent_period_1), average_throughput));\n\n\t\t\tif (adjacent_period_2 <= sample_count) {\n\t\t\t\tthroughput_error_estimate = std::max (throughput_error_estimate, std::abs (hill_climbing_get_wave_component (\n\t\t\t\t\thc->samples, sample_count, adjacent_period_2) / average_throughput));\n\t\t\t}\n\n\t\t\t/* Do the same for the thread counts, so we have something to compare to. We don't\n\t\t\t * measure thread count noise, because there is none; these are exact measurements. */\n\t\t\tthread_wave_component = hill_climbing_get_wave_component (hc->thread_counts, sample_count, hc->wave_period) / average_thread_count;\n\n\t\t\t/* Update our moving average of the throughput noise. We'll use this\n\t\t\t * later as feedback to determine the new size of the thread wave. */\n\t\t\tif (hc->average_throughput_noise == 0) {\n\t\t\t\thc->average_throughput_noise = throughput_error_estimate;\n\t\t\t} else {\n\t\t\t\thc->average_throughput_noise = (hc->throughput_error_smoothing_factor * throughput_error_estimate)\n\t\t\t\t\t+ ((1.0 + hc->throughput_error_smoothing_factor) * hc->average_throughput_noise);\n\t\t\t}\n\n\t\t\tif (std::abs (thread_wave_component) > 0) {\n\t\t\t\t/* Adjust the throughput wave so it's centered around the target wave,\n\t\t\t\t * and then calculate the adjusted throughput/thread ratio. */\n\t\t\t\tratio = ((throughput_wave_component - (thread_wave_component * hc->target_throughput_ratio)) / thread_wave_component);\n\t\t\t\ttransition = TRANSITION_CLIMBING_MOVE;\n\t\t\t} else {\n\t\t\t\t//ratio = mono_double_complex_make (0, 0);\n\t\t\t\ttransition = TRANSITION_STABILIZING;\n\t\t\t}\n\n\t\t\tnoise_for_confidence = std::max (hc->average_throughput_noise, throughput_error_estimate);\n\t\t\tif (noise_for_confidence > 0) {\n\t\t\t\tconfidence = std::abs (thread_wave_component) / noise_for_confidence / hc->target_signal_to_noise_ratio;\n\t\t\t} else {\n\t\t\t\t/* there is no noise! */\n\t\t\t\tconfidence = 1.0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* We use just the real part of the complex ratio we just calculated. If the throughput signal\n\t * is exactly in phase with the thread signal, this will be the same as taking the magnitude of\n\t * the complex move and moving that far up. If they're 180 degrees out of phase, we'll move\n\t * backward (because this indicates that our changes are having the opposite of the intended effect).\n\t * If they're 90 degrees out of phase, we won't move at all, because we can't tell wether we're\n\t * having a negative or positive effect on throughput. */\n\tmove = std::real (ratio);\n\tmove = CLAMP (move, -1.0, 1.0);\n\n\t/* Apply our confidence multiplier. */\n\tmove *= CLAMP (confidence, -1.0, 1.0);\n\n\t/* Now apply non-linear gain, such that values around zero are attenuated, while higher values\n\t * are enhanced. This allows us to move quickly if we're far away from the target, but more slowly\n\t* if we're getting close, giving us rapid ramp-up without wild oscillations around the target. */\n\tgain = hc->max_change_per_second * sample_duration;\n\tmove = pow (fabs (move), hc->gain_exponent) * (move >= 0.0 ? 1 : -1) * gain;\n\tmove = std::min (move, hc->max_change_per_sample);\n\n\t/* If the result was positive, and CPU is > 95%, refuse the move. */\n\tif (move > 0.0 && g_ThreadPool->cpu_usage > CPU_USAGE_HIGH)\n\t\tmove = 0.0;\n\n\t/* Apply the move to our control setting. */\n\thc->current_control_setting += move;\n\n\t/* Calculate the new thread wave magnitude, which is based on the moving average we've been keeping of the\n\t * throughput error.  This average starts at zero, so we'll start with a nice safe little wave at first. */\n\tnew_thread_wave_magnitude = (int)(0.5 + (hc->current_control_setting * hc->average_throughput_noise\n\t\t* hc->target_signal_to_noise_ratio * hc->thread_magnitude_multiplier * 2.0));\n\tnew_thread_wave_magnitude = CLAMP (new_thread_wave_magnitude, 1, hc->max_thread_wave_magnitude);\n\n\t/* Make sure our control setting is within the ThreadPool's limits. */\n\thc->current_control_setting = CLAMP (hc->current_control_setting, g_ThreadPool->limit_worker_min, g_ThreadPool->limit_worker_max - new_thread_wave_magnitude);\n\n\t/* Calculate the new thread count (control setting + square wave). */\n\tnew_thread_count = (int)(hc->current_control_setting + new_thread_wave_magnitude * ((hc->total_samples / (hc->wave_period / 2)) % 2));\n\n\t/* Make sure the new thread count doesn't exceed the ThreadPool's limits. */\n\tnew_thread_count = CLAMP (new_thread_count, g_ThreadPool->limit_worker_min, g_ThreadPool->limit_worker_max);\n\n\tif (new_thread_count != current_thread_count)\n\t\thill_climbing_change_thread_count (new_thread_count, transition);\n\n\tif (std::real (ratio) < 0.0 && new_thread_count == g_ThreadPool->limit_worker_min)\n\t\t*adjustment_interval = (int)(0.5 + hc->current_sample_interval * (10.0 * std::max (-1.0 * std::real (ratio), 1.0)));\n\telse\n\t\t*adjustment_interval = hc->current_sample_interval;\n\n\treturn new_thread_count;\n}\n\nstatic void heuristic_notify_work_completed (void)\n{\n\tIL2CPP_ASSERT(g_ThreadPool);\n\n\til2cpp::vm::Atomic::Increment(&g_ThreadPool->heuristic_completions);\n\tg_ThreadPool->heuristic_last_dequeue = il2cpp::os::Time::GetTicksMillisecondsMonotonic();\n}\n\nstatic bool heuristic_should_adjust (void)\n{\n\tIL2CPP_ASSERT(g_ThreadPool);\n\n\tif (g_ThreadPool->heuristic_last_dequeue > g_ThreadPool->heuristic_last_adjustment + g_ThreadPool->heuristic_adjustment_interval) {\n\t\tThreadPoolCounter counter;\n\t\tcounter.as_int64_t = COUNTER_READ();\n\t\tif (counter._.working <= counter._.max_working)\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nstatic void heuristic_adjust (void)\n{\n\tIL2CPP_ASSERT(g_ThreadPool);\n\t\n\tif (g_ThreadPool->heuristic_lock.TryLock()) {\n\t\tint32_t completions = il2cpp::vm::Atomic::Exchange (&g_ThreadPool->heuristic_completions, 0);\n\t\tint64_t sample_end = il2cpp::os::Time::GetTicksMillisecondsMonotonic();\n\t\tint64_t sample_duration = sample_end - g_ThreadPool->heuristic_sample_start;\n\n\t\tif (sample_duration >= g_ThreadPool->heuristic_adjustment_interval / 2) {\n\t\t\tThreadPoolCounter counter;\n\t\t\tint16_t new_thread_count;\n\n\t\t\tcounter.as_int64_t = COUNTER_READ ();\n\t\t\tnew_thread_count = hill_climbing_update (counter._.max_working, (uint32_t)sample_duration, completions, &g_ThreadPool->heuristic_adjustment_interval);\n\n\t\t\tCOUNTER_ATOMIC (counter, { counter._.max_working = new_thread_count; });\n\n\t\t\tif (new_thread_count > counter._.max_working)\n\t\t\t\tworker_request (il2cpp::vm::Domain::GetCurrent());\n\n\t\t\tg_ThreadPool->heuristic_sample_start = sample_end;\n\t\t\tg_ThreadPool->heuristic_last_adjustment = il2cpp::os::Time::GetTicksMillisecondsMonotonic();\n\t\t}\n\n\t\tg_ThreadPool->heuristic_lock.Unlock();\n\t}\n}\n\nvoid threadpool_ms_cleanup (void)\n{\n\t#ifndef DISABLE_SOCKETS\n\t\tthreadpool_ms_io_cleanup ();\n\t#endif\n\t\n\tif (lazy_init_status.IsSet())\n\t\tcleanup();\n}\n\nIl2CppAsyncResult* threadpool_ms_begin_invoke (Il2CppDomain *domain, Il2CppObject *target, MethodInfo *method, void* *params)\n{\n\tIl2CppMethodMessage *message;\n\tIl2CppDelegate *async_callback = NULL;\n\tIl2CppObject *state = NULL;\n\n\tIl2CppAsyncCall* async_call = (Il2CppAsyncCall*)il2cpp::vm::Object::New(il2cpp_defaults.async_call_class);\n\n\tlazy_initialize ();\n\n\tMethodInfo *invoke = (MethodInfo*)il2cpp::vm::Class::GetMethodFromName(method->declaring_type, \"Invoke\", -1);\n\t\n\tmessage = mono_method_call_message_new (method, params, invoke, (params != NULL) ? (&async_callback) : NULL, (params != NULL) ? (&state) : NULL);\n\n\tIL2CPP_OBJECT_SETREF (async_call, msg, message);\n\tIL2CPP_OBJECT_SETREF (async_call, state, state);\n\n\tif (async_callback) \n\t{\n\t\tIL2CPP_OBJECT_SETREF (async_call, cb_method, (MethodInfo*)il2cpp::vm::Runtime::GetDelegateInvoke(il2cpp::vm::Object::GetClass((Il2CppObject*)async_callback)));\n\t\tIL2CPP_OBJECT_SETREF (async_call, cb_target, async_callback);\n\t}\n\n\tIl2CppAsyncResult* async_result = (Il2CppAsyncResult*)il2cpp::vm::Object::New(il2cpp_defaults.asyncresult_class);\n\n\tIL2CPP_OBJECT_SETREF(async_result, async_delegate, (Il2CppDelegate*)target);\n\n\tIL2CPP_OBJECT_SETREF(async_result, object_data, async_call);\n\tIL2CPP_OBJECT_SETREF(async_result, async_state, async_call->state);\n\n\tthreadpool_ms_enqueue_work_item (domain, (Il2CppObject*) async_result);\n\n\treturn async_result;\n}\n\nIl2CppObject* threadpool_ms_end_invoke (Il2CppAsyncResult *ares, Il2CppArray **out_args, Il2CppObject **exc)\n{\n\tIl2CppAsyncCall *ac;\n\n\tIL2CPP_ASSERT(exc);\n\tIL2CPP_ASSERT(out_args);\n\n\t*exc = NULL;\n\t*out_args = NULL;\n\n\t/* check if already finished */\n\til2cpp_monitor_enter((Il2CppObject*) ares);\n\n\tif (ares->endinvoke_called) \n\t{\n\t\til2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetInvalidOperationException(\"Cannot call EndInvoke() repeatedly or concurrently on the same AsyncResult!\"));\n\t\til2cpp_monitor_exit((Il2CppObject*) ares);\n\t\treturn NULL;\n\t}\n\n\tares->endinvoke_called = 1;\n\n\t/* wait until we are really finished */\n\tif (ares->completed) \n\t{\n\t\til2cpp_monitor_exit((Il2CppObject *) ares);\n\t} \n\telse \n\t{\n\n\t\tif (!ares->handle)\n\t\t{\n\t\t\tIl2CppWaitHandle *wait_handle = il2cpp::vm::WaitHandle::NewManualResetEvent(false);\n\t\t\tIL2CPP_OBJECT_SETREF(ares, handle, wait_handle);\n\t\t}\n\n\t\til2cpp::os::Handle* wait_event = il2cpp::vm::WaitHandle::GetPlatformHandle((Il2CppWaitHandle*)ares->handle);\n\n\t\til2cpp_monitor_exit((Il2CppObject*) ares);\n\n\t\t//MONO_ENTER_GC_SAFE;\n\t\twait_event->Wait();\n\t\t//MONO_EXIT_GC_SAFE;\n\t}\n\n\tac = (Il2CppAsyncCall*) ares->object_data;\n\tIL2CPP_ASSERT(ac);\n\t\n\t*exc = ((Il2CppMethodMessage*)ac->msg)->exc; /* FIXME: GC add write barrier */\n\t*out_args = ac->out_args;\n\treturn ac->res;\n}\n\nvoid threadpool_ms_suspend (void)\n{\n\tif (g_ThreadPool)\n\t\tg_ThreadPool->suspended = true;\n}\n\nvoid threadpool_ms_resume (void)\n{\n\tif (g_ThreadPool)\n\t\tg_ThreadPool->suspended = false;\n}\n\nvoid ves_icall_System_Threading_ThreadPool_GetAvailableThreadsNative (int32_t *worker_threads, int32_t *completion_port_threads)\n{\n\tThreadPoolCounter counter;\n\n\tif (!worker_threads || !completion_port_threads)\n\t\treturn;\n\n\tlazy_initialize ();\n\n\tcounter.as_int64_t = COUNTER_READ ();\n\n\t*worker_threads = std::max (0, g_ThreadPool->limit_worker_max - counter._.active);\n\t*completion_port_threads = g_ThreadPool->limit_io_max;\n}\n\nvoid ves_icall_System_Threading_ThreadPool_GetMinThreadsNative (int32_t *worker_threads, int32_t *completion_port_threads)\n{\n\tif (!worker_threads || !completion_port_threads)\n\t\treturn;\n\n\tlazy_initialize ();\n\n\t*worker_threads = g_ThreadPool->limit_worker_min;\n\t*completion_port_threads = g_ThreadPool->limit_io_min;\n}\n\nvoid ves_icall_System_Threading_ThreadPool_GetMaxThreadsNative (int32_t *worker_threads, int32_t *completion_port_threads)\n{\n\tif (!worker_threads || !completion_port_threads)\n\t\treturn;\n\n\tlazy_initialize ();\n\n\t*worker_threads = g_ThreadPool->limit_worker_max;\n\t*completion_port_threads = g_ThreadPool->limit_io_max;\n}\n\nbool ves_icall_System_Threading_ThreadPool_SetMinThreadsNative (int32_t worker_threads, int32_t completion_port_threads)\n{\n\tlazy_initialize ();\n\n\tif (worker_threads <= 0 || worker_threads > g_ThreadPool->limit_worker_max)\n\t\treturn false;\n\tif (completion_port_threads <= 0 || completion_port_threads > g_ThreadPool->limit_io_max)\n\t\treturn false;\n\n\tg_ThreadPool->limit_worker_min = worker_threads;\n\tg_ThreadPool->limit_io_min = completion_port_threads;\n\n\treturn true;\n}\n\nbool ves_icall_System_Threading_ThreadPool_SetMaxThreadsNative (int32_t worker_threads, int32_t completion_port_threads)\n{\n\tint cpu_count = il2cpp::os::Environment::GetProcessorCount ();\n\n\tlazy_initialize ();\n\n\tif (worker_threads < g_ThreadPool->limit_worker_min || worker_threads < cpu_count)\n\t\treturn false;\n\tif (completion_port_threads < g_ThreadPool->limit_io_min || completion_port_threads < cpu_count)\n\t\treturn false;\n\n\tg_ThreadPool->limit_worker_max = worker_threads;\n\tg_ThreadPool->limit_io_max = completion_port_threads;\n\n\treturn true;\n}\n\nvoid ves_icall_System_Threading_ThreadPool_InitializeVMTp (bool *enable_worker_tracking)\n{\n\tif (enable_worker_tracking) {\n\t\t// TODO implement some kind of switch to have the possibily to use it\n\t\t*enable_worker_tracking = false;\n\t}\n\n\tlazy_initialize ();\n}\n\nbool ves_icall_System_Threading_ThreadPool_NotifyWorkItemComplete (void)\n{\n\tThreadPoolCounter counter;\n\n\tif (il2cpp::vm::Runtime::IsShuttingDown ())\n\t\treturn false;\n\n\theuristic_notify_work_completed ();\n\n\tif (heuristic_should_adjust ())\n\t\theuristic_adjust ();\n\n\tcounter.as_int64_t = COUNTER_READ ();\n\treturn counter._.working <= counter._.max_working;\n}\n\nvoid ves_icall_System_Threading_ThreadPool_NotifyWorkItemProgressNative (void)\n{\n\theuristic_notify_work_completed ();\n\n\tif (heuristic_should_adjust ())\n\t\theuristic_adjust ();\n}\n\nvoid ves_icall_System_Threading_ThreadPool_ReportThreadStatus (bool is_working)\n{\n\t// Mono raises a not implemented exception\n\tNOT_IMPLEMENTED_ICALL(ves_icall_System_Threading_ThreadPool_PostQueuedCompletionStatus);\n\tIL2CPP_UNREACHABLE;\n}\n\nbool ves_icall_System_Threading_ThreadPool_RequestWorkerThread (void)\n{\n\treturn worker_request (il2cpp::vm::Domain::GetCurrent());\n}\n\nbool ves_icall_System_Threading_ThreadPool_PostQueuedCompletionStatus (Il2CppNativeOverlapped *native_overlapped)\n{\n\t// Mono raises a not implemented exception\n\tNOT_IMPLEMENTED_ICALL(ves_icall_System_Threading_ThreadPool_PostQueuedCompletionStatus);\n\tIL2CPP_UNREACHABLE;\n}\n\nbool  ves_icall_System_Threading_ThreadPool_BindIOCompletionCallbackNative (void* file_handle)\n{\n\t/* This copy the behavior of the current Mono implementation */\n\treturn true;\n}\n\nbool ves_icall_System_Threading_ThreadPool_IsThreadPoolHosted (void)\n{\n\treturn false;\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono/ThreadPool/threadpool-ms.h",
    "content": "#pragma once\n#if NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"mono/ThreadPool/ThreadPoolDataStructures.h\"\n\nstruct Il2CppObject;\nstruct Il2CppDomain;\nstruct Il2CppArray;\nstruct Il2CppAsyncResult;\nstruct MethodInfo;\nstruct Il2CppNativeOverlapped;\n\n#define SMALL_STACK (sizeof (void*) * 32 * 1024)\n\nvoid threadpool_ms_cleanup(void);\n\nIl2CppAsyncResult * threadpool_ms_begin_invoke(Il2CppDomain *domain, Il2CppObject *target, MethodInfo *method, void* *params);\nIl2CppObject * threadpool_ms_end_invoke(Il2CppAsyncResult *ares, Il2CppArray **out_args, Il2CppObject **exc);\n\nvoid threadpool_ms_suspend(void);\nvoid threadpool_ms_resume(void);\n\nLIBIL2CPP_CODEGEN_API void ves_icall_System_Threading_ThreadPool_GetAvailableThreadsNative(int32_t *worker_threads, int32_t *completion_port_threads);\nLIBIL2CPP_CODEGEN_API void ves_icall_System_Threading_ThreadPool_GetMinThreadsNative(int32_t *worker_threads, int32_t *completion_port_threads);\nLIBIL2CPP_CODEGEN_API void ves_icall_System_Threading_ThreadPool_GetMaxThreadsNative(int32_t *worker_threads, int32_t *completion_port_threads);\nLIBIL2CPP_CODEGEN_API bool ves_icall_System_Threading_ThreadPool_SetMinThreadsNative(int32_t worker_threads, int32_t completion_port_threads);\nLIBIL2CPP_CODEGEN_API bool ves_icall_System_Threading_ThreadPool_SetMaxThreadsNative(int32_t worker_threads, int32_t completion_port_threads);\nLIBIL2CPP_CODEGEN_API void ves_icall_System_Threading_ThreadPool_InitializeVMTp(bool *enable_worker_tracking);\nLIBIL2CPP_CODEGEN_API bool ves_icall_System_Threading_ThreadPool_NotifyWorkItemComplete(void);\nLIBIL2CPP_CODEGEN_API void ves_icall_System_Threading_ThreadPool_NotifyWorkItemProgressNative(void);\nLIBIL2CPP_CODEGEN_API void ves_icall_System_Threading_ThreadPool_ReportThreadStatus(bool is_working);\nLIBIL2CPP_CODEGEN_API bool ves_icall_System_Threading_ThreadPool_RequestWorkerThread(void);\nLIBIL2CPP_CODEGEN_API bool ves_icall_System_Threading_ThreadPool_PostQueuedCompletionStatus(Il2CppNativeOverlapped *native_overlapped);\nLIBIL2CPP_CODEGEN_API bool ves_icall_System_Threading_ThreadPool_BindIOCompletionCallbackNative(void* file_handle);\nLIBIL2CPP_CODEGEN_API bool ves_icall_System_Threading_ThreadPool_IsThreadPoolHosted(void);\n\n/* Internals */\nbool threadpool_ms_enqueue_work_item(Il2CppDomain *domain, Il2CppObject *work_item);\n\nextern ThreadPool* g_ThreadPool;\nbool worker_try_unpark();\nvoid hill_climbing_force_change(int16_t new_thread_count, ThreadPoolHeuristicStateTransition transition);\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono-runtime/il2cpp-callbacks.cpp",
    "content": "#if RUNTIME_MONO\n\n#include <cassert>\n#include <cstring>\n#include \"mono-api.h\"\n#include \"../libmono/icalls/mscorlib/System.Diagnostics/StackFrame.h\"\n#include \"../libmono/icalls/mscorlib/System.Diagnostics/StackTrace.h\"\n#include \"../libmono/icalls/mscorlib/System.Runtime.InteropServices/Marshal.h\"\n#include \"../libmono/vm/StackTrace.h\"\n#include \"../libmono/vm/MetadataCache.h\"\n#include \"il2cpp-callbacks.h\"\n#include \"il2cpp-mono-support.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include <iterator>\n#include \"os/Thread.h\"\n#include \"utils/PathUtils.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/Environment.h\"\n#include \"utils/utf8-cpp/source/utf8.h\"\n#include \"vm-utils/NativeSymbol.h\"\n\nstatic void* il2cpp_get_vtable_trampoline(MonoVTable *vtable, int slot_index)\n{\n    return 0;\n}\n\nstatic void* il2cpp_get_imt_trampoline(MonoVTable *vtable, int imt_slot_index)\n{\n    return 0;\n}\n\nstatic void mono_thread_start_cb(intptr_t tid, void* stack_start, void* func)\n{\n    mono::vm::StackTrace::InitializeStackTracesForCurrentThread();\n}\n\nstatic void mono_thread_attach_cb(intptr_t tid, void* stack_start)\n{\n    mono::vm::StackTrace::InitializeStackTracesForCurrentThread();\n}\n\nstatic void mono_thread_cleanup_cb(intptr_t tid)\n{\n    //assert(tid == il2cpp::os::Thread::CurrentThreadId());\n    //mono::vm::StackTrace::CleanupStackTracesForCurrentThread();\n}\n\nstatic void il2cpp_throw_exception(MonoException* ex)\n{\n    if (mono_unity_exception_get_trace_ips(ex) == NULL)\n    {\n        // Only write the stack trace if there is not one already in the exception.\n        // When we exit managed try/finally and try/catch blocks with an exception, this method is\n        // called with the original exception which already has the proper stack trace.\n        // Getting the stack trace again here will lose the frames between the original throw\n        // and the finally or catch block.\n        const mono::vm::StackFrames& frames = *mono::vm::StackTrace::GetStackFrames();\n        size_t i = frames.size() - 1;\n        MonoArray* ips = MonoArrayNew(mono_unity_defaults_get_int_class(), frames.size());\n        for (mono::vm::StackFrames::const_iterator iter = frames.begin(); iter != frames.end(); ++iter, --i)\n        {\n            mono_array_set(ips, const MonoMethod*, i, (*iter).method);\n        }\n\n        mono_unity_exception_set_trace_ips(ex, ips);\n    }\n\n    throw Il2CppExceptionWrapper(ex);\n}\n\nstatic void il2cpp_walk_stack_with_ctx(MonoInternalStackWalk func, MonoContext *ctx, MonoUnwindOptions options, void *user_data)\n{\n    mono::vm::StackTrace::WalkFrameStack(func, ctx, user_data);\n}\n\nstatic int32_t il2cpp_exception_walk_trace(MonoException *ex, MonoInternalExceptionFrameWalk func, void* user_data)\n{\n    MonoArray *ta = mono_unity_exception_get_trace_ips(ex);\n    int len, i;\n\n    if (ta == NULL)\n        return 0;\n\n    len = (int)mono_array_length(ta) >> 1;\n    for (i = 0; i < len; i++)\n    {\n        void* ip = mono_array_get(ta, void*, i * 2 + 0);\n        void* generic_info = mono_array_get(ta, void*, i * 2 + 1);\n        const MonoMethod* method = il2cpp::utils::NativeSymbol::GetMethodFromNativeSymbol((Il2CppMethodPointer)ip);\n\n        if (method == NULL)\n        {\n            if (func(NULL, ip, 0, 0, user_data))\n                return 1;\n        }\n        else\n        {\n            if (func(const_cast<MonoMethod*>(method), ip, 0, 1, user_data))\n                return 1;\n        }\n    }\n\n    return len > 0;\n}\n\nstatic int32_t il2cpp_current_thread_has_handle_block_guard()\n{\n    return 0;\n}\n\nstatic gboolean il2cpp_install_handler_block_guard(MonoThreadUnwindState *ctx)\n{\n    return false;\n}\n\nstatic MonoObject* il2cpp_mono_fake_box(void *ptr)\n{\n    return ((MonoObject*)ptr) - 1;\n}\n\nMonoObject* il2cpp_mono_determine_target_object(MonoMethod *method, MonoObject *obj)\n{\n    if (!obj)\n        return NULL;\n\n    if (mono_class_is_valuetype(mono_unity_method_get_class(method)))\n        return obj;\n\n    MonoClass *klass = mono_unity_object_get_class(obj);\n    if (mono_unity_class_is_delegate(klass) && (strcmp(mono_unity_method_get_name(method), \"Invoke\") != 0))\n        return mono_unity_delegate_get_target((MonoDelegate*)obj);\n\n    return obj;\n}\n\nMonoObject* il2cpp_mono_runtime_invoke(MonoMethod *method, void *obj, void **params, MonoObject **exc, MonoError *error)\n{\n    il2cpp_mono_method_initialize_function_pointers(method, error);\n    if (!il2cpp_mono_error_ok(error))\n        return NULL;\n\n    if (exc)\n        *exc = NULL;\n\n    MonoObject *target = il2cpp_mono_determine_target_object(method, (MonoObject*)obj);\n\n    void **newParams = params;\n    std::vector<void*> newParamsVec;\n    std::vector<int> byRefParams;\n\n    if (params && mono_method_signature(method))\n    {\n        int numParams = mono_unity_signature_num_parameters(mono_method_signature(method));\n        if (numParams > 0)\n        {\n            newParamsVec.resize(numParams);\n            for (int i = 0; i < numParams; ++i)\n            {\n                MonoClass *paramSigClass = mono_unity_signature_get_class_for_param(mono_method_signature(method), i);\n                if (mono_class_is_nullable(paramSigClass))\n                {\n                    if (mono_unity_signature_param_is_byref(mono_method_signature(method), i))\n                        byRefParams.push_back(i);\n\n                    MonoObject *paramObj = (MonoObject*)params[i];\n                    void *nullable = alloca(mono_unity_class_get_instance_size(paramSigClass));\n                    mono_nullable_init((uint8_t*)nullable, paramObj, paramSigClass);\n                    newParamsVec[i] = nullable;\n                }\n                else\n                {\n                    newParamsVec[i] = params[i];\n                }\n            }\n\n            newParams = &newParamsVec[0];\n        }\n    }\n\n    if (mono_class_is_nullable(mono_unity_method_get_class(method)))\n        target = mono_value_box(mono_domain_get(), mono_unity_class_get_castclass(mono_unity_method_get_class(method)), target);\n    else if (target != NULL && mono_class_is_valuetype(mono_unity_method_get_class(method)))\n        target = il2cpp_mono_fake_box(target);\n\n    try\n    {\n        if (strcmp(mono_unity_method_get_name(method), \".ctor\") == 0)\n            mono_runtime_class_init_full(mono_class_vtable(mono_domain_get(), mono_unity_method_get_class(method)), error);\n        void *retVal = ((InvokerMethod)mono_unity_method_get_invoke_pointer(method))((Il2CppMethodPointer)mono_unity_method_get_method_pointer(method), method, target, newParams);\n\n        std::vector<int>::const_iterator end = byRefParams.end();\n        for (std::vector<int>::const_iterator it = byRefParams.begin(); it != end; ++it)\n        {\n            MonoClass *paramSigClass = mono_unity_signature_get_class_for_param(mono_method_signature(method), *it);\n            params[*it] = mono_value_box(mono_domain_get(), paramSigClass, newParamsVec[*it]);\n        }\n\n        return mono_unity_method_convert_return_type_if_needed(method, retVal);\n    }\n    catch (Il2CppExceptionWrapper& ex)\n    {\n        if (exc)\n            *exc = (MonoObject*)ex.ex;\n        else\n            mono_set_pending_exception((MonoException*)ex.ex);\n\n        return NULL;\n    }\n}\n\nMonoObject* il2cpp_mono_finalize_runtime_invoke(MonoObject *this_obj, void **params, MonoObject **exc, void* compiled_method)\n{\n    MonoMethod* finalizer = mono_class_get_finalizer(mono_object_get_class(this_obj));\n    if (finalizer == NULL)\n    {\n        assert(0 && \"Why did we get a NULL finalizer? Something may not be correct.\");\n        return NULL;\n    }\n\n    MonoError unused;\n    return il2cpp_mono_runtime_invoke(finalizer, this_obj, params, exc, &unused);\n}\n\nvoid il2cpp_mono_set_cast_details(MonoClass *from, MonoClass *to)\n{\n}\n\nMonoObject* il2cpp_mono_capture_context_runtime_invoke(MonoObject *this_obj, void **params, MonoObject **exc, void* compiled_method)\n{\n    return NULL;\n}\n\nvoid il2cpp_mono_dummy_callback()\n{\n}\n\nvoid* il2cpp_mono_delegate_trampoline(MonoDomain *domain, MonoClass *klass)\n{\n    int vtableSize = mono_class_get_vtable_size(klass);\n    MonoMethod *method = NULL;\n\n    for (int i = 0; i < vtableSize; ++i)\n    {\n        MonoMethod *vtableMethod = mono_class_get_vtable_entry(klass, i);\n        const char *vtableMethodName = mono_unity_method_get_name(vtableMethod);\n        const char *substr = strstr(vtableMethodName, \"Invoke\");\n        if (substr == vtableMethodName) //if the pointers are equal, vtableMethodName starts with \"Invoke\"\n        {\n            method = vtableMethod;\n            break;\n        }\n    }\n\n    if (!method)\n        return NULL;\n\n    MonoError unused;\n    il2cpp_mono_method_initialize_function_pointers(method, &unused);\n    return mono_unity_method_get_method_pointer(method);\n}\n\nvoid* il2cpp_mono_create_jump_trampoline(MonoDomain *domain, MonoMethod *method, gboolean add_sync_wrapper, MonoError *error)\n{\n    il2cpp_mono_method_initialize_function_pointers(method, error);\n    return mono_unity_method_get_method_pointer(method);\n}\n\nvoid* il2cpp_mono_create_ftnptr(MonoDomain *domain, void* addr)\n{\n    return addr;\n}\n\nchar* il2cpp_mono_get_runtime_build_info()\n{\n    return mono_unity_get_runtime_build_info(__DATE__, __TIME__);\n}\n\nvoid il2cpp_install_callbacks()\n{\n    MonoRuntimeCallbacks callbacks;\n\n    memset(&callbacks, 0, sizeof(callbacks));\n    callbacks.get_vtable_trampoline = il2cpp_get_vtable_trampoline;\n    callbacks.get_imt_trampoline = il2cpp_get_imt_trampoline;\n    callbacks.runtime_invoke = il2cpp_mono_runtime_invoke;\n    callbacks.set_cast_details = il2cpp_mono_set_cast_details;\n    callbacks.create_jump_trampoline = il2cpp_mono_create_jump_trampoline;\n    callbacks.create_ftnptr = il2cpp_mono_create_ftnptr;\n    callbacks.get_runtime_build_info = il2cpp_mono_get_runtime_build_info;\n\n    mono_install_callbacks(&callbacks);\n\n    MonoRuntimeExceptionHandlingCallbacks cbs;\n    memset(&cbs, 0, sizeof(cbs));\n    cbs.mono_raise_exception = il2cpp_throw_exception;\n    cbs.mono_walk_stack_with_ctx = il2cpp_walk_stack_with_ctx;\n    cbs.mono_install_handler_block_guard = il2cpp_install_handler_block_guard;\n    cbs.mono_exception_walk_trace = il2cpp_exception_walk_trace;\n    cbs.mono_current_thread_has_handle_block_guard = il2cpp_current_thread_has_handle_block_guard;\n    mono_install_eh_callbacks(&cbs);\n\n    mono_unity_domain_install_finalize_runtime_invoke(mono_domain_get(), il2cpp_mono_finalize_runtime_invoke);\n    mono_unity_domain_install_capture_context_runtime_invoke(mono_domain_get(), il2cpp_mono_capture_context_runtime_invoke);\n    mono_unity_domain_install_capture_context_method(mono_domain_get(), (void*)il2cpp_mono_dummy_callback);\n    mono_install_delegate_trampoline(il2cpp_mono_delegate_trampoline);\n\n    MonoThreadInfoRuntimeCallbacks ticallbacks;\n    memset(&ticallbacks, 0, sizeof(ticallbacks));\n    ticallbacks.thread_state_init_from_handle = mono_unity_thread_state_init_from_handle;\n\n    mono_threads_runtime_init(&ticallbacks);\n}\n\nvoid il2cpp_mono_runtime_init()\n{\n    MonoDomain* domain = mono_domain_get();\n    mono_runtime_init(domain, mono_thread_start_cb, mono_thread_attach_cb);\n    mono_threads_install_cleanup(mono_thread_cleanup_cb);\n    mono_thread_attach(domain);\n    mono_class_set_allow_gc_aware_layout(false);\n\n    mono_add_internal_call(\"System.Diagnostics.StackFrame::get_frame_info\", (void*)mono::icalls::mscorlib::System::Diagnostics::StackFrame::get_frame_info);\n    mono_add_internal_call(\"System.Diagnostics.StackTrace::get_trace\", (void*)mono::icalls::mscorlib::System::Diagnostics::StackTrace::get_trace);\n    mono_add_internal_call(\"System.Runtime.InteropServices.Marshal::GetFunctionPointerForDelegateInternal\", (void*)mono::icalls::mscorlib::System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegateInternal);\n    mono_add_internal_call(\"System.Runtime.InteropServices.Marshal::GetDelegateForFunctionPointerInternal\", (void*)mono::icalls::mscorlib::System::Runtime::InteropServices::Marshal::GetDelegateForFunctionPointerInternal);\n\n    RegisterAllManagedMethods();\n    initialize_interop_data_map();\n}\n\nstatic void MonoSetConfigStr(const std::string& executablePath)\n{\n    std::string appBase = il2cpp::utils::PathUtils::DirectoryName(executablePath);\n    std::string configFileName = il2cpp::utils::PathUtils::Basename(executablePath);\n    configFileName.append(\".config\");\n    mono_domain_set_config(mono_domain_get(), appBase.c_str(), configFileName.c_str());\n}\n\nvoid il2cpp_mono_set_config_utf16(const Il2CppChar* executablePath)\n{\n    IL2CPP_ASSERT(executablePath);\n    std::string exePathUtf8 = il2cpp::utils::StringUtils::Utf16ToUtf8(executablePath, -1);\n    MonoSetConfigStr(exePathUtf8);\n}\n\nvoid il2cpp_mono_set_config(const char* executablePath)\n{\n    IL2CPP_ASSERT(executablePath);\n    std::string executablePathStr(executablePath);\n    MonoSetConfigStr(executablePathStr);\n}\n\nvoid il2cpp_mono_set_commandline_arguments_utf16(int argc, const Il2CppChar* const* argv)\n{\n    std::vector<std::string> args(argc);\n    for (int i = 0; i < argc; ++i)\n        args[i] = il2cpp::utils::StringUtils::Utf16ToUtf8(argv[i], -1);\n\n    std::vector<const char*> cargs(argc);\n    for (int i = 0; i < argc; ++i)\n        cargs[i] = args[i].c_str();\n\n    mono_runtime_set_main_args(argc, const_cast<char**>(&cargs[0]));\n    il2cpp::utils::Environment::SetMainArgs(argv, argc);\n}\n\nvoid il2cpp_mono_set_commandline_arguments(int argc, const char* const* argv)\n{\n    mono_runtime_set_main_args(argc, const_cast<char**>(argv));\n    il2cpp::utils::Environment::SetMainArgs(argv, argc);\n}\n\nvoid il2cpp_mono_initialize_metadata()\n{\n    mono::vm::MetadataCache::Initialize();\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono-runtime/il2cpp-callbacks.h",
    "content": "#pragma once\n\n#if RUNTIME_MONO\n\n#if _MSC_VER\ntypedef wchar_t Il2CppChar;\n#elif __has_feature(cxx_unicode_literals)\ntypedef char16_t Il2CppChar;\n#else\ntypedef uint16_t Il2CppChar;\n#endif\n\nvoid il2cpp_install_callbacks();\nvoid il2cpp_mono_runtime_init();\nvoid il2cpp_mono_set_config_utf16(const Il2CppChar* executablePath);\nvoid il2cpp_mono_set_config(const char* executablePath);\nvoid il2cpp_mono_set_commandline_arguments_utf16(int argc, const Il2CppChar* const* argv);\nvoid il2cpp_mono_set_commandline_arguments(int argc, const char* const* argv);\nvoid il2cpp_mono_initialize_metadata();\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono-runtime/il2cpp-mapping.h",
    "content": "#pragma once\n#include \"il2cpp-metadata.h\"\n\nstruct MonoMethodInfo\n{\n    int64_t hash;\n    int32_t invoker_index;\n    int32_t method_pointer_index;\n};\n\nstruct MonoRGCTXDefinition\n{\n    Il2CppRGCTXDataType type;\n    AssemblyIndex assemblyIndex;\n    int32_t token;\n    int32_t generic_parameter_index;\n};\n\nstruct RuntimeGenericContextInfo\n{\n    uint64_t hash;\n    int32_t rgctxStart;\n    int32_t rgctxCount;\n};\n\nstruct MonoMetadataToken\n{\n    AssemblyIndex assemblyIndex;\n    int32_t token;\n};\n\n#pragma pack(push, p1,4)\nstruct MonoMethodMetadata\n{\n    MonoMetadataToken metadataToken;\n    MethodIndex reversePInvokeWrapperIndex;\n    uint64_t hash;\n};\n#pragma pack(pop, p1)\n\n#pragma pack(push, p1,4)\nstruct MonoClassMetadata\n{\n    MonoMetadataToken metadataToken;\n    int32_t genericParametersOffset;\n    int32_t genericParametersCount;\n    int32_t isPointer;\n    int32_t rank; //if rank == 0, the token is for a non-array type, otherwise the rank is valid and the token represents the element type of the array\n    int32_t elementTypeIndex;\n};\n#pragma pack(pop, p1)\n\nstruct MonoFieldMetadata\n{\n    TypeIndex parentTypeIndex;\n    int32_t token;\n};\n\nstruct MonoGenericInstMetadata\n{\n    uint32_t type_argc;\n    const TypeIndex *type_argv_indices;\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono-runtime/il2cpp-mono-support.cpp",
    "content": "#if RUNTIME_MONO\n\n#include <cassert>\n\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n\n#include \"il2cpp-mapping.h\"\n#include \"il2cpp-mono-support.h\"\n\n#include \"../libmono/mono-api.h\"\n#include \"utils/dynamic_array.h\"\n#if IL2CPP_ENABLE_NATIVE_STACKTRACES\n#include \"vm-utils/NativeSymbol.h\"\n#endif // IL2CPP_ENABLE_NATIVE_STACKTRACES\n#include \"utils/MarshalingUtils.h\"\n#include \"../libmono/vm/MetadataCache.h\"\n#include <string>\n#include \"utils/Il2CppHashMap.h\"\n#include \"utils/HashUtils.h\"\n#include \"os/Mutex.h\"\n\nIl2CppIntPtr Il2CppIntPtr::Zero;\n\nextern const Il2CppCodeRegistration g_CodeRegistration IL2CPP_ATTRIBUTE_WEAK;\nextern const Il2CppMethodSpec g_Il2CppMethodSpecTable[] IL2CPP_ATTRIBUTE_WEAK;\n#if IL2CPP_ENABLE_NATIVE_STACKTRACES\n#endif // IL2CPP_ENABLE_NATIVE_STACKTRACES\n\n// Mono-specific metadata emitted by IL2CPP\nextern void** const g_MetadataUsages[] IL2CPP_ATTRIBUTE_WEAK;\nextern const MonoGenericInstMetadata* const g_MonoGenericInstMetadataTable[] IL2CPP_ATTRIBUTE_WEAK;\nextern const Il2CppCodeGenOptions s_Il2CppCodeGenOptions IL2CPP_ATTRIBUTE_WEAK;\n\nextern const int g_Il2CppInteropDataCount IL2CPP_ATTRIBUTE_WEAK;\nextern Il2CppInteropData g_Il2CppInteropData[] IL2CPP_ATTRIBUTE_WEAK;\n\nstatic MonoGenericContext GetSharedContext(const MonoGenericContext* context);\nstatic MonoAssembly** s_MonoAssemblies;\nstatic int s_MonoAssembliesCount = 0;\n\nMonoAssembly* il2cpp_mono_assembly_from_name(const char* name);\n\ntypedef Il2CppHashMap<uint64_t, const Il2CppInteropData*, il2cpp::utils::PassThroughHash<uint64_t> > InteropDataMap;\nstatic InteropDataMap s_InteropDataMap;\n\ntypedef Il2CppHashMap<MonoClass*, const Il2CppInteropData*, il2cpp::utils::PointerHash<MonoClass> > InteropDataPointerCacheMap;\nstatic InteropDataPointerCacheMap s_InteropDataPointerCacheMap;\nstatic il2cpp::os::FastMutex s_InteropPointerCacheMutex;\n\nvoid il2cpp_mono_error_init(MonoError *oerror)\n{\n    MonoErrorInternal *error = (MonoErrorInternal*)oerror;\n    error->error_code = MONO_ERROR_NONE;\n    error->flags = 0;\n}\n\nbool il2cpp_mono_error_ok(MonoError *error)\n{\n    return error->error_code == MONO_ERROR_NONE;\n}\n\nstatic MonoGenericInst* GetSharedGenericInst(MonoGenericInst* inst)\n{\n    std::vector<MonoType*> types;\n    unsigned int type_argc = mono_unity_generic_inst_get_type_argc(inst);\n    for (uint32_t i = 0; i < type_argc; ++i)\n    {\n        MonoType *type = mono_unity_generic_inst_get_type_argument(inst, i);\n\n        if (mono_type_is_reference(type))\n        {\n            types.push_back(mono_class_get_type(mono_get_object_class()));\n        }\n        else if (mono_unity_type_is_generic_instance(type))\n        {\n            MonoGenericClass *gclass =  mono_unity_type_get_generic_class(type);\n            MonoGenericContext context = mono_unity_generic_class_get_context(gclass);\n            MonoGenericContext sharedContext = GetSharedContext(&context);\n            MonoClass *container_class = mono_unity_generic_class_get_container_class(gclass);\n            MonoError unused;\n            MonoClass *klass = mono_class_inflate_generic_class_checked(container_class, &sharedContext, &unused);\n            types.push_back(mono_class_get_type(klass));\n        }\n        else if (mono_unity_type_is_enum_type(type) && s_Il2CppCodeGenOptions.enablePrimitiveValueTypeGenericSharing)\n        {\n            types.push_back(mono_class_get_type(mono_unity_type_get_element_class(type)));\n        }\n        else if (mono_unity_type_is_boolean(type) && s_Il2CppCodeGenOptions.enablePrimitiveValueTypeGenericSharing)\n        {\n            types.push_back(mono_class_get_type(mono_unity_defaults_get_byte_class()));\n        }\n        else\n        {\n            types.push_back(mono_unity_generic_inst_get_type_argument(inst, i));\n        }\n    }\n\n    return mono_metadata_get_generic_inst(type_argc, &types[0]);\n}\n\nstatic MonoGenericContext GetSharedContext(const MonoGenericContext* context)\n{\n    MonoGenericContext newContext = {0};\n    if (context->class_inst != NULL)\n        newContext.class_inst = GetSharedGenericInst(context->class_inst);\n\n    if (context->method_inst != NULL)\n        newContext.method_inst = GetSharedGenericInst(context->method_inst);\n\n    return newContext;\n}\n\nstatic MonoMethod* InflateGenericMethodWithContext(MonoMethod* method, MonoGenericContext* context, bool useSharedVersion)\n{\n    if (useSharedVersion)\n    {\n        MonoGenericContext sharedContext = GetSharedContext(context);\n        return mono_class_inflate_generic_method(method, &sharedContext);\n    }\n\n    return mono_class_inflate_generic_method(method, context);\n}\n\nvoid initialize_interop_data_map()\n{\n    for (int i = 0; i < g_Il2CppInteropDataCount; ++i)\n        s_InteropDataMap.add(g_Il2CppInteropData[i].hash, &g_Il2CppInteropData[i]);\n}\n\nconst Il2CppInteropData* FindInteropDataFor(MonoClass* klass)\n{\n    il2cpp::os::FastAutoLock cacheLock(&s_InteropPointerCacheMutex);\n    InteropDataPointerCacheMap::const_iterator itCache = s_InteropDataPointerCacheMap.find(klass);\n    if (itCache != s_InteropDataPointerCacheMap.end())\n        return itCache->second;\n\n    uint64_t hash = mono_unity_type_get_hash(mono_class_get_type(klass), true);\n\n    InteropDataMap::const_iterator it = s_InteropDataMap.find(hash);\n    if (it != s_InteropDataMap.end())\n    {\n        const Il2CppInteropData *value = it->second;\n        s_InteropDataPointerCacheMap.add(klass, value);\n        return value;\n    }\n\n    return NULL;\n}\n\nstatic void StructureToPtr(MonoObject* structure, void* ptr, bool deleteOld)\n{\n    if (structure == NULL)\n        mono_raise_exception(mono_get_exception_argument_null(\"structure\"));\n\n    if (ptr == NULL)\n        mono_raise_exception(mono_get_exception_argument_null(\"ptr\"));\n\n    MonoClass* klass = mono_object_get_class(structure);\n    const Il2CppInteropData* interopData = FindInteropDataFor(klass);\n\n    if (interopData != NULL && interopData->pinvokeMarshalToNativeFunction != NULL)\n    {\n        if (deleteOld)\n            il2cpp::utils::MarshalingUtils::MarshalFreeStruct(ptr, interopData);\n\n        void* objectPtr = mono_unity_class_is_class_type(klass) ? structure : mono_object_unbox(structure);\n        il2cpp::utils::MarshalingUtils::MarshalStructToNative(objectPtr, ptr, interopData);\n        return;\n    }\n\n    // If there's no custom marshal function, it means it's either a primitive, or invalid argument\n\n    uint32_t nativeSize = mono_unity_class_get_native_size(klass);\n    if (nativeSize != -1)\n    {\n        // StructureToPtr is supposed to throw on strings and enums\n        if (!mono_class_is_enum(klass) && !mono_unity_class_is_string(klass))\n        {\n            memcpy(ptr, mono_object_unbox(structure), nativeSize);\n            return;\n        }\n    }\n\n    // If we got this far, throw an exception\n    MonoException* exception;\n\n    if (mono_class_is_generic(klass))\n    {\n        exception = mono_get_exception_argument(\"structure\", \"The specified object must not be an instance of a generic type.\");\n    }\n    else\n    {\n        exception = mono_get_exception_argument(\"structure\", \"The specified structure must be blittable or have layout information.\");\n    }\n\n    mono_raise_exception(exception);\n}\n\nstatic void* MarshalInvokerMethod(Il2CppMethodPointer func, const MonoMethod* method, void* thisArg, void** params)\n{\n    if (strcmp(mono_unity_method_get_name(method), \"PtrToStructure\") == 0)\n    {\n        const Il2CppInteropData* interopData = FindInteropDataFor(mono_unity_method_get_class(method));\n        if (interopData != NULL && mono_unity_class_is_class_type(mono_unity_method_get_class(method)))\n            il2cpp::utils::MarshalingUtils::MarshalStructFromNative((void*)(*(intptr_t*)params[0]), params[1], interopData);\n        else if (interopData != NULL)\n            il2cpp::utils::MarshalingUtils::MarshalStructFromNative((void*)(*(intptr_t*)params[0]), mono_object_unbox((MonoObject*)params[1]), interopData);\n        else // The type is blittable\n            memcpy(mono_object_unbox((MonoObject*)params[1]), (void*)(*(intptr_t*)params[0]), mono_unity_class_get_native_size(mono_unity_method_get_class(method)));\n    }\n    else if (strcmp(mono_unity_method_get_name(method), \"StructureToPtr\") == 0)\n        StructureToPtr((MonoObject*)params[0], (void*)(*(intptr_t*)params[1]), *(bool*)params[2]);\n    else\n        assert(0 && \"Handle another special marshaling method\");\n\n    return (MonoObject*)params[1];\n}\n\nvoid il2cpp_mono_method_initialize_function_pointers(MonoMethod* method, MonoError* error)\n{\n    bool* isSpecialMarshalingMethod = NULL;\n    assert(method != NULL);\n\n    int32_t invokerIndex = -1;\n    int32_t methodPointerIndex = -1;\n\n    il2cpp_mono_error_init(error);\n\n    if (method->invoke_pointer || method->method_pointer)\n        return;\n\n    //char *methodName = mono_method_get_name_full(method, true, false, MONO_TYPE_NAME_FORMAT_IL);\n\n    if (unity_mono_method_is_inflated(method))\n    {\n        // Use the fully shared version to look up the method pointer, as we will invoke the fully shared version.\n        MonoMethod* definition = mono_method_get_method_definition(method);\n        MonoMethod* sharedMethod = InflateGenericMethodWithContext(definition, mono_method_get_context(method), true);\n\n        //char *newMethodName = mono_method_get_name_full(sharedMethod, true, false, MONO_TYPE_NAME_FORMAT_IL);\n\n        uint64_t hash = mono_unity_method_get_hash(sharedMethod, true);\n        const MonoMethodInfo *methodInfo = mono::vm::MetadataCache::GetMonoGenericMethodInfoFromMethodHash(hash);\n\n        if (methodInfo)\n        {\n            invokerIndex = methodInfo->invoker_index;\n            methodPointerIndex = methodInfo->method_pointer_index;\n        }\n        else\n        {\n            mono_error_set_execution_engine(error, \"Unable to create the method '%s' at runtime\", mono_unity_method_get_name(method));\n            return;\n        }\n\n        assert(invokerIndex != -1 && \"The method does not have an invoker, is it a generic method?\");\n        assert((uint32_t)invokerIndex < g_CodeRegistration.invokerPointersCount);\n        mono_unity_method_set_invoke_pointer(method, (void*)g_CodeRegistration.invokerPointers[invokerIndex]);\n\n        assert((uint32_t)methodPointerIndex < g_CodeRegistration.genericMethodPointersCount);\n        mono_unity_method_set_method_pointer(method, (void*)g_CodeRegistration.genericMethodPointers[methodPointerIndex]);\n    }\n    else\n    {\n        uint64_t hash = mono_unity_method_get_hash(method, true);\n        const MonoMethodInfo *methodInfo = mono::vm::MetadataCache::GetMonoMethodInfoFromMethodHash(hash);\n\n        if (methodInfo)\n        {\n            invokerIndex = methodInfo->invoker_index;\n            methodPointerIndex = methodInfo->method_pointer_index;\n        }\n        else if (strcmp(mono_unity_method_get_name(method), \"PtrToStructure\") == 0 || strcmp(mono_unity_method_get_name(method), \"StructureToPtr\") == 0)\n        {\n            mono_unity_method_set_invoke_pointer(method, (void*)&MarshalInvokerMethod);\n            return;\n        }\n        else\n        {\n            // Throw a missing method exception if we did not convert it. Once we know this code works for all runtime invoke cases,\n            // we should throw this exception more often. Until then, we will leave theassert below when we don't find a method.\n            mono_error_set_method_load(error, mono_unity_method_get_class(method), mono_unity_method_get_name(method), \"This method was not converted ahead-of-time by IL2CPP.\");\n            return;\n        }\n\n        assert(invokerIndex != -1 && \"The method does not have an invoker, is it a generic method?\");\n        assert((uint32_t)invokerIndex < g_CodeRegistration.invokerPointersCount);\n        mono_unity_method_set_invoke_pointer(method, (void*)g_CodeRegistration.invokerPointers[invokerIndex]);\n\n        assert((uint32_t)methodPointerIndex < g_CodeRegistration.methodPointersCount);\n        mono_unity_method_set_method_pointer(method, (void*)g_CodeRegistration.methodPointers[methodPointerIndex]);\n    }\n}\n\nvoid il2cpp_mono_init_assemblies()\n{\n    s_MonoAssembliesCount = mono::vm::MetadataCache::GetMonoAssemblyCount();\n    s_MonoAssemblies = new MonoAssembly*[mono::vm::MetadataCache::GetMonoAssemblyCount()];\n    for (int i = 0; i < s_MonoAssembliesCount; ++i)\n        s_MonoAssemblies[i] = il2cpp_mono_assembly_from_name(mono::vm::MetadataCache::GetMonoAssemblyNameFromIndex(i));\n}\n\nMonoAssembly* il2cpp_mono_assembly_from_index(AssemblyIndex index)\n{\n    if (s_MonoAssembliesCount == 0)\n        il2cpp_mono_init_assemblies();\n\n    assert(index < s_MonoAssembliesCount && \"assembly index is out of range\");\n    return s_MonoAssemblies[index];\n}\n\nMonoAssembly* il2cpp_mono_assembly_from_name(const char* name)\n{\n    // First look for the cached assembly in the domain.\n    MonoAssembly* assembly = mono_domain_assembly_open(mono_domain_get(), name);\n    if (assembly == NULL)\n    {\n        // If we can't find it, look in the path we've set to find assemblies.\n        MonoImageOpenStatus unused;\n        assembly = mono_assembly_load_with_partial_name(name, &unused);\n    }\n\n    return assembly;\n}\n\nMonoMethod* il2cpp_mono_get_virtual_target_method(MonoMethod* method, MonoObject* obj)\n{\n    // This is *very* slow, and likely not good enough for production. It is good enough for proof of concept though.\n    MonoMethod* target_method = mono_object_get_virtual_method(obj, method);\n\n    if (mono_unity_class_is_array(mono_unity_method_get_class(target_method)))\n        target_method = mono_unity_method_get_aot_array_helper_from_wrapper(target_method);\n\n    return target_method;\n}\n\nMonoMethod* il2cpp_mono_get_virtual_target_method_fast(MonoMethod* method, MonoObject* obj)\n{\n    if (method->flags & METHOD_ATTRIBUTE_FINAL)\n        return method;\n\n    MonoClass *klass = obj->vtable->klass;\n    if (!klass->vtable)\n        mono_class_setup_vtable(klass);\n\n    MonoMethod* target_method = klass->vtable[method->slot];\n\n    if (target_method->klass->rank > 0)\n        target_method = mono_unity_method_get_aot_array_helper_from_wrapper(target_method);\n\n    return target_method;\n}\n\nMonoMethod* il2cpp_mono_get_interface_target_method_fast(MonoMethod* method, MonoObject* obj)\n{\n    if (method->flags & METHOD_ATTRIBUTE_FINAL)\n        return method;\n\n    MonoClass *klass = obj->vtable->klass;\n    if (!klass->vtable)\n        mono_class_setup_vtable(klass);\n\n    gboolean variance_used = 0;\n    int iface_offset = mono_class_interface_offset_with_variance(klass, method->klass, &variance_used);\n    MonoMethod* target_method = klass->vtable[iface_offset + method->slot];\n\n    if (target_method->klass->rank > 0)\n        target_method = mono_unity_method_get_aot_array_helper_from_wrapper(target_method);\n\n    return target_method;\n}\n\nvoid il2cpp_mono_get_invoke_data(MonoMethod* method, void* obj, VirtualInvokeData* invokeData)\n{\n    MonoMethod* target_method = il2cpp_mono_get_virtual_target_method(method, (MonoObject*)obj);\n\n    MonoError error;\n    il2cpp_mono_method_initialize_function_pointers(target_method, &error);\n    if (!il2cpp_mono_error_ok(&error))\n        mono_error_raise_exception(&error);\n    invokeData->methodPtr = (Il2CppMethodPointer)mono_unity_method_get_method_pointer(target_method);\n    invokeData->method = target_method;\n}\n\nvoid il2cpp_mono_get_virtual_invoke_data(MonoMethod* method, void* obj, VirtualInvokeData* invokeData)\n{\n    MonoMethod* target_method = il2cpp_mono_get_virtual_target_method_fast(method, (MonoObject*)obj);\n\n    MonoError error;\n    il2cpp_mono_method_initialize_function_pointers(target_method, &error);\n    if (!il2cpp_mono_error_ok(&error))\n        mono_error_raise_exception(&error);\n    invokeData->methodPtr = (Il2CppMethodPointer)mono_unity_method_get_method_pointer(target_method);\n    invokeData->method = target_method;\n}\n\nvoid il2cpp_mono_get_interface_invoke_data(MonoMethod* method, void* obj, VirtualInvokeData* invokeData)\n{\n    MonoMethod* target_method = il2cpp_mono_get_interface_target_method_fast(method, (MonoObject*)obj);\n\n    MonoError error;\n    il2cpp_mono_method_initialize_function_pointers(target_method, &error);\n    if (!il2cpp_mono_error_ok(&error))\n        mono_error_raise_exception(&error);\n    invokeData->methodPtr = (Il2CppMethodPointer)mono_unity_method_get_method_pointer(target_method);\n    invokeData->method = target_method;\n}\n\nstatic MonoClass* InflateGenericParameter(MonoGenericContainer* genericContainer, MonoGenericContext* context, const MonoRGCTXDefinition* rgctxDefintion)\n{\n    MonoClass* genericParameter = mono_unity_generic_container_get_parameter_class(genericContainer, rgctxDefintion->generic_parameter_index);\n    return mono_unity_class_inflate_generic_class(genericParameter, context);\n}\n\nstatic MonoClass* LookupGenericClassMetadata(MonoGenericContext* context, const MonoRGCTXDefinition* rgctxDefintion)\n{\n    return mono_class_get_full(mono_assembly_get_image(il2cpp_mono_assembly_from_index(rgctxDefintion->assemblyIndex)), rgctxDefintion->token, context);\n}\n\nstatic void* LookupMetadataFromRGCTX(const MonoRGCTXDefinition* definition, bool useSharedVersion, MonoGenericContext* context, MonoGenericContainer* genericContainer)\n{\n    if (definition->type == IL2CPP_RGCTX_DATA_CLASS)\n    {\n        if (mono_metadata_token_table(definition->token) == MONO_TABLE_GENERICPARAM)\n            return InflateGenericParameter(genericContainer, context, definition);\n        else if (mono_metadata_token_table(definition->token) == MONO_TABLE_TYPESPEC)\n            return LookupGenericClassMetadata(context, definition);\n        else\n            assert(0 && \"RGCTX case is not implemented yet.\");\n    }\n    else if (definition->type == IL2CPP_RGCTX_DATA_ARRAY)\n    {\n        if (mono_metadata_token_table(definition->token) == MONO_TABLE_GENERICPARAM)\n            return mono_array_class_get(InflateGenericParameter(genericContainer, context, definition), 1);\n        else if (mono_metadata_token_table(definition->token) == MONO_TABLE_TYPESPEC)\n            return mono_array_class_get(LookupGenericClassMetadata(context, definition), 1);\n        else\n            assert(0 && \"RGCTX case is not implemented yet.\");\n    }\n    else if (definition->type == IL2CPP_RGCTX_DATA_METHOD)\n    {\n        MonoMethod* methodDefinition = mono_get_method(mono_assembly_get_image(il2cpp_mono_assembly_from_index(definition->assemblyIndex)), definition->token, NULL);\n        return InflateGenericMethodWithContext(methodDefinition, context, useSharedVersion);\n    }\n    else if (definition->type == IL2CPP_RGCTX_DATA_TYPE)\n    {\n        if (mono_metadata_token_table(definition->token) == MONO_TABLE_GENERICPARAM)\n            return mono_class_get_type(InflateGenericParameter(genericContainer, context, definition));\n        else if (mono_metadata_token_table(definition->token) == MONO_TABLE_TYPESPEC)\n            return mono_class_get_type(LookupGenericClassMetadata(context, definition));\n        else\n            assert(0 && \"RGCTX case is not implemented yet.\");\n    }\n    else\n    {\n        assert(0 && \"RGCTX case is not implemented yet.\");\n    }\n\n    return NULL;\n}\n\nvoid* LookupMetadataFromHash(uint64_t hash, Il2CppRGCTXDataType rgctxType, int rgctxIndex, bool useSharedVersion, MonoGenericContext* context, MonoGenericContainer* genericContainer)\n{\n    const RuntimeGenericContextInfo* rgctxInfo = mono::vm::MetadataCache::GetRGCTXInfoFromHash(hash);\n    if (rgctxInfo)\n    {\n        const MonoRGCTXDefinition* definition = mono::vm::MetadataCache::GetMonoRGCTXDefinition(rgctxInfo->rgctxStart + rgctxIndex);\n        if (definition->type == rgctxType)\n            return LookupMetadataFromRGCTX(definition, useSharedVersion, context, genericContainer);\n    }\n\n    return NULL;\n}\n\nvoid* il2cpp_mono_class_rgctx(MonoClass* klass, Il2CppRGCTXDataType rgctxType, int rgctxIndex, bool useSharedVersion)\n{\n    uint64_t hash = mono_unity_type_get_hash(mono_class_get_type(klass), false);\n    return LookupMetadataFromHash(hash, rgctxType, rgctxIndex, useSharedVersion,\n        mono_class_get_context(klass), mono_class_get_generic_container(mono_unity_class_get_generic_definition(klass)));\n}\n\nvoid* il2cpp_mono_method_rgctx(MonoMethod* method, Il2CppRGCTXDataType rgctxType, int rgctxIndex, bool useSharedVersion)\n{\n    uint64_t hash = mono_unity_method_get_hash(method, false);\n    return LookupMetadataFromHash(hash, rgctxType, rgctxIndex, useSharedVersion,\n        mono_method_get_context(method), mono_method_get_generic_container(mono_unity_method_get_generic_definition(method)));\n}\n\nstatic MonoClass* ClassFromIndex(TypeIndex index);\n\nstatic MonoClass* InflateGenericClass(MonoClass* generic_class, uint32_t num_indices, const TypeIndex *generic_indices)\n{\n    std::vector<MonoType*> arguments(num_indices);\n    for (uint32_t i = 0; i < num_indices; ++i)\n        arguments[i] = mono_class_get_type(ClassFromIndex(generic_indices[i]));\n\n    MonoGenericInst* generic_instance = mono_metadata_get_generic_inst(num_indices, &arguments[0]);\n    MonoGenericContext context;\n    context.class_inst = generic_instance;\n    context.method_inst = NULL;\n    MonoError unused;\n    MonoClass* inflated_class = mono_class_inflate_generic_class_checked(generic_class, &context, &unused);\n    mono_class_init(inflated_class);\n\n    return inflated_class;\n}\n\nstatic MonoClass* ClassFromMetadata(const MonoClassMetadata *classMetadata)\n{\n    if (classMetadata->rank > 0)\n    {\n        MonoClass *klass = ClassFromIndex(classMetadata->elementTypeIndex);\n        MonoClass *aklass = mono_array_class_get(klass, classMetadata->rank);\n        mono_class_init(aklass);\n        return aklass;\n    }\n\n    MonoClass *klass = mono_class_get(mono_assembly_get_image(il2cpp_mono_assembly_from_index(classMetadata->metadataToken.assemblyIndex)), classMetadata->metadataToken.token);\n    mono_class_init(klass);\n    return klass;\n}\n\nstatic MonoClass* ClassFromIndex(TypeIndex index)\n{\n    if (index == kTypeIndexInvalid)\n        return NULL;\n\n    const MonoClassMetadata* classMetadata = mono::vm::MetadataCache::GetClassMetadataFromIndex(index);\n\n    MonoClass* klass = ClassFromMetadata(classMetadata);\n    if (classMetadata->genericParametersCount != 0)\n        klass = InflateGenericClass(klass, classMetadata->genericParametersCount, mono::vm::MetadataCache::GetGenericArgumentIndices(classMetadata->genericParametersOffset));\n\n    if (classMetadata->isPointer)\n        klass = mono_ptr_class_get(mono_class_get_type(klass));\n\n    return klass;\n}\n\nstatic MonoClassField* FieldFromIndex(EncodedMethodIndex index)\n{\n    const MonoFieldMetadata* fieldMetadata = mono::vm::MetadataCache::GetFieldMetadataFromIndex(index);\n    return mono_class_get_field(ClassFromIndex(fieldMetadata->parentTypeIndex), fieldMetadata->token);\n}\n\nstatic MonoType* TypeFromIndex(TypeIndex index)\n{\n    if (index == kTypeIndexInvalid)\n        return NULL;\n\n    return mono_class_get_type(ClassFromIndex(index));\n}\n\nMonoMethod* MethodFromIndex(MethodIndex index)\n{\n    const MonoMetadataToken* method = &mono::vm::MetadataCache::GetMonoMethodMetadataFromIndex(index)->metadataToken;\n    return mono_get_method(mono_assembly_get_image(il2cpp_mono_assembly_from_index(method->assemblyIndex)), method->token, NULL);\n}\n\nstatic std::vector<MonoType*> GenericArgumentsFromInst(const MonoGenericInstMetadata *inst)\n{\n    std::vector<MonoType*> arguments;\n\n    uint32_t numberOfGenericArguments = inst->type_argc;\n    if (numberOfGenericArguments == 0)\n        return arguments;\n\n    for (uint32_t i = 0; i < numberOfGenericArguments; ++i)\n    {\n        const TypeIndex argIndex = inst->type_argv_indices[i];\n        arguments.push_back(mono_class_get_type(ClassFromIndex(argIndex)));\n    }\n\n    return arguments;\n}\n\nstatic MonoGenericInst* GenericInstFromIndex(GenericInstIndex index)\n{\n    if (index == -1)\n        return NULL;\n\n    const MonoGenericInstMetadata* inst = g_MonoGenericInstMetadataTable[index];\n\n    // Replace this with dynamic_array later when we get the libil2cpp utilities build sorted out.\n    std::vector<MonoType*> genericArguments = GenericArgumentsFromInst(inst);\n\n    size_t numberOfGenericArguments = genericArguments.size();\n    if (numberOfGenericArguments == 0)\n        return NULL;\n\n    return mono_metadata_get_generic_inst((int)numberOfGenericArguments, &genericArguments[0]);\n}\n\nMonoMethod* GenericMethodFromIndex(MethodIndex index)\n{\n    const Il2CppMethodSpec* methodSpec = &g_Il2CppMethodSpecTable[index];\n\n    MonoMethod* methodDefinition = MethodFromIndex(methodSpec->methodDefinitionIndex);\n    MonoGenericContext generic_context = { GenericInstFromIndex(methodSpec->classIndexIndex) , GenericInstFromIndex(methodSpec->methodIndexIndex) };\n\n    return mono_class_inflate_generic_method(methodDefinition, &generic_context);\n}\n\nstatic MonoString* StringFromIndex(StringIndex index)\n{\n    const MonoMetadataToken* stringMetadata = mono::vm::MetadataCache::GetMonoStringTokenFromIndex(index);\n    return mono_ldstr(mono_domain_get(), mono_assembly_get_image(il2cpp_mono_assembly_from_index(stringMetadata->assemblyIndex)), mono_metadata_token_index(stringMetadata->token));\n}\n\nvoid il2cpp_mono_initialize_method_metadata(uint32_t index)\n{\n    const Il2CppMetadataUsageList* usageList = mono::vm::MetadataCache::GetMetadataUsageList(index);\n\n    uint32_t start = usageList->start;\n    uint32_t count = usageList->count;\n\n    for (uint32_t i = 0; i < count; i++)\n    {\n        uint32_t offset = start + i;\n\n        const Il2CppMetadataUsagePair* usagePair = mono::vm::MetadataCache::GetMetadataUsagePair(offset);\n        uint32_t destinationIndex = usagePair->destinationIndex;\n        uint32_t encodedSourceIndex = usagePair->encodedSourceIndex;\n\n        Il2CppMetadataUsage usage = GetEncodedIndexType(encodedSourceIndex);\n        uint32_t decodedIndex = GetDecodedMethodIndex(encodedSourceIndex);\n        switch (usage)\n        {\n            case kIl2CppMetadataUsageTypeInfo:\n                *g_MetadataUsages[destinationIndex] = ClassFromIndex(decodedIndex);\n                break;\n            case kIl2CppMetadataUsageFieldInfo:\n                *g_MetadataUsages[destinationIndex] = FieldFromIndex(decodedIndex);\n                break;\n            case kIl2CppMetadataUsageIl2CppType:\n                *g_MetadataUsages[destinationIndex] = TypeFromIndex(decodedIndex);\n                break;\n            case kIl2CppMetadataUsageMethodDef:\n                *g_MetadataUsages[destinationIndex] = MethodFromIndex(decodedIndex);\n                break;\n            case kIl2CppMetadataUsageMethodRef:\n                *g_MetadataUsages[destinationIndex] = GenericMethodFromIndex(decodedIndex);\n                break;\n            case kIl2CppMetadataUsageStringLiteral:\n                *g_MetadataUsages[destinationIndex] = StringFromIndex(decodedIndex);\n                break;\n            default:\n                assert(0 && \"Unimplemented case for method metadata usage.\");\n                break;\n        }\n    }\n}\n\nvoid il2cpp_mono_raise_execution_engine_exception_if_method_is_not_found(MonoMethod* method)\n{\n    MonoError unused;\n    il2cpp_mono_method_initialize_function_pointers(method, &unused);\n\n    if (mono_unity_method_get_method_pointer(method) == NULL)\n    {\n        MonoException *exc;\n\n        if (mono_unity_method_get_class(method) != NULL)\n            exc = mono_get_exception_execution_engine(mono_method_get_name_full(method, true, false, MONO_TYPE_NAME_FORMAT_IL));\n        else\n            exc = mono_get_exception_execution_engine(mono_unity_method_get_name(method));\n\n        mono_raise_exception(exc);\n    }\n}\n\nstd::vector<uintptr_t> il2cpp_to_mono_array_dimensions(il2cpp_array_size_t* il2cppDimensions, int32_t numberOfElements)\n{\n    std::vector<uintptr_t> monoDimensions(numberOfElements);\n    for (int32_t i = 0; i < numberOfElements; ++i)\n        monoDimensions[i] = il2cppDimensions[i];\n\n    return monoDimensions;\n}\n\nIl2CppAsyncResult* il2cpp_mono_delegate_begin_invoke(Il2CppDelegate* delegate, void** params, Il2CppDelegate* asyncCallback, MonoObject* state)\n{\n    int numParams = mono_signature_get_param_count(mono_method_signature((MonoMethod*)delegate->method));\n    MonoObject *nullState = NULL;\n    Il2CppDelegate *nullCallback = NULL;\n\n    std::vector<void*> newParams(numParams + 2);\n    for (int i = 0; i < numParams; ++i)\n        newParams[i] = params[i];\n\n    //If the state and the callback are both null and there are no other params, we will send null for the params array\n    newParams[numParams] = &nullCallback;\n    newParams[numParams + 1] = &nullState;\n    int numNewParams = numParams;\n\n    if (asyncCallback)\n    {\n        newParams[numParams] = &asyncCallback;\n        ++numNewParams;\n    }\n\n    if (state)\n    {\n        newParams[numParams + 1] = &state;\n        ++numNewParams;\n    }\n\n    MonoError unused;\n    return (Il2CppAsyncResult*)mono_threadpool_ms_begin_invoke(mono_domain_get(), (MonoObject*)delegate, (MonoMethod*)delegate->method, numNewParams != 0 ? &newParams[0] : NULL, &unused);\n}\n\nstatic void MonoArrayGetGenericValue(MonoArray* array, int32_t pos, void* value)\n{\n    MonoObject *obj = mono_array_get(array, MonoObject*, pos);\n    MonoClass *klass = mono_unity_object_get_class(obj);\n\n    if (mono_class_is_valuetype(klass))\n        memcpy(value, mono_object_unbox(obj), mono_class_instance_size(klass) - sizeof(MonoObject));\n    else\n        memcpy(value, &obj, mono_unity_array_get_element_size(array));\n}\n\nMonoObject* il2cpp_mono_delegate_end_invoke(Il2CppAsyncResult* asyncResult, void **out_args)\n{\n    MonoError unused;\n    MonoObject *exc = NULL;\n    MonoArray *mono_out_args = NULL;\n    MonoObject *retVal = (MonoObject*)mono_threadpool_ms_end_invoke((MonoAsyncResult*)asyncResult, &mono_out_args, &exc, &unused);\n\n    if (exc)\n        mono_raise_exception((MonoException*)exc);\n\n    uint32_t numArgs = mono_unity_array_get_max_length(mono_out_args);\n\n    for (uint32_t i = 0; i < numArgs; ++i)\n        MonoArrayGetGenericValue(mono_out_args, i, out_args[i]);\n\n    return retVal;\n}\n\nMonoArray* MonoArrayNew(MonoClass* elementType, uintptr_t length)\n{\n    MonoError unused;\n    return mono_array_new_specific_checked(mono_class_vtable(mono_domain_get(), mono_array_class_get(elementType, 1)), length, &unused);\n}\n\n#if IL2CPP_ENABLE_NATIVE_STACKTRACES\nvoid RegisterAllManagedMethods()\n{\n    uint32_t numberOfMethods = g_CodeRegistration.methodPointersCount;\n    uint32_t numberOfGenericMethods = g_CodeRegistration.genericMethodPointersCount;\n\n    std::vector<MethodDefinitionKey> managedMethods(numberOfMethods + numberOfGenericMethods);\n\n    for (uint32_t i = 0; i < numberOfMethods; ++i)\n    {\n        MethodDefinitionKey currentMethod;\n        currentMethod.methodIndex = mono::vm::MetadataCache::GetMethodIndex(i);\n        currentMethod.method = g_CodeRegistration.methodPointers[i];\n        currentMethod.isGeneric = false;\n        managedMethods.push_back(currentMethod);\n    }\n\n    for (uint32_t i = 0; i < numberOfGenericMethods; ++i)\n    {\n        MethodDefinitionKey currentMethod;\n        currentMethod.methodIndex = mono::vm::MetadataCache::GetGenericMethodIndex(i);\n        currentMethod.method = g_CodeRegistration.genericMethodPointers[i];\n        currentMethod.isGeneric = true;\n        managedMethods.push_back(currentMethod);\n    }\n\n    il2cpp::utils::NativeSymbol::RegisterMethods(managedMethods);\n}\n\n#endif // IL2CPP_ENABLE_NATIVE_STACKTRACES\n\nvoid RuntimeInit(MonoClass* klass)\n{\n    MonoError error;\n    mono_runtime_class_init_full(mono_class_vtable(mono_domain_get(), klass), &error);\n    if (!il2cpp_mono_error_ok(&error))\n        mono_error_raise_exception(&error);\n}\n\nstd::string il2cpp_mono_format_exception(const MonoException *exc)\n{\n    MonoClass *klass = mono_object_get_class((MonoObject*)exc);\n    std::string exception_namespace = mono_class_get_namespace(klass);\n    std::string exception_type = mono_class_get_name(klass);\n    MonoString *message = mono_unity_exception_get_message(const_cast<MonoException*>(exc));\n    if (message)\n        return exception_namespace + \".\" + exception_type + \": \" + mono_string_to_utf8(message);\n    else\n        return exception_namespace + \".\" + exception_type;\n}\n\nextern \"C\"\n{\nvoid il2cpp_set_temp_dir(char *temp_dir)\n{\n    assert(0 && \"This needs to be implemented for Android\");\n}\n}\n\n#endif //RUNTIME_MONO\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono-runtime/il2cpp-mono-support.h",
    "content": "#pragma once\n\n#if RUNTIME_MONO\n\n#include \"il2cpp-metadata.h\"\n#include <vector>\n\nstruct MethodInfo;\nstruct VirtualInvokeData;\nstruct Il2CppInteropData;\n\nvoid il2cpp_mono_method_initialize_function_pointers(MonoMethod* method, MonoError* error);\nMonoAssembly* il2cpp_mono_assembly_from_index(AssemblyIndex index);\nvoid* il2cpp_mono_class_rgctx(MonoClass* klass, Il2CppRGCTXDataType rgctxType, int rgctxIndex, bool useSharedVersion);\nvoid* il2cpp_mono_method_rgctx(MonoMethod* method, Il2CppRGCTXDataType rgctxType, int rgctxIndex, bool useSharedVersion);\nMonoMethod* il2cpp_mono_get_virtual_target_method(MonoMethod* method, MonoObject* obj);\nvoid il2cpp_mono_get_invoke_data(MonoMethod* method, void* obj, VirtualInvokeData* invokeData);\nvoid il2cpp_mono_get_virtual_invoke_data(MonoMethod* method, void* obj, VirtualInvokeData* invokeData);\nvoid il2cpp_mono_get_interface_invoke_data(MonoMethod* method, void* obj, VirtualInvokeData* invokeData);\nvoid il2cpp_mono_initialize_method_metadata(uint32_t index);\nvoid il2cpp_mono_raise_execution_engine_exception_if_method_is_not_found(MonoMethod* method);\nstd::vector<uintptr_t> il2cpp_to_mono_array_dimensions(il2cpp_array_size_t* il2cppDimensions, int32_t numberOfElements);\nIl2CppAsyncResult* il2cpp_mono_delegate_begin_invoke(Il2CppDelegate* delegate, void** params, Il2CppDelegate* asyncCallback, MonoObject* state);\nMonoObject* il2cpp_mono_delegate_end_invoke(Il2CppAsyncResult* asyncResult, void **out_args);\nMonoArray* MonoArrayNew(MonoClass* elementType, uintptr_t length);\nMonoMethod* MethodFromIndex(MethodIndex index);\nMonoMethod* GenericMethodFromIndex(MethodIndex index);\nconst Il2CppInteropData* FindInteropDataFor(MonoClass* klass);\nvoid RuntimeInit(MonoClass* klass);\nstd::string il2cpp_mono_format_exception(const MonoException *exc);\nvoid initialize_interop_data_map();\nbool il2cpp_mono_error_ok(MonoError *error);\n\n#if IL2CPP_ENABLE_NATIVE_STACKTRACES\nstruct MethodDefinitionKey\n{\n    Il2CppMethodPointer method;\n    MethodIndex methodIndex;\n    bool isGeneric;\n};\n\nvoid RegisterAllManagedMethods();\n#endif // IL2CPP_ENABLE_NATIVE_STACKTRACES\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono-structs.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"mono-structs.h\"\n#include \"utils/Memory.h\"\n\nGPtrArray* void_ptr_array_to_gptr_array(const VoidPtrArray& array)\n{\n    GPtrArray *pRetVal;\n\n    pRetVal = (GPtrArray*)IL2CPP_MALLOC(sizeof(GPtrArray));\n\n    pRetVal->len = (unsigned int)array.size();\n    if (pRetVal->len > 0)\n    {\n        size_t numBytes = sizeof(void*) * pRetVal->len;\n        pRetVal->pdata = IL2CPP_MALLOC(numBytes);\n        memcpy(pRetVal->pdata, array.data(), numBytes);\n    }\n    else\n    {\n        pRetVal->pdata = NULL;\n    }\n\n    return pRetVal;\n}\n\nGPtrArray* empty_gptr_array()\n{\n    GPtrArray *pRetVal = (GPtrArray*)IL2CPP_MALLOC(sizeof(GPtrArray));\n    pRetVal->len = 0;\n    pRetVal->pdata = NULL;\n    return pRetVal;\n}\n\nvoid free_gptr_array(GPtrArray *pArray)\n{\n    if (!pArray)\n        return;\n\n    if (pArray->pdata)\n    {\n        IL2CPP_FREE(pArray->pdata);\n        pArray->pdata = NULL;\n    }\n\n    IL2CPP_FREE(pArray);\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/mono-structs.h",
    "content": "#pragma once\n\n#include \"utils/dynamic_array.h\"\n#include \"object-internals.h\"\n\nstruct GPtrArray\n{\n    void *pdata;\n    unsigned int len;\n};\n\ntypedef il2cpp::utils::dynamic_array<void*> VoidPtrArray;\n\nGPtrArray* void_ptr_array_to_gptr_array(const VoidPtrArray& array);\nGPtrArray* empty_gptr_array();\nvoid free_gptr_array(GPtrArray *pArray);\n\nstruct MonoGenericParameterInfo\n{\n    Il2CppClass *pklass;        /* The corresponding `MonoClass'. */\n    const char *name;\n\n    // See GenericParameterAttributes\n    unsigned short flags;\n\n    unsigned int token;\n\n    // Constraints on type parameters\n    Il2CppClass** constraints; /* NULL means end of list */\n};\n\nstruct  PublicKeyTokenFixedBuffer\n{\n    union\n    {\n        struct\n        {\n            // System.Byte Mono.MonoAssemblyName/<public_key_token>__FixedBuffer0::FixedElementField\n            uint8_t FixedElementField;\n        };\n        uint8_t padding[17];\n    };\n};\n\nstruct  Il2CppMonoAssemblyName\n{\n    // System.IntPtr Mono.MonoAssemblyName::name\n    Il2CppIntPtr name;\n    // System.IntPtr Mono.MonoAssemblyName::culture\n    Il2CppIntPtr culture;\n    // System.IntPtr Mono.MonoAssemblyName::hash_value\n    Il2CppIntPtr hash_value;\n    // System.IntPtr Mono.MonoAssemblyName::public_key\n    Il2CppIntPtr public_key;\n    // Mono.MonoAssemblyName/<public_key_token>__FixedBuffer0 Mono.MonoAssemblyName::public_key_token\n    PublicKeyTokenFixedBuffer  public_key_token;\n    // System.UInt32 Mono.MonoAssemblyName::hash_alg\n    uint32_t hash_alg;\n    // System.UInt32 Mono.MonoAssemblyName::hash_len\n    uint32_t hash_len;\n    // System.UInt32 Mono.MonoAssemblyName::flags\n    uint32_t flags;\n    // System.UInt16 Mono.MonoAssemblyName::major\n    uint16_t major;\n    // System.UInt16 Mono.MonoAssemblyName::minor\n    uint16_t minor;\n    // System.UInt16 Mono.MonoAssemblyName::build\n    uint16_t build;\n    // System.UInt16 Mono.MonoAssemblyName::revision\n    uint16_t revision;\n    // System.UInt16 Mono.MonoAssemblyName::arch\n    uint16_t arch;\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/normalization-tables.h",
    "content": "static const uint8_t props[] =\n{\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 0,\n    0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,\n    128, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0,\n    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,\n    128, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 0, 0, 0, 0, 0, 0, 0, 146, 0, 18, 0, 0, 0, 0, 18,\n    0, 0, 18, 18, 146, 18, 0, 128, 18, 18, 18, 0, 18, 18, 18, 0,\n    3, 3, 131, 3, 131, 131, 128, 131, 3, 3, 131, 3, 3, 3, 3, 131,\n    0, 3, 3, 3, 131, 131, 131, 0, 128, 3, 3, 3, 131, 3, 0, 0,\n    3, 3, 131, 3, 131, 131, 128, 131, 3, 3, 131, 3, 3, 3, 3, 131,\n    0, 3, 3, 3, 131, 131, 131, 0, 128, 3, 3, 3, 131, 3, 0, 3,\n    3, 3, 131, 131, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    0, 0, 131, 131, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 0, 18, 18, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 18,\n    18, 0, 0, 3, 3, 3, 3, 3, 3, 18, 0, 0, 131, 131, 3, 3,\n    3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 131, 131, 3, 3, 3, 3,\n    131, 131, 3, 3, 3, 3, 0, 0, 131, 131, 131, 131, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 146,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131,\n    131, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3,\n    3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 131, 131, 3, 3, 3, 3,\n    3, 18, 18, 18, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3,\n    0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 3, 3, 3, 3, 131, 131,\n    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 128, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 0, 0,\n    18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    168, 168, 168, 168, 168, 0, 168, 168, 168, 168, 168, 168, 168, 0, 0, 168,\n    0, 168, 0, 168, 168, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0,\n    0, 0, 0, 168, 168, 168, 168, 168, 168, 0, 0, 0, 0, 168, 168, 0,\n    168, 168, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0,\n    87, 87, 168, 87, 87, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 18, 0, 0, 0, 87, 0,\n    0, 0, 0, 0, 18, 147, 131, 87, 131, 131, 131, 0, 131, 0, 131, 131,\n    131, 128, 0, 0, 0, 128, 0, 128, 0, 128, 0, 0, 0, 0, 0, 128,\n    0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 3, 3, 131, 131, 131, 131,\n    131, 128, 0, 0, 0, 128, 0, 128, 0, 128, 0, 0, 0, 0, 0, 128,\n    0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 131, 131, 131, 131, 131, 0,\n    18, 18, 146, 19, 19, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 18, 0, 18, 18, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0,\n    3, 3, 0, 3, 0, 0, 128, 3, 0, 0, 0, 0, 3, 3, 3, 0,\n    128, 0, 0, 128, 0, 128, 128, 128, 128, 3, 128, 0, 0, 0, 128, 0,\n    0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 128, 0, 0,\n    128, 0, 0, 128, 0, 128, 128, 128, 128, 3, 128, 0, 0, 0, 128, 0,\n    0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 128, 0, 0,\n    3, 3, 0, 3, 0, 0, 128, 3, 0, 0, 0, 0, 3, 3, 3, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 128, 128, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3, 3, 3, 3, 0, 0, 3, 3, 128, 128, 3, 3, 3, 3, 3, 3,\n    0, 0, 3, 3, 3, 3, 3, 3, 128, 128, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 128, 0, 0, 128, 128, 128, 0, 0, 128, 0, 0, 128,\n    0, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    128, 128, 128, 128, 128, 128, 128, 0, 128, 128, 128, 128, 128, 0, 128, 0,\n    128, 128, 0, 128, 128, 0, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0,\n    0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 3, 3, 3, 3, 3, 128, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 128, 0, 0, 0, 0, 0,\n    0, 0, 0, 168, 168, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3, 128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 128, 3, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 128, 128, 128, 0, 0, 0, 0, 128, 0, 0, 0,\n    0, 128, 128, 0, 0, 0, 0, 0, 128, 3, 0, 128, 0, 0, 0, 128,\n    128, 3, 0, 128, 3, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 87, 87, 87, 87, 87, 87, 87, 87,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 168, 0,\n    0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 3, 3, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 87, 87, 0, 87,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 128, 128, 0, 0, 0, 0, 128, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0,\n    0, 0, 128, 87, 0, 0, 87, 0, 128, 0, 0, 0, 128, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 87, 87, 0, 0, 87, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 168, 0,\n    0, 0, 0, 0, 0, 0, 0, 128, 3, 0, 0, 3, 3, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 168, 168, 0, 0, 0, 0, 87, 87, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 128, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 0,\n    0, 0, 0, 0, 0, 0, 128, 128, 0, 0, 3, 3, 3, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 128, 0, 3, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128,\n    3, 0, 168, 0, 0, 0, 128, 3, 3, 0, 131, 3, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 168, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 0,\n    0, 0, 0, 0, 0, 0, 128, 128, 0, 0, 3, 3, 3, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 168,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 3, 0, 131, 3, 3, 168,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    128, 0, 128, 87, 0, 0, 0, 0, 0, 0, 0, 0, 128, 87, 0, 0,\n    0, 128, 87, 0, 0, 0, 128, 87, 0, 0, 0, 128, 87, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0,\n    0, 128, 128, 87, 128, 87, 87, 18, 87, 18, 0, 0, 0, 0, 0, 0,\n    128, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    128, 0, 128, 87, 0, 0, 0, 0, 0, 0, 0, 0, 128, 87, 0, 0,\n    0, 128, 87, 0, 0, 0, 128, 87, 0, 0, 0, 128, 87, 0, 0, 0,\n    0, 0, 128, 128, 0, 128, 0, 128, 0, 87, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 128, 3, 0, 0, 0, 0, 0, 0, 0, 168, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n    40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 40, 40, 40,\n    40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n    40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 0,\n    0, 128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 128, 3, 128, 3, 128, 128,\n    3, 3, 128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 131, 131, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 131, 131, 3, 3, 3, 3,\n    3, 3, 131, 131, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 18, 19, 0, 0, 0, 0,\n    131, 131, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 131, 131, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 131, 131, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,\n    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,\n    131, 131, 3, 3, 3, 3, 0, 0, 131, 131, 3, 3, 3, 3, 0, 0,\n    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,\n    131, 131, 3, 3, 3, 3, 3, 3, 131, 131, 3, 3, 3, 3, 3, 3,\n    131, 131, 3, 3, 3, 3, 0, 0, 131, 131, 3, 3, 3, 3, 0, 0,\n    131, 131, 3, 3, 3, 3, 3, 3, 0, 131, 0, 3, 0, 3, 0, 3,\n    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,\n    131, 87, 3, 87, 131, 87, 3, 87, 3, 87, 3, 87, 131, 87, 0, 0,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 0, 131, 3, 3, 3, 3, 87, 3, 18, 87, 146,\n    18, 19, 3, 3, 3, 0, 131, 3, 3, 87, 3, 87, 3, 19, 19, 19,\n    3, 3, 3, 87, 0, 0, 3, 3, 3, 3, 3, 87, 0, 19, 19, 19,\n    3, 3, 3, 87, 3, 3, 3, 3, 3, 3, 3, 87, 3, 19, 87, 87,\n    0, 0, 3, 3, 3, 0, 131, 3, 3, 87, 3, 87, 3, 87, 146, 0,\n    87, 87, 146, 146, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0,\n    0, 18, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 18,\n    0, 0, 0, 18, 18, 0, 18, 18, 0, 0, 0, 0, 18, 0, 18, 0,\n    0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 18,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0,\n    18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 0, 18, 18, 0, 0, 18, 18, 18, 18, 18, 0, 0,\n    18, 18, 18, 0, 18, 0, 87, 0, 18, 0, 87, 87, 18, 18, 0, 18,\n    18, 18, 0, 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18,\n    18, 0, 0, 0, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    128, 0, 128, 0, 128, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3,\n    128, 0, 128, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 128, 3, 0, 0, 0, 128, 3, 0, 128, 3, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 128, 3, 128, 3, 0, 0, 0, 0, 0, 18, 18, 0, 18,\n    18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0,\n    0, 3, 0, 128, 3, 128, 0, 3, 128, 3, 0, 0, 0, 128, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3, 128, 3, 0, 128, 128, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3,\n    3, 3, 128, 128, 3, 3, 128, 128, 3, 3, 128, 128, 128, 128, 0, 0,\n    3, 3, 128, 128, 3, 3, 128, 128, 3, 3, 0, 0, 0, 0, 0, 0,\n    0, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 128, 0, 0, 0, 0, 0, 128, 128, 0, 128, 3, 3, 3, 3,\n    0, 0, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 87, 0, 0, 0, 0, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 128, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 0, 0, 0, 0, 0, 0, 0, 128, 128, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 18, 0, 18, 18, 18, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 128, 3, 128, 3, 128,\n    3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128,\n    3, 128, 3, 0, 128, 3, 128, 3, 128, 3, 0, 0, 0, 0, 0, 128,\n    3, 3, 128, 3, 3, 128, 3, 3, 128, 3, 3, 128, 3, 3, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 3, 0, 0, 0, 0, 168, 168, 18, 18, 128, 3, 18,\n    0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 128, 3, 128, 3, 128,\n    3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128,\n    3, 128, 3, 0, 128, 3, 128, 3, 128, 3, 0, 0, 0, 0, 0, 128,\n    3, 3, 128, 3, 3, 128, 3, 3, 128, 3, 3, 128, 3, 3, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128,\n    128, 128, 128, 0, 3, 0, 0, 3, 3, 3, 3, 0, 0, 128, 3, 18,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0,\n    0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 0,\n    87, 0, 87, 0, 0, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0,\n    87, 0, 87, 0, 0, 87, 87, 0, 0, 0, 87, 87, 87, 87, 0, 0,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 0, 0, 0, 0,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 87, 0, 87,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 87, 87, 87, 87, 87, 87,\n    87, 87, 87, 87, 87, 87, 87, 0, 87, 87, 87, 87, 87, 0, 87, 0,\n    87, 87, 0, 87, 87, 0, 87, 87, 87, 215, 87, 87, 87, 87, 87, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 0, 0, 0, 0,\n    18, 18, 18, 0, 18, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0,\n    0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0,\n    0, 0, 18, 18, 18, 18, 18, 18, 0, 0, 18, 18, 18, 18, 18, 18,\n    0, 0, 18, 18, 18, 18, 18, 18, 0, 0, 18, 18, 18, 0, 0, 0,\n    18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 18, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0\n};\nstatic const uint32_t mappedChars[] =\n{\n    0, 32, 0, 32, 769, 0, 32, 771, 0, 32, 772, 0, 32, 773, 0, 32,\n    774, 0, 32, 775, 0, 32, 776, 0, 32, 778, 0, 32, 779, 0, 32, 787,\n    0, 32, 788, 0, 32, 807, 0, 32, 808, 0, 32, 819, 0, 32, 834, 0,\n    32, 837, 0, 32, 1611, 0, 32, 1612, 0, 32, 1612, 1617, 0, 32, 1613, 0,\n    32, 1613, 1617, 0, 32, 1614, 0, 32, 1614, 1617, 0, 32, 1615, 0, 32, 1615,\n    1617, 0, 32, 1616, 0, 32, 1616, 1617, 0, 32, 1617, 0, 32, 1617, 1648, 0,\n    32, 1618, 0, 32, 12441, 0, 32, 12442, 0, 33, 0, 33, 33, 0, 33, 63,\n    0, 34, 0, 35, 0, 36, 0, 37, 0, 38, 0, 39, 0, 40, 0, 40,\n    49, 41, 0, 40, 49, 48, 41, 0, 40, 49, 49, 41, 0, 40, 49, 50,\n    41, 0, 40, 49, 51, 41, 0, 40, 49, 52, 41, 0, 40, 49, 53, 41,\n    0, 40, 49, 54, 41, 0, 40, 49, 55, 41, 0, 40, 49, 56, 41, 0,\n    40, 49, 57, 41, 0, 40, 50, 41, 0, 40, 50, 48, 41, 0, 40, 51,\n    41, 0, 40, 52, 41, 0, 40, 53, 41, 0, 40, 54, 41, 0, 40, 55,\n    41, 0, 40, 56, 41, 0, 40, 57, 41, 0, 40, 97, 41, 0, 40, 98,\n    41, 0, 40, 99, 41, 0, 40, 100, 41, 0, 40, 101, 41, 0, 40, 102,\n    41, 0, 40, 103, 41, 0, 40, 104, 41, 0, 40, 105, 41, 0, 40, 106,\n    41, 0, 40, 107, 41, 0, 40, 108, 41, 0, 40, 109, 41, 0, 40, 110,\n    41, 0, 40, 111, 41, 0, 40, 112, 41, 0, 40, 113, 41, 0, 40, 114,\n    41, 0, 40, 115, 41, 0, 40, 116, 41, 0, 40, 117, 41, 0, 40, 118,\n    41, 0, 40, 119, 41, 0, 40, 120, 41, 0, 40, 121, 41, 0, 40, 122,\n    41, 0, 40, 4352, 41, 0, 40, 4352, 4449, 41, 0, 40, 4354, 41, 0, 40,\n    4354, 4449, 41, 0, 40, 4355, 41, 0, 40, 4355, 4449, 41, 0, 40, 4357, 41,\n    0, 40, 4357, 4449, 41, 0, 40, 4358, 41, 0, 40, 4358, 4449, 41, 0, 40,\n    4359, 41, 0, 40, 4359, 4449, 41, 0, 40, 4361, 41, 0, 40, 4361, 4449, 41,\n    0, 40, 4363, 41, 0, 40, 4363, 4449, 41, 0, 40, 4363, 4457, 4364, 4453, 4523,\n    41, 0, 40, 4363, 4457, 4370, 4462, 41, 0, 40, 4364, 41, 0, 40, 4364, 4449,\n    41, 0, 40, 4364, 4462, 41, 0, 40, 4366, 41, 0, 40, 4366, 4449, 41, 0,\n    40, 4367, 41, 0, 40, 4367, 4449, 41, 0, 40, 4368, 41, 0, 40, 4368, 4449,\n    41, 0, 40, 4369, 41, 0, 40, 4369, 4449, 41, 0, 40, 4370, 41, 0, 40,\n    4370, 4449, 41, 0, 40, 19968, 41, 0, 40, 19971, 41, 0, 40, 19977, 41, 0,\n    40, 20061, 41, 0, 40, 20108, 41, 0, 40, 20116, 41, 0, 40, 20195, 41, 0,\n    40, 20225, 41, 0, 40, 20241, 41, 0, 40, 20843, 41, 0, 40, 20845, 41, 0,\n    40, 21172, 41, 0, 40, 21313, 41, 0, 40, 21332, 41, 0, 40, 21517, 41, 0,\n    40, 21628, 41, 0, 40, 22235, 41, 0, 40, 22303, 41, 0, 40, 23398, 41, 0,\n    40, 26085, 41, 0, 40, 26376, 41, 0, 40, 26377, 41, 0, 40, 26408, 41, 0,\n    40, 26666, 41, 0, 40, 27700, 41, 0, 40, 28779, 41, 0, 40, 29305, 41, 0,\n    40, 30435, 41, 0, 40, 31038, 41, 0, 40, 31069, 41, 0, 40, 31085, 41, 0,\n    40, 33258, 41, 0, 40, 33267, 41, 0, 40, 36001, 41, 0, 40, 36039, 41, 0,\n    40, 37329, 41, 0, 41, 0, 42, 0, 43, 0, 44, 0, 45, 0, 46, 0,\n    46, 46, 0, 46, 46, 46, 0, 47, 0, 48, 0, 48, 28857, 0, 49, 0,\n    49, 46, 0, 49, 48, 0, 49, 48, 46, 0, 49, 48, 26085, 0, 49, 48,\n    26376, 0, 49, 48, 28857, 0, 49, 49, 0, 49, 49, 46, 0, 49, 49, 26085,\n    0, 49, 49, 26376, 0, 49, 49, 28857, 0, 49, 50, 0, 49, 50, 46, 0,\n    49, 50, 26085, 0, 49, 50, 26376, 0, 49, 50, 28857, 0, 49, 51, 0, 49,\n    51, 46, 0, 49, 51, 26085, 0, 49, 51, 28857, 0, 49, 52, 0, 49, 52,\n    46, 0, 49, 52, 26085, 0, 49, 52, 28857, 0, 49, 53, 0, 49, 53, 46,\n    0, 49, 53, 26085, 0, 49, 53, 28857, 0, 49, 54, 0, 49, 54, 46, 0,\n    49, 54, 26085, 0, 49, 54, 28857, 0, 49, 55, 0, 49, 55, 46, 0, 49,\n    55, 26085, 0, 49, 55, 28857, 0, 49, 56, 0, 49, 56, 46, 0, 49, 56,\n    26085, 0, 49, 56, 28857, 0, 49, 57, 0, 49, 57, 46, 0, 49, 57, 26085,\n    0, 49, 57, 28857, 0, 49, 8260, 0, 49, 8260, 50, 0, 49, 8260, 51, 0,\n    49, 8260, 52, 0, 49, 8260, 53, 0, 49, 8260, 54, 0, 49, 8260, 56, 0,\n    49, 26085, 0, 49, 26376, 0, 49, 28857, 0, 50, 0, 50, 46, 0, 50, 48,\n    0, 50, 48, 46, 0, 50, 48, 26085, 0, 50, 48, 28857, 0, 50, 49, 0,\n    50, 49, 26085, 0, 50, 49, 28857, 0, 50, 50, 0, 50, 50, 26085, 0, 50,\n    50, 28857, 0, 50, 51, 0, 50, 51, 26085, 0, 50, 51, 28857, 0, 50, 52,\n    0, 50, 52, 26085, 0, 50, 52, 28857, 0, 50, 53, 0, 50, 53, 26085, 0,\n    50, 54, 0, 50, 54, 26085, 0, 50, 55, 0, 50, 55, 26085, 0, 50, 56,\n    0, 50, 56, 26085, 0, 50, 57, 0, 50, 57, 26085, 0, 50, 8260, 51, 0,\n    50, 8260, 53, 0, 50, 26085, 0, 50, 26376, 0, 50, 28857, 0, 51, 0, 51,\n    46, 0, 51, 48, 0, 51, 48, 26085, 0, 51, 49, 0, 51, 49, 26085, 0,\n    51, 50, 0, 51, 51, 0, 51, 52, 0, 51, 53, 0, 51, 54, 0, 51,\n    55, 0, 51, 56, 0, 51, 57, 0, 51, 8260, 52, 0, 51, 8260, 53, 0,\n    51, 8260, 56, 0, 51, 26085, 0, 51, 26376, 0, 51, 28857, 0, 52, 0, 52,\n    46, 0, 52, 48, 0, 52, 49, 0, 52, 50, 0, 52, 51, 0, 52, 52,\n    0, 52, 53, 0, 52, 54, 0, 52, 55, 0, 52, 56, 0, 52, 57, 0,\n    52, 8260, 53, 0, 52, 26085, 0, 52, 26376, 0, 52, 28857, 0, 53, 0, 53,\n    46, 0, 53, 48, 0, 53, 8260, 54, 0, 53, 8260, 56, 0, 53, 26085, 0,\n    53, 26376, 0, 53, 28857, 0, 54, 0, 54, 46, 0, 54, 26085, 0, 54, 26376,\n    0, 54, 28857, 0, 55, 0, 55, 46, 0, 55, 8260, 56, 0, 55, 26085, 0,\n    55, 26376, 0, 55, 28857, 0, 56, 0, 56, 46, 0, 56, 26085, 0, 56, 26376,\n    0, 56, 28857, 0, 57, 0, 57, 46, 0, 57, 26085, 0, 57, 26376, 0, 57,\n    28857, 0, 58, 0, 58, 58, 61, 0, 59, 0, 60, 0, 60, 824, 0, 61,\n    0, 61, 61, 0, 61, 61, 61, 0, 61, 824, 0, 62, 0, 62, 824, 0,\n    63, 0, 63, 33, 0, 63, 63, 0, 64, 0, 65, 0, 65, 85, 0, 65,\n    768, 0, 65, 769, 0, 65, 770, 0, 65, 771, 0, 65, 772, 0, 65, 774,\n    0, 65, 775, 0, 65, 776, 0, 65, 777, 0, 65, 778, 0, 65, 780, 0,\n    65, 783, 0, 65, 785, 0, 65, 803, 0, 65, 805, 0, 65, 808, 0, 65,\n    8725, 109, 0, 66, 0, 66, 113, 0, 66, 775, 0, 66, 803, 0, 66, 817,\n    0, 67, 0, 67, 111, 46, 0, 67, 769, 0, 67, 770, 0, 67, 775, 0,\n    67, 780, 0, 67, 807, 0, 67, 8725, 107, 103, 0, 68, 0, 68, 90, 0,\n    68, 122, 0, 68, 381, 0, 68, 382, 0, 68, 775, 0, 68, 780, 0, 68,\n    803, 0, 68, 807, 0, 68, 813, 0, 68, 817, 0, 69, 0, 69, 768, 0,\n    69, 769, 0, 69, 770, 0, 69, 771, 0, 69, 772, 0, 69, 774, 0, 69,\n    775, 0, 69, 776, 0, 69, 777, 0, 69, 780, 0, 69, 783, 0, 69, 785,\n    0, 69, 803, 0, 69, 807, 0, 69, 808, 0, 69, 813, 0, 69, 816, 0,\n    70, 0, 70, 65, 88, 0, 70, 775, 0, 71, 0, 71, 66, 0, 71, 72,\n    122, 0, 71, 80, 97, 0, 71, 121, 0, 71, 769, 0, 71, 770, 0, 71,\n    772, 0, 71, 774, 0, 71, 775, 0, 71, 780, 0, 71, 807, 0, 72, 0,\n    72, 80, 0, 72, 103, 0, 72, 122, 0, 72, 770, 0, 72, 775, 0, 72,\n    776, 0, 72, 780, 0, 72, 803, 0, 72, 807, 0, 72, 814, 0, 73, 0,\n    73, 73, 0, 73, 73, 73, 0, 73, 74, 0, 73, 85, 0, 73, 86, 0,\n    73, 88, 0, 73, 768, 0, 73, 769, 0, 73, 770, 0, 73, 771, 0, 73,\n    772, 0, 73, 774, 0, 73, 775, 0, 73, 776, 0, 73, 777, 0, 73, 780,\n    0, 73, 783, 0, 73, 785, 0, 73, 803, 0, 73, 808, 0, 73, 816, 0,\n    74, 0, 74, 770, 0, 75, 0, 75, 66, 0, 75, 75, 0, 75, 77, 0,\n    75, 769, 0, 75, 780, 0, 75, 803, 0, 75, 807, 0, 75, 817, 0, 76,\n    0, 76, 74, 0, 76, 84, 68, 0, 76, 106, 0, 76, 183, 0, 76, 769,\n    0, 76, 780, 0, 76, 803, 0, 76, 807, 0, 76, 813, 0, 76, 817, 0,\n    77, 0, 77, 66, 0, 77, 72, 122, 0, 77, 80, 97, 0, 77, 86, 0,\n    77, 87, 0, 77, 769, 0, 77, 775, 0, 77, 803, 0, 77, 937, 0, 78,\n    0, 78, 74, 0, 78, 106, 0, 78, 111, 0, 78, 768, 0, 78, 769, 0,\n    78, 771, 0, 78, 775, 0, 78, 780, 0, 78, 803, 0, 78, 807, 0, 78,\n    813, 0, 78, 817, 0, 79, 0, 79, 768, 0, 79, 769, 0, 79, 770, 0,\n    79, 771, 0, 79, 772, 0, 79, 774, 0, 79, 775, 0, 79, 776, 0, 79,\n    777, 0, 79, 779, 0, 79, 780, 0, 79, 783, 0, 79, 785, 0, 79, 795,\n    0, 79, 803, 0, 79, 808, 0, 80, 0, 80, 72, 0, 80, 80, 77, 0,\n    80, 82, 0, 80, 84, 69, 0, 80, 97, 0, 80, 769, 0, 80, 775, 0,\n    81, 0, 82, 0, 82, 115, 0, 82, 769, 0, 82, 775, 0, 82, 780, 0,\n    82, 783, 0, 82, 785, 0, 82, 803, 0, 82, 807, 0, 82, 817, 0, 83,\n    0, 83, 77, 0, 83, 118, 0, 83, 769, 0, 83, 770, 0, 83, 775, 0,\n    83, 780, 0, 83, 803, 0, 83, 806, 0, 83, 807, 0, 84, 0, 84, 69,\n    76, 0, 84, 72, 122, 0, 84, 77, 0, 84, 775, 0, 84, 780, 0, 84,\n    803, 0, 84, 806, 0, 84, 807, 0, 84, 813, 0, 84, 817, 0, 85, 0,\n    85, 768, 0, 85, 769, 0, 85, 770, 0, 85, 771, 0, 85, 772, 0, 85,\n    774, 0, 85, 776, 0, 85, 777, 0, 85, 778, 0, 85, 779, 0, 85, 780,\n    0, 85, 783, 0, 85, 785, 0, 85, 795, 0, 85, 803, 0, 85, 804, 0,\n    85, 808, 0, 85, 813, 0, 85, 816, 0, 86, 0, 86, 73, 0, 86, 73,\n    73, 0, 86, 73, 73, 73, 0, 86, 771, 0, 86, 803, 0, 86, 8725, 109,\n    0, 87, 0, 87, 98, 0, 87, 768, 0, 87, 769, 0, 87, 770, 0, 87,\n    775, 0, 87, 776, 0, 87, 803, 0, 88, 0, 88, 73, 0, 88, 73, 73,\n    0, 88, 775, 0, 88, 776, 0, 89, 0, 89, 768, 0, 89, 769, 0, 89,\n    770, 0, 89, 771, 0, 89, 772, 0, 89, 775, 0, 89, 776, 0, 89, 777,\n    0, 89, 803, 0, 90, 0, 90, 769, 0, 90, 770, 0, 90, 775, 0, 90,\n    780, 0, 90, 803, 0, 90, 817, 0, 91, 0, 92, 0, 93, 0, 94, 0,\n    95, 0, 96, 0, 97, 0, 97, 46, 109, 46, 0, 97, 47, 99, 0, 97,\n    47, 115, 0, 97, 702, 0, 97, 768, 0, 97, 769, 0, 97, 770, 0, 97,\n    771, 0, 97, 772, 0, 97, 774, 0, 97, 775, 0, 97, 776, 0, 97, 777,\n    0, 97, 778, 0, 97, 780, 0, 97, 783, 0, 97, 785, 0, 97, 803, 0,\n    97, 805, 0, 97, 808, 0, 98, 0, 98, 97, 114, 0, 98, 775, 0, 98,\n    803, 0, 98, 817, 0, 99, 0, 99, 47, 111, 0, 99, 47, 117, 0, 99,\n    97, 108, 0, 99, 99, 0, 99, 100, 0, 99, 109, 0, 99, 109, 178, 0,\n    99, 109, 179, 0, 99, 769, 0, 99, 770, 0, 99, 775, 0, 99, 780, 0,\n    99, 807, 0, 100, 0, 100, 66, 0, 100, 97, 0, 100, 109, 0, 100, 109,\n    178, 0, 100, 109, 179, 0, 100, 122, 0, 100, 382, 0, 100, 775, 0, 100,\n    780, 0, 100, 803, 0, 100, 807, 0, 100, 813, 0, 100, 817, 0, 100, 8467,\n    0, 101, 0, 101, 86, 0, 101, 114, 103, 0, 101, 768, 0, 101, 769, 0,\n    101, 770, 0, 101, 771, 0, 101, 772, 0, 101, 774, 0, 101, 775, 0, 101,\n    776, 0, 101, 777, 0, 101, 780, 0, 101, 783, 0, 101, 785, 0, 101, 803,\n    0, 101, 807, 0, 101, 808, 0, 101, 813, 0, 101, 816, 0, 102, 0, 102,\n    102, 0, 102, 102, 105, 0, 102, 102, 108, 0, 102, 105, 0, 102, 108, 0,\n    102, 109, 0, 102, 775, 0, 103, 0, 103, 97, 108, 0, 103, 769, 0, 103,\n    770, 0, 103, 772, 0, 103, 774, 0, 103, 775, 0, 103, 780, 0, 103, 807,\n    0, 104, 0, 104, 80, 97, 0, 104, 97, 0, 104, 770, 0, 104, 775, 0,\n    104, 776, 0, 104, 780, 0, 104, 803, 0, 104, 807, 0, 104, 814, 0, 104,\n    817, 0, 105, 0, 105, 105, 0, 105, 105, 105, 0, 105, 106, 0, 105, 110,\n    0, 105, 118, 0, 105, 120, 0, 105, 768, 0, 105, 769, 0, 105, 770, 0,\n    105, 771, 0, 105, 772, 0, 105, 774, 0, 105, 776, 0, 105, 777, 0, 105,\n    780, 0, 105, 783, 0, 105, 785, 0, 105, 803, 0, 105, 808, 0, 105, 816,\n    0, 106, 0, 106, 770, 0, 106, 780, 0, 107, 0, 107, 65, 0, 107, 72,\n    122, 0, 107, 80, 97, 0, 107, 86, 0, 107, 87, 0, 107, 99, 97, 108,\n    0, 107, 103, 0, 107, 109, 0, 107, 109, 178, 0, 107, 109, 179, 0, 107,\n    116, 0, 107, 769, 0, 107, 780, 0, 107, 803, 0, 107, 807, 0, 107, 817,\n    0, 107, 937, 0, 107, 8467, 0, 108, 0, 108, 106, 0, 108, 109, 0, 108,\n    110, 0, 108, 111, 103, 0, 108, 120, 0, 108, 183, 0, 108, 769, 0, 108,\n    780, 0, 108, 803, 0, 108, 807, 0, 108, 813, 0, 108, 817, 0, 109, 0,\n    109, 65, 0, 109, 86, 0, 109, 87, 0, 109, 98, 0, 109, 103, 0, 109,\n    105, 108, 0, 109, 109, 0, 109, 109, 178, 0, 109, 109, 179, 0, 109, 111,\n    108, 0, 109, 115, 0, 109, 178, 0, 109, 179, 0, 109, 769, 0, 109, 775,\n    0, 109, 803, 0, 109, 8467, 0, 109, 8725, 115, 0, 109, 8725, 115, 178, 0,\n    110, 0, 110, 65, 0, 110, 70, 0, 110, 86, 0, 110, 87, 0, 110, 106,\n    0, 110, 109, 0, 110, 115, 0, 110, 768, 0, 110, 769, 0, 110, 771, 0,\n    110, 775, 0, 110, 780, 0, 110, 803, 0, 110, 807, 0, 110, 813, 0, 110,\n    817, 0, 111, 0, 111, 86, 0, 111, 768, 0, 111, 769, 0, 111, 770, 0,\n    111, 771, 0, 111, 772, 0, 111, 774, 0, 111, 775, 0, 111, 776, 0, 111,\n    777, 0, 111, 779, 0, 111, 780, 0, 111, 783, 0, 111, 785, 0, 111, 795,\n    0, 111, 803, 0, 111, 808, 0, 112, 0, 112, 46, 109, 46, 0, 112, 65,\n    0, 112, 70, 0, 112, 86, 0, 112, 87, 0, 112, 99, 0, 112, 115, 0,\n    112, 769, 0, 112, 775, 0, 113, 0, 114, 0, 114, 97, 100, 0, 114, 97,\n    100, 8725, 115, 0, 114, 97, 100, 8725, 115, 178, 0, 114, 769, 0, 114, 775,\n    0, 114, 780, 0, 114, 783, 0, 114, 785, 0, 114, 803, 0, 114, 807, 0,\n    114, 817, 0, 115, 0, 115, 114, 0, 115, 116, 0, 115, 769, 0, 115, 770,\n    0, 115, 775, 0, 115, 780, 0, 115, 803, 0, 115, 806, 0, 115, 807, 0,\n    116, 0, 116, 775, 0, 116, 776, 0, 116, 780, 0, 116, 803, 0, 116, 806,\n    0, 116, 807, 0, 116, 813, 0, 116, 817, 0, 117, 0, 117, 768, 0, 117,\n    769, 0, 117, 770, 0, 117, 771, 0, 117, 772, 0, 117, 774, 0, 117, 776,\n    0, 117, 777, 0, 117, 778, 0, 117, 779, 0, 117, 780, 0, 117, 783, 0,\n    117, 785, 0, 117, 795, 0, 117, 803, 0, 117, 804, 0, 117, 808, 0, 117,\n    813, 0, 117, 816, 0, 118, 0, 118, 105, 0, 118, 105, 105, 0, 118, 105,\n    105, 105, 0, 118, 771, 0, 118, 803, 0, 119, 0, 119, 768, 0, 119, 769,\n    0, 119, 770, 0, 119, 775, 0, 119, 776, 0, 119, 778, 0, 119, 803, 0,\n    120, 0, 120, 105, 0, 120, 105, 105, 0, 120, 775, 0, 120, 776, 0, 121,\n    0, 121, 768, 0, 121, 769, 0, 121, 770, 0, 121, 771, 0, 121, 772, 0,\n    121, 775, 0, 121, 776, 0, 121, 777, 0, 121, 778, 0, 121, 803, 0, 122,\n    0, 122, 769, 0, 122, 770, 0, 122, 775, 0, 122, 780, 0, 122, 803, 0,\n    122, 817, 0, 123, 0, 124, 0, 125, 0, 126, 0, 162, 0, 163, 0, 165,\n    0, 166, 0, 168, 768, 0, 168, 769, 0, 168, 834, 0, 172, 0, 175, 0,\n    176, 67, 0, 176, 70, 0, 180, 0, 183, 0, 194, 768, 0, 194, 769, 0,\n    194, 771, 0, 194, 777, 0, 196, 772, 0, 197, 0, 197, 769, 0, 198, 0,\n    198, 769, 0, 198, 772, 0, 199, 769, 0, 202, 768, 0, 202, 769, 0, 202,\n    771, 0, 202, 777, 0, 207, 769, 0, 212, 768, 0, 212, 769, 0, 212, 771,\n    0, 212, 777, 0, 213, 769, 0, 213, 772, 0, 213, 776, 0, 214, 772, 0,\n    216, 769, 0, 220, 768, 0, 220, 769, 0, 220, 772, 0, 220, 780, 0, 226,\n    768, 0, 226, 769, 0, 226, 771, 0, 226, 777, 0, 228, 772, 0, 229, 769,\n    0, 230, 769, 0, 230, 772, 0, 231, 769, 0, 234, 768, 0, 234, 769, 0,\n    234, 771, 0, 234, 777, 0, 239, 769, 0, 240, 0, 244, 768, 0, 244, 769,\n    0, 244, 771, 0, 244, 777, 0, 245, 769, 0, 245, 772, 0, 245, 776, 0,\n    246, 772, 0, 248, 769, 0, 252, 768, 0, 252, 769, 0, 252, 772, 0, 252,\n    780, 0, 258, 768, 0, 258, 769, 0, 258, 771, 0, 258, 777, 0, 259, 768,\n    0, 259, 769, 0, 259, 771, 0, 259, 777, 0, 274, 768, 0, 274, 769, 0,\n    275, 768, 0, 275, 769, 0, 295, 0, 331, 0, 332, 768, 0, 332, 769, 0,\n    333, 768, 0, 333, 769, 0, 346, 775, 0, 347, 775, 0, 352, 775, 0, 353,\n    775, 0, 360, 769, 0, 361, 769, 0, 362, 776, 0, 363, 776, 0, 383, 116,\n    0, 383, 775, 0, 398, 0, 400, 0, 416, 768, 0, 416, 769, 0, 416, 771,\n    0, 416, 777, 0, 416, 803, 0, 417, 768, 0, 417, 769, 0, 417, 771, 0,\n    417, 777, 0, 417, 803, 0, 427, 0, 431, 768, 0, 431, 769, 0, 431, 771,\n    0, 431, 777, 0, 431, 803, 0, 432, 768, 0, 432, 769, 0, 432, 771, 0,\n    432, 777, 0, 432, 803, 0, 439, 780, 0, 490, 772, 0, 491, 772, 0, 546,\n    0, 550, 772, 0, 551, 772, 0, 552, 774, 0, 553, 774, 0, 558, 772, 0,\n    559, 772, 0, 592, 0, 593, 0, 594, 0, 596, 0, 597, 0, 601, 0, 603,\n    0, 604, 0, 607, 0, 609, 0, 611, 0, 613, 0, 614, 0, 616, 0, 617,\n    0, 618, 0, 621, 0, 623, 0, 624, 0, 625, 0, 626, 0, 627, 0, 628,\n    0, 629, 0, 632, 0, 633, 0, 635, 0, 641, 0, 642, 0, 643, 0, 649,\n    0, 650, 0, 651, 0, 652, 0, 656, 0, 657, 0, 658, 0, 658, 780, 0,\n    661, 0, 669, 0, 671, 0, 697, 0, 700, 110, 0, 768, 0, 769, 0, 776,\n    769, 0, 787, 0, 901, 0, 902, 0, 904, 0, 905, 0, 906, 0, 908, 0,\n    910, 0, 911, 0, 912, 0, 913, 768, 0, 913, 769, 0, 913, 772, 0, 913,\n    774, 0, 913, 787, 0, 913, 788, 0, 913, 837, 0, 915, 0, 917, 768, 0,\n    917, 769, 0, 917, 787, 0, 917, 788, 0, 919, 768, 0, 919, 769, 0, 919,\n    787, 0, 919, 788, 0, 919, 837, 0, 920, 0, 921, 768, 0, 921, 769, 0,\n    921, 772, 0, 921, 774, 0, 921, 776, 0, 921, 787, 0, 921, 788, 0, 927,\n    768, 0, 927, 769, 0, 927, 787, 0, 927, 788, 0, 928, 0, 929, 788, 0,\n    931, 0, 933, 0, 933, 768, 0, 933, 769, 0, 933, 772, 0, 933, 774, 0,\n    933, 776, 0, 933, 788, 0, 937, 0, 937, 768, 0, 937, 769, 0, 937, 787,\n    0, 937, 788, 0, 937, 837, 0, 940, 0, 940, 837, 0, 941, 0, 942, 0,\n    942, 837, 0, 943, 0, 944, 0, 945, 768, 0, 945, 769, 0, 945, 772, 0,\n    945, 774, 0, 945, 787, 0, 945, 788, 0, 945, 834, 0, 945, 837, 0, 946,\n    0, 947, 0, 948, 0, 949, 0, 949, 768, 0, 949, 769, 0, 949, 787, 0,\n    949, 788, 0, 951, 768, 0, 951, 769, 0, 951, 787, 0, 951, 788, 0, 951,\n    834, 0, 951, 837, 0, 952, 0, 953, 0, 953, 768, 0, 953, 769, 0, 953,\n    772, 0, 953, 774, 0, 953, 776, 0, 953, 787, 0, 953, 788, 0, 953, 834,\n    0, 954, 0, 956, 0, 956, 65, 0, 956, 70, 0, 956, 86, 0, 956, 87,\n    0, 956, 103, 0, 956, 109, 0, 956, 115, 0, 956, 8467, 0, 959, 768, 0,\n    959, 769, 0, 959, 787, 0, 959, 788, 0, 960, 0, 961, 0, 961, 787, 0,\n    961, 788, 0, 962, 0, 965, 768, 0, 965, 769, 0, 965, 772, 0, 965, 774,\n    0, 965, 776, 0, 965, 787, 0, 965, 788, 0, 965, 834, 0, 966, 0, 967,\n    0, 969, 768, 0, 969, 769, 0, 969, 787, 0, 969, 788, 0, 969, 834, 0,\n    969, 837, 0, 970, 768, 0, 970, 769, 0, 970, 834, 0, 971, 768, 0, 971,\n    769, 0, 971, 834, 0, 972, 0, 973, 0, 974, 0, 974, 837, 0, 978, 769,\n    0, 978, 776, 0, 1030, 776, 0, 1040, 774, 0, 1040, 776, 0, 1043, 769, 0,\n    1045, 768, 0, 1045, 774, 0, 1045, 776, 0, 1046, 774, 0, 1046, 776, 0, 1047,\n    776, 0, 1048, 768, 0, 1048, 772, 0, 1048, 774, 0, 1048, 776, 0, 1050, 769,\n    0, 1054, 776, 0, 1059, 772, 0, 1059, 774, 0, 1059, 776, 0, 1059, 779, 0,\n    1063, 776, 0, 1067, 776, 0, 1069, 776, 0, 1072, 774, 0, 1072, 776, 0, 1075,\n    769, 0, 1077, 768, 0, 1077, 774, 0, 1077, 776, 0, 1078, 774, 0, 1078, 776,\n    0, 1079, 776, 0, 1080, 768, 0, 1080, 772, 0, 1080, 774, 0, 1080, 776, 0,\n    1082, 769, 0, 1085, 0, 1086, 776, 0, 1091, 772, 0, 1091, 774, 0, 1091, 776,\n    0, 1091, 779, 0, 1095, 776, 0, 1099, 776, 0, 1101, 776, 0, 1110, 776, 0,\n    1140, 783, 0, 1141, 783, 0, 1240, 776, 0, 1241, 776, 0, 1256, 776, 0, 1257,\n    776, 0, 1381, 1410, 0, 1396, 1381, 0, 1396, 1387, 0, 1396, 1389, 0, 1396, 1398,\n    0, 1406, 1398, 0, 1488, 0, 1488, 1463, 0, 1488, 1464, 0, 1488, 1468, 0, 1488,\n    1500, 0, 1489, 0, 1489, 1468, 0, 1489, 1471, 0, 1490, 0, 1490, 1468, 0, 1491,\n    0, 1491, 1468, 0, 1492, 0, 1492, 1468, 0, 1493, 1465, 0, 1493, 1468, 0, 1494,\n    1468, 0, 1496, 1468, 0, 1497, 1460, 0, 1497, 1468, 0, 1498, 1468, 0, 1499, 0,\n    1499, 1468, 0, 1499, 1471, 0, 1500, 0, 1500, 1468, 0, 1501, 0, 1502, 1468, 0,\n    1504, 1468, 0, 1505, 1468, 0, 1506, 0, 1507, 1468, 0, 1508, 1468, 0, 1508, 1471,\n    0, 1510, 1468, 0, 1511, 1468, 0, 1512, 0, 1512, 1468, 0, 1513, 1468, 0, 1513,\n    1473, 0, 1513, 1474, 0, 1514, 0, 1514, 1468, 0, 1522, 1463, 0, 1569, 0, 1570,\n    0, 1571, 0, 1572, 0, 1573, 0, 1574, 0, 1574, 1575, 0, 1574, 1580, 0, 1574,\n    1581, 0, 1574, 1582, 0, 1574, 1585, 0, 1574, 1586, 0, 1574, 1605, 0, 1574, 1606,\n    0, 1574, 1607, 0, 1574, 1608, 0, 1574, 1609, 0, 1574, 1610, 0, 1574, 1734, 0,\n    1574, 1735, 0, 1574, 1736, 0, 1574, 1744, 0, 1574, 1749, 0, 1575, 0, 1575, 1603,\n    1576, 1585, 0, 1575, 1604, 1604, 1607, 0, 1575, 1611, 0, 1575, 1619, 0, 1575, 1620,\n    0, 1575, 1621, 0, 1575, 1652, 0, 1576, 0, 1576, 1580, 0, 1576, 1581, 0, 1576,\n    1581, 1610, 0, 1576, 1582, 0, 1576, 1582, 1610, 0, 1576, 1585, 0, 1576, 1586, 0,\n    1576, 1605, 0, 1576, 1606, 0, 1576, 1607, 0, 1576, 1609, 0, 1576, 1610, 0, 1577,\n    0, 1578, 0, 1578, 1580, 0, 1578, 1580, 1605, 0, 1578, 1580, 1609, 0, 1578, 1580,\n    1610, 0, 1578, 1581, 0, 1578, 1581, 1580, 0, 1578, 1581, 1605, 0, 1578, 1582, 0,\n    1578, 1582, 1605, 0, 1578, 1582, 1609, 0, 1578, 1582, 1610, 0, 1578, 1585, 0, 1578,\n    1586, 0, 1578, 1605, 0, 1578, 1605, 1580, 0, 1578, 1605, 1581, 0, 1578, 1605, 1582,\n    0, 1578, 1605, 1609, 0, 1578, 1605, 1610, 0, 1578, 1606, 0, 1578, 1607, 0, 1578,\n    1609, 0, 1578, 1610, 0, 1579, 0, 1579, 1580, 0, 1579, 1585, 0, 1579, 1586, 0,\n    1579, 1605, 0, 1579, 1606, 0, 1579, 1607, 0, 1579, 1609, 0, 1579, 1610, 0, 1580,\n    0, 1580, 1581, 0, 1580, 1581, 1609, 0, 1580, 1581, 1610, 0, 1580, 1604, 32, 1580,\n    1604, 1575, 1604, 1607, 0, 1580, 1605, 0, 1580, 1605, 1581, 0, 1580, 1605, 1609, 0,\n    1580, 1605, 1610, 0, 1580, 1609, 0, 1580, 1610, 0, 1581, 0, 1581, 1580, 0, 1581,\n    1580, 1610, 0, 1581, 1605, 0, 1581, 1605, 1609, 0, 1581, 1605, 1610, 0, 1581, 1609,\n    0, 1581, 1610, 0, 1582, 0, 1582, 1580, 0, 1582, 1581, 0, 1582, 1605, 0, 1582,\n    1609, 0, 1582, 1610, 0, 1583, 0, 1584, 0, 1584, 1648, 0, 1585, 0, 1585, 1587,\n    1608, 1604, 0, 1585, 1648, 0, 1585, 1740, 1575, 1604, 0, 1586, 0, 1587, 0, 1587,\n    1580, 0, 1587, 1580, 1581, 0, 1587, 1580, 1609, 0, 1587, 1581, 0, 1587, 1581, 1580,\n    0, 1587, 1582, 0, 1587, 1582, 1609, 0, 1587, 1582, 1610, 0, 1587, 1585, 0, 1587,\n    1605, 0, 1587, 1605, 1580, 0, 1587, 1605, 1581, 0, 1587, 1605, 1605, 0, 1587, 1607,\n    0, 1587, 1609, 0, 1587, 1610, 0, 1588, 0, 1588, 1580, 0, 1588, 1580, 1610, 0,\n    1588, 1581, 0, 1588, 1581, 1605, 0, 1588, 1581, 1610, 0, 1588, 1582, 0, 1588, 1585,\n    0, 1588, 1605, 0, 1588, 1605, 1582, 0, 1588, 1605, 1605, 0, 1588, 1607, 0, 1588,\n    1609, 0, 1588, 1610, 0, 1589, 0, 1589, 1581, 0, 1589, 1581, 1581, 0, 1589, 1581,\n    1610, 0, 1589, 1582, 0, 1589, 1585, 0, 1589, 1604, 1593, 1605, 0, 1589, 1604, 1609,\n    0, 1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608,\n    1587, 1604, 1605, 0, 1589, 1604, 1746, 0, 1589, 1605, 0, 1589, 1605, 1605, 0, 1589,\n    1609, 0, 1589, 1610, 0, 1590, 0, 1590, 1580, 0, 1590, 1581, 0, 1590, 1581, 1609,\n    0, 1590, 1581, 1610, 0, 1590, 1582, 0, 1590, 1582, 1605, 0, 1590, 1585, 0, 1590,\n    1605, 0, 1590, 1609, 0, 1590, 1610, 0, 1591, 0, 1591, 1581, 0, 1591, 1605, 0,\n    1591, 1605, 1581, 0, 1591, 1605, 1605, 0, 1591, 1605, 1610, 0, 1591, 1609, 0, 1591,\n    1610, 0, 1592, 0, 1592, 1605, 0, 1593, 0, 1593, 1580, 0, 1593, 1580, 1605, 0,\n    1593, 1604, 1610, 1607, 0, 1593, 1605, 0, 1593, 1605, 1605, 0, 1593, 1605, 1609, 0,\n    1593, 1605, 1610, 0, 1593, 1609, 0, 1593, 1610, 0, 1594, 0, 1594, 1580, 0, 1594,\n    1605, 0, 1594, 1605, 1605, 0, 1594, 1605, 1609, 0, 1594, 1605, 1610, 0, 1594, 1609,\n    0, 1594, 1610, 0, 1600, 1611, 0, 1600, 1614, 0, 1600, 1614, 1617, 0, 1600, 1615,\n    0, 1600, 1615, 1617, 0, 1600, 1616, 0, 1600, 1616, 1617, 0, 1600, 1617, 0, 1600,\n    1618, 0, 1601, 0, 1601, 1580, 0, 1601, 1581, 0, 1601, 1582, 0, 1601, 1582, 1605,\n    0, 1601, 1605, 0, 1601, 1605, 1610, 0, 1601, 1609, 0, 1601, 1610, 0, 1602, 0,\n    1602, 1581, 0, 1602, 1604, 1746, 0, 1602, 1605, 0, 1602, 1605, 1581, 0, 1602, 1605,\n    1605, 0, 1602, 1605, 1610, 0, 1602, 1609, 0, 1602, 1610, 0, 1603, 0, 1603, 1575,\n    0, 1603, 1580, 0, 1603, 1581, 0, 1603, 1582, 0, 1603, 1604, 0, 1603, 1605, 0,\n    1603, 1605, 1605, 0, 1603, 1605, 1610, 0, 1603, 1609, 0, 1603, 1610, 0, 1604, 0,\n    1604, 1570, 0, 1604, 1571, 0, 1604, 1573, 0, 1604, 1575, 0, 1604, 1580, 0, 1604,\n    1580, 1580, 0, 1604, 1580, 1605, 0, 1604, 1580, 1610, 0, 1604, 1581, 0, 1604, 1581,\n    1605, 0, 1604, 1581, 1609, 0, 1604, 1581, 1610, 0, 1604, 1582, 0, 1604, 1582, 1605,\n    0, 1604, 1605, 0, 1604, 1605, 1581, 0, 1604, 1605, 1610, 0, 1604, 1607, 0, 1604,\n    1609, 0, 1604, 1610, 0, 1605, 0, 1605, 1575, 0, 1605, 1580, 0, 1605, 1580, 1581,\n    0, 1605, 1580, 1582, 0, 1605, 1580, 1605, 0, 1605, 1580, 1610, 0, 1605, 1581, 0,\n    1605, 1581, 1580, 0, 1605, 1581, 1605, 0, 1605, 1581, 1605, 1583, 0, 1605, 1581, 1610,\n    0, 1605, 1582, 0, 1605, 1582, 1580, 0, 1605, 1582, 1605, 0, 1605, 1582, 1610, 0,\n    1605, 1605, 0, 1605, 1605, 1610, 0, 1605, 1609, 0, 1605, 1610, 0, 1606, 0, 1606,\n    1580, 0, 1606, 1580, 1581, 0, 1606, 1580, 1605, 0, 1606, 1580, 1609, 0, 1606, 1580,\n    1610, 0, 1606, 1581, 0, 1606, 1581, 1605, 0, 1606, 1581, 1609, 0, 1606, 1581, 1610,\n    0, 1606, 1582, 0, 1606, 1585, 0, 1606, 1586, 0, 1606, 1605, 0, 1606, 1605, 1609,\n    0, 1606, 1605, 1610, 0, 1606, 1606, 0, 1606, 1607, 0, 1606, 1609, 0, 1606, 1610,\n    0, 1607, 0, 1607, 1580, 0, 1607, 1605, 0, 1607, 1605, 1580, 0, 1607, 1605, 1605,\n    0, 1607, 1609, 0, 1607, 1610, 0, 1607, 1648, 0, 1608, 0, 1608, 1587, 1604, 1605,\n    0, 1608, 1620, 0, 1608, 1652, 0, 1609, 0, 1609, 1648, 0, 1610, 0, 1610, 1580,\n    0, 1610, 1580, 1610, 0, 1610, 1581, 0, 1610, 1581, 1610, 0, 1610, 1582, 0, 1610,\n    1585, 0, 1610, 1586, 0, 1610, 1605, 0, 1610, 1605, 1605, 0, 1610, 1605, 1610, 0,\n    1610, 1606, 0, 1610, 1607, 0, 1610, 1609, 0, 1610, 1610, 0, 1610, 1620, 0, 1610,\n    1652, 0, 1649, 0, 1655, 0, 1657, 0, 1658, 0, 1659, 0, 1662, 0, 1663, 0,\n    1664, 0, 1667, 0, 1668, 0, 1670, 0, 1671, 0, 1672, 0, 1676, 0, 1677, 0,\n    1678, 0, 1681, 0, 1688, 0, 1700, 0, 1702, 0, 1705, 0, 1709, 0, 1711, 0,\n    1713, 0, 1715, 0, 1722, 0, 1723, 0, 1726, 0, 1728, 0, 1729, 0, 1729, 1620,\n    0, 1733, 0, 1734, 0, 1735, 0, 1735, 1652, 0, 1736, 0, 1737, 0, 1739, 0,\n    1740, 0, 1744, 0, 1746, 0, 1746, 1620, 0, 1747, 0, 1749, 1620, 0, 2325, 2364,\n    0, 2326, 2364, 0, 2327, 2364, 0, 2332, 2364, 0, 2337, 2364, 0, 2338, 2364, 0,\n    2344, 2364, 0, 2347, 2364, 0, 2351, 2364, 0, 2352, 2364, 0, 2355, 2364, 0, 2465,\n    2492, 0, 2466, 2492, 0, 2479, 2492, 0, 2503, 2494, 0, 2503, 2519, 0, 2582, 2620,\n    0, 2583, 2620, 0, 2588, 2620, 0, 2603, 2620, 0, 2610, 2620, 0, 2616, 2620, 0,\n    2849, 2876, 0, 2850, 2876, 0, 2887, 2878, 0, 2887, 2902, 0, 2887, 2903, 0, 2962,\n    3031, 0, 3014, 3006, 0, 3014, 3031, 0, 3015, 3006, 0, 3142, 3158, 0, 3263, 3285,\n    0, 3270, 3266, 0, 3270, 3285, 0, 3270, 3286, 0, 3274, 3285, 0, 3398, 3390, 0,\n    3398, 3415, 0, 3399, 3390, 0, 3545, 3530, 0, 3545, 3535, 0, 3545, 3551, 0, 3548,\n    3530, 0, 3661, 3634, 0, 3755, 3737, 0, 3755, 3745, 0, 3789, 3762, 0, 3851, 0,\n    3904, 4021, 0, 3906, 4023, 0, 3916, 4023, 0, 3921, 4023, 0, 3926, 4023, 0, 3931,\n    4023, 0, 3953, 3954, 0, 3953, 3956, 0, 3953, 3968, 0, 3984, 4021, 0, 3986, 4023,\n    0, 3996, 4023, 0, 4001, 4023, 0, 4006, 4023, 0, 4011, 4023, 0, 4018, 3968, 0,\n    4018, 3969, 0, 4019, 3968, 0, 4019, 3969, 0, 4133, 4142, 0, 4316, 0, 4352, 0,\n    4352, 4449, 0, 4353, 0, 4354, 0, 4354, 4449, 0, 4355, 0, 4355, 4449, 0, 4356,\n    0, 4357, 0, 4357, 4449, 0, 4358, 0, 4358, 4449, 0, 4359, 0, 4359, 4449, 0,\n    4360, 0, 4361, 0, 4361, 4449, 0, 4362, 0, 4363, 0, 4363, 4449, 0, 4363, 4462,\n    0, 4364, 0, 4364, 4449, 0, 4364, 4462, 4363, 4468, 0, 4365, 0, 4366, 0, 4366,\n    4449, 0, 4366, 4449, 4535, 4352, 4457, 0, 4367, 0, 4367, 4449, 0, 4368, 0, 4368,\n    4449, 0, 4369, 0, 4369, 4449, 0, 4370, 0, 4370, 4449, 0, 4372, 0, 4373, 0,\n    4378, 0, 4380, 0, 4381, 0, 4382, 0, 4384, 0, 4385, 0, 4386, 0, 4387, 0,\n    4391, 0, 4393, 0, 4395, 0, 4396, 0, 4397, 0, 4398, 0, 4399, 0, 4402, 0,\n    4406, 0, 4416, 0, 4423, 0, 4428, 0, 4439, 0, 4440, 0, 4441, 0, 4448, 0,\n    4449, 0, 4450, 0, 4451, 0, 4452, 0, 4453, 0, 4454, 0, 4455, 0, 4456, 0,\n    4457, 0, 4458, 0, 4459, 0, 4460, 0, 4461, 0, 4462, 0, 4463, 0, 4464, 0,\n    4465, 0, 4466, 0, 4467, 0, 4468, 0, 4469, 0, 4484, 0, 4485, 0, 4488, 0,\n    4497, 0, 4498, 0, 4500, 0, 4510, 0, 4513, 0, 4522, 0, 4524, 0, 4525, 0,\n    4528, 0, 4529, 0, 4530, 0, 4531, 0, 4532, 0, 4533, 0, 4551, 0, 4552, 0,\n    4556, 0, 4558, 0, 4563, 0, 4567, 0, 4569, 0, 4573, 0, 4575, 0, 4593, 0,\n    4594, 0, 6917, 6965, 0, 6919, 6965, 0, 6921, 6965, 0, 6923, 6965, 0, 6925, 6965,\n    0, 6929, 6965, 0, 6970, 6965, 0, 6972, 6965, 0, 6974, 6965, 0, 6975, 6965, 0,\n    6978, 6965, 0, 7426, 0, 7446, 0, 7447, 0, 7452, 0, 7453, 0, 7461, 0, 7547,\n    0, 7557, 0, 7734, 772, 0, 7735, 772, 0, 7770, 772, 0, 7771, 772, 0, 7778,\n    775, 0, 7779, 775, 0, 7840, 770, 0, 7840, 774, 0, 7841, 770, 0, 7841, 774,\n    0, 7864, 770, 0, 7865, 770, 0, 7884, 770, 0, 7885, 770, 0, 7936, 768, 0,\n    7936, 769, 0, 7936, 834, 0, 7936, 837, 0, 7937, 768, 0, 7937, 769, 0, 7937,\n    834, 0, 7937, 837, 0, 7938, 837, 0, 7939, 837, 0, 7940, 837, 0, 7941, 837,\n    0, 7942, 837, 0, 7943, 837, 0, 7944, 768, 0, 7944, 769, 0, 7944, 834, 0,\n    7944, 837, 0, 7945, 768, 0, 7945, 769, 0, 7945, 834, 0, 7945, 837, 0, 7946,\n    837, 0, 7947, 837, 0, 7948, 837, 0, 7949, 837, 0, 7950, 837, 0, 7951, 837,\n    0, 7952, 768, 0, 7952, 769, 0, 7953, 768, 0, 7953, 769, 0, 7960, 768, 0,\n    7960, 769, 0, 7961, 768, 0, 7961, 769, 0, 7968, 768, 0, 7968, 769, 0, 7968,\n    834, 0, 7968, 837, 0, 7969, 768, 0, 7969, 769, 0, 7969, 834, 0, 7969, 837,\n    0, 7970, 837, 0, 7971, 837, 0, 7972, 837, 0, 7973, 837, 0, 7974, 837, 0,\n    7975, 837, 0, 7976, 768, 0, 7976, 769, 0, 7976, 834, 0, 7976, 837, 0, 7977,\n    768, 0, 7977, 769, 0, 7977, 834, 0, 7977, 837, 0, 7978, 837, 0, 7979, 837,\n    0, 7980, 837, 0, 7981, 837, 0, 7982, 837, 0, 7983, 837, 0, 7984, 768, 0,\n    7984, 769, 0, 7984, 834, 0, 7985, 768, 0, 7985, 769, 0, 7985, 834, 0, 7992,\n    768, 0, 7992, 769, 0, 7992, 834, 0, 7993, 768, 0, 7993, 769, 0, 7993, 834,\n    0, 8000, 768, 0, 8000, 769, 0, 8001, 768, 0, 8001, 769, 0, 8008, 768, 0,\n    8008, 769, 0, 8009, 768, 0, 8009, 769, 0, 8016, 768, 0, 8016, 769, 0, 8016,\n    834, 0, 8017, 768, 0, 8017, 769, 0, 8017, 834, 0, 8025, 768, 0, 8025, 769,\n    0, 8025, 834, 0, 8032, 768, 0, 8032, 769, 0, 8032, 834, 0, 8032, 837, 0,\n    8033, 768, 0, 8033, 769, 0, 8033, 834, 0, 8033, 837, 0, 8034, 837, 0, 8035,\n    837, 0, 8036, 837, 0, 8037, 837, 0, 8038, 837, 0, 8039, 837, 0, 8040, 768,\n    0, 8040, 769, 0, 8040, 834, 0, 8040, 837, 0, 8041, 768, 0, 8041, 769, 0,\n    8041, 834, 0, 8041, 837, 0, 8042, 837, 0, 8043, 837, 0, 8044, 837, 0, 8045,\n    837, 0, 8046, 837, 0, 8047, 837, 0, 8048, 837, 0, 8052, 837, 0, 8060, 837,\n    0, 8118, 837, 0, 8127, 768, 0, 8127, 769, 0, 8127, 834, 0, 8134, 837, 0,\n    8182, 837, 0, 8190, 768, 0, 8190, 769, 0, 8190, 834, 0, 8194, 0, 8195, 0,\n    8208, 0, 8211, 0, 8212, 0, 8229, 0, 8230, 0, 8242, 8242, 0, 8242, 8242, 8242,\n    0, 8242, 8242, 8242, 8242, 0, 8245, 8245, 0, 8245, 8245, 8245, 0, 8254, 0, 8361,\n    0, 8592, 0, 8592, 824, 0, 8593, 0, 8594, 0, 8594, 824, 0, 8595, 0, 8596,\n    824, 0, 8656, 824, 0, 8658, 824, 0, 8660, 824, 0, 8707, 824, 0, 8712, 824,\n    0, 8715, 824, 0, 8721, 0, 8722, 0, 8739, 824, 0, 8741, 824, 0, 8747, 8747,\n    0, 8747, 8747, 8747, 0, 8747, 8747, 8747, 8747, 0, 8750, 8750, 0, 8750, 8750, 8750,\n    0, 8764, 824, 0, 8771, 824, 0, 8773, 824, 0, 8776, 824, 0, 8781, 824, 0,\n    8801, 824, 0, 8804, 824, 0, 8805, 824, 0, 8818, 824, 0, 8819, 824, 0, 8822,\n    824, 0, 8823, 824, 0, 8826, 824, 0, 8827, 824, 0, 8828, 824, 0, 8829, 824,\n    0, 8834, 824, 0, 8835, 824, 0, 8838, 824, 0, 8839, 824, 0, 8849, 824, 0,\n    8850, 824, 0, 8866, 824, 0, 8872, 824, 0, 8873, 824, 0, 8875, 824, 0, 8882,\n    824, 0, 8883, 824, 0, 8884, 824, 0, 8885, 824, 0, 9474, 0, 9632, 0, 9675,\n    0, 10629, 0, 10630, 0, 10973, 824, 0, 11617, 0, 12289, 0, 12290, 0, 12296, 0,\n    12297, 0, 12298, 0, 12299, 0, 12300, 0, 12301, 0, 12302, 0, 12303, 0, 12304, 0,\n    12305, 0, 12306, 0, 12308, 0, 12309, 0, 12310, 0, 12311, 0, 12358, 12441, 0, 12363,\n    12441, 0, 12365, 12441, 0, 12367, 12441, 0, 12369, 12441, 0, 12371, 12441, 0, 12373, 12441,\n    0, 12375, 12441, 0, 12377, 12441, 0, 12379, 12441, 0, 12381, 12441, 0, 12383, 12441, 0,\n    12385, 12441, 0, 12388, 12441, 0, 12390, 12441, 0, 12392, 12441, 0, 12399, 12441, 0, 12399,\n    12442, 0, 12402, 12441, 0, 12402, 12442, 0, 12405, 12441, 0, 12405, 12442, 0, 12408, 12441,\n    0, 12408, 12442, 0, 12411, 12441, 0, 12411, 12442, 0, 12424, 12426, 0, 12441, 0, 12442,\n    0, 12445, 12441, 0, 12449, 0, 12450, 0, 12450, 12497, 12540, 12488, 0, 12450, 12523, 12501,\n    12449, 0, 12450, 12531, 12506, 12450, 0, 12450, 12540, 12523, 0, 12451, 0, 12452, 0, 12452,\n    12491, 12531, 12464, 0, 12452, 12531, 12481, 0, 12453, 0, 12454, 0, 12454, 12441, 0, 12454,\n    12457, 12531, 0, 12455, 0, 12456, 0, 12456, 12473, 12463, 12540, 12489, 0, 12456, 12540, 12459,\n    12540, 0, 12457, 0, 12458, 0, 12458, 12531, 12473, 0, 12458, 12540, 12512, 0, 12459, 0,\n    12459, 12441, 0, 12459, 12452, 12522, 0, 12459, 12521, 12483, 12488, 0, 12459, 12525, 12522, 12540,\n    0, 12460, 12525, 12531, 0, 12460, 12531, 12510, 0, 12461, 0, 12461, 12441, 0, 12461, 12517,\n    12522, 12540, 0, 12461, 12525, 0, 12461, 12525, 12464, 12521, 12512, 0, 12461, 12525, 12513, 12540,\n    12488, 12523, 0, 12461, 12525, 12527, 12483, 12488, 0, 12462, 12460, 0, 12462, 12491, 12540, 0,\n    12462, 12523, 12480, 12540, 0, 12463, 0, 12463, 12441, 0, 12463, 12523, 12476, 12452, 12525, 0,\n    12463, 12525, 12540, 12493, 0, 12464, 12521, 12512, 0, 12464, 12521, 12512, 12488, 12531, 0, 12465,\n    0, 12465, 12441, 0, 12465, 12540, 12473, 0, 12467, 0, 12467, 12441, 0, 12467, 12488, 0,\n    12467, 12523, 12490, 0, 12467, 12540, 12509, 0, 12469, 0, 12469, 12441, 0, 12469, 12452, 12463,\n    12523, 0, 12469, 12531, 12481, 12540, 12512, 0, 12471, 0, 12471, 12441, 0, 12471, 12522, 12531,\n    12464, 0, 12473, 0, 12473, 12441, 0, 12475, 0, 12475, 12441, 0, 12475, 12531, 12481, 0,\n    12475, 12531, 12488, 0, 12477, 0, 12477, 12441, 0, 12479, 0, 12479, 12441, 0, 12480, 12540,\n    12473, 0, 12481, 0, 12481, 12441, 0, 12483, 0, 12484, 0, 12484, 12441, 0, 12486, 0,\n    12486, 12441, 0, 12487, 12471, 0, 12488, 0, 12488, 12441, 0, 12488, 12531, 0, 12489, 12523,\n    0, 12490, 0, 12490, 12494, 0, 12491, 0, 12492, 0, 12493, 0, 12494, 0, 12494, 12483,\n    12488, 0, 12495, 0, 12495, 12441, 0, 12495, 12442, 0, 12495, 12452, 12484, 0, 12496, 12540,\n    12524, 12523, 0, 12497, 12540, 12475, 12531, 12488, 0, 12497, 12540, 12484, 0, 12498, 0, 12498,\n    12441, 0, 12498, 12442, 0, 12499, 12523, 0, 12500, 12450, 12473, 12488, 12523, 0, 12500, 12463,\n    12523, 0, 12500, 12467, 0, 12501, 0, 12501, 12441, 0, 12501, 12442, 0, 12501, 12449, 12521,\n    12483, 12489, 0, 12501, 12451, 12540, 12488, 0, 12501, 12521, 12531, 0, 12502, 12483, 12471, 12455,\n    12523, 0, 12504, 0, 12504, 12441, 0, 12504, 12442, 0, 12504, 12463, 12479, 12540, 12523, 0,\n    12504, 12523, 12484, 0, 12505, 12540, 12479, 0, 12506, 12477, 0, 12506, 12491, 12498, 0, 12506,\n    12531, 12473, 0, 12506, 12540, 12472, 0, 12507, 0, 12507, 12441, 0, 12507, 12442, 0, 12507,\n    12531, 0, 12507, 12540, 12523, 0, 12507, 12540, 12531, 0, 12508, 12523, 12488, 0, 12509, 12452,\n    12531, 12488, 0, 12509, 12531, 12489, 0, 12510, 0, 12510, 12452, 12463, 12525, 0, 12510, 12452,\n    12523, 0, 12510, 12483, 12495, 0, 12510, 12523, 12463, 0, 12510, 12531, 12471, 12519, 12531, 0,\n    12511, 0, 12511, 12463, 12525, 12531, 0, 12511, 12522, 0, 12511, 12522, 12496, 12540, 12523, 0,\n    12512, 0, 12513, 0, 12513, 12460, 0, 12513, 12460, 12488, 12531, 0, 12513, 12540, 12488, 12523,\n    0, 12514, 0, 12515, 0, 12516, 0, 12516, 12540, 12489, 0, 12516, 12540, 12523, 0, 12517,\n    0, 12518, 0, 12518, 12450, 12531, 0, 12519, 0, 12520, 0, 12521, 0, 12522, 0, 12522,\n    12483, 12488, 12523, 0, 12522, 12521, 0, 12523, 0, 12523, 12500, 12540, 0, 12523, 12540, 12502,\n    12523, 0, 12524, 0, 12524, 12512, 0, 12524, 12531, 12488, 12466, 12531, 0, 12525, 0, 12527,\n    0, 12527, 12441, 0, 12527, 12483, 12488, 0, 12528, 0, 12528, 12441, 0, 12529, 0, 12529,\n    12441, 0, 12530, 0, 12530, 12441, 0, 12531, 0, 12539, 0, 12540, 0, 12541, 12441, 0,\n    12593, 0, 12594, 0, 12595, 0, 12596, 0, 12597, 0, 12598, 0, 12599, 0, 12600, 0,\n    12601, 0, 12602, 0, 12603, 0, 12604, 0, 12605, 0, 12606, 0, 12607, 0, 12608, 0,\n    12609, 0, 12610, 0, 12611, 0, 12612, 0, 12613, 0, 12614, 0, 12615, 0, 12616, 0,\n    12617, 0, 12618, 0, 12619, 0, 12620, 0, 12621, 0, 12622, 0, 12623, 0, 12624, 0,\n    12625, 0, 12626, 0, 12627, 0, 12628, 0, 12629, 0, 12630, 0, 12631, 0, 12632, 0,\n    12633, 0, 12634, 0, 12635, 0, 12636, 0, 12637, 0, 12638, 0, 12639, 0, 12640, 0,\n    12641, 0, 12642, 0, 12643, 0, 12644, 0, 15261, 0, 16408, 0, 16441, 0, 19968, 0,\n    19969, 0, 19971, 0, 19977, 0, 19978, 0, 19979, 0, 19981, 0, 19993, 0, 20006, 0,\n    20008, 0, 20013, 0, 20018, 0, 20022, 0, 20025, 0, 20031, 0, 20057, 0, 20061, 0,\n    20098, 0, 20101, 0, 20102, 0, 20108, 0, 20116, 0, 20128, 0, 20142, 0, 20154, 0,\n    20160, 0, 20196, 0, 20225, 0, 20241, 0, 20352, 0, 20358, 0, 20363, 0, 20398, 0,\n    20415, 0, 20523, 0, 20698, 0, 20711, 0, 20778, 0, 20799, 0, 20800, 0, 20805, 0,\n    20813, 0, 20837, 0, 20840, 0, 20841, 0, 20843, 0, 20845, 0, 20864, 0, 20866, 0,\n    20886, 0, 20889, 0, 20907, 0, 20917, 0, 20919, 0, 20937, 0, 20940, 0, 20956, 0,\n    20958, 0, 20960, 0, 20981, 0, 20992, 0, 20999, 0, 21015, 0, 21033, 0, 21050, 0,\n    21129, 0, 21147, 0, 21155, 0, 21172, 0, 21191, 0, 21193, 0, 21202, 0, 21214, 0,\n    21220, 0, 21237, 0, 21241, 0, 21242, 0, 21269, 0, 21271, 0, 21274, 0, 21304, 0,\n    21307, 0, 21311, 0, 21313, 0, 21316, 0, 21317, 0, 21329, 0, 21332, 0, 21340, 0,\n    21353, 0, 21360, 0, 21365, 0, 21378, 0, 21430, 0, 21443, 0, 21448, 0, 21475, 0,\n    21477, 0, 21491, 0, 21517, 0, 21519, 0, 21533, 0, 21570, 0, 21693, 0, 21845, 0,\n    21895, 0, 21913, 0, 21917, 0, 21952, 0, 21986, 0, 22022, 0, 22120, 0, 22231, 0,\n    22235, 0, 22265, 0, 22303, 0, 22320, 0, 22592, 0, 22618, 0, 22622, 0, 22696, 0,\n    22707, 0, 22744, 0, 22751, 0, 22763, 0, 22786, 0, 22794, 0, 22805, 0, 22812, 0,\n    22823, 0, 22823, 27491, 0, 22825, 0, 22852, 0, 22856, 0, 22865, 0, 22868, 0, 22899,\n    0, 23138, 0, 23336, 0, 23376, 0, 23398, 0, 23424, 0, 23429, 0, 23447, 0, 23527,\n    0, 23534, 0, 23544, 0, 23567, 0, 23586, 0, 23608, 0, 23615, 0, 23650, 0, 23652,\n    0, 23653, 0, 23662, 0, 23665, 0, 23833, 0, 23888, 0, 23994, 0, 24027, 0, 24037,\n    0, 24038, 0, 24049, 0, 24062, 0, 24178, 0, 24179, 25104, 0, 24180, 0, 24186, 0,\n    24191, 0, 24230, 0, 24265, 0, 24266, 0, 24274, 0, 24275, 0, 24281, 0, 24300, 0,\n    24308, 0, 24318, 0, 24324, 0, 24331, 0, 24339, 0, 24400, 0, 24417, 0, 24425, 0,\n    24435, 0, 24459, 0, 24489, 0, 24493, 0, 24515, 0, 24565, 0, 24594, 0, 24604, 0,\n    24724, 0, 24792, 0, 24801, 0, 24840, 0, 24900, 0, 24910, 0, 24928, 0, 24936, 0,\n    24974, 0, 24976, 0, 25074, 0, 25078, 0, 25088, 0, 25096, 0, 25134, 0, 25140, 0,\n    25142, 0, 25163, 0, 25289, 0, 25295, 0, 25299, 0, 25342, 0, 25467, 0, 25504, 0,\n    25540, 0, 25628, 0, 25682, 0, 25754, 0, 25796, 0, 25903, 0, 25908, 0, 25935, 0,\n    25942, 0, 25976, 0, 25991, 0, 26007, 0, 26009, 0, 26020, 0, 26041, 0, 26053, 0,\n    26080, 0, 26082, 0, 26085, 0, 26126, 27835, 0, 26131, 0, 26157, 21644, 0, 26228, 0,\n    26248, 0, 26257, 0, 26292, 0, 26310, 0, 26352, 0, 26356, 0, 26376, 0, 26377, 0,\n    26391, 0, 26395, 0, 26408, 0, 26446, 0, 26454, 0, 26491, 0, 26519, 0, 26611, 0,\n    26647, 0, 26666, 0, 26666, 24335, 20250, 31038, 0, 26753, 0, 26757, 0, 26792, 0, 27138,\n    0, 27155, 0, 27347, 0, 27396, 0, 27424, 0, 27490, 0, 27491, 0, 27511, 0, 27513,\n    0, 27566, 0, 27571, 0, 27578, 0, 27595, 0, 27597, 0, 27604, 0, 27611, 0, 27663,\n    0, 27668, 0, 27700, 0, 27784, 0, 27852, 0, 27877, 0, 27880, 0, 27931, 0, 27934,\n    0, 27969, 0, 28010, 0, 28023, 0, 28107, 0, 28122, 0, 28138, 0, 28186, 0, 28316,\n    0, 28346, 0, 28363, 0, 28369, 0, 28379, 0, 28431, 0, 28450, 0, 28451, 0, 28651,\n    0, 28670, 0, 28702, 0, 28779, 0, 28825, 0, 28872, 0, 28889, 0, 29001, 0, 29038,\n    0, 29134, 0, 29136, 0, 29200, 0, 29211, 0, 29226, 0, 29227, 0, 29237, 0, 29238,\n    0, 29243, 0, 29247, 0, 29255, 0, 29273, 0, 29275, 0, 29282, 0, 29305, 0, 29356,\n    0, 29359, 0, 29376, 0, 29436, 0, 29482, 0, 29557, 0, 29572, 0, 29575, 0, 29577,\n    0, 29618, 0, 29662, 0, 29702, 0, 29705, 0, 29730, 0, 29801, 0, 29809, 0, 29833,\n    0, 29848, 0, 29916, 0, 29926, 0, 29958, 0, 29976, 0, 29983, 0, 29992, 0, 30000,\n    0, 30002, 0, 30007, 0, 30011, 0, 30041, 0, 30053, 0, 30064, 0, 30091, 0, 30098,\n    0, 30178, 0, 30237, 0, 30239, 0, 30274, 0, 30313, 0, 30326, 0, 30333, 0, 30382,\n    0, 30399, 0, 30410, 0, 30427, 0, 30435, 0, 30439, 0, 30446, 0, 30452, 0, 30465,\n    0, 30528, 0, 30538, 0, 30631, 0, 30683, 0, 30690, 0, 30707, 0, 30827, 0, 30860,\n    0, 30865, 0, 30922, 0, 30924, 0, 30971, 0, 31018, 0, 31034, 0, 31036, 0, 31038,\n    0, 31048, 0, 31049, 0, 31056, 0, 31062, 0, 31069, 0, 31070, 0, 31077, 0, 31103,\n    0, 31117, 0, 31118, 0, 31119, 0, 31150, 0, 31160, 0, 31166, 0, 31178, 0, 31192,\n    0, 31260, 0, 31296, 0, 31348, 0, 31361, 0, 31409, 0, 31435, 0, 31481, 0, 31520,\n    0, 31680, 0, 31806, 0, 31840, 0, 31859, 0, 31867, 0, 31890, 0, 31934, 0, 31958,\n    0, 31975, 0, 31992, 0, 32016, 0, 32034, 0, 32047, 0, 32091, 0, 32160, 0, 32190,\n    0, 32244, 0, 32265, 0, 32311, 0, 32321, 0, 32566, 0, 32574, 0, 32593, 0, 32626,\n    0, 32633, 0, 32645, 0, 32650, 0, 32666, 0, 32701, 0, 32769, 0, 32773, 0, 32780,\n    0, 32786, 0, 32819, 0, 32838, 0, 32879, 0, 32894, 0, 32895, 0, 32905, 0, 32907,\n    0, 33240, 0, 33251, 0, 33256, 0, 33258, 0, 33261, 0, 33267, 0, 33276, 0, 33292,\n    0, 33307, 0, 33311, 0, 33390, 0, 33391, 0, 33394, 0, 33400, 0, 33401, 0, 33509,\n    0, 33590, 0, 33618, 0, 33737, 0, 33775, 0, 33777, 0, 33853, 0, 33865, 0, 33879,\n    0, 34030, 0, 34044, 0, 34253, 0, 34298, 0, 34310, 0, 34322, 0, 34349, 0, 34367,\n    0, 34381, 0, 34396, 0, 34411, 0, 34681, 0, 34746, 0, 34847, 0, 34880, 0, 34892,\n    0, 34915, 0, 35010, 0, 35023, 0, 35041, 0, 35064, 0, 35088, 0, 35137, 0, 35172,\n    0, 35198, 0, 35206, 0, 35211, 0, 35222, 0, 35282, 0, 35328, 0, 35498, 0, 35519,\n    0, 35531, 0, 35538, 0, 35542, 0, 35565, 0, 35576, 0, 35582, 0, 35585, 0, 35641,\n    0, 35672, 0, 35712, 0, 35722, 0, 35895, 0, 35910, 0, 35912, 0, 35925, 0, 35960,\n    0, 35997, 0, 36001, 0, 36034, 0, 36039, 0, 36040, 0, 36051, 0, 36104, 0, 36196,\n    0, 36208, 0, 36275, 0, 36335, 0, 36523, 0, 36554, 0, 36646, 0, 36650, 0, 36664,\n    0, 36667, 0, 36706, 0, 36763, 0, 36784, 0, 36789, 0, 36790, 0, 36899, 0, 36920,\n    0, 36969, 0, 36978, 0, 36988, 0, 37007, 0, 37009, 0, 37070, 0, 37117, 0, 37193,\n    0, 37226, 0, 37273, 0, 37300, 0, 37318, 0, 37324, 0, 37327, 0, 37329, 0, 37428,\n    0, 37494, 0, 37636, 0, 37706, 0, 38263, 0, 38272, 0, 38317, 0, 38428, 0, 38446,\n    0, 38475, 0, 38477, 0, 38517, 0, 38520, 0, 38524, 0, 38534, 0, 38563, 0, 38582,\n    0, 38584, 0, 38585, 0, 38626, 0, 38627, 0, 38632, 0, 38646, 0, 38647, 0, 38706,\n    0, 38728, 0, 38737, 0, 38742, 0, 38750, 0, 38754, 0, 38761, 0, 38859, 0, 38875,\n    0, 38893, 0, 38899, 0, 38911, 0, 38913, 0, 38917, 0, 38923, 0, 38936, 0, 38971,\n    0, 39006, 0, 39080, 0, 39131, 0, 39135, 0, 39151, 0, 39164, 0, 39208, 0, 39318,\n    0, 39321, 0, 39340, 0, 39409, 0, 39530, 0, 39592, 0, 39640, 0, 39647, 0, 39698,\n    0, 39717, 0, 39727, 0, 39730, 0, 39740, 0, 39770, 0, 39791, 0, 40023, 0, 40165,\n    0, 40372, 0, 40442, 0, 40478, 0, 40565, 0, 40575, 0, 40599, 0, 40607, 0, 40613,\n    0, 40635, 0, 40643, 0, 40653, 0, 40654, 0, 40657, 0, 40697, 0, 40701, 0, 40718,\n    0, 40723, 0, 40736, 0, 40763, 0, 40771, 0, 40778, 0, 40786, 0, 40845, 0, 40846,\n    0, 40860, 0, 40863, 0, 40864, 0, 42863, 0, 64329, 1473, 0, 64329, 1474, 0, 141380,\n    0, 141386, 0, 144341, 0, 152137, 0, 154832, 0, 163539, 0, 0\n};\n\nstatic const uint16_t charMapIndex[] =\n{\n    8599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    1, 0, 0, 0, 0, 0, 0, 0, 21, 0, 2004, 0, 0, 0, 0, 9,\n    0, 0, 841, 957, 3, 3699, 0, 0, 36, 638, 2610, 0, 816, 808, 1000, 0,\n    1199, 1202, 1205, 1208, 1220, 1226, 0, 1283, 1325, 1328, 1331, 1346, 1475, 1478, 1481, 1496,\n    0, 1632, 1655, 1658, 1661, 1664, 1676, 0, 0, 1824, 1827, 1830, 1842, 1948, 0, 0,\n    2022, 2025, 2028, 2031, 2043, 2049, 0, 2128, 2186, 2189, 2192, 2207, 2343, 2346, 2349, 2361,\n    0, 2589, 2615, 2618, 2621, 2624, 2636, 0, 0, 2796, 2799, 2802, 2814, 2916, 0, 2931,\n    1211, 2034, 1214, 2037, 1244, 2067, 1271, 2116, 1274, 2119, 1277, 2122, 1280, 2125, 1308, 2159,\n    0, 0, 1337, 2198, 1340, 2201, 1343, 2204, 1367, 2228, 1352, 2213, 1404, 2271, 1410, 2277,\n    1413, 2280, 1419, 2286, 1433, 2298, 0, 0, 1484, 2352, 1487, 2355, 1490, 2358, 1514, 2379,\n    1493, 0, 1463, 2331, 1522, 2387, 1545, 2443, 0, 1566, 2476, 1575, 2485, 1569, 2479, 1563,\n    2473, 0, 0, 1629, 2586, 1644, 2601, 1638, 2595, 3432, 0, 0, 1667, 2627, 1670, 2630,\n    1682, 2642, 0, 0, 1735, 2715, 1753, 2733, 1741, 2721, 1767, 2747, 1770, 2750, 1785, 2765,\n    1776, 2756, 1813, 2785, 1804, 2776, 0, 0, 1833, 2805, 1836, 2808, 1839, 2811, 1848, 2820,\n    1851, 2823, 1872, 2844, 1916, 2881, 1951, 2919, 1963, 1974, 2945, 1980, 2951, 1983, 2954, 2739,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    1694, 2654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1863,\n    2835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 1299, 1302, 2153, 1553, 1560, 2457, 1617, 1620, 2574, 1229, 2052, 1502,\n    2367, 1685, 2645, 1854, 2826, 3081, 3164, 3078, 3161, 3084, 3167, 3075, 3158, 0, 3014, 3099,\n    3329, 3332, 3027, 3108, 0, 0, 1416, 2283, 1539, 2437, 1700, 2660, 3321, 3324, 3318, 3421,\n    2390, 1293, 1296, 2150, 1401, 2268, 0, 0, 1626, 2583, 3019, 3102, 3024, 3105, 3072, 3155,\n    1232, 2055, 1235, 2058, 1355, 2216, 1358, 2219, 1505, 2370, 1508, 2373, 1688, 2648, 1691, 2651,\n    1744, 2724, 1747, 2727, 1857, 2829, 1860, 2832, 1782, 2762, 1810, 2782, 0, 0, 1442, 2307,\n    0, 0, 0, 0, 0, 0, 1217, 2040, 1364, 2225, 3069, 3152, 3063, 3146, 1673, 2633,\n    3341, 3344, 1957, 2925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    2289, 3371, 2385, 2696, 3397, 3399, 3401, 2873, 2911, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 15, 18, 24, 39, 6, 27, 0, 0,\n    3367, 2455, 2739, 2896, 3424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3435, 3437, 0, 3442, 3439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 3430, 0, 0, 0, 0, 0, 48, 0, 0, 0, 1160, 0,\n    0, 0, 0, 0, 3, 2982, 3465, 3000, 3488, 3500, 3517, 0, 3538, 0, 3559, 3579,\n    3798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3526, 3568, 3610, 3642, 3654, 3676,\n    3807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3685, 3761, 3728, 3752, 3780, 0,\n    3631, 3669, 3554, 3822, 3825, 3773, 3737, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3697, 3739, 3747, 0, 3512, 3637, 0, 0, 0, 3552, 0, 0, 0, 0, 0, 0,\n    3840, 3846, 0, 3837, 0, 0, 0, 3828, 0, 0, 0, 0, 3870, 3858, 3879, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 3864, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 3930, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3906, 3912, 0, 3903, 0, 0, 0, 3965, 0, 0, 0, 0, 3936, 3924, 3947, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 3968, 3971, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 3849, 3915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3831, 3897, 3834, 3900, 0, 0, 3843, 3909, 0, 0, 3974, 3977, 3852, 3918, 3855, 3921,\n    0, 0, 3861, 3927, 3867, 3933, 3873, 3941, 0, 0, 3980, 3983, 3894, 3962, 3876, 3944,\n    3882, 3950, 3885, 3953, 3888, 3956, 0, 0, 3891, 3959, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 3986, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 4203, 4206, 5137, 4209, 5196, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 4212, 5140, 5271, 5199, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    5291, 0, 5262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 5286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 5312, 0, 0, 0, 0, 0, 0,\n    0, 5321, 0, 0, 5324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 5294, 5297, 5300, 5303, 5306, 5309, 5315, 5318,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5336, 5339, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5327, 5330, 0, 5333,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 5354, 0, 0, 5357, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 5342, 5345, 5348, 0, 0, 5351, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 5369, 0, 0, 5366, 5372, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5360, 5363, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 5375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5378, 5384, 5381, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 5387, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    5390, 0, 0, 0, 0, 0, 0, 5396, 5399, 0, 5393, 5402, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5405, 5411, 5408, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5414, 0, 5417, 5423, 5420, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 5426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 5435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5429, 5432, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5438, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 5443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5446, 0, 0,\n    0, 0, 5449, 0, 0, 0, 0, 5452, 0, 0, 0, 0, 5455, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 5440, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 5458, 0, 5461, 5485, 5488, 5491, 5494, 0, 0, 0, 0, 0, 0,\n    0, 5464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 5470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5473, 0, 0,\n    0, 0, 5476, 0, 0, 0, 0, 5479, 0, 0, 0, 0, 5482, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 5467, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 5497, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5500, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1194, 3022, 1251, 0,\n    1291, 1323, 3252, 1385, 1422, 1454, 1520, 1525, 1551, 1584, 1615, 0, 1653, 3327, 1703, 1730,\n    1788, 1822, 1905, 2004, 3347, 3349, 5779, 2070, 2131, 2177, 3357, 3359, 3361, 2262, 0, 2393,\n    2494, 3208, 2610, 3353, 5781, 5783, 2663, 2768, 2794, 5787, 3381, 2853, 5789, 3631, 3633, 3635,\n    3773, 3775, 2322, 2696, 2794, 2853, 3631, 3633, 3739, 3773, 3775, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 3939, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3351, 2085, 3355, 3129, 3361,\n    2237, 3363, 3365, 3369, 3373, 3375, 3377, 5791, 3426, 3379, 5793, 3428, 3385, 3383, 3387, 3389,\n    3391, 3393, 3395, 3403, 3405, 3286, 3407, 3409, 5785, 3411, 3413, 2943, 3415, 3417, 3419, 3669,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    1241, 2064, 1256, 2076, 1259, 2079, 1262, 2082, 3030, 3111, 1305, 2156, 1311, 2162, 1320, 2171,\n    1314, 2165, 1317, 2168, 3194, 3200, 3197, 3203, 1370, 2231, 1373, 2234, 3335, 3338, 1382, 2259,\n    1407, 2274, 1436, 2301, 1445, 2310, 1439, 2304, 1448, 2313, 1451, 2316, 1517, 2382, 3045, 3126,\n    1536, 2434, 1542, 2440, 1548, 2446, 1572, 2482, 5795, 5798, 1581, 2491, 1578, 2488, 1603, 2539,\n    1606, 2542, 1609, 2545, 1635, 2592, 1641, 2598, 1650, 2607, 1647, 2604, 3060, 3143, 3066, 3149,\n    3210, 3216, 3213, 3219, 1722, 2688, 1725, 2691, 1738, 2718, 1750, 2730, 5801, 5804, 1756, 2736,\n    1773, 2753, 1779, 2759, 3222, 3225, 3228, 3231, 5807, 5810, 1801, 2770, 1807, 2779, 1819, 2791,\n    1816, 2788, 1869, 2841, 1878, 2850, 1875, 2847, 3234, 3237, 3240, 3243, 1895, 2867, 1898, 2870,\n    1910, 2875, 1913, 2878, 1922, 2887, 1919, 2884, 1925, 2893, 1937, 2905, 1940, 2908, 1960, 2928,\n    1977, 2948, 1986, 2957, 1989, 2960, 2319, 2773, 2890, 2937, 2019, 3249, 0, 0, 0, 0,\n    1238, 2061, 1223, 2046, 3005, 3090, 3002, 3087, 3011, 3096, 3008, 3093, 5813, 5819, 3173, 3185,\n    3170, 3182, 3179, 3191, 3176, 3188, 5816, 5822, 1361, 2222, 1349, 2210, 1334, 2195, 3036, 3117,\n    3033, 3114, 3042, 3123, 3039, 3120, 5825, 5828, 1499, 2364, 1511, 2376, 1697, 2657, 1679, 2639,\n    3051, 3134, 3048, 3131, 3057, 3140, 3054, 3137, 5831, 5834, 3259, 3274, 3256, 3271, 3265, 3280,\n    3262, 3277, 3268, 3283, 1866, 2838, 1845, 2817, 3291, 3306, 3288, 3303, 3297, 3312, 3294, 3309,\n    3300, 3315, 1945, 2913, 1969, 2940, 1966, 2934, 1954, 2922, 0, 0, 0, 0, 0, 0,\n    3619, 3622, 5837, 5849, 5840, 5852, 5843, 5855, 3474, 3477, 5879, 5891, 5882, 5894, 5885, 5897,\n    3645, 3648, 5921, 5927, 5924, 5930, 0, 0, 3491, 3494, 5933, 5939, 5936, 5942, 0, 0,\n    3657, 3660, 5945, 5957, 5948, 5960, 5951, 5963, 3503, 3506, 5987, 5999, 5990, 6002, 5993, 6005,\n    3688, 3691, 6029, 6038, 6032, 6041, 6035, 6044, 3529, 3532, 6047, 6056, 6050, 6059, 6053, 6062,\n    3731, 3734, 6065, 6071, 6068, 6074, 0, 0, 3541, 3544, 6077, 6083, 6080, 6086, 0, 0,\n    3764, 3767, 6089, 6098, 6092, 6101, 6095, 6104, 0, 3571, 0, 6107, 0, 6110, 0, 6113,\n    3783, 3786, 6116, 6128, 6119, 6131, 6122, 6134, 3582, 3585, 6158, 6170, 6161, 6173, 6164, 6176,\n    3607, 3591, 3639, 3596, 3651, 3598, 3673, 3603, 3725, 3813, 3749, 3815, 3777, 3817, 0, 0,\n    5846, 5858, 5861, 5864, 5867, 5870, 5873, 5876, 5888, 5900, 5903, 5906, 5909, 5912, 5915, 5918,\n    5954, 5966, 5969, 5972, 5975, 5978, 5981, 5984, 5996, 6008, 6011, 6014, 6017, 6020, 6023, 6026,\n    6125, 6137, 6140, 6143, 6146, 6149, 6152, 6155, 6167, 6179, 6182, 6185, 6188, 6191, 6194, 6197,\n    3616, 3613, 6200, 3628, 3593, 0, 3625, 6209, 3471, 3468, 3462, 3446, 3480, 30, 3671, 30,\n    45, 2985, 6203, 3666, 3600, 0, 3663, 6221, 3485, 3448, 3497, 3450, 3509, 6212, 6215, 6218,\n    3682, 3679, 3795, 3460, 0, 0, 3694, 3801, 3523, 3520, 3514, 3452, 0, 6227, 6230, 6233,\n    3758, 3755, 3804, 3605, 3741, 3744, 3770, 3810, 3565, 3562, 3556, 3456, 3549, 2979, 3444, 2002,\n    0, 0, 6206, 3792, 3819, 0, 3789, 6224, 3535, 3454, 3576, 3458, 3588, 2998, 33, 0,\n    6236, 6238, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,\n    0, 6240, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 622, 624, 627, 0, 0, 0, 0, 0, 0, 0, 0, 1,\n    0, 0, 0, 6250, 6253, 0, 6262, 6265, 0, 0, 0, 0, 107, 0, 12, 0,\n    0, 0, 0, 0, 0, 0, 0, 1189, 1186, 110, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 6257, 0, 0, 0, 0, 0, 0, 0, 1,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    633, 2322, 0, 0, 1021, 1069, 1094, 1108, 1126, 1140, 616, 6310, 1167, 125, 612, 2560,\n    633, 638, 841, 957, 1021, 1069, 1094, 1108, 1126, 1140, 616, 6310, 1167, 125, 612, 0,\n    2004, 2177, 2610, 2896, 3357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 1732, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    2011, 2015, 1265, 2992, 0, 2087, 2091, 3254, 0, 2995, 2262, 1422, 1422, 1422, 2289, 3206,\n    1454, 1454, 1551, 2455, 0, 1615, 1623, 0, 0, 1703, 1728, 1730, 1730, 1730, 0, 0,\n    1761, 1790, 1798, 0, 1972, 0, 3574, 0, 1972, 0, 1525, 3017, 1251, 1265, 0, 2177,\n    1323, 1376, 0, 1584, 2610, 4004, 4018, 4026, 4031, 2322, 0, 1378, 3737, 3633, 3483, 3547,\n    6308, 0, 0, 0, 0, 1291, 2131, 2177, 2322, 2385, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 812, 940, 820, 944, 1004, 1056, 824, 1077, 828, 1008, 1081, 1113, 805,\n    1454, 1456, 1459, 1469, 1881, 1883, 1886, 1890, 1472, 1928, 1930, 1933, 1551, 1265, 1291, 1584,\n    2322, 2324, 2327, 2337, 2853, 2855, 2858, 2862, 2340, 2896, 2898, 2901, 2455, 2085, 2131, 2494,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6275, 6282, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6287, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6290, 6296, 6293,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 6299, 0, 0, 0, 0, 6302, 0, 0, 6305, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 6312, 0, 6315, 0, 0, 0, 0, 0, 6318, 6321, 0, 6330,\n    6333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 6337, 0, 0, 6340, 0, 0, 6343, 0, 6346, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    1176, 0, 6352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6349, 1164, 1181,\n    6355, 6358, 0, 0, 6361, 6364, 0, 0, 6367, 6370, 0, 0, 0, 0, 0, 0,\n    6373, 6376, 0, 0, 6385, 6388, 0, 0, 6391, 6394, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6403, 6406, 6409, 6412,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    6379, 6382, 6397, 6400, 0, 0, 0, 0, 0, 0, 6415, 6418, 6421, 6424, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 6446, 6448, 0, 0, 0, 0, 0,\n    638, 841, 957, 1021, 1069, 1094, 1108, 1126, 1140, 643, 662, 681, 700, 715, 730, 745,\n    760, 775, 790, 846, 127, 181, 190, 194, 198, 202, 206, 210, 214, 131, 136, 141,\n    146, 151, 156, 161, 166, 171, 176, 185, 640, 843, 959, 1023, 1071, 1096, 1110, 1128,\n    1142, 646, 665, 684, 703, 718, 733, 748, 763, 778, 793, 849, 218, 222, 226, 230,\n    234, 238, 242, 246, 250, 254, 258, 262, 266, 270, 274, 278, 282, 286, 290, 294,\n    298, 302, 306, 310, 314, 318, 1194, 1251, 1265, 1291, 1323, 1376, 1385, 1422, 1454, 1520,\n    1525, 1551, 1584, 1615, 1653, 1703, 1728, 1730, 1759, 1788, 1822, 1881, 1905, 1928, 1943, 1972,\n    2004, 2070, 2085, 2131, 2177, 2237, 2262, 2289, 2322, 2385, 2393, 2455, 2494, 2560, 2610, 2663,\n    2694, 2696, 2739, 2768, 2794, 2853, 2873, 2896, 2911, 2943, 633, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6325, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 1156, 1169, 1172, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6437, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6440,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7833,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 8595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7278, 7296, 7302, 7306, 7308, 7314, 7318, 7322, 7326, 7354, 7362, 7368, 7374, 7376, 7380, 7394,\n    7396, 7398, 7410, 7428, 7432, 7436, 7438, 7444, 7454, 7456, 7462, 7464, 7468, 7470, 7502, 7508,\n    7526, 7528, 7530, 7532, 7536, 7551, 7557, 7561, 7571, 7573, 7575, 7577, 7587, 7589, 7597, 7599,\n    7603, 7605, 7607, 7614, 7616, 7632, 7634, 7638, 7640, 7642, 7644, 7648, 7656, 7690, 7696, 7698,\n    7722, 7724, 7732, 7734, 7738, 7740, 7744, 7748, 7768, 7772, 7780, 7815, 7817, 7823, 7827, 7831,\n    7835, 7837, 7839, 7841, 7843, 7893, 7913, 7919, 7921, 7923, 7925, 7927, 7929, 7935, 7947, 7951,\n    7971, 7973, 7977, 7979, 7981, 7983, 7997, 7999, 8011, 8013, 8015, 8017, 8027, 8039, 8041, 8043,\n    8059, 8089, 8091, 8101, 8107, 8109, 8119, 8131, 8153, 8157, 8165, 8169, 8171, 8175, 8177, 8179,\n    8187, 8189, 8195, 8199, 8203, 8205, 8207, 8209, 8211, 8213, 8217, 8219, 8257, 8261, 8269, 8271,\n    8273, 8289, 8293, 8297, 8299, 8327, 8329, 8333, 8335, 8337, 8351, 8353, 8355, 8359, 8361, 8373,\n    8375, 8377, 8393, 8399, 8407, 8409, 8413, 8423, 8425, 8429, 8447, 8451, 8457, 8467, 8471, 8473,\n    8475, 8477, 8481, 8483, 8487, 8499, 8501, 8503, 8511, 8513, 8515, 8521, 8523, 8525, 8529, 8531,\n    8533, 8535, 8537, 8543, 8551, 8553, 8559, 8561, 8563, 8565, 8569, 8571, 8573, 8575, 8577, 8579,\n    8581, 8585, 8587, 8589, 8593, 8597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 6466, 0, 7444, 7446, 7448, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6479, 0, 6482, 0,\n    6485, 0, 6488, 0, 6491, 0, 6494, 0, 6497, 0, 6500, 0, 6503, 0, 6506, 0,\n    6509, 0, 6512, 0, 0, 6515, 0, 6518, 0, 6521, 0, 0, 0, 0, 0, 0,\n    6524, 6527, 0, 6530, 6533, 0, 6536, 6539, 0, 6542, 6545, 0, 6548, 6551, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 6476, 0, 0, 0, 0, 0, 0, 99, 102, 0, 6561, 6554,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6640, 0, 6667, 0,\n    6711, 0, 6737, 0, 6746, 0, 6762, 0, 6778, 0, 6788, 0, 6793, 0, 6806, 0,\n    6811, 0, 6820, 0, 0, 6827, 0, 6832, 0, 6840, 0, 0, 0, 0, 0, 0,\n    6868, 6871, 0, 6895, 6898, 0, 6919, 6922, 0, 6948, 6951, 0, 6985, 6988, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 6604, 0, 0, 7137, 7146, 7151, 7156, 0, 0, 0, 7165, 6749,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 5502, 5507, 5706, 5509, 5708, 5710, 5514, 5519, 5521, 5712, 5714, 5716, 5718, 5720, 5722,\n    5600, 5526, 5531, 5536, 5610, 5538, 5543, 5545, 5553, 5563, 5565, 5576, 5581, 5586, 5591, 5648,\n    5650, 5652, 5654, 5656, 5658, 5660, 5662, 5664, 5666, 5668, 5670, 5672, 5674, 5676, 5678, 5680,\n    5682, 5684, 5686, 5688, 5646, 5596, 5598, 5724, 5726, 5728, 5730, 5732, 5734, 5736, 5602, 5738,\n    5740, 5604, 5606, 5608, 5612, 5614, 5616, 5618, 5620, 5622, 5624, 5626, 5628, 5630, 5632, 5634,\n    5636, 5638, 5742, 5744, 5640, 5642, 5644, 5690, 5692, 5694, 5696, 5698, 5700, 5702, 5704, 0,\n    0, 0, 7278, 7318, 7284, 7504, 7286, 7298, 7288, 7985, 7308, 7292, 7280, 7541, 7510, 7326,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    322, 331, 340, 349, 358, 367, 376, 385, 409, 423, 432, 441, 450, 459, 326, 335,\n    344, 353, 362, 371, 380, 389, 413, 427, 436, 445, 454, 463, 418, 394, 402, 0,\n    468, 484, 476, 532, 488, 508, 472, 504, 480, 516, 548, 568, 564, 556, 608, 536,\n    544, 560, 552, 580, 524, 572, 600, 584, 512, 492, 528, 540, 576, 496, 604, 520,\n    588, 500, 592, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    1715, 861, 872, 883, 894, 905, 912, 919, 926, 933, 962, 969, 976, 979, 982, 985,\n    5502, 5509, 5514, 5521, 5526, 5531, 5538, 5545, 5553, 5565, 5576, 5581, 5586, 5591, 5504, 5511,\n    5516, 5523, 5528, 5533, 5540, 5547, 5555, 5567, 5578, 5583, 5588, 5593, 5570, 5558, 5550, 0,\n    7278, 7318, 7284, 7504, 7320, 7370, 7282, 7368, 7310, 7444, 7772, 7893, 7843, 7780, 8413, 7508,\n    7748, 7794, 7774, 8063, 7476, 7933, 8339, 8073, 7414, 8095, 7987, 7551, 8385, 7352, 7458, 7851,\n    8489, 7334, 7378, 7819, 7286, 7298, 7288, 7601, 7474, 7440, 7565, 7559, 8023, 7332, 8343, 7452,\n    7534, 988, 991, 994, 997, 1026, 1029, 1032, 1035, 1038, 1041, 1044, 1047, 1050, 1053, 1074,\n    835, 951, 1015, 1063, 1088, 1102, 1120, 1134, 1148, 654, 673, 692, 1427, 2182, 2179, 1556,\n    6566, 6589, 6602, 6613, 6628, 6638, 6665, 6709, 6735, 6744, 6760, 6776, 6786, 6791, 6804, 6809,\n    6818, 6825, 6830, 6838, 6849, 6854, 6856, 6858, 6860, 6866, 6893, 6917, 6946, 6983, 7015, 7040,\n    7056, 7058, 7073, 7077, 7089, 7097, 7099, 7101, 7111, 7122, 7133, 7135, 7144, 7149, 7154, 0,\n    6568, 6573, 6578, 6583, 6591, 6596, 6607, 6615, 6621, 6630, 6634, 6643, 6647, 6652, 6657, 6661,\n    6697, 6700, 6670, 6704, 6675, 6678, 6684, 6691, 6725, 6729, 6714, 6720, 6740, 6752, 6756, 6765,\n    6770, 6781, 6796, 6800, 6814, 6835, 6846, 6843, 6851, 6862, 6874, 6883, 6889, 6878, 6904, 6910,\n    6914, 6901, 6925, 6931, 6940, 6936, 6954, 6968, 6971, 6960, 6975, 6979, 6964, 7006, 7002, 6991,\n    7011, 6994, 6998, 7017, 7022, 7026, 7030, 7034, 7042, 7047, 7050, 7060, 7063, 7068, 7079, 7083,\n    7091, 7103, 7108, 7113, 7117, 7124, 7127, 7140, 635, 838, 954, 1018, 1066, 1091, 1105, 1123,\n    1137, 1151, 658, 677, 696, 711, 726, 741, 756, 771, 786, 801, 857, 868, 879, 890,\n    901, 2291, 2136, 1196, 2072, 2612, 2682, 2139, 2142, 2146, 1466, 7609, 7755, 7538, 7750, 7796,\n    2670, 2562, 3701, 2496, 2395, 1527, 1586, 1387, 2095, 2412, 2673, 2565, 3704, 3713, 2508, 2417,\n    1430, 2398, 1589, 1390, 1794, 3722, 2548, 2174, 2452, 2256, 2577, 3716, 2515, 2105, 2420, 2518,\n    2108, 2533, 2423, 2522, 2112, 2536, 2427, 2551, 2555, 1719, 2402, 1593, 1394, 2698, 2702, 2708,\n    2685, 2580, 3719, 2530, 2676, 2568, 3707, 2499, 2406, 1597, 2679, 2571, 3710, 2502, 2409, 1600,\n    2449, 1612, 2006, 1253, 2099, 2102, 1286, 1267, 2133, 1398, 2295, 1424, 2334, 1530, 1533, 2431,\n    2460, 2463, 2466, 2470, 2505, 2511, 2526, 1705, 2665, 1708, 1712, 2741, 1764, 1907, 1901, 1247,\n    832, 948, 1012, 1060, 1085, 1099, 1117, 1131, 1145, 650, 669, 688, 707, 722, 737, 752,\n    767, 782, 797, 853, 864, 875, 886, 897, 908, 915, 922, 929, 936, 965, 972, 2264,\n    8331, 7770, 8361, 8345, 7877, 7300, 7472, 8593, 8593, 7547, 8413, 7488, 7545, 7686, 8009, 8163,\n    8255, 8265, 8281, 8391, 7807, 7853, 7899, 7955, 8235, 8401, 8517, 7312, 7460, 7813, 7911, 8253,\n    8549, 7593, 7887, 8245, 8287, 7700, 8193, 8267, 7622, 7776, 7859, 7941, 8395, 7338, 7384, 7422,\n    7720, 7811, 7909, 8025, 8171, 8249, 8259, 8357, 8463, 8539, 8547, 8047, 8079, 8141, 8229, 8419,\n    8553, 8309, 7524, 7636, 8117, 8185, 7931, 8051, 8341, 8461, 7522, 7581, 7809, 7865, 7881, 8137,\n    8149, 8433, 7420, 8191, 7390, 7388, 8097, 8143, 8233, 8437, 8323, 7702, 7807, 8315, 7304, 7567,\n    7660, 7949, 7995, 7434, 8055, 7344, 7652, 7290, 7847, 7730, 8135, 7466, 7516, 8031, 8237, 8301,\n    7829, 8375, 7845, 7706, 8223, 7710, 7993, 7324, 7366, 7386, 7801, 8129, 8215, 8307, 8411, 7426,\n    7482, 7551, 7630, 7742, 7889, 8057, 8427, 8519, 8555, 8567, 7410, 7766, 7821, 8371, 7612, 7682,\n    7688, 7718, 7885, 7901, 7967, 8093, 8145, 8183, 8363, 8241, 8381, 8421, 7402, 7412, 7484, 7897,\n    8275, 8301, 7620, 7658, 7708, 7825, 8115, 7945, 7330, 7506, 7567, 7595, 7662, 7953, 7963, 8167,\n    8181, 8415, 8459, 8465, 8493, 7340, 8087, 8405, 8449, 7668, 7316, 7348, 7569, 7579, 7736, 7807,\n    7905, 8007, 8243, 8389, 8589, 7760, 8431, 7408, 7786, 7790, 7857, 7871, 7959, 7991, 8045, 8133,\n    8497, 7370, 7692, 8439, 7346, 7591, 7867, 8365, 7650, 7672, 7792, 7949, 8443, 7404, 7478, 7585,\n    7753, 7782, 7805, 7849, 7957, 8001, 8161, 8277, 8279, 8409, 8453, 7442, 7873, 7480, 7907, 7969,\n    8247, 8445, 8541, 8557, 7788, 7863, 8197, 8107, 8111, 8123, 7939, 7895, 8321, 7328, 8225, 7406,\n    7400, 7618, 7704, 8127, 7563, 7855, 7764, 8369, 8271, 8435, 8293, 7626, 7356, 7494, 0, 0,\n    7514, 0, 7758, 0, 0, 7392, 7943, 8019, 8061, 8075, 8077, 8085, 8469, 8125, 8169, 0,\n    8251, 0, 8313, 0, 0, 8383, 8397, 0, 0, 0, 8505, 8507, 8509, 8545, 0, 0,\n    7342, 7350, 7360, 7418, 7424, 7450, 7492, 7498, 7500, 7512, 7518, 7583, 7587, 7664, 7678, 7680,\n    7684, 7726, 7746, 7762, 7803, 7861, 7869, 7883, 7903, 7915, 7961, 8049, 8063, 8067, 8065, 8069,\n    8071, 8073, 8081, 8083, 8099, 8103, 8113, 8145, 8147, 8151, 8159, 8173, 8201, 8221, 8221, 8239,\n    8283, 8295, 8317, 8319, 8347, 8349, 8379, 8383, 8455, 8485, 8495, 0, 0, 0, 0, 0,\n    7294, 7382, 7364, 7336, 7358, 7372, 7416, 7430, 7492, 7486, 7490, 7496, 7514, 7520, 7543, 7549,\n    7553, 7555, 7624, 7628, 7646, 7654, 7666, 7674, 7670, 7680, 7676, 7684, 7694, 7712, 7714, 7716,\n    7728, 7758, 7776, 7778, 7784, 7823, 7829, 7857, 7879, 7875, 7883, 7891, 7903, 8037, 7917, 7937,\n    7943, 7965, 7975, 7989, 8003, 8005, 8019, 8021, 8029, 8035, 8033, 8053, 8105, 8113, 8121, 8139,\n    8145, 8155, 8173, 8227, 8231, 8263, 8285, 8291, 8295, 8303, 8313, 8305, 8317, 8315, 8311, 8319,\n    8325, 8349, 8367, 8387, 8403, 8417, 8441, 8455, 8469, 8479, 8485, 8491, 8495, 8527, 8593, 8609,\n    8607, 8611, 7272, 7274, 7276, 8613, 8615, 8617, 8583, 8591, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    2239, 2250, 2253, 2242, 2246, 3246, 2744, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 3998, 3989, 3992, 4001, 3995, 0, 0, 0, 0, 0, 4053, 0, 4122,\n    4086, 4004, 4031, 4036, 4062, 4070, 4075, 4103, 4117, 616, 4111, 4114, 8601, 8604, 4006, 4009,\n    4012, 4020, 4028, 4033, 4038, 4044, 4047, 0, 4050, 4056, 4059, 4064, 4072, 0, 4077, 0,\n    4080, 4083, 0, 4088, 4091, 0, 4097, 4100, 4105, 4108, 4119, 4041, 4023, 4067, 4094, 4015,\n    5202, 5202, 5210, 5210, 5210, 5210, 5212, 5212, 5212, 5212, 5216, 5216, 5216, 5216, 5208, 5208,\n    5208, 5208, 5214, 5214, 5214, 5214, 5206, 5206, 5206, 5206, 5238, 5238, 5238, 5238, 5240, 5240,\n    5240, 5240, 5220, 5220, 5220, 5220, 5218, 5218, 5218, 5218, 5222, 5222, 5222, 5222, 5224, 5224,\n    5224, 5224, 5230, 5230, 5228, 5228, 5232, 5232, 5226, 5226, 5236, 5236, 5234, 5234, 5242, 5242,\n    5242, 5242, 5246, 5246, 5246, 5246, 5250, 5250, 5250, 5250, 5248, 5248, 5248, 5248, 5252, 5252,\n    5254, 5254, 5254, 5254, 5258, 5258, 5260, 5260, 5260, 5260, 5256, 5256, 5256, 5256, 5284, 5284,\n    5289, 5289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 5244, 5244, 5244, 5244, 5269, 5269, 5267, 5267, 5274, 5274, 5204, 5278, 5278,\n    5265, 5265, 5276, 5276, 5282, 5282, 5282, 5282, 5143, 5143, 4137, 4137, 4185, 4185, 4164, 4164,\n    4176, 4176, 4173, 4173, 4179, 4179, 4182, 4182, 4182, 4167, 4167, 4167, 5280, 5280, 5280, 5280,\n    4140, 4143, 4155, 4167, 4170, 4217, 4220, 4227, 4240, 4249, 4252, 4259, 4274, 4285, 4306, 4335,\n    4338, 4343, 4352, 4361, 4364, 4369, 4389, 4412, 4419, 4438, 4441, 4444, 4479, 4490, 4497, 4511,\n    4583, 4632, 4647, 4650, 4661, 4671, 4682, 4685, 4708, 4713, 4725, 4748, 4751, 4804, 4807, 4810,\n    4817, 4824, 4827, 4832, 4839, 4854, 4857, 4862, 4865, 4868, 4871, 4874, 4877, 4888, 4891, 4908,\n    4923, 4938, 4945, 4959, 4962, 4970, 4989, 5009, 5024, 5031, 5034, 5039, 5058, 5073, 5082, 5099,\n    5102, 5107, 5110, 5121, 5124, 5150, 5157, 5164, 5173, 5190, 5193, 4457, 4467, 5145, 57, 64,\n    71, 78, 85, 92, 4149, 4152, 4155, 4158, 4167, 4170, 4234, 4237, 4240, 4243, 4249, 4252,\n    4300, 4303, 4306, 4329, 4335, 4338, 4346, 4349, 4352, 4355, 4361, 4364, 4824, 4827, 4854, 4857,\n    4862, 4874, 4877, 4888, 4891, 4945, 4959, 4962, 4967, 5024, 5076, 5079, 5082, 5093, 5099, 5102,\n    5145, 5167, 5170, 5173, 5184, 5190, 5193, 4140, 4143, 4146, 4155, 4161, 4217, 4220, 4227, 4240,\n    4246, 4259, 4274, 4285, 4306, 4332, 4352, 4369, 4389, 4412, 4419, 4438, 4444, 4479, 4490, 4497,\n    4511, 4583, 4594, 4632, 4647, 4650, 4661, 4671, 4682, 4708, 4713, 4725, 4748, 4751, 4804, 4807,\n    4810, 4817, 4832, 4839, 4865, 4868, 4871, 4874, 4877, 4908, 4923, 4938, 4945, 4956, 4970, 4989,\n    5009, 5024, 5039, 5058, 5073, 5082, 5096, 5107, 5110, 5127, 5150, 5157, 5164, 5173, 5187, 4155,\n    4161, 4240, 4246, 4306, 4332, 4352, 4358, 4511, 4526, 4561, 4572, 4874, 4877, 4945, 5082, 5096,\n    5173, 5187, 4778, 4785, 4792, 4700, 4703, 4740, 4743, 4766, 4769, 4529, 4532, 4575, 4578, 4430,\n    4433, 4404, 4407, 4447, 4450, 4639, 4642, 4674, 4677, 4537, 4544, 4555, 4561, 4558, 4508, 4597,\n    4668, 4700, 4703, 4740, 4743, 4766, 4769, 4529, 4532, 4575, 4578, 4430, 4433, 4404, 4407, 4447,\n    4450, 4639, 4642, 4674, 4677, 4537, 4544, 4555, 4561, 4558, 4508, 4597, 4668, 4537, 4544, 4555,\n    4561, 4526, 4572, 4685, 4479, 4490, 4497, 4537, 4544, 4555, 4685, 4708, 4200, 4200, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    4262, 4277, 4277, 4281, 4288, 4309, 4313, 4317, 4392, 4392, 4426, 4422, 4493, 4482, 4486, 4518,\n    4518, 4514, 4522, 4522, 4586, 4586, 4635, 4547, 4547, 4540, 4564, 4564, 4568, 4568, 4653, 4664,\n    4664, 4688, 4688, 4692, 4696, 4716, 4728, 4728, 4732, 4754, 4762, 4758, 4813, 4813, 4842, 4846,\n    4926, 4934, 4930, 4911, 4911, 4941, 4941, 4948, 4948, 4992, 4996, 5005, 4973, 4981, 5012, 5016,\n    0, 0, 4977, 5113, 5117, 5061, 5065, 5046, 5046, 5050, 5089, 5085, 5176, 5176, 4230, 4270,\n    4266, 4296, 4292, 4325, 4321, 4400, 4372, 4396, 4500, 4590, 4551, 4657, 4919, 4952, 5160, 5153,\n    5180, 5027, 4850, 5069, 4842, 4926, 4736, 4884, 5042, 5020, 4915, 4880, 4915, 5042, 4376, 4415,\n    4985, 4820, 4223, 4880, 4716, 4635, 4504, 5054, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    4628, 4835, 4195, 4190, 5000, 4600, 4462, 4720, 5132, 4605, 4609, 4380, 4470, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    618, 6442, 6444, 1154, 1160, 105, 1184, 6472, 6474, 6248, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    6246, 6244, 6242, 2000, 2000, 125, 612, 2963, 2967, 6468, 6470, 6462, 6464, 6450, 6452, 6446,\n    6448, 6454, 6456, 6458, 6460, 0, 0, 1992, 1996, 6269, 6269, 6269, 6269, 2000, 2000, 2000,\n    618, 6442, 622, 0, 1160, 1154, 1184, 105, 6244, 125, 612, 2963, 2967, 6468, 6470, 115,\n    121, 614, 616, 620, 1162, 1179, 1167, 0, 1994, 117, 119, 1192, 0, 0, 0, 0,\n    51, 4772, 54, 0, 61, 0, 68, 4775, 75, 4782, 82, 4789, 89, 4796, 96, 4799,\n    4125, 4127, 4127, 4129, 4129, 4131, 4131, 4133, 4133, 4135, 4135, 4135, 4135, 4188, 4188, 4215,\n    4215, 4215, 4215, 4255, 4255, 4257, 4257, 4257, 4257, 4341, 4341, 4341, 4341, 4367, 4367, 4367,\n    4367, 4410, 4410, 4410, 4410, 4436, 4436, 4436, 4436, 4453, 4453, 4455, 4455, 4460, 4460, 4475,\n    4475, 4477, 4477, 4477, 4477, 4535, 4535, 4535, 4535, 4581, 4581, 4581, 4581, 4645, 4645, 4645,\n    4645, 4680, 4680, 4680, 4680, 4706, 4706, 4706, 4706, 4711, 4711, 4711, 4711, 4746, 4746, 4746,\n    4746, 4802, 4802, 4802, 4802, 4830, 4830, 4830, 4830, 4860, 4860, 4860, 4860, 4894, 4894, 4894,\n    4894, 4965, 4965, 4965, 4965, 5037, 5037, 5037, 5037, 5105, 5105, 5105, 5105, 5130, 5130, 5143,\n    5143, 5148, 5148, 5148, 5148, 4896, 4896, 4899, 4899, 4902, 4902, 4905, 4905, 0, 0, 0,\n    0, 105, 113, 115, 117, 119, 121, 123, 125, 612, 614, 616, 618, 620, 622, 631,\n    633, 638, 841, 957, 1021, 1069, 1094, 1108, 1126, 1140, 1154, 1160, 1162, 1167, 1179, 1184,\n    1192, 1194, 1251, 1265, 1291, 1323, 1376, 1385, 1422, 1454, 1520, 1525, 1551, 1584, 1615, 1653,\n    1703, 1728, 1730, 1759, 1788, 1822, 1881, 1905, 1928, 1943, 1972, 1992, 1994, 1996, 1998, 2000,\n    2002, 2004, 2070, 2085, 2131, 2177, 2237, 2262, 2289, 2322, 2385, 2393, 2455, 2494, 2560, 2610,\n    2663, 2694, 2696, 2739, 2768, 2794, 2853, 2873, 2896, 2911, 2943, 2963, 2965, 2967, 2969, 6433,\n    6435, 6444, 6454, 6456, 6442, 7161, 7154, 6564, 6587, 6600, 6611, 6626, 7075, 7087, 7095, 6823,\n    7163, 6566, 6589, 6602, 6613, 6628, 6638, 6665, 6709, 6735, 6744, 6760, 6776, 6786, 6791, 6804,\n    6809, 6818, 6825, 6830, 6838, 6849, 6854, 6856, 6858, 6860, 6866, 6893, 6917, 6946, 6983, 7015,\n    7040, 7056, 7058, 7073, 7077, 7089, 7097, 7099, 7101, 7111, 7122, 7133, 7135, 7159, 6557, 6559,\n    7270, 7168, 7170, 7172, 7174, 7176, 7178, 7180, 7182, 7184, 7186, 7188, 7190, 7192, 7194, 7196,\n    7198, 7200, 7202, 7204, 7206, 7208, 7210, 7212, 7214, 7216, 7218, 7220, 7222, 7224, 7226, 0,\n    0, 0, 7228, 7230, 7232, 7234, 7236, 7238, 0, 0, 7240, 7242, 7244, 7246, 7248, 7250,\n    0, 0, 7252, 7254, 7256, 7258, 7260, 7262, 0, 0, 7264, 7266, 7268, 0, 0, 0,\n    2971, 2973, 2988, 2990, 2977, 2975, 6271, 0, 6427, 6273, 6278, 6280, 6285, 6429, 6431, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0\n};\n\nstatic const uint16_t helperIndex[] =\n{\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1160, 1164, 1176, 1181, 0,\n    0, 1199, 1256, 1271, 1305, 1325, 1382, 1401, 1433, 1475, 1522, 1525, 1566, 1603, 1626, 1655,\n    1722, 0, 1735, 1767, 1801, 1824, 1895, 1910, 1937, 1945, 1974, 0, 0, 0, 0, 0,\n    2002, 2022, 2076, 2116, 2156, 2186, 2259, 2268, 2298, 2343, 2387, 2434, 2476, 2539, 2583, 2615,\n    2688, 0, 2715, 2747, 2770, 2796, 2867, 2875, 2905, 2913, 2945, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 2979, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 2998, 0, 0, 3000, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 3002, 0, 3014, 3017, 3024, 3030, 0, 0, 3033, 0, 0, 0, 0, 3045,\n    0, 0, 0, 0, 3048, 3060, 3069, 0, 3072, 0, 0, 0, 3075, 0, 0, 0,\n    0, 0, 3087, 0, 3099, 3102, 3105, 3111, 0, 0, 3114, 0, 0, 0, 0, 3126,\n    0, 0, 0, 0, 3131, 3143, 3152, 0, 3155, 0, 0, 0, 3158, 0, 0, 0,\n    0, 0, 3170, 3182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 3194, 3200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3210, 3216, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3222, 3225, 0, 0, 0, 0,\n    3228, 3231, 0, 0, 0, 0, 0, 0, 3234, 3237, 3240, 3243, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3249,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3256, 3271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3288,\n    3303, 0, 0, 0, 0, 0, 0, 3318, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3321, 3324, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 3329, 3332, 3335, 3338, 0, 0, 0, 0, 3341, 3344,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 3421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 3430, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3435, 3437, 0, 0, 0, 0, 0, 0, 3439, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 3442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 3444, 3446, 0, 3448, 3450, 3452, 0, 3454, 0, 3456, 3458,\n    3460, 3462, 0, 0, 0, 3485, 0, 3497, 0, 3514, 0, 0, 0, 0, 0, 3535,\n    0, 3549, 0, 0, 0, 3556, 0, 0, 0, 3574, 0, 0, 3591, 3596, 3598, 3603,\n    3605, 3607, 0, 0, 0, 3639, 0, 3651, 0, 3671, 0, 0, 0, 0, 0, 3725,\n    0, 3741, 0, 0, 0, 3749, 0, 0, 0, 3777, 3795, 3804, 3813, 3815, 3817, 0,\n    0, 0, 3822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 3828, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3831, 0, 0, 3837, 0, 3840, 3849, 3855, 3858, 0, 3870, 0, 0, 0, 3873, 0,\n    0, 0, 0, 3876, 0, 0, 0, 3888, 0, 0, 0, 3891, 0, 3894, 0, 0,\n    3897, 0, 0, 3903, 0, 3906, 3915, 3921, 3924, 0, 3936, 0, 0, 0, 3941, 0,\n    0, 0, 0, 3944, 0, 0, 0, 3956, 0, 0, 0, 3959, 0, 3962, 0, 0,\n    0, 0, 0, 0, 0, 0, 3965, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 3968, 3971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 3974, 3977, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 3980, 3983, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    4006, 4020, 4028, 4033, 4038, 4041, 4047, 0, 4050, 4053, 4059, 4064, 4072, 0, 4077, 0,\n    4080, 4083, 0, 4088, 4091, 0, 4097, 4100, 4105, 4108, 4119, 0, 0, 0, 0, 0,\n    0, 0, 4122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 4203, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 5137, 0, 5196, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 5262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 5286, 0, 0, 5291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 5294, 5297, 5300, 0, 0, 0, 0, 5303, 0, 0, 0,\n    0, 5306, 5309, 0, 0, 0, 0, 0, 5312, 0, 0, 5315, 0, 0, 0, 5318,\n    5321, 0, 0, 5324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 5327, 5330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5333,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 5336, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 5342, 5345, 0, 0, 0, 0, 5348, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5351, 0, 0, 0, 0,\n    0, 0, 5354, 0, 0, 0, 0, 0, 5357, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 5360, 5363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 5366, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 5375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 5378, 5384, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 5387, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5390,\n    0, 0, 0, 0, 0, 0, 5393, 0, 0, 0, 5402, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 5405, 5411, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 5414, 0, 0, 5423, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    5440, 0, 5443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5446, 0, 0, 0,\n    0, 5449, 0, 0, 0, 0, 5452, 0, 0, 0, 0, 5455, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 5458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    5467, 0, 5470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5473, 0, 0, 0,\n    0, 5476, 0, 0, 0, 0, 5479, 0, 0, 0, 0, 5482, 0, 0, 0, 0,\n    0, 0, 5485, 5491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 5497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 5795, 5798, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5801, 5804, 0, 0, 0, 0,\n    0, 0, 5807, 5810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    5813, 5819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 5825, 5828, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5831, 5834, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    5837, 5849, 5861, 5864, 5867, 5870, 5873, 5876, 5879, 5891, 5903, 5906, 5909, 5912, 5915, 5918,\n    5921, 5927, 0, 0, 0, 0, 0, 0, 5933, 5939, 0, 0, 0, 0, 0, 0,\n    5945, 5957, 5969, 5972, 5975, 5978, 5981, 5984, 5987, 5999, 6011, 6014, 6017, 6020, 6023, 6026,\n    6029, 6038, 0, 0, 0, 0, 0, 0, 6047, 6056, 0, 0, 0, 0, 0, 0,\n    6065, 6071, 0, 0, 0, 0, 0, 0, 6077, 6083, 0, 0, 0, 0, 0, 0,\n    6089, 6098, 0, 0, 0, 0, 0, 0, 0, 6107, 0, 0, 0, 0, 0, 0,\n    6116, 6128, 6140, 6143, 6146, 6149, 6152, 6155, 6158, 6170, 6182, 6185, 6188, 6191, 6194, 6197,\n    6200, 0, 0, 0, 6203, 0, 0, 0, 0, 0, 0, 0, 6206, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 6209, 0, 0, 0, 0, 0, 0, 0, 0, 6212,\n    0, 0, 0, 0, 0, 0, 6221, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 6224, 0, 0, 0, 0, 0, 0, 0, 6227, 0,\n    0, 0, 6236, 6238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    6275, 0, 6282, 0, 6287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    6290, 0, 6293, 0, 6296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 6299, 0, 0, 0, 0, 6302, 0, 0, 6305, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 6312, 0, 6315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6337, 0, 0, 0,\n    0, 0, 0, 6340, 0, 6343, 0, 0, 6346, 0, 0, 0, 0, 6349, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 6352, 0, 0, 6355, 6358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 6361, 6364, 0, 0, 6367, 6370, 0, 0, 6373, 6376, 6379, 6382, 0, 0,\n    0, 0, 6385, 6388, 0, 0, 6391, 6394, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 6397, 6400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 6403, 0, 0, 0, 0, 0, 6406, 6409, 0, 6412, 0, 0, 0, 0,\n    0, 0, 6415, 6418, 6421, 6424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 6446, 6448, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 6476, 0, 0, 0, 0, 6479, 0, 6482, 0, 6485,\n    0, 6488, 0, 6491, 0, 6494, 0, 6497, 0, 6500, 0, 6503, 0, 6506, 0, 6509,\n    0, 6512, 0, 0, 6515, 0, 6518, 0, 6521, 0, 0, 0, 0, 0, 0, 6524,\n    0, 0, 6530, 0, 0, 6536, 0, 0, 6542, 0, 0, 6548, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6561, 0, 0,\n    0, 0, 0, 0, 0, 0, 6604, 0, 0, 0, 0, 6640, 0, 6667, 0, 6711,\n    0, 6737, 0, 6746, 0, 6762, 0, 6778, 0, 6788, 0, 6793, 0, 6806, 0, 6811,\n    0, 6820, 0, 0, 6827, 0, 6832, 0, 6840, 0, 0, 0, 0, 0, 0, 6868,\n    0, 0, 6895, 0, 0, 6919, 0, 0, 6948, 0, 0, 6985, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7137,\n    7146, 7151, 7156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7165, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7272, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7274, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7290, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 7294, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7300, 0, 0, 0, 0, 0, 0, 7304, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7312, 0, 0, 0, 7316, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7324, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7336, 0, 0, 0, 0, 0, 7338, 0, 0, 0, 0, 7340, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7342, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7344,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7346, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7348, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7350, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7356, 0, 0, 0, 0, 7358, 0, 0, 0, 0, 0, 0, 0, 7360, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7364, 7366, 0, 0, 0, 7370, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7382, 0, 7384, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7386, 0, 0, 7388, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7390, 0, 7392, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7400, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7402, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7404, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7406, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7408, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7410, 0, 0, 0, 0,\n    0, 0, 0, 7412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7416, 0, 7418, 0, 0, 0, 0, 0, 0,\n    0, 0, 7420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7422, 0,\n    0, 0, 0, 0, 7424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7426, 0, 0, 0, 0, 7430, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7434, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7442,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 7450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 7466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7478,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7480, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7484, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7488, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7490, 0, 0, 0, 7492, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 7498, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7500, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7506, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7514, 0, 0, 0, 7516, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7518, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 7520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7522, 0, 0, 0, 0, 0, 0, 7524,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7543, 0, 0, 0, 7545, 0, 0, 0, 0, 0, 0, 0,\n    0, 7547, 0, 0, 7549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 7551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7555, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7567, 0, 0, 0, 0, 0, 0, 7569, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7579,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7581, 0, 7583, 7585, 0, 0, 0, 0, 0, 0, 0, 0, 7587, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7591, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7595, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 7618, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7620, 7622, 0, 0, 0, 0, 0,\n    0, 0, 7624, 7626, 0, 0, 0, 0, 0, 7628, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7630, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7646, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7650, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7652, 0, 0, 0, 7654, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7662, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7666, 0, 0, 0, 0, 0, 0, 0,\n    0, 7668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7670, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7674, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7676, 0, 0, 0, 0, 0, 0, 0, 7678, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7680, 0,\n    7682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7684, 0, 0, 0, 7686, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7692, 0,\n    0, 0, 0, 0, 7694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7700, 0, 0, 0, 0, 0, 7702,\n    0, 0, 0, 7704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7706, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7708, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7712, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7714, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7716, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7718, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7726,\n    0, 0, 0, 0, 0, 0, 7728, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7730, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7736, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 7753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7760, 0, 0, 0, 0, 0, 0, 0,\n    0, 7762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 7766, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7776, 0, 0, 0, 7778, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7782, 0,\n    0, 0, 0, 0, 0, 0, 7784, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7786, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7788, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 7790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7792, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 7801, 0, 0, 0, 7803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7805, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 7809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 7811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 7813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7821, 0, 7823, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7825, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7829, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7845, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7847, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7849, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7853, 0, 0, 7855, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 7857, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7859, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7861, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7863, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7865, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7867, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7869, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7871, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7873, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7875, 0, 0, 0, 0,\n    0, 7877, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7879, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7881,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7883, 7885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7887, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7889, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7891, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7895, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7897, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7899, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7901, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7903, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7905, 0,\n    7907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7911, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7915, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7931, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7937,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7941, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7943, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7949, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7955, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 7957, 0, 0, 7959, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7963, 0, 0, 0, 0, 0, 0,\n    0, 7965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7967, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7969, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 7975, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7989, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7991, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 7993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7995, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8003, 0, 8005,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 8009, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8019, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8021, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 8025, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 8029, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 8031, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    8033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8035, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 8037, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8045, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8047, 0, 0, 0,\n    0, 8049, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8051, 0, 8053, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8055, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8057, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8061, 0, 8063, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8065, 8067, 0, 0, 0, 0, 0, 0,\n    8069, 0, 0, 0, 0, 0, 8071, 0, 0, 0, 0, 0, 0, 8073, 8075, 0,\n    0, 0, 0, 0, 0, 8077, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8079,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8081, 8083, 8085,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8087, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8093, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8097, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    8099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 8103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 8105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8107, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    8111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    8113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8115, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    8117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8121, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8125, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8127, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 8129, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    8133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8137,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8139, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    8141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8143, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 8145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 8147, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 8149, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 8151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8155, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8159, 0, 0, 0, 0, 0, 0, 8161, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 8163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8167, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8169, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 8171, 0, 0, 0, 8173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8181, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8183,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8185, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8191, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8193, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8197, 0, 0, 0, 0, 8201, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8215,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 8221, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 8223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8225, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 8229, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8231,\n    0, 8233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8235, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 8237, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 8239, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8241, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8243, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8245, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8247, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8249, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8253, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8255,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8259, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 8263, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8265, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8267,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8271, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8277,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 8279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8281, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    8283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 8285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 8287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8291, 0, 0, 0, 0, 8293, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8295, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8301, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8303,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8305, 0, 0, 0, 0,\n    0, 0, 8307, 0, 0, 0, 8309, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8311, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8313, 0, 0, 0, 0, 0, 8315, 0,\n    0, 8317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 8319, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8321, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    8323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8325, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8331, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8341, 0, 0, 0, 0, 0, 8345, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 8347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8349, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8357,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8361, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8363, 0, 0, 0, 8365, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8367, 0, 0, 8369, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    8375, 0, 0, 0, 0, 0, 8379, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 8381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8383, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8389, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8391,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8395, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8397, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8401, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 8403, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 8405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8409, 0, 0, 8411,\n    0, 8413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 8415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8417, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 8419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8421, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8427, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8431, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8433, 0, 8435, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 8437, 0, 0, 8439, 0, 0, 0, 8441, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8443, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 8445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8449, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8453, 8455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8459, 8461, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8465, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8469, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8479, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8485,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8491, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8493, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8495, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8497, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8505,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8507, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8509, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 8517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8519, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8539,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 8541, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 8545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8547, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8549, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8553,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 8555, 0, 0, 0, 0, 0, 0, 0, 8557,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8567, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 8583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8589, 8591, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8593, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 8601, 0, 0, 0, 0, 0, 0,\n    0\n};\n\nstatic const uint16_t mapIdxToComposite[] =\n{\n    0, 0, 0, 0, 0, 0, 0, 0, 894, 0, 0, 0, 8814, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 8800, 0, 0, 0, 0, 8815, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192,\n    0, 0, 193, 0, 0, 194, 0, 0, 195, 0, 0, 256, 0, 0, 258, 0,\n    0, 550, 0, 0, 196, 0, 0, 7842, 0, 0, 197, 0, 0, 461, 0, 0,\n    512, 0, 0, 514, 0, 0, 7840, 0, 0, 7680, 0, 0, 260, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 7682, 0, 0, 7684, 0, 0, 7686, 0,\n    0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 264, 0, 0, 266, 0, 0,\n    268, 0, 0, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7690, 0, 0, 270, 0, 0, 7692,\n    0, 0, 7696, 0, 0, 7698, 0, 0, 7694, 0, 0, 0, 0, 200, 0, 0,\n    201, 0, 0, 202, 0, 0, 7868, 0, 0, 274, 0, 0, 276, 0, 0, 278,\n    0, 0, 203, 0, 0, 7866, 0, 0, 282, 0, 0, 516, 0, 0, 518, 0,\n    0, 7864, 0, 0, 552, 0, 0, 280, 0, 0, 7704, 0, 0, 7706, 0, 0,\n    0, 0, 0, 0, 0, 0, 7710, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 0, 0, 284, 0, 0, 7712,\n    0, 0, 286, 0, 0, 288, 0, 0, 486, 0, 0, 290, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, 0, 7714, 0, 0, 7718,\n    0, 0, 542, 0, 0, 7716, 0, 0, 7720, 0, 0, 7722, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 204, 0, 0, 205, 0, 0, 206, 0, 0, 296, 0, 0, 298,\n    0, 0, 300, 0, 0, 304, 0, 0, 207, 0, 0, 7880, 0, 0, 463, 0,\n    0, 520, 0, 0, 522, 0, 0, 7882, 0, 0, 302, 0, 0, 7724, 0, 0,\n    0, 0, 308, 0, 0, 8490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7728, 0, 0, 488, 0, 0, 7730, 0, 0, 310, 0, 0, 7732, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0,\n    0, 317, 0, 0, 7734, 0, 0, 315, 0, 0, 7740, 0, 0, 7738, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 7742, 0, 0, 7744, 0, 0, 7746, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 504, 0, 0, 323, 0, 0,\n    209, 0, 0, 7748, 0, 0, 327, 0, 0, 7750, 0, 0, 325, 0, 0, 7754,\n    0, 0, 7752, 0, 0, 0, 0, 210, 0, 0, 211, 0, 0, 212, 0, 0,\n    213, 0, 0, 332, 0, 0, 334, 0, 0, 558, 0, 0, 214, 0, 0, 7886,\n    0, 0, 336, 0, 0, 465, 0, 0, 524, 0, 0, 526, 0, 0, 416, 0,\n    0, 7884, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7764, 0, 0, 7766, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 340, 0, 0, 7768, 0, 0, 344, 0, 0,\n    528, 0, 0, 530, 0, 0, 7770, 0, 0, 342, 0, 0, 7774, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 346, 0, 0, 348, 0, 0, 7776, 0, 0,\n    352, 0, 0, 7778, 0, 0, 536, 0, 0, 350, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7786, 0, 0, 356, 0, 0, 7788,\n    0, 0, 538, 0, 0, 354, 0, 0, 7792, 0, 0, 7790, 0, 0, 0, 0,\n    217, 0, 0, 218, 0, 0, 219, 0, 0, 360, 0, 0, 362, 0, 0, 364,\n    0, 0, 220, 0, 0, 7910, 0, 0, 366, 0, 0, 368, 0, 0, 467, 0,\n    0, 532, 0, 0, 534, 0, 0, 431, 0, 0, 7908, 0, 0, 7794, 0, 0,\n    370, 0, 0, 7798, 0, 0, 7796, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7804, 0, 0, 7806, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 7808, 0, 0, 7810, 0, 0, 372, 0, 0, 7814,\n    0, 0, 7812, 0, 0, 7816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 7818, 0, 0, 7820, 0, 0, 0, 0, 7922, 0, 0, 221, 0, 0, 374,\n    0, 0, 7928, 0, 0, 562, 0, 0, 7822, 0, 0, 376, 0, 0, 7926, 0,\n    0, 7924, 0, 0, 0, 0, 377, 0, 0, 7824, 0, 0, 379, 0, 0, 381,\n    0, 0, 7826, 0, 0, 7828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 8175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 224, 0, 0, 225, 0, 0, 226, 0, 0, 227,\n    0, 0, 257, 0, 0, 259, 0, 0, 551, 0, 0, 228, 0, 0, 7843, 0,\n    0, 229, 0, 0, 462, 0, 0, 513, 0, 0, 515, 0, 0, 7841, 0, 0,\n    7681, 0, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 7683, 0, 0, 7685,\n    0, 0, 7687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 263, 0, 0, 265, 0, 0, 267, 0, 0, 269, 0, 0,\n    231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7691, 0, 0, 271,\n    0, 0, 7693, 0, 0, 7697, 0, 0, 7699, 0, 0, 7695, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, 0, 233, 0, 0,\n    234, 0, 0, 7869, 0, 0, 275, 0, 0, 277, 0, 0, 279, 0, 0, 235,\n    0, 0, 7867, 0, 0, 283, 0, 0, 517, 0, 0, 519, 0, 0, 7865, 0,\n    0, 553, 0, 0, 281, 0, 0, 7705, 0, 0, 7707, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 7711, 0, 0, 0, 0, 0, 0, 0, 0, 501, 0, 0, 285,\n    0, 0, 7713, 0, 0, 287, 0, 0, 289, 0, 0, 487, 0, 0, 291, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, 7715, 0, 0,\n    7719, 0, 0, 543, 0, 0, 7717, 0, 0, 7721, 0, 0, 7723, 0, 0, 7830,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 237, 0, 0, 238, 0, 0,\n    297, 0, 0, 299, 0, 0, 301, 0, 0, 239, 0, 0, 7881, 0, 0, 464,\n    0, 0, 521, 0, 0, 523, 0, 0, 7883, 0, 0, 303, 0, 0, 7725, 0,\n    0, 0, 0, 309, 0, 0, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 7729, 0, 0, 489, 0, 0, 7731, 0, 0, 311, 0, 0, 7733, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 314, 0, 0, 318,\n    0, 0, 7735, 0, 0, 316, 0, 0, 7741, 0, 0, 7739, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7743, 0, 0, 7745, 0,\n    0, 7747, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 505, 0, 0, 324, 0, 0, 241, 0, 0,\n    7749, 0, 0, 328, 0, 0, 7751, 0, 0, 326, 0, 0, 7755, 0, 0, 7753,\n    0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 243, 0, 0, 244, 0, 0,\n    245, 0, 0, 333, 0, 0, 335, 0, 0, 559, 0, 0, 246, 0, 0, 7887,\n    0, 0, 337, 0, 0, 466, 0, 0, 525, 0, 0, 527, 0, 0, 417, 0,\n    0, 7885, 0, 0, 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    7765, 0, 0, 7767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 341, 0, 0, 7769, 0,\n    0, 345, 0, 0, 529, 0, 0, 531, 0, 0, 7771, 0, 0, 343, 0, 0,\n    7775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 0, 0, 349, 0,\n    0, 7777, 0, 0, 353, 0, 0, 7779, 0, 0, 537, 0, 0, 351, 0, 0,\n    0, 0, 7787, 0, 0, 7831, 0, 0, 357, 0, 0, 7789, 0, 0, 539, 0,\n    0, 355, 0, 0, 7793, 0, 0, 7791, 0, 0, 0, 0, 249, 0, 0, 250,\n    0, 0, 251, 0, 0, 361, 0, 0, 363, 0, 0, 365, 0, 0, 252, 0,\n    0, 7911, 0, 0, 367, 0, 0, 369, 0, 0, 468, 0, 0, 533, 0, 0,\n    535, 0, 0, 432, 0, 0, 7909, 0, 0, 7795, 0, 0, 371, 0, 0, 7799,\n    0, 0, 7797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 7805, 0, 0, 7807, 0, 0, 0, 0, 7809, 0, 0, 7811, 0,\n    0, 373, 0, 0, 7815, 0, 0, 7813, 0, 0, 7832, 0, 0, 7817, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 7819, 0, 0, 7821, 0, 0, 0,\n    0, 7923, 0, 0, 253, 0, 0, 375, 0, 0, 7929, 0, 0, 563, 0, 0,\n    7823, 0, 0, 255, 0, 0, 7927, 0, 0, 7833, 0, 0, 7925, 0, 0, 0,\n    0, 378, 0, 0, 7825, 0, 0, 380, 0, 0, 382, 0, 0, 7827, 0, 0,\n    7829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 8173, 0, 0, 901, 0, 0, 8129, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 8189, 0, 903, 0, 7846, 0, 0, 7844, 0, 0,\n    7850, 0, 0, 7848, 0, 0, 478, 0, 0, 8491, 0, 506, 0, 0, 0, 0,\n    508, 0, 0, 482, 0, 0, 7688, 0, 0, 7872, 0, 0, 7870, 0, 0, 7876,\n    0, 0, 7874, 0, 0, 7726, 0, 0, 7890, 0, 0, 7888, 0, 0, 7894, 0,\n    0, 7892, 0, 0, 7756, 0, 0, 556, 0, 0, 7758, 0, 0, 554, 0, 0,\n    510, 0, 0, 475, 0, 0, 471, 0, 0, 469, 0, 0, 473, 0, 0, 7847,\n    0, 0, 7845, 0, 0, 7851, 0, 0, 7849, 0, 0, 479, 0, 0, 507, 0,\n    0, 509, 0, 0, 483, 0, 0, 7689, 0, 0, 7873, 0, 0, 7871, 0, 0,\n    7877, 0, 0, 7875, 0, 0, 7727, 0, 0, 0, 0, 7891, 0, 0, 7889, 0,\n    0, 7895, 0, 0, 7893, 0, 0, 7757, 0, 0, 557, 0, 0, 7759, 0, 0,\n    555, 0, 0, 511, 0, 0, 476, 0, 0, 472, 0, 0, 470, 0, 0, 474,\n    0, 0, 7856, 0, 0, 7854, 0, 0, 7860, 0, 0, 7858, 0, 0, 7857, 0,\n    0, 7855, 0, 0, 7861, 0, 0, 7859, 0, 0, 7700, 0, 0, 7702, 0, 0,\n    7701, 0, 0, 7703, 0, 0, 0, 0, 0, 0, 7760, 0, 0, 7762, 0, 0,\n    7761, 0, 0, 7763, 0, 0, 7780, 0, 0, 7781, 0, 0, 7782, 0, 0, 7783,\n    0, 0, 7800, 0, 0, 7801, 0, 0, 7802, 0, 0, 7803, 0, 0, 0, 0,\n    0, 7835, 0, 0, 0, 0, 0, 0, 7900, 0, 0, 7898, 0, 0, 7904, 0,\n    0, 7902, 0, 0, 7906, 0, 0, 7901, 0, 0, 7899, 0, 0, 7905, 0, 0,\n    7903, 0, 0, 7907, 0, 0, 0, 0, 7914, 0, 0, 7912, 0, 0, 7918, 0,\n    0, 7916, 0, 0, 7920, 0, 0, 7915, 0, 0, 7913, 0, 0, 7919, 0, 0,\n    7917, 0, 0, 7921, 0, 0, 494, 0, 0, 492, 0, 0, 493, 0, 0, 0,\n    0, 480, 0, 0, 481, 0, 0, 7708, 0, 0, 7709, 0, 0, 560, 0, 0,\n    561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 495, 0, 0,\n    0, 0, 0, 0, 0, 0, 884, 0, 0, 0, 0, 832, 0, 833, 0, 836,\n    0, 0, 835, 0, 8174, 0, 8123, 0, 8137, 0, 8139, 0, 8155, 0, 8185, 0,\n    8171, 0, 8187, 0, 8147, 0, 8122, 0, 0, 902, 0, 0, 8121, 0, 0, 8120,\n    0, 0, 7944, 0, 0, 7945, 0, 0, 8124, 0, 0, 0, 0, 8136, 0, 0,\n    904, 0, 0, 7960, 0, 0, 7961, 0, 0, 8138, 0, 0, 905, 0, 0, 7976,\n    0, 0, 7977, 0, 0, 8140, 0, 0, 0, 0, 8154, 0, 0, 906, 0, 0,\n    8153, 0, 0, 8152, 0, 0, 938, 0, 0, 7992, 0, 0, 7993, 0, 0, 8184,\n    0, 0, 908, 0, 0, 8008, 0, 0, 8009, 0, 0, 0, 0, 8172, 0, 0,\n    0, 0, 0, 0, 8170, 0, 0, 910, 0, 0, 8169, 0, 0, 8168, 0, 0,\n    939, 0, 0, 8025, 0, 0, 8486, 0, 8186, 0, 0, 911, 0, 0, 8040, 0,\n    0, 8041, 0, 0, 8188, 0, 0, 8049, 0, 8116, 0, 0, 8051, 0, 8053, 0,\n    8132, 0, 0, 8055, 0, 8163, 0, 8048, 0, 0, 940, 0, 0, 8113, 0, 0,\n    8112, 0, 0, 7936, 0, 0, 7937, 0, 0, 8118, 0, 0, 8115, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 8050, 0, 0, 941, 0, 0, 7952, 0, 0,\n    7953, 0, 0, 8052, 0, 0, 942, 0, 0, 7968, 0, 0, 7969, 0, 0, 8134,\n    0, 0, 8131, 0, 0, 0, 0, 8126, 0, 8054, 0, 0, 943, 0, 0, 8145,\n    0, 0, 8144, 0, 0, 970, 0, 0, 7984, 0, 0, 7985, 0, 0, 8150, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8056, 0, 0,\n    972, 0, 0, 8000, 0, 0, 8001, 0, 0, 0, 0, 0, 0, 8164, 0, 0,\n    8165, 0, 0, 0, 0, 8058, 0, 0, 973, 0, 0, 8161, 0, 0, 8160, 0,\n    0, 971, 0, 0, 8016, 0, 0, 8017, 0, 0, 8166, 0, 0, 0, 0, 0,\n    0, 8060, 0, 0, 974, 0, 0, 8032, 0, 0, 8033, 0, 0, 8182, 0, 0,\n    8179, 0, 0, 8146, 0, 0, 912, 0, 0, 8151, 0, 0, 8162, 0, 0, 944,\n    0, 0, 8167, 0, 0, 8057, 0, 8059, 0, 8061, 0, 8180, 0, 0, 979, 0,\n    0, 980, 0, 0, 1031, 0, 0, 1232, 0, 0, 1234, 0, 0, 1027, 0, 0,\n    1024, 0, 0, 1238, 0, 0, 1025, 0, 0, 1217, 0, 0, 1244, 0, 0, 1246,\n    0, 0, 1037, 0, 0, 1250, 0, 0, 1049, 0, 0, 1252, 0, 0, 1036, 0,\n    0, 1254, 0, 0, 1262, 0, 0, 1038, 0, 0, 1264, 0, 0, 1266, 0, 0,\n    1268, 0, 0, 1272, 0, 0, 1260, 0, 0, 1233, 0, 0, 1235, 0, 0, 1107,\n    0, 0, 1104, 0, 0, 1239, 0, 0, 1105, 0, 0, 1218, 0, 0, 1245, 0,\n    0, 1247, 0, 0, 1117, 0, 0, 1251, 0, 0, 1081, 0, 0, 1253, 0, 0,\n    1116, 0, 0, 0, 0, 1255, 0, 0, 1263, 0, 0, 1118, 0, 0, 1265, 0,\n    0, 1267, 0, 0, 1269, 0, 0, 1273, 0, 0, 1261, 0, 0, 1111, 0, 0,\n    1142, 0, 0, 1143, 0, 0, 1242, 0, 0, 1243, 0, 0, 1258, 0, 0, 1259,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 64302, 0, 0, 64303, 0, 0, 64304, 0, 0, 0,\n    0, 0, 0, 0, 64305, 0, 0, 64332, 0, 0, 0, 0, 64306, 0, 0, 0,\n    0, 64307, 0, 0, 0, 0, 64308, 0, 0, 64331, 0, 0, 64309, 0, 0, 64310,\n    0, 0, 64312, 0, 0, 64285, 0, 0, 64313, 0, 0, 64314, 0, 0, 0, 0,\n    64315, 0, 0, 64333, 0, 0, 0, 0, 64316, 0, 0, 0, 0, 64318, 0, 0,\n    64320, 0, 0, 64321, 0, 0, 0, 0, 64323, 0, 0, 64324, 0, 0, 64334, 0,\n    0, 64326, 0, 0, 64327, 0, 0, 0, 0, 64328, 0, 0, 64329, 0, 0, 64298,\n    0, 0, 64299, 0, 0, 0, 0, 64330, 0, 0, 64287, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1570, 0, 0, 1571, 0,\n    0, 1573, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 1572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1574, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1730, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 1747, 0, 0, 0, 0, 1728, 0, 0, 2392, 0,\n    0, 2393, 0, 0, 2394, 0, 0, 2395, 0, 0, 2396, 0, 0, 2397, 0, 0,\n    2345, 0, 0, 2398, 0, 0, 2399, 0, 0, 2353, 0, 0, 2356, 0, 0, 2524,\n    0, 0, 2525, 0, 0, 2527, 0, 0, 2507, 0, 0, 2508, 0, 0, 2649, 0,\n    0, 2650, 0, 0, 2651, 0, 0, 2654, 0, 0, 2611, 0, 0, 2614, 0, 0,\n    2908, 0, 0, 2909, 0, 0, 2891, 0, 0, 2888, 0, 0, 2892, 0, 0, 2964,\n    0, 0, 3018, 0, 0, 3020, 0, 0, 3019, 0, 0, 3144, 0, 0, 3264, 0,\n    0, 3274, 0, 0, 3271, 0, 0, 3272, 0, 0, 3275, 0, 0, 3402, 0, 0,\n    3404, 0, 0, 3403, 0, 0, 3546, 0, 0, 3548, 0, 0, 3550, 0, 0, 3549,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    3945, 0, 0, 3907, 0, 0, 3917, 0, 0, 3922, 0, 0, 3927, 0, 0, 3932,\n    0, 0, 3955, 0, 0, 3957, 0, 0, 3969, 0, 0, 4025, 0, 0, 3987, 0,\n    0, 3997, 0, 0, 4002, 0, 0, 4007, 0, 0, 4012, 0, 0, 3958, 0, 0,\n    0, 0, 0, 3960, 0, 0, 0, 0, 0, 4134, 0, 0, 0, 0, 0, 0,\n    0, 0, 6918, 0, 0, 6920, 0, 0, 6922, 0, 0, 6924, 0, 0, 6926, 0,\n    0, 6930, 0, 0, 6971, 0, 0, 6973, 0, 0, 6976, 0, 0, 6977, 0, 0,\n    6979, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 7736, 0, 0, 7737, 0, 0, 7772, 0, 0, 7773, 0, 0, 7784,\n    0, 0, 7785, 0, 0, 7852, 0, 0, 7862, 0, 0, 7853, 0, 0, 7863, 0,\n    0, 7878, 0, 0, 7879, 0, 0, 7896, 0, 0, 7897, 0, 0, 7938, 0, 0,\n    7940, 0, 0, 7942, 0, 0, 8064, 0, 0, 7939, 0, 0, 7941, 0, 0, 7943,\n    0, 0, 8065, 0, 0, 8066, 0, 0, 8067, 0, 0, 8068, 0, 0, 8069, 0,\n    0, 8070, 0, 0, 8071, 0, 0, 7946, 0, 0, 7948, 0, 0, 7950, 0, 0,\n    8072, 0, 0, 7947, 0, 0, 7949, 0, 0, 7951, 0, 0, 8073, 0, 0, 8074,\n    0, 0, 8075, 0, 0, 8076, 0, 0, 8077, 0, 0, 8078, 0, 0, 8079, 0,\n    0, 7954, 0, 0, 7956, 0, 0, 7955, 0, 0, 7957, 0, 0, 7962, 0, 0,\n    7964, 0, 0, 7963, 0, 0, 7965, 0, 0, 7970, 0, 0, 7972, 0, 0, 7974,\n    0, 0, 8080, 0, 0, 7971, 0, 0, 7973, 0, 0, 7975, 0, 0, 8081, 0,\n    0, 8082, 0, 0, 8083, 0, 0, 8084, 0, 0, 8085, 0, 0, 8086, 0, 0,\n    8087, 0, 0, 7978, 0, 0, 7980, 0, 0, 7982, 0, 0, 8088, 0, 0, 7979,\n    0, 0, 7981, 0, 0, 7983, 0, 0, 8089, 0, 0, 8090, 0, 0, 8091, 0,\n    0, 8092, 0, 0, 8093, 0, 0, 8094, 0, 0, 8095, 0, 0, 7986, 0, 0,\n    7988, 0, 0, 7990, 0, 0, 7987, 0, 0, 7989, 0, 0, 7991, 0, 0, 7994,\n    0, 0, 7996, 0, 0, 7998, 0, 0, 7995, 0, 0, 7997, 0, 0, 7999, 0,\n    0, 8002, 0, 0, 8004, 0, 0, 8003, 0, 0, 8005, 0, 0, 8010, 0, 0,\n    8012, 0, 0, 8011, 0, 0, 8013, 0, 0, 8018, 0, 0, 8020, 0, 0, 8022,\n    0, 0, 8019, 0, 0, 8021, 0, 0, 8023, 0, 0, 8027, 0, 0, 8029, 0,\n    0, 8031, 0, 0, 8034, 0, 0, 8036, 0, 0, 8038, 0, 0, 8096, 0, 0,\n    8035, 0, 0, 8037, 0, 0, 8039, 0, 0, 8097, 0, 0, 8098, 0, 0, 8099,\n    0, 0, 8100, 0, 0, 8101, 0, 0, 8102, 0, 0, 8103, 0, 0, 8042, 0,\n    0, 8044, 0, 0, 8046, 0, 0, 8104, 0, 0, 8043, 0, 0, 8045, 0, 0,\n    8047, 0, 0, 8105, 0, 0, 8106, 0, 0, 8107, 0, 0, 8108, 0, 0, 8109,\n    0, 0, 8110, 0, 0, 8111, 0, 0, 8114, 0, 0, 8130, 0, 0, 8178, 0,\n    0, 8119, 0, 0, 8141, 0, 0, 8142, 0, 0, 8143, 0, 0, 8135, 0, 0,\n    8183, 0, 0, 8157, 0, 0, 8158, 0, 0, 8159, 0, 0, 8192, 0, 8193, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 8602, 0, 0, 0, 0, 0, 0, 8603, 0, 0, 0, 0, 8622,\n    0, 0, 8653, 0, 0, 8655, 0, 0, 8654, 0, 0, 8708, 0, 0, 8713, 0,\n    0, 8716, 0, 0, 0, 0, 0, 0, 8740, 0, 0, 8742, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 8769, 0, 0, 8772, 0, 0, 8775, 0, 0, 8777, 0, 0, 8813, 0, 0,\n    8802, 0, 0, 8816, 0, 0, 8817, 0, 0, 8820, 0, 0, 8821, 0, 0, 8824,\n    0, 0, 8825, 0, 0, 8832, 0, 0, 8833, 0, 0, 8928, 0, 0, 8929, 0,\n    0, 8836, 0, 0, 8837, 0, 0, 8840, 0, 0, 8841, 0, 0, 8930, 0, 0,\n    8931, 0, 0, 8876, 0, 0, 8877, 0, 0, 8878, 0, 0, 8879, 0, 0, 8938,\n    0, 0, 8939, 0, 0, 8940, 0, 0, 8941, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 10972, 0, 0, 0, 0, 0, 0, 0, 0, 9001, 0,\n    9002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12436, 0, 0, 12364,\n    0, 0, 12366, 0, 0, 12368, 0, 0, 12370, 0, 0, 12372, 0, 0, 12374, 0,\n    0, 12376, 0, 0, 12378, 0, 0, 12380, 0, 0, 12382, 0, 0, 12384, 0, 0,\n    12386, 0, 0, 12389, 0, 0, 12391, 0, 0, 12393, 0, 0, 12400, 0, 0, 12401,\n    0, 0, 12403, 0, 0, 12404, 0, 0, 12406, 0, 0, 12407, 0, 0, 12409, 0,\n    0, 12410, 0, 0, 12412, 0, 0, 12413, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 12446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12532, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    12460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12462, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 12464, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 12466, 0, 0, 0, 0, 0, 0, 0, 0, 12468, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12470, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12472, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 12474, 0, 0, 0, 0, 12476, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 12478, 0, 0, 0, 0, 12480, 0, 0, 0, 0,\n    0, 0, 0, 0, 12482, 0, 0, 0, 0, 0, 0, 12485, 0, 0, 0, 0,\n    12487, 0, 0, 0, 0, 0, 0, 0, 12489, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 12496, 0, 0, 12497, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12499,\n    0, 0, 12500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 12502, 0, 0, 12503, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 12505, 0, 0, 12506, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 12508, 0, 0, 12509, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 12535, 0, 0, 0, 0, 0, 0, 0, 0, 12536, 0, 0, 0, 0, 12537,\n    0, 0, 0, 0, 12538, 0, 0, 0, 0, 0, 0, 0, 0, 12542, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 64210, 0, 64211, 0, 64212, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63847, 0, 0, 0, 64112, 0,\n    0, 0, 0, 0, 63749, 0, 0, 0, 63838, 0, 0, 0, 0, 0, 0, 0,\n    63771, 0, 0, 0, 63930, 0, 0, 0, 0, 0, 0, 0, 63863, 0, 0, 0,\n    63997, 0, 63912, 0, 0, 0, 0, 0, 64115, 0, 63789, 0, 63925, 0, 64048, 0,\n    63845, 0, 63956, 0, 63931, 0, 64049, 0, 0, 0, 0, 0, 64012, 0, 64116, 0,\n    64050, 0, 0, 0, 64114, 0, 63864, 0, 0, 0, 63953, 0, 64117, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 64113, 0, 63790, 0, 63865, 0, 63829, 0, 63828, 0,\n    64021, 0, 0, 0, 0, 0, 0, 0, 64000, 0, 63900, 0, 63965, 0, 63999, 0,\n    63943, 0, 63882, 0, 63901, 0, 0, 0, 64118, 0, 64051, 0, 63826, 0, 63791, 0,\n    64052, 0, 63871, 0, 0, 0, 64119, 0, 0, 0, 63843, 0, 0, 0, 0, 0,\n    0, 0, 63979, 0, 0, 0, 0, 0, 0, 0, 64053, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 63772, 0, 0, 0, 0, 0, 63851, 0, 0, 0, 0, 0,\n    63750, 0, 0, 0, 0, 0, 63966, 0, 63981, 0, 63872, 0, 63902, 0, 64121, 0,\n    63755, 0, 64122, 0, 64054, 0, 64013, 0, 64123, 0, 64055, 0, 64056, 0, 0, 0,\n    0, 0, 63913, 0, 0, 0, 0, 0, 64057, 0, 64124, 0, 63852, 0, 64058, 0,\n    64125, 0, 63818, 0, 63810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 64126, 0, 63756, 0, 63753, 0, 64127, 0, 63873,\n    0, 64128, 0, 64129, 0, 0, 0, 0, 0, 0, 0, 64004, 0, 0, 0, 63914,\n    0, 63932, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63933, 0, 63819, 0, 64059,\n    0, 63967, 0, 64060, 0, 0, 0, 63957, 0, 63777, 0, 63915, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63886, 0, 0, 0,\n    0, 0, 64001, 0, 63906, 0, 63784, 0, 64130, 0, 64011, 0, 64131, 0, 63874, 0,\n    0, 0, 0, 0, 63811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64132, 0,\n    0, 0, 63960, 0, 63846, 0, 64133, 0, 0, 0, 63907, 0, 63840, 0, 63916, 0,\n    64061, 0, 64134, 0, 63929, 0, 64136, 0, 63961, 0, 64135, 0, 64138, 0, 64062, 0,\n    64063, 0, 63887, 0, 64139, 0, 63757, 0, 63888, 0, 0, 0, 63954, 0, 64140, 0,\n    0, 0, 0, 0, 63781, 0, 63835, 0, 64002, 0, 63859, 0, 63908, 0, 63861, 0,\n    64141, 0, 64142, 0, 64143, 0, 63889, 0, 63792, 0, 0, 0, 0, 0, 64065, 0,\n    64144, 0, 63849, 0, 0, 0, 0, 0, 63934, 0, 0, 0, 0, 0, 63875, 0,\n    0, 0, 64066, 0, 0, 0, 0, 0, 0, 63968, 0, 0, 0, 0, 64018, 0,\n    63941, 0, 64067, 0, 64006, 0, 63883, 0, 0, 0, 63745, 0, 0, 0, 0, 0,\n    64146, 0, 64147, 0, 0, 0, 63969, 0, 64148, 0, 63944, 0, 63988, 0, 63945, 0,\n    63962, 0, 0, 0, 0, 0, 0, 0, 0, 63866, 0, 64068, 0, 63970, 0, 63764,\n    0, 63820, 0, 63793, 0, 63773, 0, 0, 0, 0, 0, 0, 0, 63884, 0, 64149,\n    0, 63909, 0, 0, 0, 64150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 63858, 0, 63848, 0, 63971, 0, 0, 0, 63765, 0, 64005,\n    0, 64151, 0, 63786, 0, 64069, 0, 63989, 0, 63821, 0, 63958, 0, 64070, 0, 63947,\n    0, 63980, 0, 64153, 0, 63748, 0, 64152, 0, 63822, 0, 64071, 0, 63890, 0, 63778,\n    0, 63876, 0, 64155, 0, 0, 0, 63995, 0, 63903, 0, 63766, 0, 63891, 0, 64072,\n    0, 63936, 0, 63982, 0, 63794, 0, 63774, 0, 0, 0, 64073, 0, 64158, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63814, 0, 0, 0, 0,\n    0, 64159, 0, 63994, 0, 63787, 0, 64022, 0, 63911, 0, 0, 0, 63963, 0, 0,\n    0, 63917, 0, 63767, 0, 63972, 0, 63948, 0, 64074, 0, 63918, 0, 64161, 0, 63892,\n    0, 63983, 0, 0, 0, 0, 0, 64162, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 64163, 0, 63949, 0, 63862, 0, 63842, 0, 0, 0, 0,\n    0, 63973, 0, 64164, 0, 64165, 0, 63937, 0, 63758, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 64166, 0, 64167, 0, 0, 0, 63795, 0, 0, 0, 64168, 0, 63853,\n    0, 64170, 0, 64169, 0, 64157, 0, 0, 0, 0, 0, 0, 0, 63950, 0, 63803,\n    0, 64075, 0, 63815, 0, 64171, 0, 63844, 0, 63877, 0, 0, 0, 64024, 0, 64076,\n    0, 64078, 0, 64077, 0, 64079, 0, 64080, 0, 64081, 0, 64025, 0, 64026, 0, 63804,\n    0, 64082, 0, 64083, 0, 64027, 0, 63926, 0, 0, 0, 0, 0, 63893, 0, 0,\n    0, 63830, 0, 64084, 0, 0, 0, 64085, 0, 64172, 0, 63991, 0, 0, 0, 63992,\n    0, 64086, 0, 63910, 0, 63812, 0, 0, 0, 64174, 0, 63993, 0, 64029, 0, 64003,\n    0, 63867, 0, 0, 0, 63951, 0, 63850, 0, 63823, 0, 64175, 0, 63805, 0, 63831,\n    0, 64087, 0, 64088, 0, 63824, 0, 64089, 0, 0, 0, 64177, 0, 0, 0, 64090,\n    0, 63974, 0, 63759, 0, 0, 0, 63919, 0, 64030, 0, 63796, 0, 64178, 0, 0,\n    0, 0, 0, 0, 0, 63920, 0, 63895, 0, 63813, 0, 0, 0, 0, 0, 63827,\n    0, 63782, 0, 0, 0, 63990, 0, 0, 0, 64092, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 63868, 0, 0, 0, 0, 0, 64093, 0, 63860,\n    0, 63998, 0, 64179, 0, 63806, 0, 64180, 0, 63832, 0, 63768, 0, 63854, 0, 64095,\n    0, 63897, 0, 63938, 0, 63779, 0, 63984, 0, 63797, 0, 64032, 0, 63775, 0, 63760,\n    0, 0, 0, 63798, 0, 0, 0, 64181, 0, 63761, 0, 63783, 0, 0, 0, 64008,\n    0, 0, 0, 63904, 0, 63975, 0, 63976, 0, 63762, 0, 64096, 0, 64182, 0, 63780,\n    0, 0, 0, 64183, 0, 64010, 0, 64097, 0, 0, 0, 0, 0, 63905, 0, 64185,\n    0, 64187, 0, 63869, 0, 63809, 0, 64190, 0, 64034, 0, 64189, 0, 64188, 0, 64099,\n    0, 63996, 0, 63834, 0, 64192, 0, 0, 0, 0, 0, 63744, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 63816, 0, 0, 0, 63747, 0, 64100, 0, 64101, 0, 0,\n    0, 0, 0, 0, 0, 63799, 0, 0, 0, 63746, 0, 63896, 0, 63959, 0, 64194,\n    0, 64007, 0, 63885, 0, 0, 0, 63857, 0, 0, 0, 64102, 0, 63898, 0, 64037,\n    0, 0, 0, 64195, 0, 63939, 0, 63763, 0, 0, 0, 63788, 0, 64038, 0, 0,\n    0, 63769, 0, 64196, 0, 63927, 0, 0, 0, 63977, 0, 63870, 0, 63754, 0, 63921,\n    0, 64197, 0, 63807, 0, 63899, 0, 0, 0, 0, 0, 63878, 0, 0, 0, 63942,\n    0, 63825, 0, 64009, 0, 63833, 0, 63955, 0, 64198, 0, 63964, 0, 63985, 0, 0,\n    0, 63928, 0, 0, 0, 63978, 0, 64199, 0, 0, 0, 63922, 0, 63817, 0, 63800,\n    0, 63923, 0, 0, 0, 64028, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64201,\n    0, 0, 0, 0, 0, 64202, 0, 0, 0, 0, 0, 64203, 0, 63924, 0, 64204,\n    0, 63952, 0, 0, 0, 0, 0, 0, 0, 64042, 0, 64043, 0, 64044, 0, 0,\n    0, 0, 0, 0, 0, 63770, 0, 63879, 0, 0, 0, 0, 0, 0, 0, 64205,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63801, 0, 63986, 0, 0,\n    0, 64045, 0, 63802, 0, 63776, 0, 0, 0, 63808, 0, 63880, 0, 63987, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 63881, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 64216, 0, 0, 0, 0, 0, 63940, 0, 64217,\n    0, 63752, 0, 0, 0, 0, 0, 0, 0, 64300, 0, 0, 64301, 0, 0, 64208,\n    0, 64207, 0, 64209, 0, 64213, 0, 64214, 0, 64215, 0, 0, 0, 0, 0, 0,\n    0\n};\n\nstatic const uint8_t combiningClass[] =\n{\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230,\n    230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, 220, 220, 220, 220,\n    220, 202, 202, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 220, 220, 220,\n    220, 220, 220, 220, 1, 1, 1, 1, 1, 220, 220, 220, 220, 230, 230, 230,\n    230, 230, 230, 230, 230, 240, 230, 220, 220, 220, 230, 230, 230, 220, 220, 0,\n    230, 230, 230, 220, 220, 220, 220, 230, 232, 220, 220, 230, 233, 234, 234, 233,\n    0, 0, 0, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 220, 230, 230, 230, 230, 220, 230, 230, 230, 222, 220, 230, 230, 230, 230,\n    230, 230, 220, 220, 220, 220, 220, 220, 230, 230, 220, 230, 230, 222, 228, 230,\n    10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23,\n    0, 24, 25, 0, 230, 220, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    230, 230, 230, 230, 230, 230, 230, 230, 30, 31, 32, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31,\n    32, 33, 34, 230, 230, 220, 220, 230, 230, 230, 230, 230, 220, 230, 230, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230,\n    230, 230, 230, 220, 230, 0, 0, 230, 230, 0, 220, 230, 230, 220, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, 220, 230, 220, 230,\n    230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,\n    0, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,\n    0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 9, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 220, 0, 220, 0, 216, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 129, 130, 0, 132, 0, 0, 0, 0, 0, 130, 130, 130, 130, 0, 0,\n    130, 0, 230, 230, 9, 0, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 9, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230,\n    0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 230, 220, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 230, 220, 0, 0, 0, 0, 0, 0, 0,\n    230, 230, 220, 230, 230, 230, 230, 230, 230, 230, 220, 230, 230, 234, 214, 220,\n    230, 230, 1, 1, 230, 230, 230, 230, 1, 1, 1, 230, 230, 0, 0, 0,\n    0, 230, 0, 0, 0, 1, 1, 230, 220, 230, 1, 1, 220, 220, 220, 220,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 228, 232, 222, 224, 224,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0,\n    230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/number-formatter.h",
    "content": "#ifndef _MONO_METADATA_NUMBER_FORMATTER_H_\n#define _MONO_METADATA_NUMBER_FORMATTER_H_ 1\n\n#include <stdint.h>\n\nstatic const uint64_t Formatter_MantissaBitsTable[] =\n{\n    4556951262222748432ULL, 9113902524445496865ULL, 1822780504889099373ULL,\n    3645561009778198746ULL, 7291122019556397492ULL, 14582244039112794984ULL,\n    2916448807822558996ULL, 5832897615645117993ULL, 11665795231290235987ULL,\n    2333159046258047197ULL, 4666318092516094394ULL, 9332636185032188789ULL,\n    1866527237006437757ULL, 3733054474012875515ULL, 7466108948025751031ULL,\n    14932217896051502063ULL, 2986443579210300412ULL, 5972887158420600825ULL,\n    11945774316841201651ULL, 2389154863368240330ULL, 4778309726736480660ULL,\n    9556619453472961320ULL, 1911323890694592264ULL, 3822647781389184528ULL,\n    7645295562778369056ULL, 15290591125556738113ULL, 3058118225111347622ULL,\n    6116236450222695245ULL, 12232472900445390490ULL, 2446494580089078098ULL,\n    4892989160178156196ULL, 9785978320356312392ULL, 1957195664071262478ULL,\n    3914391328142524957ULL, 7828782656285049914ULL, 15657565312570099828ULL,\n    3131513062514019965ULL, 6263026125028039931ULL, 12526052250056079862ULL,\n    2505210450011215972ULL, 5010420900022431944ULL, 10020841800044863889ULL,\n    2004168360008972777ULL, 4008336720017945555ULL, 8016673440035891111ULL,\n    16033346880071782223ULL, 3206669376014356444ULL, 6413338752028712889ULL,\n    12826677504057425779ULL, 2565335500811485155ULL, 5130671001622970311ULL,\n    10261342003245940623ULL, 2052268400649188124ULL, 4104536801298376249ULL,\n    8209073602596752498ULL, 16418147205193504997ULL, 3283629441038700999ULL,\n    6567258882077401998ULL, 13134517764154803997ULL, 2626903552830960799ULL,\n    5253807105661921599ULL, 10507614211323843198ULL, 2101522842264768639ULL,\n    4203045684529537279ULL, 8406091369059074558ULL, 16812182738118149117ULL,\n    3362436547623629823ULL, 6724873095247259646ULL, 13449746190494519293ULL,\n    2689949238098903858ULL, 5379898476197807717ULL, 10759796952395615435ULL,\n    2151959390479123087ULL, 4303918780958246174ULL, 8607837561916492348ULL,\n    17215675123832984696ULL, 3443135024766596939ULL, 6886270049533193878ULL,\n    13772540099066387756ULL, 2754508019813277551ULL, 5509016039626555102ULL,\n    11018032079253110205ULL, 2203606415850622041ULL, 4407212831701244082ULL,\n    8814425663402488164ULL, 17628851326804976328ULL, 3525770265360995265ULL,\n    7051540530721990531ULL, 14103081061443981063ULL, 2820616212288796212ULL,\n    5641232424577592425ULL, 11282464849155184850ULL, 2256492969831036970ULL,\n    4512985939662073940ULL, 9025971879324147880ULL, 18051943758648295760ULL,\n    3610388751729659152ULL, 7220777503459318304ULL, 14441555006918636608ULL,\n    2888311001383727321ULL, 5776622002767454643ULL, 11553244005534909286ULL,\n    2310648801106981857ULL, 4621297602213963714ULL, 9242595204427927429ULL,\n    1848519040885585485ULL, 3697038081771170971ULL, 7394076163542341943ULL,\n    14788152327084683887ULL, 2957630465416936777ULL, 5915260930833873554ULL,\n    11830521861667747109ULL, 2366104372333549421ULL, 4732208744667098843ULL,\n    9464417489334197687ULL, 1892883497866839537ULL, 3785766995733679075ULL,\n    7571533991467358150ULL, 15143067982934716300ULL, 3028613596586943260ULL,\n    6057227193173886520ULL, 12114454386347773040ULL, 2422890877269554608ULL,\n    4845781754539109216ULL, 9691563509078218432ULL, 1938312701815643686ULL,\n    3876625403631287372ULL, 7753250807262574745ULL, 15506501614525149491ULL,\n    3101300322905029898ULL, 6202600645810059796ULL, 12405201291620119593ULL,\n    2481040258324023918ULL, 4962080516648047837ULL, 9924161033296095674ULL,\n    1984832206659219134ULL, 3969664413318438269ULL, 7939328826636876539ULL,\n    15878657653273753079ULL, 3175731530654750615ULL, 6351463061309501231ULL,\n    12702926122619002463ULL, 2540585224523800492ULL, 5081170449047600985ULL,\n    10162340898095201970ULL, 2032468179619040394ULL, 4064936359238080788ULL,\n    8129872718476161576ULL, 16259745436952323153ULL, 3251949087390464630ULL,\n    6503898174780929261ULL, 13007796349561858522ULL, 2601559269912371704ULL,\n    5203118539824743409ULL, 10406237079649486818ULL, 2081247415929897363ULL,\n    4162494831859794727ULL, 8324989663719589454ULL, 16649979327439178909ULL,\n    3329995865487835781ULL, 6659991730975671563ULL, 13319983461951343127ULL,\n    2663996692390268625ULL, 5327993384780537250ULL, 10655986769561074501ULL,\n    2131197353912214900ULL, 4262394707824429800ULL, 8524789415648859601ULL,\n    17049578831297719202ULL, 3409915766259543840ULL, 6819831532519087681ULL,\n    13639663065038175362ULL, 2727932613007635072ULL, 5455865226015270144ULL,\n    10911730452030540289ULL, 2182346090406108057ULL, 4364692180812216115ULL,\n    8729384361624432231ULL, 17458768723248864463ULL, 3491753744649772892ULL,\n    6983507489299545785ULL, 13967014978599091570ULL, 2793402995719818314ULL,\n    5586805991439636628ULL, 11173611982879273256ULL, 2234722396575854651ULL,\n    4469444793151709302ULL, 8938889586303418605ULL, 17877779172606837210ULL,\n    3575555834521367442ULL, 7151111669042734884ULL, 14302223338085469768ULL,\n    2860444667617093953ULL, 5720889335234187907ULL, 11441778670468375814ULL,\n    2288355734093675162ULL, 4576711468187350325ULL, 9153422936374700651ULL,\n    1830684587274940130ULL, 3661369174549880260ULL, 7322738349099760521ULL,\n    14645476698199521043ULL, 2929095339639904208ULL, 5858190679279808417ULL,\n    11716381358559616834ULL, 2343276271711923366ULL, 4686552543423846733ULL,\n    9373105086847693467ULL, 1874621017369538693ULL, 3749242034739077387ULL,\n    7498484069478154774ULL, 14996968138956309548ULL, 2999393627791261909ULL,\n    5998787255582523819ULL, 11997574511165047638ULL, 2399514902233009527ULL,\n    4799029804466019055ULL, 9598059608932038110ULL, 1919611921786407622ULL,\n    3839223843572815244ULL, 7678447687145630488ULL, 15356895374291260977ULL,\n    3071379074858252195ULL, 6142758149716504390ULL, 12285516299433008781ULL,\n    2457103259886601756ULL, 4914206519773203512ULL, 9828413039546407025ULL,\n    1965682607909281405ULL, 3931365215818562810ULL, 7862730431637125620ULL,\n    15725460863274251240ULL, 3145092172654850248ULL, 6290184345309700496ULL,\n    12580368690619400992ULL, 2516073738123880198ULL, 5032147476247760397ULL,\n    10064294952495520794ULL, 2012858990499104158ULL, 4025717980998208317ULL,\n    8051435961996416635ULL, 16102871923992833270ULL, 3220574384798566654ULL,\n    6441148769597133308ULL, 12882297539194266616ULL, 2576459507838853323ULL,\n    5152919015677706646ULL, 10305838031355413293ULL, 2061167606271082658ULL,\n    4122335212542165317ULL, 8244670425084330634ULL, 16489340850168661269ULL,\n    3297868170033732253ULL, 6595736340067464507ULL, 13191472680134929015ULL,\n    2638294536026985803ULL, 5276589072053971606ULL, 10553178144107943212ULL,\n    2110635628821588642ULL, 4221271257643177284ULL, 8442542515286354569ULL,\n    16885085030572709139ULL, 3377017006114541827ULL, 6754034012229083655ULL,\n    13508068024458167311ULL, 2701613604891633462ULL, 5403227209783266924ULL,\n    10806454419566533849ULL, 2161290883913306769ULL, 4322581767826613539ULL,\n    8645163535653227079ULL, 17290327071306454158ULL, 3458065414261290831ULL,\n    6916130828522581663ULL, 13832261657045163327ULL, 2766452331409032665ULL,\n    5532904662818065330ULL, 11065809325636130661ULL, 2213161865127226132ULL,\n    4426323730254452264ULL, 8852647460508904529ULL, 17705294921017809058ULL,\n    3541058984203561811ULL, 7082117968407123623ULL, 14164235936814247246ULL,\n    2832847187362849449ULL, 5665694374725698898ULL, 11331388749451397797ULL,\n    2266277749890279559ULL, 4532555499780559119ULL, 9065110999561118238ULL,\n    1813022199912223647ULL, 3626044399824447295ULL, 7252088799648894590ULL,\n    14504177599297789180ULL, 2900835519859557836ULL, 5801671039719115672ULL,\n    11603342079438231344ULL, 2320668415887646268ULL, 4641336831775292537ULL,\n    9282673663550585075ULL, 1856534732710117015ULL, 3713069465420234030ULL,\n    7426138930840468060ULL, 14852277861680936121ULL, 2970455572336187224ULL,\n    5940911144672374448ULL, 11881822289344748896ULL, 2376364457868949779ULL,\n    4752728915737899558ULL, 9505457831475799117ULL, 1901091566295159823ULL,\n    3802183132590319647ULL, 7604366265180639294ULL, 15208732530361278588ULL,\n    3041746506072255717ULL, 6083493012144511435ULL, 12166986024289022870ULL,\n    2433397204857804574ULL, 4866794409715609148ULL, 9733588819431218296ULL,\n    1946717763886243659ULL, 3893435527772487318ULL, 7786871055544974637ULL,\n    15573742111089949274ULL, 3114748422217989854ULL, 6229496844435979709ULL,\n    12458993688871959419ULL, 2491798737774391883ULL, 4983597475548783767ULL,\n    9967194951097567535ULL, 1993438990219513507ULL, 3986877980439027014ULL,\n    7973755960878054028ULL, 15947511921756108056ULL, 3189502384351221611ULL,\n    6379004768702443222ULL, 12758009537404886445ULL, 2551601907480977289ULL,\n    5103203814961954578ULL, 10206407629923909156ULL, 2041281525984781831ULL,\n    4082563051969563662ULL, 8165126103939127325ULL, 16330252207878254650ULL,\n    3266050441575650930ULL, 6532100883151301860ULL, 13064201766302603720ULL,\n    2612840353260520744ULL, 5225680706521041488ULL, 10451361413042082976ULL,\n    2090272282608416595ULL, 4180544565216833190ULL, 8361089130433666380ULL,\n    16722178260867332761ULL, 3344435652173466552ULL, 6688871304346933104ULL,\n    13377742608693866209ULL, 2675548521738773241ULL, 5351097043477546483ULL,\n    10702194086955092967ULL, 2140438817391018593ULL, 4280877634782037187ULL,\n    8561755269564074374ULL, 17123510539128148748ULL, 3424702107825629749ULL,\n    6849404215651259499ULL, 13698808431302518998ULL, 2739761686260503799ULL,\n    5479523372521007599ULL, 10959046745042015198ULL, 2191809349008403039ULL,\n    4383618698016806079ULL, 8767237396033612159ULL, 17534474792067224318ULL,\n    3506894958413444863ULL, 7013789916826889727ULL, 14027579833653779454ULL,\n    2805515966730755890ULL, 5611031933461511781ULL, 11222063866923023563ULL,\n    2244412773384604712ULL, 4488825546769209425ULL, 8977651093538418850ULL,\n    17955302187076837701ULL, 3591060437415367540ULL, 7182120874830735080ULL,\n    14364241749661470161ULL, 2872848349932294032ULL, 5745696699864588064ULL,\n    11491393399729176129ULL, 2298278679945835225ULL, 4596557359891670451ULL,\n    9193114719783340903ULL, 1838622943956668180ULL, 3677245887913336361ULL,\n    7354491775826672722ULL, 14708983551653345445ULL, 2941796710330669089ULL,\n    5883593420661338178ULL, 11767186841322676356ULL, 2353437368264535271ULL,\n    4706874736529070542ULL, 9413749473058141084ULL, 1882749894611628216ULL,\n    3765499789223256433ULL, 7530999578446512867ULL, 15061999156893025735ULL,\n    3012399831378605147ULL, 6024799662757210294ULL, 12049599325514420588ULL,\n    2409919865102884117ULL, 4819839730205768235ULL, 9639679460411536470ULL,\n    1927935892082307294ULL, 3855871784164614588ULL, 7711743568329229176ULL,\n    15423487136658458353ULL, 3084697427331691670ULL, 6169394854663383341ULL,\n    12338789709326766682ULL, 2467757941865353336ULL, 4935515883730706673ULL,\n    9871031767461413346ULL, 1974206353492282669ULL, 3948412706984565338ULL,\n    7896825413969130677ULL, 15793650827938261354ULL, 3158730165587652270ULL,\n    6317460331175304541ULL, 12634920662350609083ULL, 2526984132470121816ULL,\n    5053968264940243633ULL, 10107936529880487266ULL, 2021587305976097453ULL,\n    4043174611952194906ULL, 8086349223904389813ULL, 16172698447808779626ULL,\n    3234539689561755925ULL, 6469079379123511850ULL, 12938158758247023701ULL,\n    2587631751649404740ULL, 5175263503298809480ULL, 10350527006597618960ULL,\n    2070105401319523792ULL, 4140210802639047584ULL, 8280421605278095168ULL,\n    16560843210556190337ULL, 3312168642111238067ULL, 6624337284222476135ULL,\n    13248674568444952270ULL, 2649734913688990454ULL, 5299469827377980908ULL,\n    10598939654755961816ULL, 2119787930951192363ULL, 4239575861902384726ULL,\n    8479151723804769452ULL, 16958303447609538905ULL, 3391660689521907781ULL,\n    6783321379043815562ULL, 13566642758087631124ULL, 2713328551617526224ULL,\n    5426657103235052449ULL, 10853314206470104899ULL, 2170662841294020979ULL,\n    4341325682588041959ULL, 8682651365176083919ULL, 17365302730352167839ULL,\n    3473060546070433567ULL, 6946121092140867135ULL, 13892242184281734271ULL,\n    2778448436856346854ULL, 5556896873712693708ULL, 11113793747425387417ULL,\n    2222758749485077483ULL, 4445517498970154966ULL, 8891034997940309933ULL,\n    17782069995880619867ULL, 3556413999176123973ULL, 7112827998352247947ULL,\n    14225655996704495894ULL, 2845131199340899178ULL, 5690262398681798357ULL,\n    11380524797363596715ULL, 2276104959472719343ULL, 4552209918945438686ULL,\n    9104419837890877372ULL, 1820883967578175474ULL, 3641767935156350948ULL,\n    7283535870312701897ULL, 14567071740625403795ULL, 2913414348125080759ULL,\n    5826828696250161518ULL, 11653657392500323036ULL, 2330731478500064607ULL,\n    4661462957000129214ULL, 9322925914000258429ULL, 1864585182800051685ULL,\n    3729170365600103371ULL, 7458340731200206743ULL, 14916681462400413486ULL,\n    2983336292480082697ULL, 5966672584960165394ULL, 11933345169920330789ULL,\n    2386669033984066157ULL, 4773338067968132315ULL, 9546676135936264631ULL,\n    1909335227187252926ULL, 3818670454374505852ULL, 7637340908749011705ULL,\n    15274681817498023410ULL, 3054936363499604682ULL, 6109872726999209364ULL,\n    12219745453998418728ULL, 2443949090799683745ULL, 4887898181599367491ULL,\n    9775796363198734982ULL, 1955159272639746996ULL, 3910318545279493993ULL,\n    7820637090558987986ULL, 15641274181117975972ULL, 3128254836223595194ULL,\n    6256509672447190388ULL, 12513019344894380777ULL, 2502603868978876155ULL,\n    5005207737957752311ULL, 10010415475915504622ULL, 2002083095183100924ULL,\n    4004166190366201848ULL, 8008332380732403697ULL, 16016664761464807395ULL,\n    3203332952292961479ULL, 6406665904585922958ULL, 12813331809171845916ULL,\n    2562666361834369183ULL, 5125332723668738366ULL, 10250665447337476733ULL,\n    2050133089467495346ULL, 4100266178934990693ULL, 8200532357869981386ULL,\n    16401064715739962772ULL, 3280212943147992554ULL, 6560425886295985109ULL,\n    13120851772591970218ULL, 2624170354518394043ULL, 5248340709036788087ULL,\n    10496681418073576174ULL, 2099336283614715234ULL, 4198672567229430469ULL,\n    8397345134458860939ULL, 16794690268917721879ULL, 3358938053783544375ULL,\n    6717876107567088751ULL, 13435752215134177503ULL, 2687150443026835500ULL,\n    5374300886053671001ULL, 10748601772107342002ULL, 2149720354421468400ULL,\n    4299440708842936801ULL, 8598881417685873602ULL, 17197762835371747204ULL,\n    3439552567074349440ULL, 6879105134148698881ULL, 13758210268297397763ULL,\n    2751642053659479552ULL, 5503284107318959105ULL, 11006568214637918210ULL,\n    2201313642927583642ULL, 4402627285855167284ULL, 8805254571710334568ULL,\n    17610509143420669137ULL, 3522101828684133827ULL, 7044203657368267654ULL,\n    14088407314736535309ULL, 2817681462947307061ULL, 5635362925894614123ULL,\n    11270725851789228247ULL, 2254145170357845649ULL, 4508290340715691299ULL,\n    9016580681431382598ULL, 18033161362862765196ULL, 3606632272572553039ULL,\n    7213264545145106078ULL, 14426529090290212157ULL, 2885305818058042431ULL,\n    5770611636116084862ULL, 11541223272232169725ULL, 2308244654446433945ULL,\n    4616489308892867890ULL, 9232978617785735780ULL, 1846595723557147156ULL,\n    3693191447114294312ULL, 7386382894228588624ULL, 14772765788457177249ULL,\n    2954553157691435449ULL, 5909106315382870899ULL, 11818212630765741799ULL,\n    2363642526153148359ULL, 4727285052306296719ULL, 9454570104612593439ULL,\n    1890914020922518687ULL, 3781828041845037375ULL, 7563656083690074751ULL,\n    15127312167380149503ULL, 3025462433476029900ULL, 6050924866952059801ULL,\n    12101849733904119602ULL, 2420369946780823920ULL, 4840739893561647841ULL,\n    9681479787123295682ULL, 1936295957424659136ULL, 3872591914849318272ULL,\n    7745183829698636545ULL, 15490367659397273091ULL, 3098073531879454618ULL,\n    6196147063758909236ULL, 12392294127517818473ULL, 2478458825503563694ULL,\n    4956917651007127389ULL, 9913835302014254778ULL, 1982767060402850955ULL,\n    3965534120805701911ULL, 7931068241611403822ULL, 15862136483222807645ULL,\n    3172427296644561529ULL, 6344854593289123058ULL, 12689709186578246116ULL,\n    2537941837315649223ULL, 5075883674631298446ULL, 10151767349262596893ULL,\n    2030353469852519378ULL, 4060706939705038757ULL, 8121413879410077514ULL,\n    16242827758820155028ULL, 3248565551764031005ULL, 6497131103528062011ULL,\n    12994262207056124023ULL, 2598852441411224804ULL, 5197704882822449609ULL,\n    10395409765644899218ULL, 2079081953128979843ULL, 4158163906257959687ULL,\n    8316327812515919374ULL, 16632655625031838749ULL, 3326531125006367749ULL,\n    6653062250012735499ULL, 13306124500025470999ULL, 2661224900005094199ULL,\n    5322449800010188399ULL, 10644899600020376799ULL, 2128979920004075359ULL,\n    4257959840008150719ULL, 8515919680016301439ULL, 17031839360032602879ULL,\n    3406367872006520575ULL, 6812735744013041151ULL, 13625471488026082303ULL,\n    2725094297605216460ULL, 5450188595210432921ULL, 10900377190420865842ULL,\n    2180075438084173168ULL, 4360150876168346337ULL, 8720301752336692674ULL,\n    17440603504673385348ULL, 3488120700934677069ULL, 6976241401869354139ULL,\n    13952482803738708279ULL, 2790496560747741655ULL, 5580993121495483311ULL,\n    11161986242990966623ULL, 2232397248598193324ULL, 4464794497196386649ULL,\n    8929588994392773298ULL, 17859177988785546597ULL, 3571835597757109319ULL,\n    7143671195514218638ULL, 14287342391028437277ULL, 2857468478205687455ULL,\n    5714936956411374911ULL, 11429873912822749822ULL, 2285974782564549964ULL,\n    4571949565129099928ULL, 9143899130258199857ULL, 1828779826051639971ULL,\n    3657559652103279943ULL, 7315119304206559886ULL, 14630238608413119772ULL,\n    2926047721682623954ULL, 5852095443365247908ULL, 11704190886730495817ULL,\n    2340838177346099163ULL, 4681676354692198327ULL, 9363352709384396654ULL,\n    1872670541876879330ULL, 3745341083753758661ULL, 7490682167507517323ULL,\n    14981364335015034646ULL, 2996272867003006929ULL, 5992545734006013858ULL,\n    11985091468012027717ULL, 2397018293602405543ULL, 4794036587204811087ULL,\n    9588073174409622174ULL, 1917614634881924434ULL, 3835229269763848869ULL,\n    7670458539527697739ULL, 15340917079055395478ULL, 3068183415811079095ULL,\n    6136366831622158191ULL, 12272733663244316382ULL, 2454546732648863276ULL,\n    4909093465297726553ULL, 9818186930595453106ULL, 1963637386119090621ULL,\n    3927274772238181242ULL, 7854549544476362484ULL, 15709099088952724969ULL,\n    3141819817790544993ULL, 6283639635581089987ULL, 12567279271162179975ULL,\n    2513455854232435995ULL, 5026911708464871990ULL, 10053823416929743980ULL,\n    2010764683385948796ULL, 4021529366771897592ULL, 8043058733543795184ULL,\n    16086117467087590369ULL, 3217223493417518073ULL, 6434446986835036147ULL,\n    12868893973670072295ULL, 2573778794734014459ULL, 5147557589468028918ULL,\n    10295115178936057836ULL, 2059023035787211567ULL, 4118046071574423134ULL,\n    8236092143148846269ULL, 16472184286297692538ULL, 3294436857259538507ULL,\n    6588873714519077015ULL, 13177747429038154030ULL, 2635549485807630806ULL,\n    5271098971615261612ULL, 10542197943230523224ULL, 2108439588646104644ULL,\n    4216879177292209289ULL, 8433758354584418579ULL, 16867516709168837158ULL,\n    3373503341833767431ULL, 6747006683667534863ULL, 13494013367335069727ULL,\n    2698802673467013945ULL, 5397605346934027890ULL, 10795210693868055781ULL,\n    2159042138773611156ULL, 4318084277547222312ULL, 8636168555094444625ULL,\n    17272337110188889250ULL, 3454467422037777850ULL, 6908934844075555700ULL,\n    13817869688151111400ULL, 2763573937630222280ULL, 5527147875260444560ULL,\n    11054295750520889120ULL, 2210859150104177824ULL, 4421718300208355648ULL,\n    8843436600416711296ULL, 17686873200833422592ULL, 3537374640166684518ULL,\n    7074749280333369037ULL, 14149498560666738074ULL, 2829899712133347614ULL,\n    5659799424266695229ULL, 11319598848533390459ULL, 2263919769706678091ULL,\n    4527839539413356183ULL, 9055679078826712367ULL, 1811135815765342473ULL,\n    3622271631530684947ULL, 7244543263061369894ULL, 14489086526122739788ULL,\n    2897817305224547957ULL, 5795634610449095915ULL, 11591269220898191830ULL,\n    2318253844179638366ULL, 4636507688359276732ULL, 9273015376718553464ULL,\n    1854603075343710692ULL, 3709206150687421385ULL, 7418412301374842771ULL,\n    14836824602749685542ULL, 2967364920549937108ULL, 5934729841099874217ULL,\n    11869459682199748434ULL, 2373891936439949686ULL, 4747783872879899373ULL,\n    9495567745759798747ULL, 1899113549151959749ULL, 3798227098303919498ULL,\n    7596454196607838997ULL, 15192908393215677995ULL, 3038581678643135599ULL,\n    6077163357286271198ULL, 12154326714572542396ULL, 2430865342914508479ULL,\n    4861730685829016958ULL, 9723461371658033917ULL, 1944692274331606783ULL,\n    3889384548663213566ULL, 7778769097326427133ULL, 15557538194652854267ULL,\n    3111507638930570853ULL, 6223015277861141707ULL, 12446030555722283414ULL,\n    2489206111144456682ULL, 4978412222288913365ULL, 9956824444577826731ULL,\n    1991364888915565346ULL, 3982729777831130692ULL, 7965459555662261385ULL,\n    15930919111324522770ULL, 3186183822264904554ULL, 6372367644529809108ULL,\n    12744735289059618216ULL, 2548947057811923643ULL, 5097894115623847286ULL,\n    10195788231247694572ULL, 2039157646249538914ULL, 4078315292499077829ULL,\n    8156630584998155658ULL, 16313261169996311316ULL, 3262652233999262263ULL,\n    6525304467998524526ULL, 13050608935997049053ULL, 2610121787199409810ULL,\n    5220243574398819621ULL, 10440487148797639242ULL, 2088097429759527848ULL,\n    4176194859519055697ULL, 8352389719038111394ULL, 16704779438076222788ULL,\n    3340955887615244557ULL, 6681911775230489115ULL, 13363823550460978230ULL,\n    2672764710092195646ULL, 5345529420184391292ULL, 10691058840368782584ULL,\n    2138211768073756516ULL, 4276423536147513033ULL, 8552847072295026067ULL,\n    17105694144590052135ULL, 3421138828918010427ULL, 6842277657836020854ULL,\n    13684555315672041708ULL, 2736911063134408341ULL, 5473822126268816683ULL,\n    10947644252537633366ULL, 2189528850507526673ULL, 4379057701015053346ULL,\n    8758115402030106693ULL, 17516230804060213386ULL, 3503246160812042677ULL,\n    7006492321624085354ULL, 14012984643248170709ULL, 2802596928649634141ULL,\n    5605193857299268283ULL, 11210387714598536567ULL, 2242077542919707313ULL,\n    4484155085839414626ULL, 8968310171678829253ULL, 17936620343357658507ULL,\n    3587324068671531701ULL, 7174648137343063403ULL, 14349296274686126806ULL,\n    2869859254937225361ULL, 5739718509874450722ULL, 11479437019748901445ULL,\n    2295887403949780289ULL, 4591774807899560578ULL, 9183549615799121156ULL,\n    1836709923159824231ULL, 3673419846319648462ULL, 7346839692639296924ULL,\n    14693679385278593849ULL, 2938735877055718769ULL, 5877471754111437539ULL,\n    11754943508222875079ULL, 2350988701644575015ULL, 4701977403289150031ULL,\n    9403954806578300063ULL, 1880790961315660012ULL, 3761581922631320025ULL,\n    7523163845262640050ULL, 15046327690525280101ULL, 3009265538105056020ULL,\n    6018531076210112040ULL, 12037062152420224081ULL, 2407412430484044816ULL,\n    4814824860968089632ULL, 9629649721936179265ULL, 1925929944387235853ULL,\n    3851859888774471706ULL, 7703719777548943412ULL, 15407439555097886824ULL,\n    3081487911019577364ULL, 6162975822039154729ULL, 12325951644078309459ULL,\n    2465190328815661891ULL, 4930380657631323783ULL, 9860761315262647567ULL,\n    1972152263052529513ULL, 3944304526105059027ULL, 7888609052210118054ULL,\n    15777218104420236108ULL, 3155443620884047221ULL, 6310887241768094443ULL,\n    12621774483536188886ULL, 2524354896707237777ULL, 5048709793414475554ULL,\n    10097419586828951109ULL, 2019483917365790221ULL, 4038967834731580443ULL,\n    8077935669463160887ULL, 16155871338926321774ULL, 3231174267785264354ULL,\n    6462348535570528709ULL, 12924697071141057419ULL, 2584939414228211483ULL,\n    5169878828456422967ULL, 10339757656912845935ULL, 2067951531382569187ULL,\n    4135903062765138374ULL, 8271806125530276748ULL, 16543612251060553497ULL,\n    3308722450212110699ULL, 6617444900424221398ULL, 13234889800848442797ULL,\n    2646977960169688559ULL, 5293955920339377119ULL, 10587911840678754238ULL,\n    2117582368135750847ULL, 4235164736271501695ULL, 8470329472543003390ULL,\n    16940658945086006781ULL, 3388131789017201356ULL, 6776263578034402712ULL,\n    13552527156068805425ULL, 2710505431213761085ULL, 5421010862427522170ULL,\n    10842021724855044340ULL, 2168404344971008868ULL, 4336808689942017736ULL,\n    8673617379884035472ULL, 17347234759768070944ULL, 3469446951953614188ULL,\n    6938893903907228377ULL, 13877787807814456755ULL, 2775557561562891351ULL,\n    5551115123125782702ULL, 11102230246251565404ULL, 2220446049250313080ULL,\n    4440892098500626161ULL, 8881784197001252323ULL, 17763568394002504646ULL,\n    3552713678800500929ULL, 7105427357601001858ULL, 14210854715202003717ULL,\n    2842170943040400743ULL, 5684341886080801486ULL, 11368683772161602973ULL,\n    2273736754432320594ULL, 4547473508864641189ULL, 9094947017729282379ULL,\n    1818989403545856475ULL, 3637978807091712951ULL, 7275957614183425903ULL,\n    14551915228366851806ULL, 2910383045673370361ULL, 5820766091346740722ULL,\n    11641532182693481445ULL, 2328306436538696289ULL, 4656612873077392578ULL,\n    9313225746154785156ULL, 1862645149230957031ULL, 3725290298461914062ULL,\n    7450580596923828125ULL, 14901161193847656250ULL, 2980232238769531250ULL,\n    5960464477539062500ULL, 11920928955078125000ULL, 2384185791015625000ULL,\n    4768371582031250000ULL, 9536743164062500000ULL, 1907348632812500000ULL,\n    3814697265625000000ULL, 7629394531250000000ULL, 15258789062500000000ULL,\n    3051757812500000000ULL, 6103515625000000000ULL, 12207031250000000000ULL,\n    2441406250000000000ULL, 4882812500000000000ULL, 9765625000000000000ULL,\n    1953125000000000000ULL, 3906250000000000000ULL, 7812500000000000000ULL,\n    15625000000000000000ULL, 3125000000000000000ULL, 6250000000000000000ULL,\n    12500000000000000000ULL, 2500000000000000000ULL, 5000000000000000000ULL,\n    10000000000000000000ULL, 2000000000000000000ULL, 4000000000000000000ULL,\n    8000000000000000000ULL, 16000000000000000000ULL, 3200000000000000000ULL,\n    6400000000000000000ULL, 12800000000000000000ULL, 2560000000000000000ULL,\n    5120000000000000000ULL, 10240000000000000000ULL, 2048000000000000000ULL,\n    4096000000000000000ULL, 8192000000000000000ULL, 16384000000000000000ULL,\n    3276800000000000000ULL, 6553600000000000000ULL, 13107200000000000000ULL,\n    2621440000000000000ULL, 5242880000000000000ULL, 10485760000000000000ULL,\n    2097152000000000000ULL, 4194304000000000000ULL, 8388608000000000000ULL,\n    16777216000000000000ULL, 3355443200000000000ULL, 6710886400000000000ULL,\n    13421772800000000000ULL, 2684354560000000000ULL, 5368709120000000000ULL,\n    10737418240000000000ULL, 2147483648000000000ULL, 4294967296000000000ULL,\n    8589934592000000000ULL, 17179869184000000000ULL, 3435973836800000000ULL,\n    6871947673600000000ULL, 13743895347200000000ULL, 2748779069440000000ULL,\n    5497558138880000000ULL, 10995116277760000000ULL, 2199023255552000000ULL,\n    4398046511104000000ULL, 8796093022208000000ULL, 17592186044416000000ULL,\n    3518437208883200000ULL, 7036874417766400000ULL, 14073748835532800000ULL,\n    2814749767106560000ULL, 5629499534213120000ULL, 11258999068426240000ULL,\n    2251799813685248000ULL, 4503599627370496000ULL, 9007199254740992000ULL,\n    18014398509481984000ULL, 3602879701896396800ULL, 7205759403792793600ULL,\n    14411518807585587200ULL, 2882303761517117440ULL, 5764607523034234880ULL,\n    11529215046068469760ULL, 2305843009213693952ULL, 4611686018427387904ULL,\n    9223372036854775808ULL, 1844674407370955161ULL, 3689348814741910323ULL,\n    7378697629483820646ULL, 14757395258967641292ULL, 2951479051793528258ULL,\n    5902958103587056517ULL, 11805916207174113034ULL, 2361183241434822606ULL,\n    4722366482869645213ULL, 9444732965739290427ULL, 1888946593147858085ULL,\n    3777893186295716170ULL, 7555786372591432341ULL, 15111572745182864683ULL,\n    3022314549036572936ULL, 6044629098073145873ULL, 12089258196146291747ULL,\n    2417851639229258349ULL, 4835703278458516698ULL, 9671406556917033397ULL,\n    1934281311383406679ULL, 3868562622766813359ULL, 7737125245533626718ULL,\n    15474250491067253436ULL, 3094850098213450687ULL, 6189700196426901374ULL,\n    12379400392853802748ULL, 2475880078570760549ULL, 4951760157141521099ULL,\n    9903520314283042199ULL, 1980704062856608439ULL, 3961408125713216879ULL,\n    7922816251426433759ULL, 15845632502852867518ULL, 3169126500570573503ULL,\n    6338253001141147007ULL, 12676506002282294014ULL, 2535301200456458802ULL,\n    5070602400912917605ULL, 10141204801825835211ULL, 2028240960365167042ULL,\n    4056481920730334084ULL, 8112963841460668169ULL, 16225927682921336339ULL,\n    3245185536584267267ULL, 6490371073168534535ULL, 12980742146337069071ULL,\n    2596148429267413814ULL, 5192296858534827628ULL, 10384593717069655257ULL,\n    2076918743413931051ULL, 4153837486827862102ULL, 8307674973655724205ULL,\n    16615349947311448411ULL, 3323069989462289682ULL, 6646139978924579364ULL,\n    13292279957849158729ULL, 2658455991569831745ULL, 5316911983139663491ULL,\n    10633823966279326983ULL, 2126764793255865396ULL, 4253529586511730793ULL,\n    8507059173023461586ULL, 17014118346046923173ULL, 3402823669209384634ULL,\n    6805647338418769269ULL, 13611294676837538538ULL, 2722258935367507707ULL,\n    5444517870735015415ULL, 10889035741470030830ULL, 2177807148294006166ULL,\n    4355614296588012332ULL, 8711228593176024664ULL, 17422457186352049329ULL,\n    3484491437270409865ULL, 6968982874540819731ULL, 13937965749081639463ULL,\n    2787593149816327892ULL, 5575186299632655785ULL, 11150372599265311570ULL,\n    2230074519853062314ULL, 4460149039706124628ULL, 8920298079412249256ULL,\n    17840596158824498513ULL, 3568119231764899702ULL, 7136238463529799405ULL,\n    14272476927059598810ULL, 2854495385411919762ULL, 5708990770823839524ULL,\n    11417981541647679048ULL, 2283596308329535809ULL, 4567192616659071619ULL,\n    9134385233318143238ULL, 1826877046663628647ULL, 3653754093327257295ULL,\n    7307508186654514591ULL, 14615016373309029182ULL, 2923003274661805836ULL,\n    5846006549323611672ULL, 11692013098647223345ULL, 2338402619729444669ULL,\n    4676805239458889338ULL, 9353610478917778676ULL, 1870722095783555735ULL,\n    3741444191567111470ULL, 7482888383134222941ULL, 14965776766268445882ULL,\n    2993155353253689176ULL, 5986310706507378352ULL, 11972621413014756705ULL,\n    2394524282602951341ULL, 4789048565205902682ULL, 9578097130411805364ULL,\n    1915619426082361072ULL, 3831238852164722145ULL, 7662477704329444291ULL,\n    15324955408658888583ULL, 3064991081731777716ULL, 6129982163463555433ULL,\n    12259964326927110866ULL, 2451992865385422173ULL, 4903985730770844346ULL,\n    9807971461541688693ULL, 1961594292308337738ULL, 3923188584616675477ULL,\n    7846377169233350954ULL, 15692754338466701909ULL, 3138550867693340381ULL,\n    6277101735386680763ULL, 12554203470773361527ULL, 2510840694154672305ULL,\n    5021681388309344611ULL, 10043362776618689222ULL, 2008672555323737844ULL,\n    4017345110647475688ULL, 8034690221294951377ULL, 16069380442589902755ULL,\n    3213876088517980551ULL, 6427752177035961102ULL, 12855504354071922204ULL,\n    2571100870814384440ULL, 5142201741628768881ULL, 10284403483257537763ULL,\n    2056880696651507552ULL, 4113761393303015105ULL, 8227522786606030210ULL,\n    16455045573212060421ULL, 3291009114642412084ULL, 6582018229284824168ULL,\n    13164036458569648337ULL, 2632807291713929667ULL, 5265614583427859334ULL,\n    10531229166855718669ULL, 2106245833371143733ULL, 4212491666742287467ULL,\n    8424983333484574935ULL, 16849966666969149871ULL, 3369993333393829974ULL,\n    6739986666787659948ULL, 13479973333575319897ULL, 2695994666715063979ULL,\n    5391989333430127958ULL, 10783978666860255917ULL, 2156795733372051183ULL,\n    4313591466744102367ULL, 8627182933488204734ULL, 17254365866976409468ULL,\n    3450873173395281893ULL, 6901746346790563787ULL, 13803492693581127574ULL,\n    2760698538716225514ULL, 5521397077432451029ULL, 11042794154864902059ULL,\n    2208558830972980411ULL, 4417117661945960823ULL, 8834235323891921647ULL,\n    17668470647783843295ULL, 3533694129556768659ULL, 7067388259113537318ULL,\n    14134776518227074636ULL, 2826955303645414927ULL, 5653910607290829854ULL,\n    11307821214581659709ULL, 2261564242916331941ULL, 4523128485832663883ULL,\n    9046256971665327767ULL, 18092513943330655534ULL, 3618502788666131106ULL,\n    7237005577332262213ULL, 14474011154664524427ULL, 2894802230932904885ULL,\n    5789604461865809771ULL, 11579208923731619542ULL, 2315841784746323908ULL,\n    4631683569492647816ULL, 9263367138985295633ULL, 1852673427797059126ULL,\n    3705346855594118253ULL, 7410693711188236507ULL, 14821387422376473014ULL,\n    2964277484475294602ULL, 5928554968950589205ULL, 11857109937901178411ULL,\n    2371421987580235682ULL, 4742843975160471364ULL, 9485687950320942729ULL,\n    1897137590064188545ULL, 3794275180128377091ULL, 7588550360256754183ULL,\n    15177100720513508366ULL, 3035420144102701673ULL, 6070840288205403346ULL,\n    12141680576410806693ULL, 2428336115282161338ULL, 4856672230564322677ULL,\n    9713344461128645354ULL, 1942668892225729070ULL, 3885337784451458141ULL,\n    7770675568902916283ULL, 15541351137805832567ULL, 3108270227561166513ULL,\n    6216540455122333026ULL, 12433080910244666053ULL, 2486616182048933210ULL,\n    4973232364097866421ULL, 9946464728195732843ULL, 1989292945639146568ULL,\n    3978585891278293137ULL, 7957171782556586274ULL, 15914343565113172548ULL,\n    3182868713022634509ULL, 6365737426045269019ULL, 12731474852090538039ULL,\n    2546294970418107607ULL, 5092589940836215215ULL, 10185179881672430431ULL,\n    2037035976334486086ULL, 4074071952668972172ULL, 8148143905337944345ULL,\n    16296287810675888690ULL, 3259257562135177738ULL, 6518515124270355476ULL,\n    13037030248540710952ULL, 2607406049708142190ULL, 5214812099416284380ULL,\n    10429624198832568761ULL, 2085924839766513752ULL, 4171849679533027504ULL,\n    8343699359066055009ULL, 16687398718132110018ULL, 3337479743626422003ULL,\n    6674959487252844007ULL, 13349918974505688014ULL, 2669983794901137602ULL,\n    5339967589802275205ULL, 10679935179604550411ULL, 2135987035920910082ULL,\n    4271974071841820164ULL, 8543948143683640329ULL, 17087896287367280659ULL,\n    3417579257473456131ULL, 6835158514946912263ULL, 13670317029893824527ULL,\n    2734063405978764905ULL, 5468126811957529810ULL, 10936253623915059621ULL,\n    2187250724783011924ULL, 4374501449566023848ULL, 8749002899132047697ULL,\n    17498005798264095394ULL, 3499601159652819078ULL, 6999202319305638157ULL,\n    13998404638611276315ULL, 2799680927722255263ULL, 5599361855444510526ULL,\n    11198723710889021052ULL, 2239744742177804210ULL, 4479489484355608421ULL,\n    8958978968711216842ULL, 17917957937422433684ULL, 3583591587484486736ULL,\n    7167183174968973473ULL, 14334366349937946947ULL, 2866873269987589389ULL,\n    5733746539975178779ULL, 11467493079950357558ULL, 2293498615990071511ULL,\n    4586997231980143023ULL, 9173994463960286046ULL, 1834798892792057209ULL,\n    3669597785584114418ULL, 7339195571168228837ULL, 14678391142336457674ULL,\n    2935678228467291534ULL, 5871356456934583069ULL, 11742712913869166139ULL,\n    2348542582773833227ULL, 4697085165547666455ULL, 9394170331095332911ULL,\n    1878834066219066582ULL, 3757668132438133164ULL, 7515336264876266329ULL,\n    15030672529752532658ULL, 3006134505950506531ULL, 6012269011901013063ULL,\n    12024538023802026126ULL, 2404907604760405225ULL, 4809815209520810450ULL,\n    9619630419041620901ULL, 1923926083808324180ULL, 3847852167616648360ULL,\n    7695704335233296721ULL, 15391408670466593442ULL, 3078281734093318688ULL,\n    6156563468186637376ULL, 12313126936373274753ULL, 2462625387274654950ULL,\n    4925250774549309901ULL, 9850501549098619803ULL, 1970100309819723960ULL,\n    3940200619639447921ULL, 7880401239278895842ULL, 15760802478557791684ULL,\n    3152160495711558336ULL, 6304320991423116673ULL, 12608641982846233347ULL,\n    2521728396569246669ULL, 5043456793138493339ULL, 10086913586276986678ULL,\n    2017382717255397335ULL, 4034765434510794671ULL, 8069530869021589342ULL,\n    16139061738043178685ULL, 3227812347608635737ULL, 6455624695217271474ULL,\n    12911249390434542948ULL, 2582249878086908589ULL, 5164499756173817179ULL,\n    10328999512347634358ULL, 2065799902469526871ULL, 4131599804939053743ULL,\n    8263199609878107486ULL, 16526399219756214973ULL, 3305279843951242994ULL,\n    6610559687902485989ULL, 13221119375804971979ULL, 2644223875160994395ULL,\n    5288447750321988791ULL, 10576895500643977583ULL, 2115379100128795516ULL,\n    4230758200257591033ULL, 8461516400515182066ULL, 16923032801030364133ULL,\n    3384606560206072826ULL, 6769213120412145653ULL, 13538426240824291306ULL,\n    2707685248164858261ULL, 5415370496329716522ULL, 10830740992659433045ULL,\n    2166148198531886609ULL, 4332296397063773218ULL, 8664592794127546436ULL,\n    17329185588255092872ULL, 3465837117651018574ULL, 6931674235302037148ULL,\n    13863348470604074297ULL, 2772669694120814859ULL, 5545339388241629719ULL,\n    11090678776483259438ULL, 2218135755296651887ULL, 4436271510593303775ULL,\n    8872543021186607550ULL, 17745086042373215101ULL, 3549017208474643020ULL,\n    7098034416949286040ULL, 14196068833898572081ULL, 2839213766779714416ULL,\n    5678427533559428832ULL, 11356855067118857664ULL, 2271371013423771532ULL,\n    4542742026847543065ULL, 9085484053695086131ULL, 1817096810739017226ULL,\n    3634193621478034452ULL, 7268387242956068905ULL, 14536774485912137810ULL,\n    2907354897182427562ULL, 5814709794364855124ULL, 11629419588729710248ULL,\n    2325883917745942049ULL, 4651767835491884099ULL, 9303535670983768199ULL,\n    1860707134196753639ULL, 3721414268393507279ULL, 7442828536787014559ULL,\n    14885657073574029118ULL, 2977131414714805823ULL, 5954262829429611647ULL,\n    11908525658859223294ULL, 2381705131771844658ULL, 4763410263543689317ULL,\n    9526820527087378635ULL, 1905364105417475727ULL, 3810728210834951454ULL,\n    7621456421669902908ULL, 15242912843339805817ULL, 3048582568667961163ULL,\n    6097165137335922326ULL, 12194330274671844653ULL, 2438866054934368930ULL,\n    4877732109868737861ULL, 9755464219737475723ULL, 1951092843947495144ULL,\n    3902185687894990289ULL, 7804371375789980578ULL, 15608742751579961156ULL,\n    3121748550315992231ULL, 6243497100631984462ULL, 12486994201263968925ULL,\n    2497398840252793785ULL, 4994797680505587570ULL, 9989595361011175140ULL,\n    1997919072202235028ULL, 3995838144404470056ULL, 7991676288808940112ULL,\n    15983352577617880224ULL, 3196670515523576044ULL, 6393341031047152089ULL,\n    12786682062094304179ULL, 2557336412418860835ULL, 5114672824837721671ULL,\n    10229345649675443343ULL, 2045869129935088668ULL, 4091738259870177337ULL,\n    8183476519740354675ULL, 16366953039480709350ULL, 3273390607896141870ULL,\n    6546781215792283740ULL, 13093562431584567480ULL, 2618712486316913496ULL,\n    5237424972633826992ULL, 10474849945267653984ULL, 2094969989053530796ULL,\n    4189939978107061593ULL, 8379879956214123187ULL, 16759759912428246374ULL,\n    3351951982485649274ULL, 6703903964971298549ULL, 13407807929942597099ULL,\n    2681561585988519419ULL, 5363123171977038839ULL, 10726246343954077679ULL,\n    2145249268790815535ULL, 4290498537581631071ULL, 8580997075163262143ULL,\n    17161994150326524287ULL, 3432398830065304857ULL, 6864797660130609714ULL,\n    13729595320261219429ULL, 2745919064052243885ULL, 5491838128104487771ULL,\n    10983676256208975543ULL, 2196735251241795108ULL, 4393470502483590217ULL,\n    8786941004967180435ULL, 17573882009934360870ULL, 3514776401986872174ULL,\n    7029552803973744348ULL, 14059105607947488696ULL, 2811821121589497739ULL,\n    5623642243178995478ULL, 11247284486357990957ULL, 2249456897271598191ULL,\n    4498913794543196382ULL, 8997827589086392765ULL, 17995655178172785531ULL,\n    3599131035634557106ULL, 7198262071269114212ULL, 14396524142538228424ULL,\n    2879304828507645684ULL, 5758609657015291369ULL, 11517219314030582739ULL,\n    2303443862806116547ULL, 4606887725612233095ULL, 9213775451224466191ULL,\n    1842755090244893238ULL, 3685510180489786476ULL, 7371020360979572953ULL,\n    14742040721959145907ULL, 2948408144391829181ULL, 5896816288783658362ULL,\n    11793632577567316725ULL, 2358726515513463345ULL, 4717453031026926690ULL,\n    9434906062053853380ULL, 1886981212410770676ULL, 3773962424821541352ULL,\n    7547924849643082704ULL, 15095849699286165408ULL, 3019169939857233081ULL,\n    6038339879714466163ULL, 12076679759428932327ULL, 2415335951885786465ULL,\n    4830671903771572930ULL, 9661343807543145861ULL, 1932268761508629172ULL,\n    3864537523017258344ULL, 7729075046034516689ULL, 15458150092069033378ULL,\n    3091630018413806675ULL, 6183260036827613351ULL, 12366520073655226703ULL,\n    2473304014731045340ULL, 4946608029462090681ULL, 9893216058924181362ULL,\n    1978643211784836272ULL, 3957286423569672544ULL, 7914572847139345089ULL,\n    15829145694278690179ULL, 3165829138855738035ULL, 6331658277711476071ULL,\n    12663316555422952143ULL, 2532663311084590428ULL, 5065326622169180857ULL,\n    10130653244338361715ULL, 2026130648867672343ULL, 4052261297735344686ULL,\n    8104522595470689372ULL, 16209045190941378744ULL, 3241809038188275748ULL,\n    6483618076376551497ULL, 12967236152753102995ULL, 2593447230550620599ULL,\n    5186894461101241198ULL, 10373788922202482396ULL, 2074757784440496479ULL,\n    4149515568880992958ULL, 8299031137761985917ULL, 16598062275523971834ULL,\n    3319612455104794366ULL, 6639224910209588733ULL, 13278449820419177467ULL,\n    2655689964083835493ULL, 5311379928167670986ULL, 10622759856335341973ULL,\n    2124551971267068394ULL, 4249103942534136789ULL, 8498207885068273579ULL,\n    16996415770136547158ULL, 3399283154027309431ULL, 6798566308054618863ULL,\n    13597132616109237726ULL, 2719426523221847545ULL, 5438853046443695090ULL,\n    10877706092887390181ULL, 2175541218577478036ULL, 4351082437154956072ULL,\n    8702164874309912144ULL, 17404329748619824289ULL, 3480865949723964857ULL,\n    6961731899447929715ULL, 13923463798895859431ULL, 2784692759779171886ULL,\n    5569385519558343772ULL, 11138771039116687545ULL, 2227754207823337509ULL,\n    4455508415646675018ULL, 8911016831293350036ULL, 17822033662586700072ULL,\n    3564406732517340014ULL, 7128813465034680029ULL, 14257626930069360058ULL,\n    2851525386013872011ULL, 5703050772027744023ULL, 11406101544055488046ULL,\n    2281220308811097609ULL, 4562440617622195218ULL, 9124881235244390437ULL,\n    1824976247048878087ULL, 3649952494097756174ULL, 7299904988195512349ULL,\n    14599809976391024699ULL, 2919961995278204939ULL, 5839923990556409879ULL,\n    11679847981112819759ULL, 2335969596222563951ULL, 4671939192445127903ULL,\n    9343878384890255807ULL, 1868775676978051161ULL, 3737551353956102323ULL,\n    7475102707912204646ULL, 14950205415824409292ULL, 2990041083164881858ULL,\n    5980082166329763716ULL, 11960164332659527433ULL, 2392032866531905486ULL,\n    4784065733063810973ULL, 9568131466127621947ULL, 1913626293225524389ULL,\n    3827252586451048778ULL, 7654505172902097557ULL, 15309010345804195115ULL,\n    3061802069160839023ULL, 6123604138321678046ULL, 12247208276643356092ULL,\n    2449441655328671218ULL, 4898883310657342436ULL, 9797766621314684873ULL,\n    1959553324262936974ULL, 3919106648525873949ULL, 7838213297051747899ULL,\n    15676426594103495798ULL, 3135285318820699159ULL, 6270570637641398319ULL,\n    12541141275282796638ULL, 2508228255056559327ULL, 5016456510113118655ULL,\n    10032913020226237310ULL, 2006582604045247462ULL, 4013165208090494924ULL,\n    8026330416180989848ULL, 16052660832361979697ULL, 3210532166472395939ULL,\n    6421064332944791878ULL, 12842128665889583757ULL, 2568425733177916751ULL,\n    5136851466355833503ULL, 10273702932711667006ULL, 2054740586542333401ULL,\n    4109481173084666802ULL, 8218962346169333605ULL, 16437924692338667210ULL,\n    3287584938467733442ULL, 6575169876935466884ULL, 13150339753870933768ULL,\n    2630067950774186753ULL, 5260135901548373507ULL, 10520271803096747014ULL,\n    2104054360619349402ULL, 4208108721238698805ULL, 8416217442477397611ULL,\n    16832434884954795223ULL, 3366486976990959044ULL, 6732973953981918089ULL,\n    13465947907963836178ULL, 2693189581592767235ULL, 5386379163185534471ULL,\n    10772758326371068942ULL, 2154551665274213788ULL, 4309103330548427577ULL,\n    8618206661096855154ULL, 17236413322193710308ULL, 3447282664438742061ULL,\n    6894565328877484123ULL, 13789130657754968246ULL, 2757826131550993649ULL,\n    5515652263101987298ULL, 11031304526203974597ULL, 2206260905240794919ULL,\n    4412521810481589838ULL, 8825043620963179677ULL, 17650087241926359355ULL,\n    3530017448385271871ULL, 7060034896770543742ULL, 14120069793541087484ULL,\n    2824013958708217496ULL, 5648027917416434993ULL, 11296055834832869987ULL,\n    2259211166966573997ULL, 4518422333933147995ULL, 9036844667866295990ULL,\n    18073689335732591980ULL, 3614737867146518396ULL, 7229475734293036792ULL,\n    14458951468586073584ULL, 2891790293717214716ULL, 5783580587434429433ULL,\n    11567161174868858867ULL, 2313432234973771773ULL, 4626864469947543547ULL,\n    9253728939895087094ULL, 1850745787979017418ULL, 3701491575958034837ULL,\n    7402983151916069675ULL, 14805966303832139350ULL, 2961193260766427870ULL,\n    5922386521532855740ULL, 11844773043065711480ULL, 2368954608613142296ULL,\n    4737909217226284592ULL, 9475818434452569184ULL, 1895163686890513836ULL,\n    3790327373781027673ULL, 7580654747562055347ULL, 15161309495124110694ULL,\n    3032261899024822138ULL, 6064523798049644277ULL, 12129047596099288555ULL,\n    2425809519219857711ULL, 4851619038439715422ULL, 9703238076879430844ULL,\n    1940647615375886168ULL, 3881295230751772337ULL, 7762590461503544675ULL,\n    15525180923007089351ULL, 3105036184601417870ULL, 6210072369202835740ULL,\n    12420144738405671481ULL, 2484028947681134296ULL, 4968057895362268592ULL,\n    9936115790724537184ULL, 1987223158144907436ULL, 3974446316289814873ULL,\n    7948892632579629747ULL, 15897785265159259495ULL, 3179557053031851899ULL,\n    6359114106063703798ULL, 12718228212127407596ULL, 2543645642425481519ULL,\n    5087291284850963038ULL, 10174582569701926077ULL, 2034916513940385215ULL,\n    4069833027880770430ULL, 8139666055761540861ULL, 16279332111523081723ULL,\n    3255866422304616344ULL, 6511732844609232689ULL, 13023465689218465379ULL,\n    2604693137843693075ULL, 5209386275687386151ULL, 10418772551374772303ULL,\n    2083754510274954460ULL, 4167509020549908921ULL, 8335018041099817842ULL,\n    16670036082199635685ULL, 3334007216439927137ULL, 6668014432879854274ULL,\n    13336028865759708548ULL, 2667205773151941709ULL, 5334411546303883419ULL,\n    10668823092607766838ULL, 2133764618521553367ULL, 4267529237043106735ULL,\n    8535058474086213470ULL, 17070116948172426941ULL, 3414023389634485388ULL,\n    6828046779268970776ULL, 13656093558537941553ULL, 2731218711707588310ULL,\n    5462437423415176621ULL, 10924874846830353242ULL, 2184974969366070648ULL,\n    4369949938732141297ULL, 8739899877464282594ULL, 17479799754928565188ULL,\n    3495959950985713037ULL, 6991919901971426075ULL, 13983839803942852150ULL,\n    2796767960788570430ULL, 5593535921577140860ULL, 11187071843154281720ULL,\n    2237414368630856344ULL, 4474828737261712688ULL, 8949657474523425376ULL,\n    17899314949046850752ULL, 3579862989809370150ULL, 7159725979618740301ULL,\n    14319451959237480602ULL, 2863890391847496120ULL, 5727780783694992240ULL,\n    11455561567389984481ULL, 2291112313477996896ULL, 4582224626955993792ULL,\n    9164449253911987585ULL, 1832889850782397517ULL, 3665779701564795034ULL,\n    7331559403129590068ULL, 14663118806259180136ULL, 2932623761251836027ULL,\n    5865247522503672054ULL, 11730495045007344109ULL, 2346099009001468821ULL,\n    4692198018002937643ULL, 9384396036005875287ULL, 1876879207201175057ULL,\n    3753758414402350114ULL, 7507516828804700229ULL, 15015033657609400459ULL,\n    3003006731521880091ULL, 6006013463043760183ULL, 12012026926087520367ULL,\n    2402405385217504073ULL, 4804810770435008147ULL, 9609621540870016294ULL,\n    1921924308174003258ULL, 3843848616348006517ULL, 7687697232696013035ULL,\n    15375394465392026070ULL, 3075078893078405214ULL, 6150157786156810428ULL,\n    12300315572313620856ULL, 2460063114462724171ULL, 4920126228925448342ULL,\n    9840252457850896685ULL, 1968050491570179337ULL, 3936100983140358674ULL,\n    7872201966280717348ULL, 15744403932561434696ULL, 3148880786512286939ULL,\n    6297761573024573878ULL, 12595523146049147757ULL, 2519104629209829551ULL,\n    5038209258419659102ULL, 10076418516839318205ULL, 2015283703367863641ULL,\n    4030567406735727282ULL, 8061134813471454564ULL, 16122269626942909129ULL,\n    3224453925388581825ULL, 6448907850777163651ULL, 12897815701554327303ULL,\n    2579563140310865460ULL, 5159126280621730921ULL, 10318252561243461842ULL,\n    2063650512248692368ULL, 4127301024497384737ULL, 8254602048994769474ULL,\n    16509204097989538948ULL, 3301840819597907789ULL, 6603681639195815579ULL,\n    13207363278391631158ULL, 2641472655678326231ULL, 5282945311356652463ULL,\n    10565890622713304927ULL, 2113178124542660985ULL, 4226356249085321970ULL,\n    8452712498170643941ULL, 16905424996341287883ULL, 3381084999268257576ULL,\n    6762169998536515153ULL, 13524339997073030306ULL, 2704867999414606061ULL,\n    5409735998829212122ULL, 10819471997658424245ULL, 2163894399531684849ULL,\n    4327788799063369698ULL, 8655577598126739396ULL, 17311155196253478792ULL,\n    3462231039250695758ULL, 6924462078501391516ULL, 13848924157002783033ULL,\n    2769784831400556606ULL, 5539569662801113213ULL, 11079139325602226427ULL,\n    2215827865120445285ULL, 4431655730240890570ULL, 8863311460481781141ULL,\n    17726622920963562283ULL, 3545324584192712456ULL, 7090649168385424913ULL,\n    14181298336770849826ULL, 2836259667354169965ULL, 5672519334708339930ULL,\n    11345038669416679861ULL, 2269007733883335972ULL, 4538015467766671944ULL,\n    9076030935533343889ULL, 18152061871066687778ULL, 3630412374213337555ULL,\n    7260824748426675111ULL, 14521649496853350222ULL, 2904329899370670044ULL,\n    5808659798741340089ULL, 11617319597482680178ULL, 2323463919496536035ULL,\n    4646927838993072071ULL, 9293855677986144142ULL, 1858771135597228828ULL,\n    3717542271194457656ULL, 7435084542388915313ULL, 14870169084777830627ULL,\n    2974033816955566125ULL, 5948067633911132251ULL, 11896135267822264502ULL,\n    2379227053564452900ULL, 4758454107128905800ULL, 9516908214257811601ULL,\n    1903381642851562320ULL, 3806763285703124640ULL, 7613526571406249281ULL,\n    15227053142812498563ULL, 3045410628562499712ULL, 6090821257124999425ULL,\n    12181642514249998850ULL, 2436328502849999770ULL, 4872657005699999540ULL,\n    9745314011399999080ULL, 1949062802279999816ULL, 3898125604559999632ULL,\n    7796251209119999264ULL, 15592502418239998528ULL, 3118500483647999705ULL,\n    6237000967295999411ULL, 12474001934591998822ULL, 2494800386918399764ULL,\n    4989600773836799529ULL, 9979201547673599058ULL, 1995840309534719811ULL,\n    3991680619069439623ULL, 7983361238138879246ULL, 15966722476277758493ULL,\n    3193344495255551698ULL, 6386688990511103397ULL, 12773377981022206794ULL,\n    2554675596204441358ULL, 5109351192408882717ULL, 10218702384817765435ULL,\n    2043740476963553087ULL, 4087480953927106174ULL, 8174961907854212348ULL,\n    16349923815708424697ULL, 3269984763141684939ULL, 6539969526283369878ULL,\n    13079939052566739757ULL, 2615987810513347951ULL, 5231975621026695903ULL,\n    10463951242053391806ULL, 2092790248410678361ULL, 4185580496821356722ULL,\n    8371160993642713444ULL, 16742321987285426889ULL, 3348464397457085377ULL,\n    6696928794914170755ULL, 13393857589828341511ULL, 2678771517965668302ULL,\n    5357543035931336604ULL, 10715086071862673209ULL, 2143017214372534641ULL,\n    4286034428745069283ULL, 8572068857490138567ULL, 17144137714980277135ULL,\n    3428827542996055427ULL, 6857655085992110854ULL, 13715310171984221708ULL,\n    2743062034396844341ULL, 5486124068793688683ULL, 10972248137587377366ULL,\n    2194449627517475473ULL, 4388899255034950946ULL, 8777798510069901893ULL,\n    17555597020139803786ULL, 3511119404027960757ULL, 7022238808055921514ULL,\n    14044477616111843029ULL, 2808895523222368605ULL, 5617791046444737211ULL,\n    11235582092889474423ULL, 2247116418577894884ULL, 4494232837155789769ULL,\n    8988465674311579538ULL, 17976931348623159077ULL, 3595386269724631815ULL,\n    7190772539449263630ULL, 14381545078898527261ULL, 2876309015779705452ULL,\n    5752618031559410904ULL, 11505236063118821809ULL, 2301047212623764361ULL,\n    4602094425247528723ULL, 9204188850495057447ULL, 1840837770099011489ULL,\n    3681675540198022979ULL, 7363351080396045958ULL,\n};\n\nstatic const int32_t Formatter_TensExponentTable[] =\n{\n    -323, -323, -322, -322, -322, -322, -321, -321, -321, -320, -320, -320,\n    -319, -319, -319, -319, -318, -318, -318, -317, -317, -317, -316, -316,\n    -316, -316, -315, -315, -315, -314, -314, -314, -313, -313, -313, -313,\n    -312, -312, -312, -311, -311, -311, -310, -310, -310, -310, -309, -309,\n    -309, -308, -308, -308, -307, -307, -307, -307, -306, -306, -306, -305,\n    -305, -305, -304, -304, -304, -304, -303, -303, -303, -302, -302, -302,\n    -301, -301, -301, -301, -300, -300, -300, -299, -299, -299, -298, -298,\n    -298, -298, -297, -297, -297, -296, -296, -296, -295, -295, -295, -295,\n    -294, -294, -294, -293, -293, -293, -292, -292, -292, -291, -291, -291,\n    -291, -290, -290, -290, -289, -289, -289, -288, -288, -288, -288, -287,\n    -287, -287, -286, -286, -286, -285, -285, -285, -285, -284, -284, -284,\n    -283, -283, -283, -282, -282, -282, -282, -281, -281, -281, -280, -280,\n    -280, -279, -279, -279, -279, -278, -278, -278, -277, -277, -277, -276,\n    -276, -276, -276, -275, -275, -275, -274, -274, -274, -273, -273, -273,\n    -273, -272, -272, -272, -271, -271, -271, -270, -270, -270, -270, -269,\n    -269, -269, -268, -268, -268, -267, -267, -267, -267, -266, -266, -266,\n    -265, -265, -265, -264, -264, -264, -263, -263, -263, -263, -262, -262,\n    -262, -261, -261, -261, -260, -260, -260, -260, -259, -259, -259, -258,\n    -258, -258, -257, -257, -257, -257, -256, -256, -256, -255, -255, -255,\n    -254, -254, -254, -254, -253, -253, -253, -252, -252, -252, -251, -251,\n    -251, -251, -250, -250, -250, -249, -249, -249, -248, -248, -248, -248,\n    -247, -247, -247, -246, -246, -246, -245, -245, -245, -245, -244, -244,\n    -244, -243, -243, -243, -242, -242, -242, -242, -241, -241, -241, -240,\n    -240, -240, -239, -239, -239, -239, -238, -238, -238, -237, -237, -237,\n    -236, -236, -236, -235, -235, -235, -235, -234, -234, -234, -233, -233,\n    -233, -232, -232, -232, -232, -231, -231, -231, -230, -230, -230, -229,\n    -229, -229, -229, -228, -228, -228, -227, -227, -227, -226, -226, -226,\n    -226, -225, -225, -225, -224, -224, -224, -223, -223, -223, -223, -222,\n    -222, -222, -221, -221, -221, -220, -220, -220, -220, -219, -219, -219,\n    -218, -218, -218, -217, -217, -217, -217, -216, -216, -216, -215, -215,\n    -215, -214, -214, -214, -214, -213, -213, -213, -212, -212, -212, -211,\n    -211, -211, -211, -210, -210, -210, -209, -209, -209, -208, -208, -208,\n    -208, -207, -207, -207, -206, -206, -206, -205, -205, -205, -204, -204,\n    -204, -204, -203, -203, -203, -202, -202, -202, -201, -201, -201, -201,\n    -200, -200, -200, -199, -199, -199, -198, -198, -198, -198, -197, -197,\n    -197, -196, -196, -196, -195, -195, -195, -195, -194, -194, -194, -193,\n    -193, -193, -192, -192, -192, -192, -191, -191, -191, -190, -190, -190,\n    -189, -189, -189, -189, -188, -188, -188, -187, -187, -187, -186, -186,\n    -186, -186, -185, -185, -185, -184, -184, -184, -183, -183, -183, -183,\n    -182, -182, -182, -181, -181, -181, -180, -180, -180, -180, -179, -179,\n    -179, -178, -178, -178, -177, -177, -177, -176, -176, -176, -176, -175,\n    -175, -175, -174, -174, -174, -173, -173, -173, -173, -172, -172, -172,\n    -171, -171, -171, -170, -170, -170, -170, -169, -169, -169, -168, -168,\n    -168, -167, -167, -167, -167, -166, -166, -166, -165, -165, -165, -164,\n    -164, -164, -164, -163, -163, -163, -162, -162, -162, -161, -161, -161,\n    -161, -160, -160, -160, -159, -159, -159, -158, -158, -158, -158, -157,\n    -157, -157, -156, -156, -156, -155, -155, -155, -155, -154, -154, -154,\n    -153, -153, -153, -152, -152, -152, -152, -151, -151, -151, -150, -150,\n    -150, -149, -149, -149, -149, -148, -148, -148, -147, -147, -147, -146,\n    -146, -146, -145, -145, -145, -145, -144, -144, -144, -143, -143, -143,\n    -142, -142, -142, -142, -141, -141, -141, -140, -140, -140, -139, -139,\n    -139, -139, -138, -138, -138, -137, -137, -137, -136, -136, -136, -136,\n    -135, -135, -135, -134, -134, -134, -133, -133, -133, -133, -132, -132,\n    -132, -131, -131, -131, -130, -130, -130, -130, -129, -129, -129, -128,\n    -128, -128, -127, -127, -127, -127, -126, -126, -126, -125, -125, -125,\n    -124, -124, -124, -124, -123, -123, -123, -122, -122, -122, -121, -121,\n    -121, -121, -120, -120, -120, -119, -119, -119, -118, -118, -118, -117,\n    -117, -117, -117, -116, -116, -116, -115, -115, -115, -114, -114, -114,\n    -114, -113, -113, -113, -112, -112, -112, -111, -111, -111, -111, -110,\n    -110, -110, -109, -109, -109, -108, -108, -108, -108, -107, -107, -107,\n    -106, -106, -106, -105, -105, -105, -105, -104, -104, -104, -103, -103,\n    -103, -102, -102, -102, -102, -101, -101, -101, -100, -100, -100, -99,\n    -99, -99, -99, -98, -98, -98, -97, -97, -97, -96, -96, -96,\n    -96, -95, -95, -95, -94, -94, -94, -93, -93, -93, -93, -92,\n    -92, -92, -91, -91, -91, -90, -90, -90, -89, -89, -89, -89,\n    -88, -88, -88, -87, -87, -87, -86, -86, -86, -86, -85, -85,\n    -85, -84, -84, -84, -83, -83, -83, -83, -82, -82, -82, -81,\n    -81, -81, -80, -80, -80, -80, -79, -79, -79, -78, -78, -78,\n    -77, -77, -77, -77, -76, -76, -76, -75, -75, -75, -74, -74,\n    -74, -74, -73, -73, -73, -72, -72, -72, -71, -71, -71, -71,\n    -70, -70, -70, -69, -69, -69, -68, -68, -68, -68, -67, -67,\n    -67, -66, -66, -66, -65, -65, -65, -65, -64, -64, -64, -63,\n    -63, -63, -62, -62, -62, -62, -61, -61, -61, -60, -60, -60,\n    -59, -59, -59, -58, -58, -58, -58, -57, -57, -57, -56, -56,\n    -56, -55, -55, -55, -55, -54, -54, -54, -53, -53, -53, -52,\n    -52, -52, -52, -51, -51, -51, -50, -50, -50, -49, -49, -49,\n    -49, -48, -48, -48, -47, -47, -47, -46, -46, -46, -46, -45,\n    -45, -45, -44, -44, -44, -43, -43, -43, -43, -42, -42, -42,\n    -41, -41, -41, -40, -40, -40, -40, -39, -39, -39, -38, -38,\n    -38, -37, -37, -37, -37, -36, -36, -36, -35, -35, -35, -34,\n    -34, -34, -34, -33, -33, -33, -32, -32, -32, -31, -31, -31,\n    -30, -30, -30, -30, -29, -29, -29, -28, -28, -28, -27, -27,\n    -27, -27, -26, -26, -26, -25, -25, -25, -24, -24, -24, -24,\n    -23, -23, -23, -22, -22, -22, -21, -21, -21, -21, -20, -20,\n    -20, -19, -19, -19, -18, -18, -18, -18, -17, -17, -17, -16,\n    -16, -16, -15, -15, -15, -15, -14, -14, -14, -13, -13, -13,\n    -12, -12, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9,\n    -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, -6, -6,\n    -5, -5, -5, -4, -4, -4, -3, -3, -3, -3, -2, -2,\n    -2, -1, -1, -1, 0, 0, 0, 1, 1, 1, 1, 2,\n    2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5,\n    6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9,\n    9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13,\n    13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16,\n    16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20,\n    20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23,\n    24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 27, 27,\n    27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 31,\n    31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34,\n    35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38,\n    38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 41,\n    42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45,\n    45, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 49,\n    49, 49, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52,\n    53, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56,\n    56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60,\n    60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63,\n    63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 66, 67,\n    67, 67, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70,\n    71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 74, 74,\n    74, 75, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78,\n    78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81,\n    81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 84, 85,\n    85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 88, 88,\n    89, 89, 89, 90, 90, 90, 91, 91, 91, 91, 92, 92,\n    92, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 96,\n    96, 96, 97, 97, 97, 97, 98, 98, 98, 99, 99, 99,\n    100, 100, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103,\n    103, 103, 104, 104, 104, 105, 105, 105, 106, 106, 106, 106,\n    107, 107, 107, 108, 108, 108, 109, 109, 109, 109, 110, 110,\n    110, 111, 111, 111, 112, 112, 112, 112, 113, 113, 113, 114,\n    114, 114, 115, 115, 115, 116, 116, 116, 116, 117, 117, 117,\n    118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 121, 121,\n    121, 122, 122, 122, 122, 123, 123, 123, 124, 124, 124, 125,\n    125, 125, 125, 126, 126, 126, 127, 127, 127, 128, 128, 128,\n    128, 129, 129, 129, 130, 130, 130, 131, 131, 131, 131, 132,\n    132, 132, 133, 133, 133, 134, 134, 134, 134, 135, 135, 135,\n    136, 136, 136, 137, 137, 137, 137, 138, 138, 138, 139, 139,\n    139, 140, 140, 140, 140, 141, 141, 141, 142, 142, 142, 143,\n    143, 143, 143, 144, 144, 144, 145, 145, 145, 146, 146, 146,\n    147, 147, 147, 147, 148, 148, 148, 149, 149, 149, 150, 150,\n    150, 150, 151, 151, 151, 152, 152, 152, 153, 153, 153, 153,\n    154, 154, 154, 155, 155, 155, 156, 156, 156, 156, 157, 157,\n    157, 158, 158, 158, 159, 159, 159, 159, 160, 160, 160, 161,\n    161, 161, 162, 162, 162, 162, 163, 163, 163, 164, 164, 164,\n    165, 165, 165, 165, 166, 166, 166, 167, 167, 167, 168, 168,\n    168, 168, 169, 169, 169, 170, 170, 170, 171, 171, 171, 171,\n    172, 172, 172, 173, 173, 173, 174, 174, 174, 175, 175, 175,\n    175, 176, 176, 176, 177, 177, 177, 178, 178, 178, 178, 179,\n    179, 179, 180, 180, 180, 181, 181, 181, 181, 182, 182, 182,\n    183, 183, 183, 184, 184, 184, 184, 185, 185, 185, 186, 186,\n    186, 187, 187, 187, 187, 188, 188, 188, 189, 189, 189, 190,\n    190, 190, 190, 191, 191, 191, 192, 192, 192, 193, 193, 193,\n    193, 194, 194, 194, 195, 195, 195, 196, 196, 196, 196, 197,\n    197, 197, 198, 198, 198, 199, 199, 199, 199, 200, 200, 200,\n    201, 201, 201, 202, 202, 202, 202, 203, 203, 203, 204, 204,\n    204, 205, 205, 205, 206, 206, 206, 206, 207, 207, 207, 208,\n    208, 208, 209, 209, 209, 209, 210, 210, 210, 211, 211, 211,\n    212, 212, 212, 212, 213, 213, 213, 214, 214, 214, 215, 215,\n    215, 215, 216, 216, 216, 217, 217, 217, 218, 218, 218, 218,\n    219, 219, 219, 220, 220, 220, 221, 221, 221, 221, 222, 222,\n    222, 223, 223, 223, 224, 224, 224, 224, 225, 225, 225, 226,\n    226, 226, 227, 227, 227, 227, 228, 228, 228, 229, 229, 229,\n    230, 230, 230, 230, 231, 231, 231, 232, 232, 232, 233, 233,\n    233, 234, 234, 234, 234, 235, 235, 235, 236, 236, 236, 237,\n    237, 237, 237, 238, 238, 238, 239, 239, 239, 240, 240, 240,\n    240, 241, 241, 241, 242, 242, 242, 243, 243, 243, 243, 244,\n    244, 244, 245, 245, 245, 246, 246, 246, 246, 247, 247, 247,\n    248, 248, 248, 249, 249, 249, 249, 250, 250, 250, 251, 251,\n    251, 252, 252, 252, 252, 253, 253, 253, 254, 254, 254, 255,\n    255, 255, 255, 256, 256, 256, 257, 257, 257, 258, 258, 258,\n    258, 259, 259, 259, 260, 260, 260, 261, 261, 261, 261, 262,\n    262, 262, 263, 263, 263, 264, 264, 264, 265, 265, 265, 265,\n    266, 266, 266, 267, 267, 267, 268, 268, 268, 268, 269, 269,\n    269, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 273,\n    273, 273, 274, 274, 274, 274, 275, 275, 275, 276, 276, 276,\n    277, 277, 277, 277, 278, 278, 278, 279, 279, 279, 280, 280,\n    280, 280, 281, 281, 281, 282, 282, 282, 283, 283, 283, 283,\n    284, 284, 284, 285, 285, 285, 286, 286, 286, 286, 287, 287,\n    287, 288, 288, 288, 289, 289, 289, 289, 290, 290, 290, 291,\n    291, 291, 292, 292, 292, 293, 293, 293,\n};\n\nstatic const int16_t Formatter_DigitLowerTable[] =\n{\n    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'\n};\n\nstatic const int16_t Formatter_DigitUpperTable[] =\n{\n    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'\n};\n\nstatic const int64_t Formatter_TenPowersList[] =\n{\n    1LL,\n    10LL,\n    100LL,\n    1000LL,\n    10000LL,\n    100000LL,\n    1000000LL,\n    10000000LL,\n    100000000LL,\n    1000000000LL,\n    10000000000LL,\n    100000000000LL,\n    1000000000000LL,\n    10000000000000LL,\n    100000000000000LL,\n    1000000000000000LL,\n    10000000000000000LL,\n    100000000000000000LL,\n    1000000000000000000LL,\n};\n\n// DecHexDigits s a translation table from a decimal number to its\n// digits hexadecimal representation (e.g. DecHexDigits [34] = 0x34).\nstatic const int32_t Formatter_DecHexDigits[] =\n{\n    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,\n    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,\n    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,\n    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,\n    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,\n    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,\n    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,\n    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,\n    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,\n    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,\n};\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/object-internals.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include <stdint.h>\n#include <stddef.h>\n#include \"class-internals.h\"\n\nstruct Il2CppClass;\nstruct MethodInfo;\nstruct PropertyInfo;\nstruct FieldInfo;\nstruct EventInfo;\nstruct Il2CppType;\nstruct Il2CppAssembly;\nstruct Il2CppException;\nstruct Il2CppImage;\nstruct Il2CppDomain;\nstruct Il2CppString;\nstruct Il2CppReflectionMethod;\nstruct Il2CppAsyncCall;\nstruct Il2CppIUnknown;\nstruct Il2CppWaitHandle;\nstruct MonitorData;\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class FastMutex;\n    class Thread;\n}\n}\n\nstruct Il2CppReflectionAssembly;\n\nstruct Il2CppObject\n{\n    Il2CppClass *klass;\n    MonitorData *monitor;\n};\n\ntypedef int32_t il2cpp_array_lower_bound_t;\n#define IL2CPP_ARRAY_MAX_INDEX ((int32_t) 0x7fffffff)\n#define IL2CPP_ARRAY_MAX_SIZE  ((uint32_t) 0xffffffff)\n\nstruct Il2CppArrayBounds\n{\n    il2cpp_array_size_t length;\n    il2cpp_array_lower_bound_t lower_bound;\n};\n\n#if IL2CPP_COMPILER_MSVC\n#pragma warning( push )\n#pragma warning( disable : 4200 )\n#elif defined(__clang__)\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Winvalid-offsetof\"\n#endif\n\nstruct Il2CppArray : public Il2CppObject\n{\n    /* bounds is NULL for szarrays */\n    Il2CppArrayBounds *bounds;\n    /* total number of elements of the array */\n    il2cpp_array_size_t max_length;\n};\n\nstruct Il2CppArraySize : public Il2CppArray\n{\n    ALIGN_TYPE(8) void* vector;\n};\n\nconst size_t kIl2CppSizeOfArray = (offsetof(Il2CppArraySize, vector));\nconst size_t kIl2CppOffsetOfArrayBounds = (offsetof(Il2CppArray, bounds));\nconst size_t kIl2CppOffsetOfArrayLength = (offsetof(Il2CppArray, max_length));\n\n\n// System.String\nstruct Il2CppString\n{\n    Il2CppObject object;\n    int32_t length;                             ///< Length of string *excluding* the trailing null (which is included in 'chars').\n    Il2CppChar chars[IL2CPP_ZERO_LEN_ARRAY];\n};\n\n#if IL2CPP_COMPILER_MSVC\n#pragma warning( pop )\n#elif defined(__clang__)\n#pragma clang diagnostic pop\n#endif\n\n#define IL2CPP_OBJECT_SETREF(obj, fieldname, value) do {\\\n        /* mono_gc_wbarrier_set_field ((MonoObject*)(obj), &((obj)->fieldname), (MonoObject*)value); */ \\\n        (obj)->fieldname = (value); \\\n    } while (0)\n\n/* This should be used if 's' can reside on the heap */\n#define IL2CPP_STRUCT_SETREF(s, field, value) do {\\\n        /* mono_gc_wbarrier_generic_store (&((s)->field), (MonoObject*)(value)); */ \\\n        (s)->field = (value); \\\n    } while (0)\n\nstruct Il2CppReflectionType\n{\n    Il2CppObject object;\n    const Il2CppType *type;\n};\n\n// IMPORTANT: All managed types corresponding to the objects below must be blacklisted in mscorlib.xml\n\n#if NET_4_0\n// System.RuntimeType\nstruct Il2CppReflectionRuntimeType\n{\n    Il2CppReflectionType type;\n    Il2CppObject *type_info;\n    Il2CppObject* genericCache;\n    Il2CppObject* serializationCtor;\n};\n#endif\n\n// System.MonoType\nstruct Il2CppReflectionMonoType\n{\n#if !NET_4_0\n    Il2CppReflectionType type;\n    Il2CppObject *type_info;\n#else\n    Il2CppReflectionRuntimeType type;\n#endif\n\n    const Il2CppType* GetIl2CppType() const\n    {\n#if !NET_4_0\n        return type.type;\n#else\n        return type.type.type;\n#endif\n    }\n};\n\n// System.Reflection.EventInfo\nstruct Il2CppReflectionEvent\n{\n    Il2CppObject object;\n    Il2CppObject *cached_add_event;\n};\n\n// System.Reflection.MonoEvent\nstruct Il2CppReflectionMonoEvent\n{\n    Il2CppReflectionEvent event;\n    Il2CppReflectionType* reflectedType;\n    const EventInfo* eventInfo;\n};\n\n// System.Reflection.MonoEventInfo\nstruct Il2CppReflectionMonoEventInfo\n{\n    Il2CppReflectionType* declaringType;\n    Il2CppReflectionType* reflectedType;\n    Il2CppString* name;\n    Il2CppReflectionMethod* addMethod;\n    Il2CppReflectionMethod* removeMethod;\n    Il2CppReflectionMethod* raiseMethod;\n    uint32_t eventAttributes;\n    Il2CppArray* otherMethods;\n};\n\n#if !NET_4_0\n// System.MonoEnumInfo\nstruct Il2CppEnumInfo\n{\n    Il2CppReflectionType *utype;\n    Il2CppArray *values;\n    Il2CppArray *names;\n    void* name_hash;\n};\n#endif\n\n// System.Reflection.MonoField\nstruct Il2CppReflectionField\n{\n    Il2CppObject object;\n    Il2CppClass *klass;\n    FieldInfo *field;\n    Il2CppString *name;\n    Il2CppReflectionType *type;\n    uint32_t attrs;\n};\n\n// System.Reflection.MonoProperty\nstruct Il2CppReflectionProperty\n{\n    Il2CppObject object;\n    Il2CppClass *klass;\n    const PropertyInfo *property;\n};\n\n// System.Reflection.MonoMethod\nstruct Il2CppReflectionMethod\n{\n    Il2CppObject object;\n    const MethodInfo *method;\n    Il2CppString *name;\n    Il2CppReflectionType *reftype;\n};\n\n// System.Reflection.MonoGenericMethod\nstruct Il2CppReflectionGenericMethod\n{\n    Il2CppReflectionMethod base;\n};\n\n// System.Reflection.MonoMethodInfo\nstruct Il2CppMethodInfo\n{\n    Il2CppReflectionType *parent;\n    Il2CppReflectionType *ret;\n    uint32_t attrs;\n    uint32_t implattrs;\n    uint32_t callconv;\n};\n\n// System.Reflection.MonoPropertyInfo\nstruct Il2CppPropertyInfo\n{\n    Il2CppReflectionType* parent;\n#if NET_4_0\n    Il2CppReflectionType* declaringType;\n#endif\n    Il2CppString *name;\n    Il2CppReflectionMethod *get;\n    Il2CppReflectionMethod *set;\n    uint32_t attrs;\n};\n\n// System.Reflection.ParameterInfo\nstruct Il2CppReflectionParameter\n{\n    Il2CppObject object;\n    Il2CppReflectionType *ClassImpl;\n    Il2CppObject *DefaultValueImpl;\n    Il2CppObject *MemberImpl;\n    Il2CppString *NameImpl;\n    int32_t PositionImpl;\n    uint32_t AttrsImpl;\n    Il2CppObject *MarshalAsImpl;\n};\n\n// System.Reflection.Module\nstruct Il2CppReflectionModule\n{\n    Il2CppObject obj;\n    const Il2CppImage* image;\n    Il2CppReflectionAssembly* assembly;\n    Il2CppString* fqname;\n    Il2CppString* name;\n    Il2CppString* scopename;\n    bool is_resource;\n    uint32_t token;\n};\n\n// System.Reflection.AssemblyName\nstruct Il2CppReflectionAssemblyName\n{\n    Il2CppObject  obj;\n    Il2CppString *name;\n    Il2CppString *codebase;\n    int32_t major, minor, build, revision;\n    Il2CppObject  *cultureInfo;\n    uint32_t     flags;\n    uint32_t     hashalg;\n    Il2CppObject  *keypair;\n    Il2CppArray   *publicKey;\n    Il2CppArray   *keyToken;\n    uint32_t     versioncompat;\n    Il2CppObject *version;\n    uint32_t     processor_architecture;\n#if NET_4_0\n    uint32_t contentType;\n#endif\n};\n\n// System.Reflection.Assembly\nstruct Il2CppReflectionAssembly\n{\n    Il2CppObject object;\n    const Il2CppAssembly *assembly;\n    Il2CppObject *resolve_event_holder;\n    /* CAS related */\n    Il2CppObject *evidence; /* Evidence */\n    Il2CppObject *minimum;  /* PermissionSet - for SecurityAction.RequestMinimum */\n    Il2CppObject *optional; /* PermissionSet - for SecurityAction.RequestOptional */\n    Il2CppObject *refuse;   /* PermissionSet - for SecurityAction.RequestRefuse */\n    Il2CppObject *granted;  /* PermissionSet - for the resolved assembly granted permissions */\n    Il2CppObject *denied;   /* PermissionSet - for the resolved assembly denied permissions */\n    /* */\n    bool from_byte_array;\n    Il2CppString *name;\n};\n\n// System.Reflection.Emit.UnmanagedMarshal\nstruct Il2CppReflectionMarshal\n{\n    Il2CppObject object;\n    int32_t count;\n    int32_t type;\n    int32_t eltype;\n    Il2CppString* guid;\n    Il2CppString* mcookie;\n    Il2CppString* marshaltype;\n    Il2CppObject* marshaltyperef;\n    int32_t param_num;\n    bool has_size;\n};\n\n// System.Reflection.Pointer\nstruct Il2CppReflectionPointer\n{\n    Il2CppObject object;\n    void* data;\n    Il2CppReflectionType* type;\n};\n\n// System.IntPtr\n// Just in case there is a platform where we cannot replace struct {void* val;} with void*\nstruct Il2CppIntPtr\n{\n    void* m_value;\n    static Il2CppIntPtr Zero;\n};\n\n#if NET_4_0\n// System.Threading.InternalThread\nstruct Il2CppInternalThread\n{\n    Il2CppObject obj;\n\n    int lock_thread_id;\n    il2cpp::os::Thread* handle;\n    Il2CppArray* cached_culture_info;\n    Il2CppChar* name;\n    int name_len;\n    uint32_t state;\n    Il2CppObject* abort_exc;\n    int abort_state_handle;\n    uint64_t tid;\n    void* stack_ptr;\n    void** static_data;\n    void* runtime_thread_info;\n    Il2CppObject* current_appcontext;\n    Il2CppObject* root_domain_thread;\n    Il2CppArray* _serialized_principal;\n    int _serialized_principal_version;\n    void* appdomain_refs;\n    int32_t interruption_requested;\n    il2cpp::os::FastMutex* synch_cs;\n    bool threadpool_thread;\n    bool thread_interrupt_requested;\n    int stack_size;\n    uint8_t apartment_state;\n    int critical_region_level;\n    int managed_id;\n    uint32_t small_id;\n    void* manage_callback;\n    void* interrupt_on_stop;\n    void* flags;\n    void* thread_pinning_ref;\n    void* abort_protected_block_count;\n    void* unused1;\n    void* unused2;\n    void* last;\n};\n\n/* Keep in sync with System.IOSelectorJob in mcs/class/System/System/IOSelectorJob.cs */\nstruct Il2CppIOSelectorJob\n{\n    Il2CppObject object;\n    int32_t operation;\n    Il2CppObject *callback;\n    Il2CppObject *state;\n};\n\n/* This is a copy of System.Runtime.Remoting.Messaging.CallType */\ntypedef enum\n{\n    CallType_Sync = 0,\n    CallType_BeginInvoke = 1,\n    CallType_EndInvoke = 2,\n    CallType_OneWay = 3\n} Il2CppCallType;\n\nstruct Il2CppMethodMessage\n{\n    Il2CppObject obj;\n    Il2CppReflectionMethod *method;\n    Il2CppArray  *args;\n    Il2CppArray  *names;\n    Il2CppArray  *arg_types;\n    Il2CppObject *ctx;\n    Il2CppObject *rval;\n    Il2CppObject *exc;\n    Il2CppAsyncResult *async_result;\n    uint32_t        call_type;\n};\n\n#endif\n\n/* This is a copy of System.AppDomainSetup */\nstruct Il2CppAppDomainSetup\n{\n    Il2CppObject object;\n    Il2CppString* application_base;\n    Il2CppString* application_name;\n    Il2CppString* cache_path;\n    Il2CppString* configuration_file;\n    Il2CppString* dynamic_base;\n    Il2CppString* license_file;\n    Il2CppString* private_bin_path;\n    Il2CppString* private_bin_path_probe;\n    Il2CppString* shadow_copy_directories;\n    Il2CppString* shadow_copy_files;\n    uint8_t publisher_policy;\n    uint8_t path_changed;\n    int loader_optimization;\n    uint8_t disallow_binding_redirects;\n    uint8_t disallow_code_downloads;\n    Il2CppObject* activation_arguments; /* it is System.Object in 1.x, ActivationArguments in 2.0 */\n    Il2CppObject* domain_initializer;\n    Il2CppObject* application_trust; /* it is System.Object in 1.x, ApplicationTrust in 2.0 */\n    Il2CppArray* domain_initializer_args;\n    uint8_t disallow_appbase_probe;\n    Il2CppArray* configuration_bytes;\n#if NET_4_0\n    Il2CppArray* serialized_non_primitives;\n#endif\n};\n\n\n// System.Threading.Thread\nstruct Il2CppThread\n{\n    Il2CppObject  obj;\n#if !NET_4_0\n    int         lock_thread_id; /* to be used as the pre-shifted thread id in thin locks */\n    il2cpp::os::Thread* handle;\n    Il2CppArray  *cached_culture_info;\n    void*    unused1;\n    bool threadpool_thread;//bool threadpool_thread;\n    Il2CppChar* name;\n    uint32_t name_len;\n    uint32_t        state;\n    Il2CppObject* abort_exc;//MonoException *abort_exc;\n    int abort_state_handle;\n    uint64_t tid;   /* This is accessed as a gsize in the code (so it can hold a 64bit pointer on systems that need it), but needs to reserve 64 bits of space on all machines as it corresponds to a field in managed code */\n    void*       start_notify;\n    void* stack_ptr;\n    void* *static_data;\n    void* jit_data;\n    void* lock_data;\n    Il2CppObject* current_appcontext;//MonoAppContext *current_appcontext;\n    int stack_size;\n    Il2CppObject* start_obj;//MonoObject *start_obj;\n    void* appdomain_refs;//GSList *appdomain_refs;\n    ///* This is modified using atomic ops, so keep it a int32_t */\n    int32_t interruption_requested;\n    void* suspend_event;\n    void* suspended_event;\n    void* resume_event;\n    il2cpp::os::FastMutex* synch_cs;\n    uint8_t* serialized_culture_info;\n    uint32_t serialized_culture_info_len;\n    uint8_t* serialized_ui_culture_info;\n    uint32_t serialized_ui_culture_info_len;\n    bool thread_dump_requested;//bool thread_dump_requested;\n    void* end_stack; /* This is only used when running in the debugger. */\n    bool thread_interrupt_requested;//bool thread_interrupt_requested;\n    uint8_t apartment_state;\n    int32_t critical_region_level;\n    uint32_t small_id; /* A small, unique id, used for the hazard pointer table. */\n    void* manage_callback;\n    Il2CppException *pending_exception;\n    Il2CppObject *ec_to_set;\n    ///*\n    // * These fields are used to avoid having to increment corlib versions\n    // * when a new field is added to the unmanaged MonoThread structure.\n    // */\n    void* interrupt_on_stop;\n    uintptr_t flags;\n    void* unused4;\n    void* unused5;\n    void* unused6;\n    Il2CppObject* threadstart;\n    int managed_id;\n    Il2CppObject* principal;\n    bool in_currentculture;\n#else\n    Il2CppInternalThread* internal_thread;\n    Il2CppObject* start_obj;\n    Il2CppObject* pending_exception;\n    int32_t priority;\n    Il2CppObject* principal;\n    int32_t principal_version;\n    Il2CppDelegate* delegate;\n    Il2CppObject* executionContext;\n    bool executionContextBelongsToOuterScope;\n#endif\n\n#if !NET_4_0\n    Il2CppThread* GetInternalThread()\n    {\n        return this;\n    }\n\n#else\n    Il2CppInternalThread* GetInternalThread() const\n    {\n        return internal_thread;\n    }\n\n#endif\n};\n\n// System.Exception\nstruct Il2CppException : public Il2CppObject\n{\n#if !NET_4_0\n    /* Stores the IPs and the generic sharing infos\n       (vtable/MRGCTX) of the frames. */\n    Il2CppArray *trace_ips;\n    Il2CppException *inner_ex;\n    Il2CppString *message;\n    Il2CppString *help_link;\n    Il2CppString *class_name;\n    Il2CppString *stack_trace;\n    Il2CppString *remote_stack_trace;\n    int32_t    remote_stack_index;\n    il2cpp_hresult_t hresult;\n    Il2CppString *source;\n    Il2CppObject *_data;\n#else\n    Il2CppString* className;\n    Il2CppString* message;\n    Il2CppObject* _data;\n    Il2CppException* inner_ex;\n    Il2CppString* _helpURL;\n    Il2CppArray* trace_ips;\n    Il2CppString* stack_trace;\n    Il2CppString* remote_stack_trace;\n    int remote_stack_index;\n    Il2CppObject* _dynamicMethods;\n    il2cpp_hresult_t hresult;\n    Il2CppString* source;\n    Il2CppObject* safeSerializationManager;\n    Il2CppArray* captured_traces;\n    Il2CppArray* native_trace_ips;\n#endif\n};\n\n// System.SystemException\nstruct Il2CppSystemException\n{\n    Il2CppException base;\n};\n\n// System.ArgumentException\nstruct Il2CppArgumentException\n{\n    Il2CppException base;\n    Il2CppString *argName;\n};\n\n// System.TypedReference\nstruct Il2CppTypedRef\n{\n    Il2CppType *type;\n    void*  value;\n    Il2CppClass *klass;\n};\n\n// System.Delegate\nstruct Il2CppDelegate\n{\n    Il2CppObject object;\n    /* The compiled code of the target method */\n    Il2CppMethodPointer method_ptr;\n    /* The invoke code */\n    InvokerMethod invoke_impl;\n    Il2CppObject *target;\n\n#if RUNTIME_MONO\n    const MonoMethod *method;\n#else\n    const MethodInfo *method;\n#endif\n\n    void* delegate_trampoline;\n\n#if NET_4_0\n    Il2CppIntPtr extraArg;\n#endif\n\n    /*\n     * If non-NULL, this points to a memory location which stores the address of\n     * the compiled code of the method, or NULL if it is not yet compiled.\n     */\n    uint8_t **method_code;\n    Il2CppReflectionMethod *method_info;\n    Il2CppReflectionMethod *original_method_info;\n    Il2CppObject *data;\n\n#if NET_4_0\n    bool method_is_virtual;\n#endif\n};\n\n#if NET_4_0\nstruct Il2CppMulticastDelegate\n{\n    Il2CppDelegate delegate;\n    Il2CppArray *delegates;\n};\n#endif\n\n// System.MarshalByRefObject\nstruct Il2CppMarshalByRefObject\n{\n    Il2CppObject obj;\n    Il2CppObject *identity;\n};\n\n// System.__Il2CppComObject (dummy type that replaces System.__ComObject)\nstruct Il2CppComObject : Il2CppObject\n{\n    Il2CppIUnknown* identity;\n};\n\n// System.AppDomain\nstruct Il2CppAppDomain\n{\n    Il2CppMarshalByRefObject mbr;\n    Il2CppDomain *data;\n};\n\n// System.Diagnostics.StackFrame\nstruct Il2CppStackFrame\n{\n    Il2CppObject obj;\n    int32_t il_offset;\n    int32_t native_offset;\n#if NET_4_0\n    uint64_t methodAddress;\n    uint32_t methodIndex;\n#endif\n    Il2CppReflectionMethod *method;\n    Il2CppString *filename;\n    int32_t line;\n    int32_t column;\n    Il2CppString *internal_method_name;\n};\n\n// System.Globalization.DateTimeFormatInfo\nstruct Il2CppDateTimeFormatInfo\n{\n    Il2CppObject obj;\n#if !NET_4_0\n    bool readOnly;\n    Il2CppString* AMDesignator;\n    Il2CppString* PMDesignator;\n    Il2CppString* DateSeparator;\n    Il2CppString* TimeSeparator;\n    Il2CppString* ShortDatePattern;\n    Il2CppString* LongDatePattern;\n    Il2CppString* ShortTimePattern;\n    Il2CppString* LongTimePattern;\n    Il2CppString* MonthDayPattern;\n    Il2CppString* YearMonthPattern;\n    Il2CppString* FullDateTimePattern;\n    Il2CppString* RFC1123Pattern;\n    Il2CppString* SortableDateTimePattern;\n    Il2CppString* UniversalSortableDateTimePattern;\n    uint32_t FirstDayOfWeek;\n    Il2CppObject* Calendar;\n    uint32_t CalendarWeekRule;\n    Il2CppArray* AbbreviatedDayNames;\n    Il2CppArray* DayNames;\n    Il2CppArray* MonthNames;\n    Il2CppArray* AbbreviatedMonthNames;\n    Il2CppArray* ShortDatePatterns;\n    Il2CppArray* LongDatePatterns;\n    Il2CppArray* ShortTimePatterns;\n    Il2CppArray* LongTimePatterns;\n    Il2CppArray* MonthDayPatterns;\n    Il2CppArray* YearMonthPatterns;\n    Il2CppArray* ShortDayNames;\n#else\n    Il2CppObject* CultureData;\n    Il2CppString* Name;\n    Il2CppString* LangName;\n    Il2CppObject* CompareInfo;\n    Il2CppObject* CultureInfo;\n    Il2CppString* AMDesignator;\n    Il2CppString* PMDesignator;\n    Il2CppString* DateSeparator;\n    Il2CppString* GeneralShortTimePattern;\n    Il2CppString* GeneralLongTimePattern;\n    Il2CppString* TimeSeparator;\n    Il2CppString* MonthDayPattern;\n    Il2CppString* DateTimeOffsetPattern;\n    Il2CppObject* Calendar;\n    uint32_t FirstDayOfWeek;\n    uint32_t CalendarWeekRule;\n    Il2CppString* FullDateTimePattern;\n    Il2CppArray* AbbreviatedDayNames;\n    Il2CppArray* ShortDayNames;\n    Il2CppArray* DayNames;\n    Il2CppArray* AbbreviatedMonthNames;\n    Il2CppArray* MonthNames;\n    Il2CppArray* GenitiveMonthNames;\n    Il2CppArray* GenitiveAbbreviatedMonthNames;\n    Il2CppArray* LeapYearMonthNames;\n    Il2CppString* LongDatePattern;\n    Il2CppString* ShortDatePattern;\n    Il2CppString* YearMonthPattern;\n    Il2CppString* LongTimePattern;\n    Il2CppString* ShortTimePattern;\n    Il2CppArray* YearMonthPatterns;\n    Il2CppArray* ShortDatePatterns;\n    Il2CppArray* LongDatePatterns;\n    Il2CppArray* ShortTimePatterns;\n    Il2CppArray* LongTimePatterns;\n    Il2CppArray* EraNames;\n    Il2CppArray* AbbrevEraNames;\n    Il2CppArray* AbbrevEnglishEraNames;\n    Il2CppArray* OptionalCalendars;\n    bool readOnly;\n    int32_t FormatFlags;\n    int32_t CultureID;\n    bool UseUserOverride;\n    bool UseCalendarInfo;\n    int32_t DataItem;\n    bool IsDefaultCalendar;\n    Il2CppArray* DateWords;\n    Il2CppString* FullTimeSpanPositivePattern;\n    Il2CppString* FullTimeSpanNegativePattern;\n    Il2CppArray* dtfiTokenHash;\n#endif\n};\n\n// System.Globalization.NumberFormatInfo\nstruct Il2CppNumberFormatInfo\n{\n    Il2CppObject obj;\n#if !NET_4_0\n    bool readOnly;\n    Il2CppString* decimalFormats;\n    Il2CppString* currencyFormats;\n    Il2CppString* percentFormats;\n    Il2CppString* digitPattern;\n    Il2CppString* zeroPattern;\n    int32_t currencyDecimalDigits;\n    Il2CppString* currencyDecimalSeparator;\n    Il2CppString* currencyGroupSeparator;\n    Il2CppArray* currencyGroupSizes;\n    int32_t currencyNegativePattern;\n    int32_t currencyPositivePattern;\n    Il2CppString* currencySymbol;\n    Il2CppString* naNSymbol;\n    Il2CppString* negativeInfinitySymbol;\n    Il2CppString* negativeSign;\n    uint32_t numberDecimalDigits;\n    Il2CppString* numberDecimalSeparator;\n    Il2CppString* numberGroupSeparator;\n    Il2CppArray* numberGroupSizes;\n    int32_t numberNegativePattern;\n    int32_t percentDecimalDigits;\n    Il2CppString* percentDecimalSeparator;\n    Il2CppString* percentGroupSeparator;\n    Il2CppArray* percentGroupSizes;\n    int32_t percentNegativePattern;\n    int32_t percentPositivePattern;\n    Il2CppString* percentSymbol;\n    Il2CppString* perMilleSymbol;\n    Il2CppString* positiveInfinitySymbol;\n    Il2CppString* positiveSign;\n#else\n    Il2CppArray* numberGroupSizes;\n    Il2CppArray* currencyGroupSizes;\n    Il2CppArray* percentGroupSizes;\n    Il2CppString* positiveSign;\n    Il2CppString* negativeSign;\n    Il2CppString* numberDecimalSeparator;\n    Il2CppString* numberGroupSeparator;\n    Il2CppString* currencyGroupSeparator;\n    Il2CppString* currencyDecimalSeparator;\n    Il2CppString* currencySymbol;\n    Il2CppString* ansiCurrencySymbol;\n    Il2CppString* naNSymbol;\n    Il2CppString* positiveInfinitySymbol;\n    Il2CppString* negativeInfinitySymbol;\n    Il2CppString* percentDecimalSeparator;\n    Il2CppString* percentGroupSeparator;\n    Il2CppString* percentSymbol;\n    Il2CppString* perMilleSymbol;\n    Il2CppArray* nativeDigits;\n    int dataItem;\n    int numberDecimalDigits;\n    int currencyDecimalDigits;\n    int currencyPositivePattern;\n    int currencyNegativePattern;\n    int numberNegativePattern;\n    int percentPositivePattern;\n    int percentNegativePattern;\n    int percentDecimalDigits;\n    int digitSubstitution;\n    bool readOnly;\n    bool useUserOverride;\n    bool isInvariant;\n    bool validForParseAsNumber;\n    bool validForParseAsCurrency;\n#endif\n};\n\n#if NET_4_0\nstruct Il2CppCultureData\n{\n    Il2CppObject obj;\n    Il2CppString *AMDesignator;\n    Il2CppString *PMDesignator;\n    Il2CppString *TimeSeparator;\n    Il2CppArray *LongTimePatterns;\n    Il2CppArray *ShortTimePatterns;\n    uint32_t FirstDayOfWeek;\n    uint32_t CalendarWeekRule;\n};\n\nstruct Il2CppCalendarData\n{\n    Il2CppObject obj;\n    Il2CppString *NativeName;\n    Il2CppArray *ShortDatePatterns;\n    Il2CppArray *YearMonthPatterns;\n    Il2CppArray *LongDatePatterns;\n    Il2CppString *MonthDayPattern;\n\n    Il2CppArray *EraNames;\n    Il2CppArray *AbbreviatedEraNames;\n    Il2CppArray *AbbreviatedEnglishEraNames;\n    Il2CppArray *DayNames;\n    Il2CppArray *AbbreviatedDayNames;\n    Il2CppArray *SuperShortDayNames;\n    Il2CppArray *MonthNames;\n    Il2CppArray *AbbreviatedMonthNames;\n    Il2CppArray *GenitiveMonthNames;\n    Il2CppArray *GenitiveAbbreviatedMonthNames;\n};\n#endif\n\n// System.Globalization.CultureInfo\nstruct Il2CppCultureInfo\n{\n    Il2CppObject obj;\n    bool is_read_only;\n    int32_t lcid;\n    int32_t parent_lcid;\n\n#if !NET_4_0\n    int32_t specific_lcid;\n#endif\n\n    int32_t datetime_index;\n    int32_t number_index;\n\n#if NET_4_0\n    int32_t default_calendar_type;\n#endif\n\n    bool use_user_override;\n    Il2CppNumberFormatInfo* number_format;\n    Il2CppDateTimeFormatInfo* datetime_format;\n    Il2CppObject* textinfo;\n    Il2CppString* name;\n\n#if !NET_4_0\n    Il2CppString* displayname;\n#endif\n\n    Il2CppString* englishname;\n    Il2CppString* nativename;\n    Il2CppString* iso3lang;\n    Il2CppString* iso2lang;\n\n#if !NET_4_0\n    Il2CppString* icu_name;\n#endif\n\n    Il2CppString* win3lang;\n    Il2CppString* territory;\n\n#if NET_4_0\n    Il2CppArray* native_calendar_names;\n#endif\n\n    Il2CppString* compareinfo;\n\n#if !NET_4_0\n    const int32_t* calendar_data;\n#endif\n\n    const void* text_info_data;\n\n#if NET_4_0\n    int dataItem;\n    Il2CppObject* calendar;\n    Il2CppObject* parent_culture;\n    bool constructed;\n    Il2CppArray* cached_serialized_form;\n    Il2CppObject* cultureData;\n    bool isInherited;\n#endif\n};\n\n// System.Globalization.RegionInfo\nstruct Il2CppRegionInfo\n{\n    Il2CppObject obj;\n#if NET_4_0\n    int32_t geo_id;\n#else\n    int32_t lcid;\n    int32_t region_id;\n#endif\n    Il2CppString* iso2name;\n    Il2CppString* iso3name;\n    Il2CppString* win3name;\n    Il2CppString* english_name;\n    Il2CppString* currency_symbol;\n    Il2CppString* iso_currency_symbol;\n    Il2CppString* currency_english_name;\n};\n\n// System.Runtime.InteropServices.SafeHandle\n// Inherited by Microsoft.Win32.SafeHandles.SafeWaitHandle\nstruct Il2CppSafeHandle\n{\n    Il2CppObject base;\n    void* handle;\n\n#if !NET_4_0\n    void* invalid_handle_value;\n    int refcount;\n    bool owns_handle;\n#else\n    int state;\n    bool owns_handle;\n    bool fullyInitialized;\n#endif\n};\n\n// System.Text.StringBuilder\nstruct Il2CppStringBuilder\n{\n    Il2CppObject object;\n\n#if !NET_4_0\n    int32_t length;\n    Il2CppString *str;\n    Il2CppString *cached_str;\n    int32_t max_capacity;\n#else\n    Il2CppArray* chunkChars;\n    Il2CppStringBuilder* chunkPrevious;\n    int chunkLength;\n    int chunkOffset;\n    int maxCapacity;\n#endif\n};\n\n// System.Net.SocketAddress\nstruct Il2CppSocketAddress\n{\n    Il2CppObject base;\n#if !NET_4_0\n    Il2CppArray* data;\n#else\n    int m_Size;\n    Il2CppArray* data;\n    bool m_changed;\n    int m_hash;\n#endif\n};\n\n// System.Globalization.SortKey\nstruct Il2CppSortKey\n{\n    Il2CppObject base;\n    Il2CppString *str;\n#if !NET_4_0\n    int32_t options;\n    Il2CppArray *key;\n#else\n    Il2CppArray *key;\n    int32_t options;\n#endif\n    int32_t lcid;\n};\n\n// System.Runtime.InteropServices.ErrorWrapper\nstruct Il2CppErrorWrapper\n{\n    Il2CppObject base;\n    int32_t errorCode;\n};\n\n// System.Runtime.Remoting.Messaging.AsyncResult\nstruct Il2CppAsyncResult\n{\n    Il2CppObject base;\n    Il2CppObject *async_state;\n    Il2CppWaitHandle *handle;\n    Il2CppDelegate *async_delegate;\n    void* data; // We pass delegate arguments here. This is repurposed. Depends on Mono C# code not using the field.\n    Il2CppAsyncCall *object_data;\n    bool  sync_completed;\n    bool  completed;\n    bool  endinvoke_called;\n    Il2CppObject *async_callback;\n    Il2CppObject *execution_context;\n    Il2CppObject *original_context;\n};\n\n// System.MonoAsyncCall\nstruct Il2CppAsyncCall\n{\n    Il2CppObject base;\n\n#if !NET_4_0\n    void *msg; // We pass exceptions through here for now.\n#else\n    Il2CppMethodMessage *msg;\n#endif\n\n    MethodInfo *cb_method; // We don't set this.\n    Il2CppDelegate *cb_target; // We pass the actual delegate here.\n    Il2CppObject *state;\n    Il2CppObject *res;\n    Il2CppArray *out_args;\n#if !NET_4_0\n    /* This is a HANDLE, we use guint64 so the managed object layout remains constant */\n    uint64_t wait_event;\n#endif\n};\n\nstruct Il2CppExceptionWrapper\n{\n#if RUNTIME_MONO\n    MonoException* ex;\n    Il2CppExceptionWrapper(MonoException* ex) : ex(ex) {}\n#else\n    Il2CppException* ex;\n    Il2CppExceptionWrapper(Il2CppException* ex) : ex(ex) {}\n#endif\n};\n\n#if NET_4_0\nstruct Il2CppIOAsyncResult\n{\n    Il2CppObject base;\n    Il2CppDelegate* callback;\n    Il2CppObject* state;\n    Il2CppWaitHandle* wait_handle;\n    bool completed_synchronously;\n    bool completed;\n};\n#endif\n\n/// Corresponds to Mono's internal System.Net.Sockets.Socket.SocketAsyncResult\n/// class. Has no relation to Il2CppAsyncResult.\nstruct Il2CppSocketAsyncResult\n{\n#if !NET_4_0\n    Il2CppObject base;\n    Il2CppObject *socket;\n    Il2CppIntPtr handle;\n    Il2CppObject *state;\n    Il2CppDelegate *callback;\n    Il2CppWaitHandle *wait_handle;\n    Il2CppException *delayedException;\n    Il2CppObject *ep;\n    Il2CppArray *buffer;\n    int32_t offset;\n    int32_t size;\n    int32_t socket_flags;\n    Il2CppObject *accept_reuse_socket;\n    Il2CppArray *addresses;\n    int32_t port;\n    Il2CppObject *buffers;\n    bool reusesocket;\n    Il2CppObject *acceptSocket;\n    int32_t total;\n    bool completed_synchronously;\n    bool completed;\n    bool blocking;\n    int32_t error;\n    int32_t operation;\n    Il2CppAsyncResult *ares;\n#else\n    Il2CppIOAsyncResult base;\n    Il2CppObject* socket;\n    int32_t operation;\n    Il2CppException* delayedException;\n    Il2CppObject* endPoint;\n    Il2CppArray* buffer;\n    int32_t offset;\n    int32_t size;\n    int32_t socket_flags;\n    Il2CppObject* acceptSocket;\n    Il2CppArray* addresses;\n    int32_t port;\n    Il2CppObject* buffers;\n    bool reuseSocket;\n    int32_t currentAddress;\n    Il2CppObject* acceptedSocket;\n    int32_t total;\n    int32_t error;\n    int32_t endCalled;\n#endif\n};\n\nenum Il2CppResourceLocation\n{\n    RESOURCE_LOCATION_EMBEDDED = 1,\n    RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,\n    RESOURCE_LOCATION_IN_MANIFEST = 4\n};\n\n// System.Reflection.ManifestResourceInfo\nstruct Il2CppManifestResourceInfo\n{\n    Il2CppObject object;\n    Il2CppReflectionAssembly* assembly;\n    Il2CppString* filename;\n    uint32_t location;\n};\n\n#define IL2CPP_CHECK_ARG_NULL(arg)  do {    \\\n    if (arg == NULL)    \\\n    {   \\\n        il2cpp::vm::Exception::Raise (il2cpp::vm::Exception::GetArgumentNullException (#arg));  \\\n    };  } while (0)\n\n// System.Runtime.Remoting.Contexts.Context\nstruct Il2CppAppContext\n{\n    Il2CppObject obj;\n    int32_t domain_id;\n    int32_t context_id;\n    void* static_data;\n};\n\n#if !NET_4_0\n// System.Decimal\ntypedef struct\n{\n    //Note that we are not taking care of endianess.\n    union\n    {\n        uint32_t ss32;\n        struct signscale\n        {\n            unsigned int reserved1 : 16;\n            unsigned int scale : 8;\n            unsigned int reserved2 : 7;\n            unsigned int sign : 1;\n        } signscale;\n    } u;\n    uint32_t hi32;\n    uint32_t lo32;\n    uint32_t mid32;\n} il2cpp_decimal_repr;\n#else\n\nstruct Il2CppDecimal\n{\n    // Decimal.cs treats the first two shorts as one long\n    // And they seriable the data so we need to little endian\n    // seriliazation\n    // The wReserved overlaps with Variant's vt member\n#if IL2CPP_BYTE_ORDER == IL2CPP_BIG_ENDIAN\n    union\n    {\n        struct\n        {\n            uint8_t sign;\n            uint8_t scale;\n        } u;\n        uint16_t signscale;\n    } u;\n    uint16_t reserved;\n#else\n    uint16_t reserved;\n    union\n    {\n        struct\n        {\n            uint8_t scale;\n            uint8_t sign;\n        } u;\n        uint16_t signscale;\n    } u;\n#endif\n    uint32_t Hi32;\n    union\n    {\n        struct\n        {\n            uint32_t Lo32;\n            uint32_t Mid32;\n        } v;\n        uint64_t Lo64;\n    } v;\n};\n\n// Structure to access an encoded double floating point\nstruct Il2CppDouble\n{\n#if IL2CPP_BYTE_ORDER == IL2CPP_BIG_ENDIAN\n    uint32_t sign : 1;\n    uint32_t exp : 11;\n    uint32_t mantHi : 20;\n    uint32_t mantLo : 32;\n#else // BIGENDIAN\n    uint32_t mantLo : 32;\n    uint32_t mantHi : 20;\n    uint32_t exp : 11;\n    uint32_t sign : 1;\n#endif\n};\n\ntypedef union\n{\n    Il2CppDouble s;\n    double d;\n} Il2CppDouble_double;\n\ntypedef enum\n{\n    IL2CPP_DECIMAL_CMP_LT = -1,\n    IL2CPP_DECIMAL_CMP_EQ,\n    IL2CPP_DECIMAL_CMP_GT\n} Il2CppDecimalCompareResult;\n\n// Structure to access an encoded single floating point\nstruct Il2CppSingle\n{\n#if IL2CPP_BYTE_ORDER == IL2CPP_BIG_ENDIAN\n    uint32_t sign : 1;\n    uint32_t exp : 8;\n    uint32_t mant : 23;\n#else\n    uint32_t mant : 23;\n    uint32_t exp : 8;\n    uint32_t sign : 1;\n#endif\n};\n\ntypedef union\n{\n    Il2CppSingle s;\n    float f;\n} Il2CppSingle_float;\n\n#endif\n// System.Guid\nstruct Il2CppGuid\n{\n    uint32_t data1;\n    uint16_t data2;\n    uint16_t data3;\n    uint8_t data4[8];\n};\n\nstruct Il2CppSafeArrayBound\n{\n    uint32_t element_count;\n    int32_t lower_bound;\n};\n\nstruct Il2CppSafeArray\n{\n    uint16_t dimention_count;\n    uint16_t features;\n    uint32_t element_size;\n    uint32_t lock_count;\n    void* data;\n    Il2CppSafeArrayBound bounds[1];\n};\n\nstruct Il2CppWin32Decimal\n{\n    uint16_t reserved;\n    union\n    {\n        struct\n        {\n            uint8_t scale;\n            uint8_t sign;\n        } s;\n        uint16_t signscale;\n    } u;\n    uint32_t hi32;\n    union\n    {\n        struct\n        {\n            uint32_t lo32;\n            uint32_t mid32;\n        } s2;\n        uint64_t lo64;\n    } u2;\n};\n\ntypedef int16_t IL2CPP_VARIANT_BOOL;\n\n#define IL2CPP_VARIANT_TRUE ((IL2CPP_VARIANT_BOOL)-1)\n#define IL2CPP_VARIANT_FALSE ((IL2CPP_VARIANT_BOOL)0)\n\nenum Il2CppVarType\n{\n    IL2CPP_VT_EMPTY = 0,\n    IL2CPP_VT_NULL = 1,\n    IL2CPP_VT_I2 = 2,\n    IL2CPP_VT_I4 = 3,\n    IL2CPP_VT_R4 = 4,\n    IL2CPP_VT_R8 = 5,\n    IL2CPP_VT_CY = 6,\n    IL2CPP_VT_DATE = 7,\n    IL2CPP_VT_BSTR = 8,\n    IL2CPP_VT_DISPATCH = 9,\n    IL2CPP_VT_ERROR = 10,\n    IL2CPP_VT_BOOL = 11,\n    IL2CPP_VT_VARIANT = 12,\n    IL2CPP_VT_UNKNOWN = 13,\n    IL2CPP_VT_DECIMAL = 14,\n    IL2CPP_VT_I1 = 16,\n    IL2CPP_VT_UI1 = 17,\n    IL2CPP_VT_UI2 = 18,\n    IL2CPP_VT_UI4 = 19,\n    IL2CPP_VT_I8 = 20,\n    IL2CPP_VT_UI8 = 21,\n    IL2CPP_VT_INT = 22,\n    IL2CPP_VT_UINT = 23,\n    IL2CPP_VT_VOID = 24,\n    IL2CPP_VT_HRESULT = 25,\n    IL2CPP_VT_PTR = 26,\n    IL2CPP_VT_SAFEARRAY = 27,\n    IL2CPP_VT_CARRAY = 28,\n    IL2CPP_VT_USERDEFINED = 29,\n    IL2CPP_VT_LPSTR = 30,\n    IL2CPP_VT_LPWSTR = 31,\n    IL2CPP_VT_RECORD = 36,\n    IL2CPP_VT_INT_PTR = 37,\n    IL2CPP_VT_UINT_PTR = 38,\n    IL2CPP_VT_FILETIME = 64,\n    IL2CPP_VT_BLOB = 65,\n    IL2CPP_VT_STREAM = 66,\n    IL2CPP_VT_STORAGE = 67,\n    IL2CPP_VT_STREAMED_OBJECT = 68,\n    IL2CPP_VT_STORED_OBJECT = 69,\n    IL2CPP_VT_BLOB_OBJECT = 70,\n    IL2CPP_VT_CF = 71,\n    IL2CPP_VT_CLSID = 72,\n    IL2CPP_VT_VERSIONED_STREAM = 73,\n    IL2CPP_VT_BSTR_BLOB = 0xfff,\n    IL2CPP_VT_VECTOR = 0x1000,\n    IL2CPP_VT_ARRAY = 0x2000,\n    IL2CPP_VT_BYREF = 0x4000,\n    IL2CPP_VT_RESERVED = 0x8000,\n    IL2CPP_VT_ILLEGAL = 0xffff,\n    IL2CPP_VT_ILLEGALMASKED = 0xfff,\n    IL2CPP_VT_TYPEMASK = 0xfff,\n};\n\nstruct Il2CppVariant\n{\n    union\n    {\n        struct __tagVARIANT\n        {\n            uint16_t type;\n            uint16_t reserved1;\n            uint16_t reserved2;\n            uint16_t reserved3;\n            union\n            {\n                int64_t llVal;\n                int32_t lVal;\n                uint8_t bVal;\n                int16_t iVal;\n                float fltVal;\n                double dblVal;\n                IL2CPP_VARIANT_BOOL boolVal;\n                int32_t scode;\n                int64_t cyVal;\n                double date;\n                Il2CppChar* bstrVal;\n                Il2CppIUnknown* punkVal;\n                void* pdispVal;\n                Il2CppSafeArray* parray;\n                uint8_t* pbVal;\n                int16_t* piVal;\n                int32_t* plVal;\n                int64_t* pllVal;\n                float* pfltVal;\n                double* pdblVal;\n                IL2CPP_VARIANT_BOOL* pboolVal;\n                int32_t* pscode;\n                int64_t* pcyVal;\n                double* pdate;\n                Il2CppChar* pbstrVal;\n                Il2CppIUnknown** ppunkVal;\n                void** ppdispVal;\n                Il2CppSafeArray** pparray;\n                Il2CppVariant* pvarVal;\n                void* byref;\n                char cVal;\n                uint16_t uiVal;\n                uint32_t ulVal;\n                uint64_t ullVal;\n                int intVal;\n                unsigned int uintVal;\n                Il2CppWin32Decimal* pdecVal;\n                char* pcVal;\n                uint16_t* puiVal;\n                uint32_t* pulVal;\n                uint64_t* pullVal;\n                int* pintVal;\n                unsigned int* puintVal;\n                struct __tagBRECORD\n                {\n                    void* pvRecord;\n                    void* pRecInfo;\n                } n4;\n            } n3;\n        } n2;\n        Il2CppWin32Decimal decVal;\n    } n1;\n};\n\nstruct Il2CppFileTime\n{\n    uint32_t low;\n    uint32_t high;\n};\n\nstruct Il2CppStatStg\n{\n    Il2CppChar* name;\n    uint32_t type;\n    uint64_t size;\n    Il2CppFileTime mtime;\n    Il2CppFileTime ctime;\n    Il2CppFileTime atime;\n    uint32_t mode;\n    uint32_t locks;\n    Il2CppGuid clsid;\n    uint32_t state;\n    uint32_t reserved;\n};\n\nstruct Il2CppHString__\n{\n    int unused;\n};\n\ntypedef Il2CppHString__* Il2CppHString;\n\nstruct Il2CppHStringHeader\n{\n    union\n    {\n        void* Reserved1;\n#if IL2CPP_SIZEOF_VOID_P == 8\n        char Reserved2[24];\n#else\n        char Reserved2[20];\n#endif\n    } Reserved;\n};\n\n\nstruct LIBIL2CPP_CODEGEN_API NOVTABLE Il2CppIUnknown\n{\n    static const Il2CppGuid IID;\n    virtual il2cpp_hresult_t STDCALL QueryInterface(const Il2CppGuid& iid, void** object) = 0;\n    virtual uint32_t STDCALL AddRef() = 0;\n    virtual uint32_t STDCALL Release() = 0;\n};\n\nstruct NOVTABLE Il2CppISequentialStream : Il2CppIUnknown\n{\n    static const LIBIL2CPP_CODEGEN_API Il2CppGuid IID;\n    virtual il2cpp_hresult_t STDCALL Read(void* buffer, uint32_t size, uint32_t* read) = 0;\n    virtual il2cpp_hresult_t STDCALL Write(const void* buffer, uint32_t size, uint32_t* written) = 0;\n};\n\nstruct NOVTABLE Il2CppIStream : Il2CppISequentialStream\n{\n    static const LIBIL2CPP_CODEGEN_API Il2CppGuid IID;\n    virtual il2cpp_hresult_t STDCALL Seek(int64_t move, uint32_t origin, uint64_t* position) = 0;\n    virtual il2cpp_hresult_t STDCALL SetSize(uint64_t size) = 0;\n    virtual il2cpp_hresult_t STDCALL CopyTo(Il2CppIStream* stream, uint64_t size, uint64_t* read, uint64_t* written) = 0;\n    virtual il2cpp_hresult_t STDCALL Commit(uint32_t flags) = 0;\n    virtual il2cpp_hresult_t STDCALL Revert() = 0;\n    virtual il2cpp_hresult_t STDCALL LockRegion(uint64_t offset, uint64_t size, uint32_t type) = 0;\n    virtual il2cpp_hresult_t STDCALL UnlockRegion(uint64_t offset, uint64_t size, uint32_t type) = 0;\n    virtual il2cpp_hresult_t STDCALL Stat(Il2CppStatStg* data, uint32_t flags) = 0;\n    virtual il2cpp_hresult_t STDCALL Clone(Il2CppIStream** stream) = 0;\n};\n\nstruct LIBIL2CPP_CODEGEN_API NOVTABLE Il2CppIMarshal : Il2CppIUnknown\n{\n    static const Il2CppGuid IID;\n    virtual il2cpp_hresult_t STDCALL GetUnmarshalClass(const Il2CppGuid& iid, void* object, uint32_t context, void* reserved, uint32_t flags, Il2CppGuid* clsid) = 0;\n    virtual il2cpp_hresult_t STDCALL GetMarshalSizeMax(const Il2CppGuid& iid, void* object, uint32_t context, void* reserved, uint32_t flags, uint32_t* size) = 0;\n    virtual il2cpp_hresult_t STDCALL MarshalInterface(Il2CppIStream* stream, const Il2CppGuid& iid, void* object, uint32_t context, void* reserved, uint32_t flags) = 0;\n    virtual il2cpp_hresult_t STDCALL UnmarshalInterface(Il2CppIStream* stream, const Il2CppGuid& iid, void** object) = 0;\n    virtual il2cpp_hresult_t STDCALL ReleaseMarshalData(Il2CppIStream* stream) = 0;\n    virtual il2cpp_hresult_t STDCALL DisconnectObject(uint32_t reserved) = 0;\n};\n\nstruct NOVTABLE Il2CppIManagedObject : Il2CppIUnknown\n{\n    static const LIBIL2CPP_CODEGEN_API Il2CppGuid IID;\n    virtual il2cpp_hresult_t STDCALL GetSerializedBuffer(Il2CppChar** bstr) = 0;\n    virtual il2cpp_hresult_t STDCALL GetObjectIdentity(Il2CppChar** bstr_guid, int32_t* app_domain_id, intptr_t* ccw) = 0;\n};\n\nstruct LIBIL2CPP_CODEGEN_API NOVTABLE Il2CppIManagedObjectHolder : Il2CppIUnknown\n{\n    static const Il2CppGuid IID;\n    virtual Il2CppObject* STDCALL GetManagedObject() = 0;\n    virtual void STDCALL Destroy() = 0;\n};\n\nstruct LIBIL2CPP_CODEGEN_API NOVTABLE Il2CppIInspectable : Il2CppIUnknown\n{\n    static const Il2CppGuid IID;\n    virtual il2cpp_hresult_t STDCALL GetIids(uint32_t* iidCount, Il2CppGuid** iids) = 0;\n    virtual il2cpp_hresult_t STDCALL GetRuntimeClassName(Il2CppHString* className) = 0;\n    virtual il2cpp_hresult_t STDCALL GetTrustLevel(int32_t* trustLevel) = 0;\n};\n\nstruct NOVTABLE Il2CppIActivationFactory : Il2CppIInspectable\n{\n    static const LIBIL2CPP_CODEGEN_API Il2CppGuid IID;\n    virtual il2cpp_hresult_t STDCALL ActivateInstance(Il2CppIInspectable** instance) = 0;\n};\n\nstruct NOVTABLE Il2CppIRestrictedErrorInfo : Il2CppIUnknown\n{\n    static const LIBIL2CPP_CODEGEN_API Il2CppGuid IID;\n    virtual il2cpp_hresult_t STDCALL GetErrorDetails(Il2CppChar** bstrDescription, il2cpp_hresult_t* error, Il2CppChar** bstrRestrictedDescription, Il2CppChar** bstrCapabilitySid) = 0;\n    virtual il2cpp_hresult_t STDCALL GetReference(Il2CppChar** bstrReference) = 0;\n};\n\nstruct NOVTABLE Il2CppILanguageExceptionErrorInfo : Il2CppIUnknown\n{\n    static const LIBIL2CPP_CODEGEN_API Il2CppGuid IID;\n    virtual il2cpp_hresult_t STDCALL GetLanguageException(Il2CppIUnknown** languageException) = 0;\n};\n\nstruct NOVTABLE Il2CppIAgileObject : Il2CppIUnknown\n{\n    static const LIBIL2CPP_CODEGEN_API Il2CppGuid IID;\n    virtual il2cpp_hresult_t STDCALL GetLanguageException(Il2CppIUnknown** languageException) = 0;\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Android/StackTrace.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_ANDROID\n\n#include \"os/StackTrace.h\"\n#include \"os/Image.h\"\n\n#include <unwind.h>\n#include <dlfcn.h>\n#include <pthread.h>\n#include <string.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    const int kMaxStackFrames = 128;\n\nnamespace\n{\n    extern \"C\" char end;\n\n    uintptr_t s_BaseAddress;\n    uintptr_t s_EndAddress;\n    pthread_once_t s_InitKnownSymbolInfoOnceFlag = PTHREAD_ONCE_INIT;\n\n    static void InitKnownSymbolInfo()\n    {\n        s_BaseAddress = reinterpret_cast<uintptr_t>(os::Image::GetImageBase());\n        s_EndAddress = reinterpret_cast<uintptr_t>(&end);\n    }\n\n    static bool KnownSymbol(const uintptr_t addr)\n    {\n        pthread_once(&s_InitKnownSymbolInfoOnceFlag, &InitKnownSymbolInfo);\n\n        if (addr >= s_BaseAddress && addr <= s_EndAddress)\n            return true;\n\n        Dl_info info;\n        if (!dladdr(reinterpret_cast<void*>(addr), &info))\n            return false;\n\n        const char* const slash = strrchr(info.dli_fname, '/');\n        return slash && strcmp(slash + 1, \"libunity.so\") == 0;\n    }\n\n    struct AndroidStackTrace\n    {\n        size_t size;\n        Il2CppMethodPointer addrs[kMaxStackFrames];\n\n        bool PushStackFrameAddress(const uintptr_t addr)\n        {\n            if (size >= kMaxStackFrames)\n                return false;\n\n            addrs[size++] = reinterpret_cast<Il2CppMethodPointer>(addr);\n            return true;\n        }\n\n        static _Unwind_Reason_Code Callback(struct _Unwind_Context* context, void* self)\n        {\n            const uintptr_t addr = _Unwind_GetIP(context);\n\n            // Workaround to avoid crash when generating stack trace in some third-party libraries\n            if (!KnownSymbol(addr))\n                return _URC_END_OF_STACK;\n\n            if (static_cast<AndroidStackTrace*>(self)->PushStackFrameAddress(addr))\n                return _URC_NO_REASON;\n            else\n                return _URC_END_OF_STACK;\n        }\n    };\n}\n\n    void StackTrace::WalkStack(WalkStackCallback callback, void* context, WalkOrder walkOrder)\n    {\n        AndroidStackTrace callstack = {};\n        _Unwind_Backtrace(AndroidStackTrace::Callback, &callstack);\n        for (size_t i = 0; i < callstack.size; ++i)\n        {\n            const size_t index = (walkOrder == kFirstCalledToLastCalled) ? (callstack.size - i - 1) : i;\n            if (!callback(callstack.addrs[index], context))\n                break;\n        }\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Atomic.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"utils/NonCopyable.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n// On Windows, MemoryBarrier is defined as a macro on x64. Conflicts with MemoryBarrier in Atomic.h.\n#undef MemoryBarrier\n\n    class Atomic : public il2cpp::utils::NonCopyable\n    {\n    public:\n        // All 32bit atomics must be performed on 4-byte aligned addresses. All 64bit atomics must be\n        // performed on 8-byte aligned addresses.\n\n        // Add and Add64 return the *result* of the addition, not the old value! (i.e. they work like\n        // InterlockedAdd and __sync_add_and_fetch).\n        static inline int32_t Add(volatile int32_t* location1, int32_t value);\n        static inline int64_t Add64(volatile int64_t* location1, int64_t value);\n        static inline int32_t Increment(volatile int32_t* value);\n        static inline int64_t Increment64(volatile int64_t* value);\n        static inline int32_t Decrement(volatile int32_t* value);\n        static inline int64_t Decrement64(volatile int64_t* value);\n        static inline int32_t CompareExchange(volatile int32_t* dest, int32_t exchange, int32_t comparand);\n        static inline int64_t CompareExchange64(volatile int64_t* dest, int64_t exchange, int64_t comparand);\n        static inline void* CompareExchangePointer(void* volatile* dest, void* exchange, void* comparand);\n        static inline int32_t Exchange(volatile int32_t* dest, int32_t exchange);\n        static inline int64_t Exchange64(volatile int64_t* dest, int64_t exchange);\n        static inline void* ExchangePointer(void* volatile* dest, void* exchange);\n        static inline int64_t Read64(volatile int64_t* addr);\n        static inline void MemoryBarrier();\n\n        static inline uint32_t Add(volatile uint32_t* location1, uint32_t value)\n        {\n            return static_cast<uint32_t>(Add((volatile int32_t*)location1, (int32_t)value));\n        }\n\n        template<typename T>\n        static inline T* CompareExchangePointer(T* volatile* dest, T* newValue, T* oldValue)\n        {\n            return static_cast<T*>(CompareExchangePointer((void*volatile*)dest, newValue, oldValue));\n        }\n\n        template<typename T>\n        static inline T* ExchangePointer(T* volatile* dest, T* newValue)\n        {\n            return static_cast<T*>(ExchangePointer((void*volatile*)dest, newValue));\n        }\n\n        static inline uint64_t Read64(volatile uint64_t* addr)\n        {\n            return static_cast<uint64_t>(Read64((volatile int64_t*)addr));\n        }\n\n        template<typename T>\n        static inline T* ReadPointer(T* volatile* pointer)\n        {\n        #if IL2CPP_SIZEOF_VOID_P == 4\n            return reinterpret_cast<T*>(Add(reinterpret_cast<volatile int32_t*>(pointer), 0));\n        #else\n            return reinterpret_cast<T*>(Add64(reinterpret_cast<volatile int64_t*>(pointer), 0));\n        #endif\n        }\n\n        static inline uint32_t Increment(volatile uint32_t* value)\n        {\n            return static_cast<uint32_t>(Increment(reinterpret_cast<volatile int32_t*>(value)));\n        }\n\n        static inline uint64_t Increment64(volatile uint64_t* value)\n        {\n            return static_cast<uint64_t>(Increment64(reinterpret_cast<volatile int64_t*>(value)));\n        }\n\n        static inline uint32_t Decrement(volatile uint32_t* value)\n        {\n            return static_cast<uint32_t>(Decrement(reinterpret_cast<volatile int32_t*>(value)));\n        }\n\n        static inline uint64_t Decrement64(volatile uint64_t* value)\n        {\n            return static_cast<uint64_t>(Decrement64(reinterpret_cast<volatile int64_t*>(value)));\n        }\n\n        static inline uint32_t CompareExchange(volatile uint32_t* value, uint32_t newValue, uint32_t oldValue)\n        {\n            return static_cast<uint32_t>(CompareExchange(reinterpret_cast<volatile int32_t*>(value), newValue, oldValue));\n        }\n\n        static inline uint64_t CompareExchange64(volatile uint64_t* value, uint64_t newValue, uint64_t oldValue)\n        {\n            return static_cast<uint64_t>(CompareExchange64(reinterpret_cast<volatile int64_t*>(value), newValue, oldValue));\n        }\n\n        static inline uint32_t Exchange(volatile uint32_t* value, uint32_t newValue)\n        {\n            return static_cast<uint32_t>(Exchange(reinterpret_cast<volatile int32_t*>(value), newValue));\n        }\n\n        static inline uint64_t Exchange64(volatile uint64_t* value, uint64_t newValue)\n        {\n            return static_cast<uint64_t>(Exchange64(reinterpret_cast<volatile int64_t*>(value), newValue));\n        }\n    };\n}\n}\n\n#if !IL2CPP_SUPPORT_THREADS\n\nnamespace il2cpp\n{\nnamespace os\n{\n    inline int32_t Atomic::Add(volatile int32_t* location1, int32_t value)\n    {\n        return *location1 += value;\n    }\n\n    inline int64_t Atomic::Add64(volatile int64_t* location1, int64_t value)\n    {\n        return *location1 += value;\n    }\n\n    inline int32_t Atomic::Increment(volatile int32_t* value)\n    {\n        return ++(*value);\n    }\n\n    inline int64_t Atomic::Increment64(volatile int64_t* value)\n    {\n        return ++(*value);\n    }\n\n    inline int32_t Atomic::Decrement(volatile int32_t* value)\n    {\n        return --(*value);\n    }\n\n    inline int64_t Atomic::Decrement64(volatile int64_t* value)\n    {\n        return --(*value);\n    }\n\n    inline int32_t Atomic::CompareExchange(volatile int32_t* dest, int32_t exchange, int32_t comparand)\n    {\n        int32_t orig = *dest;\n        if (*dest == comparand)\n            *dest = exchange;\n\n        return orig;\n    }\n\n    inline int64_t Atomic::CompareExchange64(volatile int64_t* dest, int64_t exchange, int64_t comparand)\n    {\n        int64_t orig = *dest;\n        if (*dest == comparand)\n            *dest = exchange;\n\n        return orig;\n    }\n\n    inline void* Atomic::CompareExchangePointer(void* volatile* dest, void* exchange, void* comparand)\n    {\n        void* orig = *dest;\n        if (*dest == comparand)\n            *dest = exchange;\n\n        return orig;\n    }\n\n    inline int64_t Atomic::Exchange64(volatile int64_t* dest, int64_t exchange)\n    {\n        int64_t orig = *dest;\n        *dest = exchange;\n        return orig;\n    }\n\n    inline int32_t Atomic::Exchange(volatile int32_t* dest, int32_t exchange)\n    {\n        int32_t orig = *dest;\n        *dest = exchange;\n        return orig;\n    }\n\n    inline void* Atomic::ExchangePointer(void* volatile* dest, void* exchange)\n    {\n        void* orig = *dest;\n        *dest = exchange;\n        return orig;\n    }\n\n    int64_t Atomic::Read64(volatile int64_t* addr)\n    {\n        return *addr;\n    }\n\n    inline void Atomic::MemoryBarrier()\n    {\n        // Do nothing.\n    }\n}\n}\n\n#elif IL2CPP_TARGET_WINDOWS\n#include \"os/Win32/AtomicImpl.h\"\n#elif IL2CPP_TARGET_PS4\n#include \"os/AtomicImpl.h\"  // has to come earlier than posix\n#elif IL2CPP_TARGET_PSP2\n#include \"os/PSP2/AtomicImpl.h\"\n#elif IL2CPP_TARGET_POSIX\n#include \"os/Posix/AtomicImpl.h\"\n#else\n#include \"os/AtomicImpl.h\"\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/COM.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class COM\n    {\n    public:\n        static il2cpp_hresult_t CreateInstance(const Il2CppGuid& clsid, Il2CppIUnknown** object);\n        static il2cpp_hresult_t CreateFreeThreadedMarshaler(Il2CppIUnknown* outer, Il2CppIUnknown** marshal);\n\n        // variant\n\n        static void VariantInit(Il2CppVariant* variant);\n        static il2cpp_hresult_t VariantClear(Il2CppVariant* variant);\n\n        // safe array\n\n        static Il2CppSafeArray* SafeArrayCreate(uint16_t type, uint32_t dimention_count, Il2CppSafeArrayBound* bounds);\n        static il2cpp_hresult_t SafeArrayDestroy(Il2CppSafeArray* safeArray);\n        static il2cpp_hresult_t SafeArrayAccessData(Il2CppSafeArray* safeArray, void** data);\n        static il2cpp_hresult_t SafeArrayUnaccessData(Il2CppSafeArray* safeArray);\n        static il2cpp_hresult_t SafeArrayGetVartype(Il2CppSafeArray* safeArray, uint16_t* type);\n        static uint32_t SafeArrayGetDim(Il2CppSafeArray* safeArray);\n        static il2cpp_hresult_t SafeArrayGetLBound(Il2CppSafeArray* safeArray, uint32_t dimention, int32_t* bound);\n        static il2cpp_hresult_t SafeArrayGetUBound(Il2CppSafeArray* safeArray, uint32_t dimention, int32_t* bound);\n    };\n} /* namespace os */\n} /* namespace il2cpp*/\n#pragma once\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/ConditionVariable.cpp",
    "content": "#if NET_4_0\n#include \"il2cpp-config.h\"\n\n#include \"os/Mutex.h\"\n#include \"os/ConditionVariable.h\"\n#if IL2CPP_THREADS_WIN32\n#include \"os/Win32/ConditionVariableImpl.h\"\n#else\n#include \"os/Posix/ConditionVariableImpl.h\"\n#endif\n\n\nnamespace il2cpp\n{\nnamespace os\n{\n    ConditionVariable::ConditionVariable()\n        : m_ConditionVariable(new ConditionVariableImpl())\n    {\n    }\n\n    ConditionVariable::~ConditionVariable()\n    {\n        delete m_ConditionVariable;\n    }\n\n    int ConditionVariable::Wait(FastMutex* lock)\n    {\n        return m_ConditionVariable->Wait(lock->GetImpl());\n    }\n\n    int ConditionVariable::TimedWait(FastMutex* lock, uint32_t timeout_ms)\n    {\n        return m_ConditionVariable->TimedWait(lock->GetImpl(), timeout_ms);\n    }\n\n    void ConditionVariable::Broadcast()\n    {\n        m_ConditionVariable->Broadcast();\n    }\n\n    void ConditionVariable::Signal()\n    {\n        m_ConditionVariable->Signal();\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/ConditionVariable.h",
    "content": "#pragma once\n#if NET_4_0\n#include \"utils/NonCopyable.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class FastMutex;\n    class ConditionVariableImpl;\n\n    class ConditionVariable : public il2cpp::utils::NonCopyable\n    {\n    public:\n        ConditionVariable();\n        ~ConditionVariable();\n\n        int Wait(FastMutex* lock);\n        int TimedWait(FastMutex* lock, uint32_t timeout_ms);\n        void Broadcast();\n        void Signal();\n\n    private:\n        ConditionVariableImpl* m_ConditionVariable;\n    };\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Console.h",
    "content": "#pragma once\n\n#include <string>\n\nstruct FileHandle;\nstruct Il2CppArray;\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Console\n{\n// Isatty is in File class\n    int32_t InternalKeyAvailable(int32_t ms_timeout);\n    bool SetBreak(bool wantBreak);\n    bool SetEcho(bool wantEcho);\n    bool TtySetup(const std::string& keypadXmit, const std::string& teardown, uint8_t* control_characters, int32_t** size);\n}\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/CpuInfo.h",
    "content": "#pragma once\n#if NET_4_0\n#if IL2CPP_ENABLE_CPU_INFO\n#include <stdint.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class CpuInfo\n    {\n    public:\n        static void* Create();\n\n        /*\n        * This function returns the cpu usage in percentage,\n        * normalized on the number of cores.\n        *\n        * Warning : the percentage returned can be > 100%. This\n        * might happens on systems like Android which, for\n        * battery and performance reasons, shut down cores and\n        * lie about the number of active cores.\n        */\n        static int32_t Usage(void* previous);\n    };\n}\n}\n#endif\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Cryptography.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class Cryptography\n    {\n    public:\n        /* Returns a handle the cryptography provider to use in other calls on this API. */\n        static void* GetCryptographyProvider();\n\n        /* Open the cryptogrpahy provider. */\n        static bool OpenCryptographyProvider();\n\n        /* Indicate that the cyrptography provider is no longer in use. */\n        static void ReleaseCryptographyProvider(void* provider);\n\n        /* Use the provider to fill the buffer with cryptographically random bytes. */\n        static bool FillBufferWithRandomBytes(void* provider, uint32_t length, unsigned char* data);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Debug.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n// Generic implementation for platforms that don't have this implemented\n#if !IL2CPP_ISDEBUGGERPRESENT_IMPLEMENTED\n\n#include \"os/Debug.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    bool Debug::IsDebuggerPresent()\n    {\n        return false;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Debug.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class Debug\n    {\n    public:\n        static bool IsDebuggerPresent();\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Directory.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <string>\n#include <set>\n#include \"il2cpp-string-types.h\"\n#include \"os/ErrorCodes.h\"\n#include \"utils/StringView.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class Directory\n    {\n    public:\n        static std::string GetCurrent(int* error);\n        static bool SetCurrent(const std::string& path, int* error);\n        static bool Create(const std::string& path, int *error);\n        static bool Remove(const std::string& path, int *error);\n        static std::set<std::string> GetFileSystemEntries(const std::string& path, const std::string& pathWithPattern, int32_t attrs, int32_t mask, int* error);\n\n        struct FindHandle\n        {\n            void* osHandle;\n            Il2CppNativeString directoryPath;\n            Il2CppNativeString pattern;\n\n            FindHandle(const utils::StringView<Il2CppNativeChar>& searchPathWithPattern);\n            ~FindHandle();\n\n            inline void SetOSHandle(void* osHandle) { this->osHandle = osHandle; }\n            int32_t CloseOSHandle();\n        };\n\n        static os::ErrorCode FindFirstFile(FindHandle* findHandle, const utils::StringView<Il2CppNativeChar>& searchPathWithPattern, Il2CppNativeString* resultFileName, int32_t* resultAttributes);\n        static os::ErrorCode FindNextFile(FindHandle* findHandle, Il2CppNativeString* resultFileName, int32_t* resultAttributes);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Encoding.h",
    "content": "#pragma once\n#include <string>\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Encoding\n{\n    std::string GetCharSet();\n}\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Environment.h",
    "content": "#pragma once\n#include <string>\n#include <stdint.h>\n#include <vector>\n\nstruct Il2CppArray;\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class Environment\n    {\n    public:\n        static std::string GetMachineName();\n        static int32_t GetProcessorCount();\n        static std::string GetOsVersionString();\n        static std::string GetOsUserName();\n        static std::string GetEnvironmentVariable(const std::string& name);\n        static void SetEnvironmentVariable(const std::string& name, const std::string& value);\n        static std::vector<std::string> GetEnvironmentVariableNames();\n        static std::string GetHomeDirectory();\n        static std::vector<std::string> GetLogicalDrives();\n        static void Exit(int result);\n        static NORETURN void Abort();\n        static std::string GetWindowsFolderPath(int32_t folder);\n\n#if NET_4_0\n        static bool Is64BitOs();\n#endif\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Error.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"os/Error.h\"\n#include \"os/ThreadLocalValue.h\"\n\n// Note: for now the implementation is not platform depentent.\n\nnamespace il2cpp\n{\nnamespace os\n{\n    static ThreadLocalValue s_LastError;\n\n    ErrorCode Error::GetLastError()\n    {\n        void* value = 0;\n\n        s_LastError.GetValue(&value);\n\n        return (ErrorCode)(int64_t)value;\n    }\n\n    void Error::SetLastError(ErrorCode code)\n    {\n        s_LastError.SetValue((void*)((int64_t)code));\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Error.h",
    "content": "#pragma once\n\n#include \"os/ErrorCodes.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class Error\n    {\n    public:\n        static ErrorCode GetLastError();\n        static void SetLastError(ErrorCode code);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/ErrorCodes.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <string>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    enum ErrorCode\n    {\n        kErrorCodeSuccess = 0,\n        kErrorInvalidFunction = 1,\n        kErrorCodeFileNotFound = 2,\n        kErrorCodePathNotFound = 3,\n        kErrorCodeTooManyOpenFiles = 4,\n        kErrorCodeAccessDenied = 5,\n        kErrorCodeInvalidHandle = 6,\n        kErrorArenaTrashed = 7,\n        kErrorNotEnoughMemory = 8,\n        kErrorInvalidBlock = 9,\n        kErrorBadEnvironment = 10,\n        kErrorBadFormat = 11,\n        kErrorInvalidAccess = 12,\n        kErrorInvalidData = 13,\n        kErrorOutofmemory = 14,\n        kErrorCodeInvalidDrive = 15,\n        kErrorCurrentDirectory = 16,\n        kErrorCodeNotSameDevice = 17,\n        kErrorCodeNoMoreFiles = 18,\n        kErrorWriteProtect = 19,\n        kErrorBadUnit = 20,\n        kErrorNotReady = 21,\n        kErrorBadCommand = 22,\n        kErrorCrc = 23,\n        kErrorBadLength = 24,\n        kErrorSeek = 25,\n        kErrorNotDosDisk = 26,\n        kErrorSectorNotFound = 27,\n        kErrorOutOfPaper = 28,\n        kErrorCodeWriteFault = 29,\n        kErrorCodeReadFault = 30,\n        kErrorCodeGenFailure = 31,\n        kErrorCodeSharingViolation = 32,\n        kErrorCodeLockViolation = 33,\n        kErrorWrongDisk = 34,\n        kErrorSharingBufferExceeded = 36,\n        kErrorHandleEof = 38,\n        kErrorCodeHandleDiskFull = 39,\n        kErrorNotSupported = 50,\n        kErrorRemNotList = 51,\n        kErrorDupName = 52,\n        kErrorBadNetpath = 53,\n        kErrorNetworkBusy = 54,\n        kErrorDevNotExist = 55,\n        kErrorTooManyCmds = 56,\n        kErrorAdapHdwErr = 57,\n        kErrorBadNetResp = 58,\n        kErrorUnexpNetErr = 59,\n        kErrorBadRemAdap = 60,\n        kErrorPrintqFull = 61,\n        kErrorNoSpoolSpace = 62,\n        kErrorPrintCancelled = 63,\n        kErrorNetnameDeleted = 64,\n        kErrorNetworkAccessDenied = 65,\n        kErrorBadDevType = 66,\n        kErrorBadNetName = 67,\n        kErrorTooManyNames = 68,\n        kErrorTooManySess = 69,\n        kErrorSharingPaused = 70,\n        kErrorReqNotAccep = 71,\n        kErrorRedirPaused = 72,\n        kErrorCodeFileExists = 80,\n        kErrorCodeCannotMake = 82,\n        kErrorFailI24 = 83,\n        kErrorOutOfStructures = 84,\n        kErrorAlreadyAssigned = 85,\n        kErrorInvalidPassword = 86,\n        kErrorCodeInvalidParameter = 87,\n        kErrorNetWriteFault = 88,\n        kErrorNoProcSlots = 89,\n        kErrorTooManySemaphores = 100,\n        kErrorExclSemAlreadyOwned = 101,\n        kErrorSemIsSet = 102,\n        kErrorTooManySemRequests = 103,\n        kErrorInvalidAtInterruptTime = 104,\n        kErrorSemOwnerDied = 105,\n        kErrorSemUserLimit = 106,\n        kErrorDiskChange = 107,\n        kErrorDriveLocked = 108,\n        kErrorCodeBrokenPipe = 109,\n        kErrorOpenFailed = 110,\n        kErrorBufferOverflow = 111,\n        kErrorDiskFull = 112,\n        kErrorNoMoreSearchHandles = 113,\n        kErrorInvalidTargetHandle = 114,\n        kErrorInvalidCategory = 117,\n        kErrorInvalidVerifySwitch = 118,\n        kErrorBadDriverLevel = 119,\n        kErrorCallNotImplemented = 120,\n        kErrorSemTimeout = 121,\n        kErrorInsufficientBuffer = 122,\n        kErrorCodeInvalidName = 123,\n        kErrorInvalidLevel = 124,\n        kErrorNoVolumeLabel = 125,\n        kErrorModNotFound = 126,\n        kErrorProcNotFound = 127,\n        kErrorWaitNoChildren = 128,\n        kErrorChildNotComplete = 129,\n        kErrorDirectAccessHandle = 130,\n        kErrorNegativeSeek = 131,\n        kErrorSeekOnDevice = 132,\n        kErrorIsJoinTarget = 133,\n        kErrorIsJoined = 134,\n        kErrorIsSubsted = 135,\n        kErrorNotJoined = 136,\n        kErrorNotSubsted = 137,\n        kErrorJoinToJoin = 138,\n        kErrorSubstToSubst = 139,\n        kErrorJoinToSubst = 140,\n        kErrorSubstToJoin = 141,\n        kErrorBusyDrive = 142,\n        kErrorSameDrive = 143,\n        kErrorDirNotRoot = 144,\n        kErrorCodeDirNotEmpty = 145,\n        kErrorIsSubstPath = 146,\n        kErrorIsJoinPath = 147,\n        kErrorPathBusy = 148,\n        kErrorIsSubstTarget = 149,\n        kErrorSystemTrace = 150,\n        kErrorInvalidEventCount = 151,\n        kErrorTooManyMuxwaiters = 152,\n        kErrorInvalidListFormat = 153,\n        kErrorLabelTooLong = 154,\n        kErrorTooManyTcbs = 155,\n        kErrorSignalRefused = 156,\n        kErrorDiscarded = 157,\n        kErrorNotLocked = 158,\n        kErrorBadThreadidAddr = 159,\n        kErrorBadArguments = 160,\n        kErrorBadPathname = 161,\n        kErrorSignalPending = 162,\n        kErrorMaxThrdsReached = 164,\n        kErrorLockFailed = 167,\n        kErrorBusy = 170,\n        kErrorCancelViolation = 173,\n        kErrorAtomicLocksNotSupported = 174,\n        kErrorInvalidSegmentNumber = 180,\n        kErrorInvalidOrdinal = 182,\n        kErrorCodeAlreadyExists = 183,\n        kErrorInvalidFlagNumber = 186,\n        kErrorSemNotFound = 187,\n        kErrorInvalidStartingCodeseg = 188,\n        kErrorInvalidStackseg = 189,\n        kErrorInvalidModuletype = 190,\n        kErrorInvalidExeSignature = 191,\n        kErrorExeMarkedInvalid = 192,\n        kErrorBadExeFormat = 193,\n        kErrorIteratedDataExceeds64k = 194,\n        kErrorInvalidMinallocsize = 195,\n        kErrorDynlinkFromInvalidRing = 196,\n        kErrorIoplNotEnabled = 197,\n        kErrorInvalidSegdpl = 198,\n        kErrorAutodatasegExceeds64k = 199,\n        kErrorRing2segMustBeMovable = 200,\n        kErrorRelocChainXeedsSeglim = 201,\n        kErrorInfloopInRelocChain = 202,\n        kErrorEnvvarNotFound = 203,\n        kErrorNoSignalSent = 205,\n        kErrorCodeFileNameExcedRange = 206,\n        kErrorRing2StackInUse = 207,\n        kErrorMetaExpansionTooLong = 208,\n        kErrorInvalidSignalNumber = 209,\n        kErrorThread1Inactive = 210,\n        kErrorLocked = 212,\n        kErrorTooManyModules = 214,\n        kErrorNestingNotAllowed = 215,\n        kErrorExeMachineTypeMismatch = 216,\n        kErrorBadPipe = 230,\n        kErrorPipeBusy = 231,\n        kErrorNoData = 232,\n        kErrorPipeNotConnected = 233,\n        kErrorMoreData = 234,\n        kErrorVcDisconnected = 240,\n        kErrorInvalidEaName = 254,\n        kErrorEaListInconsistent = 255,\n        kWaitTimeout = 258,\n        kErrorNoMoreItems = 259,\n        kErrorCannotCopy = 266,\n        kErrorDirectory = 267,\n        kErrorEasDidntFit = 275,\n        kErrorEaFileCorrupt = 276,\n        kErrorEaTableFull = 277,\n        kErrorInvalidEaHandle = 278,\n        kErrorEasNotSupported = 282,\n        kErrorNotOwner = 288,\n        kErrorTooManyPosts = 298,\n        kErrorPartialCopy = 299,\n        kErrorOplockNotGranted = 300,\n        kErrorInvalidOplockProtocol = 301,\n        kErrorDiskTooFragmented = 302,\n        kErrorDeletePending = 303,\n        kErrorMrMidNotFound = 317,\n        kErrorInvalidAddress = 487,\n        kErrorArithmeticOverflow = 534,\n        kErrorPipeConnected = 535,\n        kErrorPipeListening = 536,\n        kErrorEaAccessDenied = 994,\n        kErrorOperationAborted = 995,\n        kErrorIoIncomplete = 996,\n        kErrorIoPending = 997,\n        kErrorNoaccess = 998,\n        kErrorSwaperror = 999,\n        kErrorStackOverflow = 1001,\n        kErrorInvalidMessage = 1002,\n        kErrorCanNotComplete = 1003,\n        kErrorInvalidFlags = 1004,\n        kErrorUnrecognizedVolume = 1005,\n        kErrorFileInvalid = 1006,\n        kErrorFullscreenMode = 1007,\n        kErrorNoToken = 1008,\n        kErrorBaddb = 1009,\n        kErrorBadkey = 1010,\n        kErrorCantopen = 1011,\n        kErrorCantread = 1012,\n        kErrorCantwrite = 1013,\n        kErrorRegistryRecovered = 1014,\n        kErrorRegistryCorrupt = 1015,\n        kErrorRegistryIoFailed = 1016,\n        kErrorNotRegistryFile = 1017,\n        kErrorKeyDeleted = 1018,\n        kErrorNoLogSpace = 1019,\n        kErrorKeyHasChildren = 1020,\n        kErrorChildMustBeVolatile = 1021,\n        kErrorNotifyEnumDir = 1022,\n        kErrorDependentServicesRunning = 1051,\n        kErrorInvalidServiceControl = 1052,\n        kErrorServiceRequestTimeout = 1053,\n        kErrorServiceNoThread = 1054,\n        kErrorServiceDatabaseLocked = 1055,\n        kErrorServiceAlreadyRunning = 1056,\n        kErrorInvalidServiceAccount = 1057,\n        kErrorServiceDisabled = 1058,\n        kErrorCircularDependency = 1059,\n        kErrorServiceDoesNotExist = 1060,\n        kErrorServiceCannotAcceptCtrl = 1061,\n        kErrorServiceNotActive = 1062,\n        kErrorFailedServiceControllerConnect = 1063,\n        kErrorExceptionInService = 1064,\n        kErrorDatabaseDoesNotExist = 1065,\n        kErrorServiceSpecificError = 1066,\n        kErrorProcessAborted = 1067,\n        kErrorServiceDependencyFail = 1068,\n        kErrorServiceLogonFailed = 1069,\n        kErrorServiceStartHang = 1070,\n        kErrorInvalidServiceLock = 1071,\n        kErrorServiceMarkedForDelete = 1072,\n        kErrorServiceExists = 1073,\n        kErrorAlreadyRunningLkg = 1074,\n        kErrorServiceDependencyDeleted = 1075,\n        kErrorBootAlreadyAccepted = 1076,\n        kErrorServiceNeverStarted = 1077,\n        kErrorDuplicateServiceName = 1078,\n        kErrorDifferentServiceAccount = 1079,\n        kErrorCannotDetectDriverFailure = 1080,\n        kErrorCannotDetectProcessAbort = 1081,\n        kErrorNoRecoveryProgram = 1082,\n        kErrorServiceNotInExe = 1083,\n        kErrorNotSafebootService = 1084,\n        kErrorEndOfMedia = 1100,\n        kErrorFilemarkDetected = 1101,\n        kErrorBeginningOfMedia = 1102,\n        kErrorSetmarkDetected = 1103,\n        kErrorNoDataDetected = 1104,\n        kErrorPartitionFailure = 1105,\n        kErrorInvalidBlockLength = 1106,\n        kErrorDeviceNotPartitioned = 1107,\n        kErrorUnableToLockMedia = 1108,\n        kErrorUnableToUnloadMedia = 1109,\n        kErrorMediaChanged = 1110,\n        kErrorBusReset = 1111,\n        kErrorNoMediaInDrive = 1112,\n        kErrorNoUnicodeTranslation = 1113,\n        kErrorDllInitFailed = 1114,\n        kErrorShutdownInProgress = 1115,\n        kErrorNoShutdownInProgress = 1116,\n        kErrorIoDevice = 1117,\n        kErrorSerialNoDevice = 1118,\n        kErrorIrqBusy = 1119,\n        kErrorMoreWrites = 1120,\n        kErrorCounterTimeout = 1121,\n        kErrorFloppyIdMarkNotFound = 1122,\n        kErrorFloppyWrongCylinder = 1123,\n        kErrorFloppyUnknownError = 1124,\n        kErrorFloppyBadRegisters = 1125,\n        kErrorDiskRecalibrateFailed = 1126,\n        kErrorDiskOperationFailed = 1127,\n        kErrorDiskResetFailed = 1128,\n        kErrorEomOverflow = 1129,\n        kErrorNotEnoughServerMemory = 1130,\n        kErrorPossibleDeadlock = 1131,\n        kErrorMappedAlignment = 1132,\n        kErrorSetPowerStateVetoed = 1140,\n        kErrorSetPowerStateFailed = 1141,\n        kErrorTooManyLinks = 1142,\n        kErrorOldWinVersion = 1150,\n        kErrorAppWrongOs = 1151,\n        kErrorSingleInstanceApp = 1152,\n        kErrorRmodeApp = 1153,\n        kErrorInvalidDll = 1154,\n        kErrorNoAssociation = 1155,\n        kErrorDdeFail = 1156,\n        kErrorDllNotFound = 1157,\n        kErrorNoMoreUserHandles = 1158,\n        kErrorMessageSyncOnly = 1159,\n        kErrorSourceElementEmpty = 1160,\n        kErrorDestinationElementFull = 1161,\n        kErrorIllegalElementAddress = 1162,\n        kErrorMagazineNotPresent = 1163,\n        kErrorDeviceReinitializationNeeded = 1164,\n        kErrorDeviceRequiresCleaning = 1165,\n        kErrorDeviceDoorOpen = 1166,\n        kErrorDeviceNotConnected = 1167,\n        kErrorNotFound = 1168,\n        kErrorNoMatch = 1169,\n        kErrorSetNotFound = 1170,\n        kErrorPointNotFound = 1171,\n        kErrorNoTrackingService = 1172,\n        kErrorNoVolumeId = 1173,\n        kErrorUnableToRemoveReplaced = 1175,\n        kErrorUnableToMoveReplacement = 1176,\n        kErrorUnableToMoveReplacement2 = 1177,\n        kErrorJournalDeleteInProgress = 1178,\n        kErrorJournalNotActive = 1179,\n        kErrorPotentialFileFound = 1180,\n        kErrorJournalEntryDeleted = 1181,\n        kErrorBadDevice = 1200,\n        kErrorConnectionUnavail = 1201,\n        kErrorDeviceAlreadyRemembered = 1202,\n        kErrorNoNetOrBadPath = 1203,\n        kErrorBadProvider = 1204,\n        kErrorCannotOpenProfile = 1205,\n        kErrorBadProfile = 1206,\n        kErrorNotContainer = 1207,\n        kErrorExtendedError = 1208,\n        kErrorInvalidGroupname = 1209,\n        kErrorInvalidComputername = 1210,\n        kErrorInvalidEventname = 1211,\n        kErrorInvalidDomainname = 1212,\n        kErrorInvalidServicename = 1213,\n        kErrorInvalidNetname = 1214,\n        kErrorInvalidSharename = 1215,\n        kErrorInvalidPasswordname = 1216,\n        kErrorInvalidMessagename = 1217,\n        kErrorInvalidMessagedest = 1218,\n        kErrorSessionCredentialConflict = 1219,\n        kErrorRemoteSessionLimitExceeded = 1220,\n        kErrorDupDomainname = 1221,\n        kErrorNoNetwork = 1222,\n        kErrorCancelled = 1223,\n        kErrorUserMappedFile = 1224,\n        kErrorConnectionRefused = 1225,\n        kErrorGracefulDisconnect = 1226,\n        kErrorAddressAlreadyAssociated = 1227,\n        kErrorAddressNotAssociated = 1228,\n        kErrorConnectionInvalid = 1229,\n        kErrorConnectionActive = 1230,\n        kErrorNetworkUnreachable = 1231,\n        kErrorHostUnreachable = 1232,\n        kErrorProtocolUnreachable = 1233,\n        kErrorPortUnreachable = 1234,\n        kErrorRequestAborted = 1235,\n        kErrorConnectionAborted = 1236,\n        kErrorRetry = 1237,\n        kErrorConnectionCountLimit = 1238,\n        kErrorLoginTimeRestriction = 1239,\n        kErrorLoginWkstaRestriction = 1240,\n        kErrorIncorrectAddress = 1241,\n        kErrorAlreadyRegistered = 1242,\n        kErrorServiceNotFound = 1243,\n        kErrorNotAuthenticated = 1244,\n        kErrorNotLoggedOn = 1245,\n        kErrorContinue = 1246,\n        kErrorAlreadyInitialized = 1247,\n        kErrorNoMoreDevices = 1248,\n        kErrorNoSuchSite = 1249,\n        kErrorDomainControllerExists = 1250,\n        kErrorOnlyIfConnected = 1251,\n        kErrorOverrideNochanges = 1252,\n        kErrorBadUserProfile = 1253,\n        kErrorNotSupportedOnSbs = 1254,\n        kErrorServerShutdownInProgress = 1255,\n        kErrorHostDown = 1256,\n        kErrorNonAccountSid = 1257,\n        kErrorNonDomainSid = 1258,\n        kErrorApphelpBlock = 1259,\n        kErrorAccessDisabledByPolicy = 1260,\n        kErrorRegNatConsumption = 1261,\n        kErrorCscshareOffline = 1262,\n        kErrorPkinitFailure = 1263,\n        kErrorSmartcardSubsystemFailure = 1264,\n        kErrorDowngradeDetected = 1265,\n        kSecESmartcardCertRevoked = 1266,\n        kSecEIssuingCaUntrusted = 1267,\n        kSecERevocationOfflineC = 1268,\n        kSecEPkinitClientFailur = 1269,\n        kSecESmartcardCertExpired = 1270,\n        kErrorMachineLocked = 1271,\n        kErrorCallbackSuppliedInvalidData = 1273,\n        kErrorSyncForegroundRefreshRequired = 1274,\n        kErrorDriverBlocked = 1275,\n        kErrorInvalidImportOfNonDll = 1276,\n        kErrorNotAllAssigned = 1300,\n        kErrorSomeNotMapped = 1301,\n        kErrorNoQuotasForAccount = 1302,\n        kErrorLocalUserSessionKey = 1303,\n        kErrorNullLmPassword = 1304,\n        kErrorUnknownRevision = 1305,\n        kErrorRevisionMismatch = 1306,\n        kErrorInvalidOwner = 1307,\n        kErrorInvalidPrimaryGroup = 1308,\n        kErrorNoImpersonationToken = 1309,\n        kErrorCantDisableMandatory = 1310,\n        kErrorNoLogonServers = 1311,\n        kErrorNoSuchLogonSession = 1312,\n        kErrorNoSuchPrivilege = 1313,\n        kErrorPrivilegeNotHeld = 1314,\n        kErrorInvalidAccountName = 1315,\n        kErrorUserExists = 1316,\n        kErrorNoSuchUser = 1317,\n        kErrorGroupExists = 1318,\n        kErrorNoSuchGroup = 1319,\n        kErrorMemberInGroup = 1320,\n        kErrorMemberNotInGroup = 1321,\n        kErrorLastAdmin = 1322,\n        kErrorWrongPassword = 1323,\n        kErrorIllFormedPassword = 1324,\n        kErrorPasswordRestriction = 1325,\n        kErrorLogonFailure = 1326,\n        kErrorAccountRestriction = 1327,\n        kErrorInvalidLogonHours = 1328,\n        kErrorInvalidWorkstation = 1329,\n        kErrorPasswordExpired = 1330,\n        kErrorAccountDisabled = 1331,\n        kErrorNoneMapped = 1332,\n        kErrorTooManyLuidsRequested = 1333,\n        kErrorLuidsExhausted = 1334,\n        kErrorInvalidSubAuthority = 1335,\n        kErrorInvalidAcl = 1336,\n        kErrorInvalidSid = 1337,\n        kErrorInvalidSecurityDescr = 1338,\n        kErrorBadInheritanceAcl = 1340,\n        kErrorServerDisabled = 1341,\n        kErrorServerNotDisabled = 1342,\n        kErrorInvalidIdAuthority = 1343,\n        kErrorAllottedSpaceExceeded = 1344,\n        kErrorInvalidGroupAttributes = 1345,\n        kErrorBadImpersonationLevel = 1346,\n        kErrorCantOpenAnonymous = 1347,\n        kErrorBadValidationClass = 1348,\n        kErrorBadTokenType = 1349,\n        kErrorNoSecurityOnObject = 1350,\n        kErrorCantAccessDomainInfo = 1351,\n        kErrorInvalidServerState = 1352,\n        kErrorInvalidDomainState = 1353,\n        kErrorInvalidDomainRole = 1354,\n        kErrorNoSuchDomain = 1355,\n        kErrorDomainExists = 1356,\n        kErrorDomainLimitExceeded = 1357,\n        kErrorInternalDbCorruption = 1358,\n        kErrorInternalError = 1359,\n        kErrorGenericNotMapped = 1360,\n        kErrorBadDescriptorFormat = 1361,\n        kErrorNotLogonProcess = 1362,\n        kErrorLogonSessionExists = 1363,\n        kErrorNoSuchPackage = 1364,\n        kErrorBadLogonSessionState = 1365,\n        kErrorLogonSessionCollision = 1366,\n        kErrorInvalidLogonType = 1367,\n        kErrorCannotImpersonate = 1368,\n        kErrorRxactInvalidState = 1369,\n        kErrorRxactCommitFailure = 1370,\n        kErrorSpecialAccount = 1371,\n        kErrorSpecialGroup = 1372,\n        kErrorSpecialUser = 1373,\n        kErrorMembersPrimaryGroup = 1374,\n        kErrorTokenAlreadyInUse = 1375,\n        kErrorNoSuchAlias = 1376,\n        kErrorMemberNotInAlias = 1377,\n        kErrorMemberInAlias = 1378,\n        kErrorAliasExists = 1379,\n        kErrorLogonNotGranted = 1380,\n        kErrorTooManySecrets = 1381,\n        kErrorSecretTooLong = 1382,\n        kErrorInternalDbError = 1383,\n        kErrorTooManyContextIds = 1384,\n        kErrorLogonTypeNotGranted = 1385,\n        kErrorNtCrossEncryptionRequired = 1386,\n        kErrorNoSuchMember = 1387,\n        kErrorInvalidMember = 1388,\n        kErrorTooManySids = 1389,\n        kErrorLmCrossEncryptionRequired = 1390,\n        kErrorNoInheritance = 1391,\n        kErrorFileCorrupt = 1392,\n        kErrorDiskCorrupt = 1393,\n        kErrorNoUserSessionKey = 1394,\n        kErrorLicenseQuotaExceeded = 1395,\n        kErrorWrongTargetName = 1396,\n        kErrorMutualAuthFailed = 1397,\n        kErrorTimeSkew = 1398,\n        kErrorCurrentDomainNotAllowed = 1399,\n        kErrorInvalidWindowHandle = 1400,\n        kErrorInvalidMenuHandle = 1401,\n        kErrorInvalidCursorHandle = 1402,\n        kErrorInvalidAccelHandle = 1403,\n        kErrorInvalidHookHandle = 1404,\n        kErrorInvalidDwpHandle = 1405,\n        kErrorTlwWithWschild = 1406,\n        kErrorCannotFindWndClass = 1407,\n        kErrorWindowOfOtherThread = 1408,\n        kErrorHotkeyAlreadyRegistered = 1409,\n        kErrorClassAlreadyExists = 1410,\n        kErrorClassDoesNotExist = 1411,\n        kErrorClassHasWindows = 1412,\n        kErrorInvalidIndex = 1413,\n        kErrorInvalidIconHandle = 1414,\n        kErrorPrivateDialogIndex = 1415,\n        kErrorListboxIdNotFound = 1416,\n        kErrorNoWildcardCharacters = 1417,\n        kErrorClipboardNotOpen = 1418,\n        kErrorHotkeyNotRegistered = 1419,\n        kErrorWindowNotDialog = 1420,\n        kErrorControlIdNotFound = 1421,\n        kErrorInvalidComboboxMessage = 1422,\n        kErrorWindowNotCombobox = 1423,\n        kErrorInvalidEditHeight = 1424,\n        kErrorDcNotFound = 1425,\n        kErrorInvalidHookFilter = 1426,\n        kErrorInvalidFilterProc = 1427,\n        kErrorHookNeedsHmod = 1428,\n        kErrorGlobalOnlyHook = 1429,\n        kErrorJournalHookSet = 1430,\n        kErrorHookNotInstalled = 1431,\n        kErrorInvalidLbMessage = 1432,\n        kErrorSetcountOnBadLb = 1433,\n        kErrorLbWithoutTabstops = 1434,\n        kErrorDestroyObjectOfOtherThread = 1435,\n        kErrorChildWindowMenu = 1436,\n        kErrorNoSystemMenu = 1437,\n        kErrorInvalidMsgboxStyle = 1438,\n        kErrorInvalidSpiValue = 1439,\n        kErrorScreenAlreadyLocked = 1440,\n        kErrorHwndsHaveDiffParent = 1441,\n        kErrorNotChildWindow = 1442,\n        kErrorInvalidGwCommand = 1443,\n        kErrorInvalidThreadId = 1444,\n        kErrorNonMdichildWindow = 1445,\n        kErrorPopupAlreadyActive = 1446,\n        kErrorNoScrollbars = 1447,\n        kErrorInvalidScrollbarRange = 1448,\n        kErrorInvalidShowwinCommand = 1449,\n        kErrorNoSystemResources = 1450,\n        kErrorNonpagedSystemResources = 1451,\n        kErrorPagedSystemResources = 1452,\n        kErrorWorkingSetQuota = 1453,\n        kErrorPagefileQuota = 1454,\n        kErrorCommitmentLimit = 1455,\n        kErrorMenuItemNotFound = 1456,\n        kErrorInvalidKeyboardHandle = 1457,\n        kErrorHookTypeNotAllowed = 1458,\n        kErrorRequiresInteractiveWindowstation = 1459,\n        kErrorTimeout = 1460,\n        kErrorInvalidMonitorHandle = 1461,\n        kErrorEventlogFileCorrupt = 1500,\n        kErrorEventlogCantStart = 1501,\n        kErrorLogFileFull = 1502,\n        kErrorEventlogFileChanged = 1503,\n        kErrorInstallServiceFailure = 1601,\n        kErrorInstallUserexit = 1602,\n        kErrorInstallFailure = 1603,\n        kErrorInstallSuspend = 1604,\n        kErrorUnknownProduct = 1605,\n        kErrorUnknownFeature = 1606,\n        kErrorUnknownComponent = 1607,\n        kErrorUnknownProperty = 1608,\n        kErrorInvalidHandleState = 1609,\n        kErrorBadConfiguration = 1610,\n        kErrorIndexAbsent = 1611,\n        kErrorInstallSourceAbsent = 1612,\n        kErrorInstallPackageVersion = 1613,\n        kErrorProductUninstalled = 1614,\n        kErrorBadQuerySyntax = 1615,\n        kErrorInvalidField = 1616,\n        kErrorDeviceRemoved = 1617,\n        kErrorInstallAlreadyRunning = 1618,\n        kErrorInstallPackageOpenFailed = 1619,\n        kErrorInstallPackageInvalid = 1620,\n        kErrorInstallUiFailure = 1621,\n        kErrorInstallLogFailure = 1622,\n        kErrorInstallLanguageUnsupported = 1623,\n        kErrorInstallTransformFailure = 1624,\n        kErrorInstallPackageRejected = 1625,\n        kErrorFunctionNotCalled = 1626,\n        kErrorFunctionFailed = 1627,\n        kErrorInvalidTable = 1628,\n        kErrorDatatypeMismatch = 1629,\n        kErrorUnsupportedType = 1630,\n        kErrorCreateFailed = 1631,\n        kErrorInstallTempUnwritable = 1632,\n        kErrorInstallPlatformUnsupported = 1633,\n        kErrorInstallNotused = 1634,\n        kErrorPatchPackageOpenFailed = 1635,\n        kErrorPatchPackageInvalid = 1636,\n        kErrorPatchPackageUnsupported = 1637,\n        kErrorProductVersion = 1638,\n        kErrorInvalidCommandLine = 1639,\n        kErrorInstallRemoteDisallowed = 1640,\n        kErrorSuccessRebootInitiated = 1641,\n        kErrorPatchTargetNotFound = 1642,\n        kErrorPatchPackageRejected = 1643,\n        kErrorInstallTransformRejected = 1644,\n        kRpcSInvalidStringBinding = 1700,\n        kRpcSWrongKindOfBinding = 1701,\n        kRpcSInvalidBinding = 1702,\n        kRpcSProtseqNotSupported = 1703,\n        kRpcSInvalidRpcProtseq = 1704,\n        kRpcSInvalidStringUuid = 1705,\n        kRpcSInvalidEndpointFormat = 1706,\n        kRpcSInvalidNetAddr = 1707,\n        kRpcSNoEndpointFound = 1708,\n        kRpcSInvalidTimeout = 1709,\n        kRpcSObjectNotFound = 1710,\n        kRpcSAlreadyRegistered = 1711,\n        kRpcSTypeAlreadyRegistered = 1712,\n        kRpcSAlreadyListening = 1713,\n        kRpcSNoProtseqsRegistered = 1714,\n        kRpcSNotListening = 1715,\n        kRpcSUnknownMgrType = 1716,\n        kRpcSUnknownIf = 1717,\n        kRpcSNoBindings = 1718,\n        kRpcSNoProtseqs = 1719,\n        kRpcSCantCreateEndpoint = 1720,\n        kRpcSOutOfResources = 1721,\n        kRpcSServerUnavailable = 1722,\n        kRpcSServerTooBusy = 1723,\n        kRpcSInvalidNetworkOptions = 1724,\n        kRpcSNoCallActive = 1725,\n        kRpcSCallFailed = 1726,\n        kRpcSCallFailedDne = 1727,\n        kRpcSProtocolError = 1728,\n        kRpcSUnsupportedTransSyn = 1730,\n        kRpcSUnsupportedType = 1732,\n        kRpcSInvalidTag = 1733,\n        kRpcSInvalidBound = 1734,\n        kRpcSNoEntryName = 1735,\n        kRpcSInvalidNameSyntax = 1736,\n        kRpcSUnsupportedNameSyntax = 1737,\n        kRpcSUuidNoAddress = 1739,\n        kRpcSDuplicateEndpoint = 1740,\n        kRpcSUnknownAuthnType = 1741,\n        kRpcSMaxCallsTooSmall = 1742,\n        kRpcSStringTooLong = 1743,\n        kRpcSProtseqNotFound = 1744,\n        kRpcSProcnumOutOfRange = 1745,\n        kRpcSBindingHasNoAuth = 1746,\n        kRpcSUnknownAuthnService = 1747,\n        kRpcSUnknownAuthnLevel = 1748,\n        kRpcSInvalidAuthIdentity = 1749,\n        kRpcSUnknownAuthzService = 1750,\n        kEptSInvalidEntry = 1751,\n        kEptSCantPerformOp = 1752,\n        kEptSNotRegistered = 1753,\n        kRpcSNothingToExport = 1754,\n        kRpcSIncompleteName = 1755,\n        kRpcSInvalidVersOption = 1756,\n        kRpcSNoMoreMembers = 1757,\n        kRpcSNotAllObjsUnexported = 1758,\n        kRpcSInterfaceNotFound = 1759,\n        kRpcSEntryAlreadyExists = 1760,\n        kRpcSEntryNotFound = 1761,\n        kRpcSNameServiceUnavailable = 1762,\n        kRpcSInvalidNafId = 1763,\n        kRpcSCannotSupport = 1764,\n        kRpcSNoContextAvailable = 1765,\n        kRpcSInternalError = 1766,\n        kRpcSZeroDivide = 1767,\n        kRpcSAddressError = 1768,\n        kRpcSFpDivZero = 1769,\n        kRpcSFpUnderflow = 1770,\n        kRpcSFpOverflow = 1771,\n        kRpcXNoMoreEntries = 1772,\n        kRpcXSsCharTransOpenFail = 1773,\n        kRpcXSsCharTransShortFile = 1774,\n        kRpcXSsInNullContext = 1775,\n        kRpcXSsContextDamaged = 1777,\n        kRpcXSsHandlesMismatch = 1778,\n        kRpcXSsCannotGetCallHandle = 1779,\n        kRpcXNullRefPointer = 1780,\n        kRpcXEnumValueOutOfRange = 1781,\n        kRpcXByteCountTooSmall = 1782,\n        kRpcXBadStubData = 1783,\n        kErrorInvalidUserBuffer = 1784,\n        kErrorUnrecognizedMedia = 1785,\n        kErrorNoTrustLsaSecret = 1786,\n        kErrorNoTrustSamAccount = 1787,\n        kErrorTrustedDomainFailure = 1788,\n        kErrorTrustedRelationshipFailure = 1789,\n        kErrorTrustFailure = 1790,\n        kRpcSCallInProgress = 1791,\n        kErrorNetlogonNotStarted = 1792,\n        kErrorAccountExpired = 1793,\n        kErrorRedirectorHasOpenHandles = 1794,\n        kErrorPrinterDriverAlreadyInstalled = 1795,\n        kErrorUnknownPort = 1796,\n        kErrorUnknownPrinterDriver = 1797,\n        kErrorUnknownPrintprocessor = 1798,\n        kErrorInvalidSeparatorFile = 1799,\n        kErrorInvalidPriority = 1800,\n        kErrorInvalidPrinterName = 1801,\n        kErrorPrinterAlreadyExists = 1802,\n        kErrorInvalidPrinterCommand = 1803,\n        kErrorInvalidDatatype = 1804,\n        kErrorInvalidEnvironment = 1805,\n        kRpcSNoMoreBindings = 1806,\n        kErrorNologonInterdomainTrustAccount = 1807,\n        kErrorNologonWorkstationTrustAccount = 1808,\n        kErrorNologonServerTrustAccount = 1809,\n        kErrorDomainTrustInconsistent = 1810,\n        kErrorServerHasOpenHandles = 1811,\n        kErrorResourceDataNotFound = 1812,\n        kErrorResourceTypeNotFound = 1813,\n        kErrorResourceNameNotFound = 1814,\n        kErrorResourceLangNotFound = 1815,\n        kErrorNotEnoughQuota = 1816,\n        kRpcSNoInterfaces = 1817,\n        kRpcSCallCancelled = 1818,\n        kRpcSBindingIncomplete = 1819,\n        kRpcSCommFailure = 1820,\n        kRpcSUnsupportedAuthnLevel = 1821,\n        kRpcSNoPrincName = 1822,\n        kRpcSNotRpcError = 1823,\n        kRpcSUuidLocalOnly = 1824,\n        kRpcSSecPkgError = 1825,\n        kRpcSNotCancelled = 1826,\n        kRpcXInvalidEsAction = 1827,\n        kRpcXWrongEsVersion = 1828,\n        kRpcXWrongStubVersion = 1829,\n        kRpcXInvalidPipeObject = 1830,\n        kRpcXWrongPipeOrder = 1831,\n        kRpcXWrongPipeVersion = 1832,\n        kRpcSGroupMemberNotFound = 1898,\n        kEptSCantCreate = 1899,\n        kRpcSInvalidObject = 1900,\n        kErrorInvalidTime = 1901,\n        kErrorInvalidFormName = 1902,\n        kErrorInvalidFormSize = 1903,\n        kErrorAlreadyWaiting = 1904,\n        kErrorPrinterDeleted = 1905,\n        kErrorInvalidPrinterState = 1906,\n        kErrorPasswordMustChange = 1907,\n        kErrorDomainControllerNotFound = 1908,\n        kErrorAccountLockedOut = 1909,\n        kOrInvalidOxid = 1910,\n        kOrInvalidOid = 1911,\n        kOrInvalidSet = 1912,\n        kRpcSSendIncomplete = 1913,\n        kRpcSInvalidAsyncHandle = 1914,\n        kRpcSInvalidAsyncCall = 1915,\n        kRpcXPipeClosed = 1916,\n        kRpcXPipeDisciplineError = 1917,\n        kRpcXPipeEmpty = 1918,\n        kErrorNoSitename = 1919,\n        kErrorCantAccessFile = 1920,\n        kErrorCantResolveFilename = 1921,\n        kRpcSEntryTypeMismatch = 1922,\n        kRpcSNotAllObjsExported = 1923,\n        kRpcSInterfaceNotExported = 1924,\n        kRpcSProfileNotAdded = 1925,\n        kRpcSPrfEltNotAdded = 1926,\n        kRpcSPrfEltNotRemoved = 1927,\n        kRpcSGrpEltNotAdded = 1928,\n        kRpcSGrpEltNotRemoved = 1929,\n        kErrorKmDriverBlocked = 1930,\n        kErrorContextExpired = 1931,\n        kErrorInvalidPixelFormat = 2000,\n        kErrorBadDriver = 2001,\n        kErrorInvalidWindowStyle = 2002,\n        kErrorMetafileNotSupported = 2003,\n        kErrorTransformNotSupported = 2004,\n        kErrorClippingNotSupported = 2005,\n        kErrorInvalidCmm = 2010,\n        kErrorInvalidProfile = 2011,\n        kErrorTagNotFound = 2012,\n        kErrorTagNotPresent = 2013,\n        kErrorDuplicateTag = 2014,\n        kErrorProfileNotAssociatedWithDevice = 2015,\n        kErrorProfileNotFound = 2016,\n        kErrorInvalidColorspace = 2017,\n        kErrorIcmNotEnabled = 2018,\n        kErrorDeletingIcmXform = 2019,\n        kErrorInvalidTransform = 2020,\n        kErrorColorspaceMismatch = 2021,\n        kErrorInvalidColorindex = 2022,\n        kErrorConnectedOtherPassword = 2108,\n        kErrorConnectedOtherPasswordDefault = 2109,\n        kErrorBadUsername = 2202,\n        kErrorNotConnected = 2250,\n        kErrorOpenFiles = 2401,\n        kErrorActiveConnections = 2402,\n        kErrorDeviceInUse = 2404,\n        kErrorUnknownPrintMonitor = 3000,\n        kErrorPrinterDriverInUse = 3001,\n        kErrorSpoolFileNotFound = 3002,\n        kErrorSplNoStartdoc = 3003,\n        kErrorSplNoAddjob = 3004,\n        kErrorPrintProcessorAlreadyInstalled = 3005,\n        kErrorPrintMonitorAlreadyInstalled = 3006,\n        kErrorInvalidPrintMonitor = 3007,\n        kErrorPrintMonitorInUse = 3008,\n        kErrorPrinterHasJobsQueued = 3009,\n        kErrorSuccessRebootRequired = 3010,\n        kErrorSuccessRestartRequired = 3011,\n        kErrorPrinterNotFound = 3012,\n        kErrorPrinterDriverWarned = 3013,\n        kErrorPrinterDriverBlocked = 3014,\n        kErrorWinsInternal = 4000,\n        kErrorCanNotDelLocalWins = 4001,\n        kErrorStaticInit = 4002,\n        kErrorIncBackup = 4003,\n        kErrorFullBackup = 4004,\n        kErrorRecNonExistent = 4005,\n        kErrorRplNotAllowed = 4006,\n        kErrorDhcpAddressConflict = 4100,\n        kErrorWmiGuidNotFound = 4200,\n        kErrorWmiInstanceNotFound = 4201,\n        kErrorWmiItemidNotFound = 4202,\n        kErrorWmiTryAgain = 4203,\n        kErrorWmiDpNotFound = 4204,\n        kErrorWmiUnresolvedInstanceRef = 4205,\n        kErrorWmiAlreadyEnabled = 4206,\n        kErrorWmiGuidDisconnected = 4207,\n        kErrorWmiServerUnavailable = 4208,\n        kErrorWmiDpFailed = 4209,\n        kErrorWmiInvalidMof = 4210,\n        kErrorWmiInvalidReginfo = 4211,\n        kErrorWmiAlreadyDisabled = 4212,\n        kErrorWmiReadOnly = 4213,\n        kErrorWmiSetFailure = 4214,\n        kErrorInvalidMedia = 4300,\n        kErrorInvalidLibrary = 4301,\n        kErrorInvalidMediaPool = 4302,\n        kErrorDriveMediaMismatch = 4303,\n        kErrorMediaOffline = 4304,\n        kErrorLibraryOffline = 4305,\n        kErrorEmpty = 4306,\n        kErrorNotEmpty = 4307,\n        kErrorMediaUnavailable = 4308,\n        kErrorResourceDisabled = 4309,\n        kErrorInvalidCleaner = 4310,\n        kErrorUnableToClean = 4311,\n        kErrorObjectNotFound = 4312,\n        kErrorDatabaseFailure = 4313,\n        kErrorDatabaseFull = 4314,\n        kErrorMediaIncompatible = 4315,\n        kErrorResourceNotPresent = 4316,\n        kErrorInvalidOperation = 4317,\n        kErrorMediaNotAvailable = 4318,\n        kErrorDeviceNotAvailable = 4319,\n        kErrorRequestRefused = 4320,\n        kErrorInvalidDriveObject = 4321,\n        kErrorLibraryFull = 4322,\n        kErrorMediumNotAccessible = 4323,\n        kErrorUnableToLoadMedium = 4324,\n        kErrorUnableToInventoryDrive = 4325,\n        kErrorUnableToInventorySlot = 4326,\n        kErrorUnableToInventoryTransport = 4327,\n        kErrorTransportFull = 4328,\n        kErrorControllingIeport = 4329,\n        kErrorUnableToEjectMountedMedia = 4330,\n        kErrorCleanerSlotSet = 4331,\n        kErrorCleanerSlotNotSet = 4332,\n        kErrorCleanerCartridgeSpent = 4333,\n        kErrorUnexpectedOmid = 4334,\n        kErrorCantDeleteLastItem = 4335,\n        kErrorMessageExceedsMaxSize = 4336,\n        kErrorVolumeContainsSysFiles = 4337,\n        kErrorIndigenousType = 4338,\n        kErrorNoSupportingDrives = 4339,\n        kErrorCleanerCartridgeInstalled = 4340,\n        kErrorFileOffline = 4350,\n        kErrorRemoteStorageNotActive = 4351,\n        kErrorRemoteStorageMediaError = 4352,\n        kErrorNotAReparsePoint = 4390,\n        kErrorReparseAttributeConflict = 4391,\n        kErrorInvalidReparseData = 4392,\n        kErrorReparseTagInvalid = 4393,\n        kErrorReparseTagMismatch = 4394,\n        kErrorVolumeNotSisEnabled = 4500,\n        kErrorDependentResourceExists = 5001,\n        kErrorDependencyNotFound = 5002,\n        kErrorDependencyAlreadyExists = 5003,\n        kErrorResourceNotOnline = 5004,\n        kErrorHostNodeNotAvailable = 5005,\n        kErrorResourceNotAvailable = 5006,\n        kErrorResourceNotFound = 5007,\n        kErrorShutdownCluster = 5008,\n        kErrorCantEvictActiveNode = 5009,\n        kErrorObjectAlreadyExists = 5010,\n        kErrorObjectInList = 5011,\n        kErrorGroupNotAvailable = 5012,\n        kErrorGroupNotFound = 5013,\n        kErrorGroupNotOnline = 5014,\n        kErrorHostNodeNotResourceOwner = 5015,\n        kErrorHostNodeNotGroupOwner = 5016,\n        kErrorResmonCreateFailed = 5017,\n        kErrorResmonOnlineFailed = 5018,\n        kErrorResourceOnline = 5019,\n        kErrorQuorumResource = 5020,\n        kErrorNotQuorumCapable = 5021,\n        kErrorClusterShuttingDown = 5022,\n        kErrorInvalidState = 5023,\n        kErrorResourcePropertiesStored = 5024,\n        kErrorNotQuorumClass = 5025,\n        kErrorCoreResource = 5026,\n        kErrorQuorumResourceOnlineFailed = 5027,\n        kErrorQuorumlogOpenFailed = 5028,\n        kErrorClusterlogCorrupt = 5029,\n        kErrorClusterlogRecordExceedsMaxsize = 5030,\n        kErrorClusterlogExceedsMaxsize = 5031,\n        kErrorClusterlogChkpointNotFound = 5032,\n        kErrorClusterlogNotEnoughSpace = 5033,\n        kErrorQuorumOwnerAlive = 5034,\n        kErrorNetworkNotAvailable = 5035,\n        kErrorNodeNotAvailable = 5036,\n        kErrorAllNodesNotAvailable = 5037,\n        kErrorResourceFailed = 5038,\n        kErrorClusterInvalidNode = 5039,\n        kErrorClusterNodeExists = 5040,\n        kErrorClusterJoinInProgress = 5041,\n        kErrorClusterNodeNotFound = 5042,\n        kErrorClusterLocalNodeNotFound = 5043,\n        kErrorClusterNetworkExists = 5044,\n        kErrorClusterNetworkNotFound = 5045,\n        kErrorClusterNetinterfaceExists = 5046,\n        kErrorClusterNetinterfaceNotFound = 5047,\n        kErrorClusterInvalidRequest = 5048,\n        kErrorClusterInvalidNetworkProvider = 5049,\n        kErrorClusterNodeDown = 5050,\n        kErrorClusterNodeUnreachable = 5051,\n        kErrorClusterNodeNotMember = 5052,\n        kErrorClusterJoinNotInProgress = 5053,\n        kErrorClusterInvalidNetwork = 5054,\n        kErrorClusterNodeUp = 5056,\n        kErrorClusterIpaddrInUse = 5057,\n        kErrorClusterNodeNotPaused = 5058,\n        kErrorClusterNoSecurityContext = 5059,\n        kErrorClusterNetworkNotInternal = 5060,\n        kErrorClusterNodeAlreadyUp = 5061,\n        kErrorClusterNodeAlreadyDown = 5062,\n        kErrorClusterNetworkAlreadyOnline = 5063,\n        kErrorClusterNetworkAlreadyOffline = 5064,\n        kErrorClusterNodeAlreadyMember = 5065,\n        kErrorClusterLastInternalNetwork = 5066,\n        kErrorClusterNetworkHasDependents = 5067,\n        kErrorInvalidOperationOnQuorum = 5068,\n        kErrorDependencyNotAllowed = 5069,\n        kErrorClusterNodePaused = 5070,\n        kErrorNodeCantHostResource = 5071,\n        kErrorClusterNodeNotReady = 5072,\n        kErrorClusterNodeShuttingDown = 5073,\n        kErrorClusterJoinAborted = 5074,\n        kErrorClusterIncompatibleVersions = 5075,\n        kErrorClusterMaxnumOfResourcesExceeded = 5076,\n        kErrorClusterSystemConfigChanged = 5077,\n        kErrorClusterResourceTypeNotFound = 5078,\n        kErrorClusterRestypeNotSupported = 5079,\n        kErrorClusterResnameNotFound = 5080,\n        kErrorClusterNoRpcPackagesRegistered = 5081,\n        kErrorClusterOwnerNotInPreflist = 5082,\n        kErrorClusterDatabaseSeqmismatch = 5083,\n        kErrorResmonInvalidState = 5084,\n        kErrorClusterGumNotLocker = 5085,\n        kErrorQuorumDiskNotFound = 5086,\n        kErrorDatabaseBackupCorrupt = 5087,\n        kErrorClusterNodeAlreadyHasDfsRoot = 5088,\n        kErrorResourcePropertyUnchangeable = 5089,\n        kErrorClusterMembershipInvalidState = 5890,\n        kErrorClusterQuorumlogNotFound = 5891,\n        kErrorClusterMembershipHalt = 5892,\n        kErrorClusterInstanceIdMismatch = 5893,\n        kErrorClusterNetworkNotFoundForIp = 5894,\n        kErrorClusterPropertyDataTypeMismatch = 5895,\n        kErrorClusterEvictWithoutCleanup = 5896,\n        kErrorClusterParameterMismatch = 5897,\n        kErrorNodeCannotBeClustered = 5898,\n        kErrorClusterWrongOsVersion = 5899,\n        kErrorClusterCantCreateDupClusterName = 5900,\n        kErrorCodeEncryptionFailed = 6000,\n        kErrorDecryptionFailed = 6001,\n        kErrorFileEncrypted = 6002,\n        kErrorNoRecoveryPolicy = 6003,\n        kErrorNoEfs = 6004,\n        kErrorWrongEfs = 6005,\n        kErrorNoUserKeys = 6006,\n        kErrorFileNotEncrypted = 6007,\n        kErrorNotExportFormat = 6008,\n        kErrorFileReadOnly = 6009,\n        kErrorDirEfsDisallowed = 6010,\n        kErrorEfsServerNotTrusted = 6011,\n        kErrorBadRecoveryPolicy = 6012,\n        kErrorEfsAlgBlobTooBig = 6013,\n        kErrorVolumeNotSupportEfs = 6014,\n        kErrorEfsDisabled = 6015,\n        kErrorEfsVersionNotSupport = 6016,\n        kErrorNoBrowserServersFound = 6118,\n        kSchedEServiceNotLocalsystem = 6200,\n        kErrorCtxWinstationNameInvalid = 7001,\n        kErrorCtxInvalidPd = 7002,\n        kErrorCtxPdNotFound = 7003,\n        kErrorCtxWdNotFound = 7004,\n        kErrorCtxCannotMakeEventlogEntry = 7005,\n        kErrorCtxServiceNameCollision = 7006,\n        kErrorCtxClosePending = 7007,\n        kErrorCtxNoOutbuf = 7008,\n        kErrorCtxModemInfNotFound = 7009,\n        kErrorCtxInvalidModemname = 7010,\n        kErrorCtxModemResponseError = 7011,\n        kErrorCtxModemResponseTimeout = 7012,\n        kErrorCtxModemResponseNoCarrier = 7013,\n        kErrorCtxModemResponseNoDialtone = 7014,\n        kErrorCtxModemResponseBusy = 7015,\n        kErrorCtxModemResponseVoice = 7016,\n        kErrorCtxTdError = 7017,\n        kErrorCtxWinstationNotFound = 7022,\n        kErrorCtxWinstationAlreadyExists = 7023,\n        kErrorCtxWinstationBusy = 7024,\n        kErrorCtxBadVideoMode = 7025,\n        kErrorCtxGraphicsInvalid = 7035,\n        kErrorCtxLogonDisabled = 7037,\n        kErrorCtxNotConsole = 7038,\n        kErrorCtxClientQueryTimeout = 7040,\n        kErrorCtxConsoleDisconnect = 7041,\n        kErrorCtxConsoleConnect = 7042,\n        kErrorCtxShadowDenied = 7044,\n        kErrorCtxWinstationAccessDenied = 7045,\n        kErrorCtxInvalidWd = 7049,\n        kErrorCtxShadowInvalid = 7050,\n        kErrorCtxShadowDisabled = 7051,\n        kErrorCtxClientLicenseInUse = 7052,\n        kErrorCtxClientLicenseNotSet = 7053,\n        kErrorCtxLicenseNotAvailable = 7054,\n        kErrorCtxLicenseClientInvalid = 7055,\n        kErrorCtxLicenseExpired = 7056,\n        kErrorCtxShadowNotRunning = 7057,\n        kErrorCtxShadowEndedByModeChange = 7058,\n        kFrsErrInvalidApiSequence = 8001,\n        kFrsErrStartingService = 8002,\n        kFrsErrStoppingService = 8003,\n        kFrsErrInternalApi = 8004,\n        kFrsErrInternal = 8005,\n        kFrsErrServiceComm = 8006,\n        kFrsErrInsufficientPriv = 8007,\n        kFrsErrAuthentication = 8008,\n        kFrsErrParentInsufficientPriv = 8009,\n        kFrsErrParentAuthentication = 8010,\n        kFrsErrChildToParentComm = 8011,\n        kFrsErrParentToChildComm = 8012,\n        kFrsErrSysvolPopulate = 8013,\n        kFrsErrSysvolPopulateTimeout = 8014,\n        kFrsErrSysvolIsBusy = 8015,\n        kFrsErrSysvolDemote = 8016,\n        kFrsErrInvalidServiceParameter = 8017,\n        kErrorDsNotInstalled = 8200,\n        kErrorDsMembershipEvaluatedLocally = 8201,\n        kErrorDsNoAttributeOrValue = 8202,\n        kErrorDsInvalidAttributeSyntax = 8203,\n        kErrorDsAttributeTypeUndefined = 8204,\n        kErrorDsAttributeOrValueExists = 8205,\n        kErrorDsBusy = 8206,\n        kErrorDsUnavailable = 8207,\n        kErrorDsNoRidsAllocated = 8208,\n        kErrorDsNoMoreRids = 8209,\n        kErrorDsIncorrectRoleOwner = 8210,\n        kErrorDsRidmgrInitError = 8211,\n        kErrorDsObjClassViolation = 8212,\n        kErrorDsCantOnNonLeaf = 8213,\n        kErrorDsCantOnRdn = 8214,\n        kErrorDsCantModObjClass = 8215,\n        kErrorDsCrossDomMoveError = 8216,\n        kErrorDsGcNotAvailable = 8217,\n        kErrorSharedPolicy = 8218,\n        kErrorPolicyObjectNotFound = 8219,\n        kErrorPolicyOnlyInDs = 8220,\n        kErrorPromotionActive = 8221,\n        kErrorNoPromotionActive = 8222,\n        kErrorDsOperationsError = 8224,\n        kErrorDsProtocolError = 8225,\n        kErrorDsTimelimitExceeded = 8226,\n        kErrorDsSizelimitExceeded = 8227,\n        kErrorDsAdminLimitExceeded = 8228,\n        kErrorDsCompareFalse = 8229,\n        kErrorDsCompareTrue = 8230,\n        kErrorDsAuthMethodNotSupported = 8231,\n        kErrorDsStrongAuthRequired = 8232,\n        kErrorDsInappropriateAuth = 8233,\n        kErrorDsAuthUnknown = 8234,\n        kErrorDsReferral = 8235,\n        kErrorDsUnavailableCritExtension = 8236,\n        kErrorDsConfidentialityRequired = 8237,\n        kErrorDsInappropriateMatching = 8238,\n        kErrorDsConstraintViolation = 8239,\n        kErrorDsNoSuchObject = 8240,\n        kErrorDsAliasProblem = 8241,\n        kErrorDsInvalidDnSyntax = 8242,\n        kErrorDsIsLeaf = 8243,\n        kErrorDsAliasDerefProblem = 8244,\n        kErrorDsUnwillingToPerform = 8245,\n        kErrorDsLoopDetect = 8246,\n        kErrorDsNamingViolation = 8247,\n        kErrorDsObjectResultsTooLarge = 8248,\n        kErrorDsAffectsMultipleDsas = 8249,\n        kErrorDsServerDown = 8250,\n        kErrorDsLocalError = 8251,\n        kErrorDsEncodingError = 8252,\n        kErrorDsDecodingError = 8253,\n        kErrorDsFilterUnknown = 8254,\n        kErrorDsParamError = 8255,\n        kErrorDsNotSupported = 8256,\n        kErrorDsNoResultsReturned = 8257,\n        kErrorDsControlNotFound = 8258,\n        kErrorDsClientLoop = 8259,\n        kErrorDsReferralLimitExceeded = 8260,\n        kErrorDsSortControlMissing = 8261,\n        kErrorDsOffsetRangeError = 8262,\n        kErrorDsRootMustBeNc = 8301,\n        kErrorDsAddReplicaInhibited = 8302,\n        kErrorDsAttNotDefInSchema = 8303,\n        kErrorDsMaxObjSizeExceeded = 8304,\n        kErrorDsObjStringNameExists = 8305,\n        kErrorDsNoRdnDefinedInSchema = 8306,\n        kErrorDsRdnDoesntMatchSchema = 8307,\n        kErrorDsNoRequestedAttsFound = 8308,\n        kErrorDsUserBufferToSmall = 8309,\n        kErrorDsAttIsNotOnObj = 8310,\n        kErrorDsIllegalModOperation = 8311,\n        kErrorDsObjTooLarge = 8312,\n        kErrorDsBadInstanceType = 8313,\n        kErrorDsMasterdsaRequired = 8314,\n        kErrorDsObjectClassRequired = 8315,\n        kErrorDsMissingRequiredAtt = 8316,\n        kErrorDsAttNotDefForClass = 8317,\n        kErrorDsAttAlreadyExists = 8318,\n        kErrorDsCantAddAttValues = 8320,\n        kErrorDsSingleValueConstraint = 8321,\n        kErrorDsRangeConstraint = 8322,\n        kErrorDsAttValAlreadyExists = 8323,\n        kErrorDsCantRemMissingAtt = 8324,\n        kErrorDsCantRemMissingAttVal = 8325,\n        kErrorDsRootCantBeSubref = 8326,\n        kErrorDsNoChaining = 8327,\n        kErrorDsNoChainedEval = 8328,\n        kErrorDsNoParentObject = 8329,\n        kErrorDsParentIsAnAlias = 8330,\n        kErrorDsCantMixMasterAndReps = 8331,\n        kErrorDsChildrenExist = 8332,\n        kErrorDsObjNotFound = 8333,\n        kErrorDsAliasedObjMissing = 8334,\n        kErrorDsBadNameSyntax = 8335,\n        kErrorDsAliasPointsToAlias = 8336,\n        kErrorDsCantDerefAlias = 8337,\n        kErrorDsOutOfScope = 8338,\n        kErrorDsObjectBeingRemoved = 8339,\n        kErrorDsCantDeleteDsaObj = 8340,\n        kErrorDsGenericError = 8341,\n        kErrorDsDsaMustBeIntMaster = 8342,\n        kErrorDsClassNotDsa = 8343,\n        kErrorDsInsuffAccessRights = 8344,\n        kErrorDsIllegalSuperior = 8345,\n        kErrorDsAttributeOwnedBySam = 8346,\n        kErrorDsNameTooManyParts = 8347,\n        kErrorDsNameTooLong = 8348,\n        kErrorDsNameValueTooLong = 8349,\n        kErrorDsNameUnparseable = 8350,\n        kErrorDsNameTypeUnknown = 8351,\n        kErrorDsNotAnObject = 8352,\n        kErrorDsSecDescTooShort = 8353,\n        kErrorDsSecDescInvalid = 8354,\n        kErrorDsNoDeletedName = 8355,\n        kErrorDsSubrefMustHaveParent = 8356,\n        kErrorDsNcnameMustBeNc = 8357,\n        kErrorDsCantAddSystemOnly = 8358,\n        kErrorDsClassMustBeConcrete = 8359,\n        kErrorDsInvalidDmd = 8360,\n        kErrorDsObjGuidExists = 8361,\n        kErrorDsNotOnBacklink = 8362,\n        kErrorDsNoCrossrefForNc = 8363,\n        kErrorDsShuttingDown = 8364,\n        kErrorDsUnknownOperation = 8365,\n        kErrorDsInvalidRoleOwner = 8366,\n        kErrorDsCouldntContactFsmo = 8367,\n        kErrorDsCrossNcDnRename = 8368,\n        kErrorDsCantModSystemOnly = 8369,\n        kErrorDsReplicatorOnly = 8370,\n        kErrorDsObjClassNotDefined = 8371,\n        kErrorDsObjClassNotSubclass = 8372,\n        kErrorDsNameReferenceInvalid = 8373,\n        kErrorDsCrossRefExists = 8374,\n        kErrorDsCantDelMasterCrossref = 8375,\n        kErrorDsSubtreeNotifyNotNcHead = 8376,\n        kErrorDsNotifyFilterTooComplex = 8377,\n        kErrorDsDupRdn = 8378,\n        kErrorDsDupOid = 8379,\n        kErrorDsDupMapiId = 8380,\n        kErrorDsDupSchemaIdGuid = 8381,\n        kErrorDsDupLdapDisplayName = 8382,\n        kErrorDsSemanticAttTest = 8383,\n        kErrorDsSyntaxMismatch = 8384,\n        kErrorDsExistsInMustHave = 8385,\n        kErrorDsExistsInMayHave = 8386,\n        kErrorDsNonexistentMayHave = 8387,\n        kErrorDsNonexistentMustHave = 8388,\n        kErrorDsAuxClsTestFail = 8389,\n        kErrorDsNonexistentPossSup = 8390,\n        kErrorDsSubClsTestFail = 8391,\n        kErrorDsBadRdnAttIdSyntax = 8392,\n        kErrorDsExistsInAuxCls = 8393,\n        kErrorDsExistsInSubCls = 8394,\n        kErrorDsExistsInPossSup = 8395,\n        kErrorDsRecalcschemaFailed = 8396,\n        kErrorDsTreeDeleteNotFinished = 8397,\n        kErrorDsCantDelete = 8398,\n        kErrorDsAttSchemaReqId = 8399,\n        kErrorDsBadAttSchemaSyntax = 8400,\n        kErrorDsCantCacheAtt = 8401,\n        kErrorDsCantCacheClass = 8402,\n        kErrorDsCantRemoveAttCache = 8403,\n        kErrorDsCantRemoveClassCache = 8404,\n        kErrorDsCantRetrieveDn = 8405,\n        kErrorDsMissingSupref = 8406,\n        kErrorDsCantRetrieveInstance = 8407,\n        kErrorDsCodeInconsistency = 8408,\n        kErrorDsDatabaseError = 8409,\n        kErrorDsGovernsidMissing = 8410,\n        kErrorDsMissingExpectedAtt = 8411,\n        kErrorDsNcnameMissingCrRef = 8412,\n        kErrorDsSecurityCheckingError = 8413,\n        kErrorDsSchemaNotLoaded = 8414,\n        kErrorDsSchemaAllocFailed = 8415,\n        kErrorDsAttSchemaReqSyntax = 8416,\n        kErrorDsGcverifyError = 8417,\n        kErrorDsDraSchemaMismatch = 8418,\n        kErrorDsCantFindDsaObj = 8419,\n        kErrorDsCantFindExpectedNc = 8420,\n        kErrorDsCantFindNcInCache = 8421,\n        kErrorDsCantRetrieveChild = 8422,\n        kErrorDsSecurityIllegalModify = 8423,\n        kErrorDsCantReplaceHiddenRec = 8424,\n        kErrorDsBadHierarchyFile = 8425,\n        kErrorDsBuildHierarchyTableFailed = 8426,\n        kErrorDsConfigParamMissing = 8427,\n        kErrorDsCountingAbIndicesFailed = 8428,\n        kErrorDsHierarchyTableMallocFailed = 8429,\n        kErrorDsInternalFailure = 8430,\n        kErrorDsUnknownError = 8431,\n        kErrorDsRootRequiresClassTop = 8432,\n        kErrorDsRefusingFsmoRoles = 8433,\n        kErrorDsMissingFsmoSettings = 8434,\n        kErrorDsUnableToSurrenderRoles = 8435,\n        kErrorDsDraGeneric = 8436,\n        kErrorDsDraInvalidParameter = 8437,\n        kErrorDsDraBusy = 8438,\n        kErrorDsDraBadDn = 8439,\n        kErrorDsDraBadNc = 8440,\n        kErrorDsDraDnExists = 8441,\n        kErrorDsDraInternalError = 8442,\n        kErrorDsDraInconsistentDit = 8443,\n        kErrorDsDraConnectionFailed = 8444,\n        kErrorDsDraBadInstanceType = 8445,\n        kErrorDsDraOutOfMem = 8446,\n        kErrorDsDraMailProblem = 8447,\n        kErrorDsDraRefAlreadyExists = 8448,\n        kErrorDsDraRefNotFound = 8449,\n        kErrorDsDraObjIsRepSource = 8450,\n        kErrorDsDraDbError = 8451,\n        kErrorDsDraNoReplica = 8452,\n        kErrorDsDraAccessDenied = 8453,\n        kErrorDsDraNotSupported = 8454,\n        kErrorDsDraRpcCancelled = 8455,\n        kErrorDsDraSourceDisabled = 8456,\n        kErrorDsDraSinkDisabled = 8457,\n        kErrorDsDraNameCollision = 8458,\n        kErrorDsDraSourceReinstalled = 8459,\n        kErrorDsDraMissingParent = 8460,\n        kErrorDsDraPreempted = 8461,\n        kErrorDsDraAbandonSync = 8462,\n        kErrorDsDraShutdown = 8463,\n        kErrorDsDraIncompatiblePartialSet = 8464,\n        kErrorDsDraSourceIsPartialReplica = 8465,\n        kErrorDsDraExtnConnectionFailed = 8466,\n        kErrorDsInstallSchemaMismatch = 8467,\n        kErrorDsDupLinkId = 8468,\n        kErrorDsNameErrorResolving = 8469,\n        kErrorDsNameErrorNotFound = 8470,\n        kErrorDsNameErrorNotUnique = 8471,\n        kErrorDsNameErrorNoMapping = 8472,\n        kErrorDsNameErrorDomainOnly = 8473,\n        kErrorDsNameErrorNoSyntacticalMapping = 8474,\n        kErrorDsConstructedAttMod = 8475,\n        kErrorDsWrongOmObjClass = 8476,\n        kErrorDsDraReplPending = 8477,\n        kErrorDsDsRequired = 8478,\n        kErrorDsInvalidLdapDisplayName = 8479,\n        kErrorDsNonBaseSearch = 8480,\n        kErrorDsCantRetrieveAtts = 8481,\n        kErrorDsBacklinkWithoutLink = 8482,\n        kErrorDsEpochMismatch = 8483,\n        kErrorDsSrcNameMismatch = 8484,\n        kErrorDsSrcAndDstNcIdentical = 8485,\n        kErrorDsDstNcMismatch = 8486,\n        kErrorDsNotAuthoritiveForDstNc = 8487,\n        kErrorDsSrcGuidMismatch = 8488,\n        kErrorDsCantMoveDeletedObject = 8489,\n        kErrorDsPdcOperationInProgress = 8490,\n        kErrorDsCrossDomainCleanupReqd = 8491,\n        kErrorDsIllegalXdomMoveOperation = 8492,\n        kErrorDsCantWithAcctGroupMembershps = 8493,\n        kErrorDsNcMustHaveNcParent = 8494,\n        kErrorDsDstDomainNotNative = 8496,\n        kErrorDsMissingInfrastructureContainer = 8497,\n        kErrorDsCantMoveAccountGroup = 8498,\n        kErrorDsCantMoveResourceGroup = 8499,\n        kErrorDsInvalidSearchFlag = 8500,\n        kErrorDsNoTreeDeleteAboveNc = 8501,\n        kErrorDsCouldntLockTreeForDelete = 8502,\n        kErrorDsCouldntIdentifyObjectsForTreeDelete = 8503,\n        kErrorDsSamInitFailure = 8504,\n        kErrorDsSensitiveGroupViolation = 8505,\n        kErrorDsCantModPrimarygroupid = 8506,\n        kErrorDsIllegalBaseSchemaMod = 8507,\n        kErrorDsNonsafeSchemaChange = 8508,\n        kErrorDsSchemaUpdateDisallowed = 8509,\n        kErrorDsCantCreateUnderSchema = 8510,\n        kErrorDsInstallNoSrcSchVersion = 8511,\n        kErrorDsInstallNoSchVersionInInifile = 8512,\n        kErrorDsInvalidGroupType = 8513,\n        kErrorDsNoNestGlobalgroupInMixeddomain = 8514,\n        kErrorDsNoNestLocalgroupInMixeddomain = 8515,\n        kErrorDsGlobalCantHaveLocalMember = 8516,\n        kErrorDsGlobalCantHaveUniversalMember = 8517,\n        kErrorDsUniversalCantHaveLocalMember = 8518,\n        kErrorDsGlobalCantHaveCrossdomainMember = 8519,\n        kErrorDsLocalCantHaveCrossdomainLocalMember = 8520,\n        kErrorDsHavePrimaryMembers = 8521,\n        kErrorDsStringSdConversionFailed = 8522,\n        kErrorDsNamingMasterGc = 8523,\n        kErrorDsLookupFailure = 8524,\n        kErrorDsCouldntUpdateSpns = 8525,\n        kErrorDsCantRetrieveSd = 8526,\n        kErrorDsKeyNotUnique = 8527,\n        kErrorDsWrongLinkedAttSyntax = 8528,\n        kErrorDsSamNeedBootkeyPassword = 8529,\n        kErrorDsSamNeedBootkeyFloppy = 8530,\n        kErrorDsCantStart = 8531,\n        kErrorDsInitFailure = 8532,\n        kErrorDsNoPktPrivacyOnConnection = 8533,\n        kErrorDsSourceDomainInForest = 8534,\n        kErrorDsDestinationDomainNotInForest = 8535,\n        kErrorDsDestinationAuditingNotEnabled = 8536,\n        kErrorDsCantFindDcForSrcDomain = 8537,\n        kErrorDsSrcObjNotGroupOrUser = 8538,\n        kErrorDsSrcSidExistsInForest = 8539,\n        kErrorDsSrcAndDstObjectClassMismatch = 8540,\n        kErrorSamInitFailure = 8541,\n        kErrorDsDraSchemaInfoShip = 8542,\n        kErrorDsDraSchemaConflict = 8543,\n        kErrorDsDraEarlierSchemaConlict = 8544,\n        kErrorDsDraObjNcMismatch = 8545,\n        kErrorDsNcStillHasDsas = 8546,\n        kErrorDsGcRequired = 8547,\n        kErrorDsLocalMemberOfLocalOnly = 8548,\n        kErrorDsNoFpoInUniversalGroups = 8549,\n        kErrorDsCantAddToGc = 8550,\n        kErrorDsNoCheckpointWithPdc = 8551,\n        kErrorDsSourceAuditingNotEnabled = 8552,\n        kErrorDsCantCreateInNondomainNc = 8553,\n        kErrorDsInvalidNameForSpn = 8554,\n        kErrorDsFilterUsesContructedAttrs = 8555,\n        kErrorDsUnicodepwdNotInQuotes = 8556,\n        kErrorDsMachineAccountQuotaExceeded = 8557,\n        kErrorDsMustBeRunOnDstDc = 8558,\n        kErrorDsSrcDcMustBeSp4OrGreater = 8559,\n        kErrorDsCantTreeDeleteCriticalObj = 8560,\n        kErrorDsInitFailureConsole = 8561,\n        kErrorDsSamInitFailureConsole = 8562,\n        kErrorDsForestVersionTooHigh = 8563,\n        kErrorDsDomainVersionTooHigh = 8564,\n        kErrorDsForestVersionTooLow = 8565,\n        kErrorDsDomainVersionTooLow = 8566,\n        kErrorDsIncompatibleVersion = 8567,\n        kErrorDsLowDsaVersion = 8568,\n        kErrorDsNoBehaviorVersionInMixeddomain = 8569,\n        kErrorDsNotSupportedSortOrder = 8570,\n        kErrorDsNameNotUnique = 8571,\n        kErrorDsMachineAccountCreatedPrent4 = 8572,\n        kErrorDsOutOfVersionStore = 8573,\n        kErrorDsIncompatibleControlsUsed = 8574,\n        kErrorDsNoRefDomain = 8575,\n        kErrorDsReservedLinkId = 8576,\n        kErrorDsLinkIdNotAvailable = 8577,\n        kErrorDsAgCantHaveUniversalMember = 8578,\n        kErrorDsModifydnDisallowedByInstanceType = 8579,\n        kErrorDsNoObjectMoveInSchemaNc = 8580,\n        kErrorDsModifydnDisallowedByFlag = 8581,\n        kErrorDsModifydnWrongGrandparent = 8582,\n        kErrorDsNameErrorTrustReferral = 8583,\n        kErrorNotSupportedOnStandardServer = 8584,\n        kErrorDsCantAccessRemotePartOfAd = 8585,\n        kErrorDsCrImpossibleToValidate = 8586,\n        kErrorDsThreadLimitExceeded = 8587,\n        kErrorDsNotClosest = 8588,\n        kErrorDsCantDeriveSpnWithoutServerRef = 8589,\n        kErrorDsSingleUserModeFailed = 8590,\n        kErrorDsNtdscriptSyntaxError = 8591,\n        kErrorDsNtdscriptProcessError = 8592,\n        kErrorDsDifferentReplEpochs = 8593,\n        kErrorDsDrsExtensionsChanged = 8594,\n        kErrorDsReplicaSetChangeNotAllowedOnDisabledCr = 8595,\n        kErrorDsNoMsdsIntid = 8596,\n        kErrorDsDupMsdsIntid = 8597,\n        kErrorDsExistsInRdnattid = 8598,\n        kErrorDsAuthorizationFailed = 8599,\n        kErrorDsInvalidScript = 8600,\n        kErrorDsRemoteCrossrefOpFailed = 8601,\n        kDnsErrorRcodeFormatError = 9001,\n        kDnsErrorRcodeServerFailure = 9002,\n        kDnsErrorRcodeNameError = 9003,\n        kDnsErrorRcodeNotImplemented = 9004,\n        kDnsErrorRcodeRefused = 9005,\n        kDnsErrorRcodeYxdomain = 9006,\n        kDnsErrorRcodeYxrrset = 9007,\n        kDnsErrorRcodeNxrrset = 9008,\n        kDnsErrorRcodeNotauth = 9009,\n        kDnsErrorRcodeNotzone = 9010,\n        kDnsErrorRcodeBadsig = 9016,\n        kDnsErrorRcodeBadkey = 9017,\n        kDnsErrorRcodeBadtime = 9018,\n        kDnsInfoNoRecords = 9501,\n        kDnsErrorBadPacket = 9502,\n        kDnsErrorNoPacket = 9503,\n        kDnsErrorRcode = 9504,\n        kDnsErrorUnsecurePacket = 9505,\n        kDnsErrorInvalidType = 9551,\n        kDnsErrorInvalidIpAddress = 9552,\n        kDnsErrorInvalidProperty = 9553,\n        kDnsErrorTryAgainLater = 9554,\n        kDnsErrorNotUnique = 9555,\n        kDnsErrorNonRfcName = 9556,\n        kDnsStatusFqdn = 9557,\n        kDnsStatusDottedName = 9558,\n        kDnsStatusSinglePartName = 9559,\n        kDnsErrorInvalidNameChar = 9560,\n        kDnsErrorNumericName = 9561,\n        kDnsErrorNotAllowedOnRootServer = 9562,\n        kDnsErrorZoneDoesNotExist = 9601,\n        kDnsErrorNoZoneInfo = 9602,\n        kDnsErrorInvalidZoneOperation = 9603,\n        kDnsErrorZoneConfigurationError = 9604,\n        kDnsErrorZoneHasNoSoaRecord = 9605,\n        kDnsErrorZoneHasNoNsRecords = 9606,\n        kDnsErrorZoneLocked = 9607,\n        kDnsErrorZoneCreationFailed = 9608,\n        kDnsErrorZoneAlreadyExists = 9609,\n        kDnsErrorAutozoneAlreadyExists = 9610,\n        kDnsErrorInvalidZoneType = 9611,\n        kDnsErrorSecondaryRequiresMasterIp = 9612,\n        kDnsErrorZoneNotSecondary = 9613,\n        kDnsErrorNeedSecondaryAddresses = 9614,\n        kDnsErrorWinsInitFailed = 9615,\n        kDnsErrorNeedWinsServers = 9616,\n        kDnsErrorNbstatInitFailed = 9617,\n        kDnsErrorSoaDeleteInvalid = 9618,\n        kDnsErrorForwarderAlreadyExists = 9619,\n        kDnsErrorZoneRequiresMasterIp = 9620,\n        kDnsErrorZoneIsShutdown = 9621,\n        kDnsErrorPrimaryRequiresDatafile = 9651,\n        kDnsErrorInvalidDatafileName = 9652,\n        kDnsErrorDatafileOpenFailure = 9653,\n        kDnsErrorFileWritebackFailed = 9654,\n        kDnsErrorDatafileParsing = 9655,\n        kDnsErrorRecordDoesNotExist = 9701,\n        kDnsErrorRecordFormat = 9702,\n        kDnsErrorNodeCreationFailed = 9703,\n        kDnsErrorUnknownRecordType = 9704,\n        kDnsErrorRecordTimedOut = 9705,\n        kDnsErrorNameNotInZone = 9706,\n        kDnsErrorCnameLoop = 9707,\n        kDnsErrorNodeIsCname = 9708,\n        kDnsErrorCnameCollision = 9709,\n        kDnsErrorRecordOnlyAtZoneRoot = 9710,\n        kDnsErrorRecordAlreadyExists = 9711,\n        kDnsErrorSecondaryData = 9712,\n        kDnsErrorNoCreateCacheData = 9713,\n        kDnsErrorNameDoesNotExist = 9714,\n        kDnsWarningPtrCreateFailed = 9715,\n        kDnsWarningDomainUndeleted = 9716,\n        kDnsErrorDsUnavailable = 9717,\n        kDnsErrorDsZoneAlreadyExists = 9718,\n        kDnsErrorNoBootfileIfDsZone = 9719,\n        kDnsInfoAxfrComplete = 9751,\n        kDnsErrorAxfr = 9752,\n        kDnsInfoAddedLocalWins = 9753,\n        kDnsStatusContinueNeeded = 9801,\n        kDnsErrorNoTcpip = 9851,\n        kDnsErrorNoDnsServers = 9852,\n        kDnsErrorDpDoesNotExist = 9901,\n        kDnsErrorDpAlreadyExists = 9902,\n        kDnsErrorDpNotEnlisted = 9903,\n        kDnsErrorDpAlreadyEnlisted = 9904,\n        kWSAeintr = 10004,\n        kWSAebadf = 10009,\n        kWSAeacces = 10013,\n        kWSAefault = 10014,\n        kWSAeinval = 10022,\n        kWSAemfile = 10024,\n        kWSAewouldblock = 10035,\n        kWSAeinprogress = 10036,\n        kWSAealready = 10037,\n        kWSAenotsock = 10038,\n        kWSAedestaddrreq = 10039,\n        kWSAemsgsize = 10040,\n        kWSAeprototype = 10041,\n        kWSAenoprotoopt = 10042,\n        kWSAeprotonosupport = 10043,\n        kWSAesocktnosupport = 10044,\n        kWSAeopnotsupp = 10045,\n        kWSAepfnosupport = 10046,\n        kWSAeafnosupport = 10047,\n        kWSAeaddrinuse = 10048,\n        kWSAeaddrnotavail = 10049,\n        kWSAenetdown = 10050,\n        kWSAenetunreach = 10051,\n        kWSAenetreset = 10052,\n        kWSAeconnaborted = 10053,\n        kWSAeconnreset = 10054,\n        kWSAenobufs = 10055,\n        kWSAeisconn = 10056,\n        kWSAenotconn = 10057,\n        kWSAeshutdown = 10058,\n        kWSAetoomanyrefs = 10059,\n        kWSAetimedout = 10060,\n        kWSAeconnrefused = 10061,\n        kWSAeloop = 10062,\n        kWSAenametoolong = 10063,\n        kWSAehostdown = 10064,\n        kWSAehostunreach = 10065,\n        kWSAenotempty = 10066,\n        kWSAeproclim = 10067,\n        kWSAeusers = 10068,\n        kWSAedquot = 10069,\n        kWSAestale = 10070,\n        kWSAeremote = 10071,\n        kWSAsysnotready = 10091,\n        kWSAvernotsupported = 10092,\n        kWSAnotinitialised = 10093,\n        kWSAediscon = 10101,\n        kWSAenomore = 10102,\n        kWSAecancelled = 10103,\n        kWSAeinvalidproctable = 10104,\n        kWSAeinvalidprovider = 10105,\n        kWSAeproviderfailedinit = 10106,\n        kWSAsyscallfailure = 10107,\n        kWSAserviceNotFound = 10108,\n        kWSAtypeNotFound = 10109,\n        kWSAENoMore = 10110,\n        kWSAECancelled = 10111,\n        kWSAerefused = 10112,\n        kWSAhostNotFound = 11001,\n        kWSAtryAgain = 11002,\n        kWSAnoRecovery = 11003,\n        kWSAnoData = 11004,\n        kWSAQosReceivers = 11005,\n        kWSAQosSenders = 11006,\n        kWSAQosNoSenders = 11007,\n        kWSAQosNoReceivers = 11008,\n        kWSAQosRequestConfirmed = 11009,\n        kWSAQosAdmissionFailure = 11010,\n        kWSAQosPolicyFailure = 11011,\n        kWSAQosBadStyle = 11012,\n        kWSAQosBadObject = 11013,\n        kWSAQosTrafficCtrlError = 11014,\n        kWSAQosGenericError = 11015,\n        kWSAQosEservicetype = 11016,\n        kWSAQosEflowspec = 11017,\n        kWSAQosEprovspecbuf = 11018,\n        kWSAQosEfilterstyle = 11019,\n        kWSAQosEfiltertype = 11020,\n        kWSAQosEfiltercount = 11021,\n        kWSAQosEobjlength = 11022,\n        kWSAQosEflowcount = 11023,\n        kWSAQosEunknownpsobj = 11024,\n        kWSAQosEpolicyobj = 11025,\n        kWSAQosEflowdesc = 11026,\n        kWSAQosEpsflowspec = 11027,\n        kWSAQosEpsfilterspec = 11028,\n        kWSAQosEsdmodeobj = 11029,\n        kWSAQosEshaperateobj = 11030,\n        kWSAQosReservedPetype = 11031,\n        kErrorIpsecQmPolicyExists = 13000,\n        kErrorIpsecQmPolicyNotFound = 13001,\n        kErrorIpsecQmPolicyInUse = 13002,\n        kErrorIpsecMmPolicyExists = 13003,\n        kErrorIpsecMmPolicyNotFound = 13004,\n        kErrorIpsecMmPolicyInUse = 13005,\n        kErrorIpsecMmFilterExists = 13006,\n        kErrorIpsecMmFilterNotFound = 13007,\n        kErrorIpsecTransportFilterExists = 13008,\n        kErrorIpsecTransportFilterNotFound = 13009,\n        kErrorIpsecMmAuthExists = 13010,\n        kErrorIpsecMmAuthNotFound = 13011,\n        kErrorIpsecMmAuthInUse = 13012,\n        kErrorIpsecDefaultMmPolicyNotFound = 13013,\n        kErrorIpsecDefaultMmAuthNotFound = 13014,\n        kErrorIpsecDefaultQmPolicyNotFound = 13015,\n        kErrorIpsecTunnelFilterExists = 13016,\n        kErrorIpsecTunnelFilterNotFound = 13017,\n        kErrorIpsecMmFilterPendingDeletion = 13018,\n        kErrorIpsecTransportFilterPendingDeletion = 13019,\n        kErrorIpsecTunnelFilterPendingDeletion = 13020,\n        kErrorIpsecMmPolicyPendingDeletion = 13021,\n        kErrorIpsecMmAuthPendingDeletion = 13022,\n        kErrorIpsecQmPolicyPendingDeletion = 13023,\n        kErrorIpsecIkeAuthFail = 13801,\n        kErrorIpsecIkeAttribFail = 13802,\n        kErrorIpsecIkeNegotiationPending = 13803,\n        kErrorIpsecIkeGeneralProcessingError = 13804,\n        kErrorIpsecIkeTimedOut = 13805,\n        kErrorIpsecIkeNoCert = 13806,\n        kErrorIpsecIkeSaDeleted = 13807,\n        kErrorIpsecIkeSaReaped = 13808,\n        kErrorIpsecIkeMmAcquireDrop = 13809,\n        kErrorIpsecIkeQmAcquireDrop = 13810,\n        kErrorIpsecIkeQueueDropMm = 13811,\n        kErrorIpsecIkeQueueDropNoMm = 13812,\n        kErrorIpsecIkeDropNoResponse = 13813,\n        kErrorIpsecIkeMmDelayDrop = 13814,\n        kErrorIpsecIkeQmDelayDrop = 13815,\n        kErrorIpsecIkeError = 13816,\n        kErrorIpsecIkeCrlFailed = 13817,\n        kErrorIpsecIkeInvalidKeyUsage = 13818,\n        kErrorIpsecIkeInvalidCertType = 13819,\n        kErrorIpsecIkeNoPrivateKey = 13820,\n        kErrorIpsecIkeDhFail = 13822,\n        kErrorIpsecIkeInvalidHeader = 13824,\n        kErrorIpsecIkeNoPolicy = 13825,\n        kErrorIpsecIkeInvalidSignature = 13826,\n        kErrorIpsecIkeKerberosError = 13827,\n        kErrorIpsecIkeNoPublicKey = 13828,\n        kErrorIpsecIkeProcessErr = 13829,\n        kErrorIpsecIkeProcessErrSa = 13830,\n        kErrorIpsecIkeProcessErrProp = 13831,\n        kErrorIpsecIkeProcessErrTrans = 13832,\n        kErrorIpsecIkeProcessErrKe = 13833,\n        kErrorIpsecIkeProcessErrId = 13834,\n        kErrorIpsecIkeProcessErrCert = 13835,\n        kErrorIpsecIkeProcessErrCertReq = 13836,\n        kErrorIpsecIkeProcessErrHash = 13837,\n        kErrorIpsecIkeProcessErrSig = 13838,\n        kErrorIpsecIkeProcessErrNonce = 13839,\n        kErrorIpsecIkeProcessErrNotify = 13840,\n        kErrorIpsecIkeProcessErrDelete = 13841,\n        kErrorIpsecIkeProcessErrVendor = 13842,\n        kErrorIpsecIkeInvalidPayload = 13843,\n        kErrorIpsecIkeLoadSoftSa = 13844,\n        kErrorIpsecIkeSoftSaTornDown = 13845,\n        kErrorIpsecIkeInvalidCookie = 13846,\n        kErrorIpsecIkeNoPeerCert = 13847,\n        kErrorIpsecIkePeerCrlFailed = 13848,\n        kErrorIpsecIkePolicyChange = 13849,\n        kErrorIpsecIkeNoMmPolicy = 13850,\n        kErrorIpsecIkeNotcbpriv = 13851,\n        kErrorIpsecIkeSecloadfail = 13852,\n        kErrorIpsecIkeFailsspinit = 13853,\n        kErrorIpsecIkeFailqueryssp = 13854,\n        kErrorIpsecIkeSrvacqfail = 13855,\n        kErrorIpsecIkeSrvquerycred = 13856,\n        kErrorIpsecIkeGetspifail = 13857,\n        kErrorIpsecIkeInvalidFilter = 13858,\n        kErrorIpsecIkeOutOfMemory = 13859,\n        kErrorIpsecIkeAddUpdateKeyFailed = 13860,\n        kErrorIpsecIkeInvalidPolicy = 13861,\n        kErrorIpsecIkeUnknownDoi = 13862,\n        kErrorIpsecIkeInvalidSituation = 13863,\n        kErrorIpsecIkeDhFailure = 13864,\n        kErrorIpsecIkeInvalidGroup = 13865,\n        kErrorIpsecIkeEncrypt = 13866,\n        kErrorIpsecIkeDecrypt = 13867,\n        kErrorIpsecIkePolicyMatch = 13868,\n        kErrorIpsecIkeUnsupportedId = 13869,\n        kErrorIpsecIkeInvalidHash = 13870,\n        kErrorIpsecIkeInvalidHashAlg = 13871,\n        kErrorIpsecIkeInvalidHashSize = 13872,\n        kErrorIpsecIkeInvalidEncryptAlg = 13873,\n        kErrorIpsecIkeInvalidAuthAlg = 13874,\n        kErrorIpsecIkeInvalidSig = 13875,\n        kErrorIpsecIkeLoadFailed = 13876,\n        kErrorIpsecIkeRpcDelete = 13877,\n        kErrorIpsecIkeBenignReinit = 13878,\n        kErrorIpsecIkeInvalidResponderLifetimeNotify = 13879,\n        kErrorIpsecIkeInvalidCertKeylen = 13881,\n        kErrorIpsecIkeMmLimit = 13882,\n        kErrorIpsecIkeNegotiationDisabled = 13883,\n        kErrorIpsecIkeNegStatusEnd = 13884,\n        kErrorSxsSectionNotFound = 14000,\n        kErrorSxsCantGenActctx = 14001,\n        kErrorSxsInvalidActctxdataFormat = 14002,\n        kErrorSxsAssemblyNotFound = 14003,\n        kErrorSxsManifestFormatError = 14004,\n        kErrorSxsManifestParseError = 14005,\n        kErrorSxsActivationContextDisabled = 14006,\n        kErrorSxsKeyNotFound = 14007,\n        kErrorSxsVersionConflict = 14008,\n        kErrorSxsWrongSectionType = 14009,\n        kErrorSxsThreadQueriesDisabled = 14010,\n        kErrorSxsProcessDefaultAlreadySet = 14011,\n        kErrorSxsUnknownEncodingGroup = 14012,\n        kErrorSxsUnknownEncoding = 14013,\n        kErrorSxsInvalidXmlNamespaceUri = 14014,\n        kErrorSxsRootManifestDependencyNotInstalled = 14015,\n        kErrorSxsLeafManifestDependencyNotInstalled = 14016,\n        kErrorSxsInvalidAssemblyIdentityAttribute = 14017,\n        kErrorSxsManifestMissingRequiredDefaultNamespace = 14018,\n        kErrorSxsManifestInvalidRequiredDefaultNamespace = 14019,\n        kErrorSxsPrivateManifestCrossPathWithReparsePoint = 14020,\n        kErrorSxsDuplicateDllName = 14021,\n        kErrorSxsDuplicateWindowclassName = 14022,\n        kErrorSxsDuplicateClsid = 14023,\n        kErrorSxsDuplicateIid = 14024,\n        kErrorSxsDuplicateTlbid = 14025,\n        kErrorSxsDuplicateProgid = 14026,\n        kErrorSxsDuplicateAssemblyName = 14027,\n        kErrorSxsFileHashMismatch = 14028,\n        kErrorSxsPolicyParseError = 14029,\n        kErrorSxsXmlEMissingquote = 14030,\n        kErrorSxsXmlECommentsyntax = 14031,\n        kErrorSxsXmlEBadstartnamechar = 14032,\n        kErrorSxsXmlEBadnamechar = 14033,\n        kErrorSxsXmlEBadcharinstring = 14034,\n        kErrorSxsXmlEXmldeclsyntax = 14035,\n        kErrorSxsXmlEBadchardata = 14036,\n        kErrorSxsXmlEMissingwhitespace = 14037,\n        kErrorSxsXmlEExpectingtagend = 14038,\n        kErrorSxsXmlEMissingsemicolon = 14039,\n        kErrorSxsXmlEUnbalancedparen = 14040,\n        kErrorSxsXmlEInternalerror = 14041,\n        kErrorSxsXmlEUnexpectedWhitespace = 14042,\n        kErrorSxsXmlEIncompleteEncoding = 14043,\n        kErrorSxsXmlEMissingParen = 14044,\n        kErrorSxsXmlEExpectingclosequote = 14045,\n        kErrorSxsXmlEMultipleColons = 14046,\n        kErrorSxsXmlEInvalidDecimal = 14047,\n        kErrorSxsXmlEInvalidHexidecimal = 14048,\n        kErrorSxsXmlEInvalidUnicode = 14049,\n        kErrorSxsXmlEWhitespaceorquestionmark = 14050,\n        kErrorSxsXmlEUnexpectedendtag = 14051,\n        kErrorSxsXmlEUnclosedtag = 14052,\n        kErrorSxsXmlEDuplicateattribute = 14053,\n        kErrorSxsXmlEMultipleroots = 14054,\n        kErrorSxsXmlEInvalidatrootlevel = 14055,\n        kErrorSxsXmlEBadxmldecl = 14056,\n        kErrorSxsXmlEMissingroot = 14057,\n        kErrorSxsXmlEUnexpectedeof = 14058,\n        kErrorSxsXmlEBadperefinsubset = 14059,\n        kErrorSxsXmlEUnclosedstarttag = 14060,\n        kErrorSxsXmlEUnclosedendtag = 14061,\n        kErrorSxsXmlEUnclosedstring = 14062,\n        kErrorSxsXmlEUnclosedcomment = 14063,\n        kErrorSxsXmlEUncloseddecl = 14064,\n        kErrorSxsXmlEUnclosedcdata = 14065,\n        kErrorSxsXmlEReservednamespace = 14066,\n        kErrorSxsXmlEInvalidencoding = 14067,\n        kErrorSxsXmlEInvalidswitch = 14068,\n        kErrorSxsXmlEBadxmlcase = 14069,\n        kErrorSxsXmlEInvalidStandalone = 14070,\n        kErrorSxsXmlEUnexpectedStandalone = 14071,\n        kErrorSxsXmlEInvalidVersion = 14072,\n        kErrorSxsXmlEMissingequals = 14073,\n        kErrorSxsProtectionRecoveryFailed = 14074,\n        kErrorSxsProtectionPublicKeyTooShort = 14075,\n        kErrorSxsProtectionCatalogNotValid = 14076,\n        kErrorSxsUntranslatableHresult = 14077,\n        kErrorSxsProtectionCatalogFileMissing = 14078,\n        kErrorSxsMissingAssemblyIdentityAttribute = 14079,\n        kErrorSxsInvalidAssemblyIdentityAttributeName = 14080\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Event.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"os/Event.h\"\n#if IL2CPP_THREADS_WIN32\n#include \"os/Win32/EventImpl.h\"\n#elif IL2CPP_THREADS_PTHREAD\n#include \"os/Posix/EventImpl.h\"\n#else\n#include \"os/EventImpl.h\"\n#endif\n\n\nnamespace il2cpp\n{\nnamespace os\n{\n    Event::Event(bool manualReset, bool signaled)\n        : m_Event(new EventImpl(manualReset, signaled))\n    {\n    }\n\n    Event::~Event()\n    {\n        delete m_Event;\n    }\n\n    ErrorCode Event::Set()\n    {\n        return m_Event->Set();\n    }\n\n    ErrorCode Event::Reset()\n    {\n        return m_Event->Reset();\n    }\n\n    WaitStatus Event::Wait(bool interruptible)\n    {\n        return m_Event->Wait(interruptible);\n    }\n\n    WaitStatus Event::Wait(uint32_t ms, bool interruptible)\n    {\n        return m_Event->Wait(ms, interruptible);\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Event.h",
    "content": "#pragma once\n\n#include \"os/ErrorCodes.h\"\n#include \"os/Handle.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class EventImpl;\n\n    class Event : public il2cpp::utils::NonCopyable\n    {\n    public:\n        Event(bool manualReset = false, bool signaled = false);\n        ~Event();\n\n        ErrorCode Set();\n        ErrorCode Reset();\n        WaitStatus Wait(bool interruptible = false);\n        WaitStatus Wait(uint32_t ms, bool interruptible = false);\n\n    private:\n        EventImpl* m_Event;\n    };\n\n    class EventHandle : public Handle\n    {\n    public:\n        EventHandle(Event* event)\n            : m_Event(event) {}\n\n        virtual ~EventHandle() { delete m_Event; }\n        virtual bool Wait() { m_Event->Wait(true); return true; }\n        virtual bool Wait(uint32_t ms) { return m_Event->Wait(ms, true) != kWaitStatusTimeout; }\n        virtual void Signal() { m_Event->Set(); }\n        Event& Get() { return *m_Event; }\n\n    private:\n        Event* m_Event;\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/File.h",
    "content": "#pragma once\n#include \"il2cpp-config.h\"\n\n\n#include <stdint.h>\n#include <string>\n#include \"os/ErrorCodes.h\"\n#include \"os/OSGlobalEnums.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    // File enums and structs\n    struct FileHandle;\n\n    struct FileStat\n    {\n        std::string name;\n        int32_t attributes;\n        int64_t length;\n        int64_t creation_time;\n        int64_t last_access_time;\n        int64_t last_write_time;\n    };\n\n    class LIBIL2CPP_CODEGEN_API File\n    {\n    public:\n\n\n        static bool Isatty(FileHandle* fileHandle);\n        static FileHandle* GetStdInput();\n        static FileHandle* GetStdOutput();\n        static FileHandle* GetStdError();\n        static bool CreatePipe(FileHandle** read_handle, FileHandle** write_handle);\n        static bool CreatePipe(FileHandle** read_handle, FileHandle** write_handle, int* error);\n        static FileType GetFileType(FileHandle* handle);\n        static UnityPalFileAttributes GetFileAttributes(const std::string& path, int* error);\n        static bool SetFileAttributes(const std::string& path, UnityPalFileAttributes attributes, int* error);\n        static bool GetFileStat(const std::string& path, FileStat * stat, int* error);\n        static bool CopyFile(const std::string& src, const std::string& dest, bool overwrite, int* error);\n        static bool MoveFile(const std::string& src, const std::string& dest, int* error);\n        static bool DeleteFile(const std::string& path, int *error);\n        static bool ReplaceFile(const std::string& sourceFileName, const std::string& destinationFileName, const std::string& destinationBackupFileName, bool ignoreMetadataErrors, int* error);\n        static FileHandle* Open(const std::string& path, int openMode, int accessMode, int shareMode, int options, int *error);\n        static bool Close(FileHandle* handle, int *error);\n        static bool SetFileTime(FileHandle* handle, int64_t creation_time, int64_t last_access_time, int64_t last_write_time, int* error);\n        static int64_t GetLength(FileHandle* handle, int *error);\n        static bool SetLength(FileHandle* handle, int64_t length, int *error);\n        static int64_t Seek(FileHandle* handle, int64_t offset, int origin, int *error);\n        static int Read(FileHandle* handle, char *dest, int count, int *error);\n        static int32_t Write(FileHandle* handle, const char* buffer, int count, int *error);\n        static bool Flush(FileHandle* handle, int* error);\n        static void Lock(FileHandle* handle,  int64_t position, int64_t length, int* error);\n        static void Unlock(FileHandle* handle,  int64_t position, int64_t length, int* error);\n\n        static bool DuplicateHandle(FileHandle* source_process_handle, FileHandle* source_handle, FileHandle* target_process_handle,\n            FileHandle** target_handle, int access, int inherit, int options, int* error);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/FileSystemWatcher.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace FileSystemWatcher\n{\n    int IsSupported();\n}\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Generic/COM.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"os/COM.h\"\n\n#if IL2CPP_USE_GENERIC_COM\n\nnamespace il2cpp\n{\nnamespace os\n{\n    il2cpp_hresult_t COM::CreateInstance(const Il2CppGuid& clsid, Il2CppIUnknown** object)\n    {\n        NO_UNUSED_WARNING(clsid);\n        IL2CPP_ASSERT(object);\n        *object = NULL;\n        return IL2CPP_REGDB_E_CLASSNOTREG;\n    }\n\n    il2cpp_hresult_t COM::CreateFreeThreadedMarshaler(Il2CppIUnknown* outer, Il2CppIUnknown** marshal)\n    {\n        NO_UNUSED_WARNING(outer);\n        IL2CPP_ASSERT(marshal);\n        *marshal = NULL;\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n}\n}\n\n#endif\n\n\n#if IL2CPP_USE_GENERIC_COM_SAFEARRAYS\n\nnamespace il2cpp\n{\nnamespace os\n{\n// variant\n\n    void COM::VariantInit(Il2CppVariant* variant)\n    {\n        NO_UNUSED_WARNING(variant);\n    }\n\n    il2cpp_hresult_t COM::VariantClear(Il2CppVariant* variant)\n    {\n        NO_UNUSED_WARNING(variant);\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n\n// safe array\n\n    Il2CppSafeArray* COM::SafeArrayCreate(uint16_t type, uint32_t dimention_count, Il2CppSafeArrayBound* bounds)\n    {\n        NO_UNUSED_WARNING(type);\n        NO_UNUSED_WARNING(dimention_count);\n        NO_UNUSED_WARNING(bounds);\n        return NULL;\n    }\n\n    il2cpp_hresult_t COM::SafeArrayDestroy(Il2CppSafeArray* safeArray)\n    {\n        NO_UNUSED_WARNING(safeArray);\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n\n    il2cpp_hresult_t COM::SafeArrayAccessData(Il2CppSafeArray* safeArray, void** data)\n    {\n        NO_UNUSED_WARNING(safeArray);\n        IL2CPP_ASSERT(data);\n        *data = NULL;\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n\n    il2cpp_hresult_t COM::SafeArrayUnaccessData(Il2CppSafeArray* safeArray)\n    {\n        NO_UNUSED_WARNING(safeArray);\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n\n    il2cpp_hresult_t COM::SafeArrayGetVartype(Il2CppSafeArray* safeArray, uint16_t* type)\n    {\n        NO_UNUSED_WARNING(safeArray);\n        IL2CPP_ASSERT(type);\n        *type = 0;\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n\n    uint32_t COM::SafeArrayGetDim(Il2CppSafeArray* safeArray)\n    {\n        NO_UNUSED_WARNING(safeArray);\n        return 0;\n    }\n\n    il2cpp_hresult_t COM::SafeArrayGetLBound(Il2CppSafeArray* safeArray, uint32_t dimention, int32_t* bound)\n    {\n        NO_UNUSED_WARNING(safeArray);\n        NO_UNUSED_WARNING(dimention);\n        IL2CPP_ASSERT(bound);\n        *bound = 0;\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n\n    il2cpp_hresult_t COM::SafeArrayGetUBound(Il2CppSafeArray* safeArray, uint32_t dimention, int32_t* bound)\n    {\n        NO_UNUSED_WARNING(safeArray);\n        NO_UNUSED_WARNING(dimention);\n        IL2CPP_ASSERT(bound);\n        *bound = 0;\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Generic/Environment.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_USE_GENERIC_ENVIRONMENT\n#include \"os/Environment.h\"\n\n#include <cstdlib>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    std::string Environment::GetMachineName()\n    {\n        return \"il2cpp\";\n    }\n\n    int32_t Environment::GetProcessorCount()\n    {\n        return 1;\n    }\n\n    std::string Environment::GetOsVersionString()\n    {\n        return \"0.0.0.0\";\n    }\n\n    std::string Environment::GetOsUserName()\n    {\n        return \"Unknown\";\n    }\n\n    std::string Environment::GetEnvironmentVariable(const std::string& name)\n    {\n        return std::string(\"<NotImplemented>\");\n    }\n\n    void Environment::SetEnvironmentVariable(const std::string& name, const std::string& value)\n    {\n    }\n\n    std::vector<std::string> Environment::GetEnvironmentVariableNames()\n    {\n        NOT_IMPLEMENTED_ICALL(Environment::GetEnvironmentVariableNames);\n        return std::vector<std::string>();\n    }\n\n    std::string Environment::GetHomeDirectory()\n    {\n        NOT_IMPLEMENTED_ICALL(Environment::GetHomeDirectory);\n        return std::string();\n    }\n\n    std::vector<std::string> Environment::GetLogicalDrives()\n    {\n        NOT_IMPLEMENTED_ICALL(Environment::GetLogicalDrives);\n        return std::vector<std::string>();\n    }\n\n    void Environment::Exit(int result)\n    {\n        NOT_IMPLEMENTED_ICALL(Environment::Exit);\n    }\n\n    NORETURN void Environment::Abort()\n    {\n        abort();\n    }\n\n#if NET_4_0\n\n    bool Environment::Is64BitOs()\n    {\n        return false;\n    }\n\n#endif\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Generic/Initialize.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/Initialize.h\"\n\n#if !IL2CPP_TARGET_WINDOWS\n\nvoid il2cpp::os::Initialize()\n{\n}\n\nvoid il2cpp::os::Uninitialize()\n{\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Generic/MarshalStringAlloc.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_USE_GENERIC_COM\n#include \"os/MarshalStringAlloc.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    il2cpp_hresult_t MarshalStringAlloc::AllocateBStringLength(const Il2CppChar* text, int32_t length, Il2CppChar** bstr)\n    {\n        NO_UNUSED_WARNING(text);\n        NO_UNUSED_WARNING(length);\n        IL2CPP_ASSERT(bstr);\n        *bstr = NULL;\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n\n    il2cpp_hresult_t MarshalStringAlloc::GetBStringLength(const Il2CppChar* bstr, int32_t* length)\n    {\n        NO_UNUSED_WARNING(bstr);\n        IL2CPP_ASSERT(length);\n        *length = 0;\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n\n    il2cpp_hresult_t MarshalStringAlloc::FreeBString(Il2CppChar* bstr)\n    {\n        NO_UNUSED_WARNING(bstr);\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Generic/MemoryMappedFile.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_USE_GENERIC_MEMORY_MAPPED_FILE\n#include \"os/File.h\"\n#include \"os/MemoryMappedFile.h\"\n#include \"utils/Memory.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    void* MemoryMappedFile::Map(FileHandle* file, size_t length, size_t offset)\n    {\n        int error = 0;\n\n        if (!length)\n        {\n            length = os::File::GetLength(file, &error);\n            if (error != 0)\n            {\n                return NULL;\n            }\n        }\n\n        void* buffer = IL2CPP_MALLOC(length);\n\n        os::File::Seek(file, offset, 0, &error);\n        if (error != 0)\n        {\n            IL2CPP_FREE(buffer);\n            return NULL;\n        }\n\n        int bytesRead = File::Read(file, (char*)buffer, (int)length, &error);\n        if (bytesRead != length || error != 0)\n        {\n            IL2CPP_FREE(buffer);\n            return NULL;\n        }\n\n        return buffer;\n    }\n\n    void MemoryMappedFile::Unmap(void* address, size_t length)\n    {\n        IL2CPP_FREE(address);\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Generic/SocketImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_USE_GENERIC_SOCKET_IMPL\n\n#include \"os/Generic/SocketImpl.h\"\n\n#define SOCKET_NOT_IMPLEMENTED \\\n    IL2CPP_ASSERT(0 && \"The target platform does not support Sockets\");\n\nnamespace il2cpp\n{\nnamespace os\n{\n    void SocketImpl::Startup()\n    {\n    }\n\n    void SocketImpl::Cleanup()\n    {\n    }\n\n    WaitStatus SocketImpl::GetHostName(std::string &name)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::GetHostByAddr(const std::string &address, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::GetHostByName(const std::string &host, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    SocketImpl::SocketImpl(ThreadStatusCallback thread_status_callback)\n    {\n        SOCKET_NOT_IMPLEMENTED\n    }\n\n    SocketImpl::~SocketImpl()\n    {\n    }\n\n    WaitStatus SocketImpl::Create(AddressFamily family, SocketType type, ProtocolType protocol)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Create(SocketDescriptor fd, int32_t family, int32_t type, int32_t protocol)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Close()\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::SetBlocking(bool blocking)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    ErrorCode SocketImpl::GetLastError() const\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return (ErrorCode) - 1;\n    }\n\n    WaitStatus SocketImpl::Bind(const char *path)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Bind(const char *address, uint16_t port)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Bind(uint32_t address, uint16_t port)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Bind(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Connect(const char *path)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Shutdown(int32_t how)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Disconnect(bool reuse)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Connect(uint32_t address, uint16_t port)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Connect(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::GetLocalEndPointInfo(EndPointInfo &info)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::GetRemoteEndPointInfo(EndPointInfo &info)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Listen(int32_t backlog)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Accept(os::Socket **socket)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Receive(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Send(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::SendArray(WSABuf *wsabufs, int32_t count, int32_t *sent, SocketFlags c_flags)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::ReceiveArray(WSABuf *wsabufs, int32_t count, int32_t *len, SocketFlags flags)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::SendTo(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::SendTo(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::SendTo(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::RecvFrom(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::RecvFrom(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::RecvFrom(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Available(int32_t *amount)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Ioctl(int32_t command, const uint8_t *in_data, int32_t in_len, uint8_t *out_data, int32_t out_len, int32_t *written)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::GetSocketOption(SocketOptionLevel level, SocketOptionName name, uint8_t *buffer, int32_t *length)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::GetSocketOptionFull(SocketOptionLevel level, SocketOptionName name, int32_t *first, int32_t *second)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Poll(std::vector<PollRequest> &requests, int32_t count, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Poll(std::vector<PollRequest> &requests, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Poll(PollRequest& request, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::SetSocketOption(SocketOptionLevel level, SocketOptionName name, int32_t value)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::SetSocketOptionLinger(SocketOptionLevel level, SocketOptionName name, bool enabled, int32_t seconds)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::SetSocketOptionArray(SocketOptionLevel level, SocketOptionName name, const uint8_t *buffer, int32_t length)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, uint32_t group_address, uint32_t local_address)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n#if IL2CPP_SUPPORT_IPV6\n    WaitStatus SocketImpl::SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, IPv6Address ipv6, uint64_t interfaceOffset)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n\n#endif\n\n    WaitStatus SocketImpl::SendFile(const char *filename, TransmitFileBuffers *buffers, TransmitFileOptions options)\n    {\n        SOCKET_NOT_IMPLEMENTED\n\n        return kWaitStatusFailure;\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Generic/SocketImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_USE_GENERIC_SOCKET_IMPL\n\n#include <string>\n#include <vector>\n#include <stdint.h>\n\n#include \"os/Socket.h\"\n#include \"os/ErrorCodes.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class SocketImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n        typedef int32_t SocketDescriptor;\n\n        SocketImpl(ThreadStatusCallback thread_status_callback);\n        ~SocketImpl();\n\n        inline SocketDescriptor GetDescriptor()\n        {\n            return -1;\n        }\n\n        ErrorCode GetLastError() const;\n\n        WaitStatus Create(SocketDescriptor fd, int32_t family, int32_t type, int32_t protocol);\n        WaitStatus Create(AddressFamily family, SocketType type, ProtocolType protocol);\n        WaitStatus Close();\n\n        bool IsClosed()\n        {\n            return true;\n        }\n\n        WaitStatus SetBlocking(bool blocking);\n\n        WaitStatus Listen(int32_t blacklog);\n\n        WaitStatus Bind(const char *path);\n        WaitStatus Bind(const char *address, uint16_t port);\n        WaitStatus Bind(uint32_t address, uint16_t port);\n        WaitStatus Bind(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port);\n\n        WaitStatus Connect(const char *path);\n        WaitStatus Connect(uint32_t address, uint16_t port);\n        WaitStatus Connect(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port);\n\n        WaitStatus Disconnect(bool reuse);\n        WaitStatus Shutdown(int32_t how);\n\n        WaitStatus GetLocalEndPointInfo(EndPointInfo &info);\n        WaitStatus GetRemoteEndPointInfo(EndPointInfo &info);\n\n        WaitStatus Receive(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n\n        WaitStatus Send(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n\n        WaitStatus SendArray(WSABuf *wsabufs, int32_t count, int32_t *sent, SocketFlags c_flags);\n        WaitStatus ReceiveArray(WSABuf *wsabufs, int32_t count, int32_t *len, SocketFlags c_flags);\n\n        WaitStatus SendTo(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus SendTo(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus SendTo(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n\n        WaitStatus RecvFrom(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n        WaitStatus RecvFrom(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n        WaitStatus RecvFrom(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n\n        WaitStatus Accept(os::Socket **socket);\n\n        WaitStatus Available(int32_t *amount);\n\n        WaitStatus Ioctl(int32_t command, const uint8_t *in_data, int32_t in_len, uint8_t *out_data, int32_t out_len, int32_t *written);\n\n        WaitStatus GetSocketOption(SocketOptionLevel level, SocketOptionName name, uint8_t *buffer, int32_t *length);\n        WaitStatus GetSocketOptionFull(SocketOptionLevel level, SocketOptionName name, int32_t *first, int32_t *second);\n\n        WaitStatus SetSocketOption(SocketOptionLevel level, SocketOptionName name, int32_t value);\n        WaitStatus SetSocketOptionLinger(SocketOptionLevel level, SocketOptionName name, bool enabled, int32_t seconds);\n        WaitStatus SetSocketOptionArray(SocketOptionLevel level, SocketOptionName name, const uint8_t *buffer, int32_t length);\n        WaitStatus SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, uint32_t group_address, uint32_t local_address);\n#if IL2CPP_SUPPORT_IPV6\n        WaitStatus SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, IPv6Address ipv6, uint64_t interfaceOffset);\n#endif\n\n        WaitStatus SendFile(const char *filename, TransmitFileBuffers *buffers, TransmitFileOptions options);\n\n        static WaitStatus Poll(std::vector<PollRequest> &requests, int32_t count, int32_t timeout, int32_t *result, int32_t *error);\n        static WaitStatus Poll(std::vector<PollRequest> &requests, int32_t timeout, int32_t *result, int32_t *error);\n        static WaitStatus Poll(PollRequest& request, int32_t timeout, int32_t *result, int32_t *error);\n\n        static WaitStatus GetHostName(std::string &name);\n        static WaitStatus GetHostByName(const std::string &host, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list);\n        static WaitStatus GetHostByAddr(const std::string &address, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list);\n\n        static void Startup();\n        static void Cleanup();\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Generic/WindowsRuntime.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"il2cpp-vm-support.h\"\n#include \"os/WindowsRuntime.h\"\n#include \"vm/Exception.h\"\n\n#if IL2CPP_USE_GENERIC_WINDOWSRUNTIME\n\nnamespace il2cpp\n{\nnamespace os\n{\n    il2cpp_hresult_t WindowsRuntime::GetActivationFactory(Il2CppHString className, Il2CppIActivationFactory** activationFactory)\n    {\n        NO_UNUSED_WARNING(className);\n        NO_UNUSED_WARNING(activationFactory);\n        IL2CPP_ASSERT(className != NULL);\n        IL2CPP_ASSERT(activationFactory != NULL);\n        return IL2CPP_REGDB_E_CLASSNOTREG;\n    }\n\n    il2cpp_hresult_t WindowsRuntime::CreateHStringReference(const utils::StringView<Il2CppNativeChar>& str, Il2CppHStringHeader* header, Il2CppHString* hstring)\n    {\n        NO_UNUSED_WARNING(str);\n        NO_UNUSED_WARNING(header);\n        NO_UNUSED_WARNING(hstring);\n        IL2CPP_ASSERT(header != NULL);\n        IL2CPP_ASSERT(hstring != NULL);\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n\n    il2cpp_hresult_t WindowsRuntime::CreateHString(const utils::StringView<Il2CppChar>& str, Il2CppHString* hstring)\n    {\n        NO_UNUSED_WARNING(str);\n        NO_UNUSED_WARNING(hstring);\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n\n    il2cpp_hresult_t WindowsRuntime::DeleteHString(Il2CppHString hstring)\n    {\n        NO_UNUSED_WARNING(hstring);\n        return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n    }\n\n    const Il2CppChar* WindowsRuntime::GetHStringBuffer(Il2CppHString hstring, uint32_t* length)\n    {\n        NO_UNUSED_WARNING(hstring);\n        NO_UNUSED_WARNING(length);\n        IL2CPP_VM_RAISE_COM_EXCEPTION(IL2CPP_COR_E_PLATFORMNOTSUPPORTED, false);\n        return NULL;\n    }\n\n    Il2CppString* WindowsRuntime::HStringToManagedString(Il2CppHString hstring)\n    {\n        NO_UNUSED_WARNING(hstring);\n        IL2CPP_VM_RAISE_COM_EXCEPTION(IL2CPP_COR_E_PLATFORMNOTSUPPORTED, false);\n        return NULL;\n    }\n\n    Il2CppIRestrictedErrorInfo* WindowsRuntime::GetRestrictedErrorInfo()\n    {\n        return NULL;\n    }\n\n    void WindowsRuntime::OriginateLanguageException(Il2CppException* ex, Il2CppString* exceptionString)\n    {\n        NO_UNUSED_WARNING(ex);\n        NO_UNUSED_WARNING(exceptionString);\n    }\n\n    void WindowsRuntime::EnableErrorReporting()\n    {\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Handle.h",
    "content": "#pragma once\n\n#include \"utils/NonCopyable.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class Handle : public il2cpp::utils::NonCopyable\n    {\n    public:\n        virtual ~Handle() {}\n        virtual bool Wait() = 0;\n        virtual bool Wait(uint32_t ms) = 0;\n        virtual void Signal() = 0;\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Image.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Image\n{\n    void* GetImageBase();\n}\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Initialize.h",
    "content": "#pragma once\n\n\nnamespace il2cpp\n{\nnamespace os\n{\n    void Initialize();\n    void Uninitialize();\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/LastError.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class LastError\n    {\n    public:\n        static uint32_t GetLastError();\n    };\n} /* namespace os */\n} /* namespace il2cpp*/\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/LibraryLoader.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"utils/StringView.h\"\n#include <string>\n\nstruct PInvokeArguments;\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class LibraryLoader\n    {\n    public:\n        static Il2CppMethodPointer GetHardcodedPInvokeDependencyFunctionPointer(const il2cpp::utils::StringView<Il2CppNativeChar>& nativeDynamicLibrary, const il2cpp::utils::StringView<char>& entryPoint);\n        static void* LoadDynamicLibrary(const utils::StringView<Il2CppNativeChar>& nativeDynamicLibrary);\n        static Il2CppMethodPointer GetFunctionPointer(void* dynamicLibrary, const PInvokeArguments& pinvokeArgs);\n        static Il2CppMethodPointer GetFunctionPointer(void* dynamicLibrary, const char* functionName);\n        static void CleanupLoadedLibraries();\n    };\n} /* namespace os */\n} /* namespace il2cpp*/\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Locale.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <string>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class Locale\n    {\n    public:\n        static void Initialize();\n        static void UnInitialize();\n\n        static std::string GetLocale();\n#if IL2CPP_SUPPORT_LOCALE_INDEPENDENT_PARSING\n        static double DoubleParseLocaleIndependentImpl(char *ptr, char** endptr);\n#endif\n    };\n} /* namespace os */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/MarshalAlloc.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class MarshalAlloc\n    {\n    public:\n        static void* Allocate(size_t size);\n        static void* ReAlloc(void* ptr, size_t size);\n        static void Free(void* ptr);\n    };\n} /* namespace os */\n} /* namespace il2cpp*/\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/MarshalStringAlloc.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class MarshalStringAlloc\n    {\n    public:\n        static il2cpp_hresult_t AllocateBStringLength(const Il2CppChar* text, int32_t length, Il2CppChar** bstr);\n        static il2cpp_hresult_t GetBStringLength(const Il2CppChar* bstr, int32_t* length);\n        static il2cpp_hresult_t FreeBString(Il2CppChar* bstr);\n    };\n} /* namespace os */\n} /* namespace il2cpp*/\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Memory.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Memory\n{\n    void* AlignedAlloc(size_t size, size_t alignment);\n    void* AlignedReAlloc(void* memory, size_t newSize, size_t alignment);\n    void AlignedFree(void* memory);\n}\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/MemoryMappedFile.h",
    "content": "#pragma once\n\n#include <string>\n#include \"File.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class MemoryMappedFile\n    {\n    public:\n        static void* Map(FileHandle* file)\n        {\n            return Map(file, 0, 0);\n        }\n\n        static void Unmap(void* address)\n        {\n            Unmap(address, 0);\n        }\n\n        static void* Map(FileHandle* file, size_t length, size_t offset);\n        static void Unmap(void* address, size_t length);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Messages.cpp",
    "content": "#include <stdlib.h>\n\n#include \"il2cpp-config.h\"\n\n#include \"os/Messages.h\"\n\n#define N_ELEMENTS(e) \\\n    (sizeof (e) / sizeof ((e)[0]))\n\nnamespace il2cpp\n{\nnamespace os\n{\n    ErrorDesc common_messages[] =\n    {\n        { kErrorCodeSuccess, \"Success\" },\n        { kErrorCodeFileNotFound, \"Cannot find the specified file\" },\n        { kErrorCodePathNotFound, \"Cannot find the specified file\" },\n        { kErrorCodeTooManyOpenFiles, \"Too many open files\" },\n        { kErrorCodeAccessDenied, \"Access denied\" },\n        { kErrorCodeInvalidHandle, \"Invalid handle\" },\n        { kErrorInvalidData, \"Invalid data\" },\n        { kErrorOutofmemory, \"Out of memory\" },\n        { kErrorCodeNotSameDevice, \"Not same device\" },\n        { kErrorCodeNoMoreFiles, \"No more files\" },\n        { kErrorBadLength, \"Bad length\" },\n        { kErrorCodeGenFailure, \"General failure\" },\n        { kErrorCodeSharingViolation, \"Sharing violation\" },\n        { kErrorCodeLockViolation, \"Lock violation\" },\n        { kErrorNotSupported, \"Operation not supported\" },\n        { kErrorCodeInvalidParameter, \"Invalid parameter\" },\n        { kErrorCallNotImplemented, \"Call not implemented\" },\n        { kErrorCodeInvalidName, \"Invalid name\" },\n        { kErrorProcNotFound, \"Process not found\" },\n        { kErrorCodeAlreadyExists, \"Already exists\" },\n        { kErrorDirectory, \"Is a directory\" },\n        { kErrorCodeEncryptionFailed, \"Encryption failed\" },\n        { kWSAeintr, \"interrupted\" },\n        { kWSAebadf, \"Bad file number\" },\n        { kWSAeacces, \"Access denied\" },\n        { kWSAefault, \"Bad address\" },\n        { kWSAeinval, \"Invalid arguments\" },\n        { kWSAemfile, \"Too many open files\" },\n        { kWSAewouldblock, \"Operation on non-blocking socket would block\" },\n        { kWSAeinprogress, \"Operation in progress\" },\n        { kWSAealready, \"Operation already in progress\" },\n        { kWSAenotsock, \"The descriptor is not a socket\" },\n        { kWSAedestaddrreq, \"Destination address required\" },\n        { kWSAemsgsize, \"Message too long\" },\n        { kWSAeprototype, \"Protocol wrong type for socket\" },\n        { kWSAenoprotoopt, \"Protocol option not supported\" },\n        { kWSAeprotonosupport, \"Protocol not supported\" },\n        { kWSAesocktnosupport, \"Socket not supported\" },\n        { kWSAeopnotsupp, \"Operation not supported\" },\n        { kWSAepfnosupport, \"Protocol family not supported\" },\n        { kWSAeafnosupport, \"An address incompatible with the requested protocol was used\" },\n        { kWSAeaddrinuse, \"Address already in use\" },\n        { kWSAeaddrnotavail, \"The requested address is not valid in this context\" },\n        { kWSAenetdown, \"Network subsystem is down\" },\n        { kWSAenetunreach, \"Network is unreachable\" },\n        { kWSAenetreset, \"Connection broken, keep-alive detected a problem\" },\n        { kWSAeconnaborted, \"An established connection was aborted in your host machine.\" },\n        { kWSAeconnreset, \"Connection reset by peer\" },\n        { kWSAenobufs, \"Not enough buffer space is available\" },\n        { kWSAeisconn, \"Socket is already connected\" },\n        { kWSAenotconn, \"The socket is not connected\" },\n        { kWSAeshutdown, \"The socket has been shut down\" },\n        { kWSAetoomanyrefs, \"Too many references: cannot splice\" },\n        { kWSAetimedout, \"Connection timed out\" },\n        { kWSAeconnrefused, \"Connection refused\" },\n        { kWSAeloop, \"Too many symbolic links encountered\" },\n        { kWSAenametoolong, \"File name too long\" },\n        { kWSAehostdown, \"Host is down\" },\n        { kWSAehostunreach, \"No route to host\" },\n        { kWSAenotempty, \"Directory not empty\" },\n        { kWSAeproclim, \"EPROCLIM\" },\n        { kWSAeusers, \"Too many users\" },\n        { kWSAedquot, \"Quota exceeded\" },\n        { kWSAestale, \"Stale NFS file handle\" },\n        { kWSAeremote, \"Object is remote\" },\n        { kWSAsysnotready, \"SYSNOTREADY\" },\n        { kWSAvernotsupported, \"VERNOTSUPPORTED\" },\n        { kWSAnotinitialised, \"Winsock not initialised\" },\n        { kWSAediscon, \"EDISCON\" },\n        { kWSAenomore, \"ENOMORE\" },\n        { kWSAecancelled, \"Operation canceled\" },\n        { kWSAeinvalidproctable, \"EINVALIDPROCTABLE\" },\n        { kWSAeinvalidprovider, \"EINVALIDPROVIDER\" },\n        { kWSAeproviderfailedinit, \"EPROVIDERFAILEDINIT\" },\n        { kWSAsyscallfailure, \"System call failed\" },\n        { kWSAserviceNotFound, \"SERVICE_NOT_FOUND\" },\n        { kWSAtypeNotFound, \"TYPE_NOT_FOUND\" },\n        { kWSAENoMore, \"E_NO_MORE\" },\n        { kWSAECancelled, \"E_CANCELLED\" },\n        { kWSAerefused, \"EREFUSED\" },\n        { kWSAhostNotFound, \"No such host is known\" },\n        { kWSAtryAgain, \"A temporary error occurred on an authoritative name server.  Try again later.\" },\n        { kWSAnoRecovery, \"No recovery\" },\n        { kWSAnoData, \"No data\" },\n    };\n\n#ifndef IL2CPP_DISABLE_FULL_MESSAGES\n    ErrorDesc messages[] =\n    {\n        { kErrorInvalidFunction, \"Invalid function\" },\n        { kErrorArenaTrashed, \"Arena trashed\" },\n        { kErrorNotEnoughMemory, \"Not enough memory\" },\n        { kErrorInvalidBlock, \"Invalid block\" },\n        { kErrorBadEnvironment, \"Bad environment\" },\n        { kErrorBadFormat, \"Bad format\" },\n        { kErrorInvalidAccess, \"Invalid access\" },\n        { kErrorInvalidDrive, \"Invalid drive\" },\n        { kErrorCurrentDirectory, \"Current directory\" },\n        { kErrorWriteProtect, \"Write protect\" },\n        { kErrorBadUnit, \"Bad unit\" },\n        { kErrorNotReady, \"Not ready\" },\n        { kErrorBadCommand, \"Bad command\" },\n        { kErrorCrc, \"CRC\" },\n        { kErrorSeek, \"Seek\" },\n        { kErrorNotDosDisk, \"Not DOS disk\" },\n        { kErrorSectorNotFound, \"Sector not found\" },\n        { kErrorOutOfPaper, \"Out of paper\" },\n        { kErrorWriteFault, \"Write fault\" },\n        { kErrorReadFault, \"Read fault\" },\n        { kErrorWrongDisk, \"Wrong disk\" },\n        { kErrorSharingBufferExceeded, \"Sharing buffer exceeded\" },\n        { kErrorHandleEof, \"Handle EOF\" },\n        { kErrorHandleDiskFull, \"Handle disk full\" },\n        { kErrorRemNotList, \"Rem not list\" },\n        { kErrorDupName, \"Duplicate name\" },\n        { kErrorBadNetpath, \"Bad netpath\" },\n        { kErrorNetworkBusy, \"Network busy\" },\n        { kErrorDevNotExist, \"Device does not exist\" },\n        { kErrorTooManyCmds, \"Too many commands\" },\n        { kErrorAdapHdwErr, \"ADAP HDW error\" },\n        { kErrorBadNetResp, \"Bad net response\" },\n        { kErrorUnexpNetErr, \"Unexpected net error\" },\n        { kErrorBadRemAdap, \"Bad rem adap\" },\n        { kErrorPrintqFull, \"Print queue full\" },\n        { kErrorNoSpoolSpace, \"No spool space\" },\n        { kErrorPrintCancelled, \"Print cancelled\" },\n        { kErrorNetnameDeleted, \"Netname deleted\" },\n        { kErrorNetworkAccessDenied, \"Network access denied\" },\n        { kErrorBadDevType, \"Bad device type\" },\n        { kErrorBadNetName, \"Bad net name\" },\n        { kErrorTooManyNames, \"Too many names\" },\n        { kErrorTooManySess, \"Too many sessions\" },\n        { kErrorSharingPaused, \"Sharing paused\" },\n        { kErrorReqNotAccep, \"Req not accep\" },\n        { kErrorRedirPaused, \"Redir paused\" },\n        { kErrorFileExists, \"File exists\" },\n        { kErrorCannotMake, \"Cannot make\" },\n        { kErrorFailI24, \"Fail i24\" },\n        { kErrorOutOfStructures, \"Out of structures\" },\n        { kErrorAlreadyAssigned, \"Already assigned\" },\n        { kErrorInvalidPassword, \"Invalid password\" },\n        { kErrorNetWriteFault, \"Net write fault\" },\n        { kErrorNoProcSlots, \"No proc slots\" },\n        { kErrorTooManySemaphores, \"Too many semaphores\" },\n        { kErrorExclSemAlreadyOwned, \"Exclusive semaphore already owned\" },\n        { kErrorSemIsSet, \"Semaphore is set\" },\n        { kErrorTooManySemRequests, \"Too many semaphore requests\" },\n        { kErrorInvalidAtInterruptTime, \"Invalid at interrupt time\" },\n        { kErrorSemOwnerDied, \"Semaphore owner died\" },\n        { kErrorSemUserLimit, \"Semaphore user limit\" },\n        { kErrorDiskChange, \"Disk change\" },\n        { kErrorDriveLocked, \"Drive locked\" },\n        { kErrorBrokenPipe, \"Broken pipe\" },\n        { kErrorOpenFailed, \"Open failed\" },\n        { kErrorBufferOverflow, \"Buffer overflow\" },\n        { kErrorDiskFull, \"Disk full\" },\n        { kErrorNoMoreSearchHandles, \"No more search handles\" },\n        { kErrorInvalidTargetHandle, \"Invalid target handle\" },\n        { kErrorInvalidCategory, \"Invalid category\" },\n        { kErrorInvalidVerifySwitch, \"Invalid verify switch\" },\n        { kErrorBadDriverLevel, \"Bad driver level\" },\n        { kErrorSemTimeout, \"Semaphore timeout\" },\n        { kErrorInsufficientBuffer, \"Insufficient buffer\" },\n        { kErrorInvalidLevel, \"Invalid level\" },\n        { kErrorNoVolumeLabel, \"No volume label\" },\n        { kErrorModNotFound, \"Module not found\" },\n        { kErrorWaitNoChildren, \"Wait no children\" },\n        { kErrorChildNotComplete, \"Child not complete\" },\n        { kErrorDirectAccessHandle, \"Direct access handle\" },\n        { kErrorNegativeSeek, \"Negative seek\" },\n        { kErrorSeekOnDevice, \"Seek on device\" },\n        { kErrorIsJoinTarget, \"Is join target\" },\n        { kErrorIsJoined, \"Is joined\" },\n        { kErrorIsSubsted, \"Is substed\" },\n        { kErrorNotJoined, \"Not joined\" },\n        { kErrorNotSubsted, \"Not substed\" },\n        { kErrorJoinToJoin, \"Join to join\" },\n        { kErrorSubstToSubst, \"Subst to subst\" },\n        { kErrorJoinToSubst, \"Join to subst\" },\n        { kErrorSubstToJoin, \"Subst to join\" },\n        { kErrorBusyDrive, \"Busy drive\" },\n        { kErrorSameDrive, \"Same drive\" },\n        { kErrorDirNotRoot, \"Directory not root\" },\n        { kErrorDirNotEmpty, \"Directory not empty\" },\n        { kErrorIsSubstPath, \"Is subst path\" },\n        { kErrorIsJoinPath, \"Is join path\" },\n        { kErrorPathBusy, \"Path busy\" },\n        { kErrorIsSubstTarget, \"Is subst target\" },\n        { kErrorSystemTrace, \"System trace\" },\n        { kErrorInvalidEventCount, \"Invalid event count\" },\n        { kErrorTooManyMuxwaiters, \"Too many muxwaiters\" },\n        { kErrorInvalidListFormat, \"Invalid list format\" },\n        { kErrorLabelTooLong, \"Label too long\" },\n        { kErrorTooManyTcbs, \"Too many TCBs\" },\n        { kErrorSignalRefused, \"Signal refused\" },\n        { kErrorDiscarded, \"Discarded\" },\n        { kErrorNotLocked, \"Not locked\" },\n        { kErrorBadThreadidAddr, \"Bad thread ID addr\" },\n        { kErrorBadArguments, \"Bad arguments\" },\n        { kErrorBadPathname, \"Bad pathname\" },\n        { kErrorSignalPending, \"Signal pending\" },\n        { kErrorMaxThrdsReached, \"Max thrds reached\" },\n        { kErrorLockFailed, \"Lock failed\" },\n        { kErrorBusy, \"Busy\" },\n        { kErrorCancelViolation, \"Cancel violation\" },\n        { kErrorAtomicLocksNotSupported, \"Atomic locks not supported\" },\n        { kErrorInvalidSegmentNumber, \"Invalid segment number\" },\n        { kErrorInvalidOrdinal, \"Invalid ordinal\" },\n        { kErrorInvalidFlagNumber, \"Invalid flag number\" },\n        { kErrorSemNotFound, \"Sem not found\" },\n        { kErrorInvalidStartingCodeseg, \"Invalid starting codeseg\" },\n        { kErrorInvalidStackseg, \"Invalid stackseg\" },\n        { kErrorInvalidModuletype, \"Invalid moduletype\" },\n        { kErrorInvalidExeSignature, \"Invalid exe signature\" },\n        { kErrorExeMarkedInvalid, \"Exe marked invalid\" },\n        { kErrorBadExeFormat, \"Bad exe format\" },\n        { kErrorIteratedDataExceeds64k, \"Iterated data exceeds 64k (and that should be enough for anybody!)\" },\n        { kErrorInvalidMinallocsize, \"Invalid minallocsize\" },\n        { kErrorDynlinkFromInvalidRing, \"Dynlink from invalid ring\" },\n        { kErrorIoplNotEnabled, \"IOPL not enabled\" },\n        { kErrorInvalidSegdpl, \"Invalid segdpl\" },\n        { kErrorAutodatasegExceeds64k, \"Autodataseg exceeds 64k\" },\n        { kErrorRing2segMustBeMovable, \"Ring2seg must be movable\" },\n        { kErrorRelocChainXeedsSeglim, \"Reloc chain exceeds seglim\" },\n        { kErrorInfloopInRelocChain, \"Infloop in reloc chain\" },\n        { kErrorEnvvarNotFound, \"Env var not found\" },\n        { kErrorNoSignalSent, \"No signal sent\" },\n        { kErrorFilenameExcedRange, \"Filename exceeds range\" },\n        { kErrorRing2StackInUse, \"Ring2 stack in use\" },\n        { kErrorMetaExpansionTooLong, \"Meta expansion too long\" },\n        { kErrorInvalidSignalNumber, \"Invalid signal number\" },\n        { kErrorThread1Inactive, \"Thread 1 inactive\" },\n        { kErrorLocked, \"Locked\" },\n        { kErrorTooManyModules, \"Too many modules\" },\n        { kErrorNestingNotAllowed, \"Nesting not allowed\" },\n        { kErrorExeMachineTypeMismatch, \"Exe machine type mismatch\" },\n        { kErrorBadPipe, \"Bad pipe\" },\n        { kErrorPipeBusy, \"Pipe busy\" },\n        { kErrorNoData, \"No data\" },\n        { kErrorPipeNotConnected, \"Pipe not connected\" },\n        { kErrorMoreData, \"More data\" },\n        { kErrorVcDisconnected, \"VC disconnected\" },\n        { kErrorInvalidEaName, \"Invalid EA name\" },\n        { kErrorEaListInconsistent, \"EA list inconsistent\" },\n        { kWaitTimeout, \"Wait timeout\" },\n        { kErrorNoMoreItems, \"No more items\" },\n        { kErrorCannotCopy, \"Cannot copy\" },\n        { kErrorEasDidntFit, \"EAS didnt fit\" },\n        { kErrorEaFileCorrupt, \"EA file corrupt\" },\n        { kErrorEaTableFull, \"EA table full\" },\n        { kErrorInvalidEaHandle, \"Invalid EA handle\" },\n        { kErrorEasNotSupported, \"EAs not supported\" },\n        { kErrorNotOwner, \"Not owner\" },\n        { kErrorTooManyPosts, \"Too many posts\" },\n        { kErrorPartialCopy, \"Partial copy\" },\n        { kErrorOplockNotGranted, \"Oplock not granted\" },\n        { kErrorInvalidOplockProtocol, \"Invalid oplock protocol\" },\n        { kErrorDiskTooFragmented, \"Disk too fragmented\" },\n        { kErrorDeletePending, \"Delete pending\" },\n        { kErrorMrMidNotFound, \"Mr Mid not found\" },\n        { kErrorInvalidAddress, \"Invalid address\" },\n        { kErrorArithmeticOverflow, \"Arithmetic overflow\" },\n        { kErrorPipeConnected, \"Pipe connected\" },\n        { kErrorPipeListening, \"Pipe listening\" },\n        { kErrorEaAccessDenied, \"EA access denied\" },\n        { kErrorOperationAborted, \"Operation aborted\" },\n        { kErrorIoIncomplete, \"IO incomplete\" },\n        { kErrorIoPending, \"IO pending\" },\n        { kErrorNoaccess, \"No access\" },\n        { kErrorSwaperror, \"Swap error\" },\n        { kErrorStackOverflow, \"Stack overflow\" },\n        { kErrorInvalidMessage, \"Invalid message\" },\n        { kErrorCanNotComplete, \"Can not complete\" },\n        { kErrorInvalidFlags, \"Invalid flags\" },\n        { kErrorUnrecognizedVolume, \"Unrecognised volume\" },\n        { kErrorFileInvalid, \"File invalid\" },\n        { kErrorFullscreenMode, \"Full screen mode\" },\n        { kErrorNoToken, \"No token\" },\n        { kErrorBaddb, \"Bad DB\" },\n        { kErrorBadkey, \"Bad key\" },\n        { kErrorCantopen, \"Can't open\" },\n        { kErrorCantread, \"Can't read\" },\n        { kErrorCantwrite, \"Can't write\" },\n        { kErrorRegistryRecovered, \"Registry recovered\" },\n        { kErrorRegistryCorrupt, \"Registry corrupt\" },\n        { kErrorRegistryIoFailed, \"Registry IO failed\" },\n        { kErrorNotRegistryFile, \"Not registry file\" },\n        { kErrorKeyDeleted, \"Key deleted\" },\n        { kErrorNoLogSpace, \"No log space\" },\n        { kErrorKeyHasChildren, \"Key has children\" },\n        { kErrorChildMustBeVolatile, \"Child must be volatile\" },\n        { kErrorNotifyEnumDir, \"Notify enum dir\" },\n        { kErrorDependentServicesRunning, \"Dependent services running\" },\n        { kErrorInvalidServiceControl, \"Invalid service control\" },\n        { kErrorServiceRequestTimeout, \"Service request timeout\" },\n        { kErrorServiceNoThread, \"Service no thread\" },\n        { kErrorServiceDatabaseLocked, \"Service database locked\" },\n        { kErrorServiceAlreadyRunning, \"Service already running\" },\n        { kErrorInvalidServiceAccount, \"Invalid service account\" },\n        { kErrorServiceDisabled, \"Service disabled\" },\n        { kErrorCircularDependency, \"Circular dependency\" },\n        { kErrorServiceDoesNotExist, \"Service does not exist\" },\n        { kErrorServiceCannotAcceptCtrl, \"Service cannot accept ctrl\" },\n        { kErrorServiceNotActive, \"Service not active\" },\n        { kErrorFailedServiceControllerConnect, \"Failed service controller connect\" },\n        { kErrorExceptionInService, \"Exception in service\" },\n        { kErrorDatabaseDoesNotExist, \"Database does not exist\" },\n        { kErrorServiceSpecificError, \"Service specific error\" },\n        { kErrorProcessAborted, \"Process aborted\" },\n        { kErrorServiceDependencyFail, \"Service dependency fail\" },\n        { kErrorServiceLogonFailed, \"Service logon failed\" },\n        { kErrorServiceStartHang, \"Service start hang\" },\n        { kErrorInvalidServiceLock, \"Invalid service lock\" },\n        { kErrorServiceMarkedForDelete, \"Service marked for delete\" },\n        { kErrorServiceExists, \"Service exists\" },\n        { kErrorAlreadyRunningLkg, \"Already running lkg\" },\n        { kErrorServiceDependencyDeleted, \"Service dependency deleted\" },\n        { kErrorBootAlreadyAccepted, \"Boot already accepted\" },\n        { kErrorServiceNeverStarted, \"Service never started\" },\n        { kErrorDuplicateServiceName, \"Duplicate service name\" },\n        { kErrorDifferentServiceAccount, \"Different service account\" },\n        { kErrorCannotDetectDriverFailure, \"Cannot detect driver failure\" },\n        { kErrorCannotDetectProcessAbort, \"Cannot detect process abort\" },\n        { kErrorNoRecoveryProgram, \"No recovery program\" },\n        { kErrorServiceNotInExe, \"Service not in exe\" },\n        { kErrorNotSafebootService, \"Not safeboot service\" },\n        { kErrorEndOfMedia, \"End of media\" },\n        { kErrorFilemarkDetected, \"Filemark detected\" },\n        { kErrorBeginningOfMedia, \"Beginning of media\" },\n        { kErrorSetmarkDetected, \"Setmark detected\" },\n        { kErrorNoDataDetected, \"No data detected\" },\n        { kErrorPartitionFailure, \"Partition failure\" },\n        { kErrorInvalidBlockLength, \"Invalid block length\" },\n        { kErrorDeviceNotPartitioned, \"Device not partitioned\" },\n        { kErrorUnableToLockMedia, \"Unable to lock media\" },\n        { kErrorUnableToUnloadMedia, \"Unable to unload media\" },\n        { kErrorMediaChanged, \"Media changed\" },\n        { kErrorBusReset, \"Bus reset\" },\n        { kErrorNoMediaInDrive, \"No media in drive\" },\n        { kErrorNoUnicodeTranslation, \"No unicode translation\" },\n        { kErrorDllInitFailed, \"DLL init failed\" },\n        { kErrorShutdownInProgress, \"Shutdown in progress\" },\n        { kErrorNoShutdownInProgress, \"No shutdown in progress\" },\n        { kErrorIoDevice, \"IO device\" },\n        { kErrorSerialNoDevice, \"Serial IO device\" },\n        { kErrorIrqBusy, \"IRQ busy\" },\n        { kErrorMoreWrites, \"More writes\" },\n        { kErrorCounterTimeout, \"Counter timeout\" },\n        { kErrorFloppyIdMarkNotFound, \"Floppy ID mark not found\" },\n        { kErrorFloppyWrongCylinder, \"Floppy wrong cylinder\" },\n        { kErrorFloppyUnknownError, \"Floppy unknown error\" },\n        { kErrorFloppyBadRegisters, \"Floppy bad registers\" },\n        { kErrorDiskRecalibrateFailed, \"Disk recalibrate failed\" },\n        { kErrorDiskOperationFailed, \"Disk operation failed\" },\n        { kErrorDiskResetFailed, \"Disk reset failed\" },\n        { kErrorEomOverflow, \"EOM overflow\" },\n        { kErrorNotEnoughServerMemory, \"Not enough server memory\" },\n        { kErrorPossibleDeadlock, \"Possible deadlock\" },\n        { kErrorMappedAlignment, \"Mapped alignment\" },\n        { kErrorSetPowerStateVetoed, \"Set power state vetoed\" },\n        { kErrorSetPowerStateFailed, \"Set power state failed\" },\n        { kErrorTooManyLinks, \"Too many links\" },\n        { kErrorOldWinVersion, \"Old win version\" },\n        { kErrorAppWrongOs, \"App wrong OS\" },\n        { kErrorSingleInstanceApp, \"Single instance app\" },\n        { kErrorRmodeApp, \"Rmode app\" },\n        { kErrorInvalidDll, \"Invalid DLL\" },\n        { kErrorNoAssociation, \"No association\" },\n        { kErrorDdeFail, \"DDE fail\" },\n        { kErrorDllNotFound, \"DLL not found\" },\n        { kErrorNoMoreUserHandles, \"No more user handles\" },\n        { kErrorMessageSyncOnly, \"Message sync only\" },\n        { kErrorSourceElementEmpty, \"Source element empty\" },\n        { kErrorDestinationElementFull, \"Destination element full\" },\n        { kErrorIllegalElementAddress, \"Illegal element address\" },\n        { kErrorMagazineNotPresent, \"Magazine not present\" },\n        { kErrorDeviceReinitializationNeeded, \"Device reinitialization needed\" },\n        { kErrorDeviceRequiresCleaning, \"Device requires cleaning\" },\n        { kErrorDeviceDoorOpen, \"Device door open\" },\n        { kErrorDeviceNotConnected, \"Device not connected\" },\n        { kErrorNotFound, \"Not found\" },\n        { kErrorNoMatch, \"No match\" },\n        { kErrorSetNotFound, \"Set not found\" },\n        { kErrorPointNotFound, \"Point not found\" },\n        { kErrorNoTrackingService, \"No tracking service\" },\n        { kErrorNoVolumeId, \"No volume ID\" },\n        { kErrorUnableToRemoveReplaced, \"Unable to remove replaced\" },\n        { kErrorUnableToMoveReplacement, \"Unable to move replacement\" },\n        { kErrorUnableToMoveReplacement2, \"Unable to move replacement 2\" },\n        { kErrorJournalDeleteInProgress, \"Journal delete in progress\" },\n        { kErrorJournalNotActive, \"Journal not active\" },\n        { kErrorPotentialFileFound, \"Potential file found\" },\n        { kErrorJournalEntryDeleted, \"Journal entry deleted\" },\n        { kErrorBadDevice, \"Bad device\" },\n        { kErrorConnectionUnavail, \"Connection unavail\" },\n        { kErrorDeviceAlreadyRemembered, \"Device already remembered\" },\n        { kErrorNoNetOrBadPath, \"No net or bad path\" },\n        { kErrorBadProvider, \"Bad provider\" },\n        { kErrorCannotOpenProfile, \"Cannot open profile\" },\n        { kErrorBadProfile, \"Bad profile\" },\n        { kErrorNotContainer, \"Not container\" },\n        { kErrorExtendedError, \"Extended error\" },\n        { kErrorInvalidGroupname, \"Invalid group name\" },\n        { kErrorInvalidComputername, \"Invalid computer name\" },\n        { kErrorInvalidEventname, \"Invalid event name\" },\n        { kErrorInvalidDomainname, \"Invalid domain name\" },\n        { kErrorInvalidServicename, \"Invalid service name\" },\n        { kErrorInvalidNetname, \"Invalid net name\" },\n        { kErrorInvalidSharename, \"Invalid share name\" },\n        { kErrorInvalidPasswordname, \"Invalid password name\" },\n        { kErrorInvalidMessagename, \"Invalid message name\" },\n        { kErrorInvalidMessagedest, \"Invalid message dest\" },\n        { kErrorSessionCredentialConflict, \"Session credential conflict\" },\n        { kErrorRemoteSessionLimitExceeded, \"Remote session limit exceeded\" },\n        { kErrorDupDomainname, \"Dup domain name\" },\n        { kErrorNoNetwork, \"No network\" },\n        { kErrorCancelled, \"Cancelled\" },\n        { kErrorUserMappedFile, \"User mapped file\" },\n        { kErrorConnectionRefused, \"Connection refused\" },\n        { kErrorGracefulDisconnect, \"Graceful disconnect\" },\n        { kErrorAddressAlreadyAssociated, \"Address already associated\" },\n        { kErrorAddressNotAssociated, \"Address not associated\" },\n        { kErrorConnectionInvalid, \"Connected invalid\" },\n        { kErrorConnectionActive, \"Connection active\" },\n        { kErrorNetworkUnreachable, \"Network unreachable\" },\n        { kErrorHostUnreachable, \"Host unreachable\" },\n        { kErrorProtocolUnreachable, \"Protocol unreachable\" },\n        { kErrorPortUnreachable, \"Port unreachable\" },\n        { kErrorRequestAborted, \"Request aborted\" },\n        { kErrorConnectionAborted, \"Connection aborted\" },\n        { kErrorRetry, \"Retry\" },\n        { kErrorConnectionCountLimit, \"Connection count limit\" },\n        { kErrorLoginTimeRestriction, \"Login time restriction\" },\n        { kErrorLoginWkstaRestriction, \"Login wksta restriction\" },\n        { kErrorIncorrectAddress, \"Incorrect address\" },\n        { kErrorAlreadyRegistered, \"Already registered\" },\n        { kErrorServiceNotFound, \"Service not found\" },\n        { kErrorNotAuthenticated, \"Not authenticated\" },\n        { kErrorNotLoggedOn, \"Not logged on\" },\n        { kErrorContinue, \"Continue\" },\n        { kErrorAlreadyInitialized, \"Already initialised\" },\n        { kErrorNoMoreDevices, \"No more devices\" },\n        { kErrorNoSuchSite, \"No such site\" },\n        { kErrorDomainControllerExists, \"Domain controller exists\" },\n        { kErrorOnlyIfConnected, \"Only if connected\" },\n        { kErrorOverrideNochanges, \"Override no changes\" },\n        { kErrorBadUserProfile, \"Bad user profile\" },\n        { kErrorNotSupportedOnSbs, \"Not supported on SBS\" },\n        { kErrorServerShutdownInProgress, \"Server shutdown in progress\" },\n        { kErrorHostDown, \"Host down\" },\n        { kErrorNonAccountSid, \"Non account sid\" },\n        { kErrorNonDomainSid, \"Non domain sid\" },\n        { kErrorApphelpBlock, \"Apphelp block\" },\n        { kErrorAccessDisabledByPolicy, \"Access disabled by policy\" },\n        { kErrorRegNatConsumption, \"Reg nat consumption\" },\n        { kErrorCscshareOffline, \"CSC share offline\" },\n        { kErrorPkinitFailure, \"PK init failure\" },\n        { kErrorSmartcardSubsystemFailure, \"Smartcard subsystem failure\" },\n        { kErrorDowngradeDetected, \"Downgrade detected\" },\n        { kSecESmartcardCertRevoked, \"Smartcard cert revoked\" },\n        { kSecEIssuingCaUntrusted, \"Issuing CA untrusted\" },\n        { kSecERevocationOfflineC, \"Revocation offline\" },\n        { kSecEPkinitClientFailur, \"PK init client failure\" },\n        { kSecESmartcardCertExpired, \"Smartcard cert expired\" },\n        { kErrorMachineLocked, \"Machine locked\" },\n        { kErrorCallbackSuppliedInvalidData, \"Callback supplied invalid data\" },\n        { kErrorSyncForegroundRefreshRequired, \"Sync foreground refresh required\" },\n        { kErrorDriverBlocked, \"Driver blocked\" },\n        { kErrorInvalidImportOfNonDll, \"Invalid import of non DLL\" },\n        { kErrorNotAllAssigned, \"Not all assigned\" },\n        { kErrorSomeNotMapped, \"Some not mapped\" },\n        { kErrorNoQuotasForAccount, \"No quotas for account\" },\n        { kErrorLocalUserSessionKey, \"Local user session key\" },\n        { kErrorNullLmPassword, \"Null LM password\" },\n        { kErrorUnknownRevision, \"Unknown revision\" },\n        { kErrorRevisionMismatch, \"Revision mismatch\" },\n        { kErrorInvalidOwner, \"Invalid owner\" },\n        { kErrorInvalidPrimaryGroup, \"Invalid primary group\" },\n        { kErrorNoImpersonationToken, \"No impersonation token\" },\n        { kErrorCantDisableMandatory, \"Can't disable mandatory\" },\n        { kErrorNoLogonServers, \"No logon servers\" },\n        { kErrorNoSuchLogonSession, \"No such logon session\" },\n        { kErrorNoSuchPrivilege, \"No such privilege\" },\n        { kErrorPrivilegeNotHeld, \"Privilege not held\" },\n        { kErrorInvalidAccountName, \"Invalid account name\" },\n        { kErrorUserExists, \"User exists\" },\n        { kErrorNoSuchUser, \"No such user\" },\n        { kErrorGroupExists, \"Group exists\" },\n        { kErrorNoSuchGroup, \"No such group\" },\n        { kErrorMemberInGroup, \"Member in group\" },\n        { kErrorMemberNotInGroup, \"Member not in group\" },\n        { kErrorLastAdmin, \"Last admin\" },\n        { kErrorWrongPassword, \"Wrong password\" },\n        { kErrorIllFormedPassword, \"Ill formed password\" },\n        { kErrorPasswordRestriction, \"Password restriction\" },\n        { kErrorLogonFailure, \"Logon failure\" },\n        { kErrorAccountRestriction, \"Account restriction\" },\n        { kErrorInvalidLogonHours, \"Invalid logon hours\" },\n        { kErrorInvalidWorkstation, \"Invalid workstation\" },\n        { kErrorPasswordExpired, \"Password expired\" },\n        { kErrorAccountDisabled, \"Account disabled\" },\n        { kErrorNoneMapped, \"None mapped\" },\n        { kErrorTooManyLuidsRequested, \"Too many LUIDs requested\" },\n        { kErrorLuidsExhausted, \"LUIDs exhausted\" },\n        { kErrorInvalidSubAuthority, \"Invalid sub authority\" },\n        { kErrorInvalidAcl, \"Invalid ACL\" },\n        { kErrorInvalidSid, \"Invalid SID\" },\n        { kErrorInvalidSecurityDescr, \"Invalid security descr\" },\n        { kErrorBadInheritanceAcl, \"Bad inheritance ACL\" },\n        { kErrorServerDisabled, \"Server disabled\" },\n        { kErrorServerNotDisabled, \"Server not disabled\" },\n        { kErrorInvalidIdAuthority, \"Invalid ID authority\" },\n        { kErrorAllottedSpaceExceeded, \"Allotted space exceeded\" },\n        { kErrorInvalidGroupAttributes, \"Invalid group attributes\" },\n        { kErrorBadImpersonationLevel, \"Bad impersonation level\" },\n        { kErrorCantOpenAnonymous, \"Can't open anonymous\" },\n        { kErrorBadValidationClass, \"Bad validation class\" },\n        { kErrorBadTokenType, \"Bad token type\" },\n        { kErrorNoSecurityOnObject, \"No security on object\" },\n        { kErrorCantAccessDomainInfo, \"Can't access domain info\" },\n        { kErrorInvalidServerState, \"Invalid server state\" },\n        { kErrorInvalidDomainState, \"Invalid domain state\" },\n        { kErrorInvalidDomainRole, \"Invalid domain role\" },\n        { kErrorNoSuchDomain, \"No such domain\" },\n        { kErrorDomainExists, \"Domain exists\" },\n        { kErrorDomainLimitExceeded, \"Domain limit exceeded\" },\n        { kErrorInternalDbCorruption, \"Internal DB corruption\" },\n        { kErrorInternalError, \"Internal error\" },\n        { kErrorGenericNotMapped, \"Generic not mapped\" },\n        { kErrorBadDescriptorFormat, \"Bad descriptor format\" },\n        { kErrorNotLogonProcess, \"Not logon process\" },\n        { kErrorLogonSessionExists, \"Logon session exists\" },\n        { kErrorNoSuchPackage, \"No such package\" },\n        { kErrorBadLogonSessionState, \"Bad logon session state\" },\n        { kErrorLogonSessionCollision, \"Logon session collision\" },\n        { kErrorInvalidLogonType, \"Invalid logon type\" },\n        { kErrorCannotImpersonate, \"Cannot impersonate\" },\n        { kErrorRxactInvalidState, \"Rxact invalid state\" },\n        { kErrorRxactCommitFailure, \"Rxact commit failure\" },\n        { kErrorSpecialAccount, \"Special account\" },\n        { kErrorSpecialGroup, \"Special group\" },\n        { kErrorSpecialUser, \"Special user\" },\n        { kErrorMembersPrimaryGroup, \"Members primary group\" },\n        { kErrorTokenAlreadyInUse, \"Token already in use\" },\n        { kErrorNoSuchAlias, \"No such alias\" },\n        { kErrorMemberNotInAlias, \"Member not in alias\" },\n        { kErrorMemberInAlias, \"Member in alias\" },\n        { kErrorAliasExists, \"Alias exists\" },\n        { kErrorLogonNotGranted, \"Logon not granted\" },\n        { kErrorTooManySecrets, \"Too many secrets\" },\n        { kErrorSecretTooLong, \"Secret too long\" },\n        { kErrorInternalDbError, \"Internal DB error\" },\n        { kErrorTooManyContextIds, \"Too many context IDs\" },\n        { kErrorLogonTypeNotGranted, \"Logon type not granted\" },\n        { kErrorNtCrossEncryptionRequired, \"NT cross encryption required\" },\n        { kErrorNoSuchMember, \"No such member\" },\n        { kErrorInvalidMember, \"Invalid member\" },\n        { kErrorTooManySids, \"Too many SIDs\" },\n        { kErrorLmCrossEncryptionRequired, \"LM cross encryption required\" },\n        { kErrorNoInheritance, \"No inheritance\" },\n        { kErrorFileCorrupt, \"File corrupt\" },\n        { kErrorDiskCorrupt, \"Disk corrupt\" },\n        { kErrorNoUserSessionKey, \"No user session key\" },\n        { kErrorLicenseQuotaExceeded, \"Licence quota exceeded\" },\n        { kErrorWrongTargetName, \"Wrong target name\" },\n        { kErrorMutualAuthFailed, \"Mutual auth failed\" },\n        { kErrorTimeSkew, \"Time skew\" },\n        { kErrorCurrentDomainNotAllowed, \"Current domain not allowed\" },\n        { kErrorInvalidWindowHandle, \"Invalid window handle\" },\n        { kErrorInvalidMenuHandle, \"Invalid menu handle\" },\n        { kErrorInvalidCursorHandle, \"Invalid cursor handle\" },\n        { kErrorInvalidAccelHandle, \"Invalid accel handle\" },\n        { kErrorInvalidHookHandle, \"Invalid hook handle\" },\n        { kErrorInvalidDwpHandle, \"Invalid DWP handle\" },\n        { kErrorTlwWithWschild, \"TLW with wschild\" },\n        { kErrorCannotFindWndClass, \"Cannot find WND class\" },\n        { kErrorWindowOfOtherThread, \"Window of other thread\" },\n        { kErrorHotkeyAlreadyRegistered, \"Hotkey already registered\" },\n        { kErrorClassAlreadyExists, \"Class already exists\" },\n        { kErrorClassDoesNotExist, \"Class does not exist\" },\n        { kErrorClassHasWindows, \"Class has windows\" },\n        { kErrorInvalidIndex, \"Invalid index\" },\n        { kErrorInvalidIconHandle, \"Invalid icon handle\" },\n        { kErrorPrivateDialogIndex, \"Private dialog index\" },\n        { kErrorListboxIdNotFound, \"Listbox ID not found\" },\n        { kErrorNoWildcardCharacters, \"No wildcard characters\" },\n        { kErrorClipboardNotOpen, \"Clipboard not open\" },\n        { kErrorHotkeyNotRegistered, \"Hotkey not registered\" },\n        { kErrorWindowNotDialog, \"Window not dialog\" },\n        { kErrorControlIdNotFound, \"Control ID not found\" },\n        { kErrorInvalidComboboxMessage, \"Invalid combobox message\" },\n        { kErrorWindowNotCombobox, \"Window not combobox\" },\n        { kErrorInvalidEditHeight, \"Invalid edit height\" },\n        { kErrorDcNotFound, \"DC not found\" },\n        { kErrorInvalidHookFilter, \"Invalid hook filter\" },\n        { kErrorInvalidFilterProc, \"Invalid filter proc\" },\n        { kErrorHookNeedsHmod, \"Hook needs HMOD\" },\n        { kErrorGlobalOnlyHook, \"Global only hook\" },\n        { kErrorJournalHookSet, \"Journal hook set\" },\n        { kErrorHookNotInstalled, \"Hook not installed\" },\n        { kErrorInvalidLbMessage, \"Invalid LB message\" },\n        { kErrorSetcountOnBadLb, \"Setcount on bad LB\" },\n        { kErrorLbWithoutTabstops, \"LB without tabstops\" },\n        { kErrorDestroyObjectOfOtherThread, \"Destroy object of other thread\" },\n        { kErrorChildWindowMenu, \"Child window menu\" },\n        { kErrorNoSystemMenu, \"No system menu\" },\n        { kErrorInvalidMsgboxStyle, \"Invalid msgbox style\" },\n        { kErrorInvalidSpiValue, \"Invalid SPI value\" },\n        { kErrorScreenAlreadyLocked, \"Screen already locked\" },\n        { kErrorHwndsHaveDiffParent, \"HWNDs have different parent\" },\n        { kErrorNotChildWindow, \"Not child window\" },\n        { kErrorInvalidGwCommand, \"Invalid GW command\" },\n        { kErrorInvalidThreadId, \"Invalid thread ID\" },\n        { kErrorNonMdichildWindow, \"Non MDI child window\" },\n        { kErrorPopupAlreadyActive, \"Popup already active\" },\n        { kErrorNoScrollbars, \"No scrollbars\" },\n        { kErrorInvalidScrollbarRange, \"Invalid scrollbar range\" },\n        { kErrorInvalidShowwinCommand, \"Invalid showwin command\" },\n        { kErrorNoSystemResources, \"No system resources\" },\n        { kErrorNonpagedSystemResources, \"Nonpaged system resources\" },\n        { kErrorPagedSystemResources, \"Paged system resources\" },\n        { kErrorWorkingSetQuota, \"Working set quota\" },\n        { kErrorPagefileQuota, \"Pagefile quota\" },\n        { kErrorCommitmentLimit, \"Commitment limit\" },\n        { kErrorMenuItemNotFound, \"Menu item not found\" },\n        { kErrorInvalidKeyboardHandle, \"Invalid keyboard handle\" },\n        { kErrorHookTypeNotAllowed, \"Hook type not allowed\" },\n        { kErrorRequiresInteractiveWindowstation, \"Requires interactive windowstation\" },\n        { kErrorTimeout, \"Timeout\" },\n        { kErrorInvalidMonitorHandle, \"Invalid monitor handle\" },\n        { kErrorEventlogFileCorrupt, \"Eventlog file corrupt\" },\n        { kErrorEventlogCantStart, \"Eventlog can't start\" },\n        { kErrorLogFileFull, \"Log file full\" },\n        { kErrorEventlogFileChanged, \"Eventlog file changed\" },\n        { kErrorInstallServiceFailure, \"Install service failure\" },\n        { kErrorInstallUserexit, \"Install userexit\" },\n        { kErrorInstallFailure, \"Install failure\" },\n        { kErrorInstallSuspend, \"Install suspend\" },\n        { kErrorUnknownProduct, \"Unknown product\" },\n        { kErrorUnknownFeature, \"Unknown feature\" },\n        { kErrorUnknownComponent, \"Unknown component\" },\n        { kErrorUnknownProperty, \"Unknown property\" },\n        { kErrorInvalidHandleState, \"Invalid handle state\" },\n        { kErrorBadConfiguration, \"Bad configuration\" },\n        { kErrorIndexAbsent, \"Index absent\" },\n        { kErrorInstallSourceAbsent, \"Install source absent\" },\n        { kErrorInstallPackageVersion, \"Install package version\" },\n        { kErrorProductUninstalled, \"Product uninstalled\" },\n        { kErrorBadQuerySyntax, \"Bad query syntax\" },\n        { kErrorInvalidField, \"Invalid field\" },\n        { kErrorDeviceRemoved, \"Device removed\" },\n        { kErrorInstallAlreadyRunning, \"Install already running\" },\n        { kErrorInstallPackageOpenFailed, \"Install package open failed\" },\n        { kErrorInstallPackageInvalid, \"Install package invalid\" },\n        { kErrorInstallUiFailure, \"Install UI failure\" },\n        { kErrorInstallLogFailure, \"Install log failure\" },\n        { kErrorInstallLanguageUnsupported, \"Install language unsupported\" },\n        { kErrorInstallTransformFailure, \"Install transform failure\" },\n        { kErrorInstallPackageRejected, \"Install package rejected\" },\n        { kErrorFunctionNotCalled, \"Function not called\" },\n        { kErrorFunctionFailed, \"Function failed\" },\n        { kErrorInvalidTable, \"Invalid table\" },\n        { kErrorDatatypeMismatch, \"Datatype mismatch\" },\n        { kErrorUnsupportedType, \"Unsupported type\" },\n        { kErrorCreateFailed, \"Create failed\" },\n        { kErrorInstallTempUnwritable, \"Install temp unwritable\" },\n        { kErrorInstallPlatformUnsupported, \"Install platform unsupported\" },\n        { kErrorInstallNotused, \"Install notused\" },\n        { kErrorPatchPackageOpenFailed, \"Patch package open failed\" },\n        { kErrorPatchPackageInvalid, \"Patch package invalid\" },\n        { kErrorPatchPackageUnsupported, \"Patch package unsupported\" },\n        { kErrorProductVersion, \"Product version\" },\n        { kErrorInvalidCommandLine, \"Invalid command line\" },\n        { kErrorInstallRemoteDisallowed, \"Install remote disallowed\" },\n        { kErrorSuccessRebootInitiated, \"Success reboot initiated\" },\n        { kErrorPatchTargetNotFound, \"Patch target not found\" },\n        { kErrorPatchPackageRejected, \"Patch package rejected\" },\n        { kErrorInstallTransformRejected, \"Install transform rejected\" },\n        { kRpcSInvalidStringBinding, \"RPC S Invalid string binding\" },\n        { kRpcSWrongKindOfBinding, \"RPC S Wrong kind of binding\" },\n        { kRpcSInvalidBinding, \"RPC S Invalid binding\" },\n        { kRpcSProtseqNotSupported, \"RPC S Protseq not supported\" },\n        { kRpcSInvalidRpcProtseq, \"RPC S Invalid RPC protseq\" },\n        { kRpcSInvalidStringUuid, \"RPC S Invalid string UUID\" },\n        { kRpcSInvalidEndpointFormat, \"RPC S Invalid endpoint format\" },\n        { kRpcSInvalidNetAddr, \"RPC S Invalid net addr\" },\n        { kRpcSNoEndpointFound, \"RPC S No endpoint found\" },\n        { kRpcSInvalidTimeout, \"RPC S Invalid timeout\" },\n        { kRpcSObjectNotFound, \"RPC S Object not found\" },\n        { kRpcSAlreadyRegistered, \"RPC S Already registered\" },\n        { kRpcSTypeAlreadyRegistered, \"RPC S Type already registered\" },\n        { kRpcSAlreadyListening, \"RPC S Already listening\" },\n        { kRpcSNoProtseqsRegistered, \"RPC S Not protseqs registered\" },\n        { kRpcSNotListening, \"RPC S Not listening\" },\n        { kRpcSUnknownMgrType, \"RPC S Unknown mgr type\" },\n        { kRpcSUnknownIf, \"RPC S Unknown IF\" },\n        { kRpcSNoBindings, \"RPC S No bindings\" },\n        { kRpcSNoProtseqs, \"RPC S Not protseqs\" },\n        { kRpcSCantCreateEndpoint, \"RPC S Can't create endpoint\" },\n        { kRpcSOutOfResources, \"RPC S Out of resources\" },\n        { kRpcSServerUnavailable, \"RPC S Server unavailable\" },\n        { kRpcSServerTooBusy, \"RPC S Server too busy\" },\n        { kRpcSInvalidNetworkOptions, \"RPC S Invalid network options\" },\n        { kRpcSNoCallActive, \"RPC S No call active\" },\n        { kRpcSCallFailed, \"RPC S Call failed\" },\n        { kRpcSCallFailedDne, \"RPC S Call failed DNE\" },\n        { kRpcSProtocolError, \"RPC S Protocol error\" },\n        { kRpcSUnsupportedTransSyn, \"RPC S Unsupported trans syn\" },\n        { kRpcSUnsupportedType, \"RPC S Unsupported type\" },\n        { kRpcSInvalidTag, \"RPC S Invalid tag\" },\n        { kRpcSInvalidBound, \"RPC S Invalid bound\" },\n        { kRpcSNoEntryName, \"RPC S No entry name\" },\n        { kRpcSInvalidNameSyntax, \"RPC S Invalid name syntax\" },\n        { kRpcSUnsupportedNameSyntax, \"RPC S Unsupported name syntax\" },\n        { kRpcSUuidNoAddress, \"RPC S UUID no address\" },\n        { kRpcSDuplicateEndpoint, \"RPC S Duplicate endpoint\" },\n        { kRpcSUnknownAuthnType, \"RPC S Unknown authn type\" },\n        { kRpcSMaxCallsTooSmall, \"RPC S Max calls too small\" },\n        { kRpcSStringTooLong, \"RPC S String too long\" },\n        { kRpcSProtseqNotFound, \"RPC S Protseq not found\" },\n        { kRpcSProcnumOutOfRange, \"RPC S Procnum out of range\" },\n        { kRpcSBindingHasNoAuth, \"RPC S Binding has no auth\" },\n        { kRpcSUnknownAuthnService, \"RPC S Unknown authn service\" },\n        { kRpcSUnknownAuthnLevel, \"RPC S Unknown authn level\" },\n        { kRpcSInvalidAuthIdentity, \"RPC S Invalid auth identity\" },\n        { kRpcSUnknownAuthzService, \"RPC S Unknown authz service\" },\n        { kEptSInvalidEntry, \"EPT S Invalid entry\" },\n        { kEptSCantPerformOp, \"EPT S Can't perform op\" },\n        { kEptSNotRegistered, \"EPT S Not registered\" },\n        { kRpcSNothingToExport, \"RPC S Nothing to export\" },\n        { kRpcSIncompleteName, \"RPC S Incomplete name\" },\n        { kRpcSInvalidVersOption, \"RPC S Invalid vers option\" },\n        { kRpcSNoMoreMembers, \"RPC S No more members\" },\n        { kRpcSNotAllObjsUnexported, \"RPC S Not all objs unexported\" },\n        { kRpcSInterfaceNotFound, \"RPC S Interface not found\" },\n        { kRpcSEntryAlreadyExists, \"RPC S Entry already exists\" },\n        { kRpcSEntryNotFound, \"RPC S Entry not found\" },\n        { kRpcSNameServiceUnavailable, \"RPC S Name service unavailable\" },\n        { kRpcSInvalidNafId, \"RPC S Invalid naf ID\" },\n        { kRpcSCannotSupport, \"RPC S Cannot support\" },\n        { kRpcSNoContextAvailable, \"RPC S No context available\" },\n        { kRpcSInternalError, \"RPC S Internal error\" },\n        { kRpcSZeroDivide, \"RPC S Zero divide\" },\n        { kRpcSAddressError, \"RPC S Address error\" },\n        { kRpcSFpDivZero, \"RPC S FP div zero\" },\n        { kRpcSFpUnderflow, \"RPC S FP Underflow\" },\n        { kRpcSFpOverflow, \"RPC S Overflow\" },\n        { kRpcXNoMoreEntries, \"RPC X No more entries\" },\n        { kRpcXSsCharTransOpenFail, \"RPC X SS char trans open fail\" },\n        { kRpcXSsCharTransShortFile, \"RPC X SS char trans short file\" },\n        { kRpcXSsInNullContext, \"RPC S SS in null context\" },\n        { kRpcXSsContextDamaged, \"RPC X SS context damaged\" },\n        { kRpcXSsHandlesMismatch, \"RPC X SS handles mismatch\" },\n        { kRpcXSsCannotGetCallHandle, \"RPC X SS cannot get call handle\" },\n        { kRpcXNullRefPointer, \"RPC X Null ref pointer\" },\n        { kRpcXEnumValueOutOfRange, \"RPC X enum value out of range\" },\n        { kRpcXByteCountTooSmall, \"RPC X byte count too small\" },\n        { kRpcXBadStubData, \"RPC X bad stub data\" },\n        { kErrorInvalidUserBuffer, \"Invalid user buffer\" },\n        { kErrorUnrecognizedMedia, \"Unrecognised media\" },\n        { kErrorNoTrustLsaSecret, \"No trust lsa secret\" },\n        { kErrorNoTrustSamAccount, \"No trust sam account\" },\n        { kErrorTrustedDomainFailure, \"Trusted domain failure\" },\n        { kErrorTrustedRelationshipFailure, \"Trusted relationship failure\" },\n        { kErrorTrustFailure, \"Trust failure\" },\n        { kRpcSCallInProgress, \"RPC S call in progress\" },\n        { kErrorNetlogonNotStarted, \"Error netlogon not started\" },\n        { kErrorAccountExpired, \"Account expired\" },\n        { kErrorRedirectorHasOpenHandles, \"Redirector has open handles\" },\n        { kErrorPrinterDriverAlreadyInstalled, \"Printer driver already installed\" },\n        { kErrorUnknownPort, \"Unknown port\" },\n        { kErrorUnknownPrinterDriver, \"Unknown printer driver\" },\n        { kErrorUnknownPrintprocessor, \"Unknown printprocessor\" },\n        { kErrorInvalidSeparatorFile, \"Invalid separator file\" },\n        { kErrorInvalidPriority, \"Invalid priority\" },\n        { kErrorInvalidPrinterName, \"Invalid printer name\" },\n        { kErrorPrinterAlreadyExists, \"Printer already exists\" },\n        { kErrorInvalidPrinterCommand, \"Invalid printer command\" },\n        { kErrorInvalidDatatype, \"Invalid datatype\" },\n        { kErrorInvalidEnvironment, \"Invalid environment\" },\n        { kRpcSNoMoreBindings, \"RPC S no more bindings\" },\n        { kErrorNologonInterdomainTrustAccount, \"Nologon interdomain trust account\" },\n        { kErrorNologonWorkstationTrustAccount, \"Nologon workstation trust account\" },\n        { kErrorNologonServerTrustAccount, \"Nologon server trust account\" },\n        { kErrorDomainTrustInconsistent, \"Domain trust inconsistent\" },\n        { kErrorServerHasOpenHandles, \"Server has open handles\" },\n        { kErrorResourceDataNotFound, \"Resource data not found\" },\n        { kErrorResourceTypeNotFound, \"Resource type not found\" },\n        { kErrorResourceNameNotFound, \"Resource name not found\" },\n        { kErrorResourceLangNotFound, \"Resource lang not found\" },\n        { kErrorNotEnoughQuota, \"Not enough quota\" },\n        { kRpcSNoInterfaces, \"RPC S no interfaces\" },\n        { kRpcSCallCancelled, \"RPC S Call cancelled\" },\n        { kRpcSBindingIncomplete, \"RPC S Binding incomplete\" },\n        { kRpcSCommFailure, \"RPC S Comm failure\" },\n        { kRpcSUnsupportedAuthnLevel, \"RPC S Unsupported authn level\" },\n        { kRpcSNoPrincName, \"RPC S No princ name\" },\n        { kRpcSNotRpcError, \"RPC S Not RPC error\" },\n        { kRpcSUuidLocalOnly, \"RPC U UUID local only\" },\n        { kRpcSSecPkgError, \"RPC S Sec pkg error\" },\n        { kRpcSNotCancelled, \"RPC S Not cancelled\" },\n        { kRpcXInvalidEsAction, \"RPC X Invalid ES action\" },\n        { kRpcXWrongEsVersion, \"RPC X Wrong ES version\" },\n        { kRpcXWrongStubVersion, \"RPC X Wrong stub version\" },\n        { kRpcXInvalidPipeObject, \"RPC X Invalid pipe object\" },\n        { kRpcXWrongPipeOrder, \"RPC X Wrong pipe order\" },\n        { kRpcXWrongPipeVersion, \"RPC X Wrong pipe version\" },\n        { kRpcSGroupMemberNotFound, \"RPC S group member not found\" },\n        { kEptSCantCreate, \"EPT S Can't create\" },\n        { kRpcSInvalidObject, \"RPC S Invalid object\" },\n        { kErrorInvalidTime, \"Invalid time\" },\n        { kErrorInvalidFormName, \"Invalid form name\" },\n        { kErrorInvalidFormSize, \"Invalid form size\" },\n        { kErrorAlreadyWaiting, \"Already waiting\" },\n        { kErrorPrinterDeleted, \"Printer deleted\" },\n        { kErrorInvalidPrinterState, \"Invalid printer state\" },\n        { kErrorPasswordMustChange, \"Password must change\" },\n        { kErrorDomainControllerNotFound, \"Domain controller not found\" },\n        { kErrorAccountLockedOut, \"Account locked out\" },\n        { kOrInvalidOxid, \"OR Invalid OXID\" },\n        { kOrInvalidOid, \"OR Invalid OID\" },\n        { kOrInvalidSet, \"OR Invalid set\" },\n        { kRpcSSendIncomplete, \"RPC S Send incomplete\" },\n        { kRpcSInvalidAsyncHandle, \"RPC S Invalid async handle\" },\n        { kRpcSInvalidAsyncCall, \"RPC S Invalid async call\" },\n        { kRpcXPipeClosed, \"RPC X Pipe closed\" },\n        { kRpcXPipeDisciplineError, \"RPC X Pipe discipline error\" },\n        { kRpcXPipeEmpty, \"RPC X Pipe empty\" },\n        { kErrorNoSitename, \"No sitename\" },\n        { kErrorCantAccessFile, \"Can't access file\" },\n        { kErrorCantResolveFilename, \"Can't resolve filename\" },\n        { kRpcSEntryTypeMismatch, \"RPC S Entry type mismatch\" },\n        { kRpcSNotAllObjsExported, \"RPC S Not all objs exported\" },\n        { kRpcSInterfaceNotExported, \"RPC S Interface not exported\" },\n        { kRpcSProfileNotAdded, \"RPC S Profile not added\" },\n        { kRpcSPrfEltNotAdded, \"RPC S PRF ELT not added\" },\n        { kRpcSPrfEltNotRemoved, \"RPC S PRF ELT not removed\" },\n        { kRpcSGrpEltNotAdded, \"RPC S GRP ELT not added\" },\n        { kRpcSGrpEltNotRemoved, \"RPC S GRP ELT not removed\" },\n        { kErrorKmDriverBlocked, \"KM driver blocked\" },\n        { kErrorContextExpired, \"Context expired\" },\n        { kErrorInvalidPixelFormat, \"Invalid pixel format\" },\n        { kErrorBadDriver, \"Bad driver\" },\n        { kErrorInvalidWindowStyle, \"Invalid window style\" },\n        { kErrorMetafileNotSupported, \"Metafile not supported\" },\n        { kErrorTransformNotSupported, \"Transform not supported\" },\n        { kErrorClippingNotSupported, \"Clipping not supported\" },\n        { kErrorInvalidCmm, \"Invalid CMM\" },\n        { kErrorInvalidProfile, \"Invalid profile\" },\n        { kErrorTagNotFound, \"Tag not found\" },\n        { kErrorTagNotPresent, \"Tag not present\" },\n        { kErrorDuplicateTag, \"Duplicate tag\" },\n        { kErrorProfileNotAssociatedWithDevice, \"Profile not associated with device\" },\n        { kErrorProfileNotFound, \"Profile not found\" },\n        { kErrorInvalidColorspace, \"Invalid colorspace\" },\n        { kErrorIcmNotEnabled, \"ICM not enabled\" },\n        { kErrorDeletingIcmXform, \"Deleting ICM xform\" },\n        { kErrorInvalidTransform, \"Invalid transform\" },\n        { kErrorColorspaceMismatch, \"Colorspace mismatch\" },\n        { kErrorInvalidColorindex, \"Invalid colorindex\" },\n        { kErrorConnectedOtherPassword, \"Connected other password\" },\n        { kErrorConnectedOtherPasswordDefault, \"Connected other password default\" },\n        { kErrorBadUsername, \"Bad username\" },\n        { kErrorNotConnected, \"Not connected\" },\n        { kErrorOpenFiles, \"Open files\" },\n        { kErrorActiveConnections, \"Active connections\" },\n        { kErrorDeviceInUse, \"Device in use\" },\n        { kErrorUnknownPrintMonitor, \"Unknown print monitor\" },\n        { kErrorPrinterDriverInUse, \"Printer driver in use\" },\n        { kErrorSpoolFileNotFound, \"Spool file not found\" },\n        { kErrorSplNoStartdoc, \"SPL no startdoc\" },\n        { kErrorSplNoAddjob, \"SPL no addjob\" },\n        { kErrorPrintProcessorAlreadyInstalled, \"Print processor already installed\" },\n        { kErrorPrintMonitorAlreadyInstalled, \"Print monitor already installed\" },\n        { kErrorInvalidPrintMonitor, \"Invalid print monitor\" },\n        { kErrorPrintMonitorInUse, \"Print monitor in use\" },\n        { kErrorPrinterHasJobsQueued, \"Printer has jobs queued\" },\n        { kErrorSuccessRebootRequired, \"Success reboot required\" },\n        { kErrorSuccessRestartRequired, \"Success restart required\" },\n        { kErrorPrinterNotFound, \"Printer not found\" },\n        { kErrorPrinterDriverWarned, \"Printer driver warned\" },\n        { kErrorPrinterDriverBlocked, \"Printer driver blocked\" },\n        { kErrorWinsInternal, \"Wins internal\" },\n        { kErrorCanNotDelLocalWins, \"Can not del local wins\" },\n        { kErrorStaticInit, \"Static init\" },\n        { kErrorIncBackup, \"Inc backup\" },\n        { kErrorFullBackup, \"Full backup\" },\n        { kErrorRecNonExistent, \"Rec not existent\" },\n        { kErrorRplNotAllowed, \"RPL not allowed\" },\n        { kErrorDhcpAddressConflict, \"DHCP address conflict\" },\n        { kErrorWmiGuidNotFound, \"WMU GUID not found\" },\n        { kErrorWmiInstanceNotFound, \"WMI instance not found\" },\n        { kErrorWmiItemidNotFound, \"WMI ItemID not found\" },\n        { kErrorWmiTryAgain, \"WMI try again\" },\n        { kErrorWmiDpNotFound, \"WMI DP not found\" },\n        { kErrorWmiUnresolvedInstanceRef, \"WMI unresolved instance ref\" },\n        { kErrorWmiAlreadyEnabled, \"WMU already enabled\" },\n        { kErrorWmiGuidDisconnected, \"WMU GUID disconnected\" },\n        { kErrorWmiServerUnavailable, \"WMI server unavailable\" },\n        { kErrorWmiDpFailed, \"WMI DP failed\" },\n        { kErrorWmiInvalidMof, \"WMI invalid MOF\" },\n        { kErrorWmiInvalidReginfo, \"WMI invalid reginfo\" },\n        { kErrorWmiAlreadyDisabled, \"WMI already disabled\" },\n        { kErrorWmiReadOnly, \"WMI read only\" },\n        { kErrorWmiSetFailure, \"WMI set failure\" },\n        { kErrorInvalidMedia, \"Invalid media\" },\n        { kErrorInvalidLibrary, \"Invalid library\" },\n        { kErrorInvalidMediaPool, \"Invalid media pool\" },\n        { kErrorDriveMediaMismatch, \"Drive media mismatch\" },\n        { kErrorMediaOffline, \"Media offline\" },\n        { kErrorLibraryOffline, \"Library offline\" },\n        { kErrorEmpty, \"Empty\" },\n        { kErrorNotEmpty, \"Not empty\" },\n        { kErrorMediaUnavailable, \"Media unavailable\" },\n        { kErrorResourceDisabled, \"Resource disabled\" },\n        { kErrorInvalidCleaner, \"Invalid cleaner\" },\n        { kErrorUnableToClean, \"Unable to clean\" },\n        { kErrorObjectNotFound, \"Object not found\" },\n        { kErrorDatabaseFailure, \"Database failure\" },\n        { kErrorDatabaseFull, \"Database full\" },\n        { kErrorMediaIncompatible, \"Media incompatible\" },\n        { kErrorResourceNotPresent, \"Resource not present\" },\n        { kErrorInvalidOperation, \"Invalid operation\" },\n        { kErrorMediaNotAvailable, \"Media not available\" },\n        { kErrorDeviceNotAvailable, \"Device not available\" },\n        { kErrorRequestRefused, \"Request refused\" },\n        { kErrorInvalidDriveObject, \"Invalid drive object\" },\n        { kErrorLibraryFull, \"Library full\" },\n        { kErrorMediumNotAccessible, \"Medium not accessible\" },\n        { kErrorUnableToLoadMedium, \"Unable to load medium\" },\n        { kErrorUnableToInventoryDrive, \"Unable to inventory drive\" },\n        { kErrorUnableToInventorySlot, \"Unable to inventory slot\" },\n        { kErrorUnableToInventoryTransport, \"Unable to inventory transport\" },\n        { kErrorTransportFull, \"Transport full\" },\n        { kErrorControllingIeport, \"Controlling ieport\" },\n        { kErrorUnableToEjectMountedMedia, \"Unable to eject mounted media\" },\n        { kErrorCleanerSlotSet, \"Cleaner slot set\" },\n        { kErrorCleanerSlotNotSet, \"Cleaner slot not set\" },\n        { kErrorCleanerCartridgeSpent, \"Cleaner cartridge spent\" },\n        { kErrorUnexpectedOmid, \"Unexpected omid\" },\n        { kErrorCantDeleteLastItem, \"Can't delete last item\" },\n        { kErrorMessageExceedsMaxSize, \"Message exceeds max size\" },\n        { kErrorVolumeContainsSysFiles, \"Volume contains sys files\" },\n        { kErrorIndigenousType, \"Indigenous type\" },\n        { kErrorNoSupportingDrives, \"No supporting drives\" },\n        { kErrorCleanerCartridgeInstalled, \"Cleaner cartridge installed\" },\n        { kErrorFileOffline, \"Fill offline\" },\n        { kErrorRemoteStorageNotActive, \"Remote storage not active\" },\n        { kErrorRemoteStorageMediaError, \"Remote storage media error\" },\n        { kErrorNotAReparsePoint, \"Not a reparse point\" },\n        { kErrorReparseAttributeConflict, \"Reparse attribute conflict\" },\n        { kErrorInvalidReparseData, \"Invalid reparse data\" },\n        { kErrorReparseTagInvalid, \"Reparse tag invalid\" },\n        { kErrorReparseTagMismatch, \"Reparse tag mismatch\" },\n        { kErrorVolumeNotSisEnabled, \"Volume not sis enabled\" },\n        { kErrorDependentResourceExists, \"Dependent resource exists\" },\n        { kErrorDependencyNotFound, \"Dependency not found\" },\n        { kErrorDependencyAlreadyExists, \"Dependency already exists\" },\n        { kErrorResourceNotOnline, \"Resource not online\" },\n        { kErrorHostNodeNotAvailable, \"Host node not available\" },\n        { kErrorResourceNotAvailable, \"Resource not available\" },\n        { kErrorResourceNotFound, \"Resource not found\" },\n        { kErrorShutdownCluster, \"Shutdown cluster\" },\n        { kErrorCantEvictActiveNode, \"Can't evict active node\" },\n        { kErrorObjectAlreadyExists, \"Object already exists\" },\n        { kErrorObjectInList, \"Object in list\" },\n        { kErrorGroupNotAvailable, \"Group not available\" },\n        { kErrorGroupNotFound, \"Group not found\" },\n        { kErrorGroupNotOnline, \"Group not online\" },\n        { kErrorHostNodeNotResourceOwner, \"Host node not resource owner\" },\n        { kErrorHostNodeNotGroupOwner, \"Host node not group owner\" },\n        { kErrorResmonCreateFailed, \"Resmon create failed\" },\n        { kErrorResmonOnlineFailed, \"Resmon online failed\" },\n        { kErrorResourceOnline, \"Resource online\" },\n        { kErrorQuorumResource, \"Quorum resource\" },\n        { kErrorNotQuorumCapable, \"Not quorum capable\" },\n        { kErrorClusterShuttingDown, \"Cluster shutting down\" },\n        { kErrorInvalidState, \"Invalid state\" },\n        { kErrorResourcePropertiesStored, \"Resource properties stored\" },\n        { kErrorNotQuorumClass, \"Not quorum class\" },\n        { kErrorCoreResource, \"Core resource\" },\n        { kErrorQuorumResourceOnlineFailed, \"Quorum resource online failed\" },\n        { kErrorQuorumlogOpenFailed, \"Quorumlog open failed\" },\n        { kErrorClusterlogCorrupt, \"Clusterlog corrupt\" },\n        { kErrorClusterlogRecordExceedsMaxsize, \"Clusterlog record exceeds maxsize\" },\n        { kErrorClusterlogExceedsMaxsize, \"Clusterlog exceeds maxsize\" },\n        { kErrorClusterlogChkpointNotFound, \"Clusterlog chkpoint not found\" },\n        { kErrorClusterlogNotEnoughSpace, \"Clusterlog not enough space\" },\n        { kErrorQuorumOwnerAlive, \"Quorum owner alive\" },\n        { kErrorNetworkNotAvailable, \"Network not available\" },\n        { kErrorNodeNotAvailable, \"Node not available\" },\n        { kErrorAllNodesNotAvailable, \"All nodes not available\" },\n        { kErrorResourceFailed, \"Resource failed\" },\n        { kErrorClusterInvalidNode, \"Cluster invalid node\" },\n        { kErrorClusterNodeExists, \"Cluster node exists\" },\n        { kErrorClusterJoinInProgress, \"Cluster join in progress\" },\n        { kErrorClusterNodeNotFound, \"Cluster node not found\" },\n        { kErrorClusterLocalNodeNotFound, \"Cluster local node not found\" },\n        { kErrorClusterNetworkExists, \"Cluster network exists\" },\n        { kErrorClusterNetworkNotFound, \"Cluster network not found\" },\n        { kErrorClusterNetinterfaceExists, \"Cluster netinterface exists\" },\n        { kErrorClusterNetinterfaceNotFound, \"Cluster netinterface not found\" },\n        { kErrorClusterInvalidRequest, \"Cluster invalid request\" },\n        { kErrorClusterInvalidNetworkProvider, \"Cluster invalid network provider\" },\n        { kErrorClusterNodeDown, \"Cluster node down\" },\n        { kErrorClusterNodeUnreachable, \"Cluster node unreachable\" },\n        { kErrorClusterNodeNotMember, \"Cluster node not member\" },\n        { kErrorClusterJoinNotInProgress, \"Cluster join not in progress\" },\n        { kErrorClusterInvalidNetwork, \"Cluster invalid network\" },\n        { kErrorClusterNodeUp, \"Cluster node up\" },\n        { kErrorClusterIpaddrInUse, \"Cluster ipaddr in use\" },\n        { kErrorClusterNodeNotPaused, \"Cluster node not paused\" },\n        { kErrorClusterNoSecurityContext, \"Cluster no security context\" },\n        { kErrorClusterNetworkNotInternal, \"Cluster network not internal\" },\n        { kErrorClusterNodeAlreadyUp, \"Cluster node already up\" },\n        { kErrorClusterNodeAlreadyDown, \"Cluster node already down\" },\n        { kErrorClusterNetworkAlreadyOnline, \"Cluster network already online\" },\n        { kErrorClusterNetworkAlreadyOffline, \"Cluster network already offline\" },\n        { kErrorClusterNodeAlreadyMember, \"Cluster node already member\" },\n        { kErrorClusterLastInternalNetwork, \"Cluster last internal network\" },\n        { kErrorClusterNetworkHasDependents, \"Cluster network has dependents\" },\n        { kErrorInvalidOperationOnQuorum, \"Invalid operation on quorum\" },\n        { kErrorDependencyNotAllowed, \"Dependency not allowed\" },\n        { kErrorClusterNodePaused, \"Cluster node paused\" },\n        { kErrorNodeCantHostResource, \"Node can't host resource\" },\n        { kErrorClusterNodeNotReady, \"Cluster node not ready\" },\n        { kErrorClusterNodeShuttingDown, \"Cluster node shutting down\" },\n        { kErrorClusterJoinAborted, \"Cluster join aborted\" },\n        { kErrorClusterIncompatibleVersions, \"Cluster incompatible versions\" },\n        { kErrorClusterMaxnumOfResourcesExceeded, \"Cluster maxnum of resources exceeded\" },\n        { kErrorClusterSystemConfigChanged, \"Cluster system config changed\" },\n        { kErrorClusterResourceTypeNotFound, \"Cluster resource type not found\" },\n        { kErrorClusterRestypeNotSupported, \"Cluster restype not supported\" },\n        { kErrorClusterResnameNotFound, \"Cluster resname not found\" },\n        { kErrorClusterNoRpcPackagesRegistered, \"Cluster no RPC packages registered\" },\n        { kErrorClusterOwnerNotInPreflist, \"Cluster owner not in preflist\" },\n        { kErrorClusterDatabaseSeqmismatch, \"Cluster database seqmismatch\" },\n        { kErrorResmonInvalidState, \"Resmon invalid state\" },\n        { kErrorClusterGumNotLocker, \"Cluster gum not locker\" },\n        { kErrorQuorumDiskNotFound, \"Quorum disk not found\" },\n        { kErrorDatabaseBackupCorrupt, \"Database backup corrupt\" },\n        { kErrorClusterNodeAlreadyHasDfsRoot, \"Cluster node already has DFS root\" },\n        { kErrorResourcePropertyUnchangeable, \"Resource property unchangeable\" },\n        { kErrorClusterMembershipInvalidState, \"Cluster membership invalid state\" },\n        { kErrorClusterQuorumlogNotFound, \"Cluster quorumlog not found\" },\n        { kErrorClusterMembershipHalt, \"Cluster membership halt\" },\n        { kErrorClusterInstanceIdMismatch, \"Cluster instance ID mismatch\" },\n        { kErrorClusterNetworkNotFoundForIp, \"Cluster network not found for IP\" },\n        { kErrorClusterPropertyDataTypeMismatch, \"Cluster property data type mismatch\" },\n        { kErrorClusterEvictWithoutCleanup, \"Cluster evict without cleanup\" },\n        { kErrorClusterParameterMismatch, \"Cluster parameter mismatch\" },\n        { kErrorNodeCannotBeClustered, \"Node cannot be clustered\" },\n        { kErrorClusterWrongOsVersion, \"Cluster wrong OS version\" },\n        { kErrorClusterCantCreateDupClusterName, \"Cluster can't create dup cluster name\" },\n        { kErrorDecryptionFailed, \"Decryption failed\" },\n        { kErrorFileEncrypted, \"File encrypted\" },\n        { kErrorNoRecoveryPolicy, \"No recovery policy\" },\n        { kErrorNoEfs, \"No EFS\" },\n        { kErrorWrongEfs, \"Wrong EFS\" },\n        { kErrorNoUserKeys, \"No user keys\" },\n        { kErrorFileNotEncrypted, \"File not encryped\" },\n        { kErrorNotExportFormat, \"Not export format\" },\n        { kErrorFileReadOnly, \"File read only\" },\n        { kErrorDirEfsDisallowed, \"Dir EFS disallowed\" },\n        { kErrorEfsServerNotTrusted, \"EFS server not trusted\" },\n        { kErrorBadRecoveryPolicy, \"Bad recovery policy\" },\n        { kErrorEfsAlgBlobTooBig, \"ETS alg blob too big\" },\n        { kErrorVolumeNotSupportEfs, \"Volume not support EFS\" },\n        { kErrorEfsDisabled, \"EFS disabled\" },\n        { kErrorEfsVersionNotSupport, \"EFS version not support\" },\n        { kErrorNoBrowserServersFound, \"No browser servers found\" },\n        { kSchedEServiceNotLocalsystem, \"Sched E service not localsystem\" },\n        { kErrorCtxWinstationNameInvalid, \"Ctx winstation name invalid\" },\n        { kErrorCtxInvalidPd, \"Ctx invalid PD\" },\n        { kErrorCtxPdNotFound, \"Ctx PD not found\" },\n        { kErrorCtxWdNotFound, \"Ctx WD not found\" },\n        { kErrorCtxCannotMakeEventlogEntry, \"Ctx cannot make eventlog entry\" },\n        { kErrorCtxServiceNameCollision, \"Ctx service name collision\" },\n        { kErrorCtxClosePending, \"Ctx close pending\" },\n        { kErrorCtxNoOutbuf, \"Ctx no outbuf\" },\n        { kErrorCtxModemInfNotFound, \"Ctx modem inf not found\" },\n        { kErrorCtxInvalidModemname, \"Ctx invalid modemname\" },\n        { kErrorCtxModemResponseError, \"Ctx modem response error\" },\n        { kErrorCtxModemResponseTimeout, \"Ctx modem response timeout\" },\n        { kErrorCtxModemResponseNoCarrier, \"Ctx modem response no carrier\" },\n        { kErrorCtxModemResponseNoDialtone, \"Ctx modem response no dial tone\" },\n        { kErrorCtxModemResponseBusy, \"Ctx modem response busy\" },\n        { kErrorCtxModemResponseVoice, \"Ctx modem response voice\" },\n        { kErrorCtxTdError, \"Ctx TD error\" },\n        { kErrorCtxWinstationNotFound, \"Ctx winstation not found\" },\n        { kErrorCtxWinstationAlreadyExists, \"Ctx winstation already exists\" },\n        { kErrorCtxWinstationBusy, \"Ctx winstation busy\" },\n        { kErrorCtxBadVideoMode, \"Ctx bad video mode\" },\n        { kErrorCtxGraphicsInvalid, \"Ctx graphics invalid\" },\n        { kErrorCtxLogonDisabled, \"Ctx logon disabled\" },\n        { kErrorCtxNotConsole, \"Ctx not console\" },\n        { kErrorCtxClientQueryTimeout, \"Ctx client query timeout\" },\n        { kErrorCtxConsoleDisconnect, \"Ctx console disconnect\" },\n        { kErrorCtxConsoleConnect, \"Ctx console connect\" },\n        { kErrorCtxShadowDenied, \"Ctx shadow denied\" },\n        { kErrorCtxWinstationAccessDenied, \"Ctx winstation access denied\" },\n        { kErrorCtxInvalidWd, \"Ctx invalid WD\" },\n        { kErrorCtxShadowInvalid, \"Ctx shadow invalid\" },\n        { kErrorCtxShadowDisabled, \"Ctx shadow disabled\" },\n        { kErrorCtxClientLicenseInUse, \"Ctx client licence in use\" },\n        { kErrorCtxClientLicenseNotSet, \"Ctx client licence not set\" },\n        { kErrorCtxLicenseNotAvailable, \"Ctx licence not available\" },\n        { kErrorCtxLicenseClientInvalid, \"Ctx licence client invalid\" },\n        { kErrorCtxLicenseExpired, \"Ctx licence expired\" },\n        { kErrorCtxShadowNotRunning, \"Ctx shadow not running\" },\n        { kErrorCtxShadowEndedByModeChange, \"Ctx shadow ended by mode change\" },\n        { kFrsErrInvalidApiSequence, \"FRS err invalid API sequence\" },\n        { kFrsErrStartingService, \"FRS err starting service\" },\n        { kFrsErrStoppingService, \"FRS err stopping service\" },\n        { kFrsErrInternalApi, \"FRS err internal API\" },\n        { kFrsErrInternal, \"FRS err internal\" },\n        { kFrsErrServiceComm, \"FRS err service comm\" },\n        { kFrsErrInsufficientPriv, \"FRS err insufficient priv\" },\n        { kFrsErrAuthentication, \"FRS err authentication\" },\n        { kFrsErrParentInsufficientPriv, \"FRS err parent insufficient priv\" },\n        { kFrsErrParentAuthentication, \"FRS err parent authentication\" },\n        { kFrsErrChildToParentComm, \"FRS err child to parent comm\" },\n        { kFrsErrParentToChildComm, \"FRS err parent to child comm\" },\n        { kFrsErrSysvolPopulate, \"FRS err sysvol populate\" },\n        { kFrsErrSysvolPopulateTimeout, \"FRS err sysvol populate timeout\" },\n        { kFrsErrSysvolIsBusy, \"FRS err sysvol is busy\" },\n        { kFrsErrSysvolDemote, \"FRS err sysvol demote\" },\n        { kFrsErrInvalidServiceParameter, \"FRS err invalid service parameter\" },\n        { kErrorDsNotInstalled, \"DS not installed\" },\n        { kErrorDsMembershipEvaluatedLocally, \"DS membership evaluated locally\" },\n        { kErrorDsNoAttributeOrValue, \"DS no attribute or value\" },\n        { kErrorDsInvalidAttributeSyntax, \"DS invalid attribute syntax\" },\n        { kErrorDsAttributeTypeUndefined, \"DS attribute type undefined\" },\n        { kErrorDsAttributeOrValueExists, \"DS attribute or value exists\" },\n        { kErrorDsBusy, \"DS busy\" },\n        { kErrorDsUnavailable, \"DS unavailable\" },\n        { kErrorDsNoRidsAllocated, \"DS no rids allocated\" },\n        { kErrorDsNoMoreRids, \"DS no more rids\" },\n        { kErrorDsIncorrectRoleOwner, \"DS incorrect role owner\" },\n        { kErrorDsRidmgrInitError, \"DS ridmgr init error\" },\n        { kErrorDsObjClassViolation, \"DS obj class violation\" },\n        { kErrorDsCantOnNonLeaf, \"DS can't on non leaf\" },\n        { kErrorDsCantOnRdn, \"DS can't on rnd\" },\n        { kErrorDsCantModObjClass, \"DS can't mod obj class\" },\n        { kErrorDsCrossDomMoveError, \"DS cross dom move error\" },\n        { kErrorDsGcNotAvailable, \"DS GC not available\" },\n        { kErrorSharedPolicy, \"Shared policy\" },\n        { kErrorPolicyObjectNotFound, \"Policy object not found\" },\n        { kErrorPolicyOnlyInDs, \"Policy only in DS\" },\n        { kErrorPromotionActive, \"Promotion active\" },\n        { kErrorNoPromotionActive, \"No promotion active\" },\n        { kErrorDsOperationsError, \"DS operations error\" },\n        { kErrorDsProtocolError, \"DS protocol error\" },\n        { kErrorDsTimelimitExceeded, \"DS timelimit exceeded\" },\n        { kErrorDsSizelimitExceeded, \"DS sizelimit exceeded\" },\n        { kErrorDsAdminLimitExceeded, \"DS admin limit exceeded\" },\n        { kErrorDsCompareFalse, \"DS compare false\" },\n        { kErrorDsCompareTrue, \"DS compare true\" },\n        { kErrorDsAuthMethodNotSupported, \"DS auth method not supported\" },\n        { kErrorDsStrongAuthRequired, \"DS strong auth required\" },\n        { kErrorDsInappropriateAuth, \"DS inappropriate auth\" },\n        { kErrorDsAuthUnknown, \"DS auth unknown\" },\n        { kErrorDsReferral, \"DS referral\" },\n        { kErrorDsUnavailableCritExtension, \"DS unavailable crit extension\" },\n        { kErrorDsConfidentialityRequired, \"DS confidentiality required\" },\n        { kErrorDsInappropriateMatching, \"DS inappropriate matching\" },\n        { kErrorDsConstraintViolation, \"DS constraint violation\" },\n        { kErrorDsNoSuchObject, \"DS no such object\" },\n        { kErrorDsAliasProblem, \"DS alias problem\" },\n        { kErrorDsInvalidDnSyntax, \"DS invalid dn syntax\" },\n        { kErrorDsIsLeaf, \"DS is leaf\" },\n        { kErrorDsAliasDerefProblem, \"DS alias deref problem\" },\n        { kErrorDsUnwillingToPerform, \"DS unwilling to perform\" },\n        { kErrorDsLoopDetect, \"DS loop detect\" },\n        { kErrorDsNamingViolation, \"DS naming violation\" },\n        { kErrorDsObjectResultsTooLarge, \"DS object results too large\" },\n        { kErrorDsAffectsMultipleDsas, \"DS affects multiple dsas\" },\n        { kErrorDsServerDown, \"DS server down\" },\n        { kErrorDsLocalError, \"DS local error\" },\n        { kErrorDsEncodingError, \"DS encoding error\" },\n        { kErrorDsDecodingError, \"DS decoding error\" },\n        { kErrorDsFilterUnknown, \"DS filter unknown\" },\n        { kErrorDsParamError, \"DS param error\" },\n        { kErrorDsNotSupported, \"DS not supported\" },\n        { kErrorDsNoResultsReturned, \"DS no results returned\" },\n        { kErrorDsControlNotFound, \"DS control not found\" },\n        { kErrorDsClientLoop, \"DS client loop\" },\n        { kErrorDsReferralLimitExceeded, \"DS referral limit exceeded\" },\n        { kErrorDsSortControlMissing, \"DS sort control missing\" },\n        { kErrorDsOffsetRangeError, \"DS offset range error\" },\n        { kErrorDsRootMustBeNc, \"DS root must be nc\" },\n        { kErrorDsAddReplicaInhibited, \"DS and replica inhibited\" },\n        { kErrorDsAttNotDefInSchema, \"DS att not def in schema\" },\n        { kErrorDsMaxObjSizeExceeded, \"DS max obj size exceeded\" },\n        { kErrorDsObjStringNameExists, \"DS obj string name exists\" },\n        { kErrorDsNoRdnDefinedInSchema, \"DS no rdn defined in schema\" },\n        { kErrorDsRdnDoesntMatchSchema, \"DS rdn doesn't match schema\" },\n        { kErrorDsNoRequestedAttsFound, \"DS no requested atts found\" },\n        { kErrorDsUserBufferToSmall, \"DS user buffer too small\" },\n        { kErrorDsAttIsNotOnObj, \"DS att is not on obj\" },\n        { kErrorDsIllegalModOperation, \"DS illegal mod operation\" },\n        { kErrorDsObjTooLarge, \"DS obj too large\" },\n        { kErrorDsBadInstanceType, \"DS bad instance type\" },\n        { kErrorDsMasterdsaRequired, \"DS masterdsa required\" },\n        { kErrorDsObjectClassRequired, \"DS object class required\" },\n        { kErrorDsMissingRequiredAtt, \"DS missing required att\" },\n        { kErrorDsAttNotDefForClass, \"DS att not def for class\" },\n        { kErrorDsAttAlreadyExists, \"DS att already exists\" },\n        { kErrorDsCantAddAttValues, \"DS can't add att values\" },\n        { kErrorDsSingleValueConstraint, \"DS single value constraint\" },\n        { kErrorDsRangeConstraint, \"DS range constraint\" },\n        { kErrorDsAttValAlreadyExists, \"DS att val already exists\" },\n        { kErrorDsCantRemMissingAtt, \"DS can't rem missing att\" },\n        { kErrorDsCantRemMissingAttVal, \"DS can't rem missing att val\" },\n        { kErrorDsRootCantBeSubref, \"DS root can't be subref\" },\n        { kErrorDsNoChaining, \"DS no chaining\" },\n        { kErrorDsNoChainedEval, \"DS no chained eval\" },\n        { kErrorDsNoParentObject, \"DS no parent object\" },\n        { kErrorDsParentIsAnAlias, \"DS parent is an alias\" },\n        { kErrorDsCantMixMasterAndReps, \"DS can't mix master and reps\" },\n        { kErrorDsChildrenExist, \"DS children exist\" },\n        { kErrorDsObjNotFound, \"DS obj not found\" },\n        { kErrorDsAliasedObjMissing, \"DS aliased obj missing\" },\n        { kErrorDsBadNameSyntax, \"DS bad name syntax\" },\n        { kErrorDsAliasPointsToAlias, \"DS alias points to alias\" },\n        { kErrorDsCantDerefAlias, \"DS can't redef alias\" },\n        { kErrorDsOutOfScope, \"DS out of scope\" },\n        { kErrorDsObjectBeingRemoved, \"DS object being removed\" },\n        { kErrorDsCantDeleteDsaObj, \"DS can't delete dsa obj\" },\n        { kErrorDsGenericError, \"DS generic error\" },\n        { kErrorDsDsaMustBeIntMaster, \"DS dsa must be int master\" },\n        { kErrorDsClassNotDsa, \"DS class not dsa\" },\n        { kErrorDsInsuffAccessRights, \"DS insuff access rights\" },\n        { kErrorDsIllegalSuperior, \"DS illegal superior\" },\n        { kErrorDsAttributeOwnedBySam, \"DS attribute owned by sam\" },\n        { kErrorDsNameTooManyParts, \"DS name too many parts\" },\n        { kErrorDsNameTooLong, \"DS name too long\" },\n        { kErrorDsNameValueTooLong, \"DS name value too long\" },\n        { kErrorDsNameUnparseable, \"DS name unparseable\" },\n        { kErrorDsNameTypeUnknown, \"DS name type unknown\" },\n        { kErrorDsNotAnObject, \"DS not an object\" },\n        { kErrorDsSecDescTooShort, \"DS sec desc too short\" },\n        { kErrorDsSecDescInvalid, \"DS sec desc invalid\" },\n        { kErrorDsNoDeletedName, \"DS no deleted name\" },\n        { kErrorDsSubrefMustHaveParent, \"DS subref must have parent\" },\n        { kErrorDsNcnameMustBeNc, \"DS ncname must be nc\" },\n        { kErrorDsCantAddSystemOnly, \"DS can't add system only\" },\n        { kErrorDsClassMustBeConcrete, \"DS class must be concrete\" },\n        { kErrorDsInvalidDmd, \"DS invalid dmd\" },\n        { kErrorDsObjGuidExists, \"DS obj GUID exists\" },\n        { kErrorDsNotOnBacklink, \"DS not on backlink\" },\n        { kErrorDsNoCrossrefForNc, \"DS no crossref for nc\" },\n        { kErrorDsShuttingDown, \"DS shutting down\" },\n        { kErrorDsUnknownOperation, \"DS unknown operation\" },\n        { kErrorDsInvalidRoleOwner, \"DS invalid role owner\" },\n        { kErrorDsCouldntContactFsmo, \"DS couldn't contact fsmo\" },\n        { kErrorDsCrossNcDnRename, \"DS cross nc dn rename\" },\n        { kErrorDsCantModSystemOnly, \"DS can't mod system only\" },\n        { kErrorDsReplicatorOnly, \"DS replicator only\" },\n        { kErrorDsObjClassNotDefined, \"DS obj class not defined\" },\n        { kErrorDsObjClassNotSubclass, \"DS obj class not subclass\" },\n        { kErrorDsNameReferenceInvalid, \"DS name reference invalid\" },\n        { kErrorDsCrossRefExists, \"DS cross ref exists\" },\n        { kErrorDsCantDelMasterCrossref, \"DS can't del master crossref\" },\n        { kErrorDsSubtreeNotifyNotNcHead, \"DS subtree notify not nc head\" },\n        { kErrorDsNotifyFilterTooComplex, \"DS notify filter too complex\" },\n        { kErrorDsDupRdn, \"DS dup rdn\" },\n        { kErrorDsDupOid, \"DS dup oid\" },\n        { kErrorDsDupMapiId, \"DS dup mapi ID\" },\n        { kErrorDsDupSchemaIdGuid, \"DS dup schema ID GUID\" },\n        { kErrorDsDupLdapDisplayName, \"DS dup LDAP display name\" },\n        { kErrorDsSemanticAttTest, \"DS semantic att test\" },\n        { kErrorDsSyntaxMismatch, \"DS syntax mismatch\" },\n        { kErrorDsExistsInMustHave, \"DS exists in must have\" },\n        { kErrorDsExistsInMayHave, \"DS exists in may have\" },\n        { kErrorDsNonexistentMayHave, \"DS nonexistent may have\" },\n        { kErrorDsNonexistentMustHave, \"DS nonexistent must have\" },\n        { kErrorDsAuxClsTestFail, \"DS aux cls test fail\" },\n        { kErrorDsNonexistentPossSup, \"DS nonexistent poss sup\" },\n        { kErrorDsSubClsTestFail, \"DS sub cls test fail\" },\n        { kErrorDsBadRdnAttIdSyntax, \"DS bad rdn att ID syntax\" },\n        { kErrorDsExistsInAuxCls, \"DS exists in aux cls\" },\n        { kErrorDsExistsInSubCls, \"DS exists in sub cls\" },\n        { kErrorDsExistsInPossSup, \"DS exists in poss sup\" },\n        { kErrorDsRecalcschemaFailed, \"DS recalcschema failed\" },\n        { kErrorDsTreeDeleteNotFinished, \"DS tree delete not finished\" },\n        { kErrorDsCantDelete, \"DS can't delete\" },\n        { kErrorDsAttSchemaReqId, \"DS att schema req ID\" },\n        { kErrorDsBadAttSchemaSyntax, \"DS bad att schema syntax\" },\n        { kErrorDsCantCacheAtt, \"DS can't cache att\" },\n        { kErrorDsCantCacheClass, \"DS can't cache class\" },\n        { kErrorDsCantRemoveAttCache, \"DS can't remove att cache\" },\n        { kErrorDsCantRemoveClassCache, \"DS can't remove class cache\" },\n        { kErrorDsCantRetrieveDn, \"DS can't retrieve DN\" },\n        { kErrorDsMissingSupref, \"DS missing supref\" },\n        { kErrorDsCantRetrieveInstance, \"DS can't retrieve instance\" },\n        { kErrorDsCodeInconsistency, \"DS code inconsistency\" },\n        { kErrorDsDatabaseError, \"DS database error\" },\n        { kErrorDsGovernsidMissing, \"DS governsid missing\" },\n        { kErrorDsMissingExpectedAtt, \"DS missing expected att\" },\n        { kErrorDsNcnameMissingCrRef, \"DS ncname missing cr ref\" },\n        { kErrorDsSecurityCheckingError, \"DS security checking error\" },\n        { kErrorDsSchemaNotLoaded, \"DS schema not loaded\" },\n        { kErrorDsSchemaAllocFailed, \"DS schema alloc failed\" },\n        { kErrorDsAttSchemaReqSyntax, \"DS att schema req syntax\" },\n        { kErrorDsGcverifyError, \"DS gcverify error\" },\n        { kErrorDsDraSchemaMismatch, \"DS dra schema mismatch\" },\n        { kErrorDsCantFindDsaObj, \"DS can't find dsa obj\" },\n        { kErrorDsCantFindExpectedNc, \"DS can't find expected nc\" },\n        { kErrorDsCantFindNcInCache, \"DS can't find nc in cache\" },\n        { kErrorDsCantRetrieveChild, \"DS can't retrieve child\" },\n        { kErrorDsSecurityIllegalModify, \"DS security illegal modify\" },\n        { kErrorDsCantReplaceHiddenRec, \"DS can't replace hidden rec\" },\n        { kErrorDsBadHierarchyFile, \"DS bad hierarchy file\" },\n        { kErrorDsBuildHierarchyTableFailed, \"DS build hierarchy table failed\" },\n        { kErrorDsConfigParamMissing, \"DS config param missing\" },\n        { kErrorDsCountingAbIndicesFailed, \"DS counting ab indices failed\" },\n        { kErrorDsHierarchyTableMallocFailed, \"DS hierarchy table malloc failed\" },\n        { kErrorDsInternalFailure, \"DS internal failure\" },\n        { kErrorDsUnknownError, \"DS unknown error\" },\n        { kErrorDsRootRequiresClassTop, \"DS root requires class top\" },\n        { kErrorDsRefusingFsmoRoles, \"DS refusing fmso roles\" },\n        { kErrorDsMissingFsmoSettings, \"DS missing fmso settings\" },\n        { kErrorDsUnableToSurrenderRoles, \"DS unable to surrender roles\" },\n        { kErrorDsDraGeneric, \"DS dra generic\" },\n        { kErrorDsDraInvalidParameter, \"DS dra invalid parameter\" },\n        { kErrorDsDraBusy, \"DS dra busy\" },\n        { kErrorDsDraBadDn, \"DS dra bad dn\" },\n        { kErrorDsDraBadNc, \"DS dra bad nc\" },\n        { kErrorDsDraDnExists, \"DS dra dn exists\" },\n        { kErrorDsDraInternalError, \"DS dra internal error\" },\n        { kErrorDsDraInconsistentDit, \"DS dra inconsistent dit\" },\n        { kErrorDsDraConnectionFailed, \"DS dra connection failed\" },\n        { kErrorDsDraBadInstanceType, \"DS dra bad instance type\" },\n        { kErrorDsDraOutOfMem, \"DS dra out of mem\" },\n        { kErrorDsDraMailProblem, \"DS dra mail problem\" },\n        { kErrorDsDraRefAlreadyExists, \"DS dra ref already exists\" },\n        { kErrorDsDraRefNotFound, \"DS dra ref not found\" },\n        { kErrorDsDraObjIsRepSource, \"DS dra obj is rep source\" },\n        { kErrorDsDraDbError, \"DS dra db error\" },\n        { kErrorDsDraNoReplica, \"DS dra no replica\" },\n        { kErrorDsDraAccessDenied, \"DS dra access denied\" },\n        { kErrorDsDraNotSupported, \"DS dra not supported\" },\n        { kErrorDsDraRpcCancelled, \"DS dra RPC cancelled\" },\n        { kErrorDsDraSourceDisabled, \"DS dra source disabled\" },\n        { kErrorDsDraSinkDisabled, \"DS dra sink disabled\" },\n        { kErrorDsDraNameCollision, \"DS dra name collision\" },\n        { kErrorDsDraSourceReinstalled, \"DS dra source reinstalled\" },\n        { kErrorDsDraMissingParent, \"DS dra missing parent\" },\n        { kErrorDsDraPreempted, \"DS dra preempted\" },\n        { kErrorDsDraAbandonSync, \"DS dra abandon sync\" },\n        { kErrorDsDraShutdown, \"DS dra shutdown\" },\n        { kErrorDsDraIncompatiblePartialSet, \"DS dra incompatible partial set\" },\n        { kErrorDsDraSourceIsPartialReplica, \"DS dra source is partial replica\" },\n        { kErrorDsDraExtnConnectionFailed, \"DS dra extn connection failed\" },\n        { kErrorDsInstallSchemaMismatch, \"DS install schema mismatch\" },\n        { kErrorDsDupLinkId, \"DS dup link ID\" },\n        { kErrorDsNameErrorResolving, \"DS name error resolving\" },\n        { kErrorDsNameErrorNotFound, \"DS name error not found\" },\n        { kErrorDsNameErrorNotUnique, \"DS name error not unique\" },\n        { kErrorDsNameErrorNoMapping, \"DS name error no mapping\" },\n        { kErrorDsNameErrorDomainOnly, \"DS name error domain only\" },\n        { kErrorDsNameErrorNoSyntacticalMapping, \"DS name error no syntactical mapping\" },\n        { kErrorDsConstructedAttMod, \"DS constructed att mod\" },\n        { kErrorDsWrongOmObjClass, \"DS wrong om obj class\" },\n        { kErrorDsDraReplPending, \"DS dra repl pending\" },\n        { kErrorDsDsRequired, \"DS ds required\" },\n        { kErrorDsInvalidLdapDisplayName, \"DS invalid LDAP display name\" },\n        { kErrorDsNonBaseSearch, \"DS non base search\" },\n        { kErrorDsCantRetrieveAtts, \"DS can't retrieve atts\" },\n        { kErrorDsBacklinkWithoutLink, \"DS backlink without link\" },\n        { kErrorDsEpochMismatch, \"DS epoch mismatch\" },\n        { kErrorDsSrcNameMismatch, \"DS src name mismatch\" },\n        { kErrorDsSrcAndDstNcIdentical, \"DS src and dst nc identical\" },\n        { kErrorDsDstNcMismatch, \"DS dst nc mismatch\" },\n        { kErrorDsNotAuthoritiveForDstNc, \"DS not authoritive for dst nc\" },\n        { kErrorDsSrcGuidMismatch, \"DS src GUID mismatch\" },\n        { kErrorDsCantMoveDeletedObject, \"DS can't move deleted object\" },\n        { kErrorDsPdcOperationInProgress, \"DS pdc operation in progress\" },\n        { kErrorDsCrossDomainCleanupReqd, \"DS cross domain cleanup reqd\" },\n        { kErrorDsIllegalXdomMoveOperation, \"DS illegal xdom move operation\" },\n        { kErrorDsCantWithAcctGroupMembershps, \"DS can't with acct group membershps\" },\n        { kErrorDsNcMustHaveNcParent, \"DS nc must have nc parent\" },\n        { kErrorDsDstDomainNotNative, \"DS dst domain not native\" },\n        { kErrorDsMissingInfrastructureContainer, \"DS missing infrastructure container\" },\n        { kErrorDsCantMoveAccountGroup, \"DS can't move account group\" },\n        { kErrorDsCantMoveResourceGroup, \"DS can't move resource group\" },\n        { kErrorDsInvalidSearchFlag, \"DS invalid search flag\" },\n        { kErrorDsNoTreeDeleteAboveNc, \"DS no tree delete above nc\" },\n        { kErrorDsCouldntLockTreeForDelete, \"DS couldn't lock tree for delete\" },\n        { kErrorDsCouldntIdentifyObjectsForTreeDelete, \"DS couldn't identify objects for tree delete\" },\n        { kErrorDsSamInitFailure, \"DS sam init failure\" },\n        { kErrorDsSensitiveGroupViolation, \"DS sensitive group violation\" },\n        { kErrorDsCantModPrimarygroupid, \"DS can't mod primarygroupid\" },\n        { kErrorDsIllegalBaseSchemaMod, \"DS illegal base schema mod\" },\n        { kErrorDsNonsafeSchemaChange, \"DS nonsafe schema change\" },\n        { kErrorDsSchemaUpdateDisallowed, \"DS schema update disallowed\" },\n        { kErrorDsCantCreateUnderSchema, \"DS can't create under schema\" },\n        { kErrorDsInstallNoSrcSchVersion, \"DS install no src sch version\" },\n        { kErrorDsInstallNoSchVersionInInifile, \"DS install no sch version in inifile\" },\n        { kErrorDsInvalidGroupType, \"DS invalid group type\" },\n        { kErrorDsNoNestGlobalgroupInMixeddomain, \"DS no nest globalgroup in mixeddomain\" },\n        { kErrorDsNoNestLocalgroupInMixeddomain, \"DS no nest localgroup in mixeddomain\" },\n        { kErrorDsGlobalCantHaveLocalMember, \"DS global can't have local member\" },\n        { kErrorDsGlobalCantHaveUniversalMember, \"DS global can't have universal member\" },\n        { kErrorDsUniversalCantHaveLocalMember, \"DS universal can't have local member\" },\n        { kErrorDsGlobalCantHaveCrossdomainMember, \"DS global can't have crossdomain member\" },\n        { kErrorDsLocalCantHaveCrossdomainLocalMember, \"DS local can't have crossdomain local member\" },\n        { kErrorDsHavePrimaryMembers, \"DS have primary members\" },\n        { kErrorDsStringSdConversionFailed, \"DS string sd conversion failed\" },\n        { kErrorDsNamingMasterGc, \"DS naming master gc\" },\n        { kErrorDsLookupFailure, \"DS lookup failure\" },\n        { kErrorDsCouldntUpdateSpns, \"DS couldn't update spns\" },\n        { kErrorDsCantRetrieveSd, \"DS can't retrieve sd\" },\n        { kErrorDsKeyNotUnique, \"DS key not unique\" },\n        { kErrorDsWrongLinkedAttSyntax, \"DS wrong linked att syntax\" },\n        { kErrorDsSamNeedBootkeyPassword, \"DS sam need bootkey password\" },\n        { kErrorDsSamNeedBootkeyFloppy, \"DS sam need bootkey floppy\" },\n        { kErrorDsCantStart, \"DS can't start\" },\n        { kErrorDsInitFailure, \"DS init failure\" },\n        { kErrorDsNoPktPrivacyOnConnection, \"DS no pkt privacy on connection\" },\n        { kErrorDsSourceDomainInForest, \"DS source domain in forest\" },\n        { kErrorDsDestinationDomainNotInForest, \"DS destination domain not in forest\" },\n        { kErrorDsDestinationAuditingNotEnabled, \"DS destination auditing not enabled\" },\n        { kErrorDsCantFindDcForSrcDomain, \"DS can't find dc for src domain\" },\n        { kErrorDsSrcObjNotGroupOrUser, \"DS src obj not group or user\" },\n        { kErrorDsSrcSidExistsInForest, \"DS src sid exists in forest\" },\n        { kErrorDsSrcAndDstObjectClassMismatch, \"DS src and dst object class mismatch\" },\n        { kErrorSamInitFailure, \"Sam init failure\" },\n        { kErrorDsDraSchemaInfoShip, \"DS dra schema info ship\" },\n        { kErrorDsDraSchemaConflict, \"DS dra schema conflict\" },\n        { kErrorDsDraEarlierSchemaConlict, \"DS dra earlier schema conflict\" },\n        { kErrorDsDraObjNcMismatch, \"DS dra obj nc mismatch\" },\n        { kErrorDsNcStillHasDsas, \"DS nc still has dsas\" },\n        { kErrorDsGcRequired, \"DS gc required\" },\n        { kErrorDsLocalMemberOfLocalOnly, \"DS local member of local only\" },\n        { kErrorDsNoFpoInUniversalGroups, \"DS no fpo in universal groups\" },\n        { kErrorDsCantAddToGc, \"DS can't add to gc\" },\n        { kErrorDsNoCheckpointWithPdc, \"DS no checkpoint with pdc\" },\n        { kErrorDsSourceAuditingNotEnabled, \"DS source auditing not enabled\" },\n        { kErrorDsCantCreateInNondomainNc, \"DS can't create in nondomain nc\" },\n        { kErrorDsInvalidNameForSpn, \"DS invalid name for spn\" },\n        { kErrorDsFilterUsesContructedAttrs, \"DS filter uses constructed attrs\" },\n        { kErrorDsUnicodepwdNotInQuotes, \"DS unicodepwd not in quotes\" },\n        { kErrorDsMachineAccountQuotaExceeded, \"DS machine account quota exceeded\" },\n        { kErrorDsMustBeRunOnDstDc, \"DS must be run on dst dc\" },\n        { kErrorDsSrcDcMustBeSp4OrGreater, \"DS src dc must be sp4 or greater\" },\n        { kErrorDsCantTreeDeleteCriticalObj, \"DS can't tree delete critical obj\" },\n        { kErrorDsInitFailureConsole, \"DS init failure console\" },\n        { kErrorDsSamInitFailureConsole, \"DS sam init failure console\" },\n        { kErrorDsForestVersionTooHigh, \"DS forest version too high\" },\n        { kErrorDsDomainVersionTooHigh, \"DS domain version too high\" },\n        { kErrorDsForestVersionTooLow, \"DS forest version too low\" },\n        { kErrorDsDomainVersionTooLow, \"DS domain version too low\" },\n        { kErrorDsIncompatibleVersion, \"DS incompatible version\" },\n        { kErrorDsLowDsaVersion, \"DS low dsa version\" },\n        { kErrorDsNoBehaviorVersionInMixeddomain, \"DS no behaviour version in mixeddomain\" },\n        { kErrorDsNotSupportedSortOrder, \"DS not supported sort order\" },\n        { kErrorDsNameNotUnique, \"DS name not unique\" },\n        { kErrorDsMachineAccountCreatedPrent4, \"DS machine account created prent4\" },\n        { kErrorDsOutOfVersionStore, \"DS out of version store\" },\n        { kErrorDsIncompatibleControlsUsed, \"DS incompatible controls used\" },\n        { kErrorDsNoRefDomain, \"DS no ref domain\" },\n        { kErrorDsReservedLinkId, \"DS reserved link ID\" },\n        { kErrorDsLinkIdNotAvailable, \"DS link ID not available\" },\n        { kErrorDsAgCantHaveUniversalMember, \"DS ag can't have universal member\" },\n        { kErrorDsModifydnDisallowedByInstanceType, \"DS modifydn disallowed by instance type\" },\n        { kErrorDsNoObjectMoveInSchemaNc, \"DS no object move in schema nc\" },\n        { kErrorDsModifydnDisallowedByFlag, \"DS modifydn disallowed by flag\" },\n        { kErrorDsModifydnWrongGrandparent, \"DS modifydn wrong grandparent\" },\n        { kErrorDsNameErrorTrustReferral, \"DS name error trust referral\" },\n        { kErrorNotSupportedOnStandardServer, \"Not supported on standard server\" },\n        { kErrorDsCantAccessRemotePartOfAd, \"DS can't access remote part of ad\" },\n        { kErrorDsCrImpossibleToValidate, \"DS cr impossible to validate\" },\n        { kErrorDsThreadLimitExceeded, \"DS thread limit exceeded\" },\n        { kErrorDsNotClosest, \"DS not closest\" },\n        { kErrorDsCantDeriveSpnWithoutServerRef, \"DS can't derive spn without server ref\" },\n        { kErrorDsSingleUserModeFailed, \"DS single user mode failed\" },\n        { kErrorDsNtdscriptSyntaxError, \"DS ntdscript syntax error\" },\n        { kErrorDsNtdscriptProcessError, \"DS ntdscript process error\" },\n        { kErrorDsDifferentReplEpochs, \"DS different repl epochs\" },\n        { kErrorDsDrsExtensionsChanged, \"DS drs extensions changed\" },\n        { kErrorDsReplicaSetChangeNotAllowedOnDisabledCr, \"DS replica set change not allowed on disabled cr\" },\n        { kErrorDsNoMsdsIntid, \"DS no msds intid\" },\n        { kErrorDsDupMsdsIntid, \"DS dup msds intid\" },\n        { kErrorDsExistsInRdnattid, \"DS exists in rdnattid\" },\n        { kErrorDsAuthorizationFailed, \"DS authorisation failed\" },\n        { kErrorDsInvalidScript, \"DS invalid script\" },\n        { kErrorDsRemoteCrossrefOpFailed, \"DS remote crossref op failed\" },\n        { kDnsErrorRcodeFormatError, \"DNS error rcode format error\" },\n        { kDnsErrorRcodeServerFailure, \"DNS error rcode server failure\" },\n        { kDnsErrorRcodeNameError, \"DNS error rcode name error\" },\n        { kDnsErrorRcodeNotImplemented, \"DNS error rcode not implemented\" },\n        { kDnsErrorRcodeRefused, \"DNS error rcode refused\" },\n        { kDnsErrorRcodeYxdomain, \"DNS error rcode yxdomain\" },\n        { kDnsErrorRcodeYxrrset, \"DNS error rcode yxrrset\" },\n        { kDnsErrorRcodeNxrrset, \"DNS error rcode nxrrset\" },\n        { kDnsErrorRcodeNotauth, \"DNS error rcode notauth\" },\n        { kDnsErrorRcodeNotzone, \"DNS error rcode notzone\" },\n        { kDnsErrorRcodeBadsig, \"DNS error rcode badsig\" },\n        { kDnsErrorRcodeBadkey, \"DNS error rcode badkey\" },\n        { kDnsErrorRcodeBadtime, \"DNS error rcode badtime\" },\n        { kDnsInfoNoRecords, \"DNS info no records\" },\n        { kDnsErrorBadPacket, \"DNS error bad packet\" },\n        { kDnsErrorNoPacket, \"DNS error no packet\" },\n        { kDnsErrorRcode, \"DNS error rcode\" },\n        { kDnsErrorUnsecurePacket, \"DNS error unsecure packet\" },\n        { kDnsErrorInvalidType, \"DNS error invalid type\" },\n        { kDnsErrorInvalidIpAddress, \"DNS error invalid IP address\" },\n        { kDnsErrorInvalidProperty, \"DNS error invalid property\" },\n        { kDnsErrorTryAgainLater, \"DNS error try again later\" },\n        { kDnsErrorNotUnique, \"DNS error not unique\" },\n        { kDnsErrorNonRfcName, \"DNS error non RFC name\" },\n        { kDnsStatusFqdn, \"DNS status FQDN\" },\n        { kDnsStatusDottedName, \"DNS status dotted name\" },\n        { kDnsStatusSinglePartName, \"DNS status single part name\" },\n        { kDnsErrorInvalidNameChar, \"DNS error invalid name char\" },\n        { kDnsErrorNumericName, \"DNS error numeric name\" },\n        { kDnsErrorNotAllowedOnRootServer, \"DNS error not allowed on root server\" },\n        { kDnsErrorZoneDoesNotExist, \"DNS error zone does not exist\" },\n        { kDnsErrorNoZoneInfo, \"DNS error not zone info\" },\n        { kDnsErrorInvalidZoneOperation, \"DNS error invalid zone operation\" },\n        { kDnsErrorZoneConfigurationError, \"DNS error zone configuration error\" },\n        { kDnsErrorZoneHasNoSoaRecord, \"DNS error zone has not SOA record\" },\n        { kDnsErrorZoneHasNoNsRecords, \"DNS error zone has no NS records\" },\n        { kDnsErrorZoneLocked, \"DNS error zone locked\" },\n        { kDnsErrorZoneCreationFailed, \"DNS error zone creation failed\" },\n        { kDnsErrorZoneAlreadyExists, \"DNS error zone already exists\" },\n        { kDnsErrorAutozoneAlreadyExists, \"DNS error autozone already exists\" },\n        { kDnsErrorInvalidZoneType, \"DNS error invalid zone type\" },\n        { kDnsErrorSecondaryRequiresMasterIp, \"DNS error secondary requires master IP\" },\n        { kDnsErrorZoneNotSecondary, \"DNS error zone not secondary\" },\n        { kDnsErrorNeedSecondaryAddresses, \"DNS error need secondary addresses\" },\n        { kDnsErrorWinsInitFailed, \"DNS error wins init failed\" },\n        { kDnsErrorNeedWinsServers, \"DNS error need wins servers\" },\n        { kDnsErrorNbstatInitFailed, \"DNS error nbstat init failed\" },\n        { kDnsErrorSoaDeleteInvalid, \"DNS error SOA delete invalid\" },\n        { kDnsErrorForwarderAlreadyExists, \"DNS error forwarder already exists\" },\n        { kDnsErrorZoneRequiresMasterIp, \"DNS error zone requires master IP\" },\n        { kDnsErrorZoneIsShutdown, \"DNS error zone is shutdown\" },\n        { kDnsErrorPrimaryRequiresDatafile, \"DNS error primary requires datafile\" },\n        { kDnsErrorInvalidDatafileName, \"DNS error invalid datafile name\" },\n        { kDnsErrorDatafileOpenFailure, \"DNS error datafile open failure\" },\n        { kDnsErrorFileWritebackFailed, \"DNS error file writeback failed\" },\n        { kDnsErrorDatafileParsing, \"DNS error datafile parsing\" },\n        { kDnsErrorRecordDoesNotExist, \"DNS error record does not exist\" },\n        { kDnsErrorRecordFormat, \"DNS error record format\" },\n        { kDnsErrorNodeCreationFailed, \"DNS error node creation failed\" },\n        { kDnsErrorUnknownRecordType, \"DNS error unknown record type\" },\n        { kDnsErrorRecordTimedOut, \"DNS error record timed out\" },\n        { kDnsErrorNameNotInZone, \"DNS error name not in zone\" },\n        { kDnsErrorCnameLoop, \"DNS error CNAME loop\" },\n        { kDnsErrorNodeIsCname, \"DNS error node is CNAME\" },\n        { kDnsErrorCnameCollision, \"DNS error CNAME collision\" },\n        { kDnsErrorRecordOnlyAtZoneRoot, \"DNS error record only at zone root\" },\n        { kDnsErrorRecordAlreadyExists, \"DNS error record already exists\" },\n        { kDnsErrorSecondaryData, \"DNS error secondary data\" },\n        { kDnsErrorNoCreateCacheData, \"DNS error no create cache data\" },\n        { kDnsErrorNameDoesNotExist, \"DNS error name does not exist\" },\n        { kDnsWarningPtrCreateFailed, \"DNS warning PTR create failed\" },\n        { kDnsWarningDomainUndeleted, \"DNS warning domain undeleted\" },\n        { kDnsErrorDsUnavailable, \"DNS error ds unavailable\" },\n        { kDnsErrorDsZoneAlreadyExists, \"DNS error ds zone already exists\" },\n        { kDnsErrorNoBootfileIfDsZone, \"DNS error no bootfile if ds zone\" },\n        { kDnsInfoAxfrComplete, \"DNS info AXFR complete\" },\n        { kDnsErrorAxfr, \"DNS error AXFR\" },\n        { kDnsInfoAddedLocalWins, \"DNS info added local wins\" },\n        { kDnsStatusContinueNeeded, \"DNS status continue needed\" },\n        { kDnsErrorNoTcpip, \"DNS error no TCPIP\" },\n        { kDnsErrorNoDnsServers, \"DNS error no DNS servers\" },\n        { kDnsErrorDpDoesNotExist, \"DNS error dp does not exist\" },\n        { kDnsErrorDpAlreadyExists, \"DNS error dp already exists\" },\n        { kDnsErrorDpNotEnlisted, \"DNS error dp not enlisted\" },\n        { kDnsErrorDpAlreadyEnlisted, \"DNS error dp already enlisted\" },\n        { kWSAQosReceivers, \"QOS receivers\" },\n        { kWSAQosSenders, \"QOS senders\" },\n        { kWSAQosNoSenders, \"QOS no senders\" },\n        { kWSAQosNoReceivers, \"QOS no receivers\" },\n        { kWSAQosRequestConfirmed, \"QOS request confirmed\" },\n        { kWSAQosAdmissionFailure, \"QOS admission failure\" },\n        { kWSAQosPolicyFailure, \"QOS policy failure\" },\n        { kWSAQosBadStyle, \"QOS bad style\" },\n        { kWSAQosBadObject, \"QOS bad object\" },\n        { kWSAQosTrafficCtrlError, \"QOS traffic ctrl error\" },\n        { kWSAQosGenericError, \"QOS generic error\" },\n        { kWSAQosEservicetype, \"QOS eservicetype\" },\n        { kWSAQosEflowspec, \"QOS eflowspec\" },\n        { kWSAQosEprovspecbuf, \"QOS eprovspecbuf\" },\n        { kWSAQosEfilterstyle, \"QOS efilterstyle\" },\n        { kWSAQosEfiltertype, \"QOS efiltertype\" },\n        { kWSAQosEfiltercount, \"QOS efiltercount\" },\n        { kWSAQosEobjlength, \"QOS eobjlength\" },\n        { kWSAQosEflowcount, \"QOS eflowcount\" },\n        { kWSAQosEunknownpsobj, \"QOS eunknownpsobj\" },\n        { kWSAQosEpolicyobj, \"QOS epolicyobj\" },\n        { kWSAQosEflowdesc, \"QOS eflowdesc\" },\n        { kWSAQosEpsflowspec, \"QOS epsflowspec\" },\n        { kWSAQosEpsfilterspec, \"QOS epsfilterspec\" },\n        { kWSAQosEsdmodeobj, \"QOS esdmodeobj\" },\n        { kWSAQosEshaperateobj, \"QOS eshaperateobj\" },\n        { kWSAQosReservedPetype, \"QOS reserved petype\" },\n        { kErrorIpsecQmPolicyExists, \"IPSEC qm policy exists\" },\n        { kErrorIpsecQmPolicyNotFound, \"IPSEC qm policy not found\" },\n        { kErrorIpsecQmPolicyInUse, \"IPSEC qm policy in use\" },\n        { kErrorIpsecMmPolicyExists, \"IPSEC mm policy exists\" },\n        { kErrorIpsecMmPolicyNotFound, \"IPSEC mm policy not found\" },\n        { kErrorIpsecMmPolicyInUse, \"IPSEC mm policy in use\" },\n        { kErrorIpsecMmFilterExists, \"IPSEC mm filter exists\" },\n        { kErrorIpsecMmFilterNotFound, \"IPSEC mm filter not found\" },\n        { kErrorIpsecTransportFilterExists, \"IPSEC transport filter exists\" },\n        { kErrorIpsecTransportFilterNotFound, \"IPSEC transport filter not found\" },\n        { kErrorIpsecMmAuthExists, \"IPSEC mm auth exists\" },\n        { kErrorIpsecMmAuthNotFound, \"IPSEC mm auth not found\" },\n        { kErrorIpsecMmAuthInUse, \"IPSEC mm auth in use\" },\n        { kErrorIpsecDefaultMmPolicyNotFound, \"IPSEC default mm policy not found\" },\n        { kErrorIpsecDefaultMmAuthNotFound, \"IPSEC default mm auth not found\" },\n        { kErrorIpsecDefaultQmPolicyNotFound, \"IPSEC default qm policy not found\" },\n        { kErrorIpsecTunnelFilterExists, \"IPSEC tunnel filter exists\" },\n        { kErrorIpsecTunnelFilterNotFound, \"IPSEC tunnel filter not found\" },\n        { kErrorIpsecMmFilterPendingDeletion, \"IPSEC mm filter pending deletion\" },\n        { kErrorIpsecTransportFilterPendingDeletion, \"IPSEC transport filter pending deletion\" },\n        { kErrorIpsecTunnelFilterPendingDeletion, \"IPSEC tunnel filter pending deletion\" },\n        { kErrorIpsecMmPolicyPendingDeletion, \"IPSEC mm policy pending deletion\" },\n        { kErrorIpsecMmAuthPendingDeletion, \"IPSEC mm auth pending deletion\" },\n        { kErrorIpsecQmPolicyPendingDeletion, \"IPSEC qm policy pending deletion\" },\n        { kErrorIpsecIkeAuthFail, \"IPSEC IKE auth fail\" },\n        { kErrorIpsecIkeAttribFail, \"IPSEC IKE attrib fail\" },\n        { kErrorIpsecIkeNegotiationPending, \"IPSEC IKE negotiation pending\" },\n        { kErrorIpsecIkeGeneralProcessingError, \"IPSEC IKE general processing error\" },\n        { kErrorIpsecIkeTimedOut, \"IPSEC IKE timed out\" },\n        { kErrorIpsecIkeNoCert, \"IPSEC IKE no cert\" },\n        { kErrorIpsecIkeSaDeleted, \"IPSEC IKE sa deleted\" },\n        { kErrorIpsecIkeSaReaped, \"IPSEC IKE sa reaped\" },\n        { kErrorIpsecIkeMmAcquireDrop, \"IPSEC IKE mm acquire drop\" },\n        { kErrorIpsecIkeQmAcquireDrop, \"IPSEC IKE qm acquire drop\" },\n        { kErrorIpsecIkeQueueDropMm, \"IPSEC IKE queue drop mm\" },\n        { kErrorIpsecIkeQueueDropNoMm, \"IPSEC IKE queue drop no mm\" },\n        { kErrorIpsecIkeDropNoResponse, \"IPSEC IKE drop no response\" },\n        { kErrorIpsecIkeMmDelayDrop, \"IPSEC IKE mm delay drop\" },\n        { kErrorIpsecIkeQmDelayDrop, \"IPSEC IKE qm delay drop\" },\n        { kErrorIpsecIkeError, \"IPSEC IKE error\" },\n        { kErrorIpsecIkeCrlFailed, \"IPSEC IKE crl failed\" },\n        { kErrorIpsecIkeInvalidKeyUsage, \"IPSEC IKE invalid key usage\" },\n        { kErrorIpsecIkeInvalidCertType, \"IPSEC IKE invalid cert type\" },\n        { kErrorIpsecIkeNoPrivateKey, \"IPSEC IKE no private key\" },\n        { kErrorIpsecIkeDhFail, \"IPSEC IKE dh fail\" },\n        { kErrorIpsecIkeInvalidHeader, \"IPSEC IKE invalid header\" },\n        { kErrorIpsecIkeNoPolicy, \"IPSEC IKE no policy\" },\n        { kErrorIpsecIkeInvalidSignature, \"IPSEC IKE invalid signature\" },\n        { kErrorIpsecIkeKerberosError, \"IPSEC IKE kerberos error\" },\n        { kErrorIpsecIkeNoPublicKey, \"IPSEC IKE no public key\" },\n        { kErrorIpsecIkeProcessErr, \"IPSEC IKE process err\" },\n        { kErrorIpsecIkeProcessErrSa, \"IPSEC IKE process err sa\" },\n        { kErrorIpsecIkeProcessErrProp, \"IPSEC IKE process err prop\" },\n        { kErrorIpsecIkeProcessErrTrans, \"IPSEC IKE process err trans\" },\n        { kErrorIpsecIkeProcessErrKe, \"IPSEC IKE process err ke\" },\n        { kErrorIpsecIkeProcessErrId, \"IPSEC IKE process err ID\" },\n        { kErrorIpsecIkeProcessErrCert, \"IPSEC IKE process err cert\" },\n        { kErrorIpsecIkeProcessErrCertReq, \"IPSEC IKE process err cert req\" },\n        { kErrorIpsecIkeProcessErrHash, \"IPSEC IKE process err hash\" },\n        { kErrorIpsecIkeProcessErrSig, \"IPSEC IKE process err sig\" },\n        { kErrorIpsecIkeProcessErrNonce, \"IPSEC IKE process err nonce\" },\n        { kErrorIpsecIkeProcessErrNotify, \"IPSEC IKE process err notify\" },\n        { kErrorIpsecIkeProcessErrDelete, \"IPSEC IKE process err delete\" },\n        { kErrorIpsecIkeProcessErrVendor, \"IPSEC IKE process err vendor\" },\n        { kErrorIpsecIkeInvalidPayload, \"IPSEC IKE invalid payload\" },\n        { kErrorIpsecIkeLoadSoftSa, \"IPSEC IKE load soft sa\" },\n        { kErrorIpsecIkeSoftSaTornDown, \"IPSEC IKE soft sa torn down\" },\n        { kErrorIpsecIkeInvalidCookie, \"IPSEC IKE invalid cookie\" },\n        { kErrorIpsecIkeNoPeerCert, \"IPSEC IKE no peer cert\" },\n        { kErrorIpsecIkePeerCrlFailed, \"IPSEC IKE peer CRL failed\" },\n        { kErrorIpsecIkePolicyChange, \"IPSEC IKE policy change\" },\n        { kErrorIpsecIkeNoMmPolicy, \"IPSEC IKE no mm policy\" },\n        { kErrorIpsecIkeNotcbpriv, \"IPSEC IKE notcbpriv\" },\n        { kErrorIpsecIkeSecloadfail, \"IPSEC IKE secloadfail\" },\n        { kErrorIpsecIkeFailsspinit, \"IPSEC IKE failsspinit\" },\n        { kErrorIpsecIkeFailqueryssp, \"IPSEC IKE failqueryssp\" },\n        { kErrorIpsecIkeSrvacqfail, \"IPSEC IKE srvacqfail\" },\n        { kErrorIpsecIkeSrvquerycred, \"IPSEC IKE srvquerycred\" },\n        { kErrorIpsecIkeGetspifail, \"IPSEC IKE getspifail\" },\n        { kErrorIpsecIkeInvalidFilter, \"IPSEC IKE invalid filter\" },\n        { kErrorIpsecIkeOutOfMemory, \"IPSEC IKE out of memory\" },\n        { kErrorIpsecIkeAddUpdateKeyFailed, \"IPSEC IKE add update key failed\" },\n        { kErrorIpsecIkeInvalidPolicy, \"IPSEC IKE invalid policy\" },\n        { kErrorIpsecIkeUnknownDoi, \"IPSEC IKE unknown doi\" },\n        { kErrorIpsecIkeInvalidSituation, \"IPSEC IKE invalid situation\" },\n        { kErrorIpsecIkeDhFailure, \"IPSEC IKE dh failure\" },\n        { kErrorIpsecIkeInvalidGroup, \"IPSEC IKE invalid group\" },\n        { kErrorIpsecIkeEncrypt, \"IPSEC IKE encrypt\" },\n        { kErrorIpsecIkeDecrypt, \"IPSEC IKE decrypt\" },\n        { kErrorIpsecIkePolicyMatch, \"IPSEC IKE policy match\" },\n        { kErrorIpsecIkeUnsupportedId, \"IPSEC IKE unsupported ID\" },\n        { kErrorIpsecIkeInvalidHash, \"IPSEC IKE invalid hash\" },\n        { kErrorIpsecIkeInvalidHashAlg, \"IPSEC IKE invalid hash alg\" },\n        { kErrorIpsecIkeInvalidHashSize, \"IPSEC IKE invalid hash size\" },\n        { kErrorIpsecIkeInvalidEncryptAlg, \"IPSEC IKE invalid encrypt alg\" },\n        { kErrorIpsecIkeInvalidAuthAlg, \"IPSEC IKE invalid auth alg\" },\n        { kErrorIpsecIkeInvalidSig, \"IPSEC IKE invalid sig\" },\n        { kErrorIpsecIkeLoadFailed, \"IPSEC IKE load failed\" },\n        { kErrorIpsecIkeRpcDelete, \"IPSEC IKE rpc delete\" },\n        { kErrorIpsecIkeBenignReinit, \"IPSEC IKE benign reinit\" },\n        { kErrorIpsecIkeInvalidResponderLifetimeNotify, \"IPSEC IKE invalid responder lifetime notify\" },\n        { kErrorIpsecIkeInvalidCertKeylen, \"IPSEC IKE invalid cert keylen\" },\n        { kErrorIpsecIkeMmLimit, \"IPSEC IKE mm limit\" },\n        { kErrorIpsecIkeNegotiationDisabled, \"IPSEC IKE negotiation disabled\" },\n        { kErrorIpsecIkeNegStatusEnd, \"IPSEC IKE neg status end\" },\n        { kErrorSxsSectionNotFound, \"Sxs section not found\" },\n        { kErrorSxsCantGenActctx, \"Sxs can't gen actctx\" },\n        { kErrorSxsInvalidActctxdataFormat, \"Sxs invalid actctxdata format\" },\n        { kErrorSxsAssemblyNotFound, \"Sxs assembly not found\" },\n        { kErrorSxsManifestFormatError, \"Sxs manifest format error\" },\n        { kErrorSxsManifestParseError, \"Sxs manifest parse error\" },\n        { kErrorSxsActivationContextDisabled, \"Sxs activation context disabled\" },\n        { kErrorSxsKeyNotFound, \"Sxs key not found\" },\n        { kErrorSxsVersionConflict, \"Sxs version conflict\" },\n        { kErrorSxsWrongSectionType, \"Sxs wrong section type\" },\n        { kErrorSxsThreadQueriesDisabled, \"Sxs thread queries disabled\" },\n        { kErrorSxsProcessDefaultAlreadySet, \"Sxs process default already set\" },\n        { kErrorSxsUnknownEncodingGroup, \"Sxs unknown encoding group\" },\n        { kErrorSxsUnknownEncoding, \"Sxs unknown encoding\" },\n        { kErrorSxsInvalidXmlNamespaceUri, \"Sxs invalid XML namespace URI\" },\n        { kErrorSxsRootManifestDependencyNotInstalled, \"Sxs root manifest dependency not installed\" },\n        { kErrorSxsLeafManifestDependencyNotInstalled, \"Sxs leaf manifest dependency not installed\" },\n        { kErrorSxsInvalidAssemblyIdentityAttribute, \"Sxs invalid assembly indentity attribute\" },\n        { kErrorSxsManifestMissingRequiredDefaultNamespace, \"Sxs manifest missing required default namespace\" },\n        { kErrorSxsManifestInvalidRequiredDefaultNamespace, \"Sxs manifest invalid required default namespace\" },\n        { kErrorSxsPrivateManifestCrossPathWithReparsePoint, \"Sxs private manifest cross path with reparse point\" },\n        { kErrorSxsDuplicateDllName, \"Sxs duplicate dll name\" },\n        { kErrorSxsDuplicateWindowclassName, \"Sxs duplicate windowclass name\" },\n        { kErrorSxsDuplicateClsid, \"Sxs duplicate clsid\" },\n        { kErrorSxsDuplicateIid, \"Sxs duplicate iid\" },\n        { kErrorSxsDuplicateTlbid, \"Sxs duplicate tlbid\" },\n        { kErrorSxsDuplicateProgid, \"Sxs duplicate progid\" },\n        { kErrorSxsDuplicateAssemblyName, \"Sxs duplicate assembly name\" },\n        { kErrorSxsFileHashMismatch, \"Sxs file hash mismatch\" },\n        { kErrorSxsPolicyParseError, \"Sxs policy parse error\" },\n        { kErrorSxsXmlEMissingquote, \"Sxs XML e missingquote\" },\n        { kErrorSxsXmlECommentsyntax, \"Sxs XML e commentsyntax\" },\n        { kErrorSxsXmlEBadstartnamechar, \"Sxs XML e badstartnamechar\" },\n        { kErrorSxsXmlEBadnamechar, \"Sxs XML e badnamechar\" },\n        { kErrorSxsXmlEBadcharinstring, \"Sxs XML e badcharinstring\" },\n        { kErrorSxsXmlEXmldeclsyntax, \"Sxs XML e xmldeclsyntax\" },\n        { kErrorSxsXmlEBadchardata, \"Sxs XML e badchardata\" },\n        { kErrorSxsXmlEMissingwhitespace, \"Sxs XML e missingwhitespace\" },\n        { kErrorSxsXmlEExpectingtagend, \"Sxs XML e expectingtagend\" },\n        { kErrorSxsXmlEMissingsemicolon, \"Sxs XML e missingsemicolon\" },\n        { kErrorSxsXmlEUnbalancedparen, \"Sxs XML e unbalancedparen\" },\n        { kErrorSxsXmlEInternalerror, \"Sxs XML e internalerror\" },\n        { kErrorSxsXmlEUnexpectedWhitespace, \"Sxs XML e unexpected whitespace\" },\n        { kErrorSxsXmlEIncompleteEncoding, \"Sxs XML e incomplete encoding\" },\n        { kErrorSxsXmlEMissingParen, \"Sxs XML e missing paren\" },\n        { kErrorSxsXmlEExpectingclosequote, \"Sxs XML e expectingclosequote\" },\n        { kErrorSxsXmlEMultipleColons, \"Sxs XML e multiple colons\" },\n        { kErrorSxsXmlEInvalidDecimal, \"Sxs XML e invalid decimal\" },\n        { kErrorSxsXmlEInvalidHexidecimal, \"Sxs XML e invalid hexidecimal\" },\n        { kErrorSxsXmlEInvalidUnicode, \"Sxs XML e invalid unicode\" },\n        { kErrorSxsXmlEWhitespaceorquestionmark, \"Sxs XML e whitespaceorquestionmark\" },\n        { kErrorSxsXmlEUnexpectedendtag, \"Sxs XML e unexpectedendtag\" },\n        { kErrorSxsXmlEUnclosedtag, \"Sxs XML e unclosedtag\" },\n        { kErrorSxsXmlEDuplicateattribute, \"Sxs XML e duplicateattribute\" },\n        { kErrorSxsXmlEMultipleroots, \"Sxs XML e multipleroots\" },\n        { kErrorSxsXmlEInvalidatrootlevel, \"Sxs XML e invalidatrootlevel\" },\n        { kErrorSxsXmlEBadxmldecl, \"Sxs XML e badxmldecl\" },\n        { kErrorSxsXmlEMissingroot, \"Sxs XML e missingroot\" },\n        { kErrorSxsXmlEUnexpectedeof, \"Sxs XML e unexpectedeof\" },\n        { kErrorSxsXmlEBadperefinsubset, \"Sxs XML e badperefinsubset\" },\n        { kErrorSxsXmlEUnclosedstarttag, \"Sxs XML e unclosedstarttag\" },\n        { kErrorSxsXmlEUnclosedendtag, \"Sxs XML e unclosedendtag\" },\n        { kErrorSxsXmlEUnclosedstring, \"Sxs XML e unclosedstring\" },\n        { kErrorSxsXmlEUnclosedcomment, \"Sxs XML e unclosedcomment\" },\n        { kErrorSxsXmlEUncloseddecl, \"Sxs XML e uncloseddecl\" },\n        { kErrorSxsXmlEUnclosedcdata, \"Sxs XML e unclosedcdata\" },\n        { kErrorSxsXmlEReservednamespace, \"Sxs XML e reservednamespace\" },\n        { kErrorSxsXmlEInvalidencoding, \"Sxs XML e invalidencoding\" },\n        { kErrorSxsXmlEInvalidswitch, \"Sxs XML e invalidswitch\" },\n        { kErrorSxsXmlEBadxmlcase, \"Sxs XML e badxmlcase\" },\n        { kErrorSxsXmlEInvalidStandalone, \"Sxs XML e invalid standalone\" },\n        { kErrorSxsXmlEUnexpectedStandalone, \"Sxs XML e unexpected standalone\" },\n        { kErrorSxsXmlEInvalidVersion, \"Sxs XML e invalid version\" },\n        { kErrorSxsXmlEMissingequals, \"Sxs XML e missingequals\" },\n        { kErrorSxsProtectionRecoveryFailed, \"Sxs protection recovery failed\" },\n        { kErrorSxsProtectionPublicKeyTooShort, \"Sxs protection public key too short\" },\n        { kErrorSxsProtectionCatalogNotValid, \"Sxs protection catalog not valid\" },\n        { kErrorSxsUntranslatableHresult, \"Sxs untranslatable hresult\" },\n        { kErrorSxsProtectionCatalogFileMissing, \"Sxs protection catalog file missing\" },\n        { kErrorSxsMissingAssemblyIdentityAttribute, \"Sxs missing assembly identity attribute\" },\n        { kErrorSxsInvalidAssemblyIdentityAttributeName, \"Sxs invalid assembly identity attribute name\" },\n    };\n#endif /* IL2CPP_DISABLE_FULL_MESSAGES */\n\n\n    static int32_t compare_message(const void *first, const void *second)\n    {\n        ErrorDesc *efirst = (ErrorDesc*)first;\n        ErrorDesc *esecond = (ErrorDesc*)second;\n\n        return (int32_t)efirst->code - (int32_t)esecond->code;\n    }\n\n    static const char *find_message(ErrorCode code, ErrorDesc *list, int32_t count)\n    {\n        ErrorDesc key = { code, \"\" };\n        ErrorDesc *result = (ErrorDesc*)bsearch(&key, list, count, sizeof(ErrorDesc), compare_message);\n        return result ? result->message : NULL;\n    }\n\n    static const char *find_message_linear(ErrorCode code, ErrorDesc *list, int32_t count)\n    {\n        int32_t prev = -1;\n\n        for (int32_t i = 0; i < count; ++i)\n        {\n            if (list[i].code > prev)\n                prev = list[i].code;\n            else\n            {\n                // static int error_shown;\n                // if (!error_shown){\n                //      error_shown = 1;\n                //      fprintf (stderr, \"Mono: Incorrect message sorted in io-layer/messages.c at index %d (msg=%s)\\n\", i, list [i].txt);\n                // }\n            }\n\n            if (list[i].code == code)\n            {\n                // static int error_shown;\n                // if (!error_shown){\n                //      error_shown = 1;\n                //      fprintf (stderr, \"Mono: Error %d with text %s is improperly sorted in io-layer/messages.c\\n\", id, list [i].txt);\n                // }\n                return list[i].message;\n            }\n        }\n        return NULL;\n    }\n\n    std::string Messages::FromCode(ErrorCode code)\n    {\n        const char *message = find_message(code, common_messages, N_ELEMENTS(common_messages));\n        if (message != NULL)\n            return message;\n\n#ifndef IL2CPP_DISABLE_FULL_MESSAGES\n        message = find_message(code, messages, N_ELEMENTS(messages));\n        if (message != NULL)\n            return message;\n#endif\n\n        // Linear search, in case someone adds an error message and does not add it\n        // to the list in a sorted position, this will be catched during development.\n\n        message = find_message_linear(code, common_messages, N_ELEMENTS(common_messages));\n        if (message != NULL)\n            return message;\n\n#ifndef IL2CPP_DISABLE_FULL_MESSAGES\n        message = find_message_linear(code, messages, N_ELEMENTS(messages));\n        if (message != NULL)\n            return message;\n#endif\n\n        return std::string();\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Messages.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\n#include <stdint.h>\n#include <string>\n\n#include \"os/ErrorCodes.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    struct ErrorDesc\n    {\n        ErrorCode code;\n        const char *message;\n    };\n\n    extern ErrorDesc common_messages[];\n\n#ifndef IL2CPP_DISABLE_FULL_MESSAGES\n    extern ErrorDesc messages[];\n#endif\n\n    class Messages\n    {\n    public:\n        static std::string FromCode(ErrorCode code);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Mutex.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"os/Mutex.h\"\n#include \"os/Atomic.h\"\n#if IL2CPP_THREADS_WIN32\n#include \"os/Win32/MutexImpl.h\"\n#elif IL2CPP_TARGET_PSP2\n#include \"os/PSP2/MutexImpl.h\"\n#elif IL2CPP_THREADS_PTHREAD\n#include \"os/Posix/MutexImpl.h\"\n#else\n#include \"os/MutexImpl.h\"\n#endif\n\nnamespace il2cpp\n{\nnamespace os\n{\n    Mutex::Mutex(bool initiallyOwned)\n        : m_Mutex(new MutexImpl())\n    {\n        if (initiallyOwned)\n            Lock();\n    }\n\n    Mutex::~Mutex()\n    {\n        delete m_Mutex;\n    }\n\n    void Mutex::Lock(bool interruptible)\n    {\n        m_Mutex->Lock(interruptible);\n    }\n\n    bool Mutex::TryLock(uint32_t milliseconds, bool interruptible)\n    {\n        return m_Mutex->TryLock(milliseconds, interruptible);\n    }\n\n    void Mutex::Unlock()\n    {\n        m_Mutex->Unlock();\n    }\n\n    FastMutex::FastMutex()\n        : m_Impl(new FastMutexImpl())\n    {\n    }\n\n    FastMutex::~FastMutex()\n    {\n        delete m_Impl;\n    }\n\n    void FastMutex::Lock()\n    {\n        m_Impl->Lock();\n    }\n\n    void FastMutex::Unlock()\n    {\n        m_Impl->Unlock();\n    }\n\n    FastMutexImpl* FastMutex::GetImpl()\n    {\n        return m_Impl;\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Mutex.h",
    "content": "#pragma once\n\n#include \"os/ErrorCodes.h\"\n#include \"os/Handle.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class MutexImpl;\n    class FastMutexImpl;\n\n    class Mutex : public il2cpp::utils::NonCopyable\n    {\n    public:\n        Mutex(bool initiallyOwned = false);\n        ~Mutex();\n\n        void Lock(bool interruptible = false);\n        bool TryLock(uint32_t milliseconds = 0, bool interruptible = false);\n        void Unlock();\n\n    private:\n        MutexImpl* m_Mutex;\n    };\n\n    struct AutoLock : public il2cpp::utils::NonCopyable\n    {\n        AutoLock(Mutex* mutex) : m_Mutex(mutex) { m_Mutex->Lock(); }\n        ~AutoLock() { m_Mutex->Unlock(); }\n    private:\n        Mutex* m_Mutex;\n    };\n\n    class MutexHandle : public Handle\n    {\n    public:\n        MutexHandle(Mutex* mutex) : m_Mutex(mutex) {}\n        virtual ~MutexHandle() { delete m_Mutex; }\n        virtual bool Wait() { m_Mutex->Lock(true); return true; }\n        virtual bool Wait(uint32_t ms) { return m_Mutex->TryLock(ms, true); }\n        virtual void Signal() { m_Mutex->Unlock(); }\n        Mutex* Get() { return m_Mutex; }\n\n    private:\n        Mutex* m_Mutex;\n    };\n\n\n/// Lightweight mutex that has no support for interruption or timed waits. Meant for\n/// internal use only.\n    class FastMutex\n    {\n    public:\n        FastMutex();\n        ~FastMutex();\n\n        void Lock();\n        void Unlock();\n\n        FastMutexImpl* GetImpl();\n\n    private:\n        FastMutexImpl* m_Impl;\n    };\n\n    struct FastAutoLock : public il2cpp::utils::NonCopyable\n    {\n        FastAutoLock(FastMutex* mutex)\n            : m_Mutex(mutex)\n        {\n            m_Mutex->Lock();\n        }\n\n        ~FastAutoLock()\n        {\n            m_Mutex->Unlock();\n        }\n\n    private:\n        FastMutex* m_Mutex;\n    };\n\n\n    struct FastAutoUnlock : public il2cpp::utils::NonCopyable\n    {\n        FastAutoUnlock(FastMutex* mutex)\n            : m_Mutex(mutex)\n        {\n            m_Mutex->Unlock();\n        }\n\n        ~FastAutoUnlock()\n        {\n            m_Mutex->Lock();\n        }\n\n    private:\n        FastMutex* m_Mutex;\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/NativeMethods.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"os/Process.h\"\n\n#include <vector>\n#include <string>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class NativeMethods\n    {\n    public:\n        static bool CloseProcess(ProcessHandle* handle);\n        static bool GetExitCodeProcess(ProcessHandle* handle, int32_t* exitCode);\n        static int32_t GetCurrentProcessId();\n        static ProcessHandle* GetCurrentProcess();\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/OSGlobalEnums.h",
    "content": "#pragma once\n\nenum FileType\n{\n    kFileTypeUnknown = 0x0000,\n    kFileTypeDisk = 0x0001,\n    kFileTypeChar = 0x0002,\n    kFileTypePipe = 0x0003,\n    kFileTypeRemote = 0x8000\n};\n\nenum UnityPalFileAttributes\n{\n    kFileAttributeReadOnly = 0x00000001,\n    kFileAttributeHidden = 0x00000002,\n    kFileAttributeSystem = 0x00000004,\n    kFileAttributeDirectory = 0x00000010,\n    kFileAttributeArchive = 0x00000020,\n    kFileAttributeDevice = 0x00000040,\n    kFileAttributeNormal = 0x00000080,\n    kFileAttributeTemporary = 0x00000100,\n    kFileAttributeSparse_file = 0x00000200,\n    kFileAttributeReparse_point = 0x00000400,\n    kFileAttributeCompressed = 0x00000800,\n    kFileAttributeOffline = 0x00001000,\n    kFileAttributeNot_content_indexed = 0x00002000,\n    kFileAttributeEncrypted = 0x00004000,\n    kFileAttributeVirtual = 0x00010000,\n    kFileAttributeInternalMonoExecutable = 0x80000000 // Only used internally by Mono\n};\n\nenum FileAccess\n{\n    kFileAccessRead = 0x01,\n    kFileAccessWrite = 0x02,\n    kFileAccessReadWrite = kFileAccessRead | kFileAccessWrite\n};\n\nenum FileMode\n{\n    kFileModeCreateNew = 1,\n    kFileModeCreate = 2,\n    kFileModeOpen = 3,\n    kFileModeOpenOrCreate = 4,\n    kFileModeTruncate = 5,\n    kFileModeAppend = 6\n};\n\nenum FileShare\n{\n    kFileShareNone = 0x0,\n    kFileShareRead = 0x01,\n    kFileShareWrite = 0x02,\n    kFileShareReadWrite = kFileShareRead | kFileShareWrite,\n    kFileShareDelete = 0x04\n};\n\nenum FileOptions\n{\n    kFileOptionsNone = 0,\n    kFileOptionsTemporary = 1,  // Internal.   See note in System.IO.FileOptions\n    kFileOptionsEncrypted = 0x4000,\n    kFileOptionsDeleteOnClose = 0x4000000,\n    kFileOptionsSequentialScan = 0x8000000,\n    kFileOptionsRandomAccess = 0x10000000,\n    kFileOptionsAsynchronous = 0x40000000,\n    kFileOptionsWriteThrough = 0x80000000\n};\n\nenum SeekOrigin\n{\n    kFileSeekOriginBegin = 0,\n    kFileSeekOriginCurrent = 1,\n    kFileSeekOriginEnd = 2\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/OSX/Image.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_DARWIN\n\n#include <mach-o/dyld.h>\n#include <vector>\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Image\n{\n    void* GetImageBase()\n    {\n        // OSX/iOS uses ASLR (address space layout randomization), so\n        // find where the image is loaded. This is usually zero in the\n        // debugger for an executable, but non-zero when a debugger is not\n        // present.\n        std::vector<char> path;\n        uint32_t size = 0;\n        int error = _NSGetExecutablePath(NULL, &size);\n        IL2CPP_ASSERT(error == -1);\n        if (error != -1)\n            return NULL;\n\n        path.reserve(size);\n        error = _NSGetExecutablePath(&path[0], &size);\n        IL2CPP_ASSERT(error == 0);\n        if (error != 0)\n            return NULL;\n\n        // Assume that we are either in an executable, or a dynamic\n        // library named UserAssembly.dylib (for the OSX standalone player)\n\n        int userAssemblyImageIndex = -1;\n        int executableImageIndex = -1;\n        int numberOfImages = _dyld_image_count();\n        for (uint32_t i = 0; i < numberOfImages; i++)\n        {\n            const char* imageName = _dyld_get_image_name(i);\n            if (strstr(imageName, \"UserAssembly.dylib\") != NULL)\n                userAssemblyImageIndex = i;\n            else if (strcmp(imageName, &path[0]) == 0)\n                executableImageIndex = i;\n        }\n\n        if (userAssemblyImageIndex != -1)\n            return (void*)_dyld_get_image_vmaddr_slide(userAssemblyImageIndex);\n        else if (executableImageIndex != -1)\n            return (void*)_dyld_get_image_vmaddr_slide(executableImageIndex);\n\n        return NULL;\n    }\n}\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/OSX/Process.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_DARWIN\n\n#include <sys/types.h>\n#if !IL2CPP_TARGET_IOS\n#include <libproc.h>\n#endif\n#include <unistd.h>\n#include <stdlib.h>\n\n#include \"os/Process.h\"\n#include \"vm/Exception.h\"\n\nstruct ProcessHandle\n{\n    pid_t pid;\n};\n\nnamespace il2cpp\n{\nnamespace os\n{\n    int Process::GetCurrentProcessId()\n    {\n        return getpid();\n    }\n\n    ProcessHandle* Process::GetProcess(int processId)\n    {\n        // If/when we implement the CreateProcess_internal icall we will likely\n        // need to so something smarter here to find the process if we did\n        // not create it and return a known pseudo-handle. For now this\n        // is sufficient though.\n        return (ProcessHandle*)(intptr_t)processId;\n    }\n\n    void Process::FreeProcess(ProcessHandle* handle)\n    {\n        // We have nothing to do here.\n    }\n\n    std::string Process::GetProcessName(ProcessHandle* handle)\n    {\n#if !IL2CPP_TARGET_IOS\n        const size_t bufferLength = 256;\n        char buf[bufferLength];\n        int length = proc_name((int)((intptr_t)handle), buf, bufferLength);\n\n        if (length <= 0)\n            return std::string();\n\n        return std::string(buf, length);\n#else\n        NOT_SUPPORTED_IL2CPP(Process::GetProcessName, \"GetProcessName is not supported for non-Windows/OSX desktop platforms\");\n        return std::string();\n#endif\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Path.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/Path.h\"\n#include <string>\n\n#if IL2CPP_USE_GENERIC_ENVIRONMENT\n#include \"os/Path.h\"\n#include <string>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    std::string Path::GetExecutablePath()\n    {\n        return std::string(\"<NotImplemented>\");\n    }\n\n    std::string Path::GetTempPath()\n    {\n        return std::string(\"<NotImplemented>\");\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Path.h",
    "content": "#pragma once\n#include <string>\n#include <stdint.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class Path\n    {\n    public:\n        static std::string GetExecutablePath();\n        static std::string GetTempPath();\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/AtomicImpl.h",
    "content": "#pragma once\n\n#include <cassert>\n\n#ifdef __EMSCRIPTEN__\n#include <emscripten/threading.h>\n#endif\n\n// Assumes clang or gcc as compiler.\n#if IL2CPP_TARGET_POSIX\n\nnamespace il2cpp\n{ namespace os\n{\n  inline int32_t Atomic::Add(volatile int32_t* location1, int32_t value)\n  {\n      ASSERT_ALIGNMENT(location1, 4);\n      return __sync_add_and_fetch(location1, value);\n  }\n\n  inline int64_t Atomic::Add64(volatile int64_t* location1, int64_t value)\n  {\n      ASSERT_ALIGNMENT(location1, 8);\n      return __sync_add_and_fetch(location1, value);\n  }\n\n  inline int32_t Atomic::Increment(volatile int32_t* value)\n  {\n      ASSERT_ALIGNMENT(value, 4);\n      return __sync_add_and_fetch(value, 1);\n  }\n\n  inline int64_t Atomic::Increment64(volatile int64_t* value)\n  {\n      ASSERT_ALIGNMENT(value, 8);\n      return __sync_add_and_fetch(value, 1);\n  }\n\n  inline int32_t Atomic::Decrement(volatile int32_t* value)\n  {\n      ASSERT_ALIGNMENT(value, 4);\n      return __sync_add_and_fetch(value, -1);\n  }\n\n  inline int64_t Atomic::Decrement64(volatile int64_t* value)\n  {\n      ASSERT_ALIGNMENT(value, 8);\n      return __sync_add_and_fetch(value, -1);\n  }\n\n  inline int32_t Atomic::CompareExchange(volatile int32_t* dest, int32_t exchange, int32_t comparand)\n  {\n      ASSERT_ALIGNMENT(dest, 4);\n      return __sync_val_compare_and_swap(dest, comparand, exchange);\n  }\n\n  inline int64_t Atomic::CompareExchange64(volatile int64_t* dest, int64_t exchange, int64_t comparand)\n  {\n      ASSERT_ALIGNMENT(dest, 8);\n#ifdef __EMSCRIPTEN__\n      return emscripten_atomic_cas_u64((void*)dest, comparand, exchange) == comparand ? comparand : *dest;\n#else\n      return __sync_val_compare_and_swap(dest, comparand, exchange);\n#endif\n  }\n\n  inline void* Atomic::CompareExchangePointer(void* volatile* dest, void* exchange, void* comparand)\n  {\n      ASSERT_ALIGNMENT(dest, IL2CPP_SIZEOF_VOID_P);\n      return __sync_val_compare_and_swap(dest, comparand, exchange);\n  }\n\n  inline int32_t Atomic::Exchange(volatile int32_t* dest, int32_t exchange)\n  {\n      ASSERT_ALIGNMENT(dest, 4);\n#ifdef __EMSCRIPTEN__\n      return emscripten_atomic_exchange_u32((void*)dest, exchange);\n#else\n      int32_t prev;\n      do\n      {\n          prev = *dest;\n      }\n      while (!__sync_bool_compare_and_swap(dest, prev, exchange));\n      return prev;\n#endif\n  }\n\n  inline int64_t Atomic::Exchange64(volatile int64_t* dest, int64_t exchange)\n  {\n      ASSERT_ALIGNMENT(dest, 8);\n#ifdef __EMSCRIPTEN__\n      return emscripten_atomic_exchange_u64((void*)dest, exchange);\n#else\n      int64_t prev;\n      do\n      {\n          prev = *dest;\n      }\n      while (!__sync_bool_compare_and_swap(dest, prev, exchange));\n      return prev;\n#endif\n  }\n\n  inline void* Atomic::ExchangePointer(void* volatile* dest, void* exchange)\n  {\n      ASSERT_ALIGNMENT(dest, IL2CPP_SIZEOF_VOID_P);\n#ifdef __EMSCRIPTEN__\n      return (void*)emscripten_atomic_exchange_u32((void*)dest, (uint32_t)exchange);\n#else\n      void* prev;\n      do\n      {\n          prev = *dest;\n      }\n      while (!__sync_bool_compare_and_swap(dest, prev, exchange));\n      return prev;\n#endif\n  }\n\n  inline int64_t Atomic::Read64(volatile int64_t* addr)\n  {\n      ASSERT_ALIGNMENT(addr, 8);\n      return __sync_fetch_and_add(addr, 0);\n  }\n\n  inline void Atomic::MemoryBarrier()\n  {\n      __sync_synchronize();\n  }\n} }\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/ConditionVariableImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n#if NET_4_0\n#if IL2CPP_THREADS_PTHREAD\n\n#include \"MutexImpl.h\"\n#include \"ConditionVariableImpl.h\"\n#include <time.h>\n#include <sys/time.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    ConditionVariableImpl::ConditionVariableImpl()\n    {\n        pthread_cond_init(&m_ConditionVariable, NULL);\n    }\n\n    ConditionVariableImpl::~ConditionVariableImpl()\n    {\n        pthread_cond_destroy(&m_ConditionVariable);\n    }\n\n    int ConditionVariableImpl::Wait(FastMutexImpl* lock)\n    {\n        return pthread_cond_wait(&m_ConditionVariable, lock->GetOSHandle());\n    }\n\n    int ConditionVariableImpl::TimedWait(FastMutexImpl* lock, uint32_t timeout_ms)\n    {\n        struct timeval tv;\n        struct timespec ts;\n        int64_t usecs;\n        int res;\n\n        if (timeout_ms == (uint32_t)0xFFFFFFFF)\n            return pthread_cond_wait(&m_ConditionVariable, lock->GetOSHandle());\n\n        /* ms = 10^-3, us = 10^-6, ns = 10^-9 */\n\n        gettimeofday(&tv, NULL);\n        tv.tv_sec += timeout_ms / 1000;\n        usecs = tv.tv_usec + ((timeout_ms % 1000) * 1000);\n        if (usecs >= 1000000)\n        {\n            usecs -= 1000000;\n            tv.tv_sec++;\n        }\n        ts.tv_sec = tv.tv_sec;\n        ts.tv_nsec = usecs * 1000;\n\n        return pthread_cond_timedwait(&m_ConditionVariable, lock->GetOSHandle(), &ts);\n    }\n\n    void ConditionVariableImpl::Broadcast()\n    {\n        pthread_cond_broadcast(&m_ConditionVariable);\n    }\n\n    void ConditionVariableImpl::Signal()\n    {\n        pthread_cond_signal(&m_ConditionVariable);\n    }\n}\n}\n\n#endif\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/ConditionVariableImpl.h",
    "content": "#pragma once\n#if NET_4_0\n#if IL2CPP_THREADS_PTHREAD\n\n#include <pthread.h>\n#include \"utils/NonCopyable.h\"\n\nclass FastMutexImpl;\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class ConditionVariableImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n        ConditionVariableImpl();\n        ~ConditionVariableImpl();\n\n        int Wait(FastMutexImpl* lock);\n        int TimedWait(FastMutexImpl* lock, uint32_t timeout_ms);\n        void Broadcast();\n        void Signal();\n\n    private:\n        pthread_cond_t m_ConditionVariable;\n    };\n}\n}\n\n#endif\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Console.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include \"os/Console.h\"\n#include \"os/File.h\"\n\n#include <assert.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <signal.h>\n#include <stdio.h>\n#include <termios.h>\n#include <unistd.h>\n#include <sys/ioctl.h>\n#include <sys/time.h>\n#include <sys/types.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Console\n{\n    static bool setupComplete = false;\n    static int32_t s_terminalSize;\n    static struct termios s_initialAttr;\n    static struct termios s_il2cppAttr;\n    static std::string s_keypadXmit;\n    static std::string s_teardown;\n    static struct sigaction s_saveSigcont, s_saveSigint, s_saveSigwinch;\n\n    static int32_t GetTerminalSize()\n    {\n        struct winsize ws;\n\n        if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == 0)\n            return (ws.ws_col << 16) | ws.ws_row;\n\n        return -1;\n    }\n\n    static bool SetProperty(int32_t property, bool value)\n    {\n        struct termios attr;\n        bool callset = false;\n        bool check;\n\n        if (tcgetattr(STDIN_FILENO, &attr) == -1)\n            return false;\n\n        check = (attr.c_lflag & property) != 0;\n        if ((value || check) && !(value && check))\n        {\n            callset = true;\n            if (value)\n                attr.c_lflag |= property;\n            else\n                attr.c_lflag &= ~property;\n        }\n\n        if (!callset)\n            return true;\n\n        if (tcsetattr(STDIN_FILENO, TCSANOW, &attr) == -1)\n            return true;\n\n        s_il2cppAttr = attr;\n\n        return true;\n    }\n\n    static void SetControlChars(uint8_t* control_chars, const uint8_t *cc)\n    {\n        // The index into the array comes from corlib/System/ControlCharacters.cs\n#ifdef VINTR\n        control_chars[0] = cc[VINTR];\n#endif\n#ifdef VQUIT\n        control_chars[1] = cc[VQUIT];\n#endif\n#ifdef VERASE\n        control_chars[2] = cc[VERASE];\n#endif\n#ifdef VKILL\n        control_chars[3] = cc[VKILL];\n#endif\n#ifdef VEOF\n        control_chars[4] = cc[VEOF];\n#endif\n#ifdef VTIME\n        control_chars[5] = cc[VTIME];\n#endif\n#ifdef VMIN\n        control_chars[6] = cc[VMIN];\n#endif\n#ifdef VSWTC\n        control_chars[7] = cc[VSWTC];\n#endif\n#ifdef VSTART\n        control_chars[8] = cc[VSTART];\n#endif\n#ifdef VSTOP\n        control_chars[9] = cc[VSTOP];\n#endif\n#ifdef VSUSP\n        control_chars[10] = cc[VSUSP];\n#endif\n#ifdef VEOL\n        control_chars[11] = cc[VEOL];\n#endif\n#ifdef VREPRINT\n        control_chars[12] = cc[VREPRINT];\n#endif\n#ifdef VDISCARD\n        control_chars[13] = cc[VDISCARD];\n#endif\n#ifdef VWERASE\n        control_chars[14] = cc[VWERASE];\n#endif\n#ifdef VLNEXT\n        control_chars[15] = cc[VLNEXT];\n#endif\n#ifdef VEOL2\n        control_chars[16] = cc[VEOL2];\n#endif\n    }\n\n    static void CallDoConsoleCancelEvent()\n    {\n        // TODO: Call Console.cancel_handler delegate from another thread.\n    }\n\n    static void SigintHandler(int signo)\n    {\n        static bool insideSigint = false;\n\n        if (insideSigint)\n            return;\n\n        insideSigint = true;\n        CallDoConsoleCancelEvent();\n        insideSigint = false;\n    }\n\n    static void SigcontHandler(int signo, siginfo_t *the_siginfo, void *data)\n    {\n        // Ignore error, there is not much we can do in the sigcont handler.\n        tcsetattr(STDIN_FILENO, TCSANOW, &s_il2cppAttr);\n\n        if (!s_keypadXmit.empty())\n            write(STDOUT_FILENO, s_keypadXmit.c_str(), s_keypadXmit.length());\n\n        // Call previous handler\n        if (s_saveSigcont.sa_sigaction != NULL &&\n            s_saveSigcont.sa_sigaction != (void*)SIG_DFL &&\n            s_saveSigcont.sa_sigaction != (void*)SIG_IGN)\n            (*s_saveSigcont.sa_sigaction)(signo, the_siginfo, data);\n    }\n\n    static void SigwinchHandler(int signo, siginfo_t *the_siginfo, void *data)\n    {\n        const int32_t size = GetTerminalSize();\n\n        if (size != -1)\n            s_terminalSize = size;\n\n        // Call previous handler\n        if (s_saveSigwinch.sa_sigaction != NULL &&\n            s_saveSigwinch.sa_sigaction != (void*)SIG_DFL &&\n            s_saveSigwinch.sa_sigaction != (void*)SIG_IGN)\n            (*s_saveSigwinch.sa_sigaction)(signo, the_siginfo, data);\n    }\n\n    static void ConsoleSetupSignalHandler()\n    {\n        struct sigaction sigcont, sigint, sigwinch;\n\n        memset(&sigcont, 0, sizeof(struct sigaction));\n        memset(&sigint, 0, sizeof(struct sigaction));\n        memset(&sigwinch, 0, sizeof(struct sigaction));\n\n        // Continuing\n        sigcont.sa_sigaction = SigcontHandler;\n        sigcont.sa_flags = SA_SIGINFO;\n        sigemptyset(&sigcont.sa_mask);\n        sigaction(SIGCONT, &sigcont, &s_saveSigcont);\n\n        // Interrupt handler\n        sigint.sa_handler = SigintHandler;\n        sigint.sa_flags = 0;\n        sigemptyset(&sigint.sa_mask);\n        sigaction(SIGINT, &sigint, &s_saveSigint);\n\n        // Window size changed\n        sigwinch.sa_sigaction = SigwinchHandler;\n        sigwinch.sa_flags = SA_SIGINFO;\n        sigemptyset(&sigwinch.sa_mask);\n        sigaction(SIGWINCH, &sigwinch, &s_saveSigwinch);\n    }\n\n// Exists in Mono, but is unused.\n    static void ConsoleRestoreSignalHandlers()\n    {\n        sigaction(SIGCONT, &s_saveSigcont, NULL);\n        sigaction(SIGINT, &s_saveSigint, NULL);\n        sigaction(SIGWINCH, &s_saveSigwinch, NULL);\n    }\n\n    int32_t InternalKeyAvailable(int32_t ms_timeout)\n    {\n        fd_set rfds;\n        struct timeval tv;\n        struct timeval *tvptr;\n        div_t divvy;\n        int32_t ret, nbytes;\n\n        do\n        {\n            FD_ZERO(&rfds);\n            FD_SET(STDIN_FILENO, &rfds);\n\n            if (ms_timeout >= 0)\n            {\n                divvy = div(ms_timeout, 1000);\n                tv.tv_sec = divvy.quot;\n                tv.tv_usec = divvy.rem;\n                tvptr = &tv;\n            }\n            else\n            {\n                tvptr = NULL;\n            }\n\n            ret = select(STDIN_FILENO + 1, &rfds, NULL, NULL, tvptr);\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret > 0)\n        {\n            nbytes = 0;\n\n            ret = ioctl(STDIN_FILENO, FIONREAD, &nbytes);\n\n            if (ret >= 0)\n                ret = nbytes;\n        }\n\n        return (ret > 0) ? ret : 0;\n    }\n\n    bool SetBreak(bool wantBreak)\n    {\n        return SetProperty(IGNBRK, !wantBreak);\n    }\n\n    bool SetEcho(bool wantEcho)\n    {\n        return SetProperty(ECHO, wantEcho);\n    }\n\n    static void TtyShutdown()\n    {\n        if (!setupComplete)\n            return;\n\n        if (!s_teardown.empty())\n            write(STDOUT_FILENO, s_teardown.c_str(), s_teardown.length());\n\n        tcflush(STDIN_FILENO, TCIFLUSH);\n        tcsetattr(STDIN_FILENO, TCSANOW, &s_initialAttr);\n\n        SetProperty(ECHO, true);\n\n        setupComplete = false;\n    }\n\n    bool TtySetup(const std::string& keypadXmit, const std::string& teardown, uint8_t* control_characters, int32_t** size)\n    {\n        s_terminalSize = GetTerminalSize();\n\n        if (s_terminalSize == -1)\n        {\n            int32_t cols = 0, rows = 0;\n\n            const char *colsValue = getenv(\"COLUMNS\");\n\n            if (colsValue != NULL)\n                cols = atoi(colsValue);\n\n            const char *linesValue = getenv(\"LINES\");\n\n            if (linesValue != NULL)\n                rows = atoi(linesValue);\n\n            if (cols != 0 && rows != 0)\n                s_terminalSize = (cols << 16) | rows;\n            else\n                s_terminalSize = -1;\n        }\n\n        *size = &s_terminalSize;\n\n        if (tcgetattr(STDIN_FILENO, &s_initialAttr) == -1)\n            return false;\n\n        s_il2cppAttr = s_initialAttr;\n\n        s_il2cppAttr.c_lflag &= ~(ICANON);\n        s_il2cppAttr.c_iflag &= ~(IXON | IXOFF);\n        s_il2cppAttr.c_cc[VMIN] = 1;\n        s_il2cppAttr.c_cc[VTIME] = 0;\n\n        if (tcsetattr(STDIN_FILENO, TCSANOW, &s_il2cppAttr) == -1)\n            return false;\n\n        s_keypadXmit = keypadXmit;\n\n        SetControlChars(control_characters, s_il2cppAttr.c_cc);\n\n        if (setupComplete)\n            return true;\n\n        ConsoleSetupSignalHandler();\n\n        setupComplete = true;\n\n        s_teardown = teardown;\n        atexit(TtyShutdown);\n\n        return true;\n    }\n}\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/CpuInfo.cpp",
    "content": "#if NET_4_0\n#if IL2CPP_ENABLE_CPU_INFO\n#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include \"os/CpuInfo.h\"\n#include <stdlib.h>\n#include <stdio.h>\n#include \"utils/Memory.h\"\n#include \"os/Time.h\"\n#include \"os/Environment.h\"\n\n\n#include <sys/param.h>\n#if IL2CPP_TARGET_DARWIN\n#include <sys/sysctl.h>\n#endif\n\n#include <time.h>\n#include <errno.h>\n\n#if IL2CPP_TARGET_LINUX || IL2CPP_TARGET_TIZEN\n#include <sys/time.h>\n#endif\n\nstruct Il2CppCpuUsageState\n{\n    int64_t kernel_time;\n    int64_t user_time;\n    int64_t current_time;\n};\n\nnamespace il2cpp\n{\nnamespace os\n{\n    void* CpuInfo::Create()\n    {\n        return IL2CPP_MALLOC_ZERO(sizeof(Il2CppCpuUsageState));\n    }\n\n    int32_t CpuInfo::Usage(void* previous)\n    {\n        Il2CppCpuUsageState* prev = (Il2CppCpuUsageState*)previous;\n        int32_t cpu_usage = 0;\n        int64_t cpu_total_time;\n        int64_t cpu_busy_time;\n\n        struct rusage resource_usage;\n        int64_t current_time;\n        int64_t kernel_time;\n        int64_t user_time;\n\n        if (getrusage(RUSAGE_SELF, &resource_usage) == -1)\n        {\n            return -1;\n        }\n\n        current_time = os::Time::GetTicks100NanosecondsMonotonic();\n        kernel_time = resource_usage.ru_stime.tv_sec * 1000 * 1000 * 10 + resource_usage.ru_stime.tv_usec * 10;\n        user_time = resource_usage.ru_utime.tv_sec * 1000 * 1000 * 10 + resource_usage.ru_utime.tv_usec * 10;\n\n        cpu_busy_time = (user_time - (prev ? prev->user_time : 0)) + (kernel_time - (prev ? prev->kernel_time : 0));\n        cpu_total_time = (current_time - (prev ? prev->current_time : 0)) * il2cpp::os::Environment::GetProcessorCount();\n\n        if (prev)\n        {\n            prev->kernel_time = kernel_time;\n            prev->user_time = user_time;\n            prev->current_time = current_time;\n        }\n\n        if (cpu_total_time > 0 && cpu_busy_time > 0)\n            cpu_usage = (int32_t)(cpu_busy_time * 100 / cpu_total_time);\n\n        return cpu_usage;\n    }\n}\n}\n\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Cryptography.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include \"os/Cryptography.h\"\n#include <errno.h>\n#include <unistd.h>\n#include <fcntl.h>\n\n#ifndef NAME_DEV_URANDOM\n#define NAME_DEV_URANDOM \"/dev/urandom\"\n#endif\n\nstatic int64_t file = -1;\n\nnamespace il2cpp\n{\nnamespace os\n{\n    void* Cryptography::GetCryptographyProvider()\n    {\n        return (file < 0) ? NULL : (void*)file;\n    }\n\n    bool Cryptography::OpenCryptographyProvider()\n    {\n#ifdef NAME_DEV_URANDOM\n        file = open(NAME_DEV_URANDOM, O_RDONLY);\n#endif\n\n#ifdef NAME_DEV_RANDOM\n        if (file < 0)\n            file = open(NAME_DEV_RANDOM, O_RDONLY);\n#endif\n        return true;\n    }\n\n    void Cryptography::ReleaseCryptographyProvider(void* provider)\n    {\n    }\n\n    bool Cryptography::FillBufferWithRandomBytes(void* provider, uint32_t length, unsigned char* data)\n    {\n        int count = 0;\n        ssize_t err;\n\n        // Make sure the provider is correct, or we may end up reading from the wrong file.\n        // If provider happens to be 0 we will read from stdin and hang!\n        if ((int64_t)provider != file)\n            return false;\n\n        do\n        {\n            err = read((int)(size_t)provider, data + count, length - count);\n            if (err < 0)\n            {\n                if (errno == EINTR)\n                    continue;\n                break;\n            }\n            count += err;\n        }\n        while (count < length);\n\n        return err >= 0;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Directory.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include \"os/Directory.h\"\n#include \"os/ErrorCodes.h\"\n#include \"os/File.h\"\n#include \"os/Posix/Error.h\"\n#include \"utils/DirectoryUtils.h\"\n#include \"utils/Memory.h\"\n#include \"utils/PathUtils.h\"\n#include \"utils/StringUtils.h\"\n#include <assert.h>\n#include <errno.h>\n#include <dirent.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <sys/errno.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    std::string Directory::GetCurrent(int *error)\n    {\n        char buf[PATH_MAX + 1];\n        // Note: not all implementations would allocate a buffer when passing 0 to getcwd, as we used to do.\n        // this does *not* seem to be part of the POSIX spec:\n        // http://pubs.opengroup.org/onlinepubs/000095399/functions/getcwd.html\n        char* cwd = getcwd(buf, PATH_MAX + 1);\n\n        if (cwd == NULL)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return std::string();\n        }\n\n        std::string directory(cwd);\n\n        *error = kErrorCodeSuccess;\n        return directory;\n    }\n\n    bool Directory::SetCurrent(const std::string& path, int *error)\n    {\n        const int ret = chdir(path.c_str());\n\n        if (ret == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return false;\n        }\n\n        *error = kErrorCodeSuccess;\n        return true;\n    }\n\n    bool Directory::Create(const std::string& path, int *error)\n    {\n        const int ret = mkdir(path.c_str(), 0777);\n\n        if (ret == -1)\n        {\n            *error = PathErrnoToErrorCode(path, errno);\n            return false;\n        }\n\n        *error = kErrorCodeSuccess;\n        return true;\n    }\n\n    bool Directory::Remove(const std::string& path, int *error)\n    {\n        const int ret = rmdir(path.c_str());\n\n        if (ret == -1)\n        {\n            *error = PathErrnoToErrorCode(path, errno);\n            return false;\n        }\n\n        *error = kErrorCodeSuccess;\n        return true;\n    }\n\n    static void DirectoryGlob(DIR *dir, const std::string& pattern, std::set<std::string>& result)\n    {\n        if (pattern.empty())\n            return;\n\n        std::string matchPattern = il2cpp::utils::CollapseAdjacentStars(pattern);\n\n        struct dirent *entry;\n\n        while ((entry = readdir(dir)) != NULL)\n        {\n            const std::string filename(entry->d_name);\n\n            if (!il2cpp::utils::Match(filename, matchPattern))\n                continue;\n\n            result.insert(filename);\n        }\n    }\n\n    static bool DirectoryGlob(const std::string& directoryPath, const std::string& pattern, std::set<std::string>& result, int* error)\n    {\n        DIR* dir = opendir(directoryPath.c_str());\n\n        if (dir == NULL)\n        {\n            *error = PathErrnoToErrorCode(directoryPath, errno);\n            return false;\n        }\n\n        DirectoryGlob(dir, pattern, result);\n\n        closedir(dir);\n\n        return true;\n    }\n\n    std::set<std::string> Directory::GetFileSystemEntries(const std::string& path, const std::string& pathWithPattern, int32_t attributes, int32_t mask, int* error)\n    {\n        const std::string directoryPath(il2cpp::utils::PathUtils::DirectoryName(pathWithPattern));\n        const std::string pattern(il2cpp::utils::PathUtils::Basename(pathWithPattern));\n\n        std::set<std::string> globResult;\n\n        if (DirectoryGlob(directoryPath, pattern, globResult, error) == false)\n            return std::set<std::string>();\n\n        if (il2cpp::utils::StringUtils::EndsWith(pattern, \".*\"))\n        {\n            /* Special-case the patterns ending in '.*', as\n             * windows also matches entries with no extension with\n             * this pattern.\n             */\n\n            if (DirectoryGlob(directoryPath, pattern.substr(0, pattern.length() - 2), globResult, error) == false)\n                return std::set<std::string>();\n        }\n\n        std::set<std::string> result;\n\n        for (std::set<std::string>::const_iterator it = globResult.begin(), end = globResult.end(); it != end; ++it)\n        {\n            const std::string& filename = *it;\n\n            if (filename == \".\" || filename == \"..\")\n                continue;\n\n            const std::string path(directoryPath + IL2CPP_DIR_SEPARATOR + filename);\n\n            int attributeError;\n            const int32_t pathAttributes = static_cast<int32_t>(File::GetFileAttributes(path, &attributeError));\n\n            if (attributeError != kErrorCodeSuccess)\n                continue;\n\n            if ((pathAttributes & mask) == attributes)\n                result.insert(path);\n        }\n\n\n        *error = kErrorCodeSuccess;\n        return result;\n    }\n\n    Directory::FindHandle::FindHandle(const utils::StringView<Il2CppNativeChar>& searchPathWithPattern) :\n        osHandle(NULL)\n    {\n        directoryPath = il2cpp::utils::PathUtils::DirectoryName(searchPathWithPattern);\n        pattern = il2cpp::utils::PathUtils::Basename(searchPathWithPattern);\n\n        // Special-case the patterns ending in '.*', as windows also matches entries with no extension with this pattern.\n        if (il2cpp::utils::StringUtils::EndsWith(pattern, \".*\"))\n        {\n            pattern.erase(pattern.size() - 1, 1);\n            *pattern.rbegin() = '*';\n        }\n\n        pattern = il2cpp::utils::CollapseAdjacentStars(pattern);\n    }\n\n    Directory::FindHandle::~FindHandle()\n    {\n        IL2CPP_ASSERT(osHandle == NULL);\n    }\n\n    int32_t Directory::FindHandle::CloseOSHandle()\n    {\n        int32_t result = os::kErrorCodeSuccess;\n\n        if (osHandle != NULL)\n        {\n            int32_t ret = closedir(static_cast<DIR*>(osHandle));\n            if (ret != 0)\n                result = FileErrnoToErrorCode(errno);\n\n            osHandle = NULL;\n        }\n\n        return result;\n    }\n\n    os::ErrorCode Directory::FindFirstFile(FindHandle* findHandle, const utils::StringView<Il2CppNativeChar>& searchPathWithPattern, Il2CppNativeString* resultFileName, int32_t* resultAttributes)\n    {\n        DIR* dir = opendir(findHandle->directoryPath.c_str());\n        if (dir == NULL)\n            return PathErrnoToErrorCode(findHandle->directoryPath, errno);\n\n        findHandle->SetOSHandle(dir);\n        return FindNextFile(findHandle, resultFileName, resultAttributes);\n    }\n\n    os::ErrorCode Directory::FindNextFile(FindHandle* findHandle, Il2CppNativeString* resultFileName, int32_t* resultAttributes)\n    {\n        errno = 0;\n\n        dirent* entry;\n        while ((entry = readdir(static_cast<DIR*>(findHandle->osHandle))) != NULL)\n        {\n            const Il2CppNativeString filename(entry->d_name);\n\n            if (il2cpp::utils::Match(filename, findHandle->pattern))\n            {\n                const Il2CppNativeString path = utils::PathUtils::Combine(findHandle->directoryPath, filename);\n\n                int attributeError;\n                const int32_t pathAttributes = static_cast<int32_t>(File::GetFileAttributes(path, &attributeError));\n\n                if (attributeError == kErrorCodeSuccess)\n                {\n                    *resultFileName = filename;\n                    *resultAttributes = pathAttributes;\n                    return os::kErrorCodeSuccess;\n                }\n            }\n        }\n\n        if (errno != 0)\n            return FileErrnoToErrorCode(errno);\n\n        return os::kErrorCodeNoMoreFiles;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Encoding.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if !IL2CPP_USE_GENERIC_ENVIRONMENT && IL2CPP_TARGET_POSIX\n\n#include \"os/Encoding.h\"\n\n#ifdef HAVE_LANGINFO_H\n#include <langinfo.h>\n#endif\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Encoding\n{\n    std::string GetCharSet()\n    {\n#if HAVE_LANGINFO_H\n        return nl_langinfo(CODESET);\n#else\n        return \"UTF-8\";\n#endif\n    }\n}\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Environment.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"il2cpp-vm-support.h\"\n\n#if !IL2CPP_USE_GENERIC_ENVIRONMENT && IL2CPP_TARGET_POSIX && !IL2CPP_TARGET_PS4\n#include \"class-internals.h\"\n#include \"os/Environment.h\"\n#include \"il2cpp-api.h\"\n\n#include <stdlib.h>\n#include <unistd.h>\n#include <sys/utsname.h>\n\n#if defined(__APPLE__) && !defined(__arm__)\n// Apple defines this in crt_externs.h but doesn't provide that header for\n// arm-apple-darwin9.  We'll manually define the symbol on Apple as it does\n// in fact exist on all implementations (so far)\nextern \"C\" char*** _NSGetEnviron(void);\n#define environ (*_NSGetEnviron())\n#else\nextern char **environ; // GNU C library\n#endif\n\nnamespace il2cpp\n{\nnamespace os\n{\n    std::string Environment::GetMachineName()\n    {\n        char buf[256];\n\n        if (gethostname(buf, sizeof(buf)) != 0)\n            return NULL;\n\n        return buf;\n    }\n\n    int32_t Environment::GetProcessorCount()\n    {\n        int count = 1;\n#ifdef _SC_NPROCESSORS_ONLN\n        count = (int)sysconf(_SC_NPROCESSORS_ONLN);\n        if (count > 0)\n            return count;\n#endif\n#ifdef USE_SYSCTL\n        {\n            int mib[2];\n            size_t len = sizeof(int);\n            mib[0] = CTL_HW;\n            mib[1] = HW_NCPU;\n            if (sysctl(mib, 2, &count, &len, NULL, 0) == 0)\n                return count;\n        }\n#endif\n        return count;\n    }\n\n    std::string Environment::GetOsVersionString()\n    {\n        struct utsname name;\n\n        if (uname(&name) >= 0)\n            return name.release;\n\n        return \"0.0.0.0\";\n    }\n\n    std::string Environment::GetOsUserName()\n    {\n        const std::string username(GetEnvironmentVariable(\"USER\"));\n        return username.empty() ? \"Unknown\" : username;\n    }\n\n    std::string Environment::GetEnvironmentVariable(const std::string& name)\n    {\n        const char* variable = getenv(name.c_str());\n        return variable ? std::string(variable) : std::string();\n    }\n\n    void Environment::SetEnvironmentVariable(const std::string& name, const std::string& value)\n    {\n        if (value.empty())\n        {\n            unsetenv(name.c_str());\n        }\n        else\n        {\n            setenv(name.c_str(), value.c_str(), 1); // 1 means overwrite\n        }\n    }\n\n    std::vector<std::string> Environment::GetEnvironmentVariableNames()\n    {\n        std::vector<std::string> result;\n\n        for (char **envvar = environ; *envvar != NULL; ++envvar)\n        {\n            const char* equalAddress = strchr(*envvar, '=');\n\n            if (equalAddress != NULL)\n                result.push_back(std::string(*envvar, size_t(equalAddress - *envvar)));\n        }\n\n        return result;\n    }\n\n    std::string Environment::GetHomeDirectory()\n    {\n        static std::string homeDirectory;\n\n        if (!homeDirectory.empty())\n            return homeDirectory;\n\n        homeDirectory = GetEnvironmentVariable(\"HOME\");\n\n        return homeDirectory.empty() ? \"/\" : homeDirectory;\n    }\n\n    std::vector<std::string> Environment::GetLogicalDrives()\n    {\n        std::vector<std::string> result;\n\n        // This implementation is not correct according to the definition of this icall, but this is\n        // the only \"logical drive\" that the Mono version in Unity returns for OSX.\n        result.push_back(\"/\");\n\n        // TODO: Implement additional logic for Linux\n\n        return result;\n    }\n\n    void Environment::Exit(int result)\n    {\n        IL2CPP_VM_SHUTDOWN();\n        exit(result);\n    }\n\n    NORETURN void Environment::Abort()\n    {\n        abort();\n    }\n\n    std::string Environment::GetWindowsFolderPath(int folder)\n    {\n        // This should only be called on Windows.\n        return std::string();\n    }\n\n#if NET_4_0\n\n    bool Environment::Is64BitOs()\n    {\n        struct utsname name;\n\n        if (uname(&name) >= 0)\n        {\n            return strcmp(name.machine, \"x86_64\") == 0 || strncmp(name.machine, \"aarch64\", 7) == 0 || strncmp(name.machine, \"ppc64\", 5) == 0;\n        }\n\n        return false;\n    }\n\n#endif\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Error.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include \"Error.h\"\n#include \"utils/PathUtils.h\"\n\n#include <cassert>\n#include <errno.h>\n#include <unistd.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    ErrorCode SocketErrnoToErrorCode(int32_t code)\n    {\n        ErrorCode result = (ErrorCode) - 1;\n\n        switch (code)\n        {\n            case 0: result = kErrorCodeSuccess; break;\n            case EACCES: result = kWSAeacces; break;\n    #ifdef EADDRINUSE\n            case EADDRINUSE: result = kWSAeaddrinuse; break;\n    #endif\n    #ifdef EAFNOSUPPORT\n            case EAFNOSUPPORT: result = kWSAeafnosupport; break;\n    #endif\n    #if EAGAIN != EWOULDBLOCK\n            case EAGAIN: result = kWSAewouldblock; break;\n    #endif\n    #ifdef EALREADY\n            case EALREADY: result = kWSAealready; break;\n    #endif\n            case EBADF: result = kWSAenotsock; break;\n    #ifdef ECONNABORTED\n            case ECONNABORTED: result = kWSAenetdown; break;\n    #endif\n    #ifdef ECONNREFUSED\n            case ECONNREFUSED: result = kWSAeconnrefused; break;\n    #endif\n    #ifdef ECONNRESET\n            case ECONNRESET: result = kWSAeconnreset; break;\n    #endif\n            case EFAULT: result = kWSAefault; break;\n    #ifdef EHOSTUNREACH\n            case EHOSTUNREACH: result = kWSAehostunreach; break;\n    #endif\n    #ifdef EINPROGRESS\n            case EINPROGRESS: result = kWSAeinprogress; break;\n    #endif\n            case EINTR: result = kWSAeintr; break;\n            case EINVAL: result = kWSAeinval; break;\n                // FIXME: case EIO: result = WSAE????; break;\n    #ifdef EISCONN\n            case EISCONN: result = kWSAeisconn; break;\n    #endif\n            // FIXME: case ELOOP: result = WSA????; break;\n            case EMFILE: result = kWSAemfile; break;\n    #ifdef EMSGSIZE\n            case EMSGSIZE: result = kWSAemsgsize; break;\n    #endif\n                // FIXME: case ENAMETOOLONG: result = kWSAeacces; break;\n    #ifdef ENETUNREACH\n            case ENETUNREACH: result = kWSAenetunreach; break;\n    #endif\n    #ifdef ENOBUFS\n            case ENOBUFS: result = kWSAenobufs; break;\n    #endif\n            // case ENOENT: result = WSAE????; break;\n            case ENOMEM: result = kWSAenobufs; break;\n    #ifdef ENOPROTOOPT\n            case ENOPROTOOPT: result = kWSAenoprotoopt; break;\n    #endif\n    #ifdef ENOSR\n            case ENOSR: result = kWSAenetdown; break;\n    #endif\n    #ifdef ENOTCONN\n            case ENOTCONN: result = kWSAenotconn; break;\n    #endif\n                // FIXME: case ENOTDIR: result = WSAE????; break;\n    #ifdef ENOTSOCK\n            case ENOTSOCK: result = kWSAenotsock; break;\n    #endif\n            case ENOTTY: result = kWSAenotsock; break;\n    #ifdef EOPNOTSUPP\n            case EOPNOTSUPP: result = kWSAeopnotsupp; break;\n    #endif\n            case EPERM: result = kWSAeacces; break;\n            case EPIPE: result = kWSAeshutdown; break;\n    #ifdef EPROTONOSUPPORT\n            case EPROTONOSUPPORT: result = kWSAeprotonosupport; break;\n    #endif\n    #if ERESTARTSYS\n            case ERESTARTSYS: result = kWSAenetdown; break;\n    #endif\n                // FIXME: case EROFS: result = WSAE????; break;\n    #ifdef ESOCKTNOSUPPORT\n            case ESOCKTNOSUPPORT: result = kWSAesocktnosupport; break;\n    #endif\n    #ifdef ETIMEDOUT\n            case ETIMEDOUT: result = kWSAetimedout; break;\n    #endif\n    #ifdef EWOULDBLOCK\n            case EWOULDBLOCK: result = kWSAewouldblock; break;\n    #endif\n    #ifdef EADDRNOTAVAIL\n            case EADDRNOTAVAIL: result = kWSAeaddrnotavail; break;\n    #endif\n            case ENOENT: result = kWSAeconnrefused; break;\n    #ifdef EDESTADDRREQ\n            case EDESTADDRREQ: result = kWSAedestaddrreq; break;\n    #endif\n            case ENODEV: result = kWSAenetdown; break;\n    #ifdef EHOSTDOWN\n            case EHOSTDOWN: result = kWSAehostdown; break;\n    #endif\n    #ifdef ENXIO\n            case ENXIO: result = kWSAhostNotFound; break;\n    #endif\n\n            default:\n                result = kWSAsyscallfailure;\n                break;\n        }\n\n        return result;\n    }\n\n    ErrorCode FileErrnoToErrorCode(int32_t code)\n    {\n        ErrorCode ret;\n        /* mapping ideas borrowed from wine. they may need some work */\n\n        switch (code)\n        {\n            case EACCES: case EPERM: case EROFS:\n                ret = kErrorCodeAccessDenied;\n                break;\n\n            case EAGAIN:\n                ret = kErrorCodeSharingViolation;\n                break;\n\n            case EBUSY:\n                ret = kErrorCodeLockViolation;\n                break;\n\n            case EEXIST:\n                ret = kErrorCodeFileExists;\n                break;\n\n            case EINVAL: case ESPIPE:\n                ret = kErrorSeek;\n                break;\n\n            case EISDIR:\n                ret = kErrorCodeCannotMake;\n                break;\n\n            case ENFILE: case EMFILE:\n                ret = kErrorCodeTooManyOpenFiles;\n                break;\n\n            case ENOENT: case ENOTDIR:\n                ret = kErrorCodeFileNotFound;\n                break;\n\n            case ENOSPC:\n                ret = kErrorCodeHandleDiskFull;\n                break;\n\n            case ENOTEMPTY:\n                ret = kErrorCodeDirNotEmpty;\n                break;\n\n            case ENOEXEC:\n                ret = kErrorBadFormat;\n                break;\n\n            case ENAMETOOLONG:\n                ret = kErrorCodeFileNameExcedRange;\n                break;\n\n#ifdef EINPROGRESS\n            case EINPROGRESS:\n                ret = kErrorIoPending;\n                break;\n#endif\n\n            case ENOSYS:\n                ret = kErrorNotSupported;\n                break;\n\n            case EBADF:\n                ret = kErrorCodeInvalidHandle;\n                break;\n\n            case EIO:\n                ret = kErrorCodeInvalidHandle;\n                break;\n\n            case EINTR:\n                ret = kErrorIoPending;\n                break;\n\n            case EPIPE:\n                ret = kErrorCodeWriteFault;\n                break;\n\n            default:\n                ret = kErrorCodeGenFailure;\n                break;\n        }\n\n        return ret;\n    }\n\n    ErrorCode PathErrnoToErrorCode(const std::string& path, int32_t code)\n    {\n        if (code == ENOENT)\n        {\n            const std::string dirname(il2cpp::utils::PathUtils::DirectoryName(path));\n#if !IL2CPP_TARGET_PS4 && !IL2CPP_TARGET_PSP2\n            if (access(dirname.c_str(), F_OK) == 0)\n                return kErrorCodeFileNotFound;\n            else\n#endif\n            return kErrorCodePathNotFound;\n        }\n        else\n            return FileErrnoToErrorCode(code);\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Error.h",
    "content": "#pragma once\n\n#include <string>\n#include <stdint.h>\n#include \"os/ErrorCodes.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    ErrorCode SocketErrnoToErrorCode(int32_t code);\n    ErrorCode FileErrnoToErrorCode(int32_t code);\n    ErrorCode PathErrnoToErrorCode(const std::string& path, int32_t code);\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/EventImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_THREADS_PTHREAD\n\n#include \"EventImpl.h\"\n#include \"PosixHelpers.h\"\n#include <errno.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    EventImpl::EventImpl(bool manualReset, bool signaled)\n        : posix::PosixWaitObject(manualReset ? kManualResetEvent : kAutoResetEvent)\n    {\n        if (signaled)\n            m_Count = 1;\n    }\n\n    ErrorCode EventImpl::Set()\n    {\n        posix::PosixAutoLock lock(&m_Mutex);\n\n        m_Count = 1;\n\n        if (HaveWaitingThreads())\n            pthread_cond_broadcast(&m_Condition);\n\n        return kErrorCodeSuccess;\n    }\n\n    ErrorCode EventImpl::Reset()\n    {\n        posix::PosixAutoLock lock(&m_Mutex);\n        m_Count = 0;\n\n        return kErrorCodeSuccess;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/EventImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_THREADS_PTHREAD\n\n#include \"os/ErrorCodes.h\"\n#include \"os/WaitStatus.h\"\n#include \"PosixWaitObject.h\"\n\n#include <pthread.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class EventImpl : public posix::PosixWaitObject\n    {\n    public:\n        EventImpl(bool manualReset = false, bool signaled = false);\n\n        ErrorCode Set();\n        ErrorCode Reset();\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/File.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include \"FileHandle.h\"\n\n#if IL2CPP_USE_POSIX_FILE_PLATFORM_CONFIG\n#include \"FilePlatformConfig.h\"\n#endif\n\n\n#include \"os/ErrorCodes.h\"\n#include \"os/File.h\"\n#include \"os/Mutex.h\"\n#include \"os/Posix/Error.h\"\n#include \"utils/PathUtils.h\"\n\n#include <assert.h>\n#include <fcntl.h>\n#include <stdint.h>\n#include <unistd.h>\n#include <utime.h>\n#include <sys/errno.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n\n#define INVALID_FILE_HANDLE     (FileHandle*)-1;\n#define INVALID_FILE_ATTRIBUTES (UnityPalFileAttributes)((uint32_t)-1);\n#define TIME_ZERO               116444736000000000ULL\n\nnamespace il2cpp\n{\nnamespace os\n{\n// Head and tail of linked list.\n    static FileHandle* s_fileHandleHead = NULL;\n    static FileHandle* s_fileHandleTail = NULL;\n    static FastMutex s_fileHandleMutex;\n\n    static void AddFileHandle(FileHandle *fileHandle)\n    {\n        FastAutoLock autoLock(&s_fileHandleMutex);\n\n        if (s_fileHandleHead == NULL)\n        {\n            IL2CPP_ASSERT(s_fileHandleTail == NULL);\n\n            s_fileHandleHead = fileHandle;\n            s_fileHandleTail = fileHandle;\n        }\n        else\n        {\n            IL2CPP_ASSERT(s_fileHandleTail != NULL);\n            IL2CPP_ASSERT(s_fileHandleTail->next == NULL);\n\n            s_fileHandleTail->next = fileHandle;\n            fileHandle->prev = s_fileHandleTail;\n            s_fileHandleTail = fileHandle;\n        }\n    }\n\n    static void RemoveFileHandle(il2cpp::os::FileHandle *fileHandle)\n    {\n        FastAutoLock autoLock(&s_fileHandleMutex);\n\n        if (s_fileHandleHead == fileHandle)\n            s_fileHandleHead = fileHandle->next;\n\n        if (s_fileHandleTail == fileHandle)\n            s_fileHandleTail = fileHandle->prev;\n\n        if (fileHandle->prev)\n            fileHandle->prev->next = fileHandle->next;\n\n        if (fileHandle->next)\n            fileHandle->next->prev = fileHandle->prev;\n    }\n\n    static const FileHandle* FindFileHandle(const struct stat& statBuf)\n    {\n        FastAutoLock autoLock(&s_fileHandleMutex);\n\n        const dev_t device = statBuf.st_dev;\n        const ino_t inode = statBuf.st_ino;\n\n        for (FileHandle *handle = s_fileHandleHead; handle != NULL; handle = handle->next)\n        {\n            if (handle->device == device && handle->inode == inode)\n                return handle;\n        }\n\n        return NULL;\n    }\n\n// NOTE:\n// Checking for file sharing violations only works for the current process.\n//\n// Mono implements this feature across processes by storing the file handles as\n// a look up table in a shared file.\n\n    static bool ShareAllowOpen(const struct stat& statBuf, int shareMode, int accessMode)\n    {\n        const FileHandle *fileHandle = FindFileHandle(statBuf);\n\n        if (fileHandle == NULL) // File is not open\n            return true;\n\n        if (fileHandle->shareMode == kFileShareNone)\n            return false;\n\n        if (((fileHandle->shareMode == kFileShareRead)  && (accessMode != kFileAccessRead)) ||\n            ((fileHandle->shareMode == kFileShareWrite) && (accessMode != kFileAccessWrite)))\n        {\n            return false;\n        }\n\n        if (((fileHandle->accessMode & kFileAccessRead)  && !(shareMode & kFileShareRead)) ||\n            ((fileHandle->accessMode & kFileAccessWrite) && !(shareMode & kFileShareWrite)))\n        {\n            return false;\n        }\n\n        return true;\n    }\n\n    static UnityPalFileAttributes StatToFileAttribute(const std::string& path, struct stat& pathStat, struct stat* linkStat)\n    {\n        uint32_t fileAttributes = 0;\n\n        if (S_ISSOCK(pathStat.st_mode))\n            pathStat.st_mode &= ~S_IFSOCK; // don't consider socket protection\n\n#if defined(__APPLE__) && defined(__MACH__)\n        if ((pathStat.st_flags & UF_IMMUTABLE) || (pathStat.st_flags & SF_IMMUTABLE))\n            fileAttributes |= kFileAttributeReadOnly;\n#endif\n\n        const std::string filename(il2cpp::utils::PathUtils::Basename(path));\n\n        if (S_ISDIR(pathStat.st_mode))\n        {\n            fileAttributes = kFileAttributeDirectory;\n\n            if (!(pathStat.st_mode & S_IWUSR) && !(pathStat.st_mode & S_IWGRP) && !(pathStat.st_mode & S_IWOTH))\n                fileAttributes |= kFileAttributeReadOnly;\n\n            if (filename[0] == '.')\n                fileAttributes |= kFileAttributeHidden;\n        }\n        else\n        {\n            if (!(pathStat.st_mode & S_IWUSR) && !(pathStat.st_mode & S_IWGRP) && !(pathStat.st_mode & S_IWOTH))\n            {\n                fileAttributes = kFileAttributeReadOnly;\n\n                if (filename[0] == '.')\n                    fileAttributes |= kFileAttributeHidden;\n            }\n            else if (filename[0] == '.')\n                fileAttributes = kFileAttributeHidden;\n            else\n                fileAttributes = kFileAttributeNormal;\n        }\n\n        if (linkStat != NULL && S_ISLNK(linkStat->st_mode))\n            fileAttributes |= kFileAttributeReparse_point;\n\n        return (UnityPalFileAttributes)fileAttributes;\n    }\n\n    static int GetStatAndLinkStat(const std::string& path, struct stat& pathStat, struct stat& linkStat)\n    {\n        const int statResult = stat(path.c_str(), &pathStat);\n\n        if (statResult == -1 && errno == ENOENT && lstat(path.c_str(), &pathStat) != 0) // Might be a dangling symlink...\n            return PathErrnoToErrorCode(path, errno);\n\n        if (lstat(path.c_str(), &linkStat) != 0)\n            return PathErrnoToErrorCode(path, errno);\n\n        return kErrorCodeSuccess;\n    }\n\n    static uint64_t TimeToTicks(time_t timeval)\n    {\n        return ((uint64_t)timeval * 10000000) + TIME_ZERO;\n    }\n\n    static time_t TicksToTime(uint64_t ticks)\n    {\n        return (ticks - TIME_ZERO) / 10000000;\n    }\n\n    static bool InternalCopyFile(int srcFd, int destFd, const struct stat& srcStat, int *error)\n    {\n        const blksize_t preferedBlockSize = srcStat.st_blksize;\n        const blksize_t bufferSize = preferedBlockSize < 8192 ? 8192 : (preferedBlockSize > 65536 ? 65536 : preferedBlockSize);\n\n        char *buffer = new char[bufferSize];\n\n        ssize_t readBytes;\n\n        while ((readBytes = read(srcFd, buffer, bufferSize)) > 0)\n        {\n            char* writeBuffer = buffer;\n            ssize_t writeBytes = readBytes;\n\n            while (writeBytes > 0)\n            {\n                const ssize_t writtenBytes = write(destFd, writeBuffer, writeBytes);\n\n                if (writtenBytes < 0)\n                {\n                    if (errno == EINTR)\n                        continue;\n\n                    delete[] buffer;\n\n                    *error = FileErrnoToErrorCode(errno);\n                    return false;\n                }\n\n                writeBytes -= writtenBytes;\n                writeBuffer += writtenBytes;\n            }\n        }\n\n        delete[] buffer;\n\n        if (readBytes < 0)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return false;\n        }\n\n        IL2CPP_ASSERT(readBytes == 0);\n\n        return true;\n    }\n\n    bool File::Isatty(FileHandle* fileHandle)\n    {\n        return isatty(fileHandle->fd) == 1;\n    }\n\n    FileHandle* File::GetStdError()\n    {\n        static FileHandle* s_handle = NULL;\n        if (s_handle)\n            return s_handle;\n\n        s_handle = new FileHandle();\n        s_handle->fd = 2;\n        s_handle->type = kFileTypeChar;\n        s_handle->options = 0;\n        s_handle->accessMode = kFileAccessReadWrite;\n        s_handle->shareMode = -1; // Only used for files\n\n        return s_handle;\n    }\n\n    FileHandle* File::GetStdInput()\n    {\n        static FileHandle* s_handle = NULL;\n        if (s_handle)\n            return s_handle;\n\n        s_handle = new FileHandle();\n        s_handle->fd = 0;\n        s_handle->type = kFileTypeChar;\n        s_handle->options = 0;\n        s_handle->accessMode = kFileAccessRead;\n        s_handle->shareMode = -1; // Only used for files\n\n        return s_handle;\n    }\n\n    FileHandle* File::GetStdOutput()\n    {\n        static FileHandle* s_handle = NULL;\n        if (s_handle)\n            return s_handle;\n\n        s_handle = new FileHandle();\n        s_handle->fd = 1;\n        s_handle->type = kFileTypeChar;\n        s_handle->options = 0;\n        s_handle->accessMode = kFileAccessReadWrite;\n        s_handle->shareMode = -1; // Only used for files\n\n        return s_handle;\n    }\n\n    bool File::CreatePipe(FileHandle** read_handle, FileHandle** write_handle)\n    {\n        int error;\n        return File::CreatePipe(read_handle, write_handle, &error);\n    }\n\n    bool File::CreatePipe(FileHandle** read_handle, FileHandle** write_handle, int* error)\n    {\n        int fds[2];\n\n        const int ret = pipe(fds);\n\n        if (ret == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return false;\n        }\n\n        FileHandle *input = new FileHandle();\n        input->fd = fds[0];\n        input->type = kFileTypePipe;\n        input->options = 0;\n        input->accessMode = kFileAccessRead;\n        input->shareMode = -1; // Only used for files\n\n        FileHandle *output = new FileHandle();\n        output->fd = fds[1];\n        output->type = kFileTypePipe;\n        output->options = 0;\n        output->accessMode = kFileAccessReadWrite;\n        output->shareMode = -1; // Only used for files\n\n        *read_handle = input;\n        *write_handle = output;\n\n        return true;\n    }\n\n    UnityPalFileAttributes File::GetFileAttributes(const std::string& path, int *error)\n    {\n        struct stat pathStat, linkStat;\n\n        *error = GetStatAndLinkStat(path, pathStat, linkStat);\n\n        if (*error != kErrorCodeSuccess)\n            return INVALID_FILE_ATTRIBUTES;\n\n        return StatToFileAttribute(path, pathStat, &linkStat);\n    }\n\n    bool File::SetFileAttributes(const std::string& path, UnityPalFileAttributes attributes, int* error)\n    {\n        struct stat pathStat;\n\n        int ret = stat(path.c_str(), &pathStat);\n\n        if (ret != 0)\n        {\n            *error = PathErrnoToErrorCode(path, errno);\n            return false;\n        }\n\n        if (attributes & kFileAttributeReadOnly)\n            ret = chmod(path.c_str(), pathStat.st_mode & ~(S_IWUSR | S_IWOTH | S_IWGRP));\n        else\n            ret = chmod(path.c_str(), pathStat.st_mode | S_IWUSR);\n\n        if (ret != 0)\n        {\n            *error = PathErrnoToErrorCode(path, errno);\n            return false;\n        }\n\n        // Mono ignores all other attributes\n\n        if (attributes & kFileAttributeInternalMonoExecutable)\n        {\n            mode_t exec_mask = 0;\n\n            if ((pathStat.st_mode & S_IRUSR) != 0)\n                exec_mask |= S_IXUSR;\n\n            if ((pathStat.st_mode & S_IRGRP) != 0)\n                exec_mask |= S_IXGRP;\n\n            if ((pathStat.st_mode & S_IROTH) != 0)\n                exec_mask |= S_IXOTH;\n\n            ret = chmod(path.c_str(), pathStat.st_mode | exec_mask);\n\n            if (ret != 0)\n            {\n                *error = PathErrnoToErrorCode(path, errno);\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    bool File::GetFileStat(const std::string& path, il2cpp::os::FileStat * stat, int* error)\n    {\n        struct stat pathStat, linkStat;\n\n        *error = GetStatAndLinkStat(path, pathStat, linkStat);\n\n        if (*error != kErrorCodeSuccess)\n            return false;\n\n        const std::string filename(il2cpp::utils::PathUtils::Basename(path));\n        const time_t creationTime = pathStat.st_mtime < pathStat.st_ctime ? pathStat.st_mtime : pathStat.st_ctime;\n\n        stat->name = filename;\n\n        stat->attributes = StatToFileAttribute(path, pathStat, &linkStat);\n\n        stat->length = (stat->attributes & kFileAttributeDirectory) > 0 ? 0 : pathStat.st_size;\n\n        stat->creation_time = TimeToTicks(creationTime);\n        stat->last_access_time = TimeToTicks(pathStat.st_atime);\n        stat->last_write_time = TimeToTicks(pathStat.st_mtime);\n\n        return true;\n    }\n\n    FileType File::GetFileType(FileHandle* handle)\n    {\n        return ((FileHandle*)handle)->type;\n    }\n\n    bool File::DeleteFile(const std::string& path, int *error)\n    {\n        const UnityPalFileAttributes attributes = GetFileAttributes(path, error);\n\n        if (*error != kErrorCodeSuccess)\n        {\n            return false;\n        }\n\n        if (attributes & kFileAttributeReadOnly)\n        {\n            *error = kErrorCodeAccessDenied;\n            return false;\n        }\n\n        const int ret = unlink(path.c_str());\n\n        if (ret == -1)\n        {\n            *error = PathErrnoToErrorCode(path, errno);\n            return false;\n        }\n\n        *error = kErrorCodeSuccess;\n        return true;\n    }\n\n    bool File::CopyFile(const std::string& src, const std::string& dest, bool overwrite, int* error)\n    {\n        const int srcFd = open(src.c_str(), O_RDONLY, 0);\n\n        if (srcFd < 0)\n        {\n            *error = PathErrnoToErrorCode(src, errno);\n            return false;\n        }\n\n        struct stat srcStat;\n\n        if (fstat(srcFd, &srcStat) < 0)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            close(srcFd);\n            return false;\n        }\n\n        int destFd;\n\n        if (!overwrite)\n        {\n            destFd = open(dest.c_str(), O_WRONLY | O_CREAT | O_EXCL, srcStat.st_mode);\n        }\n        else\n        {\n            destFd = open(dest.c_str(), O_WRONLY | O_TRUNC, srcStat.st_mode);\n\n            if (destFd < 0)\n                destFd = open(dest.c_str(), O_WRONLY | O_CREAT | O_TRUNC, srcStat.st_mode);\n            else\n                *error = kErrorCodeAlreadyExists; // Apparently this error is set if we overwrite the dest file\n        }\n\n        if (destFd < 0)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            close(srcFd);\n            return false;\n        }\n\n        const bool ret = InternalCopyFile(srcFd, destFd, srcStat, error);\n\n        close(srcFd);\n        close(destFd);\n\n        return ret;\n    }\n\n    bool File::MoveFile(const std::string& src, const std::string& dest, int* error)\n    {\n        struct stat srcStat, destStat;\n\n        if (stat(src.c_str(), &srcStat) < 0)\n        {\n            *error = PathErrnoToErrorCode(src.c_str(), errno);\n            return false;\n        }\n\n        // In C# land we check for the existence of src, but not for dest.\n        // We check it here and return the failure if dest exists and is not\n        // the same file as src.\n        if (stat(dest.c_str(), &destStat) == 0) // dest exists\n        {\n            if (destStat.st_dev != srcStat.st_dev || destStat.st_ino != srcStat.st_ino)\n            {\n                *error = kErrorCodeAlreadyExists;\n                return false;\n            }\n        }\n\n        if (!ShareAllowOpen(srcStat, kFileShareNone, kFileAccessWrite))\n        {\n            *error = kErrorCodeSharingViolation;\n            return false;\n        }\n\n        const int ret = rename(src.c_str(), dest.c_str());\n\n        if (ret == -1)\n        {\n            if (errno == EEXIST)\n            {\n                *error = kErrorCodeAlreadyExists;\n                return false;\n            }\n            else if (errno == EXDEV)\n            {\n                if (S_ISDIR(srcStat.st_mode))\n                {\n                    *error = kErrorCodeNotSameDevice;\n                    return false;\n                }\n\n                if (!CopyFile(src, dest, true, error))\n                {\n                    // CopyFile sets the error\n                    return false;\n                }\n\n                return DeleteFile(src, error); // DeleteFile sets the error\n            }\n            else\n            {\n                *error = PathErrnoToErrorCode(src.c_str(), errno);\n                return false;\n            }\n        }\n\n        *error = kErrorCodeSuccess;\n        return true;\n    }\n\n    bool File::ReplaceFile(const std::string& sourceFileName, const std::string& destinationFileName, const std::string& destinationBackupFileName, bool ignoreMetadataErrors, int* error)\n    {\n        const bool backupFile = !destinationBackupFileName.empty();\n\n        // Open the backup file for read so we can restore the file if an error occurs.\n        const int backupFd = backupFile ? open(destinationBackupFileName.c_str(), O_RDONLY, 0) : -1;\n\n        // dest -> backup\n        if (backupFile)\n        {\n            const int retDest = rename(destinationFileName.c_str(), destinationBackupFileName.c_str());\n\n            if (retDest == -1)\n            {\n                if (backupFd != -1)\n                    close(backupFd);\n\n                *error = PathErrnoToErrorCode(destinationFileName.c_str(), errno);\n                return false;\n            }\n        }\n\n        // source -> dest\n        const int restSource = rename(sourceFileName.c_str(), destinationFileName.c_str());\n\n        if (restSource == -1)\n        {\n            // backup -> dest\n            if (backupFile)\n                rename(destinationBackupFileName.c_str(), destinationFileName.c_str());\n\n            // Copy backup data -> dest\n            struct stat backupStat;\n            if (backupFd != -1 && fstat(backupFd, &backupStat) == 0)\n            {\n                const int destFd = open(destinationBackupFileName.c_str(), O_WRONLY | O_CREAT | O_TRUNC, backupStat.st_mode);\n\n                if (destFd != -1)\n                {\n                    int unusedCopyFileError;\n                    InternalCopyFile(backupFd, destFd, backupStat, &unusedCopyFileError);\n                    close(destFd);\n                }\n            }\n\n            if (backupFd != -1)\n                close(backupFd);\n\n            *error = PathErrnoToErrorCode(sourceFileName.c_str(), errno);\n            return false;\n        }\n\n        if (backupFd != -1)\n            close(backupFd);\n\n        *error = kErrorCodeSuccess;\n\n        return true;\n    }\n\n    static int ConvertFlags(int fileaccess, int createmode)\n    {\n        int flags;\n\n        switch (fileaccess)\n        {\n            case kFileAccessRead:\n                flags = O_RDONLY;\n                break;\n            case kFileAccessWrite:\n                flags = O_WRONLY;\n                break;\n            case kFileAccessReadWrite:\n                flags = O_RDWR;\n                break;\n            default:\n                flags = 0;\n                break;\n        }\n\n        switch (createmode)\n        {\n            case kFileModeCreateNew:\n                flags |= O_CREAT | O_EXCL;\n                break;\n            case kFileModeCreate:\n                flags |= O_CREAT | O_TRUNC;\n                break;\n            case kFileModeOpen:\n                break;\n            case kFileModeOpenOrCreate:\n            case kFileModeAppend:\n                flags |= O_CREAT;\n                break;\n            case kFileModeTruncate:\n                flags |= O_TRUNC;\n                break;\n            default:\n                flags = 0;\n                break;\n        }\n\n        return flags;\n    }\n\n#ifndef S_ISFIFO\n#define S_ISFIFO(m) ((m & S_IFIFO) != 0)\n#endif\n\n    FileHandle* File::Open(const std::string& path, int mode, int accessMode, int shareMode, int options, int *error)\n    {\n        const int flags = ConvertFlags(accessMode, mode);\n\n        /* we don't use sharemode, because that relates to sharing of\n         * the file when the file is open and is already handled by\n         * other code, perms instead are the on-disk permissions and\n         * this is a sane default.\n         */\n        const mode_t perms = options & kFileOptionsTemporary ? 0600 : 0666;\n\n        int fd = open(path.c_str(), flags, perms);\n\n        /* If we were trying to open a directory with write permissions\n         * (e.g. O_WRONLY or O_RDWR), this call will fail with\n         * EISDIR. However, this is a bit bogus because calls to\n         * manipulate the directory (e.g. SetFileTime) will still work on\n         * the directory because they use other API calls\n         * (e.g. utime()). Hence, if we failed with the EISDIR error, try\n         * to open the directory again without write permission.\n         */\n\n        // Try again but don't try to make it writable\n        if (fd == -1)\n        {\n            if (errno == EISDIR)\n            {\n                fd = open(path.c_str(), flags & ~(O_RDWR | O_WRONLY), perms);\n\n                if (fd == -1)\n                {\n                    *error = PathErrnoToErrorCode(path, errno);\n                    return INVALID_FILE_HANDLE;\n                }\n            }\n            else\n            {\n                *error = PathErrnoToErrorCode(path, errno);\n                return INVALID_FILE_HANDLE;\n            }\n        }\n\n        struct stat statbuf;\n        const int ret = fstat(fd, &statbuf);\n\n        if (ret == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            close(fd);\n            return INVALID_FILE_HANDLE;\n        }\n\n        if (!ShareAllowOpen(statbuf, shareMode, accessMode))\n        {\n            *error = kErrorCodeSharingViolation;\n            close(fd);\n            return INVALID_FILE_HANDLE;\n        }\n\n        FileHandle* fileHandle = new FileHandle();\n        fileHandle->fd = fd;\n        fileHandle->path = path;\n        fileHandle->options = options;\n        fileHandle->accessMode = accessMode;\n        fileHandle->shareMode = shareMode;\n\n        fileHandle->device = statbuf.st_dev;\n        fileHandle->inode = statbuf.st_ino;\n\n        // Add to linked list\n        AddFileHandle(fileHandle);\n\n#ifdef HAVE_POSIX_FADVISE\n        if (options & kFileOptionsSequentialScan)\n            posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL);\n        if (options & kFileOptionsRandomAccess)\n            posix_fadvise(fd, 0, 0, POSIX_FADV_RANDOM);\n#endif\n\n        if (S_ISFIFO(statbuf.st_mode))\n            fileHandle->type = kFileTypePipe;\n        else if (S_ISCHR(statbuf.st_mode))\n            fileHandle->type = kFileTypeChar;\n        else\n            fileHandle->type = kFileTypeDisk;\n\n        *error = kErrorCodeSuccess;\n\n        return fileHandle;\n    }\n\n    bool File::Close(FileHandle* handle, int *error)\n    {\n        if (handle->type == kFileTypeDisk && handle->options & kFileOptionsDeleteOnClose)\n            unlink(handle->path.c_str());\n\n        close(handle->fd);\n\n        // Remove from linked list\n        RemoveFileHandle(handle);\n\n        delete handle;\n\n        *error = kErrorCodeSuccess;\n\n        return true;\n    }\n\n    bool File::SetFileTime(FileHandle* handle, int64_t creation_time, int64_t last_access_time, int64_t last_write_time, int* error)\n    {\n        if ((handle->accessMode & kFileAccessWrite) == 0)\n        {\n            *error = kErrorCodeAccessDenied;\n            return false;\n        }\n\n        struct stat statbuf;\n        const int ret = fstat(handle->fd, &statbuf);\n\n        if (ret == -1)\n        {\n            *error = kErrorCodeInvalidParameter;\n            return false;\n        }\n\n        struct utimbuf utbuf;\n\n        // Setting creation time is not implemented in Mono and not supported by utime.\n\n        if (last_access_time >= 0)\n        {\n            if (last_access_time < TIME_ZERO)\n            {\n                *error = kErrorCodeInvalidParameter;\n                return false;\n            }\n\n            utbuf.actime = TicksToTime(last_access_time);\n        }\n        else\n        {\n            utbuf.actime = statbuf.st_atime;\n        }\n\n        if (last_write_time >= 0)\n        {\n            if (last_write_time < TIME_ZERO)\n            {\n                *error = kErrorCodeInvalidParameter;\n                return false;\n            }\n\n            utbuf.modtime = TicksToTime(last_write_time);\n        }\n        else\n        {\n            utbuf.modtime = statbuf.st_mtime;\n        }\n\n        const int utimeRet = utime(handle->path.c_str(), &utbuf);\n\n        if (utimeRet == -1)\n        {\n            *error = kErrorCodeInvalidParameter;\n            return false;\n        }\n\n        *error = kErrorCodeSuccess;\n\n        return true;\n    }\n\n    int64_t File::GetLength(FileHandle* handle, int *error)\n    {\n        if (handle->type != kFileTypeDisk)\n        {\n            *error = kErrorCodeInvalidHandle;\n            return false;\n        }\n\n        struct stat statbuf;\n\n        const int ret = fstat(handle->fd, &statbuf);\n\n        if (ret == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return -1;\n        }\n\n        *error = kErrorCodeSuccess;\n\n        return statbuf.st_size;\n    }\n\n    bool File::SetLength(FileHandle* handle, int64_t length, int *error)\n    {\n        if (handle->type != kFileTypeDisk)\n        {\n            *error = kErrorCodeInvalidHandle;\n            return false;\n        }\n\n        // Save current position\n        const off_t currentPosition = lseek(handle->fd, 0, SEEK_CUR);\n\n        if (currentPosition == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return false;\n        }\n\n        const off_t setLength = lseek(handle->fd, length, SEEK_SET);\n\n        if (setLength == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return false;\n        }\n\n        int ret = 0;\n\n        do\n        {\n            ret = ftruncate(handle->fd, length);\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return false;\n        }\n\n        const off_t oldPosition = lseek(handle->fd, currentPosition, SEEK_SET);\n\n        if (oldPosition == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return false;\n        }\n\n        *error = kErrorCodeSuccess;\n\n        return true;\n    }\n\n    int64_t File::Seek(FileHandle* handle, int64_t offset, int origin, int *error)\n    {\n        if (handle->type != kFileTypeDisk)\n        {\n            *error = kErrorCodeInvalidHandle;\n            return false;\n        }\n\n        int whence;\n\n        switch (origin)\n        {\n            case kFileSeekOriginBegin:\n                whence = SEEK_SET;\n                break;\n            case kFileSeekOriginCurrent:\n                whence = SEEK_CUR;\n                break;\n            case kFileSeekOriginEnd:\n                whence = SEEK_END;\n                break;\n            default:\n            {\n                *error = kErrorCodeInvalidParameter;\n                return -1;\n            }\n        }\n\n        const off_t position = lseek(handle->fd, offset, whence);\n\n        if (position == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return -1;\n        }\n\n        *error = kErrorCodeSuccess;\n\n        return position;\n    }\n\n    int File::Read(FileHandle* handle, char *dest, int count, int *error)\n    {\n        if ((handle->accessMode & kFileAccessRead) == 0)\n        {\n            *error = kErrorCodeAccessDenied;\n            return 0;\n        }\n\n        int ret;\n\n        do\n        {\n            ret = (int)read(handle->fd, dest, count);\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return 0;\n        }\n\n        return ret;\n    }\n\n    int32_t File::Write(FileHandle* handle, const char* buffer, int count, int *error)\n    {\n        if ((handle->accessMode & kFileAccessWrite) == 0)\n        {\n            *error = kErrorCodeAccessDenied;\n            return 0;\n        }\n\n        int ret;\n\n        do\n        {\n            ret = (int32_t)write(handle->fd, buffer, count);\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return 0;\n        }\n\n        return ret;\n    }\n\n    bool File::Flush(FileHandle* handle, int* error)\n    {\n        if (handle->type != kFileTypeDisk)\n        {\n            *error = kErrorCodeInvalidHandle;\n            return false;\n        }\n\n        const int ret = fsync(handle->fd);\n\n        if (ret == -1)\n        {\n            *error = FileErrnoToErrorCode(errno);\n            return false;\n        }\n\n        *error = kErrorCodeSuccess;\n        return true;\n    }\n\n    void File::Lock(FileHandle* handle, int64_t position, int64_t length, int* error)\n    {\n        struct flock lock_data;\n        int ret;\n\n        lock_data.l_type = F_WRLCK;\n        lock_data.l_whence = SEEK_SET;\n        lock_data.l_start = position;\n        lock_data.l_len = length;\n\n        do\n        {\n            ret = fcntl(handle->fd, F_SETLK, &lock_data);\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == -1)\n        {\n            /*\n             * if locks are not available (NFS for example),\n             * ignore the error\n             */\n            if (errno == ENOLCK\n#ifdef EOPNOTSUPP\n                || errno == EOPNOTSUPP\n#endif\n#ifdef ENOTSUP\n                || errno == ENOTSUP\n#endif\n                )\n            {\n                *error = kErrorCodeSuccess;\n                return;\n            }\n\n            *error = FileErrnoToErrorCode(errno);\n            return;\n        }\n\n        *error = kErrorCodeSuccess;\n    }\n\n    void File::Unlock(FileHandle* handle, int64_t position, int64_t length, int* error)\n    {\n        struct flock lock_data;\n        int ret;\n\n        lock_data.l_type = F_UNLCK;\n        lock_data.l_whence = SEEK_SET;\n        lock_data.l_start = position;\n        lock_data.l_len = length;\n\n        do\n        {\n            ret = fcntl(handle->fd, F_SETLK, &lock_data);\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == -1)\n        {\n            /*\n             * if locks are not available (NFS for example),\n             * ignore the error\n             */\n            if (errno == ENOLCK\n#ifdef EOPNOTSUPP\n                || errno == EOPNOTSUPP\n#endif\n#ifdef ENOTSUP\n                || errno == ENOTSUP\n#endif\n                )\n            {\n                *error = kErrorCodeSuccess;\n                return;\n            }\n\n            *error = FileErrnoToErrorCode(errno);\n            return;\n        }\n\n        *error = kErrorCodeSuccess;\n    }\n\n    bool File::DuplicateHandle(FileHandle* source_process_handle, FileHandle* source_handle, FileHandle* target_process_handle,\n        FileHandle** target_handle, int access, int inhert, int options, int* error)\n    {\n        NOT_IMPLEMENTED_ICALL(File::DuplicateHandle);\n        return false;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/FileHandle.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include <string>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include \"os/File.h\"\n#include \"os/OSGlobalEnums.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    struct FileHandle\n    {\n        int fd;\n        FileType type;\n        std::string path;\n        int options;\n        int shareMode;\n        int accessMode;\n\n        // device and inode are used as key for finding file handles\n        dev_t device;\n        ino_t inode;\n\n        // Linked list of file handles\n        FileHandle *prev;\n        FileHandle *next;\n\n        FileHandle() : prev(NULL), next(NULL)\n        {\n        }\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/FileSystemWatcher.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if !IL2CPP_USE_GENERIC_ENVIRONMENT && IL2CPP_TARGET_POSIX\n\n#include <cassert>\n#include \"os/FileSystemWatcher.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace FileSystemWatcher\n{\n    int IsSupported()\n    {\n#if IL2CPP_TARGET_IOS\n        return 0; // Not supported on iOS\n#else\n        NOT_IMPLEMENTED_ICALL(FileSystemWatcher::IsSupported);\n        return 0;\n#endif\n    }\n}\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Image.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_JAVASCRIPT || IL2CPP_TARGET_LINUX || IL2CPP_TARGET_ANDROID || IL2CPP_TARGET_TIZEN\n\n#if !IL2CPP_TARGET_JAVASCRIPT\n#include <dlfcn.h>\n#endif\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Image\n{\n    void* GetImageBase()\n    {\n#if IL2CPP_TARGET_JAVASCRIPT\n        return NULL;\n#else\n        Dl_info info;\n        void* const anySymbol = reinterpret_cast<void*>(&GetImageBase);\n        if (dladdr(anySymbol, &info))\n            return info.dli_fbase;\n        else\n            return NULL;\n#endif\n    }\n}\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/LastError.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include <errno.h>\n\n#include \"os/LastError.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    uint32_t LastError::GetLastError()\n    {\n        return errno;\n    }\n} /* namespace os */\n} /* namespace il2cpp*/\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/LibraryLoader.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n//#define VERBOSE_OUTPUT\n\n#ifdef VERBOSE_OUTPUT\n#include <stdio.h>\n#endif\n\n#include <dlfcn.h>\n#include <string>\n#include <set>\n\n#include \"metadata.h\"\n#include \"os/LibraryLoader.h\"\n#include \"utils/PathUtils.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/Environment.h\"\n#include \"vm/Exception.h\"\n#include \"vm/PlatformInvoke.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    static std::set<void*> s_NativeHandlesOpen;\n    typedef std::set<void*>::const_iterator OpenHandleIterator;\n\n    struct LibraryNamePrefixAndSuffix\n    {\n        LibraryNamePrefixAndSuffix(const char* prefix_, const char* suffix_)\n        {\n            prefix = std::string(prefix_);\n            suffix = std::string(suffix_);\n        }\n\n        std::string prefix;\n        std::string suffix;\n    };\n\n    static LibraryNamePrefixAndSuffix LibraryNamePrefixAndSuffixVariations[8] =\n    {\n        LibraryNamePrefixAndSuffix(\"\", \".so\"),\n        LibraryNamePrefixAndSuffix(\"\", \".dll\"),\n        LibraryNamePrefixAndSuffix(\"\", \".dylib\"),\n        LibraryNamePrefixAndSuffix(\"\", \".bundle\"),\n        LibraryNamePrefixAndSuffix(\"lib\", \".so\"),\n        LibraryNamePrefixAndSuffix(\"lib\", \".dll\"),\n        LibraryNamePrefixAndSuffix(\"lib\", \".dylib\"),\n        LibraryNamePrefixAndSuffix(\"lib\", \".bundle\")\n    };\n\n// Note that testing this code can be a bit difficult, since dlopen will cache\n// the values it returns, and we don't call dlcose from the C# level. See the\n// comments in the integration test code for more details.\n\n    static void* LoadLibraryWithName(const char* name)\n    {\n#ifdef VERBOSE_OUTPUT\n        printf(\"Trying name: %s\\n\", name);\n#endif\n\n        void* handle = NULL;\n#if IL2CPP_TARGET_IOS\n        std::string dirName;\n        if (utils::Environment::GetNumMainArgs() > 0)\n        {\n            std::string main = utils::StringUtils::Utf16ToUtf8(utils::Environment::GetMainArgs()[0]);\n            dirName = utils::PathUtils::DirectoryName(main);\n        }\n\n        std::string libPath = utils::StringUtils::Printf(\"%s/%s\", dirName.c_str(), name);\n        handle = dlopen(libPath.c_str(), RTLD_LAZY);\n\n        // Fallback to just using the name. This might be a system dylib.\n        if (handle == NULL)\n            handle = dlopen(name, RTLD_LAZY);\n#else\n        handle = dlopen(name, RTLD_LAZY);\n#endif\n\n        if (handle != NULL)\n            return handle;\n\n#ifdef VERBOSE_OUTPUT\n        printf(\"Error: %s\\n\", dlerror());\n#endif\n\n        return NULL;\n    }\n\n    static void* CheckLibraryVariations(const char* name)\n    {\n        int numberOfVariations = sizeof(LibraryNamePrefixAndSuffixVariations) / sizeof(LibraryNamePrefixAndSuffixVariations[0]);\n        for (int i = 0; i < numberOfVariations; ++i)\n        {\n            std::string libraryName = LibraryNamePrefixAndSuffixVariations[i].prefix + name + LibraryNamePrefixAndSuffixVariations[i].suffix;\n            void* handle = LoadLibraryWithName(libraryName.c_str());\n            if (handle != NULL)\n                return handle;\n        }\n\n        return NULL;\n    }\n\n    Il2CppMethodPointer LibraryLoader::GetHardcodedPInvokeDependencyFunctionPointer(const il2cpp::utils::StringView<Il2CppNativeChar>& nativeDynamicLibrary, const il2cpp::utils::StringView<char>& entryPoint)\n    {\n        return NULL;\n    }\n\n    void* LibraryLoader::LoadDynamicLibrary(const utils::StringView<Il2CppNativeChar>& nativeDynamicLibrary)\n    {\n#ifdef VERBOSE_OUTPUT\n        printf(\"Attempting to load dynamic library: %s\\n\", nativeDynamicLibrary.Str());\n#endif\n\n        if (nativeDynamicLibrary.IsEmpty())\n            return LoadLibraryWithName(NULL);\n\n        StringViewAsNullTerminatedStringOf(char, nativeDynamicLibrary, libraryName);\n        void* handle = LoadLibraryWithName(libraryName);\n\n        if (handle == NULL)\n            handle = CheckLibraryVariations(libraryName);\n\n        if (handle == NULL)\n        {\n            size_t lengthWithoutDotDll = nativeDynamicLibrary.Length() - 4;\n            if (strncmp(libraryName + lengthWithoutDotDll, \".dll\", 4) == 0)\n            {\n                char* nativeDynamicLibraryWithoutExtension = static_cast<char*>(alloca((lengthWithoutDotDll + 1) * sizeof(char)));\n                memcpy(nativeDynamicLibraryWithoutExtension, libraryName, lengthWithoutDotDll);\n                nativeDynamicLibraryWithoutExtension[lengthWithoutDotDll] = 0;\n\n                handle = CheckLibraryVariations(nativeDynamicLibraryWithoutExtension);\n            }\n        }\n\n        if (handle != NULL)\n            s_NativeHandlesOpen.insert(handle);\n\n        return handle;\n    }\n\n    Il2CppMethodPointer LibraryLoader::GetFunctionPointer(void* dynamicLibrary, const PInvokeArguments& pinvokeArgs)\n    {\n        StringViewAsNullTerminatedStringOf(char, pinvokeArgs.entryPoint, entryPoint);\n\n        if (pinvokeArgs.isNoMangle)\n            return reinterpret_cast<Il2CppMethodPointer>(dlsym(dynamicLibrary, entryPoint));\n\n        const size_t kBufferOverhead = 10;\n        void* functionPtr = NULL;\n        size_t originalFuncNameLength = strlen(entryPoint) + 1;\n        std::string functionName;\n\n        functionName.resize(originalFuncNameLength + kBufferOverhead + 1); // Let's index the string from '1', because we might have to prepend an underscore in case of stdcall mangling\n        memcpy(&functionName[1], entryPoint, originalFuncNameLength);\n        memset(&functionName[1] + originalFuncNameLength, 0, kBufferOverhead);\n\n        // If there's no 'dont mangle' flag set, 'W' function takes priority over original name, but 'A' function does not (yes, really)\n        if (pinvokeArgs.charSet == CHARSET_UNICODE)\n        {\n            functionName[originalFuncNameLength] = 'W';\n            functionPtr = dlsym(dynamicLibrary, functionName.c_str() + 1);\n            if (functionPtr != NULL)\n                return reinterpret_cast<Il2CppMethodPointer>(functionPtr);\n\n            // If charset specific function lookup failed, try with original name\n            functionPtr = dlsym(dynamicLibrary, entryPoint);\n        }\n        else\n        {\n            functionPtr = dlsym(dynamicLibrary, entryPoint);\n            if (functionPtr != NULL)\n                return reinterpret_cast<Il2CppMethodPointer>(functionPtr);\n\n            // If original name function lookup failed, try with mangled name\n            functionName[originalFuncNameLength] = 'A';\n            functionPtr = dlsym(dynamicLibrary, functionName.c_str() + 1);\n        }\n\n        return reinterpret_cast<Il2CppMethodPointer>(functionPtr);\n    }\n\n    Il2CppMethodPointer LibraryLoader::GetFunctionPointer(void* dynamicLibrary, const char* functionName)\n    {\n#ifdef VERBOSE_OUTPUT\n        printf(\"Attempting to load method at entry point: %s\\n\", functionName);\n#endif\n\n        Il2CppMethodPointer method = reinterpret_cast<Il2CppMethodPointer>(dlsym(dynamicLibrary, functionName));\n\n#ifdef VERBOSE_OUTPUT\n        if (method == NULL)\n            printf(\"Error: %s\\n\", dlerror());\n#endif\n\n        return method;\n    }\n\n    void LibraryLoader::CleanupLoadedLibraries()\n    {\n        for (OpenHandleIterator it = s_NativeHandlesOpen.begin(); it != s_NativeHandlesOpen.end(); it++)\n        {\n            dlclose(*it);\n        }\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Locale.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include <clocale>\n#include <locale.h>\n#if IL2CPP_TARGET_DARWIN\n#include <xlocale.h>\n#endif\n#include \"os/Locale.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n\n/*\n* The following method is modified from the ICU source code. (http://oss.software.ibm.com/icu)\n* Copyright (c) 1995-2003 International Business Machines Corporation and others\n* All rights reserved.\n*/\nstd::string Locale::GetLocale()\n{\n\tconst char* posix_locale = NULL;\n\n\tposix_locale = getenv(\"LC_ALL\");\n\tif (posix_locale == 0) {\n\t\tposix_locale = getenv(\"LANG\");\n\t\tif (posix_locale == 0) {\n\t\t\tposix_locale = setlocale(LC_ALL, NULL);\n\t\t}\n\t}\n\n\tif (posix_locale == NULL)\n\t\treturn std::string();\n\n\tif ((strcmp(\"C\", posix_locale) == 0) || (strchr(posix_locale, ' ') != NULL)\n\t\t|| (strchr(posix_locale, '/') != NULL)) {\n\t\t/*\n\t\t* HPUX returns 'C C C C C C C'\n\t\t* Solaris can return /en_US/C/C/C/C/C on the second try.\n\t\t* Maybe we got some garbage.\n\t\t*/\n\t\treturn std::string();\n\t}\n\n\treturn std::string(posix_locale);\n}\n\n#if IL2CPP_SUPPORT_LOCALE_INDEPENDENT_PARSING\nstatic locale_t s_cLocale = NULL;\n#endif\n\nvoid Locale::Initialize()\n{\n#if IL2CPP_SUPPORT_LOCALE_INDEPENDENT_PARSING\n\ts_cLocale = newlocale(LC_ALL_MASK, \"\", NULL);\n#endif\n}\n\nvoid Locale::UnInitialize()\n{\n#if IL2CPP_SUPPORT_LOCALE_INDEPENDENT_PARSING\n\tif (s_cLocale)\n\t\tfreelocale(s_cLocale);\n\ts_cLocale = NULL;\n#endif\n}\n\n#if IL2CPP_SUPPORT_LOCALE_INDEPENDENT_PARSING\ndouble Locale::DoubleParseLocaleIndependentImpl(char *ptr, char** endptr)\n{\n\treturn strtod_l(ptr, endptr, s_cLocale);\n}\n#endif\n\n\n} /* namespace os */\n} /* namespace il2cpp */\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/MarshalAlloc.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include \"os/MarshalAlloc.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    void* MarshalAlloc::Allocate(size_t size)\n    {\n        return malloc(size);\n    }\n\n    void* MarshalAlloc::ReAlloc(void* ptr, size_t size)\n    {\n        return realloc(ptr, size);\n    }\n\n    void MarshalAlloc::Free(void* ptr)\n    {\n        free(ptr);\n    }\n} /* namespace os */\n} /* namespace il2cpp*/\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Memory.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX || IL2CPP_TARGET_N3DS\n\n#include \"os/Memory.h\"\n#include <stdint.h>\n#include <stdlib.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Memory\n{\n    void* AlignedAlloc(size_t size, size_t alignment)\n    {\n#if IL2CPP_TARGET_ANDROID || IL2CPP_TARGET_PSP2\n        return memalign(alignment, size);\n#else\n        void* ptr = NULL;\n        posix_memalign(&ptr, alignment, size);\n        return ptr;\n#endif\n    }\n\n    void* AlignedReAlloc(void* memory, size_t newSize, size_t alignment)\n    {\n        void* newMemory = realloc(memory, newSize);\n\n        // Fast path: realloc returned aligned memory\n        if ((reinterpret_cast<uintptr_t>(newMemory) & (alignment - 1)) == 0)\n            return newMemory;\n\n        // Slow path: realloc returned non-aligned memory\n        void* alignedMemory = AlignedAlloc(newSize, alignment);\n        memcpy(alignedMemory, newMemory, newSize);\n        free(newMemory);\n        return alignedMemory;\n    }\n\n    void AlignedFree(void* memory)\n    {\n        free(memory);\n    }\n}\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/MemoryMappedFile.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if !IL2CPP_USE_GENERIC_MEMORY_MAPPED_FILE && IL2CPP_TARGET_POSIX\n\n#include <sys/mman.h>\n#include <map>\n#include \"os/File.h\"\n#include \"os/MemoryMappedFile.h\"\n#include \"os/Mutex.h\"\n#include \"FileHandle.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    static FastMutex s_Mutex;\n    static std::map<void*, int64_t> s_MappedAddressToMappedLength;\n\n    void* MemoryMappedFile::Map(FileHandle* file, size_t length, size_t offset)\n    {\n        os::FastAutoLock lock(&s_Mutex);\n\n        if (length == 0)\n        {\n            int error = 0;\n            length = File::GetLength(file, &error);\n            if (error != 0)\n                return NULL;\n        }\n\n        void* address = mmap(NULL, length, PROT_READ, MAP_FILE | MAP_PRIVATE, file->fd, offset);\n        if ((intptr_t)address == -1)\n            return NULL;\n\n        s_MappedAddressToMappedLength[address] = length;\n\n        return address;\n    }\n\n    void MemoryMappedFile::Unmap(void* address, size_t length)\n    {\n        os::FastAutoLock lock(&s_Mutex);\n\n        if (length == 0)\n        {\n            std::map<void*, int64_t>::iterator entry = s_MappedAddressToMappedLength.find(address);\n            if (entry != s_MappedAddressToMappedLength.end())\n                length = entry->second;\n        }\n\n        int error = munmap(address, length);\n        IL2CPP_ASSERT(error == 0);\n        (void)error; // Avoid an unused variable warning\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/MutexImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_THREADS_PTHREAD\n\n#include \"MutexImpl.h\"\n#include \"PosixHelpers.h\"\n#include \"os/Thread.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    MutexImpl::MutexImpl()\n        : posix::PosixWaitObject(kMutex)\n        , m_OwningThread(NULL)\n        , m_RecursionCount(0)\n    {\n        // For a mutex, 1 means unlocked.\n        m_Count = 1;\n    }\n\n    void MutexImpl::Lock(bool interruptible)\n    {\n        TryLock(posix::kNoTimeout, interruptible);\n    }\n\n    bool MutexImpl::TryLock(uint32_t milliseconds, bool interruptible)\n    {\n        Thread* currentThread = Thread::GetCurrentThread();\n        if (m_OwningThread == currentThread)\n        {\n            IL2CPP_ASSERT(m_Count == 0);\n            ++m_RecursionCount;\n            return true;\n        }\n\n        if (Wait(milliseconds, interruptible) == kWaitStatusSuccess)\n        {\n            m_OwningThread = currentThread;\n            m_RecursionCount = 1;\n            return true;\n        }\n\n        return false;\n    }\n\n    void MutexImpl::Unlock()\n    {\n        IL2CPP_ASSERT(m_OwningThread == Thread::GetCurrentThread());\n\n        // Undo one locking level.\n        --m_RecursionCount;\n        if (m_RecursionCount > 0)\n        {\n            // Still locked.\n            return;\n        }\n\n        // Ok, we're releasing the mutex. Lock and signal. We don't absolutely\n        // need the lock as we are already owning the mutex here but play it safe.\n        posix::PosixAutoLock lock(&m_Mutex);\n\n        IL2CPP_ASSERT(m_Count == 0);\n        m_Count = 1; // Unintuitive but 1 means unlocked.\n        m_OwningThread = NULL;\n\n        // Signal condition so that either a thread that's already waiting or a thread that\n        // comes around later and waits can claim the mutex.\n        if (HaveWaitingThreads())\n            pthread_cond_signal(&m_Condition);\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/MutexImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_THREADS_PTHREAD\n\n#include \"os/ErrorCodes.h\"\n#include \"os/WaitStatus.h\"\n#include \"PosixWaitObject.h\"\n\n#include <pthread.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class Thread;\n\n    class MutexImpl : public posix::PosixWaitObject\n    {\n    public:\n        MutexImpl();\n\n        void Lock(bool interruptible);\n        bool TryLock(uint32_t milliseconds, bool interruptible);\n        void Unlock();\n\n    private:\n        /// Thread that currently owns the object. Used for recursion checks.\n        Thread* m_OwningThread;\n\n        /// Number of recursive locks on the owning thread.\n        uint32_t m_RecursionCount;\n    };\n\n    class FastMutexImpl\n    {\n    public:\n\n        FastMutexImpl()\n        {\n            pthread_mutexattr_t attr;\n            pthread_mutexattr_init(&attr);\n            pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);\n            pthread_mutex_init(&m_Mutex, &attr);\n            pthread_mutexattr_destroy(&attr);\n        }\n\n        ~FastMutexImpl()\n        {\n            pthread_mutex_destroy(&m_Mutex);\n        }\n\n        void Lock()\n        {\n            pthread_mutex_lock(&m_Mutex);\n        }\n\n        void Unlock()\n        {\n            pthread_mutex_unlock(&m_Mutex);\n        }\n\n        pthread_mutex_t* GetOSHandle()\n        {\n            return &m_Mutex;\n        }\n\n    private:\n        pthread_mutex_t m_Mutex;\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/NativeMethods.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include \"os/NativeMethods.h\"\n#include \"os/Process.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    bool NativeMethods::CloseProcess(ProcessHandle* handle)\n    {\n        NOT_IMPLEMENTED_ICALL(NativeMethods::CloseProcess);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    bool NativeMethods::GetExitCodeProcess(ProcessHandle* handle, int32_t* exitCode)\n    {\n        NOT_IMPLEMENTED_ICALL(NativeMethods::GetExitCodeProcess);\n        IL2CPP_UNREACHABLE;\n        return false;\n    }\n\n    int32_t NativeMethods::GetCurrentProcessId()\n    {\n        return Process::GetCurrentProcessId();\n    }\n\n    ProcessHandle* NativeMethods::GetCurrentProcess()\n    {\n        return Process::GetProcess(Process::GetCurrentProcessId());\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Path.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n#include \"os/Environment.h\"\n#include \"os/Path.h\"\n#include <string>\n\n#if defined(__APPLE__)\n#include \"mach-o/dyld.h\"\n#elif IL2CPP_TARGET_LINUX || IL2CPP_TARGET_ANDROID\n#include <linux/limits.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <stdio.h>\n#endif\n\nnamespace il2cpp\n{\nnamespace os\n{\n    std::string Path::GetExecutablePath()\n    {\n#if defined(__APPLE__)\n        char path[1024];\n        uint32_t size = sizeof(path);\n        if (_NSGetExecutablePath(path, &size) == 0)\n            return path;\n\n        std::string result;\n        result.resize(size + 1);\n        _NSGetExecutablePath(&result[0], &size);\n        return result;\n#elif IL2CPP_TARGET_LINUX || IL2CPP_TARGET_ANDROID\n        char path[PATH_MAX];\n        char dest[PATH_MAX];\n        struct stat info;\n        pid_t pid = getpid();\n        sprintf(path, \"/proc/%d/exe\", pid);\n        if (readlink(path, dest, PATH_MAX) == -1)\n            return std::string();\n        return dest;\n#else\n        return std::string();\n#endif\n    }\n\n    std::string Path::GetTempPath()\n    {\n        static const char* tmpdirs[] = { \"TMPDIR\", \"TMP\", \"TEMP\", NULL};\n\n        for (size_t i = 0; tmpdirs[i] != NULL; ++i)\n        {\n            std::string tmpdir = Environment::GetEnvironmentVariable(tmpdirs[i]);\n\n            if (!tmpdir.empty())\n                return tmpdir;\n        }\n\n#if IL2CPP_TARGET_ANDROID\n        return std::string(\"/data/local/tmp\");\n#else\n        return std::string(\"/tmp\");\n#endif\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/PosixHelpers.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include <sys/errno.h>\n\n#include \"os/Posix/PosixHelpers.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace posix\n{\n    int Poll(pollfd* handles, int numHandles, int timeout)\n    {\n        int32_t ret = 0;\n        time_t start = time(NULL);\n\n        timeout = (timeout >= 0) ? (timeout / 1000) : -1;\n        do\n        {\n            ret = poll(handles, numHandles, timeout);\n\n            if (timeout > 0 && ret < 0)\n            {\n                const int32_t err = errno;\n                const int32_t sec = time(NULL) - start;\n\n                timeout -= sec * 1000;\n\n                if (timeout < 0)\n                    timeout = 0;\n\n                errno = err;\n            }\n        }\n        while (ret == -1 && errno == EINTR);\n\n        return ret;\n    }\n}\n}\n}\n\n#endif // IL2CPP_TARGET_POSIX\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/PosixHelpers.h",
    "content": "#pragma once\n\n#if IL2CPP_TARGET_POSIX\n\n#include <pthread.h>\n#include <time.h>\n#include <sys/poll.h>\n#include \"os/Thread.h\"\n#include \"os/Socket.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace posix\n{\n    inline timespec MillisecondsToTimespec(uint32_t ms)\n    {\n        timespec result;\n        result.tv_sec = ms / 1000;\n        result.tv_nsec = (ms % 1000) * 1000000;\n        return result;\n    }\n\n    inline Thread::ThreadId PosixThreadIdToThreadId(pthread_t thread)\n    {\n        Thread::ThreadId threadId = 0;\n        memcpy(&threadId, &thread, std::min(sizeof(threadId), sizeof(thread)));\n        return threadId;\n    }\n\n    struct PosixAutoLock\n    {\n        pthread_mutex_t* mutex;\n        PosixAutoLock(pthread_mutex_t* m)\n            : mutex(m) { pthread_mutex_lock(mutex); }\n        ~PosixAutoLock()\n        { pthread_mutex_unlock(mutex); }\n    };\n\n\n    inline short PollFlagsToPollEvents(PollFlags flags)\n    {\n        return (short)flags;\n    }\n\n    inline PollFlags PollEventsToPollFlags(short events)\n    {\n        return (PollFlags)events;\n    }\n\n    int Poll(pollfd* handles, int numHandles, int timeout);\n}\n}\n}\n\n#endif // IL2CPP_TARGET_POSIX\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/PosixWaitObject.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include <cerrno>\n#include <ctime>\n\n#include \"PosixWaitObject.h\"\n#include \"PosixHelpers.h\"\n#include \"ThreadImpl.h\"\n#include \"os/Time.h\"\n\n\n// Notes:\n// - Situation\n//   - None of the pthread APIs are interruptible (they all explicitly forbid returning EINTR).\n//   - We cannot do any non-local transfers of control from signal handlers safely (C++ exceptions\n//     or longjmp). Thus we cannot use signals to inject interruptions into a thread.\n//   - Very few of the system APIs we have available support timeouts (at least not on all platforms).\n// - Ergo: we need to roll our own synchronization primitives based on pthread condition variables\n//     (they support timeouts and have the functionality needed to model the other primitives).\n// - BUT: the condition variables still involve mutexes which we cannot lock in way that allows\n//     interruptions. This means that there will be time windows where threads will wait and just\n//     block and not allow interruption.\n\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace posix\n{\n    static pthread_mutex_t s_WaitObjectDeletionLock = PTHREAD_MUTEX_INITIALIZER;\n\n    PosixWaitObject::PosixWaitObject(Type type)\n        : m_Type(type)\n        , m_Count(0)\n        , m_WaitingThreadCount(0)\n    {\n        pthread_mutex_init(&m_Mutex, NULL);\n#if IL2CPP_TARGET_JAVASCRIPT\n        ////FIXME: WebGL bombs in pthread_cond_init() with non-NULL attributes ATM.\n        //// We need to fix this once we have proper pthreads on Emscripten. Right now\n        //// this will set up the condition variable incorrectly.\n        pthread_cond_init(&m_Condition, NULL);\n#elif !IL2CPP_USE_POSIX_COND_TIMEDWAIT_REL\n        // Initialize condition to use CLOCK_MONOTONIC instead of CLOCK_REALTIME.\n        pthread_condattr_t attr;\n        int result = pthread_condattr_init(&attr);\n        pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);\n        pthread_cond_init(&m_Condition, &attr);\n        pthread_condattr_destroy(&attr);\n        pthread_cond_init(&m_Condition, NULL);\n#else\n        // On OSX and iOS we can use pthread_cond_timedwait_relative_np.\n        pthread_cond_init(&m_Condition, NULL);\n#endif\n    }\n\n    PosixWaitObject::~PosixWaitObject()\n    {\n        // Make sure it's okay to delete wait objects.\n        AutoLockWaitObjectDeletion lockDeletion;\n\n        pthread_mutex_destroy(&m_Mutex);\n        pthread_cond_destroy(&m_Condition);\n    }\n\n    void PosixWaitObject::LockWaitObjectDeletion()\n    {\n        pthread_mutex_lock(&s_WaitObjectDeletionLock);\n    }\n\n    void PosixWaitObject::UnlockWaitObjectDeletion()\n    {\n        pthread_mutex_unlock(&s_WaitObjectDeletionLock);\n    }\n\n    WaitStatus PosixWaitObject::Wait(bool interruptible)\n    {\n        return Wait(kNoTimeout, interruptible);\n    }\n\n    WaitStatus PosixWaitObject::Wait(uint32_t timeoutMS, bool interruptible)\n    {\n        // IMPORTANT: This function must be exception-safe! APCs may throw.\n\n        ThreadImpl* currentThread = ThreadImpl::GetCurrentThread();\n\n        // Do up-front check about pending APC except this is a zero-timeout\n        // wait (i.e. a wait that is never supposed to block and thus go into\n        // an interruptible state).\n        if (interruptible && timeoutMS != 0)\n            currentThread->CheckForUserAPCAndHandle();\n\n        // Lock object. We release this mutex during waiting.\n        posix::PosixAutoLock lock(&m_Mutex);\n\n        // See if the object is in a state where we can acquire it right away.\n        if (m_Count == 0)\n        {\n            // No, hasn't. If we're not supposed to wait, we're done.\n            if (timeoutMS == 0)\n                return kWaitStatusTimeout;\n\n            try\n            {\n                // We should wait. Let the world know this thread is now waiting\n                // on this object.\n                if (interruptible)\n                    currentThread->SetWaitObject(this);\n\n                // Check APC queue again to avoid race condition.\n                if (interruptible)\n                    currentThread->CheckForUserAPCAndHandle();\n\n                // Go into wait until we either have a release or timeout or otherwise fail.\n                uint32_t remainingWaitTime = timeoutMS;\n                WaitStatus waitStatus = kWaitStatusSuccess;\n                while (m_Count == 0)\n                {\n                    if (timeoutMS == posix::kNoTimeout)\n                    {\n                        // Infinite wait. Can only be interrupted by APC.\n                        ++m_WaitingThreadCount; // No synchronization necessary; we hold the mutex.\n                        int status = pthread_cond_wait(&m_Condition, &m_Mutex);\n                        --m_WaitingThreadCount;\n\n                        if (status != 0)\n                        {\n                            waitStatus = kWaitStatusFailure;\n                            break;\n                        }\n                    }\n                    else\n                    {\n                        // Timed wait. Can be interrupted by APC or timeout.\n                        uint32_t waitStartTime = Time::GetTicksMillisecondsMonotonic();\n                        timespec timeout = posix::MillisecondsToTimespec(remainingWaitTime);\n\n#if !IL2CPP_USE_POSIX_COND_TIMEDWAIT_REL\n                        ////NOTE: this codepath has not been tested!\n                        timespec waitStartTimeSpec = posix::MillisecondsToTimespec(waitStartTime);\n                        timeout.tv_sec += waitStartTimeSpec.tv_sec;\n                        timeout.tv_nsec += waitStartTimeSpec.tv_nsec;\n#endif\n\n                        ++m_WaitingThreadCount;\n#if !IL2CPP_USE_POSIX_COND_TIMEDWAIT_REL\n                        // For plain POSIX, do an absolute timed wait.\n                        int status = pthread_cond_timedwait(&m_Condition, &m_Mutex, &timeout);\n#else\n                        // For OSX and iOS, do a relative timed wait.\n                        int status = pthread_cond_timedwait_relative_np(&m_Condition, &m_Mutex, &timeout);\n#endif\n                        --m_WaitingThreadCount; ////TODO: make this atomic for when we fail to reacquire the mutex\n\n                        if (status == ETIMEDOUT)\n                        {\n                            waitStatus = kWaitStatusTimeout;\n                            break;\n                        }\n                        else if (status != 0)\n                        {\n                            waitStatus = kWaitStatusFailure;\n                            break;\n                        }\n\n                        // Update time we have have left to wait.\n                        uint32_t waitTimeThisRound = Time::GetTicksMillisecondsMonotonic() - waitStartTime;\n                        if (waitTimeThisRound > remainingWaitTime)\n                            remainingWaitTime = 0;\n                        else\n                            remainingWaitTime -= waitTimeThisRound;\n                    }\n\n                    // We've received a signal but it may be because of an APC and not because\n                    // the semaphore got signaled. If so, handle the APC and go back to waiting.\n                    if (interruptible)\n                        currentThread->CheckForUserAPCAndHandle();\n                }\n\n                // We're done waiting so untie us from the current thread.\n                // NOTE: A thread may have grabbed us and then got paused. If we return now and then our owner\n                //       tries to delete us, we would pull the rug from under the other thread. This is prevented by\n                //       having a central lock on wait object deletion which any thread trying to deal with wait\n                //       objects from other threads has to acquire.\n                if (interruptible)\n                {\n                    currentThread->SetWaitObject(NULL);\n\n                    // Avoid race condition by checking APC queue again after unsetting wait object.\n                    currentThread->CheckForUserAPCAndHandle();\n                }\n\n                // If we failed, bail out now.\n                if (waitStatus != kWaitStatusSuccess)\n                    return waitStatus;\n            }\n            catch (...)\n            {\n                if (interruptible)\n                    currentThread->SetWaitObject(NULL);\n                throw;\n            }\n        }\n\n        // At this point, we should be in signaled state and have the lock on\n        // the object.\n\n        // Object has been released. Acquire it for this thread.\n        IL2CPP_ASSERT(m_Count > 0);\n        switch (m_Type)\n        {\n            case kManualResetEvent:\n                // Nothing to do.\n                break;\n\n            case kMutex:\n            case kAutoResetEvent:\n                m_Count = 0;\n                break;\n\n            case kSemaphore:\n                if (m_Count > 0) // Defensive.\n                {\n                    --m_Count;\n                    if (m_Count > 0)\n                    {\n                        // There's more releases on the semaphore. Signal the next thread in line.\n                        if (HaveWaitingThreads())\n                            pthread_cond_signal(&m_Condition);\n                    }\n                }\n                break;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    void PosixWaitObject::InterruptWait()\n    {\n        pthread_cond_broadcast(&m_Condition);\n    }\n}\n}\n}\n\n#endif // IL2CPP_TARGET_POSIX\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/PosixWaitObject.h",
    "content": "#pragma once\n\n#if IL2CPP_TARGET_POSIX\n\n#include <pthread.h>\n#include <limits.h>\n#include \"utils/NonCopyable.h\"\n#include \"os/WaitStatus.h\"\n\n\n#if (IL2CPP_USE_POSIX_COND_TIMEDWAIT_REL)\nint     pthread_cond_timedwait_relative_np(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *spec);\n#endif\n\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class ThreadImpl;\n\nnamespace posix\n{\n    const uint32_t kNoTimeout = UINT_MAX;\n\n\n////TODO: generalize this so that it can be used with c++11 condition variables\n\n\n/// Base class for all synchronization primitives when running on POSIX.\n///\n/// To support interruption and timeouts for all synchronization primitives (events, mutexes, and\n/// semaphores) we implement these primitives ourselves instead of using their standard POSIX/Mach\n/// system counterparts. See PosixWaitObject.cpp for an explanation why.\n    class PosixWaitObject : public il2cpp::utils::NonCopyable\n    {\n    public:\n\n        ~PosixWaitObject();\n\n        WaitStatus Wait(bool interruptible = false);\n        WaitStatus Wait(uint32_t ms, bool interruptible = false);\n\n        /// Cause an ongoing blocking wait on this object to exit and check for pending APCs.\n        /// If the object is not currently being waited on, will cause the next wait to exit\n        /// right away and check for APCs. After APCs have been handled, the object will go\n        /// back to waiting except if the wait timeout has expired.\n        void InterruptWait();\n\n        static void LockWaitObjectDeletion();\n        static void UnlockWaitObjectDeletion();\n\n    protected:\n\n        enum Type\n        {\n            kMutex, /// All mutexes are recursive.\n            kManualResetEvent,\n            kAutoResetEvent,\n            kSemaphore\n        };\n\n        PosixWaitObject(Type type);\n\n        Type m_Type;\n\n        /// Always have to acquire this mutex to touch m_Count.\n        pthread_mutex_t m_Mutex;\n\n        /// Signal other threads of changes to m_Count.\n        pthread_cond_t m_Condition;\n\n        /// \"Release\" count for the primitive. Means different things depending on the type of primitive\n        /// but for all primitives, we wait until this is zero. Semaphores are the only primitive for which\n        /// this can go past 1.\n        uint32_t m_Count;\n\n        /// Number of threads waiting on this object. This is used to prevent unnecessary signals\n        /// on m_Condition.\n        uint32_t m_WaitingThreadCount;\n\n        bool HaveWaitingThreads() const { return (m_WaitingThreadCount != 0); }\n    };\n\n    struct AutoLockWaitObjectDeletion\n    {\n        AutoLockWaitObjectDeletion() { PosixWaitObject::LockWaitObjectDeletion(); }\n        ~AutoLockWaitObjectDeletion() { PosixWaitObject::UnlockWaitObjectDeletion(); }\n    };\n}\n}\n}\n\n#endif // IL2CPP_TARGET_POSIX\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Process.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX && !IL2CPP_TARGET_DARWIN\n\n#include <sys/types.h>\n#include <unistd.h>\n\n#include \"os/Process.h\"\n#include \"vm/Exception.h\"\n\n#include \"il2cpp-vm-support.h\"\n\nstruct ProcessHandle\n{\n    pid_t pid;\n};\n\nnamespace il2cpp\n{\nnamespace os\n{\n    int Process::GetCurrentProcessId()\n    {\n        return getpid();\n    }\n\n    ProcessHandle* Process::GetProcess(int processId)\n    {\n        // If/when we implement the CreateProcess_internal icall we will likely\n        // need to so something smarter here to find the process if we did\n        // not create it and return a known pseudo-handle. For now this\n        // is sufficient though.\n        return (ProcessHandle*)(intptr_t)processId;\n    }\n\n    void Process::FreeProcess(ProcessHandle* handle)\n    {\n        // We have nothing to do here.\n    }\n\n    std::string Process::GetProcessName(ProcessHandle* handle)\n    {\n        IL2CPP_VM_NOT_SUPPORTED(Process::GetProcessName, \"GetProcessName is not supported for non-Windows/OSX desktop platforms\");\n        return std::string();\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/SemaphoreImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_THREADS_PTHREAD\n\n#include <errno.h>\n#include <limits>\n\n#include \"SemaphoreImpl.h\"\n#include \"ThreadImpl.h\"\n#include \"PosixHelpers.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    SemaphoreImpl::SemaphoreImpl(int32_t initialValue, int32_t maximumValue)\n        : posix::PosixWaitObject(kSemaphore)\n        , m_MaximumValue(maximumValue)\n    {\n        m_Count = initialValue;\n    }\n\n    bool SemaphoreImpl::Post(int32_t releaseCount, int32_t* previousCount)\n    {\n        uint32_t oldCount;\n        {\n            posix::PosixAutoLock lock(&m_Mutex);\n\n            oldCount = m_Count;\n\n            // Make sure we stay within range. Account for 32bit overflow.\n            if (static_cast<uint64_t>(oldCount) + releaseCount > m_MaximumValue)\n                return false;\n\n            m_Count += releaseCount;\n\n            pthread_cond_signal(&m_Condition);\n        }\n\n        if (previousCount)\n            *previousCount = oldCount;\n\n        return true;\n    }\n}\n}\n\n#endif // IL2CPP_THREADS_PTHREAD\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/SemaphoreImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_THREADS_PTHREAD\n\n#include \"PosixWaitObject.h\"\n#include \"os/ErrorCodes.h\"\n#include \"os/WaitStatus.h\"\n\n#include <semaphore.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class SemaphoreImpl : public posix::PosixWaitObject\n    {\n    public:\n        SemaphoreImpl(int32_t initialValue, int32_t maximumValue);\n\n        bool Post(int32_t releaseCount, int32_t* previousCount);\n\n    protected:\n        uint32_t m_MaximumValue;\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/SocketImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if !IL2CPP_USE_GENERIC_SOCKET_IMPL && IL2CPP_TARGET_POSIX\n\n// enable support for AF_UNIX and socket paths\n#define SUPPORT_UNIXSOCKETS (1)\n\n// some platforms require a different function to close sockets\n#define SOCK_CLOSE close\n\n// allow option include file to configure platform\n#if IL2CPP_USE_POSIX_SOCKET_PLATFORM_CONFIG\n#include \"SocketImplPlatformConfig.h\"\n#endif\n\n#include <string.h>\n#include <unistd.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n#include <sys/ioctl.h>\n#include <net/if.h>\n#include <netdb.h>\n#include <arpa/inet.h>\n#include <errno.h>\n#include <fcntl.h>\n #if SUPPORT_UNIXSOCKETS\n#include <sys/un.h>\n#endif\n#include <sys/poll.h>\n#include <sys/stat.h>\n\n#if IL2CPP_TARGET_LINUX || IL2CPP_TARGET_ANDROID || IL2CPP_TARGET_TIZEN\n#include <sys/sendfile.h>\n#endif\n\n#include \"os/Error.h\"\n#include \"os/Socket.h\"\n#include \"os/ErrorCodes.h\"\n#include \"os/Posix/Error.h\"\n#include \"os/Posix/PosixHelpers.h\"\n#include \"os/Posix/SocketImpl.h\"\n#include \"os/Posix/ThreadImpl.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Exception.h\"\n\n#include \"il2cpp-vm-support.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    static bool is_loopback(int32_t family, uint8_t *addr)\n    {\n        if (family == AF_INET)\n            return addr[0] == 127;\n#if IL2CPP_SUPPORT_IPV6\n        else if (family == AF_INET6)\n            return (IN6_IS_ADDR_LOOPBACK((struct in6_addr *)addr));\n#endif\n        return false;\n    }\n\n    static struct in_addr *get_local_ips(int32_t family, int32_t *nips)\n    {\n        const int32_t max_ifaces = 50; // 50 interfaces should be enough ...\n\n        *nips = 0;\n\n        if (family != AF_INET)\n            return NULL;\n\n        int32_t addr_size = 0;\n        int32_t offset = 0;\n        if (family == AF_INET)\n        {\n            addr_size = sizeof(struct in_addr);\n            offset = offsetof(struct sockaddr_in, sin_addr);\n#if IL2CPP_SUPPORT_IPV6\n        }\n        else if (family == AF_INET6)\n        {\n            addr_size = sizeof(struct in6_addr);\n            offset = offsetof(struct sockaddr_in6, sin6_addr);\n#endif\n        }\n        else\n        {\n            return NULL;\n        }\n\n        int32_t fd = socket(family, SOCK_STREAM, 0);\n\n        struct ifconf ifc;\n        ifc.ifc_len = max_ifaces * sizeof(struct ifreq);\n        ifc.ifc_buf = (char*)malloc(ifc.ifc_len);\n\n        if (ioctl(fd, SIOCGIFCONF, &ifc) < 0)\n        {\n            close(fd);\n            free(ifc.ifc_buf);\n            return NULL;\n        }\n\n        int32_t count = ifc.ifc_len / sizeof(struct ifreq);\n        *nips = count;\n        if (count == 0)\n        {\n            free(ifc.ifc_buf);\n            close(fd);\n            return NULL;\n        }\n\n        int32_t i;\n        struct ifreq *ifr;\n        struct ifreq iflags;\n        bool ignore_loopback = false;\n\n        for (i = 0, ifr = ifc.ifc_req; i < *nips; i++, ifr++)\n        {\n            strcpy(iflags.ifr_name, ifr->ifr_name);\n            if (ioctl(fd, SIOCGIFFLAGS, &iflags) < 0)\n                continue;\n\n            if ((iflags.ifr_flags & IFF_UP) == 0)\n            {\n                ifr->ifr_name[0] = '\\0';\n                continue;\n            }\n\n            if ((iflags.ifr_flags & IFF_LOOPBACK) == 0)\n                ignore_loopback = true;\n        }\n\n        close(fd);\n\n        uint8_t *result = (uint8_t*)malloc(addr_size * count);\n        uint8_t *tmp_ptr = result;\n\n        for (i = 0, ifr = ifc.ifc_req; i < count; i++, ifr++)\n        {\n            if (ifr->ifr_name[0] == '\\0')\n            {\n                (*nips)--;\n                continue;\n            }\n\n            if (ignore_loopback && is_loopback(family, ((uint8_t*)&ifr->ifr_addr) + offset))\n            {\n                (*nips)--;\n                continue;\n            }\n\n            memcpy(tmp_ptr, ((uint8_t*)&ifr->ifr_addr) + offset, addr_size);\n            tmp_ptr += addr_size;\n        }\n\n        free(ifc.ifc_buf);\n        return (struct in_addr *)result;\n    }\n\n    static bool hostent_get_info(struct hostent *he, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n        if (he == NULL)\n            return false;\n\n        if (he->h_length != 4 || he->h_addrtype != AF_INET)\n            return false;\n\n        name.assign(he->h_name);\n\n        for (int32_t i = 0; he->h_aliases[i] != NULL; ++i)\n            aliases.push_back(he->h_aliases[i]);\n\n        for (int32_t i = 0; he->h_addr_list[i] != NULL; ++i)\n            addr_list.push_back(\n                utils::StringUtils::NPrintf(\"%u.%u.%u.%u\", 16,\n                    (uint8_t)he->h_addr_list[i][0],\n                    (uint8_t)he->h_addr_list[i][1],\n                    (uint8_t)he->h_addr_list[i][2],\n                    (uint8_t)he->h_addr_list[i][3]));\n\n        return true;\n    }\n\n    static bool hostent_get_info_with_local_ips(struct hostent *he, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n        int32_t nlocal_in = 0;\n\n        if (he != NULL)\n        {\n            if (he->h_length != 4 || he->h_addrtype != AF_INET)\n                return false;\n\n            name.assign(he->h_name);\n\n            for (int32_t i = 0; he->h_aliases[i] != NULL; ++i)\n                aliases.push_back(he->h_aliases[i]);\n        }\n\n        struct in_addr *local_in = get_local_ips(AF_INET, &nlocal_in);\n\n        if (nlocal_in)\n        {\n            for (int32_t i = 0; i < nlocal_in; ++i)\n            {\n                const uint8_t *ptr = (uint8_t*)&local_in[i];\n\n                addr_list.push_back(\n                    utils::StringUtils::NPrintf(\"%u.%u.%u.%u\", 16,\n                        (uint8_t)ptr[0],\n                        (uint8_t)ptr[1],\n                        (uint8_t)ptr[2],\n                        (uint8_t)ptr[3]));\n            }\n\n            free(local_in);\n        }\n        else if (he == NULL)\n        {\n            // If requesting \"\" and there are no other interfaces up, MS returns 127.0.0.1\n            addr_list.push_back(\"127.0.0.1\");\n            return true;\n        }\n\n        if (nlocal_in == 0 && he != NULL)\n        {\n            for (int32_t i = 0; he->h_addr_list[i] != NULL; ++i)\n            {\n                addr_list.push_back(\n                    utils::StringUtils::NPrintf(\"%u.%u.%u.%u\", 16,\n                        (uint8_t)he->h_addr_list[i][0],\n                        (uint8_t)he->h_addr_list[i][1],\n                        (uint8_t)he->h_addr_list[i][2],\n                        (uint8_t)he->h_addr_list[i][3]));\n            }\n        }\n\n        return true;\n    }\n\n    static int32_t convert_socket_flags(os::SocketFlags flags)\n    {\n        int32_t c_flags = 0;\n\n        if (flags)\n        {\n            // Check if contains invalid flag values\n            if (flags & ~(os::kSocketFlagsOutOfBand | os::kSocketFlagsMaxIOVectorLength | os::kSocketFlagsPeek | os::kSocketFlagsDontRoute | os::kSocketFlagsPartial))\n            {\n                return -1;\n            }\n    #ifdef MSG_OOB\n            if (flags & os::kSocketFlagsOutOfBand)\n                c_flags |= MSG_OOB;\n    #endif\n            if (flags & os::kSocketFlagsPeek)\n                c_flags |= MSG_PEEK;\n\n            if (flags & os::kSocketFlagsDontRoute)\n                c_flags |= MSG_DONTROUTE;\n\n            // Ignore Partial - see bug 349688.  Don't return -1, because\n            // according to the comment in that bug ms runtime doesn't for\n            // UDP sockets (this means we will silently ignore it for TCP\n            // too)\n\n    #ifdef MSG_MORE\n            if (flags & os::kSocketFlagsPartial)\n                c_flags |= MSG_MORE;\n    #endif\n        }\n\n        return c_flags;\n    }\n\n    void SocketImpl::Startup()\n    {\n    }\n\n    void SocketImpl::Cleanup()\n    {\n    }\n\n#if IL2CPP_SUPPORT_IPV6\n    static void AddrinfoGetAddresses(struct addrinfo *info, std::string& name, bool add_local_ips,\n        std::vector<std::string> &addr_list)\n    {\n        if (add_local_ips)\n        {\n            int nlocal_in = 0;\n            int nlocal_in6 = 0;\n            in_addr* local_in = (struct in_addr *)get_local_ips(AF_INET, &nlocal_in);\n            in6_addr* local_in6 = (struct in6_addr *)get_local_ips(AF_INET6, &nlocal_in6);\n            if (nlocal_in || nlocal_in6)\n            {\n                if (nlocal_in)\n                {\n                    for (int i = 0; i < nlocal_in; i++)\n                    {\n                        char addr[16];\n                        inet_ntop(AF_INET, &local_in[i], addr, sizeof(addr));\n                        addr_list.push_back(std::string(addr));\n                    }\n                }\n\n                if (nlocal_in6)\n                {\n                    for (int i = 0; i < nlocal_in6; i++)\n                    {\n                        char addr[48];\n                        const char* ret = inet_ntop(AF_INET6, &local_in6[i], addr, sizeof(addr));\n                        if (ret != NULL)\n                            addr_list.push_back(std::string(addr));\n                    }\n                }\n            }\n\n            free(local_in);\n            free(local_in6);\n        }\n\n        bool nameSet = false;\n        for (addrinfo* ai = info; ai != NULL; ai = ai->ai_next)\n        {\n            const char *ret;\n            char buffer[48]; /* Max. size for IPv6 */\n\n            if ((ai->ai_family != PF_INET) && (ai->ai_family != PF_INET6))\n                continue;\n\n            if (ai->ai_family == PF_INET)\n                ret = inet_ntop(ai->ai_family, (void*)&(((struct sockaddr_in*)ai->ai_addr)->sin_addr), buffer, 16);\n            else\n                ret = inet_ntop(ai->ai_family, (void*)&(((struct sockaddr_in6*)ai->ai_addr)->sin6_addr), buffer, 48);\n\n            if (ret)\n                addr_list.push_back(std::string(buffer));\n            else\n                addr_list.push_back(std::string());\n\n            if (!nameSet)\n            {\n                if (ai->ai_canonname != NULL)\n                    name = std::string(ai->ai_canonname);\n                else\n                    name = std::string();\n\n                nameSet = true;\n            }\n        }\n    }\n\n    WaitStatus GetAddressInfo(const char* hostname, bool add_local_ips, std::string &name, std::vector<std::string> &addr_list)\n    {\n        addrinfo *info = NULL;\n\n        addrinfo hints;\n        memset(&hints, 0, sizeof(hints));\n\n        // Here Mono inspects the ipv4Supported and ipv6Supported properties on the managed Socket class.\n        // This seems to be unnecessary though, as we can use PF_UNSPEC in all cases, and getaddrinfo works.\n        hints.ai_family = PF_UNSPEC;\n        hints.ai_socktype = SOCK_STREAM;\n        hints.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;\n\n        if (*hostname && getaddrinfo(hostname, NULL, &hints, &info) == -1)\n            return kWaitStatusFailure;\n\n        AddrinfoGetAddresses(info, name, add_local_ips, addr_list);\n\n        if (info)\n            freeaddrinfo(info);\n\n        if (name.empty())\n            name.assign(hostname);\n\n        return kWaitStatusSuccess;\n    }\n\n#endif\n\n    WaitStatus SocketImpl::GetHostByAddr(const std::string &address, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n#if IL2CPP_SUPPORT_IPV6\n        struct sockaddr_in saddr;\n        struct sockaddr_in6 saddr6;\n        int32_t family;\n        char hostname[1024] = {0};\n        int flags = 0;\n\n        if (inet_pton(AF_INET, address.c_str(), &saddr.sin_addr) <= 0)\n        {\n            /* Maybe an ipv6 address */\n            if (inet_pton(AF_INET6, address.c_str(), &saddr6.sin6_addr) <= 0)\n            {\n                return kWaitStatusFailure;\n            }\n            else\n            {\n                family = AF_INET6;\n                saddr6.sin6_family = AF_INET6;\n            }\n        }\n        else\n        {\n            family = AF_INET;\n            saddr.sin_family = AF_INET;\n        }\n\n        if (family == AF_INET)\n        {\n#if HAVE_SOCKADDR_IN_SIN_LEN\n            saddr.sin_len = sizeof(saddr);\n#endif\n            if (getnameinfo((struct sockaddr*)&saddr, sizeof(saddr),\n                    hostname, sizeof(hostname), NULL, 0,\n                    flags) != 0)\n            {\n                return kWaitStatusFailure;\n            }\n        }\n        else if (family == AF_INET6)\n        {\n#if HAVE_SOCKADDR_IN6_SIN_LEN\n            saddr6.sin6_len = sizeof(saddr6);\n#endif\n            if (getnameinfo((struct sockaddr*)&saddr6, sizeof(saddr6),\n                    hostname, sizeof(hostname), NULL, 0,\n                    flags) != 0)\n            {\n                return kWaitStatusFailure;\n            }\n        }\n\n        return GetAddressInfo(hostname, false, name, addr_list);\n#else\n        struct in_addr inaddr;\n        if (inet_pton(AF_INET, address.c_str(), &inaddr) <= 0)\n            return kWaitStatusFailure;\n\n        struct hostent *he = gethostbyaddr((char*)&inaddr, sizeof(inaddr), AF_INET);\n\n        if (he == NULL)\n        {\n            name = address;\n            addr_list.push_back(name);\n\n            return kWaitStatusSuccess;\n        }\n\n        return hostent_get_info(he, name, aliases, addr_list)\n            ? kWaitStatusSuccess\n            : kWaitStatusFailure;\n#endif\n    }\n\n    WaitStatus SocketImpl::GetHostByName(const std::string &host, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n        char this_hostname[256] = {0};\n\n        const char *hostname = host.c_str();\n        bool add_local_ips = (*hostname == '\\0');\n\n        if (!add_local_ips && gethostname(this_hostname, sizeof(this_hostname)) != -1)\n        {\n            if (!strcmp(hostname, this_hostname))\n                add_local_ips = true;\n        }\n\n#if IL2CPP_SUPPORT_IPV6\n        return GetAddressInfo(hostname, add_local_ips, name, addr_list);\n#else\n        struct hostent *he = NULL;\n        if (*hostname)\n            he = gethostbyname(hostname);\n\n        if (*hostname && he == NULL)\n            return kWaitStatusFailure;\n\n        return (add_local_ips\n                ? hostent_get_info_with_local_ips(he, name, aliases, addr_list)\n                : hostent_get_info(he, name, aliases, addr_list))\n            ? kWaitStatusSuccess\n            : kWaitStatusFailure;\n#endif\n    }\n\n    WaitStatus SocketImpl::GetHostName(std::string &name)\n    {\n        char hostname[256];\n        int32_t ret = gethostname(hostname, sizeof(hostname));\n\n        if (ret == -1)\n            return kWaitStatusFailure;\n\n        name.assign(hostname);\n\n        return kWaitStatusSuccess;\n    }\n\n    SocketImpl::SocketImpl(ThreadStatusCallback thread_status_callback)\n        :   _is_valid(false)\n        ,   _fd(-1)\n        ,   _domain(-1)\n        ,   _type(-1)\n        ,   _protocol(-1)\n        ,   _saved_error(kErrorCodeSuccess)\n        ,   _still_readable(0)\n        ,   _thread_status_callback(thread_status_callback)\n    {\n    }\n\n    SocketImpl::~SocketImpl()\n    {\n    }\n\n    static int32_t convert_address_family(AddressFamily family)\n    {\n        switch (family)\n        {\n            case kAddressFamilyUnspecified:\n                return AF_UNSPEC;\n\n            case kAddressFamilyUnix:\n                return AF_UNIX;\n\n            case kAddressFamilyInterNetwork:\n                return AF_INET;\n#ifdef AF_IPX\n            case kAddressFamilyIpx:\n                return AF_IPX;\n#endif\n#ifdef AF_SNA\n            case kAddressFamilySna:\n                return AF_SNA;\n#endif\n#ifdef AF_DECnet\n            case kAddressFamilyDecNet:\n                return AF_DECnet;\n#endif\n#ifdef AF_APPLETALK\n            case kAddressFamilyAppleTalk:\n                return AF_APPLETALK;\n#endif\n#ifdef AF_INET6\n            case kAddressFamilyInterNetworkV6:\n                return AF_INET6;\n#endif\n#ifdef AF_IRDA\n            case kAddressFamilyIrda:\n                return AF_IRDA;\n#endif\n\n            default:\n                break;\n        }\n\n        return -1;\n    }\n\n    static AddressFamily convert_define_to_address_family(int32_t family)\n    {\n        switch (family)\n        {\n            case AF_UNSPEC:\n                return kAddressFamilyUnspecified;\n\n            case AF_UNIX:\n                return kAddressFamilyUnix;\n\n            case AF_INET:\n                return kAddressFamilyInterNetwork;\n#ifdef AF_IPX\n            case AF_IPX:\n                return kAddressFamilyIpx;\n#endif\n#ifdef AF_SNA\n            case AF_SNA:\n                return kAddressFamilySna;\n#endif\n#ifdef AF_DECnet\n            case AF_DECnet:\n                return kAddressFamilyDecNet;\n#endif\n#ifdef AF_APPLETALK\n            case AF_APPLETALK:\n                return kAddressFamilyAppleTalk;\n#endif\n#ifdef AF_INET6\n            case AF_INET6:\n                return kAddressFamilyInterNetworkV6;\n#endif\n#ifdef AF_IRDA\n            case AF_IRDA:\n                return kAddressFamilyIrda;\n#endif\n\n            default:\n                break;\n        }\n\n        return kAddressFamilyError;\n    }\n\n    static int32_t convert_socket_type(SocketType type)\n    {\n        switch (type)\n        {\n            case kSocketTypeStream:\n                return SOCK_STREAM;\n\n            case kSocketTypeDgram:\n                return SOCK_DGRAM;\n\n            case kSocketTypeRaw:\n                return SOCK_RAW;\n#ifdef SOCK_RDM\n            case kSocketTypeRdm:\n                return SOCK_RDM;\n#endif\n#ifdef SOCK_SEQPACKET\n            case kSocketTypeSeqpacket:\n                return SOCK_SEQPACKET;\n#endif\n            default:\n                break;\n        }\n\n        return -1;\n    }\n\n    static int32_t convert_socket_protocol(ProtocolType protocol)\n    {\n        switch (protocol)\n        {\n            case kProtocolTypeIP:\n            case kProtocolTypeIPv6:\n            case kProtocolTypeIcmp:\n            case kProtocolTypeIgmp:\n            case kProtocolTypeGgp:\n            case kProtocolTypeTcp:\n            case kProtocolTypePup:\n            case kProtocolTypeUdp:\n            case kProtocolTypeIdp:\n                // In this case the enum values map exactly.\n                return (int32_t)protocol;\n\n            default:\n                break;\n        }\n\n        // Everything else in unsupported and unexpected\n        return -1;\n    }\n\n    WaitStatus SocketImpl::Create(AddressFamily family, SocketType type, ProtocolType protocol)\n    {\n        _fd = -1;\n        _is_valid = false;\n        _still_readable = 1;\n        _domain = convert_address_family(family);\n        _type = convert_socket_type(type);\n        _protocol = convert_socket_protocol(protocol);\n\n        IL2CPP_ASSERT(_type != -1 && \"Unsupported socket type\");\n        IL2CPP_ASSERT(_domain != -1 && \"Unsupported address family\");\n        IL2CPP_ASSERT(_protocol != -1 && \"Unsupported protocol type\");\n\n        _fd = socket(_domain, _type, _protocol);\n        if (_fd == -1 && _domain == AF_INET && _type == SOCK_RAW && _protocol == 0)\n        {\n            // Retry with protocol == 4 (see bug #54565)\n            _protocol = 4;\n            _fd = socket(AF_INET, SOCK_RAW, 4);\n        }\n\n        if (_fd == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        // if (fd >= _wapi_fd_reserve)\n        // {\n        //  WSASetLastError (WSASYSCALLFAILURE);\n        //  close (fd);\n\n        //  return(INVALID_SOCKET);\n        // }\n\n        /* .net seems to set this by default for SOCK_STREAM, not for\n         * SOCK_DGRAM (see bug #36322)\n         *\n         * It seems winsock has a rather different idea of what\n         * SO_REUSEADDR means.  If it's set, then a new socket can be\n         * bound over an existing listening socket.  There's a new\n         * windows-specific option called SO_EXCLUSIVEADDRUSE but\n         * using that means the socket MUST be closed properly, or a\n         * denial of service can occur.  Luckily for us, winsock\n         * behaves as though any other system would when SO_REUSEADDR\n         * is true, so we don't need to do anything else here.  See\n         * bug 53992.\n         */\n        {\n            int32_t v = 1;\n            const int32_t ret = setsockopt(_fd, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(v));\n\n            if (ret == -1)\n            {\n                if (SOCK_CLOSE(_fd) == -1)\n                    StoreLastError();\n\n                return kWaitStatusFailure;\n            }\n        }\n\n#if IL2CPP_TARGET_DARWIN\n        int32_t value = 1;\n        setsockopt(_fd, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value));\n#endif\n\n        // mono_once (&socket_ops_once, socket_ops_init);\n\n        // handle = _wapi_handle_new_fd (WAPI_HANDLE_SOCKET, fd, &socket_handle);\n        // if (handle == _WAPI_HANDLE_INVALID) {\n        //  g_warning (\"%s: error creating socket handle\", __func__);\n        //  WSASetLastError (WSASYSCALLFAILURE);\n        //  close (fd);\n\n        //  return(INVALID_SOCKET);\n        // }\n\n        _is_valid = true;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Create(SocketDescriptor fd, int32_t family, int32_t type, int32_t protocol)\n    {\n        _fd = fd;\n        _is_valid = (fd != -1);\n        _still_readable = 1;\n        _domain = family;\n        _type = type;\n        _protocol = protocol;\n\n        IL2CPP_ASSERT(_type != -1 && \"Unsupported socket type\");\n        IL2CPP_ASSERT(_domain != -1 && \"Unsupported address family\");\n        IL2CPP_ASSERT(_protocol != -1 && \"Unsupported protocol type\");\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Close()\n    {\n        _saved_error = kErrorCodeSuccess;\n\n        if (_is_valid && _fd != -1)\n        {\n            if (SOCK_CLOSE(_fd) == -1)\n                StoreLastError();\n        }\n\n        _fd = -1;\n        _is_valid = false;\n        _still_readable = 0;\n        _domain = -1;\n        _type = -1;\n        _protocol = -1;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::SetBlocking(bool blocking)\n    {\n#if IL2CPP_USE_SOCKET_SETBLOCKING\n        return (WaitStatus)setBlocking(_fd, blocking);\n#else\n\n        int32_t flags = fcntl(_fd, F_GETFL, 0);\n        if (flags == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        flags = blocking\n            ? (flags & ~O_NONBLOCK)\n            : (flags | O_NONBLOCK);\n\n        if (fcntl(_fd, F_SETFL, flags) == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n        return kWaitStatusSuccess;\n#endif\n    }\n\n    ErrorCode SocketImpl::GetLastError() const\n    {\n        return _saved_error;\n    }\n\n    void SocketImpl::StoreLastError()\n    {\n        const ErrorCode error = SocketErrnoToErrorCode(errno);\n\n        Error::SetLastError(error);\n\n        _saved_error = error;\n    }\n\n    void SocketImpl::StoreLastError(int32_t error_no)\n    {\n        const ErrorCode error = SocketErrnoToErrorCode(error_no);\n\n        Error::SetLastError(error);\n\n        _saved_error = error;\n    }\n\n#if SUPPORT_UNIXSOCKETS\n    static void sockaddr_from_path(const char *path, struct sockaddr *sa, socklen_t *sa_size)\n    {\n        struct sockaddr_un sa_un = {0};\n        const size_t len = strlen(path);\n\n        memcpy(sa_un.sun_path, path, len);\n\n        *sa_size = (socklen_t)len;\n        *sa = *((struct sockaddr*)&sa_un);\n    }\n\n#endif\n\n#if IL2CPP_SUPPORT_IPV6\n    static void sockaddr_from_address(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, sockaddr_in6* sa, socklen_t *sa_size)\n    {\n        sa->sin6_family = AF_INET6;\n        sa->sin6_port = port;\n        memcpy(&sa->sin6_addr, &address[0], 16);\n        sa->sin6_scope_id = scope;\n\n        *sa_size = sizeof(struct sockaddr_in6);\n    }\n\n#endif\n\n    static void sockaddr_from_address(uint32_t address, uint16_t port, struct sockaddr *sa, socklen_t *sa_size)\n    {\n        struct sockaddr_in sa_in = {0};\n\n        sa_in.sin_family = AF_INET;\n        sa_in.sin_port = port;\n        sa_in.sin_addr.s_addr = address;\n\n        *sa_size = sizeof(struct sockaddr_in);\n        *sa = *((struct sockaddr*)&sa_in);\n    }\n\n    static bool socketaddr_to_endpoint_info(const struct sockaddr *address, socklen_t address_len, EndPointInfo &info)\n    {\n        info.family = convert_define_to_address_family(address->sa_family);\n\n        if (info.family == os::kAddressFamilyInterNetwork)\n        {\n            const struct sockaddr_in *address_in = (const struct sockaddr_in *)address;\n\n            info.data.inet.port = ntohs(address_in->sin_port);\n            info.data.inet.address = ntohl(address_in->sin_addr.s_addr);\n\n            return true;\n        }\n\n        if (info.family == os::kAddressFamilyUnix)\n        {\n            for (int32_t i = 0; i < address_len; i++)\n                info.data.path[i] = address->sa_data[i];\n\n            return true;\n        }\n\n#if IL2CPP_SUPPORT_IPV6\n        if (info.family == os::kAddressFamilyInterNetworkV6)\n        {\n            const struct sockaddr_in6 *address_in = (const struct sockaddr_in6 *)address;\n\n            uint16_t port = ntohs(address_in->sin6_port);\n\n            info.data.raw[2] = (port >> 8) & 0xff;\n            info.data.raw[3] = port & 0xff;\n\n            for (int i = 0; i < 16; i++)\n                info.data.raw[i + 8] = address_in->sin6_addr.s6_addr[i];\n\n            info.data.raw[24] = address_in->sin6_scope_id & 0xff;\n            info.data.raw[25] = (address_in->sin6_scope_id >> 8) & 0xff;\n            info.data.raw[26] = (address_in->sin6_scope_id >> 16) & 0xff;\n            info.data.raw[27] = (address_in->sin6_scope_id >> 24) & 0xff;\n\n            return true;\n        }\n#endif\n\n        return false;\n    }\n\n    WaitStatus SocketImpl::Bind(const char *path)\n    {\n#if SUPPORT_UNIXSOCKETS\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_path(path, &sa, &sa_size);\n\n        if (bind(_fd, &sa, sa_size) == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n#else\n        return kWaitStatusFailure;\n#endif\n    }\n\n    WaitStatus SocketImpl::Bind(const char *address, uint16_t port)\n    {\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(inet_addr(address), htons(port), &sa, &sa_size);\n\n        if (bind(_fd, &sa, sa_size) == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Bind(uint32_t address, uint16_t port)\n    {\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(htonl(address), htons(port), &sa, &sa_size);\n\n        if (bind(_fd, &sa, sa_size) == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Bind(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port)\n    {\n#if IL2CPP_SUPPORT_IPV6\n        struct sockaddr_in6 sa = { 0 };\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(address, scope, htons(port), &sa, &sa_size);\n\n        if (bind(_fd, (sockaddr*)&sa, sa_size) == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n#else\n        IL2CPP_VM_NOT_SUPPORTED(sockaddr_from_address, \"IPv6 is not supported on this platform.\");\n        return kWaitStatusFailure;\n#endif\n    }\n\n    WaitStatus SocketImpl::ConnectInternal(struct sockaddr *sa, int32_t sa_size)\n    {\n        if (connect(_fd, sa, (socklen_t)sa_size) != -1)\n            return kWaitStatusSuccess;\n\n        if (errno != EINTR)\n        {\n            // errnum = errno_to_WSA (errnum, __func__);\n            // if (errnum == WSAEINPROGRESS)\n            //  errnum = WSAEWOULDBLOCK; /* see bug #73053 */\n\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        struct pollfd fds = {0};\n\n        fds.fd = _fd;\n        fds.events = POLLOUT;\n\n        while (poll(&fds, 1, -1) == -1)\n        {\n            if (errno != EINTR)\n            {\n                StoreLastError();\n                return kWaitStatusFailure;\n            }\n        }\n\n        int32_t so_error = 0;\n        socklen_t len = sizeof(so_error);\n\n        if (getsockopt(_fd, SOL_SOCKET, SO_ERROR, &so_error, &len) == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        if (so_error != 0)\n        {\n            StoreLastError(so_error);\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Connect(const char *path)\n    {\n#if SUPPORT_UNIXSOCKETS\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_path(path, &sa, &sa_size);\n\n        return ConnectInternal((struct sockaddr *)&sa, sa_size);\n#else\n        return kWaitStatusFailure;\n#endif\n    }\n\n    WaitStatus SocketImpl::Connect(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port)\n    {\n#if IL2CPP_SUPPORT_IPV6\n        struct sockaddr_in6 sa = { 0 };\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(address, scope, htons(port), &sa, &sa_size);\n\n        return ConnectInternal((struct sockaddr *)&sa, sa_size);\n#else\n        IL2CPP_VM_NOT_SUPPORTED(sockaddr_from_address, \"IPv6 is not supported on this platform.\");\n        return kWaitStatusFailure;\n#endif\n    }\n\n    WaitStatus SocketImpl::Connect(uint32_t address, uint16_t port)\n    {\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(htonl(address), htons(port), &sa, &sa_size);\n\n        return ConnectInternal((struct sockaddr *)&sa, sa_size);\n    }\n\n    WaitStatus SocketImpl::GetLocalEndPointInfo(EndPointInfo &info)\n    {\n        // Note: the size here could probably be smaller\n        uint8_t buffer[END_POINT_MAX_PATH_LEN + 3] = {0};\n        socklen_t address_len = sizeof(buffer);\n\n        if (getsockname(_fd, (struct sockaddr *)buffer, &address_len) == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        if (!socketaddr_to_endpoint_info((struct sockaddr *)buffer, address_len, info))\n        {\n            _saved_error = kWSAeafnosupport;\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::GetRemoteEndPointInfo(EndPointInfo &info)\n    {\n        // Note: the size here could probably be smaller\n        uint8_t buffer[END_POINT_MAX_PATH_LEN + 3] = {0};\n        socklen_t address_len = sizeof(buffer);\n\n        if (getpeername(_fd, (struct sockaddr *)buffer, &address_len) == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        if (!socketaddr_to_endpoint_info((struct sockaddr *)buffer, address_len, info))\n        {\n            _saved_error = kWSAeafnosupport;\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Listen(int32_t backlog)\n    {\n        if (listen(_fd, backlog) == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Shutdown(int32_t how)\n    {\n        if (shutdown(_fd, how) == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        if (how == SHUT_RD || how == SHUT_RDWR)\n            _still_readable = 0;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Accept(os::Socket **socket)\n    {\n        int32_t new_fd = 0;\n\n        *socket = NULL;\n\n        do\n        {\n            new_fd = accept(_fd, NULL, 0);\n        }\n        while (new_fd == -1 && errno == EINTR);\n\n        if (new_fd == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        *socket = new os::Socket(_thread_status_callback);\n\n        const WaitStatus status = (*socket)->Create(new_fd, _domain, _type, _protocol);\n\n        if (status != kWaitStatusSuccess)\n        {\n            delete *socket;\n            *socket = NULL;\n            return status;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Disconnect(bool reuse)\n    {\n        int32_t new_sock = socket(_domain, _type, _protocol);\n        if (new_sock == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        // According to Stevens \"Advanced Programming in the UNIX\n        // Environment: UNIX File I/O\" dup2() is atomic so there\n        // should not be a race condition between the old fd being\n        // closed and the new socket fd being copied over\n\n        int32_t ret = 0;\n\n        do\n        {\n            ret = dup2(new_sock, _fd);\n        }\n        while (ret == -1 && errno == EAGAIN);\n\n        if (ret == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        SOCK_CLOSE(new_sock);\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Receive(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        *len = 0;\n\n        const int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        return ReceiveFromInternal(data, count, c_flags, len, NULL, 0);\n    }\n\n    WaitStatus SocketImpl::ReceiveFromInternal(const uint8_t *data, size_t count, int32_t flags, int32_t *len, struct sockaddr *from, int32_t *fromlen)\n    {\n        int32_t ret = 0;\n\n        do\n        {\n            ret = (int32_t)recvfrom(_fd, (void*)data, count, flags, from, (socklen_t*)fromlen);\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == 0 && count > 0)\n        {\n            // According to the Linux man page, recvfrom only\n            // returns 0 when the socket has been shut down\n            // cleanly.  Turn this into an EINTR to simulate win32\n            // behaviour of returning EINTR when a socket is\n            // closed while the recvfrom is blocking (we use a\n            // shutdown() in socket_close() to trigger this.) See\n            // bug 75705.\n\n            // Distinguish between the socket being shut down at\n            // the local or remote ends, and reads that request 0\n            // bytes to be read\n\n            // If this returns FALSE, it means the socket has been\n            // closed locally.  If it returns TRUE, but\n            // still_readable != 1 then shutdown\n            // (SHUT_RD|SHUT_RDWR) has been called locally.\n\n            if (_still_readable != 1)\n            {\n                ret = -1;\n                errno = EINTR;\n            }\n        }\n\n        if (ret == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        *len = ret;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Send(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        *len = 0;\n\n        int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n#if IL2CPP_USE_SEND_NOSIGNAL\n        c_flags |= MSG_NOSIGNAL;\n#endif\n\n        int32_t ret = 0;\n\n        do\n        {\n            ret = (int32_t)send(_fd, (void*)data, count, c_flags);\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        *len = ret;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::SendArray(WSABuf *wsabufs, int32_t count, int32_t *sent, SocketFlags flags)\n    {\n        int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        struct msghdr hdr = {0};\n\n        hdr.msg_iovlen = count;\n        hdr.msg_iov = (struct iovec*)malloc(sizeof(struct iovec) * count);\n\n        for (int32_t i = 0; i < count; ++i)\n        {\n            hdr.msg_iov[i].iov_base = wsabufs[i].buffer;\n            hdr.msg_iov[i].iov_len  = wsabufs[i].length;\n        }\n\n#if IL2CPP_USE_SEND_NOSIGNAL\n        c_flags |= MSG_NOSIGNAL;\n#endif\n\n        int32_t ret = 0;\n\n        do\n        {\n            ret = (int32_t)sendmsg(_fd, &hdr, c_flags);\n        }\n        while (ret == -1 && errno == EINTR);\n\n        free(hdr.msg_iov);\n\n        if (ret == -1)\n        {\n            *sent = 0;\n\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        *sent = ret;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::ReceiveArray(WSABuf *wsabufs, int32_t count, int32_t *len, SocketFlags flags)\n    {\n        const int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        struct msghdr hdr = {0};\n\n        hdr.msg_iovlen = count;\n        hdr.msg_iov = (struct iovec*)malloc(sizeof(struct iovec) * count);\n\n        for (int32_t i = 0; i < count; ++i)\n        {\n            hdr.msg_iov[i].iov_base = wsabufs[i].buffer;\n            hdr.msg_iov[i].iov_len  = wsabufs[i].length;\n        }\n\n        int32_t ret = 0;\n\n        do\n        {\n            ret = (int32_t)recvmsg(_fd, &hdr, c_flags);\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == 0)\n        {\n            // See SocketImpl::ReceiveFromInternal\n            if (_still_readable != 1)\n            {\n                ret = -1;\n                errno = EINTR;\n            }\n        }\n\n        free(hdr.msg_iov);\n\n        if (ret == -1)\n        {\n            *len = 0;\n\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        *len = ret;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::SendToInternal(struct sockaddr *sa, int32_t sa_size, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n#if IL2CPP_USE_SEND_NOSIGNAL\n        c_flags |= MSG_NOSIGNAL;\n#endif\n\n        int32_t ret = 0;\n\n        do\n        {\n            ret = (int32_t)sendto(_fd, (void*)data, count, c_flags, sa, sa_size);\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        *len = ret;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::SendTo(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        *len = 0;\n\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(htonl(address), htons(port), &sa, &sa_size);\n\n        return SendToInternal(&sa, sa_size, data, count, flags, len);\n    }\n\n    WaitStatus SocketImpl::SendTo(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n#if SUPPORT_UNIXSOCKETS\n        *len = 0;\n\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_path(path, &sa, &sa_size);\n\n        return SendToInternal(&sa, sa_size, data, count, flags, len);\n#else\n        return kWaitStatusFailure;\n#endif\n    }\n\n    WaitStatus SocketImpl::SendTo(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n#if IL2CPP_SUPPORT_IPV6\n        struct sockaddr_in6 sa = { 0 };\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(address, scope, htons(port), &sa, &sa_size);\n\n        return SendToInternal((sockaddr*)&sa, sa_size, data, count, flags, len);\n#else\n        IL2CPP_VM_NOT_SUPPORTED(sockaddr_from_address, \"IPv6 is not supported on this platform.\");\n        return kWaitStatusFailure;\n#endif\n    }\n\n    WaitStatus SocketImpl::RecvFrom(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n        *len = 0;\n\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(htonl(address), htons(port), &sa, &sa_size);\n\n        const int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        const WaitStatus status = ReceiveFromInternal(data, count, c_flags, len, &sa, (int32_t*)&sa_size);\n\n        if (status != kWaitStatusSuccess)\n        {\n            ep.family = os::kAddressFamilyError;\n            return status;\n        }\n\n        if (sa_size == 0)\n            return kWaitStatusSuccess;\n\n        if (!socketaddr_to_endpoint_info(&sa, sa_size, ep))\n        {\n            ep.family = os::kAddressFamilyError;\n            _saved_error = kWSAeafnosupport;\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::RecvFrom(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n#if SUPPORT_UNIXSOCKETS\n        *len = 0;\n\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_path(path, &sa, &sa_size);\n\n        const int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        const WaitStatus status = ReceiveFromInternal(data, count, c_flags, len, &sa, (int32_t*)&sa_size);\n\n        if (status != kWaitStatusSuccess)\n        {\n            ep.family = os::kAddressFamilyError;\n            return kWaitStatusFailure;\n        }\n\n        if (sa_size == 0)\n            return kWaitStatusSuccess;\n\n        if (!socketaddr_to_endpoint_info(&sa, sa_size, ep))\n        {\n            ep.family = os::kAddressFamilyError;\n            _saved_error = kWSAeafnosupport;\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n#else\n        return kWaitStatusFailure;\n#endif\n    }\n\n    WaitStatus SocketImpl::RecvFrom(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n#if IL2CPP_SUPPORT_IPV6\n        struct sockaddr_in6 sa = { 0 };\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(address, scope, htons(port), &sa, &sa_size);\n\n        const int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        const WaitStatus status = ReceiveFromInternal(data, count, c_flags, len, (sockaddr*)&sa, (int32_t*)&sa_size);\n\n        if (status != kWaitStatusSuccess)\n        {\n            ep.family = os::kAddressFamilyError;\n            return kWaitStatusFailure;\n        }\n\n        if (sa_size == 0)\n            return kWaitStatusSuccess;\n\n        if (!socketaddr_to_endpoint_info((sockaddr*)&sa, sa_size, ep))\n        {\n            ep.family = os::kAddressFamilyError;\n            _saved_error = kWSAeafnosupport;\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n#else\n        IL2CPP_VM_NOT_SUPPORTED(sockaddr_from_address, \"IPv6 is not supported on this platform.\");\n        return kWaitStatusFailure;\n#endif\n    }\n\n    WaitStatus SocketImpl::Available(int32_t *amount)\n    {\n        // ioctl (fd, FIONREAD, XXX) returns the size of\n        // the UDP header as well on Darwin.\n        //\n        // Use getsockopt SO_NREAD instead to get the\n        // right values for TCP and UDP.\n        //\n        // ai_canonname can be null in some cases on darwin, where the runtime assumes it will\n        // be the value of the ip buffer.\n\n        *amount = 0;\n#if IL2CPP_TARGET_DARWIN\n        socklen_t optlen = sizeof(int32_t);\n        if (getsockopt(_fd, SOL_SOCKET, SO_NREAD, amount, &optlen) == -1)\n#else\n        if (ioctl(_fd, FIONREAD, amount) == -1)\n#endif\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Ioctl(int32_t command, const uint8_t *in_data, int32_t in_len, uint8_t *out_data, int32_t out_len, int32_t *written)\n    {\n        IL2CPP_ASSERT(command != 0xC8000006 /* SIO_GET_EXTENSION_FUNCTION_POINTER */ && \"SIO_GET_EXTENSION_FUNCTION_POINTER ioctl command not supported\");\n\n        uint8_t *buffer = NULL;\n\n        if (in_len > 0)\n        {\n            buffer = (uint8_t*)malloc(in_len);\n            memcpy(buffer, in_data, in_len);\n        }\n\n        const int32_t ret = ioctl(_fd, command, buffer);\n        if (ret == -1)\n        {\n            StoreLastError();\n\n            free(buffer);\n\n            return kWaitStatusFailure;\n        }\n\n        if (buffer == NULL)\n        {\n            *written = 0;\n            return kWaitStatusSuccess;\n        }\n\n        // We just copy the buffer to the out_data. Some ioctls\n        // don't even out_data any data, but, well ...\n        //\n        // NB: windows returns WSAEFAULT if out_len is too small\n\n        const int32_t len = (in_len > out_len) ? out_len : in_len;\n\n        if (len > 0 && out_data != NULL)\n            memcpy(out_data, buffer, len);\n\n        free(buffer);\n\n        *written = len;\n\n        return kWaitStatusSuccess;\n    }\n\n#define     SKIP_OPTION         -2\n#define     INVALID_OPTION_NAME -1\n\n    static int32_t level_and_name_to_system(SocketOptionLevel level, SocketOptionName name, int32_t *system_level, int32_t *system_name)\n    {\n        switch (level)\n        {\n            case kSocketOptionLevelSocket:\n                *system_level = SOL_SOCKET;\n\n                switch (name)\n                {\n                    // This is SO_LINGER, because the setsockopt\n                    // internal call maps DontLinger to SO_LINGER\n                    // with l_onoff=0\n                    case kSocketOptionNameDontLinger:\n                        *system_name = SO_LINGER;\n                        break;\n        #ifdef SO_DEBUG\n                    case kSocketOptionNameDebug:\n                        *system_name = SO_DEBUG;\n                        break;\n        #endif\n        #ifdef SO_ACCEPTCONN\n                    case kSocketOptionNameAcceptConnection:\n                        *system_name = SO_ACCEPTCONN;\n                        break;\n        #endif\n                    case kSocketOptionNameReuseAddress:\n                        *system_name = SO_REUSEADDR;\n                        break;\n\n                    case kSocketOptionNameKeepAlive:\n                        *system_name = SO_KEEPALIVE;\n                        break;\n        #ifdef SO_DONTROUTE\n                    case kSocketOptionNameDontRoute:\n                        *system_name = SO_DONTROUTE;\n                        break;\n        #endif\n                    case kSocketOptionNameBroadcast:\n                        *system_name = SO_BROADCAST;\n                        break;\n\n                    case kSocketOptionNameLinger:\n                        *system_name = SO_LINGER;\n                        break;\n        #ifdef SO_OOBINLINE\n                    case kSocketOptionNameOutOfBandInline:\n                        *system_name = SO_OOBINLINE;\n                        break;\n        #endif\n                    case kSocketOptionNameSendBuffer:\n                        *system_name = SO_SNDBUF;\n                        break;\n\n                    case kSocketOptionNameReceiveBuffer:\n                        *system_name = SO_RCVBUF;\n                        break;\n\n                    case kSocketOptionNameSendLowWater:\n                        *system_name = SO_SNDLOWAT;\n                        break;\n\n                    case kSocketOptionNameReceiveLowWater:\n                        *system_name = SO_RCVLOWAT;\n                        break;\n\n                    case kSocketOptionNameSendTimeout:\n                        *system_name = SO_SNDTIMEO;\n                        break;\n\n                    case kSocketOptionNameReceiveTimeout:\n                        *system_name = SO_RCVTIMEO;\n                        break;\n\n                    case kSocketOptionNameError:\n                        *system_name = SO_ERROR;\n                        break;\n\n                    case kSocketOptionNameType:\n                        *system_name = SO_TYPE;\n                        break;\n\n                    case kSocketOptionNameExclusiveAddressUse:\n        #ifdef SO_EXCLUSIVEADDRUSE\n                        *system_name = SO_EXCLUSIVEADDRUSE;\n                        break;\n        #elif SO_REUSEADDR\n                        *system_name = SO_REUSEADDR;\n                        break;\n        #endif\n                    case kSocketOptionNameUseLoopback:\n        #ifdef SO_USELOOPBACK\n                        *system_name = SO_USELOOPBACK;\n                        break;\n        #endif\n                    case kSocketOptionNameMaxConnections:\n        #ifdef SO_MAXCONN\n                        *system_name = SO_MAXCONN;\n                        break;\n        #elif defined(SOMAXCONN)\n                        *system_name = SOMAXCONN;\n                        break;\n        #endif\n                    default:\n                        return INVALID_OPTION_NAME;\n                }\n                break;\n\n            case kSocketOptionLevelIP:\n        #ifdef SOL_IP\n                *system_level = SOL_IP;\n        #else\n                *system_level = IPPROTO_IP;\n        #endif\n\n                switch (name)\n                {\n        #ifdef IP_OPTIONS\n                    case kSocketOptionNameIPOptions:\n                        *system_name = IP_OPTIONS;\n                        break;\n        #endif\n        #ifdef IP_HDRINCL\n                    case kSocketOptionNameHeaderIncluded:\n                        *system_name = IP_HDRINCL;\n                        break;\n        #endif\n        #ifdef IP_TOS\n                    case kSocketOptionNameTypeOfService:\n                        *system_name = IP_TOS;\n                        break;\n        #endif\n        #ifdef IP_TTL\n                    case kSocketOptionNameIpTimeToLive:\n                        *system_name = IP_TTL;\n                        break;\n        #endif\n                    case kSocketOptionNameMulticastInterface:\n                        *system_name = IP_MULTICAST_IF;\n                        break;\n\n                    case kSocketOptionNameMulticastTimeToLive:\n                        *system_name = IP_MULTICAST_TTL;\n                        break;\n\n                    case kSocketOptionNameMulticastLoopback:\n                        *system_name = IP_MULTICAST_LOOP;\n                        break;\n\n                    case kSocketOptionNameAddMembership:\n                        *system_name = IP_ADD_MEMBERSHIP;\n                        break;\n\n                    case kSocketOptionNameDropMembership:\n                        *system_name = IP_DROP_MEMBERSHIP;\n                        break;\n\n        #ifdef HAVE_IP_PKTINFO\n                    case kSocketOptionNamePacketInformation:\n                        *system_name = IP_PKTINFO;\n                        break;\n        #endif\n\n                    case kSocketOptionNameDontFragment:\n        #ifdef IP_DONTFRAGMENT\n                        *system_name = IP_DONTFRAGMENT;\n        #elif IP_MTU_DISCOVER\n                        *system_name = IP_MTU_DISCOVER;\n        #elif IP_DONTFRAG\n                        *system_name = IP_DONTFRAG;\n        #else\n                        return SKIP_OPTION;\n        #endif\n                        break;\n\n                    case kSocketOptionNameAddSourceMembership:\n                    case kSocketOptionNameDropSourceMembership:\n                    case kSocketOptionNameBlockSource:\n                    case kSocketOptionNameUnblockSource:\n                    // Can't figure out how to map these, so fall\n                    // through\n                    default:\n                        return INVALID_OPTION_NAME;\n                }\n                break;\n#if IL2CPP_SUPPORT_IPV6\n            case kSocketOptionLevelIPv6:\n        #ifdef SOL_IP\n                *system_level = SOL_IPV6;\n        #else\n                *system_level = IPPROTO_IPV6;\n        #endif\n\n                switch (name)\n                {\n                    case kSocketOptionNameMulticastInterface:\n                        *system_name = IPV6_MULTICAST_IF;\n                        break;\n                    case kSocketOptionNameMulticastTimeToLive:\n                        *system_name = IPV6_MULTICAST_HOPS;\n                        break;\n                    case kSocketOptionNameMulticastLoopback:\n                        *system_name = IPV6_MULTICAST_LOOP;\n                        break;\n                    case kSocketOptionNameAddMembership:\n                        *system_name = IPV6_JOIN_GROUP;\n                        break;\n                    case kSocketOptionNameDropMembership:\n                        *system_name = IPV6_LEAVE_GROUP;\n                        break;\n                    case kSocketOptionNamePacketInformation:\n#ifdef HAVE_IPV6_PKTINFO\n                        *system_name = IPV6_PKTINFO;\n#endif\n                        break;\n                    case kSocketOptionNameIPv6Only:\n#ifdef IPV6_V6ONLY\n                        *system_name = IPV6_V6ONLY;\n#endif\n                        break;\n                    case kSocketOptionNameHeaderIncluded:\n                    case kSocketOptionNameIPOptions:\n                    case kSocketOptionNameTypeOfService:\n                    case kSocketOptionNameDontFragment:\n                    case kSocketOptionNameAddSourceMembership:\n                    case kSocketOptionNameDropSourceMembership:\n                    case kSocketOptionNameBlockSource:\n                    case kSocketOptionNameUnblockSource:\n                    // Can't figure out how to map these, so fall\n                    // through\n                    default:\n                        return INVALID_OPTION_NAME;\n                }\n                break;\n#endif // IL2CPP_SUPPORT_IPV6\n            case kSocketOptionLevelTcp:\n        #ifdef SOL_TCP\n                *system_level = SOL_TCP;\n        #else\n                *system_level = IPPROTO_TCP;\n        #endif\n\n                switch (name)\n                {\n                    case kSocketOptionNameNoDelay:\n                        *system_name = TCP_NODELAY;\n                        break;\n                    default:\n                        return INVALID_OPTION_NAME;\n                }\n                break;\n\n            case kSocketOptionLevelUdp:\n            default:\n                return INVALID_OPTION_NAME;\n        }\n\n        return 0;\n    }\n\n    WaitStatus SocketImpl::GetSocketOption(SocketOptionLevel level, SocketOptionName name, uint8_t *buffer, int32_t *length)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n        const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n        if (o_res == SKIP_OPTION)\n        {\n            *((int32_t*)buffer) = 0;\n            *length = sizeof(int32_t);\n\n            return kWaitStatusSuccess;\n        }\n\n        if (o_res == INVALID_OPTION_NAME)\n        {\n            _saved_error = kWSAenoprotoopt;\n\n            return kWaitStatusFailure;\n        }\n\n        struct timeval tv;\n        uint8_t *tmp_val = buffer;\n\n        if (system_level == SOL_SOCKET && (system_name == SO_RCVTIMEO || system_name == SO_SNDTIMEO))\n        {\n            tmp_val = (uint8_t*)&tv;\n            *length = sizeof(tv);\n        }\n\n        const int32_t ret = getsockopt(_fd, system_level, system_name, tmp_val, (socklen_t*)length);\n        if (ret == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        if (system_level == SOL_SOCKET && (system_name == SO_RCVTIMEO || system_name == SO_SNDTIMEO))\n        {\n            // milliseconds from microseconds\n            *((int32_t*)buffer)  = (int32_t)(tv.tv_sec * 1000 + (tv.tv_usec / 1000));\n            *length = sizeof(int32_t);\n\n            return kWaitStatusSuccess;\n        }\n\n        if (system_name == SO_ERROR)\n        {\n            if (*((int32_t*)buffer) != 0)\n            {\n                StoreLastError(*((int32_t*)buffer));\n            }\n            else\n            {\n                *((int32_t*)buffer) = _saved_error;\n            }\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::GetSocketOptionFull(SocketOptionLevel level, SocketOptionName name, int32_t *first, int32_t *second)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n#if !defined(SO_EXCLUSIVEADDRUSE) && defined(SO_REUSEADDR)\n        if (level == kSocketOptionLevelSocket && name == kSocketOptionNameExclusiveAddressUse)\n        {\n            system_level = SOL_SOCKET;\n            system_name = SO_REUSEADDR;\n        }\n        else\n#endif\n        {\n            const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n            if (o_res == SKIP_OPTION)\n            {\n                *first = 0;\n                *second = 0;\n\n                return kWaitStatusSuccess;\n            }\n\n            if (o_res == INVALID_OPTION_NAME)\n            {\n                _saved_error = kWSAenoprotoopt;\n\n                return kWaitStatusFailure;\n            }\n        }\n\n        int32_t ret = -1;\n\n        switch (name)\n        {\n            case kSocketOptionNameLinger:\n            {\n                struct linger linger;\n                socklen_t lingersize = sizeof(linger);\n\n                ret = getsockopt(_fd, system_level, system_name, &linger, &lingersize);\n\n                *first = linger.l_onoff;\n                *second = linger.l_linger;\n            }\n            break;\n\n            case kSocketOptionNameDontLinger:\n            {\n                struct linger linger;\n                socklen_t lingersize = sizeof(linger);\n\n                ret = getsockopt(_fd, system_level, system_name, &linger, &lingersize);\n\n                *first = !linger.l_onoff;\n            }\n            break;\n\n            case kSocketOptionNameSendTimeout:\n            case kSocketOptionNameReceiveTimeout:\n            {\n                socklen_t time_ms_size = sizeof(*first);\n                ret = getsockopt(_fd, system_level, system_name, (char*)first, &time_ms_size);\n            }\n            break;\n\n            default:\n            {\n                socklen_t valsize = sizeof(*first);\n                ret = getsockopt(_fd, system_level, system_name, first, &valsize);\n            }\n            break;\n        }\n\n        if (ret == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n#if !defined(SO_EXCLUSIVEADDRUSE) && defined(SO_REUSEADDR)\n        if (level == kSocketOptionLevelSocket && name == kSocketOptionNameExclusiveAddressUse)\n            *first = *first ? 0 : 1;\n#endif\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Poll(std::vector<PollRequest> &requests, int32_t count, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        const int32_t n_fd = count;\n        pollfd *p_fd = (pollfd*)calloc(n_fd, sizeof(pollfd));\n\n        for (int32_t i = 0; i < n_fd; ++i)\n        {\n            if (requests[i].fd == -1)\n            {\n                p_fd[i].fd = -1;\n                p_fd[i].events = kPollFlagsNone;\n                p_fd[i].revents = kPollFlagsNone;\n            }\n            else\n            {\n                p_fd[i].fd = requests[i].fd;\n                p_fd[i].events = posix::PollFlagsToPollEvents(requests[i].events);\n                p_fd[i].revents = kPollFlagsNone;\n            }\n        }\n\n        int32_t ret = os::posix::Poll(p_fd, n_fd, timeout);\n        *result = ret;\n\n        if (ret == -1)\n        {\n            free(p_fd);\n\n            *error = SocketErrnoToErrorCode(errno);\n\n            return kWaitStatusFailure;\n        }\n\n        if (ret == 0)\n        {\n            free(p_fd);\n\n            return kWaitStatusSuccess;\n        }\n\n        for (int32_t i = 0; i < n_fd; ++i)\n        {\n            requests[i].revents = posix::PollEventsToPollFlags(p_fd[i].revents);\n        }\n\n        free(p_fd);\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Poll(std::vector<PollRequest> &requests, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        return Poll(requests, (int32_t)requests.size(), timeout, result, error);\n    }\n\n    WaitStatus SocketImpl::Poll(PollRequest& request, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        std::vector<PollRequest> requests;\n        requests.push_back(request);\n        return Poll(requests, 1, timeout, result, error);\n    }\n\n    WaitStatus SocketImpl::SetSocketOption(SocketOptionLevel level, SocketOptionName name, int32_t value)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n        const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n        if (o_res == SKIP_OPTION)\n        {\n            return kWaitStatusSuccess;\n        }\n\n        if (o_res == INVALID_OPTION_NAME)\n        {\n            _saved_error = kWSAenoprotoopt;\n\n            return kWaitStatusFailure;\n        }\n\n        struct linger linger;\n\n        WaitStatus ret = kWaitStatusFailure;\n\n        switch (name)\n        {\n            case kSocketOptionNameDontLinger:\n                linger.l_onoff = !value;\n                linger.l_linger = 0;\n                ret = SetSocketOptionInternal(system_level, system_name, &linger, sizeof(linger));\n                break;\n\n            case kSocketOptionNameDontFragment:\n#ifdef IP_PMTUDISC_DO\n                // Fiddle with the value slightly if we're turning DF on\n                if (value == 1)\n                    value = IP_PMTUDISC_DO;\n#endif\n                ret = SetSocketOptionInternal(system_level, system_name, (char*)&value, sizeof(value));\n                break;\n\n            default:\n                ret = SetSocketOptionInternal(system_level, system_name, (char*)&value, sizeof(value));\n                break;\n        }\n\n        return ret;\n    }\n\n    WaitStatus SocketImpl::SetSocketOptionLinger(SocketOptionLevel level, SocketOptionName name, bool enabled, int32_t seconds)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n        const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n        if (o_res == SKIP_OPTION)\n        {\n            return kWaitStatusSuccess;\n        }\n\n        if (o_res == INVALID_OPTION_NAME)\n        {\n            _saved_error = kWSAenoprotoopt;\n\n            return kWaitStatusFailure;\n        }\n\n        struct linger linger;\n\n        linger.l_onoff = enabled;\n        linger.l_linger = seconds;\n\n        return SetSocketOptionInternal(system_level, system_name, &linger, sizeof(linger));\n    }\n\n    WaitStatus SocketImpl::SetSocketOptionArray(SocketOptionLevel level, SocketOptionName name, const uint8_t *buffer, int32_t length)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n        const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n        if (o_res == SKIP_OPTION)\n        {\n            return kWaitStatusSuccess;\n        }\n\n        if (o_res == INVALID_OPTION_NAME)\n        {\n            _saved_error = kWSAenoprotoopt;\n\n            return kWaitStatusFailure;\n        }\n\n        struct linger linger;\n\n        WaitStatus ret = kWaitStatusFailure;\n\n        switch (name)\n        {\n            case kSocketOptionNameDontLinger:\n                if (length == 1)\n                {\n                    linger.l_linger = 0;\n                    linger.l_onoff = (*((char*)buffer)) ? 0 : 1;\n\n                    ret = SetSocketOptionInternal(system_level, system_name, &linger, sizeof(linger));\n                }\n                else\n                {\n                    _saved_error = kWSAeinval;\n\n                    return kWaitStatusFailure;\n                }\n                break;\n\n            default:\n                ret = SetSocketOptionInternal(system_level, system_name, buffer, length);\n                break;\n        }\n\n        return ret;\n    }\n\n    WaitStatus SocketImpl::SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, uint32_t group_address, uint32_t local_address)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n        const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n        if (o_res == SKIP_OPTION)\n        {\n            return kWaitStatusSuccess;\n        }\n\n        if (o_res == INVALID_OPTION_NAME)\n        {\n            _saved_error = kWSAenoprotoopt;\n\n            return kWaitStatusFailure;\n        }\n\n        struct ip_mreqn mreq = {{0}};\n\n        mreq.imr_multiaddr.s_addr = group_address;\n        mreq.imr_address.s_addr = local_address;\n\n        return SetSocketOptionInternal(system_level, system_name, &mreq, sizeof(mreq));\n    }\n\n#if IL2CPP_TARGET_DARWIN\n    #include <sys/types.h>\n    #include <ifaddrs.h>\n    #include <sys/socket.h>\n    #include <net/if.h>\n    static int get_local_interface_id(int family)\n    {\n        struct ifaddrs *ifap = NULL, *ptr;\n        int idx = 0;\n        if (getifaddrs(&ifap))\n            return 0;\n\n        for (ptr = ifap; ptr; ptr = ptr->ifa_next)\n        {\n            if (!ptr->ifa_addr || !ptr->ifa_name)\n                continue;\n            if (ptr->ifa_addr->sa_family != family)\n                continue;\n            if ((ptr->ifa_flags & IFF_LOOPBACK) != 0)\n                continue;\n            if ((ptr->ifa_flags & IFF_MULTICAST) == 0)\n                continue;\n\n            idx = if_nametoindex(ptr->ifa_name);\n            break;\n        }\n\n        freeifaddrs(ifap);\n        return idx;\n    }\n\n#endif // IL2CPP_TARGET_DARWIN\n\n#if IL2CPP_SUPPORT_IPV6\n    WaitStatus SocketImpl::SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, IPv6Address ipv6, uint64_t interfaceOffset)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n        const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n        if (o_res == SKIP_OPTION)\n        {\n            return kWaitStatusSuccess;\n        }\n\n        if (o_res == INVALID_OPTION_NAME)\n        {\n            _saved_error = kWSAenoprotoopt;\n\n            return kWaitStatusFailure;\n        }\n\n        struct ipv6_mreq mreq6 = {{0}};\n        struct in6_addr in6addr;\n        for (int i = 0; i < 16; ++i)\n            in6addr.s6_addr[i] = ipv6.addr[i];\n        mreq6.ipv6mr_multiaddr = in6addr;\n\n#if IL2CPP_TARGET_DARWIN\n        if (interfaceOffset == 0)\n            interfaceOffset = get_local_interface_id(AF_INET6);\n#endif\n        mreq6.ipv6mr_interface = interfaceOffset;\n\n        return SetSocketOptionInternal(system_level, system_name, &mreq6, sizeof(mreq6));\n    }\n\n#endif\n\n    WaitStatus SocketImpl::SetSocketOptionInternal(int32_t level, int32_t name, const void *value, int32_t len)\n    {\n        const void *real_val = value;\n        struct timeval tv;\n\n        if (level == SOL_SOCKET && (name == SO_RCVTIMEO || name == SO_SNDTIMEO))\n        {\n            const int32_t ms = *((int32_t*)value);\n\n            tv.tv_sec = ms / 1000;\n            tv.tv_usec = (ms % 1000) * 1000;\n            real_val = &tv;\n\n            len = sizeof(tv);\n        }\n\n        const int32_t ret = setsockopt(_fd, level, name, real_val, (socklen_t)len);\n\n        if (ret == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n#if defined(SO_REUSEPORT)\n        // BSD's and MacOS X multicast sockets also need SO_REUSEPORT when SO_REUSEADDR is requested.\n        if (level == SOL_SOCKET && name == SO_REUSEADDR)\n        {\n            int32_t type;\n            socklen_t type_len = sizeof(type);\n\n            if (!getsockopt(_fd, level, SO_TYPE, &type, &type_len))\n            {\n                if (type == SOCK_DGRAM)\n                    setsockopt(_fd, level, SO_REUSEPORT, real_val, len);\n            }\n        }\n#endif\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::SendFile(const char *filename, TransmitFileBuffers *buffers, TransmitFileOptions options)\n    {\n        int32_t file = open(filename, O_RDONLY);\n\n        if (file == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        int32_t ret;\n\n        // Write the header\n        if (buffers != NULL && buffers->head != NULL && buffers->head_length > 0)\n        {\n            do\n            {\n                ret = (int32_t)send(_fd, (void*)buffers->head, buffers->head_length, 0);\n            }\n            while (ret == -1 && errno == EINTR);\n\n            if (ret == -1)\n            {\n                StoreLastError();\n\n                SOCK_CLOSE(file);\n\n                return kWaitStatusFailure;\n            }\n        }\n\n        struct stat statbuf;\n\n        ret = fstat(file, &statbuf);\n        if (ret == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        do\n        {\n#if IL2CPP_TARGET_DARWIN\n            ret = sendfile(file, _fd, 0, &statbuf.st_size, NULL, 0);\n#else\n            ret = sendfile(_fd, file, NULL, statbuf.st_size);\n#endif\n        }\n        while (ret != -1 && (errno == EINTR || errno == EAGAIN));\n\n        if (ret == -1)\n        {\n            StoreLastError();\n\n            SOCK_CLOSE(file);\n\n            return kWaitStatusFailure;\n        }\n\n        // Write the tail\n        if (buffers != NULL && buffers->tail != NULL && buffers->tail_length > 0)\n        {\n            do\n            {\n                ret = (int32_t)send(_fd, (void*)buffers->tail, buffers->tail_length, 0);\n            }\n            while (ret == -1 && errno == EINTR);\n\n            if (ret == -1)\n            {\n                StoreLastError();\n\n                SOCK_CLOSE(file);\n\n                return kWaitStatusFailure;\n            }\n        }\n\n        if (SOCK_CLOSE(file) == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/SocketImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_TARGET_POSIX\n\n#include <string>\n#include <vector>\n#include <stdint.h>\n\n#include \"os/Socket.h\"\n#include \"os/ErrorCodes.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\nstruct sockaddr;\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class SocketImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n        typedef int SocketDescriptor;\n\n        SocketImpl(ThreadStatusCallback thread_status_callback);\n        ~SocketImpl();\n\n        inline SocketDescriptor GetDescriptor()\n        {\n            return _fd;\n        }\n\n        ErrorCode GetLastError() const;\n\n        WaitStatus Create(SocketDescriptor fd, int32_t family, int32_t type, int32_t protocol);\n        WaitStatus Create(AddressFamily family, SocketType type, ProtocolType protocol);\n        WaitStatus Close();\n\n        bool IsClosed()\n        {\n            return (_fd == -1);\n        }\n\n        WaitStatus SetBlocking(bool blocking);\n\n        WaitStatus Listen(int32_t blacklog);\n\n        WaitStatus Bind(const char *path);\n        WaitStatus Bind(const char *address, uint16_t port);\n        WaitStatus Bind(uint32_t address, uint16_t port);\n        WaitStatus Bind(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port);\n\n        WaitStatus Connect(const char *path);\n        WaitStatus Connect(uint32_t address, uint16_t port);\n        WaitStatus Connect(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port);\n\n        WaitStatus Disconnect(bool reuse);\n        WaitStatus Shutdown(int32_t how);\n\n        WaitStatus GetLocalEndPointInfo(EndPointInfo &info);\n        WaitStatus GetRemoteEndPointInfo(EndPointInfo &info);\n\n        WaitStatus Receive(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus ReceiveFromInternal(const uint8_t *data, size_t count, int32_t flags, int32_t *len, struct sockaddr *from, int32_t *fromlen);\n\n        WaitStatus Send(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n\n        WaitStatus SendArray(WSABuf *wsabufs, int32_t count, int32_t *sent, SocketFlags c_flags);\n        WaitStatus ReceiveArray(WSABuf *wsabufs, int32_t count, int32_t *len, SocketFlags c_flags);\n\n        WaitStatus SendTo(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus SendTo(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus SendTo(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n\n        WaitStatus RecvFrom(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n        WaitStatus RecvFrom(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n        WaitStatus RecvFrom(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n\n        WaitStatus Available(int32_t *amount);\n\n        WaitStatus Accept(os::Socket **socket);\n\n        WaitStatus Ioctl(int32_t command, const uint8_t *in_data, int32_t in_len, uint8_t *out_data, int32_t out_len, int32_t *written);\n\n        WaitStatus GetSocketOption(SocketOptionLevel level, SocketOptionName name, uint8_t *buffer, int32_t *length);\n        WaitStatus GetSocketOptionFull(SocketOptionLevel level, SocketOptionName name, int32_t *first, int32_t *second);\n\n        WaitStatus SetSocketOption(SocketOptionLevel level, SocketOptionName name, int32_t value);\n        WaitStatus SetSocketOptionLinger(SocketOptionLevel level, SocketOptionName name, bool enabled, int32_t seconds);\n        WaitStatus SetSocketOptionArray(SocketOptionLevel level, SocketOptionName name, const uint8_t *buffer, int32_t length);\n        WaitStatus SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, uint32_t group_address, uint32_t local_address);\n#if IL2CPP_SUPPORT_IPV6\n        WaitStatus SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, IPv6Address ipv6, uint64_t interfaceOffset);\n#endif\n\n        WaitStatus SendFile(const char *filename, TransmitFileBuffers *buffers, TransmitFileOptions options);\n\n        static WaitStatus Poll(std::vector<PollRequest> &requests, int32_t count, int32_t timeout, int32_t *result, int32_t *error);\n        static WaitStatus Poll(std::vector<PollRequest> &requests, int32_t timeout, int32_t *result, int32_t *error);\n        static WaitStatus Poll(PollRequest& request, int32_t timeout, int32_t *result, int32_t *error);\n\n        static WaitStatus GetHostName(std::string &name);\n        static WaitStatus GetHostByName(const std::string &host, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list);\n        static WaitStatus GetHostByAddr(const std::string &address, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list);\n\n        static void Startup();\n        static void Cleanup();\n\n    private:\n\n        bool _is_valid;\n        SocketDescriptor _fd;\n        int32_t _domain;\n        int32_t _type;\n        int32_t _protocol;\n        ErrorCode _saved_error;\n        int32_t _still_readable;\n        ThreadStatusCallback _thread_status_callback;\n\n        void StoreLastError();\n        void StoreLastError(int32_t error_no);\n\n        WaitStatus ConnectInternal(struct sockaddr *sa, int32_t sa_size);\n        WaitStatus SendToInternal(struct sockaddr *sa, int32_t sa_size, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus SetSocketOptionInternal(int32_t level, int32_t name, const void *value, int32_t len);\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/StackTrace.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX && !IL2CPP_TARGET_JAVASCRIPT && !IL2CPP_TARGET_ANDROID && !IL2CPP_TARGET_PS4\n\n#include \"os/StackTrace.h\"\n#include <execinfo.h>\n#include <stdio.h>\n#include <cxxabi.h>\n#include <dlfcn.h>\n\n\nnamespace il2cpp\n{\nnamespace os\n{\n    const int kMaxStackFrames = 128;\n\n    void StackTrace::WalkStack(WalkStackCallback callback, void* context, WalkOrder walkOrder)\n    {\n        void* callstack[kMaxStackFrames];\n        int frames = backtrace(callstack, kMaxStackFrames);\n\n        if (walkOrder == kFirstCalledToLastCalled)\n        {\n            for (size_t i = frames; i--;)\n            {\n                if (!callback(reinterpret_cast<Il2CppMethodPointer>(callstack[i]), context))\n                    break;\n            }\n        }\n        else\n        {\n            for (size_t i = 0; i < frames; i++)\n            {\n                if (!callback(reinterpret_cast<Il2CppMethodPointer>(callstack[i]), context))\n                    break;\n            }\n        }\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/ThreadImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if !IL2CPP_THREADS_STD && IL2CPP_THREADS_PTHREAD\n\n#include <limits>\n#include <unistd.h>\n#include <map>\n#include <pthread.h>\n\n#if IL2CPP_TARGET_LINUX || IL2CPP_TARGET_TIZEN\n#include <sys/prctl.h>\n#endif\n\n#include \"ThreadImpl.h\"\n#include \"PosixHelpers.h\"\n#include \"os/Mutex.h\"\n\n\nnamespace il2cpp\n{\nnamespace os\n{\n/// An Event that we never signal. This is used for sleeping threads in an alertable state. They\n/// simply wait on this object with the sleep timer as the timeout. This way we don't need a separate\n/// codepath for implementing sleep logic.\n    static Event s_ThreadSleepObject;\n\n\n#define ASSERT_CALLED_ON_CURRENT_THREAD \\\n    IL2CPP_ASSERT(pthread_equal (pthread_self (), m_Handle) && \"Must be called on current thread!\");\n\n\n    ThreadImpl::ThreadImpl()\n        : m_Handle(0)\n        , m_StartFunc(NULL)\n        , m_StartArg(NULL)\n        , m_CurrentWaitObject(NULL)\n        , m_StackSize(IL2CPP_DEFAULT_STACK_SIZE)\n    {\n        pthread_mutex_init(&m_PendingAPCsMutex, NULL);\n    }\n\n    ThreadImpl::~ThreadImpl()\n    {\n        pthread_mutex_destroy(&m_PendingAPCsMutex);\n    }\n\n    ErrorCode ThreadImpl::Run(Thread::StartFunc func, void* arg)\n    {\n        // Store state for run wrapper.\n        m_StartFunc = func;\n        m_StartArg = arg;\n\n        // Initialize thread attributes.\n        pthread_attr_t attr;\n        int s = pthread_attr_init(&attr);\n        if (s)\n            return kErrorCodeGenFailure;\n\n#if defined(IL2CPP_ENABLE_PLATFORM_THREAD_AFFINTY)\n        // set create default core affinity\n        pthread_attr_setaffinity_np(&attr, 0, NULL);\n#endif\n\n\n#if defined(IL2CPP_ENABLE_PLATFORM_THREAD_STACKSIZE)\n        pthread_attr_setstacksize(&attr, m_StackSize);\n#endif\n\n\n        // Create thread.\n        pthread_t threadId;\n        s = pthread_create(&threadId, &attr, &ThreadStartWrapper, this);\n        if (s)\n            return kErrorCodeGenFailure;\n\n        // Destroy thread attributes.\n        s = pthread_attr_destroy(&attr);\n        if (s)\n            return kErrorCodeGenFailure;\n\n        // We're up and running.\n        m_Handle = threadId;\n\n        return kErrorCodeSuccess;\n    }\n\n    void* ThreadImpl::ThreadStartWrapper(void* arg)\n    {\n        ThreadImpl* thread = reinterpret_cast<ThreadImpl*>(arg);\n\n        // Also set handle here. No matter which thread proceeds first,\n        // we need to make sure the handle is set.\n        thread->m_Handle = pthread_self();\n\n        // Detach this thread since we will manage calling Join at the VM level\n        // if necessary. Detaching it also prevents use from running out of thread\n        // handles for background threads that are never joined.\n        int returnValue = pthread_detach(thread->m_Handle);\n        IL2CPP_ASSERT(returnValue == 0);\n        (void)returnValue;\n\n        // Run user code.\n        thread->m_StartFunc(thread->m_StartArg);\n\n        return 0;\n    }\n\n    uint64_t ThreadImpl::Id()\n    {\n        return posix::PosixThreadIdToThreadId(m_Handle);\n    }\n\n    void ThreadImpl::SetName(const std::string& name)\n    {\n        // Can only be set on current thread on OSX and Linux.\n        if (pthread_self() != m_Handle)\n            return;\n\n#if IL2CPP_TARGET_DARWIN\n        pthread_setname_np(name.c_str());\n#elif IL2CPP_TARGET_LINUX || IL2CPP_TARGET_TIZEN || IL2CPP_ENABLE_PLATFORM_THREAD_RENAME\n        pthread_setname_np(m_Handle, name.c_str());\n#endif\n    }\n\n    void ThreadImpl::SetStackSize(size_t newsize)\n    {\n        // only makes sense if it's called BEFORE the thread has been created\n        IL2CPP_ASSERT(m_Handle == NULL);\n\n        // if newsize is zero we use the per-platform default value for size of stack\n        if (newsize == 0)\n        {\n            newsize = IL2CPP_DEFAULT_STACK_SIZE;\n        }\n\n        m_StackSize = newsize;\n    }\n\n    void ThreadImpl::SetPriority(ThreadPriority priority)\n    {\n        ////TODO\n    }\n\n    ThreadPriority ThreadImpl::GetPriority()\n    {\n        /// TODO\n        return kThreadPriorityNormal;\n    }\n\n    void ThreadImpl::QueueUserAPC(Thread::APCFunc function, void* context)\n    {\n        IL2CPP_ASSERT(function != NULL);\n\n        // Put on queue.\n        {\n            pthread_mutex_lock(&m_PendingAPCsMutex);\n            m_PendingAPCs.push_back(APCRequest(function, context));\n            pthread_mutex_unlock(&m_PendingAPCsMutex);\n        }\n\n        // Interrupt an ongoing wait.\n        posix::AutoLockWaitObjectDeletion lock;\n        posix::PosixWaitObject* waitObject = m_CurrentWaitObject;\n        if (waitObject)\n            waitObject->InterruptWait();\n    }\n\n    void ThreadImpl::CheckForUserAPCAndHandle()\n    {\n        ASSERT_CALLED_ON_CURRENT_THREAD;\n        pthread_mutex_lock(&m_PendingAPCsMutex);\n\n        while (!m_PendingAPCs.empty())\n        {\n            APCRequest apcRequest = m_PendingAPCs.front();\n\n            // Remove from list. Do before calling the function to make sure the list\n            // is up to date in case the function throws.\n            m_PendingAPCs.erase(m_PendingAPCs.begin());\n\n            // Release mutex while we call the function so that we don't deadlock\n            // if the function starts waiting on a thread that tries queuing an APC\n            // on us.\n            pthread_mutex_unlock(&m_PendingAPCsMutex);\n\n            // Call function.\n            apcRequest.callback(apcRequest.context);\n\n            // Re-acquire mutex.\n            pthread_mutex_lock(&m_PendingAPCsMutex);\n        }\n\n        pthread_mutex_unlock(&m_PendingAPCsMutex);\n    }\n\n    void ThreadImpl::SetWaitObject(posix::PosixWaitObject* waitObject)\n    {\n        // Cannot set wait objects on threads other than the current thread.\n        ASSERT_CALLED_ON_CURRENT_THREAD;\n\n        // This is an unprotected write as write acccess is restricted to the\n        // current thread.\n        m_CurrentWaitObject = waitObject;\n    }\n\n    void ThreadImpl::Sleep(uint32_t milliseconds, bool interruptible)\n    {\n        s_ThreadSleepObject.Wait(milliseconds, interruptible);\n    }\n\n    uint64_t ThreadImpl::CurrentThreadId()\n    {\n        return posix::PosixThreadIdToThreadId(pthread_self());\n    }\n\n    ThreadImpl* ThreadImpl::GetCurrentThread()\n    {\n        return Thread::GetCurrentThread()->m_Thread;\n    }\n\n    ThreadImpl* ThreadImpl::CreateForCurrentThread()\n    {\n        ThreadImpl* thread = new ThreadImpl();\n        thread->m_Handle = pthread_self();\n        return thread;\n    }\n\n#if NET_4_0\n\n    bool ThreadImpl::YieldInternal()\n    {\n        return sched_yield() == 0;\n    }\n\n#endif\n\n#if IL2CPP_HAS_NATIVE_THREAD_CLEANUP\n\n    static pthread_key_t s_CleanupKey;\n    static Thread::ThreadCleanupFunc s_CleanupFunc;\n\n    static void CleanupThreadIfCanceled(void* arg)\n    {\n        if (s_CleanupFunc)\n            s_CleanupFunc(arg);\n    }\n\n    void ThreadImpl::SetNativeThreadCleanup(Thread::ThreadCleanupFunc cleanupFunction)\n    {\n        if (cleanupFunction)\n        {\n            IL2CPP_ASSERT(!s_CleanupFunc);\n            s_CleanupFunc = cleanupFunction;\n            int result = pthread_key_create(&s_CleanupKey, &CleanupThreadIfCanceled);\n            IL2CPP_ASSERT(!result);\n            NO_UNUSED_WARNING(result);\n        }\n        else\n        {\n            IL2CPP_ASSERT(s_CleanupFunc);\n            int result = pthread_key_delete(s_CleanupKey);\n            IL2CPP_ASSERT(!result);\n            NO_UNUSED_WARNING(result);\n            s_CleanupFunc = NULL;\n        }\n    }\n\n    void ThreadImpl::RegisterCurrentThreadForCleanup(void* arg)\n    {\n        IL2CPP_ASSERT(s_CleanupFunc);\n        pthread_setspecific(s_CleanupKey, arg);\n    }\n\n    void ThreadImpl::UnregisterCurrentThreadForCleanup()\n    {\n        IL2CPP_ASSERT(s_CleanupFunc);\n        void* data = pthread_getspecific(s_CleanupKey);\n        if (data != NULL)\n            pthread_setspecific(s_CleanupKey, NULL);\n    }\n\n#endif\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/ThreadImpl.h",
    "content": "#pragma once\n\n#if !IL2CPP_THREADS_STD && IL2CPP_THREADS_PTHREAD\n\n#include <pthread.h>\n#include <vector>\n\n#include \"PosixWaitObject.h\"\n#include \"os/ErrorCodes.h\"\n#include \"os/Mutex.h\"\n#include \"os/Event.h\"\n#include \"os/Thread.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\n#if defined(IL2CPP_ENABLE_PLATFORM_THREAD_AFFINTY)\nstruct cpu_set_t;\nint pthread_attr_setaffinity_np(pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset);\n#endif\n\n#if defined(IL2CPP_ENABLE_PLATFORM_THREAD_RENAME)\nint pthread_setname_np(pthread_t handle, const char *name);\n#endif\n\n#if !defined(IL2CPP_DEFAULT_STACK_SIZE)\n#define IL2CPP_DEFAULT_STACK_SIZE ( 1 * 1024 * 1024)            // default .NET stacksize is 1mb\n#endif\n\nnamespace il2cpp\n{\nnamespace os\n{\n/// POSIX threads implementation. Supports APCs and interruptible waits.\n    class ThreadImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n\n        ThreadImpl();\n        ~ThreadImpl();\n\n        uint64_t Id();\n        ErrorCode Run(Thread::StartFunc func, void* arg);\n        void QueueUserAPC(Thread::APCFunc func, void* context);\n        void SetName(const std::string& name);\n        void SetPriority(ThreadPriority priority);\n        ThreadPriority GetPriority();\n        void SetStackSize(size_t newsize);\n\n        /// Handle any pending APCs.\n        /// NOTE: Can only be called on current thread.\n        void CheckForUserAPCAndHandle();\n\n        static void Sleep(uint32_t milliseconds, bool interruptible);\n        static uint64_t CurrentThreadId();\n        static ThreadImpl* GetCurrentThread();\n        static ThreadImpl* CreateForCurrentThread();\n\n#if NET_4_0\n        static bool YieldInternal();\n#endif\n\n#if IL2CPP_HAS_NATIVE_THREAD_CLEANUP\n        static void SetNativeThreadCleanup(Thread::ThreadCleanupFunc cleanupFunction);\n        static void RegisterCurrentThreadForCleanup(void* arg);\n        static void UnregisterCurrentThreadForCleanup();\n#endif\n\n    private:\n\n        friend class posix::PosixWaitObject; // SetWaitObject(), CheckForAPCAndHandle()\n\n        pthread_t m_Handle;\n\n        /// The synchronization primitive that this thread is currently blocked on.\n        ///\n        /// NOTE: This field effectively turns these wait object into shared resources -- which makes deletion\n        ///       a tricky affair. To avoid one thread trying to interrupt a wait while the other thread already\n        ///       is in progress of deleting the wait object, we use a global mutex in PosixWaitObject.cpp that\n        ///       must be locked by any thread trying to trigger an interrupt.\n        posix::PosixWaitObject* m_CurrentWaitObject;\n\n        /// Start data.\n        Thread::StartFunc m_StartFunc;\n        void* m_StartArg;\n\n        /// List of APC requests for this thread.\n        struct APCRequest\n        {\n            Thread::APCFunc callback;\n            void* context;\n\n            APCRequest(Thread::APCFunc callback, void* context) :\n                callback(callback), context(context)\n            {\n            }\n        };\n\n        pthread_mutex_t m_PendingAPCsMutex;\n        std::vector<APCRequest> m_PendingAPCs;\n\n        size_t m_StackSize; // size of stack (can not be adjusted after thread creation)\n\n        /// Set the synchronization object the thread is about to wait on.\n        /// NOTE: This can only be called on the current thread.\n        void SetWaitObject(posix::PosixWaitObject* waitObject);\n\n        static void* ThreadStartWrapper(void* arg);\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/ThreadLocalValueImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_THREADS_PTHREAD\n\n#include \"ThreadLocalValueImpl.h\"\n\n#include <pthread.h>\n\n#define _unused(x) ((void)x)\n\nnamespace il2cpp\n{\nnamespace os\n{\n    ThreadLocalValueImpl::ThreadLocalValueImpl()\n    {\n        pthread_key_t key;\n        int result = pthread_key_create(&key, NULL);\n        IL2CPP_ASSERT(!result);\n        _unused(result);\n\n        m_Key = key;\n    }\n\n    ThreadLocalValueImpl::~ThreadLocalValueImpl()\n    {\n        IL2CPP_ASSERT(!pthread_key_delete(m_Key));\n    }\n\n    ErrorCode ThreadLocalValueImpl::SetValue(void* value)\n    {\n        if (pthread_setspecific(m_Key, value))\n            return kErrorCodeGenFailure;\n\n        return kErrorCodeSuccess;\n    }\n\n    ErrorCode ThreadLocalValueImpl::GetValue(void** value)\n    {\n        *value = pthread_getspecific(m_Key);\n\n        return kErrorCodeSuccess;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/ThreadLocalValueImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_THREADS_PTHREAD\n\n#include \"os/ErrorCodes.h\"\n#include \"utils/NonCopyable.h\"\n\n#include <pthread.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class ThreadLocalValueImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n        ThreadLocalValueImpl();\n        ~ThreadLocalValueImpl();\n        ErrorCode SetValue(void* value);\n        ErrorCode GetValue(void** value);\n    private:\n        pthread_key_t m_Key;\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/Time.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include \"os/Time.h\"\n#include <stdlib.h>\n#include <stdio.h>\n\n\n#include <sys/param.h>\n#if IL2CPP_TARGET_DARWIN\n#include <sys/sysctl.h>\n#endif\n\n#include <time.h>\n\n#if IL2CPP_TARGET_LINUX || IL2CPP_TARGET_TIZEN\n#include <sys/time.h>\n#endif\n\nnamespace il2cpp\n{\nnamespace os\n{\n    const int64_t MTICKS_PER_SEC = 10000000;\n\n    static int64_t\n    GetBootTime()\n    {\n#if IL2CPP_TARGET_DARWIN\n        int mib[2];\n        size_t size;\n        time_t now;\n        struct timeval boottime;\n\n        (void)time(&now);\n\n        mib[0] = CTL_KERN;\n        mib[1] = KERN_BOOTTIME;\n\n        size = sizeof(boottime);\n\n        if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1)\n            return (int64_t)((now - boottime.tv_sec) * MTICKS_PER_SEC);\n#else\n        FILE *uptime = fopen(\"/proc/uptime\", \"r\");\n\n        if (uptime)\n        {\n            double upt;\n\n            if (fscanf(uptime, \"%lf\", &upt) == 1)\n            {\n                const int64_t now = Time::GetTicks100NanosecondsMonotonic();\n                fclose(uptime);\n                return now - (int64_t)(upt * MTICKS_PER_SEC);\n            }\n\n            fclose(uptime);\n        }\n\n#endif\n        /* a made up uptime of 300 seconds */\n        return (int64_t)300 * MTICKS_PER_SEC;\n    }\n\n    uint32_t Time::GetTicksMillisecondsMonotonic()\n    {\n        static int64_t boot_time = 0;\n        int64_t now;\n        if (!boot_time)\n            boot_time = GetBootTime();\n        now = GetTicks100NanosecondsMonotonic();\n        return (uint32_t)((now - boot_time) / 10000);\n    }\n\n    int64_t Time::GetTicks100NanosecondsMonotonic()\n    {\n        struct timeval tv;\n#if defined(CLOCK_MONOTONIC) && !defined(IL2CPP_TARGET_DARWIN)\n        struct timespec tspec;\n        static struct timespec tspec_freq = {0};\n        static int can_use_clock = 0;\n        if (!tspec_freq.tv_nsec)\n        {\n            can_use_clock = clock_getres(CLOCK_MONOTONIC, &tspec_freq) == 0;\n        }\n        if (can_use_clock)\n        {\n            if (clock_gettime(CLOCK_MONOTONIC, &tspec) == 0)\n            {\n                return ((int64_t)tspec.tv_sec * MTICKS_PER_SEC + tspec.tv_nsec / 100);\n            }\n        }\n\n#endif\n        if (gettimeofday(&tv, NULL) == 0)\n            return ((int64_t)tv.tv_sec * 1000000 + tv.tv_usec) * 10;\n        return 0;\n    }\n\n/*\n * Magic number to convert a time which is relative to\n * Jan 1, 1970 into a value which is relative to Jan 1, 0001.\n */\n    const uint64_t EPOCH_ADJUST = ((uint64_t)62135596800LL);\n\n    int64_t Time::GetTicks100NanosecondsDateTime()\n    {\n        struct timeval tv;\n        if (gettimeofday(&tv, NULL) == 0)\n            return (((int64_t)tv.tv_sec + EPOCH_ADJUST) * 1000000 + tv.tv_usec) * 10;\n        return 0;\n    }\n\n    static const int64_t kSecondsBetween1601And1970 = 11644473600LL;\n    static const int64_t kSecondsTo100NanoSeconds = 10000000;\n\n    int64_t Time::GetSystemTimeAsFileTime()\n    {\n        timeval currentTime;\n        int getTimeOfDayResult = gettimeofday(&currentTime, NULL);\n        IL2CPP_ASSERT(getTimeOfDayResult == 0 && \"gettimeofday() failed\");\n\n        return kSecondsTo100NanoSeconds * (static_cast<int64_t>(currentTime.tv_sec) + kSecondsBetween1601And1970) + 10 * currentTime.tv_usec;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Posix/TimeZone.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_POSIX\n\n#include \"os/TimeZone.h\"\n\n#include <sys/time.h>\n#include <time.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n/*\n * Magic number to convert a time which is relative to\n * Jan 1, 1970 into a value which is relative to Jan 1, 0001.\n */\n    const uint64_t EPOCH_ADJUST = ((uint64_t)62135596800LL);\n\n    /*\n    * Return's the offset from GMT of a local time.\n    *\n    *  tm is a local time\n    *  t  is the same local time as seconds.\n    */\n    static int\n    GMTOffset(struct tm *tm, time_t t)\n    {\n#if defined(HAVE_TM_GMTOFF)\n        return tm->tm_gmtoff;\n#else\n        struct tm g;\n        time_t t2;\n        g = *gmtime(&t);\n        g.tm_isdst = tm->tm_isdst;\n        t2 = mktime(&g);\n        return (int)difftime(t, t2);\n#endif\n    }\n\n    bool TimeZone::GetTimeZoneData(int32_t year, int64_t data[4], std::string names[2])\n    {\n        struct tm start, tt;\n        time_t t;\n\n        long int gmtoff;\n        int is_daylight = 0, day;\n        char tzone[64];\n\n        /*\n         * no info is better than crashing: we'll need our own tz data\n         * to make this work properly, anyway. The range is probably\n         * reduced to 1970 .. 2037 because that is what mktime is\n         * guaranteed to support (we get into an infinite loop\n         * otherwise).\n         */\n\n        memset(&start, 0, sizeof(start));\n\n        start.tm_mday = 1;\n        start.tm_year = year - 1900;\n\n        t = mktime(&start);\n\n        if ((year < 1970) || (year > 2037) || (t == -1))\n        {\n            t = time(NULL);\n            tt = *localtime(&t);\n            strftime(tzone, sizeof(tzone), \"%Z\", &tt);\n            names[0] = tzone;\n            names[1] = tzone;\n            return true;\n        }\n\n        gmtoff = GMTOffset(&start, t);\n\n        /* For each day of the year, calculate the tm_gmtoff. */\n        for (day = 0; day < 365; day++)\n        {\n            t += 3600 * 24;\n            tt = *localtime(&t);\n\n            /* Daylight saving starts or ends here. */\n            if (GMTOffset(&tt, t) != gmtoff)\n            {\n                struct tm tt1;\n                time_t t1;\n\n                /* Try to find the exact hour when daylight saving starts/ends. */\n                t1 = t;\n                do\n                {\n                    t1 -= 3600;\n                    tt1 = *localtime(&t1);\n                }\n                while (GMTOffset(&tt1, t1) != gmtoff);\n\n                /* Try to find the exact minute when daylight saving starts/ends. */\n                do\n                {\n                    t1 += 60;\n                    tt1 = *localtime(&t1);\n                }\n                while (GMTOffset(&tt1, t1) == gmtoff);\n                t1 += gmtoff;\n                strftime(tzone, sizeof(tzone), \"%Z\", &tt);\n\n                /* Write data, if we're already in daylight saving, we're done. */\n                if (is_daylight)\n                {\n                    names[0] = tzone;\n                    data[1] = ((int64_t)t1 + EPOCH_ADJUST) * 10000000L;\n                    return true;\n                }\n                else\n                {\n                    names[1] = tzone;\n                    data[0] = ((int64_t)t1 + EPOCH_ADJUST) * 10000000L;\n                    is_daylight = 1;\n                }\n\n                /* This is only set once when we enter daylight saving. */\n                data[2] = (int64_t)gmtoff * 10000000L;\n                data[3] = (int64_t)(GMTOffset(&tt, t) - gmtoff) * 10000000L;\n\n                gmtoff = GMTOffset(&tt, t);\n            }\n        }\n\n        if (!is_daylight)\n        {\n            strftime(tzone, sizeof(tzone), \"%Z\", &tt);\n            names[0] = tzone;\n            names[1] = tzone;\n            data[0] = 0;\n            data[1] = 0;\n            data[2] = (int64_t)gmtoff * 10000000L;\n            data[3] = 0;\n        }\n\n        return true;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Process.h",
    "content": "#pragma once\n\n#include <string>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    struct ProcessHandle;\n\n    class Process\n    {\n    public:\n        static int GetCurrentProcessId();\n        static ProcessHandle* GetProcess(int processId);\n        static void FreeProcess(ProcessHandle* handle);\n        static std::string GetProcessName(ProcessHandle* handle);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Semaphore.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"os/Semaphore.h\"\n#include \"os/Atomic.h\"\n#if IL2CPP_TARGET_WINDOWS\n#include \"os/Win32/SemaphoreImpl.h\"\n#elif IL2CPP_TARGET_POSIX\n#include \"os/Posix/SemaphoreImpl.h\"\n#else\n#include \"os/SemaphoreImpl.h\"\n#endif\n\nnamespace il2cpp\n{\nnamespace os\n{\n    Semaphore::Semaphore(int32_t initialValue, int32_t maximumValue)\n        : m_Semaphore(new SemaphoreImpl(initialValue, maximumValue))\n    {\n    }\n\n    Semaphore::~Semaphore()\n    {\n        delete m_Semaphore;\n    }\n\n    bool Semaphore::Post(int32_t releaseCount, int32_t* previousCount)\n    {\n        return m_Semaphore->Post(releaseCount, previousCount);\n    }\n\n    WaitStatus Semaphore::Wait(bool interruptible)\n    {\n        return m_Semaphore->Wait(interruptible);\n    }\n\n    WaitStatus Semaphore::Wait(uint32_t ms, bool interruptible)\n    {\n        return m_Semaphore->Wait(ms, interruptible);\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Semaphore.h",
    "content": "#pragma once\n\n#include \"os/ErrorCodes.h\"\n#include \"os/WaitStatus.h\"\n#include \"os/Handle.h\"\n#include \"utils/NonCopyable.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class SemaphoreImpl;\n\n    class Semaphore : public il2cpp::utils::NonCopyable\n    {\n    public:\n        Semaphore(int32_t initialValue = 0, int32_t maximumValue = 1);\n        ~Semaphore();\n\n        bool Post(int32_t releaseCount = 1, int32_t* previousCount = NULL);\n        WaitStatus Wait(bool interruptible = false);\n        WaitStatus Wait(uint32_t ms, bool interruptible = false);\n\n    private:\n        SemaphoreImpl* m_Semaphore;\n    };\n\n    class SemaphoreHandle : public Handle\n    {\n    public:\n        SemaphoreHandle(Semaphore* semaphore) : m_Semaphore(semaphore) {}\n        virtual ~SemaphoreHandle() { delete m_Semaphore; }\n        virtual bool Wait() { m_Semaphore->Wait(true); return true; }\n        virtual bool Wait(uint32_t ms) { return m_Semaphore->Wait(ms, true) != kWaitStatusTimeout; }\n        virtual void Signal() { m_Semaphore->Post(1, NULL); }\n        Semaphore& Get() { return *m_Semaphore; }\n\n    private:\n        Semaphore* m_Semaphore;\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Socket.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include <map>\n\n#include \"os/Socket.h\"\n#include \"os/Atomic.h\"\n#include \"os/Mutex.h\"\n\n#if IL2CPP_TARGET_POSIX && !IL2CPP_TARGET_JAVASCRIPT\n// Note: sockets are not supported when targetting WebGL, even if it is considered a POSIX platform.\n# include \"os/Posix/SocketImpl.h\"\n#elif IL2CPP_TARGET_WINDOWS\n# include \"os/Win32/SocketImpl.h\"\n#elif IL2CPP_TARGET_SWITCH\n# include \"os/SocketImpl.h\"\n#else\n# include \"os/Generic/SocketImpl.h\"\n#endif\n\n\nnamespace il2cpp\n{\nnamespace os\n{\n    struct SocketHandleEntry\n    {\n        Socket* m_Socket;\n        uint32_t m_RefCount;\n    };\n\n    typedef std::map<SocketHandle, SocketHandleEntry> SocketHandleTable;\n\n    SocketHandle g_LastSocketHandle;\n    FastMutex g_SocketHandleTableMutex;\n    SocketHandleTable g_SocketHandleTable;\n\n    SocketHandle CreateSocketHandle(Socket* socket)\n    {\n        // Allocate handle.\n        SocketHandle newHandle = Atomic::Increment(&g_LastSocketHandle);\n\n        // Populate entry.\n        SocketHandleEntry handleEntry;\n        handleEntry.m_Socket = socket;\n        handleEntry.m_RefCount = 1;\n\n        // Add to table.\n        {\n            FastAutoLock lock(&g_SocketHandleTableMutex);\n            g_SocketHandleTable.insert(SocketHandleTable::value_type(newHandle, handleEntry));\n        }\n\n        return newHandle;\n    }\n\n    Socket* AcquireSocketHandle(SocketHandle handle)\n    {\n        if (handle == kInvalidSocketHandle)\n            return NULL;\n\n        FastAutoLock lock(&g_SocketHandleTableMutex);\n\n        // Look up in table.\n        SocketHandleTable::iterator iter = g_SocketHandleTable.find(handle);\n        if (iter == g_SocketHandleTable.end())\n            return NULL;\n\n        // Increase reference count.\n        SocketHandleEntry& entry = iter->second;\n        ++entry.m_RefCount;\n\n        return entry.m_Socket;\n    }\n\n    void ReleaseSocketHandle(SocketHandle handle)\n    {\n        if (handle == kInvalidSocketHandle)\n            return;\n\n        Socket* socketToDelete = NULL;\n        {\n            FastAutoLock lock(&g_SocketHandleTableMutex);\n\n            // Look up in table.\n            SocketHandleTable::iterator iter = g_SocketHandleTable.find(handle);\n            if (iter == g_SocketHandleTable.end())\n                return;\n\n            // Decrease reference count.\n            SocketHandleEntry& entry = iter->second;\n            --entry.m_RefCount;\n            if (!entry.m_RefCount)\n            {\n                // Kill socket. Should be the only place where we directly delete sockets that\n                // have made it past the creation step.\n                socketToDelete = entry.m_Socket;\n                g_SocketHandleTable.erase(iter);\n            }\n        }\n\n        // Perform the deletion after we have released the lock so we don't unnecessarily\n        // prevent other threads from accessing the table.\n        if (socketToDelete)\n            delete socketToDelete;\n    }\n\n    void Socket::Startup()\n    {\n        return SocketImpl::Startup();\n    }\n\n    void Socket::Cleanup()\n    {\n        return SocketImpl::Cleanup();\n    }\n\n    WaitStatus Socket::GetHostName(std::string &name)\n    {\n        return SocketImpl::GetHostName(name);\n    }\n\n    WaitStatus Socket::GetHostByAddr(const std::string &address, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n        return SocketImpl::GetHostByAddr(address, name, aliases, addr_list);\n    }\n\n    WaitStatus Socket::GetHostByName(const std::string &host, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n        return SocketImpl::GetHostByName(host, name, aliases, addr_list);\n    }\n\n    Socket::Socket(ThreadStatusCallback thread_status_callback)\n        : m_Socket(new SocketImpl(thread_status_callback))\n    {\n    }\n\n    Socket::~Socket()\n    {\n        if (!IsClosed())\n            Close();\n\n        delete m_Socket;\n        m_Socket = 0;\n    }\n\n    int64_t Socket::GetDescriptor()\n    {\n        if (IsClosed())\n            return -1;\n\n        return m_Socket->GetDescriptor();\n    }\n\n    WaitStatus Socket::Create(int64_t fd, int32_t family, int32_t type, int32_t protocol)\n    {\n        return m_Socket->Create((SocketImpl::SocketDescriptor)fd, family, type, protocol);\n    }\n\n    WaitStatus Socket::Create(AddressFamily family, SocketType type, ProtocolType protocol)\n    {\n        return m_Socket->Create(family, type, protocol);\n    }\n\n    bool Socket::IsClosed()\n    {\n        return m_Socket->IsClosed();\n    }\n\n    void Socket::Close()\n    {\n        m_Socket->Close();\n    }\n\n    ErrorCode Socket::GetLastError() const\n    {\n        return m_Socket->GetLastError();\n    }\n\n    WaitStatus Socket::SetBlocking(bool blocking)\n    {\n        return m_Socket->SetBlocking(blocking);\n    }\n\n    WaitStatus Socket::Bind(const char *path)\n    {\n        return m_Socket->Bind(path);\n    }\n\n    WaitStatus Socket::Bind(uint32_t address, uint16_t port)\n    {\n        return m_Socket->Bind(address, port);\n    }\n\n    WaitStatus Socket::Bind(const char *address, uint16_t port)\n    {\n        return m_Socket->Bind(address, port);\n    }\n\n    WaitStatus Socket::Bind(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port)\n    {\n        return m_Socket->Bind(address, scope, port);\n    }\n\n    WaitStatus Socket::Connect(const char *path)\n    {\n        return m_Socket->Connect(path);\n    }\n\n    WaitStatus Socket::Connect(uint32_t address, uint16_t port)\n    {\n        return m_Socket->Connect(address, port);\n    }\n\n    WaitStatus Socket::Connect(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port)\n    {\n        return m_Socket->Connect(address, scope, port);\n    }\n\n    WaitStatus Socket::Disconnect(bool reuse)\n    {\n        return m_Socket->Disconnect(reuse);\n    }\n\n    WaitStatus Socket::Shutdown(int32_t how)\n    {\n        return m_Socket->Shutdown(how);\n    }\n\n    WaitStatus Socket::GetLocalEndPointInfo(EndPointInfo &info)\n    {\n        return m_Socket->GetLocalEndPointInfo(info);\n    }\n\n    WaitStatus Socket::GetRemoteEndPointInfo(EndPointInfo &info)\n    {\n        return m_Socket->GetRemoteEndPointInfo(info);\n    }\n\n    WaitStatus Socket::Listen(int32_t backlog)\n    {\n        return m_Socket->Listen(backlog);\n    }\n\n    WaitStatus Socket::Accept(Socket **socket)\n    {\n        return m_Socket->Accept(socket);\n    }\n\n    WaitStatus Socket::Receive(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        return m_Socket->Receive(data, count, flags, len);\n    }\n\n    WaitStatus Socket::ReceiveArray(WSABuf *wsabufs, int32_t count, int32_t *len, SocketFlags c_flags)\n    {\n        return m_Socket->ReceiveArray(wsabufs, count, len, c_flags);\n    }\n\n    WaitStatus Socket::Send(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        return m_Socket->Send(data, count, flags, len);\n    }\n\n    WaitStatus Socket::SendArray(WSABuf *wsabufs, int32_t count, int32_t *sent, SocketFlags c_flags)\n    {\n        return m_Socket->SendArray(wsabufs, count, sent, c_flags);\n    }\n\n    WaitStatus Socket::SendTo(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        return m_Socket->SendTo(address, port, data, count, flags, len);\n    }\n\n    WaitStatus Socket::SendTo(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        return m_Socket->SendTo(path, data, count, flags, len);\n    }\n\n    WaitStatus Socket::SendTo(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        return m_Socket->SendTo(address, scope, port, data, count, flags, len);\n    }\n\n    WaitStatus Socket::RecvFrom(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n        return m_Socket->RecvFrom(address, port, data, count, flags, len, ep);\n    }\n\n    WaitStatus Socket::RecvFrom(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n        return m_Socket->RecvFrom(path, data, count, flags, len, ep);\n    }\n\n    WaitStatus Socket::RecvFrom(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n        return m_Socket->RecvFrom(address, scope, port, data, count, flags, len, ep);\n    }\n\n    WaitStatus Socket::Available(int32_t *amount)\n    {\n        return m_Socket->Available(amount);\n    }\n\n    WaitStatus Socket::Ioctl(int32_t command, const uint8_t *in_data, int32_t in_len, uint8_t *out_data, int32_t out_len, int32_t *written)\n    {\n        return m_Socket->Ioctl(command, in_data, in_len, out_data, out_len, written);\n    }\n\n    WaitStatus Socket::GetSocketOption(SocketOptionLevel level, SocketOptionName name, uint8_t *buffer, int32_t *length)\n    {\n        return m_Socket->GetSocketOption(level, name, buffer, length);\n    }\n\n    WaitStatus Socket::GetSocketOptionFull(SocketOptionLevel level, SocketOptionName name, int32_t *first, int32_t *second)\n    {\n        return m_Socket->GetSocketOptionFull(level, name, first, second);\n    }\n\n    WaitStatus Socket::Poll(std::vector<PollRequest> &requests, int32_t count, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        return SocketImpl::Poll(requests, count, timeout, result, error);\n    }\n\n    WaitStatus Socket::Poll(std::vector<PollRequest> &requests, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        return SocketImpl::Poll(requests, timeout, result, error);\n    }\n\n    WaitStatus Socket::Poll(PollRequest& request, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        return SocketImpl::Poll(request, timeout, result, error);\n    }\n\n    WaitStatus Socket::SetSocketOption(SocketOptionLevel level, SocketOptionName name, int32_t value)\n    {\n        return m_Socket->SetSocketOption(level, name, value);\n    }\n\n    WaitStatus Socket::SetSocketOptionLinger(SocketOptionLevel level, SocketOptionName name, bool enabled, int32_t seconds)\n    {\n        return m_Socket->SetSocketOptionLinger(level, name, enabled, seconds);\n    }\n\n    WaitStatus Socket::SetSocketOptionArray(SocketOptionLevel level, SocketOptionName name, const uint8_t *buffer, int32_t length)\n    {\n        return m_Socket->SetSocketOptionArray(level, name, buffer, length);\n    }\n\n    WaitStatus Socket::SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, uint32_t group_address, uint32_t local_address)\n    {\n        return m_Socket->SetSocketOptionMembership(level, name, group_address, local_address);\n    }\n\n#if IL2CPP_SUPPORT_IPV6\n    WaitStatus Socket::SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, IPv6Address ipv6, uint64_t interfaceOffset)\n    {\n        return m_Socket->SetSocketOptionMembership(level, name, ipv6, interfaceOffset);\n    }\n\n#endif\n\n    WaitStatus Socket::SendFile(const char *filename, TransmitFileBuffers *buffers, TransmitFileOptions options)\n    {\n        return m_Socket->SendFile(filename, buffers, options);\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Socket.h",
    "content": "#pragma once\n\n#include <string>\n#include <vector>\n\n#include \"il2cpp-config.h\"\n\n#include \"os/ErrorCodes.h\"\n#include \"os/Atomic.h\"\n#include \"os/Mutex.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class SocketImpl;\n\n    enum AddressFamily\n    {\n        kAddressFamilyError             = -1,\n        kAddressFamilyUnspecified       = 0,// AF_UNSPEC\n        kAddressFamilyUnix              = 1,// AF_UNIX\n        kAddressFamilyInterNetwork      = 2,// AF_INET\n        kAddressFamilyIpx               = 3,// AF_IPX\n        kAddressFamilySna               = 4,// AF_SNA\n        kAddressFamilyDecNet            = 5,// AF_DECnet\n        kAddressFamilyAppleTalk         = 6,// AF_APPLETALK\n        kAddressFamilyInterNetworkV6    = 7,// AF_INET6\n        kAddressFamilyIrda              = 8,// AF_IRDA\n    };\n\n    enum SocketType\n    {\n        kSocketTypeError        = -1,\n        kSocketTypeStream       = 0,// SOCK_STREAM\n        kSocketTypeDgram        = 1,// SOCK_DGRAM\n        kSocketTypeRaw          = 2,// SOCK_RAW\n        kSocketTypeRdm          = 3,// SOCK_RDM\n        kSocketTypeSeqpacket    = 4,// SOCK_SEQPACKET\n    };\n\n    enum ProtocolType\n    {\n        kProtocolTypeUnknown                            = -1,\n        kProtocolTypeIP                                 = 0,\n        kProtocolTypeIcmp                               = 1,\n        kProtocolTypeIgmp                               = 2,\n        kProtocolTypeGgp                                = 3,\n        kProtocolTypeTcp                                = 6,\n        kProtocolTypePup                                = 12,\n        kProtocolTypeUdp                                = 17,\n        kProtocolTypeIdp                                = 22,\n        kProtocolTypeND                                 = 77,\n        kProtocolTypeRaw                                = 255,\n        kProtocolTypeUnspecified                        = 0,\n        kProtocolTypeIpx                                = 1000,\n        kProtocolTypeSpx                                = 1256,\n        kProtocolTypeSpxII                              = 1257,\n\n// #if NET_1_1\n        kProtocolTypeIPv6                               = 41,\n// #endif\n\n// #if NET_2_0\n        kProtocolTypeIPv4                               = 4,\n        kProtocolTypeIPv6RoutingHeader                  = 43,\n        kProtocolTypeIPv6FragmentHeader                 = 44,\n        kProtocolTypeIPSecEncapsulatingSecurityPayload  = 50,\n        kProtocolTypeIPSecAuthenticationHeader          = 51,\n        kProtocolTypeIcmpV6                             = 58,\n        kProtocolTypeIPv6NoNextHeader                   = 59,\n        kProtocolTypeIPv6DestinationOptions             = 60,\n        kProtocolTypeIPv6HopByHopOptions                = 0,\n// #endif\n    };\n\n    enum SocketFlags\n    {\n        kSocketFlagsNone                    = 0x00000000,\n        kSocketFlagsOutOfBand               = 0x00000001,\n        kSocketFlagsPeek                    = 0x00000002,\n        kSocketFlagsDontRoute               = 0x00000004,\n        kSocketFlagsMaxIOVectorLength       = 0x00000010,\n// #if NET_2_0\n        kSocketFlagsTruncated               = 0x00000100,\n        kSocketFlagsControlDataTruncated    = 0x00000200,\n        kSocketFlagsBroadcast               = 0x00000400,\n        kSocketFlagsMulticast               = 0x00000800,\n// #endif\n        kSocketFlagsPartial                 = 0x00008000,\n    };\n\n    enum SocketOptionLevel\n    {\n        kSocketOptionLevelSocket    = 65535,\n        kSocketOptionLevelIP        = 0,\n        kSocketOptionLevelTcp       = 6,\n        kSocketOptionLevelUdp       = 17,\n\n//#if NET_1_1\n        kSocketOptionLevelIPv6      = 41,\n//#endif\n    };\n\n    enum SocketOptionName\n    {\n        kSocketOptionNameDebug                  = 1,\n        kSocketOptionNameAcceptConnection       = 2,\n        kSocketOptionNameReuseAddress           = 4,\n        kSocketOptionNameKeepAlive              = 8,\n        kSocketOptionNameDontRoute              = 16,\n        kSocketOptionNameBroadcast              = 32,\n        kSocketOptionNameUseLoopback            = 64,\n        kSocketOptionNameLinger                 = 128,\n        kSocketOptionNameOutOfBandInline        = 256,\n        kSocketOptionNameDontLinger             = -129,\n        kSocketOptionNameExclusiveAddressUse    = -5,\n        kSocketOptionNameSendBuffer             = 4097,\n        kSocketOptionNameReceiveBuffer          = 4098,\n        kSocketOptionNameSendLowWater           = 4099,\n        kSocketOptionNameReceiveLowWater        = 4100,\n        kSocketOptionNameSendTimeout            = 4101,\n        kSocketOptionNameReceiveTimeout         = 4102,\n        kSocketOptionNameError                  = 4103,\n        kSocketOptionNameType                   = 4104,\n        kSocketOptionNameMaxConnections         = 2147483647,\n        kSocketOptionNameIPOptions              = 1,\n        kSocketOptionNameHeaderIncluded         = 2,\n        kSocketOptionNameTypeOfService          = 3,\n        kSocketOptionNameIpTimeToLive           = 4,\n        kSocketOptionNameMulticastInterface     = 9,\n        kSocketOptionNameMulticastTimeToLive    = 10,\n        kSocketOptionNameMulticastLoopback      = 11,\n        kSocketOptionNameAddMembership          = 12,\n        kSocketOptionNameDropMembership         = 13,\n        kSocketOptionNameDontFragment           = 14,\n        kSocketOptionNameAddSourceMembership    = 15,\n        kSocketOptionNameDropSourceMembership   = 16,\n        kSocketOptionNameBlockSource            = 17,\n        kSocketOptionNameUnblockSource          = 18,\n        kSocketOptionNamePacketInformation      = 19,\n        kSocketOptionNameNoDelay                = 1,\n        kSocketOptionNameBsdUrgent              = 2,\n        kSocketOptionNameExpedited              = 2,\n        kSocketOptionNameNoChecksum             = 1,\n        kSocketOptionNameChecksumCoverage       = 20,\n        kSocketOptionNameIPv6Only               = 27,\n\n// #if NET_2_0\n        kSocketOptionNameHopLimit               = 21,\n        kSocketOptionNameUpdateAcceptContext    = 28683,\n        kSocketOptionNameUpdateConnectContext   = 28688,\n// #endif\n    };\n\n    enum PollFlags\n    {\n        kPollFlagsNone  = 0,\n        kPollFlagsIn    = 1,\n        kPollFlagsPri   = 2,\n        kPollFlagsOut   = 4,\n        kPollFlagsErr   = 8,\n        kPollFlagsHup   = 0x10,\n        kPollFlagsNVal  = 0x20,\n        kPollFlagsAny   = 0xffffffff\n    };\n\n    enum SocketError\n    {\n        kInterrupted    = 4,// EINTR on POSIX and WSAEINTR on Windows\n        kInvalidHandle  = 9 // EBADF on POSIX and WSAEBADF on Windows\n    };\n\n    inline void operator|=(PollFlags& left, PollFlags right)\n    {\n        left = static_cast<PollFlags>(static_cast<int>(left) | static_cast<int>(right));\n    }\n\n    enum TransmitFileOptions\n    {\n        kTransmitFileOptionsUseDefaultWorkerThread  = 0x00000000,\n        kTransmitFileOptionsDisconnect              = 0x00000001,\n        kTransmitFileOptionsReuseSocket             = 0x00000002,\n        kTransmitFileOptionsWriteBehind             = 0x00000004,\n        kTransmitFileOptionsUseSystemThread         = 0x00000010,\n        kTransmitFileOptionsUseKernelApc            = 0x00000020,\n    };\n\n    class Socket;\n\n    struct PollRequest\n    {\n        int64_t fd;\n        PollFlags events;\n        PollFlags revents;\n    };\n\n#if IL2CPP_SUPPORT_IPV6\n    struct IPv6Address\n    {\n        uint8_t addr[16];\n    };\n#endif\n\n// TODO: this should really be UNIX_PATH_MAX or SUN_LEN(n)\n#define END_POINT_MAX_PATH_LEN  255\n\n#if IL2CPP_COMPILER_MSVC\n#pragma warning( push )\n#pragma warning( disable : 4200 )\n#endif\n\n    struct EndPointInfo\n    {\n        AddressFamily family;\n\n        union\n        {\n            struct\n            {\n                uint32_t port;\n                uint32_t address;\n            } inet;\n            char path[END_POINT_MAX_PATH_LEN];\n            uint8_t raw[IL2CPP_ZERO_LEN_ARRAY];\n        } data;\n    };\n\n#if IL2CPP_COMPILER_MSVC\n#pragma warning( pop )\n#endif\n\n// NOTE(gab): this must be binary compatible with Windows's WSABUF\n    struct WSABuf\n    {\n        uint32_t length;\n        void *buffer;\n    };\n\n// NOTE(gab): this must be binary compatible with Window's TRANSMIT_FILE_BUFFERS\n    struct TransmitFileBuffers\n    {\n        void *head;\n        uint32_t head_length;\n        void *tail;\n        uint32_t tail_length;\n    };\n\n// Note: this callback can be invoked by the os-specific implementation when an\n// interrupt is received or when the native code is looping in a potentially long\n// loop.\n// If the callback retun false, the executiong of the os-specific method is\n// gracefully interrupted, and an error is supposed to be returned by the\n// os-specific implementation.\n// The callback is allowed to throw exceptions (for example a ThreadAborted exception):\n// in this case, it is up to the os-specific implementation to properly deal with\n// cleaning up the temporarely allocated memory (if any).\n    typedef bool (*ThreadStatusCallback)();\n\n    class Socket : public il2cpp::utils::NonCopyable\n    {\n    public:\n\n        Socket(ThreadStatusCallback thread_status_callback);\n        ~Socket();\n\n        // Note: this Create is only used internally\n        WaitStatus Create(int64_t fd, int32_t family, int32_t type, int32_t protocol);\n        WaitStatus Create(AddressFamily family, SocketType type, ProtocolType protocol);\n\n        bool IsClosed();\n        void Close();\n\n        int64_t GetDescriptor();\n\n        ErrorCode GetLastError() const;\n\n        WaitStatus SetBlocking(bool blocking);\n\n        WaitStatus Listen(int32_t blacklog);\n\n        WaitStatus Bind(const char *path);\n        WaitStatus Bind(uint32_t address, uint16_t port);\n        WaitStatus Bind(const char *address, uint16_t port);\n        WaitStatus Bind(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port);\n\n        WaitStatus Connect(const char *path);\n        WaitStatus Connect(uint32_t address, uint16_t port);\n        WaitStatus Connect(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port);\n\n        WaitStatus Disconnect(bool reuse);\n        WaitStatus Shutdown(int32_t how);\n\n        WaitStatus GetLocalEndPointInfo(EndPointInfo &info);\n        WaitStatus GetRemoteEndPointInfo(EndPointInfo &info);\n\n        WaitStatus Receive(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus Send(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n\n        WaitStatus SendArray(WSABuf *wsabufs, int32_t count, int32_t *sent, SocketFlags c_flags);\n        WaitStatus ReceiveArray(WSABuf *wsabufs, int32_t count, int32_t *len, SocketFlags c_flags);\n\n        WaitStatus SendTo(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus SendTo(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus SendTo(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n\n        WaitStatus RecvFrom(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n        WaitStatus RecvFrom(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n        WaitStatus RecvFrom(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n\n        WaitStatus Available(int32_t *amount);\n\n        WaitStatus Accept(Socket **socket);\n\n        WaitStatus Ioctl(int32_t command, const uint8_t *in_data, int32_t in_len, uint8_t *out_data, int32_t out_len, int32_t *written);\n\n        WaitStatus GetSocketOption(SocketOptionLevel level, SocketOptionName name, uint8_t *buffer, int32_t *length);\n        WaitStatus GetSocketOptionFull(SocketOptionLevel level, SocketOptionName name, int32_t *first, int32_t *second);\n\n        WaitStatus SetSocketOption(SocketOptionLevel level, SocketOptionName name, int32_t value);\n        WaitStatus SetSocketOptionLinger(SocketOptionLevel level, SocketOptionName name, bool enabled, int32_t seconds);\n        WaitStatus SetSocketOptionArray(SocketOptionLevel level, SocketOptionName name, const uint8_t *buffer, int32_t length);\n        WaitStatus SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, uint32_t group_address, uint32_t local_address);\n#if IL2CPP_SUPPORT_IPV6\n        WaitStatus SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, IPv6Address ipv6, uint64_t interfaceOffset);\n#endif\n\n        WaitStatus SendFile(const char *filename, TransmitFileBuffers *buffers, TransmitFileOptions options);\n\n        static WaitStatus Poll(std::vector<PollRequest> &requests, int32_t count, int32_t timeout, int32_t *result, int32_t *error);\n        static WaitStatus Poll(std::vector<PollRequest> &requests, int32_t timeout, int32_t *result, int32_t *error);\n        static WaitStatus Poll(PollRequest &request, int32_t timeout, int32_t *result, int32_t *error);\n\n        static WaitStatus GetHostName(std::string &name);\n        static WaitStatus GetHostByName(const std::string &host, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list);\n        static WaitStatus GetHostByAddr(const std::string &address, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list);\n\n        static void Startup();\n        static void Cleanup();\n\n    private:\n        SocketImpl* m_Socket;\n    };\n\n/// Sockets should generally be referenced through SocketHandles for thread-safety.\n/// Handles are stored in a table and can be safely used even when the socket has already\n/// been deleted.\n    typedef uint32_t SocketHandle;\n\n    enum\n    {\n        kInvalidSocketHandle = 0\n    };\n\n    SocketHandle CreateSocketHandle(Socket* socket);\n    Socket* AcquireSocketHandle(SocketHandle handle);\n    void ReleaseSocketHandle(SocketHandle handle);\n\n    inline SocketHandle PointerToSocketHandle(void* ptr)\n    {\n        // Double cast to avoid warnings.\n        return static_cast<SocketHandle>(reinterpret_cast<size_t>(ptr));\n    }\n\n/// Helper to automatically acquire and release a Socket within a scope.\n    struct SocketHandleWrapper\n    {\n        SocketHandleWrapper()\n            : m_Handle(kInvalidSocketHandle)\n            , m_Socket(NULL) {}\n        SocketHandleWrapper(SocketHandle handle)\n            : m_Handle(handle)\n        {\n            m_Socket = AcquireSocketHandle(handle);\n        }\n\n        SocketHandleWrapper(const SocketHandleWrapper& other)\n        {\n            m_Handle = other.m_Handle;\n            if (m_Handle != kInvalidSocketHandle)\n                m_Socket = AcquireSocketHandle(m_Handle);\n            else\n                m_Socket = NULL;\n        }\n\n        ~SocketHandleWrapper()\n        {\n            Release();\n        }\n\n        void Acquire(SocketHandle handle)\n        {\n            Release();\n            m_Handle = handle;\n            m_Socket = AcquireSocketHandle(handle);\n        }\n\n        void Release()\n        {\n            if (m_Socket)\n                ReleaseSocketHandle(m_Handle);\n            m_Socket = NULL;\n            m_Handle = kInvalidSocketHandle;\n        }\n\n        bool IsValid() const\n        {\n            return (m_Socket != NULL);\n        }\n\n        SocketHandle GetHandle() const\n        {\n            return m_Handle;\n        }\n\n        Socket* GetSocket() const\n        {\n            return m_Socket;\n        }\n\n        Socket* operator->() const\n        {\n            return GetSocket();\n        }\n\n        SocketHandleWrapper& operator=(const SocketHandleWrapper& other)\n        {\n            Acquire(other.GetHandle());\n            return *this;\n        }\n\n    private:\n        SocketHandle m_Handle;\n        Socket* m_Socket;\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/StackTrace.h",
    "content": "#pragma once\n\n#include <string>\n#include <vector>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    typedef bool(*WalkStackCallback)(Il2CppMethodPointer frame, void* context);\n\n    class StackTrace\n    {\n    public:\n        enum WalkOrder\n        {\n            kFirstCalledToLastCalled,\n            kLastCalledToFirstCalled\n        };\n\n        // Walks the stack calling callback for each frame in the stack\n        // Stops when callback returns false\n        static void WalkStack(WalkStackCallback callback, void* context, WalkOrder walkOrder);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Std/ThreadImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_THREADS_STD\n\n#include \"os/Thread.h\"\n#include \"ThreadImpl.h\"\n\n#include <thread>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    struct StartData\n    {\n        Thread::StartFunc m_StartFunc;\n        void* m_StartArg;\n    };\n\n\n    static void ThreadStartWrapper(void* arg)\n    {\n        StartData* startData = (StartData*)arg;\n        startData->m_StartFunc(startData->m_StartArg);\n\n        free(startData);\n    }\n\n    uint64_t ThreadImpl::Id()\n    {\n        return m_Thread.get_id().hash();\n    }\n\n    ErrorCode ThreadImpl::Run(Thread::StartFunc func, void* arg)\n    {\n        StartData* startData = (StartData*)malloc(sizeof(StartData));\n        startData->m_StartFunc = func;\n        startData->m_StartArg = arg;\n\n        std::thread t(ThreadStartWrapper, startData);\n\n        m_Thread.swap(t);\n\n        return kErrorCodeSuccess;\n    }\n\n    WaitStatus ThreadImpl::Join(uint32_t ms)\n    {\n        m_Thread.join();\n\n        return kWaitStatusSuccess;\n    }\n\n    ErrorCode ThreadImpl::Sleep(uint32_t milliseconds)\n    {\n        std::chrono::milliseconds dura(milliseconds);\n        std::this_thread::sleep_for(dura);\n\n        return kErrorCodeSuccess;\n    }\n\n    uint64_t ThreadImpl::CurrentThreadId()\n    {\n        return std::this_thread::get_id().hash();\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Std/ThreadImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_THREADS_STD\n\n#include \"os/ErrorCodes.h\"\n#include \"os/Thread.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\n#include <thread>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class ThreadImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n        ThreadImpl();\n        ~ThreadImpl();\n        uint64_t Id();\n        ErrorCode Run(Thread::StartFunc func, void* arg);\n        WaitStatus Join();\n        WaitStatus Join(uint32_t ms);\n        static WaitStatus Sleep(uint32_t milliseconds);\n        static uint64_t CurrentThreadId();\n    private:\n        std::thread m_Thread;\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Thread.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"os/Mutex.h\"\n#include \"os/Thread.h\"\n#include \"os/ThreadLocalValue.h\"\n#if IL2CPP_THREADS_STD\n#include \"os/Std/ThreadImpl.h\"\n#elif IL2CPP_TARGET_WINDOWS\n#include \"os/Win32/ThreadImpl.h\"\n#elif IL2CPP_THREADS_PTHREAD\n#include \"os/Posix/ThreadImpl.h\"\n#else\n#include \"os/ThreadImpl.h\"\n#endif\n\n#include \"utils/dynamic_array.h\"\n\n#include <limits>\n\nnamespace il2cpp\n{\nnamespace os\n{\n/// TLS variable referring to current thread.\n    static ThreadLocalValue s_CurrentThread;\n\n    // TLS variable referring to whether this thread is currently executing Thread::Shutdown\n    // It is thread local for thread safety\n    static ThreadLocalValue s_IsCleaningUpThreads;\n\n    static FastMutex s_AliveThreadsMutex;\n    static il2cpp::utils::dynamic_array<Thread*> s_AliveThreads;\n\n    static bool GetIsCleaningUpThreads()\n    {\n        void* value = NULL;\n        s_IsCleaningUpThreads.GetValue(&value);\n        return reinterpret_cast<intptr_t>(value) != 0;\n    }\n\n    static void SetIsCleaningUpThreads(bool value)\n    {\n        s_IsCleaningUpThreads.SetValue(reinterpret_cast<void*>(static_cast<intptr_t>(value)));\n    }\n\n    Thread::Thread()\n        : m_Thread(new ThreadImpl())\n        , m_State(kThreadCreated)\n        , m_ThreadExitedEvent(true) // Manual reset event\n        , m_CleanupFunc(NULL)\n        , m_CleanupFuncArg(NULL)\n    {\n        FastAutoLock lock(&s_AliveThreadsMutex);\n        s_AliveThreads.push_back(this);\n    }\n\n    Thread::Thread(ThreadImpl* thread)\n        : m_Thread(thread)\n        , m_State(kThreadRunning)\n        , m_CleanupFunc(NULL)\n        , m_CleanupFuncArg(NULL)\n    {\n        FastAutoLock lock(&s_AliveThreadsMutex);\n        s_AliveThreads.push_back(this);\n    }\n\n    Thread::~Thread()\n    {\n        delete m_Thread;\n\n        if (!GetIsCleaningUpThreads())\n        {\n            FastAutoLock lock(&s_AliveThreadsMutex);\n            size_t count = s_AliveThreads.size();\n            for (size_t i = 0; i < count; i++)\n            {\n                if (s_AliveThreads[i] == this)\n                {\n                    s_AliveThreads.erase_swap_back(&s_AliveThreads[i]);\n                    break;\n                }\n            }\n        }\n    }\n\n    void Thread::Init()\n    {\n        Thread* thread = GetOrCreateCurrentThread();\n        if (thread->GetApartment() == kApartmentStateUnknown)\n            thread->SetApartment(kApartmentStateInMTA);\n    }\n\n    void Thread::Shutdown()\n    {\n        Thread* thread = GetCurrentThread();\n        thread->SetApartment(kApartmentStateUnknown);\n\n        SetIsCleaningUpThreads(true);\n\n        FastAutoLock lock(&s_AliveThreadsMutex);\n        size_t count = s_AliveThreads.size();\n        for (size_t i = 0; i < count; i++)\n            delete s_AliveThreads[i];\n\n        s_AliveThreads.clear();\n        SetIsCleaningUpThreads(false);\n    }\n\n    Thread::ThreadId Thread::Id()\n    {\n        return m_Thread->Id();\n    }\n\n    void Thread::SetName(const std::string& name)\n    {\n        m_Thread->SetName(name);\n    }\n\n    void Thread::SetPriority(ThreadPriority priority)\n    {\n        m_Thread->SetPriority(priority);\n    }\n\n    ThreadPriority Thread::GetPriority()\n    {\n        return m_Thread->GetPriority();\n    }\n\n    void Thread::SetStackSize(size_t stackSize)\n    {\n        m_Thread->SetStackSize(stackSize);\n    }\n\n    struct StartData\n    {\n        Thread* thread;\n        Thread::StartFunc startFunction;\n        void* startFunctionArgument;\n    };\n\n/// Wrapper for the user's thread start function. Sets s_CurrentThread.\n    void Thread::RunWrapper(void* arg)\n    {\n        StartData* data = reinterpret_cast<StartData*>(arg);\n\n        // Store thread reference.\n        Thread* thread = data->thread;\n\n        const ApartmentState apartment = thread->GetExplicitApartment();\n        if (apartment != kApartmentStateUnknown)\n        {\n            thread->SetExplicitApartment(kApartmentStateUnknown);\n            thread->SetApartment(apartment);\n        }\n\n        s_CurrentThread.SetValue(thread);\n\n        // Get rid of StartData.\n        StartFunc startFunction = data->startFunction;\n        void* startFunctionArgument = data->startFunctionArgument;\n        delete data;\n\n        // Make sure thread exit event is not signaled.\n        thread->m_ThreadExitedEvent.Reset();\n\n        // Run user thread start function.\n        thread->m_State = kThreadRunning;\n        startFunction(startFunctionArgument);\n        thread->m_State = kThreadExited;\n\n        thread->SetApartment(kApartmentStateUnknown);\n\n        CleanupFunc cleanupFunc = thread->m_CleanupFunc;\n        void* cleanupFuncArg = thread->m_CleanupFuncArg;\n\n        // Signal that we've finished execution.\n        thread->m_ThreadExitedEvent.Set();\n\n        if (cleanupFunc)\n            cleanupFunc(cleanupFuncArg);\n    }\n\n    ErrorCode Thread::Run(StartFunc func, void* arg)\n    {\n        IL2CPP_ASSERT(m_State == kThreadCreated || m_State == kThreadExited);\n\n        StartData* startData = new StartData;\n        startData->startFunction = func;\n        startData->startFunctionArgument = arg;\n        startData->thread = this;\n\n        return m_Thread->Run(RunWrapper, startData);\n    }\n\n    WaitStatus Thread::Join()\n    {\n        IL2CPP_ASSERT(this != GetCurrentThread() && \"Trying to join the current thread will deadlock\");\n        return Join(std::numeric_limits<uint32_t>::max());\n    }\n\n    WaitStatus Thread::Join(uint32_t ms)\n    {\n        // Wait for thread exit event.\n        if (m_ThreadExitedEvent.Wait(ms, true) != kWaitStatusSuccess)\n            return kWaitStatusFailure;\n\n        return kWaitStatusSuccess;\n    }\n\n    void Thread::QueueUserAPC(APCFunc func, void* context)\n    {\n        m_Thread->QueueUserAPC(func, context);\n    }\n\n    ApartmentState Thread::GetApartment()\n    {\n#if IL2CPP_THREAD_IMPL_HAS_COM_APARTMENTS\n        return m_Thread->GetApartment();\n#else\n        return kApartmentStateUnknown;\n#endif\n    }\n\n    ApartmentState Thread::GetExplicitApartment()\n    {\n#if IL2CPP_THREAD_IMPL_HAS_COM_APARTMENTS\n        return m_Thread->GetExplicitApartment();\n#else\n        return kApartmentStateUnknown;\n#endif\n    }\n\n    ApartmentState Thread::SetApartment(ApartmentState state)\n    {\n#if IL2CPP_THREAD_IMPL_HAS_COM_APARTMENTS\n        return m_Thread->SetApartment(state);\n#else\n        NO_UNUSED_WARNING(state);\n        return GetApartment();\n#endif\n    }\n\n    void Thread::SetExplicitApartment(ApartmentState state)\n    {\n#if IL2CPP_THREAD_IMPL_HAS_COM_APARTMENTS\n        m_Thread->SetExplicitApartment(state);\n#else\n        NO_UNUSED_WARNING(state);\n#endif\n    }\n\n    void Thread::Sleep(uint32_t milliseconds, bool interruptible)\n    {\n        ThreadImpl::Sleep(milliseconds, interruptible);\n    }\n\n    uint64_t Thread::CurrentThreadId()\n    {\n        return ThreadImpl::CurrentThreadId();\n    }\n\n    Thread* Thread::GetCurrentThread()\n    {\n        void* value;\n        s_CurrentThread.GetValue(&value);\n        IL2CPP_ASSERT(value != NULL);\n        return reinterpret_cast<Thread*>(value);\n    }\n\n    Thread* Thread::GetOrCreateCurrentThread()\n    {\n        Thread* thread = NULL;\n        s_CurrentThread.GetValue(reinterpret_cast<void**>(&thread));\n        if (thread)\n            return thread;\n\n        thread = new Thread(ThreadImpl::CreateForCurrentThread());\n        s_CurrentThread.SetValue(thread);\n\n        return thread;\n    }\n\n    void Thread::DetachCurrentThread()\n    {\n#if IL2CPP_DEBUG\n        void* value;\n        s_CurrentThread.GetValue(&value);\n        IL2CPP_ASSERT(value != NULL);\n#endif\n\n        s_CurrentThread.SetValue(NULL);\n    }\n\n#if NET_4_0\n\n    bool Thread::YieldInternal()\n    {\n        return ThreadImpl::YieldInternal();\n    }\n\n#endif\n\n#if IL2CPP_HAS_NATIVE_THREAD_CLEANUP\n\n    void Thread::SetNativeThreadCleanup(ThreadCleanupFunc cleanupFunction)\n    {\n        ThreadImpl::SetNativeThreadCleanup(cleanupFunction);\n    }\n\n    void Thread::RegisterCurrentThreadForCleanup(void* arg)\n    {\n        ThreadImpl::RegisterCurrentThreadForCleanup(arg);\n    }\n\n    void Thread::UnregisterCurrentThreadForCleanup()\n    {\n        ThreadImpl::UnregisterCurrentThreadForCleanup();\n    }\n\n#endif\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Thread.h",
    "content": "#pragma once\n\n#include \"os/ErrorCodes.h\"\n#include \"os/Handle.h\"\n#include \"os/Event.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class ThreadImpl;\n\n    enum ThreadPriority\n    {\n        kThreadPriorityLowest = 0,\n        kThreadPriorityLow = 1,\n        kThreadPriorityNormal = 2,\n        kThreadPriorityHigh = 3,\n        kThreadPriorityHighest = 4\n    };\n\n    enum ApartmentState\n    {\n        kApartmentStateInSTA = 0,\n        kApartmentStateInMTA = 1,\n        kApartmentStateUnknown = 2,\n        kApartmentStateCoInitialized = 4,\n    };\n\n    class Thread : public il2cpp::utils::NonCopyable\n    {\n    public:\n        Thread();\n        ~Thread();\n\n        typedef void (*StartFunc) (void* arg);\n        // Use STDCALL calling convention on Windows, as it will be called back directly from the OS. This is defined as nothing on other platforms.\n        typedef void (STDCALL * APCFunc)(void* context);\n        typedef uint64_t ThreadId;\n        typedef void (*CleanupFunc) (void* arg);\n\n        /// Initialize/Shutdown thread subsystem. Must be called on main thread.\n        static void Init();\n        static void Shutdown();\n\n        ErrorCode Run(StartFunc func, void* arg);\n        ThreadId Id();\n\n        /// Set thread name for debugging purposes. Won't do anything if not supported\n        /// by platform.\n        void SetName(const std::string& name);\n\n        void SetPriority(ThreadPriority priority);\n        ThreadPriority GetPriority();\n\n        void SetStackSize(size_t stackSize);\n\n        void SetCleanupFunction(CleanupFunc cleanupFunc, void* arg)\n        {\n            m_CleanupFunc = cleanupFunc;\n            m_CleanupFuncArg = arg;\n        }\n\n        /// Interruptible, infinite wait join.\n        WaitStatus Join();\n\n        /// Interruptible, timed wait join.\n        WaitStatus Join(uint32_t ms);\n\n        /// Execute the given function on the thread the next time the thread executes\n        /// an interruptible blocking operation.\n        /// NOTE: The APC is allowed to raise exceptions!\n        void QueueUserAPC(APCFunc func, void* context);\n\n        // Explicit versions modify state without actually changing COM state.\n        // Used to set thread state before it's started.\n        ApartmentState GetApartment();\n        ApartmentState GetExplicitApartment();\n        ApartmentState SetApartment(ApartmentState state);\n        void SetExplicitApartment(ApartmentState state);\n\n        /// Interruptible, timed sleep.\n        static void Sleep(uint32_t ms, bool interruptible = false);\n\n        static ThreadId CurrentThreadId();\n        static Thread* GetCurrentThread();\n        static Thread* GetOrCreateCurrentThread();\n        static void DetachCurrentThread();\n\n#if NET_4_0\n        static bool YieldInternal();\n#endif\n\n#if IL2CPP_HAS_NATIVE_THREAD_CLEANUP\n        typedef void (*ThreadCleanupFunc) (void* arg);\n        static void SetNativeThreadCleanup(ThreadCleanupFunc cleanupFunction);\n        static void RegisterCurrentThreadForCleanup(void* arg);\n        static void UnregisterCurrentThreadForCleanup();\n#endif\n\n        static const uint64_t kInvalidThreadId = 0;\n\n    private:\n\n        enum ThreadState\n        {\n            kThreadCreated,\n            kThreadRunning,\n            kThreadWaiting,\n            kThreadExited\n        };\n\n        ThreadState m_State;\n\n        friend class ThreadImpl; // m_Thread\n\n        ThreadImpl* m_Thread;\n\n        /// Event that the thread signals when it finishes execution. Used for joins.\n        /// Supports interruption.\n        Event m_ThreadExitedEvent;\n\n        CleanupFunc m_CleanupFunc;\n        void* m_CleanupFuncArg;\n\n        Thread(ThreadImpl* thread);\n\n        static void RunWrapper(void* arg);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/ThreadLocalValue.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"os/ThreadLocalValue.h\"\n#if IL2CPP_THREADS_WIN32\n#include \"os/Win32/ThreadLocalValueImpl.h\"\n#elif IL2CPP_THREADS_PSP2\n#include \"os/PSP2/ThreadLocalValueImpl.h\"\n#elif IL2CPP_THREADS_PTHREAD\n#include \"os/Posix/ThreadLocalValueImpl.h\"\n#else\n#include \"os/ThreadLocalValueImpl.h\"\n#endif\n\nnamespace il2cpp\n{\nnamespace os\n{\n    ThreadLocalValue::ThreadLocalValue()\n        : m_ThreadLocalValue(new ThreadLocalValueImpl())\n    {\n    }\n\n    ThreadLocalValue::~ThreadLocalValue()\n    {\n        delete m_ThreadLocalValue;\n    }\n\n    ErrorCode ThreadLocalValue::SetValue(void* value)\n    {\n        return m_ThreadLocalValue->SetValue(value);\n    }\n\n    ErrorCode ThreadLocalValue::GetValue(void** value)\n    {\n        return m_ThreadLocalValue->GetValue(value);\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/ThreadLocalValue.h",
    "content": "#pragma once\n\n#include \"os/ErrorCodes.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class ThreadLocalValueImpl;\n\n    class ThreadLocalValue\n    {\n    public:\n        ThreadLocalValue();\n        ~ThreadLocalValue();\n        ErrorCode SetValue(void* value);\n        ErrorCode GetValue(void** value);\n    private:\n        ThreadLocalValueImpl* m_ThreadLocalValue;\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Time.h",
    "content": "#pragma once\n\n#include <stdint.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class Time\n    {\n    public:\n        /* Returns the number of milliseconds from boot time: this should be monotonic */\n        static uint32_t GetTicksMillisecondsMonotonic();\n\n        /* Returns the number of 100ns ticks from unspecified time: this should be monotonic */\n        static int64_t GetTicks100NanosecondsMonotonic();\n\n        /* Returns the number of 100ns ticks since 1/1/1, UTC timezone */\n        static int64_t GetTicks100NanosecondsDateTime();\n\n        // Retrieves the current system date and time. The information is in Coordinated Universal Time(UTC) format.\n        static int64_t GetSystemTimeAsFileTime();\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/TimeZone.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <string>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class TimeZone\n    {\n    public:\n        /*\n         * This is heavily based on zdump.c from glibc 2.2.\n         *\n         *  * data[0]:  start of daylight saving time (in DateTime ticks).\n         *  * data[1]:  end of daylight saving time (in DateTime ticks).\n         *  * data[2]:  utcoffset (in TimeSpan ticks).\n         *  * data[3]:  additional offset when daylight saving (in TimeSpan ticks).\n         *  * name[0]:  name of this timezone when not daylight saving.\n         *  * name[1]:  name of this timezone when daylight saving.\n         *\n         *  FIXME: This only works with \"standard\" Unix dates (years between 1900 and 2100) while\n         *         the class library allows years between 1 and 9999.\n         *\n         *  Returns true on success and zero on failure.\n         */\n        static bool GetTimeZoneData(int32_t year, int64_t data[4], std::string names[2]);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Tizen/ExtendedAtomicOps.h",
    "content": "#pragma once\n\n#define ASM_LABEL(i)    #i \":\\n\\t\"\n\n#define ATOMIC_LOAD(PRE, POST) \\\n    atomic_word res; \\\n    __asm__ __volatile__ \\\n    ( \\\n        PRE \\\n        \"ldr    %0, %1\\n\\t\" \\\n        POST \\\n        : \"=r\" (res) \\\n        : \"m\" (*p) \\\n        : \"memory\" \\\n    ); \\\n    return res;\n\n#define ATOMIC_LOAD2(PRE, POST) \\\n    atomic_word2 ret; \\\n    atomic_word res; \\\n    __asm__ __volatile__ \\\n    ( \\\n        PRE \\\n        \"ldr    %0, %1\\n\\t\" \\\n        POST \\\n        : \"=r\" (res) \\\n        : \"m\" (*p) \\\n        : \"memory\" \\\n    ); \\\n    ret.v = res; \\\n    return ret;\n\n#define ATOMIC_STORE(PRE, POST) \\\n    __asm__ __volatile__ \\\n    ( \\\n        PRE \\\n        \"str    %1, %0\\n\\t\" \\\n        POST \\\n        : \"=m\" (*p) \\\n        : \"r\" (v) \\\n        : \"memory\" \\\n    );\n\n#define ATOMIC_XCHG(PRE, POST) \\\n    atomic_word res; \\\n    atomic_word success; \\\n    __asm__ __volatile__ \\\n    ( \\\n        PRE \\\n    ASM_LABEL (0) \\\n        \"ldrex  %2, [%4]\\n\\t\" \\\n        \"strex  %0, %3, [%4]\\n\\t\" \\\n        \"teq    %0, #0\\n\\t\" \\\n        \"bne    0b\\n\\t\" \\\n        POST \\\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (res) \\\n        : \"r\" (v), \"r\" (p) \\\n        : \"cc\", \"memory\" \\\n    ); \\\n    return res;\n\n#define ATOMIC_XCHG2(PRE, POST) \\\n    atomic_word2 ret; \\\n    atomic_word res; \\\n    atomic_word success; \\\n    __asm__ __volatile__ \\\n    ( \\\n        PRE \\\n    ASM_LABEL (0) \\\n        \"ldrex  %2, [%4]\\n\\t\" \\\n        \"strex  %0, %3, [%4]\\n\\t\" \\\n        \"teq    %0, #0\\n\\t\" \\\n        \"bne    0b\\n\\t\" \\\n        POST \\\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (res) \\\n        : \"r\" (v), \"r\" (p) \\\n        : \"cc\", \"memory\" \\\n    ); \\\n    ret.v = res; \\\n    return ret;\n\nstatic inline void atomic_thread_fence(int)\n{\n    __sync_synchronize();\n}\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, int)\n{\n    ATOMIC_LOAD(\"\", \"\")\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, int)\n{\n    ATOMIC_STORE(\"\", \"\")\n}\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word v, int)\n{\n    ATOMIC_XCHG(\"\", \"\")\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word* oldval, atomic_word newval, int, int)\n{\n    return __sync_val_compare_and_swap(p, oldval, newval);\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word* oldval, atomic_word newval, int, int)\n{\n    return __sync_val_compare_and_swap(p, oldval, newval);\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word *p, atomic_word val, int)\n{\n    return __sync_fetch_and_add(p, val);\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word *p, atomic_word val, int)\n{\n    return __sync_fetch_and_add(p, -val);\n}\n\n/*\n *  extensions\n */\n\nstatic inline void atomic_retain(volatile int *p)\n{\n    __sync_fetch_and_add(p, 1);\n}\n\nstatic inline bool atomic_release(volatile int *p)\n{\n    return __sync_fetch_and_add(p, -1) == 1;\n}\n\n// double word\n\nstatic inline atomic_word2 atomic_load_explicit(const volatile atomic_word2* p, int)\n{\n    ATOMIC_LOAD2(\"\", \"\")\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word2* p, atomic_word2 v, int)\n{\n    ATOMIC_STORE(\"\", \"\")\n}\n\nstatic inline atomic_word2 atomic_exchange_explicit(volatile atomic_word2* p, atomic_word2 v, int)\n{\n    ATOMIC_XCHG2(\"\", \"\")\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word2* p, atomic_word2* oldval, atomic_word2 newval, int, int)\n{\n    return __sync_val_compare_and_swap(&p->v, &oldval->v, newval.v);\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Unity/AtomicQueue.cpp",
    "content": "#include \"AtomicQueue.h\"\n#include \"ExtendedAtomicOps.h\"\n\nUNITY_PLATFORM_BEGIN_NAMESPACE;\n\n//\n//  AtomicNode\n//\n\nAtomicNode* AtomicNode::Link(AtomicNode* next)\n{\n#if defined(ATOMIC_HAS_QUEUE)\n    AtomicNode* old = Next();\n    atomic_store_explicit(&_next, (atomic_word)next, memory_order_relaxed);\n    return old;\n#else\n    AtomicNode* old = Next();\n    _next = (atomic_word)next;\n    return old;\n#endif\n}\n\n#if defined(ATOMIC_HAS_QUEUE)\n\n//\n//  AtomicStack\n//\n\nAtomicStack::AtomicStack()\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 w;\n    w.lo = w.hi = 0;\n    atomic_store_explicit(&_top, w, memory_order_relaxed);\n\n#else\n\n    atomic_store_explicit(&_top, 0, memory_order_relaxed);\n\n#endif\n}\n\nAtomicStack::~AtomicStack()\n{\n}\n\nint AtomicStack::IsEmpty() const\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 top = atomic_load_explicit(&_top, memory_order_relaxed);\n    return top.lo == 0;\n\n#else\n\n    return atomic_load_explicit(&_top, memory_order_relaxed) == 0;\n\n#endif\n}\n\nvoid AtomicStack::Push(AtomicNode* node)\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 top = atomic_load_explicit(&_top, memory_order_relaxed);\n    atomic_word2 newtop;\n\n    newtop.lo = (atomic_word)node;\n    do\n    {\n        atomic_store_explicit(&node->_next, top.lo, memory_order_relaxed);\n        newtop.hi = top.hi + 1;\n    }\n    while (!atomic_compare_exchange_strong_explicit(&_top, &top, newtop, memory_order_release, memory_order_relaxed));\n\n#elif defined(__arm64__)\n\n    AtomicNode* top;\n    long success;\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldxr\\t%0, [%4]\\n\\t\"\n        \"str    %0, [%5]\\n\\t\"\n        \"stlxr\\t%w3, %5, [%4]\\n\\t\"\n        \"cbnz\\t%w3, 0b\\n\\t\"\n\n        : \"=&r\" (top), \"=m\" (*node), \"+m\" (_top), \"=&r\" (success)\n        : \"r\" (&_top), \"r\" (node)\n        : \"cc\", \"memory\"\n    );\n\n#elif PLATFORM_N3DS\n    AtomicNode* top;\n    int success;\n\n    __asm__ __volatile__\n    {\n        //dmb   ishst //not supported on N3DS\n    one:\n        ldrex top, [&_top]\n        str top, [node]\n        strex success, node, [&_top]\n        teq success, #0\n        bne one\n    }\n\n#elif defined(__arm__)\n\n    AtomicNode* top;\n    int success;\n\n    __asm__ __volatile__\n    (\n        \"dmb\\tish\\n\\t\"\n        \"0:\\n\\t\"\n        \"ldrex\\t%0, [%4]\\n\\t\"\n        \"str    %0, [%5]\\n\\t\"\n        \"strex\\t%3, %5, [%4]\\n\\t\"\n        \"teq    %3, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n\n        : \"=&r\" (top), \"=m\" (*node), \"+m\" (_top), \"=&r\" (success)\n        : \"r\" (&_top), \"r\" (node)\n        : \"cc\", \"memory\"\n    );\n\n#elif defined(__ppc64__) || defined(_ARCH_PPC64)\n\n    AtomicNode* top;\n    AtomicNode* tmp;\n\n    __asm__ __volatile__\n    (\n        \"ld\\t\\t%0, 0(%4)\\n\\t\"\n        \"0:\\n\\t\"\n        \"mr\\t\\t%3, %0\\n\\t\"\n        \"std    %0, 0(%5)\\n\\t\"\n        \"lwsync\\n\\t\"\n        \"ldarx\\t%0, 0, %4\\n\\t\"\n        \"cmpd\\t%0, %3\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"stdcx.\\t%5, 0, %4\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n\n        : \"=&b\" (top), \"+m\" (_top), \"=m\" (*node), \"=&b\" (tmp)\n        : \"b\" (&_top), \"b\" (node)\n        : \"cr0\", \"memory\"\n    );\n\n#elif defined(__ppc__)\n\n    AtomicNode* top;\n    AtomicNode* tmp;\n\n    __asm__ __volatile__\n    (\n        \"lwz\\t%0, 0(%4)\\n\\t\"\n        \"0:\\n\\t\"\n        \"mr\\t\\t%3, %0\\n\\t\"\n        \"stw    %0, 0(%5)\\n\\t\"\n        \"lwsync\\n\\t\"\n        \"lwarx\\t%0, 0, %4\\n\\t\"\n        \"cmpw\\t%0, %3\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"stwcx.\\t%5, 0, %4\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n\n        : \"=&b\" (top), \"+m\" (_top), \"=m\" (*node), \"=&b\" (tmp)\n        : \"b\" (&_top), \"b\" (node)\n        : \"cr0\", \"memory\"\n    );\n\n#else\n\n#   error\n\n#endif\n}\n\nvoid AtomicStack::PushAll(AtomicNode* first, AtomicNode* last)\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 top = atomic_load_explicit(&_top, memory_order_relaxed);\n    atomic_word2 newtop;\n\n    newtop.lo = (atomic_word)first;\n    do\n    {\n        atomic_store_explicit(&last->_next, top.lo, memory_order_relaxed);\n        newtop.hi = top.hi + 1;\n    }\n    while (!atomic_compare_exchange_strong_explicit(&_top, &top, newtop, memory_order_release, memory_order_relaxed));\n\n#elif defined(__arm64__)\n\n    AtomicNode* top;\n    long success;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldxr\\t%0, [%4]\\n\\t\"\n        \"str    %0, [%6]\\n\\t\"\n        \"stlxr\\t%w3, %5, [%4]\\n\\t\"\n        \"cbnz\\t%w3, 0b\\n\\t\"\n\n        : \"=&r\" (top), \"+m\" (_top), \"=m\" (*last), \"=&r\" (success)\n        : \"r\" (&_top), \"r\" (first), \"r\" (last)\n        : \"cc\", \"memory\"\n    );\n\n#elif PLATFORM_N3DS\n    AtomicNode* top;\n    int success;\n\n    __asm__ __volatile__\n    (\n        //\"dmb  ishst\\n\\t\" //not supported on N3DS\n        \"0:\\n\\t\"\n        \"ldrex\\ttop, [&_top]\\n\\t\"\n        \"str    top, [last]\\n\\t\"\n        \"strex\\tsuccess, first, [&_top]\\n\\t\"\n        \"teq    success, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n    );\n\n#elif defined(__arm__)\n\n    AtomicNode* top;\n    int success;\n\n    __asm__ __volatile__\n    (\n        \"dmb\\tish\\n\\t\"\n        \"0:\\n\\t\"\n        \"ldrex\\t%0, [%4]\\n\\t\"\n        \"str    %0, [%6]\\n\\t\"\n        \"strex\\t%3, %5, [%4]\\n\\t\"\n        \"teq    %3, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n\n        : \"=&r\" (top), \"+m\" (_top), \"=m\" (*last), \"=&r\" (success)\n        : \"r\" (&_top), \"r\" (first), \"r\" (last)\n        : \"cc\", \"memory\"\n    );\n\n#elif defined(__ppc64__) || defined(_ARCH_PPC64)\n\n    AtomicNode* top;\n    AtomicNode* tmp;\n\n    __asm__ __volatile__\n    (\n        \"ld\\t\\t%0, 0(%4)\\n\\t\"\n        \"0:\\n\\t\"\n        \"mr\\t\\t%3, %0\\n\\t\"\n        \"std    %0, 0(%6)\\n\\t\"\n        \"lwsync\\n\\t\"\n        \"ldarx\\t%0, 0, %4\\n\\t\"\n        \"cmpd\\t%0, %3\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"stdcx.\\t%5, 0, %4\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n\n        : \"=&b\" (top), \"+m\" (_top), \"=m\" (*last), \"=&b\" (tmp)\n        : \"b\" (&_top), \"r\" (first), \"b\" (last)\n        : \"cr0\", \"memory\"\n    );\n\n#elif defined(__ppc__)\n\n    AtomicNode* top;\n    AtomicNode* tmp;\n\n    __asm__ __volatile__\n    (\n        \"lwz\\t%0, 0(%4)\\n\\t\"\n        \"0:\\n\\t\"\n        \"mr\\t\\t%3, %0\\n\\t\"\n        \"stw    %0, 0(%6)\\n\\t\"\n        \"lwsync\\n\\t\"\n        \"lwarx\\t%0, 0, %4\\n\\t\"\n        \"cmpw\\t%0, %3\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"stwcx.\\t%5, 0, %4\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n\n        : \"=&b\" (top), \"=m\" (*last), \"+m\" (_top), \"=&b\" (tmp)\n        : \"b\" (&_top), \"r\" (first), \"b\" (last)\n        : \"cr0\", \"memory\"\n    );\n\n#else\n\n#   error\n\n#endif\n}\n\nAtomicNode* AtomicStack::Pop()\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 top = atomic_load_explicit(&_top, memory_order_relaxed);\n    atomic_word2 newtop;\n    AtomicNode* node;\n\n    do\n    {\n        node = (AtomicNode*)top.lo;\n        if (!node)\n            break;\n        newtop.lo = (atomic_word)atomic_load_explicit(&node->_next, memory_order_relaxed);\n        newtop.hi = top.hi + 1;\n    }\n    while (!atomic_compare_exchange_strong_explicit(&_top, &top, newtop, memory_order_acquire, memory_order_relaxed));\n\n    return node;\n\n#elif defined(__arm64__)\n\n    AtomicNode* top = NULL;\n    AtomicNode* tmp;\n    long success;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldaxr\\t%0, [%4]\\n\\t\"\n        \"cbz\\t%0, 1f\\n\\t\"\n        \"ldr    %1, [%0]\\n\\t\"\n        \"stxr\\t%w3, %1, [%4]\\n\\t\"\n        \"cbnz\\t%w3, 0b\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&r\" (top), \"=&r\" (tmp), \"+m\" (_top), \"=&r\" (success)\n        : \"r\" (&_top)\n        : \"cc\", \"memory\"\n    );\n    return top;\n\n#elif PLATFORM_N3DS\n\n    AtomicNode* top = NULL;\n    AtomicNode* tmp;\n    int success = 0;\n\n    __asm__ __volatile__\n    {\n    one:\n        ldrex top, [&_top]\n        cmp top, #0\n        beq two\n        ldr tmp, [top]\n        strex success, tmp, [&_top]\n        teq success, #0\n        bne one\n        //isb\n    two:\n    }\n\n    return top;\n\n#elif defined(__arm__)\n\n    AtomicNode* top = NULL;\n    AtomicNode* tmp;\n    int success;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldrex\\t%0, [%4]\\n\\t\"\n        \"cmp\\t%0, #0\\n\\t\"\n        \"beq\\t1f\\n\\t\"\n        \"ldr    %1, [%0]\\n\\t\"\n        \"strex\\t%3, %1, [%4]\\n\\t\"\n        \"teq\\t%3, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        \"isb\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&r\" (top), \"=&r\" (tmp), \"+m\" (_top), \"=&r\" (success)\n        : \"r\" (&_top)\n        : \"cc\", \"memory\"\n    );\n    return top;\n\n#elif defined(__ppc64__) || defined(_ARCH_PPC64)\n\n    AtomicNode* top = NULL;\n    AtomicNode* tmp;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldarx\\t%0, 0, %3\\n\\t\"\n        \"cmpdi  %0, 0\\n\\t\"\n        \"beq-   1f\\n\\t\"\n        \"ld     %1, 0(%0)\\n\\t\"\n        \"stdcx. %1, 0, %3\\n\\t\"\n        \"bne-   0b\\n\\t\"\n        \"isync\\n\\t\"\n        \"b\\t\\t2f\\n\\f\"\n        \"1:\\n\\t\"\n        \"stdcx.\\t%0, 0, %3\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"2:\\n\\t\"\n\n        : \"=&b\" (top), \"=&b\" (tmp), \"+m\" (_top)\n        : \"b\" (&_top)\n        : \"cr0\", \"memory\"\n    );\n    return top;\n\n#elif defined(__ppc__)\n\n    AtomicNode* top = NULL;\n    AtomicNode* tmp;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"lwarx\\t%0, 0, %3\\n\\t\"\n        \"cmpwi   %0, 0\\n\\t\"\n        \"beq-   1f\\n\\t\"\n        \"lwz    %1, 0(%0)\\n\\t\"\n        \"stwcx. %1, 0, %3\\n\\t\"\n        \"bne-   0b\\n\\t\"\n        \"isync\\n\\t\"\n        \"b\\t\\t2f\\n\\f\"\n        \"1:\\n\\t\"\n        \"stwcx.\\t%0, 0, %3\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"2:\\n\\t\"\n\n        : \"=&b\" (top), \"=&b\" (tmp), \"+m\" (_top)\n        : \"b\" (&_top)\n        : \"cr0\", \"memory\"\n    );\n    return top;\n\n#else\n\n#   error\n\n#endif\n}\n\nAtomicNode* AtomicStack::PopAll()\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 top = atomic_load_explicit(&_top, memory_order_relaxed);\n    atomic_word2 newtop;\n    AtomicNode* node;\n\n    do\n    {\n        node = (AtomicNode*)top.lo;\n        if (!node)\n            break;\n        newtop.lo = 0;\n        newtop.hi = top.hi + 1;\n    }\n    while (!atomic_compare_exchange_strong_explicit(&_top, &top, newtop, memory_order_acquire, memory_order_relaxed));\n\n    return node;\n\n#elif defined(__arm64__)\n\n    AtomicNode* top;\n    AtomicNode* tmp;\n    long success;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldaxr\\t%0, [%4]\\n\\t\"\n        \"cbz\\t%0, 1f\\n\\t\"\n        \"stxr\\t%w3, %5, [%4]\\n\\t\"\n        \"cbnz\\t%w3, 0b\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&r\" (top), \"=&r\" (tmp), \"+m\" (_top), \"=&r\" (success)\n        : \"r\" (&_top), \"r\" (0)\n        : \"cc\", \"memory\"\n    );\n    return top;\n\n#elif PLATFORM_N3DS\n\n    AtomicNode* top;\n    AtomicNode* tmp;\n    int success;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldrex\\ttop, [&_top]\\n\\t\"\n        \"cmp\\ttop, #0\\n\\t\"\n        \"beq\\t1f\\n\\t\"\n        \"strex\\tsuccess, #0, [&_top]\\n\\t\"\n        \"teq\\tsuccess, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        //\"isb\\n\\t\" //not supported on N3DS\n        \"1:\\n\\t\"\n    );\n    return top;\n\n#elif defined(__arm__)\n\n    AtomicNode* top;\n    AtomicNode* tmp;\n    int success;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldrex\\t%0, [%4]\\n\\t\"\n        \"cmp\\t%0, #0\\n\\t\"\n        \"beq\\t1f\\n\\t\"\n        \"strex\\t%3, %5, [%4]\\n\\t\"\n        \"teq\\t%3, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        \"isb\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&r\" (top), \"=&r\" (tmp), \"+m\" (_top), \"=&r\" (success)\n        : \"r\" (&_top), \"r\" (0)\n        : \"cc\", \"memory\"\n    );\n    return top;\n\n#elif defined(__ppc64__) || defined(_ARCH_PPC64)\n\n    AtomicNode* top;\n    AtomicNode* tmp;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldarx\\t%0, 0, %3\\n\\t\"\n        \"cmpdi  %0, 0\\n\\t\"\n        \"beq-   1f\\n\\t\"\n        \"stdcx. %4, 0, %3\\n\\t\"\n        \"bne-   0b\\n\\t\"\n        \"isync\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&b\" (top), \"=&b\" (tmp), \"+m\" (_top)\n        : \"b\" (&_top), \"r\" (0)\n        : \"cr0\", \"memory\"\n    );\n    return top;\n\n#elif defined(__ppc__)\n\n    AtomicNode* top;\n    AtomicNode* tmp;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"lwarx\\t%0, 0, %3\\n\\t\"\n        \"cmpwi   %0, 0\\n\\t\"\n        \"beq-   1f\\n\\t\"\n        \"stwcx. %4, 0, %3\\n\\t\"\n        \"bne-   0b\\n\\t\"\n        \"isync\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&b\" (top), \"=&b\" (tmp), \"+m\" (_top)\n        : \"b\" (&_top), \"r\" (0)\n        : \"cr0\", \"memory\"\n    );\n    return top;\n\n#else\n\n#   error\n\n#endif\n}\n\nAtomicStack* CreateAtomicStack()\n{\n    // should be properly aligned\n#if defined(ATOMIC_HAS_DCAS)\n    return UNITY_PLATFORM_NEW_ALIGNED(AtomicStack, kMemThread, sizeof(atomic_word2));\n#else\n    return UNITY_PLATFORM_NEW_ALIGNED(AtomicStack, kMemThread, sizeof(atomic_word));\n#endif\n}\n\nvoid DestroyAtomicStack(AtomicStack* s)\n{\n    UNITY_PLATFORM_DELETE(s, kMemThread);\n}\n\n//\n//  AtomicQueue\n//\n\nAtomicQueue::AtomicQueue()\n{\n#if defined(ATOMIC_HAS_DCAS)\n    AtomicNode* dummy = UNITY_PLATFORM_NEW(AtomicNode, kMemThread);\n\n    atomic_word2 w;\n    w.lo = (atomic_word)dummy;\n    w.hi = 0;\n    atomic_store_explicit(&dummy->_next, 0, memory_order_relaxed);\n    atomic_store_explicit(&_tail, w, memory_order_relaxed);\n    atomic_store_explicit(&_head, (atomic_word)dummy, memory_order_release);\n\n#else\n\n    AtomicNode* dummy = UNITY_PLATFORM_NEW(AtomicNode, kMemThread);\n\n    atomic_store_explicit(&dummy->_next, 0, memory_order_relaxed);\n    atomic_store_explicit(&_tail, (atomic_word)dummy, memory_order_relaxed);\n    atomic_store_explicit(&_head, (atomic_word)dummy, memory_order_release);\n\n#endif\n}\n\nAtomicQueue::~AtomicQueue()\n{\n    AtomicNode* dummy = (AtomicNode*)atomic_load_explicit(&_head, memory_order_relaxed);\n    UNITY_PLATFORM_DELETE(dummy, kMemThread);\n}\n\nint AtomicQueue::IsEmpty() const\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 cmp = atomic_load_explicit(&_tail, memory_order_relaxed);\n\n    return atomic_load_explicit(&((AtomicNode*)cmp.lo)->_next, memory_order_relaxed) == 0;\n\n#else\n\n    atomic_word cmp = atomic_load_explicit(&_tail, memory_order_relaxed);\n\n    return atomic_load_explicit(&((AtomicNode*)cmp)->_next, memory_order_relaxed) == 0;\n\n#endif\n}\n\nvoid AtomicQueue::Enqueue(AtomicNode* node)\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    AtomicNode* prev;\n\n    atomic_store_explicit(&node->_next, 0, memory_order_relaxed);\n    prev = (AtomicNode*)atomic_exchange_explicit(&_head, (atomic_word)node, memory_order_release);\n    atomic_store_explicit(&prev->_next, (atomic_word)node, memory_order_release);\n\n#elif defined(__arm64__)\n\n    AtomicNode* head;\n    long success;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldxr\\t%0, [%3]\\n\\t\"\n        \"stlxr\\t%w2, %4, [%3]\\n\\t\"\n        \"cbnz\\t%w2, 0b\\n\\t\"\n        \"str    %4, [%0]\\n\\t\"\n\n        : \"=&r\" (head), \"+m\" (_head), \"=&r\" (success)\n        : \"r\" (&_head), \"r\" (node)\n        : \"cc\", \"memory\"\n    );\n\n#elif PLATFORM_N3DS\n\n    AtomicNode* head;\n    int success;\n\n    __asm__ __volatile__\n    (\n        //\"dmb  ishst\\n\\t\" //not supported on N3DS\n        \"0:\\n\\t\"\n        \"ldrex\\thead, [&_head]\\n\\t\"\n        \"strex\\tsuccess, node, [&_head]\\n\\t\"\n        \"teq    success, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        \"str    node, [head]\\n\\t\"\n    );\n\n#elif defined(__arm__)\n\n    AtomicNode* head;\n    int success;\n\n    __asm__ __volatile__\n    (\n        \"dmb\\tish\\n\\t\"\n        \"0:\\n\\t\"\n        \"ldrex\\t%0, [%3]\\n\\t\"\n        \"strex\\t%2, %4, [%3]\\n\\t\"\n        \"teq    %2, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        \"str    %4, [%0]\\n\\t\"\n\n        : \"=&r\" (head), \"+m\" (_head), \"=&r\" (success)\n        : \"r\" (&_head), \"r\" (node)\n        : \"cc\", \"memory\"\n    );\n\n#elif defined(__ppc64__) || defined(_ARCH_PPC64)\n\n    AtomicNode* head;\n\n    __asm__ __volatile__\n    (\n        \"lwsync\\n\\t\"\n        \"0:\\n\\t\"\n        \"ldarx\\t%0, 0, %2\\n\\t\"\n        \"stdcx.\\t%3, 0, %2\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"std    %3, 0(%0)\\n\\t\"\n\n        : \"=&b\" (head), \"+m\" (_head)\n        : \"b\" (&_head), \"r\" (node)\n        : \"cr0\", \"memory\"\n    );\n\n#elif defined(__ppc__)\n\n    AtomicNode* head;\n\n    __asm__ __volatile__\n    (\n        \"lwsync\\n\\t\"\n        \"0:\\n\\t\"\n        \"lwarx\\t%0, 0, %2\\n\\t\"\n        \"stwcx.\\t%3, 0, %2\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"stw    %3, 0(%0)\\n\\t\"\n\n        : \"=&b\" (head), \"+m\" (_head)\n        : \"b\" (&_head), \"r\" (node)\n        : \"cr0\", \"memory\"\n    );\n\n#else\n\n#   error\n\n#endif\n}\n\nvoid AtomicQueue::EnqueueAll(AtomicNode* first, AtomicNode* last)\n{\n    atomic_store_explicit(&last->_next, 0, memory_order_relaxed);\n\n#if defined(ATOMIC_HAS_DCAS)\n\n    AtomicNode* prev;\n\n    prev = (AtomicNode*)atomic_exchange_explicit(&_head, (atomic_word)last, memory_order_release);\n    atomic_store_explicit(&prev->_next, (atomic_word)first, memory_order_release);\n\n#elif defined(__arm64__)\n\n    AtomicNode* head;\n    long success;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldxr\\t%0, [%3]\\n\\t\"\n        \"stlxr\\t%w2, %5, [%3]\\n\\t\"\n        \"cbnz\\t%w2, 0b\\n\\t\"\n        \"str    %4, [%0]\\n\\t\"\n\n        : \"=&r\" (head), \"+m\" (_head), \"=&r\" (success)\n        : \"r\" (&_head), \"r\" (first), \"r\" (last)\n        : \"cc\", \"memory\"\n    );\n\n#elif PLATFORM_N3DS\n\n    AtomicNode* head;\n    int success;\n\n    __asm__ __volatile__\n    (\n        //\"dmb  ishst\\n\\t\" //not supported on N3DS\n        \"0:\\n\\t\"\n        \"ldrex\\thead, [&_head]\\n\\t\"\n        \"strex\\tsuccess, last, [&_head]\\n\\t\"\n        \"teq    success, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        \"str    first, [head]\\n\\t\"\n    );\n\n#elif defined(__arm__)\n\n    AtomicNode* head;\n    int success;\n\n    __asm__ __volatile__\n    (\n        \"dmb\\tish\\n\\t\"\n        \"0:\\n\\t\"\n        \"ldrex\\t%0, [%3]\\n\\t\"\n        \"strex\\t%2, %5, [%3]\\n\\t\"\n        \"teq    %2, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        \"str    %4, [%0]\\n\\t\"\n\n        : \"=&r\" (head), \"+m\" (_head), \"=&r\" (success)\n        : \"r\" (&_head), \"r\" (first), \"r\" (last)\n        : \"cc\", \"memory\"\n    );\n\n#elif defined(__ppc64__) || defined(_ARCH_PPC64)\n\n    AtomicNode* head;\n\n    __asm__ __volatile__\n    (\n        \"lwsync\\n\\t\"\n        \"0:\\n\\t\"\n        \"ldarx\\t%0, 0, %2\\n\\t\"\n        \"stdcx.\\t%4, 0, %2\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"std    %3, 0(%0)\\n\\t\"\n\n        : \"=&b\" (head), \"+m\" (_head)\n        : \"b\" (&_head), \"r\" (first), \"r\" (last)\n        : \"cr0\", \"memory\"\n    );\n\n#elif defined(__ppc__)\n\n    AtomicNode* head;\n\n    __asm__ __volatile__\n    (\n        \"lwsync\\n\\t\"\n        \"0:\\n\\t\"\n        \"lwarx\\t%0, 0, %2\\n\\t\"\n        \"stwcx.\\t%4, 0, %2\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"stw    %3, 0(%0)\\n\\t\"\n\n        : \"=&b\" (head), \"+m\" (_head)\n        : \"b\" (&_head), \"r\" (first), \"r\" (last)\n        : \"cr0\", \"memory\"\n    );\n\n#else\n\n#   error\n\n#endif\n}\n\nAtomicNode* AtomicQueue::Dequeue()\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    AtomicNode* res, * next;\n    void* data0;\n    void* data1;\n    void* data2;\n\n    atomic_word2 tail = atomic_load_explicit(&_tail, memory_order_acquire);\n    atomic_word2 newtail;\n    do\n    {\n        res = (AtomicNode*)tail.lo;\n        next = (AtomicNode*)atomic_load_explicit(&res->_next, memory_order_relaxed);\n        if (next == 0)\n            return NULL;\n        data0 = next->data[0];\n        data1 = next->data[1];\n        data2 = next->data[2];\n        newtail.lo = (atomic_word)next;\n        newtail.hi = tail.hi + 1;\n    }\n    while (!atomic_compare_exchange_strong_explicit(&_tail, &tail, newtail, memory_order_seq_cst, memory_order_relaxed));\n\n    res->data[0] = data0;\n    res->data[1] = data1;\n    res->data[2] = data2;\n\n    return res;\n\n#elif defined(__arm64__)\n\n    AtomicNode* tail;\n    AtomicNode* tmp;\n    void* data0;\n    void* data1;\n    void* data2;\n    long success;\n\n    __asm__ __volatile__ (\n        \"0:\\n\\t\"\n        \"ldaxr\\t%0, [%7]\\n\\t\"\n        \"ldr\\t%1, [%0]\\n\\t\"\n        \"cbz\\t%1, 1f\\n\\t\"\n        \"ldr    %4, [%1, #8]\\n\\t\"\n        \"ldr    %5, [%1, #16]\\n\\t\"\n        \"ldr    %6, [%1, #24]\\n\\t\"\n        // create an artificial dependency to ensure previous loads are not reordered\n        \"csel\\t%7, %7, %3, #15\\n\\t\" // nop\n        \"csel\\t%7, %7, %4, #15\\n\\t\" // nop\n        \"csel\\t%7, %7, %5, #15\\n\\t\" // nop\n        \"stxr\\t%w3, %1, [%7]\\n\\t\"\n        \"cbnz\\t%w3, 0b\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&r\" (tail), \"=&r\" (tmp), \"+m\" (_tail), \"=&r\" (success), \"=&r\" (data0), \"=&r\" (data1), \"=&r\" (data2)\n        : \"r\" (&_tail)\n        : \"cc\", \"memory\"\n        );\n    if (tmp)\n    {\n        tail->data[0] = data0;\n        tail->data[1] = data1;\n        tail->data[2] = data2;\n    }\n    else\n    {\n        tail = 0;\n    }\n    return tail;\n\n#elif PLATFORM_N3DS\n\n    AtomicNode* tail;\n    AtomicNode* tmp;\n    void* data0;\n    void* data1;\n    void* data2 = 0;\n    int success = 1;\n\n    __asm__ __volatile__ (\n        \"0:\\n\\t\"\n        \"ldrex\\ttail, [data2]\\n\\t\"\n        \"ldr\\ttmp, [tail]\\n\\t\"\n        \"cmp\\ttmp, #0\\n\\t\"\n        \"beq\\t1f\\n\\t\"\n        \"ldr\\ttail, [tmp, #4]\\n\\t\"\n        \"ldr\\tdata0, [tmp, #8]\\n\\t\"\n        \"ldr\\tdata1, [tmp, #12]\\n\\t\"\n        // create an artificial dependency to ensure previous loads are not reordered\n        \"orr\\tdata2, data2, success, lsr #32\\n\\t\" // nop\n        \"orr\\tdata2, data2, tail, lsr #32\\n\\t\" // nop\n        \"orr\\tdata2, data2, data0, lsr #32\\n\\t\" // nop\n        \"strex\\tsuccess, tmp, [data2]\\n\\t\"\n        \"teq\\tsuccess, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        // \"isb\\n\\t\" //not available on N3DS\n        \"1:\\n\\t\"\n        );\n    if (tmp)\n    {\n        tail->data[0] = data0;\n        tail->data[1] = data1;\n        tail->data[2] = data2;\n    }\n    else\n    {\n        tail = 0;\n    }\n    return tail;\n\n#elif defined(__arm__)\n\n    AtomicNode* tail;\n    AtomicNode* tmp;\n    void* data0;\n    void* data1;\n    void* data2;\n    int success;\n\n    __asm__ __volatile__ (\n        \"0:\\n\\t\"\n        \"ldrex\\t%0, [%7]\\n\\t\"\n        \"ldr\\t%1, [%0]\\n\\t\"\n        \"cmp\\t%1, #0\\n\\t\"\n        \"beq\\t1f\\n\\t\"\n        \"ldr\\t%4, [%1, #4]\\n\\t\"\n        \"ldr\\t%5, [%1, #8]\\n\\t\"\n        \"ldr\\t%6, [%1, #12]\\n\\t\"\n        // create an artificial dependency to ensure previous loads are not reordered\n        \"orr\\t%7, %7, %3, lsr #32\\n\\t\" // nop\n        \"orr\\t%7, %7, %4, lsr #32\\n\\t\" // nop\n        \"orr\\t%7, %7, %5, lsr #32\\n\\t\" // nop\n        \"strex\\t%3, %1, [%7]\\n\\t\"\n        \"teq\\t%3, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        \"isb\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&r\" (tail), \"=&r\" (tmp), \"+m\" (_tail), \"=&r\" (success), \"=&r\" (tail), \"=&r\" (data0), \"=&r\" (data1), \"=&r\" (data2)\n        : \"r\" (&_tail)\n        : \"cc\", \"memory\"\n        );\n    if (tmp)\n    {\n        tail->data[0] = data0;\n        tail->data[1] = data1;\n        tail->data[2] = data2;\n    }\n    else\n    {\n        tail = 0;\n    }\n    return tail;\n\n#elif defined(__ppc64__) || defined(_ARCH_PPC64)\n\n    AtomicNode* tail;\n    AtomicNode* tmp;\n    void* data0;\n    void* data1;\n    void* data2;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldarx\\t%0, 0, %6\\n\\t\"\n        \"ld     %1, 0(%0)\\n\\t\"\n        \"cmpdi  %1, 0\\n\\t\"\n        \"beq-   1f\\n\\t\"\n        \"ld     %3, 8(%1)\\n\\t\"\n        \"ld     %4, 16(%1)\\n\\t\"\n        \"ld     %5, 24(%1)\\n\\t\"\n        // create a data dependency to ensure previous loads are not reordered\n        \"tdi\\t0, %4, 0\\n\\t\"\n        \"tdi\\t0, %5, 0\\n\\t\"\n        \"tdi\\t0, %6, 0\\n\\t\"\n        \"isync\\n\\t\"\n        \"stdcx. %1, 0, %6\\n\\t\"\n        \"bne-   0b\\n\\t\"\n        \"isync\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&b\" (tail), \"=&b\" (tmp), \"+m\" (_tail), \"=&b\" (data0), \"=&b\" (data1), \"=&b\" (data2)\n        : \"b\" (&_tail)\n        : \"cr0\", \"memory\"\n    );\n    if (tmp)\n    {\n        tail->data[0] = data0;\n        tail->data[1] = data1;\n        tail->data[2] = data2;\n    }\n    else\n    {\n        tail = 0;\n    }\n    return tail;\n\n#elif defined(__ppc__)\n\n    AtomicNode* tail;\n    AtomicNode* tmp;\n    void* data0;\n    void* data1;\n    void* data2;\n\n    __asm__ __volatile__ (\n        \"0:\\n\\t\"\n        \"lwarx\\t%0, 0, %6\\n\\t\"\n        \"lwz    %1, 0(%0)\\n\\t\"\n        \"cmpwi  %1, 0\\n\\t\"\n        \"beq-   1f\\n\\t\"\n        \"lwz    %3, 4(%1)\\n\\t\"\n        \"lwz    %4, 8(%1)\\n\\t\"\n        \"lwz    %5, 12(%1)\\n\\t\"\n        // create a data dependency to ensure previous loads are not reordered\n        \"twi\\t0, %4, 0\\n\\t\"\n        \"twi\\t0, %5, 0\\n\\t\"\n        \"twi\\t0, %6, 0\\n\\t\"\n        \"isync\\n\\t\"\n        \"stwcx. %1, 0, %6\\n\\t\"\n        \"bne-   0b\\n\\t\"\n        \"isync\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&b\" (tail), \"=&b\" (tmp), \"+m\" (_tail), \"=&b\" (data0), \"=&b\" (data1), \"=&b\" (data2)\n        : \"b\" (&_tail)\n        : \"cr0\", \"memory\"\n        );\n    if (tmp)\n    {\n        tail->data[0] = data0;\n        tail->data[1] = data1;\n        tail->data[2] = data2;\n    }\n    else\n    {\n        tail = 0;\n    }\n    return tail;\n\n#else\n\n#   error\n\n#endif\n}\n\nAtomicQueue* CreateAtomicQueue()\n{\n    // should be properly aligned\n#if defined(ATOMIC_HAS_DCAS)\n    return UNITY_PLATFORM_NEW_ALIGNED(AtomicQueue, kMemThread, sizeof(atomic_word2));\n#elif PLATFORM_N3DS\n    //seems like UNITY_PLATFORM_NEW shouldn't take an alignment...?\n    return UNITY_PLATFORM_NEW(AtomicQueue, kMemThread);\n#else\n    return UNITY_PLATFORM_NEW(AtomicQueue, kMemThread, sizeof(atomic_word));\n#endif\n}\n\nvoid DestroyAtomicQueue(AtomicQueue* s)\n{\n    UNITY_PLATFORM_DELETE(s, kMemThread);\n}\n\n//\n//  AtomicList\n//\n\nvoid AtomicList::Init()\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 w;\n    w.lo = w.hi = 0;\n    atomic_store_explicit(&_top, w, memory_order_relaxed);\n\n#else\n\n    atomic_store_explicit(&_top, 0, memory_order_relaxed);\n    atomic_store_explicit(&_ver, 0, memory_order_relaxed);\n\n#endif\n}\n\natomic_word AtomicList::Tag()\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 w = atomic_load_explicit((volatile atomic_word2*)&_top, memory_order_relaxed);\n\n    return w.hi;\n\n#else\n\n    return atomic_load_explicit(&_ver, memory_order_relaxed);\n\n#endif\n}\n\nAtomicNode* AtomicList::Peek()\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 w = atomic_load_explicit((volatile atomic_word2*)&_top, memory_order_relaxed);\n\n    return (AtomicNode*)w.lo;\n\n#else\n\n    return (AtomicNode*)atomic_load_explicit(&_top, memory_order_relaxed);\n\n#endif\n}\n\nAtomicNode* AtomicList::Load(atomic_word &tag)\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 w = atomic_load_explicit((volatile atomic_word2*)&_top, memory_order_acquire);\n    tag = w.hi;\n\n    return (AtomicNode*)w.lo;\n\n#else\n\n    atomic_word w;\n    do\n    {\n        w = atomic_load_explicit(&_top, memory_order_relaxed);\n        tag = atomic_load_explicit(&_ver, memory_order_relaxed);\n    }\n    while (tag != atomic_load_explicit(&_ver, memory_order_acquire));\n\n    return (AtomicNode*)w;\n\n#endif\n}\n\nbool AtomicList::Add(AtomicNode *first, AtomicNode *last, atomic_word tag)\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 oldval, newval;\n    bool res = false;\n\n    newval.lo = (atomic_word)first;\n    newval.hi = tag;\n\n    oldval = atomic_load_explicit((volatile const atomic_word2*)&_top, memory_order_relaxed);\n    while (oldval.hi == tag)\n    {\n        last->Link((AtomicNode*)oldval.lo);\n        res = atomic_compare_exchange_strong_explicit((volatile atomic_word2*)&_top, &oldval, newval, memory_order_acq_rel, memory_order_relaxed);\n        if (res)\n        {\n            break;\n        }\n    }\n    return res;\n\n#elif defined(__arm64__)\n\n    AtomicNode* res;\n    AtomicNode* tmp;\n    long failure = 1;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldxr\\t%0, [%4]\\n\\t\"\n        \"csel\\t%4, %4, %0, #15\\n\\t\" // nop\n        \"ldr\\t%1, [%4, #8]\\n\\t\"\n        \"cmp\\t%1, %7\\n\\t\"\n        \"b.ne\\t1f\\n\\t\"\n        \"str    %0, [%6]\\n\\t\"\n        \"stlxr\\t%w3, %5, [%4]\\n\\n\"\n        \"cbnz\\t%w3, 0b\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&r\" (res), \"=&r\" (tmp), \"+m\" (_top), \"=&r\" (failure)\n        : \"r\" (&_top), \"r\" (first), \"r\" (last), \"r\" (tag)\n        : \"cc\", \"memory\"\n    );\n    return failure == 0;\n\n#elif PLATFORM_N3DS\n\n    /*\n    AtomicNode* res;\n    AtomicNode* tmp;\n    int failure = 1;\n\n    __asm__ __volatile__\n    (\n        \"dmb    ishst\\n\\t\"\n        \"0:\\n\\t\"\n        \"ldrex  %0, [%4]\\n\\t\"\n        \"add    %4, %4, %0\\n\\t\" // nop\n        \"sub    %4, %4, %0\\n\\t\" // nop\n        \"ldr    %1, [%4, #4]\\n\\t\"\n        \"cmp    %1, %7\\n\\t\"\n        \"bne    1f\\n\\t\"\n        \"str    %0, [%6]\\n\\t\"\n        \"strex  %3, %5, [%4]\\n\\t\"\n        \"teq    %3, #0\\n\\t\"\n        \"bne    0b\\n\\t\"\n        \"1:\\n\\t\"\n    );\n    return res;\n    */\n    return false;\n\n#elif defined(__arm__)\n\n    AtomicNode* res;\n    AtomicNode* tmp;\n    int failure = 1;\n\n    __asm__ __volatile__\n    (\n        \"dmb\\tishst\\n\\t\"\n        \"0:\\n\\t\"\n        \"ldrex\\t%0, [%4]\\n\\t\"\n        \"add\\t%4, %4, %0\\n\\t\"   // nop\n        \"sub\\t%4, %4, %0\\n\\t\" // nop\n        \"ldr\\t%1, [%4, #4]\\n\\t\"\n        \"cmp\\t%1, %7\\n\\t\"\n        \"bne\\t1f\\n\\t\"\n        \"str\\t%0, [%6]\\n\\t\"\n        \"strex\\t%3, %5, [%4]\\n\\t\"\n        \"teq\\t%3, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&r\" (res), \"=&r\" (tmp), \"+m\" (_top), \"=&r\" (failure)\n        : \"r\" (&_top), \"r\" (first), \"r\" (last), \"r\" (tag)\n        : \"cc\", \"memory\"\n    );\n    return failure == 0;\n\n#elif defined(__ppc__)\n\n    AtomicNode* res;\n    AtomicNode* tmp;\n    int failure = 1;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"lwsync\\n\\t\"\n        \"lwarx\\t%0, 0, %4\\n\\t\"\n        \"add\\t%4, %4, %0\\n\\t\"   // nop\n        \"sub\\t%4, %4, %0\\n\\t\" // nop\n        \"lwz\\t%1, 4(%4)\\n\\t\"\n        \"cmpw\\t%1, %7\\n\\t\"\n        \"bne-\\t1f\\n\\t\"\n        \"std\\t%0, 0(%6)\\n\\t\"\n        \"stwcx.\\t%5, 0, %4\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"eor\\t%3, %3, %3\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&r\" (res), \"=&r\" (tmp), \"+m\" (_top), \"=&r\" (failure)\n        : \"r\" (&_top), \"r\" (first), \"r\" (last), \"r\" (tag)\n        : \"cr0\", \"memory\"\n    );\n    return failure == 0;\n\n#elif defined(__ppc64__) || defined(_ARCH_PPC64)\n\n    AtomicNode* res;\n    AtomicNode* tmp;\n    int failure = 1;\n\n    __asm__ __volatile__\n    (\n        \"lwsync\\n\\t\"\n        \"0:\\n\\t\"\n        \"ldarx\\t%0, 0, %4\\n\\t\"\n        \"add\\t%4, %4, %0\\n\\t\"   // nop\n        \"sub\\t%4, %4, %0\\n\\t\" // nop\n        \"ld\\t\\t%1, 8(%4)\\n\\t\"\n        \"cmpd\\t%1, %7\\n\\t\"\n        \"bne-\\t1f\\n\\t\"\n        \"std\\t%0, 0(%6)\\n\\t\"\n        \"stdcx.\\t%5, 0, %4\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"eord\\t%3, %3, %3\\n\\t\"\n        \"1:\\n\\t\"\n\n        : \"=&r\" (res), \"=&r\" (tmp), \"+m\" (_top), \"=&r\" (failure)\n        : \"r\" (&_top), \"r\" (first), \"r\" (last), \"r\" (tag)\n        : \"cr0\", \"memory\"\n    );\n    return failure == 0;\n\n#else\n\n#   error\n\n#endif\n}\n\nAtomicNode* AtomicList::Touch(atomic_word tag)\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 w;\n    w.lo = 0;\n    w.hi = tag;\n    w = atomic_exchange_explicit((volatile atomic_word2*)&_top, w, memory_order_acq_rel);\n\n    return (AtomicNode*)w.lo;\n\n#else\n\n    atomic_store_explicit(&_ver, tag, memory_order_release);\n    atomic_word w = atomic_exchange_explicit(&_top, 0, memory_order_acquire);\n    return (AtomicNode*)w;\n\n#endif\n}\n\nvoid AtomicList::Reset(AtomicNode* node, atomic_word tag)\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 w;\n    w.lo = (atomic_word)node;\n    w.hi = tag;\n    atomic_store_explicit(&_top, w, memory_order_relaxed);\n\n#else\n\n    atomic_store_explicit(&_top, (atomic_word)node, memory_order_relaxed);\n    atomic_store_explicit(&_ver, tag, memory_order_relaxed);\n\n#endif\n}\n\nAtomicNode* AtomicList::Clear(AtomicNode* old, atomic_word tag)\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    atomic_word2 top;\n    atomic_word2 newtop;\n    top.lo = (atomic_word)old;\n    top.hi = tag;\n    newtop.lo = 0;\n    newtop.hi = tag + 1;\n\n    if (atomic_compare_exchange_strong_explicit((volatile atomic_word2*)&_top, &top, newtop, memory_order_acquire, memory_order_relaxed))\n    {\n        return (AtomicNode*)top.lo;\n    }\n    else\n    {\n        return NULL;\n    }\n\n#elif defined(__arm64__)\n\n    AtomicNode* res;\n    AtomicNode* tmp;\n    long success;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldaxr\\t%0, [%4]\\n\\t\"\n        \"cbz\\t%0, 2f\\n\\t\"\n        \"ldr    %1, [%0]\\n\\t\"\n        \"stxr\\t%w3, %1, [%4]\\n\\t\"\n        \"cbnz\\t%w3, 0b\\n\\t\"\n        \"1:\\n\\t\"\n        \"ldxr\\t%1, [%4, #8]\\n\\t\"\n        \"add\\t%1, %1, 1\\n\\t\"\n        \"stxr\\t%w3, %1, [%4, #8]\\n\\t\"\n        \"cbnz\\t%w3, 1b\\n\\t\"\n        \"2:\\n\\t\"\n\n        : \"=&r\" (res), \"=&r\" (tmp), \"+m\" (_top), \"=&r\" (success)\n        : \"r\" (&_top)\n        : \"cc\", \"memory\"\n    );\n    return res;\n\n#elif PLATFORM_N3DS\n\n    AtomicNode* res;\n    AtomicNode* tmp;\n    int success;\n    int theTop = (int)(&_top);\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldrex\\tres, [theTop]\\n\\t\"\n        \"cmp\\tres, #0\\n\\t\"\n        \"beq\\t2f\\n\\t\"\n        \"ldr    tmp, [res]\\n\\t\"\n        \"strex\\tsuccess, tmp, [theTop]\\n\\t\"\n        \"teq\\tsuccess, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        \"add\\ttheTop, theTop, 4\\n\\t\"\n        \"1:\\n\\t\"\n        \"ldrex\\tsuccess, [theTop]\\n\\t\"\n        \"add\\tsuccess, success, 1\\n\\t\"\n        \"strex\\tsuccess, success, [theTop]\\n\\t\"\n        \"teq\\tsuccess, #0\\n\\t\"\n        \"bne\\t1b\\n\\t\"\n        \"sub\\ttheTop, theTop, 4\\n\\t\"\n        //\"isb\\n\\t\" //not available on N3DS\n        \"2:\\n\\t\"\n    );\n    return res;\n\n#elif defined(__arm__)\n\n    AtomicNode* res;\n    AtomicNode* tmp;\n    int success;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldrex\\t%0, [%4]\\n\\t\"\n        \"cmp\\t%0, #0\\n\\t\"\n        \"beq\\t2f\\n\\t\"\n        \"ldr    %1, [%0]\\n\\t\"\n        \"strex\\t%3, %1, [%4]\\n\\t\"\n        \"teq\\t%3, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        \"add\\t%4, %4, 4\\n\\t\"\n        \"1:\\n\\t\"\n        \"ldrex\\t%3, [%4]\\n\\t\"\n        \"add\\t%3, %3, 1\\n\\t\"\n        \"strex\\t%3, %3, [%4]\\n\\t\"\n        \"teq\\t%3, #0\\n\\t\"\n        \"bne\\t1b\\n\\t\"\n        \"sub\\t%4, %4, 4\\n\\t\"\n        \"isb\\n\\t\"\n        \"2:\\n\\t\"\n\n        : \"=&r\" (res), \"=&r\" (tmp), \"+m\" (_top), \"=&r\" (success)\n        : \"r\" (&_top)\n        : \"cc\", \"memory\"\n    );\n    return res;\n\n#elif defined(__ppc64__) || defined(_ARCH_PPC64)\n\n    AtomicNode* res;\n    AtomicNode* tmp;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldarx\\t%0, 0, %3\\n\\t\"\n        \"cmpdi  %0, 0\\n\\t\"\n        \"beq-   2f\\n\\t\"\n        \"ld     %1, 0(%0)\\n\\t\"\n        \"stdcx. %1, 0, %3\\n\\t\"\n        \"bne-   0b\\n\\t\"\n        \"1:\\n\\t\"\n        \"ldarx\\t%1, 8, %3\\n\\t\"\n        \"addi\\t%1, %1, 1\\n\\t\"\n        \"stdcx.\\t%1, 8, %3\\n\\t\"\n        \"bne-\\t1b\\n\\t\"\n        \"isync\\n\\t\"\n        \"b\\t\\t3f\\n\\f\"\n        \"2:\\n\\t\"\n        \"stdcx.\\t%0, 0, %3\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"3:\\n\\t\"\n\n        : \"=&b\" (res), \"=&b\" (tmp), \"+m\" (_top)\n        : \"b\" (&_top)\n        : \"cr0\", \"memory\"\n    );\n    return res;\n\n#elif defined(__ppc__)\n\n    AtomicNode* res;\n    AtomicNode* tmp;\n\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"lwarx\\t%0, 0, %3\\n\\t\"\n        \"cmpwi   %0, 0\\n\\t\"\n        \"beq-   2f\\n\\t\"\n        \"lwz    %1, 0(%0)\\n\\t\"\n        \"stwcx. %1, 0, %3\\n\\t\"\n        \"bne-   0b\\n\\t\"\n        \"1:\\n\\t\"\n        \"lwarx\\t%1, 4, %3\\n\\t\"\n        \"addiw\\t%1, %1, 1\\n\\t\"\n        \"stwcx.\\t%1, 4, %3\\n\\t\"\n        \"bne-\\t1b\\n\\t\"\n        \"isync\\n\\t\"\n        \"b\\t\\t3f\\n\\f\"\n        \"2:\\n\\t\"\n        \"stwcx.\\t%0, 0, %3\\n\\t\"\n        \"bne-\\t0b\\n\\t\"\n        \"3:\\n\\t\"\n\n        : \"=&b\" (res), \"=&b\" (tmp), \"+m\" (_top)\n        : \"b\" (&_top)\n        : \"cr0\", \"memory\"\n    );\n    return res;\n\n#else\n\n#   error\n\n#endif\n}\n\n#else // !ATOMIC_HAS_QUEUE\n\n//\n//  AtomicList\n//\n\nvoid AtomicList::Init()\n{\n    _top = 0;\n    _ver = 0;\n}\n\natomic_word AtomicList::Tag()\n{\n    return _ver;\n}\n\nAtomicNode* AtomicList::Peek()\n{\n    return (AtomicNode*)_top;\n}\n\nAtomicNode* AtomicList::Load(atomic_word &tag)\n{\n    tag = _ver;\n    return (AtomicNode*)_top;\n}\n\nbool AtomicList::Add(AtomicNode *first, AtomicNode *last, atomic_word tag)\n{\n    last->Link((AtomicNode*)_top);\n    _top = (atomic_word)first;\n    return true;\n}\n\nAtomicNode* AtomicList::Touch(atomic_word tag)\n{\n    AtomicNode* res = (AtomicNode*)_top;\n    _top = 0;\n    _ver = tag;\n    return res;\n}\n\nvoid AtomicList::Reset(AtomicNode* node, atomic_word tag)\n{\n    _top = (atomic_word)node;\n    _ver = tag;\n}\n\nAtomicNode* AtomicList::Clear(AtomicNode* old, atomic_word tag)\n{\n    if (_top == (atomic_word)old && _ver == tag)\n    {\n        _top = 0;\n        ++_ver;\n        return old;\n    }\n    else\n    {\n        return NULL;\n    }\n}\n\n#endif\n\nvoid AtomicList::Relax()\n{\n#if defined(_MSC_VER)\n    YieldProcessor();\n#elif defined(__x86_64__) || defined(_M_X64)\n    __asm__ __volatile__ (\"pause\" ::: \"memory\");\n#elif defined(__x86__) || defined(__i386__) || defined(_M_IX86)\n    __asm__ __volatile__ (\"rep; nop\" ::: \"memory\");\n#elif PLATFORM_N3DS\n    __asm__ __volatile__ (\"yield\");\n#elif PLATFORM_SWITCH\n    // The embedded asm for arm64 seems to be ignored(!) by Switch's compiler. So, we do something different.\n    NXAtomicListRelax();\n#elif (defined(__arm64__) || (defined(__arm__) && (defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)))) && (defined(__clang__) || defined(__GNUC__))\n    // could be interesting to use wfe/sev instead of a semaphore\n    __asm__ __volatile__ (\"yield\");\n#elif PLATFORM_PSVITA\n    // There is no yield on Vita but we can give the scheduler a \"kick\" by delaying the thread (sleeping), not ideal but the best we can do for now.\n    PSP2AtomicListRelax();\n#else\n#endif\n}\n\nUNITY_PLATFORM_END_NAMESPACE;\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Unity/AtomicQueue.h",
    "content": "#pragma once\n\n#include \"UnityPlatformConfigure.h\"\n#include \"ExtendedAtomicTypes.h\"\n\nUNITY_PLATFORM_BEGIN_NAMESPACE;\n\n#if defined(ATOMIC_HAS_DCAS)\n\n    #define ATOMIC_HAS_QUEUE    2\n\n#elif defined(__arm64__) && (defined(__clang__) || defined(__GNUC__))\n\n    #define ATOMIC_HAS_QUEUE    1\n\n#elif defined(__arm__) && (defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)) && (!UNITY_STV_API) && (defined(__clang__) || defined(__GNUC__) || defined(SN_TARGET_PSP2))\n\n    #define ATOMIC_HAS_QUEUE    1\n\n#endif\n\nclass AtomicNode\n{\n    friend class AtomicStack;\n    friend class AtomicQueue;\n\n    volatile atomic_word _next;\n\npublic:\n    void* data[3];\n\n    AtomicNode *Next() const\n    {\n        return (AtomicNode*)_next;\n    }\n\n    AtomicNode *Link(AtomicNode *next);\n};\n\n#if defined(ATOMIC_HAS_QUEUE)\n\n\n// A generic lockfree stack.\n// Any thread can Push / Pop nodes to the stack.\n\n// The stack is lockfree and highly optimized. It has different implementations for different architectures.\n\n// On intel / arm it is built with double CAS:\n// http://en.wikipedia.org/wiki/Double_compare-and-swap\n// On PPC it is built on LL/SC:\n// http://en.wikipedia.org/wiki/Load-link/store-conditional\n\nclass AtomicStack\n{\n#if defined(ATOMIC_HAS_DCAS)\n    volatile atomic_word2   _top;\n#else\n    volatile atomic_word    _top;\n#endif\n\npublic:\n    AtomicStack();\n    ~AtomicStack();\n\n    int IsEmpty() const;\n\n    void Push(AtomicNode *node);\n    void PushAll(AtomicNode *first, AtomicNode *last);\n\n    AtomicNode *Pop();\n    AtomicNode *PopAll();\n};\n\nAtomicStack* CreateAtomicStack();\nvoid DestroyAtomicStack(AtomicStack* s);\n\n\n// A generic lockfree queue FIFO queue.\n// Any thread can Enqueue / Dequeue in paralell.\n// When pushing / popping a node there is no guarantee that the pointer to the node is the same (void* data[3])\n// We do guarantee that all 3 data pointer are the same after deqeuing.\n\n\n// The queue is lockfree and highly optimized. It has different implementations for different archectures.\n\n// On intel / arm it is built with double CAS:\n// http://en.wikipedia.org/wiki/Double_compare-and-swap\n// On PPC it is built on LL/SC:\n// http://en.wikipedia.org/wiki/Load-link/store-conditional\n\nclass AtomicQueue\n{\n#if defined(ATOMIC_HAS_DCAS)\n    volatile atomic_word2   _tail;\n#else\n    volatile atomic_word    _tail;\n#endif\n    volatile atomic_word    _head;\n\npublic:\n    AtomicQueue();\n    ~AtomicQueue();\n\n    int IsEmpty() const;\n\n    void Enqueue(AtomicNode *node);\n    void EnqueueAll(AtomicNode *first, AtomicNode *last);\n    AtomicNode *Dequeue();\n};\n\nAtomicQueue* CreateAtomicQueue();\nvoid DestroyAtomicQueue(AtomicQueue* s);\n\n#elif IL2CPP_SUPPORT_THREADS\n#error Platform is missing atomic queue implementation\n#endif\n\n//\n// Special concurrent list for JobQueue\n// This code is not meant to be general purpose and should not be used outside of the job queue.\n\nclass AtomicList\n{\n#if defined(ATOMIC_HAS_DCAS)\n\n    volatile atomic_word2   _top;\n\n#else\n\n    volatile atomic_word    _top;\n    volatile atomic_word    _ver;\n\n#endif\n\npublic:\n    void Init();\n\n    atomic_word Tag();\n    AtomicNode *Peek();\n    AtomicNode *Load(atomic_word &tag);\n\n    AtomicNode *Clear(AtomicNode *old, atomic_word tag);\n\n    bool Add(AtomicNode *first, AtomicNode *last, atomic_word tag);\n    AtomicNode* Touch(atomic_word tag);\n    void Reset(AtomicNode *node, atomic_word tag);\n\n    static void Relax();\n};\n\nUNITY_PLATFORM_END_NAMESPACE;\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Unity/ExtendedAtomicOps-arm.h",
    "content": "#if defined(_MSC_VER)\n\n#   include \"os/Win32/WindowsHeaders.h\"\n#   include <intrin.h>\n\n#else\n\n#   define ASM_DMB_ISH         \"dmb    ish\\n\\t\"\n\n#   if defined(__ARM_ARCH_7S__)\n// this is sufficient for Swift processors\n#       define ASM_REL         \"dmb    ishst\\n\\t\"\n#   else\n#       define ASM_REL         \"dmb    ish\\n\\t\"\n#   endif\n\n#   define ASM_CLREX        \"clrex\\n\\t\"\n\n#   define ASM_ISB         \"isb\\n\\t\"\n#   define ASM_LABEL(i)    #i \":\\n\\t\"\n\n#endif\n\nstatic inline void atomic_pause()\n{\n}\n\nstatic inline void atomic_thread_fence(memory_order_relaxed_t)\n{\n}\n\nstatic inline void atomic_thread_fence(memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    __dmb(_ARM_BARRIER_ISH);\n#else\n    __asm__ __volatile__ (ASM_REL : : : \"memory\");\n#endif\n}\n\nstatic inline void atomic_thread_fence(memory_order_acquire_t)\n{\n#if defined(_MSC_VER)\n    __dmb(_ARM_BARRIER_ISH);\n#else\n    __asm__ __volatile__ (ASM_DMB_ISH : : : \"memory\");\n#endif\n}\n\nstatic inline void atomic_thread_fence(memory_order_acq_rel_t)\n{\n#if defined(_MSC_VER)\n    __dmb(_ARM_BARRIER_ISH);\n#else\n    __asm__ __volatile__ (ASM_DMB_ISH : : : \"memory\");\n#endif\n}\n\nstatic inline void atomic_thread_fence(int /* memory_order_seq_cst_t */)\n{\n#if defined(_MSC_VER)\n    __dmb(_ARM_BARRIER_ISH);\n#else\n    __asm__ __volatile__ (ASM_DMB_ISH : : : \"memory\");\n#endif\n}\n\n#define ATOMIC_LOAD(PRE, POST) \\\n    atomic_word res; \\\n    __asm__ __volatile__ \\\n    ( \\\n        PRE \\\n        \"ldr    %0, %1\\n\\t\" \\\n        POST \\\n        : \"=r\" (res) \\\n        : \"m\" (*p) \\\n        : \"memory\" \\\n    ); \\\n    return res;\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    return (atomic_word)__iso_volatile_load32((const volatile __int32*)p);\n#else\n    ATOMIC_LOAD(\"\", \"\")\n#endif\n}\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, memory_order_acquire_t)\n{\n#if defined(_MSC_VER)\n    atomic_word res = (atomic_word)__iso_volatile_load32((const volatile __int32*)p);\n    __dmb(_ARM_BARRIER_ISH);\n    return res;\n#else\n    ATOMIC_LOAD(\"\", ASM_DMB_ISH)\n#endif\n}\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, int /* memory_order_seq_cst_t */)\n{\n#if defined(_MSC_VER)\n    atomic_word res = (atomic_word)__iso_volatile_load32((const volatile __int32*)p);\n    __dmb(_ARM_BARRIER_ISH);\n    return res;\n#else\n    ATOMIC_LOAD(\"\", ASM_DMB_ISH)\n#endif\n}\n\n#define ATOMIC_STORE(PRE, POST) \\\n    __asm__ __volatile__ \\\n    ( \\\n        PRE \\\n        \"str    %1, %0\\n\\t\" \\\n        POST \\\n        : \"=m\" (*p) \\\n        : \"r\" (v) \\\n        : \"memory\" \\\n    );\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    __iso_volatile_store32((volatile __int32*)p, (__int32)v);\n#else\n    ATOMIC_STORE(\"\", \"\")\n#endif\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    __dmb(_ARM_BARRIER_ISH);\n    __iso_volatile_store32((volatile __int32*)p, (__int32)v);\n#else\n    ATOMIC_STORE(ASM_REL, \"\")\n#endif\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, int /* memory_order_seq_cst_t */)\n{\n#if defined(_MSC_VER)\n    __dmb(_ARM_BARRIER_ISH);\n    __iso_volatile_store32((volatile __int32*)p, (__int32)v);\n    __dmb(_ARM_BARRIER_ISH);\n#else\n    ATOMIC_STORE(ASM_REL, ASM_DMB_ISH)\n#endif\n}\n\n#define ATOMIC_XCHG(PRE, POST) \\\n    atomic_word res; \\\n    atomic_word success; \\\n    __asm__ __volatile__ \\\n    ( \\\n        PRE \\\n    ASM_LABEL (0) \\\n        \"ldrex  %2, [%4]\\n\\t\" \\\n        \"strex  %0, %3, [%4]\\n\\t\" \\\n        \"teq    %0, #0\\n\\t\" \\\n        \"bne    0b\\n\\t\" \\\n        POST \\\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (res) \\\n        : \"r\" (v), \"r\" (p) \\\n        : \"cc\", \"memory\" \\\n    ); \\\n    return res;\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word v, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    return (atomic_word)_InterlockedExchange_nf((long volatile*)p, (long)v);\n#else\n    ATOMIC_XCHG(\"\", \"\")\n#endif\n}\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word v, memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    // _InterlockedExchange_rel is documented by Microsoft, but it doesn't seem to be defined\n    __dmb(_ARM_BARRIER_ISH);\n    return (atomic_word)_InterlockedExchange_nf((long volatile*)p, (long)v);\n#else\n    ATOMIC_XCHG(ASM_REL, \"\")\n#endif\n}\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word v, memory_order_acquire_t)\n{\n#if defined(_MSC_VER)\n    return (atomic_word)_InterlockedExchange_acq((long volatile*)p, (long)v);\n#else\n    ATOMIC_XCHG(\"\", ASM_ISB)\n#endif\n}\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word v, memory_order_acq_rel_t)\n{\n#if defined(_MSC_VER)\n    __dmb(_ARM_BARRIER_ISH);\n    return (atomic_word)_InterlockedExchange_acq((long volatile*)p, (long)v);\n#else\n    ATOMIC_XCHG(ASM_REL, ASM_ISB)\n#endif\n}\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word v, int /* memory_order_seq_cst_t */)\n{\n#if defined(_MSC_VER)\n    // _InterlockedExchange_rel is documented by Microsoft, but it doesn't seem to be defined\n    __dmb(_ARM_BARRIER_ISH);\n    atomic_word res = (atomic_word)_InterlockedExchange_nf((long volatile*)p, (long)v);\n    __dmb(_ARM_BARRIER_ISH);\n    return res;\n#else\n    ATOMIC_XCHG(ASM_REL, ASM_DMB_ISH)\n#endif\n}\n\n#if !defined(_MSC_VER)\n\n// atomic_compare_exchange_weak_explicit: can fail spuriously even if *p == *oldval\n\n#define ATOMIC_CMP_XCHG(PRE, POST) \\\n    atomic_word res; \\\n    atomic_word success = 0; \\\n    __asm__ __volatile__ \\\n    ( \\\n        PRE \\\n        \"ldrex  %2, [%4]\\n\\t\" \\\n        \"teq    %2, %5\\n\\t\" \\\n        \"it     eq\\n\\t\" \\\n        \"strexeq %0, %3, [%4]\\n\\t\" \\\n        POST \\\n        : \"+r\" (success), \"+m\" (*p), \"=&r\" (res) \\\n        : \"r\" (newval), \"r\" (p), \"r\" (*oldval) \\\n        : \"cc\", \"memory\" \\\n    ); \\\n    *oldval = res; \\\n    return success;\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_relaxed_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"\", \"\")\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_release_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(ASM_REL, \"\")\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acquire_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"\", \"teq %0, #0\\n\\tbne 1f\\n\\t\" ASM_ISB ASM_LABEL(1))\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acq_rel_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(ASM_REL, \"teq %0, #0\\n\\tbne 1f\\n\\t\" ASM_ISB ASM_LABEL(1))\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, int /* memory_order_seq_cst_t */, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(ASM_REL, \"teq %0, #0\\n\\tbne 1f\\n\\t\" ASM_DMB_ISH ASM_LABEL(1))\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_release_t, memory_order_release_t)\n{\n    ATOMIC_CMP_XCHG(ASM_REL, \"\")\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acquire_t, memory_order_acquire_t)\n{\n    ATOMIC_CMP_XCHG(\"\", ASM_ISB)\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acq_rel_t, memory_order_acq_rel_t)\n{\n    ATOMIC_CMP_XCHG(ASM_REL, ASM_ISB)\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, int /* memory_order_seq_cst_t */, int /* memory_order_seq_cst_t */)\n{\n    ATOMIC_CMP_XCHG(ASM_REL, ASM_DMB_ISH)\n}\n\n#endif\n\n// atomic_compare_exchange_strong_explicit: does loop and only returns false if *p != *oldval\n\n#undef ATOMIC_CMP_XCHG\n#define ATOMIC_CMP_XCHG(PRE, POST) \\\n    atomic_word res; \\\n    atomic_word success = 0; \\\n    __asm__ __volatile__ \\\n    ( \\\n        PRE \\\n    ASM_LABEL (0) \\\n        \"ldrex  %2, [%4]\\n\\t\" \\\n        \"teq    %2, %5\\n\\t\" \\\n        \"bne    1f\\n\\t\" \\\n        \"strex  %0, %3, [%4]\\n\\t\" \\\n        \"teq    %0, #0\\n\\t\" \\\n        \"bne    0b\\n\\t\" \\\n        POST \\\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (res) \\\n        : \"r\" (newval), \"r\" (p), \"r\" (*oldval) \\\n        : \"cc\", \"memory\" \\\n    ); \\\n    *oldval = res; \\\n    return success;\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_relaxed_t, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    long tmp = _InterlockedCompareExchange_nf((long volatile*)p, (long)newval, (long)*oldval);\n    return *oldval == tmp ? true : (*oldval = tmp, false);\n#else\n    ATOMIC_CMP_XCHG(\"\", ASM_LABEL(1) ASM_CLREX)\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_release_t, memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    long tmp = _InterlockedCompareExchange_rel((long volatile*)p, (long)newval, (long)*oldval);\n    return *oldval == tmp ? true : (*oldval = tmp, false);\n#else\n    ATOMIC_CMP_XCHG(ASM_REL, ASM_LABEL(1) ASM_CLREX)\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acquire_t, memory_order_acquire_t)\n{\n#if defined(_MSC_VER)\n    long tmp = _InterlockedCompareExchange_acq((long volatile*)p, (long)newval, (long)*oldval);\n    return *oldval == tmp ? true : (*oldval = tmp, false);\n#else\n    ATOMIC_CMP_XCHG(\"\", ASM_LABEL(1) ASM_CLREX ASM_ISB)\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acq_rel_t, memory_order_acq_rel_t)\n{\n#if defined(_MSC_VER)\n    __dmb(_ARM_BARRIER_ISH);\n    long tmp = _InterlockedCompareExchange_acq((long volatile*)p, (long)newval, (long)*oldval);\n    return *oldval == tmp ? true : (*oldval = tmp, false);\n#else\n    ATOMIC_CMP_XCHG(ASM_REL, ASM_LABEL(1) ASM_CLREX ASM_ISB)\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, int /* memory_order_seq_cst_t */, int /* memory_order_seq_cst_t */)\n{\n#if defined(_MSC_VER)\n    long tmp = _InterlockedCompareExchange_rel((long volatile*)p, (long)newval, (long)*oldval);\n    __dmb(_ARM_BARRIER_ISH);\n    return *oldval == tmp ? true : (*oldval = tmp, false);\n#else\n    ATOMIC_CMP_XCHG(ASM_REL, ASM_LABEL(1) ASM_CLREX ASM_DMB_ISH)\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_release_t, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_release, memory_order_release);\n#else\n    ATOMIC_CMP_XCHG(ASM_REL, ASM_LABEL(1) ASM_CLREX)\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acquire_t, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_acquire, memory_order_acquire);\n#else\n    ATOMIC_CMP_XCHG(\"\", ASM_ISB ASM_LABEL(1) ASM_CLREX)\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acq_rel_t, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_acq_rel, memory_order_acq_rel);\n#else\n    ATOMIC_CMP_XCHG(ASM_REL, ASM_ISB ASM_LABEL(1) ASM_CLREX)\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, int /* memory_order_seq_cst_t */, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_seq_cst, memory_order_seq_cst);\n#else\n    ATOMIC_CMP_XCHG(ASM_REL, ASM_DMB_ISH ASM_LABEL(1) ASM_CLREX)\n#endif\n}\n\n#if defined(_MSC_VER)\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_relaxed_t, memory_order_relaxed_t)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_relaxed, memory_order_relaxed);\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_release_t, memory_order_relaxed_t)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_release, memory_order_relaxed);\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acquire_t, memory_order_relaxed_t)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_acquire, memory_order_relaxed);\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acq_rel_t, memory_order_relaxed_t)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_acq_rel, memory_order_relaxed);\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, int /* memory_order_seq_cst_t */, memory_order_relaxed_t)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_seq_cst, memory_order_relaxed);\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_release_t, memory_order_release_t)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_release, memory_order_release);\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acquire_t, memory_order_acquire_t)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_acquire, memory_order_acquire);\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acq_rel_t, memory_order_acq_rel_t)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_acq_rel, memory_order_acq_rel);\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, int /* memory_order_seq_cst_t */, int /* memory_order_seq_cst_t */)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_seq_cst, memory_order_seq_cst);\n}\n\n#endif\n\n#define ATOMIC_OP(PRE, OP, POST) \\\n    atomic_word res, tmp; \\\n    atomic_word success; \\\n    __asm__ __volatile__ \\\n    ( \\\n        PRE \\\n    ASM_LABEL (0) \\\n        \"ldrex  %2, [%5]\\n\\t\" \\\n        OP \"    %3, %2, %4\\n\\t\" \\\n        \"strex  %0, %3, [%5]\\n\\t\" \\\n        \"teq    %0, #0\\n\\t\" \\\n        \"bne    0b\\n\\t\" \\\n        POST \\\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (res), \"=&r\" (tmp) \\\n        : \"Ir\" (v), \"r\" (p) \\\n        : \"cc\", \"memory\" \\\n    ); \\\n    return res;\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word* p, atomic_word v, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    return (atomic_word)_InterlockedExchangeAdd_nf((volatile long*)p, (long)v);\n#else\n    ATOMIC_OP(\"\", \"add\", \"\")\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word* p, atomic_word v, memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    return (atomic_word)_InterlockedExchangeAdd_rel((volatile long*)p, (long)v);\n#else\n    ATOMIC_OP(ASM_REL, \"add\", \"\")\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word* p, atomic_word v, memory_order_acquire_t)\n{\n#if defined(_MSC_VER)\n    return (atomic_word)_InterlockedExchangeAdd_acq((volatile long*)p, (long)v);\n#else\n    ATOMIC_OP(\"\", \"add\", ASM_ISB)\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word* p, atomic_word v, memory_order_acq_rel_t)\n{\n#if defined(_MSC_VER)\n    __dmb(_ARM_BARRIER_ISH);\n    return (atomic_word)_InterlockedExchangeAdd_acq((volatile long*)p, (long)v);\n#else\n    ATOMIC_OP(ASM_REL, \"add\", ASM_ISB)\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word* p, atomic_word v, int /* memory_order_seq_cst_t */)\n{\n#if defined(_MSC_VER)\n    long oldval = _InterlockedExchangeAdd_rel((volatile long*)p, (long)v);\n    __dmb(_ARM_BARRIER_ISH);\n    return (atomic_word)oldval;\n#else\n    ATOMIC_OP(ASM_REL, \"add\", ASM_DMB_ISH)\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word* p, atomic_word v, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    return atomic_fetch_add_explicit(p, -v, memory_order_relaxed);\n#else\n    ATOMIC_OP(\"\", \"sub\", \"\")\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word* p, atomic_word v, memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    return atomic_fetch_add_explicit(p, -v, memory_order_release);\n#else\n    ATOMIC_OP(ASM_REL, \"sub\", \"\")\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word* p, atomic_word v, memory_order_acquire_t)\n{\n#if defined(_MSC_VER)\n    return atomic_fetch_add_explicit(p, -v, memory_order_acquire);\n#else\n    ATOMIC_OP(\"\", \"sub\", ASM_ISB)\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word* p, atomic_word v, memory_order_acq_rel_t)\n{\n#if defined(_MSC_VER)\n    return atomic_fetch_add_explicit(p, -v, memory_order_acq_rel);\n#else\n    ATOMIC_OP(ASM_REL, \"sub\", ASM_ISB)\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word* p, atomic_word v, int /* memory_order_seq_cst_t */)\n{\n#if defined(_MSC_VER)\n    return atomic_fetch_add_explicit(p, -v, memory_order_seq_cst);\n#else\n    ATOMIC_OP(ASM_REL, \"sub\", ASM_DMB_ISH)\n#endif\n}\n\n/*\n *  extensions\n */\n\nstatic inline void atomic_retain(volatile int* p)\n{\n#if defined(_MSC_VER)\n    _InterlockedIncrement_nf((volatile long*)p);\n#else\n    atomic_fetch_add_explicit(p, 1, memory_order_relaxed);\n#endif\n}\n\nstatic inline bool atomic_release(volatile int* p)\n{\n#if defined(_MSC_VER)\n    // _interlockedDecrement returns the resulting decremented value\n    bool res = _InterlockedDecrement_rel((volatile long*)p) == 0;\n    if (res)\n    {\n        __dmb(_ARM_BARRIER_ISH);\n    }\n#else\n    bool res = atomic_fetch_sub_explicit(p, 1, memory_order_release) == 1;\n    if (res)\n    {\n        atomic_thread_fence(memory_order_acquire);\n    }\n#endif\n    return res;\n}\n\n/*\n *  double word\n */\n\n// Note: the only way to get atomic 64-bit memory accesses on ARM is to use ldrexd/strexd with a loop\n// (ldrd and strd instructions are not guaranteed to appear atomic)\n\nstatic inline atomic_word2 atomic_load_explicit(const volatile atomic_word2* p, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n//  atomic_word2 r; r.v = __iso_volatile_load64 ((volatile __int64*) p); return r;\n    atomic_word2 r;\n    r.v = _InterlockedCompareExchange64_nf((volatile __int64*)p, (__int64)0, (__int64)0);\n    return r;\n#else\n    register atomic_word lo __asm__ (\"r2\");\n    register atomic_word hi __asm__ (\"r3\");\n    atomic_word success;\n\n    __asm__ __volatile__\n    (\n        ASM_LABEL(0)\n        \"ldrexd\\t%1, %2, [%3]\\n\\t\"\n        \"strexd\\t%0, %1, %2, [%3]\\n\\t\"\n        \"teq\\t%0, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n\n        : \"=&r\" (success), \"=&r\" (lo), \"=&r\" (hi)\n        : \"r\" (p)\n        : \"cc\", \"r2\", \"r3\"\n    );\n    atomic_word2 w;\n    w.lo = lo;\n    w.hi = hi;\n    return w;\n#endif\n}\n\nstatic inline atomic_word2 atomic_load_explicit(const volatile atomic_word2* p, memory_order_acquire_t)\n{\n#if defined(_MSC_VER)\n    atomic_word2 r;\n    r.v = _InterlockedCompareExchange64_acq((volatile __int64*)p, (__int64)0, (__int64)0);\n    return r;\n#else\n    register atomic_word lo __asm__ (\"r2\");\n    register atomic_word hi __asm__ (\"r3\");\n    atomic_word success;\n\n    __asm__ __volatile__\n    (\n        ASM_LABEL(0)\n        \"ldrexd\\t%1, %2, [%3]\\n\\t\"\n        \"strexd\\t%0, %1, %2, [%3]\\n\\t\"\n        \"teq\\t%0, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        ASM_ISB\n\n        : \"=&r\" (success), \"=&r\" (lo), \"=&r\" (hi)\n        : \"r\" (p)\n        : \"cc\", \"memory\", \"r2\", \"r3\"\n    );\n    atomic_word2 w;\n    w.lo = lo;\n    w.hi = hi;\n    return w;\n#endif\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word2* p, atomic_word2 v, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    atomic_word2 w, x;\n    w = v;\n    x = v;\n    do\n    {\n        w.v = _InterlockedCompareExchange64_nf((volatile __int64*)p, x.v, w.v);\n    }\n    while (w.v != x.v);\n#else\n    register atomic_word l __asm__ (\"r2\");\n    register atomic_word h __asm__ (\"r3\");\n    register atomic_word lo __asm__ (\"r0\") = v.lo;\n    register atomic_word hi __asm__ (\"r1\") = v.hi;\n    atomic_word success;\n\n    __asm__ __volatile__\n    (\n        ASM_LABEL(0)\n        \"ldrexd\\t%2, %3, [%6]\\n\\t\"\n        \"strexd\\t%0, %4, %5, [%6]\\n\\t\"\n        \"teq\\t%0, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n\n        : \"=&r\" (success), \"=m\" (*p), \"=&r\" (l), \"=&r\" (h)\n        : \"r\" (lo), \"r\" (hi), \"r\" (p)\n        : \"cc\", \"memory\", \"r2\", \"r3\"\n    );\n#endif\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word2* p, atomic_word2 v, memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    atomic_word2 w, x;\n    w = v;\n    x = v;\n    do\n    {\n        w.v = _InterlockedCompareExchange64_rel((volatile __int64*)p, x.v, w.v);\n    }\n    while (w.v != x.v);\n#else\n    register atomic_word l __asm__ (\"r2\");\n    register atomic_word h __asm__ (\"r3\");\n    register atomic_word lo __asm__ (\"r0\") = v.lo;\n    register atomic_word hi __asm__ (\"r1\") = v.hi;\n    atomic_word success;\n\n    __asm__ __volatile__\n    (\n        ASM_REL\n        ASM_LABEL(0)\n        \"ldrexd\\t%2, %3, [%6]\\n\\t\"\n        \"strexd\\t%0, %4, %5, [%6]\\n\\t\"\n        \"teq\\t%0, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n\n        : \"=&r\" (success), \"=m\" (*p), \"=&r\" (l), \"=&r\" (h)\n        : \"r\" (lo), \"r\" (hi), \"r\" (p)\n        : \"cc\", \"memory\", \"r2\", \"r3\"\n    );\n#endif\n}\n\nstatic inline atomic_word2 atomic_exchange_explicit(volatile atomic_word2* p, atomic_word2 val, memory_order_acq_rel_t)\n{\n#if defined(_MSC_VER)\n    __dmb(_ARM_BARRIER_ISH);\n    atomic_word2 w;\n    w.v = _InterlockedExchange64_acq((__int64 volatile*)p, (__int64)val.v);\n    return w;\n#else\n    register atomic_word l __asm__ (\"r0\");\n    register atomic_word h __asm__ (\"r1\");\n    register atomic_word lo __asm__ (\"r2\") = val.lo;\n    register atomic_word hi __asm__ (\"r3\") = val.hi;\n    atomic_word success;\n\n    __asm__ __volatile__\n    (\n        ASM_REL\n        ASM_LABEL(0)\n        \"ldrexd\\t%2, %3, [%6]\\n\\t\"\n        \"strexd\\t%0, %5, %4, [%6]\\n\\t\"\n        \"teq\\t%0, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        ASM_ISB\n\n        : \"=&r\" (success), \"=m\" (*p), \"=&r\" (l), \"=&r\" (h)\n        : \"r\" (hi), \"r\" (lo), \"r\" (p)\n        : \"cc\", \"memory\", \"r0\", \"r1\", \"r3\"\n    );\n    val.lo = l;\n    val.hi = h;\n\n    return val;\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word2* p, atomic_word2* oldval, atomic_word2 newval, memory_order_acquire_t, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    __int64 tmp = _InterlockedCompareExchange64_acq((volatile __int64*)p, newval.v, oldval->v);\n    return oldval->v == tmp ? true : (oldval->v = tmp, false);\n#else\n    register atomic_word l __asm__ (\"r2\");\n    register atomic_word h __asm__ (\"r3\");\n    register atomic_word lo __asm__ (\"r0\") = newval.lo;\n    register atomic_word hi __asm__ (\"r1\") = newval.hi;\n    atomic_word success;\n\n    __asm__ __volatile__\n    (\n        ASM_LABEL(0)\n        \"ldrexd\\t%2, %3, [%8]\\n\\t\"\n        \"teq\\t%3, %5\\n\\t\"\n        \"it\\t\\teq\\n\\t\"\n        \"teqeq\\t%2, %4\\n\\t\"\n        \"bne\\t1f\\n\\t\"\n        \"strexd\\t%0, %6, %7, [%8]\\n\\t\"\n        \"teq\\t%0, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        ASM_ISB\n        ASM_LABEL(1)\n        \"clrex\\n\\t\"\n\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (l), \"=&r\" (h)\n        : \"r\" (oldval->lo), \"r\" (oldval->hi), \"r\" (lo), \"r\" (hi), \"r\" (p), \"0\" (1)\n        : \"cc\", \"memory\", \"r2\", \"r3\"\n    );\n    if (success != 0)\n    {\n        oldval->lo = l;\n        oldval->hi = h;\n    }\n    return success == 0;\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word2* p, atomic_word2* oldval, atomic_word2 newval, memory_order_release_t, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    __int64 tmp = _InterlockedCompareExchange64_rel((volatile __int64*)p, newval.v, oldval->v);\n    return oldval->v == tmp ? true : (oldval->v = tmp, false);\n#else\n    register atomic_word l __asm__ (\"r2\");\n    register atomic_word h __asm__ (\"r3\");\n    register atomic_word lo __asm__ (\"r0\") = newval.lo;\n    register atomic_word hi __asm__ (\"r1\") = newval.hi;\n    atomic_word success;\n\n    __asm__ __volatile__\n    (\n        ASM_REL\n        ASM_LABEL(0)\n        \"ldrexd\\t%2, %3, [%8]\\n\\t\"\n        \"teq\\t%3, %5\\n\\t\"\n        \"it\\t\\teq\\n\\t\"\n        \"teqeq\\t%2, %4\\n\\t\"\n        \"bne\\t1f\\n\\t\"\n        \"strexd\\t%0, %6, %7, [%8]\\n\\t\"\n        \"teq\\t%0, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        ASM_LABEL(1)\n        \"clrex\\n\\t\"\n\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (l), \"=&r\" (h)\n        : \"r\" (oldval->lo), \"r\" (oldval->hi), \"r\" (lo), \"r\" (hi), \"r\" (p), \"0\" (1)\n        : \"cc\", \"memory\", \"r2\", \"r3\"\n    );\n    if (success != 0)\n    {\n        oldval->lo = l;\n        oldval->hi = h;\n    }\n    return success == 0;\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word2* p, atomic_word2* oldval, atomic_word2 newval, memory_order_acq_rel_t, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    __dmb(_ARM_BARRIER_ISH);\n    __int64 tmp = _InterlockedCompareExchange64_acq((volatile __int64*)p, newval.v, oldval->v);\n    return oldval->v == tmp ? true : (oldval->v = tmp, false);\n#else\n    register atomic_word l __asm__ (\"r2\");\n    register atomic_word h __asm__ (\"r3\");\n    register atomic_word lo __asm__ (\"r0\") = newval.lo;\n    register atomic_word hi __asm__ (\"r1\") = newval.hi;\n    atomic_word success;\n\n    __asm__ __volatile__\n    (\n        ASM_REL\n        ASM_LABEL(0)\n        \"ldrexd\\t%2, %3, [%8]\\n\\t\"\n        \"teq\\t%3, %5\\n\\t\"\n        \"it\\t\\teq\\n\\t\"\n        \"teqeq\\t%2, %4\\n\\t\"\n        \"bne\\t1f\\n\\t\"\n        \"strexd\\t%0, %6, %7, [%8]\\n\\t\"\n        \"teq\\t%0, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        ASM_ISB\n        ASM_LABEL(1)\n        \"clrex\\n\\t\"\n\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (l), \"=&r\" (h)\n        : \"r\" (oldval->lo), \"r\" (oldval->hi), \"r\" (lo), \"r\" (hi), \"r\" (p), \"0\" (1)\n        : \"cc\", \"memory\", \"r2\", \"r3\"\n    );\n    if (success != 0)\n    {\n        oldval->lo = l;\n        oldval->hi = h;\n    }\n    return success == 0;\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word2* p, atomic_word2* oldval, atomic_word2 newval, memory_order_seq_cst_t, memory_order_relaxed_t)\n{\n#if defined(_MSC_VER)\n    __int64 tmp = _InterlockedCompareExchange64_rel((volatile __int64*)p, newval.v, oldval->v);\n    __dmb(_ARM_BARRIER_ISH);\n    return oldval->v == tmp ? true : (oldval->v = tmp, false);\n#else\n    register atomic_word l __asm__ (\"r2\");\n    register atomic_word h __asm__ (\"r3\");\n    register atomic_word lo __asm__ (\"r0\") = newval.lo;\n    register atomic_word hi __asm__ (\"r1\") = newval.hi;\n    atomic_word success;\n\n    __asm__ __volatile__\n    (\n        ASM_REL\n        ASM_LABEL(0)\n        \"ldrexd\\t%2, %3, [%8]\\n\\t\"\n        \"teq\\t%3, %5\\n\\t\"\n        \"it\\t\\teq\\n\\t\"\n        \"teqeq\\t%2, %4\\n\\t\"\n        \"bne\\t1f\\n\\t\"\n        \"strexd\\t%0, %6, %7, [%8]\\n\\t\"\n        \"teq\\t%0, #0\\n\\t\"\n        \"bne\\t0b\\n\\t\"\n        ASM_DMB_ISH\n        ASM_LABEL(1)\n        \"clrex\\n\\t\"\n\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (l), \"=&r\" (h)\n        : \"r\" (oldval->lo), \"r\" (oldval->hi), \"r\" (lo), \"r\" (hi), \"r\" (p), \"0\" (1)\n        : \"cc\", \"memory\", \"r2\", \"r3\"\n    );\n    if (success != 0)\n    {\n        oldval->lo = l;\n        oldval->hi = h;\n    }\n    return success == 0;\n#endif\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Unity/ExtendedAtomicOps-arm64.h",
    "content": "#define ASM_DMB_ISH         \"dmb    ish\\n\\t\"\n\n#if defined(__ARM_ARCH_7S__)\n// this is sufficient for Swift processors\n#   define ASM_REL         \"dmb    ishst\\n\\t\"\n#else\n#   define ASM_REL         \"dmb    ish\\n\\t\"\n#endif\n\nstatic inline void atomic_pause()\n{\n}\n\nstatic inline void atomic_thread_fence(memory_order_relaxed_t)\n{\n}\n\nstatic inline void atomic_thread_fence(memory_order_acquire_t)\n{\n    __asm__ __volatile__ (\"dmb ld\\n\\t\" : : : \"memory\");\n}\n\nstatic inline void atomic_thread_fence(memory_order_release_t)\n{\n    __asm__ __volatile__ (ASM_REL : : : \"memory\");\n}\n\nstatic inline void atomic_thread_fence(memory_order_acq_rel_t)\n{\n    __asm__ __volatile__ (ASM_DMB_ISH : : : \"memory\");\n}\n\nstatic inline void atomic_thread_fence(int /* memory_order_seq_cst_t */)\n{\n    __asm__ __volatile__ (ASM_DMB_ISH : : : \"memory\");\n}\n\n#define ATOMIC_LOAD(opc) \\\n    atomic_word res; \\\n    __asm__ __volatile__ \\\n    ( \\\n        opc \"   %0, %1\\n\\t\" \\\n        : \"=r\" (res) \\\n        : \"m\" (*p) \\\n    ); \\\n    return res;\n\n/*\n *  int support\n */\n\nstatic inline int atomic_load_explicit(const volatile int* p, memory_order_relaxed_t)\n{\n    int res;\n    __asm__ __volatile__\n    (\n        \"ldr   %w0, %w1\\n\\t\"\n        : \"=r\" (res)\n        : \"m\" (*p)\n    );\n    return res;\n}\n\nstatic inline int atomic_load_explicit(const volatile int* p, memory_order_acquire_t)\n{\n    int res;\n    __asm__ __volatile__\n    (\n        \"ldar   %w0, %w1\\n\\t\"\n        : \"=r\" (res)\n        : \"m\" (*p)\n    );\n    return res;\n}\n\nstatic inline int atomic_load_explicit(const volatile int* p, int /* memory_order_seq_cst_t */)\n{\n    int res;\n    __asm__ __volatile__\n    (\n        \"ldar   %w0, %w1\\n\\t\"\n        : \"=r\" (res)\n        : \"m\" (*p)\n    );\n    return res;\n}\n\n/*\n *  native word support\n */\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, memory_order_relaxed_t)\n{\n    ATOMIC_LOAD(\"ldr\")\n}\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, memory_order_acquire_t)\n{\n    ATOMIC_LOAD(\"ldar\")\n}\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, int /* memory_order_seq_cst_t */)\n{\n    ATOMIC_LOAD(\"ldar\")\n}\n\n#define ATOMIC_STORE(opc) \\\n    __asm__ __volatile__ \\\n    ( \\\n        opc \"   %1, %0\\n\\t\" \\\n        : \"=m\" (*p) \\\n        : \"r\" (v) \\\n        : \"memory\" \\\n    );\n\n/*\n *  int support\n */\n\nstatic inline void atomic_store_explicit(volatile int* p, int v, memory_order_relaxed_t)\n{\n    __asm__ __volatile__\n    (\n        \"str   %w1, %w0\\n\\t\"\n        : \"=m\" (*p)\n        : \"r\" (v)\n        : \"memory\"\n    );\n}\n\nstatic inline void atomic_store_explicit(volatile int* p, int v, memory_order_release_t)\n{\n    __asm__ __volatile__\n    (\n        \"stlr   %w1, %w0\\n\\t\"\n        : \"=m\" (*p)\n        : \"r\" (v)\n        : \"memory\"\n    );\n}\n\nstatic inline void atomic_store_explicit(volatile int* p, int v, int /* memory_order_seq_cst_t */)\n{\n    __asm__ __volatile__\n    (\n        \"stlr   %w1, %w0\\n\\t\"\n        : \"=m\" (*p)\n        : \"r\" (v)\n        : \"memory\"\n    );\n}\n\n/*\n *  native word support\n */\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, memory_order_relaxed_t)\n{\n    ATOMIC_STORE(\"str\")\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, memory_order_release_t)\n{\n    ATOMIC_STORE(\"stlr\")\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, int /* memory_order_seq_cst_t */)\n{\n    ATOMIC_STORE(\"stlr\")\n}\n\n#define ATOMIC_XCHG(LD, ST) \\\n    atomic_word res; \\\n    atomic_word success; \\\n    __asm__ __volatile__ \\\n    ( \\\n    \"0:\\n\\t\" \\\n        LD \"    %2, [%4]\\n\\t\" \\\n        ST \"    %w0, %3, [%4]\\n\\t\" \\\n        \"cbnz   %w0, 0b\\n\\t\" \\\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (res) \\\n        : \"r\" (v), \"r\" (p) \\\n        : \"memory\" \\\n    ); \\\n    return res;\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word v, memory_order_relaxed_t)\n{\n    ATOMIC_XCHG(\"ldxr\", \"stxr\")\n}\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word v, memory_order_acquire_t)\n{\n    ATOMIC_XCHG(\"ldaxr\", \"stxr\")\n}\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word v, memory_order_release_t)\n{\n    ATOMIC_XCHG(\"ldxr\", \"stlxr\")\n}\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word v, memory_order_acq_rel_t)\n{\n    ATOMIC_XCHG(\"ldaxr\", \"stlxr\")\n}\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word v, int /* memory_order_seq_cst_t */)\n{\n    ATOMIC_XCHG(\"ldaxr\", \"stlxr\")\n}\n\n// atomic_compare_exchange_weak_explicit: can fail spuriously even if *p == *oldval\n\n#define ATOMIC_CMP_XCHG(LD, ST) \\\n    atomic_word res; \\\n    atomic_word success = 0; \\\n    __asm__ __volatile__ \\\n    ( \\\n        LD \"    %2, [%4]\\n\\t\" \\\n        \"cmp    %2, %5\\n\\t\" \\\n        \"b.ne   1f\\n\\t\" \\\n        ST \"    %w0, %3, [%4]\\n\" \\\n    \"1:\\n\\t\" \\\n        \"clrex\\n\\t\" \\\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (res) \\\n        : \"r\" (newval), \"r\" (p), \"r\" (*oldval) \\\n        : \"cc\", \"memory\" \\\n    ); \\\n    *oldval = res; \\\n    return success == 0;\n\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_relaxed_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"ldxr\", \"stxr\")\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acquire_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stxr\")\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_release_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"ldxr\", \"stlxr\")\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acq_rel_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stlxr\")\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, int /* memory_order_seq_cst_t */, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stlxr\")\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acquire_t, memory_order_acquire_t)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stxr\")\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_release_t, memory_order_release_t)\n{\n    ATOMIC_CMP_XCHG(\"ldxr\", \"stlxr\")\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acq_rel_t, memory_order_acq_rel_t)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stlxr\")\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, int /* memory_order_seq_cst_t */, int /* memory_order_seq_cst_t */)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stlxr\")\n}\n\n// atomic_compare_exchange_strong_explicit: does loop and only returns false if *p != *oldval\n\n#undef ATOMIC_CMP_XCHG\n\n#define ATOMIC_CMP_XCHG(LD, ST) \\\n    atomic_word res; \\\n    atomic_word success = 0; \\\n    __asm__ __volatile__ \\\n    ( \\\n    \"0:\\n\\t\" \\\n        LD \"    %2, [%4]\\n\\t\" \\\n        \"cmp    %2, %5\\n\\t\" \\\n        \"b.ne   1f\\n\\t\" \\\n        ST \"    %w0, %3, [%4]\\n\" \\\n        \"cbnz   %w0, 0b\\n\\t\" \\\n    \"1:\\n\\t\" \\\n        \"clrex\\n\\t\" \\\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (res) \\\n        : \"r\" (newval), \"r\" (p), \"r\" (*oldval) \\\n        : \"cc\", \"memory\" \\\n    ); \\\n    *oldval = res; \\\n    return success == 0;\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_relaxed_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"ldxr\", \"stxr\")\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acquire_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stxr\")\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_release_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"ldxr\", \"stlxr\")\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acq_rel_t, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stlxr\")\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, int /* memory_order_seq_cst_t */, memory_order_relaxed_t)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stlxr\")\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acquire_t, memory_order_acquire_t)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stxr\")\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_release_t, memory_order_release_t)\n{\n    ATOMIC_CMP_XCHG(\"ldxr\", \"stlxr\")\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_acq_rel_t, memory_order_acq_rel_t)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stlxr\")\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word *oldval, atomic_word newval, int /* memory_order_seq_cst_t */, int /* memory_order_seq_cst_t */)\n{\n    ATOMIC_CMP_XCHG(\"ldaxr\", \"stlxr\")\n}\n\n#define ATOMIC_PFIX_int         \"%w\"\n#define ATOMIC_PFIX_atomic_word \"%\"\n#define ATOMIC_PFIX(WORD)       ATOMIC_PFIX_##WORD\n\n#define ATOMIC_OP(WORD, LD, ST, OP) \\\n    long long res, tmp; \\\n    int success; \\\n    __asm__ __volatile__ \\\n    ( \\\n    \"0:\\n\\t\" \\\n        LD \"    \" ATOMIC_PFIX(WORD) \"2, [%5]\\n\\t\" \\\n        OP \"    \" ATOMIC_PFIX(WORD) \"3, \" ATOMIC_PFIX(WORD) \"2, \" ATOMIC_PFIX(WORD) \"4\\n\\t\"\\\n        ST \"    %w0, \" ATOMIC_PFIX(WORD) \"3, [%5]\\n\" \\\n        \"cbnz   %w0, 0b\\n\\t\" \\\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (res), \"=&r\" (tmp) \\\n        : \"Ir\" ((long long) v), \"r\" (p) \\\n        : \"cc\", \"memory\" \\\n    ); \\\n    return (WORD) res;\n\nstatic inline int atomic_fetch_add_explicit(volatile int* p, int v, memory_order_relaxed_t)\n{\n    ATOMIC_OP(int, \"ldxr\", \"stxr\", \"add\")\n}\n\nstatic inline int atomic_fetch_add_explicit(volatile int* p, int v, memory_order_acquire_t)\n{\n    ATOMIC_OP(int, \"ldaxr\", \"stxr\", \"add\")\n}\n\nstatic inline int atomic_fetch_add_explicit(volatile int* p, int v, memory_order_release_t)\n{\n    ATOMIC_OP(int, \"ldxr\", \"stlxr\", \"add\")\n}\n\nstatic inline int atomic_fetch_add_explicit(volatile int* p, int v, memory_order_acq_rel_t)\n{\n    ATOMIC_OP(int, \"ldaxr\", \"stlxr\", \"add\")\n}\n\nstatic inline int atomic_fetch_add_explicit(volatile int* p, int v, int /* memory_order_seq_cst_t */)\n{\n    ATOMIC_OP(int, \"ldaxr\", \"stlxr\", \"add\")\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word* p, atomic_word v, memory_order_relaxed_t)\n{\n    ATOMIC_OP(atomic_word, \"ldxr\", \"stxr\", \"add\")\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word* p, atomic_word v, memory_order_acquire_t)\n{\n    ATOMIC_OP(atomic_word, \"ldaxr\", \"stxr\", \"add\")\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word* p, atomic_word v, memory_order_release_t)\n{\n    ATOMIC_OP(atomic_word, \"ldxr\", \"stlxr\", \"add\")\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word* p, atomic_word v, memory_order_acq_rel_t)\n{\n    ATOMIC_OP(atomic_word, \"ldaxr\", \"stlxr\", \"add\")\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word* p, atomic_word v, int /* memory_order_seq_cst_t */)\n{\n    ATOMIC_OP(atomic_word, \"ldaxr\", \"stlxr\", \"add\")\n}\n\nstatic inline int atomic_fetch_sub_explicit(volatile int* p, int v, memory_order_relaxed_t)\n{\n    ATOMIC_OP(int, \"ldxr\", \"stxr\", \"sub\")\n}\n\nstatic inline int atomic_fetch_sub_explicit(volatile int* p, int v, memory_order_acquire_t)\n{\n    ATOMIC_OP(int, \"ldaxr\", \"stxr\", \"sub\")\n}\n\nstatic inline int atomic_fetch_sub_explicit(volatile int* p, int v, memory_order_release_t)\n{\n    ATOMIC_OP(int, \"ldxr\", \"stlxr\", \"sub\")\n}\n\nstatic inline int atomic_fetch_sub_explicit(volatile int* p, int v, memory_order_acq_rel_t)\n{\n    ATOMIC_OP(int, \"ldaxr\", \"stlxr\", \"sub\")\n}\n\nstatic inline int atomic_fetch_sub_explicit(volatile int* p, int v, int /* memory_order_seq_cst_t */)\n{\n    ATOMIC_OP(int, \"ldaxr\", \"stlxr\", \"sub\")\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word* p, atomic_word v, memory_order_relaxed_t)\n{\n    ATOMIC_OP(atomic_word, \"ldxr\", \"stxr\", \"sub\")\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word* p, atomic_word v, memory_order_acquire_t)\n{\n    ATOMIC_OP(atomic_word, \"ldaxr\", \"stxr\", \"sub\")\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word* p, atomic_word v, memory_order_release_t)\n{\n    ATOMIC_OP(atomic_word, \"ldxr\", \"stlxr\", \"sub\")\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word* p, atomic_word v, memory_order_acq_rel_t)\n{\n    ATOMIC_OP(atomic_word, \"ldaxr\", \"stlxr\", \"sub\")\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word* p, atomic_word v, int /* memory_order_seq_cst_t */)\n{\n    ATOMIC_OP(atomic_word, \"ldaxr\", \"stlxr\", \"sub\")\n}\n\n/*\n *  extensions\n */\n\nstatic inline void atomic_retain(volatile int* p)\n{\n    atomic_fetch_add_explicit(p, 1, memory_order_relaxed);\n}\n\nstatic inline bool atomic_release(volatile int* p)\n{\n    bool res = atomic_fetch_sub_explicit(p, 1, memory_order_release) == 1;\n    if (res)\n    {\n        atomic_thread_fence(memory_order_acquire);\n    }\n    return res;\n}\n\n/*\n *  double word\n */\n\n// Note: the only way to get atomic 128-bit memory accesses on ARM64 is to use ldxp/stxp with a loop\n// (ldxp and stxp instructions are not guaranteed to appear atomic)\n\nstatic inline atomic_word2 atomic_load_explicit(const volatile atomic_word2* p, memory_order_relaxed_t)\n{\n    atomic_word2 v;\n    atomic_word success;\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldxp\\t%1, %2, [%3]\\n\\t\"\n        \"stxp\\t%w0, %1, %2, [%3]\\n\\t\"\n        \"cbnz\\t%w0, 0b\\n\\t\"\n\n        : \"=&r\" (success), \"=&r\" (v.lo), \"=&r\" (v.hi)\n        : \"r\" (p)\n    );\n    return v;\n}\n\nstatic inline atomic_word2 atomic_load_explicit(const volatile atomic_word2* p, memory_order_acquire_t)\n{\n    atomic_word2 v;\n    atomic_word success;\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldaxp\\t%1, %2, [%3]\\n\\t\"\n        \"stxp\\t%w0, %1, %2, [%3]\\n\\t\"\n        \"cbnz\\t%w0, 0b\\n\\t\"\n\n        : \"=&r\" (success), \"=&r\" (v.lo), \"=&r\" (v.hi)\n        : \"r\" (p)\n    );\n    return v;\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word2* p, atomic_word2 v, memory_order_relaxed_t)\n{\n    atomic_word lo;\n    atomic_word hi;\n    atomic_word success;\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldxp\\t%2, %3, [%6]\\n\\t\"\n        \"stxp\\t%w0, %4, %5, [%6]\\n\\t\"\n        \"cbnz\\t%w0, 0b\\n\\t\"\n\n        : \"=&r\" (success), \"=m\" (*p), \"=&r\" (lo), \"=&r\" (hi)\n        : \"r\" (v.lo), \"r\" (v.hi), \"r\" (p)\n        : \"memory\"\n    );\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word2* p, atomic_word2 v, memory_order_release_t)\n{\n    atomic_word lo;\n    atomic_word hi;\n    atomic_word success;\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldxp\\t%2, %3, [%6]\\n\\t\"\n        \"stlxp\\t%w0, %4, %5, [%6]\\n\\t\"\n        \"cbnz\\t%w0, 0b\\n\\t\"\n\n        : \"=&r\" (success), \"=m\" (*p), \"=&r\" (lo), \"=&r\" (hi)\n        : \"r\" (v.lo), \"r\" (v.hi), \"r\" (p)\n        : \"memory\"\n    );\n}\n\nstatic inline atomic_word2 atomic_exchange_explicit(volatile atomic_word2* p, atomic_word2 val, memory_order_acq_rel_t)\n{\n    atomic_word2 oldval;\n    atomic_word success;\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldaxp\\t%2, %3, [%6]\\n\\t\"\n        \"stlxp\\t%w0, %5, %4, [%6]\\n\\t\"\n        \"cbnz\\t%w0, 0b\\n\\t\"\n\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (oldval.lo), \"=&r\" (oldval.hi)\n        : \"r\" (val.hi), \"r\" (val.lo), \"r\" (p)\n        : \"memory\"\n    );\n\n    return oldval;\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word2* p, atomic_word2* oldval, atomic_word2 newval, memory_order_acquire_t, memory_order_relaxed_t)\n{\n    atomic_word lo = oldval->lo;\n    atomic_word hi = oldval->hi;\n    atomic_word success;\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldaxp\\t%2, %3, [%8]\\n\\t\"\n        \"cmp\\t%3, %5\\n\\t\"\n        \"b.ne\\t1f\\n\\t\"\n        \"cmp\\t%2, %4\\n\\t\"\n        \"b.ne\\t1f\\n\\t\"\n        \"stxp\\t%w0, %6, %7, [%8]\\n\\t\"\n        \"cbnz\\t%w0, 0b\\n\\t\"\n        \"1:\\n\\t\"\n        \"clrex\\n\\t\"\n\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (oldval->lo), \"=&r\" (oldval->hi)\n        : \"r\" (lo), \"r\" (hi), \"r\" (newval.lo), \"r\" (newval.hi), \"r\" (p), \"0\" (1)\n        : \"cc\", \"memory\"\n    );\n\n    return success == 0;\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word2* p, atomic_word2* oldval, atomic_word2 newval, memory_order_release_t, memory_order_relaxed_t)\n{\n    atomic_word lo = oldval->lo;\n    atomic_word hi = oldval->hi;\n    atomic_word success;\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldxp\\t%2, %3, [%8]\\n\\t\"\n        \"cmp\\t%3, %5\\n\\t\"\n        \"b.ne\\t1f\\n\\t\"\n        \"cmp\\t%2, %4\\n\\t\"\n        \"b.ne\\t1f\\n\\t\"\n        \"stlxp\\t%w0, %6, %7, [%8]\\n\\t\"\n        \"cbnz\\t%w0, 0b\\n\\t\"\n        \"1:\\n\\t\"\n        \"clrex\\n\\t\"\n\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (oldval->lo), \"=&r\" (oldval->hi)\n        : \"r\" (lo), \"r\" (hi), \"r\" (newval.lo), \"r\" (newval.hi), \"r\" (p), \"0\" (1)\n        : \"cc\", \"memory\"\n    );\n\n    return success == 0;\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word2* p, atomic_word2* oldval, atomic_word2 newval, int /*memory_order_acq_rel_t*/, memory_order_relaxed_t)\n{\n    atomic_word lo = oldval->lo;\n    atomic_word hi = oldval->hi;\n    atomic_word success;\n    __asm__ __volatile__\n    (\n        \"0:\\n\\t\"\n        \"ldaxp\\t%2, %3, [%8]\\n\\t\"\n        \"cmp\\t%3, %5\\n\\t\"\n        \"b.ne\\t1f\\n\\t\"\n        \"cmp\\t%2, %4\\n\\t\"\n        \"b.ne\\t1f\\n\\t\"\n        \"stlxp\\t%w0, %6, %7, [%8]\\n\\t\"\n        \"cbnz\\t%w0, 0b\\n\\t\"\n        \"1:\\n\\t\"\n        \"clrex\\n\\t\"\n\n        : \"=&r\" (success), \"+m\" (*p), \"=&r\" (oldval->lo), \"=&r\" (oldval->hi)\n        : \"r\" (lo), \"r\" (hi), \"r\" (newval.lo), \"r\" (newval.hi), \"r\" (p), \"0\" (1)\n        : \"cc\", \"memory\"\n    );\n\n    return success == 0;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Unity/ExtendedAtomicOps-x86-64.h",
    "content": "#if defined(_MSC_VER)\n#   include \"os/Win32/WindowsHeaders.h\"\n#   include <intrin.h>\n#endif\n\n#if defined(__SSE2__)\n#   include <emmintrin.h>\n#endif\n\nstatic inline void atomic_pause()\n{\n#if defined(_MSC_VER)\n    _mm_pause();\n#else\n    __asm__ __volatile__ (\"pause\");\n#endif\n}\n\nstatic inline void atomic_thread_fence(memory_order_relaxed_t)\n{\n}\n\nstatic inline void atomic_thread_fence(memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    _ReadWriteBarrier();\n#else\n    __asm__ __volatile__ (\"\" : : : \"memory\");\n#endif\n}\n\nstatic inline void atomic_thread_fence(memory_order_acquire_t)\n{\n#if defined(_MSC_VER)\n    _ReadWriteBarrier();\n#else\n    __asm__ __volatile__ (\"\" : : : \"memory\");\n#endif\n}\n\nstatic inline void atomic_thread_fence(memory_order_acq_rel_t)\n{\n#if defined(_MSC_VER)\n    _ReadWriteBarrier();\n#else\n    __asm__ __volatile__ (\"\" : : : \"memory\");\n#endif\n}\n\nstatic inline void atomic_thread_fence(int /* memory_order_seq_cst_t */)\n{\n#if defined(__SSE2__)\n    _mm_mfence();\n#elif defined(_MSC_VER)\n    volatile LONGLONG tmp;\n    _InterlockedOr64(&tmp, 0);\n#else\n    __asm__ __volatile__ (\"lock orl #0, 0(%%esp)\" ::: \"cc\", \"memory\");\n#endif\n}\n\n/*\n * int support\n */\n\nstatic inline atomic_word atomic_load_explicit(const volatile int* p, memory_order_relaxed_t)\n{\n    return *p;\n}\n\nstatic inline int atomic_load_explicit(const volatile int* p, int)\n{\n    int v;\n#if defined(_MSC_VER)\n    v = *p;\n    _ReadWriteBarrier();\n#else\n    __asm__ __volatile__ (\"movl %1, %0\" : \"=r\" (v) : \"m\" (*p) : \"memory\");\n#endif\n    return v;\n}\n\nstatic inline void atomic_store_explicit(volatile int* p, int v, memory_order_relaxed_t)\n{\n    *p = v;\n}\n\nstatic inline void atomic_store_explicit(volatile int* p, int v, memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    _ReadWriteBarrier();\n    *p = v;\n#else\n    __asm__ __volatile__ (\"movl %1, %0\" : \"=m\" (*p) : \"r\" (v) : \"memory\");\n#endif\n}\n\nstatic inline void atomic_store_explicit(volatile int* p, int val, int /* memory_order_seq_cst_t */)\n{\n#if defined(_MSC_VER)\n    _InterlockedExchange((volatile LONG*)p, (LONG)val);\n#else\n    // lock prefix is implicit\n    __asm__ __volatile__\n    (\n/*lock*/ \"xchgl  %1, %0\"\n\n        : \"+m\" (*p), \"+r\" (val)\n        :\n        : \"memory\"\n    );\n#endif\n}\n\n/*\n * native word support\n */\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, memory_order_relaxed_t)\n{\n    return *p;\n}\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, int)\n{\n    atomic_word v;\n#if defined(_MSC_VER)\n    v = *p;\n    _ReadWriteBarrier();\n#else\n    __asm__ __volatile__ (\"movq %1, %0\" : \"=r\" (v) : \"m\" (*p) : \"memory\");\n#endif\n    return v;\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, memory_order_relaxed_t)\n{\n    *p = v;\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    _ReadWriteBarrier();\n    *p = v;\n#else\n    __asm__ __volatile__ (\"movq %1, %0\" : \"=m\" (*p) : \"r\" (v) : \"memory\");\n#endif\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word val, int /* memory_order_seq_cst_t */)\n{\n#if defined(_MSC_VER)\n    _InterlockedExchange64((volatile LONGLONG*)p, (LONGLONG)val);\n#else\n    // lock prefix is implicit\n    __asm__ __volatile__\n    (\n/*lock*/ \"xchgq  %1, %0\"\n        : \"+m\" (*p), \"+r\" (val)\n        :\n        : \"memory\"\n    );\n#endif\n}\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word val, int)\n{\n#if defined(_MSC_VER)\n    return (atomic_word)_InterlockedExchange64((volatile LONGLONG*)p, (LONGLONG)val);\n#else\n    // lock prefix is implicit\n    __asm__ __volatile__\n    (\n/*lock*/ \"xchgq  %1, %0\"\n        : \"+m\" (*p), \"+r\" (val)\n        :\n        : \"memory\"\n    );\n    return val;\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word* oldval, atomic_word newval, int, int)\n{\n#if defined(_MSC_VER)\n    atomic_word tmp = (atomic_word)_InterlockedCompareExchange64((volatile LONGLONG*)p, (LONGLONG)newval, (LONGLONG)*oldval);\n    return *oldval == tmp ? true : (*oldval = tmp, false);\n#else\n    char res;\n    __asm__ __volatile__\n    (\n        \"lock cmpxchgq %3, %0\\n\\t\"\n        \"setz %b1\"\n        : \"+m\" (*p), \"=q\" (res), \"+a\" (*oldval)\n        : \"r\" (newval)\n        : \"cc\", \"memory\"\n    );\n    return res != 0;\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word* oldval, atomic_word newval, int, int)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_seq_cst, memory_order_seq_cst);\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile int *p, int val, int)\n{\n#if defined(_MSC_VER)\n    return _InterlockedExchangeAdd((LONG volatile*)p, (LONG)val);\n#else\n    __asm__ __volatile__\n    (\n        \"lock xaddl\\t%1, %0\"\n        : \"+m\" (*p), \"+r\" (val)\n        :\n        : \"cc\", \"memory\"\n    );\n    return val;\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word *p, atomic_word val, int)\n{\n#if defined(_MSC_VER)\n    return _InterlockedExchangeAdd64((LONGLONG volatile*)p, (LONGLONG)val);\n#else\n    __asm__ __volatile__\n    (\n        \"lock xaddq  %1, %0\"\n        : \"+m\" (*p), \"+r\" (val)\n        :\n        : \"cc\", \"memory\"\n    );\n    return val;\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile int *p, int val, int mo)\n{\n    return atomic_fetch_add_explicit(p, -val, mo);\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word *p, atomic_word val, int mo)\n{\n    return atomic_fetch_add_explicit(p, -val, mo);\n}\n\n/*\n *  extensions\n */\n\nstatic inline void atomic_retain(volatile int *p)\n{\n#if defined(_MSC_VER)\n    _InterlockedIncrement((LONG volatile*)p);\n#else\n    __asm__ (\n        \"lock incl  %0\\n\\t\"\n        : \"+m\" (*p)\n        :\n        : \"cc\", \"memory\"\n        );\n#endif\n}\n\nstatic inline bool atomic_release(volatile int *p)\n{\n#if defined(_MSC_VER)\n    return _InterlockedDecrement((LONG volatile*)p) == 0;\n#else\n    bool res;\n    __asm__ (\n        \"lock decl  %0\\n\\t\"\n        \"setz %b1\"\n        : \"+m\" (*p), \"=q\" (res)\n        :\n        : \"cc\", \"memory\"\n        );\n    return res;\n#endif\n}\n\n/*\n *  double word\n */\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word2* p, atomic_word2* oldval, atomic_word2 newval, int, int)\n{\n#if defined(_MSC_VER)\n    return _InterlockedCompareExchange128((volatile LONGLONG*)p, (LONGLONG)newval.hi, (LONGLONG)newval.lo, (LONGLONG*)oldval) != 0;\n#else\n    char res;\n    __asm__ __volatile__\n    (\n        \"lock cmpxchg16b %0\\n\\t\"\n        \"setz   %b1\\n\\t\"\n\n        : \"+m\" (*p), \"=q\" (res), \"+a\" (oldval->lo), \"+d\" (oldval->hi)\n        : \"b\" (newval.lo), \"c\" (newval.hi)\n        : \"cc\", \"memory\"\n    );\n    return res != 0;\n#endif\n}\n\nstatic inline atomic_word2 atomic_load_explicit(const volatile atomic_word2* p, int o)\n{\n/*\n    atomic_word2 r = { 0, 0 };\n    atomic_word2 c = { 0, 0 };\n    atomic_compare_exchange_strong_explicit((volatile atomic_word2*) p, &r, c, o, o);\n    return r;\n*/\n    atomic_word2 r;\n    r.v = _mm_load_si128((const __m128i*)p);\n    return r;\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word2* p, atomic_word2 v, int o)\n{\n/*\n    atomic_word2 c = v;\n    while(!atomic_compare_exchange_strong_explicit(p, &c, v, o, o)) {};\n*/\n    _mm_store_si128((__m128i*)&p->v, v.v);\n}\n\nstatic inline atomic_word2 atomic_exchange_explicit(volatile atomic_word2* p, atomic_word2 newval, int)\n{\n    atomic_word2 oldval;\n    oldval.lo = 0;\n    oldval.hi = newval.hi - 1;\n    while (!atomic_compare_exchange_strong_explicit(p, &oldval, newval, memory_order_seq_cst, memory_order_seq_cst))\n        ;\n    return oldval;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Unity/ExtendedAtomicOps-x86.h",
    "content": "#if defined(_MSC_VER)\n#   include \"os/Win32/WindowsHeaders.h\"\n#   include <intrin.h>\n#endif\n\n#if defined(__SSE2__)\n#   include <emmintrin.h>\n#endif\n\nstatic inline void atomic_pause()\n{\n#if defined(_MSC_VER)\n    _mm_pause();\n#else\n    __asm__ __volatile__ (\"rep; nop\");\n#endif\n}\n\nstatic inline void atomic_thread_fence(memory_order_relaxed_t)\n{\n}\n\nstatic inline void atomic_thread_fence(memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    _ReadWriteBarrier();\n#else\n    __asm__ __volatile__ (\"\" : : : \"memory\");\n#endif\n}\n\nstatic inline void atomic_thread_fence(memory_order_acquire_t)\n{\n#if defined(_MSC_VER)\n    _ReadWriteBarrier();\n#else\n    __asm__ __volatile__ (\"\" : : : \"memory\");\n#endif\n}\n\nstatic inline void atomic_thread_fence(memory_order_acq_rel_t)\n{\n#if defined(_MSC_VER)\n    _ReadWriteBarrier();\n#else\n    __asm__ __volatile__ (\"\" : : : \"memory\");\n#endif\n}\n\nstatic inline void atomic_thread_fence(int /* memory_order_seq_cst_t */)\n{\n#if defined(__SSE2__)\n    _mm_mfence();\n#elif defined(_MSC_VER)\n    volatile LONG tmp;\n    _InterlockedOr(&tmp, 0);\n#else\n    __asm__ __volatile__ (\"lock orl #0, 0(%%esp)\" ::: \"cc\", \"memory\");\n#endif\n}\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, memory_order_relaxed_t)\n{\n    return *p;\n}\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, int)\n{\n    atomic_word v;\n#if defined(_MSC_VER)\n    v = *p;\n    _ReadWriteBarrier();\n#else\n    __asm__ __volatile__ (\"movl %1, %0\" : \"=r\" (v) : \"m\" (*p) : \"memory\");\n#endif\n    return v;\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, memory_order_relaxed_t)\n{\n    *p = v;\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, memory_order_release_t)\n{\n#if defined(_MSC_VER)\n    _ReadWriteBarrier();\n    *p = v;\n#else\n    __asm__ __volatile__ (\"movl %1, %0\" : \"=m\" (*p) : \"r\" (v) : \"memory\");\n#endif\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word val, int /* memory_order_seq_cst_t */)\n{\n#if defined(_MSC_VER)\n    _InterlockedExchange((volatile LONG*)p, (LONG)val);\n#else\n    // lock prefix is implicit\n    __asm__ __volatile__\n    (\n/*lock*/ \"xchgl  %1, %0\"\n\n        : \"+m\" (*p), \"+r\" (val)\n        :\n        : \"memory\"\n    );\n#endif\n}\n\nstatic inline atomic_word atomic_exchange_explicit(volatile atomic_word* p, atomic_word val, int)\n{\n#if defined(_MSC_VER)\n    return (atomic_word)_InterlockedExchange((volatile LONG*)p, (LONG)val);\n#else\n    // lock prefix is implicit\n    __asm__ __volatile__\n    (\n/*lock*/ \"xchgl  %1, %0\"\n\n        : \"+m\" (*p), \"+r\" (val)\n        :\n        : \"memory\"\n    );\n    return val;\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word* p, atomic_word* oldval, atomic_word newval, int, int)\n{\n#if defined(_MSC_VER)\n    atomic_word tmp = (atomic_word)_InterlockedCompareExchange((volatile LONG*)p, (LONG)newval, (LONG)*oldval);\n    return *oldval == tmp ? true : (*oldval = tmp, false);\n#else\n    char res;\n    __asm__ __volatile__\n    (\n        \"lock cmpxchgl %3, %0\\n\\t\"\n        \"setz %b1\"\n\n        : \"+m\" (*p), \"=q\" (res), \"+a\" (*oldval)\n        : \"r\" (newval)\n        : \"cc\", \"memory\"\n    );\n    return res != 0;\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_weak_explicit(volatile atomic_word* p, atomic_word* oldval, atomic_word newval, int, int)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_seq_cst, memory_order_seq_cst);\n}\n\nstatic inline atomic_word atomic_fetch_add_explicit(volatile atomic_word *p, atomic_word val, int)\n{\n#if defined(_MSC_VER)\n    return _InterlockedExchangeAdd((LONG volatile*)p, (LONG)val);\n#else\n    __asm__ __volatile__\n    (\n        \"lock xaddl  %1, %0\"\n        : \"+m\" (*p), \"+r\" (val)\n        :\n        : \"cc\", \"memory\"\n    );\n    return val;\n#endif\n}\n\nstatic inline atomic_word atomic_fetch_sub_explicit(volatile atomic_word *p, atomic_word val, int mo)\n{\n    return atomic_fetch_add_explicit(p, -val, mo);\n}\n\n/*\n *  extensions\n */\n\nstatic inline void atomic_retain(volatile int *p)\n{\n#if defined(_MSC_VER)\n    _InterlockedIncrement((LONG volatile*)p);\n#else\n    __asm__ (\n        \"lock incl  %0\\n\\t\"\n        : \"+m\" (*p)\n        :\n        : \"cc\", \"memory\"\n        );\n#endif\n}\n\nstatic inline bool atomic_release(volatile int *p)\n{\n#if defined(_MSC_VER)\n    return _InterlockedDecrement((LONG volatile*)p) == 0;\n#else\n    bool res;\n    __asm__ (\n        \"lock decl  %0\\n\\t\"\n        \"setz %b1\"\n        : \"+m\" (*p), \"=q\" (res)\n        :\n        : \"cc\", \"memory\"\n        );\n    return res;\n#endif\n}\n\n// double word\n\nstatic inline atomic_word2 atomic_load_explicit(const volatile atomic_word2* p, int)\n{\n    atomic_word2 r;\n#if defined(__SSE2__)\n    _mm_store_sd((double*)&r, _mm_load_sd((const double*)p));\n#else\n    // using the FPU is the only way to do a 64 bit atomic load if SSE is not available\n    r.d = p->d;\n#endif\n    return r;\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word2* p, atomic_word2 v, int)\n{\n#if defined(__SSE2__)\n    _mm_store_sd((double*)p, _mm_load_sd((const double*)&v));\n#else\n    // using the FPU is the only way to do a 64 bit atomic store if SSE is not available\n    p->d = v.d;\n#endif\n}\n\nstatic inline bool atomic_compare_exchange_strong_explicit(volatile atomic_word2* p, atomic_word2* oldval, atomic_word2 newval, int, int)\n{\n#if defined(_MSC_VER)\n    LONGLONG tmp = _InterlockedCompareExchange64((volatile LONGLONG*)p, newval.v, oldval->v);\n    return oldval->v == tmp ? true : (oldval->v = tmp, false);\n#else\n    char res;\n    __asm__ __volatile__\n    (\n        \"lock cmpxchg8b %0\\n\\t\"\n        \"setz   %b1\\n\\t\"\n\n        : \"+m\" (*p), \"=q\" (res), \"+a\" (oldval->lo), \"+d\" (oldval->hi)\n        : \"b\" (newval.lo), \"c\" (newval.hi)\n        : \"cc\", \"memory\"\n    );\n    return res != 0;\n#endif\n}\n\nstatic inline atomic_word2 atomic_exchange_explicit(volatile atomic_word2* p, atomic_word2 newval, int)\n{\n    atomic_word2 oldval;\n    oldval.lo = 0;\n    oldval.hi = newval.hi - 1;\n    while (!atomic_compare_exchange_strong_explicit(p, &oldval, newval, memory_order_seq_cst, memory_order_seq_cst))\n        ;\n    return oldval;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Unity/ExtendedAtomicOps.h",
    "content": "#pragma once\n\n#include \"ExtendedAtomicTypes.h\"\n\nUNITY_PLATFORM_BEGIN_NAMESPACE;\n\nenum memory_order_relaxed_t { memory_order_relaxed = 0 };\nenum memory_order_acquire_t { memory_order_acquire = 2, memory_order_consume = memory_order_acquire };\nenum memory_order_release_t { memory_order_release = 3 };\nenum memory_order_acq_rel_t { memory_order_acq_rel = 4 };\nenum memory_order_seq_cst_t { memory_order_seq_cst = 5 };\n\n/*\n    Available atomic functions:\n\n    // non-explicit versions, use sequential consistency semantic by default\n\n    // atomic load\n    atomic_word atomic_load (const volatile atomic_word* p);\n\n    // atomic store\n    void atomic_store (volatile atomic_word* p, atomic_word val);\n\n    // atomic exchange, returns previous value\n    atomic_word atomic_exchange (volatile atomic_word* p, atomic_word val);\n\n    // atomic compare exchange (strong), returns if the operation succeeded and update *oldval with the previous value\n    bool atomic_compare_exchange (volatile atomic_word* p, atomic_word* oldval, atomic_word newval);\n\n    // atomic fetch then add, returns previous value\n    atomic_word atomic_fetch_add (volatile atomic_word *p, atomic_word val);\n\n    // atomic fetch then sub, returns previous value\n    atomic_word atomic_fetch_sub (volatile atomic_word *p, atomic_word val);\n\n    // explicit versions\n\n    // memory fence with <mo> semantic\n    void atomic_thread_fence (memory_order_t mo);\n\n    // atomic load with <mo> semantic\n    atomic_word atomic_load_explicit (const volatile atomic_word* p, memory_order_t mo);\n\n    // atomic store with <mo> semantic\n    void atomic_store_explicit (volatile atomic_word* p, atomic_word v, memory_order_t mo);\n\n    // atomic exchange with <mo> semantic, returns previous value\n    atomic_word atomic_exchange_explicit (volatile atomic_word* p, atomic_word v, memory_order_t mo);\n\n    // on RISC platforms with LoadLinked-StoreConditional available:\n    // atomic_compare_exchange_weak_explicit: can fail spuriously even if *p == *oldval\n    // uses <success> memory barrier when it succeeds, <failure> otherwize\n    // returns the state of the operation and updates *oldval with the previous value\n    bool atomic_compare_exchange_weak_explicit (volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_t success, memory_order_t failure);\n\n    // atomic_compare_exchange_strong_explicit: can loop and only returns false if *p != *oldval\n    // uses <success> memory barrier when it succeeds, <failure> otherwise\n    // returns the state of the operation and updates *oldval with the previous value\n    bool atomic_compare_exchange_strong_explicit (volatile atomic_word* p, atomic_word *oldval, atomic_word newval, memory_order_t success, memory_order_t failure);\n\n    // atomic fetch then add with <mo> semantic, returns previous value\n    int atomic_fetch_add_explicit (volatile int* p, int val, memory_order_t mo);\n    atomic_word atomic_fetch_add_explicit (volatile atomic_word* p, atomic_word val, memory_order_t mo);\n\n    // atomic fetch then sub with <mo> semantic, returns previous value\n    int atomic_fetch_sub_explicit (volatile int* p, int val, memory_order_t mo);\n    atomic_word atomic_fetch_sub_explicit (volatile atomic_word* p, atomic_word val, memory_order_t mo);\n\n    // extensions to the C++0x11 standard:\n\n    // spinning hint for the processor\n    void atomic_pause ();\n\n    // atomic increment with relaxed semantic\n    void atomic_retain (volatile int *p);\n\n    // atomic decrement with acquire/release semantic, returns true if resulting value is zero, false otherwize\n    bool atomic_release (volatile int *p);\n\n    // on platforms with double word compare exchange (ABA safe atomic pointers):\n\n    // atomic load\n    atomic_word2 atomic_load_explicit (const volatile atomic_word2* p, memory_order_t mo);\n\n    // atomic store\n    void atomic_store_explicit (volatile atomic_word2* p, atomic_word2 v, memory_order_t mo);\n\n    // atomic exchange\n    atomic_word atomic_exchange_explicit (volatile atomic_word2* p, atomic_word2 newval, memory_order_t mo);\n\n    // atomic compare exchange\n    bool atomic_compare_exchange_strong_explicit (volatile atomic_word2* p, atomic_word2* oldval, atomic_word2 newval, memory_order_t success, memory_order_t failure);\n*/\n\n#if IL2CPP_TARGET_HAS_EXTENDED_ATOMICS\n\n#   include \"os/ExtendedAtomicOps.h\"\n\n#elif defined(__x86_64__) || defined(_M_X64)\n\n#   include \"ExtendedAtomicOps-x86-64.h\"\n#   define UNITY_ATOMIC_INT_OVERLOAD\n\n#elif defined(__x86__) || defined(__i386__) || defined(_M_IX86)\n\n#   include \"ExtendedAtomicOps-x86.h\"\n\n#elif defined(__arm64__) && (defined(__clang__) || defined(__GNUC__))\n\n#   include \"ExtendedAtomicOps-arm64.h\"\n#   define UNITY_ATOMIC_INT_OVERLOAD\n\n#elif defined(_M_ARM) || (defined(__arm__) && (defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)) && (!UNITY_STV_API) && (defined(__clang__) || defined(__GNUC__)))\n\n#   include \"ExtendedAtomicOps-arm.h\"\n\n#elif PLATFORM_WIIU\n\n#   include \"ExtendedAtomicOps-ppc.h\"\n\n#elif PLATFORM_PSVITA\n\n#   include \"PlatformExtendedAtomicOps.h\"\n\n#elif (defined(__ppc64__) || defined(_ARCH_PPC64)) && (defined(__clang__) || defined(__GNUC__))\n\n#   include \"ExtendedAtomicOps-ppc64.h\"\n#   define UNITY_ATOMIC_INT_OVERLOAD\n\n//#elif defined (__ppc__) && (defined (__clang__) || defined (__GNUC__))\n\n//# include \"Runtime/Threads/ExtendedAtomicOps-ppc.h\"\n#else\n\n    #define UNITY_NO_ATOMIC_OPS\n\nstatic inline atomic_word atomic_load_explicit(const volatile atomic_word* p, memory_order_relaxed_t)\n{\n    return *p;\n}\n\nstatic inline void atomic_store_explicit(volatile atomic_word* p, atomic_word v, memory_order_relaxed_t)\n{\n    *p = v;\n}\n\n#endif\n\n#ifndef UNITY_NO_ATOMIC_OPS\n\n// non-explicit versions, use sequential consistency semantic\n\nstatic inline void atomic_thread_fence()\n{\n    atomic_thread_fence(memory_order_seq_cst);\n}\n\nstatic inline atomic_word atomic_load(const volatile atomic_word* p)\n{\n    return atomic_load_explicit(p, memory_order_seq_cst);\n}\n\nstatic inline void atomic_store(volatile atomic_word* p, atomic_word val)\n{\n    atomic_store_explicit(p, val, memory_order_seq_cst);\n}\n\nstatic inline atomic_word atomic_exchange(volatile atomic_word* p, atomic_word val)\n{\n    return atomic_exchange_explicit(p, val, memory_order_seq_cst);\n}\n\nstatic inline bool atomic_compare_exchange(volatile atomic_word* p, atomic_word* oldval, atomic_word newval)\n{\n    return atomic_compare_exchange_strong_explicit(p, oldval, newval, memory_order_seq_cst, memory_order_seq_cst);\n}\n\nstatic inline atomic_word atomic_fetch_add(volatile atomic_word *p, atomic_word val)\n{\n    return atomic_fetch_add_explicit(p, val, memory_order_seq_cst);\n}\n\nstatic inline atomic_word atomic_fetch_sub(volatile atomic_word *p, atomic_word val)\n{\n    return atomic_fetch_sub_explicit(p, val, memory_order_seq_cst);\n}\n\n#if defined(UNITY_ATOMIC_INT_OVERLOAD)\n\nstatic inline int atomic_load(const volatile int* p)\n{\n    return atomic_load_explicit(p, memory_order_seq_cst);\n}\n\nstatic inline void atomic_store(volatile int* p, int val)\n{\n    atomic_store_explicit(p, val, memory_order_seq_cst);\n}\n\nstatic inline int atomic_fetch_add(volatile int *p, int val)\n{\n    return static_cast<int>(atomic_fetch_add_explicit(p, val, memory_order_seq_cst));\n}\n\nstatic inline int atomic_fetch_sub(volatile int *p, int val)\n{\n    return static_cast<int>(atomic_fetch_sub_explicit(p, val, memory_order_seq_cst));\n}\n\n#endif\n\n#endif\n\nUNITY_PLATFORM_END_NAMESPACE;\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Unity/ExtendedAtomicTypes.h",
    "content": "#pragma once\n\nUNITY_PLATFORM_BEGIN_NAMESPACE;\n\n#if IL2CPP_TARGET_HAS_EXTENDED_ATOMICS\n\n#   include \"os/ExtendedAtomicTypes.h\"\n\n#elif defined(__x86_64__) || defined(_M_X64)\n\n#   include <emmintrin.h>\n\n/// atomic_word must be 16 bytes aligned if you want to use it with atomic_* ops.\n#   if defined(_MSC_VER)\ntypedef __int64 atomic_word;\n#   else\ntypedef long long atomic_word;\n#   endif\n\n/// atomic_word2 must be 16 bytes aligned if you want to use it with atomic_* ops.\nunion atomic_word2\n{\n    __m128i         v;\n    struct\n    {\n        atomic_word lo, hi;\n    };\n};\n    #define ATOMIC_HAS_DCAS\n\n#elif defined(__x86__) || defined(__i386__) || defined(_M_IX86)\n\n/// atomic_word must be 8 bytes aligned if you want to use it with atomic_* ops.\ntypedef int atomic_word;\n\n/// atomic_word2 must be 8 bytes aligned if you want to use it with atomic_* ops.\nunion atomic_word2\n{\n#   if defined(_MSC_VER)\n    __int64 v;\n#   else\n    long long v;\n#   endif\n#   if !defined(__SSE2__)\n    double d;\n#   endif\n    struct\n    {\n        atomic_word lo, hi;\n    };\n};\n    #define ATOMIC_HAS_DCAS\n\n#elif defined(__arm64__) && (defined(__clang__) || defined(__GNUC__))\n\ntypedef long long atomic_word;\nstruct atomic_word2\n{\n    atomic_word lo;\n    atomic_word hi;\n};\n#   define ATOMIC_HAS_DCAS\n#   define ATOMIC_HAS_LDR\n\n#elif defined(_M_ARM) || (defined(__arm__) && (defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)) && (!UNITY_STV_API) && (defined(__clang__) || defined(__GNUC__)))\n\ntypedef int atomic_word;\nunion atomic_word2\n{\n#   if defined(_MSC_VER)\n    __int64 v;\n#   else\n    long long v;\n#   endif\n    struct\n    {\n        atomic_word lo;\n        atomic_word hi;\n    };\n};\n#   define ATOMIC_HAS_DCAS\n#   if !defined(_MSC_VER)\n#       define ATOMIC_HAS_LDR\n#   endif\n\n#elif PLATFORM_PSVITA\n\ntypedef int32_t atomic_word;\nunion atomic_word2\n{\n    int64_t  v;\n    struct\n    {\n        atomic_word lo;\n        atomic_word hi;\n    };\n};\n#   define ATOMIC_HAS_DCAS\n#   define ATOMIC_HAS_LDR\n\n#elif defined(__ppc64__) || defined(_ARCH_PPC64)\n\ntypedef long atomic_word;\n#   define ATOMIC_HAS_LDR\n\n#elif defined(__ppc__)\n\ntypedef int atomic_word;\n#   define ATOMIC_HAS_LDR\n\n#else\n\n#   if defined(__LP64__)\ntypedef long long atomic_word;\n#   else\ntypedef int atomic_word;\n#   endif\n\nstruct atomic_word2\n{\n    atomic_word lo;\n    atomic_word hi;\n};\n\n#endif\n\nUNITY_PLATFORM_END_NAMESPACE;\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Unity/UnityPlatformConfigure.h",
    "content": "#pragma once\n\n// Stopgap measure to allow using some code from the Unity's own platform layer without having to adapt it exclusively\n// for il2cpp.\n\n#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS || IL2CPP_TARGET_XBOXONE\n#include <malloc.h>\n#else\n#include <stdlib.h>\n#endif\n#include <new>\n\n#define UNITY_PLATFORM_BEGIN_NAMESPACE namespace il2cpp { namespace os {\n#define UNITY_PLATFORM_END_NAMESPACE }}\n\n#define UNITY_PLATFORM_NEW(type, label) new type\n#define UNITY_PLATFORM_NEW_ALIGNED(type, label, alignment) new (alignment) type\n#define UNITY_PLATFORM_DELETE(ptr, label) delete ptr\n\ninline void* operator new(size_t size, int alignment)\n{\n    void* result = NULL;\n    #if IL2CPP_TARGET_WINDOWS || IL2CPP_TARGET_XBOXONE\n    result = _aligned_malloc(size, alignment);\n    #elif IL2CPP_TARGET_ANDROID || IL2CPP_TARGET_PSP2\n    result = memalign(alignment, size);\n    #else\n    if (posix_memalign(&result, size, alignment))\n        result = NULL;\n    #endif\n    if (!result)\n        throw std::bad_alloc();\n    return result;\n}\n\n#if IL2CPP_TARGET_WINDOWS || IL2CPP_TARGET_XBOXONE // Visual C++ warns if new is overridden but delete is not.\ninline void operator delete(void* ptr, int alignment) throw ()\n{\n    free(ptr);\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WaitStatus.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace os\n{\n    enum WaitStatus\n    {\n        kWaitStatusSuccess = 0,\n        kWaitStatusFailure,\n        kWaitStatusTimeout,\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/AtomicImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"os/Win32/WindowsHeaders.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    inline int32_t Atomic::Add(volatile int32_t* location1, int32_t value)\n    {\n        return (InterlockedExchangeAdd((long volatile*)location1, value) + value);\n    }\n\n    inline int64_t Atomic::Add64(volatile int64_t* location1, int64_t value)\n    {\n        return (InterlockedExchangeAdd64((long long volatile*)location1, value) + value);\n    }\n\n    inline int32_t Atomic::Increment(volatile int32_t* value)\n    {\n        return InterlockedIncrement((long volatile*)value);\n    }\n\n    inline int64_t Atomic::Increment64(volatile int64_t* value)\n    {\n        return InterlockedIncrement64(value);\n    }\n\n    inline int32_t Atomic::Decrement(volatile int32_t* value)\n    {\n        return InterlockedDecrement((long volatile*)value);\n    }\n\n    inline int64_t Atomic::Decrement64(volatile int64_t* value)\n    {\n        return InterlockedDecrement64((long long volatile*)value);\n    }\n\n    inline int32_t Atomic::CompareExchange(volatile int32_t* dest, int32_t exchange, int32_t comparand)\n    {\n        return InterlockedCompareExchange((long volatile*)dest, exchange, comparand);\n    }\n\n    inline int64_t Atomic::CompareExchange64(volatile int64_t* dest, int64_t exchange, int64_t comparand)\n    {\n        return InterlockedCompareExchange64((long long volatile*)dest, exchange, comparand);\n    }\n\n    inline void* Atomic::CompareExchangePointer(void* volatile* dest, void* exchange, void* comparand)\n    {\n        return InterlockedCompareExchangePointer(dest, exchange, comparand);\n    }\n\n    inline int64_t Atomic::Exchange64(volatile int64_t* dest, int64_t exchange)\n    {\n        return InterlockedExchange64(dest, exchange);\n    }\n\n    inline int32_t Atomic::Exchange(volatile int32_t* dest, int32_t exchange)\n    {\n        return InterlockedExchange((long volatile*)dest, exchange);\n    }\n\n    inline void* Atomic::ExchangePointer(void* volatile* dest, void* exchange)\n    {\n        return InterlockedExchangePointer(dest, exchange);\n    }\n\n    int64_t Atomic::Read64(volatile int64_t* addr)\n    {\n        return InterlockedCompareExchange64((long long volatile*)addr, 0, 0);\n    }\n\n// MemoryBarrier is defined as a macro on x64 and as a function on x86.\n#undef MemoryBarrier\n    inline void Atomic::MemoryBarrier()\n    {\n#if defined(_AMD64_)\n        ::__faststorefence();\n#elif defined(_M_IX86)\n        ::MemoryBarrier();\n#elif defined(_M_ARM)\n        __dmb(_ARM_BARRIER_SY);\n#else\n#error Not implemented;\n#endif\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/COM.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"os/COM.h\"\n#include \"WindowsHeaders.h\"\n\n#if !IL2CPP_USE_GENERIC_COM\n\nnamespace il2cpp\n{\nnamespace os\n{\n    il2cpp_hresult_t COM::CreateInstance(const Il2CppGuid& clsid, Il2CppIUnknown** object)\n    {\n        return ::CoCreateInstance(reinterpret_cast<REFCLSID>(clsid), NULL, CLSCTX_ALL, __uuidof(IUnknown), reinterpret_cast<LPVOID*>(object));\n    }\n\n    il2cpp_hresult_t COM::CreateFreeThreadedMarshaler(Il2CppIUnknown* outer, Il2CppIUnknown** marshal)\n    {\n        return ::CoCreateFreeThreadedMarshaler(reinterpret_cast<LPUNKNOWN>(outer), reinterpret_cast<LPUNKNOWN*>(marshal));\n    }\n}\n}\n\n#endif\n\n#if !IL2CPP_USE_GENERIC_COM_SAFEARRAYS\n\nnamespace il2cpp\n{\nnamespace os\n{\n// variant\n\n    void COM::VariantInit(Il2CppVariant* variant)\n    {\n        ::VariantInit(reinterpret_cast<VARIANTARG*>(variant));\n    }\n\n    il2cpp_hresult_t COM::VariantClear(Il2CppVariant* variant)\n    {\n        return ::VariantClear(reinterpret_cast<VARIANTARG*>(variant));\n    }\n\n// safe array\n\n    Il2CppSafeArray* COM::SafeArrayCreate(uint16_t type, uint32_t dimention_count, Il2CppSafeArrayBound* bounds)\n    {\n        return reinterpret_cast<Il2CppSafeArray*>(::SafeArrayCreate(type, dimention_count, reinterpret_cast<SAFEARRAYBOUND*>(bounds)));\n    }\n\n    il2cpp_hresult_t COM::SafeArrayDestroy(Il2CppSafeArray* safeArray)\n    {\n        return ::SafeArrayDestroy(reinterpret_cast<SAFEARRAY*>(safeArray));\n    }\n\n    il2cpp_hresult_t COM::SafeArrayAccessData(Il2CppSafeArray* safeArray, void** data)\n    {\n        return ::SafeArrayAccessData(reinterpret_cast<SAFEARRAY*>(safeArray), data);\n    }\n\n    il2cpp_hresult_t COM::SafeArrayUnaccessData(Il2CppSafeArray* safeArray)\n    {\n        return ::SafeArrayUnaccessData(reinterpret_cast<SAFEARRAY*>(safeArray));\n    }\n\n    il2cpp_hresult_t COM::SafeArrayGetVartype(Il2CppSafeArray* safeArray, uint16_t* type)\n    {\n        return ::SafeArrayGetVartype(reinterpret_cast<SAFEARRAY*>(safeArray), type);\n    }\n\n    uint32_t COM::SafeArrayGetDim(Il2CppSafeArray* safeArray)\n    {\n        return ::SafeArrayGetDim(reinterpret_cast<SAFEARRAY*>(safeArray));\n    }\n\n    il2cpp_hresult_t COM::SafeArrayGetLBound(Il2CppSafeArray* safeArray, uint32_t dimention, int32_t* bound)\n    {\n        return ::SafeArrayGetLBound(reinterpret_cast<SAFEARRAY*>(safeArray), dimention, reinterpret_cast<LONG*>(bound));\n    }\n\n    il2cpp_hresult_t COM::SafeArrayGetUBound(Il2CppSafeArray* safeArray, uint32_t dimention, int32_t* bound)\n    {\n        return ::SafeArrayGetUBound(reinterpret_cast<SAFEARRAY*>(safeArray), dimention, reinterpret_cast<LONG*>(bound));\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/ConditionVariableImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n#if NET_4_0\n#if IL2CPP_THREADS_WIN32\n\n#include \"MutexImpl.h\"\n#include \"ConditionVariableImpl.h\"\n#include \"WindowsHelpers.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    ConditionVariableImpl::ConditionVariableImpl()\n    {\n        ::InitializeConditionVariable(&m_ConditionVariable);\n    }\n\n    ConditionVariableImpl::~ConditionVariableImpl()\n    {\n        /* Beauty of win32 API: do not destroy it */\n    }\n\n    int ConditionVariableImpl::Wait(FastMutexImpl* lock)\n    {\n        return ::SleepConditionVariableCS(&m_ConditionVariable, lock->GetOSHandle(), INFINITE) ? 0 : 1;\n    }\n\n    int ConditionVariableImpl::TimedWait(FastMutexImpl* lock, uint32_t timeout_ms)\n    {\n        return ::SleepConditionVariableCS(&m_ConditionVariable, lock->GetOSHandle(), timeout_ms) ? 0 : 1;\n    }\n\n    void ConditionVariableImpl::Broadcast()\n    {\n        ::WakeAllConditionVariable(&m_ConditionVariable);\n    }\n\n    void ConditionVariableImpl::Signal()\n    {\n        ::WakeConditionVariable(&m_ConditionVariable);\n    }\n}\n}\n\n#endif\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/ConditionVariableImpl.h",
    "content": "#pragma once\n#if NET_4_0\n#if IL2CPP_THREADS_WIN32\n\n#include \"utils/NonCopyable.h\"\n\n#include \"WindowsHeaders.h\"\n\nclass FastMutexImpl;\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class ConditionVariableImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n        ConditionVariableImpl();\n        ~ConditionVariableImpl();\n\n        int Wait(FastMutexImpl* lock);\n        int TimedWait(FastMutexImpl* lock, uint32_t timeout_ms);\n        void Broadcast();\n        void Signal();\n\n    private:\n        CONDITION_VARIABLE m_ConditionVariable;\n    };\n}\n}\n\n#endif\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Console.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"os/Console.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Console\n{\n    int32_t InternalKeyAvailable(int32_t ms_timeout)\n    {\n        NOT_IMPLEMENTED_ICALL(Console::InternalKeyAvailable);\n        return 0;\n    }\n\n    bool SetBreak(bool wantBreak)\n    {\n        NOT_IMPLEMENTED_ICALL(Console::SetBreak);\n        return false;\n    }\n\n    bool SetEcho(bool wantEcho)\n    {\n        NOT_IMPLEMENTED_ICALL(Console::SetEcho);\n        return false;\n    }\n\n    bool TtySetup(const std::string& keypadXmit, const std::string& teardown, uint8_t* control_characters, int32_t** size)\n    {\n        NOT_IMPLEMENTED_ICALL(Console::TtySetup);\n        return false;\n    }\n}\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/CpuInfo.cpp",
    "content": "#if NET_4_0\n#if IL2CPP_ENABLE_CPU_INFO\n#include \"il2cpp-config.h\"\n\n#if IL2CPP_PLATFORM_WIN32\n\n#include \"os/CpuInfo.h\"\n#include \"utils/Memory.h\"\n\n#define WIN32_LEAN_AND_MEAN 1\n#include <Windows.h>\n\nstruct Il2CppCpuUsageState\n{\n    uint64_t kernel_time;\n    uint64_t user_time;\n    uint64_t idle_time;\n};\n\nnamespace il2cpp\n{\nnamespace os\n{\n    void* CpuInfo::Create()\n    {\n        return IL2CPP_MALLOC_ZERO(sizeof(Il2CppCpuUsageState));\n    }\n\n    int32_t CpuInfo::Usage(void* previous)\n    {\n        Il2CppCpuUsageState* prev = (Il2CppCpuUsageState*)previous;\n        int32_t cpu_usage = 0;\n        int64_t cpu_total_time;\n        int64_t cpu_busy_time;\n\n        uint64_t idle_time;\n        uint64_t kernel_time;\n        uint64_t user_time;\n\n        ::GetSystemTimes((FILETIME*)&idle_time, (FILETIME*)&kernel_time, (FILETIME*)&user_time);\n\n        cpu_total_time = (int64_t)((user_time - (prev ? prev->user_time : 0)) + (kernel_time - (prev ? prev->kernel_time : 0)));\n        cpu_busy_time = (int64_t)(cpu_total_time - (idle_time - (prev ? prev->idle_time : 0)));\n\n        if (prev)\n        {\n            prev->idle_time = idle_time;\n            prev->kernel_time = kernel_time;\n            prev->user_time = user_time;\n        }\n\n        if (cpu_total_time > 0 && cpu_busy_time > 0)\n            cpu_usage = (int32_t)(cpu_busy_time * 100 / cpu_total_time);\n\n        return cpu_usage;\n    }\n}\n}\n\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Cryptography.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS_DESKTOP\n\n#include \"os/Win32/WindowsHeaders.h\"\n#include \"os/Cryptography.h\"\n\n#include <Wincrypt.h>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    void* Cryptography::GetCryptographyProvider()\n    {\n        HCRYPTPROV provider = 0;\n\n        if (!CryptAcquireContext(&provider, NULL, NULL, PROV_INTEL_SEC, CRYPT_VERIFYCONTEXT))\n        {\n            if (!CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))\n            {\n                provider = 0;\n            }\n        }\n\n        return (void*)provider;\n    }\n\n    bool Cryptography::OpenCryptographyProvider()\n    {\n        return false;\n    }\n\n    void Cryptography::ReleaseCryptographyProvider(void* provider)\n    {\n        CryptReleaseContext((HCRYPTPROV)provider, 0);\n    }\n\n    bool Cryptography::FillBufferWithRandomBytes(void* provider, uint32_t length, unsigned char* data)\n    {\n        return CryptGenRandom((HCRYPTPROV)provider, length, data) == TRUE;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Debug.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"os/Debug.h\"\n#include \"os/Win32/WindowsHeaders.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    bool Debug::IsDebuggerPresent()\n    {\n        return ::IsDebuggerPresent() != FALSE;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Directory.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"WindowsHeaders.h\"\n\n#undef FindFirstFile\n#undef FindNextFile\n\n#include \"os/Directory.h\"\n#include \"os/ErrorCodes.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/PathUtils.h\"\n\nstatic inline int Win32ErrorToErrorCode(DWORD win32ErrorCode)\n{\n    return win32ErrorCode;\n}\n\nusing namespace il2cpp::utils::PathUtils;\n\nnamespace il2cpp\n{\nnamespace os\n{\n    std::string Directory::GetCurrent(int *error)\n    {\n        UTF16String buf;\n        int len, res_len;\n\n        len = MAX_PATH + 1;\n        buf.resize(len, 0);\n\n        *error = ERROR_SUCCESS;\n\n        res_len = ::GetCurrentDirectory(len, (LPWSTR)buf.c_str());\n        if (res_len > len) /*buf is too small.*/\n        {\n            int old_res_len = res_len;\n            buf.resize(res_len, 0);\n            res_len = ::GetCurrentDirectory(res_len, (LPWSTR)buf.c_str()) == old_res_len;\n        }\n\n        std::string directory;\n\n        if (res_len)\n        {\n            len = 0;\n            while (buf[len])\n                ++len;\n\n            directory = il2cpp::utils::StringUtils::Utf16ToUtf8(buf.c_str());\n        }\n        else\n        {\n            *error = Win32ErrorToErrorCode(::GetLastError());\n        }\n\n        return directory;\n    }\n\n    bool Directory::SetCurrent(const std::string& path, int* error)\n    {\n        *error = kErrorCodeSuccess;\n\n        const UTF16String utf16Path(il2cpp::utils::StringUtils::Utf8ToUtf16(path.c_str()));\n        if (::SetCurrentDirectory((LPWSTR)utf16Path.c_str()))\n            return true;\n\n        *error = Win32ErrorToErrorCode(::GetLastError());\n        return false;\n    }\n\n    bool Directory::Create(const std::string& path, int *error)\n    {\n        *error = kErrorCodeSuccess;\n\n        const UTF16String utf16Path(il2cpp::utils::StringUtils::Utf8ToUtf16(path.c_str()));\n        if (::CreateDirectory((LPWSTR)utf16Path.c_str(), NULL))\n            return true;\n\n        *error = Win32ErrorToErrorCode(::GetLastError());\n        return false;\n    }\n\n    bool Directory::Remove(const std::string& path, int *error)\n    {\n        *error = kErrorCodeSuccess;\n\n        const UTF16String utf16Path(il2cpp::utils::StringUtils::Utf8ToUtf16(path.c_str()));\n        if (::RemoveDirectory((LPWSTR)utf16Path.c_str()))\n            return true;\n\n        *error = Win32ErrorToErrorCode(::GetLastError());\n        return false;\n    }\n\n    std::set<std::string> Directory::GetFileSystemEntries(const std::string& path, const std::string& pathWithPattern, int32_t attrs, int32_t mask, int* error)\n    {\n        *error = kErrorCodeSuccess;\n        std::set<std::string> files;\n        WIN32_FIND_DATA ffd;\n        const UTF16String utf16Path(il2cpp::utils::StringUtils::Utf8ToUtf16(pathWithPattern.c_str()));\n\n        HANDLE handle = ::FindFirstFileExW((LPCWSTR)utf16Path.c_str(), FindExInfoStandard, &ffd, FindExSearchNameMatch, NULL, 0);\n        if (INVALID_HANDLE_VALUE == handle)\n        {\n            // Following the Mono implementation, do not treat a directory with no files as an error.\n            int errorCode = Win32ErrorToErrorCode(::GetLastError());\n            if (errorCode != ERROR_FILE_NOT_FOUND)\n                *error = errorCode;\n            return files;\n        }\n\n        do\n        {\n            const std::string fileName(il2cpp::utils::StringUtils::Utf16ToUtf8(ffd.cFileName));\n\n            if ((fileName.length() == 1 && fileName.at(0) == '.') ||\n                (fileName.length() == 2 && fileName.at(0) == '.' && fileName.at(1) == '.'))\n                continue;\n\n            if ((ffd.dwFileAttributes & mask) == attrs)\n            {\n                files.insert(Combine(path, fileName));\n            }\n        }\n        while (::FindNextFileW(handle, &ffd) != 0);\n\n        ::FindClose(handle);\n\n        return files;\n    }\n\n    Directory::FindHandle::FindHandle(const utils::StringView<Il2CppNativeChar>& searchPathWithPattern) :\n        osHandle(INVALID_HANDLE_VALUE),\n        directoryPath(il2cpp::utils::PathUtils::DirectoryName(searchPathWithPattern)),\n        pattern(il2cpp::utils::PathUtils::Basename(searchPathWithPattern))\n    {\n    }\n\n    Directory::FindHandle::~FindHandle()\n    {\n        IL2CPP_ASSERT(osHandle == INVALID_HANDLE_VALUE);\n    }\n\n    int32_t Directory::FindHandle::CloseOSHandle()\n    {\n        int32_t result = os::kErrorCodeSuccess;\n\n        if (osHandle != INVALID_HANDLE_VALUE)\n        {\n            result = ::FindClose(osHandle);\n            osHandle = INVALID_HANDLE_VALUE;\n        }\n\n        return result;\n    }\n\n    os::ErrorCode Directory::FindFirstFile(FindHandle* findHandle, const utils::StringView<Il2CppNativeChar>& searchPathWithPattern, Il2CppNativeString* resultFileName, int32_t* resultAttributes)\n    {\n        WIN32_FIND_DATA findData;\n        HANDLE handle = FindFirstFileExW(searchPathWithPattern.Str(), FindExInfoStandard, &findData, FindExSearchNameMatch, NULL, 0);\n\n        if (handle != INVALID_HANDLE_VALUE)\n        {\n            findHandle->SetOSHandle(handle);\n            *resultFileName = findData.cFileName;\n            *resultAttributes = findData.dwFileAttributes;\n            return os::kErrorCodeSuccess;\n        }\n        else\n        {\n            return static_cast<os::ErrorCode>(GetLastError());\n        }\n    }\n\n    os::ErrorCode Directory::FindNextFile(FindHandle* findHandle, Il2CppNativeString* resultFileName, int32_t* resultAttributes)\n    {\n        WIN32_FIND_DATA findData;\n        if (FindNextFileW(findHandle->osHandle, &findData) == FALSE)\n            return static_cast<os::ErrorCode>(GetLastError());\n\n        *resultFileName = findData.cFileName;\n        *resultAttributes = findData.dwFileAttributes;\n        return os::kErrorCodeSuccess;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Encoding.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n#include \"WindowsHelpers.H\"\n\n#include \"os/Encoding.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Encoding\n{\n    std::string GetCharSet()\n    {\n        static char buf[14];\n        sprintf(buf, \"CP%u\", GetACP());\n        return std::string(buf);\n    }\n}\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Environment.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if !IL2CPP_USE_GENERIC_ENVIRONMENT && IL2CPP_TARGET_WINDOWS\n#include \"WindowsHelpers.h\"\n#if !IL2CPP_TARGET_XBOXONE\n#include <Shlobj.h>\n#endif\n// Windows.h defines GetEnvironmentVariable as GetEnvironmentVariableW for unicode and this will\n// change the string \"Environment::GetEnvironmentVariable\" below to \"Environment::GetEnvironmentVariableW\"\n// in the preprocessor. So we undef to avoid this issue and use GetEnvironmentVariableW directly.\n// Same for SetEnvironmentVariable\n#undef GetEnvironmentVariable\n#undef SetEnvironmentVariable\n#include \"os/Environment.h\"\n#include \"utils/StringUtils.h\"\n#include <string>\n#include <assert.h>\n\n#define BUFFER_SIZE 1024\n\nnamespace il2cpp\n{\nnamespace os\n{\n    std::string Environment::GetMachineName()\n    {\n        Il2CppChar computerName[MAX_COMPUTERNAME_LENGTH + 1];\n        DWORD size = sizeof(computerName) / sizeof(computerName[0]);\n        if (!GetComputerNameW(computerName, &size))\n            return NULL;\n\n        return utils::StringUtils::Utf16ToUtf8(computerName);\n    }\n\n    int32_t Environment::GetProcessorCount()\n    {\n        SYSTEM_INFO info;\n        GetSystemInfo(&info);\n        return info.dwNumberOfProcessors;\n    }\n\n// GetVersionEx is deprecated on desktop in Windows SDK, and we shim it for WinRT\n#pragma warning( push )\n#pragma warning( disable : 4996 )\n\n    std::string Environment::GetOsVersionString()\n    {\n        OSVERSIONINFO verinfo;\n\n        verinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\n        if (GetVersionEx(&verinfo))\n        {\n            char version[64];\n            /* maximum string length is 35 bytes\n               3 x 10 bytes per number, 1 byte for 0, 3 x 1 byte for dots, 1 for NULL */\n            sprintf(version, \"%ld.%ld.%ld.0\",\n                verinfo.dwMajorVersion,\n                verinfo.dwMinorVersion,\n                verinfo.dwBuildNumber);\n            return version;\n        }\n\n        return \"0.0.0.0\";\n    }\n\n#pragma warning( pop )\n\n    std::string Environment::GetOsUserName()\n    {\n        Il2CppChar user_name[256 + 1];\n        DWORD user_name_size = ARRAYSIZE(user_name);\n        if (GetUserNameW(user_name, &user_name_size))\n            return utils::StringUtils::Utf16ToUtf8(user_name);\n\n        return \"Unknown\";\n    }\n\n    std::string Environment::GetEnvironmentVariable(const std::string& name)\n    {\n        Il2CppChar buffer[BUFFER_SIZE];\n\n        const UTF16String varName = utils::StringUtils::Utf8ToUtf16(name.c_str());\n\n        DWORD ret = GetEnvironmentVariableW(varName.c_str(), buffer, BUFFER_SIZE);\n\n        if (ret == 0) // Not found\n            return std::string();\n\n        if (ret < BUFFER_SIZE) // Found and fits into buffer\n            return utils::StringUtils::Utf16ToUtf8(buffer);\n\n        // Requires bigger buffer\n        IL2CPP_ASSERT(ret >= BUFFER_SIZE);\n\n        Il2CppChar* bigbuffer = new Il2CppChar[ret + 1];\n\n        ret = GetEnvironmentVariableW(varName.c_str(), bigbuffer, ret + 1);\n        IL2CPP_ASSERT(ret != 0);\n\n        std::string variableValue(utils::StringUtils::Utf16ToUtf8(bigbuffer));\n\n        delete bigbuffer;\n\n        return variableValue;\n    }\n\n    void Environment::SetEnvironmentVariable(const std::string& name, const std::string& value)\n    {\n        const UTF16String varName = utils::StringUtils::Utf8ToUtf16(name.c_str());\n\n        if (value.empty())\n            SetEnvironmentVariableW((LPWSTR)varName.c_str(), NULL);\n        else\n        {\n            const UTF16String varValue = utils::StringUtils::Utf8ToUtf16(value.c_str());\n            SetEnvironmentVariableW((LPWSTR)varName.c_str(), (LPWSTR)varValue.c_str());\n        }\n    }\n\n    std::vector<std::string> Environment::GetEnvironmentVariableNames()\n    {\n        WCHAR* env_strings;\n        WCHAR* env_string;\n        WCHAR* equal_str;\n\n        std::vector<std::string> result;\n\n        env_strings = GetEnvironmentStringsW();\n\n        if (env_strings)\n        {\n            env_string = env_strings;\n            while (*env_string != '\\0')\n            {\n                // Skip over environment variables starting with '='\n                if (*env_string != '=')\n                {\n                    equal_str = wcschr(env_string, '=');\n                    result.push_back(utils::StringUtils::Utf16ToUtf8(env_string, (int)(equal_str - env_string)));\n                }\n                while (*env_string != '\\0')\n                    env_string++;\n                env_string++;\n            }\n\n            FreeEnvironmentStringsW(env_strings);\n        }\n\n        return result;\n    }\n\n    std::string Environment::GetHomeDirectory()\n    {\n        NOT_IMPLEMENTED_ICALL(Environment::GetHomeDirectory);\n        return std::string();\n    }\n\n    std::vector<std::string> Environment::GetLogicalDrives()\n    {\n        NOT_IMPLEMENTED_ICALL(Environment::GetLogicalDrives);\n        return std::vector<std::string>();\n    }\n\n    void Environment::Exit(int result)\n    {\n        NOT_IMPLEMENTED_ICALL(Environment::Exit);\n    }\n\n    NORETURN void Environment::Abort()\n    {\n        // __fastfail() is available since VS2012\n#if _MSC_VER >= 1700\n        __fastfail(FAST_FAIL_FATAL_APP_EXIT);\n#else\n        abort();\n#endif\n    }\n\n#if IL2CPP_TARGET_WINDOWS_DESKTOP\n\n    std::string Environment::GetWindowsFolderPath(int32_t folder)\n    {\n        Il2CppChar path[MAX_PATH];\n        if (SUCCEEDED(SHGetFolderPathW(NULL, folder | CSIDL_FLAG_CREATE, NULL, 0, path)))\n            return utils::StringUtils::Utf16ToUtf8(path);\n\n        return std::string();\n    }\n\n#if NET_4_0\n\n    typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);\n\n    bool Environment::Is64BitOs()\n    {\n        BOOL isWow64Process = false;\n\n        // Supported on XP SP2 and higher\n\n        //IsWow64Process is not available on all supported versions of Windows.\n        //Use GetModuleHandle to get a handle to the DLL that contains the function\n        //and GetProcAddress to get a pointer to the function if available.\n\n        LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(\n                GetModuleHandle(TEXT(\"kernel32\")), \"IsWow64Process\");\n\n        if (NULL != fnIsWow64Process)\n        {\n            if (fnIsWow64Process(GetCurrentProcess(), &isWow64Process))\n            {\n                return isWow64Process == TRUE;\n            }\n        }\n\n        return false;\n    }\n\n#endif\n\n#endif\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/EventImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_THREADS_WIN32\n\n#include \"EventImpl.h\"\n#include \"WindowsHelpers.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    EventImpl::EventImpl(bool manualReset, bool signaled)\n    {\n        m_Event = ::CreateEvent(NULL, manualReset ? TRUE : FALSE, signaled ? TRUE : FALSE, NULL);\n\n        IL2CPP_ASSERT(m_Event);\n    }\n\n    EventImpl::~EventImpl()\n    {\n        IL2CPP_ASSERT(m_Event);\n\n        ::CloseHandle(m_Event);\n    }\n\n    ErrorCode EventImpl::Set()\n    {\n        if (::SetEvent(m_Event))\n            return kErrorCodeSuccess;\n\n        return kErrorCodeGenFailure;\n    }\n\n    ErrorCode EventImpl::Reset()\n    {\n        if (::ResetEvent(m_Event))\n            return kErrorCodeSuccess;\n\n        return kErrorCodeGenFailure;\n    }\n\n    WaitStatus EventImpl::Wait(bool interruptible)\n    {\n        return Wait(INFINITE, interruptible);\n    }\n\n    WaitStatus EventImpl::Wait(uint32_t ms, bool interruptible)\n    {\n        return il2cpp::os::win::WaitForSingleObjectAndAccountForAPCs(m_Event, ms, interruptible);\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/EventImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_THREADS_WIN32\n\n#include \"os/ErrorCodes.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\n#include \"WindowsHeaders.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class EventImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n        EventImpl(bool manualReset = false, bool signaled = false);\n        ~EventImpl();\n\n        ErrorCode Set();\n        ErrorCode Reset();\n        WaitStatus Wait(bool interruptible);\n        WaitStatus Wait(uint32_t ms, bool interruptible);\n\n    private:\n        HANDLE m_Event;\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/File.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"WindowsHelpers.h\"\n\n#undef CopyFile\n#undef DeleteFile\n#undef MoveFile\n#undef ReplaceFile\n#undef GetFileAttributes\n#undef SetFileAttributes\n#undef CreatePipe\n\n#include \"os/File.h\"\n#include \"vm/Exception.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/PathUtils.h\"\n\n#include <stdint.h>\n\nstatic inline int Win32ErrorToErrorCode(DWORD win32ErrorCode)\n{\n    return win32ErrorCode;\n}\n\nnamespace il2cpp\n{\nnamespace os\n{\n#if IL2CPP_TARGET_WINDOWS_DESKTOP\n\n    bool File::Isatty(FileHandle* fileHandle)\n    {\n        DWORD mode;\n        return GetConsoleMode((HANDLE)fileHandle, &mode) != 0;\n    }\n\n    FileHandle* File::GetStdInput()\n    {\n        return (FileHandle*)GetStdHandle(STD_INPUT_HANDLE);\n    }\n\n    FileHandle* File::GetStdError()\n    {\n        return (FileHandle*)GetStdHandle(STD_ERROR_HANDLE);\n    }\n\n    FileHandle* File::GetStdOutput()\n    {\n        return (FileHandle*)GetStdHandle(STD_OUTPUT_HANDLE);\n    }\n\n#endif\n\n    bool File::CreatePipe(FileHandle** read_handle, FileHandle** write_handle)\n    {\n        int error;\n        return CreatePipe(read_handle, write_handle, &error);\n    }\n\n    bool File::CreatePipe(FileHandle** read_handle, FileHandle** write_handle, int* error)\n    {\n#if IL2CPP_TARGET_WINDOWS_DESKTOP\n        SECURITY_ATTRIBUTES attr;\n\n        attr.nLength = sizeof(SECURITY_ATTRIBUTES);\n        attr.bInheritHandle = TRUE;\n        attr.lpSecurityDescriptor = NULL;\n\n        bool ret = ::CreatePipe((PHANDLE)read_handle, (PHANDLE)write_handle, &attr, 0);\n\n        if (ret == FALSE)\n        {\n            *error = GetLastError();\n            /* FIXME: throw an exception? */\n            return false;\n        }\n\n        return true;\n#else\n        vm::Exception::Raise(vm::Exception::GetNotSupportedException(\"Pipes are not supported on WinRT based platforms.\"));\n#endif\n    }\n\n#if !IL2CPP_TARGET_XBOXONE\n    UnityPalFileAttributes File::GetFileAttributes(const std::string& path, int *error)\n    {\n        const UTF16String utf16Path(utils::StringUtils::Utf8ToUtf16(path.c_str()));\n        WIN32_FILE_ATTRIBUTE_DATA fileAttributes;\n\n        BOOL result = ::GetFileAttributesExW((LPCWSTR)utf16Path.c_str(), GetFileExInfoStandard, &fileAttributes);\n        if (result == FALSE)\n        {\n            *error = Win32ErrorToErrorCode(::GetLastError());\n            return static_cast<UnityPalFileAttributes>(INVALID_FILE_ATTRIBUTES);\n        }\n\n        *error = kErrorCodeSuccess;\n        return static_cast<UnityPalFileAttributes>(fileAttributes.dwFileAttributes);\n    }\n\n#endif\n\n    bool File::SetFileAttributes(const std::string& path, UnityPalFileAttributes attributes, int* error)\n    {\n        const UTF16String utf16Path(utils::StringUtils::Utf8ToUtf16(path.c_str()));\n\n        *error = kErrorCodeSuccess;\n\n        if (::SetFileAttributesW((LPCWSTR)utf16Path.c_str(), attributes))\n            return true;\n\n        *error = Win32ErrorToErrorCode(::GetLastError());\n        return false;\n    }\n\n    static inline int64_t HighAndLowToInt64(uint32_t high, uint32_t low)\n    {\n        return ((uint64_t)high << 32) + low;\n    }\n\n    static inline int64_t FileTimeToInt64(const FILETIME& fileTime)\n    {\n        return HighAndLowToInt64(fileTime.dwHighDateTime, fileTime.dwLowDateTime);\n    }\n\n    bool File::GetFileStat(const std::string& path, il2cpp::os::FileStat * stat, int* error)\n    {\n        *error = kErrorCodeSuccess;\n        const UTF16String utf16Path(utils::StringUtils::Utf8ToUtf16(path.c_str()));\n\n        WIN32_FILE_ATTRIBUTE_DATA data;\n        if (!::GetFileAttributesExW((LPCWSTR)utf16Path.c_str(), GetFileExInfoStandard, &data))\n        {\n            *error = Win32ErrorToErrorCode(::GetLastError());\n            return false;\n        }\n\n        stat->name = il2cpp::utils::PathUtils::Basename(path);\n        stat->attributes = data.dwFileAttributes;\n        stat->creation_time = FileTimeToInt64(data.ftCreationTime);\n        stat->last_access_time = FileTimeToInt64(data.ftLastAccessTime);\n        stat->last_write_time = FileTimeToInt64(data.ftLastWriteTime);\n        stat->length = HighAndLowToInt64(data.nFileSizeHigh, data.nFileSizeLow);\n        return true;\n    }\n\n    FileType File::GetFileType(FileHandle* handle)\n    {\n        int result = ::GetFileType((HANDLE)handle);\n        /*if (result == FILE_TYPE_UNKNOWN)\n        {\n            *error = GetLastError();\n        }*/\n        return (FileType)result;\n    }\n\n    bool File::CopyFile(const std::string& src, const std::string& dest, bool overwrite, int* error)\n    {\n        const UTF16String utf16Src(utils::StringUtils::Utf8ToUtf16(src.c_str()));\n        const UTF16String utf16Dest(utils::StringUtils::Utf8ToUtf16(dest.c_str()));\n\n        *error = kErrorCodeSuccess;\n\n        if (::CopyFileW((LPWSTR)utf16Src.c_str(), (LPWSTR)utf16Dest.c_str(), overwrite ? FALSE : TRUE))\n            return true;\n\n        *error = Win32ErrorToErrorCode(::GetLastError());\n        return false;\n    }\n\n    bool File::MoveFile(const std::string& src, const std::string& dest, int* error)\n    {\n        const UTF16String utf16Src(utils::StringUtils::Utf8ToUtf16(src.c_str()));\n        const UTF16String utf16Dest(utils::StringUtils::Utf8ToUtf16(dest.c_str()));\n\n        *error = kErrorCodeSuccess;\n\n        if (::MoveFileExW((LPWSTR)utf16Src.c_str(), (LPWSTR)utf16Dest.c_str(), MOVEFILE_COPY_ALLOWED))\n            return true;\n\n        *error = Win32ErrorToErrorCode(::GetLastError());\n        return false;\n    }\n\n    bool File::DeleteFile(const std::string& path, int *error)\n    {\n        *error = kErrorCodeSuccess;\n        const UTF16String utf16Path(utils::StringUtils::Utf8ToUtf16(path.c_str()));\n        if (::DeleteFileW((LPWSTR)utf16Path.c_str()))\n            return true;\n\n        *error = Win32ErrorToErrorCode(::GetLastError());\n        return false;\n    }\n\n    bool File::ReplaceFile(const std::string& sourceFileName, const std::string& destinationFileName, const std::string& destinationBackupFileName, bool ignoreMetadataErrors, int* error)\n    {\n        const UTF16String utf16Src(utils::StringUtils::Utf8ToUtf16(sourceFileName.c_str()));\n        const UTF16String utf16Dest(utils::StringUtils::Utf8ToUtf16(destinationFileName.c_str()));\n        const UTF16String utf16Backup(utils::StringUtils::Utf8ToUtf16(destinationBackupFileName.c_str()));\n\n        *error = kErrorCodeSuccess;\n\n        DWORD flags = REPLACEFILE_WRITE_THROUGH;\n        if (ignoreMetadataErrors)\n            flags |= REPLACEFILE_IGNORE_MERGE_ERRORS;\n\n        if (::ReplaceFileW((LPWSTR)utf16Dest.c_str(), (LPWSTR)utf16Src.c_str(), utf16Backup.empty() ? NULL : (LPWSTR)utf16Backup.c_str(), flags, NULL, NULL))\n            return true;\n\n        *error = Win32ErrorToErrorCode(::GetLastError());\n        return false;\n    }\n\n    static inline int MonoToWindowsOpenMode(int monoOpenMode)\n    {\n        switch (monoOpenMode)\n        {\n            case kFileModeCreateNew:\n                return CREATE_NEW;\n\n            case kFileModeCreate:\n                return CREATE_ALWAYS;\n\n            case kFileModeOpen:\n                return OPEN_EXISTING;\n\n            case kFileModeOpenOrCreate:\n            case kFileModeAppend:\n                return OPEN_ALWAYS;\n\n            case kFileModeTruncate:\n                return TRUNCATE_EXISTING;\n\n            default:\n                Assert(false && \"Unknown mono open mode\");\n                IL2CPP_UNREACHABLE;\n        }\n    }\n\n    static inline int MonoToWindowsAccessMode(int monoAccessMode)\n    {\n        switch (monoAccessMode)\n        {\n            case kFileAccessRead:\n                return GENERIC_READ;\n\n            case kFileAccessWrite:\n                return GENERIC_WRITE;\n\n            case kFileAccessReadWrite:\n                return GENERIC_READ | GENERIC_WRITE;\n\n            default:\n                return 0;\n        }\n    }\n\n    static inline DWORD MonoOptionsToWindowsFlagsAndAttributes(const std::string& path, int options)\n    {\n        DWORD flagsAndAttributes;\n\n        if (options & kFileOptionsEncrypted)\n        {\n            flagsAndAttributes = FILE_ATTRIBUTE_ENCRYPTED;\n        }\n        else\n        {\n            flagsAndAttributes = FILE_ATTRIBUTE_NORMAL;\n        }\n\n        // Temporary flag does not mean temporary file.\n        flagsAndAttributes |= options & ~(kFileOptionsEncrypted | kFileOptionsTemporary);\n\n        int error;\n        UnityPalFileAttributes currentAttributes = File::GetFileAttributes(path, &error);\n\n        if (currentAttributes != INVALID_FILE_ATTRIBUTES && (currentAttributes & FILE_ATTRIBUTE_DIRECTORY))\n            flagsAndAttributes |= FILE_FLAG_BACKUP_SEMANTICS; // Required to open a directory\n\n        return flagsAndAttributes;\n    }\n\n    FileHandle* File::Open(const std::string& path, int openMode, int accessMode, int shareMode, int options, int *error)\n    {\n        const UTF16String utf16Path(utils::StringUtils::Utf8ToUtf16(path.c_str()));\n\n        openMode = MonoToWindowsOpenMode(openMode);\n        accessMode = MonoToWindowsAccessMode(accessMode);\n        DWORD flagsAndAttributes = MonoOptionsToWindowsFlagsAndAttributes(path, options);\n\n        HANDLE handle = ::CreateFileW((LPCWSTR)utf16Path.c_str(), accessMode, shareMode, NULL, openMode, flagsAndAttributes, NULL);\n\n        if (INVALID_HANDLE_VALUE == handle)\n        {\n            *error = Win32ErrorToErrorCode(::GetLastError());\n            return (FileHandle*)INVALID_HANDLE_VALUE;\n        }\n\n        *error = kErrorCodeSuccess;\n        return (FileHandle*)handle;\n    }\n\n    bool File::Close(FileHandle* handle, int *error)\n    {\n        *error = kErrorCodeSuccess;\n        if (CloseHandle((HANDLE)handle))\n            return true;\n\n        *error = Win32ErrorToErrorCode(::GetLastError());\n        return false;\n    }\n\n    bool File::SetFileTime(FileHandle* handle, int64_t creation_time, int64_t last_access_time, int64_t last_write_time, int* error)\n    {\n        FILE_BASIC_INFO fileInfo;\n\n        fileInfo.CreationTime.QuadPart = creation_time;\n        fileInfo.LastAccessTime.QuadPart = last_access_time;\n        fileInfo.LastWriteTime.QuadPart = last_write_time;\n        fileInfo.ChangeTime.QuadPart = 0; // 0 means don't change anything\n        fileInfo.FileAttributes = 0; // 0 means don't change anything\n\n        if (SetFileInformationByHandle(handle, FileBasicInfo, &fileInfo, sizeof(FILE_BASIC_INFO)) == FALSE)\n        {\n            *error = GetLastError();\n            return false;\n        }\n\n        *error = kErrorCodeSuccess;\n        return true;\n    }\n\n    int64_t File::GetLength(FileHandle* handle, int *error)\n    {\n        *error = kErrorCodeSuccess;\n        LARGE_INTEGER size;\n        if (!::GetFileSizeEx((HANDLE)handle, &size))\n        {\n            *error = Win32ErrorToErrorCode(::GetLastError());\n            return 0;\n        }\n        return size.QuadPart;\n    }\n\n    bool File::SetLength(FileHandle* handle, int64_t length, int *error)\n    {\n        *error = kErrorCodeSuccess;\n        LARGE_INTEGER zeroOffset = { 0 };\n        LARGE_INTEGER requestedOffset = { 0 };\n        requestedOffset.QuadPart = length;\n        LARGE_INTEGER initialPosition = { 0 };\n\n        // set position to 0 from current to retrieve current position\n        if (!::SetFilePointerEx((HANDLE)handle, zeroOffset, &initialPosition, FILE_CURRENT))\n        {\n            *error = Win32ErrorToErrorCode(::GetLastError());\n            return false;\n        }\n\n        // seek to requested length\n        if (!::SetFilePointerEx((HANDLE)handle, requestedOffset, NULL, FILE_BEGIN))\n        {\n            *error = Win32ErrorToErrorCode(::GetLastError());\n            return false;\n        }\n\n        // set requested length\n        if (!::SetEndOfFile((HANDLE)handle))\n        {\n            *error = Win32ErrorToErrorCode(::GetLastError());\n            return false;\n        }\n\n        // restore original position\n        if (!::SetFilePointerEx((HANDLE)handle, initialPosition, NULL, FILE_BEGIN))\n        {\n            *error = Win32ErrorToErrorCode(::GetLastError());\n            return false;\n        }\n\n        return true;\n    }\n\n    int64_t File::Seek(FileHandle* handle, int64_t offset, int origin, int *error)\n    {\n        *error = kErrorCodeSuccess;\n        LARGE_INTEGER distance;\n        distance.QuadPart = offset;\n        LARGE_INTEGER position = { 0 };\n        if (!::SetFilePointerEx((HANDLE)handle, distance, &position, origin))\n            *error = Win32ErrorToErrorCode(::GetLastError());\n\n        return position.QuadPart;\n    }\n\n    int File::Read(FileHandle* handle, char *dest, int count, int *error)\n    {\n        *error = kErrorCodeSuccess;\n        DWORD bytesRead = 0;\n        if (!::ReadFile(handle, dest, count, &bytesRead, NULL))\n            *error = Win32ErrorToErrorCode(::GetLastError());\n\n        return bytesRead;\n    }\n\n    int32_t File::Write(FileHandle* handle, const char* buffer, int count, int *error)\n    {\n        int32_t result;\n        int32_t written;\n\n        result = WriteFile((HANDLE)handle, buffer, count, (LPDWORD)&written, NULL);\n\n        /*if (!result)\n        {\n            *error = GetLastError ();\n            return -1;\n        }*/\n\n        return written;\n    }\n\n    bool File::Flush(FileHandle* handle, int* error)\n    {\n        *error = kErrorCodeSuccess;\n        if (FlushFileBuffers((HANDLE)handle))\n            return true;\n\n        *error = Win32ErrorToErrorCode(::GetLastError());\n\n        return false;\n    }\n\n    void File::Lock(FileHandle* handle,  int64_t position, int64_t length, int* error)\n    {\n        *error = kErrorCodeSuccess;\n\n        OVERLAPPED overlapped;\n        ZeroMemory(&overlapped, sizeof(overlapped));\n\n        overlapped.Offset = position & 0xFFFFFFFF;\n        overlapped.OffsetHigh = position >> 32;\n\n        LARGE_INTEGER lengthUnion;\n        lengthUnion.QuadPart = length;\n\n        if (!::LockFileEx((HANDLE)handle, LOCKFILE_FAIL_IMMEDIATELY, 0, lengthUnion.LowPart, lengthUnion.HighPart, &overlapped))\n            *error = Win32ErrorToErrorCode(::GetLastError());\n    }\n\n    void File::Unlock(FileHandle* handle,  int64_t position, int64_t length, int* error)\n    {\n        *error = kErrorCodeSuccess;\n\n        OVERLAPPED overlapped;\n        ZeroMemory(&overlapped, sizeof(overlapped));\n\n        overlapped.Offset = position & 0xFFFFFFFF;\n        overlapped.OffsetHigh = position >> 32;\n\n        LARGE_INTEGER lengthUnion;\n        lengthUnion.QuadPart = length;\n\n        if (!::UnlockFileEx((HANDLE)handle, 0, lengthUnion.LowPart, lengthUnion.HighPart, &overlapped))\n            *error = Win32ErrorToErrorCode(::GetLastError());\n    }\n\n    bool File::DuplicateHandle(FileHandle* source_process_handle, FileHandle* source_handle, FileHandle* target_process_handle,\n        FileHandle** target_handle, int access, int inherit, int options, int* error)\n    {\n        /* This is only used on Windows */\n\n        //MONO_PREPARE_BLOCKING;\n        BOOL ret = ::DuplicateHandle((HANDLE)source_process_handle, (HANDLE)source_handle, (HANDLE)target_process_handle, (LPHANDLE)target_handle, access, inherit, options);\n        //MONO_FINISH_BLOCKING;\n\n        if (ret == FALSE)\n        {\n            *error = GetLastError();\n            /* FIXME: throw an exception? */\n            return false;\n        }\n\n        return true;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/FileSystemWatcher.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include <cassert>\n#include \"os/FileSystemWatcher.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace FileSystemWatcher\n{\n    int IsSupported()\n    {\n        NOT_IMPLEMENTED_ICALL(FileSystemWatcher::IsSupported);\n        return 0;\n    }\n}\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Image.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"WindowsHeaders.h\"\n\nEXTERN_C IMAGE_DOS_HEADER __ImageBase;\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Image\n{\n    void* GetImageBase()\n    {\n        return &__ImageBase;\n    }\n}\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Initialize.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/Initialize.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"os/Environment.h\"\n#include \"os/WindowsRuntime.h\"\n#include <crtdbg.h>\n\nvoid il2cpp::os::Initialize()\n{\n#if _DEBUG\n    std::string buildMachine = il2cpp::os::Environment::GetEnvironmentVariable(\"UNITY_THISISABUILDMACHINE\");\n    if (!buildMachine.empty())\n    {\n        _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);\n        _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);\n    }\n#endif\n\n    // This is needed so we could extract exception text from bad hresults\n    os::WindowsRuntime::EnableErrorReporting();\n}\n\n#if !IL2CPP_TARGET_WINRT && !IL2CPP_TARGET_XBOXONE\nvoid il2cpp::os::Uninitialize()\n{\n}\n\n#endif\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/LastError.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"os/LastError.h\"\n\n#include \"WindowsHeaders.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    uint32_t LastError::GetLastError()\n    {\n        return ::GetLastError();\n    }\n} /* namespace os */\n} /* namespace il2cpp*/\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/LibraryLoader.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"metadata.h\"\n#include \"os/Mutex.h\"\n#include \"os/LibraryLoader.h\"\n#include \"os/Image.h\"\n#include \"vm/PlatformInvoke.h\"\n#include \"utils/StringUtils.h\"\n\n#include <sstream>\n\n#include \"WindowsHelpers.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    static std::vector<std::pair<std::wstring, HMODULE> > s_NativeDllCache;\n    typedef std::vector<std::pair<std::wstring, HMODULE> >::const_iterator DllCacheIterator;\n    os::FastMutex s_NativeDllCacheMutex;\n\n#define HARDCODED_DEPENDENCY_LIBRARY(libraryName, libraryFunctions) { libraryName, ARRAYSIZE(libraryFunctions), libraryFunctions }\n#define HARDCODED_DEPENDENCY_FUNCTION(function) { #function, reinterpret_cast<Il2CppMethodPointer>(function) }\n\n    struct HardcodedPInvokeDependencyFunction\n    {\n        const char* functionName;\n        Il2CppMethodPointer functionPointer;\n    };\n\n    struct HardcodedPInvokeDependencyLibrary\n    {\n        const wchar_t* libraryName;\n        size_t functionCount;\n        const HardcodedPInvokeDependencyFunction* functions;\n    };\n\n    const HardcodedPInvokeDependencyFunction kKernel32Functions[] =\n    {\n        HARDCODED_DEPENDENCY_FUNCTION(GetTimeZoneInformation),\n        HARDCODED_DEPENDENCY_FUNCTION(GetDynamicTimeZoneInformation),\n    };\n\n#if !IL2CPP_TARGET_WINDOWS_DESKTOP\n    const HardcodedPInvokeDependencyFunction kTimezoneFunctions[] =\n    {\n#if !IL2CPP_TARGET_XBOXONE\n        HARDCODED_DEPENDENCY_FUNCTION(EnumDynamicTimeZoneInformation),\n#endif\n        HARDCODED_DEPENDENCY_FUNCTION(GetDynamicTimeZoneInformation),\n#if !IL2CPP_TARGET_XBOXONE\n        HARDCODED_DEPENDENCY_FUNCTION(GetDynamicTimeZoneInformationEffectiveYears),\n#endif\n        HARDCODED_DEPENDENCY_FUNCTION(GetTimeZoneInformationForYear),\n    };\n#endif\n\n#if IL2CPP_TARGET_WINRT\n    const HardcodedPInvokeDependencyFunction kWinTypesFunctions[] =\n    {\n        HARDCODED_DEPENDENCY_FUNCTION(RoGetBufferMarshaler)\n    };\n#endif\n\n// All these come without \".dll\" extension!\n    const HardcodedPInvokeDependencyLibrary kHardcodedPInvokeDependencies[] =\n    {\n#if !IL2CPP_TARGET_WINDOWS_DESKTOP // These functions are win7+\n        HARDCODED_DEPENDENCY_LIBRARY(L\"api-ms-win-core-timezone-l1-1-0\", kTimezoneFunctions),\n#endif\n        HARDCODED_DEPENDENCY_LIBRARY(L\"kernel32\", kKernel32Functions),\n#if IL2CPP_TARGET_WINRT // Win8+, plus needs to be looked up dynamically on Xbox One\n        HARDCODED_DEPENDENCY_LIBRARY(L\"wintypes\", kWinTypesFunctions),\n#endif\n    };\n\n    inline static wchar_t AsciiToLower(wchar_t c)\n    {\n        if (c >= 'A' && c <= 'Z')\n            return c - 'A' + 'a';\n\n        return c;\n    }\n\n    static bool DoesNativeDynamicLibraryNameMatch(const il2cpp::utils::StringView<Il2CppNativeChar>& desiredLibraryName, const wchar_t* hardcodedLibraryName)\n    {\n        size_t desiredLibraryNameLength = desiredLibraryName.Length();\n        for (size_t i = 0; i < desiredLibraryNameLength; i++)\n        {\n            wchar_t desiredCharacter = AsciiToLower(desiredLibraryName[i]);\n            wchar_t hardcodedCharacter = hardcodedLibraryName[i];\n\n            // Assume hardcodedLibraryName consists of only lower case ascii characters\n            IL2CPP_ASSERT(hardcodedCharacter < 128 && (hardcodedCharacter<'A' || hardcodedCharacter> 'Z'));\n\n            if (desiredCharacter != hardcodedCharacter)\n            {\n                // If we've reached end of our hardcoded dll name, it can still match if we've\n                // reached end of desiredLibraryName file name and only the extension is left\n                return hardcodedCharacter == 0 &&\n                    i + 4 == desiredLibraryNameLength &&\n                    desiredLibraryName[i] == '.' &&\n                    AsciiToLower(desiredLibraryName[i + 1]) == 'd' &&\n                    AsciiToLower(desiredLibraryName[i + 2]) == 'l' &&\n                    AsciiToLower(desiredLibraryName[i + 3]) == 'l';\n            }\n            else if (hardcodedCharacter == 0)\n            {\n                // We've reached the end of hardcoded library name\n                // It's a match if we're at the end of desired library name too\n                return i + 1 == desiredLibraryNameLength;\n            }\n        }\n\n        // We've reached the end of desired library name,\n        // but not the end of hardcoded library name.\n        // It is not a match.\n        return false;\n    }\n\n    Il2CppMethodPointer LibraryLoader::GetHardcodedPInvokeDependencyFunctionPointer(const il2cpp::utils::StringView<Il2CppNativeChar>& nativeDynamicLibrary, const il2cpp::utils::StringView<char>& entryPoint)\n    {\n        for (int i = 0; i < ARRAYSIZE(kHardcodedPInvokeDependencies); i++)\n        {\n            const HardcodedPInvokeDependencyLibrary& library = kHardcodedPInvokeDependencies[i];\n            if (DoesNativeDynamicLibraryNameMatch(nativeDynamicLibrary, library.libraryName))\n            {\n                size_t functionCount = library.functionCount;\n                for (size_t j = 0; j < functionCount; j++)\n                {\n                    const HardcodedPInvokeDependencyFunction function = library.functions[j];\n\n                    if (strncmp(function.functionName, entryPoint.Str(), entryPoint.Length()) == 0)\n                        return function.functionPointer;\n                }\n\n                // We assume that kHardcodedPInvokeDependencies will not contain duplicates\n                return NULL;\n            }\n        }\n\n        return NULL;\n    }\n\n    void* LibraryLoader::LoadDynamicLibrary(const utils::StringView<Il2CppNativeChar>& nativeDynamicLibrary)\n    {\n        if (nativeDynamicLibrary.IsEmpty())\n            return (HMODULE)Image::GetImageBase();\n\n        {\n            os::FastAutoLock lock(&s_NativeDllCacheMutex);\n\n            for (DllCacheIterator it = s_NativeDllCache.begin(); it != s_NativeDllCache.end(); it++)\n            {\n                if (it->first.compare(0, std::string::npos, nativeDynamicLibrary.Str(), nativeDynamicLibrary.Length()) == 0)\n                    return it->second;\n            }\n        }\n\n        std::wstring dllName(nativeDynamicLibrary.Str(), nativeDynamicLibrary.Length());\n        HMODULE module = ::LoadLibraryW(dllName.c_str());\n\n        if (module != NULL)\n        {\n            os::FastAutoLock lock(&s_NativeDllCacheMutex);\n            s_NativeDllCache.push_back(std::make_pair(std::move(dllName), module));\n        }\n\n        return module;\n    }\n\n    Il2CppMethodPointer LibraryLoader::GetFunctionPointer(void* dynamicLibrary, const PInvokeArguments& pinvokeArgs)\n    {\n        if (dynamicLibrary == NULL)\n            return NULL;\n\n        HMODULE module = (HMODULE)dynamicLibrary;\n        StringViewAsNullTerminatedStringOf(char, pinvokeArgs.entryPoint, entryPoint);\n\n        // If there's 'no mangle' flag set, just return directly what GetProcAddress returns\n        if (pinvokeArgs.isNoMangle)\n            return reinterpret_cast<Il2CppMethodPointer>(GetProcAddress(module, entryPoint));\n\n        const size_t kBufferOverhead = 10;\n        FARPROC functionPtr = NULL;\n        size_t originalFuncNameLength = strlen(entryPoint) + 1;\n        std::string functionName;\n\n        functionName.resize(originalFuncNameLength + kBufferOverhead + 1); // Let's index the string from '1', because we might have to prepend an underscore in case of stdcall mangling\n        memcpy(&functionName[1], entryPoint, originalFuncNameLength);\n        ZeroMemory(&functionName[1] + originalFuncNameLength, kBufferOverhead);\n\n        // If there's no 'dont mangle' flag set, 'W' function takes priority over original name, but 'A' function does not (yes, really)\n        if (pinvokeArgs.charSet == CHARSET_UNICODE)\n        {\n            functionName[originalFuncNameLength] = 'W';\n            functionPtr = GetProcAddress(module, functionName.c_str() + 1);\n            if (functionPtr != NULL)\n                return reinterpret_cast<Il2CppMethodPointer>(functionPtr);\n\n            // If charset specific function lookup failed, try with original name\n            functionPtr = GetProcAddress(module, entryPoint);\n        }\n        else\n        {\n            functionPtr = GetProcAddress(module, entryPoint);\n            if (functionPtr != NULL)\n                return reinterpret_cast<Il2CppMethodPointer>(functionPtr);\n\n            // If original name function lookup failed, try with mangled name\n            functionName[originalFuncNameLength] = 'A';\n            functionPtr = GetProcAddress(module, functionName.c_str() + 1);\n        }\n\n        if (functionPtr != NULL)\n            return reinterpret_cast<Il2CppMethodPointer>(functionPtr);\n\n        // If it's not cdecl, try mangling the name\n        // THIS ONLY APPLIES TO 32-bit x86!\n#if !defined(__arm__)\n        if (sizeof(void*) == 4 && pinvokeArgs.callingConvention != IL2CPP_CALL_C)\n        {\n            functionName[0] = '_';\n            sprintf(&functionName[0] + originalFuncNameLength, \"@%ld\", pinvokeArgs.parameterSize);\n\n            functionPtr = GetProcAddress(module, functionName.c_str());\n        }\n#endif\n\n        return reinterpret_cast<Il2CppMethodPointer>(functionPtr);\n    }\n\n    Il2CppMethodPointer LibraryLoader::GetFunctionPointer(void* dynamicLibrary, const char* functionName)\n    {\n        return reinterpret_cast<Il2CppMethodPointer>(GetProcAddress(static_cast<HMODULE>(dynamicLibrary), functionName));\n    }\n\n    void LibraryLoader::CleanupLoadedLibraries()\n    {\n        for (DllCacheIterator it = s_NativeDllCache.begin(); it != s_NativeDllCache.end(); it++)\n        {\n            FreeLibrary(it->second);\n        }\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Locale.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"os/Locale.h\"\n#include \"WindowsHelpers.h\"\n#include <vector>\n\nnamespace il2cpp\n{\nnamespace os\n{\n#if IL2CPP_TARGET_WINDOWS_DESKTOP\n\n    std::string Locale::GetLocale()\n    {\n        LCID lcid = GetThreadLocale();\n\n        int number_of_characters = GetLocaleInfo(lcid, LOCALE_SNAME, NULL, 0);\n        std::vector<WCHAR> locale_name(number_of_characters);\n        if (GetLocaleInfo(lcid, LOCALE_SNAME, &locale_name[0], number_of_characters) == 0)\n            return std::string();\n\n        std::vector<char> locale_name_char(number_of_characters);\n        if (WideCharToMultiByte(CP_ACP, 0, &locale_name[0], number_of_characters, &locale_name_char[0], number_of_characters, NULL, NULL) == 0)\n            return std::string();\n\n        return std::string(locale_name_char.begin(), locale_name_char.end());\n    }\n\n#endif\n\n#if IL2CPP_SUPPORT_LOCALE_INDEPENDENT_PARSING\n    static _locale_t s_cLocale = NULL;\n#endif\n\n    void Locale::Initialize()\n    {\n#if IL2CPP_SUPPORT_LOCALE_INDEPENDENT_PARSING\n        s_cLocale = _create_locale(LC_ALL, \"C\");\n#endif\n    }\n\n    void Locale::UnInitialize()\n    {\n#if IL2CPP_SUPPORT_LOCALE_INDEPENDENT_PARSING\n        _free_locale(s_cLocale);\n        s_cLocale = NULL;\n#endif\n    }\n\n#if IL2CPP_SUPPORT_LOCALE_INDEPENDENT_PARSING\n    double Locale::DoubleParseLocaleIndependentImpl(char *ptr, char** endptr)\n    {\n        return _strtod_l(ptr, endptr, s_cLocale);\n    }\n\n#endif\n} /* namespace os */\n} /* namespace il2cpp */\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/MarshalAlloc.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"os/MarshalAlloc.h\"\n\n#include \"WindowsHeaders.h\"\n#include \"Objbase.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    void* MarshalAlloc::Allocate(size_t size)\n    {\n        return ::CoTaskMemAlloc(size);\n    }\n\n    void* MarshalAlloc::ReAlloc(void* ptr, size_t size)\n    {\n        return ::CoTaskMemRealloc(ptr, size);\n    }\n\n    void MarshalAlloc::Free(void* ptr)\n    {\n        ::CoTaskMemFree(ptr);\n    }\n} /* namespace os */\n} /* namespace il2cpp*/\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/MarshalStringAlloc.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if !IL2CPP_USE_GENERIC_COM\n#include \"os/MarshalStringAlloc.h\"\n#include \"WindowsHeaders.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    il2cpp_hresult_t MarshalStringAlloc::AllocateBStringLength(const Il2CppChar* text, int32_t length, Il2CppChar** bstr)\n    {\n        IL2CPP_ASSERT(bstr);\n        *bstr = ::SysAllocStringLen(text, length);\n        return *bstr ? IL2CPP_S_OK : IL2CPP_E_OUTOFMEMORY;\n    }\n\n    il2cpp_hresult_t MarshalStringAlloc::GetBStringLength(const Il2CppChar* bstr, int32_t* length)\n    {\n        IL2CPP_ASSERT(length);\n        *length = ::SysStringLen((BSTR)bstr);\n        return IL2CPP_S_OK;\n    }\n\n    il2cpp_hresult_t MarshalStringAlloc::FreeBString(Il2CppChar* bstr)\n    {\n        ::SysFreeString((BSTR)bstr);\n        return IL2CPP_S_OK;\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Memory.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/Memory.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace Memory\n{\n    void* AlignedAlloc(size_t size, size_t alignment)\n    {\n        return _aligned_malloc(size, alignment);\n    }\n\n    void* AlignedReAlloc(void* memory, size_t newSize, size_t alignment)\n    {\n        return _aligned_realloc(memory, newSize, alignment);\n    }\n\n    void AlignedFree(void* memory)\n    {\n        return _aligned_free(memory);\n    }\n}\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/MemoryMappedFile.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if !IL2CPP_USE_GENERIC_MEMORY_MAPPED_FILE && IL2CPP_TARGET_WINDOWS\n\n#include <map>\n#include \"WindowsHelpers.h\"\n#include \"os/MemoryMappedFile.h\"\n#include \"os/Mutex.h\"\n#include <limits>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    static FastMutex s_Mutex;\n    static std::map<void*, HANDLE> s_MappedAddressToMappedFileObject;\n\n    void* MemoryMappedFile::Map(FileHandle* file, size_t length, size_t offset)\n    {\n        os::FastAutoLock lock(&s_Mutex);\n\n        HANDLE mappedFile = CreateFileMapping((HANDLE)file, NULL, PAGE_READONLY, 0, 0, NULL);\n        if (mappedFile == NULL)\n            return NULL;\n\n        IL2CPP_ASSERT(offset <= std::numeric_limits<DWORD>::max());\n        IL2CPP_ASSERT(length <= std::numeric_limits<DWORD>::max());\n\n        void* address = MapViewOfFile(mappedFile, FILE_MAP_READ, 0, static_cast<DWORD>(offset), static_cast<DWORD>(length));\n        if (address == NULL)\n        {\n            DWORD error = GetLastError();\n\n            CloseHandle(mappedFile);\n            return NULL;\n        }\n\n        s_MappedAddressToMappedFileObject[address] = mappedFile;\n\n        return address;\n    }\n\n    void MemoryMappedFile::Unmap(void* address, size_t length)\n    {\n        if (address != NULL)\n        {\n            os::FastAutoLock lock(&s_Mutex);\n\n            BOOL error = UnmapViewOfFile(address);\n            IL2CPP_ASSERT(error != 0);\n            (void)error; // Avoid an unused variable warning\n\n            std::map<void*, HANDLE>::iterator entry = s_MappedAddressToMappedFileObject.find(address);\n            if (entry != s_MappedAddressToMappedFileObject.end())\n            {\n                error = CloseHandle(entry->second);\n                IL2CPP_ASSERT(error != 0);\n            }\n        }\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/MutexImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_THREADS_WIN32\n\n#include \"MutexImpl.h\"\n#include \"WindowsHelpers.h\"\n\n// Can't use critical sections as they don't allow for interruption by APCs.\n\nnamespace il2cpp\n{\nnamespace os\n{\n    MutexImpl::MutexImpl()\n    {\n#if IL2CPP_THREADS_ALL_ACCESS\n        m_MutexHandle = ::CreateMutexEx(NULL, NULL, 0, MUTEX_ALL_ACCESS);\n#else\n        m_MutexHandle = ::CreateMutex(NULL, FALSE, NULL);\n#endif\n        IL2CPP_ASSERT(m_MutexHandle);\n    }\n\n    MutexImpl::~MutexImpl()\n    {\n        IL2CPP_ASSERT(m_MutexHandle);\n        ::CloseHandle(m_MutexHandle);\n    }\n\n    void MutexImpl::Lock(bool interruptible)\n    {\n        TryLock(INFINITE, interruptible);\n    }\n\n    bool MutexImpl::TryLock(uint32_t milliseconds, bool interruptible)\n    {\n        return (il2cpp::os::win::WaitForSingleObjectAndAccountForAPCs(m_MutexHandle, milliseconds, interruptible) == kWaitStatusSuccess);\n    }\n\n    void MutexImpl::Unlock()\n    {\n        ReleaseMutex(m_MutexHandle);\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/MutexImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_THREADS_WIN32\n\n#include \"os/ErrorCodes.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\n#include \"WindowsHeaders.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class MutexImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n        MutexImpl();\n        ~MutexImpl();\n\n        void Lock(bool interruptible);\n        bool TryLock(uint32_t milliseconds, bool interruptible);\n        void Unlock();\n\n    private:\n        HANDLE m_MutexHandle;\n    };\n\n    class FastMutexImpl\n    {\n    public:\n        FastMutexImpl()\n        {\n            InitializeCriticalSection(&m_CritialSection);\n        }\n\n        ~FastMutexImpl()\n        {\n            DeleteCriticalSection(&m_CritialSection);\n        }\n\n        void Lock()\n        {\n            EnterCriticalSection(&m_CritialSection);\n        }\n\n        void Unlock()\n        {\n            LeaveCriticalSection(&m_CritialSection);\n        }\n\n        CRITICAL_SECTION* GetOSHandle()\n        {\n            return &m_CritialSection;\n        }\n\n    private:\n        CRITICAL_SECTION m_CritialSection;\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/NativeMethods.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"WindowsHelpers.h\"\n\n#include \"os/NativeMethods.h\"\n#include \"vm/Exception.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    bool NativeMethods::CloseProcess(ProcessHandle* handle)\n    {\n        return ::CloseHandle(handle) != FALSE;\n    }\n\n    bool NativeMethods::GetExitCodeProcess(ProcessHandle* handle, int32_t* exitCode)\n    {\n#if IL2CPP_TARGET_WINDOWS_DESKTOP\n        return ::GetExitCodeProcess((HANDLE)handle, (LPDWORD)exitCode);\n#else\n        vm::Exception::Raise(vm::Exception::GetNotSupportedException(\"Getting process exit code is not supported on WinRT based platforms.\"));\n#endif\n    }\n\n    int32_t NativeMethods::GetCurrentProcessId()\n    {\n        return ::GetCurrentProcessId();\n    }\n\n    ProcessHandle* NativeMethods::GetCurrentProcess()\n    {\n        return (ProcessHandle*)::GetCurrentProcess();\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Path.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"WindowsHeaders.h\"\n#undef GetTempPath\n\n#include \"os/Environment.h\"\n#include \"os/Path.h\"\n#include \"utils/StringUtils.h\"\n#include \"WindowsHelpers.h\"\n#include <string>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    std::string Path::GetExecutablePath()\n    {\n        wchar_t buffer[MAX_PATH];\n        GetModuleFileNameW(NULL, buffer, MAX_PATH);\n        return utils::StringUtils::Utf16ToUtf8(buffer);\n    }\n\n    std::string Path::GetTempPath()\n    {\n        WCHAR tempPath[MAX_PATH + 1];\n        ::GetTempPathW(sizeof(tempPath) / sizeof(tempPath[0]), tempPath);\n        ::GetLongPathNameW(tempPath, tempPath, sizeof(tempPath) / sizeof(tempPath[0]));\n\n        return utils::StringUtils::Utf16ToUtf8(tempPath);\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Process.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS_DESKTOP\n\n#include \"WindowsHelpers.h\"\n#include <Psapi.h>\n\n#include \"os/Process.h\"\n\nstruct ProcessHandle\n{\n    HANDLE handle;\n};\n\nnamespace il2cpp\n{\nnamespace os\n{\n    int Process::GetCurrentProcessId()\n    {\n        return ::GetCurrentProcessId();\n    }\n\n    ProcessHandle* Process::GetProcess(int processId)\n    {\n        return (ProcessHandle*)OpenProcess(PROCESS_ALL_ACCESS, TRUE, processId);\n    }\n\n    void Process::FreeProcess(ProcessHandle* handle)\n    {\n        ::CloseHandle((HANDLE)handle);\n    }\n\n    std::string Process::GetProcessName(ProcessHandle* handle)\n    {\n        const size_t bufferLength = 256;\n        WCHAR buf[bufferLength];\n\n        DWORD length = ::GetProcessImageFileName((HANDLE)handle, buf, bufferLength);\n\n        if (length == 0)\n            return std::string();\n\n        char multiByteStr[bufferLength];\n\n        size_t numConverted = wcstombs(multiByteStr, buf, bufferLength);\n        if (numConverted <= 0)\n            return std::string();\n\n        return std::string(multiByteStr, numConverted);\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/SemaphoreImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_THREADS_WIN32\n\n#include \"SemaphoreImpl.h\"\n#include \"WindowsHelpers.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    SemaphoreImpl::SemaphoreImpl(int32_t initialValue, int32_t maximumValue)\n    {\n#if IL2CPP_THREADS_ALL_ACCESS\n        m_Handle = ::CreateSemaphoreEx(NULL, initialValue, maximumValue, NULL, 0, SEMAPHORE_ALL_ACCESS);\n#else\n        m_Handle = ::CreateSemaphore(NULL, initialValue, maximumValue, NULL);\n#endif\n\n        IL2CPP_ASSERT(m_Handle);\n    }\n\n    SemaphoreImpl::~SemaphoreImpl()\n    {\n        IL2CPP_ASSERT(m_Handle);\n\n        ::CloseHandle(m_Handle);\n    }\n\n    bool SemaphoreImpl::Post(int32_t releaseCount, int32_t* previousCount)\n    {\n        return ::ReleaseSemaphore(m_Handle, releaseCount, reinterpret_cast<LPLONG>(previousCount)) != 0;\n    }\n\n    WaitStatus SemaphoreImpl::Wait(bool interruptible)\n    {\n        return Wait(INFINITE, interruptible);\n    }\n\n    WaitStatus SemaphoreImpl::Wait(uint32_t ms, bool interruptible)\n    {\n        return il2cpp::os::win::WaitForSingleObjectAndAccountForAPCs(m_Handle, ms, interruptible);\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/SemaphoreImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_THREADS_WIN32\n\n#include \"os/ErrorCodes.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\n#include \"WindowsHeaders.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class SemaphoreImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n        SemaphoreImpl(int32_t initialValue, int32_t maximumValue);\n        ~SemaphoreImpl();\n        bool Post(int32_t releaseCount, int32_t* previousCount = NULL);\n        WaitStatus Wait(bool interruptible);\n        WaitStatus Wait(uint32_t ms, bool interruptible);\n    private:\n        HANDLE m_Handle;\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/SocketImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if !IL2CPP_USE_GENERIC_SOCKET_IMPL && IL2CPP_TARGET_WINDOWS\n\n#include <time.h>\n#include <string.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#include \"WindowsHelpers.h\"\n#include <WinSock2.h>\n#include <WS2tcpip.h>\n#if !IL2CPP_TARGET_XBOXONE\n    #include <mswsock.h>\n#endif\n#include \"os/Error.h\"\n#include \"os/Socket.h\"\n#include \"os/ErrorCodes.h\"\n#include \"os/Win32/SocketImpl.h\"\n#include \"utils/StringUtils.h\"\n\n#include \"il2cpp-vm-support.h\"\n\ntypedef int socklen_t;\n\nnamespace il2cpp\n{\nnamespace os\n{\n    static bool is_loopback(int32_t family, uint8_t *addr)\n    {\n        return ((family) == AF_INET ? ((addr)[0] == 127) : false);\n    }\n\n    static struct in_addr *get_local_ips(int32_t family, int32_t *nips)\n    {\n        *nips = 0;\n\n        return 0;\n    }\n\n    static bool hostent_get_info(struct hostent *he, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n        if (he == NULL)\n            return false;\n\n        if (he->h_length != 4 || he->h_addrtype != AF_INET)\n            return false;\n\n        name.assign(he->h_name);\n\n        for (int32_t i = 0; he->h_aliases[i] != NULL; ++i)\n            aliases.push_back(he->h_aliases[i]);\n\n        if (he->h_addrtype == AF_INET)\n        {\n            struct in_addr addr = {0};\n            for (int32_t i = 0; he->h_addr_list[i] != NULL; ++i)\n            {\n                addr.s_addr = *(u_long*)he->h_addr_list[i];\n                addr_list.push_back(inet_ntoa(addr));\n            }\n        }\n        // TODO(gab): add support for IPv6\n        //else if(he->h_addrtype == AF_INET6)\n\n        return true;\n    }\n\n    static bool hostent_get_info_with_local_ips(struct hostent *he, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n        int32_t i = 0;\n        int32_t nlocal_in = 0;\n\n        if (he != NULL)\n        {\n            if (he->h_length != 4 || he->h_addrtype != AF_INET)\n                return false;\n\n            name.assign(he->h_name);\n\n            for (int32_t i = 0; he->h_aliases[i] != NULL; ++i)\n                aliases.push_back(he->h_aliases[i]);\n        }\n\n        struct in_addr *local_in = get_local_ips(AF_INET, &nlocal_in);\n\n        if (nlocal_in)\n        {\n            for (int32_t i = 0; i < nlocal_in; ++i)\n                addr_list.push_back(inet_ntoa(local_in[i]));\n\n            free(local_in);\n        }\n        else if (he == NULL)\n        {\n            // If requesting \"\" and there are no other interfaces up, MS returns 127.0.0.1\n            addr_list.push_back(\"127.0.0.1\");\n            return true;\n        }\n\n        if (nlocal_in == 0 && he != NULL)\n        {\n            if (he->h_addrtype == AF_INET)\n            {\n                struct in_addr addr = {0};\n                for (int32_t i = 0; he->h_addr_list[i] != NULL; ++i)\n                {\n                    addr.s_addr = *(u_long*)he->h_addr_list[i];\n                    addr_list.push_back(inet_ntoa(addr));\n                }\n            }\n            // TODO(gab): add support for IPv6\n            //else if(he->h_addrtype == AF_INET6)\n        }\n\n        return true;\n    }\n\n    static int32_t convert_socket_flags(os::SocketFlags flags)\n    {\n        int32_t c_flags = 0;\n\n        if (flags)\n        {\n            // Check if contains invalid flag values\n            if (flags & ~(os::kSocketFlagsOutOfBand | os::kSocketFlagsMaxIOVectorLength | os::kSocketFlagsPeek | os::kSocketFlagsDontRoute | os::kSocketFlagsPartial))\n            {\n                return -1;\n            }\n\n            if (flags & os::kSocketFlagsOutOfBand)\n                c_flags |= MSG_OOB;\n\n            if (flags & os::kSocketFlagsPeek)\n                c_flags |= MSG_PEEK;\n\n            if (flags & os::kSocketFlagsDontRoute)\n                c_flags |= MSG_DONTROUTE;\n\n            // Ignore Partial - see bug 349688.  Don't return -1, because\n            // according to the comment in that bug ms runtime doesn't for\n            // UDP sockets (this means we will silently ignore it for TCP\n            // too)\n\n    #ifdef MSG_MORE\n            if (flags & os::kSocketFlagsPartial)\n                c_flags |= MSG_MORE;\n    #endif\n        }\n\n        return c_flags;\n    }\n\n    WaitStatus SocketImpl::GetHostByAddr(const std::string &address, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n        struct in_addr inaddr;\n\n        if (inet_pton(AF_INET, address.c_str(), &inaddr) <= 0)\n            return kWaitStatusFailure;\n\n        struct hostent *he = gethostbyaddr((char*)&inaddr, sizeof(inaddr), AF_INET);\n\n        if (he == NULL)\n        {\n            name = address;\n            addr_list.push_back(name);\n\n            return kWaitStatusSuccess;\n        }\n\n        return hostent_get_info(he, name, aliases, addr_list)\n            ? kWaitStatusSuccess\n            : kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::GetHostByName(const std::string &host, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list)\n    {\n        char this_hostname[256] = {0};\n\n        const char *hostname = host.c_str();\n        bool add_local_ips = (*hostname == '\\0');\n\n        if (!add_local_ips && gethostname(this_hostname, sizeof(this_hostname)) != -1)\n        {\n            if (!strcmp(hostname, this_hostname))\n                add_local_ips = true;\n        }\n\n        struct hostent *he = NULL;\n        if (*hostname)\n            he = gethostbyname(hostname);\n\n        if (*hostname && he == NULL)\n            return kWaitStatusFailure;\n\n        return (add_local_ips\n                ? hostent_get_info_with_local_ips(he, name, aliases, addr_list)\n                : hostent_get_info(he, name, aliases, addr_list))\n            ? kWaitStatusSuccess\n            : kWaitStatusFailure;\n    }\n\n    void SocketImpl::Startup()\n    {\n        WSADATA wsadata;\n\n        const int32_t ret = WSAStartup(MAKEWORD(2, 0), &wsadata);\n        if (ret != 0)\n        {\n            exit(-1);\n        }\n    }\n\n    void SocketImpl::Cleanup()\n    {\n        WSACleanup();\n    }\n\n    WaitStatus SocketImpl::GetHostName(std::string &name)\n    {\n        char hostname[256];\n        int32_t ret = gethostname(hostname, sizeof(hostname));\n\n        if (ret == -1)\n            return kWaitStatusFailure;\n\n        name.assign(hostname);\n\n        return kWaitStatusSuccess;\n    }\n\n    SocketImpl::SocketImpl(ThreadStatusCallback thread_status_callback)\n        :   _is_valid(false)\n        ,   _fd(-1)\n        ,   _domain(-1)\n        ,   _type(-1)\n        ,   _protocol(-1)\n        ,   _saved_error(kErrorCodeSuccess)\n        ,   _still_readable(0)\n        ,   _thread_status_callback(thread_status_callback)\n    {\n    }\n\n    SocketImpl::~SocketImpl()\n    {\n    }\n\n    static int32_t convert_address_family(AddressFamily family)\n    {\n        switch (family)\n        {\n            case kAddressFamilyUnspecified:\n                return AF_UNSPEC;\n\n            // NOTE(gab): not supported on Windows\n            //case kAddressFamilyUnix:\n            //  return AF_UNIX;\n\n            case kAddressFamilyInterNetwork:\n                return AF_INET;\n\n            case kAddressFamilyIpx:\n                return AF_IPX;\n\n            case kAddressFamilySna:\n                return AF_SNA;\n\n            case kAddressFamilyDecNet:\n                return AF_DECnet;\n\n            case kAddressFamilyAppleTalk:\n                return AF_APPLETALK;\n\n            case kAddressFamilyInterNetworkV6:\n                return AF_INET6;\n\n#ifdef AF_IRDA\n            case kAddressFamilyIrda:\n                return AF_IRDA;\n#endif\n\n            default:\n                break;\n        }\n\n        return -1;\n    }\n\n    static int32_t convert_socket_type(SocketType type)\n    {\n        switch (type)\n        {\n            case kSocketTypeStream:\n                return SOCK_STREAM;\n\n            case kSocketTypeDgram:\n                return SOCK_DGRAM;\n\n            case kSocketTypeRaw:\n                return SOCK_RAW;\n\n            case kSocketTypeRdm:\n                return SOCK_RDM;\n\n            case kSocketTypeSeqpacket:\n                return SOCK_SEQPACKET;\n\n            default:\n                break;\n        }\n\n        return -1;\n    }\n\n    static int32_t convert_socket_protocol(ProtocolType protocol)\n    {\n        switch (protocol)\n        {\n            case kProtocolTypeIP:\n            case kProtocolTypeIPv6:\n            case kProtocolTypeIcmp:\n            case kProtocolTypeIgmp:\n            case kProtocolTypeGgp:\n            case kProtocolTypeTcp:\n            case kProtocolTypePup:\n            case kProtocolTypeUdp:\n            case kProtocolTypeIdp:\n                // In this case the enum values map exactly.\n                return (int32_t)protocol;\n\n            default:\n                break;\n        }\n\n        // Everything else in unsupported and unexpected\n        return -1;\n    }\n\n    static int SocketExceptionFilter(unsigned int code)\n    {\n        // Sometimes, we call the socket functions and close the socket right after,\n        // and in some rare cases, it throws EXCEPTION_INVALID_HANDLE SEH exception\n        // rather than returning an error code. Although this is undocumented on MSDN,\n        // it causes a crash just because it thinks we gave it an invalid handle.\n        // We guard against it by wrapping every socket call with __try/__except\n        if (code == EXCEPTION_INVALID_HANDLE)\n            return EXCEPTION_CONTINUE_EXECUTION;\n\n        return EXCEPTION_CONTINUE_SEARCH;\n    }\n\n    WaitStatus SocketImpl::Create(AddressFamily family, SocketType type, ProtocolType protocol)\n    {\n        _fd = -1;\n        _is_valid = false;\n        _still_readable = 1;\n        _domain = convert_address_family(family);\n        _type = convert_socket_type(type);\n        _protocol = convert_socket_protocol(protocol);\n\n        IL2CPP_ASSERT(_type != -1 && \"Unsupported socket type\");\n        IL2CPP_ASSERT(_domain != -1 && \"Unsupported address family\");\n        IL2CPP_ASSERT(_protocol != -1 && \"Unsupported protocol type\");\n\n        _fd = socket(_domain, _type, _protocol);\n        if (_fd == -1 && _domain == AF_INET && _type == SOCK_RAW && _protocol == 0)\n        {\n            // Retry with protocol == 4 (see bug #54565)\n            _protocol = 4;\n            _fd = socket(AF_INET, SOCK_RAW, 4);\n        }\n\n        if (_fd == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        // if (fd >= _wapi_fd_reserve)\n        // {\n        //  WSASetLastError (WSASYSCALLFAILURE);\n        //  closesocket (fd);\n\n        //  return(INVALID_SOCKET);\n        // }\n\n        /* .net seems to set this by default for SOCK_STREAM, not for\n         * SOCK_DGRAM (see bug #36322)\n         *\n         * It seems winsock has a rather different idea of what\n         * SO_REUSEADDR means.  If it's set, then a new socket can be\n         * bound over an existing listening socket.  There's a new\n         * windows-specific option called SO_EXCLUSIVEADDRUSE but\n         * using that means the socket MUST be closed properly, or a\n         * denial of service can occur.  Luckily for us, winsock\n         * behaves as though any other system would when SO_REUSEADDR\n         * is true, so we don't need to do anything else here.  See\n         * bug 53992.\n         */\n        {\n            int32_t v = 1;\n            const int32_t ret = setsockopt((SOCKET)_fd, SOL_SOCKET, SO_REUSEADDR, (char*)&v, sizeof(v));\n\n            if (ret == -1)\n            {\n                if (closesocket((SOCKET)_fd) == -1)\n                    StoreLastError();\n\n                return kWaitStatusFailure;\n            }\n        }\n\n        // mono_once (&socket_ops_once, socket_ops_init);\n\n        // handle = _wapi_handle_new_fd (WAPI_HANDLE_SOCKET, fd, &socket_handle);\n        // if (handle == _WAPI_HANDLE_INVALID) {\n        //  g_warning (\"%s: error creating socket handle\", __func__);\n        //  WSASetLastError (WSASYSCALLFAILURE);\n        //  closesocket (fd);\n\n        //  return(INVALID_SOCKET);\n        // }\n\n        _is_valid = true;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Create(SocketDescriptor fd, int32_t family, int32_t type, int32_t protocol)\n    {\n        _fd = fd;\n        _is_valid = (fd != -1);\n        _still_readable = 1;\n        _domain = family;\n        _type = type;\n        _protocol = protocol;\n\n        IL2CPP_ASSERT(_type != -1 && \"Unsupported socket type\");\n        IL2CPP_ASSERT(_domain != -1 && \"Unsupported address family\");\n        IL2CPP_ASSERT(_protocol != -1 && \"Unsupported protocol type\");\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Close()\n    {\n        _saved_error = kErrorCodeSuccess;\n\n        SOCKET fd = (SOCKET)_fd;\n        if (_is_valid && fd != -1)\n        {\n            if (closesocket(fd) == -1)\n                StoreLastError();\n        }\n\n        _fd = -1;\n        _is_valid = false;\n        _still_readable = 0;\n        _domain = -1;\n        _type = -1;\n        _protocol = -1;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::SetBlocking(bool blocking)\n    {\n        /*\n        * block == TRUE/FALSE means we will block/not block.\n        * But the ioctlsocket call takes TRUE/FALSE for non-block/block\n        */\n        u_long ioctl_socket_blocking = (u_long) !blocking;\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int32_t ret = -1;\n\n        __try\n        {\n            ret = ioctlsocket(fd, FIONBIO, &ioctl_socket_blocking);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (ret == SOCKET_ERROR)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    ErrorCode SocketImpl::GetLastError() const\n    {\n        return _saved_error;\n    }\n\n    void SocketImpl::StoreLastError()\n    {\n        const ErrorCode error = (ErrorCode)WSAGetLastError();\n\n        Error::SetLastError(error);\n\n        _saved_error = error;\n    }\n\n    void SocketImpl::StoreLastError(int32_t error_no)\n    {\n        const ErrorCode error = (ErrorCode)error_no;\n\n        Error::SetLastError(error);\n\n        _saved_error = error;\n    }\n\n    static void sockaddr_from_address(uint32_t address, uint16_t port, struct sockaddr *sa, socklen_t *sa_size)\n    {\n        struct sockaddr_in sa_in = {0};\n\n        sa_in.sin_family = AF_INET;\n        sa_in.sin_port = port;\n        sa_in.sin_addr.s_addr = address;\n\n        *sa_size = sizeof(struct sockaddr_in);\n        *sa = *((struct sockaddr*)&sa_in);\n    }\n\n    static bool socketaddr_to_endpoint_info(const struct sockaddr *address, socklen_t address_len, EndPointInfo &info)\n    {\n        info.family = (os::AddressFamily)address->sa_family;\n\n        if (info.family == os::kAddressFamilyInterNetwork)\n        {\n            const struct sockaddr_in *address_in = (const struct sockaddr_in *)address;\n\n            info.data.inet.port = ntohs(address_in->sin_port);\n            info.data.inet.address = ntohl(address_in->sin_addr.s_addr);\n\n            return true;\n        }\n\n        // NOTE(gab): kAddressFamilyUnix not supported on Windows\n        //if (info.family == os::kAddressFamilyUnix)\n        //{\n        //  for (int32_t i = 0; i < address_len; i++)\n        //      info.data.path[i] = address->sa_data[i];\n\n        //  return true;\n        //}\n\n        return false;\n    }\n\n    WaitStatus SocketImpl::Bind(const char *path)\n    {\n        // NOTE(gab): not supported on Windows.\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Bind(const char *address, uint16_t port)\n    {\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(inet_addr(address), htons(port), &sa, &sa_size);\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int bindResult = -1;\n\n        __try\n        {\n            bindResult = bind(fd, &sa, sa_size);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (bindResult == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Bind(uint32_t address, uint16_t port)\n    {\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(htonl(address), htons(port), &sa, &sa_size);\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int bindResult = -1;\n\n        __try\n        {\n            bindResult = bind(fd, &sa, sa_size);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (bindResult == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Bind(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port)\n    {\n        IL2CPP_VM_NOT_SUPPORTED(SocketImpl::Bind, \"We don't have IPv6 support on Windows yet.\");\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::ConnectInternal(struct sockaddr *sa, int32_t sa_size)\n    {\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        __try\n        {\n            if (connect(fd, sa, (socklen_t)sa_size) != -1)\n                return kWaitStatusSuccess;\n\n            if (errno != EINTR)\n            {\n                StoreLastError();\n                return kWaitStatusFailure;\n            }\n\n            struct pollfd fds = { 0 };\n\n            fds.fd = fd;\n            fds.events = POLLOUT;\n\n            while (WSAPoll(&fds, 1, -1) == -1)\n            {\n                if (errno != EINTR)\n                {\n                    StoreLastError();\n                    return kWaitStatusFailure;\n                }\n            }\n\n            int32_t so_error = 0;\n            socklen_t len = sizeof(so_error);\n\n            if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (char*)&so_error, &len) == -1)\n            {\n                StoreLastError();\n                return kWaitStatusFailure;\n            }\n\n            if (so_error != 0)\n            {\n                StoreLastError(so_error);\n                return kWaitStatusFailure;\n            }\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n            SetLastError(kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Connect(const char *path)\n    {\n        // NOTE(gab): not supported on Windows.\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Connect(uint32_t address, uint16_t port)\n    {\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(htonl(address), htons(port), &sa, &sa_size);\n\n        return ConnectInternal((struct sockaddr *)&sa, sa_size);\n    }\n\n    WaitStatus SocketImpl::Connect(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port)\n    {\n        IL2CPP_VM_NOT_SUPPORTED(SocketImpl::Connect, \"We don't have IPv6 support on Windows yet.\");\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::GetLocalEndPointInfo(EndPointInfo &info)\n    {\n        // Note: the size here could probably be smaller\n        uint8_t buffer[END_POINT_MAX_PATH_LEN + 3] = {0};\n        socklen_t address_len = sizeof(buffer);\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int getsocknameResult = -1;\n\n        __try\n        {\n            getsocknameResult = getsockname(fd, (struct sockaddr *)buffer, &address_len);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n            SetLastError(kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        if (getsocknameResult == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        if (!socketaddr_to_endpoint_info((struct sockaddr *)buffer, address_len, info))\n        {\n            _saved_error = kWSAeafnosupport;\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::GetRemoteEndPointInfo(EndPointInfo &info)\n    {\n        // Note: the size here could probably be smaller\n        uint8_t buffer[END_POINT_MAX_PATH_LEN + 3] = {0};\n        socklen_t address_len = sizeof(buffer);\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int getpeernameResult = -1;\n\n        __try\n        {\n            getpeernameResult = getpeername(fd, (struct sockaddr *)buffer, &address_len);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (getpeernameResult == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        if (!socketaddr_to_endpoint_info((struct sockaddr *)buffer, address_len, info))\n        {\n            _saved_error = kWSAeafnosupport;\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Listen(int32_t backlog)\n    {\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int listenResult = -1;\n\n        __try\n        {\n            listenResult = listen(fd, backlog);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (listenResult == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Shutdown(int32_t how)\n    {\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int shutdownResult = -1;\n\n        __try\n        {\n            shutdownResult = shutdown(fd, how);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (shutdownResult == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        if (how == SD_RECEIVE || how == SD_BOTH)\n            _still_readable = 0;\n\n        return kWaitStatusSuccess;\n    }\n\n    static SOCKET AcceptProtected(SOCKET fd)\n    {\n        SOCKET new_fd;\n\n        do\n        {\n            __try\n            {\n                new_fd = accept(fd, NULL, 0);\n            }\n            __except (SocketExceptionFilter(GetExceptionCode()))\n            {\n                new_fd = -1;\n                break;\n            }\n        }\n        while (new_fd == -1 && errno == EINTR);\n\n        return new_fd;\n    }\n\n    WaitStatus SocketImpl::Accept(os::Socket **socket)\n    {\n        SocketDescriptor new_fd = 0;\n\n        *socket = NULL;\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        new_fd = AcceptProtected(fd);\n\n        if (new_fd == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        *socket = new os::Socket(_thread_status_callback);\n\n        const WaitStatus status = (*socket)->Create(new_fd, _domain, _type, _protocol);\n\n        if (status != kWaitStatusSuccess)\n        {\n            delete *socket;\n            *socket = NULL;\n            return status;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Disconnect(bool reuse)\n    {\n        GUID GuidDisconnectEx = WSAID_DISCONNECTEX;\n        LPFN_DISCONNECTEX disconnectEx;\n        DWORD copied;\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        __try\n        {\n            int32_t ret = WSAIoctl(fd, SIO_GET_EXTENSION_FUNCTION_POINTER, &GuidDisconnectEx, sizeof(GuidDisconnectEx), &disconnectEx, sizeof(disconnectEx), &copied, 0, 0);\n\n            if (ret == SOCKET_ERROR)\n            {\n                StoreLastError();\n                return kWaitStatusFailure;\n            }\n\n            if (!disconnectEx(fd, NULL, 0, NULL))\n            {\n                StoreLastError();\n                return kWaitStatusFailure;\n            }\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Receive(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        *len = 0;\n\n        const int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        return ReceiveFromInternal(data, count, c_flags, len, NULL, 0);\n    }\n\n    WaitStatus SocketImpl::ReceiveFromInternal(const uint8_t *data, size_t count, int32_t flags, int32_t *len, struct sockaddr *from, int32_t *fromlen)\n    {\n        int32_t ret = 0;\n        IL2CPP_ASSERT(count < static_cast<size_t>(std::numeric_limits<int>::max()));\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        do\n        {\n            __try\n            {\n                ret = recvfrom(fd, (char*)data, static_cast<int>(count), flags, from, (socklen_t*)fromlen);\n            }\n            __except (SocketExceptionFilter(GetExceptionCode()))\n            {\n                ret = -1;\n                break;\n            }\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == 0 && count > 0)\n        {\n            // According to the Linux man page, recvfrom only\n            // returns 0 when the socket has been shut down\n            // cleanly.  Turn this into an EINTR to simulate win32\n            // behaviour of returning EINTR when a socket is\n            // closed while the recvfrom is blocking (we use a\n            // shutdown() in socket_close() to trigger this.) See\n            // bug 75705.\n\n            // Distinguish between the socket being shut down at\n            // the local or remote ends, and reads that request 0\n            // bytes to be read\n\n            // If this returns FALSE, it means the socket has been\n            // closed locally.  If it returns TRUE, but\n            // still_readable != 1 then shutdown\n            // (SHUT_RD|SHUT_RDWR) has been called locally.\n\n            if (_still_readable != 1)\n            {\n                ret = -1;\n                errno = EINTR;\n            }\n        }\n\n        if (ret == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        *len = ret;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Send(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        *len = 0;\n\n        const int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int32_t ret = 0;\n\n        do\n        {\n            __try\n            {\n                ret = send(fd, (char*)data, count, flags);\n            }\n            __except (SocketExceptionFilter(GetExceptionCode()))\n            {\n                ret = -1;\n                break;\n            }\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        *len = ret;\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::SendArray(WSABuf *wsabufs, int32_t count, int32_t *sent, SocketFlags flags)\n    {\n        DWORD c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        DWORD bytes_sent;\n\n        int32_t ret = -1;\n\n        __try\n        {\n            ret = WSASend(fd, (WSABUF*)wsabufs, count, &bytes_sent, c_flags, NULL, NULL);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (ret == SOCKET_ERROR)\n        {\n            *sent = 0;\n\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        *sent = bytes_sent;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::ReceiveArray(WSABuf *wsabufs, int32_t count, int32_t *len, SocketFlags flags)\n    {\n        DWORD recv;\n        DWORD c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int32_t ret = -1;\n\n        __try\n        {\n            // NOTE(gab): this cast is possible as long as WSABuf is binary compatible with WSABUF\n            ret = WSARecv(fd, (WSABUF*)wsabufs, count, &recv, &c_flags, NULL, NULL);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (ret == SOCKET_ERROR)\n        {\n            *len = 0;\n\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        *len = recv;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::SendTo(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        *len = 0;\n\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(htonl(address), htons(port), &sa, &sa_size);\n\n        const int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int32_t ret = 0;\n\n        do\n        {\n            __try\n            {\n                ret = sendto(fd, (char*)data, count, c_flags, &sa, sa_size);\n            }\n            __except (SocketExceptionFilter(GetExceptionCode()))\n            {\n                ret = -1;\n                break;\n            }\n        }\n        while (ret == -1 && errno == EINTR);\n\n        if (ret == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        *len = ret;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::SendTo(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        // NOTE(gab): not supported on Windows.\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::SendTo(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len)\n    {\n        IL2CPP_VM_NOT_SUPPORTED(SocketImpl::SendTo, \"We don't have IPv6 support on Windows yet.\");\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::RecvFrom(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n        *len = 0;\n\n        struct sockaddr sa = {0};\n        socklen_t sa_size = 0;\n\n        sockaddr_from_address(htonl(address), htons(port), &sa, &sa_size);\n\n        const int32_t c_flags = convert_socket_flags(flags);\n\n        if (c_flags == -1)\n        {\n            _saved_error = kWSAeopnotsupp;\n            return kWaitStatusFailure;\n        }\n\n        int32_t ret = 0;\n\n        const WaitStatus status = ReceiveFromInternal(data, count, c_flags, len, &sa, (int32_t*)&sa_size);\n\n        if (status != kWaitStatusSuccess)\n        {\n            ep.family = os::kAddressFamilyError;\n            return status;\n        }\n\n        if (sa_size == 0)\n            return kWaitStatusSuccess;\n\n        if (!socketaddr_to_endpoint_info(&sa, sa_size, ep))\n        {\n            ep.family = os::kAddressFamilyError;\n            _saved_error = kWSAeafnosupport;\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::RecvFrom(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n        // NOTE(gab): not supported on Windows.\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::RecvFrom(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep)\n    {\n        IL2CPP_VM_NOT_SUPPORTED(SocketImpl::RecvFrom, \"We don't have IPv6 support on Windows yet.\");\n        return kWaitStatusFailure;\n    }\n\n    WaitStatus SocketImpl::Available(int32_t *amount)\n    {\n        *amount = 0;\n\n        u_long a = 0;\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int ioctlsocketResult = -1;\n\n        __try\n        {\n            ioctlsocketResult = ioctlsocket(fd, FIONREAD, &a);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (ioctlsocketResult == -1)\n        {\n            StoreLastError();\n            return kWaitStatusFailure;\n        }\n\n        *amount = a;\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Ioctl(int32_t command, const uint8_t *in_data, int32_t in_len, uint8_t *out_data, int32_t out_len, int32_t *written)\n    {\n        IL2CPP_ASSERT(command != 0xC8000006 /* SIO_GET_EXTENSION_FUNCTION_POINTER */ && \"SIO_GET_EXTENSION_FUNCTION_POINTER ioctl command not supported\");\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        DWORD len = 0;\n        int32_t ret = -1;\n\n        __try\n        {\n            ret = WSAIoctl(fd, command, (void*)in_data, in_len, out_data, out_len, &len, NULL, NULL);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (ret == SOCKET_ERROR)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        *written = len;\n\n        return kWaitStatusSuccess;\n    }\n\n#define     SKIP_OPTION         -2\n#define     INVALID_OPTION_NAME -1\n\n    static int32_t level_and_name_to_system(SocketOptionLevel level, SocketOptionName name, int32_t *system_level, int32_t *system_name)\n    {\n        switch (level)\n        {\n            case kSocketOptionLevelSocket:\n                *system_level = SOL_SOCKET;\n\n                switch (name)\n                {\n                    // This is SO_LINGER, because the setsockopt\n                    // internal call maps DontLinger to SO_LINGER\n                    // with l_onoff=0\n                    case kSocketOptionNameDontLinger:\n                        *system_name = SO_LINGER;\n                        break;\n\n                    case kSocketOptionNameDebug:\n                        *system_name = SO_DEBUG;\n                        break;\n\n                    // #ifdef SO_ACCEPTCONN\n                    case kSocketOptionNameAcceptConnection:\n                        *system_name = SO_ACCEPTCONN;\n                        break;\n                    // #endif\n                    case kSocketOptionNameReuseAddress:\n                        *system_name = SO_REUSEADDR;\n                        break;\n\n                    case kSocketOptionNameKeepAlive:\n                        *system_name = SO_KEEPALIVE;\n                        break;\n\n                    case kSocketOptionNameDontRoute:\n                        *system_name = SO_DONTROUTE;\n                        break;\n\n                    case kSocketOptionNameBroadcast:\n                        *system_name = SO_BROADCAST;\n                        break;\n\n                    case kSocketOptionNameLinger:\n                        *system_name = SO_LINGER;\n                        break;\n\n                    case kSocketOptionNameOutOfBandInline:\n                        *system_name = SO_OOBINLINE;\n                        break;\n\n                    case kSocketOptionNameSendBuffer:\n                        *system_name = SO_SNDBUF;\n                        break;\n\n                    case kSocketOptionNameReceiveBuffer:\n                        *system_name = SO_RCVBUF;\n                        break;\n\n                    case kSocketOptionNameSendLowWater:\n                        *system_name = SO_SNDLOWAT;\n                        break;\n\n                    case kSocketOptionNameReceiveLowWater:\n                        *system_name = SO_RCVLOWAT;\n                        break;\n\n                    case kSocketOptionNameSendTimeout:\n                        *system_name = SO_SNDTIMEO;\n                        break;\n\n                    case kSocketOptionNameReceiveTimeout:\n                        *system_name = SO_RCVTIMEO;\n                        break;\n\n                    case kSocketOptionNameError:\n                        *system_name = SO_ERROR;\n                        break;\n\n                    case kSocketOptionNameType:\n                        *system_name = SO_TYPE;\n                        break;\n\n                    case kSocketOptionNameExclusiveAddressUse:\n        #ifdef SO_EXCLUSIVEADDRUSE\n                        *system_name = SO_EXCLUSIVEADDRUSE;\n                        break;\n        #elif SO_REUSEADDR\n                        *system_name = SO_REUSEADDR;\n                        break;\n        #endif\n                    case kSocketOptionNameUseLoopback:\n        #ifdef SO_USELOOPBACK\n                        *system_name = SO_USELOOPBACK;\n                        break;\n        #endif\n                    case kSocketOptionNameMaxConnections:\n        #ifdef SO_MAXCONN\n                        *system_name = SO_MAXCONN;\n                        break;\n        #elif defined(SOMAXCONN)\n                        *system_name = SOMAXCONN;\n                        break;\n        #endif\n                    default:\n                        return INVALID_OPTION_NAME;\n                }\n                break;\n\n            case kSocketOptionLevelIP:\n#ifdef SOL_IP\n                *system_level = SOL_IP;\n#else\n                *system_level = IPPROTO_IP;\n#endif\n\n                switch (name)\n                {\n                    case kSocketOptionNameIPOptions:\n                        *system_name = IP_OPTIONS;\n                        break;\n\n        #ifdef IP_HDRINCL\n                    case kSocketOptionNameHeaderIncluded:\n                        *system_name = IP_HDRINCL;\n                        break;\n        #endif\n        #ifdef IP_TOS\n                    case kSocketOptionNameTypeOfService:\n                        *system_name = IP_TOS;\n                        break;\n        #endif\n        #ifdef IP_TTL\n                    case kSocketOptionNameIpTimeToLive:\n                        *system_name = IP_TTL;\n                        break;\n        #endif\n                    case kSocketOptionNameMulticastInterface:\n                        *system_name = IP_MULTICAST_IF;\n                        break;\n\n                    case kSocketOptionNameMulticastTimeToLive:\n                        *system_name = IP_MULTICAST_TTL;\n                        break;\n\n                    case kSocketOptionNameMulticastLoopback:\n                        *system_name = IP_MULTICAST_LOOP;\n                        break;\n\n                    case kSocketOptionNameAddMembership:\n                        *system_name = IP_ADD_MEMBERSHIP;\n                        break;\n\n                    case kSocketOptionNameDropMembership:\n                        *system_name = IP_DROP_MEMBERSHIP;\n                        break;\n\n        #ifdef HAVE_IP_PKTINFO\n                    case kSocketOptionNamePacketInformation:\n                        *system_name = IP_PKTINFO;\n                        break;\n        #endif\n\n                    case kSocketOptionNameDontFragment:\n        #ifdef IP_DONTFRAGMENT\n                        *system_name = IP_DONTFRAGMENT;\n        #elif IP_MTU_DISCOVER\n                        *system_name = IP_MTU_DISCOVER;\n        #elif IP_DONTFRAG\n                        *system_name = IP_DONTFRAG;\n        #else\n                        return SKIP_OPTION;\n        #endif\n                        break;\n\n                    case kSocketOptionNameAddSourceMembership:\n                    case kSocketOptionNameDropSourceMembership:\n                    case kSocketOptionNameBlockSource:\n                    case kSocketOptionNameUnblockSource:\n                    // Can't figure out how to map these, so fall\n                    // through\n                    default:\n                        return INVALID_OPTION_NAME;\n                }\n                break;\n\n            case kSocketOptionLevelTcp:\n#ifdef SOL_TCP\n                *system_level = SOL_TCP;\n#else\n                *system_level = IPPROTO_TCP;\n#endif\n\n                switch (name)\n                {\n                    case kSocketOptionNameNoDelay:\n                        *system_name = TCP_NODELAY;\n                        break;\n                    default:\n                        return INVALID_OPTION_NAME;\n                }\n                break;\n\n            case kSocketOptionLevelUdp:\n            default:\n                return INVALID_OPTION_NAME;\n        }\n\n        return 0;\n    }\n\n    WaitStatus SocketImpl::GetSocketOption(SocketOptionLevel level, SocketOptionName name, uint8_t *buffer, int32_t *length)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n        const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n        if (o_res == SKIP_OPTION)\n        {\n            *((int32_t*)buffer) = 0;\n            *length = sizeof(int32_t);\n\n            return kWaitStatusSuccess;\n        }\n\n        if (o_res == INVALID_OPTION_NAME)\n        {\n            _saved_error = kWSAenoprotoopt;\n\n            return kWaitStatusFailure;\n        }\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        uint8_t *tmp_val = buffer;\n\n        int32_t ret = -1;\n\n        __try\n        {\n            ret = getsockopt(fd, system_level, system_name, (char*)tmp_val, (socklen_t*)length);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (ret == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        if (system_name == SO_ERROR)\n        {\n            if (*((int32_t*)buffer) != 0)\n            {\n                StoreLastError(*((int32_t*)buffer));\n            }\n            else\n            {\n                *((int32_t*)buffer) = _saved_error;\n            }\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::GetSocketOptionFull(SocketOptionLevel level, SocketOptionName name, int32_t *first, int32_t *second)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n#if !defined(SO_EXCLUSIVEADDRUSE) && defined(SO_REUSEADDR)\n        if (level == kSocketOptionLevelSocket && name == kSocketOptionNameExclusiveAddressUse)\n        {\n            system_level = SOL_SOCKET;\n            system_name = SO_REUSEADDR;\n        }\n        else\n#endif\n        {\n            const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n            if (o_res == SKIP_OPTION)\n            {\n                *first = 0;\n                *second = 0;\n\n                return kWaitStatusSuccess;\n            }\n\n            if (o_res == INVALID_OPTION_NAME)\n            {\n                _saved_error = kWSAenoprotoopt;\n\n                return kWaitStatusFailure;\n            }\n        }\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int32_t ret = -1;\n\n        switch (name)\n        {\n            case kSocketOptionNameLinger:\n            {\n                struct linger linger;\n                socklen_t lingersize = sizeof(linger);\n\n                __try\n                {\n                    ret = getsockopt(fd, system_level, system_name, (char*)&linger, &lingersize);\n\n                    *first = linger.l_onoff;\n                    *second = linger.l_linger;\n                }\n                __except (SocketExceptionFilter(GetExceptionCode()))\n                {\n                    ret = -1;\n                }\n            }\n            break;\n\n            case kSocketOptionNameDontLinger:\n            {\n                struct linger linger;\n                socklen_t lingersize = sizeof(linger);\n\n                __try\n                {\n                    ret = getsockopt(fd, system_level, system_name, (char*)&linger, &lingersize);\n\n                    *first = !linger.l_onoff;\n                }\n                __except (SocketExceptionFilter(GetExceptionCode()))\n                {\n                    ret = -1;\n                }\n            }\n            break;\n\n            case kSocketOptionNameSendTimeout:\n            case kSocketOptionNameReceiveTimeout:\n            {\n                socklen_t time_ms_size = sizeof(*first);\n\n                __try\n                {\n                    ret = getsockopt(fd, system_level, system_name, (char*)first, &time_ms_size);\n                }\n                __except (SocketExceptionFilter(GetExceptionCode()))\n                {\n                    ret = -1;\n                }\n            }\n            break;\n\n            default:\n            {\n                socklen_t valsize = sizeof(*first);\n\n                __try\n                {\n                    ret = getsockopt(fd, system_level, system_name, (char*)first, &valsize);\n                }\n                __except (SocketExceptionFilter(GetExceptionCode()))\n                {\n                    ret = -1;\n                }\n            }\n            break;\n        }\n\n        if (ret == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n#if !defined(SO_EXCLUSIVEADDRUSE) && defined(SO_REUSEADDR)\n        if (level == kSocketOptionLevelSocket && name == kSocketOptionNameExclusiveAddressUse)\n            *first = *first ? 0 : 1;\n#endif\n\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Poll(std::vector<PollRequest> &requests, int32_t count, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        const size_t nfds = (size_t)count;\n        fd_set rfds, wfds, efds;\n\n        FD_ZERO(&rfds);\n        FD_ZERO(&wfds);\n        FD_ZERO(&efds);\n\n        for (size_t i = 0; i < nfds; i++)\n        {\n            SOCKET fd = static_cast<SOCKET>(requests[i].fd);\n            requests[i].revents = kPollFlagsNone;\n            if (fd == -1)\n                continue;\n\n            if ((requests[i].events & kPollFlagsIn) != 0)\n                FD_SET(fd, &rfds);\n\n            if ((requests[i].events & kPollFlagsOut) != 0)\n                FD_SET(fd, &wfds);\n\n            FD_SET(fd, &efds);\n        }\n\n        timeval timevalTimeout;\n        timeval* timeoutPtr = NULL;\n        if (timeout != -1)\n        {\n            timevalTimeout.tv_sec = timeout / 1000;\n            timevalTimeout.tv_usec = (timeout % 1000) * 1000;\n            timeoutPtr = &timevalTimeout;\n        }\n\n        int32_t affected = -1;\n\n        __try\n        {\n            affected = select(0, &rfds, &wfds, &efds, timeoutPtr);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (affected == -1)\n        {\n            *error = WSAGetLastError();\n\n            // Mono does this as well and the threadpool-ms-io-poll code depends on this behavior\n            if (*error == WSAENOTSOCK)\n            {\n                *error = os::SocketError::kInvalidHandle;\n            }\n\n            return kWaitStatusFailure;\n        }\n\n        int32_t resultCount = 0;\n        for (size_t i = 0; i < nfds && affected > 0; i++)\n        {\n            SOCKET fd = static_cast<SOCKET>(requests[i].fd);\n            if (fd == -1)\n                continue;\n\n            if ((requests[i].events & kPollFlagsIn) != 0 && FD_ISSET(fd, &rfds))\n            {\n                requests[i].revents |= kPollFlagsIn;\n                affected--;\n            }\n\n            if ((requests[i].events & kPollFlagsOut) != 0 && FD_ISSET(fd, &wfds))\n            {\n                requests[i].revents |= kPollFlagsOut;\n                affected--;\n            }\n\n            if (FD_ISSET(fd, &efds))\n            {\n                requests[i].revents |= kPollFlagsErr;\n                affected--;\n            }\n\n            if (requests[i].revents != kPollFlagsNone)\n                resultCount++;\n        }\n\n        *result = resultCount;\n        return kWaitStatusSuccess;\n    }\n\n    WaitStatus SocketImpl::Poll(std::vector<PollRequest>& requests, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        return Poll(requests, (int32_t)requests.size(), timeout, result, error);\n    }\n\n    WaitStatus SocketImpl::Poll(PollRequest& request, int32_t timeout, int32_t *result, int32_t *error)\n    {\n        std::vector<PollRequest> requests;\n        requests.push_back(request);\n        return Poll(requests, 1, timeout, result, error);\n    }\n\n    WaitStatus SocketImpl::SetSocketOption(SocketOptionLevel level, SocketOptionName name, int32_t value)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n        const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n        if (o_res == SKIP_OPTION)\n        {\n            return kWaitStatusSuccess;\n        }\n\n        if (o_res == INVALID_OPTION_NAME)\n        {\n            _saved_error = kWSAenoprotoopt;\n\n            return kWaitStatusFailure;\n        }\n\n        struct linger linger;\n\n        WaitStatus ret = kWaitStatusFailure;\n\n        switch (name)\n        {\n            case kSocketOptionNameDontLinger:\n                linger.l_onoff = !value;\n                linger.l_linger = 0;\n                ret = SetSocketOptionInternal(system_level, system_name, &linger, sizeof(linger));\n                break;\n\n            case kSocketOptionNameDontFragment:\n#ifdef IP_PMTUDISC_DO\n                // Fiddle with the value slightly if we're turning DF on\n                if (value == 1)\n                    value = IP_PMTUDISC_DO;\n#endif\n                ret = SetSocketOptionInternal(system_level, system_name, (char*)&value, sizeof(value));\n                break;\n\n            default:\n                ret = SetSocketOptionInternal(system_level, system_name, (char*)&value, sizeof(value));\n                break;\n        }\n\n        return ret;\n    }\n\n    WaitStatus SocketImpl::SetSocketOptionLinger(SocketOptionLevel level, SocketOptionName name, bool enabled, int32_t seconds)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n        const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n        if (o_res == SKIP_OPTION)\n        {\n            return kWaitStatusSuccess;\n        }\n\n        if (o_res == INVALID_OPTION_NAME)\n        {\n            _saved_error = kWSAenoprotoopt;\n\n            return kWaitStatusFailure;\n        }\n\n        struct linger linger;\n\n        linger.l_onoff = enabled;\n        linger.l_linger = seconds;\n\n        return SetSocketOptionInternal(system_level, system_name, &linger, sizeof(linger));\n    }\n\n    WaitStatus SocketImpl::SetSocketOptionArray(SocketOptionLevel level, SocketOptionName name, const uint8_t *buffer, int32_t length)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n        const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n        if (o_res == SKIP_OPTION)\n        {\n            return kWaitStatusSuccess;\n        }\n\n        if (o_res == INVALID_OPTION_NAME)\n        {\n            _saved_error = kWSAenoprotoopt;\n\n            return kWaitStatusFailure;\n        }\n\n        struct linger linger;\n\n        WaitStatus ret = kWaitStatusFailure;\n\n        switch (name)\n        {\n            case kSocketOptionNameDontLinger:\n                if (length == 1)\n                {\n                    linger.l_linger = 0;\n                    linger.l_onoff = (*((char*)buffer)) ? 0 : 1;\n\n                    ret = SetSocketOptionInternal(system_level, system_name, &linger, sizeof(linger));\n                }\n                else\n                {\n                    _saved_error = kWSAeinval;\n\n                    return kWaitStatusFailure;\n                }\n                break;\n\n            default:\n                ret = SetSocketOptionInternal(system_level, system_name, buffer, length);\n                break;\n        }\n\n        return ret;\n    }\n\n    WaitStatus SocketImpl::SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, uint32_t group_address, uint32_t local_address)\n    {\n        int32_t system_level = 0;\n        int32_t system_name = 0;\n\n        const int32_t o_res = level_and_name_to_system(level, name, &system_level, &system_name);\n\n        if (o_res == SKIP_OPTION)\n        {\n            return kWaitStatusSuccess;\n        }\n\n        if (o_res == INVALID_OPTION_NAME)\n        {\n            _saved_error = kWSAenoprotoopt;\n\n            return kWaitStatusFailure;\n        }\n\n        IP_MREQ mreq = {{0}};\n\n        mreq.imr_multiaddr.s_addr = group_address;\n        mreq.imr_interface.s_addr = local_address;\n\n        return SetSocketOptionInternal(system_level, system_name, &mreq, sizeof(mreq));\n\n        return kWaitStatusFailure;\n    }\n\n#if IL2CPP_SUPPORT_IPV6\n    WaitStatus SocketImpl::SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, IPv6Address ipv6, uint64_t interfaceOffset)\n    {\n        IL2CPP_VM_NOT_SUPPORTED(SocketImpl::SetSocketOptionMembership, \"We don't have IPv6 support on Windows yet.\");\n        return kWaitStatusFailure;\n    }\n\n#endif\n\n    WaitStatus SocketImpl::SetSocketOptionInternal(int32_t level, int32_t name, const void *value, int32_t len)\n    {\n        const void *real_val = value;\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int32_t ret = -1;\n\n        __try\n        {\n            ret = setsockopt(fd, level, name, (const char*)real_val, (socklen_t)len);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        if (ret == -1)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        return kWaitStatusSuccess;\n    }\n\n    int32_t WSAIoctlProtected(SOCKET s, DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)\n    {\n        __try\n        {\n            return WSAIoctl(s, dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, lpOverlapped, lpCompletionRoutine);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        return -1;\n    }\n\n    BOOL transmitFileProtected(LPFN_TRANSMITFILE transmitFile, SOCKET hSocket, HANDLE hFile, DWORD nNumberOfBytesToWrite, DWORD nNumberOfBytesPerSend, LPOVERLAPPED lpOverlapped, LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, DWORD dwReserved)\n    {\n        __try\n        {\n            return transmitFile(hSocket, hFile, nNumberOfBytesToWrite, nNumberOfBytesPerSend, lpOverlapped, lpTransmitBuffers, dwReserved);\n        }\n        __except (SocketExceptionFilter(GetExceptionCode()))\n        {\n        }\n\n        return FALSE;\n    }\n\n    WaitStatus SocketImpl::SendFile(const char *filename, TransmitFileBuffers *buffers, TransmitFileOptions options)\n    {\n        if (filename == NULL)\n            return kWaitStatusFailure;\n\n        const UTF16String wideFilename = utils::StringUtils::Utf8ToUtf16(filename);\n        HANDLE file = CreateFileW((LPCWSTR)wideFilename.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);\n\n        if (file == INVALID_HANDLE_VALUE)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        GUID transmitFileGuid = WSAID_TRANSMITFILE;\n        LPFN_TRANSMITFILE transmitFile;\n        DWORD copied;\n\n        SOCKET fd = (SOCKET)_fd;\n        if (fd == -1)\n        {\n            Error::SetLastError(il2cpp::os::kWSAeshutdown);\n            return kWaitStatusFailure;\n        }\n\n        int32_t ret = WSAIoctlProtected(fd, SIO_GET_EXTENSION_FUNCTION_POINTER, &transmitFileGuid, sizeof(transmitFileGuid), &transmitFile, sizeof(transmitFile), &copied, 0, 0);\n\n        if (ret == SOCKET_ERROR)\n        {\n            StoreLastError();\n\n            return kWaitStatusFailure;\n        }\n\n        if (!transmitFileProtected(transmitFile, fd, file, 0, 0, NULL, (TRANSMIT_FILE_BUFFERS*)&buffers, options))\n        {\n            StoreLastError();\n\n            CloseHandle(file);\n            return kWaitStatusFailure;\n        }\n\n        CloseHandle(file);\n\n        return kWaitStatusSuccess;\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/SocketImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include <string>\n#include <vector>\n#include <stdint.h>\n\n#include \"os/Socket.h\"\n#include \"os/ErrorCodes.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\nstruct sockaddr;\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class SocketImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n\n        /// Handle for socket. Must be large enough to hold a pointer.\n        typedef uint64_t SocketDescriptor;\n\n        SocketImpl(ThreadStatusCallback thread_status_callback);\n        ~SocketImpl();\n\n        inline SocketDescriptor GetDescriptor()\n        {\n            return _fd;\n        }\n\n        ErrorCode GetLastError() const;\n\n        WaitStatus Create(SocketDescriptor fd, int32_t family, int32_t type, int32_t protocol);\n        WaitStatus Create(AddressFamily family, SocketType type, ProtocolType protocol);\n\n        WaitStatus Close();\n        bool IsClosed() { return (_fd == -1); }\n\n        WaitStatus SetBlocking(bool blocking);\n\n        WaitStatus Listen(int32_t blacklog);\n\n        WaitStatus Bind(const char *path);\n        WaitStatus Bind(const char *address, uint16_t port);\n        WaitStatus Bind(uint32_t address, uint16_t port);\n        WaitStatus Bind(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port);\n\n        WaitStatus Connect(const char *path);\n        WaitStatus Connect(uint32_t address, uint16_t port);\n        WaitStatus Connect(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port);\n\n        WaitStatus Disconnect(bool reuse);\n        WaitStatus Shutdown(int32_t how);\n\n        WaitStatus GetLocalEndPointInfo(EndPointInfo &info);\n        WaitStatus GetRemoteEndPointInfo(EndPointInfo &info);\n\n        WaitStatus Receive(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus ReceiveFromInternal(const uint8_t *data, size_t count, int32_t flags, int32_t *len, struct sockaddr *from, int32_t *fromlen);\n\n        WaitStatus Send(const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n\n        WaitStatus SendArray(WSABuf *wsabufs, int32_t count, int32_t *sent, SocketFlags c_flags);\n        WaitStatus ReceiveArray(WSABuf *wsabufs, int32_t count, int32_t *len, SocketFlags c_flags);\n\n        WaitStatus SendTo(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus SendTo(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n        WaitStatus SendTo(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len);\n\n        WaitStatus RecvFrom(uint32_t address, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n        WaitStatus RecvFrom(const char *path, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n        WaitStatus RecvFrom(uint8_t address[ipv6AddressSize], uint32_t scope, uint16_t port, const uint8_t *data, int32_t count, os::SocketFlags flags, int32_t *len, os::EndPointInfo &ep);\n\n        WaitStatus Available(int32_t *amount);\n\n        WaitStatus Accept(os::Socket **socket);\n\n        WaitStatus Ioctl(int32_t command, const uint8_t *in_data, int32_t in_len, uint8_t *out_data, int32_t out_len, int32_t *written);\n\n        WaitStatus GetSocketOption(SocketOptionLevel level, SocketOptionName name, uint8_t *buffer, int32_t *length);\n        WaitStatus GetSocketOptionFull(SocketOptionLevel level, SocketOptionName name, int32_t *first, int32_t *second);\n\n        WaitStatus SetSocketOption(SocketOptionLevel level, SocketOptionName name, int32_t value);\n        WaitStatus SetSocketOptionLinger(SocketOptionLevel level, SocketOptionName name, bool enabled, int32_t seconds);\n        WaitStatus SetSocketOptionArray(SocketOptionLevel level, SocketOptionName name, const uint8_t *buffer, int32_t length);\n        WaitStatus SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, uint32_t group_address, uint32_t local_address);\n#if IL2CPP_SUPPORT_IPV6\n        WaitStatus SetSocketOptionMembership(SocketOptionLevel level, SocketOptionName name, IPv6Address ipv6, uint64_t interfaceOffset);\n#endif\n\n        WaitStatus SendFile(const char *filename, TransmitFileBuffers *buffers, TransmitFileOptions options);\n\n        static WaitStatus Poll(std::vector<PollRequest> &requests, int32_t count, int32_t timeout, int32_t *result, int32_t *error);\n        static WaitStatus Poll(std::vector<PollRequest> &requests, int32_t timeout, int32_t *result, int32_t *error);\n        static WaitStatus Poll(PollRequest& request, int32_t timeout, int32_t *result, int32_t *error);\n\n        static WaitStatus GetHostName(std::string &name);\n        static WaitStatus GetHostByName(const std::string &host, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list);\n        static WaitStatus GetHostByAddr(const std::string &address, std::string &name, std::vector<std::string> &aliases, std::vector<std::string> &addr_list);\n\n        static void Startup();\n        static void Cleanup();\n\n    private:\n\n        bool _is_valid;\n        SocketDescriptor _fd;\n        int32_t _domain;\n        int32_t _type;\n        int32_t _protocol;\n        ErrorCode _saved_error;\n        int32_t _still_readable;\n        ThreadStatusCallback _thread_status_callback;\n\n        void StoreLastError();\n        void StoreLastError(int32_t error_no);\n\n        WaitStatus ConnectInternal(struct sockaddr *sa, int32_t sa_size);\n        WaitStatus SetSocketOptionInternal(int32_t level, int32_t name, const void *value, int32_t len);\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/StackTrace.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"WindowsHeaders.h\"\n\n#include \"os/Mutex.h\"\n#include \"os/StackTrace.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    void StackTrace::WalkStack(WalkStackCallback callback, void* context, WalkOrder walkOrder)\n    {\n        const uint32_t kMaxFrames = 128;\n        void* stack[kMaxFrames];\n\n        size_t frames = CaptureStackBackTrace(0, kMaxFrames, stack, NULL);\n\n        if (walkOrder == WalkOrder::kFirstCalledToLastCalled)\n        {\n            for (size_t i = frames; i--;)\n            {\n                if (!callback(reinterpret_cast<Il2CppMethodPointer>(stack[i]), context))\n                    break;\n            }\n        }\n        else\n        {\n            for (size_t i = 0; i < frames; i++)\n            {\n                if (!callback(reinterpret_cast<Il2CppMethodPointer>(stack[i]), context))\n                    break;\n            }\n        }\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/ThreadImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if !IL2CPP_THREADS_STD && IL2CPP_THREADS_WIN32\n\n#include \"ThreadImpl.h\"\n#include \"os/Time.h\"\n#include \"WindowsHelpers.h\"\n#include \"il2cpp-vm-support.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    struct StartData\n    {\n        Thread::StartFunc m_StartFunc;\n        void* m_StartArg;\n        volatile DWORD* m_ThreadId;\n    };\n\n    static DWORD WINAPI ThreadStartWrapper(LPVOID arg)\n    {\n        StartData startData = *(StartData*)arg;\n        free(arg);\n        *startData.m_ThreadId = GetCurrentThreadId();\n        startData.m_StartFunc(startData.m_StartArg);\n        return 0;\n    }\n\n    ThreadImpl::ThreadImpl()\n        : m_ThreadHandle(0), m_ThreadId(0), m_StackSize(IL2CPP_DEFAULT_STACK_SIZE), m_ApartmentState(kApartmentStateUnknown), m_Priority(kThreadPriorityNormal)\n    {\n    }\n\n    ThreadImpl::~ThreadImpl()\n    {\n        if (m_ThreadHandle != NULL)\n            CloseHandle(m_ThreadHandle);\n    }\n\n    uint64_t ThreadImpl::Id()\n    {\n        return m_ThreadId;\n    }\n\n    void ThreadImpl::SetName(const std::string& name)\n    {\n        // http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx\n\n        const DWORD MS_VC_EXCEPTION = 0x406D1388;\n\n    #pragma pack(push,8)\n        typedef struct tagTHREADNAME_INFO\n        {\n            DWORD dwType; // Must be 0x1000.\n            LPCSTR szName; // Pointer to name (in user addr space).\n            DWORD dwThreadID; // Thread ID (-1=caller thread).\n            DWORD dwFlags; // Reserved for future use, must be zero.\n        } THREADNAME_INFO;\n    #pragma pack(pop)\n\n        THREADNAME_INFO info;\n        info.dwType = 0x1000;\n        info.szName = name.c_str();\n        info.dwThreadID = static_cast<DWORD>(Id());\n        info.dwFlags = 0;\n\n        __try\n        {\n            RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info);\n        }\n        __except (EXCEPTION_EXECUTE_HANDLER)\n        {\n        }\n    }\n\n    void ThreadImpl::SetPriority(ThreadPriority priority)\n    {\n        if (m_ThreadHandle == NULL)\n            m_Priority = priority;\n        else\n        {\n            int ret = ::SetThreadPriority(m_ThreadHandle, priority - 2);\n            IL2CPP_ASSERT(ret);\n        }\n    }\n\n    ThreadPriority ThreadImpl::GetPriority()\n    {\n        if (m_ThreadHandle == NULL)\n            return m_Priority;\n        int ret = ::GetThreadPriority(m_ThreadHandle) + 2;\n        IL2CPP_ASSERT(ret != THREAD_PRIORITY_ERROR_RETURN);\n        return (ThreadPriority)ret;\n    }\n\n    ErrorCode ThreadImpl::Run(Thread::StartFunc func, void* arg)\n    {\n        // It might happen that func will start executing and will try to access m_ThreadId before CreateThread gets a chance to assign it.\n        // Therefore m_ThreadId is assigned both by this thread and from the newly created thread (race condition could go the other way too).\n\n        StartData* startData = (StartData*)malloc(sizeof(StartData));\n        startData->m_StartFunc = func;\n        startData->m_StartArg = arg;\n        startData->m_ThreadId = &m_ThreadId;\n\n        // Create thread.\n        DWORD threadId;\n        HANDLE threadHandle = ::CreateThread(NULL, m_StackSize, &ThreadStartWrapper, startData, STACK_SIZE_PARAM_IS_A_RESERVATION, &threadId);\n\n        if (!threadHandle)\n            return kErrorCodeGenFailure;\n\n        m_ThreadHandle = threadHandle;\n        m_ThreadId = threadId;\n\n        return kErrorCodeSuccess;\n    }\n\n    void ThreadImpl::Sleep(uint32_t ms, bool interruptible)\n    {\n        uint32_t remainingWaitTime = ms;\n        while (true)\n        {\n            uint32_t startWaitTime = os::Time::GetTicksMillisecondsMonotonic();\n            DWORD sleepResult = ::SleepEx(remainingWaitTime, interruptible);\n\n            if (sleepResult == WAIT_IO_COMPLETION)\n            {\n                uint32_t waitedTime = os::Time::GetTicksMillisecondsMonotonic() - startWaitTime;\n                if (waitedTime >= remainingWaitTime)\n                    return;\n\n                remainingWaitTime -= waitedTime;\n                continue;\n            }\n\n            break;\n        }\n    }\n\n    void ThreadImpl::QueueUserAPC(Thread::APCFunc func, void* context)\n    {\n        ::QueueUserAPC(reinterpret_cast<PAPCFUNC>(func), m_ThreadHandle, reinterpret_cast<ULONG_PTR>(context));\n    }\n\nnamespace\n{\n    // It would be nice to always use CoGetApartmentType but it's only available on Windows 7 and later.\n    // That's why we check for function at runtime and do a fallback on Windows XP.\n    // CoGetApartmentType is always available in Windows Store Apps.\n\n    typedef HRESULT (STDAPICALLTYPE * CoGetApartmentTypeFunc)(APTTYPE* type, APTTYPEQUALIFIER* qualifier);\n\n    ApartmentState GetApartmentWindows7(CoGetApartmentTypeFunc coGetApartmentType, bool* implicit)\n    {\n        *implicit = false;\n\n        APTTYPE type;\n        APTTYPEQUALIFIER qualifier;\n        const HRESULT hr = coGetApartmentType(&type, &qualifier);\n        if (FAILED(hr))\n        {\n            IL2CPP_ASSERT(CO_E_NOTINITIALIZED == hr);\n            return kApartmentStateUnknown;\n        }\n\n        switch (type)\n        {\n            case APTTYPE_STA:\n            case APTTYPE_MAINSTA:\n                return kApartmentStateInSTA;\n\n            case APTTYPE_MTA:\n                *implicit = (APTTYPEQUALIFIER_IMPLICIT_MTA == qualifier);\n                return kApartmentStateInMTA;\n\n            case APTTYPE_NA:\n                switch (qualifier)\n                {\n                    case APTTYPEQUALIFIER_NA_ON_STA:\n                    case APTTYPEQUALIFIER_NA_ON_MAINSTA:\n                        return kApartmentStateInSTA;\n\n                    case APTTYPEQUALIFIER_NA_ON_MTA:\n                        return kApartmentStateInMTA;\n\n                    case APTTYPEQUALIFIER_NA_ON_IMPLICIT_MTA:\n                        *implicit = true;\n                        return kApartmentStateInMTA;\n                }\n                break;\n        }\n\n        IL2CPP_ASSERT(0 && \"CoGetApartmentType returned unexpected value.\");\n        return kApartmentStateUnknown;\n    }\n\n#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n\n    ApartmentState GetApartmentWindowsXp(bool* implicit)\n    {\n        *implicit = false;\n\n        IUnknown* context = nullptr;\n        HRESULT hr = CoGetContextToken(reinterpret_cast<ULONG_PTR*>(&context));\n        if (SUCCEEDED(hr))\n        {\n            IComThreadingInfo* info;\n            hr = context->QueryInterface(&info);\n            if (SUCCEEDED(hr))\n            {\n                THDTYPE type;\n                hr = info->GetCurrentThreadType(&type);\n                if (SUCCEEDED(hr))\n                {\n                    // THDTYPE_PROCESSMESSAGES means that we are in STA thread.\n                    // Otherwise it's an MTA thread. We are not sure at this moment if CoInitializeEx has been called explicitly on this thread\n                    // or if it has been implicitly made MTA by a CoInitialize call on another thread.\n                    if (THDTYPE_PROCESSMESSAGES == type)\n                        return kApartmentStateInSTA;\n\n                    // Assume implicit. Even if it's explicit, we'll handle the case correctly by checking CoInitializeEx return value.\n                    *implicit = true;\n                    return kApartmentStateInMTA;\n                }\n\n                info->Release();\n            }\n\n            // No need to release context.\n        }\n\n        return kApartmentStateUnknown;\n    }\n\n    class CoGetApartmentTypeHelper\n    {\n    private:\n        HMODULE _library;\n        CoGetApartmentTypeFunc _func;\n\n    public:\n        inline CoGetApartmentTypeHelper()\n        {\n            _library = LoadLibraryW(L\"ole32.dll\");\n            Assert(_library);\n            _func = reinterpret_cast<CoGetApartmentTypeFunc>(GetProcAddress(_library, \"CoGetApartmentType\"));\n        }\n\n        inline ~CoGetApartmentTypeHelper()\n        {\n            FreeLibrary(_library);\n        }\n\n        inline CoGetApartmentTypeFunc GetFunc() const { return _func; }\n    };\n\n    inline ApartmentState GetApartmentImpl(bool* implicit)\n    {\n        static CoGetApartmentTypeHelper coGetApartmentTypeHelper;\n        const CoGetApartmentTypeFunc func = coGetApartmentTypeHelper.GetFunc();\n        return func ? GetApartmentWindows7(func, implicit) : GetApartmentWindowsXp(implicit);\n    }\n\n#else\n\n    inline ApartmentState GetApartmentImpl(bool* implicit)\n    {\n        return GetApartmentWindows7(CoGetApartmentType, implicit);\n    }\n\n#endif\n}\n\n    ApartmentState ThreadImpl::GetApartment()\n    {\n        Assert(GetCurrentThreadId() == m_ThreadId);\n\n        ApartmentState state = static_cast<ApartmentState>(m_ApartmentState & ~kApartmentStateCoInitialized);\n\n        if (kApartmentStateUnknown == state)\n        {\n            bool implicit;\n            state = GetApartmentImpl(&implicit);\n            if (!implicit)\n                m_ApartmentState = state;\n        }\n\n        return state;\n    }\n\n    ApartmentState ThreadImpl::GetExplicitApartment()\n    {\n        return static_cast<ApartmentState>(m_ApartmentState & ~kApartmentStateCoInitialized);\n    }\n\n    ApartmentState ThreadImpl::SetApartment(ApartmentState state)\n    {\n        Assert(GetCurrentThreadId() == m_ThreadId);\n\n        // Unknown state uninitializes COM.\n        if (kApartmentStateUnknown == state)\n        {\n            if (m_ApartmentState & kApartmentStateCoInitialized)\n            {\n                CoUninitialize();\n                m_ApartmentState = kApartmentStateUnknown;\n            }\n\n            return GetApartment();\n        }\n\n        // Initialize apartment state. Ignore result of this function because it will return MTA value for both implicit and explicit apartment.\n        // On the other hand m_ApartmentState will only be set to MTA if it was initialized explicitly with CoInitializeEx.\n        GetApartment();\n\n        ApartmentState currentState = static_cast<ApartmentState>(m_ApartmentState & ~kApartmentStateCoInitialized);\n\n        if (kApartmentStateUnknown != currentState)\n        {\n            Assert(state == currentState);\n            return currentState;\n        }\n\n#if IL2CPP_TARGET_XBOXONE\n        if (state == kApartmentStateInSTA)\n        {\n            // Only assert in debug.. we wouldn't want to bring down the application in Release config\n            IL2CPP_ASSERT(false && \"STA apartment state is not supported on Xbox One\");\n            state = kApartmentStateInMTA;\n        }\n#endif\n\n        HRESULT hr = CoInitializeEx(nullptr, (kApartmentStateInSTA == state) ? COINIT_APARTMENTTHREADED : COINIT_MULTITHREADED);\n        if (SUCCEEDED(hr))\n        {\n            m_ApartmentState = state;\n            if (S_OK == hr)\n                m_ApartmentState = static_cast<ApartmentState>(m_ApartmentState | kApartmentStateCoInitialized);\n            else\n                CoUninitialize(); // Someone has already called correct CoInitialize. Don't leave incorrect reference count.\n        }\n        else if (RPC_E_CHANGED_MODE == hr)\n        {\n            // CoInitialize has already been called with a different apartment state.\n            m_ApartmentState = (kApartmentStateInSTA == state) ? kApartmentStateInMTA : kApartmentStateInSTA;\n        }\n        else\n        {\n            IL2CPP_VM_RAISE_COM_EXCEPTION(hr, true);\n        }\n\n        return GetApartment();\n    }\n\n    void ThreadImpl::SetExplicitApartment(ApartmentState state)\n    {\n        Assert(!(m_ApartmentState & kApartmentStateCoInitialized));\n        m_ApartmentState = state;\n    }\n\n    uint64_t ThreadImpl::CurrentThreadId()\n    {\n        return GetCurrentThreadId();\n    }\n\n    ThreadImpl* ThreadImpl::CreateForCurrentThread()\n    {\n        ThreadImpl* thread = new ThreadImpl();\n        BOOL duplicateResult = DuplicateHandle(::GetCurrentProcess(), ::GetCurrentThread(), ::GetCurrentProcess(), &thread->m_ThreadHandle, 0, FALSE, DUPLICATE_SAME_ACCESS);\n        Assert(duplicateResult && \"DuplicateHandle failed.\");\n        thread->m_ThreadId = ::GetCurrentThreadId();\n        return thread;\n    }\n\n#if NET_4_0\n\n    bool ThreadImpl::YieldInternal()\n    {\n        return SwitchToThread();\n    }\n\n#endif\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/ThreadImpl.h",
    "content": "#pragma once\n\n#if !IL2CPP_THREADS_STD && IL2CPP_THREADS_WIN32\n\n#include \"os/ErrorCodes.h\"\n#include \"os/Thread.h\"\n#include \"os/WaitStatus.h\"\n#include \"utils/NonCopyable.h\"\n\n#include \"WindowsHeaders.h\"\n\n#define IL2CPP_DEFAULT_STACK_SIZE ( 1 * 1024 * 1024)            // default .NET stacksize is 1mb\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class ThreadImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n        ThreadImpl();\n        ~ThreadImpl();\n\n        uint64_t Id();\n        ErrorCode Run(Thread::StartFunc func, void* arg);\n        void SetName(const std::string& name);\n        void SetPriority(ThreadPriority priority);\n        ThreadPriority GetPriority();\n\n        void SetStackSize(size_t newsize)\n        {\n            // only makes sense if it's called BEFORE the thread has been created\n            IL2CPP_ASSERT(m_ThreadHandle == NULL);\n            // if newsize is zero we use the per-platform default value for size of stack\n            if (newsize == 0)\n            {\n                newsize = IL2CPP_DEFAULT_STACK_SIZE;\n            }\n            m_StackSize = newsize;\n        }\n\n        void QueueUserAPC(Thread::APCFunc func, void* context);\n\n        ApartmentState GetApartment();\n        ApartmentState GetExplicitApartment();\n        ApartmentState SetApartment(ApartmentState state);\n        void SetExplicitApartment(ApartmentState state);\n\n        static void Sleep(uint32_t ms, bool interruptible);\n        static uint64_t CurrentThreadId();\n        static ThreadImpl* CreateForCurrentThread();\n\n#if NET_4_0\n        static bool YieldInternal();\n#endif\n\n    private:\n        HANDLE m_ThreadHandle;\n        volatile DWORD m_ThreadId;\n        SIZE_T m_StackSize;\n        ApartmentState m_ApartmentState;\n        ThreadPriority m_Priority;\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/ThreadLocalValueImpl.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_THREADS_WIN32\n\n#include \"ThreadLocalValueImpl.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    ThreadLocalValueImpl::ThreadLocalValueImpl()\n    {\n        m_Index = TlsAlloc();\n\n        IL2CPP_ASSERT(m_Index != TLS_OUT_OF_INDEXES);\n    }\n\n    ThreadLocalValueImpl::~ThreadLocalValueImpl()\n    {\n        IL2CPP_ASSERT(TlsFree(m_Index));\n    }\n\n    ErrorCode ThreadLocalValueImpl::SetValue(void* value)\n    {\n        if (TlsSetValue(m_Index, value) == FALSE)\n            return static_cast<ErrorCode>(GetLastError());\n\n        return kErrorCodeSuccess;\n    }\n\n    ErrorCode ThreadLocalValueImpl::GetValue(void** value)\n    {\n        *value = TlsGetValue(m_Index);\n        if (*value)\n            return kErrorCodeSuccess;\n\n        DWORD lastError = GetLastError();\n        if (lastError == ERROR_SUCCESS)\n            return kErrorCodeSuccess;\n\n        return static_cast<ErrorCode>(lastError);\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/ThreadLocalValueImpl.h",
    "content": "#pragma once\n\n#if IL2CPP_THREADS_WIN32\n\n#include \"os/ErrorCodes.h\"\n#include \"utils/NonCopyable.h\"\n\n#include \"WindowsHelpers.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class ThreadLocalValueImpl : public il2cpp::utils::NonCopyable\n    {\n    public:\n        ThreadLocalValueImpl();\n        ~ThreadLocalValueImpl();\n        ErrorCode SetValue(void* value);\n        ErrorCode GetValue(void** value);\n    private:\n        DWORD m_Index;\n    };\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/Time.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"os/Time.h\"\n#include \"os/Win32/WindowsHeaders.h\"\n#include \"utils/MathUtils.h\"\n\n#define MTICKS_PER_SEC 10000000LL\n\nnamespace il2cpp\n{\nnamespace os\n{\n    static LARGE_INTEGER s_PerformanceCounterFrequency;\n\n    static inline void InitializePerformanceCounterFrequency()\n    {\n        if (!s_PerformanceCounterFrequency.QuadPart)\n        {\n            // From MSDN: On systems that run Windows XP or later, the function will always succeed and will thus never return zero.\n            // so I'll just assume we never run on older than XP\n\n            BOOL qpfResult = QueryPerformanceFrequency(&s_PerformanceCounterFrequency);\n            IL2CPP_ASSERT(qpfResult != FALSE);\n        }\n    }\n\n    uint32_t Time::GetTicksMillisecondsMonotonic()\n    {\n        InitializePerformanceCounterFrequency();\n\n        LARGE_INTEGER value;\n        QueryPerformanceCounter(&value);\n        return static_cast<uint32_t>(value.QuadPart * 1000 / s_PerformanceCounterFrequency.QuadPart);\n    }\n\n    int64_t Time::GetTicks100NanosecondsMonotonic()\n    {\n        InitializePerformanceCounterFrequency();\n\n        LARGE_INTEGER value;\n        QueryPerformanceCounter(&value);\n        return utils::MathUtils::A_Times_B_DividedBy_C(value.QuadPart, MTICKS_PER_SEC, s_PerformanceCounterFrequency.QuadPart);\n    }\n\n/*\n * Magic number to convert FILETIME base Jan 1, 1601 to DateTime - base Jan, 1, 0001\n */\n    const uint64_t FILETIME_ADJUST = ((uint64_t)504911232000000000LL);\n\n    int64_t Time::GetTicks100NanosecondsDateTime()\n    {\n        ULARGE_INTEGER ft;\n\n        IL2CPP_ASSERT(sizeof(ft) == sizeof(FILETIME));\n\n        ::GetSystemTimeAsFileTime((FILETIME*)&ft);\n        return FILETIME_ADJUST + ft.QuadPart;\n    }\n\n    int64_t Time::GetSystemTimeAsFileTime()\n    {\n        int64_t fileTime;\n        ::GetSystemTimeAsFileTime(reinterpret_cast<FILETIME*>(&fileTime));\n        return fileTime;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/TimeZone.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"os/TimeZone.h\"\n#include \"os/Win32/WindowsHeaders.h\"\n\n/*\n * Magic number to convert FILETIME base Jan 1, 1601 to DateTime - base Jan, 1, 0001\n */\nconst uint64_t FILETIME_ADJUST = ((uint64_t)504911232000000000LL);\n\nnamespace il2cpp\n{\nnamespace os\n{\n    static void\n    convert_to_absolute_date(SYSTEMTIME *date)\n    {\n#define IS_LEAP(y) ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0))\n        static int days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};\n        static int leap_days_in_month[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};\n        /* from the calendar FAQ */\n        int a = (14 - date->wMonth) / 12;\n        int y = date->wYear - a;\n        int m = date->wMonth + 12 * a - 2;\n        int d = (1 + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12) % 7;\n\n        /* d is now the day of the week for the first of the month (0 == Sunday) */\n\n        int day_of_week = date->wDayOfWeek;\n\n        /* set day_in_month to the first day in the month which falls on day_of_week */\n        int day_in_month = 1 + (day_of_week - d);\n        if (day_in_month <= 0)\n            day_in_month += 7;\n\n        /* wDay is 1 for first weekday in month, 2 for 2nd ... 5 means last - so work that out allowing for days in the month */\n        date->wDay = day_in_month + (date->wDay - 1) * 7;\n        if (date->wDay > (IS_LEAP(date->wYear) ? leap_days_in_month[date->wMonth - 1] : days_in_month[date->wMonth - 1]))\n            date->wDay -= 7;\n    }\n\n// names[0] - standardName\n// names[1] - daylightName\n    bool TimeZone::GetTimeZoneData(int32_t year, int64_t data[4], std::string names[2])\n    {\n        TIME_ZONE_INFORMATION tz_info;\n        FILETIME ft;\n        int err, tz_id;\n        // TODO: Get proper unicode conversion routines\n        char daylightName[33] = {0};\n        char standardName[33] = {0};\n\n        tz_id = GetTimeZoneInformation(&tz_info);\n        if (tz_id == TIME_ZONE_ID_INVALID)\n            return 0;\n\n        const int kMaxUtf8NameLength = 64;\n        names[0].resize(kMaxUtf8NameLength);\n        names[1].resize(kMaxUtf8NameLength);\n\n        // WideCharToMultiByte returns the number of bytes written to the buffer pointed to by lpMultiByteStr if successful.\n        // WideCharToMultiByte does not null-terminate an output string if the input string length is explicitly specified without a terminating null character.\n        // In our case, input string is null terminated\n        int standardNameLength = WideCharToMultiByte(CP_UTF8, 0, tz_info.StandardName, -1, &names[0][0], kMaxUtf8NameLength, NULL, NULL);\n        names[0].resize(standardNameLength - 1);\n\n        int daylightNameLength = WideCharToMultiByte(CP_UTF8, 0, tz_info.DaylightName, -1, &names[1][0], kMaxUtf8NameLength, NULL, NULL);\n        names[1].resize(daylightNameLength - 1);\n\n        if ((year <= 1601) || (year > 30827))\n        {\n            /*\n             * According to MSDN, the MS time functions can't handle dates outside\n             * this interval.\n             */\n            return 1;\n        }\n\n        /* even if the timezone has no daylight savings it may have Bias (e.g. GMT+13 it seems) */\n        if (tz_id != TIME_ZONE_ID_UNKNOWN)\n        {\n            tz_info.StandardDate.wYear = year;\n            convert_to_absolute_date(&tz_info.StandardDate);\n            err = SystemTimeToFileTime(&tz_info.StandardDate, &ft);\n            //g_IL2CPP_ASSERT(err);\n            if (err == 0)\n                return 0;\n\n            data[1] = FILETIME_ADJUST + (((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime);\n            tz_info.DaylightDate.wYear = year;\n            convert_to_absolute_date(&tz_info.DaylightDate);\n            err = SystemTimeToFileTime(&tz_info.DaylightDate, &ft);\n\n            if (err == 0)\n                return 0;\n\n            data[0] = FILETIME_ADJUST + (((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime);\n        }\n        data[2] = (tz_info.Bias + tz_info.StandardBias) * -600000000LL;\n        data[3] = (tz_info.DaylightBias - tz_info.StandardBias) * -600000000LL;\n\n        return 1;\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/WindowsHeaders.h",
    "content": "#pragma once\n\n#if IL2CPP_TARGET_WINDOWS\n\n#define NOMINMAX\n#define WIN32_LEAN_AND_MEAN 1\n#define INC_OLE2 1\n#include <Windows.h>\n\n#if !IL2CPP_TARGET_WINDOWS_DESKTOP\n#include <bcrypt.h>\n#include <roapi.h>\n#include <robuffer.h>\n#include <winstring.h>\n#endif\n\n#define LINK_TO_WINDOWSRUNTIME_LIBS (!IL2CPP_TARGET_WINDOWS_DESKTOP)\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/WindowsHelpers.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"WindowsHelpers.h\"\n#include \"os/Time.h\"\n\n#if IL2CPP_TARGET_WINDOWS\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace win\n{\n    WaitStatus WaitForSingleObjectAndAccountForAPCs(HANDLE handle, uint32_t ms, bool interruptible)\n    {\n        uint32_t remainingWaitTimeMS = ms;\n        while (true)\n        {\n            uint32_t waitStartTime = os::Time::GetTicksMillisecondsMonotonic();\n            DWORD result = ::WaitForSingleObjectEx(handle, remainingWaitTimeMS, interruptible);\n\n            if (result == WAIT_OBJECT_0)\n                return kWaitStatusSuccess;\n\n            if (result == WAIT_TIMEOUT)\n                return kWaitStatusTimeout;\n\n            if (result == WAIT_IO_COMPLETION)\n            {\n                if (ms != INFINITE)\n                {\n                    uint32_t haveWaitedTimeMS = os::Time::GetTicksMillisecondsMonotonic() - waitStartTime;\n                    if (haveWaitedTimeMS >= remainingWaitTimeMS)\n                        return kWaitStatusTimeout;\n                    remainingWaitTimeMS -= haveWaitedTimeMS;\n                }\n                continue;\n            }\n\n            break;\n        }\n\n        return kWaitStatusFailure;\n    }\n}\n}\n}\n\n#endif // IL2CPP_TARGET_WINDOWS\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/WindowsHelpers.h",
    "content": "#pragma once\n\n#if IL2CPP_TARGET_WINDOWS\n\n#include \"WindowsHeaders.h\"\n#include \"os/WaitStatus.h\"\n\n#if IL2CPP_TARGET_WINRT\n#include \"os/WinRT/Win32ApiWinRTEmulation.h\"\n#endif\n\n#if IL2CPP_TARGET_XBOXONE\n#include \"os/XboxOne/Win32ApiXboxEmulation.h\"\n#endif\n\n#if IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE\n#include \"os/WinRT/Win32ApiSharedEmulation.h\"\n#endif\n\nnamespace il2cpp\n{\nnamespace os\n{\nnamespace win\n{\n// Wait for a release of the given handle in way that can be interrupted by APCs.\n    WaitStatus WaitForSingleObjectAndAccountForAPCs(HANDLE handle, uint32_t ms, bool interruptible);\n}\n}\n}\n\n#endif // IL2CPP_TARGET_WINDOWS\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/Win32/WindowsRuntime.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"il2cpp-string-types.h\"\n#include \"il2cpp-vm-support.h\"\n#include \"os/WindowsRuntime.h\"\n#include \"utils/Il2CppHStringReference.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Array.h\"\n#include \"vm/CCW.h\"\n#include \"vm/Exception.h\"\n#include \"vm/String.h\"\n#include \"WindowsHeaders.h\"\n\n#if IL2CPP_TARGET_WINDOWS && !IL2CPP_USE_GENERIC_WINDOWSRUNTIME\n\n#if LINK_TO_WINDOWSRUNTIME_LIBS\n#include <roerrorapi.h>\n#else\n\ntypedef enum\n{\n    RO_ERROR_REPORTING_NONE = 0x00000000,\n    RO_ERROR_REPORTING_SUPPRESSEXCEPTIONS = 0x00000001,\n    RO_ERROR_REPORTING_FORCEEXCEPTIONS = 0x00000002,\n    RO_ERROR_REPORTING_USESETERRORINFO = 0x00000004,\n    RO_ERROR_REPORTING_SUPPRESSSETERRORINFO = 0x00000008,\n} RO_ERROR_REPORTING_FLAGS;\n\n#endif\n\nnamespace il2cpp\n{\nnamespace os\n{\n#if !LINK_TO_WINDOWSRUNTIME_LIBS\n    template<typename FunctionType>\n    FunctionType ResolveAPI(const wchar_t* moduleName, const char* functionName)\n    {\n        HMODULE module = GetModuleHandleW(moduleName);\n\n        if (module == NULL)\n            return NULL;\n\n        return reinterpret_cast<FunctionType>(GetProcAddress(module, functionName));\n    }\n\n#endif\n\n    il2cpp_hresult_t WindowsRuntime::GetActivationFactory(Il2CppHString className, Il2CppIActivationFactory** activationFactory)\n    {\n        IL2CPP_ASSERT(className != NULL);\n        IL2CPP_ASSERT(activationFactory != NULL);\n\n#if LINK_TO_WINDOWSRUNTIME_LIBS\n        return RoGetActivationFactory(reinterpret_cast<HSTRING>(className), reinterpret_cast<const IID&>(Il2CppIActivationFactory::IID), reinterpret_cast<void**>(activationFactory));\n#else\n        typedef HRESULT(WINAPI* RoGetActivationFactoryFunc)(void* activatableClassId, const Il2CppGuid& iid, Il2CppIActivationFactory** factory);\n        static RoGetActivationFactoryFunc RoGetActivationFactory = NULL;\n\n        if (RoGetActivationFactory == NULL)\n        {\n            RoGetActivationFactory = ResolveAPI<RoGetActivationFactoryFunc>(L\"api-ms-win-core-winrt-l1-1-0.dll\", \"RoGetActivationFactory\");\n\n            if (RoGetActivationFactory == NULL)\n                return IL2CPP_REGDB_E_CLASSNOTREG;\n        }\n\n        return RoGetActivationFactory(className, Il2CppIActivationFactory::IID, activationFactory);\n#endif\n    }\n\n    il2cpp_hresult_t WindowsRuntime::CreateHStringReference(const utils::StringView<Il2CppNativeChar>& str, Il2CppHStringHeader* header, Il2CppHString* hstring)\n    {\n        IL2CPP_ASSERT(header != NULL);\n        IL2CPP_ASSERT(hstring != NULL);\n\n        if (str.Length() == 0)\n        {\n            *hstring = NULL;\n            return S_OK;\n        }\n\n#if LINK_TO_WINDOWSRUNTIME_LIBS\n        return WindowsCreateStringReference(str.Str(), static_cast<uint32_t>(str.Length()), reinterpret_cast<HSTRING_HEADER*>(header), reinterpret_cast<HSTRING*>(hstring));\n#else\n        typedef HRESULT(STDAPICALLTYPE * WindowsCreateStringReferenceFunc)(const wchar_t* sourceString, uint32_t length, Il2CppHStringHeader* hstringHeader, Il2CppHString* hstring);\n        static WindowsCreateStringReferenceFunc WindowsCreateStringReference = NULL;\n\n        if (WindowsCreateStringReference == NULL)\n        {\n            WindowsCreateStringReference = ResolveAPI<WindowsCreateStringReferenceFunc>(L\"api-ms-win-core-winrt-string-l1-1-0.dll\", \"WindowsCreateStringReference\");\n\n            if (WindowsCreateStringReference == NULL)\n                return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n        }\n\n        return WindowsCreateStringReference(str.Str(), static_cast<uint32_t>(str.Length()), header, hstring);\n#endif\n    }\n\n    il2cpp_hresult_t WindowsRuntime::CreateHString(const utils::StringView<Il2CppChar>& str, Il2CppHString* hstring)\n    {\n        IL2CPP_ASSERT(str.Str() != NULL || str.Length() == 0);\n\n        if (str.Length() == 0)\n        {\n            *hstring = NULL;\n            return S_OK;\n        }\n\n#if LINK_TO_WINDOWSRUNTIME_LIBS\n        return WindowsCreateString(str.Str(), static_cast<uint32_t>(str.Length()), reinterpret_cast<HSTRING*>(hstring));\n#else\n        typedef il2cpp_hresult_t (STDAPICALLTYPE * WindowsCreateStringFunc)(const wchar_t* sourceString, uint32_t length, Il2CppHString* hstring);\n        static WindowsCreateStringFunc WindowsCreateString = NULL;\n\n        if (WindowsCreateString == NULL)\n        {\n            WindowsCreateString = ResolveAPI<WindowsCreateStringFunc>(L\"api-ms-win-core-winrt-string-l1-1-0.dll\", \"WindowsCreateString\");\n\n            if (WindowsCreateString == NULL)\n                return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n        }\n\n        return WindowsCreateString(str.Str(), static_cast<uint32_t>(str.Length()), hstring);\n#endif\n    }\n\n    il2cpp_hresult_t WindowsRuntime::DeleteHString(Il2CppHString hstring)\n    {\n        if (hstring == NULL)\n            return IL2CPP_S_OK;\n\n#if LINK_TO_WINDOWSRUNTIME_LIBS\n        return WindowsDeleteString(reinterpret_cast<HSTRING>(hstring));\n#else\n        typedef il2cpp_hresult_t (STDAPICALLTYPE * WindowsDeleteStringFunc)(Il2CppHString hstring);\n        static WindowsDeleteStringFunc WindowsDeleteString = NULL;\n\n        if (WindowsDeleteString == NULL)\n        {\n            WindowsDeleteString = ResolveAPI<WindowsDeleteStringFunc>(L\"api-ms-win-core-winrt-string-l1-1-0.dll\", \"WindowsDeleteString\");\n\n            if (WindowsDeleteString == NULL)\n                return IL2CPP_COR_E_PLATFORMNOTSUPPORTED;\n        }\n\n        return WindowsDeleteString(hstring);\n#endif\n    }\n\n    const Il2CppChar* WindowsRuntime::GetHStringBuffer(Il2CppHString hstring, uint32_t* length)\n    {\n#if LINK_TO_WINDOWSRUNTIME_LIBS\n        return WindowsGetStringRawBuffer(reinterpret_cast<HSTRING>(hstring), length);\n#else\n        typedef const wchar_t* (STDAPICALLTYPE * WindowsGetStringRawBufferFunc)(Il2CppHString hstring, uint32_t* length);\n        static WindowsGetStringRawBufferFunc WindowsGetStringRawBuffer = NULL;\n\n        if (WindowsGetStringRawBuffer == NULL)\n        {\n            WindowsGetStringRawBuffer = ResolveAPI<WindowsGetStringRawBufferFunc>(L\"api-ms-win-core-winrt-string-l1-1-0.dll\", \"WindowsGetStringRawBuffer\");\n\n            if (WindowsGetStringRawBuffer == NULL)\n                IL2CPP_VM_NOT_SUPPORTED(GetHStringBuffer, \"Marshaling HSTRINGs is not supported on current platform.\");\n        }\n\n        return WindowsGetStringRawBuffer(hstring, length);\n#endif\n    }\n\n    Il2CppString* WindowsRuntime::HStringToManagedString(Il2CppHString hstring)\n    {\n        if (hstring == NULL)\n            return IL2CPP_VM_STRING_EMPTY();\n\n        uint32_t length;\n        const wchar_t* ptr = GetHStringBuffer(hstring, &length);\n        return IL2CPP_VM_STRING_NEW_UTF16(ptr, length);\n    }\n\n    Il2CppIRestrictedErrorInfo* WindowsRuntime::GetRestrictedErrorInfo()\n    {\n        Il2CppIRestrictedErrorInfo* errorInfo;\n        HRESULT hr;\n\n#if LINK_TO_WINDOWSRUNTIME_LIBS\n        hr = ::GetRestrictedErrorInfo(reinterpret_cast<IRestrictedErrorInfo**>(&errorInfo));\n#else\n        typedef HRESULT (STDAPICALLTYPE * GetRestrictedErrorInfoFunc)(Il2CppIRestrictedErrorInfo** ppRestrictedErrorInfo);\n        static GetRestrictedErrorInfoFunc getRestrictedErrorInfo = NULL;\n\n        if (getRestrictedErrorInfo == NULL)\n        {\n            getRestrictedErrorInfo = ResolveAPI<GetRestrictedErrorInfoFunc>(L\"api-ms-win-core-winrt-error-l1-1-1.dll\", \"GetRestrictedErrorInfo\");\n\n            if (getRestrictedErrorInfo == NULL)\n                return NULL;\n        }\n\n        hr = getRestrictedErrorInfo(&errorInfo);\n#endif\n\n        if (FAILED(hr))\n            return NULL;\n\n        return errorInfo;\n    }\n\n// Fallback path for desktop in case we're running on below Windows 8.1\n// Also used for Xbox One as it has no RoOriginateLanguageException\n    static inline void OriginateErrorNoLanguageException(Il2CppException* ex, Il2CppHString message)\n    {\n#if !LINK_TO_WINDOWSRUNTIME_LIBS\n        typedef BOOL(STDAPICALLTYPE * RoOriginateErrorFunc)(il2cpp_hresult_t error, Il2CppHString message);\n        static RoOriginateErrorFunc RoOriginateError = NULL;\n\n        if (RoOriginateError == NULL)\n        {\n            RoOriginateError = ResolveAPI<RoOriginateErrorFunc>(L\"api-ms-win-core-winrt-error-l1-1-0.dll\", \"RoOriginateError\");\n\n            if (RoOriginateError == NULL)\n            {\n                // We're running on Win7 or below. Give up.\n                return;\n            }\n        }\n\n        RoOriginateError(ex->hresult, message);\n#else\n        RoOriginateError(ex->hresult, reinterpret_cast<HSTRING>(message));\n#endif\n    }\n\n#if !IL2CPP_TARGET_XBOXONE\n\n    inline void OriginateLanguageExceptionWithFallback(Il2CppException* ex, Il2CppHString message)\n    {\n#if !LINK_TO_WINDOWSRUNTIME_LIBS\n        typedef BOOL(STDAPICALLTYPE * RoOriginateLanguageExceptionFunc)(il2cpp_hresult_t error, Il2CppHString message, Il2CppIUnknown* languageException);\n        static RoOriginateLanguageExceptionFunc RoOriginateLanguageException = NULL;\n\n        if (RoOriginateLanguageException == NULL)\n        {\n            RoOriginateLanguageException = ResolveAPI<RoOriginateLanguageExceptionFunc>(L\"api-ms-win-core-winrt-error-l1-1-1.dll\", \"RoOriginateLanguageException\");\n\n            if (RoOriginateLanguageException == NULL)\n            {\n                // We're running on Win8 or below. Fallback to RoOriginateError\n                OriginateErrorNoLanguageException(ex, message);\n                return;\n            }\n        }\n#endif\n\n        Il2CppIUnknown* exceptionCCW = IL2CPP_VM_GET_CREATE_CCW_EXCEPTION(ex);\n\n#if LINK_TO_WINDOWSRUNTIME_LIBS\n        RoOriginateLanguageException(ex->hresult, reinterpret_cast<HSTRING>(static_cast<Il2CppHString>(message)), reinterpret_cast<IUnknown*>(exceptionCCW));\n#else\n        RoOriginateLanguageException(ex->hresult, message, exceptionCCW);\n#endif\n\n        exceptionCCW->Release();\n    }\n\n#endif // !IL2CPP_TARGET_XBOXONE\n\n    void WindowsRuntime::OriginateLanguageException(Il2CppException* ex, Il2CppString* exceptionString)\n    {\n        utils::StringView<Il2CppNativeChar> message(utils::StringUtils::GetChars(exceptionString), utils::StringUtils::GetLength(exceptionString));\n        utils::Il2CppHStringReference messageHString(message);\n\n#if IL2CPP_TARGET_XBOXONE\n        OriginateErrorNoLanguageException(ex, messageHString);\n#else\n        OriginateLanguageExceptionWithFallback(ex, messageHString);\n#endif\n    }\n\n    void WindowsRuntime::EnableErrorReporting()\n    {\n#if !LINK_TO_WINDOWSRUNTIME_LIBS\n        typedef il2cpp_hresult_t (STDCALL * RoSetErrorReportingFlagsFunc)(uint32_t flags);\n        static RoSetErrorReportingFlagsFunc RoSetErrorReportingFlags = NULL;\n\n        if (RoSetErrorReportingFlags == NULL)\n        {\n            RoSetErrorReportingFlags = ResolveAPI<RoSetErrorReportingFlagsFunc>(L\"api-ms-win-core-winrt-error-l1-1-0.dll\", \"RoSetErrorReportingFlags\");\n\n            // We're running on Win7 or below. Do nothing\n            if (RoSetErrorReportingFlags == NULL)\n                return;\n        }\n#endif\n\n        il2cpp_hresult_t hr = RoSetErrorReportingFlags(RO_ERROR_REPORTING_USESETERRORINFO);\n        IL2CPP_ASSERT(IL2CPP_HR_SUCCEEDED(hr) && \"RoSetErrorReportingFlags failed\");\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WinRT/Cryptography.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE\n\n#include \"os/Win32/WindowsHeaders.h\"\n#include \"os/Cryptography.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n// This has to be non-null value because the return value of NULL from GetCryptographyProvider means it failed\n    void* const kCryptographyProvider = reinterpret_cast<void*>(0x12345678);\n\n    void* Cryptography::GetCryptographyProvider()\n    {\n        return kCryptographyProvider;\n    }\n\n    bool Cryptography::OpenCryptographyProvider()\n    {\n        return true;\n    }\n\n    void Cryptography::ReleaseCryptographyProvider(void* provider)\n    {\n        // Do nothing, since we never allocated it\n    }\n\n    bool Cryptography::FillBufferWithRandomBytes(void* provider, uint32_t length, unsigned char* data)\n    {\n        NO_UNUSED_WARNING(provider);\n        return SUCCEEDED(BCryptGenRandom(NULL, data, length, BCRYPT_USE_SYSTEM_PREFERRED_RNG));\n    }\n}\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WinRT/Environment.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE\n\n#include \"il2cpp-vm-support.h\"\n#include \"os\\Environment.h\"\n#include \"os\\Win32\\WindowsHelpers.h\"\n#include \"utils\\StringUtils.h\"\n#include \"vm\\Exception.h\"\n\n#include <windows.storage.h>\n#include <wrl.h>\n\nusing namespace ABI::Windows::Storage;\nusing namespace Microsoft::WRL;\nusing namespace Microsoft::WRL::Wrappers;\n\nnamespace il2cpp\n{\n    using namespace vm;\n\nnamespace os\n{\n#define CSIDL_DESKTOP                   0x0000        // <desktop>\n#define CSIDL_PROGRAMS                  0x0002        // Start Menu\\Programs\n#define CSIDL_PERSONAL                  0x0005        // My Documents\n#define CSIDL_FAVORITES                 0x0006        // <user name>\\Favorites\n#define CSIDL_STARTUP                   0x0007        // Start Menu\\Programs\\Startup\n#define CSIDL_RECENT                    0x0008        // <user name>\\Recent\n#define CSIDL_SENDTO                    0x0009        // <user name>\\SendTo\n#define CSIDL_STARTMENU                 0x000b        // <user name>\\Start Menu\n#define CSIDL_MYMUSIC                   0x000d        // \"My Music\" folder\n#define CSIDL_MYVIDEO                   0x000e        // \"My Videos\" folder\n#define CSIDL_DESKTOPDIRECTORY          0x0010        // <user name>\\Desktop\n#define CSIDL_DRIVES                    0x0011        // My Computer\n#define CSIDL_NETWORK                   0x0012        // Network Neighborhood (My Network Places)\n#define CSIDL_NETHOOD                   0x0013        // <user name>\\nethood\n#define CSIDL_FONTS                     0x0014        // windows\\fonts\n#define CSIDL_TEMPLATES                 0x0015\n#define CSIDL_COMMON_STARTMENU          0x0016        // All Users\\Start Menu\n#define CSIDL_COMMON_PROGRAMS           0X0017        // All Users\\Start Menu\\Programs\n#define CSIDL_COMMON_STARTUP            0x0018        // All Users\\Startup\n#define CSIDL_COMMON_DESKTOPDIRECTORY   0x0019        // All Users\\Desktop\n#define CSIDL_APPDATA                   0x001a        // <user name>\\Application Data\n#define CSIDL_PRINTHOOD                 0x001b        // <user name>\\PrintHood\n#define CSIDL_LOCAL_APPDATA             0x001c        // <user name>\\Local Settings\\Applicaiton Data (non roaming)\n#define CSIDL_ALTSTARTUP                0x001d        // non localized startup\n#define CSIDL_COMMON_ALTSTARTUP         0x001e        // non localized common startup\n#define CSIDL_COMMON_FAVORITES          0x001f\n#define CSIDL_INTERNET_CACHE            0x0020\n#define CSIDL_COOKIES                   0x0021\n#define CSIDL_HISTORY                   0x0022\n#define CSIDL_COMMON_APPDATA            0x0023        // All Users\\Application Data\n#define CSIDL_WINDOWS                   0x0024        // GetWindowsDirectory()\n#define CSIDL_SYSTEM                    0x0025        // GetSystemDirectory()\n#define CSIDL_PROGRAM_FILES             0x0026        // C:\\Program Files\n#define CSIDL_MYPICTURES                0x0027        // C:\\Program Files\\My Pictures\n#define CSIDL_PROFILE                   0x0028        // USERPROFILE\n#define CSIDL_SYSTEMX86                 0x0029        // x86 system directory on RISC\n#define CSIDL_PROGRAM_FILESX86          0x002a        // x86 C:\\Program Files on RISC\n#define CSIDL_PROGRAM_FILES_COMMON      0x002b        // C:\\Program Files\\Common\n#define CSIDL_PROGRAM_FILES_COMMONX86   0x002c        // x86 Program Files\\Common on RISC\n#define CSIDL_COMMON_TEMPLATES          0x002d        // All Users\\Templates\n#define CSIDL_COMMON_DOCUMENTS          0x002e        // All Users\\Documents\n#define CSIDL_COMMON_ADMINTOOLS         0x002f        // All Users\\Start Menu\\Programs\\Administrative Tools\n#define CSIDL_ADMINTOOLS                0x0030        // <user name>\\Start Menu\\Programs\\Administrative Tools\n#define CSIDL_CONNECTIONS               0x0031        // Network and Dial-up Connections\n#define CSIDL_COMMON_MUSIC              0x0035        // All Users\\My Music\n#define CSIDL_COMMON_PICTURES           0x0036        // All Users\\My Pictures\n#define CSIDL_COMMON_VIDEO              0x0037        // All Users\\My Video\n#define CSIDL_RESOURCES                 0x0038        // Resource Direcotry\n#define CSIDL_RESOURCES_LOCALIZED       0x0039        // Localized Resource Direcotry\n#define CSIDL_COMMON_OEM_LINKS          0x003a        // Links to All Users OEM specific apps\n#define CSIDL_CDBURN_AREA               0x003b        // USERPROFILE\\Local Settings\\Application Data\\Microsoft\\CD Burning\n#define CSIDL_COMPUTERSNEARME           0x003d        // Computers Near Me (computered from Workgroup membership)\n\n    template<typename T>\n    static inline std::string GetAppFolder(T appDataToStorageFolder)\n    {\n        ComPtr<IApplicationDataStatics> appDataStatics;\n        ComPtr<IApplicationData> appData;\n        ComPtr<IStorageFolder> appDataFolder;\n        ComPtr<IStorageItem> appDataFolderItem;\n        HString appDataPath;\n\n        auto hr = RoGetActivationFactory(HStringReference(RuntimeClass_Windows_Storage_ApplicationData).Get(), __uuidof(IApplicationDataStatics), &appDataStatics);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, false);\n\n        hr = appDataStatics->get_Current(&appData);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, false);\n\n        hr = appDataToStorageFolder(appData.Get(), &appDataFolder);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, false);\n\n        hr = appDataFolder.As(&appDataFolderItem);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, false);\n\n        hr = appDataFolderItem->get_Path(appDataPath.GetAddressOf());\n        IL2CPP_VM_RAISE_IF_FAILED(hr, false);\n\n        unsigned int dummy;\n        return utils::StringUtils::Utf16ToUtf8(appDataPath.GetRawBuffer(&dummy));\n    }\n\n    static inline std::string GetLocalAppDataFolder()\n    {\n        return GetAppFolder([](IApplicationData* appData, IStorageFolder** folder) { return appData->get_LocalFolder(folder); });\n    }\n\n#if !IL2CPP_TARGET_XBOXONE\n    static inline std::string GetRoamingAppDataFolder()\n    {\n        return GetAppFolder([](IApplicationData* appData, IStorageFolder** folder) { return appData->get_RoamingFolder(folder); });\n    }\n\n#endif\n\n    std::string Environment::GetWindowsFolderPath(int32_t folder)\n    {\n        switch (folder)\n        {\n#if !IL2CPP_TARGET_XBOXONE\n            case CSIDL_APPDATA:\n                return GetRoamingAppDataFolder();\n#endif\n\n            case CSIDL_LOCAL_APPDATA:\n                return GetLocalAppDataFolder();\n\n            default:\n                Exception::Raise(Exception::GetUnauthorizedAccessException(L\"Failed getting the path of a special folder: Access Denied.\"));\n        }\n    }\n\n#if NET_4_0\n\n    bool Environment::Is64BitOs()\n    {\n#if IL2CPP_TARGET_WINRT\n        vm::Exception::Raise(vm::Exception::GetPlatformNotSupportedException(L\"It is not possible to check if the OS is a 64bit OS on the current platform.\"));\n#endif\n        return true;\n    }\n\n#endif\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WinRT/File.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE\n\n#include <io.h>\n\n#include \"os/File.h\"\n#include \"os/Win32/WindowsHeaders.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    static inline std::wstring GetDirectoryForStandardOutput()\n    {\n#if IL2CPP_TARGET_XBOXONE\n\n        return L\"D:\\\\\";\n\n#elif IL2CPP_TARGET_WINRT\n\n        wchar_t buffer[MAX_PATH + 2];\n        uint32_t tempPathLength = GetTempPathW(MAX_PATH + 2, buffer);\n        return std::wstring(buffer, tempPathLength);\n\n#else\n#error Unknown platform\n#endif\n    }\n\n    static FileHandle* GetOrCreateRedirectedHandle(FILE* stdFile, const wchar_t* fileNameOnDisk)\n    {\n#if IL2CPP_DEBUG || IL2CPP_DEVELOPMENT\n        auto stdFd = _fileno(stdFile);\n        auto stdHandle = reinterpret_cast<FileHandle*>(_get_osfhandle(stdFd));\n\n        if (stdHandle != INVALID_HANDLE_VALUE && !_isatty(stdFd))\n            return stdHandle;\n\n        std::wstring pathOnDisk = GetDirectoryForStandardOutput() + fileNameOnDisk;\n        auto redirectedFile = _wfreopen(pathOnDisk.c_str(), L\"w+\", stdFile);\n        return reinterpret_cast<FileHandle*>(_get_osfhandle(_fileno(redirectedFile)));\n#else\n        return NULL;\n#endif\n    }\n\n    bool File::Isatty(FileHandle* fileHandle)\n    {\n        NOT_IMPLEMENTED_ICALL(File::IsAtty);\n        return false;\n    }\n\n    FileHandle* File::GetStdInput()\n    {\n        return GetOrCreateRedirectedHandle(stdin, L\"stdin.txt\");\n    }\n\n    FileHandle* File::GetStdError()\n    {\n        return GetOrCreateRedirectedHandle(stderr, L\"stderr.txt\");\n    }\n\n    FileHandle* File::GetStdOutput()\n    {\n        return GetOrCreateRedirectedHandle(stdout, L\"stdout.txt\");\n    }\n} //os\n} //il2cpp\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WinRT/Initialize.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE\n\n#include \"os/Initialize.h\"\n#include \"os/Win32/WindowsHelpers.h\"\n\n#include <io.h>\n\nvoid il2cpp::os::Uninitialize()\n{\n    HANDLE stdoutHandle = reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(stdout)));\n    HANDLE stderrHandle = reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(stderr)));\n\n    if (stdoutHandle != INVALID_HANDLE_VALUE)\n        FlushFileBuffers(stdoutHandle);\n\n    if (stderrHandle != INVALID_HANDLE_VALUE)\n        FlushFileBuffers(stderrHandle);\n}\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WinRT/Locale.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE\n\n#include \"os/Locale.h\"\n#include \"os/Win32/WindowsHeaders.h\"\n\n#include <vector>\n\nnamespace il2cpp\n{\nnamespace os\n{\n    std::string Locale::GetLocale()\n    {\n        WCHAR wideLocaleName[LOCALE_NAME_MAX_LENGTH];\n        if (GetUserDefaultLocaleName(wideLocaleName, LOCALE_NAME_MAX_LENGTH) == 0)\n            return std::string();\n\n        int length = static_cast<int>(wcslen(wideLocaleName));\n        std::string multiLocaleName;\n        multiLocaleName.resize(2 * length);\n        int narrowLength = WideCharToMultiByte(CP_ACP, 0, &wideLocaleName[0], length, &multiLocaleName[0], 2 * length, NULL, NULL);\n        multiLocaleName.resize(narrowLength);\n        return multiLocaleName;\n    }\n} /* namespace os */\n} /* namespace il2cpp */\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WinRT/Process.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE\n#include \"os/Win32/WindowsHeaders.h\"\n\n#include \"os/Process.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Exception.h\"\n\nstruct ProcessHandle\n{\n    HANDLE handle;\n};\n\n\nnamespace il2cpp\n{\nnamespace os\n{\n    int Process::GetCurrentProcessId()\n    {\n        return ::GetCurrentProcessId();\n    }\n\n    ProcessHandle* Process::GetProcess(int processId)\n    {\n        if (processId == GetCurrentProcessId())\n            return (ProcessHandle*)::GetCurrentProcess();\n\n        vm::Exception::Raise(vm::Exception::GetPlatformNotSupportedException(L\"It is not possible to interact with other system processes on current platform.\"));\n    }\n\n    void Process::FreeProcess(ProcessHandle* handle)\n    {\n        // We have nothing to do here.\n    }\n\n    std::string Process::GetProcessName(ProcessHandle* handle)\n    {\n        if (handle == ::GetCurrentProcess())\n        {\n            wchar_t path[MAX_PATH + 1];\n            SetLastError(ERROR_SUCCESS);\n\n            DWORD pathLength = GetModuleFileNameW(NULL, path, MAX_PATH + 1);\n            return utils::StringUtils::Utf16ToUtf8(path, static_cast<int>(pathLength));\n        }\n\n        vm::Exception::Raise(vm::Exception::GetPlatformNotSupportedException(L\"It is not possible to interact with other system processes on current platform.\"));\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WinRT/SynchronousOperation.h",
    "content": "#pragma once\n\n#include \"os/Win32/WindowsHeaders.h\"\n#include <windows.foundation.collections.h>\n#include <wrl.h>\n\nnamespace il2cpp\n{\nnamespace winrt\n{\n    template<typename T>\n    class SynchronousOperation : Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::WinRtClassicComMix>, ABI::Windows::Foundation::IAsyncOperationCompletedHandler<T> >\n    {\n    private:\n        HANDLE m_Event;\n        HRESULT m_HR;\n        T m_Result;\n\n    public:\n        inline SynchronousOperation(ABI::Windows::Foundation::IAsyncOperation<T>* op)\n        {\n            m_Event = CreateEventExW(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS);\n            Assert(m_Event);\n\n            auto hr = op->put_Completed(this);\n            Assert(SUCCEEDED(hr));\n        }\n\n        inline ~SynchronousOperation()\n        {\n            CloseHandle(m_Event);\n        }\n\n        HRESULT GetResults(T* result)\n        {\n            auto waitResult = WaitForSingleObjectEx(m_Event, INFINITE, FALSE);\n\n            if (waitResult != WAIT_OBJECT_0)\n                return E_FAIL;\n\n            if (FAILED(m_HR))\n                return m_HR;\n\n            *result = m_Result;\n            return S_OK;\n        }\n\n    private:\n        virtual HRESULT STDMETHODCALLTYPE Invoke(ABI::Windows::Foundation::IAsyncOperation<T>* asyncInfo, ABI::Windows::Foundation::AsyncStatus status) override\n        {\n            m_HR = asyncInfo->GetResults(&m_Result);\n            SetEvent(m_Event);\n            return S_OK;\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WinRT/Win32ApiSharedEmulation.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE\n\n#include \"os/Win32/WindowsHeaders.h\"\n#include \"Win32ApiSharedEmulation.h\"\n\n#include <io.h>\n#include <windows.networking.connectivity.h>\n#include <windows.storage.h>\n\nusing namespace il2cpp::winrt;\nusing namespace Microsoft::WRL;\nusing namespace Microsoft::WRL::Wrappers;\nusing namespace ABI::Windows::Foundation;\nusing namespace ABI::Windows::Foundation::Collections;\nusing namespace ABI::Windows::Networking;\nusing namespace ABI::Windows::Networking::Connectivity;\nusing namespace ABI::Windows::Storage;\n\nextern \"C\"\n{\nBOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize)\n{\n#define ERROR_CHECK(hr) do { if (FAILED(hr)) { SetLastError(WIN32_FROM_HRESULT(hr)); return FALSE; } } while (false)\n\n    ComPtr<INetworkInformationStatics> info;\n    auto hr = RoGetActivationFactory(HStringReference(RuntimeClass_Windows_Networking_Connectivity_NetworkInformation).Get(), __uuidof(info), &info);\n    ERROR_CHECK(hr);\n\n    ComPtr<IVectorView<HostName*> > names;\n    hr = info->GetHostNames(&names);\n    ERROR_CHECK(hr);\n\n    unsigned int size;\n    hr = names->get_Size(&size);\n    if (FAILED(hr) || !size)\n    {\n        SetLastError(WIN32_FROM_HRESULT(hr));\n        return FALSE;\n    }\n\n    ComPtr<IHostName> name;\n    hr = names->GetAt(0, &name);\n    ERROR_CHECK(hr);\n\n    HString displayName;\n    hr = name->get_DisplayName(displayName.GetAddressOf());\n    ERROR_CHECK(hr);\n\n#undef ERROR_CHECK\n\n    return CopyHStringToBuffer(displayName, lpBuffer, nSize);\n}\n} // extern \"C\"\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WinRT/Win32ApiSharedEmulation.h",
    "content": "#pragma once\n\n#if IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE\n\n#include \"os/Win32/WindowsHeaders.h\"\n#include <wrl.h>\n\n#define MAX_COMPUTERNAME_LENGTH 31\n\nnamespace il2cpp\n{\nnamespace winrt\n{\n    inline DWORD WIN32_FROM_HRESULT(HRESULT hr)\n    {\n        if ((hr & 0xFFFF0000) == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, 0))\n            return HRESULT_CODE(hr);\n        if (hr == S_OK)\n            return HRESULT_CODE(hr);\n        return ERROR_SUCCESS;\n    }\n\n    inline static BOOL CopyHStringToBuffer(Microsoft::WRL::Wrappers::HString& source, LPWSTR target, LPDWORD targetSize)\n    {\n        unsigned int sourceLength;\n        auto sourceBuffer = source.GetRawBuffer(&sourceLength);\n\n        if (sourceLength > *targetSize - 1)\n        {\n            SetLastError(ERROR_BUFFER_OVERFLOW);\n            *targetSize = sourceLength + 1;\n            return FALSE;\n        }\n\n        memcpy(target, sourceBuffer, sourceLength * sizeof(wchar_t));\n        target[sourceLength] = L'\\0';\n        *targetSize = sourceLength;\n        return TRUE;\n    }\n}\n}\n\nextern \"C\"\n{\n#define GetComputerName GetComputerNameW\n\ninline BOOL WINAPI CopyFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, BOOL bFailIfExists)\n{\n    COPYFILE2_EXTENDED_PARAMETERS params;\n\n    params.dwSize = sizeof(params);\n    params.dwCopyFlags = bFailIfExists ? COPY_FILE_FAIL_IF_EXISTS : 0;\n    params.pfCancel = FALSE;\n    params.pProgressRoutine = nullptr;\n    params.pvCallbackContext = nullptr;\n\n    auto hr = CopyFile2(lpExistingFileName, lpNewFileName, &params);\n    if (FAILED(hr))\n    {\n        SetLastError(il2cpp::winrt::WIN32_FROM_HRESULT(hr));\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\ninline UINT WINAPI GetACP()\n{\n    return CP_ACP;\n}\n\nBOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize);\n} // extern \"C\"\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WinRT/Win32ApiWinRTEmulation.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_TARGET_WINRT\n\n#include \"os/Win32/WindowsHeaders.h\"\n\n#include <string>\n#include <windows.system.profile.h>\n#include <windows.system.userprofile.h>\n\n#include \"os/Mutex.h\"\n#include \"SynchronousOperation.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n#include \"Win32ApiSharedEmulation.h\"\n#include \"Win32ApiWinRTEmulation.h\"\n\nusing namespace ABI::Windows::Foundation;\nusing namespace ABI::Windows::System::Profile;\nusing namespace ABI::Windows::System::UserProfile;\nusing namespace Microsoft::WRL;\nusing namespace Microsoft::WRL::Wrappers;\nusing namespace il2cpp::winrt;\n\nstruct WideStringHash\n{\npublic:\n    size_t operator()(const std::wstring& str) const\n    {\n        return Hash(str);\n    }\n\n    static size_t Hash(const std::wstring& str)\n    {\n        return il2cpp::utils::StringUtils::Hash((const char*)str.c_str(), sizeof(std::wstring::value_type) * str.length());\n    }\n};\n\ntypedef Il2CppHashMap<std::wstring, std::wstring, WideStringHash> EnvironmentVariableMap;\nstatic EnvironmentVariableMap s_EnvironmentVariables;\nstatic il2cpp::os::FastMutex s_EnvironmentVariablesMutex;\n\nextern \"C\"\n{\nBOOL WINAPI FreeEnvironmentStringsW(LPWCH strings)\n{\n    IL2CPP_FREE(strings);\n    return TRUE;\n}\n\nLPWCH WINAPI GetEnvironmentStringsW()\n{\n    il2cpp::os::FastAutoLock lock(&s_EnvironmentVariablesMutex);\n\n    // Two iterations\n    // 1) Figure out length\n    // 2) Make result string\n    size_t length = 0;\n\n    for (EnvironmentVariableMap::const_iterator it = s_EnvironmentVariables.begin(); it != s_EnvironmentVariables.end(); it++)\n    {\n        // Key + value + '=' + '\\0'\n        length += it->first.key.length() + it->second.length() + 2;\n    }\n\n    // Terminating '\\0'\n    length++;\n\n    LPWCH result = static_cast<LPWCH>(IL2CPP_MALLOC(length * sizeof(WCHAR)));\n    size_t index = 0;\n\n    for (EnvironmentVariableMap::const_iterator it = s_EnvironmentVariables.begin(); it != s_EnvironmentVariables.end(); it++)\n    {\n        const size_t keyLength = it->first.key.length();\n        const size_t valueLength = it->second.length();\n\n        memcpy(result + index, it->first.key.c_str(), keyLength * sizeof(WCHAR));\n        index += keyLength;\n\n        result[index++] = L'=';\n\n        memcpy(result + index, it->second.c_str(), valueLength * sizeof(WCHAR));\n        index += valueLength;\n\n        result[index++] = '\\0';\n    }\n\n    result[index++] = '\\0';\n    IL2CPP_ASSERT(index == length);\n    return result;\n}\n\nDWORD WINAPI GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize)\n{\n    il2cpp::os::FastAutoLock lock(&s_EnvironmentVariablesMutex);\n\n    std::wstring key(lpName);\n    auto it = s_EnvironmentVariables.find(key);\n\n    if (it == s_EnvironmentVariables.end())\n        return 0;\n\n    DWORD sizeNeeded = static_cast<DWORD>(it->second.length());\n\n    if (nSize < sizeNeeded)\n    {\n        SetLastError(ERROR_BUFFER_OVERFLOW);\n    }\n    else\n    {\n        memcpy(lpBuffer, it->second.data(), (sizeNeeded + 1) * sizeof(wchar_t));\n    }\n\n    return sizeNeeded;\n}\n\nBOOL WINAPI GetVersionExW(LPOSVERSIONINFOW lpVersionInformation)\n{\n    Assert(lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOW));\n\n#define ERROR_CHECK(hr) do { if (FAILED(hr)) { SetLastError(WIN32_FROM_HRESULT(hr)); return FALSE; } } while (false)\n\n    ComPtr<IAnalyticsInfoStatics> analytics;\n    auto hr = RoGetActivationFactory(HStringReference(RuntimeClass_Windows_System_Profile_AnalyticsInfo).Get(), __uuidof(IAnalyticsInfoStatics), &analytics);\n    ERROR_CHECK(hr);\n\n    ComPtr<IAnalyticsVersionInfo> versionInfo;\n    hr = analytics->get_VersionInfo(&versionInfo);\n    ERROR_CHECK(hr);\n\n    HString versionString;\n    hr = versionInfo->get_DeviceFamilyVersion(versionString.GetAddressOf());\n    ERROR_CHECK(hr);\n\n#undef ERROR_CHECK\n\n    unsigned int dummy;\n    int64_t versionNumber = _wtoi64(versionString.GetRawBuffer(&dummy));\n\n    if (versionNumber == 0)\n    {\n        SetLastError(ERROR_VERSION_PARSE_ERROR);\n        return FALSE;\n    }\n\n    lpVersionInformation->dwMajorVersion = versionNumber >> 48;\n    lpVersionInformation->dwMinorVersion = (versionNumber >> 32) & 0xFFFF;\n    lpVersionInformation->dwBuildNumber = (versionNumber >> 16) & 0xFFFF;\n    lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT;\n    ZeroMemory(lpVersionInformation->szCSDVersion, sizeof(lpVersionInformation->szCSDVersion));\n\n    return TRUE;\n}\n\nBOOL WINAPI SetEnvironmentVariableW(LPCWSTR lpName, LPCWSTR lpValue)\n{\n    il2cpp::os::FastAutoLock lock(&s_EnvironmentVariablesMutex);\n\n    if (lpValue != NULL)\n    {\n        s_EnvironmentVariables[std::wstring(lpName)] = lpValue;\n    }\n    else\n    {\n        s_EnvironmentVariables.erase(std::wstring(lpName));\n    }\n\n    return TRUE;\n}\n\nBOOL WINAPI GetUserNameW(LPWSTR lpBuffer, LPDWORD pcbBuffer)\n{\n#define ERROR_CHECK(hr) do { if (FAILED(hr)) { SetLastError(WIN32_FROM_HRESULT(hr)); return FALSE; } } while (false)\n\n    ComPtr<IUserInformationStatics> info;\n    auto hr = RoGetActivationFactory(HStringReference(RuntimeClass_Windows_System_UserProfile_UserInformation).Get(), __uuidof(info), &info);\n    ERROR_CHECK(hr);\n\n    boolean isAccessAllowed;\n    hr = info->get_NameAccessAllowed(&isAccessAllowed);\n    ERROR_CHECK(hr);\n\n    if (!isAccessAllowed)\n    {\n        SetLastError(ERROR_ACCESS_DENIED);\n        return FALSE;\n    }\n\n    ComPtr<IAsyncOperation<HSTRING> > op;\n    hr = info->GetDisplayNameAsync(&op);\n    ERROR_CHECK(hr);\n\n    HString name;\n    hr = SynchronousOperation<HSTRING>(op.Get()).GetResults(name.GetAddressOf());\n    ERROR_CHECK(hr);\n\n#undef ERROR_CHECK\n\n    return CopyHStringToBuffer(name, lpBuffer, pcbBuffer);\n}\n} // extern \"C\"\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WinRT/Win32ApiWinRTEmulation.h",
    "content": "#pragma once\n\n#if IL2CPP_TARGET_WINRT\n\nextern \"C\"\n{\n#define CreateEvent CreateEventW\n#define FreeEnvironmentStrings FreeEnvironmentStringsW\n#define GetEnvironmentStrings GetEnvironmentStringsW\n#define GetEnvironmentVariable GetEnvironmentVariableW\n#define GetVersionEx GetVersionExW\n#define GetUserName GetUserNameW\n#define SetEnvironmentVariable SetEnvironmentVariableW\n\ninline HANDLE WINAPI CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCWSTR lpName)\n{\n    DWORD flags = 0;\n    if (bManualReset)\n        flags |= CREATE_EVENT_MANUAL_RESET;\n    if (bInitialState)\n        flags |= CREATE_EVENT_INITIAL_SET;\n    return CreateEventExW(lpEventAttributes, lpName, flags, EVENT_ALL_ACCESS);\n}\n\ninline HANDLE WINAPI CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)\n{\n    const DWORD kFileAttributeMask = 0x0000FFFF;\n    const DWORD kFileFlagMask = 0xFFFF0000;\n\n    CREATEFILE2_EXTENDED_PARAMETERS extendedParameters;\n    extendedParameters.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);\n    extendedParameters.dwFileAttributes = dwFlagsAndAttributes & kFileAttributeMask;\n    extendedParameters.dwFileFlags = dwFlagsAndAttributes & kFileFlagMask;\n    extendedParameters.dwSecurityQosFlags = SECURITY_ANONYMOUS;\n    extendedParameters.lpSecurityAttributes = lpSecurityAttributes;\n    extendedParameters.hTemplateFile = hTemplateFile;\n\n    return CreateFile2(lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, &extendedParameters);\n}\n\nBOOL WINAPI FreeEnvironmentStringsW(LPWCH strings);\n\nLPWCH WINAPI GetEnvironmentStringsW();\n\nDWORD WINAPI GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize);\n\nBOOL WINAPI GetUserNameW(LPWSTR lpBuffer, LPDWORD pcbBuffer);\n\nBOOL WINAPI GetVersionExW(LPOSVERSIONINFOW lpVersionInformation);\n\ninline HMODULE WINAPI LoadLibraryW(LPCWSTR lpLibFileName)\n{\n    return LoadPackagedLibrary(lpLibFileName, 0);\n}\n\nBOOL WINAPI SetEnvironmentVariableW(LPCWSTR lpName, LPCWSTR lpValue);\n\n#define CreateFileMappingW(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName) \\\n    CreateFileMappingFromApp(hFile, lpFileMappingAttributes, flProtect, (static_cast<ULONG64>(dwMaximumSizeHigh) << 32) | dwMaximumSizeLow, lpName);\n\n#define MapViewOfFile(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap) \\\n    MapViewOfFileFromApp(hFileMappingObject, dwDesiredAccess, (static_cast<ULONG64>(dwFileOffsetHigh) << 32) | dwFileOffsetLow, dwNumberOfBytesToMap);\n\n#define TlsAlloc() FlsAlloc(NULL)\n#define TlsGetValue FlsGetValue\n#define TlsSetValue FlsSetValue\n#define TlsFree FlsFree\n} // extern \"C\"\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/WindowsRuntime.h",
    "content": "#pragma once\n\n#include \"object-internals.h\"\n#include \"utils/StringView.h\"\n\nnamespace il2cpp\n{\nnamespace os\n{\n    class LIBIL2CPP_CODEGEN_API WindowsRuntime\n    {\n    public:\n        static il2cpp_hresult_t GetActivationFactory(Il2CppHString className, Il2CppIActivationFactory** activationFactory);\n\n        static il2cpp_hresult_t CreateHStringReference(const utils::StringView<Il2CppNativeChar>& str, Il2CppHStringHeader* header, Il2CppHString* hstring);\n        static il2cpp_hresult_t CreateHString(const utils::StringView<Il2CppChar>& str, Il2CppHString* hstring);\n        static il2cpp_hresult_t DeleteHString(Il2CppHString hstring);\n\n        static const Il2CppChar* GetHStringBuffer(Il2CppHString hstring, uint32_t* length);\n        static Il2CppString* HStringToManagedString(Il2CppHString hstring);\n\n        static Il2CppIRestrictedErrorInfo* GetRestrictedErrorInfo();\n        static void OriginateLanguageException(Il2CppException* ex, Il2CppString* exceptionString);\n\n        static void EnableErrorReporting();\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/Allocator.cpp",
    "content": "#include \"Allocator.h\"\n\nstatic allocate_func s_Allocator;\n\nextern \"C\"\n{\nvoid register_allocator(allocate_func allocator)\n{\n    s_Allocator = allocator;\n}\n}\n\nvoid* Allocator::Allocate(size_t size)\n{\n    IL2CPP_ASSERT(s_Allocator);\n    return s_Allocator(size);\n}\n\nchar* Allocator::CopyToAllocatedStringBuffer(const std::string& input)\n{\n    size_t size = input.size();\n    char* buffer = (char*)Allocator::Allocate(size + 1);\n    input.copy(buffer, size);\n    buffer[size] = '\\0';\n    return buffer;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/Allocator.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\ntypedef void* (*allocate_func)(size_t size);\n\n#if defined(__cplusplus)\nextern \"C\"\n{\n#endif\n\nvoid register_allocator(allocate_func allocator);\n\n#if defined(__cplusplus)\n}\n#endif\n\n#if defined(__cplusplus)\n#include <string>\n\nclass Allocator\n{\npublic:\n    static void* Allocate(size_t size);\n    static char* CopyToAllocatedStringBuffer(const std::string& input);\n};\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/File-c-api.h",
    "content": "#pragma once\n\n#include \"os/OSGlobalEnums.h\"\n\n#if defined(__cplusplus)\n#include \"os/ErrorCodes.h\"\n#include \"os/File.h\"\n\ntypedef il2cpp::os::FileHandle UnityPalFileHandle;\ntypedef il2cpp::os::FileStat UnityPalFileStat;\n\n#else\n\ntypedef struct UnityPalFileHandle UnityPalFileHandle;\n\nstruct UnityPalFileStat\n{\n    char* name;\n    int32_t attributes;\n    int64_t length;\n    int64_t creation_time;\n    int64_t last_access_time;\n    int64_t last_write_time;\n} UnityPalFileStat;\n\n#endif //__cplusplus\n\n#if defined(__cplusplus)\nextern \"C\"\n{\n#endif\n\nbool UnityPalIsatty(UnityPalFileHandle* fileHandle);\nUnityPalFileHandle* UnityPalGetStdInput();\nUnityPalFileHandle* UnityPalGetStdOutput();\nUnityPalFileHandle* UnityPalGetStdError();\nbool UnityPalCreatePipe(UnityPalFileHandle** read_handle, UnityPalFileHandle** write_handle);\nbool UnityPalCreatePipe_with_error(UnityPalFileHandle** read_handle, UnityPalFileHandle** write_handle, int* error);\nFileType UnityPalGetFileType(UnityPalFileHandle* handle);\nUnityPalFileAttributes UnityPalGetFileAttributes(const char* path, int* error);\nbool UnityPalSetFileAttributes(const char* path, UnityPalFileAttributes attributes, int* error);\nbool UnityPalGetFileStat(const char* path, UnityPalFileStat * stat, int* error);\nbool UnityPalCopyFile(const char* src, const char* dest, bool overwrite, int* error);\nbool UnityPalMoveFile(const char* src, const char* dest, int* error);\nbool UnityPalDeleteFile(const char* path, int *error);\nbool UnityPalReplaceFile(const char* sourceFileName, const char* destinationFileName, const char* destinationBackupFileName, bool ignoreMetadataErrors, int* error);\nUnityPalFileHandle* UnityPalOpen(const char* path, int openMode, int accessMode, int shareMode, int options, int *error);\nbool UnityPalClose(UnityPalFileHandle* handle, int *error);\nbool UnityPalSetFileTime(UnityPalFileHandle* handle, int64_t creation_time, int64_t last_access_time, int64_t last_write_time, int* error);\nint64_t UnityPalGetLength(UnityPalFileHandle* handle, int *error);\nbool UnityPalSetLength(UnityPalFileHandle* handle, int64_t length, int *error);\nint64_t UnityPalSeek(UnityPalFileHandle* handle, int64_t offset, int origin, int *error);\nint UnityPalRead(UnityPalFileHandle* handle, char *dest, int count, int *error);\nint32_t UnityPalWrite(UnityPalFileHandle* handle, const char* buffer, int count, int *error);\nbool UnityPalFlush(UnityPalFileHandle* handle, int* error);\nvoid UnityPalLock(UnityPalFileHandle* handle, int64_t position, int64_t length, int* error);\nvoid UnityPalUnlock(UnityPalFileHandle* handle, int64_t position, int64_t length, int* error);\nbool UnityPalDuplicateHandle(UnityPalFileHandle* source_process_handle, UnityPalFileHandle* source_handle, UnityPalFileHandle* target_process_handle,\n    UnityPalFileHandle** target_handle, int access, int inherit, int options, int* error);\n\n\n#if defined(__cplusplus)\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/File.cpp",
    "content": "#include \"os/File.h\"\n#include \"os/c-api/File-c-api.h\"\n\nextern \"C\"\n{\nbool UnityPalIsatty(UnityPalFileHandle* fileHandle)\n{\n    return il2cpp::os::File::Isatty(fileHandle);\n}\n\nUnityPalFileHandle* UnityPalGetStdInput()\n{\n    return il2cpp::os::File::GetStdInput();\n}\n\nUnityPalFileHandle* UnityPalGetStdOutput()\n{\n    return il2cpp::os::File::GetStdOutput();\n}\n\nUnityPalFileHandle* UnityPalGetStdError()\n{\n    return il2cpp::os::File::GetStdError();\n}\n\nbool UnityPalCreatePipe(UnityPalFileHandle** read_handle, UnityPalFileHandle** write_handle)\n{\n    return il2cpp::os::File::CreatePipe(read_handle, write_handle);\n}\n\nbool UnityPalCreatePipe_With_Error(UnityPalFileHandle** read_handle, UnityPalFileHandle** write_handle, int* error)\n{\n    return il2cpp::os::File::CreatePipe(read_handle, write_handle, error);\n}\n\nFileType UnityPalGetFileType(UnityPalFileHandle* handle)\n{\n    return il2cpp::os::File::GetFileType(handle);\n}\n\nUnityPalFileAttributes UnityPalGetFileAttributes(const char* path, int* error)\n{\n    return il2cpp::os::File::GetFileAttributes(path, error);\n}\n\nbool UnityPalSetFileAttributes(const char* path, UnityPalFileAttributes attributes, int* error)\n{\n    return il2cpp::os::File::SetFileAttributes(path, attributes, error);\n}\n\nbool UnityPalGetFileStat(const char* path, UnityPalFileStat * stat, int* error)\n{\n    return il2cpp::os::File::GetFileStat(path, stat, error);\n}\n\nbool UnityPalCopyFile(const char* src, const char* dest, bool overwrite, int* error)\n{\n    return il2cpp::os::File::CopyFile(src, dest, overwrite, error);\n}\n\nbool UnityPalMoveFile(const char* src, const char* dest, int* error)\n{\n    return il2cpp::os::File::MoveFile(src, dest, error);\n}\n\nbool UnityPalDeleteFile(const char* path, int *error)\n{\n    return il2cpp::os::File::DeleteFile(path, error);\n}\n\nbool UnityPalReplaceFile(const char* sourceFileName, const char* destinationFileName, const char* destinationBackupFileName, bool ignoreMetadataErrors, int* error)\n{\n    return il2cpp::os::File::ReplaceFile(sourceFileName, destinationFileName, destinationBackupFileName, ignoreMetadataErrors, error);\n}\n\nUnityPalFileHandle* UnityPalOpen(const char* path, int openMode, int accessMode, int shareMode, int options, int *error)\n{\n    return il2cpp::os::File::Open(path, openMode, accessMode, shareMode, options, error);\n}\n\nbool UnityPalClose(UnityPalFileHandle* handle, int *error)\n{\n    return il2cpp::os::File::Close(handle, error);\n}\n\nbool UnityPalSetFileTime(UnityPalFileHandle* handle, int64_t creation_time, int64_t last_access_time, int64_t last_write_time, int* error)\n{\n    return il2cpp::os::File::SetFileTime(handle, creation_time, last_access_time, last_write_time, error);\n}\n\nint64_t UnityPalGetLength(UnityPalFileHandle* handle, int *error)\n{\n    return il2cpp::os::File::GetLength(handle, error);\n}\n\nbool UnityPalSetLength(UnityPalFileHandle* handle, int64_t length, int *error)\n{\n    return il2cpp::os::File::SetLength(handle, length, error);\n}\n\nint64_t UnityPalSeek(UnityPalFileHandle* handle, int64_t offset, int origin, int *error)\n{\n    return il2cpp::os::File::Seek(handle, offset, origin, error);\n}\n\nint UnityPalRead(UnityPalFileHandle* handle, char *dest, int count, int *error)\n{\n    return il2cpp::os::File::Read(handle, dest, count, error);\n}\n\nint32_t UnityPalWrite(UnityPalFileHandle* handle, const char* buffer, int count, int *error)\n{\n    return il2cpp::os::File::Write(handle, buffer, count, error);\n}\n\nbool UnityPalFlush(UnityPalFileHandle* handle, int* error)\n{\n    return il2cpp::os::File::Flush(handle, error);\n}\n\nvoid UnityPalLock(UnityPalFileHandle* handle, int64_t position, int64_t length, int* error)\n{\n    return il2cpp::os::File::Lock(handle, position, length, error);\n}\n\nvoid UnityPalUnlock(UnityPalFileHandle* handle, int64_t position, int64_t length, int* error)\n{\n    return il2cpp::os::File::Unlock(handle, position, length, error);\n}\n\nbool UnityPalDuplicateHandle(UnityPalFileHandle* source_process_handle, UnityPalFileHandle* source_handle, UnityPalFileHandle* target_process_handle,\n    UnityPalFileHandle** target_handle, int access, int inherit, int options, int* error)\n{\n    return il2cpp::os::File::DuplicateHandle(source_process_handle, source_handle, target_process_handle, target_handle, access, inherit, options, error);\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/NativeMethods-c-api.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"os/c-api/Process_c_api.h\"\n\n#if defined(__cplusplus)\nextern \"C\"\n{\n#endif\n\nbool UnityPalNativeCloseProcess(UnityPalProcessHandle* handle);\nbool UnityPalNativeGetExitCodeProcess(UnityPalProcessHandle* handle, int32_t* exitCode);\nint32_t UnityPalNativeGetCurrentProcessId();\nUnityPalProcessHandle* UnityPalNativeGetCurrentProcess();\n\n#if defined(__cplusplus)\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/NativeMethods.cpp",
    "content": "#include \"os/NativeMethods.h\"\n#include \"os/c-api/Process-c-api.h\"\n\nextern \"C\"\n{\nbool UnityPalNativeCloseProcess(UnityPalProcessHandle* handle)\n{\n    return il2cpp::os::NativeMethods::CloseProcess(handle);\n}\n\nbool UnityPalNativeGetExitCodeProcess(UnityPalProcessHandle* handle, int32_t* exitCode)\n{\n    return il2cpp::os::NativeMethods::GetExitCodeProcess(handle, exitCode);\n}\n\nint32_t UnityPalNativeGetCurrentProcessId()\n{\n    return il2cpp::os::NativeMethods::GetCurrentProcessId();\n}\n\nUnityPalProcessHandle* UnityPalNativeGetCurrentProcess()\n{\n    return il2cpp::os::NativeMethods::GetCurrentProcess();\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/Path-c-api.h",
    "content": "#pragma once\n\n#if defined(__cplusplus)\nextern \"C\"\n{\n#endif\n\nchar* UnityPalGetExecutablePath();\nchar* UnityPalGetTempPath();\n\n#if defined(__cplusplus)\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/Path.cpp",
    "content": "#include \"os/Path.h\"\n#include \"Allocator.h\"\n\n#include <string>\n\nextern \"C\"\n{\nconst char* UnityPalGetTempPath()\n{\n    return Allocator::CopyToAllocatedStringBuffer(il2cpp::os::Path::GetTempPath());\n}\n\nconst char* UnityPalGetExecutablePath()\n{\n    return Allocator::CopyToAllocatedStringBuffer(il2cpp::os::Path::GetExecutablePath());\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/Process-c-api.h",
    "content": "#pragma once\n\n#if defined(__cplusplus)\n\ntypedef il2cpp::os::ProcessHandle UnityPalProcessHandle;\n\n#else\n\ntypedef struct UnityPalProcessHandle UnityPalProcessHandle;\n\n#endif //__cplusplus\n\n#if defined(__cplusplus)\nextern \"C\"\n{\n#endif\n\nint UnityPalGetCurrentProcessId();\nUnityPalProcessHandle* UnityPalGetProcess(int processId);\nvoid UnityPalFreeProcess(UnityPalProcessHandle* handle);\nconst char* UnityPalGetProcessName(UnityPalProcessHandle* handle);\n\n#if defined(__cplusplus)\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/Process.cpp",
    "content": "#include \"os/Process.h\"\n#include \"os/c-api/Process-c-api.h\"\n#include \"Allocator.h\"\n\n#include <string>\n\nextern \"C\"\n{\nint UnityPalGetCurrentProcessId()\n{\n    return il2cpp::os::Process::GetCurrentProcessId();\n}\n\nUnityPalProcessHandle* UnityPalGetProcess(int processId)\n{\n    return il2cpp::os::Process::GetProcess(processId);\n}\n\nvoid UnityPalFreeProcess(UnityPalProcessHandle* handle)\n{\n    return il2cpp::os::Process::FreeProcess(handle);\n}\n\nconst char* UnityPalGetProcessName(UnityPalProcessHandle* handle)\n{\n    return Allocator::CopyToAllocatedStringBuffer(il2cpp::os::Process::GetProcessName(handle));\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/Time-c-api.h",
    "content": "#pragma once\n\n#include <stdint.h>\n\n#if defined(__cplusplus)\nextern \"C\"\n{\n#endif\n\nuint32_t UnityPalGetTicksMillisecondsMonotonic();\nint64_t UnityPalGetTicks100NanosecondsMonotonic();\nint64_t UnityPalGetTicks100NanosecondsDateTime();\nint64_t UnityPalGetSystemTimeAsFileTime();\n\n#if defined(__cplusplus)\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/Time.cpp",
    "content": "#include \"os/Time.h\"\n\n#include <stdint.h>\n\nextern \"C\"\n{\nuint32_t UnityPalGetTicksMillisecondsMonotonic()\n{\n    return il2cpp::os::Time::GetTicksMillisecondsMonotonic();\n}\n\nint64_t UnityPalGetTicks100NanosecondsMonotonic()\n{\n    return il2cpp::os::Time::GetTicks100NanosecondsMonotonic();\n}\n\nint64_t UnityPalGetTicks100NanosecondsDateTime()\n{\n    return il2cpp::os::Time::GetTicks100NanosecondsDateTime();\n}\n\nint64_t UnityPalGetSystemTimeAsFileTime()\n{\n    return il2cpp::os::Time::GetSystemTimeAsFileTime();\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/TimeZone-c-api.h",
    "content": "#pragma once\n\n#include <stdint.h>\n\n#if defined(__cplusplus)\nextern \"C\"\n{\n#endif\n\nbool UnityPalGetTimeZoneData(int32_t year, int64_t data[4], const char* names[2]);\n\n#if defined(__cplusplus)\n}\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/TimeZone.cpp",
    "content": "#include \"os/TimeZone.h\"\n#include \"Allocator.h\"\n\n#include <string>\n\nextern \"C\"\n{\nbool UnityPalGetTimeZoneData(int32_t year, int64_t data[4], const char* names[2])\n{\n    std::string namesBuffer[2];\n    bool result = il2cpp::os::TimeZone::GetTimeZoneData(year, data, namesBuffer);\n\n    names[0] = Allocator::CopyToAllocatedStringBuffer(namesBuffer[0]);\n    names[1] = Allocator::CopyToAllocatedStringBuffer(namesBuffer[1]);\n\n    return result;\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/tests/FileTests.cpp",
    "content": "#if ENABLE_UNIT_TESTS\n\n#include \"UnitTest++.h\"\n\n#include \"../../File.h\"\n#include \"../../Process.h\"\n#include \"../File-c-api.h\"\n\nstatic const char* TEST_FILE_NAME = \"TESTFILE2\";\nstatic const char* DUPLICATE_TEST_FILE_NAME = \"DUP_TESTFILE2\";\nstatic const char* BACKUP_TEST_FILE_NAME = \"BACKUP_TESTFILE2\";\nstatic const int64_t TEST_FILE_LENGTH = 1234567891L;\n\nstatic il2cpp::os::FileHandle*  PrepareTestFile()\n{\n    int error;\n    il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, 1, 0, 0, 0, &error);\n\n    return handle;\n}\n\nstatic void CleanupTestFile(il2cpp::os::FileHandle* handle)\n{\n    int error;\n    il2cpp::os::File::Close(handle, &error);\n    il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error);\n}\n\nstatic void WriteSomeCharactersToTestFile(il2cpp::os::FileHandle* handle)\n{\n    static const char* buffer = \"THIS IS A TEST\\0\";\n    int error;\n\n    il2cpp::os::File::Write(handle, buffer, (int)strlen(buffer), &error);\n}\n\nSUITE(FileTests)\n{\n    TEST(FileIsAttyWithValidButNoTTY)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n\n        bool result = UnityPalIsatty(handle);\n\n        CleanupTestFile(handle);\n\n        CHECK_MSG(!result, \"A normal is a TTY, which is not expected.\");\n    }\n\n    TEST(FileIsAttyMatchesClass)\n    {\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::GetStdInput();\n\n        bool result = UnityPalIsatty(handle);\n\n        CHECK_EQUAL(il2cpp::os::File::Isatty(handle), UnityPalIsatty(handle));\n    }\n\n    TEST(FileIsAttyWithValidButNoTTYMatchesClass)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n\n        bool result = UnityPalIsatty(handle);\n\n        CHECK_EQUAL(il2cpp::os::File::Isatty(handle), UnityPalIsatty(handle));\n\n        CleanupTestFile(handle);\n    }\n\n    TEST(FileOpenTestNoError)\n    {\n        const char* FILE_NAME = \"TESTFILE2\";\n        int error;\n        UnityPalFileHandle* handle = NULL;\n\n        handle = UnityPalOpen(FILE_NAME, 1, 0, 0, 0, &error);\n\n        CHECK_NOT_NULL(handle);\n\n        il2cpp::os::File::Close(handle, &error);\n        il2cpp::os::File::DeleteFile(FILE_NAME, &error);\n    }\n\n    TEST(FileOpenTestWithError)\n    {\n        int error = 0;\n        UnityPalFileHandle* handle = NULL;\n        handle = UnityPalOpen(\"\", 1, 0, 0, 0, &error);\n\n        CHECK_EQUAL(il2cpp::os::kErrorCodePathNotFound, error);\n    }\n\n    TEST(FileOpenWithErrorMatchesClassTest)\n    {\n        int api_error = 0;\n        UnityPalFileHandle* api_handle = NULL;\n        int class_error = 0;\n        UnityPalFileHandle* class_handle = NULL;\n\n        api_handle = UnityPalOpen(\"\", 1, 0, 0, 0, &api_error);\n        class_handle = il2cpp::os::File::Open(\"\", 1, 0, 0, 0, &class_error);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(GetStdInputTest)\n    {\n        CHECK_NOT_NULL(UnityPalGetStdInput());\n    }\n\n    TEST(GetStdOutputTest)\n    {\n        CHECK_NOT_NULL(UnityPalGetStdOutput());\n    }\n\n    TEST(GetStdErrorTest)\n    {\n        CHECK_NOT_NULL(UnityPalGetStdError());\n    }\n\n    TEST(GetFileTypeNormalTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n\n        FileType testFileType = UnityPalGetFileType(handle);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(kFileTypeDisk, testFileType);\n    }\n\n    TEST(GetFileTypeMatchesClass)\n    {\n        CHECK_EQUAL(il2cpp::os::File::GetFileType(UnityPalGetStdError()), UnityPalGetFileType(UnityPalGetStdError()));\n    }\n\n    TEST(GetFileTypeErrorEqualsClass)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        CleanupTestFile(handle);\n        CHECK_EQUAL(il2cpp::os::File::GetFileType(handle), UnityPalGetFileType(handle));\n    }\n\n    TEST(GetFileAttributesCleanErrorTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n\n        UnityPalFileAttributes attributes = UnityPalGetFileAttributes(TEST_FILE_NAME, &error);\n\n        CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n\n        CleanupTestFile(handle);\n    }\n\n    TEST(GetFileAttributesCleanErrorMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int api_error;\n        int class_error;\n\n        UnityPalGetFileAttributes(TEST_FILE_NAME, &api_error);\n        il2cpp::os::File::GetFileAttributes(TEST_FILE_NAME, &class_error);\n\n        CHECK_EQUAL(class_error, api_error);\n\n        CleanupTestFile(handle);\n    }\n\n    TEST(GetFileAttributesMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int api_error;\n        int class_error;\n\n        UnityPalFileAttributes api_attributes = UnityPalGetFileAttributes(TEST_FILE_NAME, &api_error);\n        UnityPalFileAttributes class_attributes = il2cpp::os::File::GetFileAttributes(TEST_FILE_NAME, &class_error);\n\n        CHECK_EQUAL(class_attributes, api_attributes);\n\n        CleanupTestFile(handle);\n    }\n\n    TEST(GetFileAttributesWithBadPath)\n    {\n        int error;\n\n        UnityPalFileAttributes attributes = UnityPalGetFileAttributes(\"sf&236732q#\", &error);\n\n        CHECK_EQUAL(-1, attributes);\n    }\n\n    TEST(GetFileAttributesWithBadPathMatchesClass)\n    {\n        int api_error;\n        int class_error;\n\n        UnityPalFileAttributes api_attributes = UnityPalGetFileAttributes(\"#23sfs#\", &api_error);\n        UnityPalFileAttributes class_attributes = il2cpp::os::File::GetFileAttributes(\"#23sfs#\", &class_error);\n\n        CHECK_EQUAL(class_attributes, api_attributes);\n    }\n\n    TEST(SetFileAttributesNormalResultTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n\n        bool result = UnityPalSetFileAttributes(TEST_FILE_NAME, kFileAttributeTemporary, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK(result);\n    }\n\n    TEST(SetFileAttributesNormalErrorTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        UnityPalSetFileAttributes(TEST_FILE_NAME, kFileAttributeNormal,  &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(SetFileAttributesBadResultTest)\n    {\n        int error;\n\n        bool result = UnityPalSetFileAttributes(\"234232345$$\", kFileAttributeTemporary, &error);\n\n        CHECK(!result);\n    }\n\n    TEST(SetFileAttributesBadErrorTest)\n    {\n        int error;\n\n        UnityPalSetFileAttributes(\"234232345$$\", kFileAttributeTemporary, &error);\n\n        CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(SetFileAttributesNormalResultMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n\n        CHECK_EQUAL(il2cpp::os::File::SetFileAttributes(TEST_FILE_NAME, kFileAttributeTemporary, &error), UnityPalSetFileAttributes(TEST_FILE_NAME, kFileAttributeTemporary, &error));\n\n        CleanupTestFile(handle);\n    }\n\n    TEST(SetFileAttributesNormalAttributeReadMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n\n        UnityPalSetFileAttributes(TEST_FILE_NAME, kFileAttributeTemporary, &error);\n        UnityPalFileAttributes api_attributes = UnityPalGetFileAttributes(TEST_FILE_NAME, &error);\n        CleanupTestFile(handle);\n\n        handle = PrepareTestFile();\n        il2cpp::os::File::SetFileAttributes(TEST_FILE_NAME, kFileAttributeTemporary, &error);\n        UnityPalFileAttributes class_attributes = il2cpp::os::File::GetFileAttributes(TEST_FILE_NAME, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(api_attributes, class_attributes);\n    }\n\n    TEST(SetFileAttributesBadResultMatchesClassTest)\n    {\n        int error;\n        CHECK_EQUAL(il2cpp::os::File::SetFileAttributes(\"234232345$$\", kFileAttributeTemporary, &error), UnityPalSetFileAttributes(\"234232345$$\", kFileAttributeTemporary, &error));\n    }\n\n    TEST(SetFileAttributesBadErrorMatchesClassTest)\n    {\n        int api_error;\n        int class_error;\n\n        UnityPalSetFileAttributes(\"234232345$$\", kFileAttributeTemporary, &api_error);\n        il2cpp::os::File::SetFileAttributes(\"234232345$$\", kFileAttributeTemporary, &class_error);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(GetFileStatNormalResultTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat fileStat;\n\n        bool result = UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK(result);\n    }\n\n    TEST(GetFileStatNormalErrorTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat fileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(GetFileStatBadResultTest)\n    {\n        int error;\n        UnityPalFileStat fileStat;\n\n        bool result = UnityPalGetFileStat(\"#Q23423\", &fileStat, &error);\n\n        CHECK(!result);\n    }\n\n    TEST(GetFileStatBadErrorTest)\n    {\n        int error;\n        UnityPalFileStat fileStat;\n\n        UnityPalGetFileStat(\"#Q23423\", &fileStat, &error);\n\n        CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n\n    TEST(GetFileStatNormalNameTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat fileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(0, strcmp(fileStat.name.c_str(), TEST_FILE_NAME));\n    }\n\n    TEST(GetFileStatNormalLengthTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat fileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(0, fileStat.length);\n    }\n\n    TEST(GetFileStatNormalCreationTimeTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat fileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK(fileStat.creation_time > 100000000);\n    }\n\n    TEST(GetFileStatNormalLastAccessTimeTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat fileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK(fileStat.last_access_time > 100000000);\n    }\n\n    TEST(GetFileStatNormalLastWriteTimeTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat fileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK(fileStat.last_write_time > 100000000);\n    }\n\n    TEST(GetFileStatNormalResultMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat fileStat;\n\n        CHECK_EQUAL(il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &fileStat, &error), UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error));\n\n        CleanupTestFile(handle);\n    }\n\n    TEST(GetFileStatNormalErrorMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int api_error;\n        int class_error;\n        UnityPalFileStat fileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &api_error);\n        il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &fileStat, &class_error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(GetFileStatBadResultMatchesClassTest)\n    {\n        int error;\n        UnityPalFileStat fileStat;\n\n        CHECK_EQUAL(il2cpp::os::File::GetFileStat(\"#Q23423\", &fileStat, &error), UnityPalGetFileStat(\"#Q23423\", &fileStat, &error));\n    }\n\n    TEST(GetFileStatBadErrorMatchesClassTest)\n    {\n        int api_error;\n        int class_error;\n        UnityPalFileStat fileStat;\n\n        UnityPalGetFileStat(\"#Q23423\", &fileStat, &api_error);\n        il2cpp::os::File::GetFileStat(\"#Q23423\", &fileStat, &class_error);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n\n    TEST(GetFileStatNormalNameMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat fileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(0, strcmp(fileStat.name.c_str(), TEST_FILE_NAME));\n    }\n\n    TEST(GetFileStatNormalAttributesMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat apiFileStat;\n        il2cpp::os::FileStat classFileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &apiFileStat, &error);\n        il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classFileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(classFileStat.attributes, apiFileStat.attributes);\n    }\n\n    TEST(GetFileStatNormalLengthMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat apiFileStat;\n        il2cpp::os::FileStat classFileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &apiFileStat, &error);\n        il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classFileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(classFileStat.length, apiFileStat.length);\n    }\n\n    TEST(GetFileStatNormalCreationTimeMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat apiFileStat;\n        il2cpp::os::FileStat classFileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &apiFileStat, &error);\n        il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classFileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(classFileStat.creation_time, apiFileStat.creation_time);\n    }\n\n    TEST(GetFileStatNormalLastAccessTimeMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat apiFileStat;\n        il2cpp::os::FileStat classFileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &apiFileStat, &error);\n        il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classFileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(classFileStat.last_access_time, apiFileStat.last_access_time);\n    }\n\n    TEST(GetFileStatNormalLastWriteTimeMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat apiFileStat;\n        il2cpp::os::FileStat classFileStat;\n\n        UnityPalGetFileStat(TEST_FILE_NAME, &apiFileStat, &error);\n        il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classFileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(classFileStat.last_write_time, apiFileStat.last_write_time);\n    }\n\n    TEST(CopyFileNormalResultTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n\n        bool result = UnityPalCopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &error);\n        UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK(result);\n    }\n\n    TEST(CopyFileNormalErrorTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n\n        UnityPalCopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &error);\n        UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n\n    TEST(CopyFileBadResultTest)\n    {\n        int error;\n        bool result = UnityPalCopyFile(\"#453453\", \"#sdfsdw3\", true, &error);\n\n        CHECK(!result);\n    }\n\n    TEST(CopyFileBadErrorTest)\n    {\n        int error;\n        UnityPalCopyFile(\"#453453\", \"#sdfsdw3\", true, &error);\n\n        CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(CopyFileNormalStatTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat fileStat;\n\n        UnityPalCopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &error);\n        UnityPalGetFileStat(DUPLICATE_TEST_FILE_NAME, &fileStat, &error);\n        UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &error);\n        CleanupTestFile(handle);\n\n        CHECK(fileStat.last_write_time > 100000000);\n    }\n\n    TEST(CopyFileNormalResultMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n\n        bool api_result = UnityPalCopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &error);\n        UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &error);\n\n        bool class_result = il2cpp::os::File::CopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &error);\n        il2cpp::os::File::DeleteFile(DUPLICATE_TEST_FILE_NAME, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(CopyFileNormalErrorMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int api_error;\n        int class_error;\n\n        UnityPalCopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &api_error);\n        UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &api_error);\n        il2cpp::os::File::CopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &class_error);\n        il2cpp::os::File::DeleteFile(DUPLICATE_TEST_FILE_NAME, &class_error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(CopyFileBadResultMatchesClassTest)\n    {\n        int error;\n        CHECK_EQUAL(il2cpp::os::File::CopyFile(\"#453453\", \"#sdfsdw3\", true, &error), UnityPalCopyFile(\"#453453\", \"#sdfsdw3\", true, &error));\n    }\n\n    TEST(CopyFileBadErrorMatchesClassTest)\n    {\n        int api_error;\n        int class_error;\n        UnityPalCopyFile(\"#453453\", \"#sdfsdw3\", true, &api_error);\n        il2cpp::os::File::CopyFile(\"#453453\", \"#sdfsdw3\", true, &class_error);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(MoveFileBadResultTest)\n    {\n        int error;\n        bool result = UnityPalMoveFile(\"#453453\", \"#sdfsdw3\", &error);\n\n        CHECK(!result);\n    }\n\n    TEST(MoveFileBadErrorTest)\n    {\n        int error;\n        UnityPalMoveFile(\"#453453\", \"#sdfsdw3\", &error);\n\n        CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(MoveFileNormalResultMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n\n        bool api_result = UnityPalMoveFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, &error);\n        UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &error);\n        CleanupTestFile(handle);\n        handle = PrepareTestFile();\n        bool class_result = il2cpp::os::File::MoveFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, &error);\n        il2cpp::os::File::DeleteFile(DUPLICATE_TEST_FILE_NAME, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(MoveFileNormalErrorMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int api_error;\n        int class_error;\n\n        UnityPalMoveFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, &api_error);\n        UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &api_error);\n        CleanupTestFile(handle);\n        handle = PrepareTestFile();\n        il2cpp::os::File::MoveFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, &class_error);\n        il2cpp::os::File::DeleteFile(DUPLICATE_TEST_FILE_NAME, &class_error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(MoveFileBadResultMatchesClassTest)\n    {\n        int error;\n        CHECK_EQUAL(il2cpp::os::File::MoveFile(\"#453453\", \"#sdfsdw3\", &error), UnityPalMoveFile(\"#453453\", \"#sdfsdw3\", &error));\n    }\n\n    TEST(MoveFileBadErrorMatchesClassTest)\n    {\n        int api_error;\n        int class_error;\n        UnityPalMoveFile(\"#453453\", \"#sdfsdw3\", &api_error);\n        il2cpp::os::File::MoveFile(\"#453453\", \"#sdfsdw3\", &class_error);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(DeleteFileNormalResultTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n\n        bool result = UnityPalDeleteFile(TEST_FILE_NAME, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK(result);\n    }\n\n    TEST(DeleteFileNormalErrorTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n\n        UnityPalDeleteFile(TEST_FILE_NAME, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n\n    TEST(DeleteFileBadResultTest)\n    {\n        int error;\n        bool result = UnityPalDeleteFile(\"#453453\", &error);\n\n        CHECK(!result);\n    }\n\n\n    TEST(DeleteFileBadErrorTest)\n    {\n        int error;\n        UnityPalDeleteFile(\"#453453\", &error);\n\n        CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(DeleteFileNormalStatTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n        UnityPalFileStat fileStat;\n\n        UnityPalDeleteFile(TEST_FILE_NAME, &error);\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n        CleanupTestFile(handle);\n\n        CHECK(fileStat.last_write_time < 1);\n    }\n\n    TEST(DeleteFileNormalResultMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int error;\n\n        bool api_result = UnityPalDeleteFile(TEST_FILE_NAME, &error);\n        CleanupTestFile(handle);\n        handle = PrepareTestFile();\n        bool class_result = il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(DeleteFileNormalErrorMatchesClassTest)\n    {\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int api_error;\n        int class_error;\n\n        UnityPalDeleteFile(TEST_FILE_NAME, &api_error);\n        CleanupTestFile(handle);\n        handle = PrepareTestFile();\n        il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &class_error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(DeleteFileBadResultMatchesClassTest)\n    {\n        int error;\n        CHECK_EQUAL(il2cpp::os::File::DeleteFile(\"#453453\", &error), UnityPalDeleteFile(\"#453453\", &error));\n    }\n\n    TEST(DeleteFileBadErrorMatchesClassTest)\n    {\n        int api_error;\n        int class_error;\n        UnityPalDeleteFile(\"#453453\", &api_error);\n        il2cpp::os::File::DeleteFile(\"#453453\", &class_error);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(ReplaceFileTest)\n    {\n        // TODO Figure out how to test\n        // Replace File does not seem to work in libil2cpp\n    }\n\n    TEST(OpenFileNormalResultTest)\n    {\n        int error;\n        UnityPalFileHandle* handle = NULL;\n\n        handle =  UnityPalOpen(TEST_FILE_NAME, 1, 0, 0, 0, &error);\n\n        CHECK_NOT_NULL(handle);\n\n        il2cpp::os::File::Close(handle, &error);\n        il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error);\n    }\n\n    TEST(OpenFileNormalErrorTest)\n    {\n        int error;\n        UnityPalFileHandle* handle = NULL;\n\n        handle = UnityPalOpen(TEST_FILE_NAME, 1, 0, 0, 0, &error);\n\n        CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n\n        il2cpp::os::File::Close(handle, &error);\n        il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error);\n    }\n\n    TEST(OpenFileNormalStatTest)\n    {\n        int error;\n        UnityPalFileStat fileStat;\n        UnityPalFileHandle* handle = NULL;\n\n        handle = UnityPalOpen(TEST_FILE_NAME, 1, 0, 0, 0, &error);\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n        il2cpp::os::File::Close(handle, &error);\n        il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error);\n\n        CHECK(fileStat.last_write_time > 1);\n    }\n\n    TEST(OpenFileNormalErrorMatchesClassTest)\n    {\n        int error;\n        int api_error;\n        int class_error;\n        UnityPalFileHandle* handle = NULL;\n\n        handle = UnityPalOpen(TEST_FILE_NAME, 1, 0, 0, 0, &api_error);\n        il2cpp::os::File::Close(handle, &error);\n        il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error);\n\n        handle = il2cpp::os::File::Open(TEST_FILE_NAME, 1, 0, 0, 0, &class_error);\n        il2cpp::os::File::Close(handle, &error);\n        il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(OpenFileNormalStatMatchesClassTest)\n    {\n        int error;\n        UnityPalFileStat api_fileStat;\n        il2cpp::os::FileStat class_fileStat;\n        UnityPalFileHandle* handle = NULL;\n\n        handle = UnityPalOpen(TEST_FILE_NAME, 1, 0, 0, 0, &error);\n        UnityPalGetFileStat(TEST_FILE_NAME, &api_fileStat, &error);\n        il2cpp::os::File::Close(handle, &error);\n        il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error);\n\n        handle = il2cpp::os::File::Open(TEST_FILE_NAME, 1, 0, 0, 0, &error);\n        il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &class_fileStat, &error);\n        il2cpp::os::File::Close(handle, &error);\n\n\n        // Tthey dont have to be exact, just in the ballpark\n        CHECK_EQUAL(class_fileStat.last_write_time / 1000000L, api_fileStat.last_write_time / 1000000L);\n    }\n\n    TEST(SetFileTimeNormalTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate,  kFileAccessReadWrite, 0, 0, &error);\n        UnityPalFileStat fileStat;\n        bool result = UnityPalSetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error);\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n        CleanupTestFile(handle);\n\n        CHECK(result);\n    }\n/*\n    TEST(SetFileTimeNormalStatTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        UnityPalFileStat fileStat;\n        bool result = UnityPalSetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error);\n        UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error);\n        CleanupTestFile(handle);\n\n        CHECK(fileStat.creation_time == 131360602701336952 && fileStat.last_write_time == 131360602701336952 && fileStat.last_access_time == 131360602701336952);\n    }\n*/\n    TEST(SetFileTimeNormalErrorTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        bool result = UnityPalSetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(SetFileTimeNormalMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        UnityPalFileStat fileStat;\n        bool api_result = UnityPalSetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error);\n        bool class_result = il2cpp::os::File::SetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(SetFileTimeNormalStatMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        UnityPalFileStat api_fileStat;\n        UnityPalFileStat class_fileStat;\n\n        UnityPalSetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error);\n        UnityPalGetFileStat(TEST_FILE_NAME, &api_fileStat, &error);\n\n        il2cpp::os::File::SetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error);\n        il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &class_fileStat, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK(api_fileStat.creation_time == class_fileStat.creation_time && api_fileStat.last_write_time == class_fileStat.last_write_time && api_fileStat.last_access_time == class_fileStat.last_access_time);\n    }\n\n    TEST(SetFileTimeNormalErrorMatchesClassTest)\n    {\n        int error;\n        int api_error;\n        int class_error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        UnityPalSetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &api_error);\n        il2cpp::os::File::SetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &class_error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(GetLengthNormalTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n        int64_t length = UnityPalGetLength(handle, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(14, length);\n    }\n\n    TEST(GetLengthZeroTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int64_t length = UnityPalGetLength(handle, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(0, length);\n    }\n\n    TEST(GetLengthBadFileErrorTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        CleanupTestFile(handle);\n        UnityPalGetLength(handle, &error);\n\n        CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(GetLengthNormalMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n        int64_t api_length = UnityPalGetLength(handle, &error);\n        int64_t class_length = il2cpp::os::File::GetLength(handle, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_length, api_length);\n    }\n\n    TEST(GetLengthZeroMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        int64_t api_length = UnityPalGetLength(handle, &error);\n        int64_t class_length = il2cpp::os::File::GetLength(handle, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_length, api_length);\n    }\n\n    TEST(GetLengthBadFileErrorMatchesClassTest)\n    {\n        int api_error;\n        int class_error;\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        CleanupTestFile(handle);\n        UnityPalGetLength(handle, &api_error);\n        il2cpp::os::File::GetLength(handle, &class_error);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(SetLengthNormalResultTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        bool result = UnityPalSetLength(handle, TEST_FILE_LENGTH, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK(result);\n    }\n\n    TEST(SetLengthNormalGetLengthTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        bool result = UnityPalSetLength(handle, TEST_FILE_LENGTH, &error);\n        int64_t length = il2cpp::os::File::GetLength(handle, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(TEST_FILE_LENGTH, length);\n    }\n\n    TEST(SetLengthBadResultTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        CleanupTestFile(handle);\n\n        bool result = UnityPalSetLength(handle, TEST_FILE_LENGTH, &error);\n\n        CHECK(!result);\n    }\n\n    TEST(SetLengthBadErrorTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        CleanupTestFile(handle);\n\n        UnityPalSetLength(handle, TEST_FILE_LENGTH, &error);\n\n        CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(SetLengthNormalResultMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        bool api_result = UnityPalSetLength(handle, TEST_FILE_LENGTH, &error);\n\n        CleanupTestFile(handle);\n        handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        bool class_result = il2cpp::os::File::SetLength(handle, TEST_FILE_LENGTH, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(SetLengthNormalGetLengthMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        UnityPalSetLength(handle, TEST_FILE_LENGTH, &error);\n        int64_t api_length = il2cpp::os::File::GetLength(handle, &error);\n        CleanupTestFile(handle);\n\n        handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        il2cpp::os::File::SetLength(handle, TEST_FILE_LENGTH, &error);\n        int64_t class_length = il2cpp::os::File::GetLength(handle, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_length, api_length);\n    }\n\n    TEST(SetLengthBadResultMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        CleanupTestFile(handle);\n\n        bool api_result = UnityPalSetLength(handle, TEST_FILE_LENGTH, &error);\n        bool class_result = il2cpp::os::File::SetLength(handle, TEST_FILE_LENGTH, &error);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(SetLengthBadErrorMatchesClassTest)\n    {\n        int api_error;\n        int class_error;\n        il2cpp::os::FileHandle* handle = PrepareTestFile();\n        CleanupTestFile(handle);\n\n        UnityPalSetLength(handle, TEST_FILE_LENGTH, &api_error);\n        il2cpp::os::File::SetLength(handle, TEST_FILE_LENGTH, &class_error);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(SeekNormalResultTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        int64_t result = UnityPalSeek(handle, 10, 0, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(10, result);\n    }\n\n    TEST(SeekNormalBufferTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        int64_t result = UnityPalSeek(handle, 10, 0, &error);\n        char buffer[15];\n        il2cpp::os::File::Read(handle, buffer, 4, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(0, strncmp(\"TEST\", buffer, 4));\n    }\n\n    TEST(SeekBadErrorTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        CleanupTestFile(handle);\n\n        UnityPalSeek(handle, 10, 0, &error);\n\n        CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(SeekNormalResultMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        int64_t api_result = UnityPalSeek(handle, 10, 0, &error);\n        CleanupTestFile(handle);\n\n        handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        int64_t class_result = il2cpp::os::File::Seek(handle, 10, 0, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(SeekNormalBufferMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        UnityPalSeek(handle, 10, 0, &error);\n        char api_buffer[15];\n        char class_buffer[15];\n        il2cpp::os::File::Read(handle, api_buffer, 4, &error);\n\n        CleanupTestFile(handle);\n\n\n        handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        il2cpp::os::File::Seek(handle, 10, 0, &error);\n        il2cpp::os::File::Read(handle, class_buffer, 4, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(0, strncmp(class_buffer, api_buffer, 4));\n    }\n\n    TEST(SeekBadErrorMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        CleanupTestFile(handle);\n\n        UnityPalSeek(handle, 10, 0, &error);\n\n        CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(ReadNormalResultTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        char buffer[16];\n        UnityPalSeek(handle, 0, 0, &error);\n        int result = UnityPalRead(handle, buffer, 16, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(14, result);\n    }\n\n    TEST(ReadNormalBufferTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        char buffer[16];\n        UnityPalSeek(handle, 0, 0, &error);\n        UnityPalRead(handle, buffer, 16, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(0, strncmp(\"THIS IS A TEST\", buffer, 14));\n    }\n\n    TEST(ReadBadResultTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        CleanupTestFile(handle);\n        char buffer[16];\n        int64_t result = UnityPalRead(handle, buffer, 16, &error);\n\n        CHECK(!result);\n    }\n\n    TEST(ReadBadErrorTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        CleanupTestFile(handle);\n        char buffer[16];\n        UnityPalRead(handle, buffer, 16, &error);\n\n        CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(ReadNormalResultMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        UnityPalSeek(handle, 0, 0, &error);\n        char buffer[16];\n        int api_result = UnityPalRead(handle, buffer, 14, &error);\n        CleanupTestFile(handle);\n\n        handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        il2cpp::os::File::Seek(handle, 0, 0, &error);\n        int class_result = il2cpp::os::File::Read(handle, buffer, 14, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(ReadNormalBufferMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        UnityPalSeek(handle, 0, 0, &error);\n        char api_buffer[16];\n        char class_buffer[16];\n        UnityPalRead(handle, api_buffer, 14, &error);\n        CleanupTestFile(handle);\n\n        handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        il2cpp::os::File::Seek(handle, 0, 0, &error);\n        il2cpp::os::File::Read(handle, class_buffer, 14, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(0, strncmp(class_buffer, api_buffer, 14));\n    }\n\n\n    TEST(ReadBadResultMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        CleanupTestFile(handle);\n\n        char buffer[16];\n\n        int64_t api_result = UnityPalRead(handle, buffer, 14, &error);\n        int64_t class_result = il2cpp::os::File::Read(handle, buffer, 14, &error);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(ReadBadErrorMatchesClassTest)\n    {\n        int error;\n        int api_error;\n        int class_error;\n\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        CleanupTestFile(handle);\n\n        char buffer[16];\n\n        UnityPalRead(handle, buffer, 14, &api_error);\n        il2cpp::os::File::Read(handle, buffer, 14, &class_error);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(WriteNormalResultTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        static const char* buffer = \"THIS IS A TEST\\0\";\n\n        int32_t result = UnityPalWrite(handle, buffer, 14, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(14, result);\n    }\n\n    TEST(WriteNormalErrorTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        static const char* buffer = \"THIS IS A TEST\\0\";\n\n        UnityPalWrite(handle, buffer, 14, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(WriteNormalBufferCheckTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        static const char* buffer = \"THIS IS A TEST\\0\";\n        UnityPalWrite(handle, buffer, 14, &error);\n\n        char read_buffer[16];\n        il2cpp::os::File::Seek(handle, 0, 0, &error);\n        il2cpp::os::File::Read(handle, read_buffer, 16, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(0, strncmp(\"THIS IS A TEST\", buffer, 14));\n    }\n\n    TEST(WriteBadResultTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        CleanupTestFile(handle);\n        static const char* buffer = \"THIS IS A TEST\\0\";\n\n        int32_t result = UnityPalWrite(handle, buffer, 14, &error);\n\n\n        CHECK_EQUAL(0, result);\n    }\n\n    TEST(WriteNormalResultMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        static const char* buffer = \"THIS IS A TEST\\0\";\n\n        int32_t api_result = UnityPalWrite(handle, buffer, 14, &error);\n        int32_t class_result = il2cpp::os::File::Write(handle, buffer, 14, &error);\n\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(WriteNormalBufferCheckMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        static const char* buffer = \"THIS IS A TEST\\0\";\n        UnityPalWrite(handle, buffer, 14, &error);\n\n        char api_read_buffer[16];\n        il2cpp::os::File::Seek(handle, 0, 0, &error);\n        il2cpp::os::File::Read(handle, api_read_buffer, 16, &error);\n        CleanupTestFile(handle);\n\n        handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        il2cpp::os::File::Write(handle, buffer, 14, &error);\n        char class_read_buffer[16];\n        il2cpp::os::File::Seek(handle, 0, 0, &error);\n        il2cpp::os::File::Read(handle, class_read_buffer, 16, &error);\n        CleanupTestFile(handle);\n\n\n        CHECK_EQUAL(0, strncmp(class_read_buffer, api_read_buffer, 14));\n    }\n\n    TEST(WriteBadResultMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        CleanupTestFile(handle);\n        static const char* buffer = \"THIS IS A TEST\\0\";\n\n        int32_t api_result = UnityPalWrite(handle, buffer, 14, &error);\n        int32_t class_result = il2cpp::os::File::Write(handle, buffer, 14, &error);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(WriteBadErrorMatchesClassTest)\n    {\n        int error;\n        int api_error;\n        int class_error;\n\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, 1, 1, 0, 0, &error);\n        CleanupTestFile(handle);\n        static const char* buffer = \"THIS IS A TEST\\0\";\n\n        UnityPalWrite(handle, buffer, 14, &api_error);\n        il2cpp::os::File::Write(handle, buffer, 14, &class_error);\n\n        CHECK_EQUAL(api_error, class_error);\n    }\n\n    TEST(FlushNormalResultTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        bool result = UnityPalFlush(handle, &error);\n        CleanupTestFile(handle);\n\n        CHECK(result);\n    }\n\n    TEST(FlushNormalErrorTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n\n        UnityPalFlush(handle, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n    TEST(FlushBadResultTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n        CleanupTestFile(handle);\n\n        bool result = UnityPalFlush(handle, &error);\n\n        CHECK(!result);\n    }\n\n    TEST(FlushBadErrorTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n        CleanupTestFile(handle);\n\n        UnityPalFlush(handle, &error);\n\n        CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error);\n    }\n\n\n    TEST(FlushNormalResultMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        WriteSomeCharactersToTestFile(handle);\n        bool api_result = UnityPalFlush(handle, &error);\n        WriteSomeCharactersToTestFile(handle);\n        bool class_result = il2cpp::os::File::Flush(handle, &error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n    TEST(FlushNormalErrorMatchesClassTest)\n    {\n        int error;\n        int api_error;\n        int class_error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n\n        WriteSomeCharactersToTestFile(handle);\n        UnityPalFlush(handle, &api_error);\n        WriteSomeCharactersToTestFile(handle);\n        il2cpp::os::File::Flush(handle, &class_error);\n        CleanupTestFile(handle);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(FlushBadResultMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n        CleanupTestFile(handle);\n\n        bool api_result = UnityPalFlush(handle, &error);\n        bool class_result = il2cpp::os::File::Flush(handle, &error);\n\n        CHECK_EQUAL(api_result, class_result);\n    }\n\n    TEST(FlushBadErrorMatchesClassTest)\n    {\n        int error;\n        int api_error;\n        int class_error;\n\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error);\n        WriteSomeCharactersToTestFile(handle);\n        CleanupTestFile(handle);\n\n        UnityPalFlush(handle, &api_error);\n        il2cpp::os::File::Flush(handle, &class_error);\n\n        CHECK_EQUAL(class_error, api_error);\n    }\n\n    TEST(CreatePipeNormalResultTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* read_handle;\n        il2cpp::os::FileHandle* write_handle;\n\n        bool result = UnityPalCreatePipe(&read_handle, &write_handle);\n        il2cpp::os::File::Close(read_handle, &error);\n        il2cpp::os::File::Close(write_handle, &error);\n\n        CHECK(result);\n    }\n\n    TEST(CreatePipeNormalBufferTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* read_handle;\n        il2cpp::os::FileHandle* write_handle;\n\n        UnityPalCreatePipe(&read_handle, &write_handle);\n\n        WriteSomeCharactersToTestFile(write_handle);\n        char buffer[16];\n        il2cpp::os::File::Read(read_handle, buffer, 4, &error);\n\n        il2cpp::os::File::Close(read_handle, &error);\n        il2cpp::os::File::Close(write_handle, &error);\n\n        CHECK_EQUAL(0, strncmp(\"THIS\", buffer, 4));\n    }\n\n    TEST(CreatePipeNormalResultMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* read_handle;\n        il2cpp::os::FileHandle* write_handle;\n\n        bool api_result = UnityPalCreatePipe(&read_handle, &write_handle);\n        il2cpp::os::File::Close(read_handle, &error);\n        il2cpp::os::File::Close(write_handle, &error);\n\n        bool class_result = il2cpp::os::File::CreatePipe(&read_handle, &write_handle);\n        il2cpp::os::File::Close(read_handle, &error);\n        il2cpp::os::File::Close(write_handle, &error);\n\n        CHECK_EQUAL(class_result, api_result);\n    }\n\n\n    TEST(CreatePipeNormalBufferMatchesClassTest)\n    {\n        int error;\n        il2cpp::os::FileHandle* api_read_handle;\n        il2cpp::os::FileHandle* api_write_handle;\n        il2cpp::os::FileHandle* class_read_handle;\n        il2cpp::os::FileHandle* class_write_handle;\n\n        UnityPalCreatePipe(&api_read_handle, &api_write_handle);\n\n        WriteSomeCharactersToTestFile(api_write_handle);\n        char api_buffer[16];\n        il2cpp::os::File::Read(api_read_handle, api_buffer, 4, &error);\n        il2cpp::os::File::Close(api_read_handle, &error);\n        il2cpp::os::File::Close(api_write_handle, &error);\n\n        il2cpp::os::File::CreatePipe(&class_read_handle, &class_write_handle);\n        WriteSomeCharactersToTestFile(class_write_handle);\n        char class_buffer[16];\n        il2cpp::os::File::Read(class_read_handle, class_buffer, 4, &error);\n        il2cpp::os::File::Close(class_read_handle, &error);\n        il2cpp::os::File::Close(class_write_handle, &error);\n\n        CHECK_EQUAL(0, strncmp(class_buffer, api_buffer, 4));\n    }\n}\n\n#endif // ENABLE_UNIT_TESTS\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/tests/MainTestRunner.cpp",
    "content": "#if ENABLE_UNIT_TESTS\n\n#include \"UnitTest++.h\"\n#include \"il2cpp-config.h\"\n#include \"../Allocator.h\"\n\n// Have to define this due to Unity's customized\n// version of UNitTest++ that integrates into the Unity\n// editor.\n\nextern \"C\"\n{\nvoid printf_console_log(const char* log, va_list list) {}\n}\n\n// We can't use Il2CppNativeChar here due to an old bug in clang handling typdefs in main.\n#if _MSC_VER\nint main(int argc, const wchar_t* const argv[])\n#else\nint main(int argc, const char* const argv[])\n#endif\n{\n    register_allocator(malloc);\n    return UnitTest::RunAllTests();\n}\n\n#if IL2CPP_TARGET_WINDOWS\n\n#if IL2CPP_TARGET_WINDOWS_DESKTOP\n#include <windows.h>\n#else\n#include \"ActivateApp.h\"\n#endif\n\nint WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)\n{\n#if IL2CPP_TARGET_WINDOWS_DESKTOP\n    int argc;\n    wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc);\n    int returnValue = main(argc, argv);\n    LocalFree(argv);\n    return returnValue;\n#else\n    return WinRT::Activate(main);\n#endif\n}\n\n#endif\n\n#endif // ENABLE_UNIT_TESTS\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/tests/NativeMethodsTests.cpp",
    "content": "#if ENABLE_UNIT_TESTS\n\n#include \"UnitTest++.h\"\n\nSUITE(NativeMethodsTests)\n{\n    TEST(FirstNativeMethodTest)\n    {\n    }\n}\n\n#endif // ENABLE_UNIT_TESTS\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/tests/PathTests.cpp",
    "content": "#if ENABLE_UNIT_TESTS\n\n#include \"UnitTest++.h\"\n\n#include \"../Path-c-api.h\"\n#include \"../../Path.h\"\n\nSUITE(PathTests)\n{\n    TEST(GetTempPathNotNullTest)\n    {\n        CHECK_NOT_NULL(UnityPalGetTempPath());\n    }\n\n    TEST(GetTempPathSanityTest)\n    {\n        // Path will never be the same depeding on user, platform,machine etc.  Check if the string is\n        // at least a few chars long\n        CHECK(strlen(UnityPalGetTempPath()) > 5);\n    }\n\n    TEST(GetTempPathTestMatchesClassTest)\n    {\n        CHECK_EQUAL(il2cpp::os::Path::GetTempPath().c_str(), UnityPalGetTempPath());\n    }\n\n    TEST(GetExecutablePathNotNullTest)\n    {\n        CHECK_NOT_NULL(UnityPalGetExecutablePath());\n    }\n\n    TEST(GetExecutablePathSanityTest)\n    {\n        // Path will never be the same depeding on user, platform,machine etc.  Check if the string is\n        // at least a few chars long\n        CHECK(strlen(UnityPalGetExecutablePath()) > 5);\n    }\n\n    TEST(GetExecutablePathMatchesClassTest)\n    {\n        CHECK_EQUAL(il2cpp::os::Path::GetExecutablePath().c_str(), UnityPalGetExecutablePath());\n    }\n}\n\n#endif // ENABLE_UNIT_TESTS\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/tests/ProcessTests.cpp",
    "content": "#if ENABLE_UNIT_TESTS\n\n#include \"UnitTest++.h\"\n\n#include \"../../Process.h\"\n#include \"../Process-c-api.h\"\n\n\nSUITE(ProcessTests)\n{\n    TEST(GetProcessIDTest)\n    {\n        CHECK(UnityPalGetCurrentProcessId() > 0);\n    }\n\n    TEST(GetProcessIDMatchesClassTest)\n    {\n        CHECK_EQUAL(il2cpp::os::Process::GetCurrentProcessId(), UnityPalGetCurrentProcessId());\n    }\n\n    TEST(GetProcessHandleValidTest)\n    {\n        UnityPalProcessHandle* handle = NULL;\n        handle = UnityPalGetProcess(UnityPalGetCurrentProcessId());\n\n        CHECK_NOT_NULL(handle);\n    }\n\n    TEST(GetProcessHandleMatchesClassTest)\n    {\n        int processId = il2cpp::os::Process::GetCurrentProcessId();\n        UnityPalProcessHandle* api_handle = UnityPalGetProcess(processId);\n        il2cpp::os::ProcessHandle* class_handle = il2cpp::os::Process::GetProcess(processId);\n\n        std::string api_name = il2cpp::os::Process::GetProcessName(api_handle);\n        std::string class_name = il2cpp::os::Process::GetProcessName(class_handle);\n\n        CHECK_EQUAL(class_name, api_name);\n    }\n\n    TEST(GetProcessNameNotNullTest)\n    {\n        int processId = il2cpp::os::Process::GetCurrentProcessId();\n        UnityPalProcessHandle* processHandle = UnityPalGetProcess(processId);\n\n        const char* processName = UnityPalGetProcessName(processHandle);\n\n        CHECK_NOT_NULL(processName);\n    }\n\n    TEST(GetProcessNameValidTest)\n    {\n        int processId = il2cpp::os::Process::GetCurrentProcessId();\n        UnityPalProcessHandle* processHandle = UnityPalGetProcess(processId);\n\n        const char* processName = UnityPalGetProcessName(processHandle);\n\n        CHECK(strlen(processName) > 0);\n    }\n\n    TEST(GetProcessNameMatchesClassTest)\n    {\n        int processId = il2cpp::os::Process::GetCurrentProcessId();\n        UnityPalProcessHandle* api_handle = UnityPalGetProcess(processId);\n        il2cpp::os::ProcessHandle* class_handle = il2cpp::os::Process::GetProcess(processId);\n\n        const char* api_name = UnityPalGetProcessName(api_handle);\n        std::string class_name = il2cpp::os::Process::GetProcessName(class_handle);\n\n        CHECK_EQUAL(class_name.c_str(), api_name);\n    }\n\n    TEST(GetProcessNameWithInvalidIdTest)\n    {\n        const char* processName = NULL;\n\n        // First check the staticness, grab a real string\n        processName = UnityPalGetProcessName(UnityPalGetProcess(UnityPalGetCurrentProcessId()));\n\n        // Now test that it goes blank\n        processName = UnityPalGetProcessName(UnityPalGetProcess(-9999999));\n\n        CHECK_EQUAL(\"\", processName);\n    }\n}\n\n#endif // ENABLE_UNIT_TESTS\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/tests/TimeTests.cpp",
    "content": "#if ENABLE_UNIT_TESTS\n\n#include \"UnitTest++.h\"\n\n#include \"../Time-c-api.h\"\n#include \"../../Time.h\"\n\nSUITE(TimeTests)\n{\n    TEST(TicksMillisecondsMonotonicTestValid)\n    {\n        CHECK(UnityPalGetTicksMillisecondsMonotonic() > 0);\n    }\n\n    TEST(TicksMillisecondsMonotonicEqualsClassTest)\n    {\n        CHECK_EQUAL(il2cpp::os::Time::GetTicksMillisecondsMonotonic(), UnityPalGetTicksMillisecondsMonotonic());\n    }\n\n    TEST(Ticks100NanosecondsMonotonicTestValid)\n    {\n        CHECK(UnityPalGetTicks100NanosecondsMonotonic() > 0);\n    }\n\n    TEST(Ticks100NanosecondsMonotonicEqualsClassTest)\n    {\n        // This number is fairly sensitive to time between calls, check to see if they are close enough, chop off the last few digits\n        CHECK_EQUAL(il2cpp::os::Time::GetTicks100NanosecondsMonotonic() / 1000L, UnityPalGetTicks100NanosecondsMonotonic() / 1000L);\n    }\n\n    TEST(GetTicks100NanosecondsDateTimeTest)\n    {\n        CHECK(UnityPalGetTicks100NanosecondsDateTime() > 0);\n    }\n\n    TEST(GetTicks100NanosecondsDateTimeEqualsClassTest)\n    {\n        CHECK_EQUAL(il2cpp::os::Time::GetTicks100NanosecondsDateTime() / 1000L, UnityPalGetTicks100NanosecondsDateTime() / 1000L);\n    }\n\n    TEST(GetSystemTimeAsFileTimeTest)\n    {\n        CHECK(UnityPalGetSystemTimeAsFileTime() > 0);\n    }\n\n    TEST(GetSystemTimeAsFileTimeEqualsClassTest)\n    {\n        CHECK_EQUAL(il2cpp::os::Time::GetSystemTimeAsFileTime(), UnityPalGetSystemTimeAsFileTime());\n    }\n}\n\n#endif // ENABLE_UNIT_TESTS\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/tests/TimeZoneTests.cpp",
    "content": "#if ENABLE_UNIT_TESTS\n\n#include \"UnitTest++.h\"\n\n#include \"../TimeZone-c-api.h\"\n#include \"../../TimeZone.h\"\n\n\nSUITE(TimeZoneTests)\n{\n    static const int32_t INVALID_YEAR = -45;\n    static const int32_t VALID_YEAR = 2015;\n\n    TEST(TimeZoneResultMatchesClassResultValidYear)\n    {\n        int64_t data_c_api[4];\n        const char* names_c_api[2];\n        bool result_c_api;\n\n        int64_t data_class[4];\n        std::string names_class[2];\n        bool result_class;\n\n        result_c_api = UnityPalGetTimeZoneData(VALID_YEAR, data_c_api, names_c_api);\n        result_class = il2cpp::os::TimeZone::GetTimeZoneData(VALID_YEAR, data_class, names_class);\n\n        CHECK_EQUAL(result_class, result_c_api);\n    }\n\n    TEST(TimeZoneResultMatchesClassResultInValidYear)\n    {\n        int64_t data_c_api[4];\n        const char* names_c_api[2];\n        bool result_c_api;\n\n        int64_t data_class[4];\n        std::string names_class[2];\n        bool result_class;\n\n        result_c_api = UnityPalGetTimeZoneData(INVALID_YEAR, data_c_api, names_c_api);\n        result_class = il2cpp::os::TimeZone::GetTimeZoneData(INVALID_YEAR, data_class, names_class);\n\n        CHECK_EQUAL(result_class, result_c_api);\n    }\n\n    TEST(TimeZoneStartOfDayLightSavingsValidYearMatchesClass)\n    {\n        int64_t data_c_api[4];\n        const char* names_c_api[2];\n        bool result_c_api;\n\n        int64_t data_class[4];\n        std::string names_class[2];\n        bool result_class;\n\n        result_c_api = UnityPalGetTimeZoneData(VALID_YEAR, data_c_api, names_c_api);\n        result_class = il2cpp::os::TimeZone::GetTimeZoneData(VALID_YEAR, data_class, names_class);\n\n        CHECK_EQUAL(data_class[0], data_c_api[0]);\n    }\n\n    TEST(TimeZoneEndOfDayLightSavingsValidYearMatchesClass)\n    {\n        int64_t data_c_api[4];\n        const char* names_c_api[2];\n        bool result_c_api;\n\n        int64_t data_class[4];\n        std::string names_class[2];\n        bool result_class;\n\n        result_c_api = UnityPalGetTimeZoneData(VALID_YEAR, data_c_api, names_c_api);\n        result_class = il2cpp::os::TimeZone::GetTimeZoneData(VALID_YEAR, data_class, names_class);\n\n        CHECK_EQUAL(data_class[1], data_c_api[1]);\n    }\n\n    TEST(TimeZoneUTFOffsetValidYear)\n    {\n        int64_t data_c_api[4];\n        const char* names_c_api[2];\n        bool result_c_api;\n\n        result_c_api = UnityPalGetTimeZoneData(VALID_YEAR, data_c_api, names_c_api);\n\n        CHECK(data_c_api[2] < 1L);\n    }\n\n    TEST(TimeZoneUTFOffSetValidYearMatchesClass)\n    {\n        int64_t data_c_api[4];\n        const char* names_c_api[2];\n        bool result_c_api;\n\n        int64_t data_class[4];\n        std::string names_class[2];\n        bool result_class;\n\n        result_c_api = UnityPalGetTimeZoneData(VALID_YEAR, data_c_api, names_c_api);\n        result_class = il2cpp::os::TimeZone::GetTimeZoneData(VALID_YEAR, data_class, names_class);\n\n        CHECK_EQUAL(data_class[2], data_c_api[2]);\n    }\n\n    TEST(TimeZoneAdditionalOffSetValidYearMatchesClass)\n    {\n        int64_t data_c_api[4];\n        const char* names_c_api[2];\n        bool result_c_api;\n\n        int64_t data_class[4];\n        std::string names_class[2];\n        bool result_class;\n\n        result_c_api = UnityPalGetTimeZoneData(VALID_YEAR, data_c_api, names_c_api);\n        result_class = il2cpp::os::TimeZone::GetTimeZoneData(VALID_YEAR, data_class, names_class);\n\n        CHECK_EQUAL(data_class[3], data_c_api[3]);\n    }\n\n    TEST(TimeZoneNameNotDayLighttValidYear)\n    {\n        int64_t data_c_api[4];\n        const char* names_c_api[2];\n        bool result_c_api;\n\n        result_c_api = UnityPalGetTimeZoneData(VALID_YEAR, data_c_api, names_c_api);\n\n        CHECK(strlen(names_c_api[0]) > 1);\n    }\n\n    TEST(TimeZoneNameNotDayLightValidYearMatchesClass)\n    {\n        int64_t data_c_api[4];\n        const char* names_c_api[2];\n        bool result_c_api;\n\n        int64_t data_class[4];\n        std::string names_class[2];\n        bool result_class;\n\n        result_c_api = UnityPalGetTimeZoneData(VALID_YEAR, data_c_api, names_c_api);\n        result_class = il2cpp::os::TimeZone::GetTimeZoneData(VALID_YEAR, data_class, names_class);\n\n        CHECK_EQUAL(names_class[0].c_str(), names_c_api[0]);\n    }\n\n    TEST(TimeZoneNameDayLighttValidYear)\n    {\n        int64_t data_c_api[4];\n        const char* names_c_api[2];\n        bool result_c_api;\n\n        result_c_api = UnityPalGetTimeZoneData(VALID_YEAR, data_c_api, names_c_api);\n\n        CHECK(strlen(names_c_api[1]) > 1);\n    }\n\n    TEST(TimeZoneNameDayLightValidYearMatchesClass)\n    {\n        int64_t data_c_api[4];\n        const char* names_c_api[2];\n        bool result_c_api;\n\n        int64_t data_class[4];\n        std::string names_class[2];\n        bool result_class;\n\n        result_c_api = UnityPalGetTimeZoneData(VALID_YEAR, data_c_api, names_c_api);\n        result_class = il2cpp::os::TimeZone::GetTimeZoneData(VALID_YEAR, data_class, names_class);\n\n        CHECK_EQUAL(names_class[1].c_str(), names_c_api[1]);\n    }\n}\n\n#endif // ENABLE_UNIT_TESTS\n"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/tests/libil2cpp-c-api-tests.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{78826D45-2742-4AAA-A738-CD47C8775876}</ProjectGuid>\n    <RootNamespace>libil2cppcapitests</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0.14393.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v100</PlatformToolset>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>build\\$(Configuration)\\$(Platform)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <AdditionalIncludeDirectories>../../../;../../../../../il2cpp-dependencies/UnitTest++;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PreprocessorDefinitions>ENABLE_UNIT_TESTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>../../../../build/$(Configuration)/$(Platform)/libil2cpp.lib;psapi.lib;Shell32.lib;Advapi32.lib;ole32.lib;oleaut32.lib</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <EntryPointSymbol>wWinMainCRTStartup</EntryPointSymbol>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <AdditionalIncludeDirectories>../../../;../../../../../il2cpp-dependencies/UnitTest++;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>ENABLE_UNIT_TESTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>../../../../build/$(Configuration)/$(Platform)/libil2cpp.lib;psapi.lib;Shell32.lib;Advapi32.lib;ole32.lib;oleaut32.lib</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <EntryPointSymbol>wWinMainCRTStartup</EntryPointSymbol>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <AdditionalIncludeDirectories>../../../;../../../../../il2cpp-dependencies/UnitTest++;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>ENABLE_UNIT_TESTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>../../../../build/$(Configuration)/$(Platform)/libil2cpp.lib;psapi.lib;Shell32.lib;Advapi32.lib;ole32.lib;oleaut32.lib</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <EntryPointSymbol>wWinMainCRTStartup</EntryPointSymbol>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <AdditionalIncludeDirectories>../../../;../../../../../il2cpp-dependencies/UnitTest++;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>ENABLE_UNIT_TESTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>../../../../build/$(Configuration)/$(Platform)/libil2cpp.lib;psapi.lib;Shell32.lib;Advapi32.lib;ole32.lib;oleaut32.lib</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <EntryPointSymbol>wWinMainCRTStartup</EntryPointSymbol>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\AssertException.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\Checks.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\CurrentTest.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredSuiteReporter.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredSuiteResult.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredTestReporter.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredTestResult.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\MemoryOutStream.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\NunitTestReporter.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\ReportAssert.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\Test.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestDetails.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestList.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporter.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterDebugLog.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterFormat.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterStdout.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestResults.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestRunner.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TimeConstraint.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TimeHelpersDefault.cpp\" />\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\XmlTestReporter.cpp\" />\n    <ClCompile Include=\"FileTests.cpp\" />\n    <ClCompile Include=\"MainTestRunner.cpp\" />\n    <ClCompile Include=\"NativeMethodsTests.cpp\" />\n    <ClCompile Include=\"PathTests.cpp\" />\n    <ClCompile Include=\"ProcessTests.cpp\" />\n    <ClCompile Include=\"TimeTests.cpp\" />\n    <ClCompile Include=\"TimeZoneTests.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\AssertException.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\CheckMacros.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\Checks.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\Config.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\CurrentTest.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredSuiteReporter.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredSuiteResult.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredTestReporter.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredTestResult.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\ExecuteTest.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\MemoryOutStream.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\NunitTestReporter.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\ReportAssert.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\ReportMacros.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\Test.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestAttribute.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestDetails.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestList.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestMacros.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestProperty.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporter.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterDebugLog.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterFormat.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterStdout.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestResults.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestRunner.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestSuite.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TimeConstraint.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TimeHelpers.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TimeHelpersDefault.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TypeHelpers.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\UnitTest++.h\" />\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\XmlTestReporter.h\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "unity_decoder/libil2cpp/os/c-api/tests/libil2cpp-c-api-tests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n    <Filter Include=\"UnitTest++\">\n      <UniqueIdentifier>{a90afd27-d348-410a-80f0-8e370ca5a1f0}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"FileTests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"NativeMethodsTests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"PathTests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"ProcessTests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"TimeTests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"TimeZoneTests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\AssertException.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\Checks.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\CurrentTest.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredSuiteReporter.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredSuiteResult.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredTestReporter.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredTestResult.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\MemoryOutStream.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\NunitTestReporter.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\ReportAssert.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\Test.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestDetails.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestList.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporter.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterDebugLog.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterFormat.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterStdout.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestResults.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestRunner.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TimeConstraint.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TimeHelpersDefault.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\XmlTestReporter.cpp\">\n      <Filter>UnitTest++</Filter>\n    </ClCompile>\n    <ClCompile Include=\"MainTestRunner.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\AssertException.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\CheckMacros.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\Checks.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\Config.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\CurrentTest.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredSuiteReporter.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredSuiteResult.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredTestReporter.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\DeferredTestResult.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\ExecuteTest.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\MemoryOutStream.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\NunitTestReporter.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\ReportAssert.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\ReportMacros.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\Test.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestAttribute.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestDetails.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestList.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestMacros.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestProperty.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporter.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterDebugLog.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterFormat.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestReporterStdout.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestResults.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestRunner.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TestSuite.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TimeConstraint.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TimeHelpers.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TimeHelpersDefault.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\TypeHelpers.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\UnitTest++.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\..\\..\\..\\il2cpp-dependencies\\UnitTest++\\XmlTestReporter.h\">\n      <Filter>UnitTest++</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "unity_decoder/libil2cpp/tabledefs.h",
    "content": "#pragma once\n\n/*\n * Field Attributes (21.1.5).\n */\n\n#define FIELD_ATTRIBUTE_FIELD_ACCESS_MASK     0x0007\n#define FIELD_ATTRIBUTE_COMPILER_CONTROLLED   0x0000\n#define FIELD_ATTRIBUTE_PRIVATE               0x0001\n#define FIELD_ATTRIBUTE_FAM_AND_ASSEM         0x0002\n#define FIELD_ATTRIBUTE_ASSEMBLY              0x0003\n#define FIELD_ATTRIBUTE_FAMILY                0x0004\n#define FIELD_ATTRIBUTE_FAM_OR_ASSEM          0x0005\n#define FIELD_ATTRIBUTE_PUBLIC                0x0006\n\n#define FIELD_ATTRIBUTE_STATIC                0x0010\n#define FIELD_ATTRIBUTE_INIT_ONLY             0x0020\n#define FIELD_ATTRIBUTE_LITERAL               0x0040\n#define FIELD_ATTRIBUTE_NOT_SERIALIZED        0x0080\n#define FIELD_ATTRIBUTE_SPECIAL_NAME          0x0200\n#define FIELD_ATTRIBUTE_PINVOKE_IMPL          0x2000\n\n/* For runtime use only */\n#define FIELD_ATTRIBUTE_RESERVED_MASK         0x9500\n#define FIELD_ATTRIBUTE_RT_SPECIAL_NAME       0x0400\n#define FIELD_ATTRIBUTE_HAS_FIELD_MARSHAL     0x1000\n#define FIELD_ATTRIBUTE_HAS_DEFAULT           0x8000\n#define FIELD_ATTRIBUTE_HAS_FIELD_RVA         0x0100\n\n/*\n * Method Attributes (22.1.9)\n */\n\n#define METHOD_IMPL_ATTRIBUTE_CODE_TYPE_MASK       0x0003\n#define METHOD_IMPL_ATTRIBUTE_IL                   0x0000\n#define METHOD_IMPL_ATTRIBUTE_NATIVE               0x0001\n#define METHOD_IMPL_ATTRIBUTE_OPTIL                0x0002\n#define METHOD_IMPL_ATTRIBUTE_RUNTIME              0x0003\n\n#define METHOD_IMPL_ATTRIBUTE_MANAGED_MASK         0x0004\n#define METHOD_IMPL_ATTRIBUTE_UNMANAGED            0x0004\n#define METHOD_IMPL_ATTRIBUTE_MANAGED              0x0000\n\n#define METHOD_IMPL_ATTRIBUTE_FORWARD_REF          0x0010\n#define METHOD_IMPL_ATTRIBUTE_PRESERVE_SIG         0x0080\n#define METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL        0x1000\n#define METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED         0x0020\n#define METHOD_IMPL_ATTRIBUTE_NOINLINING           0x0008\n#define METHOD_IMPL_ATTRIBUTE_MAX_METHOD_IMPL_VAL  0xffff\n\n#define METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK        0x0007\n#define METHOD_ATTRIBUTE_COMPILER_CONTROLLED       0x0000\n#define METHOD_ATTRIBUTE_PRIVATE                   0x0001\n#define METHOD_ATTRIBUTE_FAM_AND_ASSEM             0x0002\n#define METHOD_ATTRIBUTE_ASSEM                     0x0003\n#define METHOD_ATTRIBUTE_FAMILY                    0x0004\n#define METHOD_ATTRIBUTE_FAM_OR_ASSEM              0x0005\n#define METHOD_ATTRIBUTE_PUBLIC                    0x0006\n\n#define METHOD_ATTRIBUTE_STATIC                    0x0010\n#define METHOD_ATTRIBUTE_FINAL                     0x0020\n#define METHOD_ATTRIBUTE_VIRTUAL                   0x0040\n#define METHOD_ATTRIBUTE_HIDE_BY_SIG               0x0080\n\n#define METHOD_ATTRIBUTE_VTABLE_LAYOUT_MASK        0x0100\n#define METHOD_ATTRIBUTE_REUSE_SLOT                0x0000\n#define METHOD_ATTRIBUTE_NEW_SLOT                  0x0100\n\n#define METHOD_ATTRIBUTE_STRICT                    0x0200\n#define METHOD_ATTRIBUTE_ABSTRACT                  0x0400\n#define METHOD_ATTRIBUTE_SPECIAL_NAME              0x0800\n\n#define METHOD_ATTRIBUTE_PINVOKE_IMPL              0x2000\n#define METHOD_ATTRIBUTE_UNMANAGED_EXPORT          0x0008\n\n/*\n * For runtime use only\n */\n#define METHOD_ATTRIBUTE_RESERVED_MASK             0xd000\n#define METHOD_ATTRIBUTE_RT_SPECIAL_NAME           0x1000\n#define METHOD_ATTRIBUTE_HAS_SECURITY              0x4000\n#define METHOD_ATTRIBUTE_REQUIRE_SEC_OBJECT        0x8000\n\n/*\n* Type Attributes (21.1.13).\n*/\n#define TYPE_ATTRIBUTE_VISIBILITY_MASK       0x00000007\n#define TYPE_ATTRIBUTE_NOT_PUBLIC            0x00000000\n#define TYPE_ATTRIBUTE_PUBLIC                0x00000001\n#define TYPE_ATTRIBUTE_NESTED_PUBLIC         0x00000002\n#define TYPE_ATTRIBUTE_NESTED_PRIVATE        0x00000003\n#define TYPE_ATTRIBUTE_NESTED_FAMILY         0x00000004\n#define TYPE_ATTRIBUTE_NESTED_ASSEMBLY       0x00000005\n#define TYPE_ATTRIBUTE_NESTED_FAM_AND_ASSEM  0x00000006\n#define TYPE_ATTRIBUTE_NESTED_FAM_OR_ASSEM   0x00000007\n\n#define TYPE_ATTRIBUTE_LAYOUT_MASK           0x00000018\n#define TYPE_ATTRIBUTE_AUTO_LAYOUT           0x00000000\n#define TYPE_ATTRIBUTE_SEQUENTIAL_LAYOUT     0x00000008\n#define TYPE_ATTRIBUTE_EXPLICIT_LAYOUT       0x00000010\n\n#define TYPE_ATTRIBUTE_CLASS_SEMANTIC_MASK   0x00000020\n#define TYPE_ATTRIBUTE_CLASS                 0x00000000\n#define TYPE_ATTRIBUTE_INTERFACE             0x00000020\n\n#define TYPE_ATTRIBUTE_ABSTRACT              0x00000080\n#define TYPE_ATTRIBUTE_SEALED                0x00000100\n#define TYPE_ATTRIBUTE_SPECIAL_NAME          0x00000400\n\n#define TYPE_ATTRIBUTE_IMPORT                0x00001000\n#define TYPE_ATTRIBUTE_SERIALIZABLE          0x00002000\n\n#define TYPE_ATTRIBUTE_STRING_FORMAT_MASK    0x00030000\n#define TYPE_ATTRIBUTE_ANSI_CLASS            0x00000000\n#define TYPE_ATTRIBUTE_UNICODE_CLASS         0x00010000\n#define TYPE_ATTRIBUTE_AUTO_CLASS            0x00020000\n\n#define TYPE_ATTRIBUTE_BEFORE_FIELD_INIT     0x00100000\n#define TYPE_ATTRIBUTE_FORWARDER             0x00200000\n\n#define TYPE_ATTRIBUTE_RESERVED_MASK         0x00040800\n#define TYPE_ATTRIBUTE_RT_SPECIAL_NAME       0x00000800\n#define TYPE_ATTRIBUTE_HAS_SECURITY          0x00040000\n\n/*\n* Flags for Params (22.1.12)\n*/\n#define PARAM_ATTRIBUTE_IN                 0x0001\n#define PARAM_ATTRIBUTE_OUT                0x0002\n#define PARAM_ATTRIBUTE_OPTIONAL           0x0010\n#define PARAM_ATTRIBUTE_RESERVED_MASK      0xf000\n#define PARAM_ATTRIBUTE_HAS_DEFAULT        0x1000\n#define PARAM_ATTRIBUTE_HAS_FIELD_MARSHAL  0x2000\n#define PARAM_ATTRIBUTE_UNUSED             0xcfe0\n\n// Flags for Generic Parameters (II.23.1.7)\n#define GENERIC_PARAMETER_ATTRIBUTE_NON_VARIANT                           0x00\n#define GENERIC_PARAMETER_ATTRIBUTE_COVARIANT                             0x01\n#define GENERIC_PARAMETER_ATTRIBUTE_CONTRAVARIANT                         0x02\n#define GENERIC_PARAMETER_ATTRIBUTE_VARIANCE_MASK                         0x03\n#define GENERIC_PARAMETER_ATTRIBUTE_REFERENCE_TYPE_CONSTRAINT             0x04\n#define GENERIC_PARAMETER_ATTRIBUTE_NOT_NULLABLE_VALUE_TYPE_CONSTRAINT    0x08\n#define GENERIC_PARAMETER_ATTRIBUTE_DEFAULT_CONSTRUCTOR_CONSTRAINT        0x10\n#define GENERIC_PARAMETER_ATTRIBUTE_SPECIAL_CONSTRAINT_MASK               0x1C\n\n/**\n * 21.5 AssemblyRefs\n */\n#define ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG      0x00000001\n#define ASSEMBLYREF_RETARGETABLE_FLAG         0x00000100\n#define ASSEMBLYREF_ENABLEJITCOMPILE_TRACKING_FLAG 0x00008000\n#define ASSEMBLYREF_DISABLEJITCOMPILE_OPTIMIZER_FLAG 0x00004000\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/CallOnce.h",
    "content": "#pragma once\n\n#include \"NonCopyable.h\"\n#include \"../os/Atomic.h\"\n#include \"../os/Mutex.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    typedef void (*CallOnceFunc) (void* arg);\n\n    struct OnceFlag : NonCopyable\n    {\n        OnceFlag() : m_Flag(NULL)\n        {\n        }\n\n        friend void CallOnce(OnceFlag& flag, CallOnceFunc func, void* arg);\n\n        bool IsSet()\n        {\n            return il2cpp::os::Atomic::ReadPointer(&m_Flag) ? true : false;\n        }\n\n    private:\n        void* m_Flag;\n        il2cpp::os::FastMutex m_Mutex;\n    };\n\n    inline void CallOnce(OnceFlag& flag, CallOnceFunc func, void* arg)\n    {\n        if (!il2cpp::os::Atomic::ReadPointer(&flag.m_Flag))\n        {\n            os::FastAutoLock lock(&flag.m_Mutex);\n            if (!il2cpp::os::Atomic::ReadPointer(&flag.m_Flag))\n            {\n                func(arg);\n                il2cpp::os::Atomic::ExchangePointer(&flag.m_Flag, (void*)1);\n            }\n        }\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Collections.h",
    "content": "#pragma once\n\n#include <algorithm>\n#include <vector>\n#include <functional>\n#include \"NonCopyable.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\nnamespace collections\n{\n// Memory compact, map-like data structure that stores values and\n// is a able to compute the key from the value with the provided converter\n// This data structure is perfect to storing values that will not be changed\n// for the duration of program (like type metadata) and need fast querying\n//\n// It is able to store multiple values associated with a single key, and query them through find()\n// find_first() is a special case find() which improves performance for cases where we don't store multiple values for each key\n    template<typename TKey, typename TValue, typename TValueToKeyConverter, typename TKeyLess = std::less<TKey>, typename TKeyEquals = std::equal_to<TKey> >\n    class ArrayValueMap : NonCopyable\n    {\n    public:\n        typedef ArrayValueMap<TKey, TValue, TValueToKeyConverter, TKeyLess, TKeyEquals> map_type;\n        typedef const TValue* iterator;\n\n    private:\n        const TValue* m_Values;\n        const size_t m_ValueCount;\n        bool m_OwnStorage;\n        const TValueToKeyConverter m_ValueToKeyConverter;\n        const TKeyLess m_KeyLessComparer;\n        const TKeyEquals m_KeyEqualsComparer;\n\n        struct SortComparer\n        {\n        private:\n            const TValueToKeyConverter m_ValueToKeyConverter;\n            const TKeyLess m_KeyComparer;\n\n        public:\n            SortComparer(TValueToKeyConverter valueToKeyConverter, TKeyLess keyComparer) :\n                m_ValueToKeyConverter(valueToKeyConverter), m_KeyComparer(keyComparer)\n            {\n            }\n\n            inline bool operator()(const TValue& left, const TValue& right) const\n            {\n                return m_KeyComparer(m_ValueToKeyConverter(left), m_ValueToKeyConverter(right));\n            }\n        };\n\n        struct LowerBoundFindComparer\n        {\n        private:\n            const TValueToKeyConverter m_ValueToKeyConverter;\n            const TKeyLess m_KeyComparer;\n\n        public:\n            LowerBoundFindComparer(TValueToKeyConverter valueToKeyConverter, TKeyLess keyComparer) :\n                m_ValueToKeyConverter(valueToKeyConverter), m_KeyComparer(keyComparer)\n            {\n            }\n\n            inline bool operator()(const TValue& left, const TKey& right) const\n            {\n                return m_KeyComparer(m_ValueToKeyConverter(left), right);\n            }\n        };\n\n        struct UpperBoundFindComparer\n        {\n        private:\n            const TValueToKeyConverter m_ValueToKeyConverter;\n            const TKeyLess m_KeyComparer;\n\n        public:\n            UpperBoundFindComparer(TValueToKeyConverter valueToKeyConverter, TKeyLess keyComparer) :\n                m_ValueToKeyConverter(valueToKeyConverter), m_KeyComparer(keyComparer)\n            {\n            }\n\n            inline bool operator()(const TKey& left, const TValue& right) const\n            {\n                return m_KeyComparer(left, m_ValueToKeyConverter(right));\n            }\n        };\n\n        inline static TValue* InitializeInPlace(TValue* values, size_t valueCount, TValueToKeyConverter valueToKeyConverter, TKeyLess keyLessComparer)\n        {\n            std::sort(values, values + valueCount, SortComparer(valueToKeyConverter, keyLessComparer));\n            return values;\n        }\n\n        inline static TValue* AllocateAndInitialize(const TValue* originalValues, size_t valueCount, TValueToKeyConverter valueToKeyConverter, TKeyLess keyLessComparer)\n        {\n            TValue* values = new TValue[valueCount];\n            memcpy(values, originalValues, valueCount * sizeof(TValue));\n\n            return InitializeInPlace(values, valueCount, valueToKeyConverter, keyLessComparer);\n        }\n\n    public:\n        inline ArrayValueMap() :\n            m_Values(NULL),\n            m_ValueCount(0),\n            m_OwnStorage(false),\n            m_ValueToKeyConverter(TValueToKeyConverter()),\n            m_KeyLessComparer(TKeyLess()),\n            m_KeyEqualsComparer(TKeyEquals())\n        {\n        }\n\n        // Non-allocating constructor. It will take a pointer and will not allocate any storage\n        // It WILL sort existing values\n        inline ArrayValueMap(TValue* values, size_t valueCount, TValueToKeyConverter valueToKeyConverter = TValueToKeyConverter(),\n                             TKeyLess keyLessComparer = TKeyLess(), TKeyEquals keyEqualsComparer = TKeyEquals()) :\n            m_Values(InitializeInPlace(values, valueCount, valueToKeyConverter, keyLessComparer)),\n            m_ValueCount(valueCount),\n            m_ValueToKeyConverter(valueToKeyConverter),\n            m_KeyLessComparer(keyLessComparer),\n            m_KeyEqualsComparer(keyEqualsComparer),\n            m_OwnStorage(false)\n        {\n        }\n\n        // Allocating constructor\n        // Will copy values to newly allocated storage\n        inline ArrayValueMap(const std::vector<TValue>& values, TValueToKeyConverter valueToKeyConverter = TValueToKeyConverter(),\n                             TKeyLess keyLessComparer = TKeyLess(), TKeyEquals keyEqualsComparer = TKeyEquals()) :\n            m_Values(AllocateAndInitialize(values.data(), values.size(), valueToKeyConverter, keyLessComparer)),\n            m_ValueCount(values.size()),\n            m_ValueToKeyConverter(valueToKeyConverter),\n            m_KeyLessComparer(keyLessComparer),\n            m_KeyEqualsComparer(keyEqualsComparer),\n            m_OwnStorage(true)\n        {\n        }\n\n        ~ArrayValueMap()\n        {\n            if (m_OwnStorage)\n            {\n                delete[] m_Values;\n            }\n        }\n\n        inline void assign_external(TValue* values, size_t valueCount, TValueToKeyConverter valueToKeyConverter = TValueToKeyConverter(),\n            TKeyLess keyLessComparer = TKeyLess(), TKeyEquals keyEqualsComparer = TKeyEquals())\n        {\n            this->~ArrayValueMap();\n            new(this)map_type(values, valueCount, valueToKeyConverter, keyLessComparer, keyEqualsComparer);\n        }\n\n        // Constructs map that contains pointers to original array\n        inline void assign_addresses(const TValue& valueArray, size_t valueCount, TValueToKeyConverter valueToKeyConverter = TValueToKeyConverter(),\n            TKeyLess keyLessComparer = TKeyLess(), TKeyEquals keyEqualsComparer = TKeyEquals())\n        {\n            this->~ArrayValueMap();\n\n            TValue* storage = NULL;\n\n            if (valueCount > 0)\n            {\n                storage = new TValue[valueCount];\n\n                for (size_t i = 0; i < valueCount; i++)\n                {\n                    storage[i] = &valueArray[i];\n                }\n            }\n\n            new(this)map_type(storage, valueCount, valueToKeyConverter, keyLessComparer, keyEqualsComparer);\n            m_OwnStorage = true;\n        }\n\n        inline void assign(const std::vector<TValue>& values, TValueToKeyConverter valueToKeyConverter = TValueToKeyConverter(),\n            TKeyLess keyLessComparer = TKeyLess(), TKeyEquals keyEqualsComparer = TKeyEquals())\n        {\n            this->~ArrayValueMap();\n            new(this)map_type(values, valueToKeyConverter, keyLessComparer, keyEqualsComparer);\n        }\n\n        inline iterator begin() const\n        {\n            return m_Values;\n        }\n\n        inline iterator end() const\n        {\n            return m_Values + m_ValueCount;\n        }\n\n        template<typename EqualsPredicate>\n        inline iterator find(const TKey& key, const EqualsPredicate& equalsPredicate) const\n        {\n            iterator dataStart = begin();\n            iterator dataEnd = end();\n            iterator ptr = std::lower_bound(dataStart, dataEnd, key, LowerBoundFindComparer(m_ValueToKeyConverter, m_KeyLessComparer));\n\n            for (; ptr != dataEnd && m_KeyEqualsComparer(m_ValueToKeyConverter(*ptr), key); ptr++)\n            {\n                if (equalsPredicate(*ptr))\n                    return ptr;\n            }\n\n            return dataEnd;\n        }\n\n        inline iterator find_first(const TKey& key) const\n        {\n            iterator dataStart = begin();\n            iterator dataEnd = end();\n            iterator ptr = std::lower_bound(dataStart, dataEnd, key, LowerBoundFindComparer(m_ValueToKeyConverter, m_KeyLessComparer));\n\n            if (ptr != dataEnd && m_KeyEqualsComparer(m_ValueToKeyConverter(*ptr), key))\n                return ptr;\n\n            return dataEnd;\n        }\n\n        inline iterator lower_bound(const TKey& key) const\n        {\n            return std::lower_bound(begin(), end(), key, LowerBoundFindComparer(m_ValueToKeyConverter, m_KeyLessComparer));\n        }\n\n        inline iterator upper_bound(const TKey& key) const\n        {\n            return std::upper_bound(begin(), end(), key, UpperBoundFindComparer(m_ValueToKeyConverter, m_KeyLessComparer));\n        }\n\n        inline size_t size() const\n        {\n            return m_ValueCount;\n        }\n\n        inline const TValue& operator[](size_t i) const\n        {\n            return m_Values[i];\n        }\n    };\n}\n}   // namespace utils\n}   // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/DirectoryUtils.cpp",
    "content": "/*\n    Directory utility functions that are common to all posix and posix-like platforms.\n*/\n\n#include \"il2cpp-config.h\"\n\n#include \"StringUtils.h\"\n#include \"DirectoryUtils.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    bool Match(const std::string name, size_t nameIndex, const std::string& pattern, const size_t patternIndex)\n    {\n        const size_t nameLength = name.length();\n\n        for (size_t i = patternIndex, patternLength = pattern.length(); i < patternLength; ++i)\n        {\n            const char c = pattern[i];\n\n            if (c == '*')\n            {\n                if (i + 1 == patternLength) // Star is last character, match everything.\n                    return true;\n\n                do\n                {\n                    // Check that we match the rest of the pattern against name.\n                    if (Match(name, nameIndex, pattern, i + 1))\n                        return true;\n                }\n                while (nameIndex++ < nameLength);\n\n                return false;\n            }\n            else if (c == '?')\n            {\n                if (nameIndex == nameLength)\n                    return false;\n\n                nameIndex++;\n            }\n            else\n            {\n                if (nameIndex == nameLength || name[nameIndex] != c)\n                    return false;\n\n                nameIndex++;\n            }\n        }\n\n        // All characters matched\n        return nameIndex == nameLength;\n    }\n\n    bool Match(const std::string name, const std::string& pattern)\n    {\n        return Match(name, 0, pattern, 0);\n    }\n\n    std::string CollapseAdjacentStars(const std::string& pattern)\n    {\n        std::string matchPattern;\n        matchPattern.reserve(pattern.length());\n\n        // Collapse adjacent stars into one\n        for (size_t i = 0, length = pattern.length(); i < length; ++i)\n        {\n            if (i > 0 && pattern[i] == '*' && pattern[i - 1] == '*')\n                continue;\n\n            matchPattern.append(1, pattern[i]);\n        }\n\n        return matchPattern;\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/DirectoryUtils.h",
    "content": "#pragma once\n\n#include <string>\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    bool Match(const std::string name, size_t nameIndex, const std::string& pattern, const size_t patternIndex);\n    bool Match(const std::string name, const std::string& pattern);\n    std::string CollapseAdjacentStars(const std::string& pattern);\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Environment.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/Environment.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    static int s_ArgCount = 0;\n    static std::vector<UTF16String> s_Args;\n\n    void Environment::SetMainArgs(const char* const* args, int num_args)\n    {\n        s_ArgCount = num_args;\n        s_Args.resize(num_args);\n\n        for (int i = 0; i < num_args; i++)\n            s_Args[i] = utils::StringUtils::Utf8ToUtf16(args[i]);\n    }\n\n    void Environment::SetMainArgs(const Il2CppChar* const* args, int num_args)\n    {\n        s_ArgCount = num_args;\n        s_Args.resize(num_args);\n\n        for (int i = 0; i < num_args; i++)\n            s_Args[i] = args[i];\n    }\n\n    const std::vector<UTF16String>& Environment::GetMainArgs()\n    {\n        return s_Args;\n    }\n\n    int Environment::GetNumMainArgs()\n    {\n        return s_ArgCount;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Environment.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include \"il2cpp-config.h\"\n#include \"il2cpp-string-types.h\"\nstruct Il2CppDomain;\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class LIBIL2CPP_CODEGEN_API Environment\n    {\n    public:\n        static const std::vector<UTF16String>& GetMainArgs();\n        static int GetNumMainArgs();\n        static void SetMainArgs(const char* const* args, int num_args);\n        static void SetMainArgs(const Il2CppChar* const* args, int num_args);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Exception.cpp",
    "content": "#include \"utils/Exception.h\"\n#include \"utils/StringUtils.h\"\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    std::string Exception::FormatException(const Il2CppException* ex)\n    {\n        std::string exception_namespace = ex->klass->namespaze;\n        std::string exception_type = ex->klass->name;\n        if (ex->message)\n            return exception_namespace + \".\" + exception_type + \": \" + il2cpp::utils::StringUtils::Utf16ToUtf8(il2cpp::utils::StringUtils::GetChars(ex->message));\n        else\n            return exception_namespace + \".\" + exception_type;\n    }\n\n    std::string Exception::FormatInvalidCastException(const Il2CppClass* fromType, const Il2CppClass* toType)\n    {\n        std::string message;\n\n        if (fromType != NULL && toType != NULL)\n        {\n            message += \"Unable to cast object of type '\";\n            message += fromType->name;\n            message += \"' to type '\";\n            message += toType->name;\n            message += \"'.\";\n        }\n\n        return message;\n    }\n\n    std::string Exception::FormatStackTrace(const Il2CppException* ex)\n    {\n        if (ex->stack_trace)\n            return il2cpp::utils::StringUtils::Utf16ToUtf8(il2cpp::utils::StringUtils::GetChars(ex->stack_trace));\n\n        return \"\";\n    }\n} // utils\n} // il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Exception.h",
    "content": "#pragma once\n#include \"il2cpp-config.h\"\n#include <string>\nstruct Il2CppException;\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class LIBIL2CPP_CODEGEN_API Exception\n    {\n    public:\n        static std::string FormatException(const Il2CppException* ex);\n        static std::string FormatStackTrace(const Il2CppException* ex);\n        static std::string FormatInvalidCastException(const Il2CppClass* fromType, const Il2CppClass* toType);\n    };\n} // utils\n} // utils\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Functional.h",
    "content": "#pragma once\n\n#include \"utils/NonCopyable.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\nnamespace functional\n{\n    struct TrueFilter\n    {\n        template<typename T>\n        inline bool operator()(const T& item) const\n        {\n            return true;\n        }\n    };\n\n    template<typename ItemType, typename Comparer>\n    struct Filter : NonCopyable\n    {\n    private:\n        ItemType m_Item;\n        Comparer m_Comparer;\n\n    public:\n        Filter(ItemType item, Comparer comparer = Comparer()) :\n            m_Item(item), m_Comparer(comparer)\n        {\n        }\n\n        template<typename T>\n        inline bool operator()(const T& item) const\n        {\n            return m_Comparer(m_Item, item);\n        }\n    };\n}   // functional\n}   // utils\n}   // il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/HashUtils.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class HashUtils\n    {\n        static const size_t Seed = 486187739;\n    public:\n        static inline size_t Combine(size_t hash1, size_t hash2)\n        {\n            return hash1 * Seed + hash2;\n        }\n    };\n\n    template<class T>\n    struct PointerHash\n    {\n        size_t operator()(const T* value) const\n        {\n            return (size_t)value;\n        }\n    };\n\n    template<class T>\n    struct PassThroughHash\n    {\n        size_t operator()(T value) const\n        {\n            return (size_t)value;\n        }\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Il2CppHStringReference.h",
    "content": "#pragma once\n\n#include <object-internals.h>\n#include \"StringView.h\"\n#include \"vm/Exception.h\"\n#include \"vm/WindowsRuntime.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class Il2CppHStringReference\n    {\n    private:\n        Il2CppHString m_String;\n        Il2CppHStringHeader m_Header;\n\n    public:\n        inline Il2CppHStringReference(const StringView<Il2CppNativeChar>& str)\n        {\n            il2cpp::vm::WindowsRuntime::CreateHStringReference(str, &m_Header, &m_String);\n        }\n\n        inline operator Il2CppHString() const\n        {\n            return m_String;\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Il2CppHashMap.h",
    "content": "#pragma once\n\n#include \"../external/google/sparsehash/dense_hash_map.h\"\n#include \"KeyWrapper.h\"\n\ntemplate<class Key, class T,\n         class HashFcn,\n         class EqualKey = std::equal_to<Key>,\n         class Alloc = std::allocator<std::pair<const KeyWrapper<Key>, T> > >\nclass Il2CppHashMap : public dense_hash_map<KeyWrapper<Key>, T, HashFcn, typename KeyWrapper<Key>::template EqualsComparer<EqualKey>, Alloc>\n{\nprivate:\n    typedef dense_hash_map<KeyWrapper<Key>, T, HashFcn, typename KeyWrapper<Key>::template EqualsComparer<EqualKey>, Alloc> Base;\n\npublic:\n    typedef typename Base::size_type size_type;\n    typedef typename Base::hasher hasher;\n    typedef typename Base::key_equal key_equal;\n    typedef typename Base::key_type key_type;\n\n    explicit Il2CppHashMap(size_type n = 0,\n                           const hasher& hf = hasher(),\n                           const EqualKey& eql = EqualKey()) :\n        Base(n, hf, key_equal(eql))\n    {\n        Base::set_empty_key(key_type(key_type::KeyType_Empty));\n        Base::set_deleted_key(key_type(key_type::KeyType_Deleted));\n    }\n\n    template<class InputIterator>\n    Il2CppHashMap(InputIterator f, InputIterator l,\n                  size_type n = 0,\n                  const hasher& hf = hasher(),\n                  const EqualKey& eql = EqualKey()) :\n        Base(f, l, n, hf, key_equal(eql))\n    {\n        Base::set_empty_key(key_type(key_type::KeyType_Empty));\n        Base::set_deleted_key(key_type(key_type::KeyType_Deleted));\n    }\n\n    void add(const key_type& key, const T& value)\n    {\n        Base::insert(std::make_pair(key, value));\n    }\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Il2CppHashSet.h",
    "content": "#pragma once\n\n#include \"../external/google/sparsehash/dense_hash_set.h\"\n#include \"KeyWrapper.h\"\n\ntemplate<class Value,\n         class HashFcn,\n         class EqualKey = std::equal_to<Value>,\n         class Alloc = std::allocator<KeyWrapper<Value> > >\nclass Il2CppHashSet : public dense_hash_set<KeyWrapper<Value>, HashFcn, typename KeyWrapper<Value>::template EqualsComparer<EqualKey>, Alloc>\n{\nprivate:\n    typedef dense_hash_set<KeyWrapper<Value>, HashFcn, typename KeyWrapper<Value>::template EqualsComparer<EqualKey>, Alloc> Base;\n\npublic:\n    typedef typename Base::size_type size_type;\n    typedef typename Base::hasher hasher;\n    typedef typename Base::key_equal key_equal;\n    typedef typename Base::key_type key_type;\n\n    explicit Il2CppHashSet(size_type n = 0,\n                           const hasher& hf = hasher(),\n                           const EqualKey& eql = EqualKey()) :\n        Base(n, hf, key_equal(eql))\n    {\n        Base::set_empty_key(key_type(key_type::KeyType_Empty));\n        Base::set_deleted_key(key_type(key_type::KeyType_Deleted));\n    }\n\n    template<class InputIterator>\n    Il2CppHashSet(InputIterator f, InputIterator l,\n                  size_type n = 0,\n                  const hasher& hf = hasher(),\n                  const EqualKey& eql = EqualKey()) :\n        Base(f, l, n, hf, key_equal(eql))\n    {\n        Base::set_empty_key(key_type(key_type::KeyType_Empty));\n        Base::set_deleted_key(key_type(key_type::KeyType_Deleted));\n    }\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/KeyWrapper.h",
    "content": "#pragma once\n\ntemplate<class T>\nstruct KeyWrapper\n{\n    typedef T wrapped_type;\n    typedef KeyWrapper<T> self_type;\n\n    enum KeyTypeEnum { KeyType_Normal, KeyType_Empty, KeyType_Deleted };\n\n    KeyTypeEnum type;\n    T key;\n\n    KeyWrapper() : type(KeyType_Normal), key(T()) {}\n    KeyWrapper(KeyTypeEnum type_) : type(type_), key(T()) {}\n    KeyWrapper(const T& key_) : key(key_), type(KeyType_Normal) {}\n    KeyWrapper(const self_type& other) : type(other.type), key(other.key) {}\n\n    operator const T&() const { return key; }\n    bool isNormal() const { return (type == KeyType_Normal); }\n\n    template<typename KeyComparer>\n    struct EqualsComparer\n    {\n        EqualsComparer(KeyComparer keyComparer) :\n            m_KeyComparer(keyComparer)\n        {\n        }\n\n        bool operator()(const KeyWrapper<T>& left, const KeyWrapper<T>& right) const\n        {\n            if (left.type != right.type)\n                return false;\n\n            if (!left.isNormal())\n                return true;\n\n            return m_KeyComparer(left.key, right.key);\n        }\n\n    private:\n        KeyComparer m_KeyComparer;\n    };\n};\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Logging.cpp",
    "content": "#include <cassert>\n#include <stdarg.h>\n#include \"Logging.h\"\n#include \"Output.h\"\n\nusing namespace il2cpp::utils;\n\nstatic void DefaultLogCallback(const char* message)\n{\n    Output::WriteToStdout(message);\n    Output::WriteToStdout(\"\\n\");\n}\n\nIl2CppLogCallback Logging::s_Callback = DefaultLogCallback;\n\nvoid Logging::Write(const char* format, ...)\n{\n    assert(s_Callback != NULL);\n\n    va_list va;\n    va_start(va, format);\n\n    const char* prefix = \"[libil2cpp] \";\n    const int bufferSize = 1024 * 5;\n    char buffer[bufferSize];\n    memcpy(buffer, prefix, 12);\n    vsnprintf(buffer + 12, bufferSize - 12, format, va);\n\n    s_Callback(buffer);\n\n    va_end(va);\n}\n\nvoid Logging::SetLogCallback(Il2CppLogCallback method)\n{\n    assert(method != NULL);\n    s_Callback = method;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Logging.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class LIBIL2CPP_CODEGEN_API Logging\n    {\n    public:\n        static void Write(const char* format, ...);\n        static void SetLogCallback(Il2CppLogCallback method);\n\n    private:\n        static Il2CppLogCallback s_Callback;\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/MarshalingUtils.cpp",
    "content": "#include \"MarshalingUtils.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    void MarshalingUtils::MarshalStructToNative(void* managedStructure, void* marshaledStructure, const Il2CppInteropData* interopData)\n    {\n        IL2CPP_ASSERT(interopData);\n        IL2CPP_ASSERT(interopData->pinvokeMarshalToNativeFunction);\n        interopData->pinvokeMarshalToNativeFunction(managedStructure, marshaledStructure);\n    }\n\n    void MarshalingUtils::MarshalStructFromNative(void* marshaledStructure, void* managedStructure, const Il2CppInteropData* interopData)\n    {\n        IL2CPP_ASSERT(interopData);\n        IL2CPP_ASSERT(interopData->pinvokeMarshalFromNativeFunction);\n        interopData->pinvokeMarshalFromNativeFunction(marshaledStructure, managedStructure);\n    }\n\n    bool MarshalingUtils::MarshalFreeStruct(void* marshaledStructure, const Il2CppInteropData* interopData)\n    {\n        if (interopData == NULL)\n            return false;\n\n        PInvokeMarshalCleanupFunc cleanup = interopData->pinvokeMarshalCleanupFunction;\n\n        if (cleanup == NULL)\n            return false;\n\n        cleanup(marshaledStructure);\n        return true;\n    }\n} // namespace utils\n} // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/MarshalingUtils.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class MarshalingUtils\n    {\n    public:\n        static void MarshalStructToNative(void* managedStructure, void* marshaledStructure, const Il2CppInteropData* interopData);\n        static void MarshalStructFromNative(void* marshaledStructure, void* managedStructure, const Il2CppInteropData* interopData);\n        static bool MarshalFreeStruct(void* marshaledStructure, const Il2CppInteropData* interopData);\n    };\n} // namespace utils\n} // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/MathUtils.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include <assert.h>\n#include <cmath>\n#include <limits>\n#include <stdint.h>\n\nnamespace il2cpp\n{\nnamespace utils\n{\nnamespace MathUtils\n{\n    // Do math on low/high part separately as 64-bit integers because otherwise\n    // we might easily overflow during initial multiplication\n    inline int64_t A_Times_B_DividedBy_C(int64_t multiplicand, int64_t multiplier, int64_t divisor)\n    {\n        IL2CPP_ASSERT((llabs(divisor) & (1LL << 62)) == 0 && \"Can't divide by numbers with absolute value larger than 2^62 - 1.\");\n        bool resultIsNegative = static_cast<uint64_t>(multiplicand ^ multiplier ^ divisor) >> 63;   // Result is negative if odd number of operands are negative\n\n        multiplicand = llabs(multiplicand);\n        IL2CPP_ASSERT(multiplicand > 0 && \"Can't multiply by -2^63.\");\n\n        multiplier = llabs(multiplier);\n        IL2CPP_ASSERT(multiplier > 0 && \"Can't multiply by -2^63.\");\n\n        divisor = llabs(divisor);   // We already asserted on divisor size\n\n        uint64_t multiplicand_low = multiplicand & 0xFFFFFFFF;\n        uint64_t multiplicand_high = multiplicand >> 32;\n\n        uint64_t multiplier_low = multiplier & 0xFFFFFFFF;\n        uint64_t multiplier_high = multiplier >> 32;\n\n        // We're gonna assume our multiplicated value is 128-bit integer\n        // so we're gonna compose it of two uint64_t's\n        // a * b =\n        // (a_high * 2^32 + a_low) * (b_high * 2^32 + b_low) =\n        // a_high * b_high * 2^64 + (a_high * b_low + a_low * b_high) * 2^32 + a_low * b_low\n        uint64_t dividends[2] =\n        {\n            multiplicand_low * multiplier_low,   // low part, bits [0, 63]\n            multiplicand_high * multiplier_high  // high part, bits [64, 127]\n        };\n\n        uint64_t resultMid1 = multiplicand_high * multiplier_low + multiplicand_low * multiplier_high;  // mid part, bits [32, 95]\n\n        dividends[1] += resultMid1 >> 32; // add the higher bits of mid part ([64, 95]) to high part\n        resultMid1 = (resultMid1 & 0xFFFFFFFF) << 32; // Now this contains the lower bits of mid part ([32, 63])\n\n        // Check for lower part overflow below adding the lower bits of mid part to it\n        // Add carry to high part if overflow occurs\n        if (dividends[0] > std::numeric_limits<uint64_t>::max() - resultMid1)\n            dividends[1]++;\n\n        dividends[0] += resultMid1; // add the lower bits of mid part to low part\n\n        // At this point, we got our whole divident 128-bit value inside 'dividends'\n\n        uint64_t workValue = 0; // Value that we're gonna be dividing\n        uint64_t result = 0;    // The final result\n        const uint64_t kOne = 1;\n        int bitIndex = 127;     // Current bit that we're gonna be add to the workValue\n\n        // Let's find the starting point for our division\n        // We'll keep adding bits from our divident to the workValue until it's higher than the divisor\n        // We did divisor = llabs(divisor) earlier, so cast to unsigned is safe\n        while (workValue < static_cast<uint64_t>(divisor))\n        {\n            workValue <<= 1;\n\n            if (bitIndex > -1)\n            {\n                workValue |= (dividends[bitIndex / 64] & (kOne << (bitIndex % 64))) != 0;\n            }\n            else\n            {\n                return 0;\n            }\n\n            bitIndex--;\n        }\n\n        // Main division loop\n        for (; bitIndex > -2 || workValue >= static_cast<uint64_t>(divisor); bitIndex--)\n        {\n            result <<= 1;   // Shift result left\n\n            // Since it's binary, the division result can be only 0 and 1\n            // It's 1 if workValue is higher or equal to divisor\n            if (workValue >= static_cast<uint64_t>(divisor))\n            {\n                workValue -= static_cast<uint64_t>(divisor);\n                result++;\n            }\n\n            // Shift work value to the left and append the next bit of our dividend\n            IL2CPP_ASSERT((workValue & (1LL << 63)) == 0 && \"overflow!\");\n\n            if (bitIndex > -1)\n            {\n                workValue <<= 1;\n                workValue |= (dividends[bitIndex / 64] & (kOne << (bitIndex % 64))) != 0;\n            }\n        }\n\n        // Negate result if it's supposed to be negative\n        if (resultIsNegative)\n            return -static_cast<int64_t>(result);\n\n        return result;\n    }\n}\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Memory.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/Memory.h\"\n#include \"utils/Memory.h\"\n#include <string>\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    static Il2CppMemoryCallbacks s_Callbacks =\n    {\n        malloc,\n        os::Memory::AlignedAlloc,\n        free,\n        os::Memory::AlignedFree,\n        calloc,\n        realloc,\n        os::Memory::AlignedReAlloc\n    };\n\n    void Memory::SetMemoryCallbacks(Il2CppMemoryCallbacks* callbacks)\n    {\n        memcpy(&s_Callbacks, callbacks, sizeof(Il2CppMemoryCallbacks));\n    }\n\n    void* Memory::Malloc(size_t size)\n    {\n        return s_Callbacks.malloc_func(size);\n    }\n\n    void* Memory::AlignedMalloc(size_t size, size_t alignment)\n    {\n        return s_Callbacks.aligned_malloc_func(size, alignment);\n    }\n\n    void Memory::Free(void* memory)\n    {\n        return s_Callbacks.free_func(memory);\n    }\n\n    void Memory::AlignedFree(void* memory)\n    {\n        return s_Callbacks.aligned_free_func(memory);\n    }\n\n    void* Memory::Calloc(size_t count, size_t size)\n    {\n        return s_Callbacks.calloc_func(count, size);\n    }\n\n    void* Memory::Realloc(void* memory, size_t newSize)\n    {\n        return s_Callbacks.realloc_func(memory, newSize);\n    }\n\n    void* Memory::AlignedRealloc(void* memory, size_t newSize, size_t alignment)\n    {\n        return s_Callbacks.aligned_realloc_func(memory, newSize, alignment);\n    }\n} /* namespace utils */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Memory.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    struct LIBIL2CPP_CODEGEN_API Memory\n    {\n        static void SetMemoryCallbacks(Il2CppMemoryCallbacks* callbacks);\n\n        static void* Malloc(size_t size);\n        static void* AlignedMalloc(size_t size, size_t alignment);\n        static void Free(void* memory);\n        static void AlignedFree(void* memory);\n        static void* Calloc(size_t count, size_t size);\n        static void* Realloc(void* memory, size_t newSize);\n        static void* AlignedRealloc(void* memory, size_t newSize, size_t alignment);\n    };\n} /* namespace utils */\n} /* namespace il2cpp */\n\n#define IL2CPP_MALLOC(size) il2cpp::utils::Memory::Malloc(size)\n#define IL2CPP_MALLOC_ALIGNED(size, alignment) il2cpp::utils::Memory::AlignedMalloc(size, alignment)\n#define IL2CPP_MALLOC_ZERO(size) il2cpp::utils::Memory::Calloc(1,size)\n#define IL2CPP_FREE(memory) il2cpp::utils::Memory::Free(memory)\n#define IL2CPP_FREE_ALIGNED(memory) il2cpp::utils::Memory::AlignedFree(memory)\n#define IL2CPP_CALLOC(count, size) il2cpp::utils::Memory::Calloc(count,size)\n#define IL2CPP_REALLOC(memory, newSize) il2cpp::utils::Memory::Realloc(memory,newSize)\n#define IL2CPP_REALLOC_ALIGNED(memory, newSize, alignment) il2cpp::utils::Memory::AlignedRealloc(memory, newSize, alignment)\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/MemoryPool.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"utils/MemoryPool.h\"\n#include \"utils/Memory.h\"\n#include <algorithm>\n#include <limits>\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    const size_t kPageSize = IL2CPP_PAGE_SIZE;\n    const size_t kDefaultRegionSize = 16 * 1024;\n// by making all allocations a multiple of this value, we ensure the next\n// allocation will always be aligned to this value\n    const size_t kMemoryAlignment = 8;\n\n    static inline size_t MakeMultipleOf(size_t size, size_t alignment)\n    {\n        return (size + alignment - 1) & ~(alignment - 1);\n    }\n\n    struct MemoryPool::Region\n    {\n        char* start;\n        char* current;\n        size_t size;\n        size_t free;\n    };\n\n    MemoryPool::MemoryPool()\n    {\n        AddRegion(kDefaultRegionSize);\n    }\n\n    MemoryPool::MemoryPool(size_t initialSize)\n    {\n        AddRegion(initialSize);\n    }\n\n    MemoryPool::~MemoryPool()\n    {\n        for (RegionList::iterator iter = m_Regions.begin(); iter != m_Regions.end(); ++iter)\n        {\n            IL2CPP_FREE((*iter)->start);\n            IL2CPP_FREE(*iter);\n        }\n\n        m_Regions.clear();\n    }\n\n    void* MemoryPool::Malloc(size_t size)\n    {\n        size = MakeMultipleOf(size, kMemoryAlignment);\n\n        Region* region = m_Regions.back();\n        if (region->free < size)\n            region = AddRegion(size);\n\n        IL2CPP_ASSERT(region->free >= size);\n\n        void* value = region->current;\n        region->current += size;\n        region->free -= size;\n\n        return value;\n    }\n\n    void* MemoryPool::Calloc(size_t count, size_t size)\n    {\n        void* ret = Malloc(count * size);\n        return memset(ret, 0, count * size);\n    }\n\n    MemoryPool::Region* MemoryPool::AddRegion(size_t size)\n    {\n        Region* region = (Region*)IL2CPP_MALLOC(sizeof(Region));\n        size_t allocationSize = std::max(kDefaultRegionSize, MakeMultipleOf(size, kPageSize));\n        region->start = region->current = (char*)IL2CPP_MALLOC(allocationSize);\n        region->size = region->free = allocationSize;\n        m_Regions.push_back(region);\n\n        return region;\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/MemoryPool.h",
    "content": "#pragma once\n\n#include <list>\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class MemoryPool\n    {\n    public:\n        MemoryPool();\n        MemoryPool(size_t initialSize);\n        ~MemoryPool();\n        void* Malloc(size_t size);\n        void* Calloc(size_t count, size_t size);\n    private:\n        struct Region;\n        typedef std::list<Region*> RegionList;\n\n        Region* AddRegion(size_t size);\n\n        RegionList m_Regions;\n    };\n} /* namespace utils */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/MemoryRead.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <memory.h>\n\n// unaligned safe reading\nnamespace il2cpp\n{\nnamespace utils\n{\n    static inline Il2CppChar ReadChar(const char* p) { Il2CppChar val; memcpy(&val, p, sizeof(Il2CppChar)); return val; }\n    static inline uint16_t Read16(const char* p) { uint16_t val; memcpy(&val, p, sizeof(uint16_t)); return val; }\n    static inline uint32_t Read32(const char* p) { uint32_t val; memcpy(&val, p, sizeof(uint32_t)); return val; }\n    static inline uint64_t Read64(const char* p) { uint64_t val; memcpy(&val, p, sizeof(uint64_t)); return val; }\n    static inline float ReadFloat(const char* p) { float val; memcpy(&val, p, sizeof(float)); return val; }\n    static inline double ReadDouble(const char* p) { double val; memcpy(&val, p, sizeof(double)); return val; }\n} /* utils */\n} /* il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/NonCopyable.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class NonCopyable\n    {\n    public:\n        NonCopyable() {}\n\n    private:\n        NonCopyable(const NonCopyable&);\n        NonCopyable& operator=(const NonCopyable&);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Output.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"Output.h\"\n#include \"os/ErrorCodes.h\"\n#include \"os/File.h\"\n#include \"StringUtils.h\"\n\nusing namespace il2cpp::utils;\n\nstatic inline void WriteToHandle(il2cpp::os::FileHandle* handle, const char* message)\n{\n    int error = il2cpp::os::kErrorCodeSuccess;\n    il2cpp::os::File::Write(handle, message, static_cast<int>(strlen(message)), &error);\n    IL2CPP_ASSERT(error == il2cpp::os::kErrorCodeSuccess);\n}\n\nvoid Output::WriteToStdout(const char* message)\n{\n    WriteToHandle(os::File::GetStdOutput(), message);\n}\n\nvoid Output::WriteToStderr(const char* message)\n{\n    WriteToHandle(os::File::GetStdError(), message);\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Output.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class LIBIL2CPP_CODEGEN_API Output\n    {\n    public:\n        static void WriteToStdout(const char* message);\n        static void WriteToStderr(const char* message);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/PathUtils.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"utils/PathUtils.h\"\n#include <string>\n\nnamespace il2cpp\n{\nnamespace utils\n{\nnamespace PathUtils\n{\n    std::string BasenameNoExtension(const std::string& path)\n    {\n        if (path.empty())\n            return \".\";\n\n        std::string base = Basename(path);\n\n        const size_t pos = base.rfind('.');\n\n        // No extension.\n        if (pos == std::string::npos)\n            return base;\n\n        return base.substr(0, pos);\n    }\n\n    std::string PathNoExtension(const std::string& path)\n    {\n        const size_t pos = path.rfind('.');\n\n        // No extension.\n        if (pos == std::string::npos)\n            return path;\n\n        return path.substr(0, pos);\n    }\n}\n} /* utils */\n} /* il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/PathUtils.h",
    "content": "#pragma once\n\n#include <string>\n#include \"StringView.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\nnamespace PathUtils\n{\n    std::string BasenameNoExtension(const std::string& path);\n    std::string PathNoExtension(const std::string& path);\n\n    template<typename CharType>\n    std::basic_string<CharType> Basename(const utils::StringView<CharType>& path)\n    {\n        if (path.IsEmpty())\n            return std::basic_string<CharType>(1, static_cast<CharType>('.'));\n\n        const size_t pos = path.RFind(IL2CPP_DIR_SEPARATOR);\n\n        // No seperators. Path is filename\n        if (pos == utils::StringView<CharType>::NPos())\n            return std::basic_string<CharType>(path.Str(), path.Length());\n\n        return std::basic_string<CharType>(path.Str() + pos + 1, path.Length() - pos - 1);\n    }\n\n    template<typename CharType>\n    std::basic_string<CharType> Basename(const std::basic_string<CharType>& path)\n    {\n        return Basename(utils::StringView<CharType>(path));\n    }\n\n    template<typename CharType>\n    std::basic_string<CharType> DirectoryName(const utils::StringView<CharType>& path)\n    {\n        if (path.IsEmpty())\n            return std::basic_string<CharType>();\n\n        const size_t pos = path.RFind(IL2CPP_DIR_SEPARATOR);\n\n        if (pos == utils::StringView<CharType>::NPos())\n            return std::basic_string<CharType>(1, static_cast<CharType>('.'));\n\n        if (pos == 0)\n            return std::basic_string<CharType>(1, static_cast<CharType>('/'));\n\n        return std::basic_string<CharType>(path.Str(), pos);\n    }\n\n    template<typename CharType>\n    std::basic_string<CharType> Combine(const utils::StringView<CharType>& path1, const utils::StringView<CharType>& path2)\n    {\n        std::basic_string<CharType> result;\n        result.reserve(path1.Length() + path2.Length() + 1);\n        result.append(path1.Str(), path1.Length());\n        result.append(1, static_cast<CharType>(IL2CPP_DIR_SEPARATOR));\n        result.append(path2.Str(), path2.Length());\n        return result;\n    }\n\n    template<typename CharType>\n    std::basic_string<CharType> DirectoryName(const std::basic_string<CharType>& path)\n    {\n        return DirectoryName(utils::StringView<CharType>(path));\n    }\n\n    template<typename CharType>\n    std::basic_string<CharType> Combine(const std::basic_string<CharType>& path1, const std::basic_string<CharType>& path2)\n    {\n        return Combine(utils::StringView<CharType>(path1), utils::StringView<CharType>(path2));\n    }\n\n    template<typename CharType>\n    std::basic_string<CharType> Combine(const std::basic_string<CharType>& path1, const utils::StringView<CharType>& path2)\n    {\n        return Combine(utils::StringView<CharType>(path1), path2);\n    }\n\n    template<typename CharType>\n    std::basic_string<CharType> Combine(const utils::StringView<CharType>& path1, const std::basic_string<CharType>& path2)\n    {\n        return Combine(path1, utils::StringView<CharType>(path2));\n    }\n}\n} /* utils */\n} /* il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/RegisterRuntimeInitializeAndCleanup.cpp",
    "content": "#include \"RegisterRuntimeInitializeAndCleanup.h\"\n#include <set>\n#include <cstddef>\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    typedef std::set<RegisterRuntimeInitializeAndCleanup::CallbackFunction> RegistrationCallbackSet;\n\n    static RegistrationCallbackSet* _registrationCallbacks = NULL;\n\n    RegisterRuntimeInitializeAndCleanup::RegisterRuntimeInitializeAndCleanup(CallbackFunction Initialize, CallbackFunction Cleanup, int order)\n    {\n        if (!_registrationCallbacks)\n            _registrationCallbacks = new RegistrationCallbackSet();\n        (*_registrationCallbacks).insert(Initialize);\n    }\n\n    void RegisterRuntimeInitializeAndCleanup::ExecuteInitializations()\n    {\n        if (_registrationCallbacks == NULL)\n            return;\n\n        for (RegistrationCallbackSet::iterator iter = (*_registrationCallbacks).begin(); iter != (*_registrationCallbacks).end(); ++iter)\n        {\n            (*iter)();\n        }\n    }\n\n    void RegisterRuntimeInitializeAndCleanup::ExecuteCleanup()\n    {\n        IL2CPP_ASSERT(0);\n    }\n} /* namespace vm */\n} /* namespace utils */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/RegisterRuntimeInitializeAndCleanup.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class LIBIL2CPP_CODEGEN_API RegisterRuntimeInitializeAndCleanup\n    {\n    public:\n        typedef void (*CallbackFunction) ();\n        RegisterRuntimeInitializeAndCleanup(CallbackFunction Initialize, CallbackFunction Cleanup, int order = 0);\n\n        static void ExecuteInitializations();\n        static void ExecuteCleanup();\n    };\n} /* namespace vm */\n} /* namespace utils */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Runtime.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/Path.h\"\n#include \"os/Environment.h\"\n#include \"utils/Runtime.h\"\n#include \"utils/PathUtils.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/Environment.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    NORETURN void Runtime::Abort()\n    {\n        os::Environment::Abort();\n    }\n\n    static std::string s_DataDirFallback;\n\n#if !defined(RUNTIME_MONO)\n    static std::string s_DataDir;\n\n    void Runtime::SetDataDir(const char *path)\n    {\n        s_DataDir = path;\n    }\n\n#endif\n\n    std::string Runtime::GetDataDir()\n    {\n#if defined(RUNTIME_MONO)\n        // use explicit value if set\n        char* dataDirCS = mono_unity_get_data_dir();\n        if (dataDirCS)\n        {\n            std::string dataDir(dataDirCS, strlen(dataDirCS));\n            if (dataDir.size() > 0)\n                return dataDir;\n        }\n#else\n        // use explicit value if set\n        if (s_DataDir.size() > 0)\n            return s_DataDir;\n#endif\n\n        std::string executablePath = os::Path::GetExecutablePath();\n        if (!executablePath.empty())\n            return PathUtils::Combine(PathUtils::DirectoryName(executablePath), StringView<char>(\"Data\"));\n\n        if (s_DataDirFallback.size() == 0 && Environment::GetNumMainArgs() > 0)\n        {\n            std::string main = StringUtils::Utf16ToUtf8(Environment::GetMainArgs()[0]);\n            s_DataDirFallback = PathUtils::DirectoryName(main);\n        }\n\n        return s_DataDirFallback;\n    }\n} // utils\n} // il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/Runtime.h",
    "content": "#pragma once\n#include <string>\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class LIBIL2CPP_CODEGEN_API Runtime\n    {\n    public:\n        static NORETURN void Abort();\n#if !defined(RUNTIME_MONO)\n        static void SetDataDir(const char *path);\n#endif\n        static std::string GetDataDir();\n    };\n} // utils\n} // il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/StringUtils.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"../char-conversions.h\"\n#include \"../object-internals.h\"\n#include \"utils/Functional.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/utf8-cpp/source/utf8/unchecked.h\"\n#include <stdarg.h>\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    std::string StringUtils::Printf(const char* format, ...)\n    {\n        va_list argsToCheckSize;\n        int n;\n        std::string ret;\n\n        va_start(argsToCheckSize, format);\n#if IL2CPP_COMPILER_MSVC\n        // MS vsnprintf always returns -1 if string doesn't fit, rather than\n        // the needed size. Used their 'special' function instead to get required size\n        n = _vscprintf_p(format, argsToCheckSize);\n#else\n        // use a temporary buffer as some docs indicate we cannot pass NULL to vsnprintf\n        char buf[1];\n        n = vsnprintf(buf, 0, format, argsToCheckSize);\n#endif\n        if (n == -1)\n            return NULL;\n\n        ret.resize(n + 1, 0);\n        va_end(argsToCheckSize);\n\n        va_list argsToFormat;\n\n        va_start(argsToFormat, format);\n        n = vsnprintf(&ret[0], ret.size(), format, argsToFormat);\n        va_end(argsToFormat);\n\n        IL2CPP_ASSERT(n < (int)ret.size());\n\n        if (n == -1)\n            return NULL;\n\n        return ret;\n    }\n\n    std::string StringUtils::NPrintf(const char* format, size_t max_n, ...)\n    {\n        va_list argsToCheckSize;\n        size_t n;\n        std::string ret;\n\n        va_start(argsToCheckSize, max_n);\n#if IL2CPP_COMPILER_MSVC\n        // MS vsnprintf always returns -1 if string doesn't fit, rather than\n        // the needed size. Used their 'special' function instead to get required size\n        n = _vscprintf_p(format, argsToCheckSize);\n#else\n        // use a temporary buffer as some docs indicate we cannot pass NULL to vsnprintf\n        char buf[1];\n        n = vsnprintf(buf, 0, format, argsToCheckSize);\n#endif\n        if (n == -1)\n            return NULL;\n\n        n = (max_n < ++n) ? max_n : n;\n\n        ret.resize(n, 0);\n        va_end(argsToCheckSize);\n\n        va_list argsToFormat;\n\n        va_start(argsToFormat, max_n);\n        n = vsnprintf(&ret[0], n, format, argsToFormat);\n        va_end(argsToFormat);\n\n        IL2CPP_ASSERT(n < ret.size());\n\n        if (n == -1)\n            return NULL;\n\n        return ret;\n    }\n\n    std::string StringUtils::Utf16ToUtf8(const Il2CppChar* utf16String)\n    {\n        return Utf16ToUtf8(utf16String, -1);\n    }\n\n    std::string StringUtils::Utf16ToUtf8(const Il2CppChar* utf16String, int maximumSize)\n    {\n        const Il2CppChar* ptr = utf16String;\n        size_t length = 0;\n        while (*ptr)\n        {\n            ptr++;\n            length++;\n            if (maximumSize != -1 && length == maximumSize)\n                break;\n        }\n\n        std::string utf8String;\n        utf8String.reserve(length);\n        utf8::unchecked::utf16to8(utf16String, ptr, std::back_inserter(utf8String));\n\n        return utf8String;\n    }\n\n    std::string StringUtils::Utf16ToUtf8(const UTF16String& utf16String)\n    {\n        return Utf16ToUtf8(utf16String.c_str(), static_cast<int>(utf16String.length()));\n    }\n\n    UTF16String StringUtils::Utf8ToUtf16(const char* utf8String)\n    {\n        return Utf8ToUtf16(utf8String, strlen(utf8String));\n    }\n\n    UTF16String StringUtils::Utf8ToUtf16(const char* utf8String, size_t length)\n    {\n        UTF16String utf16String;\n\n        if (utf8::is_valid(utf8String, utf8String + length))\n        {\n            utf16String.reserve(length);\n            utf8::unchecked::utf8to16(utf8String, utf8String + length, std::back_inserter(utf16String));\n        }\n\n        return utf16String;\n    }\n\n    UTF16String StringUtils::Utf8ToUtf16(const std::string& utf8String)\n    {\n        return Utf8ToUtf16(utf8String.c_str(), utf8String.length());\n    }\n\n    char* StringUtils::StringDuplicate(const char *strSource)\n    {\n        char* result = NULL;\n\n        if (!strSource)\n            return NULL;\n\n        size_t length = strlen(strSource) + 1;\n\n        if ((result = (char*)IL2CPP_MALLOC(length)))\n#if IL2CPP_COMPILER_MSVC\n            strcpy_s(result, length, strSource);\n#elif IL2CPP_TARGET_LINUX || IL2CPP_TARGET_TIZEN\n            strncpy(result, strSource, length);\n#else\n            strlcpy(result, strSource, length);\n#endif\n\n        return result;\n    }\n\n    Il2CppChar* StringUtils::StringDuplicate(const Il2CppChar* strSource, size_t length)\n    {\n        size_t byteLengthWithNullTerminator = sizeof(Il2CppChar) * (length + 1);\n        Il2CppChar* utf16name = (Il2CppChar*)IL2CPP_MALLOC(byteLengthWithNullTerminator);\n        memcpy(utf16name, strSource, byteLengthWithNullTerminator);\n\n        return utf16name;\n    }\n\n    bool StringUtils::EndsWith(const std::string& string, const std::string& suffix)\n    {\n        const size_t stringLength = string.length();\n        const size_t suffixLength = suffix.length();\n\n        if (suffixLength > stringLength)\n            return false;\n\n        return string.rfind(suffix.c_str(), stringLength - suffixLength, suffixLength) != std::string::npos;\n    }\n\n    Il2CppChar* StringUtils::GetChars(Il2CppString* str)\n    {\n        return str->chars;\n    }\n\n    int32_t StringUtils::GetLength(Il2CppString* str)\n    {\n        return str->length;\n    }\n} /* utils */\n} /* il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/StringUtils.h",
    "content": "﻿// The MIT License (MIT)\n//\n// Copyright(c) Unity Technologies, Microsoft Corporation\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files(the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions :\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#pragma once\n#include \"il2cpp-string-types.h\"\n#include <string>\n#include <vector>\n#include <limits>\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n\nclass LIBIL2CPP_CODEGEN_API StringUtils\n{\npublic:\n\tstatic std::string Printf (const char* format, ...);\n\tstatic std::string NPrintf (const char* format, size_t max_n, ...);\n\tstatic std::string Utf16ToUtf8 (const Il2CppChar* utf16String);\n\tstatic std::string Utf16ToUtf8(const Il2CppChar* utf16String, int maximumSize);\n\tstatic std::string Utf16ToUtf8(const UTF16String& utf16String);\n\tstatic UTF16String Utf8ToUtf16(const char* utf8String);\n\tstatic UTF16String Utf8ToUtf16(const char* utf8String, size_t length);\n\tstatic UTF16String Utf8ToUtf16(const std::string& utf8String);\n\tstatic char* StringDuplicate (const char *strSource);\n\tstatic Il2CppChar* StringDuplicate (const Il2CppChar* strSource, size_t length);\n\tstatic bool EndsWith(const std::string& string, const std::string& suffix);\n    static Il2CppChar* GetChars(Il2CppString* str);\n    static int32_t GetLength(Il2CppString* str);\n\n#if IL2CPP_TARGET_WINDOWS\n\tstatic inline std::string NativeStringToUtf8(const Il2CppNativeString& nativeStr)\n\t{\n\t\tIL2CPP_ASSERT(nativeStr.length() < static_cast<size_t>(std::numeric_limits<int>::max()));\n\t\treturn Utf16ToUtf8(nativeStr.c_str(), static_cast<int>(nativeStr.length()));\n\t}\n\tstatic inline Il2CppNativeString Utf8ToNativeString(const std::string str)\n\t{\n\t\tIL2CPP_ASSERT(str.length() < static_cast<size_t>(std::numeric_limits<int>::max()));\n\t\treturn Utf8ToUtf16(str.c_str(), str.length());\n\t}\n#else\n\tstatic inline std::string NativeStringToUtf8(Il2CppNativeString nativeStr)\n\t{\n\t\treturn nativeStr;\n\t}\n\tstatic inline Il2CppNativeString Utf8ToNativeString(const std::string str)\n\t{\n\t\treturn str;\n\t}\n#endif\n\n\ttemplate <typename CharType, size_t N>\n\tstatic inline size_t LiteralLength(const CharType (&str)[N])\n\t{\n\t\treturn N - 1;\n\t}\n\n\ttemplate <typename CharType>\n\tstatic size_t StrLen(const CharType* str)\n\t{\n\t\tsize_t length = 0;\n\t\twhile (*str)\n\t\t{\n\t\t\tstr++;\n\t\t\tlength++;\n\t\t}\n\n\t\treturn length;\n\t}\n\n\t// Taken from github.com/Microsoft/referencesource/blob/master/mscorlib/system/string.cs\n\ttemplate <typename CharType>\n\tstatic inline size_t Hash (const CharType *str, size_t length)\n\t{\n\t\tIL2CPP_ASSERT(length <= static_cast<size_t>(std::numeric_limits<int>::max()));\n\n\t\tsize_t hash1 = 5381;\n\t\tsize_t hash2 = hash1;\n\t\tsize_t i = 0;\n\n\t\tCharType c;\n\t\tconst CharType* s = str;\n\t\twhile (true)\n\t\t{\n\t\t\tif (i++ >= length)\n\t\t\t\tbreak;\n\t\t\tc = s[0];\n\t\t\thash1 = ((hash1 << 5) + hash1) ^ c;\n\t\t\tif (i++ >= length)\n\t\t\t\tbreak;\n\t\t\tc = s[1];\n\t\t\thash2 = ((hash2 << 5) + hash2) ^ c;\n\t\t\ts += 2;\n\t\t}\n\n\t\treturn hash1 + (hash2 * 1566083941);\n\t}\t\n\t\n\ttemplate <typename CharType>\n\tstatic inline size_t Hash (const CharType *str)\n\t{\n\t\tsize_t hash1 = 5381;\n\t\tsize_t hash2 = hash1;\n\n\t\tCharType c;\n\t\tconst CharType* s = str;\n\t\twhile ((c = s[0]) != 0)\n\t\t{\n\t\t\thash1 = ((hash1 << 5) + hash1) ^ c;\n\t\t\tc = s[1];\n\t\t\tif (c == 0)\n\t\t\t\tbreak;\n\t\t\thash2 = ((hash2 << 5) + hash2) ^ c;\n\t\t\ts += 2;\n\t\t}\n\n\t\treturn hash1 + (hash2 * 1566083941);\n\t}\n\n\ttemplate <typename StringType>\n\tstruct StringHasher\n\t{\n\t\ttypedef typename StringType::value_type CharType;\n\n\t\tsize_t operator()(const StringType& value) const\n\t\t{\n\t\t\treturn Hash(value.c_str(), value.length());\n\t\t}\n\t};\n\n\ttemplate <typename CharType>\n\tstruct StringHasher<const CharType*>\n\t{\n\t\tsize_t operator()(const CharType* value) const\n\t\t{\n\t\t\treturn Hash(value);\n\t\t}\n\t};\n};\n\n\n} /* utils */\n} /* il2cpp */\n\n// Assumes str is not NULL\n#if defined(_MSC_VER)\n#define DECLARE_IL2CPP_STRING_AS_STRING_VIEW_OF_NATIVE_CHARS(variableName, str) \\\n\til2cpp::utils::StringView<Il2CppNativeChar> variableName(reinterpret_cast<Il2CppString*>(str)->chars, reinterpret_cast<Il2CppString*>(str)->length);\n#define DECLARE_NATIVE_C_STRING_AS_STRING_VIEW_OF_IL2CPP_CHARS(variableName, str) \\\n\til2cpp::utils::StringView<Il2CppChar> variableName(str, wcslen(str));\n#define DECLARE_NATIVE_STRING_AS_STRING_VIEW_OF_IL2CPP_CHARS(variableName, str) \\\n\til2cpp::utils::StringView<Il2CppChar> variableName(str);\n#else\n#define DECLARE_IL2CPP_STRING_AS_STRING_VIEW_OF_NATIVE_CHARS(variableName, str) \\\n\tIl2CppNativeString variableName##_native_string_storage = il2cpp::utils::StringUtils::Utf16ToUtf8(reinterpret_cast<Il2CppString*>(str)->chars, reinterpret_cast<Il2CppString*>(str)->length); \\\n\til2cpp::utils::StringView<Il2CppNativeChar> variableName(variableName##_native_string_storage.c_str(), variableName##_native_string_storage.length());\n#define DECLARE_NATIVE_C_STRING_AS_STRING_VIEW_OF_IL2CPP_CHARS(variableName, str) \\\n\tUTF16String variableName##_utf16String = il2cpp::utils::StringUtils::Utf8ToUtf16(str); \\\n\til2cpp::utils::StringView<Il2CppChar> variableName(variableName##_utf16String);\n#define DECLARE_NATIVE_STRING_AS_STRING_VIEW_OF_IL2CPP_CHARS DECLARE_NATIVE_C_STRING_AS_STRING_VIEW_OF_IL2CPP_CHARS\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/StringView.h",
    "content": "#pragma once\n#include <string>\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    template<typename CharType>\n    class StringView\n    {\n    private:\n        const CharType* m_String;\n        size_t m_Length;\n\n        // Intended to only be used by Empty()\n        inline StringView() :\n            m_String(NULL),\n            m_Length(0)\n        {\n        }\n\n    public:\n        template<size_t Length>\n        inline StringView(const CharType(&str)[Length]) :\n            m_String(str), m_Length(Length - 1)\n        {\n        }\n\n        inline StringView(const CharType* str, size_t length) :\n            m_String(str), m_Length(length)\n        {\n            IL2CPP_ASSERT(str != NULL);\n        }\n\n        inline StringView(const StringView<CharType>& str, size_t startIndex, size_t length) :\n            m_String(str.Str() + startIndex),\n            m_Length(length)\n        {\n            IL2CPP_ASSERT(startIndex + length <= str.Length());\n        }\n\n        template<typename CharTraits, typename StringAlloc>\n        inline StringView(const std::basic_string<CharType, CharTraits, StringAlloc>& str) :\n            m_String(str.c_str()), m_Length(str.length())\n        {\n        }\n\n        // This will prevent accidentally assigning temporary values (like function return values)\n        // to a string view. While this protection will only be enabled on C++11 compiles, even those\n        // are enough to catch the bug in our runtime\n#if IL2CPP_HAS_DELETED_FUNCTIONS\n        template<typename CharTraits, typename StringAlloc>\n        StringView(std::basic_string<CharType, CharTraits, StringAlloc>&&) = delete;\n#endif\n\n        inline const CharType* Str() const\n        {\n            return m_String;\n        }\n\n        inline size_t Length() const\n        {\n            return m_Length;\n        }\n\n        inline CharType operator[](size_t index) const\n        {\n            return m_String[index];\n        }\n\n        inline bool IsNullTerminated() const\n        {\n            return m_String[m_Length] == 0;\n        }\n\n        inline bool IsEmpty() const\n        {\n            return Length() == 0;\n        }\n\n        static inline StringView<CharType> Empty()\n        {\n            return StringView<CharType>();\n        }\n\n        inline size_t RFind(CharType c) const\n        {\n            for (const CharType* ptr = m_String + m_Length - 1; ptr >= m_String; ptr--)\n            {\n                if (*ptr == c)\n                    return ptr - m_String;\n            }\n\n            return NPos();\n        }\n\n        inline static size_t NPos()\n        {\n            return static_cast<size_t>(-1);\n        }\n    };\n\n#define StringViewAsNullTerminatedStringOf(CharType, stringView, variableName) \\\n    const CharType* variableName; \\\n    do \\\n    { \\\n        if (stringView.IsNullTerminated()) \\\n        { \\\n            variableName = stringView.Str(); \\\n        } \\\n        else \\\n        { \\\n            CharType* buffer = static_cast<CharType*>(alloca((stringView.Length() + 1) * sizeof(CharType))); \\\n            memcpy(buffer, stringView.Str(), stringView.Length() * sizeof(CharType)); \\\n            buffer[stringView.Length()] = 0; \\\n            variableName = buffer; \\\n        } \\\n    } \\\n    while (false)\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/StringViewStream.h",
    "content": "#pragma once\n\n#include <ostream>\n#include \"StringView.h\"\n\n// This function is in a separate header file because we include StringView into generated code\n// and we definitely don't want to include ostream into generated code\n\ntemplate<typename StreamCharType, typename CharType, typename Traits> inline\nstd::basic_ostream<StreamCharType, Traits>& operator<<(std::basic_ostream<StreamCharType, Traits>& ostream, const il2cpp::utils::StringView<CharType>& stringView)\n{\n    StringViewAsNullTerminatedStringOf(CharType, stringView, str);\n    ostream << str;\n    return ostream;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/TemplateUtils.h",
    "content": "#pragma once\n\n#include <stdint.h>\n\nnamespace il2cpp\n{\nnamespace utils\n{\nnamespace TemplateUtils\n{\n    template<typename T, typename U>\n    struct IsSame\n    {\n        static const bool value = false;\n    };\n\n    template<typename T>\n    struct IsSame<T, T>\n    {\n        static const bool value = true;\n    };\n\n    template<typename B, typename D>\n    struct IsBaseOf\n    {\n    private:\n        template<typename BT, typename DT>\n        struct Converter\n        {\n            operator BT*() const;\n            operator DT*();\n        };\n\n        typedef int16_t Derived;\n        typedef int8_t NotDerived;\n\n        template<typename T>\n        static Derived IsDerived(D*, T);\n        static NotDerived IsDerived(B*, int);\n\n    public:\n        static const bool value = IsSame<B, D>::value || sizeof(IsDerived(Converter<B, D>(), int())) == sizeof(Derived);\n    };\n}\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/ThreadSafeFreeList.h",
    "content": "#pragma once\n\n#include \"os/Unity/AtomicQueue.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    struct ThreadSafeFreeListNode\n    {\n        ThreadSafeFreeListNode* nextFreeListNode;\n\n        ThreadSafeFreeListNode()\n            : nextFreeListNode(NULL) {}\n    };\n\n/// Lockless allocator that keeps instances of T on a free list.\n///\n/// T must be derived from ThreadSafeFreeListNode.\n///\n/// NOTE: T must have sizeof(T) >= sizeof(void*).\n    template<typename T>\n    struct ThreadSafeFreeList\n    {\n        T* Allocate()\n        {\n            T* instance = reinterpret_cast<T*>(m_FreeList.Pop());\n            if (!instance)\n                instance = new T();\n\n            return instance;\n        }\n\n        void Release(T* instance)\n        {\n            ThreadSafeFreeListNode* node = static_cast<ThreadSafeFreeListNode*>(instance);\n            m_FreeList.Push(reinterpret_cast<il2cpp::os::AtomicNode*>(node));\n        }\n\n        ~ThreadSafeFreeList()\n        {\n            T* instance;\n            while ((instance = reinterpret_cast<T*>(m_FreeList.Pop())) != NULL)\n                delete instance;\n        }\n\n    private:\n\n        ALIGN_TYPE(64) il2cpp::os::AtomicStack m_FreeList;\n    };\n} /* utils */\n} /* il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/dynamic_array.h",
    "content": "#pragma once\n\n#include \"Memory.h\"\n#include <algorithm> // std::max\n#include <memory> // std::uninitialized_fill\n\n// dynamic_array - simplified version of std::vector<T>\n//\n// features:\n//  . always uses memcpy for copying elements. Your data structures must be simple and can't have internal pointers / rely on copy constructor.\n//  . EASTL like push_back(void) implementation\n//      Existing std STL implementations implement insertion operations by copying from an element.\n//      For example, resize(size() + 1) creates a throw-away temporary object.\n//      There is no way in existing std STL implementations to add an element to a container without implicitly or\n//          explicitly providing one to copy from (aside from some existing POD optimizations).\n//      For expensive-to-construct objects this creates a potentially serious performance problem.\n//  . grows X2 on reallocation\n//  . small code footprint\n//  . clear actually deallocates memory\n//  . resize does NOT initialize members!\n//\n//  Changelog:\n//      Added pop_back()\n//      Added assign()\n//      Added clear() - frees the data, use resize(0) to clear w/o freeing\n//      zero allocation for empty array\n//\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    template<typename T>\n    struct AlignOfType\n    {\n        enum\n        {\n            align = ALIGN_OF(T)\n        };\n    };\n\n\n    template<typename T, size_t ALIGN = AlignOfType<T>::align>\n    struct dynamic_array\n    {\n    public:\n        enum\n        {\n            align = ALIGN\n        };\n\n        typedef T *iterator;\n        typedef const T *const_iterator;\n        typedef T value_type;\n        typedef size_t size_type;\n        typedef size_t difference_type;\n        typedef T &reference;\n        typedef const T &const_reference;\n\n    public:\n\n        dynamic_array() : m_data(NULL), m_size(0), m_capacity(0)\n        {\n        }\n\n        explicit dynamic_array(size_t size)\n            : m_size(size), m_capacity(size)\n        {\n            m_data = allocate(size);\n        }\n\n        dynamic_array(size_t size, T const &init_value)\n            : m_size(size), m_capacity(size)\n        {\n            m_data = allocate(size);\n            std::uninitialized_fill(m_data, m_data + size, init_value);\n        }\n\n        ~dynamic_array()\n        {\n            if (owns_data())\n                m_data = deallocate(m_data);\n        }\n\n        dynamic_array(const dynamic_array &other) : m_size(0), m_capacity(0)\n        {\n            m_data = NULL;\n            assign(other.begin(), other.end());\n        }\n\n        dynamic_array &operator=(const dynamic_array &other)\n        {\n            // should not allocate memory unless we have to\n            if (&other != this)\n                assign(other.begin(), other.end());\n            return *this;\n        }\n\n        void clear()\n        {\n            if (owns_data())\n                m_data = deallocate(m_data);\n            m_size = 0;\n            m_capacity = 0;\n        }\n\n        void assign(const_iterator begin, const_iterator end)\n        {\n            Assert(begin <= end);\n\n            resize_uninitialized(end - begin);\n            memcpy(m_data, begin, m_size * sizeof(T));\n        }\n\n        iterator erase(iterator input_begin, iterator input_end)\n        {\n            Assert(input_begin <= input_end);\n            Assert(input_begin >= begin());\n            Assert(input_end <= end());\n\n            size_t leftOverSize = end() - input_end;\n            memmove(input_begin, input_end, leftOverSize * sizeof(T));\n            m_size -= input_end - input_begin;\n            return input_begin;\n        }\n\n        iterator erase(iterator it)\n        {\n            return erase(it, it + 1);\n        }\n\n        iterator erase_swap_back(iterator it)\n        {\n            m_size--;\n            memcpy(it, end(), sizeof(T));\n            return it;\n        }\n\n        iterator insert(iterator insert_before, const_iterator input_begin, const_iterator input_end)\n        {\n            Assert(input_begin <= input_end);\n            Assert(insert_before >= begin());\n            Assert(insert_before <= end());\n\n            // resize (make sure that insertBefore does not get invalid in the meantime because of a reallocation)\n            size_t insert_before_index = insert_before - begin();\n            size_t elements_to_be_moved = size() - insert_before_index;\n            resize_uninitialized((input_end - input_begin) + size(), true);\n            insert_before = begin() + insert_before_index;\n\n            size_t insertsize = input_end - input_begin;\n            // move to the end of where the inserted data will be\n            memmove(insert_before + insertsize, insert_before, elements_to_be_moved * sizeof(T));\n            // inject input data in the hole we just created\n            memcpy(insert_before, input_begin, insertsize * sizeof(T));\n\n            return insert_before;\n        }\n\n        iterator insert(iterator insertBefore, const T &t) { return insert(insertBefore, &t, &t + 1); }\n\n        void swap(dynamic_array &other) throw ()\n        {\n            std::swap(m_data, other.m_data);\n            std::swap(m_size, other.m_size);\n            std::swap(m_capacity, other.m_capacity);\n        }\n\n        // Returns the memory to the object.\n        // This does not call the constructor for the newly added element.\n        // You are expected to initialize all member variables of the returned data.\n        T &push_back()\n        {\n            if (++m_size > capacity())\n                reserve(std::max<size_t>(capacity() * 2, 1));\n            return back();\n        }\n\n        // push_back but it also calls the constructor for the newly added element.\n        T &push_back_construct()\n        {\n            if (++m_size > capacity())\n                reserve(std::max<size_t>(capacity() * 2, 1));\n            // construct\n            T *ptr = &back();\n            new(ptr)T;\n            return *ptr;\n        }\n\n        // push_back but assigns /t/ to the newly added element.\n        void push_back(const T &t)\n        {\n            push_back() = t;\n        }\n\n        void pop_back()\n        {\n            Assert(m_size >= 1);\n            m_size--;\n        }\n\n        void resize_uninitialized(size_t size, bool double_on_resize = false)\n        {\n            m_size = size;\n            if (m_size <= capacity())\n                return;\n\n            if (double_on_resize && size < capacity() * 2)\n                size = capacity() * 2;\n            reserve(size);\n        }\n\n        void resize_initialized(size_t size, const T &t = T(), bool double_on_resize = false)\n        {\n            if (size > capacity())\n            {\n                size_t requested_size = size;\n                if (double_on_resize && size < capacity() * 2)\n                    requested_size = capacity() * 2;\n                reserve(requested_size);\n            }\n\n            if (size > m_size)\n                std::uninitialized_fill(m_data + m_size, m_data + size, t);\n            m_size = size;\n        }\n\n        void reserve(size_t inCapacity)\n        {\n            if (capacity() >= inCapacity)\n                return;\n\n            if (owns_data())\n            {\n                Assert((inCapacity & k_reference_bit) == 0 && \"Dynamic array capacity overflow\");\n                m_capacity = inCapacity;\n                m_data = reallocate(m_data, inCapacity);\n            }\n            else\n            {\n                T *newData = allocate(inCapacity);\n                memcpy(newData, m_data, m_size * sizeof(T));\n\n                // Invalidate old non-owned data, since using the data from two places is most likely a really really bad idea.\n#if IL2CPP_DEBUG\n                memset(m_data, 0xCD, capacity() * sizeof(T));\n#endif\n\n                m_capacity = inCapacity; // and clear reference bit\n                m_data = newData;\n            }\n        }\n\n        void assign_external(T *begin, T *end)\n        {\n            if (owns_data())\n                m_data = deallocate(m_data);\n            m_size = m_capacity = reinterpret_cast<value_type *>(end) - reinterpret_cast<value_type *>(begin);\n            Assert(m_size < k_reference_bit);\n            m_capacity |= k_reference_bit;\n            m_data = begin;\n        }\n\n        void set_owns_data(bool ownsData)\n        {\n            if (ownsData)\n                m_capacity &= ~k_reference_bit;\n            else\n                m_capacity |= k_reference_bit;\n        }\n\n        void shrink_to_fit()\n        {\n            if (owns_data())\n            {\n                m_capacity = m_size;\n                m_data = reallocate(m_data, m_size);\n            }\n        }\n\n        const T &back() const\n        {\n            Assert(m_size != 0);\n            return m_data[m_size - 1];\n        }\n\n        const T &front() const\n        {\n            Assert(m_size != 0);\n            return m_data[0];\n        }\n\n        T &back()\n        {\n            Assert(m_size != 0);\n            return m_data[m_size - 1];\n        }\n\n        T &front()\n        {\n            Assert(m_size != 0);\n            return m_data[0];\n        }\n\n        T *data() { return m_data; }\n\n        T const *data() const { return m_data; }\n\n        bool empty() const { return m_size == 0; }\n\n        size_t size() const { return m_size; }\n\n        size_t capacity() const { return m_capacity & ~k_reference_bit; }\n\n        T const &operator[](size_t index) const\n        {\n            Assert(index < m_size);\n            return m_data[index];\n        }\n\n        T &operator[](size_t index)\n        {\n            Assert(index < m_size);\n            return m_data[index];\n        }\n\n        T const *begin() const { return m_data; }\n\n        T *begin() { return m_data; }\n\n        T const *end() const { return m_data + m_size; }\n\n        T *end() { return m_data + m_size; }\n\n        bool owns_data() { return (m_capacity & k_reference_bit) == 0; }\n\n        bool equals(const dynamic_array &other) const\n        {\n            if (m_size != other.m_size)\n                return false;\n\n            for (int i = 0; i < m_size; i++)\n            {\n                if (!(m_data[i] == other.m_data[i]))\n                    return false;\n            }\n\n            return true;\n        }\n\n    private:\n\n        static const size_t k_reference_bit = (size_t)1 << (sizeof(size_t) * 8 - 1);\n\n        T *allocate(size_t size)\n        {\n            return static_cast<T *>(IL2CPP_MALLOC_ALIGNED(size * sizeof(T), align));\n        }\n\n        T *deallocate(T *data)\n        {\n            Assert(owns_data());\n            IL2CPP_FREE_ALIGNED(data);\n            return NULL;\n        }\n\n        T *reallocate(T *data, size_t size)\n        {\n            Assert(owns_data());\n            return static_cast<T *>(IL2CPP_REALLOC_ALIGNED(data, size * sizeof(T), align));\n        }\n\n        T *m_data;\n        size_t m_size;\n        size_t m_capacity;\n    };\n} //namespace il2cpp\n} //namespace utils\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/utf8-cpp/source/utf8/checked.h",
    "content": "// Copyright 2006 Nemanja Trifunovic\n\n/*\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n*/\n\n\n#ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n#define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n\n#include \"core.h\"\n#include <stdexcept>\n\nnamespace utf8\n{\n    // Base for the exceptions that may be thrown from the library\n    class exception : public ::std::exception {\n    };\n\n    // Exceptions that may be thrown from the library functions.\n    class invalid_code_point : public exception {\n        uint32_t cp;\n    public:\n        invalid_code_point(uint32_t cp) : cp(cp) {}\n        virtual const char* what() const throw() { return \"Invalid code point\"; }\n        uint32_t code_point() const {return cp;}\n    };\n\n    class invalid_utf8 : public exception {\n        uint8_t u8;\n    public:\n        invalid_utf8 (uint8_t u) : u8(u) {}\n        virtual const char* what() const throw() { return \"Invalid UTF-8\"; }\n        uint8_t utf8_octet() const {return u8;}\n    };\n\n    class invalid_utf16 : public exception {\n        uint16_t u16;\n    public:\n        invalid_utf16 (uint16_t u) : u16(u) {}\n        virtual const char* what() const throw() { return \"Invalid UTF-16\"; }\n        uint16_t utf16_word() const {return u16;}\n    };\n\n    class not_enough_room : public exception {\n    public:\n        virtual const char* what() const throw() { return \"Not enough space\"; }\n    };\n\n    /// The library API - functions intended to be called by the users\n\n    template <typename octet_iterator>\n    octet_iterator append(uint32_t cp, octet_iterator result)\n    {\n        if (!utf8::internal::is_code_point_valid(cp))\n            throw invalid_code_point(cp);\n\n        if (cp < 0x80)                        // one octet\n            *(result++) = static_cast<uint8_t>(cp);\n        else if (cp < 0x800) {                // two octets\n            *(result++) = static_cast<uint8_t>((cp >> 6)            | 0xc0);\n            *(result++) = static_cast<uint8_t>((cp & 0x3f)          | 0x80);\n        }\n        else if (cp < 0x10000) {              // three octets\n            *(result++) = static_cast<uint8_t>((cp >> 12)           | 0xe0);\n            *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f)   | 0x80);\n            *(result++) = static_cast<uint8_t>((cp & 0x3f)          | 0x80);\n        }\n        else {                                // four octets\n            *(result++) = static_cast<uint8_t>((cp >> 18)           | 0xf0);\n            *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)  | 0x80);\n            *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f)   | 0x80);\n            *(result++) = static_cast<uint8_t>((cp & 0x3f)          | 0x80);\n        }\n        return result;\n    }\n\n    template <typename octet_iterator, typename output_iterator>\n    output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement)\n    {\n        while (start != end) {\n            octet_iterator sequence_start = start;\n            internal::utf_error err_code = utf8::internal::validate_next(start, end);\n            switch (err_code) {\n                case internal::UTF8_OK :\n                    for (octet_iterator it = sequence_start; it != start; ++it)\n                        *out++ = *it;\n                    break;\n                case internal::NOT_ENOUGH_ROOM:\n                    throw not_enough_room();\n                case internal::INVALID_LEAD:\n                    out = utf8::append (replacement, out);\n                    ++start;\n                    break;\n                case internal::INCOMPLETE_SEQUENCE:\n                case internal::OVERLONG_SEQUENCE:\n                case internal::INVALID_CODE_POINT:\n                    out = utf8::append (replacement, out);\n                    ++start;\n                    // just one replacement mark for the sequence\n                    while (start != end && utf8::internal::is_trail(*start))\n                        ++start;\n                    break;\n            }\n        }\n        return out;\n    }\n\n    template <typename octet_iterator, typename output_iterator>\n    inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out)\n    {\n        static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd);\n        return utf8::replace_invalid(start, end, out, replacement_marker);\n    }\n\n    template <typename octet_iterator>\n    uint32_t next(octet_iterator& it, octet_iterator end)\n    {\n        uint32_t cp = 0;\n        internal::utf_error err_code = utf8::internal::validate_next(it, end, cp);\n        switch (err_code) {\n            case internal::UTF8_OK :\n                break;\n            case internal::NOT_ENOUGH_ROOM :\n                throw not_enough_room();\n            case internal::INVALID_LEAD :\n            case internal::INCOMPLETE_SEQUENCE :\n            case internal::OVERLONG_SEQUENCE :\n                throw invalid_utf8(*it);\n            case internal::INVALID_CODE_POINT :\n                throw invalid_code_point(cp);\n        }\n        return cp;\n    }\n\n    template <typename octet_iterator>\n    uint32_t peek_next(octet_iterator it, octet_iterator end)\n    {\n        return utf8::next(it, end);\n    }\n\n    template <typename octet_iterator>\n    uint32_t prior(octet_iterator& it, octet_iterator start)\n    {\n        // can't do much if it == start\n        if (it == start)\n            throw not_enough_room();\n\n        octet_iterator end = it;\n        // Go back until we hit either a lead octet or start\n        while (utf8::internal::is_trail(*(--it)))\n            if (it == start)\n                throw invalid_utf8(*it); // error - no lead byte in the sequence\n        return utf8::peek_next(it, end);\n    }\n\n    /// Deprecated in versions that include \"prior\"\n    template <typename octet_iterator>\n    uint32_t previous(octet_iterator& it, octet_iterator pass_start)\n    {\n        octet_iterator end = it;\n        while (utf8::internal::is_trail(*(--it)))\n            if (it == pass_start)\n                throw invalid_utf8(*it); // error - no lead byte in the sequence\n        octet_iterator temp = it;\n        return utf8::next(temp, end);\n    }\n\n    template <typename octet_iterator, typename distance_type>\n    void advance (octet_iterator& it, distance_type n, octet_iterator end)\n    {\n        for (distance_type i = 0; i < n; ++i)\n            utf8::next(it, end);\n    }\n\n    template <typename octet_iterator>\n    typename std::iterator_traits<octet_iterator>::difference_type\n    distance (octet_iterator first, octet_iterator last)\n    {\n        typename std::iterator_traits<octet_iterator>::difference_type dist;\n        for (dist = 0; first < last; ++dist)\n            utf8::next(first, last);\n        return dist;\n    }\n\n    template <typename u16bit_iterator, typename octet_iterator>\n    octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)\n    {\n        while (start != end) {\n            uint32_t cp = utf8::internal::mask16(*start++);\n            // Take care of surrogate pairs first\n            if (utf8::internal::is_lead_surrogate(cp)) {\n                if (start != end) {\n                    uint32_t trail_surrogate = utf8::internal::mask16(*start++);\n                    if (utf8::internal::is_trail_surrogate(trail_surrogate))\n                        cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;\n                    else\n                        throw invalid_utf16(static_cast<uint16_t>(trail_surrogate));\n                }\n                else\n                    throw invalid_utf16(static_cast<uint16_t>(cp));\n\n            }\n            // Lone trail surrogate\n            else if (utf8::internal::is_trail_surrogate(cp))\n                throw invalid_utf16(static_cast<uint16_t>(cp));\n\n            result = utf8::append(cp, result);\n        }\n        return result;\n    }\n\n    template <typename u16bit_iterator, typename octet_iterator>\n    u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)\n    {\n        while (start != end) {\n            uint32_t cp = utf8::next(start, end);\n            if (cp > 0xffff) { //make a surrogate pair\n                *result++ = static_cast<uint16_t>((cp >> 10)   + internal::LEAD_OFFSET);\n                *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);\n            }\n            else\n                *result++ = static_cast<uint16_t>(cp);\n        }\n        return result;\n    }\n\n    template <typename octet_iterator, typename u32bit_iterator>\n    octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)\n    {\n        while (start != end)\n            result = utf8::append(*(start++), result);\n\n        return result;\n    }\n\n    template <typename octet_iterator, typename u32bit_iterator>\n    u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)\n    {\n        while (start != end)\n            (*result++) = utf8::next(start, end);\n\n        return result;\n    }\n\n    // The iterator class\n    template <typename octet_iterator>\n    class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> {\n      octet_iterator it;\n      octet_iterator range_start;\n      octet_iterator range_end;\n      public:\n      iterator () {}\n      explicit iterator (const octet_iterator& octet_it,\n                         const octet_iterator& range_start,\n                         const octet_iterator& range_end) :\n               it(octet_it), range_start(range_start), range_end(range_end)\n      {\n          if (it < range_start || it > range_end)\n              throw std::out_of_range(\"Invalid utf-8 iterator position\");\n      }\n      // the default \"big three\" are OK\n      octet_iterator base () const { return it; }\n      uint32_t operator * () const\n      {\n          octet_iterator temp = it;\n          return utf8::next(temp, range_end);\n      }\n      bool operator == (const iterator& rhs) const\n      {\n          if (range_start != rhs.range_start || range_end != rhs.range_end)\n              throw std::logic_error(\"Comparing utf-8 iterators defined with different ranges\");\n          return (it == rhs.it);\n      }\n      bool operator != (const iterator& rhs) const\n      {\n          return !(operator == (rhs));\n      }\n      iterator& operator ++ ()\n      {\n          utf8::next(it, range_end);\n          return *this;\n      }\n      iterator operator ++ (int)\n      {\n          iterator temp = *this;\n          utf8::next(it, range_end);\n          return temp;\n      }\n      iterator& operator -- ()\n      {\n          utf8::prior(it, range_start);\n          return *this;\n      }\n      iterator operator -- (int)\n      {\n          iterator temp = *this;\n          utf8::prior(it, range_start);\n          return temp;\n      }\n    }; // class iterator\n\n} // namespace utf8\n\n#endif //header guard\n\n\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/utf8-cpp/source/utf8/core.h",
    "content": "// Copyright 2006 Nemanja Trifunovic\n\n/*\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n*/\n\n\n#ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n#define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n\n#include <iterator>\n\nnamespace utf8\n{\n    // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers\n    // You may need to change them to match your system.\n    // These typedefs have the same names as ones from cstdint, or boost/cstdint\n    typedef unsigned char   uint8_t;\n    typedef unsigned short  uint16_t;\n    typedef unsigned int    uint32_t;\n\n// Helper code - not intended to be directly called by the library users. May be changed at any time\nnamespace internal\n{\n    // Unicode constants\n    // Leading (high) surrogates: 0xd800 - 0xdbff\n    // Trailing (low) surrogates: 0xdc00 - 0xdfff\n    const uint16_t LEAD_SURROGATE_MIN  = 0xd800u;\n    const uint16_t LEAD_SURROGATE_MAX  = 0xdbffu;\n    const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u;\n    const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu;\n    const uint16_t LEAD_OFFSET         = LEAD_SURROGATE_MIN - (0x10000 >> 10);\n    const uint32_t SURROGATE_OFFSET    = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN;\n\n    // Maximum valid value for a Unicode code point\n    const uint32_t CODE_POINT_MAX      = 0x0010ffffu;\n\n    template<typename octet_type>\n    inline uint8_t mask8(octet_type oc)\n    {\n        return static_cast<uint8_t>(0xff & oc);\n    }\n    template<typename u16_type>\n    inline uint16_t mask16(u16_type oc)\n    {\n        return static_cast<uint16_t>(0xffff & oc);\n    }\n    template<typename octet_type>\n    inline bool is_trail(octet_type oc)\n    {\n        return ((utf8::internal::mask8(oc) >> 6) == 0x2);\n    }\n\n    template <typename u16>\n    inline bool is_lead_surrogate(u16 cp)\n    {\n        return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX);\n    }\n\n    template <typename u16>\n    inline bool is_trail_surrogate(u16 cp)\n    {\n        return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX);\n    }\n\n    template <typename u16>\n    inline bool is_surrogate(u16 cp)\n    {\n        return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX);\n    }\n\n    template <typename u32>\n    inline bool is_code_point_valid(u32 cp)\n    {\n        return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp));\n    }\n\n    template <typename octet_iterator>\n    inline typename std::iterator_traits<octet_iterator>::difference_type\n    sequence_length(octet_iterator lead_it)\n    {\n        uint8_t lead = utf8::internal::mask8(*lead_it);\n        if (lead < 0x80)\n            return 1;\n        else if ((lead >> 5) == 0x6)\n            return 2;\n        else if ((lead >> 4) == 0xe)\n            return 3;\n        else if ((lead >> 3) == 0x1e)\n            return 4;\n        else\n            return 0;\n    }\n\n    template <typename octet_difference_type>\n    inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length)\n    {\n        if (cp < 0x80) {\n            if (length != 1) \n                return true;\n        }\n        else if (cp < 0x800) {\n            if (length != 2) \n                return true;\n        }\n        else if (cp < 0x10000) {\n            if (length != 3) \n                return true;\n        }\n\n        return false;\n    }\n\n    enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT};\n\n    /// Helper for get_sequence_x\n    template <typename octet_iterator>\n    utf_error increase_safely(octet_iterator& it, octet_iterator end)\n    {\n        if (++it == end)\n            return NOT_ENOUGH_ROOM;\n\n        if (!utf8::internal::is_trail(*it))\n            return INCOMPLETE_SEQUENCE;\n        \n        return UTF8_OK;\n    }\n\n    #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;}    \n\n    /// get_sequence_x functions decode utf-8 sequences of the length x\n    template <typename octet_iterator>\n    utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point)\n    {\n        if (it == end)\n            return NOT_ENOUGH_ROOM;\n\n        code_point = utf8::internal::mask8(*it);\n\n        return UTF8_OK;\n    }\n\n    template <typename octet_iterator>\n    utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point)\n    {\n        if (it == end) \n            return NOT_ENOUGH_ROOM;\n        \n        code_point = utf8::internal::mask8(*it);\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f);\n\n        return UTF8_OK;\n    }\n\n    template <typename octet_iterator>\n    utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point)\n    {\n        if (it == end)\n            return NOT_ENOUGH_ROOM;\n            \n        code_point = utf8::internal::mask8(*it);\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point += (*it) & 0x3f;\n\n        return UTF8_OK;\n    }\n\n    template <typename octet_iterator>\n    utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point)\n    {\n        if (it == end)\n           return NOT_ENOUGH_ROOM;\n\n        code_point = utf8::internal::mask8(*it);\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point += (utf8::internal::mask8(*it) << 6) & 0xfff;\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point += (*it) & 0x3f;\n\n        return UTF8_OK;\n    }\n\n    #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR\n\n    template <typename octet_iterator>\n    utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point)\n    {\n        // Save the original value of it so we can go back in case of failure\n        // Of course, it does not make much sense with i.e. stream iterators\n        octet_iterator original_it = it;\n\n        uint32_t cp = 0;\n        // Determine the sequence length based on the lead octet\n        typedef typename std::iterator_traits<octet_iterator>::difference_type octet_difference_type;\n        const octet_difference_type length = utf8::internal::sequence_length(it);\n\n        // Get trail octets and calculate the code point\n        utf_error err = UTF8_OK;\n        switch (length) {\n            case 0: \n                return INVALID_LEAD;\n            case 1:\n                err = utf8::internal::get_sequence_1(it, end, cp);\n                break;\n            case 2:\n                err = utf8::internal::get_sequence_2(it, end, cp);\n            break;\n            case 3:\n                err = utf8::internal::get_sequence_3(it, end, cp);\n            break;\n            case 4:\n                err = utf8::internal::get_sequence_4(it, end, cp);\n            break;\n        }\n\n        if (err == UTF8_OK) {\n            // Decoding succeeded. Now, security checks...\n            if (utf8::internal::is_code_point_valid(cp)) {\n                if (!utf8::internal::is_overlong_sequence(cp, length)){\n                    // Passed! Return here.\n                    code_point = cp;\n                    ++it;\n                    return UTF8_OK;\n                }\n                else\n                    err = OVERLONG_SEQUENCE;\n            }\n            else \n                err = INVALID_CODE_POINT;\n        }\n\n        // Failure branch - restore the original value of the iterator\n        it = original_it;\n        return err;\n    }\n\n    template <typename octet_iterator>\n    inline utf_error validate_next(octet_iterator& it, octet_iterator end) {\n        uint32_t ignored;\n        return utf8::internal::validate_next(it, end, ignored);\n    }\n\n} // namespace internal\n\n    /// The library API - functions intended to be called by the users\n\n    // Byte order mark\n    const uint8_t bom[] = {0xef, 0xbb, 0xbf};\n\n    template <typename octet_iterator>\n    octet_iterator find_invalid(octet_iterator start, octet_iterator end)\n    {\n        octet_iterator result = start;\n        while (result != end) {\n            utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end);\n            if (err_code != internal::UTF8_OK)\n                return result;\n        }\n        return result;\n    }\n\n    template <typename octet_iterator>\n    inline bool is_valid(octet_iterator start, octet_iterator end)\n    {\n        return (utf8::find_invalid(start, end) == end);\n    }\n\n    template <typename octet_iterator>\n    inline bool starts_with_bom (octet_iterator it, octet_iterator end)\n    {\n        return (\n            ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) &&\n            ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) &&\n            ((it != end) && (utf8::internal::mask8(*it))   == bom[2])\n           );\n    }\n\t\n    //Deprecated in release 2.3 \n    template <typename octet_iterator>\n    inline bool is_bom (octet_iterator it)\n    {\n        return (\n            (utf8::internal::mask8(*it++)) == bom[0] &&\n            (utf8::internal::mask8(*it++)) == bom[1] &&\n            (utf8::internal::mask8(*it))   == bom[2]\n           );\n    }\n} // namespace utf8\n\n#endif // header guard\n\n\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/utf8-cpp/source/utf8/unchecked.h",
    "content": "// Copyright 2006 Nemanja Trifunovic\n\n/*\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n*/\n\n\n#ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n#define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n\n#include \"core.h\"\n\nnamespace utf8\n{\n    namespace unchecked \n    {\n        template <typename octet_iterator>\n        octet_iterator append(uint32_t cp, octet_iterator result)\n        {\n            if (cp < 0x80)                        // one octet\n                *(result++) = static_cast<uint8_t>(cp);  \n            else if (cp < 0x800) {                // two octets\n                *(result++) = static_cast<uint8_t>((cp >> 6)          | 0xc0);\n                *(result++) = static_cast<uint8_t>((cp & 0x3f)        | 0x80);\n            }\n            else if (cp < 0x10000) {              // three octets\n                *(result++) = static_cast<uint8_t>((cp >> 12)         | 0xe0);\n                *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);\n                *(result++) = static_cast<uint8_t>((cp & 0x3f)        | 0x80);\n            }\n            else {                                // four octets\n                *(result++) = static_cast<uint8_t>((cp >> 18)         | 0xf0);\n                *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)| 0x80);\n                *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);\n                *(result++) = static_cast<uint8_t>((cp & 0x3f)        | 0x80);\n            }\n            return result;\n        }\n\n        template <typename octet_iterator>\n        uint32_t next(octet_iterator& it)\n        {\n            uint32_t cp = utf8::internal::mask8(*it);\n            typename std::iterator_traits<octet_iterator>::difference_type length = utf8::internal::sequence_length(it);\n            switch (length) {\n                case 1:\n                    break;\n                case 2:\n                    it++;\n                    cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f);\n                    break;\n                case 3:\n                    ++it; \n                    cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);\n                    ++it;\n                    cp += (*it) & 0x3f;\n                    break;\n                case 4:\n                    ++it;\n                    cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);                \n                    ++it;\n                    cp += (utf8::internal::mask8(*it) << 6) & 0xfff;\n                    ++it;\n                    cp += (*it) & 0x3f; \n                    break;\n            }\n            ++it;\n            return cp;        \n        }\n\n        template <typename octet_iterator>\n        uint32_t peek_next(octet_iterator it)\n        {\n            return utf8::unchecked::next(it);    \n        }\n\n        template <typename octet_iterator>\n        uint32_t prior(octet_iterator& it)\n        {\n            while (utf8::internal::is_trail(*(--it))) ;\n            octet_iterator temp = it;\n            return utf8::unchecked::next(temp);\n        }\n\n        // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous)\n        template <typename octet_iterator>\n        inline uint32_t previous(octet_iterator& it)\n        {\n            return utf8::unchecked::prior(it);\n        }\n\n        template <typename octet_iterator, typename distance_type>\n        void advance (octet_iterator& it, distance_type n)\n        {\n            for (distance_type i = 0; i < n; ++i)\n                utf8::unchecked::next(it);\n        }\n\n        template <typename octet_iterator>\n        typename std::iterator_traits<octet_iterator>::difference_type\n        distance (octet_iterator first, octet_iterator last)\n        {\n            typename std::iterator_traits<octet_iterator>::difference_type dist;\n            for (dist = 0; first < last; ++dist) \n                utf8::unchecked::next(first);\n            return dist;\n        }\n\n        template <typename u16bit_iterator, typename octet_iterator>\n        octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)\n        {       \n            while (start != end) {\n                uint32_t cp = utf8::internal::mask16(*start++);\n            // Take care of surrogate pairs first\n                if (utf8::internal::is_lead_surrogate(cp)) {\n                    uint32_t trail_surrogate = utf8::internal::mask16(*start++);\n                    cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;\n                }\n                result = utf8::unchecked::append(cp, result);\n            }\n            return result;         \n        }\n\n        template <typename u16bit_iterator, typename octet_iterator>\n        u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)\n        {\n            while (start < end) {\n                uint32_t cp = utf8::unchecked::next(start);\n                if (cp > 0xffff) { //make a surrogate pair\n                    *result++ = static_cast<uint16_t>((cp >> 10)   + internal::LEAD_OFFSET);\n                    *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);\n                }\n                else\n                    *result++ = static_cast<uint16_t>(cp);\n            }\n            return result;\n        }\n\n        template <typename octet_iterator, typename u32bit_iterator>\n        octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)\n        {\n            while (start != end)\n                result = utf8::unchecked::append(*(start++), result);\n\n            return result;\n        }\n\n        template <typename octet_iterator, typename u32bit_iterator>\n        u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)\n        {\n            while (start < end)\n                (*result++) = utf8::unchecked::next(start);\n\n            return result;\n        }\n\n        // The iterator class\n        template <typename octet_iterator>\n          class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> { \n            octet_iterator it;\n            public:\n            iterator () {}\n            explicit iterator (const octet_iterator& octet_it): it(octet_it) {}\n            // the default \"big three\" are OK\n            octet_iterator base () const { return it; }\n            uint32_t operator * () const\n            {\n                octet_iterator temp = it;\n                return utf8::unchecked::next(temp);\n            }\n            bool operator == (const iterator& rhs) const \n            { \n                return (it == rhs.it);\n            }\n            bool operator != (const iterator& rhs) const\n            {\n                return !(operator == (rhs));\n            }\n            iterator& operator ++ () \n            {\n                ::std::advance(it, utf8::internal::sequence_length(it));\n                return *this;\n            }\n            iterator operator ++ (int)\n            {\n                iterator temp = *this;\n                ::std::advance(it, utf8::internal::sequence_length(it));\n                return temp;\n            }  \n            iterator& operator -- ()\n            {\n                utf8::unchecked::prior(it);\n                return *this;\n            }\n            iterator operator -- (int)\n            {\n                iterator temp = *this;\n                utf8::unchecked::prior(it);\n                return temp;\n            }\n          }; // class iterator\n\n    } // namespace utf8::unchecked\n} // namespace utf8 \n\n\n#endif // header guard\n\n"
  },
  {
    "path": "unity_decoder/libil2cpp/utils/utf8-cpp/source/utf8.h",
    "content": "// Copyright 2006 Nemanja Trifunovic\n\n/*\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n*/\n\n\n#ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731\n#define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731\n\n#include \"utf8/checked.h\"\n#include \"utf8/unchecked.h\"\n\n#endif // header guard\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Array.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"gc/gc_wrapper.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Object.h\"\n#include \"vm/Profiler.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include <assert.h>\n#include <memory>\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    int32_t Array::GetElementSize(const Il2CppClass *klass)\n    {\n        IL2CPP_ASSERT(klass->rank);\n        return klass->element_size;\n    }\n\n    uint32_t Array::GetLength(Il2CppArray* array)\n    {\n        return array->max_length;\n    }\n\n    uint32_t Array::GetByteLength(Il2CppArray* array)\n    {\n        Il2CppClass *klass;\n        int length;\n        int i;\n\n        klass = array->klass;\n\n        if (array->bounds == NULL)\n            length = array->max_length;\n        else\n        {\n            length = 1;\n            for (i = 0; i < klass->rank; ++i)\n                length *= array->bounds[i].length;\n        }\n\n        return length * GetElementSize(klass);\n    }\n\n    Il2CppArray* Array::New(Il2CppClass *elementTypeInfo, il2cpp_array_size_t length)\n    {\n        return NewSpecific(Class::GetArrayClass(elementTypeInfo, 1), length);\n    }\n\n    static void RaiseOverflowException()\n    {\n        vm::Exception::Raise(vm::Exception::GetOverflowException(\"Arithmetic operation resulted in an overflow.\"));\n    }\n\n    Il2CppArray* Array::NewSpecific(Il2CppClass *klass, il2cpp_array_size_t n)\n    {\n        Il2CppObject *o;\n        Il2CppArray *ao;\n        uint32_t byte_len, elem_size;\n\n        Class::Init(klass);\n        IL2CPP_ASSERT(klass->rank);\n        IL2CPP_ASSERT(klass->initialized);\n        IL2CPP_ASSERT(klass->element_class->initialized);\n\n        NOT_IMPLEMENTED_NO_ASSERT(Array::NewSpecific, \"Not checking for overflow\");\n        NOT_IMPLEMENTED_NO_ASSERT(Array::NewSpecific, \"Handle allocations with a GC descriptor\");\n\n        if (n < 0)\n            RaiseOverflowException();\n\n        //if (G_UNLIKELY (n > MONO_ARRAY_MAX_INDEX)) {\n        //  arith_overflow ();\n        //  return NULL;\n        //}\n\n        elem_size = il2cpp_array_element_size(klass);\n        //if (CHECK_MUL_OVERFLOW_UN (n, elem_size)) {\n        //  mono_gc_out_of_memory (MONO_ARRAY_MAX_SIZE);\n        //  return NULL;\n        //}\n        byte_len = n * elem_size;\n        //if (CHECK_ADD_OVERFLOW_UN (byte_len, sizeof (MonoArray))) {\n        //  mono_gc_out_of_memory (MONO_ARRAY_MAX_SIZE);\n        //  return NULL;\n        //}\n        byte_len += kIl2CppSizeOfArray;\n        if (!klass->has_references)\n        {\n            o = Object::AllocatePtrFree(byte_len, klass);\n#if NEED_TO_ZERO_PTRFREE\n            ((Il2CppArray*)o)->bounds = NULL;\n            memset((char*)o + sizeof(Il2CppObject), 0, byte_len - sizeof(Il2CppObject));\n#endif\n        }\n#if IL2CPP_HAS_GC_DESCRIPTORS\n        else if (klass->gc_desc != GC_NO_DESCRIPTOR)\n        {\n            o = Object::AllocateSpec(byte_len, klass);\n        }\n#endif\n        else\n        {\n            o = Object::Allocate(byte_len, klass);\n        }\n\n        ao = (Il2CppArray*)o;\n        ao->max_length = n;\n\n#if IL2CPP_ENABLE_PROFILER\n        if (Profiler::ProfileAllocations())\n            Profiler::Allocation(o, klass);\n#endif\n\n        return ao;\n    }\n\n    Il2CppArray* Array::NewFull(Il2CppClass *array_class, il2cpp_array_size_t *lengths, il2cpp_array_size_t *lower_bounds)\n    {\n        il2cpp_array_size_t byte_len, len, bounds_size;\n        Il2CppObject *o;\n        Il2CppArray *array;\n        int i;\n\n        Class::Init(array_class);\n        IL2CPP_ASSERT(array_class->rank);\n        IL2CPP_ASSERT(array_class->initialized);\n        IL2CPP_ASSERT(array_class->element_class->initialized);\n\n        NOT_IMPLEMENTED_NO_ASSERT(Array::NewFull, \"IGNORING non-zero based arrays!\");\n        NOT_IMPLEMENTED_NO_ASSERT(Array::NewFull, \"Handle allocations with a GC descriptor\");\n\n        for (i = 0; i < array_class->rank; ++i)\n        {\n            if (lengths[i] < 0)\n                RaiseOverflowException();\n        }\n\n        byte_len = il2cpp_array_element_size(array_class);\n        len = 1;\n\n        /* A single dimensional array with a 0 lower bound is the same as an szarray */\n        if (array_class->rank == 1 && ((array_class->byval_arg->type == IL2CPP_TYPE_SZARRAY) || (lower_bounds && lower_bounds[0] == 0)))\n        {\n            len = lengths[0];\n            if (len > IL2CPP_ARRAY_MAX_INDEX) //MONO_ARRAY_MAX_INDEX\n                RaiseOverflowException();\n            bounds_size = 0;\n        }\n        else\n        {\n            bounds_size = sizeof(Il2CppArrayBounds) * array_class->rank;\n\n            for (i = 0; i < array_class->rank; ++i)\n            {\n                //if (lengths [i] > IL2CPP_ARRAY_MAX_INDEX) //MONO_ARRAY_MAX_INDEX\n                //  arith_overflow ();\n                //if (CHECK_MUL_OVERFLOW_UN (len, lengths [i]))\n                //  mono_gc_out_of_memory (MONO_ARRAY_MAX_SIZE);\n                len *= lengths[i];\n            }\n        }\n\n        //if (CHECK_MUL_OVERFLOW_UN (byte_len, len))\n        //  mono_gc_out_of_memory (MONO_ARRAY_MAX_SIZE);\n        byte_len *= len;\n        //if (CHECK_ADD_OVERFLOW_UN (byte_len, sizeof (MonoArray)))\n        //  mono_gc_out_of_memory (MONO_ARRAY_MAX_SIZE);\n        byte_len += kIl2CppSizeOfArray;\n        if (bounds_size)\n        {\n            /* align */\n            //if (CHECK_ADD_OVERFLOW_UN (byte_len, 3))\n            //  mono_gc_out_of_memory (MONO_ARRAY_MAX_SIZE);\n            byte_len = (byte_len + 3) & ~3;\n            //if (CHECK_ADD_OVERFLOW_UN (byte_len, bounds_size))\n            //  mono_gc_out_of_memory (MONO_ARRAY_MAX_SIZE);\n            byte_len += bounds_size;\n        }\n        /*\n         * Following three lines almost taken from mono_object_new ():\n         * they need to be kept in sync.\n         */\n        if (!array_class->has_references)\n        {\n            o = Object::AllocatePtrFree(byte_len, array_class);\n#if NEED_TO_ZERO_PTRFREE\n            memset((char*)o + sizeof(Il2CppObject), 0, byte_len - sizeof(Il2CppObject));\n#endif\n        }\n#if IL2CPP_HAS_GC_DESCRIPTORS\n        else if (array_class->gc_desc != GC_NO_DESCRIPTOR)\n        {\n            o = Object::AllocateSpec(byte_len, array_class);\n        }\n#endif\n        else\n        {\n            o = Object::Allocate(byte_len, array_class);\n        }\n\n        array = (Il2CppArray*)o;\n        array->max_length = len;\n\n        if (bounds_size)\n        {\n            Il2CppArrayBounds *bounds = (Il2CppArrayBounds*)((char*)array + byte_len - bounds_size);\n            array->bounds = bounds;\n            for (i = 0; i < array_class->rank; ++i)\n            {\n                bounds[i].length = lengths[i];\n                if (lower_bounds)\n                    bounds[i].lower_bound = lower_bounds[i];\n            }\n        }\n\n#if IL2CPP_ENABLE_PROFILER\n        if (Profiler::ProfileAllocations())\n            Profiler::Allocation(o, array_class);\n#endif\n\n        return array;\n    }\n\n    char* Array::GetFirstElementAddress(Il2CppArray *array)\n    {\n        return reinterpret_cast<char*>(array) + kIl2CppSizeOfArray;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n\nLIBIL2CPP_CODEGEN_API char*\nil2cpp_array_addr_with_size(Il2CppArray *array, int32_t size, uintptr_t idx)\n{\n    return ((char*)array) + kIl2CppSizeOfArray + size * idx;\n}\n\nLIBIL2CPP_CODEGEN_API int32_t\nil2cpp_array_element_size(Il2CppClass *ac)\n{\n    return il2cpp::vm::Array::GetElementSize(ac);\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Array.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppArray;\nstruct Il2CppObject;\nstruct Il2CppString;\nstruct Il2CppClass;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Array\n    {\n    public:\n        static int32_t GetElementSize(const Il2CppClass *klass);\n        static uint32_t GetLength(Il2CppArray* array);\n        static uint32_t GetByteLength(Il2CppArray* array);\n        static Il2CppArray* New(Il2CppClass *elementTypeInfo, il2cpp_array_size_t length);\n        static Il2CppArray* NewSpecific(Il2CppClass *arrayTypeInfo, il2cpp_array_size_t length);\n        static Il2CppArray* NewFull(Il2CppClass *array_class, il2cpp_array_size_t *lengths, il2cpp_array_size_t *lower_bounds);\n    public:\n        // internal\n        static Il2CppArray* NewCached(Il2CppClass *elementTypeInfo, il2cpp_array_size_t length)\n        {\n            return New(elementTypeInfo, length);\n        }\n\n        static char* GetFirstElementAddress(Il2CppArray *array);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n\nLIBIL2CPP_CODEGEN_API char* il2cpp_array_addr_with_size(Il2CppArray *array, int32_t size, uintptr_t idx);\n\nextern \"C\"\n{\nIL2CPP_EXPORT int il2cpp_array_element_size(const Il2CppClass *ac);\n}\n\n#define load_array_elema(arr, idx, size) ((((uint8_t*)(arr)) + kIl2CppSizeOfArray) + ((size) * (idx)))\n\n#define il2cpp_array_setwithsize(array, elementSize, index, value)  \\\n    do {    \\\n        void*__p = (void*) il2cpp_array_addr_with_size ((array), elementSize, (index)); \\\n        memcpy(__p, &(value), elementSize); \\\n    } while (0)\n#define il2cpp_array_setrefwithsize(array, elementSize, index, value)  \\\n    do {    \\\n        void*__p = (void*) il2cpp_array_addr_with_size ((array), elementSize, (index)); \\\n        memcpy(__p, value, elementSize); \\\n        } while (0)\n#define il2cpp_array_addr(array, type, index) ((type*)(void*) il2cpp_array_addr_with_size (array, sizeof (type), index))\n#define il2cpp_array_get(array, type, index) ( *(type*)il2cpp_array_addr ((array), type, (index)) )\n#define il2cpp_array_set(array, type, index, value)    \\\n    do {    \\\n        type *__p = (type *) il2cpp_array_addr ((array), type, (index));    \\\n        *__p = (value); \\\n    } while (0)\n#define il2cpp_array_setref(array, index, value)  \\\n    do {    \\\n        void* *__p = (void* *) il2cpp_array_addr ((array), void*, (index)); \\\n        /* il2cpp_gc_wbarrier_set_arrayref ((array), __p, (MonoObject*)(value));    */\\\n         *__p = (value);    \\\n    } while (0)\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Assembly.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/AssemblyName.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Runtime.h\"\n#include \"tabledefs.h\"\n#include \"class-internals.h\"\n\n#if IL2CPP_DEBUGGER_ENABLED\n    #include \"il2cpp-debugger.h\"\n#endif\n\n#include <vector>\n#include <string>\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    static AssemblyVector s_Assemblies;\n\n    AssemblyVector* Assembly::GetAllAssemblies()\n    {\n        return &s_Assemblies;\n    }\n\n    const Il2CppAssembly* Assembly::GetLoadedAssembly(const char* name)\n    {\n        for (AssemblyVector::const_iterator assembly = s_Assemblies.begin(); assembly != s_Assemblies.end(); ++assembly)\n        {\n            if (strcmp(MetadataCache::GetStringFromIndex((*assembly)->aname.nameIndex), name) == 0)\n                return *assembly;\n        }\n\n        return NULL;\n    }\n\n    Il2CppImage* Assembly::GetImage(const Il2CppAssembly* assembly)\n    {\n        return MetadataCache::GetImageFromIndex(assembly->imageIndex);\n    }\n\n    void Assembly::GetReferencedAssemblies(const Il2CppAssembly* assembly, AssemblyNameVector* target)\n    {\n        for (int32_t sourceIndex = 0; sourceIndex < assembly->referencedAssemblyCount; sourceIndex++)\n        {\n            int32_t indexIntoMainAssemblyTable = MetadataCache::GetReferenceAssemblyIndexIntoAssemblyTable(assembly->referencedAssemblyStart + sourceIndex);\n            const Il2CppAssembly* refAssembly = MetadataCache::GetAssemblyFromIndex(indexIntoMainAssemblyTable);\n\n            target->push_back(&refAssembly->aname);\n        }\n    }\n\n    static bool ends_with(const char *str, const char *suffix)\n    {\n        if (!str || !suffix)\n            return false;\n\n        const size_t lenstr = strlen(str);\n        const size_t lensuffix = strlen(suffix);\n        if (lensuffix >  lenstr)\n            return false;\n\n        return strncmp(str + lenstr - lensuffix, suffix, lensuffix) == 0;\n    }\n\n    const Il2CppAssembly* Assembly::Load(const char* name)\n    {\n        const size_t len = strlen(name);\n\n        for (AssemblyVector::const_iterator assembly = s_Assemblies.begin(); assembly != s_Assemblies.end(); ++assembly)\n        {\n            if (strcmp(name, MetadataCache::GetStringFromIndex((*assembly)->aname.nameIndex)) == 0)\n                return *assembly;\n        }\n\n        if (!ends_with(name, \".dll\") && !ends_with(name, \".exe\"))\n        {\n            char *tmp = new char[len + 5];\n\n            memset(tmp, 0, len + 5);\n\n            memcpy(tmp, name, len);\n            memcpy(tmp + len, \".dll\", 4);\n\n            const Il2CppAssembly* result = Load(tmp);\n\n            if (!result)\n            {\n                memcpy(tmp + len, \".exe\", 4);\n                result = Load(tmp);\n            }\n\n            delete[] tmp;\n\n            return result;\n        }\n        else\n        {\n            for (AssemblyVector::const_iterator assembly = s_Assemblies.begin(); assembly != s_Assemblies.end(); ++assembly)\n            {\n                if (!strcmp(name, MetadataCache::GetImageFromIndex((*assembly)->imageIndex)->name))\n                    return *assembly;\n            }\n\n            return NULL;\n        }\n    }\n\n    void Assembly::Register(const Il2CppAssembly* assembly)\n    {\n        s_Assemblies.push_back(assembly);\n    }\n\n    void Assembly::Initialize()\n    {\n        for (AssemblyVector::const_iterator assembly = s_Assemblies.begin(); assembly != s_Assemblies.end(); ++assembly)\n        {\n#if IL2CPP_DEBUGGER_ENABLED\n            il2cpp_debugger_notify_assembly_load(*assembly);\n#endif\n        }\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Assembly.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include <string>\n#include \"il2cpp-config.h\"\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppImage;\nstruct Il2CppArray;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    typedef std::vector<const Il2CppAssembly*> AssemblyVector;\n    typedef std::vector<const Il2CppAssemblyName*> AssemblyNameVector;\n\n    class LIBIL2CPP_CODEGEN_API Assembly\n    {\n// exported\n    public:\n        static Il2CppImage* GetImage(const Il2CppAssembly* assembly);\n        static void GetReferencedAssemblies(const Il2CppAssembly* assembly, AssemblyNameVector* target);\n    public:\n        static AssemblyVector* GetAllAssemblies();\n        static const Il2CppAssembly* GetLoadedAssembly(const char* name);\n        static const Il2CppAssembly* Load(const char* name);\n        static void Register(const Il2CppAssembly* assembly);\n        static void Initialize();\n\n    private:\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/AssemblyName.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"vm/AssemblyName.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Runtime.h\"\n#include \"tabledefs.h\"\n#include \"class-internals.h\"\n#include \"vm/Array.h\"\n#include \"object-internals.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Type.h\"\n#include \"vm/Object.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/String.h\"\n#include \"vm/Class.h\"\n\n#include <vector>\n#include <string>\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    static Il2CppObject* CreateVersion(uint32_t major, uint32_t minor, uint32_t build, uint32_t revision)\n    {\n        static const MethodInfo* versionContructor = NULL;\n        if (!versionContructor)\n            versionContructor = Class::GetMethodFromName(il2cpp_defaults.version, \".ctor\", 4);\n\n        Il2CppObject* version = Object::New(il2cpp_defaults.version);\n        void* args[4] = { &major, &minor, &build, &revision };\n        Runtime::Invoke(versionContructor, version, args, NULL);\n\n        return version;\n    }\n\n    static Il2CppObject* CreateCulture(const char* cultureName)\n    {\n        static const MethodInfo* createCultureMethod = NULL;\n        if (!createCultureMethod)\n            createCultureMethod = Class::GetMethodFromName(il2cpp_defaults.culture_info, \"CreateCulture\", 2);\n\n        bool reference = false;\n        void* args[2];\n        if (cultureName != NULL)\n            args[0] = String::New(cultureName);\n        else\n            args[0] = String::New(\"neutral\");\n        args[1] = &reference;\n        return Runtime::Invoke(createCultureMethod, NULL, args, NULL);\n    }\n\n    bool AssemblyName::ParseName(Il2CppReflectionAssemblyName* aname, std::string assemblyName)\n    {\n        il2cpp::vm::TypeNameParseInfo info;\n        il2cpp::vm::TypeNameParser parser(assemblyName, info, false);\n\n        if (!parser.ParseAssembly())\n            return false;\n\n        const il2cpp::vm::TypeNameParseInfo::AssemblyName& parsedName = info.assembly_name();\n        IL2CPP_OBJECT_SETREF(aname, name, String::New(parsedName.name.c_str()));\n        aname->major = parsedName.major;\n        aname->minor = parsedName.minor;\n        aname->build = parsedName.build;\n        aname->revision = parsedName.revision;\n        aname->flags = parsedName.flags;\n        aname->hashalg = parsedName.hash_alg;\n\n        IL2CPP_OBJECT_SETREF(aname, version, CreateVersion(parsedName.major, parsedName.minor, parsedName.build, parsedName.revision));\n        IL2CPP_OBJECT_SETREF(aname, cultureInfo, CreateCulture(parsedName.culture.c_str()));\n\n        if (parsedName.public_key_token[0])\n        {\n            IL2CPP_OBJECT_SETREF(aname, keyToken, Array::New(il2cpp_defaults.byte_class, kPublicKeyByteLength));\n            char* p = il2cpp_array_addr(aname->keyToken, char, 0);\n\n            char buf[2] = { 0 };\n            for (int i = 0, j = 0; i < kPublicKeyByteLength; i++)\n            {\n                buf[0] = parsedName.public_key_token[j++];\n                *p = (char)(strtol(buf, NULL, 16) << 4);\n                buf[0] = parsedName.public_key_token[j++];\n                *p |= (char)strtol(buf, NULL, 16);\n                p++;\n            }\n        }\n        else\n            IL2CPP_OBJECT_SETREF(aname, keyToken, Array::New(il2cpp_defaults.byte_class, 0));\n\n        return true;\n    }\n\n    static char HexValueToLowercaseAscii(uint8_t hexValue)\n    {\n        if (hexValue < 10)\n            return char(hexValue + 48);\n\n        return char(hexValue + 87);\n    }\n\n    static std::string PublicKeyTokenToString(const uint8_t* publicKeyToken)\n    {\n        std::string result(kPublicKeyByteLength * 2, '0');\n        for (int i = 0; i < kPublicKeyByteLength; ++i)\n        {\n            uint8_t hi = (publicKeyToken[i] & 0xF0) >> 4;\n            uint8_t lo = publicKeyToken[i] & 0x0F;\n\n            result[i * 2] = HexValueToLowercaseAscii(hi);\n            result[i * 2 + 1] = HexValueToLowercaseAscii(lo);\n        }\n\n        return result;\n    }\n\n    std::string AssemblyName::AssemblyNameToString(const Il2CppAssemblyName& aname)\n    {\n        std::string name;\n\n        char buffer[1024];\n\n        name += MetadataCache::GetStringFromIndex(aname.nameIndex);\n        name += \", Version=\";\n        sprintf(buffer, \"%d\", aname.major);\n        name += buffer;\n        name += \".\";\n        sprintf(buffer, \"%d\", aname.minor);\n        name += buffer;\n        name += \".\";\n        sprintf(buffer, \"%d\", aname.build);\n        name += buffer;\n        name += \".\";\n        sprintf(buffer, \"%d\", aname.revision);\n        name += buffer;\n        name += \", Culture=\";\n        name += (aname.cultureIndex != kStringLiteralIndexInvalid ? MetadataCache::GetStringFromIndex(aname.cultureIndex) : \"neutral\");\n        name += \", PublicKeyToken=\";\n        name += (aname.publicKeyToken[0] ? PublicKeyTokenToString(aname.publicKeyToken) : \"null\");\n        name += ((aname.flags & ASSEMBLYREF_RETARGETABLE_FLAG) ? \", Retargetable=Yes\" : \"\");\n\n        return name;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/AssemblyName.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include <string>\n#include \"il2cpp-config.h\"\nstruct Il2CppAssemblyName;\nstruct Il2CppReflectionAssemblyName;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API AssemblyName\n    {\n// exported\n    public:\n        static std::string AssemblyNameToString(const Il2CppAssemblyName& aname);\n        static bool ParseName(Il2CppReflectionAssemblyName* aname, std::string assemblyName);\n    public:\n\n    private:\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Atomic.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"vm/Atomic.h\"\n#include \"os/Atomic.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    int32_t Atomic::Add(volatile int32_t* location1, int32_t value)\n    {\n        return os::Atomic::Add(location1, value);\n    }\n\n    int64_t Atomic::Add64(volatile int64_t* location1, int64_t value)\n    {\n        return os::Atomic::Add64(location1, value);\n    }\n\n    int32_t Atomic::Increment(volatile int32_t* value)\n    {\n        return os::Atomic::Increment(value);\n    }\n\n    int64_t Atomic::Increment64(volatile int64_t* value)\n    {\n        return os::Atomic::Increment64(value);\n    }\n\n    int32_t Atomic::Decrement(volatile int32_t* value)\n    {\n        return os::Atomic::Decrement(value);\n    }\n\n    int64_t Atomic::Decrement64(volatile int64_t* value)\n    {\n        return os::Atomic::Decrement64(value);\n    }\n\n    int32_t Atomic::CompareExchange(volatile int32_t* dest, int32_t exchange, int32_t comparand)\n    {\n        return os::Atomic::CompareExchange(dest, exchange, comparand);\n    }\n\n    int64_t Atomic::CompareExchange64(volatile int64_t* dest, int64_t exchange, int64_t comparand)\n    {\n        return os::Atomic::CompareExchange64(dest, exchange, comparand);\n    }\n\n    void* Atomic::CompareExchangePointer(void* volatile* dest, void* exchange, void* comparand)\n    {\n        return os::Atomic::CompareExchangePointer(dest, exchange, comparand);\n    }\n\n    int32_t Atomic::Exchange(volatile int32_t* dest, int32_t exchange)\n    {\n        return os::Atomic::Exchange(dest, exchange);\n    }\n\n    int64_t Atomic::Exchange64(volatile int64_t* dest, int64_t exchange)\n    {\n        return os::Atomic::Exchange64(dest, exchange);\n    }\n\n    void* Atomic::ExchangePointer(void* volatile* dest, void* exchange)\n    {\n        return os::Atomic::ExchangePointer(dest, exchange);\n    }\n\n    int64_t Atomic::Read64(volatile int64_t* addr)\n    {\n        return os::Atomic::Read64(addr);\n    }\n\n    void Atomic::MemoryBarrier()\n    {\n        os::Atomic::MemoryBarrier();\n    }\n} /* namespace vm */\n} /* namespace il2pp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Atomic.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Atomic\n    {\n    public:\n        static int32_t Add(volatile int32_t* location1, int32_t value);\n        static int64_t Add64(volatile int64_t* location1, int64_t value);\n        static int32_t Increment(volatile int32_t* value);\n        static int64_t Increment64(volatile int64_t* value);\n        static int32_t Decrement(volatile int32_t* value);\n        static int64_t Decrement64(volatile int64_t* value);\n        static int32_t CompareExchange(volatile int32_t* dest, int32_t exchange, int32_t comparand);\n        static int64_t CompareExchange64(volatile int64_t* dest, int64_t exchange, int64_t comparand);\n        static void* CompareExchangePointer(void* volatile* dest, void* exchange, void* comparand);\n        static int32_t Exchange(volatile int32_t* dest, int32_t exchange);\n        static int64_t Exchange64(volatile int64_t* dest, int64_t exchange);\n        static void* ExchangePointer(void* volatile* dest, void* exchange);\n        static int64_t Read64(volatile int64_t* addr);\n        static void MemoryBarrier();\n\n        static inline uint32_t Add(volatile uint32_t* location1, uint32_t value)\n        {\n            return static_cast<uint32_t>(Add((volatile int32_t*)location1, (int32_t)value));\n        }\n\n        template<typename T>\n        static inline T* CompareExchangePointer(T* volatile* dest, T* newValue, T* oldValue)\n        {\n            return static_cast<T*>(CompareExchangePointer((void*volatile*)dest, newValue, oldValue));\n        }\n\n        template<typename T>\n        static inline T* ExchangePointer(T* volatile* dest, T* newValue)\n        {\n            return static_cast<T*>(ExchangePointer((void*volatile*)dest, newValue));\n        }\n\n        static inline uint64_t Read64(volatile uint64_t* addr)\n        {\n            return static_cast<uint64_t>(Read64((volatile int64_t*)addr));\n        }\n\n        template<typename T>\n        static inline T* ReadPointer(T* volatile* pointer)\n        {\n#if IL2CPP_SIZEOF_VOID_P == 4\n            return reinterpret_cast<T*>(Add(reinterpret_cast<volatile int32_t*>(pointer), 0));\n#else\n            return reinterpret_cast<T*>(Add64(reinterpret_cast<volatile int64_t*>(pointer), 0));\n#endif\n        }\n\n        static inline uint32_t Increment(volatile uint32_t* value)\n        {\n            return static_cast<uint32_t>(Increment(reinterpret_cast<volatile int32_t*>(value)));\n        }\n\n        static inline uint64_t Increment64(volatile uint64_t* value)\n        {\n            return static_cast<uint64_t>(Increment64(reinterpret_cast<volatile int64_t*>(value)));\n        }\n\n        static inline uint32_t Decrement(volatile uint32_t* value)\n        {\n            return static_cast<uint32_t>(Decrement(reinterpret_cast<volatile int32_t*>(value)));\n        }\n\n        static inline uint64_t Decrement64(volatile uint64_t* value)\n        {\n            return static_cast<uint64_t>(Decrement64(reinterpret_cast<volatile int64_t*>(value)));\n        }\n\n        static inline uint32_t CompareExchange(volatile uint32_t* value, uint32_t newValue, uint32_t oldValue)\n        {\n            return static_cast<uint32_t>(CompareExchange(reinterpret_cast<volatile int32_t*>(value), newValue, oldValue));\n        }\n\n        static inline uint64_t CompareExchange64(volatile uint64_t* value, uint64_t newValue, uint64_t oldValue)\n        {\n            return static_cast<uint64_t>(CompareExchange64(reinterpret_cast<volatile int64_t*>(value), newValue, oldValue));\n        }\n\n        static inline uint32_t Exchange(volatile uint32_t* value, uint32_t newValue)\n        {\n            return static_cast<uint32_t>(Exchange(reinterpret_cast<volatile int32_t*>(value), newValue));\n        }\n\n        static inline uint64_t Exchange64(volatile uint64_t* value, uint64_t newValue)\n        {\n            return static_cast<uint64_t>(Exchange64(reinterpret_cast<volatile int64_t*>(value), newValue));\n        }\n    };\n} /* namesapce vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/CCW.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"vm/Object.h\"\n#include \"vm/CCW.h\"\n#include \"vm/Class.h\"\n#include \"vm/CachedCCWBase.h\"\n#include \"vm/Exception.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/RCW.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/String.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    struct ManagedObject : CachedCCWBase<ManagedObject>\n    {\n        inline ManagedObject(Il2CppObject* obj) :\n            CachedCCWBase<ManagedObject>(obj)\n        {\n        }\n\n        virtual il2cpp_hresult_t STDCALL QueryInterface(const Il2CppGuid& iid, void** object) IL2CPP_OVERRIDE\n        {\n            if (::memcmp(&iid, &Il2CppIUnknown::IID, sizeof(Il2CppGuid)) == 0\n                || ::memcmp(&iid, &Il2CppIInspectable::IID, sizeof(Il2CppGuid)) == 0\n                || ::memcmp(&iid, &Il2CppIAgileObject::IID, sizeof(Il2CppGuid)) == 0)\n            {\n                *object = GetIdentity();\n                AddRefImpl();\n                return IL2CPP_S_OK;\n            }\n\n            if (::memcmp(&iid, &Il2CppIManagedObjectHolder::IID, sizeof(Il2CppGuid)) == 0)\n            {\n                *object = static_cast<Il2CppIManagedObjectHolder*>(this);\n                AddRefImpl();\n                return IL2CPP_S_OK;\n            }\n\n            if (::memcmp(&iid, &Il2CppIMarshal::IID, sizeof(Il2CppGuid)) == 0)\n            {\n                *object = static_cast<Il2CppIMarshal*>(this);\n                AddRefImpl();\n                return IL2CPP_S_OK;\n            }\n\n            *object = NULL;\n            return IL2CPP_E_NOINTERFACE;\n        }\n\n        virtual il2cpp_hresult_t STDCALL GetIids(uint32_t* iidCount, Il2CppGuid** iids) IL2CPP_OVERRIDE\n        {\n            *iidCount = 0;\n            *iids = NULL;\n            return IL2CPP_S_OK;\n        }\n    };\n\n    Il2CppIUnknown* CCW::CreateCCW(Il2CppObject* obj)\n    {\n        // check for ccw create function, which is implemented by objects that implement COM or Windows Runtime interfaces\n        const Il2CppInteropData* interopData = obj->klass->interopData;\n        if (interopData != NULL)\n        {\n            const CreateCCWFunc createCcw = interopData->createCCWFunction;\n\n            if (createCcw != NULL)\n                return createCcw(obj);\n        }\n\n        // otherwise create generic ccw object that \"only\" implements IUnknown, IMarshal, IInspectable, IAgileObject and IManagedObjectHolder interfaces\n        void* memory = utils::Memory::Malloc(sizeof(ManagedObject));\n        if (memory == NULL)\n            Exception::RaiseOutOfMemoryException();\n        return static_cast<Il2CppIManagedObjectHolder*>(new(memory)ManagedObject(obj));\n    }\n\n    Il2CppException* CCW::GetIPropertyValueInvalidCast(Il2CppObject* value, const char* from, const char* to)\n    {\n        Il2CppClass* klass = il2cpp::vm::Object::GetClass(value);\n        const MethodInfo* toString = il2cpp::vm::Class::GetMethodFromName(klass, \"ToString\", 0);\n        Il2CppString* valueString = (Il2CppString*)il2cpp::vm::Runtime::Invoke(toString, value, NULL, NULL);\n        std::string utf8Value = il2cpp::utils::StringUtils::Utf16ToUtf8(il2cpp::utils::StringUtils::GetChars(valueString));\n        std::string message = il2cpp::utils::StringUtils::Printf(\n                \"Object in an IPropertyValue is of type '%s' with value '%s', which cannot be converted to a '%s'.\",\n                from,\n                utf8Value.c_str(),\n                to);\n        return il2cpp::vm::Exception::GetInvalidCastException(message.c_str());\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/CCW.h",
    "content": "#pragma once\n\n#include \"gc/GarbageCollector.h\"\n\nstruct Il2CppIUnknown;\nstruct Il2CppObject;\nstruct Il2CppException;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API CCW\n    {\n    public:\n        // CreateCCW returns upcasted Il2CppIManagedObjectHolder if the CCW is cachable!\n        static Il2CppIUnknown* CreateCCW(Il2CppObject* obj);\n\n        static inline Il2CppIUnknown* GetOrCreate(Il2CppObject* obj, const Il2CppGuid& iid)\n        {\n            return gc::GarbageCollector::GetOrCreateCCW(obj, iid);\n        }\n\n        static Il2CppException* GetIPropertyValueInvalidCast(Il2CppObject* value, const char* from, const char* to);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/COM.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"il2cpp-vm-support.h\"\n#include \"vm/Array.h\"\n#include \"vm/COM.h\"\n#include \"vm/Exception.h\"\n#include \"vm/PlatformInvoke.h\"\n#include \"vm/Reflection.h\"\n#include \"os/COM.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    void COM::MarshalVariant(Il2CppObject* obj, Il2CppVariant* variant)\n    {\n        IL2CPP_ASSERT(variant);\n        os::COM::VariantInit(variant);\n\n        if (!obj)\n            return;\n\n        if (obj->klass == il2cpp_defaults.sbyte_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_I1;\n            variant->n1.n2.n3.cVal = *static_cast<int8_t*>(Object::Unbox(obj));\n        }\n        else if (obj->klass == il2cpp_defaults.byte_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_UI1;\n            variant->n1.n2.n3.bVal = *static_cast<uint8_t*>(Object::Unbox(obj));\n        }\n        else if (obj->klass == il2cpp_defaults.int16_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_I2;\n            variant->n1.n2.n3.iVal = *static_cast<int16_t*>(Object::Unbox(obj));\n        }\n        else if (obj->klass == il2cpp_defaults.uint16_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_UI2;\n            variant->n1.n2.n3.uiVal = *static_cast<uint16_t*>(Object::Unbox(obj));\n        }\n        else if (obj->klass == il2cpp_defaults.int32_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_I4;\n            variant->n1.n2.n3.lVal = *static_cast<int32_t*>(Object::Unbox(obj));\n        }\n        else if (obj->klass == il2cpp_defaults.uint32_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_UI4;\n            variant->n1.n2.n3.ulVal = *static_cast<uint32_t*>(Object::Unbox(obj));\n        }\n        else if (obj->klass == il2cpp_defaults.int64_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_I8;\n            variant->n1.n2.n3.llVal = *static_cast<int64_t*>(Object::Unbox(obj));\n        }\n        else if (obj->klass == il2cpp_defaults.uint64_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_UI8;\n            variant->n1.n2.n3.ullVal = *static_cast<uint64_t*>(Object::Unbox(obj));\n        }\n        else if (obj->klass == il2cpp_defaults.single_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_R4;\n            variant->n1.n2.n3.fltVal = *static_cast<float*>(Object::Unbox(obj));\n        }\n        else if (obj->klass == il2cpp_defaults.double_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_R8;\n            variant->n1.n2.n3.dblVal = *static_cast<double*>(Object::Unbox(obj));\n        }\n        else if (obj->klass == il2cpp_defaults.boolean_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_BOOL;\n            variant->n1.n2.n3.boolVal = *static_cast<bool*>(Object::Unbox(obj)) ? IL2CPP_VARIANT_TRUE : IL2CPP_VARIANT_FALSE;\n        }\n        else if (obj->klass == il2cpp_defaults.string_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_BSTR;\n            variant->n1.n2.n3.bstrVal = PlatformInvoke::MarshalCSharpStringToCppBString(reinterpret_cast<Il2CppString*>(obj));\n        }\n        else if (obj->klass == il2cpp_defaults.dbnull_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_NULL;\n        }\n        else if (obj->klass == il2cpp_defaults.error_wrapper_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_ERROR;\n            variant->n1.n2.n3.scode = reinterpret_cast<Il2CppErrorWrapper*>(obj)->errorCode;\n        }\n        else if (obj->klass == il2cpp_defaults.missing_class)\n        {\n            variant->n1.n2.type = IL2CPP_VT_ERROR;\n            variant->n1.n2.n3.scode = IL2CPP_DISP_E_PARAMNOTFOUND;\n        }\n        else\n        {\n            Exception::Raise(IL2CPP_E_INVALIDARG, true);\n        }\n    }\n\n    Il2CppObject* COM::MarshalVariantResult(const Il2CppVariant* variant)\n    {\n        IL2CPP_ASSERT(variant);\n        switch (variant->n1.n2.type)\n        {\n            case IL2CPP_VT_EMPTY:\n                return NULL;\n            case IL2CPP_VT_NULL:\n                return Reflection::GetDBNullObject();\n            case IL2CPP_VT_ERROR:\n            {\n                int32_t val = variant->n1.n2.n3.scode;\n                return Object::Box(il2cpp_defaults.int32_class, &val);\n            }\n            case IL2CPP_VT_I1:\n            {\n                char val = variant->n1.n2.n3.cVal;\n                return Object::Box(il2cpp_defaults.sbyte_class, &val);\n            }\n            case IL2CPP_VT_UI1:\n            {\n                uint8_t val = variant->n1.n2.n3.bVal;\n                return Object::Box(il2cpp_defaults.byte_class, &val);\n            }\n            case IL2CPP_VT_I2:\n            {\n                int16_t val = variant->n1.n2.n3.iVal;\n                return Object::Box(il2cpp_defaults.int16_class, &val);\n            }\n            case IL2CPP_VT_UI2:\n            {\n                uint16_t val = variant->n1.n2.n3.uiVal;\n                return Object::Box(il2cpp_defaults.uint16_class, &val);\n            }\n            case IL2CPP_VT_I4:\n            {\n                int32_t val = variant->n1.n2.n3.lVal;\n                return Object::Box(il2cpp_defaults.int32_class, &val);\n            }\n            case IL2CPP_VT_UI4:\n            {\n                uint32_t val = variant->n1.n2.n3.ulVal;\n                return Object::Box(il2cpp_defaults.uint32_class, &val);\n            }\n            case IL2CPP_VT_I8:\n            {\n                int64_t val = variant->n1.n2.n3.llVal;\n                return Object::Box(il2cpp_defaults.int64_class, &val);\n            }\n            case IL2CPP_VT_UI8:\n            {\n                uint64_t val = variant->n1.n2.n3.ullVal;\n                return Object::Box(il2cpp_defaults.uint64_class, &val);\n            }\n            case IL2CPP_VT_R4:\n            {\n                float val = variant->n1.n2.n3.fltVal;\n                return Object::Box(il2cpp_defaults.single_class, &val);\n            }\n            case IL2CPP_VT_R8:\n            {\n                double val = variant->n1.n2.n3.dblVal;\n                return Object::Box(il2cpp_defaults.double_class, &val);\n            }\n            case IL2CPP_VT_BOOL:\n            {\n                IL2CPP_ASSERT(variant->n1.n2.n3.boolVal == IL2CPP_VARIANT_FALSE || variant->n1.n2.n3.boolVal == IL2CPP_VARIANT_TRUE);\n                bool value = variant->n1.n2.n3.boolVal != IL2CPP_VARIANT_FALSE;\n                return Object::Box(il2cpp_defaults.boolean_class, &value);\n            }\n            case IL2CPP_VT_BSTR:\n                return reinterpret_cast<Il2CppObject*>(PlatformInvoke::MarshalCppBStringToCSharpStringResult(variant->n1.n2.n3.bstrVal));\n            default:\n                Exception::Raise(IL2CPP_E_INVALIDARG, true);\n                return NULL;\n        }\n    }\n\n    void COM::DestroyVariant(Il2CppVariant* variant)\n    {\n        const il2cpp_hresult_t hr = os::COM::VariantClear(variant);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n    }\n\n    Il2CppSafeArray* COM::MarshalSafeArray(uint16_t variantType, Il2CppArray* managedArray)\n    {\n        if (!managedArray)\n            return NULL;\n\n        Il2CppSafeArrayBound bounds[1];\n        bounds[0].element_count = Array::GetLength(managedArray);\n        bounds[0].lower_bound = 0;\n        Il2CppSafeArray* safeArray = os::COM::SafeArrayCreate(variantType, 1, bounds);\n        if (!safeArray)\n            Exception::Raise(IL2CPP_E_OUTOFMEMORY, true);\n\n        void* data;\n        il2cpp_hresult_t hr = os::COM::SafeArrayAccessData(safeArray, &data);\n        if (IL2CPP_HR_FAILED(hr))\n        {\n            os::COM::SafeArrayDestroy(safeArray);\n            Exception::Raise(hr, true);\n        }\n\n        ::memcpy(data, Array::GetFirstElementAddress(managedArray), Array::GetByteLength(managedArray));\n\n        hr = os::COM::SafeArrayUnaccessData(safeArray);\n        if (IL2CPP_HR_FAILED(hr))\n        {\n            os::COM::SafeArrayDestroy(safeArray);\n            Exception::Raise(hr, true);\n        }\n\n        return safeArray;\n    }\n\n    Il2CppArray* COM::MarshalSafeArrayResult(uint16_t variantType, Il2CppClass* type, Il2CppSafeArray* safeArray)\n    {\n        if (!safeArray)\n            return NULL;\n\n        uint16_t actualVariantType;\n        il2cpp_hresult_t hr = os::COM::SafeArrayGetVartype(safeArray, &actualVariantType);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n        if (actualVariantType != variantType)\n            Exception::Raise(IL2CPP_E_INVALIDARG, true);\n\n        const uint32_t actualDimentionCount = os::COM::SafeArrayGetDim(safeArray);\n        if (actualDimentionCount != 1)\n            Exception::Raise(IL2CPP_E_INVALIDARG, true);\n\n        int32_t lowerBound;\n        hr = os::COM::SafeArrayGetLBound(safeArray, 1, &lowerBound);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n\n        int32_t upperBound;\n        hr = os::COM::SafeArrayGetUBound(safeArray, 1, &upperBound);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n\n        const il2cpp_array_size_t size = static_cast<il2cpp_array_size_t>(upperBound - lowerBound + 1);\n        Il2CppArray* managedArray = Array::New(type, size);\n\n        void* data;\n        hr = os::COM::SafeArrayAccessData(safeArray, &data);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n\n        ::memcpy(Array::GetFirstElementAddress(managedArray), data, Array::GetByteLength(managedArray));\n\n        hr = os::COM::SafeArrayUnaccessData(safeArray);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n\n        return managedArray;\n    }\n\n    Il2CppSafeArray* COM::MarshalSafeArrayBString(Il2CppArray* managedArray)\n    {\n        if (!managedArray)\n            return NULL;\n\n        const uint32_t size = Array::GetLength(managedArray);\n\n        Il2CppSafeArrayBound bounds[1];\n        bounds[0].element_count = size;\n        bounds[0].lower_bound = 0;\n        Il2CppSafeArray* safeArray = os::COM::SafeArrayCreate(IL2CPP_VT_BSTR, 1, bounds);\n        if (!safeArray)\n            Exception::Raise(IL2CPP_E_OUTOFMEMORY, true);\n\n        Il2CppChar** data;\n        il2cpp_hresult_t hr = os::COM::SafeArrayAccessData(safeArray, reinterpret_cast<void**>(&data));\n        if (IL2CPP_HR_FAILED(hr))\n        {\n            os::COM::SafeArrayDestroy(safeArray);\n            Exception::Raise(hr, true);\n        }\n\n        for (uint32_t i = 0; i < size; ++i)\n        {\n            Il2CppString* managedString = il2cpp_array_get(managedArray, Il2CppString*, i);\n            hr = PlatformInvoke::MarshalCSharpStringToCppBStringNoThrow(managedString, data + i);\n            if (IL2CPP_HR_FAILED(hr))\n            {\n                os::COM::SafeArrayUnaccessData(safeArray);\n                os::COM::SafeArrayDestroy(safeArray);\n                Exception::Raise(hr, true);\n            }\n        }\n\n        hr = os::COM::SafeArrayUnaccessData(safeArray);\n        if (IL2CPP_HR_FAILED(hr))\n        {\n            os::COM::SafeArrayDestroy(safeArray);\n            Exception::Raise(hr, true);\n        }\n\n        return safeArray;\n    }\n\n    Il2CppArray* COM::MarshalSafeArrayBStringResult(Il2CppClass* type, Il2CppSafeArray* safeArray)\n    {\n        if (!safeArray)\n            return NULL;\n\n        uint16_t actualVariantType;\n        il2cpp_hresult_t hr = os::COM::SafeArrayGetVartype(safeArray, &actualVariantType);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n        if (actualVariantType != IL2CPP_VT_BSTR)\n            Exception::Raise(IL2CPP_E_INVALIDARG, true);\n\n        const uint32_t actualDimentionCount = os::COM::SafeArrayGetDim(safeArray);\n        if (actualDimentionCount != 1)\n            Exception::Raise(IL2CPP_E_INVALIDARG, true);\n\n        int32_t lowerBound;\n        hr = os::COM::SafeArrayGetLBound(safeArray, 1, &lowerBound);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n\n        int32_t upperBound;\n        hr = os::COM::SafeArrayGetUBound(safeArray, 1, &upperBound);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n\n        const il2cpp_array_size_t size = static_cast<il2cpp_array_size_t>(upperBound - lowerBound + 1);\n        Il2CppArray* managedArray = Array::New(il2cpp_defaults.string_class, size);\n\n        Il2CppChar** data;\n        hr = os::COM::SafeArrayAccessData(safeArray, reinterpret_cast<void**>(&data));\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n\n        for (il2cpp_array_size_t i = 0; i < size; ++i)\n            il2cpp_array_setref(managedArray, i, PlatformInvoke::MarshalCppBStringToCSharpStringResult(data[i]));\n\n        hr = os::COM::SafeArrayUnaccessData(safeArray);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n\n        return managedArray;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/COM.h",
    "content": "#pragma once\n\n#include \"class-internals.h\"\n#include \"il2cpp-vm-support.h\"\n#include \"os/COM.h\"\n#include \"vm/Exception.h\"\n\nstruct Il2CppGuid;\nstruct Il2CppSafeArrayBound;\nstruct Il2CppSafeArray;\nstruct Il2CppIUnknown;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API COM\n    {\n    public:\n        static inline void CreateInstance(const Il2CppGuid& clsid, Il2CppIUnknown** object)\n        {\n            const il2cpp_hresult_t hr = os::COM::CreateInstance(clsid, object);\n            IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n        }\n\n        static inline il2cpp_hresult_t CreateFreeThreadedMarshaler(Il2CppIUnknown* outer, Il2CppIUnknown** marshal)\n        {\n            return os::COM::CreateFreeThreadedMarshaler(outer, marshal);\n        }\n\n        static void MarshalVariant(Il2CppObject* obj, Il2CppVariant* variant);\n        static Il2CppObject* MarshalVariantResult(const Il2CppVariant* variant);\n        static void DestroyVariant(Il2CppVariant* variant);\n        static Il2CppSafeArray* MarshalSafeArray(uint16_t variantType, Il2CppArray* managedArray);\n        static Il2CppArray* MarshalSafeArrayResult(uint16_t variantType, Il2CppClass* type, Il2CppSafeArray* safeArray);\n        static Il2CppSafeArray* MarshalSafeArrayBString(Il2CppArray* managedArray);\n        static Il2CppArray* MarshalSafeArrayBStringResult(Il2CppClass* type, Il2CppSafeArray* safeArray);\n\n        static inline void DestroySafeArray(Il2CppSafeArray* safeArray)\n        {\n            const il2cpp_hresult_t hr = os::COM::SafeArrayDestroy(safeArray);\n            IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n        }\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/CachedCCWBase.h",
    "content": "#pragma once\n\n#include \"gc/GCHandle.h\"\n#include \"vm/ComObjectBase.h\"\n#include \"utils/TemplateUtils.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n// Alright, so the lifetime of this guy is pretty weird\n// For a single managed object, the IUnknown of its COM Callable Wrapper must always be the same\n// That means that we have to keep the same COM Callable Wrapper alive for an object once we create it\n// They are cached in il2cpp::vm::g_CCWCache, which is managed by il2cpp::vm::CCW class\n//\n// Here comes the tricky part: when a native object has a reference to the COM Callable Wrapper,\n// the managed object is not supposed to be garbage collected. However, when no native objects are referencing\n// it, it should not prevent the GC from collecting the managed object. We implement this by keeping a GC handle\n// on the managed object if our reference count is 1 or more. We acquire it when it gets increased from 0 (this\n// is safe because such AddRef can only come when this object is retrieved from CCW Cache) and release the GC\n// handle when our reference count gets decreased to 0. Here's a kicker: we don't destroy the COM Callable Wrapper\n// when the reference count reaches 0; we instead rely on GC finalizer of the managed object to both remove it from\n// CCW cache and also destroy it.\n    template<typename TDerived>\n    struct NOVTABLE CachedCCWBase : ComObjectBase\n    {\n    private:\n        volatile uint32_t m_RefCount;\n        uint32_t m_GCHandle;\n\n    public:\n        inline CachedCCWBase(Il2CppObject* obj) :\n            ComObjectBase(obj),\n            m_RefCount(0), // We do not hold any references upon its creation\n            m_GCHandle(0)\n        {\n            Il2CppStaticAssert(utils::TemplateUtils::IsBaseOf<CachedCCWBase<TDerived>, TDerived>::value);\n        }\n\n        virtual uint32_t STDCALL AddRef() IL2CPP_OVERRIDE\n        {\n            return AddRefImpl();\n        }\n\n        virtual uint32_t STDCALL Release() IL2CPP_OVERRIDE\n        {\n            return ReleaseImpl();\n        }\n\n        FORCE_INLINE uint32_t AddRefImpl()\n        {\n            const uint32_t refCount = Atomic::Increment(&m_RefCount);\n\n            if (refCount == 1)\n            {\n                IL2CPP_ASSERT(m_GCHandle == 0);\n                m_GCHandle = gc::GCHandle::New(GetManagedObjectInline(), false);\n            }\n\n            return refCount;\n        }\n\n        FORCE_INLINE uint32_t ReleaseImpl()\n        {\n            const uint32_t count = Atomic::Decrement(&m_RefCount);\n            if (count == 0)\n            {\n                IL2CPP_ASSERT(m_GCHandle != 0);\n                gc::GCHandle::Free(m_GCHandle);\n                m_GCHandle = 0;\n            }\n\n            return count;\n        }\n\n        virtual void STDCALL Destroy() IL2CPP_FINAL IL2CPP_OVERRIDE\n        {\n            IL2CPP_ASSERT(m_RefCount == 0);\n\n            TDerived* instance = static_cast<TDerived*>(this);\n            instance->~TDerived();\n            utils::Memory::Free(instance);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Class.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <algorithm>\n#include \"metadata/ArrayMetadata.h\"\n#include \"metadata/GenericMetadata.h\"\n#include \"metadata/GenericMethod.h\"\n#include \"metadata/FieldLayout.h\"\n#include \"metadata/Il2CppTypeVector.h\"\n#include \"os/Atomic.h\"\n#include \"os/Mutex.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Field.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/GenericContainer.h\"\n#include \"vm/Image.h\"\n#include \"vm/MetadataAlloc.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/MetadataLock.h\"\n#include \"vm/Method.h\"\n#include \"vm/Property.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Thread.h\"\n#include \"vm/Type.h\"\n#include \"vm/Object.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"tabledefs.h\"\n#include \"gc/GarbageCollector.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/HashUtils.h\"\n#include <string>\n#include <memory.h>\n#include <algorithm>\n#include <limits>\n\n#if IL2CPP_DEBUGGER_ENABLED\n    #include \"il2cpp-debugger.h\"\n#endif\n\nusing il2cpp::metadata::ArrayMetadata;\nusing il2cpp::metadata::FieldLayout;\nusing il2cpp::metadata::GenericMetadata;\nusing il2cpp::metadata::GenericMethod;\nusing il2cpp::metadata::Il2CppTypeVector;\nusing il2cpp::os::FastAutoLock;\nusing il2cpp::utils::PointerHash;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    static il2cpp::utils::dynamic_array<Il2CppClass*> s_staticFieldData;\n    static int32_t s_FinalizerSlot = -1;\n    static int32_t s_GetHashCodeSlot = -1;\n\n    static void SetupGCDescriptor(Il2CppClass* klass);\n    static void GetBitmapNoInit(Il2CppClass* klass, size_t* bitmap, size_t& maxSetBit, size_t parentOffset);\n    static Il2CppClass* ResolveGenericInstanceType(Il2CppClass*, const il2cpp::vm::TypeNameParseInfo&, bool, bool);\n    static bool InitLocked(Il2CppClass *klass, const FastAutoLock& lock);\n    static void SetupVTable(Il2CppClass *klass, const FastAutoLock& lock);\n\n    Il2CppClass* Class::FromIl2CppType(const Il2CppType* type)\n    {\n#define RETURN_DEFAULT_TYPE(fieldName) do { IL2CPP_ASSERT(il2cpp_defaults.fieldName); return il2cpp_defaults.fieldName; } while (false)\n\n        switch (type->type)\n        {\n            case IL2CPP_TYPE_OBJECT:\n                RETURN_DEFAULT_TYPE(object_class);\n            case IL2CPP_TYPE_VOID:\n                RETURN_DEFAULT_TYPE(void_class);\n            case IL2CPP_TYPE_BOOLEAN:\n                RETURN_DEFAULT_TYPE(boolean_class);\n            case IL2CPP_TYPE_CHAR:\n                RETURN_DEFAULT_TYPE(char_class);\n            case IL2CPP_TYPE_I1:\n                RETURN_DEFAULT_TYPE(sbyte_class);\n            case IL2CPP_TYPE_U1:\n                RETURN_DEFAULT_TYPE(byte_class);\n            case IL2CPP_TYPE_I2:\n                RETURN_DEFAULT_TYPE(int16_class);\n            case IL2CPP_TYPE_U2:\n                RETURN_DEFAULT_TYPE(uint16_class);\n            case IL2CPP_TYPE_I4:\n                RETURN_DEFAULT_TYPE(int32_class);\n            case IL2CPP_TYPE_U4:\n                RETURN_DEFAULT_TYPE(uint32_class);\n            case IL2CPP_TYPE_I:\n                RETURN_DEFAULT_TYPE(int_class);\n            case IL2CPP_TYPE_U:\n                RETURN_DEFAULT_TYPE(uint_class);\n            case IL2CPP_TYPE_I8:\n                RETURN_DEFAULT_TYPE(int64_class);\n            case IL2CPP_TYPE_U8:\n                RETURN_DEFAULT_TYPE(uint64_class);\n            case IL2CPP_TYPE_R4:\n                RETURN_DEFAULT_TYPE(single_class);\n            case IL2CPP_TYPE_R8:\n                RETURN_DEFAULT_TYPE(double_class);\n            case IL2CPP_TYPE_STRING:\n                RETURN_DEFAULT_TYPE(string_class);\n            case IL2CPP_TYPE_TYPEDBYREF:\n                RETURN_DEFAULT_TYPE(typed_reference_class);\n            case IL2CPP_TYPE_ARRAY:\n            {\n                Il2CppClass* elementClass = FromIl2CppType(type->data.array->etype);\n                return Class::GetBoundedArrayClass(elementClass, type->data.array->rank, true);\n            }\n            case IL2CPP_TYPE_PTR:\n                return Class::GetPtrClass(type->data.type);\n            case IL2CPP_TYPE_FNPTR:\n                NOT_IMPLEMENTED(Class::FromIl2CppType);\n                return NULL; //mono_fnptr_class_get (type->data.method);\n            case IL2CPP_TYPE_SZARRAY:\n            {\n                Il2CppClass* elementClass = FromIl2CppType(type->data.type);\n                return Class::GetArrayClass(elementClass, 1);\n            }\n            case IL2CPP_TYPE_CLASS:\n            case IL2CPP_TYPE_VALUETYPE:\n                return Type::GetClass(type);\n            case IL2CPP_TYPE_GENERICINST:\n                return GenericClass::GetClass(type->data.generic_class);\n            case IL2CPP_TYPE_VAR:\n                return Class::FromGenericParameter(Type::GetGenericParameter(type));\n            case IL2CPP_TYPE_MVAR:\n                return Class::FromGenericParameter(Type::GetGenericParameter(type));\n            default:\n                NOT_IMPLEMENTED(Class::FromIl2CppType);\n        }\n\n        return NULL;\n\n#undef RETURN_DEFAULT_TYPE\n    }\n\n/* From ECMA-335, I.8.7 Assignment compatibility:\n\n    The reduced type of a type T is the following:\n\n    1. If the underlying type of T is:\n        a. int8, or unsigned int8, then its reduced type is int8.\n        b. int16, or unsigned int16, then its reduced type is int16.\n        c. int32, or unsigned int32, then its reduced type is int32.\n        d. int64, or unsigned int64, then its reduced type is int64.\n        e. native int, or unsigned native int, then its reduced type is native int.\n    2. Otherwise, the reduced type is itself.\n*/\n    static inline const Il2CppClass* GetReducedType(const Il2CppClass* type)\n    {\n        switch (type->byval_arg->type)\n        {\n            case IL2CPP_TYPE_I1:\n            case IL2CPP_TYPE_U1:\n                return il2cpp_defaults.sbyte_class;\n\n            case IL2CPP_TYPE_I2:\n            case IL2CPP_TYPE_U2:\n                return il2cpp_defaults.int16_class;\n\n            case IL2CPP_TYPE_I4:\n            case IL2CPP_TYPE_U4:\n                return il2cpp_defaults.int32_class;\n\n            case IL2CPP_TYPE_I8:\n            case IL2CPP_TYPE_U8:\n                return il2cpp_defaults.int64_class;\n\n            case IL2CPP_TYPE_I:\n            case IL2CPP_TYPE_U:\n                return il2cpp_defaults.int_class;\n\n            default:\n                return type;\n        }\n    }\n\n    Il2CppClass* Class::FromSystemType(Il2CppReflectionType *type)\n    {\n        return Class::FromIl2CppType(type->type);\n    }\n\n    static void SetupInterfacesLocked(Il2CppClass* klass, const FastAutoLock& lock)\n    {\n        if (klass->generic_class)\n        {\n            Il2CppClass* genericTypeDefinition = GenericClass::GetTypeDefinition(klass->generic_class);\n            Il2CppGenericContext* context = &klass->generic_class->context;\n\n            if (genericTypeDefinition->interfaces_count > 0 && klass->implementedInterfaces == NULL)\n            {\n                IL2CPP_ASSERT(genericTypeDefinition->interfaces_count == klass->interfaces_count);\n                klass->implementedInterfaces = (Il2CppClass**)MetadataCalloc(genericTypeDefinition->interfaces_count, sizeof(Il2CppClass*));\n                for (uint16_t i = 0; i < genericTypeDefinition->interfaces_count; i++)\n                    klass->implementedInterfaces[i] = Class::FromIl2CppType(GenericMetadata::InflateIfNeeded(MetadataCache::GetInterfaceFromIndex(genericTypeDefinition->typeDefinition->interfacesStart + i), context, false));\n            }\n        }\n        else if (klass->rank > 0)\n        {\n            ArrayMetadata::SetupArrayInterfaces(klass, lock);\n        }\n        else\n        {\n            if (klass->interfaces_count > 0 && klass->implementedInterfaces == NULL)\n            {\n                klass->implementedInterfaces = (Il2CppClass**)MetadataCalloc(klass->interfaces_count, sizeof(Il2CppClass*));\n                for (uint16_t i = 0; i < klass->interfaces_count; i++)\n                    klass->implementedInterfaces[i] = Class::FromIl2CppType(MetadataCache::GetInterfaceFromIndex(klass->typeDefinition->interfacesStart + i));\n            }\n        }\n    }\n\n    typedef Il2CppHashMap<const Il2CppGenericParameter*, Il2CppClass*, PointerHash<const Il2CppGenericParameter> > GenericParameterMap;\n    static GenericParameterMap s_GenericParameterMap;\n\n    Il2CppClass* Class::FromGenericParameter(const Il2CppGenericParameter *param)\n    {\n        IL2CPP_ASSERT(param->ownerIndex != kGenericContainerIndexInvalid);\n\n        FastAutoLock lock(&g_MetadataLock);\n\n        GenericParameterMap::const_iterator iter = s_GenericParameterMap.find(param);\n        if (iter != s_GenericParameterMap.end())\n            return iter->second;\n\n        Il2CppClass* klass = (Il2CppClass*)MetadataCalloc(1, sizeof(Il2CppClass));\n\n        klass->name = MetadataCache::GetStringFromIndex(param->nameIndex);\n        klass->namespaze = \"\";\n\n        const Il2CppGenericContainer* container = MetadataCache::GetGenericContainerFromIndex(param->ownerIndex);\n        klass->image = GenericContainer::GetDeclaringType(container)->image;\n\n        klass->initialized = true;\n\n        klass->parent = il2cpp_defaults.object_class;\n        klass->castClass = klass->element_class = klass;\n\n        klass->flags = TYPE_ATTRIBUTE_PUBLIC;\n\n        Il2CppType* thisArg = (Il2CppType*)MetadataCalloc(1, sizeof(Il2CppType));\n        Il2CppType* byvalArg = (Il2CppType*)MetadataCalloc(1, sizeof(Il2CppType));\n        thisArg->type = byvalArg->type = container->is_method ? IL2CPP_TYPE_MVAR : IL2CPP_TYPE_VAR;\n        thisArg->data.genericParameterIndex = byvalArg->data.genericParameterIndex = MetadataCache::GetIndexForGenericParameter(param);\n        thisArg->byref = true;\n\n        klass->this_arg = thisArg;\n        klass->byval_arg = byvalArg;\n\n        klass->instance_size = sizeof(void*);\n        klass->thread_static_fields_size = -1;\n        klass->native_size = -1;\n        klass->size_inited = true;\n\n        s_GenericParameterMap.insert(std::make_pair(param, klass));\n\n        return klass;\n    }\n\n    Il2CppClass* Class::GetElementClass(Il2CppClass *klass)\n    {\n        return klass->element_class;\n    }\n\n    const Il2CppType* Class::GetEnumBaseType(Il2CppClass *klass)\n    {\n        if (klass->element_class == klass)\n            /* SRE or broken types */\n            return NULL;\n        else\n            return klass->element_class->byval_arg;\n    }\n\n    const EventInfo* Class::GetEvents(Il2CppClass *klass, void* *iter)\n    {\n        if (!iter)\n            return NULL;\n\n        if (!*iter)\n        {\n            Class::SetupEvents(klass);\n            if (klass->event_count == 0)\n                return NULL;\n\n            *iter = const_cast<EventInfo*>(klass->events);\n            return klass->events;\n        }\n\n        const EventInfo* eventInfo = (const EventInfo*)*iter;\n        eventInfo++;\n        if (eventInfo < klass->events + klass->event_count)\n        {\n            *iter = const_cast<EventInfo*>(eventInfo);\n            return eventInfo;\n        }\n\n        return NULL;\n    }\n\n    FieldInfo* Class::GetFields(Il2CppClass *klass, void* *iter)\n    {\n        if (!iter)\n            return NULL;\n\n        if (!*iter)\n        {\n            Class::SetupFields(klass);\n            if (klass->field_count == 0)\n                return NULL;\n\n            *iter = klass->fields;\n            return klass->fields;\n        }\n\n        FieldInfo* fieldAddress = (FieldInfo*)*iter;\n        fieldAddress++;\n        if (fieldAddress < klass->fields + klass->field_count)\n        {\n            *iter = fieldAddress;\n            return fieldAddress;\n        }\n\n        return NULL;\n    }\n\n    FieldInfo* Class::GetFieldFromName(Il2CppClass *klass, const char* name)\n    {\n        while (klass)\n        {\n            void* iter = NULL;\n            FieldInfo* field;\n            while ((field = GetFields(klass, &iter)))\n            {\n                if (strcmp(name, Field::GetName(field)) != 0)\n                    continue;\n\n                return field;\n            }\n\n            klass = klass->parent;\n        }\n\n        return NULL;\n    }\n\n    const MethodInfo* Class::GetFinalizer(Il2CppClass *klass)\n    {\n        if (!klass->initialized)\n            Class::Init(klass);\n\n        if (!klass->has_finalize)\n            return NULL;\n\n        return klass->vtable[s_FinalizerSlot].method;\n    }\n\n    int32_t Class::GetInstanceSize(const Il2CppClass *klass)\n    {\n        IL2CPP_ASSERT(klass->size_inited);\n        return klass->instance_size;\n    }\n\n    Il2CppClass* Class::GetInterfaces(Il2CppClass *klass, void* *iter)\n    {\n        if (!iter)\n            return NULL;\n\n        if (!*iter)\n        {\n            Class::SetupInterfaces(klass);\n            if (klass->interfaces_count == 0)\n                return NULL;\n\n            *iter = &klass->implementedInterfaces[0];\n            return klass->implementedInterfaces[0];\n        }\n\n        Il2CppClass** interfaceAddress = (Il2CppClass**)*iter;\n        interfaceAddress++;\n        if (interfaceAddress < &klass->implementedInterfaces[klass->interfaces_count])\n        {\n            *iter = interfaceAddress;\n            return *interfaceAddress;\n        }\n\n        return NULL;\n    }\n\n    const MethodInfo* Class::GetMethods(Il2CppClass *klass, void* *iter)\n    {\n        if (!iter)\n            return NULL;\n\n        if (!*iter)\n        {\n            Class::SetupMethods(klass);\n            if (klass->method_count == 0)\n                return NULL;\n\n            *iter = &klass->methods[0];\n            return klass->methods[0];\n        }\n\n        const MethodInfo** methodAddress = (const MethodInfo**)*iter;\n        methodAddress++;\n        if (methodAddress < &klass->methods[klass->method_count])\n        {\n            *iter = methodAddress;\n            return *methodAddress;\n        }\n\n        return NULL;\n    }\n\n    const MethodInfo* Class::GetMethodFromName(Il2CppClass *klass, const char* name, int argsCount)\n    {\n        return GetMethodFromNameFlags(klass, name, argsCount, 0);\n    }\n\n    const MethodInfo* Class::GetMethodFromNameFlags(Il2CppClass *klass, const char* name, int argsCount, int32_t flags)\n    {\n        Class::Init(klass);\n\n        while (klass != NULL)\n        {\n            void* iter = NULL;\n            while (const MethodInfo* method = Class::GetMethods(klass, &iter))\n            {\n                if (method->name[0] == name[0] &&\n                    !strcmp(name, method->name) &&\n                    (argsCount == -1 || method->parameters_count == argsCount) &&\n                    ((method->flags & flags) == flags))\n                {\n                    return method;\n                }\n            }\n\n            klass = klass->parent;\n        }\n\n        return NULL;\n    }\n\n    const char* Class::GetName(Il2CppClass *klass)\n    {\n        return klass->name;\n    }\n\n    const char* Class::GetNamespace(Il2CppClass *klass)\n    {\n        return klass->namespaze;\n    }\n\n    Il2CppClass* Class::GetNestedTypes(Il2CppClass *klass, void* *iter)\n    {\n        if (!iter)\n            return NULL;\n\n        if (klass->generic_class)\n        {\n            IL2CPP_ASSERT(0 && \"Class::GetNestedTypes should only be called on non-generic types and generic type definitions\");\n            return NULL;\n        }\n\n        if (!*iter)\n        {\n            Class::SetupNestedTypes(klass);\n            if (klass->nested_type_count == 0)\n                return NULL;\n\n            *iter = &klass->nestedTypes[0];\n            return klass->nestedTypes[0];\n        }\n\n        Il2CppClass** nestedTypeAddress = (Il2CppClass**)*iter;\n        nestedTypeAddress++;\n        if (nestedTypeAddress < &klass->nestedTypes[klass->nested_type_count])\n        {\n            *iter = nestedTypeAddress;\n            return *nestedTypeAddress;\n        }\n\n        return NULL;\n    }\n\n    size_t Class::GetNumMethods(const Il2CppClass* klass)\n    {\n        return klass->method_count;\n    }\n\n    size_t Class::GetNumProperties(const Il2CppClass* klass)\n    {\n        return klass->property_count;\n    }\n\n    size_t Class::GetNumFields(const Il2CppClass* klass)\n    {\n        return klass->field_count;\n    }\n\n    Il2CppClass* Class::GetParent(Il2CppClass *klass)\n    {\n        return klass->parent;\n    }\n\n    const PropertyInfo* Class::GetProperties(Il2CppClass *klass, void* *iter)\n    {\n        if (!iter)\n            return NULL;\n\n        if (!*iter)\n        {\n            Class::SetupProperties(klass);\n            if (klass->property_count == 0)\n                return NULL;\n\n            *iter = const_cast<PropertyInfo*>(klass->properties);\n            return klass->properties;\n        }\n\n        const PropertyInfo* property = (const PropertyInfo*)*iter;\n        property++;\n        if (property < klass->properties + klass->property_count)\n        {\n            *iter = const_cast<PropertyInfo*>(property);\n            return property;\n        }\n\n        return NULL;\n    }\n\n    const PropertyInfo* Class::GetPropertyFromName(Il2CppClass *klass, const char* name)\n    {\n        while (klass)\n        {\n            void* iter = NULL;\n            while (const PropertyInfo* prop = GetProperties(klass, &iter))\n            {\n                if (strcmp(name, Property::GetName(prop)) != 0)\n                    continue;\n\n                return prop;\n            }\n\n            klass = klass->parent;\n        }\n\n        return NULL;\n    }\n\n    int32_t Class::GetValueSize(Il2CppClass *klass, uint32_t *align)\n    {\n        int32_t size;\n\n        if (!klass->init_pending)\n            Init(klass);\n\n        IL2CPP_ASSERT(klass->valuetype);\n\n        size = Class::GetInstanceSize(klass) - sizeof(Il2CppObject);\n\n        if (align)\n            *align = klass->minimumAlignment;\n\n        return size;\n    }\n\n    bool Class::HasParent(Il2CppClass *klass, Il2CppClass *parent)\n    {\n        Class::SetupTypeHierarchy(klass);\n        Class::SetupTypeHierarchy(parent);\n\n        return HasParentUnsafe(klass, parent);\n    }\n\n    bool Class::IsAssignableFrom(Il2CppClass *klass, Il2CppClass *oklass)\n    {\n        // Cast to original class - fast path\n        if (klass == oklass)\n            return true;\n\n        Class::Init(klass);\n        Class::Init(oklass);\n\n        // Following checks are always going to fail for interfaces\n        if (!IsInterface(klass))\n        {\n            // Array\n            if (klass->rank)\n            {\n                if (oklass->rank != klass->rank)\n                    return false;\n\n                if (oklass->castClass->valuetype)\n                {\n                    // Full array covariance is defined only for reference types.\n                    // For value types, array element reduced types must match\n                    return GetReducedType(klass->castClass) == GetReducedType(oklass->castClass);\n                }\n\n                return Class::IsAssignableFrom(klass->castClass, oklass->castClass);\n            }\n            // System.Object\n            else if (klass == il2cpp_defaults.object_class)\n            {\n                return true;\n            }\n            // Left is System.Nullable<>\n            else if (Class::IsNullable(klass))\n            {\n                if (Class::IsNullable(oklass))\n                    NOT_IMPLEMENTED(Class::IsAssignableFrom);\n                Il2CppClass* nullableArg = Class::GetNullableArgument(klass);\n                return Class::IsAssignableFrom(nullableArg, oklass);\n            }\n\n#if NET_4_0\n            if (klass->parent == il2cpp_defaults.multicastdelegate_class && klass->generic_class != NULL)\n            {\n                const Il2CppTypeDefinition* genericClass = MetadataCache::GetTypeDefinitionFromIndex(klass->generic_class->typeDefinitionIndex);\n                const Il2CppGenericContainer* genericContainer = MetadataCache::GetGenericContainerFromIndex(genericClass->genericContainerIndex);\n\n                if (IsGenericClassAssignableFrom(klass, oklass, genericContainer))\n                    return true;\n            }\n#endif\n\n            return HasParentUnsafe(oklass, klass);\n        }\n\n#if NET_4_0\n        if (klass->generic_class != NULL)\n        {\n            // checking for simple reference equality is not enough in this case because generic interface might have covariant and/or contravariant parameters\n\n            const Il2CppTypeDefinition* genericInterface = MetadataCache::GetTypeDefinitionFromIndex(klass->generic_class->typeDefinitionIndex);\n            const Il2CppGenericContainer* genericContainer = MetadataCache::GetGenericContainerFromIndex(genericInterface->genericContainerIndex);\n\n            for (Il2CppClass* iter = oklass; iter != NULL; iter = iter->parent)\n            {\n                if (IsGenericClassAssignableFrom(klass, iter, genericContainer))\n                    return true;\n\n                for (uint16_t i = 0; i < iter->interfaces_count; ++i)\n                {\n                    if (IsGenericClassAssignableFrom(klass, iter->implementedInterfaces[i], genericContainer))\n                        return true;\n                }\n\n                for (uint16_t i = 0; i < iter->interface_offsets_count; ++i)\n                {\n                    if (IsGenericClassAssignableFrom(klass, iter->interfaceOffsets[i].interfaceType, genericContainer))\n                        return true;\n                }\n            }\n        }\n        else\n#endif\n        {\n            for (Il2CppClass* iter = oklass; iter != NULL; iter = iter->parent)\n            {\n                for (uint16_t i = 0; i < iter->interfaces_count; ++i)\n                {\n                    if (iter->implementedInterfaces[i] == klass)\n                        return true;\n                }\n\n                // Check the interfaces we may have grafted on to the type (e.g IList,\n                // ICollection, IEnumerable for array types).\n                for (uint16_t i = 0; i < iter->interface_offsets_count; ++i)\n                {\n                    if (iter->interfaceOffsets[i].interfaceType == klass)\n                        return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    bool Class::IsGeneric(const Il2CppClass *klass)\n    {\n        return klass->is_generic;\n    }\n\n    bool Class::IsInflated(const Il2CppClass *klass)\n    {\n        return klass->generic_class != NULL;\n    }\n\n    bool Class::IsSubclassOf(Il2CppClass *klass, Il2CppClass *klassc, bool check_interfaces)\n    {\n        Class::SetupTypeHierarchy(klass);\n        Class::SetupTypeHierarchy(klassc);\n        Class::SetupInterfaces(klass);\n\n        if (check_interfaces && IsInterface(klassc) && !IsInterface(klass))\n        {\n            Il2CppClass *oklass = klass;\n\n            while (oklass)\n            {\n                Class::SetupInterfaces(oklass);\n                // TODO: we probably need to implement a faster check here\n                for (uint16_t i = 0; i < oklass->interfaces_count; i++)\n                {\n                    if (oklass->implementedInterfaces[i] == klassc)\n                        return true;\n                }\n\n                oklass = oklass->parent;\n            }\n        }\n        else if (check_interfaces && IsInterface(klassc) && IsInterface(klass))\n        {\n            // TODO: we probably need to implement a faster check here\n            for (uint16_t i = 0; i < klass->interfaces_count; i++)\n            {\n                if (klass->implementedInterfaces[i] == klassc)\n                    return true;\n            }\n        }\n        else\n        {\n            if (!IsInterface(klass) && HasParentUnsafe(klass, klassc))\n                return true;\n        }\n\n        /*\n         * MS.NET thinks interfaces are a subclass of Object, so we think it as\n         * well.\n         */\n        if (klassc == il2cpp_defaults.object_class)\n            return true;\n\n        return false;\n    }\n\n    bool Class::IsValuetype(const Il2CppClass *klass)\n    {\n        return klass->valuetype;\n    }\n\n    bool Class::IsBlittable(const Il2CppClass *klass)\n    {\n        return klass->is_blittable;\n    }\n\n    enum FieldLayoutKind\n    {\n        FIELD_LAYOUT_INSTANCE,\n        FIELD_LAYOUT_STATIC,\n        FIELD_LAYOUT_THREADSTATIC,\n    };\n\n\n    static void SetupFieldOffsets(FieldLayoutKind fieldLayoutKind, Il2CppClass* klass, size_t size, const std::vector<size_t>& fieldOffsets)\n    {\n        IL2CPP_ASSERT(size < std::numeric_limits<uint32_t>::max());\n        if (fieldLayoutKind == FIELD_LAYOUT_INSTANCE)\n            klass->instance_size = static_cast<uint32_t>(size);\n        if (fieldLayoutKind == FIELD_LAYOUT_STATIC)\n            klass->static_fields_size = static_cast<uint32_t>(size);\n        if (fieldLayoutKind == FIELD_LAYOUT_THREADSTATIC)\n            klass->thread_static_fields_size = static_cast<uint32_t>(size);\n\n        if (!(klass->flags & TYPE_ATTRIBUTE_EXPLICIT_LAYOUT))\n        {\n            size_t fieldIndex = 0;\n            for (uint16_t i = 0; i < klass->field_count; i++)\n            {\n                FieldInfo* field = klass->fields + i;\n                if (fieldLayoutKind == FIELD_LAYOUT_INSTANCE && field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n                    continue;\n                if (fieldLayoutKind == FIELD_LAYOUT_STATIC && !Field::IsNormalStatic(field))\n                    continue;\n                if (fieldLayoutKind == FIELD_LAYOUT_THREADSTATIC && !Field::IsThreadStatic(field))\n                    continue;\n\n                if (fieldLayoutKind == FIELD_LAYOUT_THREADSTATIC)\n                {\n                    field->offset = THREAD_STATIC_FIELD_OFFSET;\n                    fieldIndex++;\n                    continue;\n                }\n\n                field->offset = static_cast<int32_t>(fieldOffsets[fieldIndex]);\n                fieldIndex++;\n            }\n        }\n    }\n\n    static void ValidateFieldOffsets(FieldLayoutKind fieldLayoutKind, Il2CppClass* klass, size_t size, const std::vector<size_t>& fieldOffsets)\n    {\n        if (fieldLayoutKind == FIELD_LAYOUT_INSTANCE && klass->parent && !(klass->flags & TYPE_ATTRIBUTE_EXPLICIT_LAYOUT))\n            IL2CPP_ASSERT(klass->instance_size == size);\n        if (fieldLayoutKind == FIELD_LAYOUT_STATIC)\n            IL2CPP_ASSERT(klass->static_fields_size == size);\n        if (fieldLayoutKind == FIELD_LAYOUT_THREADSTATIC)\n            IL2CPP_ASSERT(klass->thread_static_fields_size == size);\n\n        if (!(klass->flags & TYPE_ATTRIBUTE_EXPLICIT_LAYOUT))\n        {\n            size_t fieldIndex = 0;\n            for (uint16_t i = 0; i < klass->field_count; i++)\n            {\n                FieldInfo* field = klass->fields + i;\n                if (fieldLayoutKind == FIELD_LAYOUT_INSTANCE && field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n                    continue;\n                if (fieldLayoutKind == FIELD_LAYOUT_STATIC && !Field::IsNormalStatic(field))\n                    continue;\n                if (fieldLayoutKind == FIELD_LAYOUT_THREADSTATIC && !Field::IsThreadStatic(field))\n                    continue;\n\n                if (fieldLayoutKind == FIELD_LAYOUT_THREADSTATIC)\n                {\n                    IL2CPP_ASSERT(fieldOffsets[fieldIndex] == -1);\n                    fieldIndex++;\n                    continue;\n                }\n\n                IL2CPP_ASSERT(field->offset == fieldOffsets[fieldIndex]);\n                fieldIndex++;\n            }\n        }\n    }\n\n    static void LayoutFieldsLocked(Il2CppClass *klass, const FastAutoLock& lock)\n    {\n        if (Class::IsGeneric(klass))\n            return;\n\n        size_t instanceSize = 0;\n        size_t actualSize = 0;\n        if (klass->parent)\n        {\n            IL2CPP_ASSERT(klass->parent->size_inited);\n            klass->has_references |= klass->parent->has_references;\n            instanceSize = klass->parent->instance_size;\n            actualSize = klass->parent->actualSize;\n            if (klass->valuetype)\n                klass->minimumAlignment = 1;\n            else\n                klass->minimumAlignment = klass->parent->minimumAlignment;\n        }\n        else\n        {\n            actualSize = instanceSize = sizeof(Il2CppObject);\n            klass->minimumAlignment = sizeof(Il2CppObject*);\n        }\n\n        if (klass->field_count)\n        {\n            for (uint16_t i = 0; i < klass->field_count; i++)\n            {\n                FieldInfo* field = klass->fields + i;\n                if (!Field::IsInstance(field))\n                    continue;\n\n                const Il2CppType* ftype = Type::GetUnderlyingType(field->type);\n\n                if (Type::IsEmptyType(ftype))\n                {\n                    std::string message;\n                    message += \"The field '\";\n                    message += field->name;\n                    message += \"' in type '\";\n                    message += klass->name;\n                    message += \"' has a type which was not generated by il2cpp.exe. Consider using a generic type which is not nested so deeply.\";\n                    il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetExecutionEngineException(message.c_str()));\n                }\n\n                if (Type::IsReference(ftype) || (Type::IsStruct(ftype) && Class::HasReferences(Class::FromIl2CppType(ftype))))\n                    klass->has_references = true;\n            }\n\n            Il2CppTypeVector fieldTypes;\n            Il2CppTypeVector staticFieldTypes;\n            Il2CppTypeVector threadStaticFieldTypes;\n\n            for (uint16_t i = 0; i < klass->field_count; i++)\n            {\n                FieldInfo* field = klass->fields + i;\n\n                const Il2CppType* ftype = Type::GetUnderlyingType(field->type);\n\n                if (Field::IsInstance(field))\n                    fieldTypes.push_back(ftype);\n                else if (Field::IsNormalStatic(field))\n                    staticFieldTypes.push_back(ftype);\n                else if (Field::IsThreadStatic(field))\n                    threadStaticFieldTypes.push_back(ftype);\n            }\n\n            FieldLayout::FieldLayoutData layoutData;\n            FieldLayout::FieldLayoutData staticLayoutData;\n            FieldLayout::FieldLayoutData threadStaticLayoutData;\n\n            FieldLayout::LayoutFields(instanceSize, actualSize, klass->minimumAlignment, fieldTypes, layoutData);\n\n            instanceSize = layoutData.classSize;\n\n            // This is a value type with no instance fields, but at least one static field.\n            if (klass->valuetype && fieldTypes.size() == 0)\n            {\n                instanceSize = IL2CPP_SIZEOF_STRUCT_WITH_NO_INSTANCE_FIELDS + sizeof(Il2CppObject);\n                klass->actualSize = IL2CPP_SIZEOF_STRUCT_WITH_NO_INSTANCE_FIELDS + sizeof(Il2CppObject);\n            }\n\n            // need to set this in case there are no fields in a generic instance type\n            if (klass->generic_class)\n                klass->instance_size = static_cast<uint32_t>(instanceSize);\n\n            klass->size_inited = true;\n\n            FieldLayout::LayoutFields(0, 0, 1, staticFieldTypes, staticLayoutData);\n            FieldLayout::LayoutFields(0, 0, 1, threadStaticFieldTypes, threadStaticLayoutData);\n\n            klass->minimumAlignment = layoutData.minimumAlignment;\n            klass->actualSize = static_cast<uint32_t>(layoutData.actualClassSize);\n\n            size_t staticSize = staticLayoutData.classSize;\n            size_t threadStaticSize = threadStaticLayoutData.classSize;\n\n            for (size_t i = 0; i < threadStaticLayoutData.FieldOffsets.size(); ++i)\n                threadStaticLayoutData.FieldOffsets[i] = -1;\n\n            if (klass->generic_class)\n            {\n                SetupFieldOffsets(FIELD_LAYOUT_INSTANCE, klass, instanceSize, layoutData.FieldOffsets);\n                SetupFieldOffsets(FIELD_LAYOUT_STATIC, klass, staticSize, staticLayoutData.FieldOffsets);\n                SetupFieldOffsets(FIELD_LAYOUT_THREADSTATIC, klass, threadStaticSize, threadStaticLayoutData.FieldOffsets);\n            }\n            else\n            {\n#if IL2CPP_ENABLE_VALIDATE_FIELD_LAYOUT\n                ValidateFieldOffsets(FIELD_LAYOUT_INSTANCE, klass, instanceSize, layoutData.FieldOffsets);\n                ValidateFieldOffsets(FIELD_LAYOUT_STATIC, klass, staticSize, staticLayoutData.FieldOffsets);\n                ValidateFieldOffsets(FIELD_LAYOUT_THREADSTATIC, klass, threadStaticSize, threadStaticLayoutData.FieldOffsets);\n#endif\n            }\n        }\n        else\n        {\n            // need to set this in case there are no fields in a generic instance type\n            if (klass->generic_class)\n                klass->instance_size = static_cast<uint32_t>(instanceSize);\n\n            // Always set the actual size, as a derived class without fields could end up\n            // with the wrong actual size (i.e. sizeof may be incorrect), if the last\n            // field of the base class doesn't go to an alignment boundary and the compiler ABI\n            // uses that extra space (as clang does).\n            klass->actualSize = static_cast<uint32_t>(actualSize);\n        }\n\n        if (klass->static_fields_size)\n        {\n            klass->static_fields = il2cpp::gc::GarbageCollector::AllocateFixed(klass->static_fields_size, NULL);\n            s_staticFieldData.push_back(klass);\n\n            il2cpp_runtime_stats.class_static_data_size += klass->static_fields_size;\n        }\n        if (klass->thread_static_fields_size)\n            klass->thread_static_fields_offset = il2cpp::vm::Thread::AllocThreadStaticData(klass->thread_static_fields_size);\n    }\n\n    static void SetupFieldsFromDefinition(Il2CppClass* klass)\n    {\n        if (klass->field_count == 0)\n        {\n            klass->fields = NULL;\n            return;\n        }\n\n        FieldInfo* fields = (FieldInfo*)MetadataCalloc(klass->field_count, sizeof(FieldInfo));\n        FieldInfo* newField = fields;\n\n        FieldIndex start = klass->typeDefinition->fieldStart;\n        IL2CPP_ASSERT(klass->typeDefinition->fieldStart != kFieldIndexInvalid);\n        FieldIndex end = start + klass->field_count;\n\n        for (FieldIndex fieldIndex = start; fieldIndex < end; ++fieldIndex)\n        {\n            const Il2CppFieldDefinition* fieldDefinition = MetadataCache::GetFieldDefinitionFromIndex(fieldIndex);\n\n            newField->type = MetadataCache::GetIl2CppTypeFromIndex(fieldDefinition->typeIndex);\n            newField->name = MetadataCache::GetStringFromIndex(fieldDefinition->nameIndex);\n            newField->parent = klass;\n            newField->offset = MetadataCache::GetFieldOffsetFromIndex(MetadataCache::GetIndexForTypeDefinition(klass), fieldIndex - start);\n            newField->customAttributeIndex = fieldDefinition->customAttributeIndex;\n            newField->token = fieldDefinition->token;\n\n            newField++;\n        }\n\n        klass->fields = fields;\n    }\n\n// passing lock to ensure we have acquired it. We can add asserts later\n    void SetupFieldsLocked(Il2CppClass *klass, const FastAutoLock& lock)\n    {\n        if (klass->size_inited)\n            return;\n\n        if (klass->parent && !klass->parent->size_inited)\n            SetupFieldsLocked(klass->parent, lock);\n\n        if (klass->generic_class)\n        {\n            // for generic instance types, they just inflate the fields of their generic type definition\n            // initialize the generic type definition and delegate to the generic logic\n            InitLocked(GenericClass::GetTypeDefinition(klass->generic_class), lock);\n            GenericClass::SetupFields(klass);\n        }\n        else\n        {\n            SetupFieldsFromDefinition(klass);\n        }\n\n        if (!Class::IsGeneric(klass))\n            LayoutFieldsLocked(klass, lock);\n\n        klass->size_inited = true;\n    }\n\n    void Class::SetupFields(Il2CppClass *klass)\n    {\n        if (!klass->size_inited)\n        {\n            FastAutoLock lock(&g_MetadataLock);\n            SetupFieldsLocked(klass, lock);\n        }\n    }\n\n// passing lock to ensure we have acquired it. We can add asserts later\n    void SetupMethodsLocked(Il2CppClass *klass, const FastAutoLock& lock)\n    {\n        if ((!klass->method_count && !klass->rank) || klass->methods)\n            return;\n\n        if (klass->generic_class)\n        {\n            InitLocked(GenericClass::GetTypeDefinition(klass->generic_class), lock);\n            GenericClass::SetupMethods(klass);\n        }\n        else if (klass->rank)\n        {\n            InitLocked(klass->element_class, lock);\n            SetupVTable(klass, lock);\n        }\n        else\n        {\n            if (klass->method_count == 0)\n            {\n                klass->methods = NULL;\n                return;\n            }\n\n            klass->methods = (const MethodInfo**)IL2CPP_CALLOC(klass->method_count, sizeof(MethodInfo*));\n            MethodInfo* methods = (MethodInfo*)IL2CPP_CALLOC(klass->method_count, sizeof(MethodInfo));\n            MethodInfo* newMethod = methods;\n\n            MethodIndex start = klass->typeDefinition->methodStart;\n            IL2CPP_ASSERT(start != kFieldIndexInvalid);\n            MethodIndex end = start + klass->method_count;\n\n            for (MethodIndex index = start; index < end; ++index)\n            {\n                const Il2CppMethodDefinition* methodDefinition = MetadataCache::GetMethodDefinitionFromIndex(index);\n\n                newMethod->name = MetadataCache::GetStringFromIndex(methodDefinition->nameIndex);\n                newMethod->methodPointer = MetadataCache::GetMethodPointerFromIndex(methodDefinition->methodIndex);\n                newMethod->invoker_method = MetadataCache::GetMethodInvokerFromIndex(methodDefinition->invokerIndex);\n                newMethod->declaring_type = klass;\n                newMethod->return_type = MetadataCache::GetIl2CppTypeFromIndex(methodDefinition->returnType);\n\n                ParameterInfo* parameters = (ParameterInfo*)IL2CPP_CALLOC(methodDefinition->parameterCount, sizeof(ParameterInfo));\n                ParameterInfo* newParameter = parameters;\n                for (uint16_t paramIndex = 0; paramIndex < methodDefinition->parameterCount; ++paramIndex)\n                {\n                    const Il2CppParameterDefinition* parameterDefinition = MetadataCache::GetParameterDefinitionFromIndex(methodDefinition->parameterStart + paramIndex);\n                    newParameter->name = MetadataCache::GetStringFromIndex(parameterDefinition->nameIndex);\n                    newParameter->position = paramIndex;\n                    newParameter->token = parameterDefinition->token;\n                    newParameter->customAttributeIndex = parameterDefinition->customAttributeIndex;\n                    newParameter->parameter_type = MetadataCache::GetIl2CppTypeFromIndex(parameterDefinition->typeIndex);\n\n                    newParameter++;\n                }\n                newMethod->parameters = parameters;\n\n                newMethod->customAttributeIndex = methodDefinition->customAttributeIndex;\n                newMethod->flags = methodDefinition->flags;\n                newMethod->iflags = methodDefinition->iflags;\n                newMethod->slot = methodDefinition->slot;\n                newMethod->parameters_count = static_cast<const uint8_t>(methodDefinition->parameterCount);\n                newMethod->is_inflated = false;\n                newMethod->token = methodDefinition->token;\n                newMethod->methodDefinition = methodDefinition;\n                newMethod->genericContainer = MetadataCache::GetGenericContainerFromIndex(methodDefinition->genericContainerIndex);\n                if (newMethod->genericContainer)\n                    newMethod->is_generic = true;\n\n                klass->methods[index - start] = newMethod;\n\n                newMethod++;\n            }\n        }\n    }\n\n    void Class::SetupMethods(Il2CppClass *klass)\n    {\n        if (klass->method_count || klass->rank)\n        {\n            FastAutoLock lock(&g_MetadataLock);\n            SetupMethodsLocked(klass, lock);\n        }\n    }\n\n    void SetupNestedTypesLocked(Il2CppClass *klass, const FastAutoLock& lock)\n    {\n        if (klass->generic_class)\n            return;\n\n        if (klass->nested_type_count > 0)\n        {\n            klass->nestedTypes = (Il2CppClass**)MetadataCalloc(klass->nested_type_count, sizeof(Il2CppClass*));\n            for (uint16_t i = 0; i < klass->nested_type_count; i++)\n                klass->nestedTypes[i] = MetadataCache::GetNestedTypeFromIndex(klass->typeDefinition->nestedTypesStart + i);\n        }\n    }\n\n    void Class::SetupNestedTypes(Il2CppClass *klass)\n    {\n        if (klass->generic_class)\n            return;\n\n        if (klass->nested_type_count)\n        {\n            FastAutoLock lock(&g_MetadataLock);\n            SetupNestedTypesLocked(klass, lock);\n        }\n    }\n\n    static void SetupVTable(Il2CppClass *klass, const FastAutoLock& lock)\n    {\n        if (klass->is_vtable_initialized)\n            return;\n\n        if (klass->generic_class)\n        {\n            Il2CppClass* genericTypeDefinition = GenericClass::GetTypeDefinition(klass->generic_class);\n            Il2CppGenericContext* context = &klass->generic_class->context;\n            if (genericTypeDefinition->interface_offsets_count > 0 && klass->interfaceOffsets == NULL)\n            {\n                klass->interface_offsets_count = genericTypeDefinition->interface_offsets_count;\n                klass->interfaceOffsets = (Il2CppRuntimeInterfaceOffsetPair*)MetadataCalloc(genericTypeDefinition->interface_offsets_count, sizeof(Il2CppRuntimeInterfaceOffsetPair));\n                for (uint16_t i = 0; i < genericTypeDefinition->interface_offsets_count; i++)\n                {\n                    Il2CppInterfaceOffsetPair interfaceOffset = MetadataCache::GetInterfaceOffsetIndex(genericTypeDefinition->typeDefinition->interfaceOffsetsStart + i);\n                    klass->interfaceOffsets[i].offset = interfaceOffset.offset;\n                    klass->interfaceOffsets[i].interfaceType = Class::FromIl2CppType(GenericMetadata::InflateIfNeeded(MetadataCache::GetIl2CppTypeFromIndex(interfaceOffset.interfaceTypeIndex), context, false));\n                }\n            }\n\n            if (genericTypeDefinition->vtable_count > 0)\n            {\n                klass->vtable_count = genericTypeDefinition->vtable_count;\n                for (uint16_t i = 0; i < genericTypeDefinition->vtable_count; i++)\n                {\n                    EncodedMethodIndex vtableMethodIndex = MetadataCache::GetVTableMethodFromIndex(genericTypeDefinition->typeDefinition->vtableStart + i);\n                    const MethodInfo* method = MetadataCache::GetMethodInfoFromIndex(vtableMethodIndex);\n                    if (GetEncodedIndexType(vtableMethodIndex) == kIl2CppMetadataUsageMethodRef)\n                    {\n                        const Il2CppGenericMethod* genericMethod = GenericMetadata::Inflate(method->genericMethod, context);\n                        method = GenericMethod::GetMethod(genericMethod);\n                    }\n                    else if (method && Class::IsGeneric(method->declaring_type))\n                    {\n                        const Il2CppGenericMethod* gmethod = MetadataCache::GetGenericMethod(method, context->class_inst, NULL);\n                        method = GenericMethod::GetMethod(gmethod);\n                    }\n\n                    klass->vtable[i].method = method;\n                    if (method != NULL)\n                    {\n                        if (method->methodPointer)\n                            klass->vtable[i].methodPtr = method->methodPointer;\n                        else if (method->is_inflated && !method->is_generic && !method->genericMethod->context.method_inst)\n                            klass->vtable[i].methodPtr = MetadataCache::GetUnresolvedVirtualCallStub(method);\n                    }\n                }\n            }\n        }\n        else if (klass->rank)\n        {\n            InitLocked(klass->element_class, lock);\n            ArrayMetadata::SetupArrayVTable(klass, lock);\n        }\n        else\n        {\n            if (klass->interface_offsets_count > 0 && klass->interfaceOffsets == NULL)\n            {\n                klass->interfaceOffsets = (Il2CppRuntimeInterfaceOffsetPair*)MetadataCalloc(klass->interface_offsets_count, sizeof(Il2CppRuntimeInterfaceOffsetPair));\n                for (uint16_t i = 0; i < klass->interface_offsets_count; i++)\n                {\n                    Il2CppInterfaceOffsetPair interfaceOffset = MetadataCache::GetInterfaceOffsetIndex(klass->typeDefinition->interfaceOffsetsStart + i);\n                    klass->interfaceOffsets[i].offset = interfaceOffset.offset;\n                    klass->interfaceOffsets[i].interfaceType = Class::FromIl2CppType(MetadataCache::GetIl2CppTypeFromIndex(interfaceOffset.interfaceTypeIndex));\n                }\n            }\n\n            if (klass->vtable_count > 0)\n            {\n                for (uint16_t i = 0; i < klass->vtable_count; i++)\n                {\n                    const MethodInfo* method = MetadataCache::GetMethodInfoFromIndex(MetadataCache::GetVTableMethodFromIndex(klass->typeDefinition->vtableStart + i));\n                    klass->vtable[i].method = method;\n\n                    if (method != NULL)\n                        klass->vtable[i].methodPtr = method->methodPointer;\n                }\n            }\n        }\n\n        klass->is_vtable_initialized = 1;\n    }\n\n    static void SetupEventsLocked(Il2CppClass *klass, const FastAutoLock& lock)\n    {\n        if (klass->generic_class)\n        {\n            InitLocked(GenericClass::GetTypeDefinition(klass->generic_class), lock);\n            GenericClass::SetupEvents(klass);\n        }\n        else if (klass->rank > 0)\n        {\n            // do nothing, arrays have no events\n            IL2CPP_ASSERT(klass->event_count == 0);\n        }\n        else if (klass->event_count != 0)\n        {\n            // we need methods initialized since we reference them via index below\n            SetupMethodsLocked(klass, lock);\n\n            EventInfo* events = (EventInfo*)IL2CPP_CALLOC(klass->event_count, sizeof(EventInfo));\n            EventInfo* newEvent = events;\n\n            EventIndex start = klass->typeDefinition->eventStart;\n            IL2CPP_ASSERT(klass->typeDefinition->eventStart != kEventIndexInvalid);\n            EventIndex end = start + klass->event_count;\n\n            for (EventIndex eventIndex = start; eventIndex < end; ++eventIndex)\n            {\n                const Il2CppEventDefinition* eventDefinition = MetadataCache::GetEventDefinitionFromIndex(eventIndex);\n\n                newEvent->eventType = MetadataCache::GetIl2CppTypeFromIndex(eventDefinition->typeIndex);\n                newEvent->name = MetadataCache::GetStringFromIndex(eventDefinition->nameIndex);\n                newEvent->parent = klass;\n\n                if (eventDefinition->add != kMethodIndexInvalid)\n                    newEvent->add = klass->methods[eventDefinition->add];\n\n                if (eventDefinition->remove != kMethodIndexInvalid)\n                    newEvent->remove = klass->methods[eventDefinition->remove];\n\n                if (eventDefinition->raise != kMethodIndexInvalid)\n                    newEvent->raise = klass->methods[eventDefinition->raise];\n\n                newEvent->customAttributeIndex = eventDefinition->customAttributeIndex;\n                newEvent->token = eventDefinition->token;\n\n                newEvent++;\n            }\n\n            klass->events = events;\n        }\n    }\n\n    void Class::SetupEvents(Il2CppClass *klass)\n    {\n        if (!klass->events && klass->event_count)\n        {\n            FastAutoLock lock(&g_MetadataLock);\n            SetupEventsLocked(klass, lock);\n        }\n    }\n\n    static void SetupPropertiesLocked(Il2CppClass *klass, const FastAutoLock& lock)\n    {\n        if (klass->generic_class)\n        {\n            InitLocked(GenericClass::GetTypeDefinition(klass->generic_class), lock);\n            GenericClass::SetupProperties(klass);\n        }\n        else if (klass->property_count != 0)\n        {\n            // we need methods initialized since we reference them via index below\n            SetupMethodsLocked(klass, lock);\n\n            PropertyInfo* properties = (PropertyInfo*)IL2CPP_CALLOC(klass->property_count, sizeof(PropertyInfo));\n            PropertyInfo* newProperty = properties;\n\n            PropertyIndex start = klass->typeDefinition->propertyStart;\n            IL2CPP_ASSERT(klass->typeDefinition->propertyStart != kPropertyIndexInvalid);\n            PropertyIndex end = start + klass->property_count;\n\n            for (PropertyIndex propertyIndex = start; propertyIndex < end; ++propertyIndex)\n            {\n                const Il2CppPropertyDefinition* propertyDefinition = MetadataCache::GetPropertyDefinitionFromIndex(propertyIndex);\n\n                newProperty->name = MetadataCache::GetStringFromIndex(propertyDefinition->nameIndex);\n                newProperty->parent = klass;\n\n                if (propertyDefinition->get != kMethodIndexInvalid)\n                    newProperty->get = klass->methods[propertyDefinition->get];\n\n                if (propertyDefinition->set != kMethodIndexInvalid)\n                    newProperty->set = klass->methods[propertyDefinition->set];\n\n                newProperty->attrs = propertyDefinition->attrs;\n                newProperty->customAttributeIndex = propertyDefinition->customAttributeIndex;\n                newProperty->token = propertyDefinition->token;\n\n                newProperty++;\n            }\n\n            klass->properties = properties;\n        }\n    }\n\n    void Class::SetupProperties(Il2CppClass *klass)\n    {\n        if (!klass->properties && klass->property_count)\n        {\n            FastAutoLock lock(&g_MetadataLock);\n            SetupPropertiesLocked(klass, lock);\n        }\n    }\n\n    static void SetupTypeHierarchyLocked(Il2CppClass *klass, const FastAutoLock& lock)\n    {\n        if (klass->typeHierarchy != NULL)\n            return;\n\n        if (klass->parent && !klass->parent->typeHierarchy)\n            SetupTypeHierarchyLocked(klass->parent, lock);\n        if (klass->parent)\n            klass->typeHierarchyDepth = klass->parent->typeHierarchyDepth + 1;\n        else\n            klass->typeHierarchyDepth = 1;\n\n        klass->typeHierarchy = (Il2CppClass**)MetadataCalloc(klass->typeHierarchyDepth, sizeof(Il2CppClass*));\n\n        if (klass->parent)\n        {\n            klass->typeHierarchy[klass->typeHierarchyDepth - 1] = klass;\n            memcpy(klass->typeHierarchy, klass->parent->typeHierarchy, klass->parent->typeHierarchyDepth * sizeof(void*));\n        }\n        else\n        {\n            klass->typeHierarchy[0] = klass;\n        }\n    }\n\n    void Class::SetupTypeHierarchy(Il2CppClass *klass)\n    {\n        FastAutoLock lock(&g_MetadataLock);\n        SetupTypeHierarchyLocked(klass, lock);\n    }\n\n    void Class::SetupInterfaces(Il2CppClass *klass)\n    {\n        FastAutoLock lock(&g_MetadataLock);\n        SetupInterfacesLocked(klass, lock);\n    }\n\n    static bool InitLocked(Il2CppClass *klass, const FastAutoLock& lock)\n    {\n        if (klass->initialized)\n            return true;\n\n        NOT_IMPLEMENTED_NO_ASSERT(Class::Init, \"Audit and compare to mono version\");\n\n        klass->init_pending = true;\n\n        klass->genericRecursionDepth++;\n\n        if (klass->generic_class)\n            InitLocked(GenericClass::GetTypeDefinition(klass->generic_class), lock);\n\n        if (klass->byval_arg->type == IL2CPP_TYPE_ARRAY || klass->byval_arg->type == IL2CPP_TYPE_SZARRAY)\n        {\n            Il2CppClass *element_class = klass->element_class;\n            if (!element_class->initialized)\n                InitLocked(element_class, lock);\n        }\n\n        SetupInterfacesLocked(klass, lock);\n\n        if (klass->parent && !klass->parent->initialized)\n            InitLocked(klass->parent, lock);\n\n        SetupMethodsLocked(klass, lock);\n        SetupTypeHierarchyLocked(klass, lock);\n        SetupVTable(klass, lock);\n        if (!klass->size_inited)\n            SetupFieldsLocked(klass, lock);\n\n        SetupEventsLocked(klass, lock);\n        SetupPropertiesLocked(klass, lock);\n        SetupNestedTypesLocked(klass, lock);\n\n        if (klass == il2cpp_defaults.object_class)\n        {\n            for (uint16_t slot = 0; slot < klass->vtable_count; slot++)\n            {\n                const MethodInfo* vmethod = klass->vtable[slot].method;\n                if (!strcmp(vmethod->name, \"GetHashCode\"))\n                    s_GetHashCodeSlot = slot;\n                else if (!strcmp(vmethod->name, \"Finalize\"))\n                    s_FinalizerSlot = slot;\n            }\n            IL2CPP_ASSERT(s_FinalizerSlot > 0);\n            IL2CPP_ASSERT(s_GetHashCodeSlot > 0);\n        }\n\n        if (!Class::IsGeneric(klass))\n            SetupGCDescriptor(klass);\n\n#if IL2CPP_DEBUGGER_ENABLED\n        // Gab: not sure this is the best place to put the typeload event notification,\n        // we probably want to send a typeload event for all the know types at startup.\n        il2cpp_debugger_notify_type_load(klass);\n#endif\n\n        if (klass->generic_class)\n        {\n            const Il2CppTypeDefinition* typeDefinition = GenericClass::GetTypeDefinition(klass->generic_class)->typeDefinition;\n            if (klass->genericRecursionDepth < GenericMetadata::MaximumRuntimeGenericDepth)\n                klass->rgctx_data = GenericMetadata::InflateRGCTX(typeDefinition->rgctxStartIndex, typeDefinition->rgctxCount, &klass->generic_class->context);\n        }\n\n        klass->initialized = true;\n        klass->init_pending = false;\n\n        ++il2cpp_runtime_stats.initialized_class_count;\n\n        return true;\n    }\n\n    bool Class::Init(Il2CppClass *klass)\n    {\n        IL2CPP_ASSERT(klass);\n\n        if (!klass->initialized)\n        {\n            FastAutoLock lock(&g_MetadataLock);\n            InitLocked(klass, lock);\n        }\n\n        return true;\n    }\n\n    Il2CppClass* Class::FromName(const Il2CppImage* image, const char* namespaze, const char *name)\n    {\n        return Image::ClassFromName(image, namespaze, name);\n    }\n\n    Il2CppClass* Class::GetArrayClass(Il2CppClass *element_class, uint32_t rank)\n    {\n        return GetBoundedArrayClass(element_class, rank, false);\n    }\n\n    Il2CppClass* Class::GetBoundedArrayClass(Il2CppClass *eclass, uint32_t rank, bool bounded)\n    {\n        return ArrayMetadata::GetBoundedArrayClass(eclass, rank, bounded);\n    }\n\n    Il2CppClass* Class::GetInflatedGenericInstanceClass(Il2CppClass* klass, const metadata::Il2CppTypeVector& types)\n    {\n        return GetInflatedGenericInstanceClass(klass, MetadataCache::GetGenericInst(types));\n    }\n\n    Il2CppClass* Class::GetInflatedGenericInstanceClass(Il2CppClass* klass, const Il2CppGenericInst* genericInst)\n    {\n        IL2CPP_ASSERT(Class::IsGeneric(klass));\n\n        Il2CppGenericClass* gclass = GenericMetadata::GetGenericClass(klass, genericInst);\n        return GenericClass::GetClass(gclass);\n    }\n\n    Il2CppClass* Class::InflateGenericClass(Il2CppClass* klass, Il2CppGenericContext *context)\n    {\n        const Il2CppType* inflated = InflateGenericType(klass->byval_arg, context);\n\n        return FromIl2CppType(inflated);\n    }\n\n    const Il2CppType* Class::InflateGenericType(const Il2CppType* type, Il2CppGenericContext* context)\n    {\n        return GenericMetadata::InflateIfNeeded(type, context, true);\n    }\n\n    bool Class::HasDefaultConstructor(Il2CppClass* klass)\n    {\n        const char ctorName[] = \".ctor\";\n        void* iter = NULL;\n        while (const MethodInfo* method = Class::GetMethods(klass, &iter))\n        {\n            if (strncmp(method->name, ctorName, utils::StringUtils::LiteralLength(ctorName)) == 0 && method->parameters_count == 0)\n                return true;\n        }\n\n        return false;\n    }\n\n    int Class::GetFlags(const Il2CppClass *klass)\n    {\n        return klass->flags;\n    }\n\n    bool Class::IsAbstract(const Il2CppClass *klass)\n    {\n        return (klass->flags & TYPE_ATTRIBUTE_ABSTRACT) != 0;\n    }\n\n    bool Class::IsInterface(const Il2CppClass *klass)\n    {\n        return (klass->flags & TYPE_ATTRIBUTE_INTERFACE) || (klass->byval_arg->type == IL2CPP_TYPE_VAR) || (klass->byval_arg->type == IL2CPP_TYPE_MVAR);\n    }\n\n    bool Class::IsNullable(const Il2CppClass *klass)\n    {\n        return klass->generic_class != NULL &&\n            GenericClass::GetTypeDefinition(klass->generic_class) == il2cpp_defaults.generic_nullable_class;\n    }\n\n    Il2CppClass* Class::GetNullableArgument(const Il2CppClass* klass)\n    {\n        return Class::FromIl2CppType(klass->generic_class->context.class_inst->type_argv[0]);\n    }\n\n    int Class::GetArrayElementSize(const Il2CppClass *klass)\n    {\n        const Il2CppType *type = klass->byval_arg;\n\n    handle_enum:\n        switch (type->type)\n        {\n            case IL2CPP_TYPE_I1:\n            case IL2CPP_TYPE_U1:\n            case IL2CPP_TYPE_BOOLEAN:\n                return 1;\n\n            case IL2CPP_TYPE_I2:\n            case IL2CPP_TYPE_U2:\n            case IL2CPP_TYPE_CHAR:\n                return 2;\n\n            case IL2CPP_TYPE_I4:\n            case IL2CPP_TYPE_U4:\n            case IL2CPP_TYPE_R4:\n                return 4;\n\n            case IL2CPP_TYPE_I:\n            case IL2CPP_TYPE_U:\n            case IL2CPP_TYPE_PTR:\n            case IL2CPP_TYPE_CLASS:\n            case IL2CPP_TYPE_STRING:\n            case IL2CPP_TYPE_OBJECT:\n            case IL2CPP_TYPE_SZARRAY:\n            case IL2CPP_TYPE_ARRAY:\n            case IL2CPP_TYPE_VAR:\n            case IL2CPP_TYPE_MVAR:\n                return sizeof(Il2CppObject*);\n\n            case IL2CPP_TYPE_I8:\n            case IL2CPP_TYPE_U8:\n            case IL2CPP_TYPE_R8:\n                return 8;\n\n            case IL2CPP_TYPE_VALUETYPE:\n                if (Type::IsEnum(type))\n                {\n                    type = Class::GetEnumBaseType(Type::GetClass(type));\n                    klass = klass->element_class;\n                    goto handle_enum;\n                }\n                return Class::GetInstanceSize(klass) - sizeof(Il2CppObject);\n\n            case IL2CPP_TYPE_GENERICINST:\n                type = GenericClass::GetTypeDefinition(type->data.generic_class)->byval_arg;\n                goto handle_enum;\n\n            case IL2CPP_TYPE_VOID:\n                return 0;\n\n            default:\n                // g_error (\"unknown type 0x%02x in mono_class_array_element_size\", type->type);\n                NOT_IMPLEMENTED_NO_ASSERT(Class::GetArrayElementSize, \"Should throw a nice error\");\n        }\n\n        return -1;\n    }\n\n    const Il2CppType* Class::GetType(Il2CppClass *klass)\n    {\n        return klass->byval_arg;\n    }\n\n    const Il2CppType* Class::GetType(Il2CppClass *klass, const TypeNameParseInfo &info)\n    {\n        // Attempt to resolve a generic type definition.\n        if (Class::IsGeneric(klass))\n            klass = ResolveGenericInstanceType(klass, info, false, false);\n\n        bool bounded = false;\n\n        std::vector<int32_t>::const_iterator it = info.modifiers().begin();\n\n        if (info.is_bounded())\n        {\n            bounded = false;\n        }\n\n        while (it != info.modifiers().end())\n        {\n            if (*it == 0)\n            {\n                // byref is always the last modifier, so we can return here.\n                return klass->this_arg;\n            }\n\n            if (*it == -1)\n            {\n                klass = Class::GetPtrClass(klass);\n            }\n            else if (*it == -2)\n            {\n                bounded = true;\n            }\n            else\n            {\n                klass = Class::GetBoundedArrayClass(klass, *it, bounded);\n            }\n\n            ++it;\n        }\n\n        if (klass == NULL)\n            return NULL;\n\n        return klass->byval_arg;\n    }\n\n    bool Class::HasAttribute(Il2CppClass *klass, Il2CppClass *attr_class)\n    {\n        return Reflection::HasAttribute(klass, attr_class);\n    }\n\n    bool Class::IsEnum(const Il2CppClass *klass)\n    {\n        return klass->enumtype;\n    }\n\n    const Il2CppImage* Class::GetImage(Il2CppClass *klass)\n    {\n        return klass->image;\n    }\n\n    const Il2CppGenericContainer* Class::GetGenericContainer(Il2CppClass *klass)\n    {\n        return MetadataCache::GetGenericContainerFromIndex(klass->genericContainerIndex);\n    }\n\n    const MethodInfo* Class::GetCCtor(Il2CppClass *klass)\n    {\n        if (!klass->has_cctor)\n            return NULL;\n\n        return GetMethodFromNameFlags(klass, \".cctor\", -1, METHOD_ATTRIBUTE_SPECIAL_NAME);\n    }\n\n    const char* Class::GetFieldDefaultValue(const FieldInfo *field, const Il2CppType** type)\n    {\n        const Il2CppFieldDefaultValue *entry = MetadataCache::GetFieldDefaultValueForField(field);\n        if (entry != NULL)\n        {\n            *type = MetadataCache::GetIl2CppTypeFromIndex(entry->typeIndex);\n            if (entry->dataIndex == kDefaultValueIndexNull)\n                return NULL;\n\n            return (const char*)MetadataCache::GetFieldDefaultValueDataFromIndex(entry->dataIndex);\n        }\n        return NULL;\n    }\n\n    int Class::GetFieldMarshaledSize(const FieldInfo *field)\n    {\n        int marshaledFieldSize = MetadataCache::GetFieldMarshaledSizeForField(field);\n        if (marshaledFieldSize != -1)\n            return marshaledFieldSize;\n\n        if (field->type->type == IL2CPP_TYPE_BOOLEAN)\n            return 4;\n        if (field->type->type == IL2CPP_TYPE_CHAR)\n            return 1;\n\n        size_t size = metadata::FieldLayout::GetTypeSizeAndAlignment(field->type).size;\n        IL2CPP_ASSERT(size < static_cast<size_t>(std::numeric_limits<int>::max()));\n        return static_cast<int>(size);\n    }\n\n    Il2CppClass* Class::GetPtrClass(const Il2CppType* type)\n    {\n        return GetPtrClass(Class::FromIl2CppType(type));\n    }\n\n    Il2CppClass* Class::GetPtrClass(Il2CppClass* elementClass)\n    {\n        FastAutoLock lock(&g_MetadataLock);\n\n        Il2CppClass* pointerClass = MetadataCache::GetPointerType(elementClass);\n        if (pointerClass)\n            return pointerClass;\n\n        pointerClass = (Il2CppClass*)MetadataCalloc(1, sizeof(Il2CppClass));\n\n        pointerClass->namespaze = elementClass->namespaze;\n        pointerClass->name = il2cpp::utils::StringUtils::StringDuplicate(il2cpp::utils::StringUtils::Printf(\"%s*\", elementClass->name).c_str());\n\n        pointerClass->image = elementClass->image;\n        pointerClass->initialized = true;\n        pointerClass->flags = TYPE_ATTRIBUTE_CLASS | (elementClass->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK);\n        pointerClass->instance_size = sizeof(void*);\n\n        Il2CppType* this_arg = (Il2CppType*)MetadataCalloc(1, sizeof(Il2CppType));\n        Il2CppType* byval_arg = (Il2CppType*)MetadataCalloc(1, sizeof(Il2CppType));\n        this_arg->type = byval_arg->type = IL2CPP_TYPE_PTR;\n        this_arg->data.type = byval_arg->data.type = elementClass->byval_arg;\n        this_arg->byref = true;\n\n        pointerClass->this_arg = this_arg;\n        pointerClass->byval_arg = byval_arg;\n\n        pointerClass->parent = NULL;\n        pointerClass->castClass = pointerClass->element_class = elementClass;\n\n        MetadataCache::AddPointerType(elementClass, pointerClass);\n\n        return pointerClass;\n    }\n\n    bool Class::HasReferences(Il2CppClass *klass)\n    {\n        if (klass->init_pending)\n        {\n            /* Be conservative */\n            return true;\n        }\n        else\n        {\n            Init(klass);\n\n            return klass->has_references;\n        }\n    }\n\n    const il2cpp::utils::dynamic_array<Il2CppClass*>& Class::GetStaticFieldData()\n    {\n        return s_staticFieldData;\n    }\n\n    const Il2CppDebugTypeInfo *Class::GetDebugInfo(const Il2CppClass *klass)\n    {\n#if IL2CPP_DEBUGGER_ENABLED\n        return klass->debug_info;\n#else\n        return NULL;\n#endif\n    }\n\n    const size_t kWordSize = (8 * sizeof(size_t));\n\n    static inline void set_bit(size_t* bitmap, size_t index)\n    {\n        bitmap[index / kWordSize] |= (size_t)1 << (index % kWordSize);\n    }\n\n    size_t Class::GetBitmapSize(const Il2CppClass* klass)\n    {\n        size_t maxBits = klass->instance_size / sizeof(void*);\n        size_t maxWords = 1 + (maxBits / sizeof(size_t));\n        return sizeof(size_t) * maxWords;\n    }\n\n    void Class::GetBitmap(Il2CppClass* klass, size_t* bitmap, size_t& maxSetBit)\n    {\n        Class::Init(klass);\n        return il2cpp::vm::GetBitmapNoInit(klass, bitmap, maxSetBit, 0);\n    }\n\n    const char *Class::GetAssemblyName(const Il2CppClass *klass)\n    {\n        return klass->image->name;\n    }\n\n    void GetBitmapNoInit(Il2CppClass* klass, size_t* bitmap, size_t& maxSetBit, size_t parentOffset)\n    {\n        Il2CppClass* currentClass = klass;\n\n        while (currentClass)\n        {\n            for (uint16_t index = 0; index < currentClass->field_count; index++)\n            {\n                FieldInfo* field = currentClass->fields + index;\n                if (field->type->attrs & (FIELD_ATTRIBUTE_STATIC | FIELD_ATTRIBUTE_HAS_FIELD_RVA))\n                    continue;\n\n                IL2CPP_ASSERT(!field->type->byref);\n\n                size_t offset = parentOffset + field->offset;\n\n                const Il2CppType* type = Type::GetUnderlyingType(field->type);\n\n                switch (type->type)\n                {\n                    case IL2CPP_TYPE_I1:\n                    case IL2CPP_TYPE_U1:\n                    case IL2CPP_TYPE_BOOLEAN:\n                    case IL2CPP_TYPE_I2:\n                    case IL2CPP_TYPE_U2:\n                    case IL2CPP_TYPE_CHAR:\n                    case IL2CPP_TYPE_I4:\n                    case IL2CPP_TYPE_U4:\n                    case IL2CPP_TYPE_I8:\n                    case IL2CPP_TYPE_U8:\n                    case IL2CPP_TYPE_I:\n                    case IL2CPP_TYPE_U:\n                    case IL2CPP_TYPE_R4:\n                    case IL2CPP_TYPE_R8:\n                    case IL2CPP_TYPE_PTR:\n                    case IL2CPP_TYPE_FNPTR:\n                        break;\n                    case IL2CPP_TYPE_STRING:\n                    case IL2CPP_TYPE_SZARRAY:\n                    case IL2CPP_TYPE_CLASS:\n                    case IL2CPP_TYPE_OBJECT:\n                    case IL2CPP_TYPE_ARRAY:\n                    case IL2CPP_TYPE_VAR:\n                    case IL2CPP_TYPE_MVAR:\n                        IL2CPP_ASSERT(0 == (field->offset % sizeof(void*)));\n                        set_bit(bitmap, offset / sizeof(void*));\n                        maxSetBit = std::max(maxSetBit, offset / sizeof(void*));\n                        break;\n                    case IL2CPP_TYPE_GENERICINST:\n                        if (!Type::GenericInstIsValuetype(type))\n                        {\n                            IL2CPP_ASSERT(0 == (field->offset % sizeof(void*)));\n                            set_bit(bitmap, offset / sizeof(void*));\n                            maxSetBit = std::max(maxSetBit, offset / sizeof(void*));\n                            break;\n                        }\n                        else\n                        {\n                            /* fall through */\n                        }\n                    case IL2CPP_TYPE_VALUETYPE:\n                    {\n                        Il2CppClass* fieldClass = Class::FromIl2CppType(field->type);\n                        Class::Init(fieldClass);\n                        if (fieldClass->has_references)\n                            GetBitmapNoInit(fieldClass, bitmap, maxSetBit, offset - sizeof(Il2CppObject) /* nested field offset includes padding for boxed structure. Remove for struct fields */);\n                        break;\n                    }\n                    default:\n                        NOT_IMPLEMENTED(Class::GetClassBitmap);\n                        break;\n                }\n            }\n\n            currentClass = currentClass->parent;\n        }\n    }\n\n    void SetupGCDescriptor(Il2CppClass* klass)\n    {\n        const size_t kMaxAllocaSize = 1024;\n        size_t bitmapSize = Class::GetBitmapSize(klass);\n        size_t* bitmap = NULL;\n        std::vector<size_t> buffer(0);\n\n        if (bitmapSize > kMaxAllocaSize)\n        {\n            buffer.resize(bitmapSize / sizeof(size_t));\n            bitmap = (size_t*)&buffer[0];\n        }\n        else\n        {\n            bitmap = (size_t*)alloca(bitmapSize);\n        }\n\n        memset(bitmap, 0, bitmapSize);\n        size_t maxSetBit = 0;\n        GetBitmapNoInit(klass, bitmap, maxSetBit, 0);\n\n        if (klass == il2cpp_defaults.string_class)\n            klass->gc_desc = il2cpp::gc::GarbageCollector::MakeDescriptorForString();\n        else if (klass->rank)\n            klass->gc_desc = il2cpp::gc::GarbageCollector::MakeDescriptorForArray();\n        else\n            klass->gc_desc = il2cpp::gc::GarbageCollector::MakeDescriptorForObject(bitmap, (int)maxSetBit + 1);\n    }\n\n#define CHECK_IF_NULL(v)    \\\n    if ( (v) == NULL && throwOnError ) \\\n        Exception::Raise (Exception::GetTypeLoadException ()); \\\n    if ( (v) == NULL ) \\\n        return NULL;\n\n    static Il2CppClass * resolve_generic_instance_internal(const il2cpp::vm::TypeNameParseInfo &info, Il2CppClass *generic_class, Il2CppTypeVector &generic_arguments, bool throwOnError)\n    {\n        Il2CppClass *klass = NULL;\n\n        const Il2CppGenericContainer* container = Class::GetGenericContainer(generic_class);\n        if (container->type_argc != generic_arguments.size())\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetArgumentException(\"name\", \"The number of generic arguments provided doesn't equal the arity of the generic type definition.\"));\n\n        if (info.assembly_name().name.empty())\n        {\n            const Il2CppImage* image = Image::GetExecutingImage();\n            klass = MetadataCache::GetGenericInstanceType(generic_class, generic_arguments);\n\n            if (klass == NULL && image != Image::GetCorlib())\n            {\n                // Try mscorlib\n                image = (Il2CppImage*)Image::GetCorlib();\n                klass = MetadataCache::GetGenericInstanceType(generic_class, generic_arguments);\n            }\n        }\n        else\n        {\n            const Il2CppAssembly *assembly = Assembly::Load(info.assembly_name().name.c_str());\n\n            CHECK_IF_NULL(assembly);\n\n            Il2CppImage *image = (Il2CppImage*)Assembly::GetImage(assembly);\n\n            CHECK_IF_NULL(image);\n\n            klass = MetadataCache::GetGenericInstanceType(generic_class, generic_arguments);\n        }\n\n        return klass;\n    }\n\n    static Il2CppClass* ResolveGenericInstanceType(Il2CppClass* klass, const TypeNameParseInfo& info, bool throwOnError, bool ignoreCase)\n    {\n        if (info.has_generic_arguments())\n        {\n            Il2CppTypeVector generic_arguments;\n            generic_arguments.reserve(info.type_arguments().size());\n\n            std::vector<TypeNameParseInfo>::const_iterator it = info.type_arguments().begin();\n            while (it != info.type_arguments().end())\n            {\n                const Il2CppType * generic_argument = Class::il2cpp_type_from_type_info(*it, throwOnError, ignoreCase);\n\n                CHECK_IF_NULL(generic_argument);\n\n                generic_arguments.push_back(generic_argument);\n\n                ++it;\n            }\n\n            klass = resolve_generic_instance_internal(info, klass, generic_arguments, throwOnError);\n\n            CHECK_IF_NULL(klass);\n        }\n\n        if (klass != NULL)\n            Class::Init(klass);\n\n        return klass;\n    }\n\n    static Il2CppClass* resolve_parse_info_internal(const TypeNameParseInfo& info, bool throwOnError, bool ignoreCase)\n    {\n        Il2CppClass *klass = NULL;\n\n        if (info.assembly_name().name.empty())\n        {\n            const Il2CppImage* image = Image::GetExecutingImage();\n            klass = Image::FromTypeNameParseInfo(image, info, ignoreCase);\n\n            if (klass == NULL && image != Image::GetCorlib())\n            {\n                // Try mscorlib\n                image = (Il2CppImage*)Image::GetCorlib();\n                klass = Image::FromTypeNameParseInfo(image, info, ignoreCase);\n            }\n        }\n        else\n        {\n            const Il2CppAssembly *assembly = Assembly::Load(info.assembly_name().name.c_str());\n\n            CHECK_IF_NULL(assembly);\n\n            Il2CppImage *image = (Il2CppImage*)Assembly::GetImage(assembly);\n\n            CHECK_IF_NULL(image);\n\n            klass = Image::FromTypeNameParseInfo(image, info, ignoreCase);\n        }\n\n        return klass;\n    }\n\n    const Il2CppType* Class::il2cpp_type_from_type_info(const TypeNameParseInfo& info, bool throwOnError, bool ignoreCase)\n    {\n        Il2CppClass *klass = resolve_parse_info_internal(info, throwOnError, ignoreCase);\n\n        CHECK_IF_NULL(klass);\n\n        klass = ResolveGenericInstanceType(klass, info, throwOnError, ignoreCase);\n\n        CHECK_IF_NULL(klass);\n\n        const Il2CppType *type = Class::GetType(klass, info);\n\n        CHECK_IF_NULL(type);\n\n        return type;\n    }\n\n    Il2CppClass* Class::GetDeclaringType(Il2CppClass* klass)\n    {\n        return klass->declaringType;\n    }\n\n    NORETURN static void RaiseExceptionForNotFoundInterface(const Il2CppClass* klass, const Il2CppClass* itf, Il2CppMethodSlot slot)\n    {\n        std::string message;\n        message = \"Attempt to access method '\" + Type::GetName(itf->byval_arg, IL2CPP_TYPE_NAME_FORMAT_IL) + \".\" + Method::GetName(itf->methods[slot])\n            + \"' on type '\" + Type::GetName(klass->byval_arg, IL2CPP_TYPE_NAME_FORMAT_IL) + \"' failed.\";\n        Exception::Raise(il2cpp::vm::Exception::GetMethodAccessException(message.c_str()));\n    }\n\n    const VirtualInvokeData& Class::GetInterfaceInvokeDataFromVTableSlowPath(const Il2CppObject* obj, const Il2CppClass* itf, Il2CppMethodSlot slot)\n    {\n        const Il2CppClass* klass = obj->klass;\n\n#if NET_4_0\n        if (itf->generic_class != NULL)\n        {\n            const Il2CppTypeDefinition* genericInterface = MetadataCache::GetTypeDefinitionFromIndex(itf->generic_class->typeDefinitionIndex);\n            const Il2CppGenericContainer* genericContainer = MetadataCache::GetGenericContainerFromIndex(genericInterface->genericContainerIndex);\n\n            for (uint16_t i = 0; i < klass->interface_offsets_count; ++i)\n            {\n                const Il2CppRuntimeInterfaceOffsetPair* pair = klass->interfaceOffsets + i;\n                if (IsGenericClassAssignableFrom(itf, pair->interfaceType, genericContainer))\n                {\n                    IL2CPP_ASSERT(pair->offset + slot < klass->vtable_count);\n                    return klass->vtable[pair->offset + slot];\n                }\n            }\n        }\n#endif\n\n        if (klass->is_import_or_windows_runtime)\n        {\n            Il2CppIUnknown* iunknown = static_cast<const Il2CppComObject*>(obj)->identity;\n\n            // It might be null if it's called on a dead (already released) or fake object\n            if (iunknown != NULL)\n            {\n                if (itf->vtable_count > 0)\n                {\n                    IL2CPP_ASSERT(slot < itf->vtable_count);\n\n                    // Nothing will be referencing these types directly, so we need to initialize them here\n                    const VirtualInvokeData& invokeData = itf->vtable[slot];\n                    Init(invokeData.method->declaring_type);\n                    return invokeData;\n                }\n\n                // TO DO: add support for covariance/contravariance for projected interfaces like\n                // System.Collections.Generic.IEnumerable`1<T>\n            }\n        }\n\n        RaiseExceptionForNotFoundInterface(klass, itf, slot);\n        IL2CPP_UNREACHABLE;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Class.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"blob.h\"\n#include \"class-internals.h\"\n#include \"metadata/Il2CppTypeVector.h\"\n#include \"utils/dynamic_array.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"Exception.h\"\n#include \"Type.h\"\n\n#if NET_4_0\n#include \"vm/MetadataCache.h\"\n#include \"tabledefs.h\"\n#endif\n\n\nstruct Il2CppClass;\nstruct EventInfo;\nstruct FieldInfo;\nstruct PropertyInfo;\nstruct MethodInfo;\n\nstruct Il2CppImage;\nstruct Il2CppReflectionType;\nstruct Il2CppType;\nstruct Il2CppDebugTypeInfo;\nstruct Il2CppGenericContainer;\nstruct Il2CppGenericContext;\nstruct Il2CppGenericParameter;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class TypeNameParseInfo;\n\n    class LIBIL2CPP_CODEGEN_API Class\n    {\n    public:\n        static Il2CppClass* FromIl2CppType(const Il2CppType* type);\n        static Il2CppClass* FromName(const Il2CppImage* image, const char* namespaze, const char *name);\n        static Il2CppClass* FromSystemType(Il2CppReflectionType *type);\n        static Il2CppClass* FromGenericParameter(const Il2CppGenericParameter *param);\n        static Il2CppClass* GetElementClass(Il2CppClass *klass);\n        static const Il2CppType* GetEnumBaseType(Il2CppClass *klass);\n        static const EventInfo* GetEvents(Il2CppClass *klass, void* *iter);\n        static FieldInfo* GetFields(Il2CppClass *klass, void* *iter);\n        static FieldInfo* GetFieldFromName(Il2CppClass *klass, const char* name);\n        static const MethodInfo* GetFinalizer(Il2CppClass *klass);\n        static int32_t GetInstanceSize(const Il2CppClass *klass);\n        static Il2CppClass* GetInterfaces(Il2CppClass *klass, void* *iter);\n        static const MethodInfo* GetMethods(Il2CppClass *klass, void* *iter);\n        static const MethodInfo* GetMethodFromName(Il2CppClass *klass, const char* name, int argsCount);\n        static const MethodInfo* GetMethodFromNameFlags(Il2CppClass *klass, const char* name, int argsCount, int32_t flags);\n        static const char* GetName(Il2CppClass *klass);\n        static const char* GetNamespace(Il2CppClass *klass);\n        static Il2CppClass* GetNestedTypes(Il2CppClass *klass, void* *iter);\n        static size_t GetNumMethods(const Il2CppClass* klass);\n        static size_t GetNumProperties(const Il2CppClass* klass);\n        static size_t GetNumFields(const Il2CppClass* klass);\n        static Il2CppClass* GetParent(Il2CppClass *klass);\n        static const PropertyInfo* GetProperties(Il2CppClass *klass, void* *iter);\n        static const PropertyInfo* GetPropertyFromName(Il2CppClass *klass, const char* name);\n        static int32_t GetValueSize(Il2CppClass *klass, uint32_t *align);\n        static bool HasParent(Il2CppClass *klass, Il2CppClass *parent);\n        // we assume that the Il2CppClass's have already been initialized in this case, like in code generation\n        static bool HasParentUnsafe(const Il2CppClass* klass, const Il2CppClass* parent) { return klass->typeHierarchyDepth >= parent->typeHierarchyDepth && klass->typeHierarchy[parent->typeHierarchyDepth - 1] == parent; }\n        static bool IsAssignableFrom(Il2CppClass *klass, Il2CppClass *oklass);\n        static bool IsGeneric(const Il2CppClass *klass);\n        static bool IsInflated(const Il2CppClass *klass);\n        static bool IsSubclassOf(Il2CppClass *klass, Il2CppClass *klassc, bool check_interfaces);\n        static bool IsValuetype(const Il2CppClass *klass);\n        static bool IsBlittable(const Il2CppClass *klass);\n        static bool HasDefaultConstructor(Il2CppClass* klass);\n        static int GetFlags(const Il2CppClass *klass);\n        static bool IsAbstract(const Il2CppClass *klass);\n        static bool IsInterface(const Il2CppClass *klass);\n        static bool IsNullable(const Il2CppClass *klass);\n        static Il2CppClass* GetNullableArgument(const Il2CppClass* klass);\n        static int GetArrayElementSize(const Il2CppClass *klass);\n        static const Il2CppType* GetType(Il2CppClass *klass);\n        static const Il2CppType* GetType(Il2CppClass *klass, const TypeNameParseInfo &info);\n        static bool HasAttribute(Il2CppClass *klass, Il2CppClass *attr_class);\n        static bool IsEnum(const Il2CppClass *klass);\n        static const Il2CppImage* GetImage(Il2CppClass* klass);\n        static const Il2CppDebugTypeInfo *GetDebugInfo(const Il2CppClass *klass);\n        static const char *GetAssemblyName(const Il2CppClass *klass);\n\n    public:\n        //internal\n        static FORCE_INLINE const VirtualInvokeData& GetInterfaceInvokeDataFromVTable(const Il2CppObject* obj, const Il2CppClass* itf, Il2CppMethodSlot slot)\n        {\n            const Il2CppClass* klass = obj->klass;\n            IL2CPP_ASSERT(klass->initialized);\n            IL2CPP_ASSERT(slot < itf->method_count);\n\n            for (uint16_t i = 0; i < klass->interface_offsets_count; i++)\n            {\n                if (klass->interfaceOffsets[i].interfaceType == itf)\n                {\n                    int32_t offset = klass->interfaceOffsets[i].offset;\n                    IL2CPP_ASSERT(offset != -1);\n                    IL2CPP_ASSERT(offset + slot < klass->vtable_count);\n                    return klass->vtable[offset + slot];\n                }\n            }\n\n            return GetInterfaceInvokeDataFromVTableSlowPath(obj, itf, slot);\n        }\n\n        static bool Init(Il2CppClass *klass);\n\n        static Il2CppClass* GetArrayClass(Il2CppClass *element_class, uint32_t rank);\n        static Il2CppClass* GetBoundedArrayClass(Il2CppClass *element_class, uint32_t rank, bool bounded);\n        static Il2CppClass* GetInflatedGenericInstanceClass(Il2CppClass* klass, const metadata::Il2CppTypeVector& types);\n        static Il2CppClass* GetInflatedGenericInstanceClass(Il2CppClass* klass, const Il2CppGenericInst* genericInst);\n        static Il2CppClass* InflateGenericClass(Il2CppClass* klass, Il2CppGenericContext *context);\n        static const Il2CppType* InflateGenericType(const Il2CppType* type, Il2CppGenericContext *context);\n\n        static Il2CppClass* GetArrayClassCached(Il2CppClass *element_class, uint32_t rank)\n        {\n            return GetArrayClass(element_class, rank);\n        }\n\n        static const Il2CppGenericContainer* GetGenericContainer(Il2CppClass *klass);\n        static const MethodInfo* GetCCtor(Il2CppClass *klass);\n        static const char* GetFieldDefaultValue(const FieldInfo *field, const Il2CppType** type);\n        static int GetFieldMarshaledSize(const FieldInfo *field);\n        static Il2CppClass* GetPtrClass(const Il2CppType* type);\n        static Il2CppClass* GetPtrClass(Il2CppClass* elementClass);\n        static bool HasReferences(Il2CppClass *klass);\n        static void SetupEvents(Il2CppClass *klass);\n        static void SetupFields(Il2CppClass *klass);\n        static void SetupMethods(Il2CppClass *klass);\n        static void SetupNestedTypes(Il2CppClass *klass);\n        static void SetupProperties(Il2CppClass *klass);\n        static void SetupTypeHierarchy(Il2CppClass *klass);\n        static void SetupInterfaces(Il2CppClass *klass);\n\n        static const il2cpp::utils::dynamic_array<Il2CppClass*>& GetStaticFieldData();\n\n        static size_t GetBitmapSize(const Il2CppClass* klass);\n        static void GetBitmap(Il2CppClass* klass, size_t* bitmap, size_t& maxSetBit);\n\n        static const Il2CppType* il2cpp_type_from_type_info(const TypeNameParseInfo& info, bool throwOnError, bool ignoreCase);\n\n        static Il2CppClass* GetDeclaringType(Il2CppClass* klass);\n    private:\n#if NET_4_0\n        static FORCE_INLINE bool IsGenericClassAssignableFrom(const Il2CppClass* klass, const Il2CppClass* oklass, const Il2CppGenericContainer* genericContainer)\n        {\n            const Il2CppGenericClass* genericClass = klass->generic_class;\n            const Il2CppGenericClass* oGenericClass = oklass->generic_class;\n\n            if (oGenericClass == NULL || oGenericClass->typeDefinitionIndex != genericClass->typeDefinitionIndex)\n                return false;\n\n            const int32_t genericParameterCount = genericContainer->type_argc;\n\n            const Il2CppGenericInst* genericInst = genericClass->context.class_inst;\n            IL2CPP_ASSERT(genericInst->type_argc == genericParameterCount);\n\n            const Il2CppGenericInst* oGenericInst = oGenericClass->context.class_inst;\n            IL2CPP_ASSERT(oGenericInst->type_argc == genericParameterCount);\n\n            for (int32_t i = 0; i < genericParameterCount; ++i)\n            {\n                const Il2CppGenericParameter* genericParameter = MetadataCache::GetGenericParameterFromIndex(genericContainer->genericParameterStart + i);\n                const int32_t parameterVariance = genericParameter->flags & GENERIC_PARAMETER_ATTRIBUTE_VARIANCE_MASK;\n                Il2CppClass* genericParameterType = Class::FromIl2CppType(genericInst->type_argv[i]);\n                Il2CppClass* oGenericParameterType = Class::FromIl2CppType(oGenericInst->type_argv[i]);\n\n                if (parameterVariance == GENERIC_PARAMETER_ATTRIBUTE_NON_VARIANT || Class::IsValuetype(genericParameterType) || Class::IsValuetype(oGenericParameterType))\n                {\n                    if (genericParameterType != oGenericParameterType)\n                        return false;\n                }\n                else if (parameterVariance == GENERIC_PARAMETER_ATTRIBUTE_COVARIANT)\n                {\n                    if (!Class::IsAssignableFrom(genericParameterType, oGenericParameterType))\n                        return false;\n                }\n                else\n                {\n                    IL2CPP_ASSERT(parameterVariance == GENERIC_PARAMETER_ATTRIBUTE_CONTRAVARIANT);\n                    if (!Class::IsAssignableFrom(oGenericParameterType, genericParameterType))\n                        return false;\n                }\n            }\n\n            return true;\n        }\n\n#endif\n\n        // we don't want this method to get inlined because that makes GetInterfaceInvokeDataFromVTable method itself very large and performance suffers\n        static IL2CPP_NO_INLINE const VirtualInvokeData& GetInterfaceInvokeDataFromVTableSlowPath(const Il2CppObject* obj, const Il2CppClass* itf, Il2CppMethodSlot slot);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/ComObjectBase.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"metadata/GenericMetadata.h\"\n#include \"vm/Class.h\"\n#include \"vm/ComObjectBase.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/MetadataCache.h\"\n\nusing namespace il2cpp::vm;\n\nil2cpp_hresult_t STDCALL ComObjectBase::GetRuntimeClassName(Il2CppHString* className)\n{\n    Il2CppClass* objectClass = GetManagedObjectInline()->klass;\n    if (il2cpp_defaults.ireference_class != NULL && !Class::IsInflated(objectClass) && (Class::IsValuetype(objectClass) || objectClass == il2cpp_defaults.string_class))\n    {\n        // For value types/strings we're supposed to return the name of its boxed representation, i.e. Windows.Foundation.IReference`1<T>\n        const Il2CppGenericInst* inst = MetadataCache::GetGenericInst(&objectClass->byval_arg, 1);\n        Il2CppGenericClass* genericClass = metadata::GenericMetadata::GetGenericClass(il2cpp_defaults.ireference_class, inst);\n        objectClass = GenericClass::GetClass(genericClass);\n    }\n\n    const char* name = MetadataCache::GetWindowsRuntimeClassName(objectClass);\n    if (name == NULL)\n    {\n        *className = NULL;\n        return IL2CPP_S_OK;\n    }\n\n    UTF16String nameUtf16 = utils::StringUtils::Utf8ToUtf16(name);\n    return os::WindowsRuntime::CreateHString(utils::StringView<Il2CppChar>(nameUtf16.c_str(), nameUtf16.length()), className);\n}\n\nil2cpp_hresult_t STDCALL ComObjectBase::GetTrustLevel(int32_t* trustLevel)\n{\n    *trustLevel = 0;\n    return IL2CPP_S_OK;\n}\n\nIl2CppObject* STDCALL ComObjectBase::GetManagedObject()\n{\n    return GetManagedObjectInline();\n}\n\nil2cpp_hresult_t STDCALL ComObjectBase::GetUnmarshalClass(const Il2CppGuid& iid, void* object, uint32_t context, void* reserved, uint32_t flags, Il2CppGuid* clsid)\n{\n    Il2CppIMarshal* freeThreadedMarshaler;\n    il2cpp_hresult_t hr = GetFreeThreadedMarshalerNoAddRef(&freeThreadedMarshaler);\n    if (IL2CPP_HR_FAILED(hr))\n        return hr;\n\n    return freeThreadedMarshaler->GetUnmarshalClass(iid, object, context, reserved, flags, clsid);\n}\n\nil2cpp_hresult_t STDCALL ComObjectBase::GetMarshalSizeMax(const Il2CppGuid& iid, void* object, uint32_t context, void* reserved, uint32_t flags, uint32_t* size)\n{\n    Il2CppIMarshal* freeThreadedMarshaler;\n    il2cpp_hresult_t hr = GetFreeThreadedMarshalerNoAddRef(&freeThreadedMarshaler);\n    if (IL2CPP_HR_FAILED(hr))\n        return hr;\n\n    return freeThreadedMarshaler->GetMarshalSizeMax(iid, object, context, reserved, flags, size);\n}\n\nil2cpp_hresult_t STDCALL ComObjectBase::MarshalInterface(Il2CppIStream* stream, const Il2CppGuid& iid, void* object, uint32_t context, void* reserved, uint32_t flags)\n{\n    Il2CppIMarshal* freeThreadedMarshaler;\n    il2cpp_hresult_t hr = GetFreeThreadedMarshalerNoAddRef(&freeThreadedMarshaler);\n    if (IL2CPP_HR_FAILED(hr))\n        return hr;\n\n    return freeThreadedMarshaler->MarshalInterface(stream, iid, object, context, reserved, flags);\n}\n\nil2cpp_hresult_t STDCALL ComObjectBase::UnmarshalInterface(Il2CppIStream* stream, const Il2CppGuid& iid, void** object)\n{\n    Il2CppIMarshal* freeThreadedMarshaler;\n    il2cpp_hresult_t hr = GetFreeThreadedMarshalerNoAddRef(&freeThreadedMarshaler);\n    if (IL2CPP_HR_FAILED(hr))\n        return hr;\n\n    return freeThreadedMarshaler->UnmarshalInterface(stream, iid, object);\n}\n\nil2cpp_hresult_t STDCALL ComObjectBase::ReleaseMarshalData(Il2CppIStream* stream)\n{\n    Il2CppIMarshal* freeThreadedMarshaler;\n    il2cpp_hresult_t hr = GetFreeThreadedMarshalerNoAddRef(&freeThreadedMarshaler);\n    if (IL2CPP_HR_FAILED(hr))\n        return hr;\n\n    return freeThreadedMarshaler->ReleaseMarshalData(stream);\n}\n\nil2cpp_hresult_t STDCALL ComObjectBase::DisconnectObject(uint32_t reserved)\n{\n    Il2CppIMarshal* freeThreadedMarshaler;\n    il2cpp_hresult_t hr = GetFreeThreadedMarshalerNoAddRef(&freeThreadedMarshaler);\n    if (IL2CPP_HR_FAILED(hr))\n        return hr;\n\n    return freeThreadedMarshaler->DisconnectObject(reserved);\n}\n\nil2cpp_hresult_t ComObjectBase::GetFreeThreadedMarshalerNoAddRef(Il2CppIMarshal** destination)\n{\n    Il2CppIMarshal* freeThreadedMarshaler = m_FreeThreadedMarshaler;\n    if (freeThreadedMarshaler == NULL)\n    {\n        // We don't really want to aggregate FTM, as then we'd have to store its IUnknown too\n        // So we pass NULL as the first parameter\n        Il2CppIUnknown* freeThreadedMarshalerUnknown;\n        il2cpp_hresult_t hr = COM::CreateFreeThreadedMarshaler(NULL, &freeThreadedMarshalerUnknown);\n        if (IL2CPP_HR_FAILED(hr))\n            return hr;\n\n        hr = freeThreadedMarshalerUnknown->QueryInterface(Il2CppIMarshal::IID, reinterpret_cast<void**>(&freeThreadedMarshaler));\n        freeThreadedMarshalerUnknown->Release();\n        if (IL2CPP_HR_FAILED(hr))\n            return hr;\n\n        if (Atomic::CompareExchangePointer<Il2CppIMarshal>(&m_FreeThreadedMarshaler, freeThreadedMarshaler, NULL) != NULL)\n        {\n            freeThreadedMarshaler->Release();\n            freeThreadedMarshaler = m_FreeThreadedMarshaler;\n        }\n    }\n\n    *destination = freeThreadedMarshaler;\n    return IL2CPP_S_OK;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/ComObjectBase.h",
    "content": "#pragma once\n\n#include \"gc/GCHandle.h\"\n#include \"il2cpp-string-types.h\"\n#include \"os/WindowsRuntime.h\"\n#include \"vm/Atomic.h\"\n#include \"vm/COM.h\"\n#include \"vm/Exception.h\"\n#include \"vm/MarshalAlloc.h\"\n#include \"vm/WindowsRuntime.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n\nstruct Il2CppObject;\nstruct Il2CppIUnknown;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    struct LIBIL2CPP_CODEGEN_API NOVTABLE ComObjectBase : Il2CppIInspectable, Il2CppIMarshal, Il2CppIManagedObjectHolder\n    {\n    private:\n        Il2CppIMarshal* m_FreeThreadedMarshaler;\n        Il2CppObject* m_ManagedObject;\n\n    public:\n        inline ComObjectBase(Il2CppObject* obj) :\n            m_ManagedObject(obj),\n            m_FreeThreadedMarshaler(NULL)\n        {\n            IL2CPP_ASSERT(obj != NULL);\n        }\n\n        inline ~ComObjectBase()\n        {\n            if (m_FreeThreadedMarshaler)\n                m_FreeThreadedMarshaler->Release();\n        }\n\n        virtual il2cpp_hresult_t STDCALL GetRuntimeClassName(Il2CppHString* className) IL2CPP_OVERRIDE;\n        virtual il2cpp_hresult_t STDCALL GetTrustLevel(int32_t* trustLevel) IL2CPP_OVERRIDE;\n        virtual Il2CppObject* STDCALL GetManagedObject() IL2CPP_OVERRIDE;\n        virtual il2cpp_hresult_t STDCALL GetUnmarshalClass(const Il2CppGuid& iid, void* object, uint32_t context, void* reserved, uint32_t flags, Il2CppGuid* clsid) IL2CPP_OVERRIDE;\n        virtual il2cpp_hresult_t STDCALL GetMarshalSizeMax(const Il2CppGuid& iid, void* object, uint32_t context, void* reserved, uint32_t flags, uint32_t* size) IL2CPP_OVERRIDE;\n        virtual il2cpp_hresult_t STDCALL MarshalInterface(Il2CppIStream* stream, const Il2CppGuid& iid, void* object, uint32_t context, void* reserved, uint32_t flags) IL2CPP_OVERRIDE;\n        virtual il2cpp_hresult_t STDCALL UnmarshalInterface(Il2CppIStream* stream, const Il2CppGuid& iid, void** object) IL2CPP_OVERRIDE;\n        virtual il2cpp_hresult_t STDCALL ReleaseMarshalData(Il2CppIStream* stream) IL2CPP_OVERRIDE;\n        virtual il2cpp_hresult_t STDCALL DisconnectObject(uint32_t reserved) IL2CPP_OVERRIDE;\n\n        FORCE_INLINE Il2CppObject* GetManagedObjectInline() const\n        {\n            return m_ManagedObject;\n        }\n\n    protected:\n        FORCE_INLINE Il2CppIInspectable* GetIdentity()\n        {\n            return this;\n        }\n\n    private:\n        ComObjectBase(const ComObjectBase&);\n        ComObjectBase& operator=(const ComObjectBase&);\n\n        il2cpp_hresult_t GetFreeThreadedMarshalerNoAddRef(Il2CppIMarshal** destination);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Debug.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#if IL2CPP_DEBUGGER_ENABLED\n\n#include <assert.h>\n\n#include \"../class-internals.h\"\n#include \"vm/Object.h\"\n#include \"vm/Debug.h\"\n#include \"vm/StackTrace.h\"\n#include \"vm/Type.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    const Il2CppDebugDocument *Debug::GetDocument(const Il2CppDebugTypeInfo *info)\n    {\n        return info->document;\n    }\n\n    const char *Debug::DocumentGetFilename(const Il2CppDebugDocument *document)\n    {\n        return document->filename;\n    }\n\n    const char *Debug::DocumentGetDirectory(const Il2CppDebugDocument *document)\n    {\n        return document->directory;\n    }\n\n    const Il2CppDebugDocument* Debug::GetDocument(const Il2CppDebugMethodInfo* info)\n    {\n        return info->document;\n    }\n\n    const int32_t* Debug::GetOffsetTable(const Il2CppDebugMethodInfo* info)\n    {\n        return info->offsets_table;\n    }\n\n    size_t Debug::GetCodeSize(const Il2CppDebugMethodInfo* info)\n    {\n        return info->code_size;\n    }\n\n    void Debug::UpdateFrameIlOffset(int32_t il_offset)\n    {\n        IL2CPP_ASSERT(0 && \"Not implemented\");\n    }\n\n    const Il2CppDebugLocalsInfo **Debug::GetLocalsInfo(const Il2CppDebugMethodInfo* info)\n    {\n        return info->locals;\n    }\n\n    const Il2CppClass *Debug::GetType(const Il2CppDebugLocalsInfo *info)\n    {\n        return info->type;\n    }\n\n    const char *Debug::GetName(const Il2CppDebugLocalsInfo *info)\n    {\n        return info->name;\n    }\n\n    uint32_t Debug::GetStartOffset(const Il2CppDebugLocalsInfo *info)\n    {\n        return info->start_offset;\n    }\n\n    uint32_t Debug::GetEndOffset(const Il2CppDebugLocalsInfo *info)\n    {\n        return info->end_offset;\n    }\n\n    Il2CppObject *Debug::GetParamValue(const Il2CppStackFrameInfo *info, uint32_t position)\n    {\n        IL2CPP_ASSERT(info != 0 && \"Debug::GetParamValue cannot be invoked on a null Il2CppDebugMethodInfo.\");\n        IL2CPP_ASSERT(position < info->method->parameters_count && \"Debug::GetParamValue was invoked with an outside of range position\");\n\n        Il2CppClass *param_type = Type::GetClass(info->method->parameters[position].parameter_type);\n        void *param_addr = info->params[position];\n\n        if (param_type->valuetype)\n            return Object::Box(param_type, param_addr);\n\n        return static_cast<Il2CppObject*>(param_addr);\n    }\n\n    Il2CppObject *Debug::GetLocalValue(const Il2CppStackFrameInfo *info, uint32_t position)\n    {\n        IL2CPP_ASSERT(info != 0 && \"Debug::GetLocalValue cannot be invoked on a null Il2CppDebugMethodInfo.\");\n        IL2CPP_ASSERT(position < info->locals_count && \"Debug::GetLocalValue was invoked with an outside of range position\");\n\n        Il2CppClass *local_type = info->method->debug_info->locals[position]->type;\n        void *local_addr = info->locals[position];\n\n        if (local_type->valuetype)\n            return Object::Box(local_type, local_addr);\n\n        return static_cast<Il2CppObject*>(local_addr);\n    }\n\n    void *Debug::GetBreakpointDataAt(const Il2CppDebugMethodInfo* info, int64_t uid, int32_t offset)\n    {\n        IL2CPP_ASSERT(info != 0 && \"Debug::GetBreakpointDataAt cannot be invoked on a null Il2CppDebugMethodInfo.\");\n        IL2CPP_ASSERT(offset < info->code_size && \"Debug::GetBreakpointDataAt invoked with an invalid offset.\");\n\n        if (uid < 0)\n            return NULL;\n\n        SequencePointRecord *record = &info->sequence_points[uid];\n\n        IL2CPP_ASSERT(record->start_offset <= offset && record->end_offset >= offset && \"Debug::GetBreakpointDataAt invoked with an invalid offset (or sequnce point not matching).\");\n\n        return record->user_data;\n    }\n\n    void Debug::SetBreakpointDataAt(const Il2CppDebugMethodInfo* info, uint64_t location, void *data)\n    {\n        IL2CPP_ASSERT(info != 0 && \"Debug::SetBreakpointDataAt be invoked on a null Il2CppDebugMethodInfo.\");\n        IL2CPP_ASSERT(location < info->code_size && \"Debug::SetBreakpointDataAt invoked with an invalid location.\");\n\n        SequencePointRecord *found = NULL;\n\n        for (int32_t i = 0; i < info->sequence_points_count; ++i)\n        {\n            SequencePointRecord *record = &info->sequence_points[i];\n\n            if (location < record->start_offset)\n                continue;\n\n            if (record->end_offset < location)\n                continue;\n\n            found = record;\n            break;\n        }\n\n        IL2CPP_ASSERT(found && \"Debug::SetBreakpointDataAt invoked with an invalid location.\");\n\n        found->user_data = data;\n    }\n\n    void Debug::ClearBreakpointData(const Il2CppDebugMethodInfo* info)\n    {\n        IL2CPP_ASSERT(info != 0 && \"Debug::ClearBreakpointData be invoked on a null Il2CppDebugMethodInfo.\");\n\n        for (int32_t i = 0; i < info->sequence_points_count; ++i)\n        {\n            SequencePointRecord *record = &info->sequence_points[i];\n\n            record->user_data = NULL;\n        }\n    }\n\n    void Debug::ClearBreakpointDataAt(const Il2CppDebugMethodInfo* info, uint64_t location)\n    {\n        IL2CPP_ASSERT(info != 0 && \"Debug::ClearBreakpointDataAt be invoked on a null Il2CppDebugMethodInfo.\");\n\n        SequencePointRecord *found = NULL;\n\n        for (int32_t i = 0; i < info->sequence_points_count; ++i)\n        {\n            SequencePointRecord *record = &info->sequence_points[i];\n\n            if (location < record->start_offset)\n                continue;\n\n            if (record->end_offset < location)\n                continue;\n\n            found = record;\n            break;\n        }\n\n        IL2CPP_ASSERT(found && \"Debug::ClearBreakpointDataAt invoked with an invalid location.\");\n\n        found->user_data = NULL;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Debug.h",
    "content": "#pragma once\n#include \"il2cpp-config.h\"\nstruct Il2CppThread;\nstruct Il2CppDebugDocument;\nstruct Il2CppDebugTypeInfo;\nstruct Il2CppDebugMethodInfo;\nstruct Il2CppDebugLocalsInfo;\nstruct Il2CppStackFrameInfo;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Debug\n    {\n    public:\n\n        static const Il2CppDebugDocument* GetDocument(const Il2CppDebugTypeInfo* type);\n        static const char *DocumentGetFilename(const Il2CppDebugDocument *document);\n        static const char *DocumentGetDirectory(const Il2CppDebugDocument *document);\n        static const Il2CppDebugDocument* GetDocument(const Il2CppDebugMethodInfo* info);\n        static const int32_t* GetOffsetTable(const Il2CppDebugMethodInfo* info);\n        static size_t GetCodeSize(const Il2CppDebugMethodInfo* info);\n        static void UpdateFrameIlOffset(int32_t il_offset);\n        static const Il2CppDebugLocalsInfo **GetLocalsInfo(const Il2CppDebugMethodInfo* info);\n        static const Il2CppClass *GetType(const Il2CppDebugLocalsInfo *info);\n        static const char *GetName(const Il2CppDebugLocalsInfo *info);\n        static uint32_t GetStartOffset(const Il2CppDebugLocalsInfo *info);\n        static uint32_t GetEndOffset(const Il2CppDebugLocalsInfo *info);\n        static Il2CppObject *GetParamValue(const Il2CppStackFrameInfo *info, uint32_t position);\n        static Il2CppObject *GetLocalValue(const Il2CppStackFrameInfo *info, uint32_t position);\n        static void *GetBreakpointDataAt(const Il2CppDebugMethodInfo* info, int64_t uid, int32_t offset);\n        static void SetBreakpointDataAt(const Il2CppDebugMethodInfo* info, uint64_t location, void *data);\n        static void ClearBreakpointData(const Il2CppDebugMethodInfo* info);\n        static void ClearBreakpointDataAt(const Il2CppDebugMethodInfo* info, uint64_t location);\n\n    public:\n        //internal\n\n    private:\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Domain.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"vm/Class.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Object.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Thread.h\"\n#include \"gc/GarbageCollector.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    Il2CppDomain* Domain::S_domain = NULL;\n\n    Il2CppDomain* Domain::GetCurrent()\n    {\n        if (S_domain)\n            return S_domain;\n\n        // allocate using gc memory since we hold onto object references\n        S_domain = (Il2CppDomain*)il2cpp::gc::GarbageCollector::AllocateFixed(sizeof(Il2CppDomain), NULL);\n\n        return S_domain;\n    }\n\n    Il2CppDomain* Domain::GetRoot()\n    {\n        // just one domain for now\n        return GetCurrent();\n    }\n\n    void Domain::ContextInit(Il2CppDomain *domain)\n    {\n        Il2CppClass* klass = Class::FromName(il2cpp_defaults.corlib, \"System.Runtime.Remoting.Contexts\", \"Context\");\n        Il2CppAppContext* context = (Il2CppAppContext*)Object::New(klass);\n\n        // To match Mono's implementation we do not call the constructor here. If we do, context_id will be 1, which\n        // is not correct.\n        context->domain_id = domain->domain_id;\n        context->context_id = 0;\n\n        domain->default_context = context;\n    }\n\n    void Domain::ContextSet(Il2CppAppContext* context)\n    {\n        IL2CPP_OBJECT_SETREF(il2cpp::vm::Thread::Current()->GetInternalThread(), current_appcontext, (Il2CppObject*)context);\n    }\n\n    Il2CppAppContext* Domain::ContextGet()\n    {\n        return (Il2CppAppContext*)il2cpp::vm::Thread::Current()->GetInternalThread()->current_appcontext;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Domain.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\nstruct Il2CppDomain;\nstruct Il2CppAppContext;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Domain\n    {\n    public:\n        static Il2CppDomain* GetCurrent();\n        static Il2CppDomain* GetRoot();\n        static void ContextInit(Il2CppDomain *domain);\n        static void ContextSet(Il2CppAppContext* context);\n        static Il2CppAppContext* ContextGet();\n\n    private:\n        static Il2CppDomain* S_domain;\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Enum.cpp",
    "content": "#include \"vm/Enum.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/Field.h\"\n#include \"vm/String.h\"\n#include \"vm/Type.h\"\n#include \"utils/MemoryRead.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n#if NET_4_0\n    static uint64_t GetEnumFieldValue(Il2CppClass* enumType, FieldInfo* field)\n    {\n        const Il2CppType* type = NULL;\n        const char* ptr = Class::GetFieldDefaultValue(field, &type);\n\n        switch (Class::GetEnumBaseType(enumType)->type)\n        {\n            case IL2CPP_TYPE_I1: // Sign extend\n                return static_cast<int64_t>(static_cast<int8_t>(*ptr));\n\n            case IL2CPP_TYPE_U1:\n                return (uint8_t)*ptr;\n\n            case IL2CPP_TYPE_CHAR:\n                return utils::ReadChar(ptr);\n\n            case IL2CPP_TYPE_I2: // Sign extend\n                return static_cast<int64_t>(static_cast<int16_t>(utils::Read16(ptr)));\n\n            case IL2CPP_TYPE_U2:\n                return utils::Read16(ptr);\n\n            case IL2CPP_TYPE_I4: // Sign extend\n                return static_cast<int64_t>(static_cast<int32_t>(utils::Read32(ptr)));\n\n            case IL2CPP_TYPE_U4:\n                return utils::Read32(ptr);\n\n            case IL2CPP_TYPE_U8:\n            case IL2CPP_TYPE_I8:\n                return utils::Read64(ptr);\n\n            default:\n                IL2CPP_ASSERT(0);\n                return 0;\n        }\n    }\n\n#endif\n\n    bool Enum::GetEnumValuesAndNames(Il2CppClass* enumType, Il2CppArray** values, Il2CppArray** names)\n    {\n        size_t nvalues = Class::GetNumFields(enumType) ? Class::GetNumFields(enumType) - 1 : 0;\n        bool sorted = true;\n\n#if !NET_4_0\n        *values = vm::Array::New(enumType, (il2cpp_array_size_t)nvalues);\n#else\n        *values = vm::Array::New(il2cpp_defaults.uint64_class, (il2cpp_array_size_t)nvalues);\n        uint64_t field_value, previous_value = 0;\n#endif\n        *names = vm::Array::New(il2cpp_defaults.string_class, (il2cpp_array_size_t)nvalues);\n        // TODO: write barriers!\n\n        if (enumType->generic_class)\n            enumType = GenericClass::GetTypeDefinition(enumType->generic_class);\n\n        FieldInfo* field;\n        void* iter = NULL;\n\n        int j = 0;\n        while ((field = Class::GetFields(enumType, &iter)))\n        {\n            if (strcmp(\"value__\", field->name) == 0)\n                continue;\n\n            if (Field::IsDeleted(field))\n                continue;\n\n            il2cpp_array_setref(*names, j, il2cpp::vm::String::New(Field::GetName(field)));\n\n#if !NET_4_0\n            const Il2CppType* type = NULL;\n            const char *p = Class::GetFieldDefaultValue(field, &type);\n\n            switch (Class::GetEnumBaseType(enumType)->type)\n            {\n                case IL2CPP_TYPE_U1:\n                case IL2CPP_TYPE_I1:\n                    il2cpp_array_set(*values, uint8_t, j, *p);\n                    break;\n                case IL2CPP_TYPE_CHAR:\n                    il2cpp_array_set(*values, Il2CppChar, j, utils::ReadChar(p));\n                    break;\n                case IL2CPP_TYPE_U2:\n                case IL2CPP_TYPE_I2:\n                    il2cpp_array_set(*values, uint16_t, j, utils::Read16(p));\n                    break;\n                case IL2CPP_TYPE_U4:\n                case IL2CPP_TYPE_I4:\n                    il2cpp_array_set(*values, uint32_t, j, utils::Read32(p));\n                    break;\n                case IL2CPP_TYPE_U8:\n                case IL2CPP_TYPE_I8:\n                    il2cpp_array_set(*values, uint64_t, j, utils::Read64(p));\n                    break;\n                default:\n                    IL2CPP_ASSERT(0);\n            }\n#else\n            field_value = GetEnumFieldValue(enumType, field);\n            il2cpp_array_set(*values, uint64_t, j, field_value);\n\n            if (previous_value > field_value)\n                sorted = false;\n\n            previous_value = field_value;\n#endif\n\n            j++;\n        }\n\n        return sorted;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Enum.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Enum\n    {\n    public:\n        // exported\n        static bool GetEnumValuesAndNames(Il2CppClass* enumType, Il2CppArray** values, Il2CppArray** names);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Event.cpp",
    "content": "#include \"vm/Event.h\"\n#include \"class-internals.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    uint32_t Event::GetToken(const EventInfo *eventInfo)\n    {\n        return eventInfo->token;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Event.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct EventInfo;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Event\n    {\n    public:\n        // exported\n        static uint32_t GetToken(const EventInfo *eventInfo);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Exception.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/MarshalStringAlloc.h\"\n#include \"os/WindowsRuntime.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Object.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/StackTrace.h\"\n#include \"vm/String.h\"\n#include \"Image.h\"\n#include \"../utils/StringUtils.h\"\n#include \"tabledefs.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    NORETURN void Exception::Raise(Il2CppException* ex)\n    {\n        if (ex->trace_ips == NULL)\n        {\n            // Only write the stack trace if there is not one already in the exception.\n            // When we exit managed try/finally and try/catch blocks with an exception, this method is\n            // called with the original exception which already has the proper stack trace.\n            // Getting the stack trace again here will lose the frames between the original throw\n            // and the finally or catch block.\n            const StackFrames& frames = *StackTrace::GetStackFrames();\n            size_t i = frames.size() - 1;\n            Il2CppArray* ips = Array::New(il2cpp_defaults.int_class, (il2cpp_array_size_t)frames.size());\n            for (StackFrames::const_iterator iter = frames.begin(); iter != frames.end(); ++iter, --i)\n            {\n                il2cpp_array_set(ips, const MethodInfo*, i, (*iter).method);\n            }\n\n            IL2CPP_OBJECT_SETREF(ex, trace_ips, ips);\n        }\n\n        throw Il2CppExceptionWrapper(ex);\n    }\n\n    NORETURN void Exception::RaiseOutOfMemoryException()\n    {\n        RaiseOutOfMemoryException(utils::StringView<Il2CppChar>::Empty());\n    }\n\n    NORETURN void Exception::RaiseOutOfMemoryException(const utils::StringView<Il2CppChar>& msg)\n    {\n        Raise(GetOutOfMemoryException(msg));\n    }\n\n    NORETURN void Exception::RaiseNullReferenceException()\n    {\n        RaiseNullReferenceException(utils::StringView<Il2CppChar>::Empty());\n    }\n\n    NORETURN void Exception::RaiseNullReferenceException(const utils::StringView<Il2CppChar>& msg)\n    {\n        Raise(GetNullReferenceException(msg));\n    }\n\n    NORETURN void Exception::RaiseDivideByZeroException()\n    {\n        Raise(GetDivideByZeroException());\n    }\n\n    NORETURN void Exception::RaiseOverflowException()\n    {\n        Raise(GetOverflowException());\n    }\n\n    NORETURN void Exception::RaiseArgumentOutOfRangeException(const char* msg)\n    {\n        Raise(GetArgumentOutOfRangeException(msg));\n    }\n\n    inline static Il2CppException* TryGetExceptionFromRestrictedErrorInfo(Il2CppIRestrictedErrorInfo* errorInfo)\n    {\n        Il2CppILanguageExceptionErrorInfo* languageExceptionInfo;\n        il2cpp_hresult_t hr = errorInfo->QueryInterface(Il2CppILanguageExceptionErrorInfo::IID, reinterpret_cast<void**>(&languageExceptionInfo));\n        if (IL2CPP_HR_SUCCEEDED(hr))\n        {\n            Il2CppIUnknown* languageException;\n            hr = languageExceptionInfo->GetLanguageException(&languageException);\n            languageExceptionInfo->Release();\n\n            if (IL2CPP_HR_SUCCEEDED(hr) && languageException != NULL) // It can succeed and return null exception if there's no exception info\n            {\n                Il2CppIManagedObjectHolder* managedObjectHolder;\n                hr = languageException->QueryInterface(Il2CppIManagedObjectHolder::IID, reinterpret_cast<void**>(&managedObjectHolder));\n                languageException->Release();\n\n                if (IL2CPP_HR_SUCCEEDED(hr))\n                {\n                    Il2CppException* exception = reinterpret_cast<Il2CppException*>(managedObjectHolder->GetManagedObject());\n                    managedObjectHolder->Release();\n\n                    // TODO: set restricted error info instead of releaseing it here\n                    errorInfo->Release();\n                    return exception;\n                }\n            }\n        }\n\n        return NULL;\n    }\n\n    inline static UTF16String GetMessageFromRestrictedErrorInfo(Il2CppIRestrictedErrorInfo* errorInfo)\n    {\n        UTF16String result;\n        il2cpp_hresult_t error;\n        Il2CppChar* bstrDescription;\n        Il2CppChar* bstrRestrictedDescription;\n        Il2CppChar* bstrCapabilitySid;\n\n        il2cpp_hresult_t hr = errorInfo->GetErrorDetails(&bstrDescription, &error, &bstrRestrictedDescription, &bstrCapabilitySid);\n        if (IL2CPP_HR_SUCCEEDED(hr))\n        {\n            int descriptionLength = 0;\n            int restrictedDescriptionLength = 0;\n\n            if (bstrDescription != NULL)\n                os::MarshalStringAlloc::GetBStringLength(bstrDescription, &descriptionLength);\n\n            if (bstrRestrictedDescription != NULL)\n                os::MarshalStringAlloc::GetBStringLength(bstrRestrictedDescription, &restrictedDescriptionLength);\n\n            result.append(bstrDescription, descriptionLength);\n            if (restrictedDescriptionLength > 0)\n            {\n                result.append(kIl2CppNewLine);\n                result.append(bstrRestrictedDescription, restrictedDescriptionLength);\n            }\n\n            if (bstrDescription != NULL)\n                os::MarshalStringAlloc::FreeBString(bstrDescription);\n\n            if (bstrRestrictedDescription != NULL)\n                os::MarshalStringAlloc::FreeBString(bstrRestrictedDescription);\n\n            if (bstrCapabilitySid != NULL)\n                os::MarshalStringAlloc::FreeBString(bstrCapabilitySid);\n        }\n\n        return result;\n    }\n\n// When doing COM interop, any unrecognized hresult gets turned into a COMException\n// When doing Windows Runtime interop, any unrecognized hresult gets turned into a System.Exception\n// Go figure.\n    Il2CppException* Exception::Get(il2cpp_hresult_t hresult, bool defaultToCOMException)\n    {\n        UTF16String message;\n\n        Il2CppIRestrictedErrorInfo* errorInfo = os::WindowsRuntime::GetRestrictedErrorInfo();\n        if (errorInfo != NULL)\n        {\n            // First, try retrieving the original exception from restricted error info\n            Il2CppException* exception = TryGetExceptionFromRestrictedErrorInfo(errorInfo);\n            if (exception != NULL)\n                return exception;\n\n            // If we got here, restricted error info contained no existing managed exception\n            message = GetMessageFromRestrictedErrorInfo(errorInfo);\n\n            // To do: instead of releasing it here, store it on the exception that we're about to return\n            errorInfo->Release();\n        }\n\n        switch (hresult)\n        {\n            case IL2CPP_E_NOTIMPL:\n                return FromNameMsg(Image::GetCorlib(), \"System\", \"NotImplementedException\", message);\n\n            case IL2CPP_E_NOINTERFACE:\n                return GetInvalidCastException(message);\n\n            case IL2CPP_E_POINTER:\n                return GetNullReferenceException(message);\n\n            case IL2CPP_COR_E_OPERATIONCANCELED:\n                return FromNameMsg(Image::GetCorlib(), \"System\", \"OperationCanceledException\", message);\n\n            case IL2CPP_E_ACCESS_DENIED:\n                return GetUnauthorizedAccessException(message);\n\n            case IL2CPP_E_OUTOFMEMORY:\n                return GetOutOfMemoryException(message);\n\n            case IL2CPP_E_INVALIDARG:\n                return GetArgumentException(utils::StringView<Il2CppChar>::Empty(), message);\n\n            case IL2CPP_COR_E_OBJECTDISPOSED:\n            case IL2CPP_RO_E_CLOSED:\n                return FromNameMsg(Image::GetCorlib(), \"System\", \"ObjectDisposedException\", message, hresult);\n\n            case IL2CPP_E_FAIL:\n            {\n                if (message.empty())\n                    message = utils::StringUtils::Utf8ToUtf16(\"Unspecified error\");\n\n                return FromNameMsg(Image::GetCorlib(), \"System.Runtime.InteropServices\", \"COMException\", message, hresult);\n            }\n\n            case IL2CPP_COR_E_PLATFORMNOTSUPPORTED:\n            {\n                if (message.empty())\n                    message = utils::StringUtils::Utf8ToUtf16(\"Operation is not supported on this platform.\");\n\n                return GetPlatformNotSupportedException(message);\n            }\n\n            default:\n                return defaultToCOMException\n                    ? Exception::FromNameMsg(vm::Image::GetCorlib(), \"System.Runtime.InteropServices\", \"COMException\", message, hresult)\n                    : Exception::FromNameMsg(vm::Image::GetCorlib(), \"System\", \"Exception\", message, hresult);\n        }\n    }\n\n    NORETURN void Exception::Raise(il2cpp_hresult_t hresult, bool defaultToCOMException)\n    {\n        Raise(Get(hresult, defaultToCOMException));\n    }\n\n    Il2CppException* Exception::FromNameMsg(const Il2CppImage* image, const char *name_space, const char *name, const char *msg)\n    {\n        UTF16String utf16Msg;\n\n        if (msg != NULL)\n            utf16Msg = utils::StringUtils::Utf8ToUtf16(msg);\n\n        return FromNameMsg(image, name_space, name, utf16Msg);\n    }\n\n    Il2CppException* Exception::FromNameMsg(const Il2CppImage* image, const char* name_space, const char* name, const utils::StringView<Il2CppChar>& msg)\n    {\n        Il2CppClass* exceptionClass = Class::FromName(image, name_space, name);\n        Il2CppException* ex = (Il2CppException*)Object::New(exceptionClass);\n        Runtime::ObjectInit((Il2CppObject*)ex);\n\n        if (msg.Length() > 0)\n            IL2CPP_OBJECT_SETREF(ex, message, String::NewUtf16(msg));\n\n        return ex;\n    }\n\n    Il2CppException* Exception::FromNameMsg(const Il2CppImage* image, const char *name_space, const char* name, const utils::StringView<Il2CppChar>& msg, il2cpp_hresult_t hresult)\n    {\n        Il2CppException* ex = FromNameMsg(image, name_space, name, msg);\n        ex->hresult = hresult;\n        return ex;\n    }\n\n    Il2CppException * Exception::GetArgumentException(const char *arg, const char *msg)\n    {\n        Il2CppException* ex = FromNameMsg(Image::GetCorlib(), \"System\", \"ArgumentException\", msg);\n\n        if (arg)\n        {\n            Il2CppArgumentException *argex = (Il2CppArgumentException*)ex;\n            IL2CPP_OBJECT_SETREF(argex, argName, String::New(arg));\n        }\n\n        return ex;\n    }\n\n    Il2CppException* Exception::GetArgumentException(const utils::StringView<Il2CppChar>& arg, const utils::StringView<Il2CppChar>& msg)\n    {\n        Il2CppException* ex = FromNameMsg(Image::GetCorlib(), \"System\", \"ArgumentException\", msg);\n\n        if (arg.Length() > 0)\n        {\n            Il2CppArgumentException *argex = (Il2CppArgumentException*)ex;\n            IL2CPP_OBJECT_SETREF(argex, argName, String::NewUtf16(arg));\n        }\n\n        return ex;\n    }\n\n    Il2CppException * Exception::GetArgumentNullException(const char *arg)\n    {\n        Il2CppException* ex = FromNameMsg(Image::GetCorlib(), \"System\", \"ArgumentNullException\", NULL);\n\n        if (arg)\n        {\n            Il2CppArgumentException *argex = (Il2CppArgumentException*)ex;\n            IL2CPP_OBJECT_SETREF(argex, argName, String::New(arg));\n        }\n\n        return ex;\n    }\n\n    Il2CppException * Exception::GetArgumentOutOfRangeException(const char *arg)\n    {\n        Il2CppException* ex = FromNameMsg(Image::GetCorlib(), \"System\", \"ArgumentOutOfRangeException\", NULL);\n\n        if (arg)\n        {\n            Il2CppArgumentException *argex = (Il2CppArgumentException*)ex;\n            IL2CPP_OBJECT_SETREF(argex, argName, String::New(arg));\n        }\n\n        return ex;\n    }\n\n    Il2CppException * Exception::GetTypeInitializationException(const char *msg, Il2CppException* innerException)\n    {\n        Il2CppException* ex = FromNameMsg(Image::GetCorlib(), \"System\", \"TypeInitializationException\", msg);\n\n        if (innerException != NULL)\n            IL2CPP_OBJECT_SETREF(ex, inner_ex, innerException);\n\n        return ex;\n    }\n\n    Il2CppException* Exception::GetInvalidCastException(const char* msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System\", \"InvalidCastException\", msg);\n    }\n\n    Il2CppException* Exception::GetInvalidCastException(const utils::StringView<Il2CppChar>& msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System\", \"InvalidCastException\", msg);\n    }\n\n    Il2CppException* Exception::GetIndexOutOfRangeException()\n    {\n        return GetIndexOutOfRangeException(utils::StringView<Il2CppChar>::Empty());\n    }\n\n    Il2CppException* Exception::GetIndexOutOfRangeException(const utils::StringView<Il2CppChar>& msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System\", \"IndexOutOfRangeException\", msg);\n    }\n\n    Il2CppException* Exception::GetNullReferenceException(const utils::StringView<Il2CppChar>& msg)\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"NullReferenceException\", msg);\n    }\n\n    Il2CppException* Exception::GetTypeLoadException()\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"TypeLoadException\", NULL);\n    }\n\n    Il2CppException* Exception::GetOutOfMemoryException(const utils::StringView<Il2CppChar>& msg)\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"OutOfMemoryException\", msg);\n    }\n\n    Il2CppException* Exception::GetOverflowException()\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"OverflowException\", NULL);\n    }\n\n    Il2CppException* Exception::GetOverflowException(const char* msg)\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"OverflowException\", msg);\n    }\n\n    Il2CppException* Exception::GetFormatException(const char* msg)\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"FormatException\", msg);\n    }\n\n    Il2CppException* Exception::GetSystemException()\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"SystemException\", NULL);\n    }\n\n    Il2CppException* Exception::GetNotSupportedException(const char* msg)\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"NotSupportedException\", msg);\n    }\n\n    Il2CppException* Exception::GetArrayTypeMismatchException()\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"ArrayTypeMismatchException\", NULL);\n    }\n\n    Il2CppException* Exception::GetTypeLoadException(const char* msg)\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"TypeLoadException\", msg);\n    }\n\n    Il2CppException* Exception::GetEntryPointNotFoundException(const char* msg)\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"EntryPointNotFoundException\", msg);\n    }\n\n    Il2CppException* Exception::GetDllNotFoundException(const char* msg)\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"DllNotFoundException\", msg);\n    }\n\n    Il2CppException * Exception::GetInvalidOperationException(const char* msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System\", \"InvalidOperationException\", msg);\n    }\n\n    Il2CppException* Exception::GetThreadInterruptedException()\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System.Threading\", \"ThreadInterruptedException\", NULL);\n    }\n\n    Il2CppException* Exception::GetThreadAbortException()\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System.Threading\", \"ThreadAbortException\", NULL);\n    }\n\n    Il2CppException* Exception::GetThreadStateException(const char* msg)\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System.Threading\", \"ThreadStateException\", msg);\n    }\n\n    Il2CppException* Exception::GetSynchronizationLockException(const char* msg)\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System.Threading\", \"SynchronizationLockException\", msg);\n    }\n\n    Il2CppException * Exception::GetMissingMethodException(const char* msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System\", \"MissingMethodException\", msg);\n    }\n\n    Il2CppException * Exception::GetMarshalDirectiveException(const char* msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System.Runtime.InteropServices\", \"MarshalDirectiveException\", msg);\n    }\n\n    Il2CppException * Exception::GetTargetException(const char* msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System.Reflection\", \"TargetException\", msg);\n    }\n\n    Il2CppException * Exception::GetExecutionEngineException(const char* msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System\", \"ExecutionEngineException\", msg);\n    }\n\n    Il2CppException* Exception::GetMethodAccessException(const char* msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System\", \"MethodAccessException\", msg);\n    }\n\n    Il2CppException* Exception::GetUnauthorizedAccessException(const utils::StringView<Il2CppChar>& msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System\", \"UnauthorizedAccessException\", msg);\n    }\n\n    Il2CppException * Exception::GetMaxmimumNestedGenericsException()\n    {\n        return GetNotSupportedException(MAXIMUM_NESTED_GENERICS_EXCEPTION_MESSAGE);\n    }\n\n    Il2CppException* Exception::GetDivideByZeroException()\n    {\n        return FromNameMsg(vm::Image::GetCorlib(), \"System\", \"DivideByZeroException\", NULL);\n    }\n\n    Il2CppException* Exception::GetPlatformNotSupportedException(const utils::StringView<Il2CppChar>& msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System\", \"PlatformNotSupportedException\", msg);\n    }\n\n    Il2CppException* Exception::GetFileLoadException(const char* msg)\n    {\n        return FromNameMsg(Image::GetCorlib(), \"System.IO\", \"FileLoadException\", msg);\n    }\n\n    void Exception::StoreExceptionInfo(Il2CppException* ex, Il2CppString* exceptionString)\n    {\n        // To do: try retrieving IRestrictedErrorInfo here\n        os::WindowsRuntime::OriginateLanguageException(ex, exceptionString);\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Exception.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <string>\n#include \"il2cpp-config.h\"\n#include \"utils/StringView.h\"\n\nstruct Il2CppException;\nstruct Il2CppImage;\nstruct Il2CppClass;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Exception\n    {\n// exported\n    public:\n        static Il2CppException* Get(il2cpp_hresult_t hresult, bool defaultToCOMException);\n\n        static NORETURN void Raise(Il2CppException* ex);\n        static NORETURN void RaiseOutOfMemoryException();\n        static NORETURN void RaiseOutOfMemoryException(const utils::StringView<Il2CppChar>& msg);\n        static NORETURN void RaiseNullReferenceException();\n        static NORETURN void RaiseNullReferenceException(const utils::StringView<Il2CppChar>& msg);\n        static NORETURN void RaiseDivideByZeroException();\n        static NORETURN void RaiseOverflowException();\n        static NORETURN void RaiseArgumentOutOfRangeException(const char* msg);\n        static NORETURN void Raise(il2cpp_hresult_t hresult, bool defaultToCOMException);\n\n        inline static void RaiseIfFailed(il2cpp_hresult_t hresult, bool defaultToCOMException)\n        {\n            if (IL2CPP_HR_FAILED(hresult))\n                Raise(hresult, defaultToCOMException);\n        }\n\n        ////TODO: rename to NewFromClassNameAndMessage\n        static Il2CppException* FromNameMsg(const Il2CppImage* image, const char* name_space, const char* name, const char* msg);\n        static Il2CppException* FromNameMsg(const Il2CppImage* image, const char* name_space, const char* name, const utils::StringView<Il2CppChar>& msg);\n        static Il2CppException* FromNameMsg(const Il2CppImage* image, const char* name_space, const char* name, const utils::StringView<Il2CppChar>& msg, il2cpp_hresult_t hresult);\n\n    public:\n        ////TODO: rename all of these to NewXXX\n        static Il2CppException* GetArgumentException(const char *arg, const char *msg);\n        static Il2CppException* GetArgumentException(const utils::StringView<Il2CppChar>& arg, const utils::StringView<Il2CppChar>& msg);\n        static Il2CppException* GetArgumentNullException(const char *arg);\n        static Il2CppException* GetArgumentOutOfRangeException(const char *arg);\n        static Il2CppException* GetTypeInitializationException(const char *msg, Il2CppException* innerException);\n        static Il2CppException* GetIndexOutOfRangeException();\n        static Il2CppException* GetIndexOutOfRangeException(const utils::StringView<Il2CppChar>& msg);\n        static Il2CppException* GetNullReferenceException(const utils::StringView<Il2CppChar>& msg);\n        static Il2CppException* GetInvalidCastException(const char* msg);\n        static Il2CppException* GetInvalidCastException(const utils::StringView<Il2CppChar>& msg);\n        static Il2CppException* GetTypeLoadException();\n        static Il2CppException* GetOutOfMemoryException(const utils::StringView<Il2CppChar>& msg);\n        static Il2CppException* GetOverflowException();\n        static Il2CppException* GetOverflowException(const char* msg);\n        static Il2CppException* GetFormatException(const char* msg);\n        static Il2CppException* GetSystemException();\n        static Il2CppException* GetNotSupportedException(const char* msg);\n        static Il2CppException* GetArrayTypeMismatchException();\n        static Il2CppException* GetTypeLoadException(const char* msg);\n        static Il2CppException* GetEntryPointNotFoundException(const char* msg);\n        static Il2CppException* GetDllNotFoundException(const char* msg);\n        static Il2CppException* GetInvalidOperationException(const char* msg);\n        static Il2CppException* GetThreadInterruptedException();\n        static Il2CppException* GetThreadAbortException();\n        static Il2CppException* GetThreadStateException(const char* msg);\n        static Il2CppException* GetSynchronizationLockException(const char* msg);\n        static Il2CppException* GetMissingMethodException(const char* msg);\n        static Il2CppException* GetMarshalDirectiveException(const char* msg);\n        static Il2CppException* GetTargetException(const char* msg);\n        static Il2CppException* GetExecutionEngineException(const char* msg);\n        static Il2CppException* GetMethodAccessException(const char* msg);\n        static Il2CppException* GetUnauthorizedAccessException(const utils::StringView<Il2CppChar>& msg);\n        static Il2CppException* GetDivideByZeroException();\n        static Il2CppException* GetPlatformNotSupportedException(const utils::StringView<Il2CppChar>& msg);\n        static Il2CppException* GetFileLoadException(const char* msg);\n\n        static Il2CppException* GetMaxmimumNestedGenericsException();\n\n        static void StoreExceptionInfo(Il2CppException* ex, Il2CppString* exceptionString);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Field.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Class.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/Field.h\"\n#include \"vm/Object.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/String.h\"\n#include \"vm/Type.h\"\n#include <memory>\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"tabledefs.h\"\n#include \"utils/MemoryRead.h\"\n#include \"vm-utils/BlobReader.h\"\n\nusing namespace il2cpp::utils;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    static void\n    set_value(const Il2CppType *type, void *dest, void *value, bool deref_pointer);\n\n    const char* Field::GetName(FieldInfo *field)\n    {\n        return field->name;\n    }\n\n    Il2CppClass* Field::GetParent(FieldInfo *field)\n    {\n        return field->parent;\n    }\n\n    int Field::GetFlags(FieldInfo *field)\n    {\n        return field->type->attrs;\n    }\n\n    size_t Field::GetOffset(FieldInfo *field)\n    {\n        return field->offset;\n    }\n\n    void Field::GetValue(Il2CppObject *obj, FieldInfo *field, void *value)\n    {\n        void *src;\n\n        IL2CPP_ASSERT(obj);\n\n        IL2CPP_ASSERT(!(field->type->attrs & FIELD_ATTRIBUTE_STATIC));\n\n        src = (char*)obj + field->offset;\n        set_value(field->type, value, src, true);\n    }\n\n    uint32_t Field::GetToken(const FieldInfo *field)\n    {\n        return field->token;\n    }\n\n    Il2CppObject* Field::GetValueObject(FieldInfo *field, Il2CppObject *obj)\n    {\n        Il2CppClass* fieldType = Class::FromIl2CppType(field->type);\n\n        if (field->type->attrs & FIELD_ATTRIBUTE_LITERAL)\n        {\n            if (fieldType->valuetype)\n            {\n                void* value = alloca(fieldType->instance_size - sizeof(Il2CppObject));\n                Field::GetDefaultFieldValue(field, value);\n                return Object::Box(fieldType, value);\n            }\n            else\n            {\n                Il2CppObject* value;\n                Field::GetDefaultFieldValue(field, &value);\n                return value;\n            }\n        }\n\n        void* fieldAddress;\n        if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n        {\n            if (field->offset == THREAD_STATIC_FIELD_OFFSET)\n            {\n                NOT_IMPLEMENTED_NO_ASSERT(Field::GetValueObject, \"Field::GetValueObject is not implemented for thread-static fields\");\n                return NULL;\n            }\n\n            Runtime::ClassInit(field->parent);\n            fieldAddress = static_cast<uint8_t*>(field->parent->static_fields) + field->offset;\n        }\n        else\n        {\n            IL2CPP_ASSERT(obj);\n            fieldAddress = reinterpret_cast<uint8_t*>(obj) + field->offset;\n        }\n\n        return Object::Box(fieldType, fieldAddress);\n    }\n\n    const Il2CppType* Field::GetType(FieldInfo *field)\n    {\n        return field->type;\n    }\n\n    bool Field::HasAttribute(FieldInfo *field, Il2CppClass *attr_class)\n    {\n        return Reflection::HasAttribute(field, attr_class);\n    }\n\n    bool Field::IsDeleted(FieldInfo *field)\n    {\n        return false;\n    }\n\n    void Field::SetValue(Il2CppObject *obj, const FieldInfo *field, void *value)\n    {\n        void *dest;\n\n        IL2CPP_ASSERT(!(field->type->attrs & FIELD_ATTRIBUTE_STATIC));\n\n        dest = (char*)obj + field->offset;\n        set_value(field->type, dest, value, false);\n    }\n\n    void Field::GetDefaultFieldValue(FieldInfo *field, void *value)\n    {\n        const Il2CppType* type = NULL;\n        const char* data;\n\n        data = Class::GetFieldDefaultValue(field, &type);\n        BlobReader::GetConstantValueFromBlob(type->type, data, value);\n    }\n\n    void Field::StaticGetValue(FieldInfo *field, void *value)\n    {\n        void *src = NULL;\n\n        IL2CPP_ASSERT(field->type->attrs & FIELD_ATTRIBUTE_STATIC);\n\n        if (field->type->attrs & FIELD_ATTRIBUTE_LITERAL)\n        {\n            GetDefaultFieldValue(field, value);\n            return;\n        }\n\n        // ensure parent is initialized so that static fields memory has been allocated\n        Class::SetupFields(field->parent);\n\n        if (field->offset == THREAD_STATIC_FIELD_OFFSET)\n        {\n            // Thread static\n            NOT_IMPLEMENTED_NO_ASSERT(Field::StaticGetValue, \"Field::StaticGetValue is not implemented for thread-static fields\");\n        }\n        else\n        {\n            src = ((char*)field->parent->static_fields) + field->offset;\n        }\n\n        set_value(field->type, value, src, true);\n    }\n\n    void Field::StaticSetValue(FieldInfo *field, void *value)\n    {\n        void *dest = NULL;\n\n        IL2CPP_ASSERT(field->type->attrs & FIELD_ATTRIBUTE_STATIC);\n        IL2CPP_ASSERT(!(field->type->attrs & FIELD_ATTRIBUTE_LITERAL));\n\n        // ensure parent is initialized so that static fields memory has been allocated\n        Class::Init(field->parent);\n\n        if (field->offset == THREAD_STATIC_FIELD_OFFSET)\n        {\n            NOT_IMPLEMENTED_NO_ASSERT(Field::StaticSetValue, \"Field::SetValueObject is not implemented for thread-static fields\");\n            return;\n        }\n        else\n        {\n            dest = ((char*)field->parent->static_fields) + field->offset;\n        }\n\n        set_value(field->type, dest, value, false);\n    }\n\n    void Field::SetInstanceFieldValueObject(Il2CppObject* objectInstance, FieldInfo* field, Il2CppObject* value)\n    {\n        assert(!(field->type->attrs & FIELD_ATTRIBUTE_LITERAL));\n        assert(!Class::FromIl2CppType(field->type)->valuetype);\n        *reinterpret_cast<Il2CppObject**>(reinterpret_cast<uint8_t*>(objectInstance) + field->offset) = value;\n        // Object write barrier needed here\n    }\n\n    static void\n    set_value(const Il2CppType *type, void *dest, void *value, bool deref_pointer)\n    {\n        int t;\n        if (type->byref)\n        {\n            /* object fields cannot be byref, so we don't need a\n               wbarrier here */\n            void* *p = (void**)dest;\n            *p = value;\n            return;\n        }\n        t = type->type;\n    handle_enum:\n        switch (t)\n        {\n            case IL2CPP_TYPE_BOOLEAN:\n            case IL2CPP_TYPE_I1:\n            case IL2CPP_TYPE_U1:\n            {\n                uint8_t *p = (uint8_t*)dest;\n                *p = value ? *(uint8_t*)value : 0;\n                return;\n            }\n            case IL2CPP_TYPE_I2:\n            case IL2CPP_TYPE_U2:\n            {\n                uint16_t *p = (uint16_t*)dest;\n                *p = value ? *(uint16_t*)value : 0;\n                return;\n            }\n            case IL2CPP_TYPE_CHAR:\n            {\n                Il2CppChar* p = (Il2CppChar*)dest;\n                *p = value ? *(Il2CppChar*)value : 0;\n                return;\n            }\n#if SIZEOF_VOID_P == 4\n            case IL2CPP_TYPE_I:\n            case IL2CPP_TYPE_U:\n#endif\n            case IL2CPP_TYPE_I4:\n            case IL2CPP_TYPE_U4:\n            {\n                int32_t *p = (int32_t*)dest;\n                *p = value ? *(int32_t*)value : 0;\n                return;\n            }\n#if SIZEOF_VOID_P == 8\n            case IL2CPP_TYPE_I:\n            case IL2CPP_TYPE_U:\n#endif\n            case IL2CPP_TYPE_I8:\n            case IL2CPP_TYPE_U8:\n            {\n                int64_t *p = (int64_t*)dest;\n                *p = value ? *(int64_t*)value : 0;\n                return;\n            }\n            case IL2CPP_TYPE_R4:\n            {\n                float *p = (float*)dest;\n                *p = value ? *(float*)value : 0;\n                return;\n            }\n            case IL2CPP_TYPE_R8:\n            {\n                double *p = (double*)dest;\n                *p = value ? *(double*)value : 0;\n                return;\n            }\n            case IL2CPP_TYPE_STRING:\n            case IL2CPP_TYPE_SZARRAY:\n            case IL2CPP_TYPE_CLASS:\n            case IL2CPP_TYPE_OBJECT:\n            case IL2CPP_TYPE_ARRAY:\n                *(void**)dest = (deref_pointer ? *(void**)value : value);\n                //mono_gc_wbarrier_generic_store (dest, deref_pointer? *(void**)value: value);\n                return;\n            case IL2CPP_TYPE_FNPTR:\n            case IL2CPP_TYPE_PTR:\n            {\n                void* *p = (void**)dest;\n                *p = deref_pointer ? *(void**)value : value;\n                return;\n            }\n            case IL2CPP_TYPE_VALUETYPE:\n                /* note that 't' and 'type->type' can be different */\n                if (type->type == IL2CPP_TYPE_VALUETYPE && Type::IsEnum(type))\n                {\n                    t = Class::GetEnumBaseType(Type::GetClass(type))->type;\n                    goto handle_enum;\n                }\n                else\n                {\n                    Il2CppClass *klass = Class::FromIl2CppType(type);\n                    int size = Class::GetValueSize(klass, NULL);\n                    if (value == NULL)\n                    {\n                        memset(dest, 0, size);\n                    }\n                    else\n                    {\n                        memcpy(dest, value, size);\n                        //mono_gc_wbarrier_value_copy (dest, value, size, klass);\n                    }\n                }\n                return;\n            case IL2CPP_TYPE_GENERICINST:\n                t = GenericClass::GetTypeDefinition(type->data.generic_class)->byval_arg->type;\n                goto handle_enum;\n            default:\n                IL2CPP_ASSERT(0);\n        }\n    }\n\n    const char* Field::GetData(FieldInfo *field)\n    {\n        if (field->type->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT)\n        {\n            const Il2CppType* type = NULL;\n            return Class::GetFieldDefaultValue(field, &type);\n        }\n        else if (field->type->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA)\n        {\n            NOT_IMPLEMENTED_NO_ASSERT(Field::GetData, \"This works for array initialization data. Revisit any other RVA use case.\");\n            const Il2CppType* type = NULL;\n            return Class::GetFieldDefaultValue(field, &type);\n        }\n        else\n        {\n            return NULL;\n        }\n    }\n\n    bool Field::IsInstance(FieldInfo* field)\n    {\n        return (field->type->attrs & FIELD_ATTRIBUTE_STATIC) == 0;\n    }\n\n    bool Field::IsNormalStatic(FieldInfo* field)\n    {\n        if ((field->type->attrs & FIELD_ATTRIBUTE_STATIC) == 0)\n            return false;\n\n        if (field->offset == THREAD_STATIC_FIELD_OFFSET)\n            return false;\n\n        if ((field->type->attrs & FIELD_ATTRIBUTE_LITERAL) != 0)\n            return false;\n\n        return true;\n    }\n\n    bool Field::IsThreadStatic(FieldInfo* field)\n    {\n        if ((field->type->attrs & FIELD_ATTRIBUTE_STATIC) == 0)\n            return false;\n\n        if (field->offset != -1)\n            return false;\n\n        if ((field->type->attrs & FIELD_ATTRIBUTE_LITERAL) != 0)\n            return false;\n\n        return true;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Field.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\nstruct FieldInfo;\nstruct Il2CppType;\nstruct Il2CppClass;\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Field\n    {\n    public:\n        // exported\n        static const Il2CppType* GetType(FieldInfo *field);\n        static Il2CppClass* GetParent(FieldInfo *field);\n        static int GetFlags(FieldInfo *field);\n        static const char* GetName(FieldInfo *field);\n        static size_t GetOffset(FieldInfo *field);\n        static void GetValue(Il2CppObject *obj, FieldInfo *field, void *value);\n        static uint32_t GetToken(const FieldInfo *field);\n        static Il2CppObject* GetValueObject(FieldInfo *field, Il2CppObject *obj);\n        static bool HasAttribute(FieldInfo *field, Il2CppClass *attr_class);\n        static bool IsDeleted(FieldInfo *field);\n        static void SetValue(Il2CppObject *obj, const FieldInfo *field, void *value);\n        static void StaticGetValue(FieldInfo *field, void *value);\n        static void StaticSetValue(FieldInfo *field, void *value);\n        static void SetInstanceFieldValueObject(Il2CppObject* objectInstance, FieldInfo* field, Il2CppObject* value);\n\n    public:\n        // internal\n        static const char* GetData(FieldInfo *field);\n        static void GetDefaultFieldValue(FieldInfo *field, void *value);\n\n        static bool IsInstance(FieldInfo* field);\n        static bool IsNormalStatic(FieldInfo* field);\n        static bool IsThreadStatic(FieldInfo* field);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/GenericClass.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"metadata/GenericMetadata.h\"\n#include \"os/Mutex.h\"\n#include \"utils/Memory.h\"\n#include \"vm/Class.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/Exception.h\"\n#include \"vm/MetadataAlloc.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/MetadataLock.h\"\n#include \"class-internals.h\"\n#include \"metadata.h\"\n\nusing il2cpp::metadata::GenericMetadata;\nusing il2cpp::os::FastAutoLock;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    void GenericClass::SetupMethods(Il2CppClass* genericInstanceType)\n    {\n        Il2CppClass* genericTypeDefinition = GenericClass::GetTypeDefinition(genericInstanceType->generic_class);\n        uint16_t methodCount = genericTypeDefinition->method_count;\n        IL2CPP_ASSERT(genericTypeDefinition->method_count == genericInstanceType->method_count);\n\n        if (methodCount == 0)\n        {\n            genericInstanceType->methods = NULL;\n            return;\n        }\n\n        const MethodInfo** methods = (const MethodInfo**)MetadataCalloc(methodCount, sizeof(MethodInfo*));\n\n        for (uint16_t methodIndex = 0; methodIndex < methodCount; ++methodIndex)\n        {\n            const MethodInfo* methodDefinition = genericTypeDefinition->methods[methodIndex];\n            methods[methodIndex] = GenericMetadata::Inflate(methodDefinition, genericInstanceType, GenericClass::GetContext(genericInstanceType->generic_class));\n        }\n\n        genericInstanceType->methods = methods;\n\n        il2cpp_runtime_stats.method_count += methodCount;\n    }\n\n    static void InflatePropertyDefinition(const PropertyInfo* propertyDefinition, PropertyInfo* newProperty, Il2CppClass* declaringClass, Il2CppGenericContext* context)\n    {\n        newProperty->attrs = propertyDefinition->attrs;\n        newProperty->parent = declaringClass;\n        newProperty->name = propertyDefinition->name;\n        newProperty->customAttributeIndex = propertyDefinition->customAttributeIndex;\n        newProperty->token = propertyDefinition->token;\n\n        if (propertyDefinition->get)\n            newProperty->get = GenericMetadata::Inflate(propertyDefinition->get, declaringClass, context);\n        if (propertyDefinition->set)\n            newProperty->set = GenericMetadata::Inflate(propertyDefinition->set, declaringClass, context);\n    }\n\n    void GenericClass::SetupProperties(Il2CppClass* genericInstanceType)\n    {\n        Il2CppClass* genericTypeDefinition = GenericClass::GetTypeDefinition(genericInstanceType->generic_class);\n        uint16_t propertyCount = genericTypeDefinition->property_count;\n        IL2CPP_ASSERT(genericTypeDefinition->property_count == genericInstanceType->property_count);\n\n        if (propertyCount == 0)\n        {\n            genericInstanceType->properties = NULL;\n            return;\n        }\n\n        PropertyInfo* properties = (PropertyInfo*)MetadataCalloc(propertyCount, sizeof(PropertyInfo));\n        PropertyInfo* property = properties;\n\n        for (uint16_t propertyIndex = 0; propertyIndex < propertyCount; ++propertyIndex)\n        {\n            InflatePropertyDefinition(genericTypeDefinition->properties + propertyIndex, property, genericInstanceType, GenericClass::GetContext(genericInstanceType->generic_class));\n            property++;\n        }\n\n        genericInstanceType->properties = properties;\n    }\n\n    static void InflateEventDefinition(const EventInfo* eventDefinition, EventInfo* newEvent, Il2CppClass* declaringClass, Il2CppGenericContext* context)\n    {\n        newEvent->eventType = GenericMetadata::InflateIfNeeded(eventDefinition->eventType, context, false);\n        newEvent->name = eventDefinition->name;\n        newEvent->parent = declaringClass;\n        newEvent->customAttributeIndex = eventDefinition->customAttributeIndex;\n        newEvent->token = eventDefinition->token;\n\n        if (eventDefinition->add)\n            newEvent->add = GenericMetadata::Inflate(eventDefinition->add, declaringClass, context);\n        if (eventDefinition->raise)\n            newEvent->raise = GenericMetadata::Inflate(eventDefinition->raise, declaringClass, context);\n        if (eventDefinition->remove)\n            newEvent->remove = GenericMetadata::Inflate(eventDefinition->remove, declaringClass, context);\n    }\n\n    void GenericClass::SetupEvents(Il2CppClass* genericInstanceType)\n    {\n        Il2CppClass* genericTypeDefinition = GenericClass::GetTypeDefinition(genericInstanceType->generic_class);\n        uint16_t eventCount = genericTypeDefinition->event_count;\n        IL2CPP_ASSERT(genericTypeDefinition->event_count == genericInstanceType->event_count);\n\n        if (eventCount == 0)\n        {\n            genericInstanceType->events = NULL;\n            return;\n        }\n\n        EventInfo* events = (EventInfo*)MetadataCalloc(eventCount, sizeof(EventInfo));\n        EventInfo* event = events;\n\n        for (uint16_t eventIndex = 0; eventIndex < eventCount; ++eventIndex)\n        {\n            InflateEventDefinition(genericTypeDefinition->events + eventIndex, event, genericInstanceType, GenericClass::GetContext(genericInstanceType->generic_class));\n            event++;\n        }\n\n        genericInstanceType->events = events;\n    }\n\n    static FieldInfo* InflateFieldDefinition(const FieldInfo* fieldDefinition, FieldInfo* newField, Il2CppClass* declaringClass, Il2CppGenericContext* context)\n    {\n        newField->type = GenericMetadata::InflateIfNeeded(fieldDefinition->type, context, false);\n        newField->name = fieldDefinition->name;\n        newField->parent = declaringClass;\n        newField->offset = fieldDefinition->offset;\n        newField->customAttributeIndex = fieldDefinition->customAttributeIndex;\n        newField->token = fieldDefinition->token;\n\n        return newField;\n    }\n\n    void GenericClass::SetupFields(Il2CppClass* genericInstanceType)\n    {\n        Il2CppClass* genericTypeDefinition = GenericClass::GetTypeDefinition(genericInstanceType->generic_class);\n        uint16_t fieldCount = genericTypeDefinition->field_count;\n        IL2CPP_ASSERT(genericTypeDefinition->field_count == genericInstanceType->field_count);\n\n        if (fieldCount == 0)\n        {\n            genericInstanceType->fields = NULL;\n            return;\n        }\n\n        FieldInfo* fields = (FieldInfo*)MetadataCalloc(fieldCount, sizeof(FieldInfo));\n        FieldInfo* field = fields;\n\n        for (uint16_t fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)\n        {\n            InflateFieldDefinition(genericTypeDefinition->fields + fieldIndex, field, genericInstanceType, GenericClass::GetContext(genericInstanceType->generic_class));\n            field++;\n        }\n\n        genericInstanceType->fields = fields;\n    }\n\n    Il2CppClass* GenericClass::GetClass(Il2CppGenericClass *gclass)\n    {\n        FastAutoLock lock(&g_MetadataLock);\n        Il2CppClass* definition = GetTypeDefinition(gclass);\n        if (definition == NULL)\n            vm::Exception::Raise(vm::Exception::GetMaxmimumNestedGenericsException());\n\n        if (!gclass->cached_class)\n        {\n            Il2CppClass* klass = gclass->cached_class = (Il2CppClass*)MetadataCalloc(1, sizeof(Il2CppClass) + (sizeof(VirtualInvokeData) * definition->vtable_count));\n\n            klass->name = definition->name;\n            klass->namespaze = definition->namespaze;\n\n            klass->image = definition->image;\n            klass->flags = definition->flags;\n            //klass->type_token = definition->type_token;\n            klass->generic_class = gclass;\n\n            Il2CppClass* genericTypeDefinition = GenericClass::GetTypeDefinition(klass->generic_class);\n            Il2CppGenericContext* context = &klass->generic_class->context;\n\n            if (genericTypeDefinition->parent)\n                klass->parent = Class::FromIl2CppType(GenericMetadata::InflateIfNeeded(genericTypeDefinition->parent->byval_arg, context, false));\n\n            if (genericTypeDefinition->declaringType)\n                klass->declaringType = Class::FromIl2CppType(GenericMetadata::InflateIfNeeded(genericTypeDefinition->declaringType->byval_arg, context, false));\n\n            Il2CppType* thisArg = (Il2CppType*)MetadataCalloc(1, sizeof(Il2CppType));\n            Il2CppType* byValArg = (Il2CppType*)MetadataCalloc(1, sizeof(Il2CppType));\n\n            thisArg->type = byValArg->type = IL2CPP_TYPE_GENERICINST;\n            thisArg->data.generic_class = byValArg->data.generic_class = gclass;\n            thisArg->byref = true;\n\n            klass->this_arg = thisArg;\n            klass->byval_arg = byValArg;\n\n            klass->event_count = definition->event_count;\n            klass->field_count = definition->field_count;\n            klass->interfaces_count = definition->interfaces_count;\n            klass->method_count = definition->method_count;\n            klass->property_count = definition->property_count;\n\n            klass->enumtype = definition->enumtype;\n            klass->valuetype = definition->valuetype;\n            klass->element_class = klass->castClass = klass;\n\n            klass->has_cctor = definition->has_cctor;\n            klass->has_finalize = definition->has_finalize;\n            klass->native_size = klass->thread_static_fields_offset = -1;\n            klass->customAttributeIndex = definition->customAttributeIndex;\n            klass->token = definition->token;\n            klass->interopData = MetadataCache::GetInteropDataForType(klass->byval_arg);\n\n            if (Class::IsNullable(klass))\n                klass->element_class = klass->castClass  = Class::GetNullableArgument(klass);\n\n            if (klass->enumtype)\n                klass->element_class = klass->castClass =  definition->element_class;\n\n            klass->is_import_or_windows_runtime = definition->is_import_or_windows_runtime;\n        }\n\n        return gclass->cached_class;\n    }\n\n    Il2CppGenericContext* GenericClass::GetContext(Il2CppGenericClass *gclass)\n    {\n        return &gclass->context;\n    }\n\n    Il2CppClass* GenericClass::GetTypeDefinition(Il2CppGenericClass *gclass)\n    {\n        return MetadataCache::GetTypeInfoFromTypeDefinitionIndex(gclass->typeDefinitionIndex);\n    }\n\n    bool GenericClass::IsEnum(Il2CppGenericClass *gclass)\n    {\n        return IsValueType(gclass) && GetTypeDefinition(gclass)->enumtype;\n    }\n\n    bool GenericClass::IsValueType(Il2CppGenericClass *gclass)\n    {\n        return GetTypeDefinition(gclass)->valuetype;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/GenericClass.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\nstruct Il2CppClass;\nstruct Il2CppGenericClass;\nstruct Il2CppGenericContext;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API GenericClass\n    {\n    public:\n        // exported\n\n    public:\n        //internal\n        static Il2CppClass* GetClass(Il2CppGenericClass *gclass);\n        static Il2CppGenericContext* GetContext(Il2CppGenericClass *gclass);\n        static Il2CppClass* GetTypeDefinition(Il2CppGenericClass *gclass);\n        static bool IsEnum(Il2CppGenericClass *gclass);\n        static bool IsValueType(Il2CppGenericClass *gclass);\n\n        static void SetupEvents(Il2CppClass* genericInstanceType);\n        static void SetupFields(Il2CppClass* genericInstanceType);\n        static void SetupMethods(Il2CppClass* genericInstanceType);\n        static void SetupProperties(Il2CppClass* genericInstanceType);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/GenericContainer.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"GenericContainer.h\"\n#include \"MetadataCache.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    Il2CppClass* GenericContainer::GetDeclaringType(const Il2CppGenericContainer* genericContainer)\n    {\n        if (genericContainer->is_method)\n            return MetadataCache::GetMethodInfoFromMethodDefinitionIndex(genericContainer->ownerIndex)->declaring_type;\n\n        return MetadataCache::GetTypeInfoFromTypeDefinitionIndex(genericContainer->ownerIndex);\n    }\n\n    const Il2CppGenericParameter* GenericContainer::GetGenericParameter(const Il2CppGenericContainer* genericContainer, uint16_t index)\n    {\n        IL2CPP_ASSERT(index < genericContainer->type_argc);\n        return MetadataCache::GetGenericParameterFromIndex(genericContainer->genericParameterStart + index);\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/GenericContainer.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"il2cpp-metadata.h\"\n\nstruct Il2CppClass;\nstruct Il2CppGenericContainer;\nstruct Il2CppGenericParameter;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API GenericContainer\n    {\n    public:\n        // exported\n\n    public:\n        //internal\n        static Il2CppClass* GetDeclaringType(const Il2CppGenericContainer* genericContainer);\n        static const Il2CppGenericParameter* GetGenericParameter(const Il2CppGenericContainer* genericContainer, uint16_t index);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Image.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <vector>\n#include <map>\n#include <limits>\n#include \"os/MemoryMappedFile.h\"\n#include \"os/Mutex.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Class.h\"\n#include \"vm/Image.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/StackTrace.h\"\n#include \"vm/Type.h\"\n#include \"utils/HashUtils.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm-utils/VmStringUtils.h\"\n\nusing il2cpp::utils::HashUtils;\nusing il2cpp::utils::StringUtils;\n\n\nstruct NamespaceAndNamePairHash\n{\n    size_t operator()(const std::pair<const char*, const char*>& pair) const\n    {\n        return HashUtils::Combine(StringUtils::Hash(pair.first), StringUtils::Hash(pair.second));\n    }\n};\n\nstruct NamespaceAndNamePairEquals\n{\n    bool operator()(const std::pair<const char*, const char*>& p1, const std::pair<const char*, const char*>& p2) const\n    {\n        return !strcmp(p1.first, p2.first) && !strcmp(p1.second, p2.second);\n    }\n};\n\nstruct NamespaceAndNamePairLess\n{\n    bool operator()(const std::pair<const char*, const char*>& p1, const std::pair<const char*, const char*>& p2) const\n    {\n        int namespaceCompare = strcmp(p1.first, p2.first);\n\n        if (namespaceCompare < 0)\n            return true;\n\n        if (namespaceCompare > 0)\n            return false;\n\n        return strcmp(p1.second, p2.second) < 0;\n    }\n};\n\nstruct Il2CppNameToTypeDefinitionIndexHashTable : public Il2CppHashMap<std::pair<const char*, const char*>, TypeDefinitionIndex, NamespaceAndNamePairHash, NamespaceAndNamePairEquals>\n{\n    typedef Il2CppHashMap<std::pair<const char*, const char*>, TypeDefinitionIndex, NamespaceAndNamePairHash, NamespaceAndNamePairEquals> Base;\n    Il2CppNameToTypeDefinitionIndexHashTable() : Base()\n    {\n    }\n};\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    const Il2CppAssembly* Image::GetAssembly(const Il2CppImage* image)\n    {\n        return MetadataCache::GetAssemblyFromIndex(image->assemblyIndex);\n    }\n\n    typedef il2cpp::vm::StackFrames::const_reverse_iterator StackReverseIterator;\n\n    static bool IsSystemType(Il2CppClass* klass)\n    {\n        return strcmp(klass->namespaze, \"System\") == 0 && strcmp(klass->name, \"Type\") == 0;\n    }\n\n    static bool IsSystemReflectionAssembly(Il2CppClass* klass)\n    {\n        return strcmp(klass->namespaze, \"System.Reflection\") == 0 && strcmp(klass->name, \"Assembly\") == 0;\n    }\n\n    static StackReverseIterator GetNextImageFromStack(StackReverseIterator first, StackReverseIterator last)\n    {\n        for (StackReverseIterator it = first; it != last; it++)\n        {\n            Il2CppClass* klass = it->method->declaring_type;\n            if (klass->image != NULL && !IsSystemType(klass) && !IsSystemReflectionAssembly(klass))\n            {\n                return it;\n            }\n        }\n\n        return last;\n    }\n\n    const Il2CppImage* Image::GetExecutingImage()\n    {\n        const il2cpp::vm::StackFrames& stack = *StackTrace::GetStackFrames();\n        StackReverseIterator imageIt = GetNextImageFromStack(stack.rbegin(), stack.rend());\n\n        if (imageIt != stack.rend())\n        {\n            return imageIt->method->declaring_type->image;\n        }\n\n        // Fallback to corlib if no image is found\n        return const_cast<Il2CppImage*>(Image::GetCorlib());\n    }\n\n    const Il2CppImage* Image::GetCallingImage()\n    {\n        const il2cpp::vm::StackFrames& stack = *StackTrace::GetStackFrames();\n        StackReverseIterator imageIt = GetNextImageFromStack(stack.rbegin(), stack.rend());\n\n        if (imageIt != stack.rend())\n        {\n            imageIt = GetNextImageFromStack(++imageIt, stack.rend());\n\n            if (imageIt != stack.rend())\n            {\n                return imageIt->method->declaring_type->image;\n            }\n        }\n\n        // Fallback to corlib if no image is found\n        return const_cast<Il2CppImage*>(Image::GetCorlib());\n    }\n\n    const char * Image::GetName(const Il2CppImage* image)\n    {\n        return image->name;\n    }\n\n    const char * Image::GetFileName(const Il2CppImage* image)\n    {\n        return image->name;\n    }\n\n    const MethodInfo* Image::GetEntryPoint(const Il2CppImage* image)\n    {\n        if (image->entryPointIndex == -1)\n            return NULL;\n        return MetadataCache::GetMethodInfoFromMethodDefinitionIndex(image->entryPointIndex);\n    }\n\n    Il2CppImage* Image::GetCorlib()\n    {\n        return il2cpp_defaults.corlib;\n    }\n\n    static os::FastMutex s_ClassFromNameMutex;\n\n// This must be called when the s_ClassFromNameMutex is held.\n    static void AddTypeToNametoClassHashTable(Il2CppNameToTypeDefinitionIndexHashTable* hashTable, TypeDefinitionIndex typeIndex)\n    {\n        const Il2CppTypeDefinition* typeDefinition = MetadataCache::GetTypeDefinitionFromIndex(typeIndex);\n        // don't add nested types\n        if (typeDefinition->declaringTypeIndex != kTypeIndexInvalid)\n            return;\n\n        hashTable->insert(std::make_pair(std::make_pair(MetadataCache::GetStringFromIndex(typeDefinition->namespaceIndex), MetadataCache::GetStringFromIndex(typeDefinition->nameIndex)), typeIndex));\n    }\n\n    Il2CppClass* Image::ClassFromName(const Il2CppImage* image, const char* namespaze, const char *name)\n    {\n        if (!image->nameToClassHashTable)\n        {\n            os::FastAutoLock lock(&s_ClassFromNameMutex);\n            if (!image->nameToClassHashTable)\n            {\n                image->nameToClassHashTable = new Il2CppNameToTypeDefinitionIndexHashTable();\n                for (uint32_t index = 0; index < image->typeCount; index++)\n                {\n                    TypeDefinitionIndex typeIndex = image->typeStart + index;\n                    AddTypeToNametoClassHashTable(image->nameToClassHashTable, typeIndex);\n                }\n\n                for (uint32_t index = 0; index < image->exportedTypeCount; index++)\n                {\n                    TypeDefinitionIndex typeIndex = MetadataCache::GetExportedTypeFromIndex(image->exportedTypeStart + index);\n                    if (typeIndex != kTypeIndexInvalid)\n                        AddTypeToNametoClassHashTable(image->nameToClassHashTable, typeIndex);\n                }\n            }\n        }\n\n        Il2CppNameToTypeDefinitionIndexHashTable::const_iterator iter = image->nameToClassHashTable->find(std::make_pair(namespaze, name));\n        if (iter != image->nameToClassHashTable->end())\n            return MetadataCache::GetTypeInfoFromTypeDefinitionIndex(iter->second);\n\n        return NULL;\n    }\n\n    void Image::GetTypes(const Il2CppImage* image, bool exportedOnly, TypeVector* target)\n    {\n        size_t typeCount = Image::GetNumTypes(image);\n\n        for (size_t sourceIndex = 0; sourceIndex < typeCount; sourceIndex++)\n        {\n            const Il2CppClass* type = Image::GetType(image, sourceIndex);\n            if (strcmp(type->name, \"<Module>\") == 0)\n            {\n                continue;\n            }\n\n            target->push_back(type);\n        }\n    }\n\n    size_t Image::GetNumTypes(const Il2CppImage* image)\n    {\n        return image->typeCount;\n    }\n\n    const Il2CppClass* Image::GetType(const Il2CppImage* image, size_t index)\n    {\n        size_t typeDefinitionIndex = image->typeStart + index;\n        IL2CPP_ASSERT(typeDefinitionIndex <= static_cast<size_t>(std::numeric_limits<TypeDefinitionIndex>::max()));\n        return MetadataCache::GetTypeInfoFromTypeDefinitionIndex(static_cast<TypeDefinitionIndex>(typeDefinitionIndex));\n    }\n\n    static bool StringsMatch(const char* left, const char* right, bool ignoreCase)\n    {\n        if (!ignoreCase)\n        {\n            return strcmp(left, right) == 0;\n        }\n        else\n        {\n            utils::VmStringUtils::CaseInsensitiveComparer comparer;\n            return comparer(left, right);\n        }\n    }\n\n    static Il2CppClass* FindClassMatching(const Il2CppImage* image, const char* namespaze, const char *name, Il2CppClass* declaringType, bool ignoreCase)\n    {\n        for (uint32_t i = 0; i < image->typeCount; i++)\n        {\n            Il2CppClass* type = MetadataCache::GetTypeInfoFromTypeDefinitionIndex(image->typeStart + i);\n            if (type->declaringType == declaringType && StringsMatch(namespaze, type->namespaze, ignoreCase) && StringsMatch(name, type->name, ignoreCase))\n            {\n                return type;\n            }\n        }\n\n        return NULL;\n    }\n\n    static Il2CppClass* FindExportedClassMatching(const Il2CppImage* image, const char* namespaze, const char *name, Il2CppClass* declaringType, bool ignoreCase)\n    {\n        for (uint32_t i = 0; i < image->exportedTypeCount; i++)\n        {\n            TypeDefinitionIndex typeIndex = MetadataCache::GetExportedTypeFromIndex(image->exportedTypeStart + i);\n            if (typeIndex != kTypeIndexInvalid)\n            {\n                Il2CppClass* type = MetadataCache::GetTypeInfoFromTypeDefinitionIndex(typeIndex);\n                if (type->declaringType == declaringType && StringsMatch(namespaze, type->namespaze, ignoreCase) && StringsMatch(name, type->name, ignoreCase))\n                {\n                    return type;\n                }\n            }\n        }\n\n        return NULL;\n    }\n\n    static Il2CppClass* FindNestedType(Il2CppClass* klass, const char* name)\n    {\n        void* iter = NULL;\n        while (Il2CppClass* nestedType = Class::GetNestedTypes(klass, &iter))\n        {\n            if (!strcmp(name, nestedType->name))\n                return nestedType;\n        }\n\n        return NULL;\n    }\n\n    Il2CppClass* Image::FromTypeNameParseInfo(const Il2CppImage* image, const TypeNameParseInfo &info, bool ignoreCase)\n    {\n        const char* ns = info.ns().c_str();\n        const char* name = info.name().c_str();\n        Il2CppClass *parent_class = FindClassMatching(image, ns, name, NULL, ignoreCase);\n\n        if (parent_class == NULL)\n        {\n            parent_class = FindExportedClassMatching(image, ns, name, NULL, ignoreCase);\n            if (parent_class == NULL)\n                return NULL;\n        }\n\n        std::vector<std::string>::const_iterator it = info.nested().begin();\n\n        while (it != info.nested().end())\n        {\n            parent_class = FindNestedType(parent_class, (*it).c_str());\n\n            if (parent_class == NULL)\n                return NULL;\n\n            ++it;\n        }\n\n        return parent_class;\n    }\n\n    static os::FastMutex s_Mutex;\n    static std::vector<Image::EmbeddedResourceData> s_CachedResourceData;\n    static std::map<Il2CppReflectionAssembly*, void*> s_CachedMemoryMappedResourceFiles;\n\n    void Image::CacheMemoryMappedResourceFile(Il2CppReflectionAssembly* assembly, void* memoryMappedFile)\n    {\n        os::FastAutoLock lock(&s_Mutex);\n        s_CachedMemoryMappedResourceFiles[assembly] = memoryMappedFile;\n    }\n\n    void* Image::GetCachedMemoryMappedResourceFile(Il2CppReflectionAssembly* assembly)\n    {\n        os::FastAutoLock lock(&s_Mutex);\n        std::map<Il2CppReflectionAssembly*, void*>::iterator entry = s_CachedMemoryMappedResourceFiles.find(assembly);\n        if (entry != s_CachedMemoryMappedResourceFiles.end())\n            return entry->second;\n\n        return NULL;\n    }\n\n    void Image::CacheResourceData(EmbeddedResourceRecord record, void* data)\n    {\n        os::FastAutoLock lock(&s_Mutex);\n        s_CachedResourceData.push_back(EmbeddedResourceData(record, data));\n    }\n\n    void* Image::GetCachedResourceData(const Il2CppImage* image, const std::string& name)\n    {\n        os::FastAutoLock lock(&s_Mutex);\n        for (std::vector<EmbeddedResourceData>::iterator it = s_CachedResourceData.begin(); it != s_CachedResourceData.end(); ++it)\n        {\n            if (it->record.image == image && it->record.name == name)\n                return it->data;\n        }\n\n        return NULL;\n    }\n\n    void Image::ClearCachedResourceData()\n    {\n        os::FastAutoLock lock(&s_Mutex);\n        for (std::map<Il2CppReflectionAssembly*, void*>::iterator i = s_CachedMemoryMappedResourceFiles.begin(); i != s_CachedMemoryMappedResourceFiles.end(); ++i)\n            os::MemoryMappedFile::Unmap(i->second);\n\n        s_CachedMemoryMappedResourceFiles.clear();\n        s_CachedResourceData.clear();\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Image.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <string>\n#include <vector>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppClass;\nstruct MethodInfo;\nstruct Il2CppAssembly;\nstruct Il2CppDelegate;\nstruct Il2CppImage;\nstruct Il2CppType;\nstruct Il2CppGenericContext;\nstruct Il2CppGenericContainer;\nstruct Il2CppReflectionAssembly;\nstruct Il2CppArray;\nclass AssemblyVector;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    typedef std::vector<const Il2CppClass*> TypeVector;\n\n    class TypeNameParseInfo;\n\n    struct EmbeddedResourceRecord\n    {\n        EmbeddedResourceRecord(const Il2CppImage* image, const std::string& name, uint32_t offset, uint32_t size)\n            : image(image), name(name), offset(offset), size(size)\n        {}\n\n        const Il2CppImage* image;\n        std::string name;\n        uint32_t offset;\n        uint32_t size;\n    };\n\n    class LIBIL2CPP_CODEGEN_API Image\n    {\n// exported\n    public:\n        static Il2CppImage* GetCorlib();\n\n    public:\n        static const char * GetName(const Il2CppImage* image);\n        static const char * GetFileName(const Il2CppImage* image);\n        static const Il2CppAssembly* GetAssembly(const Il2CppImage* image);\n        static const MethodInfo* GetEntryPoint(const Il2CppImage* image);\n        static const Il2CppImage* GetExecutingImage();\n        static const Il2CppImage* GetCallingImage();\n        static size_t GetNumTypes(const Il2CppImage* image);\n        static const Il2CppClass* GetType(const Il2CppImage* image, size_t index);\n        static Il2CppClass* FromTypeNameParseInfo(const Il2CppImage* image, const TypeNameParseInfo &info, bool ignoreCase);\n        static Il2CppClass* ClassFromName(const Il2CppImage* image, const char* namespaze, const char *name);\n        static void GetTypes(const Il2CppImage* image, bool exportedOnly, TypeVector* target);\n\n        struct EmbeddedResourceData\n        {\n            EmbeddedResourceData(EmbeddedResourceRecord record, void* data)\n                : record(record), data(data)\n            {}\n\n            EmbeddedResourceRecord record;\n            void* data;\n        };\n\n        static void CacheMemoryMappedResourceFile(Il2CppReflectionAssembly* assembly, void* memoryMappedFile);\n        static void* GetCachedMemoryMappedResourceFile(Il2CppReflectionAssembly* assembly);\n        static void CacheResourceData(EmbeddedResourceRecord record, void* data);\n        static void* GetCachedResourceData(const Il2CppImage* image, const std::string& name);\n        static void ClearCachedResourceData();\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/InternalCalls.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"vm/InternalCalls.h\"\n#include \"vm/Runtime.h\"\n\n#include <map>\n#include <string>\n\ntypedef std::map<std::string, Il2CppMethodPointer> ICallMap;\nstatic ICallMap s_InternalCalls;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    void InternalCalls::Add(const char* name, Il2CppMethodPointer method)\n    {\n        //ICallMap::iterator res = s_InternalCalls.find(name);\n\n        // TODO: Don't assert right now because Unity adds some icalls multiple times.\n        //if (res != icalls.end())\n        //  IL2CPP_ASSERT(0 && \"Adding internal call twice!\");\n\n        IL2CPP_ASSERT(method);\n\n        s_InternalCalls[name] = method;\n    }\n\n    Il2CppMethodPointer InternalCalls::Resolve(const char* name)\n    {\n        // Try to find the whole name first, then search using just type::method\n        // if parameters were passed\n        // ex: First, System.Foo::Bar(System.Int32)\n        // Then, System.Foo::Bar\n        ICallMap::iterator res = s_InternalCalls.find(name);\n\n        if (res != s_InternalCalls.end())\n            return res->second;\n\n        std::string shortName(name);\n        size_t index = shortName.find('(');\n\n        if (index != std::string::npos)\n        {\n            shortName = shortName.substr(0, index);\n            res = s_InternalCalls.find(shortName);\n\n            if (res != s_InternalCalls.end())\n                return res->second;\n        }\n\n        return NULL;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/InternalCalls.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API InternalCalls\n    {\n    public:\n        static void Init();\n        static void Add(const char* name, Il2CppMethodPointer method);\n        static Il2CppMethodPointer Resolve(const char* name);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/LastError.cpp",
    "content": "#include \"LastError.h\"\n#include \"Thread.h\"\n#include \"os/LastError.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    int32_t LastError::s_LastErrorThreadLocalStorageOffset = -1;\n\n    uint32_t LastError::GetLastError()\n    {\n        if (s_LastErrorThreadLocalStorageOffset == -1)\n            return 0;\n\n        return *(uint32_t*)Thread::GetThreadStaticData(s_LastErrorThreadLocalStorageOffset);\n    }\n\n    void LastError::StoreLastError()\n    {\n        // Get the last error first, before any other calls (so that we don't stomp on it).\n        uint32_t lastError = os::LastError::GetLastError();\n\n        uint32_t* lastErrorTls = (uint32_t*)Thread::GetThreadStaticData(s_LastErrorThreadLocalStorageOffset);\n        *lastErrorTls = lastError;\n    }\n\n    void LastError::InitializeLastErrorThreadStatic()\n    {\n        if (s_LastErrorThreadLocalStorageOffset == -1)\n            s_LastErrorThreadLocalStorageOffset = Thread::AllocThreadStaticData(sizeof(uint32_t));\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/LastError.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API LastError\n    {\n    public:\n        static uint32_t GetLastError();\n        static void StoreLastError();\n\n        static void InitializeLastErrorThreadStatic();\n\n    private:\n        static int32_t s_LastErrorThreadLocalStorageOffset;\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/LibraryLoader.cpp",
    "content": "#include \"LibraryLoader.h\"\n#include \"os/LibraryLoader.h\"\n#include \"utils/StringUtils.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    static Il2CppSetFindPlugInCallback s_FindPluginCallback = NULL;\n\n    void* LibraryLoader::LoadLibrary(il2cpp::utils::StringView<Il2CppNativeChar> nativeDynamicLibrary)\n    {\n        if (s_FindPluginCallback)\n        {\n            StringViewAsNullTerminatedStringOf(Il2CppNativeChar, nativeDynamicLibrary, libraryName);\n            const Il2CppNativeChar* modifiedLibraryName = s_FindPluginCallback(libraryName);\n\n            if (modifiedLibraryName != libraryName)\n            {\n                utils::StringView<Il2CppNativeChar> modifiedDynamicLibrary(modifiedLibraryName, utils::StringUtils::StrLen(modifiedLibraryName));\n                return os::LibraryLoader::LoadDynamicLibrary(modifiedDynamicLibrary);\n            }\n        }\n\n        return os::LibraryLoader::LoadDynamicLibrary(nativeDynamicLibrary);\n    }\n\n    void LibraryLoader::SetFindPluginCallback(Il2CppSetFindPlugInCallback method)\n    {\n        IL2CPP_ASSERT(method == NULL || s_FindPluginCallback == NULL);\n        s_FindPluginCallback = method;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/LibraryLoader.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"utils/StringView.h\"\n\nstruct PInvokeArguments;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API LibraryLoader\n    {\n    public:\n        static void* LoadLibrary(il2cpp::utils::StringView<Il2CppNativeChar> nativeDynamicLibrary);\n        static void SetFindPluginCallback(Il2CppSetFindPlugInCallback method);\n    };\n} /* namespace vm */\n} /* namespace il2cpp*/\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Liveness.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"gc/GarbageCollector.h\"\n#include <utils/dynamic_array.h>\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Field.h\"\n#include \"vm/Liveness.h\"\n#include \"vm/Type.h\"\n#include \"tabledefs.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n\ntypedef il2cpp::utils::dynamic_array<Il2CppObject*> custom_growable_array;\n\n#define MARK_OBJ(obj) \\\n    do { \\\n        (obj)->klass = (Il2CppClass*)(((size_t)(obj)->klass) | (size_t)1); \\\n    } while (0)\n\n#define CLEAR_OBJ(obj) \\\n    do { \\\n        (obj)->klass = (Il2CppClass*)(((size_t)(obj)->klass) & ~(size_t)1); \\\n    } while (0)\n\n#define IS_MARKED(obj) \\\n    (((size_t)(obj)->klass) & (size_t)1)\n\n#define GET_CLASS(obj) \\\n    ((Il2CppClass*)(((size_t)(obj)->klass) & ~(size_t)1))\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    /* number of sub elements of an array to process before recursing\n    * we take a depth first approach to use stack space rather than re-allocating\n    * processing array which requires restarting world to ensure allocator lock is not held\n    */\n    const int kArrayElementsPerChunk = 256;\n\n    /* how far we recurse processing array elements before we stop. Prevents stack overflow */\n    const int kMaxTraverseRecursionDepth = 128;\n\n    struct LivenessState\n    {\n        LivenessState(Il2CppClass* filter, uint32_t maxCount, Liveness::register_object_callback callback, void*callback_userdata, Liveness::WorldChangedCallback onWorldStarted, Liveness::WorldChangedCallback onWorldStopped);\n        ~LivenessState();\n\n        void Finalize();\n        void Reset();\n        void TraverseObjects();\n        void FilterObjects();\n\n        static void TraverseGenericObject(Il2CppObject* object, LivenessState* state);\n        static void TraverseObject(Il2CppObject* object, LivenessState* state);\n        static void TraverseGCDescriptor(Il2CppObject* object, LivenessState* state);\n        static bool TraverseObjectInternal(Il2CppObject* object, bool isStruct, Il2CppClass* klass, LivenessState* state);\n        static void TraverseArray(Il2CppArray* array, LivenessState* state);\n        static bool AddProcessObject(Il2CppObject* object, LivenessState* state);\n        static bool ShouldProcessValue(Il2CppObject* val, Il2CppClass* filter);\n        static bool FieldCanContainReferences(FieldInfo* field);\n        void SafeGrowArray(custom_growable_array* array);\n\n        static bool ShouldTraverseObjects(size_t index, int32_t recursion_depth)\n        {\n            // Add kArrayElementsPerChunk objects at a time and then traverse\n            return ((index + 1) & (kArrayElementsPerChunk - 1)) == 0 && recursion_depth < kMaxTraverseRecursionDepth;\n        }\n\n        int32_t                first_index_in_all_objects;\n        custom_growable_array* all_objects;\n\n        Il2CppClass*          filter;\n\n        custom_growable_array* process_array;\n        uint32_t               initial_alloc_count;\n\n        void*               callback_userdata;\n\n        Liveness::register_object_callback filter_callback;\n        Liveness::WorldChangedCallback onWorldStarted;\n        Liveness::WorldChangedCallback onWorldStopped;\n        int32_t               traverse_depth; // track recursion. Prevent stack overflow by limiting recurion\n    };\n\n    LivenessState::LivenessState(Il2CppClass* filter, uint32_t maxCount, Liveness::register_object_callback callback, void*callback_userdata, Liveness::WorldChangedCallback onWorldStarted, Liveness::WorldChangedCallback onWorldStopped) :\n        first_index_in_all_objects(0),\n        all_objects(NULL),\n        filter(NULL),\n        process_array(NULL),\n        initial_alloc_count(0),\n        callback_userdata(NULL),\n        filter_callback(NULL),\n        onWorldStarted(onWorldStarted),\n        onWorldStopped(onWorldStopped)\n    {\n// construct liveness_state;\n// allocate memory for the following structs\n// all_objects: contains a list of all referenced objects to be able to clean the vtable bits after the traversal\n// process_array. array that contains the objcets that should be processed. this should run depth first to reduce memory usage\n// if all_objects run out of space, run through list, add objects that match the filter, clear bit in vtable and then clear the array.\n\n        maxCount = maxCount < 1000 ? 1000 : maxCount;\n        all_objects = new custom_growable_array();\n        all_objects->reserve(maxCount * 4);\n        process_array = new custom_growable_array();\n        process_array->reserve(maxCount);\n\n        first_index_in_all_objects = 0;\n        this->filter = filter;\n\n        this->callback_userdata = callback_userdata;\n        this->filter_callback = callback;\n    }\n\n    LivenessState::~LivenessState()\n    {\n        delete all_objects;\n        delete process_array;\n    }\n\n    void LivenessState::Finalize()\n    {\n        for (size_t i = 0; i < all_objects->size(); i++)\n        {\n            Il2CppObject* object = (*all_objects)[i];\n            CLEAR_OBJ(object);\n        }\n    }\n\n    void LivenessState::Reset()\n    {\n        first_index_in_all_objects = (int32_t)all_objects->size();\n        process_array->resize_uninitialized(0);\n    }\n\n    void LivenessState::TraverseObjects()\n    {\n        Il2CppObject* object = NULL;\n\n        traverse_depth++;\n        while (process_array->size() > 0)\n        {\n            object = process_array->back();\n            process_array->pop_back();\n            TraverseGenericObject(object, this);\n        }\n        traverse_depth--;\n    }\n\n    void LivenessState::FilterObjects()\n    {\n        Il2CppObject* filtered_objects[64];\n        int32_t num_objects = 0;\n\n        size_t i = (size_t)first_index_in_all_objects;\n        for (; i < all_objects->size(); i++)\n        {\n            Il2CppObject* object = (*all_objects)[i];\n            if (ShouldProcessValue(object, filter))\n                filtered_objects[num_objects++] = object;\n            if (num_objects == 64)\n            {\n                filter_callback(filtered_objects, 64, callback_userdata);\n                num_objects = 0;\n            }\n        }\n\n        if (num_objects != 0)\n            filter_callback(filtered_objects, num_objects, callback_userdata);\n    }\n\n    void LivenessState::TraverseGenericObject(Il2CppObject* object, LivenessState* state)\n    {\n        NOT_IMPLEMENTED_NO_ASSERT(LivenessState::TraverseGenericObject, \"Use GC bitmap when we have one\");\n\n#if IL2CPP_HAS_GC_DESCRIPTORS\n        size_t gc_desc = (size_t)(GET_CLASS(object)->gc_desc);\n\n        if (gc_desc & (size_t)1)\n            TraverseGCDescriptor(object, state);\n        else\n#endif\n        if (GET_CLASS(object)->rank)\n            TraverseArray((Il2CppArray*)object, state);\n        else\n            TraverseObject(object, state);\n    }\n\n    void LivenessState::TraverseObject(Il2CppObject* object, LivenessState* state)\n    {\n        TraverseObjectInternal(object, false, GET_CLASS(object), state);\n    }\n\n    void LivenessState::TraverseGCDescriptor(Il2CppObject* object, LivenessState* state)\n    {\n#define WORDSIZE ((int)sizeof(size_t)*8)\n        int i = 0;\n        size_t mask = (size_t)(GET_CLASS(object)->gc_desc);\n\n        IL2CPP_ASSERT(mask & (size_t)1);\n\n        for (i = 0; i < WORDSIZE - 2; i++)\n        {\n            size_t offset = ((size_t)1 << (WORDSIZE - 1 - i));\n            if (mask & offset)\n            {\n                Il2CppObject* val = *(Il2CppObject**)(((char*)object) + i * sizeof(void*));\n                AddProcessObject(val, state);\n            }\n        }\n    }\n\n    bool LivenessState::TraverseObjectInternal(Il2CppObject* object, bool isStruct, Il2CppClass* klass, LivenessState* state)\n    {\n        FieldInfo *field;\n        Il2CppClass *p;\n        bool added_objects = false;\n\n        IL2CPP_ASSERT(object);\n\n        if (!klass->initialized)\n        {\n            IL2CPP_ASSERT(isStruct);\n            return false;\n        }\n\n        // subtract the added offset for the vtable. This is added to the offset even though it is a struct\n        if (isStruct)\n            object--;\n\n        for (p = klass; p != NULL; p = p->parent)\n        {\n            void* iter = NULL;\n            while ((field = Class::GetFields(p, &iter)))\n            {\n                if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n                    continue;\n\n                if (!FieldCanContainReferences(field))\n                    continue;\n\n                if (Type::IsStruct(field->type))\n                {\n                    char* offseted = (char*)object;\n                    offseted += field->offset;\n                    if (Type::IsGenericInstance(field->type))\n                    {\n                        IL2CPP_ASSERT(field->type->data.generic_class->cached_class);\n                        added_objects |= TraverseObjectInternal((Il2CppObject*)offseted, true, field->type->data.generic_class->cached_class, state);\n                    }\n                    else\n                        added_objects |= TraverseObjectInternal((Il2CppObject*)offseted, true, Type::GetClass(field->type), state);\n                    continue;\n                }\n\n                if (field->offset == THREAD_STATIC_FIELD_OFFSET)\n                {\n                    IL2CPP_ASSERT(0);\n                }\n                else\n                {\n                    Il2CppObject* val = NULL;\n                    Field::GetValue(object, field, &val);\n                    added_objects |= AddProcessObject(val, state);\n                }\n            }\n        }\n\n        return added_objects;\n    }\n\n    void LivenessState::TraverseArray(Il2CppArray* array, LivenessState* state)\n    {\n        size_t i = 0;\n        bool has_references;\n        Il2CppObject* object = (Il2CppObject*)array;\n        Il2CppClass* element_class;\n        size_t elementClassSize;\n        size_t array_length;\n\n        IL2CPP_ASSERT(object);\n\n        element_class = GET_CLASS(object)->element_class;\n        has_references = !Class::IsValuetype(element_class);\n        IL2CPP_ASSERT(element_class->size_inited != 0);\n\n        FieldInfo* field;\n        void* iter = NULL;\n        while ((field = Class::GetFields(element_class, &iter)))\n        {\n            has_references |= FieldCanContainReferences(field);\n            if (has_references)\n                break;\n        }\n\n        if (!has_references)\n            return;\n\n        array_length = Array::GetLength(array);\n        if (element_class->valuetype)\n        {\n            size_t items_processed = 0;\n            elementClassSize = Class::GetArrayElementSize(element_class);\n            for (i = 0; i < array_length; i++)\n            {\n                Il2CppObject* object = (Il2CppObject*)il2cpp_array_addr_with_size(array, (int32_t)elementClassSize, i);\n                if (TraverseObjectInternal(object, 1, element_class, state))\n                    items_processed++;\n\n                // Add 64 objects at a time and then traverse\n                if (ShouldTraverseObjects(items_processed, state->traverse_depth))\n                    state->TraverseObjects();\n            }\n        }\n        else\n        {\n            size_t items_processed = 0;\n            for (i = 0; i < array_length; i++)\n            {\n                Il2CppObject* val =  il2cpp_array_get(array, Il2CppObject*, i);\n                if (AddProcessObject(val, state))\n                    items_processed++;\n\n                // Add 64 objects at a time and then traverse\n                if (ShouldTraverseObjects(items_processed, state->traverse_depth))\n                    state->TraverseObjects();\n            }\n        }\n    }\n\n    bool LivenessState::AddProcessObject(Il2CppObject* object, LivenessState* state)\n    {\n        if (!object || IS_MARKED(object))\n            return false;\n\n        bool has_references = GET_CLASS(object)->has_references;\n        if (has_references || ShouldProcessValue(object, state->filter))\n        {\n            // TODO\n            if (state->all_objects->size() == state->all_objects->capacity())\n                state->SafeGrowArray(state->all_objects);\n            state->all_objects->push_back(object);\n            MARK_OBJ(object);\n        }\n        // Check if klass has further references - if not skip adding\n        if (has_references)\n        {\n            if (state->process_array->size() == state->process_array->capacity())\n                state->SafeGrowArray(state->process_array);\n            state->process_array->push_back(object);\n            return true;\n        }\n\n        return false;\n    }\n\n    bool LivenessState::ShouldProcessValue(Il2CppObject* val, Il2CppClass* filter)\n    {\n        Il2CppClass* val_class = GET_CLASS(val);\n        if (filter && !Class::HasParentUnsafe(val_class, filter))\n            return false;\n\n        return true;\n    }\n\n    bool LivenessState::FieldCanContainReferences(FieldInfo* field)\n    {\n        if (Type::IsStruct(field->type))\n            return true;\n        if (field->type->attrs & FIELD_ATTRIBUTE_LITERAL)\n            return false;\n        if (field->type->type == IL2CPP_TYPE_STRING)\n            return false;\n        return Type::IsReference(field->type);\n    }\n\n    void LivenessState::SafeGrowArray(custom_growable_array* array)\n    {\n        // if all_objects run out of space, run through list\n        // clear bit in vtable, start the world, reallocate, stop the world and continue\n        for (size_t i = 0; i < all_objects->size(); i++)\n        {\n            Il2CppObject* object = (*all_objects)[i];\n            CLEAR_OBJ(object);\n        }\n        Liveness::StartWorld(onWorldStarted);\n        array->reserve(array->capacity() * 2);\n        Liveness::StopWorld(onWorldStopped);\n        for (size_t i = 0; i < all_objects->size(); i++)\n        {\n            Il2CppObject* object = (*all_objects)[i];\n            MARK_OBJ(object);\n        }\n    }\n\n    void* Liveness::Begin(Il2CppClass* filter, int max_object_count, register_object_callback callback, void* userdata, WorldChangedCallback onWorldStarted, WorldChangedCallback onWorldStopped)\n    {\n        // ensure filter is initialized so we can do fast (and lock free) check HasParentUnsafe\n        Class::SetupTypeHierarchy(filter);\n        LivenessState* state = new LivenessState(filter, max_object_count, callback, userdata, onWorldStarted, onWorldStopped);\n        StopWorld(onWorldStopped);\n        // no allocations can happen beyond this point\n        return state;\n    }\n\n    void Liveness::End(void* state)\n    {\n        LivenessState* lstate = (LivenessState*)state;\n        lstate->Finalize();\n\n        WorldChangedCallback onWorldStarted = lstate->onWorldStarted;\n        StartWorld(onWorldStarted);\n\n        delete lstate;\n    }\n\n    void Liveness::FromRoot(Il2CppObject* root, void* state)\n    {\n        LivenessState* liveness_state = (LivenessState*)state;\n        liveness_state->Reset();\n\n        liveness_state->process_array->push_back(root);\n\n        liveness_state->TraverseObjects();\n\n        //Filter objects and call callback to register found objects\n        liveness_state->FilterObjects();\n    }\n\n    void Liveness::FromStatics(void* state)\n    {\n        LivenessState* liveness_state = (LivenessState*)state;\n        const il2cpp::utils::dynamic_array<Il2CppClass*>& classesWithStatics = Class::GetStaticFieldData();\n\n        liveness_state->Reset();\n\n        for (il2cpp::utils::dynamic_array<Il2CppClass*>::const_iterator iter = classesWithStatics.begin();\n             iter != classesWithStatics.end();\n             iter++)\n        {\n            Il2CppClass* klass = *iter;\n            FieldInfo *field;\n            if (!klass)\n                continue;\n            if (klass->image == il2cpp_defaults.corlib)\n                continue;\n            if (klass->size_inited == 0)\n                continue;\n\n            void* fieldIter = NULL;\n            while ((field = Class::GetFields(klass, &fieldIter)))\n            {\n                if (!(field->type->attrs & FIELD_ATTRIBUTE_STATIC))\n                    continue;\n                if (!LivenessState::FieldCanContainReferences(field))\n                    continue;\n                // shortcut check for thread-static field\n                if (field->offset == THREAD_STATIC_FIELD_OFFSET)\n                    continue;\n\n                if (Type::IsStruct(field->type))\n                {\n                    char* offseted = (char*)klass->static_fields;\n                    offseted += field->offset;\n                    if (Type::IsGenericInstance(field->type))\n                    {\n                        IL2CPP_ASSERT(field->type->data.generic_class->cached_class);\n                        LivenessState::TraverseObjectInternal((Il2CppObject*)offseted, true, field->type->data.generic_class->cached_class, liveness_state);\n                    }\n                    else\n                    {\n                        LivenessState::TraverseObjectInternal((Il2CppObject*)offseted, true, Type::GetClass(field->type), liveness_state);\n                    }\n                }\n                else\n                {\n                    Il2CppObject* val = NULL;\n\n                    Field::StaticGetValue(field, &val);\n\n                    if (val)\n                    {\n                        LivenessState::AddProcessObject(val, liveness_state);\n                    }\n                }\n            }\n        }\n        liveness_state->TraverseObjects();\n        //Filter objects and call callback to register found objects\n        liveness_state->FilterObjects();\n    }\n\n    void Liveness::StopWorld(WorldChangedCallback onWorldStopped)\n    {\n        onWorldStopped();\n        il2cpp::gc::GarbageCollector::StopWorld();\n    }\n\n    void Liveness::StartWorld(WorldChangedCallback onWorldStarted)\n    {\n        il2cpp::gc::GarbageCollector::StartWorld();\n        onWorldStarted();\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Liveness.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppClass;\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Liveness\n    {\n    public:\n        typedef void (*register_object_callback)(Il2CppObject** arr, int size, void* userdata);\n        typedef void (*WorldChangedCallback)();\n        static void* Begin(Il2CppClass* filter, int max_object_count, register_object_callback callback, void* userdata, WorldChangedCallback onWorldStarted, WorldChangedCallback onWorldStopped);\n        static void End(void* state);\n        static void FromRoot(Il2CppObject* root, void* state);\n        static void FromStatics(void* state);\n        static void StopWorld(WorldChangedCallback onWorldStopped);\n        static void StartWorld(WorldChangedCallback onWorldStarted);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/MarshalAlloc.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"MarshalAlloc.h\"\n#include \"os/MarshalAlloc.h\"\n#include \"os/ThreadLocalValue.h\"\n#include \"vm/Exception.h\"\n#include <deque>\n#include <vector>\n\nnamespace il2cpp\n{\nnamespace vm\n{\n#if _DEBUG\n    static os::ThreadLocalValue s_Allocations;\n\n    static os::FastMutex s_AllocationStorageMutex;\n    static std::deque<std::vector<std::map<void*, size_t> > > s_AllocationStorage;\n\n    static std::vector<std::map<void*, size_t> >& GetAllocationsForCurrentThread()\n    {\n        std::vector<std::map<void*, size_t> >* ptr = NULL;\n        s_Allocations.GetValue(reinterpret_cast<void**>(&ptr));\n        if (ptr == NULL)\n        {\n            os::FastAutoLock lock(&s_AllocationStorageMutex);\n            s_AllocationStorage.push_back(std::vector<std::map<void*, size_t> >());\n            ptr = &s_AllocationStorage.back();\n            s_Allocations.SetValue(ptr);\n        }\n\n        return *ptr;\n    }\n\n    static std::map<void*, size_t>* GetAllocationsForCurrentFrame()\n    {\n        std::vector<std::map<void*, size_t> >& currentThreadAllocations = GetAllocationsForCurrentThread();\n        if (currentThreadAllocations.size() > 0)\n            return &currentThreadAllocations.back();\n\n        return NULL;\n    }\n\n#endif\n\n    void* MarshalAlloc::Allocate(size_t size)\n    {\n        void* ptr = os::MarshalAlloc::Allocate(size);\n\n#if _DEBUG\n        std::map<void*, size_t>* allocations = GetAllocationsForCurrentFrame();\n        if (allocations != NULL)\n            (*allocations)[ptr] = size;\n#endif\n\n        return ptr;\n    }\n\n    void* MarshalAlloc::ReAlloc(void* ptr, size_t size)\n    {\n        void* realloced = os::MarshalAlloc::ReAlloc(ptr, size);\n\n#if _DEBUG\n        std::map<void*, size_t>* allocations = GetAllocationsForCurrentFrame();\n        if (allocations != NULL)\n        {\n            if (ptr != NULL && ptr != realloced)\n            {\n                std::map<void*, size_t>::iterator found = allocations->find(ptr);\n                IL2CPP_ASSERT(found != allocations->end() && \"Invalid call to MarshalAlloc::ReAlloc. The pointer is not in the allocation list.\");\n                allocations->erase(found);\n            }\n\n            (*allocations)[realloced] = size;\n        }\n#endif\n\n        return realloced;\n    }\n\n    void MarshalAlloc::Free(void* ptr)\n    {\n#if _DEBUG\n        std::map<void*, size_t>* allocations = GetAllocationsForCurrentFrame();\n        if (allocations != NULL)\n        {\n            std::map<void*, size_t>::iterator found = allocations->find(ptr);\n            if (found != allocations->end()) // It might not be necessarily allocated by us, e.g. we might be freeing memory that's returned from native P/Invoke call\n                allocations->erase(found);\n        }\n#endif\n\n        os::MarshalAlloc::Free(ptr);\n    }\n\n    void* MarshalAlloc::AllocateHGlobal(size_t size)\n    {\n        // should use Unity's memory management here!\n        return malloc(size);\n    }\n\n    void* MarshalAlloc::ReAllocHGlobal(void* ptr, size_t size)\n    {\n        // should use Unity's memory management here!\n        return realloc(ptr, size);\n    }\n\n    void MarshalAlloc::FreeHGlobal(void* ptr)\n    {\n        // should use Unity's memory management here!\n        free(ptr);\n    }\n\n#if _DEBUG\n\n    void MarshalAlloc::PushAllocationFrame()\n    {\n        GetAllocationsForCurrentThread().push_back(std::map<void*, size_t>());\n    }\n\n    void MarshalAlloc::PopAllocationFrame()\n    {\n        GetAllocationsForCurrentThread().pop_back();\n    }\n\n    bool MarshalAlloc::HasUnfreedAllocations()\n    {\n        std::map<void*, size_t>* allocations = GetAllocationsForCurrentFrame();\n        return allocations != NULL && allocations->size() > 0;\n    }\n\n    void MarshalAlloc::ClearAllTrackedAllocations()\n    {\n        std::map<void*, size_t>* allocations = GetAllocationsForCurrentFrame();\n        if (allocations != NULL)\n            allocations->clear();\n    }\n\n#endif\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/MarshalAlloc.h",
    "content": "#pragma once\n#include \"il2cpp-config.h\"\n\n#if _DEBUG\n#include <map>\n#include \"os/Mutex.h\"\n#endif\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API MarshalAlloc\n    {\n    public:\n        static void* Allocate(size_t size);\n        static void* ReAlloc(void* ptr, size_t size);\n        static void Free(void* ptr);\n\n        static void* AllocateHGlobal(size_t size);\n        static void* ReAllocHGlobal(void* ptr, size_t size);\n        static void FreeHGlobal(void* ptr);\n\n#if _DEBUG\n        static void PushAllocationFrame();\n        static void PopAllocationFrame();\n        static bool HasUnfreedAllocations();\n        static void ClearAllTrackedAllocations();\n#endif\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/MemoryInformation.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"MemoryInformation.h\"\n#include \"gc/GarbageCollector.h\"\n#include \"gc/GCHandle.h\"\n#include \"metadata/ArrayMetadata.h\"\n#include \"metadata/GenericMetadata.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/Class.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Type.h\"\n#include \"utils/Memory.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"tabledefs.h\"\n\n#include <map>\n#include <limits>\n\nnamespace il2cpp\n{\nnamespace vm\n{\nnamespace MemoryInformation\n{\n    using namespace il2cpp::metadata;\n\n    struct GatherMetadataContext\n    {\n        uint32_t currentIndex;\n        std::map<Il2CppClass*, uint32_t> allTypes;\n    };\n\n    static void GatherMetadataCallback(Il2CppClass* type, void* context)\n    {\n        if (type->initialized)\n        {\n            GatherMetadataContext* ctx = static_cast<GatherMetadataContext*>(context);\n            ctx->allTypes.insert(std::make_pair(type, ctx->currentIndex++));\n        }\n    }\n\n    static inline int FindTypeInfoIndexInMap(const std::map<Il2CppClass*, uint32_t>& allTypes, Il2CppClass* typeInfo)\n    {\n        std::map<Il2CppClass*, uint32_t>::const_iterator it = allTypes.find(typeInfo);\n\n        if (it == allTypes.end())\n            return -1;\n\n        return it->second;\n    }\n\n    static inline void GatherMetadata(Il2CppMetadataSnapshot& metadata)\n    {\n        GatherMetadataContext gatherMetadataContext = { 0 };\n        const AssemblyVector* allAssemblies = Assembly::GetAllAssemblies();\n\n        for (AssemblyVector::const_iterator it = allAssemblies->begin(); it != allAssemblies->end(); it++)\n        {\n            const Il2CppImage& image = *MetadataCache::GetImageFromIndex((*it)->imageIndex);\n\n            for (uint32_t i = 0; i < image.typeCount; i++)\n            {\n                Il2CppClass* type = MetadataCache::GetTypeInfoFromTypeDefinitionIndex(image.typeStart + i);\n                if (type->initialized)\n                    gatherMetadataContext.allTypes.insert(std::make_pair(type, gatherMetadataContext.currentIndex++));\n            }\n        }\n\n        ArrayMetadata::WalkArrays(GatherMetadataCallback, &gatherMetadataContext);\n        ArrayMetadata::WalkSZArrays(GatherMetadataCallback, &gatherMetadataContext);\n        GenericMetadata::WalkAllGenericClasses(GatherMetadataCallback, &gatherMetadataContext);\n        MetadataCache::WalkPointerTypes(GatherMetadataCallback, &gatherMetadataContext);\n\n        const std::map<Il2CppClass*, uint32_t>& allTypes = gatherMetadataContext.allTypes;\n        metadata.typeCount = static_cast<uint32_t>(allTypes.size());\n        metadata.types = static_cast<Il2CppMetadataType*>(IL2CPP_CALLOC(metadata.typeCount, sizeof(Il2CppMetadataType)));\n\n        for (std::map<Il2CppClass*, uint32_t>::const_iterator it = allTypes.begin(); it != allTypes.end(); it++)\n        {\n            Il2CppClass* typeInfo = it->first;\n\n            uint32_t index = it->second;\n            Il2CppMetadataType& type = metadata.types[index];\n\n            if (typeInfo->rank > 0)\n            {\n                type.flags = static_cast<Il2CppMetadataTypeFlags>(kArray | (kArrayRankMask & (typeInfo->rank << 16)));\n                type.baseOrElementTypeIndex = FindTypeInfoIndexInMap(allTypes, typeInfo->element_class);\n            }\n            else\n            {\n                type.flags = (typeInfo->valuetype || typeInfo->byval_arg->type == IL2CPP_TYPE_PTR) ? kValueType : kNone;\n                type.fieldCount = 0;\n\n                if (typeInfo->field_count > 0)\n                {\n                    type.fields = static_cast<Il2CppMetadataField*>(IL2CPP_CALLOC(typeInfo->field_count, sizeof(Il2CppMetadataField)));\n\n                    for (int i = 0; i < typeInfo->field_count; i++)\n                    {\n                        Il2CppMetadataField& field = metadata.types[index].fields[type.fieldCount];\n                        FieldInfo* fieldInfo = typeInfo->fields + i;\n                        field.typeIndex = FindTypeInfoIndexInMap(allTypes, Class::FromIl2CppType(fieldInfo->type));\n\n                        // This will happen if fields type is not initialized\n                        // It's OK to skip it, because it means the field is guaranteed to be null on any object\n                        if (field.typeIndex == -1)\n                            continue;\n\n                        //literals have no actual storage, and are not relevant in this context.\n                        if ((fieldInfo->type->attrs & FIELD_ATTRIBUTE_LITERAL) != 0)\n                            continue;\n\n                        field.isStatic = (fieldInfo->type->attrs & FIELD_ATTRIBUTE_STATIC) != 0;\n                        field.offset = fieldInfo->offset;\n                        field.name = fieldInfo->name;\n                        type.fieldCount++;\n                    }\n                }\n\n                type.staticsSize = typeInfo->static_fields_size;\n\n                if (type.staticsSize > 0 && typeInfo->static_fields != NULL)\n                {\n                    type.statics = static_cast<uint8_t*>(IL2CPP_MALLOC(type.staticsSize));\n                    memcpy(type.statics, typeInfo->static_fields, type.staticsSize);\n                }\n\n                Il2CppClass* baseType = Class::GetParent(typeInfo);\n                type.baseOrElementTypeIndex = baseType != NULL ? FindTypeInfoIndexInMap(allTypes, baseType) : -1;\n            }\n\n            type.assemblyName = MetadataCache::GetStringFromIndex(MetadataCache::GetAssemblyFromIndex(typeInfo->image->assemblyIndex)->aname.nameIndex);\n\n            std::string typeName = Type::GetName(typeInfo->byval_arg, IL2CPP_TYPE_NAME_FORMAT_IL);\n            type.name = static_cast<char*>(IL2CPP_CALLOC(typeName.length() + 1, sizeof(char)));\n            memcpy(type.name, typeName.c_str(), typeName.length() + 1);\n\n            type.typeInfoAddress = reinterpret_cast<uint64_t>(typeInfo);\n            type.size = (typeInfo->valuetype) != 0 ? (typeInfo->instance_size - sizeof(Il2CppObject)) : typeInfo->instance_size;\n        }\n    }\n\n    struct SectionIterationContext\n    {\n        Il2CppManagedMemorySection* currentSection;\n    };\n\n    static void AllocateMemoryForSection(void* context, void* sectionStart, void* sectionEnd)\n    {\n        SectionIterationContext* ctx = static_cast<SectionIterationContext*>(context);\n        Il2CppManagedMemorySection& section = *ctx->currentSection;\n\n        section.sectionStartAddress = reinterpret_cast<uint64_t>(sectionStart);\n\n        ptrdiff_t sectionSize = static_cast<uint8_t*>(sectionEnd) - static_cast<uint8_t*>(sectionStart);\n\n        if (sizeof(void*) > 4) // This assert is only valid on 64-bit\n            IL2CPP_ASSERT(sectionSize <= static_cast<ptrdiff_t>(std::numeric_limits<uint32_t>::max()));\n\n        section.sectionSize = static_cast<uint32_t>(sectionSize);\n        section.sectionBytes = static_cast<uint8_t*>(IL2CPP_MALLOC(section.sectionSize));\n\n        ctx->currentSection++;\n    }\n\n    static void CopyHeapSection(void* context, void* sectionStart, void* sectionEnd)\n    {\n        SectionIterationContext* ctx = static_cast<SectionIterationContext*>(context);\n        Il2CppManagedMemorySection& section = *ctx->currentSection;\n\n        IL2CPP_ASSERT(section.sectionStartAddress == reinterpret_cast<uint64_t>(sectionStart));\n        IL2CPP_ASSERT(section.sectionSize == static_cast<uint8_t*>(sectionEnd) - static_cast<uint8_t*>(sectionStart));\n        memcpy(section.sectionBytes, sectionStart, section.sectionSize);\n\n        ctx->currentSection++;\n    }\n\n    static void* CaptureHeapInfo(void* voidManagedHeap)\n    {\n        Il2CppManagedHeap& heap = *(Il2CppManagedHeap*)voidManagedHeap;\n\n        heap.sectionCount = static_cast<uint32_t>(il2cpp::gc::GarbageCollector::GetSectionCount());\n        heap.sections = static_cast<Il2CppManagedMemorySection*>(IL2CPP_CALLOC(heap.sectionCount, sizeof(Il2CppManagedMemorySection)));\n\n        SectionIterationContext iterationContext = { heap.sections };\n        il2cpp::gc::GarbageCollector::ForEachHeapSection(&iterationContext, AllocateMemoryForSection);\n\n        return NULL;\n    }\n\n    static void FreeIL2CppManagedHeap(Il2CppManagedHeap& heap)\n    {\n        for (uint32_t i = 0; i < heap.sectionCount; i++)\n        {\n            IL2CPP_FREE(heap.sections[i].sectionBytes);\n        }\n\n        IL2CPP_FREE(heap.sections);\n    }\n\n    struct VerifyHeapSectionStillValidIterationContext\n    {\n        Il2CppManagedMemorySection* currentSection;\n        bool wasValid;\n    };\n\n    static void VerifyHeapSectionIsStillValid(void* context, void* sectionStart, void* sectionEnd)\n    {\n        VerifyHeapSectionStillValidIterationContext* iterationContext = (VerifyHeapSectionStillValidIterationContext*)context;\n        if (iterationContext->currentSection->sectionSize != static_cast<uint8_t*>(sectionEnd) - static_cast<uint8_t*>(sectionStart))\n            iterationContext->wasValid = false;\n        else if (iterationContext->currentSection->sectionStartAddress != reinterpret_cast<uint64_t>(sectionStart))\n            iterationContext->wasValid = false;\n\n        iterationContext->currentSection++;\n    }\n\n    static bool IsIL2CppManagedHeapStillValid(Il2CppManagedHeap& heap)\n    {\n        if (heap.sectionCount != static_cast<uint32_t>(il2cpp::gc::GarbageCollector::GetSectionCount()))\n            return false;\n\n        VerifyHeapSectionStillValidIterationContext iterationContext = { heap.sections, true };\n        il2cpp::gc::GarbageCollector::ForEachHeapSection(&iterationContext, VerifyHeapSectionIsStillValid);\n\n        return iterationContext.wasValid;\n    }\n\n// The difficulty in capturing the managed snapshot is that we need to do quite some work with the world stopped,\n// to make sure that our snapshot is \"valid\", and didn't change as we were copying it. However, stopping the world,\n// makes it so you cannot take any lock or allocations. We deal with it like this:\n//\n// 1) We take note of the amount of heap sections and their sizes, and we allocate memory to copy them into.\n// 2) We stop the world.\n// 3) We check if the amount of heapsections and their sizes didn't change in the mean time. If they did, try again.\n// 4) Now, with the world still stopped, we memcpy() the memory from the real heapsections, into the memory that we\n//    allocated for their copies.\n// 5) Start the world again.\n\n    static inline void CaptureManagedHeap(Il2CppManagedHeap& heap)\n    {\n        for (;;)\n        {\n            il2cpp::gc::GarbageCollector::CallWithAllocLockHeld(CaptureHeapInfo, &heap);\n\n            il2cpp::gc::GarbageCollector::StopWorld();\n\n            if (IsIL2CppManagedHeapStillValid(heap))\n                break;\n\n            il2cpp::gc::GarbageCollector::StartWorld();\n\n            FreeIL2CppManagedHeap(heap);\n        }\n\n        SectionIterationContext iterationContext = { heap.sections };\n        il2cpp::gc::GarbageCollector::ForEachHeapSection(&iterationContext, CopyHeapSection);\n\n        il2cpp::gc::GarbageCollector::StartWorld();\n    }\n\n    struct GCHandleTargetIterationContext\n    {\n        std::vector<Il2CppObject*> managedObjects;\n    };\n\n    static void GCHandleIterationCallback(Il2CppObject* managedObject, void* context)\n    {\n        GCHandleTargetIterationContext* ctx = static_cast<GCHandleTargetIterationContext*>(context);\n        ctx->managedObjects.push_back(managedObject);\n    }\n\n    static inline void CaptureGCHandleTargets(Il2CppGCHandles& gcHandles)\n    {\n        GCHandleTargetIterationContext gcHandleTargetIterationContext;\n        il2cpp::gc::GCHandle::WalkStrongGCHandleTargets(GCHandleIterationCallback, &gcHandleTargetIterationContext);\n\n        const std::vector<Il2CppObject*>& trackedObjects = gcHandleTargetIterationContext.managedObjects;\n        gcHandles.trackedObjectCount = static_cast<uint32_t>(trackedObjects.size());\n        gcHandles.pointersToObjects = static_cast<uint64_t*>(IL2CPP_CALLOC(gcHandles.trackedObjectCount, sizeof(uint64_t)));\n\n        for (uint32_t i = 0; i < gcHandles.trackedObjectCount; i++)\n            gcHandles.pointersToObjects[i] = reinterpret_cast<uint64_t>(trackedObjects[i]);\n    }\n\n    void FillRuntimeInformation(Il2CppRuntimeInformation& runtimeInfo)\n    {\n        runtimeInfo.pointerSize = static_cast<uint32_t>(sizeof(void*));\n        runtimeInfo.objectHeaderSize = static_cast<uint32_t>(sizeof(Il2CppObject));\n        runtimeInfo.arrayHeaderSize = static_cast<uint32_t>(kIl2CppSizeOfArray);\n        runtimeInfo.arraySizeOffsetInHeader = kIl2CppOffsetOfArrayLength;\n        runtimeInfo.arrayBoundsOffsetInHeader = kIl2CppOffsetOfArrayBounds;\n        runtimeInfo.allocationGranularity = static_cast<uint32_t>(2 * sizeof(void*));\n    }\n\n    Il2CppManagedMemorySnapshot* CaptureManagedMemorySnapshot()\n    {\n        Il2CppManagedMemorySnapshot* snapshot = static_cast<Il2CppManagedMemorySnapshot*>(IL2CPP_MALLOC_ZERO(sizeof(Il2CppManagedMemorySnapshot)));\n\n        GatherMetadata(snapshot->metadata);\n        CaptureManagedHeap(snapshot->heap);\n        CaptureGCHandleTargets(snapshot->gcHandles);\n        FillRuntimeInformation(snapshot->runtimeInformation);\n\n        return snapshot;\n    }\n\n    void FreeCapturedManagedMemorySnapshot(Il2CppManagedMemorySnapshot* snapshot)\n    {\n        FreeIL2CppManagedHeap(snapshot->heap);\n\n        IL2CPP_FREE(snapshot->gcHandles.pointersToObjects);\n\n        Il2CppMetadataSnapshot& metadata = snapshot->metadata;\n\n        for (uint32_t i = 0; i < metadata.typeCount; i++)\n        {\n            if ((metadata.types[i].flags & kArray) == 0)\n            {\n                IL2CPP_FREE(metadata.types[i].fields);\n                IL2CPP_FREE(metadata.types[i].statics);\n            }\n\n            IL2CPP_FREE(metadata.types[i].name);\n        }\n\n        IL2CPP_FREE(metadata.types);\n        IL2CPP_FREE(snapshot);\n    }\n} // namespace MemoryInformation\n} // namespace vm\n} // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/MemoryInformation.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n\nstruct Il2CppMetadataField\n{\n    uint32_t offset;\n    uint32_t typeIndex;\n    const char* name;\n    bool isStatic;\n};\n\nenum Il2CppMetadataTypeFlags\n{\n    kNone = 0,\n    kValueType = 1 << 0,\n    kArray = 1 << 1,\n    kArrayRankMask = 0xFFFF0000\n};\n\nstruct Il2CppMetadataType\n{\n    Il2CppMetadataTypeFlags flags;  // If it's an array, rank is encoded in the upper 2 bytes\n    Il2CppMetadataField* fields;\n    uint32_t fieldCount;\n    uint32_t staticsSize;\n    uint8_t* statics;\n    uint32_t baseOrElementTypeIndex;\n    char* name;\n    const char* assemblyName;\n    uint64_t typeInfoAddress;\n    uint32_t size;\n};\n\nstruct Il2CppMetadataSnapshot\n{\n    uint32_t typeCount;\n    Il2CppMetadataType* types;\n};\n\nstruct Il2CppManagedMemorySection\n{\n    uint64_t sectionStartAddress;\n    uint32_t sectionSize;\n    uint8_t* sectionBytes;\n};\n\nstruct Il2CppManagedHeap\n{\n    uint32_t sectionCount;\n    Il2CppManagedMemorySection* sections;\n};\n\nstruct Il2CppStacks\n{\n    uint32_t stackCount;\n    Il2CppManagedMemorySection* stacks;\n};\n\nstruct NativeObject\n{\n    uint32_t gcHandleIndex;\n    uint32_t size;\n    uint32_t instanceId;\n    uint32_t classId;\n    uint32_t referencedNativeObjectIndicesCount;\n    uint32_t* referencedNativeObjectIndices;\n};\n\nstruct Il2CppGCHandles\n{\n    uint32_t trackedObjectCount;\n    uint64_t* pointersToObjects;\n};\n\nstruct Il2CppRuntimeInformation\n{\n    uint32_t pointerSize;\n    uint32_t objectHeaderSize;\n    uint32_t arrayHeaderSize;\n    uint32_t arrayBoundsOffsetInHeader;\n    uint32_t arraySizeOffsetInHeader;\n    uint32_t allocationGranularity;\n};\n\nstruct Il2CppManagedMemorySnapshot\n{\n    Il2CppManagedHeap heap;\n    Il2CppStacks stacks;\n    Il2CppMetadataSnapshot metadata;\n    Il2CppGCHandles gcHandles;\n    Il2CppRuntimeInformation runtimeInformation;\n    void* additionalUserInformation;\n};\n\nnamespace il2cpp\n{\nnamespace vm\n{\nnamespace MemoryInformation\n{\n    Il2CppManagedMemorySnapshot* CaptureManagedMemorySnapshot();\n    void FreeCapturedManagedMemorySnapshot(Il2CppManagedMemorySnapshot* snapshot);\n}\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/MetadataAlloc.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"MetadataAlloc.h\"\n#include \"class-internals.h\"\n#include \"utils/MemoryPool.h\"\n\nusing il2cpp::utils::MemoryPool;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n// we allocate these dynamically on runtime initialization\n// because the pool uses standard allocators, and we want to give embedding\n// client the chance to install their own allocator callbacks\n    static MemoryPool* s_MetadataMemoryPool;\n    static MemoryPool* s_GenericClassMemoryPool;\n    static MemoryPool* s_GenericMethodMemoryPool;\n\n// This initial size (256k/512k) allows us enough room to initialize metadata\n// an empty Unity project and have a bit of room leftover.\n    const size_t kInitialRegionSize = IL2CPP_SIZEOF_VOID_P * 64 * 1024;\n\n    void MetadataAllocInitialize()\n    {\n        s_MetadataMemoryPool = new MemoryPool(kInitialRegionSize);\n        // these can use the default smaller initial pool size\n        s_GenericClassMemoryPool = new MemoryPool();\n        s_GenericMethodMemoryPool = new MemoryPool();\n    }\n\n    void MetadataAllocCleanup()\n    {\n        delete s_MetadataMemoryPool;\n        s_MetadataMemoryPool = NULL;\n        delete s_GenericClassMemoryPool;\n        s_GenericClassMemoryPool = NULL;\n        delete s_GenericMethodMemoryPool;\n        s_GenericMethodMemoryPool = NULL;\n    }\n\n    void* MetadataMalloc(size_t size)\n    {\n        return s_MetadataMemoryPool->Malloc(size);\n    }\n\n    void* MetadataCalloc(size_t count, size_t size)\n    {\n        return s_MetadataMemoryPool->Calloc(count, size);\n    }\n\n    Il2CppGenericClass* MetadataAllocGenericClass()\n    {\n        return (Il2CppGenericClass*)s_GenericClassMemoryPool->Calloc(1, sizeof(Il2CppGenericClass));\n    }\n\n    Il2CppGenericMethod* MetadataAllocGenericMethod()\n    {\n        return (Il2CppGenericMethod*)s_GenericMethodMemoryPool->Calloc(1, sizeof(Il2CppGenericMethod));\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/MetadataAlloc.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppGenericClass;\nstruct Il2CppGenericMethod;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    void MetadataAllocInitialize();\n    void MetadataAllocCleanup();\n// These allocators assume the g_MetadataLock lock is held\n    void* MetadataMalloc(size_t size);\n    void* MetadataCalloc(size_t count, size_t size);\n// These metadata structures have their own locks, since they do lightweight initialization\n    Il2CppGenericClass* MetadataAllocGenericClass();\n    Il2CppGenericMethod* MetadataAllocGenericMethod();\n} // namespace vm\n} // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/MetadataCache.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"MetadataCache.h\"\n\n#include <map>\n#include <limits>\n#include \"class-internals.h\"\n#include \"tabledefs.h\"\n#include \"gc/GarbageCollector.h\"\n#include \"metadata/ArrayMetadata.h\"\n#include \"metadata/GenericMetadata.h\"\n#include \"metadata/GenericMethod.h\"\n#include \"metadata/Il2CppTypeCompare.h\"\n#include \"metadata/Il2CppTypeHash.h\"\n#include \"metadata/Il2CppTypeVector.h\"\n#include \"metadata/Il2CppGenericContextCompare.h\"\n#include \"metadata/Il2CppGenericContextHash.h\"\n#include \"metadata/Il2CppGenericInstCompare.h\"\n#include \"metadata/Il2CppGenericInstHash.h\"\n#include \"metadata/Il2CppGenericMethodCompare.h\"\n#include \"metadata/Il2CppGenericMethodHash.h\"\n#include \"metadata/Il2CppSignatureCompare.h\"\n#include \"metadata/Il2CppSignatureHash.h\"\n#include \"os/Atomic.h\"\n#include \"os/Mutex.h\"\n#include \"utils/CallOnce.h\"\n#include \"utils/Collections.h\"\n#include \"utils/HashUtils.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"utils/Il2CppHashSet.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/PathUtils.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/Class.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/MetadataAlloc.h\"\n#include \"vm/MetadataLoader.h\"\n#include \"vm/MetadataLock.h\"\n#include \"vm/Method.h\"\n#include \"vm/Object.h\"\n#include \"vm/String.h\"\n#include \"vm/Type.h\"\n#include \"mono-runtime/il2cpp-mapping.h\"\n#include \"vm-utils/NativeSymbol.h\"\n#include \"vm-utils/VmStringUtils.h\"\n\nusing namespace il2cpp;\nusing namespace il2cpp::utils::collections;\nusing namespace il2cpp::vm;\n\nusing il2cpp::gc::GarbageCollector;\nusing il2cpp::metadata::ArrayMetadata;\nusing il2cpp::metadata::GenericMetadata;\nusing il2cpp::metadata::GenericMethod;\nusing il2cpp::metadata::Il2CppGenericContextCompare;\nusing il2cpp::metadata::Il2CppGenericContextHash;\nusing il2cpp::metadata::Il2CppGenericInstCompare;\nusing il2cpp::metadata::Il2CppGenericInstHash;\nusing il2cpp::metadata::Il2CppGenericMethodCompare;\nusing il2cpp::metadata::Il2CppGenericMethodHash;\nusing il2cpp::metadata::Il2CppTypeLess;\nusing il2cpp::metadata::Il2CppTypeEqualityComparer;\nusing il2cpp::metadata::Il2CppTypeHash;\nusing il2cpp::metadata::Il2CppTypeVector;\nusing il2cpp::metadata::Il2CppSignatureCompare;\nusing il2cpp::metadata::Il2CppSignatureHash;\nusing il2cpp::os::Atomic;\nusing il2cpp::os::FastAutoLock;\nusing il2cpp::os::FastMutex;\nusing il2cpp::utils::CallOnce;\nusing il2cpp::utils::HashUtils;\nusing il2cpp::utils::OnceFlag;\nusing il2cpp::utils::PointerHash;\nusing il2cpp::utils::StringUtils;\nusing il2cpp::utils::VmStringUtils;\n\ntypedef std::map<Il2CppClass*, Il2CppClass*> PointerTypeMap;\ntypedef Il2CppHashMap<const char*, Il2CppClass*, StringUtils::StringHasher<const char*>, VmStringUtils::CaseSensitiveComparer> WindowsRuntimeTypeNameToClassMap;\ntypedef Il2CppHashMap<const Il2CppClass*, const char*, PointerHash<Il2CppClass> > ClassToWindowsRuntimeTypeNameMap;\n\ntypedef Il2CppHashSet<const Il2CppGenericMethod*, Il2CppGenericMethodHash, Il2CppGenericMethodCompare> Il2CppGenericMethodSet;\ntypedef Il2CppGenericMethodSet::const_iterator Il2CppGenericMethodSetIter;\nstatic Il2CppGenericMethodSet s_GenericMethodSet;\n\nstruct Il2CppMetadataCache\n{\n    FastMutex m_CacheMutex;\n    PointerTypeMap m_PointerTypes;\n};\n\nstatic Il2CppMetadataCache s_MetadataCache;\nstatic Il2CppClass** s_TypeInfoTable = NULL;\nstatic Il2CppClass** s_TypeInfoDefinitionTable = NULL;\nstatic const MethodInfo** s_MethodInfoDefinitionTable = NULL;\nstatic Il2CppString** s_StringLiteralTable = NULL;\nstatic const Il2CppGenericMethod** s_GenericMethodTable = NULL;\nstatic int32_t s_ImagesCount = 0;\nstatic Il2CppImage* s_ImagesTable = NULL;\n\n\ntypedef Il2CppHashSet<const Il2CppGenericInst*, Il2CppGenericInstHash, Il2CppGenericInstCompare> Il2CppGenericInstSet;\nstatic Il2CppGenericInstSet s_GenericInstSet;\n\ntypedef Il2CppHashMap<const Il2CppGenericMethod*, const Il2CppGenericMethodIndices*, Il2CppGenericMethodHash, Il2CppGenericMethodCompare> Il2CppMethodTableMap;\ntypedef Il2CppMethodTableMap::const_iterator Il2CppMethodTableMapIter;\nstatic Il2CppMethodTableMap s_MethodTableMap;\n\ntypedef Il2CppHashMap<il2cpp::utils::dynamic_array<const Il2CppType*>, Il2CppMethodPointer, Il2CppSignatureHash, Il2CppSignatureCompare> Il2CppUnresolvedSignatureMap;\ntypedef Il2CppUnresolvedSignatureMap::const_iterator Il2CppUnresolvedSignatureMapIter;\nstatic Il2CppUnresolvedSignatureMap *s_pUnresolvedSignatureMap;\n\n\nstatic const Il2CppCodeRegistration * s_Il2CppCodeRegistration;\nstatic const Il2CppMetadataRegistration * s_Il2CppMetadataRegistration;\nstatic const Il2CppCodeGenOptions* s_Il2CppCodeGenOptions;\nstatic CustomAttributesCache** s_CustomAttributesCaches;\nstatic CustomAttributeTypeCache** s_CustomAttributeTypeCaches;\n\nstatic WindowsRuntimeTypeNameToClassMap s_WindowsRuntimeTypeNameToClassMap;\nstatic ClassToWindowsRuntimeTypeNameMap s_ClassToWindowsRuntimeTypeNameMap;\n\nstruct InteropDataToTypeConverter\n{\n    inline const Il2CppType* operator()(const Il2CppInteropData& interopData) const\n    {\n        return interopData.type;\n    }\n};\n\ntypedef il2cpp::utils::collections::ArrayValueMap<const Il2CppType*, Il2CppInteropData, InteropDataToTypeConverter, Il2CppTypeLess, Il2CppTypeEqualityComparer> InteropDataMap;\nstatic InteropDataMap s_InteropData;\n\ntemplate<typename T>\nstatic T MetadataOffset(void* metadata, size_t sectionOffset, size_t itemIndex)\n{\n    return reinterpret_cast<T>(reinterpret_cast<uint8_t*>(metadata) + sectionOffset) + itemIndex;\n}\n\nvoid MetadataCache::Register(const Il2CppCodeRegistration* const codeRegistration, const Il2CppMetadataRegistration* const metadataRegistration, const Il2CppCodeGenOptions* const codeGenOptions)\n{\n    s_Il2CppCodeRegistration = codeRegistration;\n    s_Il2CppMetadataRegistration = metadataRegistration;\n    s_Il2CppCodeGenOptions = codeGenOptions;\n\n    for (int32_t j = 0; j < metadataRegistration->genericClassesCount; j++)\n        if (metadataRegistration->genericClasses[j]->typeDefinitionIndex != kTypeIndexInvalid)\n            metadata::GenericMetadata::RegisterGenericClass(metadataRegistration->genericClasses[j]);\n\n    for (int32_t i = 0; i < metadataRegistration->genericInstsCount; i++)\n        s_GenericInstSet.insert(metadataRegistration->genericInsts[i]);\n\n    s_InteropData.assign_external(codeRegistration->interopData, codeRegistration->interopDataCount);\n}\n\nstatic void* s_GlobalMetadata;\nstatic const Il2CppGlobalMetadataHeader* s_GlobalMetadataHeader;\n\nvoid MetadataCache::Initialize()\n{\n    s_GlobalMetadata = vm::MetadataLoader::LoadMetadataFile(\"global-metadata.dat\");\n    s_GlobalMetadataHeader = (const Il2CppGlobalMetadataHeader*)s_GlobalMetadata;\n    IL2CPP_ASSERT(s_GlobalMetadataHeader->sanity == 0xFAB11BAF);\n    IL2CPP_ASSERT(s_GlobalMetadataHeader->version == 24);\n\n    const Il2CppAssembly* assemblies = (const Il2CppAssembly*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->assembliesOffset);\n    for (uint32_t i = 0; i < s_GlobalMetadataHeader->assembliesCount / sizeof(Il2CppAssembly); i++)\n        il2cpp::vm::Assembly::Register(assemblies + i);\n\n    // Pre-allocate these arrays so we don't need to lock when reading later.\n    // These arrays hold the runtime metadata representation for metadata explicitly\n    // referenced during conversion. There is a corresponding table of same size\n    // in the converted metadata, giving a description of runtime metadata to construct.\n    s_TypeInfoTable = (Il2CppClass**)IL2CPP_CALLOC(s_Il2CppMetadataRegistration->typesCount, sizeof(Il2CppClass*));\n    s_TypeInfoDefinitionTable = (Il2CppClass**)IL2CPP_CALLOC(s_GlobalMetadataHeader->typeDefinitionsCount / sizeof(Il2CppTypeDefinition), sizeof(Il2CppClass*));\n    s_MethodInfoDefinitionTable = (const MethodInfo**)IL2CPP_CALLOC(s_GlobalMetadataHeader->methodsCount / sizeof(Il2CppMethodDefinition), sizeof(MethodInfo*));\n    s_GenericMethodTable = (const Il2CppGenericMethod**)IL2CPP_CALLOC(s_Il2CppMetadataRegistration->methodSpecsCount, sizeof(Il2CppGenericMethod*));\n    s_ImagesCount = s_GlobalMetadataHeader->imagesCount / sizeof(Il2CppImageDefinition);\n    s_ImagesTable = (Il2CppImage*)IL2CPP_CALLOC(s_ImagesCount, sizeof(Il2CppImage));\n\n    // setup all the Il2CppImages. There are not many and it avoid locks later on\n    const Il2CppImageDefinition* imagesDefinitions = (const Il2CppImageDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->imagesOffset);\n    for (int32_t imageIndex = 0; imageIndex < s_ImagesCount; imageIndex++)\n    {\n        const Il2CppImageDefinition* imageDefinition = imagesDefinitions + imageIndex;\n        Il2CppImage* image = s_ImagesTable + imageIndex;\n        image->name = GetStringFromIndex(imageDefinition->nameIndex);\n\n        std::string nameNoExt = utils::PathUtils::PathNoExtension(image->name);\n        image->nameNoExt = (char*)IL2CPP_CALLOC(nameNoExt.size() + 1, sizeof(char));\n        strcpy(const_cast<char*>(image->nameNoExt), nameNoExt.c_str());\n\n        image->assemblyIndex = imageDefinition->assemblyIndex;\n        image->typeStart = imageDefinition->typeStart;\n        image->typeCount = imageDefinition->typeCount;\n        image->exportedTypeStart = imageDefinition->exportedTypeStart;\n        image->exportedTypeCount = imageDefinition->exportedTypeCount;\n        image->entryPointIndex = imageDefinition->entryPointIndex;\n        image->token = imageDefinition->token;\n    }\n\n    InitializeUnresolvedSignatureTable();\n\n#if IL2CPP_ENABLE_NATIVE_STACKTRACES\n    std::vector<MethodDefinitionKey> managedMethods;\n\n\n    const Il2CppTypeDefinition* typeDefinitions = (const Il2CppTypeDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->typeDefinitionsOffset);\n    for (size_t i = 0; i < s_GlobalMetadataHeader->assembliesCount / sizeof(Il2CppAssembly); i++)\n    {\n        const Il2CppImage* image = MetadataCache::GetImageFromIndex(assemblies[i].imageIndex);\n\n        for (size_t j = 0; j < image->typeCount; j++)\n        {\n            const Il2CppTypeDefinition* type = typeDefinitions + image->typeStart + j;\n\n            for (uint16_t u = 0; u < type->method_count; u++)\n            {\n                const Il2CppMethodDefinition* methodDefinition = GetMethodDefinitionFromIndex(type->methodStart + u);\n                MethodDefinitionKey currentMethodList;\n                currentMethodList.methodIndex = type->methodStart + u;\n                currentMethodList.method = GetMethodPointerFromIndex(methodDefinition->methodIndex);\n                if (currentMethodList.method)\n                    managedMethods.push_back(currentMethodList);\n            }\n        }\n    }\n\n    for (int32_t i = 0; i < s_Il2CppMetadataRegistration->genericMethodTableCount; i++)\n    {\n        const Il2CppGenericMethodFunctionsDefinitions* genericMethodIndices = s_Il2CppMetadataRegistration->genericMethodTable + i;\n\n        MethodDefinitionKey currentMethodList;\n\n        GenericMethodIndex genericMethodIndex = genericMethodIndices->genericMethodIndex;\n\n        IL2CPP_ASSERT(genericMethodIndex < s_Il2CppMetadataRegistration->methodSpecsCount);\n        const Il2CppMethodSpec* methodSpec = s_Il2CppMetadataRegistration->methodSpecs + genericMethodIndex;\n\n        currentMethodList.methodIndex = methodSpec->methodDefinitionIndex;\n\n        IL2CPP_ASSERT(genericMethodIndices->indices.methodIndex < static_cast<int32_t>(s_Il2CppCodeRegistration->genericMethodPointersCount));\n        currentMethodList.method = s_Il2CppCodeRegistration->genericMethodPointers[genericMethodIndices->indices.methodIndex];\n\n        managedMethods.push_back(currentMethodList);\n    }\n\n    il2cpp::utils::NativeSymbol::RegisterMethods(managedMethods);\n#endif\n}\n\nvoid MetadataCache::InitializeStringLiteralTable()\n{\n    s_StringLiteralTable = (Il2CppString**)GarbageCollector::AllocateFixed(s_GlobalMetadataHeader->stringLiteralCount / sizeof(Il2CppStringLiteral) * sizeof(Il2CppString*), NULL);\n}\n\nvoid MetadataCache::InitializeGenericMethodTable()\n{\n    for (int32_t i = 0; i < s_Il2CppMetadataRegistration->genericMethodTableCount; i++)\n    {\n        const Il2CppGenericMethodFunctionsDefinitions* genericMethodIndices = s_Il2CppMetadataRegistration->genericMethodTable + i;\n        const Il2CppGenericMethod* genericMethod = GetGenericMethodFromIndex(genericMethodIndices->genericMethodIndex);\n        s_MethodTableMap.insert(std::make_pair(genericMethod, &genericMethodIndices->indices));\n    }\n}\n\nvoid MetadataCache::InitializeWindowsRuntimeTypeNamesTables()\n{\n    int32_t typeCount = s_GlobalMetadataHeader->windowsRuntimeTypeNamesSize / sizeof(Il2CppWindowsRuntimeTypeNamePair);\n    const Il2CppWindowsRuntimeTypeNamePair* windowsRuntimeTypeNames = MetadataOffset<Il2CppWindowsRuntimeTypeNamePair*>(s_GlobalMetadata, s_GlobalMetadataHeader->windowsRuntimeTypeNamesOffset, 0);\n\n    for (int32_t i = 0; i < typeCount; i++)\n    {\n        Il2CppWindowsRuntimeTypeNamePair typeNamePair = windowsRuntimeTypeNames[i];\n        const char* name = GetStringFromIndex(typeNamePair.nameIndex);\n        const Il2CppType* type = GetIl2CppTypeFromIndex(typeNamePair.typeIndex);\n        s_WindowsRuntimeTypeNameToClassMap.insert(std::make_pair(name, Class::FromIl2CppType(type)));\n        s_ClassToWindowsRuntimeTypeNameMap.insert(std::make_pair(Class::FromIl2CppType(type), name));\n    }\n}\n\n// this is called later in the intialization cycle with more systems setup like GC\nvoid MetadataCache::InitializeGCSafe()\n{\n    InitializeStringLiteralTable();\n    InitializeGenericMethodTable();\n    InitializeWindowsRuntimeTypeNamesTables();\n}\n\nvoid MetadataCache::InitializeUnresolvedSignatureTable()\n{\n    s_pUnresolvedSignatureMap = new Il2CppUnresolvedSignatureMap();\n\n    for (uint32_t i = 0; i < s_Il2CppCodeRegistration->unresolvedVirtualCallCount; ++i)\n    {\n        const Il2CppRange* range = MetadataOffset<Il2CppRange*>(s_GlobalMetadata, s_GlobalMetadataHeader->unresolvedVirtualCallParameterRangesOffset, i);\n        il2cpp::utils::dynamic_array<const Il2CppType*> signature;\n\n        for (int j = 0; j < range->length; ++j)\n        {\n            TypeIndex typeIndex = *MetadataOffset<TypeIndex*>(s_GlobalMetadata, s_GlobalMetadataHeader->unresolvedVirtualCallParameterTypesOffset, range->start + j);\n            const Il2CppType* type = MetadataCache::GetIl2CppTypeFromIndex(typeIndex);\n            signature.push_back(type);\n        }\n\n        (*s_pUnresolvedSignatureMap)[signature] = s_Il2CppCodeRegistration->unresolvedVirtualCallPointers[i];\n    }\n}\n\nIl2CppClass* MetadataCache::GetGenericInstanceType(Il2CppClass* genericTypeDefinition, const Il2CppTypeVector& genericArgumentTypes)\n{\n    const Il2CppGenericInst* inst = MetadataCache::GetGenericInst(genericArgumentTypes);\n    Il2CppGenericClass* genericClass = GenericMetadata::GetGenericClass(genericTypeDefinition, inst);\n    return GenericClass::GetClass(genericClass);\n}\n\nconst MethodInfo* MetadataCache::GetGenericInstanceMethod(const MethodInfo* genericMethodDefinition, const Il2CppGenericContext* context)\n{\n    const MethodInfo* method = genericMethodDefinition;\n    const Il2CppGenericInst* classInst = context->class_inst;\n    const Il2CppGenericInst* methodInst = context->method_inst;\n    if (genericMethodDefinition->is_inflated)\n    {\n        IL2CPP_ASSERT(genericMethodDefinition->declaring_type->generic_class);\n        classInst = genericMethodDefinition->declaring_type->generic_class->context.class_inst;\n        method = genericMethodDefinition->genericMethod->methodDefinition;\n    }\n\n    const Il2CppGenericMethod* gmethod = GetGenericMethod(method, classInst, methodInst);\n    return GenericMethod::GetMethod(gmethod);\n}\n\nconst MethodInfo* MetadataCache::GetGenericInstanceMethod(const MethodInfo* genericMethodDefinition, const Il2CppTypeVector& genericArgumentTypes)\n{\n    Il2CppGenericContext context = { NULL, GetGenericInst(genericArgumentTypes) };\n\n    return GetGenericInstanceMethod(genericMethodDefinition, &context);\n}\n\nconst Il2CppGenericContext* MetadataCache::GetMethodGenericContext(const MethodInfo* method)\n{\n    if (!method->is_inflated)\n    {\n        NOT_IMPLEMENTED(Image::GetMethodGenericContext);\n        return NULL;\n    }\n\n    return &method->genericMethod->context;\n}\n\nconst MethodInfo* MetadataCache::GetGenericMethodDefinition(const MethodInfo* method)\n{\n    if (!method->is_inflated)\n    {\n        NOT_IMPLEMENTED(Image::GetGenericMethodDefinition);\n        return NULL;\n    }\n\n    return method->genericMethod->methodDefinition;\n}\n\nconst Il2CppGenericContainer* MetadataCache::GetMethodGenericContainer(const MethodInfo* method)\n{\n    return method->genericContainer;\n}\n\nIl2CppClass* MetadataCache::GetPointerType(Il2CppClass* type)\n{\n    os::FastAutoLock lock(&s_MetadataCache.m_CacheMutex);\n\n    PointerTypeMap::const_iterator i = s_MetadataCache.m_PointerTypes.find(type);\n    if (i == s_MetadataCache.m_PointerTypes.end())\n        return NULL;\n\n    return i->second;\n}\n\nIl2CppClass* MetadataCache::GetWindowsRuntimeClass(const std::string& fullName)\n{\n    WindowsRuntimeTypeNameToClassMap::iterator it = s_WindowsRuntimeTypeNameToClassMap.find(fullName.c_str());\n    if (it != s_WindowsRuntimeTypeNameToClassMap.end())\n        return it->second;\n\n    return NULL;\n}\n\nconst char* MetadataCache::GetWindowsRuntimeClassName(const Il2CppClass* klass)\n{\n    ClassToWindowsRuntimeTypeNameMap::iterator it = s_ClassToWindowsRuntimeTypeNameMap.find(klass);\n    if (it != s_ClassToWindowsRuntimeTypeNameMap.end())\n        return it->second;\n\n    return NULL;\n}\n\nvoid MetadataCache::AddPointerType(Il2CppClass* type, Il2CppClass* pointerType)\n{\n    os::FastAutoLock lock(&s_MetadataCache.m_CacheMutex);\n    s_MetadataCache.m_PointerTypes.insert(std::make_pair(type, pointerType));\n}\n\nconst Il2CppGenericInst* MetadataCache::GetGenericInst(const Il2CppType* const* types, uint32_t typeCount)\n{\n    // temporary inst to lookup a permanent one that may already exist\n    Il2CppGenericInst inst;\n    inst.type_argc = typeCount;\n    inst.type_argv = (const Il2CppType**)alloca(inst.type_argc * sizeof(Il2CppType*));\n\n    size_t index = 0;\n    const Il2CppType* const* typesEnd = types + typeCount;\n    for (const Il2CppType* const* iter = types; iter != typesEnd; ++iter, ++index)\n        inst.type_argv[index] = *iter;\n\n    os::FastAutoLock lock(&s_MetadataCache.m_CacheMutex);\n    Il2CppGenericInstSet::const_iterator iter = s_GenericInstSet.find(&inst);\n    if (iter != s_GenericInstSet.end())\n        return *iter;\n\n    Il2CppGenericInst* newInst = (Il2CppGenericInst*)IL2CPP_MALLOC(sizeof(Il2CppGenericInst));\n    newInst->type_argc = typeCount;\n    newInst->type_argv = (const Il2CppType**)IL2CPP_MALLOC(newInst->type_argc * sizeof(Il2CppType*));\n\n    index = 0;\n    for (const Il2CppType* const* iter = types; iter != typesEnd; ++iter, ++index)\n        newInst->type_argv[index] = *iter;\n\n    s_GenericInstSet.insert(newInst);\n\n    ++il2cpp_runtime_stats.generic_instance_count;\n\n    return newInst;\n}\n\nconst Il2CppGenericInst* MetadataCache::GetGenericInst(const Il2CppTypeVector& types)\n{\n    return GetGenericInst(&types[0], static_cast<uint32_t>(types.size()));\n}\n\nstatic FastMutex s_GenericMethodMutex;\nconst Il2CppGenericMethod* MetadataCache::GetGenericMethod(const MethodInfo* methodDefinition, const Il2CppGenericInst* classInst, const Il2CppGenericInst* methodInst)\n{\n    Il2CppGenericMethod method = { 0 };\n    method.methodDefinition = methodDefinition;\n    method.context.class_inst = classInst;\n    method.context.method_inst = methodInst;\n\n    FastAutoLock lock(&s_GenericMethodMutex);\n    Il2CppGenericMethodSet::const_iterator iter = s_GenericMethodSet.find(&method);\n    if (iter != s_GenericMethodSet.end())\n        return *iter;\n\n    Il2CppGenericMethod* newMethod = MetadataAllocGenericMethod();\n    newMethod->methodDefinition = methodDefinition;\n    newMethod->context.class_inst = classInst;\n    newMethod->context.method_inst = methodInst;\n\n    s_GenericMethodSet.insert(newMethod);\n\n    return newMethod;\n}\n\n// this logic must match the C# logic in GenericSharingAnalysis.GetSharedTypeForGenericParameter\nstatic const Il2CppGenericInst* GetSharedInst(const Il2CppGenericInst* inst)\n{\n    if (inst == NULL)\n        return NULL;\n\n    Il2CppTypeVector types;\n    for (uint32_t i = 0; i < inst->type_argc; ++i)\n    {\n        if (Type::IsReference(inst->type_argv[i]))\n            types.push_back(il2cpp_defaults.object_class->byval_arg);\n        else\n        {\n            const Il2CppType* type = inst->type_argv[i];\n            if (s_Il2CppCodeGenOptions->enablePrimitiveValueTypeGenericSharing)\n            {\n                type = Type::GetUnderlyingType(type);\n                if (type->type == IL2CPP_TYPE_BOOLEAN)\n                    type = il2cpp_defaults.byte_class->byval_arg;\n                else if (type->type == IL2CPP_TYPE_CHAR)\n                    type = il2cpp_defaults.uint16_class->byval_arg;\n            }\n\n            if (Type::IsGenericInstance(type))\n            {\n                const Il2CppGenericInst* sharedInst = GetSharedInst(type->data.generic_class->context.class_inst);\n                Il2CppGenericClass* gklass = GenericMetadata::GetGenericClass(type->data.generic_class->typeDefinitionIndex, sharedInst);\n                Il2CppClass* klass = GenericClass::GetClass(gklass);\n                type = klass->byval_arg;\n            }\n            types.push_back(type);\n        }\n    }\n\n    const Il2CppGenericInst* sharedInst = MetadataCache::GetGenericInst(types);\n\n    return sharedInst;\n}\n\nInvokerMethod MetadataCache::GetInvokerMethodPointer(const MethodInfo* methodDefinition, const Il2CppGenericContext* context)\n{\n    Il2CppGenericMethod method = { 0 };\n    method.methodDefinition = const_cast<MethodInfo*>(methodDefinition);\n    method.context.class_inst = context->class_inst;\n    method.context.method_inst = context->method_inst;\n\n    Il2CppMethodTableMapIter iter = s_MethodTableMap.find(&method);\n    if (iter != s_MethodTableMap.end())\n    {\n        IL2CPP_ASSERT(iter->second->invokerIndex >= 0);\n        if (static_cast<uint32_t>(iter->second->invokerIndex) < s_Il2CppCodeRegistration->invokerPointersCount)\n            return s_Il2CppCodeRegistration->invokerPointers[iter->second->invokerIndex];\n        return NULL;\n    }\n    // get the shared version if it exists\n    method.context.class_inst = GetSharedInst(context->class_inst);\n    method.context.method_inst = GetSharedInst(context->method_inst);\n\n    iter = s_MethodTableMap.find(&method);\n    if (iter != s_MethodTableMap.end())\n    {\n        IL2CPP_ASSERT(iter->second->invokerIndex >= 0);\n        if (static_cast<uint32_t>(iter->second->invokerIndex) < s_Il2CppCodeRegistration->invokerPointersCount)\n            return s_Il2CppCodeRegistration->invokerPointers[iter->second->invokerIndex];\n        return NULL;\n    }\n\n    return NULL;\n}\n\nIl2CppMethodPointer MetadataCache::GetMethodPointer(const MethodInfo* methodDefinition, const Il2CppGenericContext* context)\n{\n    Il2CppGenericMethod method = { 0 };\n    method.methodDefinition = const_cast<MethodInfo*>(methodDefinition);\n    method.context.class_inst = context->class_inst;\n    method.context.method_inst = context->method_inst;\n\n    Il2CppMethodTableMapIter iter = s_MethodTableMap.find(&method);\n    if (iter != s_MethodTableMap.end())\n    {\n        IL2CPP_ASSERT(iter->second->invokerIndex >= 0);\n        if (static_cast<uint32_t>(iter->second->methodIndex) < s_Il2CppCodeRegistration->genericMethodPointersCount)\n            return s_Il2CppCodeRegistration->genericMethodPointers[iter->second->methodIndex];\n        return NULL;\n    }\n\n    method.context.class_inst = GetSharedInst(context->class_inst);\n    method.context.method_inst = GetSharedInst(context->method_inst);\n\n    iter = s_MethodTableMap.find(&method);\n    if (iter != s_MethodTableMap.end())\n    {\n        IL2CPP_ASSERT(iter->second->invokerIndex >= 0);\n        if (static_cast<uint32_t>(iter->second->methodIndex) < s_Il2CppCodeRegistration->genericMethodPointersCount)\n            return s_Il2CppCodeRegistration->genericMethodPointers[iter->second->methodIndex];\n        return NULL;\n    }\n\n    return NULL;\n}\n\nIl2CppClass* MetadataCache::GetTypeInfoFromTypeIndex(TypeIndex index)\n{\n    if (index == kTypeIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index < s_Il2CppMetadataRegistration->typesCount && \"Invalid type index \");\n\n    if (s_TypeInfoTable[index])\n        return s_TypeInfoTable[index];\n\n    const Il2CppType* type = s_Il2CppMetadataRegistration->types[index];\n    Il2CppClass *klass = il2cpp::vm::Class::FromIl2CppType(type);\n    Class::Init(klass);\n    s_TypeInfoTable[index] = klass;\n\n    return s_TypeInfoTable[index];\n}\n\nconst Il2CppType* MetadataCache::GetIl2CppTypeFromIndex(TypeIndex index)\n{\n    if (index == kTypeIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index < s_Il2CppMetadataRegistration->typesCount && \"Invalid type index \");\n\n    return s_Il2CppMetadataRegistration->types[index];\n}\n\nconst MethodInfo* MetadataCache::GetMethodInfoFromIndex(EncodedMethodIndex methodIndex)\n{\n    uint32_t index = GetDecodedMethodIndex(methodIndex);\n\n    if (index == 0)\n        return NULL;\n\n    if (GetEncodedIndexType(methodIndex) == kIl2CppMetadataUsageMethodRef)\n        return GenericMethod::GetMethod(GetGenericMethodFromIndex(index));\n    else\n        return MetadataCache::GetMethodInfoFromMethodDefinitionIndex(index);\n}\n\nconst Il2CppGenericMethod* MetadataCache::GetGenericMethodFromIndex(GenericMethodIndex index)\n{\n    IL2CPP_ASSERT(index < s_Il2CppMetadataRegistration->methodSpecsCount);\n    if (s_GenericMethodTable[index])\n        return s_GenericMethodTable[index];\n\n    const Il2CppMethodSpec* methodSpec = s_Il2CppMetadataRegistration->methodSpecs + index;\n    const MethodInfo* methodDefinition = GetMethodInfoFromMethodDefinitionIndex(methodSpec->methodDefinitionIndex);\n    const Il2CppGenericInst* classInst = NULL;\n    const Il2CppGenericInst* methodInst = NULL;\n    if (methodSpec->classIndexIndex != -1)\n    {\n        IL2CPP_ASSERT(methodSpec->classIndexIndex < s_Il2CppMetadataRegistration->genericInstsCount);\n        classInst = s_Il2CppMetadataRegistration->genericInsts[methodSpec->classIndexIndex];\n    }\n    if (methodSpec->methodIndexIndex != -1)\n    {\n        IL2CPP_ASSERT(methodSpec->methodIndexIndex < s_Il2CppMetadataRegistration->genericInstsCount);\n        methodInst = s_Il2CppMetadataRegistration->genericInsts[methodSpec->methodIndexIndex];\n    }\n    s_GenericMethodTable[index] = GetGenericMethod(methodDefinition, classInst, methodInst);\n\n    return s_GenericMethodTable[index];\n}\n\nIl2CppMethodPointer MetadataCache::GetMethodPointerFromIndex(MethodIndex index)\n{\n    if (index == kMethodIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) < s_Il2CppCodeRegistration->methodPointersCount);\n    return s_Il2CppCodeRegistration->methodPointers[index];\n}\n\nInvokerMethod MetadataCache::GetMethodInvokerFromIndex(MethodIndex index)\n{\n    if (index == kMethodIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) < s_Il2CppCodeRegistration->invokerPointersCount);\n    return s_Il2CppCodeRegistration->invokerPointers[index];\n}\n\nconst Il2CppInteropData* MetadataCache::GetInteropDataForType(const Il2CppType* type)\n{\n    IL2CPP_ASSERT(type != NULL);\n    InteropDataMap::iterator interopData = s_InteropData.find_first(type);\n    if (interopData == s_InteropData.end())\n        return NULL;\n\n    return interopData;\n}\n\nIl2CppMethodPointer MetadataCache::GetReversePInvokeWrapperFromIndex(MethodIndex index)\n{\n    if (index == kMethodIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) < s_Il2CppCodeRegistration->reversePInvokeWrapperCount);\n    return s_Il2CppCodeRegistration->reversePInvokeWrappers[index];\n}\n\nstatic const Il2CppType* GetReducedType(const Il2CppType* type)\n{\n    if (type->byref)\n        return il2cpp_defaults.object_class->byval_arg;\n\n    if (Type::IsEnum(type))\n        type = Type::GetUnderlyingType(type);\n\n    switch (type->type)\n    {\n        case IL2CPP_TYPE_BOOLEAN:\n            return il2cpp_defaults.sbyte_class->byval_arg;\n        case IL2CPP_TYPE_CHAR:\n            return il2cpp_defaults.int16_class->byval_arg;\n        case IL2CPP_TYPE_BYREF:\n        case IL2CPP_TYPE_CLASS:\n        case IL2CPP_TYPE_OBJECT:\n        case IL2CPP_TYPE_STRING:\n        case IL2CPP_TYPE_ARRAY:\n        case IL2CPP_TYPE_SZARRAY:\n            return il2cpp_defaults.object_class->byval_arg;\n        case IL2CPP_TYPE_GENERICINST:\n            if (Type::GenericInstIsValuetype(type))\n                return type;\n            else\n                return il2cpp_defaults.object_class->byval_arg;\n        default:\n            return type;\n    }\n}\n\nIl2CppMethodPointer MetadataCache::GetUnresolvedVirtualCallStub(const MethodInfo* method)\n{\n    il2cpp::utils::dynamic_array<const Il2CppType*> signature;\n\n    signature.push_back(GetReducedType(method->return_type));\n    for (int i = 0; i < method->parameters_count; ++i)\n        signature.push_back(GetReducedType(method->parameters[i].parameter_type));\n\n    Il2CppUnresolvedSignatureMapIter it = s_pUnresolvedSignatureMap->find(signature);\n    if (it != s_pUnresolvedSignatureMap->end())\n        return it->second;\n\n    return NULL;\n}\n\nstatic const Il2CppImage* GetImageForTypeDefinitionIndex(TypeDefinitionIndex index)\n{\n    for (int32_t imageIndex = 0; imageIndex < s_ImagesCount; imageIndex++)\n    {\n        const Il2CppImage* image = s_ImagesTable + imageIndex;\n        IL2CPP_ASSERT(index >= 0);\n        if (index >= image->typeStart && static_cast<uint32_t>(index) < (image->typeStart + image->typeCount))\n            return image;\n    }\n\n    IL2CPP_ASSERT(0 && \"Failed to find owning image for type\");\n    return NULL;\n}\n\nenum PackingSize\n{\n    Zero,\n    One,\n    Two,\n    Four,\n    Eight,\n    Sixteen,\n    ThirtyTwo,\n    SixtyFour,\n    OneHundredTwentyEight\n};\n\nstatic uint8_t ConvertPackingSizeEnumToValue(PackingSize packingSize)\n{\n    switch (packingSize)\n    {\n        case Zero:\n            return 0;\n        case One:\n            return 1;\n        case Two:\n            return 2;\n        case Four:\n            return 4;\n        case Eight:\n            return 8;\n        case Sixteen:\n            return 16;\n        case ThirtyTwo:\n            return 32;\n        case SixtyFour:\n            return 64;\n        case OneHundredTwentyEight:\n            return 128;\n        default:\n            Assert(0 && \"Invalid packing size!\");\n            return 0;\n    }\n}\n\nstatic const int kBitIsValueType = 1;\nstatic const int kBitIsEnum = 2;\nstatic const int kBitHasFinalizer = 3;\nstatic const int kBitHasStaticConstructor = 4;\nstatic const int kBitIsBlittable = 5;\nstatic const int kBitIsImportOrWindowsRuntime = 6;\nstatic const int kPackingSize = 7; // This uses 4 bits from bit 7 to bit 10\n\nstatic Il2CppClass* FromTypeDefinition(TypeDefinitionIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) < s_GlobalMetadataHeader->typeDefinitionsCount / sizeof(Il2CppTypeDefinition));\n    const Il2CppTypeDefinition* typeDefinitions = (const Il2CppTypeDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->typeDefinitionsOffset);\n    const Il2CppTypeDefinition* typeDefinition = typeDefinitions + index;\n    const Il2CppTypeDefinitionSizes* typeDefinitionSizes = s_Il2CppMetadataRegistration->typeDefinitionsSizes[index];\n    Il2CppClass* typeInfo = (Il2CppClass*)IL2CPP_CALLOC(1, sizeof(Il2CppClass) + (sizeof(VirtualInvokeData) * typeDefinition->vtable_count));\n    typeInfo->image = GetImageForTypeDefinitionIndex(index);\n    typeInfo->name = MetadataCache::GetStringFromIndex(typeDefinition->nameIndex);\n    typeInfo->namespaze = MetadataCache::GetStringFromIndex(typeDefinition->namespaceIndex);\n    typeInfo->customAttributeIndex = typeDefinition->customAttributeIndex;\n    typeInfo->byval_arg = MetadataCache::GetIl2CppTypeFromIndex(typeDefinition->byvalTypeIndex);\n    typeInfo->this_arg = MetadataCache::GetIl2CppTypeFromIndex(typeDefinition->byrefTypeIndex);\n    typeInfo->typeDefinition = typeDefinition;\n    typeInfo->genericContainerIndex = typeDefinition->genericContainerIndex;\n    typeInfo->instance_size = typeDefinitionSizes->instance_size;\n    typeInfo->actualSize = typeDefinitionSizes->instance_size; // actualySize is instance_size for compiler generated values\n    typeInfo->native_size = typeDefinitionSizes->native_size;\n    typeInfo->static_fields_size = typeDefinitionSizes->static_fields_size;\n    typeInfo->thread_static_fields_size = typeDefinitionSizes->thread_static_fields_size;\n    typeInfo->thread_static_fields_offset = -1;\n    typeInfo->flags = typeDefinition->flags;\n    typeInfo->valuetype = (typeDefinition->bitfield >> (kBitIsValueType - 1)) & 0x1;\n    typeInfo->enumtype = (typeDefinition->bitfield >> (kBitIsEnum - 1)) & 0x1;\n    typeInfo->is_generic = typeDefinition->genericContainerIndex != kGenericContainerIndexInvalid; // generic if we have a generic container\n    typeInfo->has_finalize = (typeDefinition->bitfield >> (kBitHasFinalizer - 1)) & 0x1;\n    typeInfo->has_cctor = (typeDefinition->bitfield >> (kBitHasStaticConstructor - 1)) & 0x1;\n    typeInfo->is_blittable = (typeDefinition->bitfield >> (kBitIsBlittable - 1)) & 0x1;\n    typeInfo->is_import_or_windows_runtime = (typeDefinition->bitfield >> (kBitIsImportOrWindowsRuntime - 1)) & 0x1;\n    typeInfo->packingSize = ConvertPackingSizeEnumToValue(static_cast<PackingSize>((typeDefinition->bitfield >> (kPackingSize - 1)) & 0xF));\n    typeInfo->method_count = typeDefinition->method_count;\n    typeInfo->property_count = typeDefinition->property_count;\n    typeInfo->field_count = typeDefinition->field_count;\n    typeInfo->event_count = typeDefinition->event_count;\n    typeInfo->nested_type_count = typeDefinition->nested_type_count;\n    typeInfo->vtable_count = typeDefinition->vtable_count;\n    typeInfo->interfaces_count = typeDefinition->interfaces_count;\n    typeInfo->interface_offsets_count = typeDefinition->interface_offsets_count;\n    typeInfo->token = typeDefinition->token;\n    typeInfo->interopData = MetadataCache::GetInteropDataForType(typeInfo->byval_arg);\n\n    if (typeDefinition->parentIndex != kTypeIndexInvalid)\n        typeInfo->parent = Class::FromIl2CppType(MetadataCache::GetIl2CppTypeFromIndex(typeDefinition->parentIndex));\n\n    if (typeDefinition->declaringTypeIndex != kTypeIndexInvalid)\n        typeInfo->declaringType = Class::FromIl2CppType(MetadataCache::GetIl2CppTypeFromIndex(typeDefinition->declaringTypeIndex));\n\n    typeInfo->castClass = typeInfo->element_class = typeInfo;\n    if (typeInfo->enumtype)\n        typeInfo->castClass = typeInfo->element_class = Class::FromIl2CppType(MetadataCache::GetIl2CppTypeFromIndex(typeDefinition->elementTypeIndex));\n\n    return typeInfo;\n}\n\nconst Il2CppAssembly* MetadataCache::GetAssemblyFromIndex(AssemblyIndex index)\n{\n    if (index == kGenericContainerIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->assembliesCount / sizeof(Il2CppAssembly));\n    const Il2CppAssembly* assemblies = (const Il2CppAssembly*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->assembliesOffset);\n    return assemblies + index;\n}\n\nconst Il2CppAssembly* MetadataCache::GetAssemblyByName(const std::string& name)\n{\n    const Il2CppAssembly* assemblies = (const Il2CppAssembly*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->assembliesOffset);\n    const char* nameToFind = name.c_str();\n\n    for (int i = 0; i < (int)(s_GlobalMetadataHeader->assembliesCount / sizeof(Il2CppAssembly)); i++)\n    {\n        const Il2CppAssembly* assembly = assemblies + i;\n\n        const char* assemblyName = GetStringFromIndex(assembly->aname.nameIndex);\n\n        if (strcmp(assemblyName, nameToFind) == 0)\n            return assembly;\n    }\n\n    return NULL;\n}\n\nIl2CppImage* MetadataCache::GetImageFromIndex(ImageIndex index)\n{\n    if (index == kGenericContainerIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index <= s_ImagesCount);\n    return s_ImagesTable + index;\n}\n\nIl2CppClass* MetadataCache::GetTypeInfoFromTypeDefinitionIndex(TypeDefinitionIndex index)\n{\n    if (index == kTypeIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) < s_GlobalMetadataHeader->typeDefinitionsCount / sizeof(Il2CppTypeDefinition));\n\n    if (!s_TypeInfoDefinitionTable[index])\n    {\n        // we need to use the metadata lock, since we may need to retrieve other Il2CppClass's when setting. Our parent may be a generic instance for example\n        FastAutoLock lock(&g_MetadataLock);\n        // double checked locking\n        if (!s_TypeInfoDefinitionTable[index])\n            s_TypeInfoDefinitionTable[index] = FromTypeDefinition(index);\n    }\n\n    return s_TypeInfoDefinitionTable[index];\n}\n\nconst Il2CppTypeDefinition* MetadataCache::GetTypeDefinitionFromIndex(TypeDefinitionIndex index)\n{\n    if (index == kTypeDefinitionIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) < s_GlobalMetadataHeader->typeDefinitionsCount / sizeof(Il2CppTypeDefinition));\n    const Il2CppTypeDefinition* typeDefinitions = (const Il2CppTypeDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->typeDefinitionsOffset);\n    return typeDefinitions + index;\n}\n\nTypeDefinitionIndex MetadataCache::GetExportedTypeFromIndex(TypeDefinitionIndex index)\n{\n    if (index == kTypeDefinitionIndexInvalid)\n        return kTypeDefinitionIndexInvalid;\n\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) < s_GlobalMetadataHeader->exportedTypeDefinitionsCount / sizeof(TypeDefinitionIndex));\n    TypeDefinitionIndex* exportedTypes = (TypeDefinitionIndex*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->exportedTypeDefinitionsOffset);\n    return *(exportedTypes + index);\n}\n\nconst Il2CppGenericContainer* MetadataCache::GetGenericContainerFromIndex(GenericContainerIndex index)\n{\n    if (index == kGenericContainerIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->genericContainersCount / sizeof(Il2CppGenericContainer));\n    const Il2CppGenericContainer* genericContainers = (const Il2CppGenericContainer*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->genericContainersOffset);\n    return genericContainers + index;\n}\n\nconst Il2CppGenericParameter* MetadataCache::GetGenericParameterFromIndex(GenericParameterIndex index)\n{\n    if (index == kGenericParameterIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->genericParametersCount / sizeof(Il2CppGenericParameter));\n    const Il2CppGenericParameter* genericParameters = (const Il2CppGenericParameter*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->genericParametersOffset);\n    return genericParameters + index;\n}\n\nconst Il2CppType* MetadataCache::GetGenericParameterConstraintFromIndex(GenericParameterConstraintIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->genericParameterConstraintsCount / sizeof(TypeIndex));\n    const TypeIndex* constraintIndices = (const TypeIndex*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->genericParameterConstraintsOffset);\n\n    return GetIl2CppTypeFromIndex(constraintIndices[index]);\n}\n\nIl2CppClass* MetadataCache::GetNestedTypeFromIndex(NestedTypeIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->nestedTypesCount / sizeof(TypeDefinitionIndex));\n    const TypeDefinitionIndex* nestedTypeIndices = (const TypeDefinitionIndex*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->nestedTypesOffset);\n\n    return GetTypeInfoFromTypeDefinitionIndex(nestedTypeIndices[index]);\n}\n\nconst Il2CppType* MetadataCache::GetInterfaceFromIndex(InterfacesIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->interfacesCount / sizeof(TypeIndex));\n    const TypeIndex* interfaceIndices = (const TypeIndex*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->interfacesOffset);\n\n    return GetIl2CppTypeFromIndex(interfaceIndices[index]);\n}\n\nEncodedMethodIndex MetadataCache::GetVTableMethodFromIndex(VTableIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->vtableMethodsCount / sizeof(EncodedMethodIndex));\n    const EncodedMethodIndex* methodReferences = (const EncodedMethodIndex*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->vtableMethodsOffset);\n\n    return methodReferences[index];\n}\n\nIl2CppInterfaceOffsetPair MetadataCache::GetInterfaceOffsetIndex(InterfaceOffsetIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->interfaceOffsetsCount / sizeof(Il2CppInterfaceOffsetPair));\n    const Il2CppInterfaceOffsetPair* interfaceOffsets = (const Il2CppInterfaceOffsetPair*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->interfaceOffsetsOffset);\n\n    return interfaceOffsets[index];\n}\n\nconst Il2CppRGCTXDefinition* MetadataCache::GetRGCTXDefinitionFromIndex(RGCTXIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->rgctxEntriesCount / sizeof(Il2CppRGCTXDefinition));\n    const Il2CppRGCTXDefinition* rgctxEntries = (const Il2CppRGCTXDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->rgctxEntriesOffset);\n\n    return rgctxEntries  + index;\n}\n\nconst Il2CppEventDefinition* MetadataCache::GetEventDefinitionFromIndex(EventIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->eventsCount / sizeof(Il2CppEventDefinition));\n    const Il2CppEventDefinition* events = (const Il2CppEventDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->eventsOffset);\n    return events + index;\n}\n\nconst Il2CppFieldDefinition* MetadataCache::GetFieldDefinitionFromIndex(FieldIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->fieldsCount / sizeof(Il2CppFieldDefinition));\n    const Il2CppFieldDefinition* fields = (const Il2CppFieldDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->fieldsOffset);\n    return fields + index;\n}\n\nconst Il2CppFieldDefaultValue* MetadataCache::GetFieldDefaultValueFromIndex(FieldIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->fieldDefaultValuesCount / sizeof(Il2CppFieldDefaultValue));\n    const Il2CppFieldDefaultValue* defaultValues = (const Il2CppFieldDefaultValue*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->fieldDefaultValuesOffset);\n    return defaultValues + index;\n}\n\nconst uint8_t* MetadataCache::GetFieldDefaultValueDataFromIndex(FieldIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->fieldAndParameterDefaultValueDataCount / sizeof(uint8_t));\n    const uint8_t* defaultValuesData = (const uint8_t*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->fieldAndParameterDefaultValueDataOffset);\n    return defaultValuesData + index;\n}\n\nconst Il2CppFieldDefaultValue* MetadataCache::GetFieldDefaultValueForField(const FieldInfo* field)\n{\n    Il2CppClass* parent = field->parent;\n    size_t fieldIndex = (field - parent->fields);\n    if (Type::IsGenericInstance(parent->byval_arg))\n        fieldIndex += GenericClass::GetTypeDefinition(parent->generic_class)->typeDefinition->fieldStart;\n    else\n        fieldIndex += parent->typeDefinition->fieldStart;\n    const Il2CppFieldDefaultValue *start = (const Il2CppFieldDefaultValue*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->fieldDefaultValuesOffset);\n    const Il2CppFieldDefaultValue *entry = start;\n    while (entry < start + s_GlobalMetadataHeader->fieldDefaultValuesCount)\n    {\n        if (fieldIndex == entry->fieldIndex)\n        {\n            return entry;\n        }\n        entry++;\n    }\n    IL2CPP_ASSERT(0);\n    return NULL;\n}\n\nconst Il2CppParameterDefaultValue * il2cpp::vm::MetadataCache::GetParameterDefaultValueForParameter(const MethodInfo* method, const ParameterInfo* parameter)\n{\n    if (Method::IsGenericInstance(method))\n        method = GetGenericMethodDefinition(method);\n\n    IL2CPP_ASSERT(!Method::IsGenericInstance(method));\n\n    if (method->methodDefinition == NULL)\n        return NULL;\n\n    size_t parameterIndex = method->methodDefinition->parameterStart + parameter->position;\n    const Il2CppParameterDefaultValue *start = (const Il2CppParameterDefaultValue*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->parameterDefaultValuesOffset);\n    const Il2CppParameterDefaultValue *entry = start;\n    while (entry < start + s_GlobalMetadataHeader->parameterDefaultValuesCount)\n    {\n        if (parameterIndex == entry->parameterIndex)\n            return entry;\n        entry++;\n    }\n\n    return NULL;\n}\n\nconst uint8_t* MetadataCache::GetParameterDefaultValueDataFromIndex(ParameterIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->fieldAndParameterDefaultValueDataCount / sizeof(uint8_t));\n    const uint8_t* defaultValuesData = (const uint8_t*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->fieldAndParameterDefaultValueDataOffset);\n    return defaultValuesData + index;\n}\n\nint MetadataCache::GetFieldMarshaledSizeForField(const FieldInfo* field)\n{\n    Il2CppClass* parent = field->parent;\n    size_t fieldIndex = (field - parent->fields);\n    fieldIndex += parent->typeDefinition->fieldStart;\n    const Il2CppFieldMarshaledSize *start = (const Il2CppFieldMarshaledSize*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->fieldMarshaledSizesOffset);\n    const Il2CppFieldMarshaledSize *entry = start;\n    while ((intptr_t)entry < (intptr_t)start + s_GlobalMetadataHeader->fieldMarshaledSizesCount)\n    {\n        if (fieldIndex == entry->fieldIndex)\n            return entry->size;\n        entry++;\n    }\n\n    return -1;\n}\n\nconst Il2CppMethodDefinition* MetadataCache::GetMethodDefinitionFromIndex(MethodIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->methodsCount / sizeof(Il2CppMethodDefinition));\n    const Il2CppMethodDefinition* methods = (const Il2CppMethodDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->methodsOffset);\n    return methods + index;\n}\n\nconst MethodInfo* MetadataCache::GetMethodInfoFromMethodDefinitionIndex(MethodIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->methodsCount / sizeof(Il2CppMethodDefinition));\n\n    if (!s_MethodInfoDefinitionTable[index])\n    {\n        const Il2CppMethodDefinition* methodDefinition = GetMethodDefinitionFromIndex(index);\n        Il2CppClass* typeInfo = GetTypeInfoFromTypeDefinitionIndex(methodDefinition->declaringType);\n        Class::SetupMethods(typeInfo);\n        s_MethodInfoDefinitionTable[index] = typeInfo->methods[index - typeInfo->typeDefinition->methodStart];\n    }\n\n    return s_MethodInfoDefinitionTable[index];\n}\n\nconst Il2CppPropertyDefinition* MetadataCache::GetPropertyDefinitionFromIndex(PropertyIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->propertiesCount / sizeof(Il2CppPropertyDefinition));\n    const Il2CppPropertyDefinition* properties = (const Il2CppPropertyDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->propertiesOffset);\n    return properties + index;\n}\n\nconst Il2CppParameterDefinition* MetadataCache::GetParameterDefinitionFromIndex(ParameterIndex index)\n{\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->parametersCount / sizeof(Il2CppParameterDefinition));\n    const Il2CppParameterDefinition* parameters = (const Il2CppParameterDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->parametersOffset);\n    return parameters + index;\n}\n\nint32_t MetadataCache::GetFieldOffsetFromIndex(TypeIndex typeIndex, int32_t fieldIndexInType)\n{\n    IL2CPP_ASSERT(typeIndex <= s_Il2CppMetadataRegistration->typeDefinitionsSizesCount);\n    return s_Il2CppMetadataRegistration->fieldOffsets[typeIndex][fieldIndexInType];\n}\n\nint32_t MetadataCache::GetReferenceAssemblyIndexIntoAssemblyTable(int32_t referencedAssemblyTableIndex)\n{\n    IL2CPP_ASSERT(referencedAssemblyTableIndex >= 0 && static_cast<uint32_t>(referencedAssemblyTableIndex) <= s_GlobalMetadataHeader->referencedAssembliesCount / sizeof(int32_t));\n    const int32_t* referenceAssemblyIndicies = (const int32_t*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->referencedAssembliesOffset);\n    return referenceAssemblyIndicies[referencedAssemblyTableIndex];\n}\n\nconst TypeDefinitionIndex MetadataCache::GetIndexForTypeDefinition(const Il2CppClass* typeDefinition)\n{\n    IL2CPP_ASSERT(typeDefinition->typeDefinition);\n    const Il2CppTypeDefinition* typeDefinitions = (const Il2CppTypeDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->typeDefinitionsOffset);\n\n    IL2CPP_ASSERT(typeDefinition->typeDefinition >= typeDefinitions && typeDefinition->typeDefinition < typeDefinitions + s_GlobalMetadataHeader->typeDefinitionsCount);\n\n    ptrdiff_t index = typeDefinition->typeDefinition - typeDefinitions;\n    IL2CPP_ASSERT(index <= std::numeric_limits<TypeDefinitionIndex>::max());\n    return static_cast<TypeDefinitionIndex>(index);\n}\n\nconst GenericParameterIndex MetadataCache::GetIndexForGenericParameter(const Il2CppGenericParameter* genericParameter)\n{\n    const Il2CppGenericParameter* genericParameters = (const Il2CppGenericParameter*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->genericParametersOffset);\n\n    IL2CPP_ASSERT(genericParameter >= genericParameters && genericParameter < genericParameters + s_GlobalMetadataHeader->genericParametersCount);\n\n    ptrdiff_t index = genericParameter - genericParameters;\n    IL2CPP_ASSERT(index <= std::numeric_limits<GenericParameterIndex>::max());\n    return static_cast<GenericParameterIndex>(index);\n}\n\nstatic OnceFlag s_CustomAttributesOnceFlag;\n\nstatic void InitializeCustomAttributesCaches(void* arg)\n{\n    s_CustomAttributesCaches = (CustomAttributesCache**)IL2CPP_CALLOC(s_Il2CppCodeRegistration->customAttributeCount, sizeof(CustomAttributesCache*));\n    s_CustomAttributeTypeCaches = (CustomAttributeTypeCache**)IL2CPP_CALLOC(s_Il2CppCodeRegistration->customAttributeCount, sizeof(CustomAttributeTypeCache*));\n}\n\nCustomAttributesCache* MetadataCache::GenerateCustomAttributesCache(CustomAttributeIndex index)\n{\n    if (index == 0)\n        return NULL;\n\n    IL2CPP_ASSERT(index > 0 && index <= s_Il2CppCodeRegistration->customAttributeCount);\n    IL2CPP_ASSERT(index > 0 && index <= static_cast<int32_t>(s_GlobalMetadataHeader->attributesInfoCount / sizeof(Il2CppCustomAttributeTypeRange)));\n\n    CallOnce(s_CustomAttributesOnceFlag, &InitializeCustomAttributesCaches, NULL);\n\n    // use atomics rather than a Mutex here to avoid deadlock. The attribute generators call arbitrary managed code\n    CustomAttributesCache* cache = Atomic::ReadPointer(&s_CustomAttributesCaches[index]);\n    if (cache == NULL)\n    {\n        const Il2CppCustomAttributeTypeRange* attributeTypeRange = MetadataOffset<const Il2CppCustomAttributeTypeRange*>(s_GlobalMetadata, s_GlobalMetadataHeader->attributesInfoOffset, index);\n\n        cache = (CustomAttributesCache*)IL2CPP_CALLOC(1, sizeof(CustomAttributesCache));\n        cache->count = attributeTypeRange->count;\n        cache->attributes = (Il2CppObject**)GarbageCollector::AllocateFixed(sizeof(Il2CppObject *) * cache->count, 0);\n\n        for (int32_t i = 0; i < attributeTypeRange->count; i++)\n        {\n            IL2CPP_ASSERT(attributeTypeRange->start + i < s_GlobalMetadataHeader->attributeTypesCount);\n            TypeIndex typeIndex = *MetadataOffset<TypeIndex*>(s_GlobalMetadata, s_GlobalMetadataHeader->attributeTypesOffset, attributeTypeRange->start + i);\n            cache->attributes[i] = il2cpp::vm::Object::New(GetTypeInfoFromTypeIndex(typeIndex));\n        }\n\n        // generated code calls the attribute constructor and sets any fields/properties\n        s_Il2CppCodeRegistration->customAttributeGenerators[index](cache);\n\n        CustomAttributesCache* original = Atomic::CompareExchangePointer(&s_CustomAttributesCaches[index], cache, (CustomAttributesCache*)NULL);\n        if (original)\n        {\n            // A non-NULL return value indicates some other thread already generated this cache.\n            // We need to cleanup the resources we allocated\n            GarbageCollector::FreeFixed(cache->attributes);\n            IL2CPP_FREE(cache);\n\n            cache = original;\n        }\n    }\n\n    return cache;\n}\n\nCustomAttributeTypeCache* MetadataCache::GenerateCustomAttributeTypeCache(CustomAttributeIndex index)\n{\n    if (index == 0)\n        return NULL;\n\n    IL2CPP_ASSERT(index > 0 && index <= s_Il2CppCodeRegistration->customAttributeCount);\n    IL2CPP_ASSERT(index > 0 && index <= static_cast<int32_t>(s_GlobalMetadataHeader->attributesInfoCount / sizeof(Il2CppCustomAttributeTypeRange)));\n\n    CallOnce(s_CustomAttributesOnceFlag, &InitializeCustomAttributesCaches, NULL);\n\n    // use atomics rather than a Mutex here to avoid deadlock. The attribute generators call arbitrary managed code\n    CustomAttributeTypeCache* cache = Atomic::ReadPointer(&s_CustomAttributeTypeCaches[index]);\n    if (cache == NULL)\n    {\n        const Il2CppCustomAttributeTypeRange* attributeTypeRange = MetadataOffset<const Il2CppCustomAttributeTypeRange*>(s_GlobalMetadata, s_GlobalMetadataHeader->attributesInfoOffset, index);\n\n        cache = (CustomAttributeTypeCache*)IL2CPP_CALLOC(1, sizeof(CustomAttributeTypeCache));\n        cache->count = attributeTypeRange->count;\n        cache->attributeTypes = (Il2CppClass**)IL2CPP_CALLOC(cache->count, sizeof(Il2CppClass*));\n\n        for (int32_t i = 0; i < attributeTypeRange->count; i++)\n        {\n            IL2CPP_ASSERT(attributeTypeRange->start + i < s_GlobalMetadataHeader->attributeTypesCount);\n            TypeIndex typeIndex = *MetadataOffset<TypeIndex*>(s_GlobalMetadata, s_GlobalMetadataHeader->attributeTypesOffset, attributeTypeRange->start + i);\n            cache->attributeTypes[i] = GetTypeInfoFromTypeIndex(typeIndex);\n        }\n\n        CustomAttributeTypeCache* original = Atomic::CompareExchangePointer(&s_CustomAttributeTypeCaches[index], cache, (CustomAttributeTypeCache*)NULL);\n        if (original)\n        {\n            // A non-NULL return value indicates some other thread already generated this cache.\n            // We need to cleanup the resources we allocated\n            IL2CPP_FREE(cache->attributeTypes);\n            IL2CPP_FREE(cache);\n\n            cache = original;\n        }\n    }\n\n    return cache;\n}\n\nIl2CppString* MetadataCache::GetStringLiteralFromIndex(StringLiteralIndex index)\n{\n    if (index == kStringLiteralIndexInvalid)\n        return NULL;\n\n    IL2CPP_ASSERT(index >= 0 && static_cast<uint32_t>(index) < s_GlobalMetadataHeader->stringLiteralCount / sizeof(Il2CppStringLiteral) && \"Invalid string literal index \");\n\n    if (s_StringLiteralTable[index])\n        return s_StringLiteralTable[index];\n\n    const Il2CppStringLiteral* stringLiteral = (const Il2CppStringLiteral*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->stringLiteralOffset) + index;\n    s_StringLiteralTable[index] = String::NewLen((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->stringLiteralDataOffset + stringLiteral->dataIndex, stringLiteral->length);\n\n    return s_StringLiteralTable[index];\n}\n\nconst char* MetadataCache::GetStringFromIndex(StringIndex index)\n{\n    IL2CPP_ASSERT(index <= s_GlobalMetadataHeader->stringCount);\n    const char* strings = ((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->stringOffset) + index;\n    return strings;\n}\n\nFieldInfo* MetadataCache::GetFieldInfoFromIndex(EncodedMethodIndex index)\n{\n    IL2CPP_ASSERT(s_GlobalMetadataHeader->fieldRefsCount >= 0 && index <= static_cast<uint32_t>(s_GlobalMetadataHeader->fieldRefsCount));\n\n    const Il2CppFieldRef* fieldRef = MetadataOffset<const Il2CppFieldRef*>(s_GlobalMetadata, s_GlobalMetadataHeader->fieldRefsOffset, index);\n    Il2CppClass* typeInfo = GetTypeInfoFromTypeIndex(fieldRef->typeIndex);\n    return typeInfo->fields + fieldRef->fieldIndex;\n}\n\nvoid MetadataCache::InitializeMethodMetadata(uint32_t index)\n{\n    IL2CPP_ASSERT(s_GlobalMetadataHeader->metadataUsageListsCount >= 0 && index <= static_cast<uint32_t>(s_GlobalMetadataHeader->metadataUsageListsCount));\n\n    const Il2CppMetadataUsageList* metadataUsageLists = MetadataOffset<const Il2CppMetadataUsageList*>(s_GlobalMetadata, s_GlobalMetadataHeader->metadataUsageListsOffset, index);\n\n    uint32_t start = metadataUsageLists->start;\n    uint32_t count = metadataUsageLists->count;\n\n    for (uint32_t i = 0; i < count; i++)\n    {\n        uint32_t offset = start + i;\n        IL2CPP_ASSERT(s_GlobalMetadataHeader->metadataUsagePairsCount >= 0 && offset <= static_cast<uint32_t>(s_GlobalMetadataHeader->metadataUsagePairsCount));\n        const Il2CppMetadataUsagePair* metadataUsagePairs = MetadataOffset<const Il2CppMetadataUsagePair*>(s_GlobalMetadata, s_GlobalMetadataHeader->metadataUsagePairsOffset, offset);\n        uint32_t destinationIndex = metadataUsagePairs->destinationIndex;\n        uint32_t encodedSourceIndex = metadataUsagePairs->encodedSourceIndex;\n\n        Il2CppMetadataUsage usage = GetEncodedIndexType(encodedSourceIndex);\n        uint32_t decodedIndex = GetDecodedMethodIndex(encodedSourceIndex);\n        switch (usage)\n        {\n            case kIl2CppMetadataUsageTypeInfo:\n                *s_Il2CppMetadataRegistration->metadataUsages[destinationIndex] = GetTypeInfoFromTypeIndex(decodedIndex);\n                break;\n            case kIl2CppMetadataUsageIl2CppType:\n                *s_Il2CppMetadataRegistration->metadataUsages[destinationIndex] = const_cast<Il2CppType*>(GetIl2CppTypeFromIndex(decodedIndex));\n                break;\n            case kIl2CppMetadataUsageMethodDef:\n            case kIl2CppMetadataUsageMethodRef:\n                *s_Il2CppMetadataRegistration->metadataUsages[destinationIndex] = const_cast<MethodInfo*>(GetMethodInfoFromIndex(encodedSourceIndex));\n                break;\n            case kIl2CppMetadataUsageFieldInfo:\n                *s_Il2CppMetadataRegistration->metadataUsages[destinationIndex] = GetFieldInfoFromIndex(decodedIndex);\n                break;\n            case kIl2CppMetadataUsageStringLiteral:\n                *s_Il2CppMetadataRegistration->metadataUsages[destinationIndex] = GetStringLiteralFromIndex(decodedIndex);\n                break;\n            default:\n                NOT_IMPLEMENTED(MetadataCache::InitializeMethodMetadata);\n                break;\n        }\n    }\n}\n\nvoid MetadataCache::WalkPointerTypes(WalkTypesCallback callback, void* context)\n{\n    os::FastAutoLock lock(&s_MetadataCache.m_CacheMutex);\n    for (PointerTypeMap::iterator it = s_MetadataCache.m_PointerTypes.begin(); it != s_MetadataCache.m_PointerTypes.end(); it++)\n    {\n        callback(it->second, context);\n    }\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/MetadataCache.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include \"il2cpp-config.h\"\n#include \"Assembly.h\"\n#include \"metadata/Il2CppTypeVector.h\"\n#include \"class-internals.h\"\n\nstruct MethodInfo;\nstruct Il2CppClass;\nstruct Il2CppGenericContainer;\nstruct Il2CppGenericContext;\nstruct Il2CppGenericInst;\nstruct Il2CppGenericMethod;\nstruct Il2CppType;\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API MetadataCache\n    {\n    public:\n\n        static void Register(const Il2CppCodeRegistration * const codeRegistration, const Il2CppMetadataRegistration * const metadataRegistration, const Il2CppCodeGenOptions* const codeGenOptions);\n\n        static void Initialize();\n        static void InitializeGCSafe();\n\n        static Il2CppClass* GetGenericInstanceType(Il2CppClass* genericTypeDefinition, const il2cpp::metadata::Il2CppTypeVector& genericArgumentTypes);\n        static const MethodInfo* GetGenericInstanceMethod(const MethodInfo* genericMethodDefinition, const Il2CppGenericContext* context);\n        static const MethodInfo* GetGenericInstanceMethod(const MethodInfo* genericMethodDefinition, const il2cpp::metadata::Il2CppTypeVector& genericArgumentTypes);\n        static const Il2CppGenericContext* GetMethodGenericContext(const MethodInfo* method);\n        static const Il2CppGenericContainer* GetMethodGenericContainer(const MethodInfo* method);\n        static const MethodInfo* GetGenericMethodDefinition(const MethodInfo* method);\n\n        static Il2CppClass* GetPointerType(Il2CppClass* type);\n        static Il2CppClass* GetWindowsRuntimeClass(const std::string& fullName);\n        static const char* GetWindowsRuntimeClassName(const Il2CppClass* klass);\n        static void AddPointerType(Il2CppClass* type, Il2CppClass* pointerType);\n\n        static const Il2CppGenericInst* GetGenericInst(const Il2CppType* const* types, uint32_t typeCount);\n        static const Il2CppGenericInst* GetGenericInst(const il2cpp::metadata::Il2CppTypeVector& types);\n        static const Il2CppGenericMethod* GetGenericMethod(const MethodInfo* methodDefinition, const Il2CppGenericInst* classInst, const Il2CppGenericInst* methodInst);\n\n        static InvokerMethod GetInvokerMethodPointer(const MethodInfo* methodDefinition, const Il2CppGenericContext* context);\n        static Il2CppMethodPointer GetMethodPointer(const MethodInfo* methodDefinition, const Il2CppGenericContext* context);\n\n        static Il2CppClass* GetTypeInfoFromTypeIndex(TypeIndex index);\n        static const Il2CppType* GetIl2CppTypeFromIndex(TypeIndex index);\n        static const MethodInfo* GetMethodInfoFromIndex(EncodedMethodIndex index);\n        static const Il2CppGenericMethod* GetGenericMethodFromIndex(GenericMethodIndex index);\n        static Il2CppString* GetStringLiteralFromIndex(StringLiteralIndex index);\n        static const char* GetStringFromIndex(StringIndex index);\n\n        static FieldInfo* GetFieldInfoFromIndex(EncodedMethodIndex index);\n        static void InitializeMethodMetadata(uint32_t index);\n\n        static Il2CppMethodPointer GetMethodPointerFromIndex(MethodIndex index);\n        static InvokerMethod GetMethodInvokerFromIndex(MethodIndex index);\n        static const Il2CppInteropData* GetInteropDataForType(const Il2CppType* type);\n        static Il2CppMethodPointer GetReversePInvokeWrapperFromIndex(MethodIndex index);\n\n        static Il2CppMethodPointer GetUnresolvedVirtualCallStub(const MethodInfo* method);\n\n        static const Il2CppAssembly* GetAssemblyFromIndex(AssemblyIndex index);\n        static const Il2CppAssembly* GetAssemblyByName(const std::string& name);\n        static Il2CppImage* GetImageFromIndex(ImageIndex index);\n        static Il2CppClass* GetTypeInfoFromTypeDefinitionIndex(TypeDefinitionIndex index);\n        static const Il2CppTypeDefinition* GetTypeDefinitionFromIndex(TypeDefinitionIndex index);\n        static TypeDefinitionIndex GetExportedTypeFromIndex(TypeDefinitionIndex index);\n        static const Il2CppGenericContainer* GetGenericContainerFromIndex(GenericContainerIndex index);\n        static const Il2CppGenericParameter* GetGenericParameterFromIndex(GenericParameterIndex index);\n        static const Il2CppType* GetGenericParameterConstraintFromIndex(GenericParameterConstraintIndex index);\n        static Il2CppClass* GetNestedTypeFromIndex(NestedTypeIndex index);\n        static const Il2CppType* GetInterfaceFromIndex(InterfacesIndex index);\n        static EncodedMethodIndex GetVTableMethodFromIndex(VTableIndex index);\n        static Il2CppInterfaceOffsetPair GetInterfaceOffsetIndex(InterfaceOffsetIndex index);\n        static const Il2CppRGCTXDefinition* GetRGCTXDefinitionFromIndex(RGCTXIndex index);\n        static const Il2CppEventDefinition* GetEventDefinitionFromIndex(EventIndex index);\n        static const Il2CppFieldDefinition* GetFieldDefinitionFromIndex(FieldIndex index);\n        static const Il2CppFieldDefaultValue* GetFieldDefaultValueFromIndex(FieldIndex index);\n        static const uint8_t* GetFieldDefaultValueDataFromIndex(FieldIndex index);\n        static const Il2CppFieldDefaultValue* GetFieldDefaultValueForField(const FieldInfo* field);\n        static const uint8_t* GetParameterDefaultValueDataFromIndex(ParameterIndex index);\n        static const Il2CppParameterDefaultValue* GetParameterDefaultValueForParameter(const MethodInfo* method, const ParameterInfo* parameter);\n        static int GetFieldMarshaledSizeForField(const FieldInfo* field);\n        static const Il2CppMethodDefinition* GetMethodDefinitionFromIndex(MethodIndex index);\n        static const MethodInfo* GetMethodInfoFromMethodDefinitionIndex(MethodIndex index);\n        static const Il2CppPropertyDefinition* GetPropertyDefinitionFromIndex(PropertyIndex index);\n        static const Il2CppParameterDefinition* GetParameterDefinitionFromIndex(ParameterIndex index);\n\n        // returns the compiler computer field offset for type definition fields\n        static int32_t GetFieldOffsetFromIndex(TypeIndex typeIndex, int32_t fieldIndexInType);\n\n        static int32_t GetReferenceAssemblyIndexIntoAssemblyTable(int32_t referencedAssemblyTableIndex);\n\n        static const TypeDefinitionIndex GetIndexForTypeDefinition(const Il2CppClass* typeDefinition);\n        static const GenericParameterIndex GetIndexForGenericParameter(const Il2CppGenericParameter* genericParameter);\n\n        static CustomAttributesCache* GenerateCustomAttributesCache(CustomAttributeIndex index);\n        static CustomAttributeTypeCache* GenerateCustomAttributeTypeCache(CustomAttributeIndex index);\n\n        typedef void(*WalkTypesCallback)(Il2CppClass* type, void* context);\n        static void WalkPointerTypes(WalkTypesCallback callback, void* context);\n\n    private:\n        static void InitializeUnresolvedSignatureTable();\n        static void InitializeStringLiteralTable();\n        static void InitializeGenericMethodTable();\n        static void InitializeWindowsRuntimeTypeNamesTables();\n    };\n} // namespace vm\n} // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/MetadataLoader.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"MetadataLoader.h\"\n#include \"os/File.h\"\n#include \"os/MemoryMappedFile.h\"\n#include \"os/Mutex.h\"\n#include \"utils/PathUtils.h\"\n#include \"utils/Runtime.h\"\n\nusing namespace il2cpp::os;\nusing namespace il2cpp::vm;\n\nvoid* MetadataLoader::LoadMetadataFile(const char* fileName)\n{\n    std::string resourcesDirectory = utils::PathUtils::Combine(utils::Runtime::GetDataDir(), utils::StringView<char>(\"Metadata\"));\n\n    std::string resourceFilePath = utils::PathUtils::Combine(resourcesDirectory, utils::StringView<char>(fileName, strlen(fileName)));\n\n    int error = 0;\n    FileHandle* handle = File::Open(resourceFilePath, kFileModeOpen, kFileAccessRead, kFileShareRead, kFileOptionsNone, &error);\n    if (error != 0)\n        return NULL;\n\n    void* fileBuffer = MemoryMappedFile::Map(handle);\n\n    File::Close(handle, &error);\n    if (error != 0)\n    {\n        MemoryMappedFile::Unmap(fileBuffer);\n        fileBuffer = NULL;\n        return NULL;\n    }\n\n    return fileBuffer;\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/MetadataLoader.h",
    "content": "#pragma once\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API MetadataLoader\n    {\n    public:\n        static void* LoadMetadataFile(const char* fileName);\n    };\n} // namespace vm\n} // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/MetadataLock.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"os/Mutex.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    extern il2cpp::os::FastMutex g_MetadataLock;\n} // namespace vm\n} // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Method.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"vm/Method.h\"\n#include \"tabledefs.h\"\n#include \"class-internals.h\"\n#include \"vm/Class.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Object.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Type.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    const Il2CppType* Method::GetReturnType(const MethodInfo* method)\n    {\n        return method->return_type;\n    }\n\n    Il2CppClass *Method::GetDeclaringType(const MethodInfo* method)\n    {\n        return method->declaring_type;\n    }\n\n    const char* Method::GetName(const MethodInfo *method)\n    {\n        return method->name;\n    }\n\n    bool Method::IsGeneric(const MethodInfo *method)\n    {\n        return method->is_generic;\n    }\n\n    bool Method::IsInflated(const MethodInfo *method)\n    {\n        return method->is_inflated;\n    }\n\n    bool Method::IsGenericInstance(const MethodInfo *method)\n    {\n        return method->is_inflated && !method->is_generic;\n    }\n\n    bool Method::IsInstance(const MethodInfo *method)\n    {\n        return !(method->flags & METHOD_ATTRIBUTE_STATIC);\n    }\n\n    uint32_t Method::GetParamCount(const MethodInfo *method)\n    {\n        return method->parameters_count;\n    }\n\n    const Il2CppType* Method::GetParam(const MethodInfo *method, uint32_t index)\n    {\n        if (index < method->parameters_count)\n            return method->parameters[index].parameter_type;\n        else\n            return NULL;\n    }\n\n    const char* Method::GetParamName(const MethodInfo *method, uint32_t index)\n    {\n        IL2CPP_ASSERT(method != NULL && \"Method::GetParamName cannot be invoked with a NULL MethodInfo.\");\n\n        if (index >= method->parameters_count)\n            return NULL;\n\n        return method->parameters[index].name;\n    }\n\n    Il2CppClass* Method::GetClass(const MethodInfo *method)\n    {\n        return method->declaring_type;\n    }\n\n    bool Method::HasAttribute(const MethodInfo *method, Il2CppClass *attr_class)\n    {\n        return Reflection::HasAttribute(method, attr_class);\n    }\n\n    const Il2CppDebugMethodInfo *Method::GetDebugInfo(const MethodInfo *method)\n    {\n#if IL2CPP_DEBUGGER_ENABLED\n        return method->debug_info;\n#else\n        return NULL;\n#endif\n    }\n\n    uint32_t Method::GetImplementationFlags(const MethodInfo *method)\n    {\n        return method->iflags;\n    }\n\n    uint32_t Method::GetFlags(const MethodInfo *method)\n    {\n        return method->flags;\n    }\n\n    uint32_t Method::GetToken(const MethodInfo *method)\n    {\n        return method->token;\n    }\n\n// From ECMA-335, I.10.2 Overloading\n// Methods and properties can be overloaded by:\n//  * Number of parameters\n//  * Type of any parameter\n//  * Calling convention <------ not stored in our metadata yet\n//  * Custom modifiers   <------ not supported by il2cpp\n//  * Whether a parameter is passed by value or by reference\n    static bool AreParametersSame(const ParameterInfo* params1, const ParameterInfo* params2, int count)\n    {\n        for (int i = 0; i < count; i++)\n        {\n            const Il2CppType* param1 = params1[i].parameter_type;\n            const Il2CppType* param2 = params2[i].parameter_type;\n\n            if (param1->byref != param2->byref)\n            {\n                return false;\n            }\n\n            if (Class::FromIl2CppType(param1) != Class::FromIl2CppType(param2))\n            {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    static int CompareParameters(const ParameterInfo* params1, const ParameterInfo* params2, int count)\n    {\n        for (int i = 0; i < count; i++)\n        {\n            const Il2CppType* param1 = params1[i].parameter_type;\n            const Il2CppType* param2 = params2[i].parameter_type;\n\n            if (param1->byref == param2->byref)\n            {\n                return Class::FromIl2CppType(param1) < Class::FromIl2CppType(param2);\n            }\n\n            return param1->byref < param2->byref;\n        }\n\n        return true;\n    }\n\n    bool Method::IsSameOverloadSignature(const MethodInfo* method1, const MethodInfo* method2)\n    {\n        if (method1->parameters_count != method2->parameters_count)\n        {\n            return false;\n        }\n\n        return AreParametersSame(method1->parameters, method2->parameters, method1->parameters_count);\n    }\n\n    bool Method::IsSameOverloadSignature(const PropertyInfo* property1, const PropertyInfo* property2)\n    {\n        uint8_t parameterCount1, parameterCount2;\n        const ParameterInfo* parameters1;\n        const ParameterInfo* parameters2;\n\n        if (property1->get != NULL)\n        {\n            parameterCount1 = property1->get->parameters_count;\n            parameters1 = property1->get->parameters;\n        }\n        else\n        {\n            // In set method, value is the last parameter, so we just don't care about it\n            parameterCount1 = property1->set->parameters_count - 1;\n            parameters1 = property1->set->parameters;\n        }\n\n        if (property2->get != NULL)\n        {\n            parameterCount2 = property2->get->parameters_count;\n            parameters2 = property2->get->parameters;\n        }\n        else\n        {\n            parameterCount2 = property2->set->parameters_count - 1;\n            parameters2 = property2->set->parameters;\n        }\n\n        if (parameterCount1 != parameterCount2)\n        {\n            return false;\n        }\n\n        return AreParametersSame(parameters1, parameters2, parameterCount1);\n    }\n\n    int Method::CompareOverloadSignature(const PropertyInfo* property1, const PropertyInfo* property2)\n    {\n        uint8_t parameterCount1, parameterCount2;\n        const ParameterInfo* parameters1;\n        const ParameterInfo* parameters2;\n\n        if (property1->get != NULL)\n        {\n            parameterCount1 = property1->get->parameters_count;\n            parameters1 = property1->get->parameters;\n        }\n        else\n        {\n            // In set method, value is the last parameter, so we just don't care about it\n            parameterCount1 = property1->set->parameters_count - 1;\n            parameters1 = property1->set->parameters;\n        }\n\n        if (property2->get != NULL)\n        {\n            parameterCount2 = property2->get->parameters_count;\n            parameters2 = property2->get->parameters;\n        }\n        else\n        {\n            parameterCount2 = property2->set->parameters_count - 1;\n            parameters2 = property2->set->parameters;\n        }\n\n        if (parameterCount1 == parameterCount2)\n        {\n            return CompareParameters(parameters1, parameters2, parameterCount1);\n        }\n\n        return parameterCount1 < parameterCount2;\n    }\n\n    const char* Method::GetParameterDefaultValue(const MethodInfo* method, const ParameterInfo *parameter, const Il2CppType** type, bool* isExplicitySetNullDefaultValue)\n    {\n        *isExplicitySetNullDefaultValue = false;\n        const Il2CppParameterDefaultValue *entry = MetadataCache::GetParameterDefaultValueForParameter(method, parameter);\n        if (entry == NULL)\n            return NULL;\n\n        *type = MetadataCache::GetIl2CppTypeFromIndex(entry->typeIndex);\n        if (entry->dataIndex == kDefaultValueIndexNull)\n        {\n            *isExplicitySetNullDefaultValue = true;\n            return NULL;\n        }\n\n        return (const char*)MetadataCache::GetParameterDefaultValueDataFromIndex(entry->dataIndex);\n    }\n\n    std::string Method::GetFullName(const MethodInfo* method)\n    {\n        std::string str;\n        str += Type::GetName(method->declaring_type->byval_arg, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME);\n        str += \"::\";\n        str += Method::GetName(method);\n\n        return str;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Method.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <string>\n#include \"il2cpp-config.h\"\n\nstruct MethodInfo;\nstruct PropertyInfo;\nstruct ParameterInfo;\n\nstruct Il2CppString;\nstruct Il2CppType;\nstruct Il2CppClass;\nstruct Il2CppDebugMethodInfo;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Method\n    {\n    public:\n        static const Il2CppType* GetReturnType(const MethodInfo* method);\n        static const char* GetName(const MethodInfo *method);\n        static std::string GetFullName(const MethodInfo* method);\n        static bool IsGeneric(const MethodInfo *method);\n        static bool IsInflated(const MethodInfo *method);\n        static bool IsInstance(const MethodInfo *method);\n        static bool IsGenericInstance(const MethodInfo *method);\n        static uint32_t GetParamCount(const MethodInfo *method);\n        static const Il2CppType* GetParam(const MethodInfo *method, uint32_t index);\n        static Il2CppClass* GetClass(const MethodInfo *method);\n        static bool HasAttribute(const MethodInfo *method, Il2CppClass *attr_class);\n        static Il2CppClass *GetDeclaringType(const MethodInfo* method);\n        static const Il2CppDebugMethodInfo *GetDebugInfo(const MethodInfo *method);\n        static uint32_t GetImplementationFlags(const MethodInfo *method);\n        static uint32_t GetFlags(const MethodInfo *method);\n        static uint32_t GetToken(const MethodInfo *method);\n        static const char* GetParamName(const MethodInfo *method, uint32_t index);\n        static bool IsSameOverloadSignature(const MethodInfo* method1, const MethodInfo* method2);\n        static bool IsSameOverloadSignature(const PropertyInfo* property1, const PropertyInfo* property2);\n        static int CompareOverloadSignature(const PropertyInfo* property1, const PropertyInfo* property2);\n        static const char* GetParameterDefaultValue(const MethodInfo *method, const ParameterInfo* parameter, const Il2CppType** type, bool* isExplicitySetNullDefaultValue);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Module.cpp",
    "content": "#include \"vm/Module.h\"\n#include \"class-internals.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    uint32_t Module::GetToken(const Il2CppImage *image)\n    {\n        return image->token;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Module.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppImage;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Module\n    {\n    public:\n        // exported\n        static uint32_t GetToken(const Il2CppImage *image);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Monitor.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"vm/Monitor.h\"\n\n#if IL2CPP_SUPPORT_THREADS\n\n#include \"os/Atomic.h\"\n#include \"os/Event.h\"\n#include \"os/Semaphore.h\"\n#include \"os/Thread.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Thread.h\"\n\n#include \"utils/ThreadSafeFreeList.h\"\n\n#include <limits>\n\n\nusing namespace il2cpp;\n\n\n// Mostly follows the algorithm outlined in \"Implementing Fast Java Monitors with Relaxed-Locks\".\n\n/// State of a lock associated with an object.\n///\n/// Allocated from the normal non-GC heap and kept on a free list. This means that an object that is\n/// not unlocked before it is reclaimed will leak its monitor. However, it allows us to not have to\n/// synchronize with the GC and to efficiently reuse a small number of monitor instances between an\n/// arbitrary number of managed objects.\n///\n// NOTE: We do *NOT* allow deletion of monitors as threads may be hanging on to monitors even as they\n//  are already back on the free list (and maybe even in use somewhere else already).\nstruct MonitorData : public utils::ThreadSafeFreeListNode\n{\n    static const os::Thread::ThreadId kCanBeAcquiredByOtherThread = os::Thread::kInvalidThreadId;\n    static const os::Thread::ThreadId kHasBeenReturnedToFreeList = (os::Thread::ThreadId)-1;\n\n    /// ID of thread that currently has the object locked or one of the two values above.\n    ///\n    /// This signals three possible states:\n    ///\n    /// 1) Contains a valid thread ID. Means the monitor is owned by that thread and only that thread can\n    ///    change the value of this field.\n    /// 2) Contains kCanBeAcquiredByOtherThread. Means monitor is still live and attached to an object\n    ///    but is up for grabs by whichever thread manages to swap the value of this field for its own\n    ///    thread ID first.\n    /// 3) Contains kHasBeenReturnedToFreeList. Means monitor is not attached to any object and can be\n    ///    acquired by any thread *but* only through the free list.\n    ALIGN_TYPE(8) volatile uint64_t owningThreadId;\n\n    /// Number of times the object has been locked on the owning thread. Everything above 1 indicates\n    /// a recursive lock.\n    /// NOTE: This field is never reset to zero.\n    uint32_t recursiveLockingCount;\n\n    /// Semaphore used to signal other blocked threads that the monitor has become available.\n    /// The \"ready queue\" is implicit in the list of threads waiting on this semaphore.\n    os::Semaphore semaphore;\n\n    /// Number of threads that are already waiting or are about to wait for a lock on the monitor.\n    volatile uint32_t numThreadsWaitingForSemaphore;\n\n    /// Event that a waiting thread fires to acknowledge that it has been kicked off a monitor by the thread\n    /// already holding a lock on the object being waited for. This happens when the locking thread decides\n    /// to deflate the locked object and thus kill the monitor but then some other thread comes along and\n    /// decides to wait on the monitor-to-be-killed.\n    os::Event flushAcknowledged;\n\n    /// Node in list of waiting threads.\n    ///\n    /// Memory management is done the same way as for MonitorData itself. The same constraints apply.\n    /// Wait nodes are returned to the free list by the threads that have created them except for abandoned\n    /// nodes which may be returned by the pulsing thread.\n    ///\n    /// NOTE: Every wait node must be cleaned up by the wait thread that allocated it.\n    struct PulseWaitingListNode : public utils::ThreadSafeFreeListNode\n    {\n        enum State\n        {\n            /// Node is waiting to be reused.\n            kUnused,\n            /// Node is waiting to be signaled.\n            kWaiting\n        };\n\n        /// Next node in \"threadsWaitingForPulse\" list.\n        /// NOTE: Once on the list, this field may only be modified by the thread holding a lock\n        ///       on the respective monitor.\n        PulseWaitingListNode* nextNode;\n\n        /// Event to notify waiting thread of pulse.\n        il2cpp::os::Event signalWaitingThread;\n\n        /// Current usage state. This is not set atomically. Change this state only if you\n        /// are at a known sequence point.\n        int32_t state;\n\n        static il2cpp::utils::ThreadSafeFreeList<PulseWaitingListNode> s_FreeList;\n\n        PulseWaitingListNode()\n            : nextNode(NULL)\n            , state(kUnused) {}\n\n        void Release()\n        {\n            state = kUnused;\n            signalWaitingThread.Reset();\n            s_FreeList.Release(this);\n        }\n\n        static PulseWaitingListNode* Allocate()\n        {\n            PulseWaitingListNode* node = s_FreeList.Allocate();\n            IL2CPP_ASSERT(node->state == kUnused);\n            return node;\n        }\n    };\n\n    /// List of threads waiting for a pulse on the monitor.\n    /// NOTE: This field may be modified concurrently by several threads (no lock).\n    PulseWaitingListNode* threadsWaitingForPulse;\n\n    static il2cpp::utils::ThreadSafeFreeList<MonitorData> s_FreeList;\n\n    MonitorData()\n        : owningThreadId(kHasBeenReturnedToFreeList)\n        , recursiveLockingCount(1)\n        , numThreadsWaitingForSemaphore(0)\n        , threadsWaitingForPulse(NULL)\n        , semaphore(0, std::numeric_limits<int32_t>::max())\n    {\n    }\n\n    bool IsAcquired() const\n    {\n        return (owningThreadId != kCanBeAcquiredByOtherThread && owningThreadId != kHasBeenReturnedToFreeList);\n    }\n\n    bool TryAcquire(uint64_t threadId)\n    {\n        return (os::Atomic::CompareExchange64(&owningThreadId, threadId, kCanBeAcquiredByOtherThread) == kCanBeAcquiredByOtherThread);\n    }\n\n    void Unacquire()\n    {\n        IL2CPP_ASSERT(owningThreadId == os::Thread::CurrentThreadId());\n        os::Atomic::Exchange64(&owningThreadId, kCanBeAcquiredByOtherThread);\n    }\n\n    /// Mark current thread as being blocked in Monitor.Enter(), i.e. as \"ready to acquire monitor\n    /// whenever it becomes available.\"\n    void AddCurrentThreadToReadyList()\n    {\n        os::Atomic::Increment(&numThreadsWaitingForSemaphore);\n        vm::Thread::SetState(vm::Thread::Current(), vm::kThreadStateWaitSleepJoin);\n    }\n\n    /// Mark current thread is no longer being blocked on the monitor.\n    int RemoveCurrentThreadFromReadyList()\n    {\n        int numRemainingWaitingThreads = os::Atomic::Decrement(&numThreadsWaitingForSemaphore);\n        vm::Thread::ClrState(vm::Thread::Current(), vm::kThreadStateWaitSleepJoin);\n        return numRemainingWaitingThreads;\n    }\n\n    /// Acknowledge that the owning thread has decided to kill the monitor (a.k.a. deflate the corresponding\n    /// object) while we were waiting on it.\n    void VacateDyingMonitor()\n    {\n        RemoveCurrentThreadFromReadyList();\n        flushAcknowledged.Set();\n    }\n\n    void PushOntoPulseWaitingList(PulseWaitingListNode* node)\n    {\n        // Change state to waiting. Safe to not do this atomically as at this point,\n        // the waiting thread is the only one with access to the node.\n        node->state = PulseWaitingListNode::kWaiting;\n\n        // Race other wait threads until we've successfully linked the\n        // node into the list.\n        while (true)\n        {\n            PulseWaitingListNode* nextNode = threadsWaitingForPulse;\n            node->nextNode = nextNode;\n            if (os::Atomic::CompareExchangePointer(&threadsWaitingForPulse, node, nextNode) == nextNode)\n                break;\n        }\n    }\n\n    /// Get the next wait node and remove it from the list.\n    /// NOTE: Calling thread *must* have the monitor locked.\n    PulseWaitingListNode* PopNextFromPulseWaitingList()\n    {\n        IL2CPP_ASSERT(owningThreadId == os::Thread::CurrentThreadId());\n\n        PulseWaitingListNode* head = threadsWaitingForPulse;\n        if (!head)\n            return NULL;\n\n        // Grab the node for ourselves. We take the node even if some other thread\n        // changes \"threadsWaitingForPulse\" in the meantime. If that happens, we don't\n        // unlink the node and the node will stay on the list until the waiting thread\n        // cleans up the list.\n        PulseWaitingListNode* next = head->nextNode;\n        if (os::Atomic::CompareExchangePointer(&threadsWaitingForPulse, next, head) == head)\n            head->nextNode = NULL;\n\n        return head;\n    }\n\n    /// Remove the given waiting node from \"threadsWaitingForPulse\".\n    /// NOTE: Calling thread *must* have the monitor locked.\n    bool RemoveFromPulseWaitingList(PulseWaitingListNode* node)\n    {\n        IL2CPP_ASSERT(owningThreadId == os::Thread::CurrentThreadId());\n\n        // This function works only because threads calling Wait() on the monitor will only\n        // ever *prepend* nodes to the list. This means that only the \"threadsWaitingForPulse\"\n        // variable is actually shared between threads whereas the list contents are owned\n        // by the thread that has the monitor locked.\n\n    tryAgain:\n        PulseWaitingListNode * previous = NULL;\n        for (PulseWaitingListNode* current = threadsWaitingForPulse; current != NULL;)\n        {\n            // Go through list looking for node.\n            if (current != node)\n            {\n                previous = current;\n                current = current->nextNode;\n                continue;\n            }\n\n            // Node found. Remove.\n            if (previous)\n                previous->nextNode = node->nextNode;\n            else\n            {\n                // We may have to change \"threadsWaitingForPulse\" and thus have to synchronize\n                // with other threads.\n                if (os::Atomic::CompareExchangePointer(&threadsWaitingForPulse, node->nextNode, node) != node)\n                {\n                    // One or more other threads have changed the list.\n                    goto tryAgain;\n                }\n            }\n            node->nextNode = NULL;\n\n            return true;\n        }\n\n        // Not found in list.\n        return false;\n    }\n};\n\nutils::ThreadSafeFreeList<MonitorData> MonitorData::s_FreeList;\nutils::ThreadSafeFreeList<MonitorData::PulseWaitingListNode> MonitorData::PulseWaitingListNode::s_FreeList;\n\nstatic MonitorData* GetMonitorAndThrowIfNotLockedByCurrentThread(Il2CppObject* obj)\n{\n    // Fetch monitor data.\n    MonitorData* monitor = os::Atomic::ReadPointer(&obj->monitor);\n    if (!monitor)\n    {\n        // No one locked this object.\n        vm::Exception::Raise(vm::Exception::GetSynchronizationLockException(\"Object is not locked.\"));\n    }\n\n    // Throw SynchronizationLockException if we're not holding a lock.\n    // NOTE: Unlike .NET, Mono simply ignores this and does not throw.\n    uint64_t currentThreadId = os::Thread::CurrentThreadId();\n    if (monitor->owningThreadId != currentThreadId)\n    {\n        vm::Exception::Raise(vm::Exception::GetSynchronizationLockException\n                (\"Object has not been locked by this thread.\"));\n    }\n\n    return monitor;\n}\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    void Monitor::Enter(Il2CppObject* object)\n    {\n        TryEnter(object, std::numeric_limits<uint32_t>::max());\n    }\n\n    bool Monitor::TryEnter(Il2CppObject* obj, uint32_t timeOutMilliseconds)\n    {\n        uint64_t currentThreadId = os::Thread::CurrentThreadId();\n\n        while (true)\n        {\n            MonitorData* installedMonitor = os::Atomic::ReadPointer(&obj->monitor);\n            if (!installedMonitor)\n            {\n                // Set up a new monitor.\n                MonitorData* newlyAllocatedMonitorForThisThread = MonitorData::s_FreeList.Allocate();\n                IL2CPP_ASSERT(os::Atomic::Read64((int64_t*)&newlyAllocatedMonitorForThisThread->owningThreadId) == MonitorData::kHasBeenReturnedToFreeList\n                    && \"Monitor on freelist cannot be owned by thread!\");\n                os::Atomic::Exchange64(&newlyAllocatedMonitorForThisThread->owningThreadId, currentThreadId);\n\n                // Try to install the monitor on the object (aka \"inflate\" the object).\n                if (os::Atomic::CompareExchangePointer(&obj->monitor, newlyAllocatedMonitorForThisThread, (MonitorData*)NULL) == NULL)\n                {\n                    // Done. There was no contention on this object. This is\n                    // the fast path.\n                    IL2CPP_ASSERT(obj->monitor);\n                    IL2CPP_ASSERT(obj->monitor->recursiveLockingCount == 1);\n                    IL2CPP_ASSERT(obj->monitor->owningThreadId == currentThreadId);\n                    return true;\n                }\n                else\n                {\n                    // Some other thread raced us and won. Retry.\n                    os::Atomic::Exchange64(&newlyAllocatedMonitorForThisThread->owningThreadId, MonitorData::kHasBeenReturnedToFreeList);\n                    MonitorData::s_FreeList.Release(newlyAllocatedMonitorForThisThread);\n                    continue;\n                }\n            }\n\n            // Object was locked previously. See if we already have the lock.\n            if (os::Atomic::Read64(&installedMonitor->owningThreadId) == currentThreadId)\n            {\n                // Yes, recursive lock. Just increase count.\n                ++installedMonitor->recursiveLockingCount;\n                return true;\n            }\n\n            // Attempt to acquire lock if it's free\n            if (installedMonitor->TryAcquire(currentThreadId))\n            {\n                // There is no locking around the sections of this logic to speed\n                // things up, there is potential for race condition to reset the objects\n                // monitor.  If it has been reset prior to successfully coming out of\n                // TryAquire, dont return, unaquire the installedMonitor, go back through the logic again to grab a\n                // a valid monitor.\n\n                if (!obj->monitor)\n                {\n                    installedMonitor->Unacquire();\n                    continue;\n                }\n\n                // Ownership of monitor passed from previously locking thread to us.\n                IL2CPP_ASSERT(installedMonitor->recursiveLockingCount == 1);\n                IL2CPP_ASSERT(obj->monitor == installedMonitor);\n\n                return true;\n            }\n\n            // Getting an immediate lock failed, so if we have a zero timeout now,\n            // entering the monitor failed.\n            if (timeOutMilliseconds == 0)\n                return false;\n\n            // Object was locked by other thread. Let the monitor know we are waiting for a lock.\n            installedMonitor->AddCurrentThreadToReadyList();\n            if (os::Atomic::ReadPointer(&obj->monitor) != installedMonitor)\n            {\n                // Another thread deflated the object while we tried to lock it. Get off\n                // the monitor.\n                // NOTE: By now we may already be dealing with a monitor that is back on the free list\n                //  or even installed on an object again.\n                installedMonitor->VacateDyingMonitor();\n\n                // NOTE: The \"Implementing Fast Java Monitors with Relaxed-Locks\" paper describes a path\n                //  that may lead to monitors being leaked if the thread currently holding a lock sees our\n                //  temporary increment of numWaitingThreads and ends up not deflating the object. However,\n                //  we can only ever end up inside this branch here if the locking thread has already decided to\n                //  deflate, so I don't see how we can leak here.\n\n                // Retry.\n                continue;\n            }\n\n            // NOTE: At this point, we are in the waiting line for the monitor. However, the thread currently\n            //  locking the monitor may still have already made the decision to deflate the object so we may\n            //  still get kicked off the monitor.\n\n            // Wait for the locking thread to signal us.\n            while (os::Atomic::ReadPointer(&obj->monitor) == installedMonitor)\n            {\n                // Try to grab the object for ourselves.\n                if (installedMonitor->TryAcquire(currentThreadId))\n                {\n                    // Ownership of monitor passed from previously locking thread to us.\n                    IL2CPP_ASSERT(installedMonitor->recursiveLockingCount == 1);\n                    IL2CPP_ASSERT(obj->monitor == installedMonitor);\n                    installedMonitor->RemoveCurrentThreadFromReadyList();\n                    return true;\n                }\n\n                // Wait for owner to signal us.\n                os::WaitStatus waitStatus;\n                try\n                {\n                    if (timeOutMilliseconds != std::numeric_limits<uint32_t>::max())\n                    {\n                        // Perform a timed wait.\n                        waitStatus = installedMonitor->semaphore.Wait(timeOutMilliseconds, true);\n                    }\n                    else\n                    {\n                        // Perform an infinite wait. We may still be interrupted, however.\n                        waitStatus = installedMonitor->semaphore.Wait(true);\n                    }\n                }\n                catch (...)\n                {\n                    // This is paranoid but in theory a user APC could throw an exception from within Wait().\n                    // Just make sure we clean up properly.\n                    installedMonitor->RemoveCurrentThreadFromReadyList();\n                    throw;\n                }\n\n                ////TODO: adjust wait time if we have a Wait() failure and before going another round\n\n                if (waitStatus == os::kWaitStatusTimeout)\n                {\n                    // Wait failed. Get us off the list.\n                    int newNumWaitingThreads = installedMonitor->RemoveCurrentThreadFromReadyList();\n\n                    // If there are no more waiting threads on this monitor, we need to check for leaking.\n                    // This may happen if the locking thread has just been executing a Monitor.Exit(), seen\n                    // the positive numWaitingThread count, and decided that it thus cannot deflate the object\n                    // and will trigger the semaphore. However, we've just decided to give up waiting, so if\n                    // we were the only thread waiting and no one ever attempts to lock the object again, the\n                    // monitor will stick around with no one ever deflating the object.\n                    //\n                    // We solve this by simply trying to acquire ownership of the monitor if we were the last\n                    // waiting thread and if that succeeds, we simply change from returning with a time out\n                    // failure to returning with a successful lock.\n                    if (!newNumWaitingThreads && os::Atomic::ReadPointer(&obj->monitor) == installedMonitor)\n                    {\n                        if (installedMonitor->TryAcquire(currentThreadId))\n                        {\n                            // We've successfully acquired a lock on the object.\n                            IL2CPP_ASSERT(installedMonitor->recursiveLockingCount == 1);\n                            IL2CPP_ASSERT(obj->monitor == installedMonitor);\n                            return true;\n                        }\n                    }\n\n                    // Catch the case where a timeout expired the very moment the owning thread decided to\n                    // get us to vacate the monitor by sending an acknowledgement just to make sure.\n                    if (os::Atomic::ReadPointer(&obj->monitor) != installedMonitor)\n                        installedMonitor->flushAcknowledged.Set();\n\n                    return false;\n                }\n            }\n\n            // Owner has deflated the object and the monitor is no longer associated with the\n            // object we're trying to lock. Signal to the owner that we acknowledge this and\n            // move off the monitor.\n            installedMonitor->VacateDyingMonitor();\n        }\n\n        return false;\n    }\n\n    void Monitor::Exit(Il2CppObject* obj)\n    {\n        // Fetch monitor data.\n        MonitorData* monitor = GetMonitorAndThrowIfNotLockedByCurrentThread(obj);\n\n        // We have the object lock. Undo one single invocation of Enter().\n        int newLockingCount = monitor->recursiveLockingCount - 1;\n        if (newLockingCount > 0)\n        {\n            // Was recursively locked. Lock still held by us.\n            monitor->recursiveLockingCount = newLockingCount;\n            return;\n        }\n\n        // See if there are already threads ready to take over the lock.\n        if (os::Atomic::Add(&monitor->numThreadsWaitingForSemaphore, 0) != 0)\n        {\n            // Yes, so relinquish ownership of the object and signal the next thread.\n            monitor->Unacquire();\n            monitor->semaphore.Post();\n        }\n        else if (monitor->threadsWaitingForPulse)\n        {\n            // No, but there's threads waiting for a pulse so we can't deflate the object.\n            // The wait nodes may already have been abandoned but that is for the pulsing\n            // and waiting threads to sort out. Either way, if there ever is going to be a\n            // pulse, *some* thread will get around to looking at this monitor again so all\n            // we do here is relinquish ownership.\n            monitor->Unacquire();\n\n            // there is a race as follows: T1 is our thread and we own monitor lock\n            // T1 - checks numThreadsWaitingForSemaphore and sees 0\n            // T2 - sees T1 has lock. Increments numThreadsWaitingForSemaphore\n            // T2 - tries to acquire monitor, but we hold it\n            // T2 - waits on semaphore\n            // T1 - we unacquire and wait to be pulsed (if Exit is called from Wait)\n            // Result: deadlock as semaphore is never posted\n            // Fix: double check 'numThreadsWaitingForSemaphore' after we've unacquired\n            // Worst case might be an extra post, which will just incur an additional\n            // pass through the loop with an extra attempt to acquire the monitor with a CAS\n            if (os::Atomic::Add(&monitor->numThreadsWaitingForSemaphore, 0) != 0)\n                monitor->semaphore.Post();\n        }\n        else\n        {\n            // Seems like no other thread is interested in the monitor. Deflate the object.\n            os::Atomic::ExchangePointer(&obj->monitor, (MonitorData*)NULL);\n\n            // At this point the monitor is no longer associated with the object and we cannot safely\n            // \"re-attach\" it. We need to make sure that all threads still having a reference to the\n            // monitor let go of it before we put the monitor back on the free list.\n            //\n            // IMPORTANT: We still *own* the monitor at this point. No other thread can acquire it and\n            //  we must not let go of the monitor until we have kicked all other threads off of it.\n\n            monitor->flushAcknowledged.Reset();\n            while (os::Atomic::Add(&monitor->numThreadsWaitingForSemaphore, 0) != 0)\n            {\n                monitor->semaphore.Post(monitor->numThreadsWaitingForSemaphore);\n                // If a thread starts waiting right after we have read numThreadsWaitingForSemaphore,\n                // we won't release the semaphore enough times. So don't wait spend a long time waiting\n                // for acknowledgement here.\n                monitor->flushAcknowledged.Wait(1, false);\n            }\n\n            // IMPORTANT: At this point, all other threads must have either already vacated the monitor or\n            //   be on a path that makes them vacate the monitor next. The latter may happen if a thread\n            //   is stopped right before adding itself to the ready list of our monitor in which case we\n            //   will not see the thread on numThreadsWaitingForSemaphore. If we then put the monitor back\n            //   on the freelist and then afterwards the other thread is resumed, it will still put itself\n            //   on the ready list only to then realize it got the wrong monitor.\n            //   So, even for monitors on the free list, we accept that a thread may temporarily add itself\n            //   to the wrong monitor's ready list as long as all it does it simply remove itself right after\n            //   realizing the mistake.\n\n            // Release monitor back to free list.\n            IL2CPP_ASSERT(monitor->owningThreadId == os::Thread::CurrentThreadId());\n            os::Atomic::Exchange64(&monitor->owningThreadId, MonitorData::kHasBeenReturnedToFreeList);\n            MonitorData::s_FreeList.Release(monitor);\n        }\n    }\n\n    static void PulseMonitor(Il2CppObject* obj, bool all = false)\n    {\n        // Grab monitor.\n        MonitorData* monitor = GetMonitorAndThrowIfNotLockedByCurrentThread(obj);\n\n        bool isFirst = true;\n        while (true)\n        {\n            // Grab next waiting thread, if any.\n            MonitorData::PulseWaitingListNode* waitNode = monitor->PopNextFromPulseWaitingList();\n            if (!waitNode)\n                break;\n\n            // Pulse thread.\n            waitNode->signalWaitingThread.Set();\n\n            // Stop if we're only supposed to pulse the one thread.\n            if (isFirst && !all)\n                break;\n\n            isFirst = false;\n        }\n    }\n\n    void Monitor::Pulse(Il2CppObject* object)\n    {\n        PulseMonitor(object, false);\n    }\n\n    void Monitor::PulseAll(Il2CppObject* object)\n    {\n        PulseMonitor(object, true);\n    }\n\n    void Monitor::Wait(Il2CppObject* object)\n    {\n        TryWait(object, std::numeric_limits<uint32_t>::max());\n    }\n\n    bool Monitor::TryWait(Il2CppObject* object, uint32_t timeoutMilliseconds)\n    {\n        MonitorData* monitor = GetMonitorAndThrowIfNotLockedByCurrentThread(object);\n\n        // Undo any recursive locking but remember the count so we can restore it\n        // after we have re-acquired the lock.\n        uint32_t oldLockingCount = monitor->recursiveLockingCount;\n        monitor->recursiveLockingCount = 1;\n\n        // Add us to the pulse waiting list for the monitor (except if we won't be\n        // waiting for a pulse at all).\n        MonitorData::PulseWaitingListNode* waitNode = NULL;\n        if (timeoutMilliseconds != 0)\n        {\n            waitNode = MonitorData::PulseWaitingListNode::Allocate();\n            monitor->PushOntoPulseWaitingList(waitNode);\n        }\n\n        // Release the monitor.\n        Exit(object);\n        monitor = NULL;\n\n        // Wait for pulse (if we either have a timeout or are supposed to\n        // wait infinitely).\n        os::WaitStatus pulseWaitStatus = os::kWaitStatusSuccess;\n        Il2CppException* exceptionThrownDuringWait = NULL;\n        if (timeoutMilliseconds != 0)\n        {\n            pulseWaitStatus = os::kWaitStatusFailure;\n            try\n            {\n                vm::ThreadStateSetter state(vm::kThreadStateWaitSleepJoin);\n                pulseWaitStatus = waitNode->signalWaitingThread.Wait(timeoutMilliseconds, true);\n            }\n            catch (Il2CppExceptionWrapper& exception)\n            {\n                // Exception occurred during wait. Remember exception but continue with reacquisition\n                // and cleanup. We re-throw later.\n                exceptionThrownDuringWait = exception.ex;\n                pulseWaitStatus = os::kWaitStatusFailure;\n            }\n        }\n\n        ////TODO: deal with exception here\n        // Reacquire the monitor.\n        Enter(object);\n\n        // Monitor *may* have changed.\n        monitor = object->monitor;\n\n        // Restore recursion count.\n        monitor->recursiveLockingCount = oldLockingCount;\n\n        // Get rid of wait list node.\n        if (waitNode)\n        {\n            // Make sure the node is gone from the wait list. If the pulsing thread already did\n            // that, this won't do anything.\n            monitor->RemoveFromPulseWaitingList(waitNode);\n\n            // And hand it back for reuse.\n            waitNode->Release();\n            waitNode = NULL;\n        }\n\n        // If the wait was interrupted by an exception (most likely a ThreadInterruptedException),\n        // then re-throw now.\n        //\n        // NOTE: We delay this to until after we've gone through the reacquisition sequence as we\n        //  have to guarantee that when Monitor.Wait() exits -- whether successfully or not --, it\n        //  still holds a lock. Otherwise a lock() statement around the Wait() will throw an exception,\n        //  for example.\n        if (exceptionThrownDuringWait)\n            vm::Exception::Raise(exceptionThrownDuringWait);\n\n        ////TODO: According to MSDN, the timeout indicates whether we reacquired the lock in time\n        ////    and not just whether the pulse came in time. Thus the current code is imprecise.\n        return (pulseWaitStatus != os::kWaitStatusTimeout);\n    }\n\n    bool Monitor::IsAcquired(Il2CppObject* object)\n    {\n        MonitorData* monitor = object->monitor;\n        if (!monitor)\n            return false;\n\n        return monitor->IsAcquired();\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n\n\n#endif // IL2CPP_SUPPORT_THREADS\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Monitor.h",
    "content": "#pragma once\n#include \"il2cpp-config.h\"\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Monitor\n    {\n    public:\n        static void Enter(Il2CppObject* object);\n        static bool TryEnter(Il2CppObject* object, uint32_t timeout);\n        static void Exit(Il2CppObject* object);\n        static void Pulse(Il2CppObject* object);\n        static void PulseAll(Il2CppObject* object);\n        static void Wait(Il2CppObject* object);\n        static bool TryWait(Il2CppObject* object, uint32_t timeout);\n        static bool IsAcquired(Il2CppObject* object);\n    };\n\n#if !IL2CPP_SUPPORT_THREADS\n\n    inline void Monitor::Enter(Il2CppObject* object)\n    {\n    }\n\n    inline bool Monitor::TryEnter(Il2CppObject* object, uint32_t timeout)\n    {\n        return true;\n    }\n\n    inline void Monitor::Exit(Il2CppObject* object)\n    {\n    }\n\n    inline void Monitor::Pulse(Il2CppObject* object)\n    {\n    }\n\n    inline void Monitor::PulseAll(Il2CppObject* object)\n    {\n    }\n\n    inline void Monitor::Wait(Il2CppObject* object)\n    {\n    }\n\n    inline bool Monitor::TryWait(Il2CppObject* object, uint32_t timeout)\n    {\n        return true;\n    }\n\n    inline bool Monitor::IsAcquired(Il2CppObject* object)\n    {\n        return true;\n    }\n\n#endif\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/NonCachedCCWBase.h",
    "content": "#pragma once\n\n#include \"gc/GCHandle.h\"\n#include \"vm/ComObjectBase.h\"\n#include \"utils/TemplateUtils.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    template<typename TDerived>\n    struct NOVTABLE NonCachedCCWBase : ComObjectBase\n    {\n    private:\n        volatile uint32_t m_RefCount;\n        uint32_t m_GCHandle;\n\n    public:\n        inline NonCachedCCWBase(Il2CppObject* obj) :\n            ComObjectBase(obj),\n            m_RefCount(1) // We start with a ref count of 1\n        {\n            m_GCHandle = gc::GCHandle::New(GetManagedObjectInline(), false);\n            IL2CPP_ASSERT(m_GCHandle != 0);\n            Il2CppStaticAssert(utils::TemplateUtils::IsBaseOf<NonCachedCCWBase<TDerived>, TDerived>::value);\n        }\n\n        inline ~NonCachedCCWBase()\n        {\n            IL2CPP_ASSERT(m_GCHandle != 0);\n            gc::GCHandle::Free(m_GCHandle);\n            m_GCHandle = 0;\n        }\n\n        FORCE_INLINE uint32_t AddRefImpl()\n        {\n            return Atomic::Increment(&m_RefCount);\n        }\n\n        FORCE_INLINE uint32_t ReleaseImpl()\n        {\n            const uint32_t count = Atomic::Decrement(&m_RefCount);\n            if (count == 0)\n                Destroy();\n\n            return count;\n        }\n\n        FORCE_INLINE static TDerived* __CreateInstance(Il2CppObject* obj)\n        {\n            void* memory = utils::Memory::Malloc(sizeof(TDerived));\n            if (memory == NULL)\n                Exception::RaiseOutOfMemoryException();\n            return new(memory)TDerived(obj);\n        }\n\n        virtual void STDCALL Destroy() IL2CPP_FINAL IL2CPP_OVERRIDE\n        {\n            IL2CPP_ASSERT(m_RefCount == 0);\n\n            TDerived* instance = static_cast<TDerived*>(this);\n            instance->~TDerived();\n            utils::Memory::Free(instance);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Object.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <memory>\n#include \"utils/StringUtils.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Object.h\"\n#include \"vm/Profiler.h\"\n#include \"vm/RCW.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/String.h\"\n#include \"vm/Thread.h\"\n#include \"vm/Type.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"gc/gc_wrapper.h\"\n#include \"gc/GarbageCollector.h\"\n#include \"tabledefs.h\"\n\n#if IL2CPP_GC_BOEHM\n#define ALLOC_PTRFREE(obj, vt, size) do { (obj) = (Il2CppObject*)GC_MALLOC_ATOMIC ((size)); (obj)->klass = (vt); (obj)->monitor = NULL;} while (0)\n#define ALLOC_OBJECT(obj, vt, size) do { (obj) = (Il2CppObject*)GC_MALLOC ((size)); (obj)->klass = (vt);} while (0)\n#ifdef GC_GCJ_SUPPORT\n#define ALLOC_TYPED(dest, size, type) do { (dest) = (Il2CppObject*)GC_gcj_malloc ((size),(type)); } while (0)\n#else\n#define GC_NO_DESCRIPTOR (NULL)\n#define ALLOC_TYPED(dest, size, type) do { (dest) = GC_MALLOC ((size)); *(void**)dest = (type);} while (0)\n#endif\n#else\n#ifdef HAVE_SGEN_GC\n#define GC_NO_DESCRIPTOR (NULL)\n#define ALLOC_PTRFREE(obj, vt, size) do { (obj) = mono_gc_alloc_obj (vt, size);} while (0)\n#define ALLOC_OBJECT(obj, vt, size) do { (obj) = mono_gc_alloc_obj (vt, size);} while (0)\n#define ALLOC_TYPED(dest, size, type) do { (dest) = mono_gc_alloc_obj (type, size);} while (0)\n#else\n#define ALLOC_PTRFREE(obj, vt, size) do { (obj) = (Il2CppObject*)malloc ((size)); (obj)->klass = (vt); (obj)->monitor = NULL;} while (0)\n#define ALLOC_OBJECT(obj, vt, size) do { (obj) = (Il2CppObject*)calloc (1, (size)); (obj)->klass = (vt);} while (0)\n#define ALLOC_TYPED(dest, size, type) do { (dest) = (Il2CppObject*)(calloc (1, (size))); *(void**)dest = (type);} while (0)\n#endif\n#endif\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    Il2CppObject * Object::Allocate(size_t size, Il2CppClass *typeInfo)\n    {\n        IL2CPP_ASSERT(typeInfo->initialized);\n        Il2CppObject *o;\n        ALLOC_OBJECT(o, typeInfo, size);\n\n        ++il2cpp_runtime_stats.new_object_count;\n\n        return o;\n    }\n\n    Il2CppObject * Object::AllocatePtrFree(size_t size, Il2CppClass *typeInfo)\n    {\n        IL2CPP_ASSERT(typeInfo->initialized);\n        Il2CppObject *o;\n        ALLOC_PTRFREE(o, typeInfo, size);\n\n        ++il2cpp_runtime_stats.new_object_count;\n\n        return o;\n    }\n\n    Il2CppObject * Object::AllocateSpec(size_t size, Il2CppClass *typeInfo)\n    {\n        IL2CPP_ASSERT(typeInfo->initialized);\n        Il2CppObject *o;\n        ALLOC_TYPED(o, size, typeInfo);\n\n        ++il2cpp_runtime_stats.new_object_count;\n\n        return o;\n    }\n\n    Il2CppObject* Object::Box(Il2CppClass *typeInfo, void* val)\n    {\n        Class::Init(typeInfo);\n        if (!typeInfo->valuetype)\n            return *(Il2CppObject**)val;\n\n        if (Class::IsNullable(typeInfo))\n        {\n            /* From ECMA-335, I.8.2.4 Boxing and unboxing of values:\n\n                All value types have an operation called box. Boxing a value of any value type produces its boxed value;\n                i.e., a value of the corresponding boxed type containing a bitwise copy of the original value. If the\n                value type is a nullable typedefined as an instantiation of the value type System.Nullable<T>  the result\n                is a null reference or bitwise copy of its Value property of type T, depending on its HasValue property\n                (false and true, respectively).\n            */\n\n            typeInfo = Class::GetNullableArgument(typeInfo);\n            Class::Init(typeInfo);\n            bool hasValue = *reinterpret_cast<bool*>(static_cast<uint8_t*>(val) + typeInfo->instance_size - sizeof(Il2CppObject));\n\n            if (!hasValue)\n                return NULL;\n        }\n\n        size_t size = Class::GetInstanceSize(typeInfo);\n        Il2CppObject* obj = Object::New(typeInfo);\n\n        size = size - sizeof(Il2CppObject);\n\n        memcpy(((char*)obj) + sizeof(Il2CppObject), val, size);\n        return obj;\n    }\n\n    Il2CppObject* Object::Clone(Il2CppObject *obj)\n    {\n        Il2CppObject *o;\n        int size;\n        NOT_IMPLEMENTED_NO_ASSERT(Object::Clone, \"Finish implementation\");\n\n        size = obj->klass->instance_size;\n        o = Allocate(size, obj->klass);\n        /* do not copy the sync state */\n        memcpy((char*)o + sizeof(Il2CppObject), (char*)obj + sizeof(Il2CppObject), size - sizeof(Il2CppObject));\n\n//#ifdef HAVE_SGEN_GC\n//  if (obj->vtable->klass->has_references)\n//      mono_gc_wbarrier_object (o);\n//#endif\n\n        if (obj->klass->has_finalize)\n            il2cpp::gc::GarbageCollector::RegisterFinalizerForNewObject(o);\n\n#if IL2CPP_ENABLE_PROFILER\n        if (Profiler::ProfileAllocations())\n            Profiler::Allocation(o, obj->klass);\n#endif\n\n        return o;\n    }\n\n    Il2CppClass* Object::GetClass(Il2CppObject* obj)\n    {\n        return obj->klass;\n    }\n\n#if IL2CPP_SIZEOF_VOID_P == 8\n    const int kObjectAlignmentShift = 3;\n#elif IL2CPP_SIZEOF_VOID_P == 4\n    const int kObjectAlignmentShift = 2;\n#else\n#error Invalid architecture size\n#endif\n\n    int32_t Object::GetHash(Il2CppObject* obj)\n    {\n        // shift away unused bits due to alignment, then use Knuth's multiplicative hash\n        return (((uint32_t)(intptr_t)(obj)) >> kObjectAlignmentShift) * 2654435761u;\n    }\n\n    uint32_t Object::GetSize(Il2CppObject* obj)\n    {\n        Il2CppClass* klass = GetClass(obj);\n        if (klass == il2cpp_defaults.string_class)\n        {\n            return sizeof(Il2CppString) + 2 * utils::StringUtils::GetLength((Il2CppString*)obj) + 2;\n        }\n        else if (obj->klass->rank)\n        {\n            Il2CppArray *array = (Il2CppArray*)obj;\n            size_t size = kIl2CppSizeOfArray + Array::GetElementSize(klass) * Array::GetLength(array);\n            if (array->bounds)\n            {\n                size += 3;\n                size &= ~3;\n                size += sizeof(Il2CppArrayBounds) * obj->klass->rank;\n            }\n            return (uint32_t)size;\n        }\n        else\n        {\n            return Class::GetInstanceSize(klass);\n        }\n    }\n\n    const MethodInfo* Object::GetVirtualMethod(Il2CppObject *obj, const MethodInfo *method)\n    {\n        if ((method->flags & METHOD_ATTRIBUTE_FINAL) || !(method->flags & METHOD_ATTRIBUTE_VIRTUAL))\n            return method;\n\n        Il2CppClass* methodDeclaringType = method->declaring_type;\n        if (!Class::IsInterface(methodDeclaringType))\n            return obj->klass->vtable[method->slot].method;\n\n        return Class::GetInterfaceInvokeDataFromVTable(obj, methodDeclaringType, method->slot).method;\n    }\n\n    Il2CppObject* Object::IsInst(Il2CppObject *obj, Il2CppClass *klass)\n    {\n        if (!obj)\n            return NULL;\n\n        Il2CppClass* objClass = Object::GetClass(obj);\n        if (!objClass->is_import_or_windows_runtime)\n            return Class::IsAssignableFrom(klass, objClass) ? obj : NULL;\n\n        // check if klass has an interface id\n        if (Class::IsInterface(klass) && klass->interopData != NULL)\n        {\n            const Il2CppGuid* iid = klass->interopData->guid;\n            if (iid != NULL)\n            {\n                Il2CppIUnknown* unknown = RCW::QueryInterface<false>(static_cast<Il2CppComObject*>(obj), *iid);\n                if (unknown)\n                {\n                    unknown->Release();\n                    return static_cast<Il2CppComObject*>(obj);\n                }\n            }\n        }\n\n        return (klass == il2cpp_defaults.object_class) ? obj : NULL;\n    }\n\n    Il2CppObject* Object::New(Il2CppClass *klass)\n    {\n        // same as NewAllocSpecific as we only support a single domain\n        return NewAllocSpecific(klass);\n    }\n\n    Il2CppObject* Object::NewPinned(Il2CppClass *klass)\n    {\n#if (IL2CPP_GC_BOEHM || IL2CPP_GC_NULL)\n        return New(klass);\n#else\n        NOT_IMPLEMENTED(Object::NewPinned);\n#endif\n    }\n\n    Il2CppObject * Object::NewAllocSpecific(Il2CppClass *klass)\n    {\n        Il2CppObject *o = NULL;\n\n        NOT_IMPLEMENTED_NO_ASSERT(Object::NewAllocSpecific, \"We really shouldn't need this initialization\");\n        Class::Init(klass);\n\n        if (Class::IsNullable(klass))\n            klass = il2cpp::vm::Class::GetNullableArgument(klass);\n\n        if (!klass->has_references)\n        {\n            o = NewPtrFree(klass);\n        }\n#if IL2CPP_HAS_GC_DESCRIPTORS\n        else if (klass->gc_desc != GC_NO_DESCRIPTOR)\n        {\n            o = AllocateSpec(klass->instance_size, klass);\n        }\n#endif\n        else\n        {\n            o = Allocate(klass->instance_size, klass);\n        }\n        if (klass->has_finalize)\n            il2cpp::gc::GarbageCollector::RegisterFinalizerForNewObject(o);\n\n#if IL2CPP_ENABLE_PROFILER\n        if (Profiler::ProfileAllocations())\n            Profiler::Allocation(o, klass);\n#endif\n\n        Runtime::ClassInit(klass);\n        return o;\n    }\n\n    Il2CppObject* Object::NewPtrFree(Il2CppClass *klass)\n    {\n        Il2CppObject *obj = {0};\n\n        IL2CPP_ASSERT(klass->initialized);\n        IL2CPP_ASSERT(!klass->has_references);\n\n        ALLOC_PTRFREE(obj, klass, klass->instance_size);\n#if NEED_TO_ZERO_PTRFREE\n        /* an inline memset is much faster for the common vcase of small objects\n         * note we assume the allocated size is a multiple of sizeof (void*).\n         */\n        if (klass->instance_size < 128)\n        {\n            void* *p, *end;\n            end = (void**)((char*)obj + klass->instance_size);\n            p = (void**)((char*)obj + sizeof(Il2CppObject));\n            while (p < end)\n            {\n                *p = NULL;\n                ++p;\n            }\n        }\n        else\n        {\n            memset((char*)obj + sizeof(Il2CppObject), 0, klass->instance_size - sizeof(Il2CppObject));\n        }\n#endif\n\n        ++il2cpp_runtime_stats.new_object_count;\n\n        return obj;\n    }\n\n    void* Object::Unbox(Il2CppObject* obj)\n    {\n        void* val = (void*)(((char*)obj) + sizeof(Il2CppObject));\n        return val;\n    }\n\n    void Object::UnboxNullable(Il2CppObject* obj, Il2CppClass* nullableArgumentClass, void* storage)\n    {\n        uint32_t valueSize = nullableArgumentClass->instance_size - sizeof(Il2CppObject);\n\n        if (obj == NULL)\n        {\n            *(static_cast<uint8_t*>(storage) + valueSize) = false;\n        }\n        else\n        {\n            memcpy(storage, Unbox(obj), valueSize);\n            *(static_cast<uint8_t*>(storage) + valueSize) = true;\n        }\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Object.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\nstruct Il2CppObject;\nstruct Il2CppClass;\nstruct MethodInfo;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Object\n    {\n    public:\n        static Il2CppObject* Box(Il2CppClass *klass, void* data);\n        static Il2CppClass* GetClass(Il2CppObject* obj);\n        static int32_t GetHash(Il2CppObject* obj);\n        static uint32_t GetSize(Il2CppObject* obj);\n        static const MethodInfo* GetVirtualMethod(Il2CppObject *obj, const MethodInfo *method);\n        static Il2CppObject * IsInst(Il2CppObject *obj, Il2CppClass *klass);\n        static Il2CppObject* New(Il2CppClass *klass);\n        static void* Unbox(Il2CppObject* obj);\n        static void UnboxNullable(Il2CppObject* obj, Il2CppClass* nullableArgumentClass, void* storage);\n\n        static Il2CppObject * Clone(Il2CppObject *obj);\n        static Il2CppObject* NewPinned(Il2CppClass *klass);\n    private:\n        static Il2CppObject * NewAllocSpecific(Il2CppClass *klass);\n        static Il2CppObject* NewPtrFree(Il2CppClass *klass);\n        static Il2CppObject* Allocate(size_t size, Il2CppClass *typeInfo);\n        static Il2CppObject* AllocatePtrFree(size_t size, Il2CppClass *typeInfo);\n        static Il2CppObject* AllocateSpec(size_t size, Il2CppClass *typeInfo);\n\n        friend class Array;\n        friend class RCW;\n        friend class String;\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n\n#define IL2CPP_OBJECT_SETREF(obj, fieldname, value) do {\\\n        /*mono_gc_wbarrier_set_field ((Il2CppObject*)(obj), &((obj)->fieldname), (Il2CppObject*)value); */\\\n        (obj)->fieldname = (value); \\\n    } while (0)\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Parameter.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"metadata.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"Parameter.h\"\n#include \"vm-utils/BlobReader.h\"\n#include \"vm/Class.h\"\n#include \"vm/Object.h\"\n#include \"vm/Method.h\"\n\n#include <assert.h>\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    Il2CppObject* Parameter::GetDefaultParameterValueObject(const MethodInfo* method, const ParameterInfo* parameter, bool* isExplicitySetNullDefaultValue)\n    {\n        const Il2CppType* typeOfDefaultValue;\n        const char* data = Method::GetParameterDefaultValue(method, parameter, &typeOfDefaultValue, isExplicitySetNullDefaultValue);\n        if (data == NULL)\n            return NULL;\n\n        Il2CppClass* parameterType = Class::FromIl2CppType(parameter->parameter_type);\n        if (parameterType->valuetype)\n        {\n            Class::SetupFields(parameterType);\n            IL2CPP_ASSERT(parameterType->size_inited);\n            void* value = alloca(parameterType->instance_size - sizeof(Il2CppObject));\n            utils::BlobReader::GetConstantValueFromBlob(typeOfDefaultValue->type, data, value);\n            return Object::Box(parameterType, value);\n        }\n\n        Il2CppObject* value = NULL;\n        utils::BlobReader::GetConstantValueFromBlob(typeOfDefaultValue->type, data, &value);\n        return value;\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Parameter.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct ParameterInfo;\nstruct Il2CppObject;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Parameter\n    {\n    public:\n        // internal\n        static Il2CppObject* GetDefaultParameterValueObject(const MethodInfo* method, const ParameterInfo* parameter, bool* isExplicitySetNullDefaultValue);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Path.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"vm/Path.h\"\n#include \"os/Path.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    static std::string s_TempPath;\n\n    void Path::SetTempPath(const char* path)\n    {\n        s_TempPath = path;\n    }\n\n    std::string Path::GetTempPath()\n    {\n        if (!s_TempPath.empty())\n            return s_TempPath;\n        return os::Path::GetTempPath();\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Path.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include <string>\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Path\n    {\n    public:\n        static void SetTempPath(const char* path);\n        static std::string GetTempPath();\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/PlatformInvoke.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"il2cpp-vm-support.h\"\n#include \"PlatformInvoke.h\"\n#include \"Exception.h\"\n#include \"LibraryLoader.h\"\n#include \"MetadataCache.h\"\n#include \"Object.h\"\n#include \"Method.h\"\n#include \"Type.h\"\n#include \"os/LibraryLoader.h\"\n#include \"os/MarshalStringAlloc.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringViewStream.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm-utils/NativeDelegateMethodCache.h\"\n#include \"vm-utils/VmStringUtils.h\"\n\n#include <stdint.h>\n#include <algorithm>\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    void PlatformInvoke::SetFindPluginCallback(Il2CppSetFindPlugInCallback method)\n    {\n        LibraryLoader::SetFindPluginCallback(method);\n    }\n\n    Il2CppMethodPointer PlatformInvoke::Resolve(const PInvokeArguments& pinvokeArgs)\n    {\n        // Before resolving a P/Invoke, check against a hardcoded list of \"known P/Invokes\" that is different for every platform.\n        // This bit solves several different problems we have when P/Invoking into native system libraries from mscorlib.dll.\n        // Some platforms, like UWP, just don't allow you to load to load system libraries at runtime dynamically.\n        // On other platforms (THEY SHALL NOT BE NAMED :O), while the functions that mscorlib.dll wants to P/Invoke into exist,\n        // They exist in different system libraries than it is said in the DllImport attribute.\n        Il2CppMethodPointer function = os::LibraryLoader::GetHardcodedPInvokeDependencyFunctionPointer(pinvokeArgs.moduleName, pinvokeArgs.entryPoint);\n\n        if (function != NULL)\n            return function;\n\n        void* dynamicLibrary = NULL;\n        if (utils::VmStringUtils::CaseSensitiveEquals(il2cpp::utils::StringUtils::NativeStringToUtf8(pinvokeArgs.moduleName.Str()).c_str(), \"__InternalDynamic\"))\n            dynamicLibrary = LibraryLoader::LoadLibrary(il2cpp::utils::StringView<Il2CppNativeChar>::Empty());\n        else\n            dynamicLibrary = LibraryLoader::LoadLibrary(pinvokeArgs.moduleName);\n\n        if (dynamicLibrary == NULL)\n        {\n            std::basic_string<Il2CppNativeChar> message;\n            message += IL2CPP_NATIVE_STRING(\"Unable to load DLL '\");\n            message += pinvokeArgs.moduleName.Str();\n            message += IL2CPP_NATIVE_STRING(\"': The specified module could not be found.\");\n            Exception::Raise(Exception::GetDllNotFoundException(il2cpp::utils::StringUtils::NativeStringToUtf8(message).c_str()));\n        }\n\n        function = os::LibraryLoader::GetFunctionPointer(dynamicLibrary, pinvokeArgs);\n        if (function == NULL)\n        {\n            std::basic_string<Il2CppNativeChar> message;\n            message += IL2CPP_NATIVE_STRING(\"Unable to find an entry point named '\");\n            message += il2cpp::utils::StringUtils::Utf8ToNativeString(pinvokeArgs.entryPoint.Str());\n            message += IL2CPP_NATIVE_STRING(\"' in '\");\n            message += pinvokeArgs.moduleName.Str();\n            message += IL2CPP_NATIVE_STRING(\"'.\");\n            Exception::Raise(Exception::GetEntryPointNotFoundException(il2cpp::utils::StringUtils::NativeStringToUtf8(message).c_str()));\n        }\n\n        return function;\n    }\n\n    void PlatformInvoke::MarshalFree(void* ptr)\n    {\n        if (ptr != NULL)\n            MarshalAlloc::Free(ptr);\n    }\n\n    char* PlatformInvoke::MarshalCSharpStringToCppString(Il2CppString* managedString)\n    {\n        if (managedString == NULL)\n            return NULL;\n\n        std::string utf8String = utils::StringUtils::Utf16ToUtf8(managedString->chars);\n\n        char* nativeString = MarshalAllocateStringBuffer<char>(utf8String.size() + 1);\n        strcpy(nativeString, utf8String.c_str());\n\n        return nativeString;\n    }\n\n    void PlatformInvoke::MarshalCSharpStringToCppStringFixed(Il2CppString* managedString, char* buffer, int numberOfCharacters)\n    {\n        if (managedString == NULL)\n        {\n            *buffer = '\\0';\n        }\n        else\n        {\n            std::string utf8String = utils::StringUtils::Utf16ToUtf8(managedString->chars, numberOfCharacters - 1);\n            strcpy(buffer, utf8String.c_str());\n        }\n    }\n\n    Il2CppChar* PlatformInvoke::MarshalCSharpStringToCppWString(Il2CppString* managedString)\n    {\n        if (managedString == NULL)\n            return NULL;\n\n        int32_t stringLength = utils::StringUtils::GetLength(managedString);\n        Il2CppChar* nativeString = MarshalAllocateStringBuffer<Il2CppChar>(stringLength + 1);\n        for (int32_t i = 0; i < managedString->length; ++i)\n            nativeString[i] = managedString->chars[i];\n\n        nativeString[managedString->length] = '\\0';\n\n        return nativeString;\n    }\n\n    void PlatformInvoke::MarshalCSharpStringToCppWStringFixed(Il2CppString* managedString, Il2CppChar* buffer, int numberOfCharacters)\n    {\n        if (managedString == NULL)\n        {\n            *buffer = '\\0';\n        }\n        else\n        {\n            int32_t stringLength = std::min(utils::StringUtils::GetLength(managedString), numberOfCharacters - 1);\n            for (int32_t i = 0; i < stringLength; ++i)\n                buffer[i] = managedString->chars[i];\n\n            buffer[stringLength] = '\\0';\n        }\n    }\n\n    il2cpp_hresult_t PlatformInvoke::MarshalCSharpStringToCppBStringNoThrow(Il2CppString* managedString, Il2CppChar** bstr)\n    {\n        IL2CPP_ASSERT(bstr);\n\n        if (managedString == NULL)\n        {\n            *bstr = NULL;\n            return IL2CPP_S_OK;\n        }\n\n        int32_t stringLength = utils::StringUtils::GetLength(managedString);\n        Il2CppChar* stringChars = utils::StringUtils::GetChars(managedString);\n        return os::MarshalStringAlloc::AllocateBStringLength(stringChars, stringLength, bstr);\n    }\n\n    Il2CppChar* PlatformInvoke::MarshalCSharpStringToCppBString(Il2CppString* managedString)\n    {\n        Il2CppChar* bstr;\n        const il2cpp_hresult_t hr = MarshalCSharpStringToCppBStringNoThrow(managedString, &bstr);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n        return bstr;\n    }\n\n    Il2CppString* PlatformInvoke::MarshalCppStringToCSharpStringResult(const char* value)\n    {\n        if (value == NULL)\n            return NULL;\n\n        return String::New(value);\n    }\n\n    Il2CppString* PlatformInvoke::MarshalCppWStringToCSharpStringResult(const Il2CppChar* value)\n    {\n        if (value == NULL)\n            return NULL;\n\n        return String::NewUtf16(value, (int32_t)utils::StringUtils::StrLen(value));\n    }\n\n    Il2CppString* PlatformInvoke::MarshalCppBStringToCSharpStringResult(const Il2CppChar* value)\n    {\n        if (value == NULL)\n            return NULL;\n\n        int32_t length;\n        const il2cpp_hresult_t hr = os::MarshalStringAlloc::GetBStringLength(value, &length);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n\n        return String::NewUtf16(value, length);\n    }\n\n    void PlatformInvoke::MarshalFreeBString(Il2CppChar* value)\n    {\n        const il2cpp_hresult_t hr = os::MarshalStringAlloc::FreeBString(value);\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n    }\n\n    char* PlatformInvoke::MarshalStringBuilder(Il2CppStringBuilder* stringBuilder)\n    {\n        if (stringBuilder == NULL)\n            return NULL;\n\n#if !NET_4_0\n        size_t stringLength = utils::StringUtils::GetLength(stringBuilder->str);\n\n        // not sure if this is necessary but it's better to be safe than sorry\n        IL2CPP_ASSERT(static_cast<int32_t>(stringLength) >= stringBuilder->length);\n        if (static_cast<int32_t>(stringLength) < stringBuilder->length)\n            stringLength = stringBuilder->length;\n\n        std::string utf8String = utils::StringUtils::Utf16ToUtf8(stringBuilder->str->chars, stringBuilder->length);\n\n        if (stringLength < utf8String.length())\n            stringLength = utf8String.length();\n\n        char* nativeString = MarshalAllocateStringBuffer<char>(stringLength + 1);\n        strcpy(nativeString, utf8String.c_str());\n\n        return nativeString;\n\n#else\n        size_t stringLength = 0;\n        Il2CppStringBuilder* currentBuilder = stringBuilder;\n\n        std::vector<std::string> utf8Chunks;\n        std::vector<Il2CppStringBuilder*> builders;\n\n        while (true)\n        {\n            if (currentBuilder == NULL)\n                break;\n\n            const Il2CppChar *str = (Il2CppChar*)il2cpp::vm::Array::GetFirstElementAddress(currentBuilder->chunkChars);\n            std::string utf8String = utils::StringUtils::Utf16ToUtf8(str, (int)currentBuilder->chunkChars->max_length);\n\n            utf8Chunks.push_back(utf8String);\n            builders.push_back(currentBuilder);\n\n            size_t lenToCount = std::max((size_t)currentBuilder->chunkChars->max_length, utf8String.size());\n\n            stringLength += lenToCount;\n\n            currentBuilder = currentBuilder->chunkPrevious;\n        }\n\n        char* nativeString = MarshalAllocateStringBuffer<char>(stringLength + 1);\n\n        // We need to zero out the memory because the chunkChar array lengh may have been larger than the chunkLength\n        // and when this happens we'll have a utf8String that is smaller than the the nativeString we allocated.  When we go to copy the\n        // chunk utf8String into the nativeString it won't fill everything and we can end up with w/e junk value was in that memory before\n        memset(nativeString, 0, sizeof(char) * (stringLength + 1));\n\n        if (stringLength > 0)\n        {\n            int offsetAdjustment = 0;\n            for (int i = (int)utf8Chunks.size() - 1; i >= 0; i--)\n            {\n                std::string utf8String = utf8Chunks[i];\n\n                const char* utf8CString = utf8String.c_str();\n\n                memcpy(nativeString + builders[i]->chunkOffset + offsetAdjustment, utf8CString, (int)utf8String.size());\n\n                offsetAdjustment += (int)utf8String.size() - builders[i]->chunkLength;\n            }\n        }\n\n        return nativeString;\n#endif\n    }\n\n    Il2CppChar* PlatformInvoke::MarshalWStringBuilder(Il2CppStringBuilder* stringBuilder)\n    {\n        if (stringBuilder == NULL)\n            return NULL;\n\n#if !NET_4_0\n        int32_t stringLength = utils::StringUtils::GetLength(stringBuilder->str);\n\n        // not sure if this is necessary but it's better to be safe than sorry\n        IL2CPP_ASSERT(stringLength >= stringBuilder->length);\n        if (stringLength < stringBuilder->length)\n            stringLength = stringBuilder->length;\n\n        Il2CppChar* nativeString = MarshalAllocateStringBuffer<Il2CppChar>(stringLength + 1);\n        for (int32_t i = 0; i < stringBuilder->length; ++i)\n            nativeString[i] = stringBuilder->str->chars[i];\n\n        nativeString[stringBuilder->length] = '\\0';\n\n        return nativeString;\n#else\n        size_t stringLength = 0;\n        Il2CppStringBuilder* currentBuilder = stringBuilder;\n        while (true)\n        {\n            if (currentBuilder == NULL)\n                break;\n\n            stringLength += (size_t)currentBuilder->chunkChars->max_length;\n\n            currentBuilder = currentBuilder->chunkPrevious;\n        }\n\n        Il2CppChar* nativeString = MarshalAllocateStringBuffer<Il2CppChar>(stringLength + 1);\n\n        if (stringLength > 0)\n        {\n            currentBuilder = stringBuilder;\n            while (true)\n            {\n                if (currentBuilder == NULL)\n                    break;\n\n                const Il2CppChar *str = (Il2CppChar*)il2cpp::vm::Array::GetFirstElementAddress(currentBuilder->chunkChars);\n\n                memcpy(nativeString + currentBuilder->chunkOffset, str, (int)currentBuilder->chunkChars->max_length * sizeof(Il2CppChar));\n\n                currentBuilder = currentBuilder->chunkPrevious;\n            }\n        }\n\n        nativeString[stringLength] = '\\0';\n\n        return nativeString;\n#endif\n    }\n\n    void PlatformInvoke::MarshalStringBuilderResult(Il2CppStringBuilder* stringBuilder, char* buffer)\n    {\n        if (stringBuilder == NULL || buffer == NULL)\n            return;\n\n#if !NET_4_0\n        Il2CppString* managedString = MarshalCppStringToCSharpStringResult(buffer);\n        stringBuilder->str = managedString;\n        stringBuilder->length = utils::StringUtils::GetLength(managedString);\n#else\n        UTF16String utf16String = utils::StringUtils::Utf8ToUtf16(buffer);\n\n        IL2CPP_OBJECT_SETREF(stringBuilder, chunkChars, il2cpp::vm::Array::New(il2cpp_defaults.char_class, (int)utf16String.size() + 1));\n\n        for (int i = 0; i < (int)utf16String.size(); i++)\n            il2cpp_array_set(stringBuilder->chunkChars, Il2CppChar, i, utf16String[i]);\n\n        il2cpp_array_set(stringBuilder->chunkChars, Il2CppChar, (int)utf16String.size(), '\\0');\n\n        stringBuilder->chunkLength = (int)utf16String.size();\n        stringBuilder->chunkOffset = 0;\n        IL2CPP_OBJECT_SETREF(stringBuilder, chunkPrevious, NULL);\n#endif\n    }\n\n    void PlatformInvoke::MarshalWStringBuilderResult(Il2CppStringBuilder* stringBuilder, Il2CppChar* buffer)\n    {\n        if (stringBuilder == NULL || buffer == NULL)\n            return;\n\n#if !NET_4_0\n        Il2CppString* managedString = MarshalCppWStringToCSharpStringResult(buffer);\n        stringBuilder->str = managedString;\n        stringBuilder->length = utils::StringUtils::GetLength(managedString);\n#else\n        int len = (int)utils::StringUtils::StrLen(buffer);\n\n        IL2CPP_OBJECT_SETREF(stringBuilder, chunkChars, il2cpp::vm::Array::New(il2cpp_defaults.char_class, len + 1));\n\n        for (int i = 0; i < len; i++)\n            il2cpp_array_set(stringBuilder->chunkChars, Il2CppChar, i, buffer[i]);\n\n        il2cpp_array_set(stringBuilder->chunkChars, Il2CppChar, len, '\\0');\n\n        stringBuilder->chunkLength = len;\n        stringBuilder->chunkOffset = 0;\n        IL2CPP_OBJECT_SETREF(stringBuilder, chunkPrevious, NULL);\n#endif\n    }\n\n    Il2CppIntPtr PlatformInvoke::MarshalDelegate(Il2CppDelegate* d)\n    {\n        if (d == NULL)\n            return Il2CppIntPtr::Zero;\n\n        if (d->method->is_inflated)\n            vm::Exception::Raise(vm::Exception::GetNotSupportedException(\"IL2CPP does not support marshaling delegates that point to generic methods.\"));\n\n        IL2CPP_ASSERT(d->method->methodDefinition);\n\n        Il2CppMethodPointer reversePInvokeWrapper = MetadataCache::GetReversePInvokeWrapperFromIndex(d->method->methodDefinition->reversePInvokeWrapperIndex);\n        if (reversePInvokeWrapper == NULL)\n        {\n            // Okay, we cannot marshal it for some reason. Figure out why.\n            if (Method::IsInstance(d->method))\n                vm::Exception::Raise(vm::Exception::GetNotSupportedException(\"IL2CPP does not support marshaling delegates that point to instance methods to native code.\"));\n\n            vm::Exception::Raise(vm::Exception::GetNotSupportedException(\"To marshal a managed method, please add an attribute named 'MonoPInvokeCallback' to the method definition.\"));\n        }\n\n        Il2CppIntPtr functionPointer;\n        functionPointer.m_value = (void*)reversePInvokeWrapper;\n        return functionPointer;\n    }\n\n    Il2CppDelegate* PlatformInvoke::MarshalFunctionPointerToDelegate(void* functionPtr, Il2CppClass* delegateType)\n    {\n        if (!Class::HasParent(delegateType, il2cpp_defaults.delegate_class))\n            Exception::Raise(Exception::GetArgumentException(\"t\", \"Type must derive from Delegate.\"));\n\n        if (Class::IsGeneric(delegateType) || Class::IsInflated(delegateType))\n            Exception::Raise(Exception::GetArgumentException(\"t\", \"The specified Type must not be a generic type definition.\"));\n\n        const Il2CppInteropData* interopData = delegateType->interopData;\n        Il2CppMethodPointer managedToNativeWrapperMethodPointer = interopData != NULL ? interopData->delegatePInvokeWrapperFunction : NULL;\n\n        if (managedToNativeWrapperMethodPointer == NULL)\n            Exception::Raise(Exception::GetMarshalDirectiveException(utils::StringUtils::Printf(\"Cannot marshal P/Invoke call through delegate of type '%s.%s'\", Class::GetNamespace(delegateType), Class::GetName(delegateType)).c_str()));\n\n        Il2CppObject* delegate = il2cpp::vm::Object::New(delegateType);\n        Il2CppMethodPointer nativeFunctionPointer = (Il2CppMethodPointer)functionPtr;\n\n        const MethodInfo* method = utils::NativeDelegateMethodCache::GetNativeDelegate(nativeFunctionPointer);\n        if (method == NULL)\n        {\n            MethodInfo* newMethod = (MethodInfo*)IL2CPP_CALLOC(1, sizeof(MethodInfo));\n            newMethod->methodPointer = nativeFunctionPointer;\n            newMethod->invoker_method = NULL;\n            utils::NativeDelegateMethodCache::AddNativeDelegate(nativeFunctionPointer, newMethod);\n            method = newMethod;\n        }\n\n        Type::ConstructDelegate((Il2CppDelegate*)delegate, delegate, managedToNativeWrapperMethodPointer, method);\n\n        return (Il2CppDelegate*)delegate;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/PlatformInvoke.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"blob.h\"\n#include \"metadata.h\"\n#include \"object-internals.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/MarshalAlloc.h\"\n#include \"vm/Object.h\"\n#include \"vm/String.h\"\n#include \"utils/StringView.h\"\n\nstruct Il2CppString;\nstruct Il2CppStringBuilder;\n\nstruct PInvokeArguments\n{\n    const il2cpp::utils::StringView<Il2CppNativeChar> moduleName;\n    const il2cpp::utils::StringView<char> entryPoint;\n    Il2CppCallConvention callingConvention;\n    Il2CppCharSet charSet;\n    int parameterSize;\n    bool isNoMangle;    // Says whether P/Invoke should append to function name 'A'/'W' according to charSet.\n};\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API PlatformInvoke\n    {\n    public:\n        static void SetFindPluginCallback(Il2CppSetFindPlugInCallback method);\n        static Il2CppMethodPointer Resolve(const PInvokeArguments& pinvokeArgs);\n\n        static void MarshalFree(void* ptr);\n\n        static char* MarshalCSharpStringToCppString(Il2CppString* managedString);\n        static void MarshalCSharpStringToCppStringFixed(Il2CppString* managedString, char* buffer, int numberOfCharacters);\n        static Il2CppChar* MarshalCSharpStringToCppWString(Il2CppString* managedString);\n        static void MarshalCSharpStringToCppWStringFixed(Il2CppString* managedString, Il2CppChar* buffer, int numberOfCharacters);\n        static il2cpp_hresult_t MarshalCSharpStringToCppBStringNoThrow(Il2CppString* managedString, Il2CppChar** bstr);\n        static Il2CppChar* MarshalCSharpStringToCppBString(Il2CppString* managedString);\n\n        static Il2CppString* MarshalCppStringToCSharpStringResult(const char* value);\n        static Il2CppString* MarshalCppWStringToCSharpStringResult(const Il2CppChar* value);\n        static Il2CppString* MarshalCppBStringToCSharpStringResult(const Il2CppChar* value);\n\n        static void MarshalFreeBString(Il2CppChar* value);\n\n        static char* MarshalStringBuilder(Il2CppStringBuilder* stringBuilder);\n        static Il2CppChar* MarshalWStringBuilder(Il2CppStringBuilder* stringBuilder);\n\n        static void MarshalStringBuilderResult(Il2CppStringBuilder* stringBuilder, char* buffer);\n        static void MarshalWStringBuilderResult(Il2CppStringBuilder* stringBuilder, Il2CppChar* buffer);\n\n        static Il2CppIntPtr MarshalDelegate(Il2CppDelegate* d);\n        static Il2CppDelegate* MarshalFunctionPointerToDelegate(void* functionPtr, Il2CppClass* delegateType);\n\n        template<typename T>\n        static T* MarshalAllocateStringBuffer(size_t numberOfCharacters)\n        {\n            return (T*)MarshalAlloc::Allocate(numberOfCharacters * sizeof(T));\n        }\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Profiler.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"utils/dynamic_array.h\"\n#include \"vm/Profiler.h\"\n\n#if IL2CPP_ENABLE_PROFILER\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    struct ProfilerDesc\n    {\n        Il2CppProfiler* profiler;\n        Il2CppProfileFlags events;\n        Il2CppProfileFunc shutdownCallback;\n\n        Il2CppProfileMethodFunc methodEnterCallback;\n        Il2CppProfileMethodFunc methodLeaveCallback;\n\n        Il2CppProfileAllocFunc allocationCallback;\n\n        Il2CppProfileGCFunc gcEventCallback;\n        Il2CppProfileGCResizeFunc gcHeapResizeCallback;\n    };\n\n    typedef il2cpp::utils::dynamic_array<ProfilerDesc*> ProfilersVec;\n    static ProfilersVec s_profilers;\n    Il2CppProfileFlags Profiler::s_profilerEvents;\n\n    void Profiler::Install(Il2CppProfiler *prof, Il2CppProfileFunc shutdownCallback)\n    {\n        ProfilerDesc* desc = (ProfilerDesc*)calloc(1, sizeof(ProfilerDesc));\n        desc->profiler = prof;\n        desc->shutdownCallback = shutdownCallback;\n        s_profilers.push_back(desc);\n    }\n\n    void Profiler::SetEvents(Il2CppProfileFlags events)\n    {\n        Il2CppProfileFlags value = IL2CPP_PROFILE_NONE;\n        if (s_profilers.size())\n            s_profilers.back()->events = events;\n        for (ProfilersVec::iterator iter = s_profilers.begin(); iter != s_profilers.end(); iter++)\n            value = (Il2CppProfileFlags)(value | (*iter)->events);\n        s_profilerEvents = value;\n    }\n\n    void Profiler::InstallEnterLeave(Il2CppProfileMethodFunc enter, Il2CppProfileMethodFunc fleave)\n    {\n        if (!s_profilers.size())\n            return;\n        s_profilers.back()->methodEnterCallback = enter;\n        s_profilers.back()->methodLeaveCallback = fleave;\n    }\n\n    void Profiler::InstallAllocation(Il2CppProfileAllocFunc callback)\n    {\n        if (!s_profilers.size())\n            return;\n        s_profilers.back()->allocationCallback = callback;\n    }\n\n    void Profiler::InstallGC(Il2CppProfileGCFunc callback, Il2CppProfileGCResizeFunc heap_resize_callback)\n    {\n        if (!s_profilers.size())\n            return;\n        s_profilers.back()->gcEventCallback = callback;\n        s_profilers.back()->gcHeapResizeCallback = heap_resize_callback;\n    }\n\n#if IL2CPP_ENABLE_PROFILER\n\n    void Profiler::Allocation(Il2CppObject *obj, Il2CppClass *klass)\n    {\n        for (ProfilersVec::const_iterator iter = s_profilers.begin(); iter != s_profilers.end(); iter++)\n        {\n            if (((*iter)->events & IL2CPP_PROFILE_ALLOCATIONS) && (*iter)->allocationCallback)\n                (*iter)->allocationCallback((*iter)->profiler, obj, klass);\n        }\n    }\n\n    void Profiler::MethodEnter(const MethodInfo *method)\n    {\n        for (ProfilersVec::const_iterator iter = s_profilers.begin(); iter != s_profilers.end(); iter++)\n        {\n            if (((*iter)->events & IL2CPP_PROFILE_ENTER_LEAVE) && (*iter)->methodEnterCallback)\n                (*iter)->methodEnterCallback((*iter)->profiler, method);\n        }\n    }\n\n    void Profiler::MethodExit(const MethodInfo *method)\n    {\n        for (ProfilersVec::const_iterator iter = s_profilers.begin(); iter != s_profilers.end(); iter++)\n        {\n            if (((*iter)->events & IL2CPP_PROFILE_ENTER_LEAVE) && (*iter)->methodLeaveCallback)\n                (*iter)->methodLeaveCallback((*iter)->profiler, method);\n        }\n    }\n\n    void Profiler::GCEvent(Il2CppGCEvent eventType)\n    {\n        for (ProfilersVec::const_iterator iter = s_profilers.begin(); iter != s_profilers.end(); iter++)\n        {\n            if (((*iter)->events & IL2CPP_PROFILE_GC) && (*iter)->gcEventCallback)\n                (*iter)->gcEventCallback((*iter)->profiler, eventType, 0);\n        }\n    }\n\n    void Profiler::GCHeapResize(int64_t newSize)\n    {\n        for (ProfilersVec::const_iterator iter = s_profilers.begin(); iter != s_profilers.end(); iter++)\n        {\n            if (((*iter)->events & IL2CPP_PROFILE_GC) && (*iter)->gcEventCallback)\n                (*iter)->gcHeapResizeCallback((*iter)->profiler, newSize);\n        }\n    }\n\n#endif\n} /* namespace vm */\n} /* namespace il2cpp */\n\n#endif // IL2CPP_ENABLE_PROFILER\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Profiler.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n#if IL2CPP_ENABLE_PROFILER\n\n    class LIBIL2CPP_CODEGEN_API Profiler\n    {\n// exported\n    public:\n        static void Install(Il2CppProfiler *prof, Il2CppProfileFunc shutdownCallback);\n        static void SetEvents(Il2CppProfileFlags events);\n\n        static void InstallEnterLeave(Il2CppProfileMethodFunc enter, Il2CppProfileMethodFunc fleave);\n        static void InstallAllocation(Il2CppProfileAllocFunc callback);\n        static void InstallGC(Il2CppProfileGCFunc callback, Il2CppProfileGCResizeFunc heap_resize_callback);\n\n// internal\n    public:\n        static void Allocation(Il2CppObject *obj, Il2CppClass *klass);\n        static void MethodEnter(const MethodInfo *method);\n        static void MethodExit(const MethodInfo *method);\n        static void GCEvent(Il2CppGCEvent eventType);\n        static void GCHeapResize(int64_t newSize);\n\n        static Il2CppProfileFlags s_profilerEvents;\n\n        static inline bool ProfileAllocations()\n        {\n            return (s_profilerEvents & IL2CPP_PROFILE_ALLOCATIONS) != 0;\n        }\n\n    private:\n    };\n\n#endif\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Property.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"vm/Property.h\"\n#include \"class-internals.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    uint32_t Property::GetFlags(const PropertyInfo* prop)\n    {\n        return prop->attrs;\n    }\n\n    const MethodInfo* Property::GetGetMethod(const PropertyInfo* prop)\n    {\n        return prop->get;\n    }\n\n    const MethodInfo* Property::GetSetMethod(const PropertyInfo* prop)\n    {\n        return prop->set;\n    }\n\n    const char* Property::GetName(const PropertyInfo* prop)\n    {\n        return prop->name;\n    }\n\n    Il2CppClass* Property::GetParent(const PropertyInfo* prop)\n    {\n        return prop->parent;\n    }\n\n    uint32_t Property::GetToken(const PropertyInfo* prop)\n    {\n        return prop->token;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Property.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct MethodInfo;\nstruct PropertyInfo;\nstruct Il2CppClass;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Property\n    {\n    public:\n        // exported\n        static uint32_t GetFlags(const PropertyInfo* prop);\n        static const MethodInfo* GetGetMethod(const PropertyInfo* prop);\n        static const MethodInfo* GetSetMethod(const PropertyInfo* prop);\n        static const char* GetName(const PropertyInfo* prop);\n        static Il2CppClass* GetParent(const PropertyInfo* prop);\n        static uint32_t GetToken(const PropertyInfo* prop);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/RCW.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n#include \"il2cpp-vm-support.h\"\n#include \"gc/GCHandle.h\"\n#include \"metadata/GenericMetadata.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Field.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Object.h\"\n#include \"vm/PlatformInvoke.h\"\n#include \"vm/RCW.h\"\n#include \"vm/Runtime.h\"\n#include \"os/COM.h\"\n#include \"os/Mutex.h\"\n#include \"os/WindowsRuntime.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"utils/HashUtils.h\"\n#include \"utils/StringUtils.h\"\n\nconst Il2CppGuid Il2CppIUnknown::IID = { 0x00000000, 0x0000, 0x0000, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 };\nconst Il2CppGuid Il2CppISequentialStream::IID = { 0x0c733a30, 0x2a1c, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d };\nconst Il2CppGuid Il2CppIStream::IID = { 0x0000000c, 0x0000, 0x0000, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 };\nconst Il2CppGuid Il2CppIMarshal::IID = { 0x00000003, 0x0000, 0x0000, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 };\nconst Il2CppGuid Il2CppIManagedObject::IID = { 0xc3fcc19e, 0xa970, 0x11d2, 0x8b, 0x5a, 0x00, 0xa0, 0xc9, 0xb7, 0xc9, 0xc4 };\nconst Il2CppGuid Il2CppIManagedObjectHolder::IID = { 0xd4bbc1c8, 0xf5bf, 0x4647, 0x94, 0x95, 0x2e, 0x5c, 0xf, 0x20, 0xf7, 0x5d };\nconst Il2CppGuid Il2CppIInspectable::IID = { 0xaf86e2e0, 0xb12d, 0x4c6a, 0x9c, 0x5a, 0xd7, 0xaa, 0x65, 0x10, 0x1E, 0x90 };\nconst Il2CppGuid Il2CppIActivationFactory::IID = { 0x00000035, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 };\nconst Il2CppGuid Il2CppIRestrictedErrorInfo::IID = { 0x82ba7092, 0x4c88, 0x427d, 0xa7, 0xbc, 0x16, 0xdd, 0x93, 0xfe, 0xb6, 0x7e };\nconst Il2CppGuid Il2CppILanguageExceptionErrorInfo::IID = { 0x04a2dbf3, 0xdf83, 0x116c, 0x09, 0x46, 0x08, 0x12, 0xab, 0xf6, 0xe0, 0x7d };\nconst Il2CppGuid Il2CppIAgileObject::IID = { 0x94ea2b94, 0xe9cc, 0x49e0, 0xc0, 0xff, 0xee, 0x64, 0xca, 0x8f, 0x5b, 0x90 };\n\nusing il2cpp::utils::PointerHash;\n\nnamespace il2cpp\n{\n    using namespace os;\n\nnamespace vm\n{\n    typedef Il2CppHashMap<Il2CppIUnknown*, /* Weak GC Handle */ uint32_t, PointerHash<Il2CppIUnknown> > RCWCache;\n\n    static FastMutex s_RCWCacheMutex;\n    static RCWCache s_RCWCache;\n\n    void RCW::Register(Il2CppComObject* rcw)\n    {\n        FastAutoLock lock(&s_RCWCacheMutex);\n        const bool inserted = s_RCWCache.insert(std::make_pair(rcw->identity, gc::GCHandle::NewWeakref(rcw, false))).second;\n        Assert(inserted);\n    }\n\n    static inline Il2CppIUnknown* GetIdentity(Il2CppIUnknown* unknown)\n    {\n        Il2CppIUnknown* identity;\n        il2cpp_hresult_t hr = unknown->QueryInterface(Il2CppIUnknown::IID, reinterpret_cast<void**>(&identity));\n        IL2CPP_VM_RAISE_IF_FAILED(hr, true);\n        IL2CPP_ASSERT(identity);\n\n        return identity;\n    }\n\n// Shameless comment copycat from .NET Native (https://github.com/dotnet/corert/blob/374c3d47992a7c444ec7d1dfe94b1780de942a55/src/System.Private.Interop/src/Shared/McgComHelpers.cs#L557):\n// 1. Prefer using the class returned from GetRuntimeClassName\n// 2. Otherwise use the class (if there) in the signature\n// 3. Out of options - create Il2CppComObject\n    static inline Il2CppClass* GetClassForRCW(Il2CppIInspectable* inspectable, Il2CppClass* fallbackClass)\n    {\n        Il2CppHString className;\n        il2cpp_hresult_t hr = inspectable->GetRuntimeClassName(&className);\n        if (IL2CPP_HR_FAILED(hr) || className == NULL)\n            return fallbackClass;\n\n        uint32_t classNameLength;\n        const Il2CppChar* classNamePtr = os::WindowsRuntime::GetHStringBuffer(className, &classNameLength);\n        std::string classNameUtf8 = utils::StringUtils::Utf16ToUtf8(classNamePtr, classNameLength);\n        os::WindowsRuntime::DeleteHString(className);\n\n        Il2CppClass* rcwClass = MetadataCache::GetWindowsRuntimeClass(classNameUtf8);\n        return rcwClass != NULL ? rcwClass : fallbackClass;\n    }\n\n    static inline Il2CppClass* GetClassForRCW(Il2CppIUnknown* unknown, Il2CppClass* fallbackClass)\n    {\n        Il2CppIInspectable* inspectable;\n        il2cpp_hresult_t hr = unknown->QueryInterface(Il2CppIInspectable::IID, reinterpret_cast<void**>(&inspectable));\n\n        if (IL2CPP_HR_FAILED(hr))\n            return fallbackClass;\n\n        Il2CppClass* result = GetClassForRCW(inspectable, fallbackClass);\n        inspectable->Release();\n        return result;\n    }\n\n    Il2CppObject* ReboxIReference(Il2CppIUnknown* comObject, Il2CppClass* objectClass);\n    Il2CppObject* ReboxKeyValuePair(Il2CppIUnknown* comObject, Il2CppClass* keyValuePairGenericInstance);\n    Il2CppObject* ReboxUri(Il2CppIUnknown* comObject);\n\n    Il2CppObject* ReboxIfBoxed(Il2CppIUnknown* comObject, Il2CppClass* objectClass)\n    {\n        if (strcmp(objectClass->namespaze, \"Windows.Foundation\") == 0 && strcmp(objectClass->name, \"IReference`1\") == 0)\n            return ReboxIReference(comObject, objectClass);\n\n        if (strcmp(objectClass->namespaze, \"System.Collections.Generic\") == 0 && strcmp(objectClass->name, \"KeyValuePair`2\") == 0)\n            return ReboxKeyValuePair(comObject, objectClass);\n\n        if (objectClass == il2cpp_defaults.system_uri_class)\n            return ReboxUri(comObject);\n\n        return NULL;\n    }\n\n    Il2CppObject* ReboxIReference(Il2CppIUnknown* comObject, Il2CppClass* objectClass)\n    {\n        Class::Init(objectClass);\n\n        // Sanity checks\n        IL2CPP_ASSERT(Class::IsInflated(objectClass));\n        IL2CPP_ASSERT(objectClass->vtable_count == 1); // IReference`1<T> only has get_Value method\n\n        const MethodInfo* getValueMethod = objectClass->vtable[0].method;\n        IL2CPP_ASSERT(strcmp(getValueMethod->name, \"get_Value\") == 0);\n\n        // We don't really want to allocate it on the GC heap for this little invocation\n        Il2CppComObject fakeRcw;\n        fakeRcw.klass = objectClass;\n        fakeRcw.monitor = NULL;\n        fakeRcw.identity = comObject;\n\n        Il2CppException* exception = NULL;\n        Il2CppObject* reboxed = Runtime::Invoke(getValueMethod, &fakeRcw, NULL, &exception);\n\n        if (exception != NULL)\n            Exception::Raise(exception);\n\n        return reboxed;\n    }\n\n    Il2CppObject* ReboxKeyValuePair(Il2CppIUnknown* comObject, Il2CppClass* keyValuePairGenericInstance)\n    {\n        Class::Init(keyValuePairGenericInstance);\n\n        // Sanity checks\n        IL2CPP_ASSERT(Class::IsInflated(keyValuePairGenericInstance));\n        IL2CPP_ASSERT(il2cpp_defaults.ikey_value_pair_class != NULL);\n\n        // Retrieve Windows.Foundation.Collections.IKeyValuePair`1<K, V> generic instance\n        Il2CppGenericClass* iKeyValuePairGenericClass = metadata::GenericMetadata::GetGenericClass(il2cpp_defaults.ikey_value_pair_class, keyValuePairGenericInstance->generic_class->context.class_inst);\n        Il2CppClass* iKeyValuePairGenericInstance = GenericClass::GetClass(iKeyValuePairGenericClass);\n        Class::Init(iKeyValuePairGenericInstance);\n\n        IL2CPP_ASSERT(iKeyValuePairGenericInstance->vtable_count == 2);\n\n        const MethodInfo* getKeyMethod = iKeyValuePairGenericInstance->vtable[0].method;\n        IL2CPP_ASSERT(strcmp(getKeyMethod->name, \"get_Key\") == 0);\n\n        const MethodInfo* getValueMethod = iKeyValuePairGenericInstance->vtable[1].method;\n        IL2CPP_ASSERT(strcmp(getValueMethod->name, \"get_Value\") == 0);\n\n        Il2CppComObject fakeRcw;\n        fakeRcw.klass = il2cpp_defaults.il2cpp_com_object_class;\n        fakeRcw.monitor = NULL;\n        fakeRcw.identity = comObject;\n\n        // Create new boxed key value pair\n        Il2CppObject* reboxed = Object::New(keyValuePairGenericInstance);\n\n        for (uint16_t i = 0; i < 2; i++)\n        {\n            const MethodInfo* methodToInvoke;\n            const FieldInfo& field = keyValuePairGenericInstance->fields[i];\n\n            // Figure out which getter to call\n            if (strcmp(field.name, \"key\") == 0)\n            {\n                methodToInvoke = getKeyMethod;\n            }\n            else if (strcmp(field.name, \"value\") == 0)\n            {\n                methodToInvoke = getValueMethod;\n            }\n\n            // Call the getter\n            Il2CppException* exception = NULL;\n            Il2CppObject* fieldValue = Runtime::Invoke(methodToInvoke, &fakeRcw, NULL, &exception);\n\n            if (exception != NULL)\n                Exception::Raise(exception);\n\n            // Set the field in our reboxed key value pair instance\n            if (Class::FromIl2CppType(field.type)->valuetype)\n            {\n                Field::SetValue(reboxed, &field, Object::Unbox(fieldValue));\n            }\n            else\n            {\n                Field::SetValue(reboxed, &field, fieldValue);\n            }\n        }\n\n        return reboxed;\n    }\n\n    Il2CppObject* ReboxUri(Il2CppIUnknown* comObject)\n    {\n        Il2CppClass* systemUriClass = il2cpp_defaults.system_uri_class;\n        Il2CppClass* iUriRuntimeClassClass = il2cpp_defaults.windows_foundation_iuri_runtime_class_class;\n\n        Class::Init(systemUriClass);\n        Class::Init(iUriRuntimeClassClass);\n\n        const int kGetRawUriMethodIndex = 10; // IUriRuntimeClass::get_RawUri\n        IL2CPP_ASSERT(iUriRuntimeClassClass->vtable_count > kGetRawUriMethodIndex);\n\n        VirtualInvokeData getRawUriInvokeData = iUriRuntimeClassClass->vtable[kGetRawUriMethodIndex];\n        IL2CPP_ASSERT(strcmp(getRawUriInvokeData.method->name, \"get_RawUri\") == 0);\n\n        Il2CppComObject fakeRcw;\n        fakeRcw.klass = il2cpp_defaults.il2cpp_com_object_class;\n        fakeRcw.monitor = NULL;\n        fakeRcw.identity = comObject;\n\n        Il2CppObject* rawUri = Runtime::InvokeWithThrow(getRawUriInvokeData.method, &fakeRcw, NULL);\n\n        const MethodInfo* uriConstructor = NULL;\n        uint16_t uriMethodCount = systemUriClass->method_count;\n\n        for (uint16_t i = 0; i < uriMethodCount; i++)\n        {\n            const MethodInfo* method = systemUriClass->methods[i];\n            if (strcmp(method->name, \".ctor\") == 0 && method->parameters_count == 1 && method->parameters[0].parameter_type->type == IL2CPP_TYPE_STRING)\n            {\n                uriConstructor = method;\n                break;\n            }\n        }\n\n        IL2CPP_ASSERT(uriConstructor);\n        Il2CppObject* reboxedUri = Object::New(systemUriClass);\n        void* constructorArgs[1] = { rawUri };\n\n        Runtime::InvokeWithThrow(uriConstructor, reboxedUri, constructorArgs);\n        return reboxedUri;\n    }\n\n    template<typename T, bool isSealedClassInstance>\n    static inline Il2CppObject* GetOrCreateRCW(T* comObject, Il2CppClass* objectClass)\n    {\n        IL2CPP_ASSERT(comObject != NULL);\n\n        if (!isSealedClassInstance)\n        {\n            // 1. Check if comObject is actually our COM Callable Wrapper\n            Il2CppIManagedObjectHolder* managedHolder;\n            il2cpp_hresult_t hr = comObject->QueryInterface(Il2CppIManagedObjectHolder::IID, reinterpret_cast<void**>(&managedHolder));\n            if (IL2CPP_HR_SUCCEEDED(hr))\n            {\n                Il2CppObject* instance = managedHolder->GetManagedObject();\n                managedHolder->Release();\n\n                IL2CPP_ASSERT(instance);\n                return instance;\n            }\n        }\n\n        Il2CppIUnknown* identity = GetIdentity(comObject);\n\n        // 2. Try to find it in RCW cache\n        FastAutoLock lock(&s_RCWCacheMutex);\n        RCWCache::iterator iter = s_RCWCache.find(identity);\n        if (iter != s_RCWCache.end())\n        {\n            Il2CppObject* obj = gc::GCHandle::GetTarget(iter->second);\n            if (obj != NULL)\n            {\n                identity->Release();\n                identity = NULL;\n                return obj;\n            }\n            else\n            {\n                // The RCW was already queued for finalization.\n                // Erase it from the cache and let us create a new one.\n                s_RCWCache.erase(iter);\n            }\n        }\n\n        // 3. Figure out the concrete RCW class\n        if (!isSealedClassInstance)\n        {\n            objectClass = GetClassForRCW(comObject, objectClass);\n\n            // If object class is one of the blessed unboxable classes,\n            // unbox the object from its windows runtime representation,\n            // unmarshal it, box it to Il2CppObject and return it\n            //\n            // Current list of unboxable classes:\n            //     Windows.Foundation.IReference`1<T>\n            //     System.Collections.Generic.KeyValuePair`2<K, V>\n            //     System.Uri\n            Il2CppObject* reboxed = ReboxIfBoxed(comObject, objectClass);\n            if (reboxed != NULL)\n                return reboxed;\n        }\n\n        IL2CPP_ASSERT(Class::HasParent(objectClass, il2cpp_defaults.il2cpp_com_object_class));\n\n        // 4. Create RCW object\n        Il2CppComObject* rcw = static_cast<Il2CppComObject*>(Object::New(objectClass));\n        rcw->identity = identity;\n\n        // 5. Insert it into the cache\n        const bool inserted = s_RCWCache.insert(std::make_pair(identity, gc::GCHandle::NewWeakref(rcw, false))).second;\n        Assert(inserted);\n\n        return rcw;\n    }\n\n    Il2CppObject* RCW::GetOrCreateFromIUnknown(Il2CppIUnknown* unknown, Il2CppClass* fallbackClass)\n    {\n        return GetOrCreateRCW<Il2CppIUnknown, false>(unknown, fallbackClass);\n    }\n\n    Il2CppObject* RCW::GetOrCreateFromIInspectable(Il2CppIInspectable* inspectable, Il2CppClass* fallbackClass)\n    {\n        return GetOrCreateRCW<Il2CppIInspectable, false>(inspectable, fallbackClass);\n    }\n\n    Il2CppObject* RCW::GetOrCreateForSealedClass(Il2CppIUnknown* unknown, Il2CppClass* objectClass)\n    {\n        return GetOrCreateRCW<Il2CppIUnknown, true>(unknown, objectClass);\n    }\n\n    void RCW::Cleanup(Il2CppComObject* rcw)\n    {\n        FastAutoLock lock(&s_RCWCacheMutex);\n\n        RCWCache::iterator iter = s_RCWCache.find(rcw->identity);\n\n        // It is possible for us to not find object in the cache if two RCWs for the same IUnknown get\n        // finalized in a row: then, the first finalizer will remove the NULL object, and the second one\n        // will not find it.\n        if (iter != s_RCWCache.end())\n        {\n            Il2CppObject* obj = gc::GCHandle::GetTarget(iter->second);\n\n            // If it's null, it means that the cache contains our object\n            // but the weak GC handle has been invalidated by the GC already\n            // If it's equal to our object, it means that RCW::Cleanup was\n            // called manually, and we should also delete it from the cache\n            // Otherwise, it's a different object. It means that we have already\n            // created a new RCW in place of this one during the time\n            // it had been queued for finalization\n            if (obj == NULL || obj == rcw)\n                s_RCWCache.erase(iter);\n        }\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/RCW.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n\nstruct Il2CppComObject;\nstruct Il2CppGuid;\nstruct Il2CppIUnknown;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API RCW\n    {\n    public:\n        static void Register(Il2CppComObject* rcw);\n        static Il2CppObject* GetOrCreateFromIUnknown(Il2CppIUnknown* unknown, Il2CppClass* fallbackClass);\n        static Il2CppObject* GetOrCreateFromIInspectable(Il2CppIInspectable* inspectable, Il2CppClass* fallbackClass);\n        static Il2CppObject* GetOrCreateForSealedClass(Il2CppIUnknown* unknown, Il2CppClass* objectClass);\n        static void Cleanup(Il2CppComObject* rcw);\n\n        template<bool throwOnError>\n        inline static Il2CppIUnknown* QueryInterface(Il2CppComObject* rcw, const Il2CppGuid& iid)\n        {\n            IL2CPP_ASSERT(rcw);\n            IL2CPP_ASSERT(rcw->identity);\n\n            Il2CppIUnknown* result;\n            const il2cpp_hresult_t hr = rcw->identity->QueryInterface(iid, reinterpret_cast<void**>(&result));\n            if (IL2CPP_HR_FAILED(hr))\n            {\n                if (throwOnError)\n                    Exception::Raise(hr, true);\n\n                return NULL;\n            }\n\n            IL2CPP_ASSERT(result);\n            return result;\n        }\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Random.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"vm/Random.h\"\n\n#include \"os/Cryptography.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    bool Random::Open()\n    {\n        return il2cpp::os::Cryptography::OpenCryptographyProvider();\n    }\n\n    void* Random::Create()\n    {\n        il2cpp::os::Cryptography::OpenCryptographyProvider();\n        return il2cpp::os::Cryptography::GetCryptographyProvider();\n    }\n\n    void Random::Free(void* handle)\n    {\n        il2cpp::os::Cryptography::ReleaseCryptographyProvider(handle);\n    }\n\n/**\n* mono_rand_try_get_bytes:\n* @handle: A pointer to an RNG handle. Handle is set to NULL on failure.\n* @buffer: A buffer into which to write random data.\n* @buffer_size: Number of bytes to write into buffer.\n* @error: Set on error.\n*\n* Returns: FALSE on failure and sets @error, TRUE on success.\n*\n* Extracts bytes from an RNG handle.\n*/\n    bool Random::TryGetBytes(void* *handle, unsigned char *buffer, int buffer_size)\n    {\n        IL2CPP_ASSERT(handle);\n        void* provider = *handle;\n\n        if (!il2cpp::os::Cryptography::FillBufferWithRandomBytes(provider, buffer_size, buffer))\n        {\n            il2cpp::os::Cryptography::ReleaseCryptographyProvider(provider);\n            /* we may have lost our context with CryptoAPI, but all hope isn't lost yet! */\n            provider = il2cpp::os::Cryptography::GetCryptographyProvider();\n            if (!il2cpp::os::Cryptography::FillBufferWithRandomBytes(provider, buffer_size, buffer))\n            {\n                il2cpp::os::Cryptography::ReleaseCryptographyProvider(provider);\n                *handle = 0;\n                //mono_error_set_execution_engine(error, \"Failed to gen random bytes (%d)\", GetLastError());\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n/**\n* mono_rand_try_get_uint32:\n* @handle: A pointer to an RNG handle. Handle is set to NULL on failure.\n* @val: A pointer to a 32-bit unsigned int, to which the result will be written.\n* @min: Result will be greater than or equal to this value.\n* @max: Result will be less than or equal to this value.\n*\n* Returns: FALSE on failure, TRUE on success.\n*\n* Extracts one 32-bit unsigned int from an RNG handle.\n*/\n    bool Random::TryGetUnsignedInt32(void* *handle, uint32_t *val, uint32_t min, uint32_t max)\n    {\n        IL2CPP_ASSERT(val);\n        if (!TryGetBytes(handle, (unsigned char*)val, sizeof(uint32_t)))\n            return false;\n\n        double randomDouble = ((double)*val) / (((double)UINT32_MAX) + 1); // Range is [0,1)\n        *val = (uint32_t)(randomDouble * (max - min + 1) + min);\n\n        IL2CPP_ASSERT(*val >= min);\n        IL2CPP_ASSERT(*val <= max);\n\n        return true;\n    }\n\n    uint32_t Random::Next(void** handle, uint32_t min, uint32_t max)\n    {\n        uint32_t val;\n        bool ok = TryGetUnsignedInt32(handle, &val, min, max);\n\n        IL2CPP_ASSERT(ok);\n\n        return val;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Random.h",
    "content": "#pragma once\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Random\n    {\n    public:\n        static bool Open();\n        static void* Create();\n        static void Free(void* handle);\n\n        static bool TryGetBytes(void** handle, unsigned char *buffer, int buffer_size);\n        static bool TryGetUnsignedInt32(void** handle, uint32_t *val, uint32_t min, uint32_t max);\n        static uint32_t Next(void** handle, uint32_t min, uint32_t max);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Reflection.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"tabledefs.h\"\n#include \"mono-structs.h\"\n#include \"gc/GCHandle.h\"\n#include \"metadata/Il2CppTypeCompare.h\"\n#include \"metadata/Il2CppTypeHash.h\"\n#include \"os/Mutex.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Field.h\"\n#include \"vm/Image.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Object.h\"\n#include \"vm/Parameter.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/String.h\"\n#include \"vm/AssemblyName.h\"\n#include \"utils/Il2CppHashMap.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/HashUtils.h\"\n#include \"gc/AppendOnlyGCHashMap.h\"\n\n\n#include \"gc/Allocator.h\"\n\nusing il2cpp::metadata::Il2CppTypeEqualityComparer;\nusing il2cpp::metadata::Il2CppTypeHash;\n\ntemplate<typename T>\nstruct ReflectionMapHash\n{\n    size_t operator()(const T& ea) const\n    {\n        return ((size_t)(intptr_t)(ea.first)) >> 3;\n    }\n};\n\ntemplate<typename T>\nstruct ReflectionMapLess\n{\n    bool operator()(const T& ea, const T& eb) const\n    {\n        if (ea.first < eb.first)\n            return true;\n        if (ea.second < eb.second)\n            return true;\n        return false;\n    }\n};\n\n\ntemplate<typename Key, typename Value>\nstruct ReflectionMap : public il2cpp::gc::AppendOnlyGCHashMap<Key, Value, ReflectionMapHash<Key> >\n{\n};\n\ntypedef ReflectionMap<std::pair<const Il2CppAssembly*, Il2CppClass*>, Il2CppReflectionAssembly*> AssemblyMap;\ntypedef ReflectionMap<std::pair<const FieldInfo*, Il2CppClass*>, Il2CppReflectionField*> FieldMap;\ntypedef ReflectionMap<std::pair<const PropertyInfo*, Il2CppClass*>, Il2CppReflectionProperty*> PropertyMap;\ntypedef ReflectionMap<std::pair<const EventInfo*, Il2CppClass*>, Il2CppReflectionEvent*> EventMap;\ntypedef ReflectionMap<std::pair<const MethodInfo*, Il2CppClass*>, Il2CppReflectionMethod*> MethodMap;\ntypedef ReflectionMap<std::pair<const Il2CppImage*, Il2CppClass*>, Il2CppReflectionModule*> ModuleMap;\ntypedef ReflectionMap<std::pair<const MethodInfo*, Il2CppClass*>, Il2CppArray*> ParametersMap;\n\ntypedef il2cpp::gc::AppendOnlyGCHashMap<const Il2CppType*, Il2CppReflectionType*, Il2CppTypeHash, Il2CppTypeEqualityComparer> TypeMap;\n\ntypedef Il2CppHashMap<const Il2CppGenericParameter*, const MonoGenericParameterInfo*, il2cpp::utils::PointerHash<const Il2CppGenericParameter> > MonoGenericParameterMap;\ntypedef Il2CppHashMap<const  Il2CppAssembly*, const Il2CppMonoAssemblyName*, il2cpp::utils::PointerHash<const Il2CppAssembly> > MonoAssemblyNameMap;\n\n// these needs to be pointers and allocated after GC is initialized since it uses GC Allocator\nstatic AssemblyMap* s_AssemblyMap;\nstatic FieldMap* s_FieldMap;\nstatic PropertyMap* s_PropertyMap;\nstatic EventMap* s_EventMap;\nstatic MethodMap* s_MethodMap;\nstatic ModuleMap* s_ModuleMap;\nstatic ParametersMap* s_ParametersMap;\nstatic TypeMap* s_TypeMap;\nstatic MonoGenericParameterMap* s_MonoGenericParamterMap;\nstatic MonoAssemblyNameMap* s_MonoAssemblyNameMap;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    static il2cpp::os::FastMutex s_ReflectionICallsMutex;\n\n    Il2CppReflectionAssembly* Reflection::GetAssemblyObject(const Il2CppAssembly *assembly)\n    {\n        static Il2CppClass *System_Reflection_Assembly;\n        Il2CppReflectionAssembly *res;\n\n        il2cpp::os::FastAutoLock lock(&s_ReflectionICallsMutex);\n\n        AssemblyMap::key_type::wrapped_type key(assembly, (Il2CppClass*)NULL);\n        AssemblyMap::data_type value = NULL;\n        if (s_AssemblyMap->TryGetValue(key, &value))\n            return value;\n\n        if (!System_Reflection_Assembly)\n#if !NET_4_0\n            System_Reflection_Assembly = il2cpp_defaults.assembly_class;\n#else\n            System_Reflection_Assembly = il2cpp_defaults.mono_assembly_class;\n#endif\n        res = (Il2CppReflectionAssembly*)Object::New(System_Reflection_Assembly);\n        res->assembly = assembly;\n\n        s_AssemblyMap->Add(key, res);\n\n        return res;\n    }\n\n    Il2CppReflectionAssemblyName* Reflection::GetAssemblyNameObject(const Il2CppAssemblyName *assemblyName)\n    {\n        std::string fullAssemblyName = vm::AssemblyName::AssemblyNameToString(*assemblyName);\n        Il2CppReflectionAssemblyName* reflectionAssemblyName = (Il2CppReflectionAssemblyName*)Object::New(il2cpp_defaults.assembly_name_class);\n        vm::AssemblyName::ParseName(reflectionAssemblyName, fullAssemblyName);\n        return reflectionAssemblyName;\n    }\n\n    Il2CppReflectionField* Reflection::GetFieldObject(Il2CppClass *klass, FieldInfo *field)\n    {\n        Il2CppReflectionField *res;\n        static Il2CppClass *monofield_klass;\n\n        il2cpp::os::FastAutoLock lock(&s_ReflectionICallsMutex);\n\n        FieldMap::key_type::wrapped_type key(field, klass);\n        FieldMap::data_type value = NULL;\n        if (s_FieldMap->TryGetValue(key, &value))\n            return value;\n\n        if (!monofield_klass)\n            monofield_klass = Class::FromName(il2cpp_defaults.corlib, \"System.Reflection\", \"MonoField\");\n        res = (Il2CppReflectionField*)Object::New(monofield_klass);\n        res->klass = klass;\n        res->field = field;\n        IL2CPP_OBJECT_SETREF(res, name, String::New(Field::GetName(field)));\n        res->attrs = field->type->attrs;\n        IL2CPP_OBJECT_SETREF(res, type, GetTypeObject(field->type));\n\n        s_FieldMap->Add(key, res);\n\n        return res;\n    }\n\n/*\n * We use the same C representation for methods and constructors, but the type\n * name in C# is different.\n */\n    static Il2CppClass *System_Reflection_MonoMethod = NULL;\n    static Il2CppClass *System_Reflection_MonoCMethod = NULL;\n\n    static Il2CppClass *System_Reflection_MonoGenericCMethod = NULL;\n    static Il2CppClass *System_Reflection_MonoGenericMethod = NULL;\n\n    Il2CppReflectionMethod* Reflection::GetMethodObject(const MethodInfo *method, Il2CppClass *refclass)\n    {\n        Il2CppClass *klass;\n        Il2CppReflectionMethod *ret;\n\n        il2cpp::os::FastAutoLock lock(&s_ReflectionICallsMutex);\n\n        if (method->is_inflated)\n        {\n            refclass = method->declaring_type;\n\n            MethodMap::key_type::wrapped_type key(method, refclass);\n            MethodMap::data_type value = NULL;\n            if (s_MethodMap->TryGetValue(key, &value))\n                return value;\n\n            if ((*method->name == '.') && (!strcmp(method->name, \".ctor\") || !strcmp(method->name, \".cctor\")))\n            {\n                if (!System_Reflection_MonoGenericCMethod)\n                    System_Reflection_MonoGenericCMethod = Class::FromName(il2cpp_defaults.corlib, \"System.Reflection\", \"MonoGenericCMethod\");\n                klass = System_Reflection_MonoGenericCMethod;\n            }\n            else\n            {\n                if (!System_Reflection_MonoGenericMethod)\n                    System_Reflection_MonoGenericMethod = Class::FromName(il2cpp_defaults.corlib, \"System.Reflection\", \"MonoGenericMethod\");\n                klass = System_Reflection_MonoGenericMethod;\n            }\n\n            Il2CppReflectionGenericMethod *gret = (Il2CppReflectionGenericMethod*)Object::New(klass);\n            gret->base.method = method;\n\n            IL2CPP_OBJECT_SETREF(gret, base.name, String::New(method->name));\n            IL2CPP_OBJECT_SETREF(gret, base.reftype, GetTypeObject(refclass->byval_arg));\n\n            ret = &gret->base;\n\n            s_MethodMap->Add(key, ret);\n\n            return ret;\n        }\n\n        if (!refclass)\n            refclass = method->declaring_type;\n\n        MethodMap::key_type::wrapped_type key(method, refclass);\n        MethodMap::data_type value = NULL;\n        if (s_MethodMap->TryGetValue(key, &value))\n            return value;\n\n        if (*method->name == '.' && (strcmp(method->name, \".ctor\") == 0 || strcmp(method->name, \".cctor\") == 0))\n        {\n            if (!System_Reflection_MonoCMethod)\n                System_Reflection_MonoCMethod = Class::FromName(il2cpp_defaults.corlib, \"System.Reflection\", \"MonoCMethod\");\n            klass = System_Reflection_MonoCMethod;\n        }\n        else\n        {\n            if (!System_Reflection_MonoMethod)\n                System_Reflection_MonoMethod = Class::FromName(il2cpp_defaults.corlib, \"System.Reflection\", \"MonoMethod\");\n            klass = System_Reflection_MonoMethod;\n        }\n        ret = (Il2CppReflectionMethod*)Object::New(klass);\n        ret->method = method;\n        IL2CPP_OBJECT_SETREF(ret, reftype, GetTypeObject(refclass->byval_arg));\n\n        s_MethodMap->Add(key, ret);\n\n        return ret;\n    }\n\n    Il2CppReflectionModule* Reflection::GetModuleObject(const Il2CppImage *image)\n    {\n        static Il2CppClass *System_Reflection_Module;\n        Il2CppReflectionModule *res;\n        //char* basename;\n\n        il2cpp::os::FastAutoLock lock(&s_ReflectionICallsMutex);\n\n        ModuleMap::key_type::wrapped_type key(image, (Il2CppClass*)NULL);\n        ModuleMap::data_type value = NULL;\n        if (s_ModuleMap->TryGetValue(key, &value))\n            return value;\n\n        if (!System_Reflection_Module)\n        {\n#if !NET_4_0\n            System_Reflection_Module = Class::FromName(il2cpp_defaults.corlib, \"System.Reflection\", \"Module\");\n#else\n            System_Reflection_Module = Class::FromName(il2cpp_defaults.corlib, \"System.Reflection\", \"MonoModule\");\n#endif\n        }\n        res = (Il2CppReflectionModule*)Object::New(System_Reflection_Module);\n\n        res->image = image;\n        IL2CPP_OBJECT_SETREF(res, assembly, (Il2CppReflectionAssembly*)Reflection::GetAssemblyObject(MetadataCache::GetAssemblyFromIndex(image->assemblyIndex)));\n\n        IL2CPP_OBJECT_SETREF(res, fqname, String::New(image->name));\n        NOT_IMPLEMENTED_ICALL_NO_ASSERT(Reflection::GetModuleObject, \"Missing Module fields need set\");\n        //basename = g_path_get_basename (image->name);\n        //IL2CPP_OBJECT_SETREF (res, name, String::New (basename));\n        IL2CPP_OBJECT_SETREF(res, name, String::New(image->name));\n        IL2CPP_OBJECT_SETREF(res, scopename, String::New(image->nameNoExt));\n\n        //g_free (basename);\n\n        /*if (image->assembly->image == image) {\n            res->token = mono_metadata_make_token (MONO_TABLE_MODULE, 1);\n        } else {\n            int i;\n            res->token = 0;\n            if (image->assembly->image->modules) {\n                for (i = 0; i < image->assembly->image->module_count; i++) {\n                    if (image->assembly->image->modules [i] == image)\n                        res->token = mono_metadata_make_token (MONO_TABLE_MODULEREF, i + 1);\n                }\n                IL2CPP_ASSERT(res->token);\n            }\n        }*/\n\n        s_ModuleMap->Add(key, res);\n        return res;\n    }\n\n    Il2CppReflectionProperty* Reflection::GetPropertyObject(Il2CppClass *klass, const PropertyInfo *property)\n    {\n        Il2CppReflectionProperty *res;\n        static Il2CppClass *monoproperty_klass;\n\n        il2cpp::os::FastAutoLock lock(&s_ReflectionICallsMutex);\n\n        PropertyMap::key_type::wrapped_type key(property, klass);\n        PropertyMap::data_type value = NULL;\n        if (s_PropertyMap->TryGetValue(key, &value))\n            return value;\n\n        if (!monoproperty_klass)\n            monoproperty_klass = Class::FromName(il2cpp_defaults.corlib, \"System.Reflection\", \"MonoProperty\");\n        res = (Il2CppReflectionProperty*)Object::New(monoproperty_klass);\n        res->klass = klass;\n        res->property = property;\n\n        s_PropertyMap->Add(key, res);\n\n        return res;\n    }\n\n    Il2CppReflectionEvent* Reflection::GetEventObject(Il2CppClass* klass, const EventInfo* event)\n    {\n        Il2CppReflectionEvent* result;\n        static Il2CppClass* monoproperty_klass = Class::FromName(il2cpp_defaults.corlib, \"System.Reflection\", \"MonoEvent\");\n\n        il2cpp::os::FastAutoLock lock(&s_ReflectionICallsMutex);\n\n        EventMap::key_type::wrapped_type key(event, klass);\n        EventMap::data_type value = NULL;\n        if (s_EventMap->TryGetValue(key, &value))\n            return value;\n\n        Il2CppReflectionMonoEvent* monoEvent = reinterpret_cast<Il2CppReflectionMonoEvent*>(Object::New(monoproperty_klass));\n        monoEvent->eventInfo = event;\n        monoEvent->reflectedType = Reflection::GetTypeObject(klass->byval_arg);\n        result = reinterpret_cast<Il2CppReflectionEvent*>(monoEvent);\n\n        s_EventMap->Add(key, result);\n\n        return result;\n    }\n\n    Il2CppReflectionType* Reflection::GetTypeObject(const Il2CppType *type)\n    {\n        il2cpp::os::FastAutoLock lock(&s_ReflectionICallsMutex);\n\n        Il2CppReflectionType* object = NULL;\n        if (s_TypeMap->TryGetValue(type, &object))\n            return object;\n\n        Il2CppReflectionType* typeObject = (Il2CppReflectionType*)Object::New(il2cpp_defaults.monotype_class);\n        typeObject->type = type;\n\n        s_TypeMap->Add(type, typeObject);\n\n        return typeObject;\n    }\n\n    Il2CppObject* Reflection::GetDBNullObject()\n    {\n        Il2CppObject* valueFieldValue;\n        static FieldInfo *dbNullValueField = NULL;\n\n        if (!dbNullValueField)\n        {\n            dbNullValueField = Class::GetFieldFromName(il2cpp_defaults.dbnull_class, \"Value\");\n            IL2CPP_ASSERT(dbNullValueField);\n        }\n\n        valueFieldValue = Field::GetValueObject(dbNullValueField, NULL);\n        IL2CPP_ASSERT(valueFieldValue);\n        return valueFieldValue;\n    }\n\n    static Il2CppObject* GetReflectionMissingObject()\n    {\n        Il2CppObject* valueFieldValue;\n        static FieldInfo *reflectionMissingField = NULL;\n\n        if (!reflectionMissingField)\n        {\n            Il2CppClass* klass = Image::ClassFromName(il2cpp_defaults.corlib, \"System.Reflection\", \"Missing\");\n            Class::Init(klass);\n            reflectionMissingField = Class::GetFieldFromName(klass, \"Value\");\n            IL2CPP_ASSERT(reflectionMissingField);\n        }\n\n        valueFieldValue = Field::GetValueObject(reflectionMissingField, NULL);\n        IL2CPP_ASSERT(valueFieldValue);\n        return valueFieldValue;\n    }\n\n    static Il2CppObject* GetObjectForMissingDefaultValue(uint32_t parameterAttributes)\n    {\n        if (parameterAttributes & PARAM_ATTRIBUTE_OPTIONAL)\n            return GetReflectionMissingObject();\n        else\n            return Reflection::GetDBNullObject();\n    }\n\n    Il2CppArray* Reflection::GetParamObjects(const MethodInfo *method, Il2CppClass *refclass)\n    {\n        static Il2CppClass *System_Reflection_ParameterInfo;\n        static Il2CppClass *System_Reflection_ParameterInfo_array;\n        Il2CppArray *res = NULL;\n        Il2CppReflectionMethod *member = NULL;\n\n        il2cpp::os::FastAutoLock lock(&s_ReflectionICallsMutex);\n\n        NOT_IMPLEMENTED_NO_ASSERT(Reflection::GetParamObjects, \"Work in progress!\");\n\n        if (!System_Reflection_ParameterInfo_array)\n        {\n            Il2CppClass *klass;\n\n#if !NET_4_0\n            klass = il2cpp_defaults.parameter_info_class;\n#else\n            klass = il2cpp_defaults.mono_parameter_info_class;\n#endif\n            //mono_memory_barrier ();\n            System_Reflection_ParameterInfo = klass;\n\n            klass = Class::GetArrayClass(klass, 1);\n            //mono_memory_barrier ();\n            System_Reflection_ParameterInfo_array = klass;\n        }\n\n        if (!method->parameters_count)\n            return Array::NewSpecific(System_Reflection_ParameterInfo_array, 0);\n\n        // Mono caches based on the address of the method pointer in the MethodInfo\n        // since they put everything in one cache and the MethodInfo is already used as key for GetMethodObject caching\n        // However, since we have distinct maps for the different types we can use MethodInfo as the key again\n\n        ParametersMap::key_type::wrapped_type key(method, refclass);\n        ParametersMap::data_type value;\n        if (s_ParametersMap->TryGetValue(key, &value))\n            return value;\n\n        member = GetMethodObject(method, refclass);\n        res = Array::NewSpecific(System_Reflection_ParameterInfo_array, method->parameters_count);\n        for (int i = 0; i < method->parameters_count; ++i)\n        {\n            Il2CppReflectionParameter* param = (Il2CppReflectionParameter*)Object::New(System_Reflection_ParameterInfo);\n            IL2CPP_OBJECT_SETREF(param, ClassImpl, GetTypeObject(method->parameters[i].parameter_type));\n            IL2CPP_OBJECT_SETREF(param, MemberImpl, (Il2CppObject*)member);\n            IL2CPP_OBJECT_SETREF(param, NameImpl, method->parameters[i].name ? String::New(method->parameters[i].name) : NULL);\n            param->PositionImpl = i;\n            param->AttrsImpl = method->parameters[i].parameter_type->attrs;\n\n            Il2CppObject* defaultValue = NULL;\n            if (param->AttrsImpl & PARAM_ATTRIBUTE_HAS_DEFAULT)\n            {\n                bool isExplicitySetNullDefaultValue = false;\n                defaultValue = Parameter::GetDefaultParameterValueObject(method, &method->parameters[i], &isExplicitySetNullDefaultValue);\n                if (defaultValue == NULL && !isExplicitySetNullDefaultValue)\n                    defaultValue = GetObjectForMissingDefaultValue(param->AttrsImpl);\n            }\n            else\n            {\n                defaultValue = GetObjectForMissingDefaultValue(param->AttrsImpl);\n            }\n\n            IL2CPP_OBJECT_SETREF(param, DefaultValueImpl, defaultValue);\n\n            il2cpp_array_setref(res, i, param);\n        }\n\n        s_ParametersMap->Add(key, res);\n\n        return res;\n    }\n\n// TODO: move this somewhere else\n    bool Reflection::IsType(Il2CppObject *obj)\n    {\n        if (obj->klass->image == il2cpp_defaults.corlib)\n            return strcmp(obj->klass->name, \"MonoType\") == 0 && strcmp(obj->klass->namespaze, \"System\") == 0;\n        return false;\n    }\n\n    static bool IsMethod(Il2CppObject *obj)\n    {\n        if (obj->klass->image == il2cpp_defaults.corlib)\n            return strcmp(obj->klass->name, \"MonoMethod\") == 0 && strcmp(obj->klass->namespaze, \"System.Reflection\") == 0;\n        return false;\n    }\n\n    static bool IsCMethod(Il2CppObject *obj)\n    {\n        if (obj->klass->image == il2cpp_defaults.corlib)\n            return strcmp(obj->klass->name, \"MonoCMethod\") == 0 && strcmp(obj->klass->namespaze, \"System.Reflection\") == 0;\n        return false;\n    }\n\n    static bool IsGenericMethod(Il2CppObject *obj)\n    {\n        if (obj->klass->image == il2cpp_defaults.corlib)\n            return strcmp(obj->klass->name, \"MonoGenericMethod\") == 0 && strcmp(obj->klass->namespaze, \"System.Reflection\") == 0;\n        return false;\n    }\n\n    static bool IsGenericCMethod(Il2CppObject *obj)\n    {\n        if (obj->klass->image == il2cpp_defaults.corlib)\n            return strcmp(obj->klass->name, \"MonoGenericCMethod\") == 0 && strcmp(obj->klass->namespaze, \"System.Reflection\") == 0;\n        return false;\n    }\n\n    bool Reflection::IsAnyMethod(Il2CppObject *obj)\n    {\n        return IsMethod(obj) || IsCMethod(obj) || IsGenericMethod(obj) || IsGenericCMethod(obj);\n    }\n\n    bool Reflection::IsField(Il2CppObject *obj)\n    {\n        if (obj->klass->image == il2cpp_defaults.corlib)\n            return strcmp(obj->klass->name, \"MonoField\") == 0 && strcmp(obj->klass->namespaze, \"System.Reflection\") == 0;\n        return false;\n    }\n\n    bool Reflection::IsProperty(Il2CppObject *obj)\n    {\n        if (obj->klass->image == il2cpp_defaults.corlib)\n            return strcmp(obj->klass->name, \"MonoProperty\") == 0 && strcmp(obj->klass->namespaze, \"System.Reflection\") == 0;\n        return false;\n    }\n\n    bool Reflection::IsEvent(Il2CppObject *obj)\n    {\n        if (obj->klass->image == il2cpp_defaults.corlib)\n            return strcmp(obj->klass->name, \"MonoEvent\") == 0 && strcmp(obj->klass->namespaze, \"System.Reflection\") == 0;\n        return false;\n    }\n\n    static bool IsParameter(Il2CppObject *obj)\n    {\n        if (obj->klass->image == il2cpp_defaults.corlib)\n#if !NET_4_0\n            return obj->klass == il2cpp_defaults.parameter_info_class;\n#else\n            return obj->klass == il2cpp_defaults.mono_parameter_info_class;\n#endif\n        return false;\n    }\n\n    static bool IsAssembly(Il2CppObject *obj)\n    {\n        if (obj->klass->image == il2cpp_defaults.corlib)\n#if !NET_4_0\n            return obj->klass == il2cpp_defaults.assembly_class;\n#else\n            return obj->klass == il2cpp_defaults.mono_assembly_class;\n#endif\n        return false;\n    }\n\n    CustomAttributesCache* Reflection::GetCustomAttributesCacheFor(Il2CppClass *klass)\n    {\n        return MetadataCache::GenerateCustomAttributesCache(klass->customAttributeIndex);\n    }\n\n    CustomAttributesCache* Reflection::GetCustomAttributesCacheFor(const MethodInfo *method)\n    {\n        return MetadataCache::GenerateCustomAttributesCache(method->customAttributeIndex);\n    }\n\n    CustomAttributesCache* Reflection::GetCustomAttributesCacheFor(const PropertyInfo *property)\n    {\n        return MetadataCache::GenerateCustomAttributesCache(property->customAttributeIndex);\n    }\n\n    CustomAttributesCache* Reflection::GetCustomAttributesCacheFor(FieldInfo *field)\n    {\n        return MetadataCache::GenerateCustomAttributesCache(field->customAttributeIndex);\n    }\n\n    CustomAttributesCache* Reflection::GetCustomAttributesCacheFor(const EventInfo *event)\n    {\n        return MetadataCache::GenerateCustomAttributesCache(event->customAttributeIndex);\n    }\n\n    CustomAttributesCache* Reflection::GetCustomAttributesCacheFor(Il2CppReflectionParameter *parameter)\n    {\n        Il2CppReflectionMethod* method = (Il2CppReflectionMethod*)parameter->MemberImpl;\n\n        if (method->method->parameters == NULL)\n            return NULL;\n\n        NOT_IMPLEMENTED_NO_ASSERT(Reflection::GetCustomAttributesCacheFor, \"-1 represents the return value. Need to emit custom attribute information for that.\")\n        if (parameter->PositionImpl == -1)\n            return NULL;\n\n        const ::ParameterInfo* info = &method->method->parameters[parameter->PositionImpl];\n        return MetadataCache::GenerateCustomAttributesCache(info->customAttributeIndex);\n    }\n\n    CustomAttributeTypeCache* Reflection::GetCustomAttributeTypeCacheFor(Il2CppReflectionParameter *parameter)\n    {\n        Il2CppReflectionMethod* method = (Il2CppReflectionMethod*)parameter->MemberImpl;\n\n        if (method->method->parameters == NULL)\n            return NULL;\n\n        NOT_IMPLEMENTED_NO_ASSERT(Reflection::GetCustomAttributeTypeCacheFor, \"-1 represents the return value. Need to emit custom attribute information for that.\")\n        if (parameter->PositionImpl == -1)\n            return NULL;\n\n        const ::ParameterInfo* info = &method->method->parameters[parameter->PositionImpl];\n        return MetadataCache::GenerateCustomAttributeTypeCache(info->customAttributeIndex);\n    }\n\n    CustomAttributesCache* Reflection::GetCustomAttributesCacheFor(const Il2CppAssembly *assembly)\n    {\n        return MetadataCache::GenerateCustomAttributesCache(assembly->customAttributeIndex);\n    }\n\n    CustomAttributesCache* Reflection::GetCustomAttrsInfo(Il2CppObject *obj)\n    {\n        if (IsMethod(obj) || IsCMethod(obj) || IsGenericMethod(obj) || IsGenericCMethod(obj))\n            return GetCustomAttributesCacheFor(((Il2CppReflectionMethod*)obj)->method);\n\n        if (IsProperty(obj))\n            return GetCustomAttributesCacheFor(((Il2CppReflectionProperty*)obj)->property);\n\n        if (IsField(obj))\n            return GetCustomAttributesCacheFor(((Il2CppReflectionField*)obj)->field);\n\n        if (IsEvent(obj))\n            return GetCustomAttributesCacheFor(((Il2CppReflectionMonoEvent*)obj)->eventInfo);\n\n        if (IsParameter(obj))\n            return GetCustomAttributesCacheFor(((Il2CppReflectionParameter*)obj));\n\n        if (IsAssembly(obj))\n            return GetCustomAttributesCacheFor(((Il2CppReflectionAssembly*)obj)->assembly);\n\n        Il2CppClass *klass = IsType(obj)\n            ? Class::FromSystemType((Il2CppReflectionType*)obj)\n            : obj->klass;\n\n        return GetCustomAttributesCacheFor(klass);\n    }\n\n    CustomAttributeTypeCache* Reflection::GetCustomAttrsTypeInfo(Il2CppObject *obj)\n    {\n        if (IsMethod(obj) || IsCMethod(obj) || IsGenericMethod(obj) || IsGenericCMethod(obj))\n            return MetadataCache::GenerateCustomAttributeTypeCache((((Il2CppReflectionMethod*)obj)->method)->customAttributeIndex);\n\n        if (IsProperty(obj))\n            return MetadataCache::GenerateCustomAttributeTypeCache((((Il2CppReflectionProperty*)obj)->property)->customAttributeIndex);\n\n        if (IsField(obj))\n            return MetadataCache::GenerateCustomAttributeTypeCache((((Il2CppReflectionField*)obj)->field)->customAttributeIndex);\n\n        if (IsEvent(obj))\n            return MetadataCache::GenerateCustomAttributeTypeCache((((Il2CppReflectionMonoEvent*)obj)->eventInfo)->customAttributeIndex);\n\n        if (IsParameter(obj))\n            return GetCustomAttributeTypeCacheFor((Il2CppReflectionParameter*)obj);\n\n        if (IsAssembly(obj))\n            return MetadataCache::GenerateCustomAttributeTypeCache((((Il2CppReflectionAssembly*)obj)->assembly)->customAttributeIndex);\n\n        Il2CppClass *klass = IsType(obj)\n            ? Class::FromSystemType((Il2CppReflectionType*)obj)\n            : obj->klass;\n\n        return MetadataCache::GenerateCustomAttributeTypeCache(klass->customAttributeIndex);\n    }\n\n    void Reflection::Initialize()\n    {\n        s_AssemblyMap = new AssemblyMap();\n        s_FieldMap = new FieldMap();\n        s_PropertyMap = new PropertyMap();\n        s_EventMap = new EventMap();\n        s_MethodMap = new MethodMap();\n        s_ModuleMap = new ModuleMap();\n        s_ParametersMap = new ParametersMap();\n        s_TypeMap = new TypeMap();\n        s_MonoGenericParamterMap = new MonoGenericParameterMap();\n        s_MonoAssemblyNameMap = new MonoAssemblyNameMap();\n    }\n\n    bool Reflection::CustomAttrsHasAttr(CustomAttributeTypeCache *ainfo, Il2CppClass *attr_klass)\n    {\n        IL2CPP_ASSERT(ainfo);\n        IL2CPP_ASSERT(attr_klass);\n\n        int i;\n        Il2CppClass *klass;\n\n        for (i = 0; i < ainfo->count; ++i)\n        {\n            klass = ainfo->attributeTypes[i];\n\n            if (Class::HasParent(klass, attr_klass) || (Class::IsInterface(attr_klass) && Class::IsAssignableFrom(attr_klass, klass)))\n                return true;\n        }\n        return false;\n    }\n\n    bool Reflection::HasAttribute(Il2CppObject *obj, Il2CppClass *attribute)\n    {\n        CustomAttributeTypeCache* attrs = GetCustomAttrsTypeInfo(obj);\n        if (!attrs)\n            return false;\n\n        return CustomAttrsHasAttr(attrs, attribute);\n    }\n\n    bool Reflection::HasAttribute(FieldInfo *field, Il2CppClass *attribute)\n    {\n        CustomAttributeTypeCache* attrs = MetadataCache::GenerateCustomAttributeTypeCache(field->customAttributeIndex);\n        if (!attrs)\n            return false;\n\n\n        return CustomAttrsHasAttr(attrs, attribute);\n    }\n\n    bool Reflection::HasAttribute(const MethodInfo *method, Il2CppClass *attribute)\n    {\n        CustomAttributeTypeCache* attrs = MetadataCache::GenerateCustomAttributeTypeCache(method->customAttributeIndex);\n        if (!attrs)\n            return false;\n\n        return CustomAttrsHasAttr(attrs, attribute);\n    }\n\n    bool Reflection::HasAttribute(Il2CppClass *klass, Il2CppClass *attribute)\n    {\n        CustomAttributeTypeCache* attrs = MetadataCache::GenerateCustomAttributeTypeCache(klass->customAttributeIndex);\n        if (!attrs)\n            return false;\n\n        return CustomAttrsHasAttr(attrs, attribute);\n    }\n\n    Il2CppClass* Reflection::TypeGetHandle(Il2CppReflectionType* ref)\n    {\n        if (!ref)\n            return NULL;\n\n        return Class::FromSystemType(ref);\n    }\n\n    const MonoGenericParameterInfo* Reflection::GetMonoGenericParameterInfo(const Il2CppGenericParameter *param)\n    {\n        MonoGenericParameterMap::const_iterator it = s_MonoGenericParamterMap->find(param);\n        if (it == s_MonoGenericParamterMap->end())\n            return NULL;\n\n        return it->second;\n    }\n\n    void Reflection::SetMonoGenericParameterInfo(const Il2CppGenericParameter *param, const MonoGenericParameterInfo *monoParam)\n    {\n        s_MonoGenericParamterMap->insert(std::make_pair(param, monoParam));\n    }\n\n    const Il2CppMonoAssemblyName* Reflection::GetMonoAssemblyName(const Il2CppAssembly *assembly)\n    {\n        MonoAssemblyNameMap::const_iterator it = s_MonoAssemblyNameMap->find(assembly);\n        if (it == s_MonoAssemblyNameMap->end())\n            return NULL;\n\n        return it->second;\n    }\n\n    void Reflection::SetMonoAssemblyName(const Il2CppAssembly *assembly, const Il2CppMonoAssemblyName *aname)\n    {\n        s_MonoAssemblyNameMap->insert(std::make_pair(assembly, aname));\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Reflection.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n\nstruct Il2CppString;\nstruct Il2CppArray;\nstruct Il2CppReflectionAssembly;\nstruct Il2CppReflectionAssemblyName;\nstruct Il2CppReflectionField;\nstruct Il2CppReflectionMethod;\nstruct Il2CppReflectionModule;\nstruct Il2CppReflectionProperty;\nstruct Il2CppReflectionEvent;\nstruct Il2CppReflectionType;\nstruct Il2CppReflectionParameter;\nstruct Il2CppClass;\nstruct FieldInfo;\nstruct MethodInfo;\nstruct PropertyInfo;\nstruct EventInfo;\nstruct Il2CppClass;\nstruct CustomAttributesCache;\nstruct CustomAttributeTypeCache;\nstruct Il2CppAssembly;\nstruct Il2CppAssemblyName;\nstruct Il2CppImage;\nstruct Il2CppType;\nstruct Il2CppObject;\nstruct MonoGenericParameterInfo;\nstruct Il2CppGenericParameter;\nstruct Il2CppMonoAssemblyName;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Reflection\n    {\n// exported\n    public:\n        static Il2CppReflectionAssembly* GetAssemblyObject(const Il2CppAssembly *assembly);\n        static Il2CppReflectionAssemblyName* GetAssemblyNameObject(const Il2CppAssemblyName *assemblyName);\n        static Il2CppReflectionField* GetFieldObject(Il2CppClass *klass, FieldInfo *field);\n        static Il2CppReflectionProperty* GetPropertyObject(Il2CppClass *klass, const PropertyInfo *property);\n        static Il2CppReflectionEvent* GetEventObject(Il2CppClass *klass, const EventInfo *event);\n        static Il2CppReflectionMethod* GetMethodObject(const MethodInfo *method, Il2CppClass *refclass);\n        static Il2CppReflectionModule* GetModuleObject(const Il2CppImage *image);\n        static Il2CppReflectionType* GetTypeObject(const Il2CppType *type);\n        static Il2CppArray* GetParamObjects(const MethodInfo *method, Il2CppClass *refclass);\n        static CustomAttributesCache* GetCustomAttrsInfo(Il2CppObject *obj);\n        static const MonoGenericParameterInfo* GetMonoGenericParameterInfo(const Il2CppGenericParameter *param);\n        static void SetMonoGenericParameterInfo(const Il2CppGenericParameter *param, const MonoGenericParameterInfo *monoParam);\n        static const Il2CppMonoAssemblyName* GetMonoAssemblyName(const Il2CppAssembly *assembly);\n        static void SetMonoAssemblyName(const Il2CppAssembly *assembly, const Il2CppMonoAssemblyName *aname);\n\n        static bool HasAttribute(Il2CppObject *obj, Il2CppClass *attribute);\n        static bool HasAttribute(FieldInfo *field, Il2CppClass *attribute);\n        static bool HasAttribute(const MethodInfo *method, Il2CppClass *attribute);\n        static bool HasAttribute(Il2CppClass *klass, Il2CppClass *attribute);\n\n        static bool IsType(Il2CppObject *obj);\n        static bool IsField(Il2CppObject *obj);\n        static bool IsAnyMethod(Il2CppObject *obj);\n        static bool IsProperty(Il2CppObject *obj);\n        static bool IsEvent(Il2CppObject *obj);\n\n// internal\n    public:\n        static void Initialize();\n        static bool CustomAttrsHasAttr(CustomAttributeTypeCache *ainfo, Il2CppClass *attr_klass);\n        static Il2CppClass* TypeGetHandle(Il2CppReflectionType* ref);\n        static Il2CppObject* GetDBNullObject();\n\n    private:\n        static CustomAttributeTypeCache* GetCustomAttrsTypeInfo(Il2CppObject *obj);\n        static CustomAttributeTypeCache* GetCustomAttributeTypeCacheFor(Il2CppReflectionParameter *parameter);\n        static CustomAttributesCache* GetCustomAttributesCacheFor(Il2CppClass *klass);\n        static CustomAttributesCache* GetCustomAttributesCacheFor(const MethodInfo *method);\n        static CustomAttributesCache* GetCustomAttributesCacheFor(const PropertyInfo *property);\n        static CustomAttributesCache* GetCustomAttributesCacheFor(FieldInfo *field);\n        static CustomAttributesCache* GetCustomAttributesCacheFor(const EventInfo *event);\n        static CustomAttributesCache* GetCustomAttributesCacheFor(Il2CppReflectionParameter *param);\n        static CustomAttributesCache* GetCustomAttributesCacheFor(const Il2CppAssembly *assembly);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Runtime.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/Environment.h\"\n#include \"os/File.h\"\n#include \"os/Image.h\"\n#include \"os/Initialize.h\"\n#include \"os/LibraryLoader.h\"\n#include \"os/Locale.h\"\n#include \"os/MemoryMappedFile.h\"\n#include \"os/Mutex.h\"\n#include \"os/Path.h\"\n#include \"os/Thread.h\"\n#include \"os/Socket.h\"\n#include \"vm/Array.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/Class.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Field.h\"\n#include \"vm/Image.h\"\n#include \"vm/LastError.h\"\n#include \"vm/MetadataAlloc.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/MetadataLock.h\"\n#include \"vm/Method.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/Thread.h\"\n#include \"vm/ThreadPool.h\"\n#include \"vm/Type.h\"\n#include \"vm/String.h\"\n#include \"vm/Object.h\"\n#include <string>\n#include <map>\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"tabledefs.h\"\n#include \"gc/GarbageCollector.h\"\n#include \"vm/InternalCalls.h\"\n#include \"utils/Collections.h\"\n#include \"utils/Memory.h\"\n#include \"utils/RegisterRuntimeInitializeAndCleanup.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/PathUtils.h\"\n#include \"utils/Runtime.h\"\n#include \"utils/Environment.h\"\n#include \"mono/ThreadPool/threadpool-ms.h\"\n#include \"mono/ThreadPool/threadpool-ms-io.h\"\n//#include \"icalls/mscorlib/System.Reflection/Assembly.h\"\n\n#if IL2CPP_DEBUGGER_ENABLED\n    #include \"il2cpp-debugger.h\"\n#endif\n\nusing il2cpp::metadata::GenericMethod;\nusing il2cpp::utils::StringUtils;\n\nIl2CppIntPtr Il2CppIntPtr::Zero;\nIl2CppDefaults il2cpp_defaults;\nbool g_il2cpp_is_fully_initialized = false;\nstatic bool shutting_down = false;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    il2cpp::os::FastMutex g_MetadataLock;\n\n    static std::string s_ConfigDir;\n    static const char *s_FrameworkVersion = 0;\n    static const char *s_BundledMachineConfig = 0;\n    static Il2CppRuntimeUnhandledExceptionPolicy s_UnhandledExceptionPolicy = IL2CPP_UNHANDLED_POLICY_CURRENT;\n\n#define DEFAULTS_INIT(field, ns, n) do { il2cpp_defaults.field = Class::FromName (il2cpp_defaults.corlib, ns, n);\\\n    IL2CPP_ASSERT(il2cpp_defaults.field); } while (0)\n\n#define DEFAULTS_INIT_TYPE(field, ns, n, nativetype) do { DEFAULTS_INIT(field, ns, n); \\\n    IL2CPP_ASSERT(il2cpp_defaults.field->instance_size == sizeof(nativetype) + (il2cpp_defaults.field->valuetype ? sizeof(Il2CppObject) : 0)); } while (0)\n\n    char* basepath(const char* path)\n    {\n        std::string original_path(path);\n        size_t position_of_last_separator = original_path.find_last_of(IL2CPP_DIR_SEPARATOR);\n\n        return il2cpp::utils::StringUtils::StringDuplicate(original_path.substr(position_of_last_separator + 1).c_str());\n    }\n\n    static const char *framework_version_for(const char *runtime_version)\n    {\n        IL2CPP_ASSERT(runtime_version && \"Invalid runtime version\");\n\n#if NET_4_0\n        IL2CPP_ASSERT((strstr(runtime_version, \"v4.0\") == runtime_version) && \"Invalid runtime version\");\n        return \"4.0\";\n#else\n        IL2CPP_ASSERT((strstr(runtime_version, \"v2.0\") == runtime_version) && \"Invalid runtime version\");\n        return \"2.0\";\n#endif\n    }\n\n    static void SanityChecks()\n    {\n#if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT\n        IL2CPP_ASSERT(ALIGN_OF(int64_t) == 8);\n#endif\n    }\n\n#if NET_4_0\n    static inline void InitializeStringEmpty()\n    {\n        Class::Init(il2cpp_defaults.string_class);\n        FieldInfo* stringEmptyField = Class::GetFieldFromName(il2cpp_defaults.string_class, \"Empty\");\n        Field::StaticSetValue(stringEmptyField, String::Empty());\n    }\n\n#endif\n\n    void Runtime::Init(const char* filename, const char *runtime_version)\n    {\n        SanityChecks();\n\n        os::Initialize();\n        os::Locale::Initialize();\n        MetadataAllocInitialize();\n\n        s_FrameworkVersion = framework_version_for(runtime_version);\n\n        os::Thread::Init();\n\n        il2cpp::utils::RegisterRuntimeInitializeAndCleanup::ExecuteInitializations();\n\n        MetadataCache::Initialize();\n        Assembly::Initialize();\n        gc::GarbageCollector::Initialize();\n\n        // Thread needs GC initialized\n        Thread::Initialize();\n\n        // Reflection needs GC initialized\n        Reflection::Initialize();\n\n        memset(&il2cpp_defaults, 0, sizeof(Il2CppDefaults));\n\n        const Il2CppAssembly* assembly = Assembly::Load(\"mscorlib.dll\");\n\n        // It is not possible to use DEFAULTS_INIT_TYPE for managed types for which we have a native struct, if the\n        // native struct does not map the complete managed type.\n        // Which is the case for: Il2CppThread, Il2CppAppDomain, Il2CppCultureInfo, Il2CppReflectionProperty,\n        // Il2CppDateTimeFormatInfo, Il2CppNumberFormatInfo\n\n        il2cpp_defaults.corlib = Assembly::GetImage(assembly);\n        DEFAULTS_INIT(object_class, \"System\", \"Object\");\n        DEFAULTS_INIT(void_class, \"System\", \"Void\");\n        DEFAULTS_INIT_TYPE(boolean_class, \"System\", \"Boolean\", bool);\n        DEFAULTS_INIT_TYPE(byte_class, \"System\", \"Byte\", uint8_t);\n        DEFAULTS_INIT_TYPE(sbyte_class, \"System\", \"SByte\", int8_t);\n        DEFAULTS_INIT_TYPE(int16_class, \"System\", \"Int16\", int16_t);\n        DEFAULTS_INIT_TYPE(uint16_class, \"System\", \"UInt16\", uint16_t);\n        DEFAULTS_INIT_TYPE(int32_class, \"System\", \"Int32\", int32_t);\n        DEFAULTS_INIT_TYPE(uint32_class, \"System\", \"UInt32\", uint32_t);\n        DEFAULTS_INIT(uint_class, \"System\", \"UIntPtr\");\n        DEFAULTS_INIT_TYPE(int_class, \"System\", \"IntPtr\", Il2CppIntPtr);\n        DEFAULTS_INIT_TYPE(int64_class, \"System\", \"Int64\", int64_t);\n        DEFAULTS_INIT_TYPE(uint64_class, \"System\", \"UInt64\", uint64_t);\n        DEFAULTS_INIT_TYPE(single_class, \"System\", \"Single\", float);\n        DEFAULTS_INIT_TYPE(double_class, \"System\", \"Double\", double);\n        DEFAULTS_INIT_TYPE(char_class, \"System\", \"Char\", Il2CppChar);\n        DEFAULTS_INIT(string_class, \"System\", \"String\");\n        DEFAULTS_INIT(enum_class, \"System\", \"Enum\");\n        DEFAULTS_INIT(array_class, \"System\", \"Array\");\n        DEFAULTS_INIT_TYPE(delegate_class, \"System\", \"Delegate\", Il2CppDelegate);\n#if !NET_4_0\n        DEFAULTS_INIT(multicastdelegate_class, \"System\", \"MulticastDelegate\");\n#else\n        DEFAULTS_INIT_TYPE(multicastdelegate_class, \"System\", \"MulticastDelegate\", Il2CppMulticastDelegate);\n#endif\n        DEFAULTS_INIT(asyncresult_class, \"System.Runtime.Remoting.Messaging\", \"AsyncResult\");\n        DEFAULTS_INIT_TYPE(async_call_class, \"System\", \"MonoAsyncCall\", Il2CppAsyncCall);\n        DEFAULTS_INIT(manualresetevent_class, \"System.Threading\", \"ManualResetEvent\");\n        //DEFAULTS_INIT(typehandle_class, \"System\", \"RuntimeTypeHandle\");\n        //DEFAULTS_INIT(methodhandle_class, \"System\", \"RuntimeMethodHandle\");\n        //DEFAULTS_INIT(fieldhandle_class, \"System\", \"RuntimeFieldHandle\");\n        DEFAULTS_INIT(systemtype_class, \"System\", \"Type\");\n        DEFAULTS_INIT_TYPE(monotype_class, \"System\", \"MonoType\", Il2CppReflectionMonoType);\n        //DEFAULTS_INIT(exception_class, \"System\", \"Exception\");\n        //DEFAULTS_INIT(threadabortexcepXtion_class, \"System.Threading\", \"ThreadAbortException\");\n        DEFAULTS_INIT_TYPE(thread_class, \"System.Threading\", \"Thread\", Il2CppThread);\n#if NET_4_0\n        DEFAULTS_INIT_TYPE(internal_thread_class, \"System.Threading\", \"InternalThread\", Il2CppInternalThread);\n        DEFAULTS_INIT_TYPE(runtimetype_class, \"System\", \"RuntimeType\", Il2CppReflectionRuntimeType);\n#endif\n        DEFAULTS_INIT(appdomain_class, \"System\", \"AppDomain\");\n        DEFAULTS_INIT(appdomain_setup_class, \"System\", \"AppDomainSetup\");\n        DEFAULTS_INIT(field_info_class, \"System.Reflection\", \"FieldInfo\");\n        DEFAULTS_INIT(method_info_class, \"System.Reflection\", \"MethodInfo\");\n        DEFAULTS_INIT(property_info_class, \"System.Reflection\", \"PropertyInfo\");\n        DEFAULTS_INIT_TYPE(event_info_class, \"System.Reflection\", \"EventInfo\", Il2CppReflectionEvent);\n        DEFAULTS_INIT_TYPE(mono_event_info_class, \"System.Reflection\", \"MonoEventInfo\", Il2CppReflectionMonoEventInfo);\n        DEFAULTS_INIT_TYPE(stringbuilder_class, \"System.Text\", \"StringBuilder\", Il2CppStringBuilder);\n        DEFAULTS_INIT_TYPE(stack_frame_class, \"System.Diagnostics\", \"StackFrame\", Il2CppStackFrame);\n        DEFAULTS_INIT(stack_trace_class, \"System.Diagnostics\", \"StackTrace\");\n        DEFAULTS_INIT_TYPE(typed_reference_class, \"System\", \"TypedReference\", Il2CppTypedRef);\n        DEFAULTS_INIT(generic_ilist_class, \"System.Collections.Generic\", \"IList`1\");\n        DEFAULTS_INIT(generic_icollection_class, \"System.Collections.Generic\", \"ICollection`1\");\n        DEFAULTS_INIT(generic_ienumerable_class, \"System.Collections.Generic\", \"IEnumerable`1\");\n#if NET_4_0\n        DEFAULTS_INIT(generic_ireadonlylist_class, \"System.Collections.Generic\", \"IReadOnlyList`1\");\n        DEFAULTS_INIT(generic_ireadonlycollection_class, \"System.Collections.Generic\", \"IReadOnlyCollection`1\");\n#endif\n        DEFAULTS_INIT(generic_nullable_class, \"System\", \"Nullable`1\");\n        DEFAULTS_INIT(version, \"System\", \"Version\");\n        DEFAULTS_INIT(culture_info, \"System.Globalization\", \"CultureInfo\");\n        DEFAULTS_INIT_TYPE(assembly_class, \"System.Reflection\", \"Assembly\", Il2CppReflectionAssembly);\n        DEFAULTS_INIT_TYPE(assembly_name_class, \"System.Reflection\", \"AssemblyName\", Il2CppReflectionAssemblyName);\n#if NET_4_0\n        DEFAULTS_INIT_TYPE(mono_assembly_class, \"System.Reflection\", \"MonoAssembly\", Il2CppReflectionAssembly);\n#endif\n#if !NET_4_0\n        DEFAULTS_INIT_TYPE(enum_info_class, \"System\", \"MonoEnumInfo\", Il2CppEnumInfo);\n#endif\n        DEFAULTS_INIT_TYPE(mono_field_class, \"System.Reflection\", \"MonoField\", Il2CppReflectionField);\n        DEFAULTS_INIT_TYPE(mono_method_class, \"System.Reflection\", \"MonoMethod\", Il2CppReflectionMethod);\n        DEFAULTS_INIT_TYPE(mono_method_info_class, \"System.Reflection\", \"MonoMethodInfo\", Il2CppMethodInfo);\n        DEFAULTS_INIT_TYPE(mono_property_info_class, \"System.Reflection\", \"MonoPropertyInfo\", Il2CppPropertyInfo);\n        DEFAULTS_INIT_TYPE(parameter_info_class, \"System.Reflection\", \"ParameterInfo\", Il2CppReflectionParameter);\n#if NET_4_0\n        DEFAULTS_INIT_TYPE(mono_parameter_info_class, \"System.Reflection\", \"MonoParameterInfo\", Il2CppReflectionParameter);\n#endif\n        DEFAULTS_INIT_TYPE(module_class, \"System.Reflection\", \"Module\", Il2CppReflectionModule);\n        DEFAULTS_INIT_TYPE(marshal_class, \"System.Reflection.Emit\", \"UnmanagedMarshal\", Il2CppReflectionMarshal);\n        DEFAULTS_INIT_TYPE(pointer_class, \"System.Reflection\", \"Pointer\", Il2CppReflectionPointer);\n        DEFAULTS_INIT_TYPE(exception_class, \"System\", \"Exception\", Il2CppException);\n        DEFAULTS_INIT_TYPE(system_exception_class, \"System\", \"SystemException\", Il2CppSystemException);\n        DEFAULTS_INIT_TYPE(argument_exception_class, \"System\", \"ArgumentException\", Il2CppArgumentException);\n        DEFAULTS_INIT_TYPE(marshalbyrefobject_class, \"System\", \"MarshalByRefObject\", Il2CppMarshalByRefObject);\n        DEFAULTS_INIT_TYPE(il2cpp_com_object_class, \"System\", \"__Il2CppComObject\", Il2CppComObject);\n        DEFAULTS_INIT_TYPE(safe_handle_class, \"System.Runtime.InteropServices\", \"SafeHandle\", Il2CppSafeHandle);\n        DEFAULTS_INIT_TYPE(sort_key_class, \"System.Globalization\", \"SortKey\", Il2CppSortKey);\n        DEFAULTS_INIT(dbnull_class, \"System\", \"DBNull\");\n        DEFAULTS_INIT_TYPE(error_wrapper_class, \"System.Runtime.InteropServices\", \"ErrorWrapper\", Il2CppErrorWrapper);\n        DEFAULTS_INIT(missing_class, \"System.Reflection\", \"Missing\");\n        DEFAULTS_INIT(customattribute_data_class, \"System.Reflection\", \"CustomAttributeData\");\n        DEFAULTS_INIT(value_type_class, \"System\", \"ValueType\");\n        DEFAULTS_INIT(key_value_pair_class, \"System.Collections.Generic\", \"KeyValuePair`2\");\n\n#if NET_4_0\n        DEFAULTS_INIT(threadpool_wait_callback_class, \"System.Threading\", \"_ThreadPoolWaitCallback\");\n        DEFAULTS_INIT(mono_method_message_class, \"System.Runtime.Remoting.Messaging\", \"MonoMethodMessage\");\n\n        il2cpp_defaults.threadpool_perform_wait_callback_method = (MethodInfo*)vm::Class::GetMethodFromName(\n                il2cpp_defaults.threadpool_wait_callback_class, \"PerformWaitCallback\", 0);\n#endif\n\n        const Il2CppAssembly* systemDll = Assembly::Load(\"System\");\n        if (systemDll != NULL)\n            il2cpp_defaults.system_uri_class = Class::FromName(Assembly::GetImage(systemDll), \"System\", \"Uri\");\n\n        // This will only exist if there was at least 1 winmd file present during conversion\n        const Il2CppAssembly* windowsRuntimeMetadataAssembly = Assembly::Load(\"WindowsRuntimeMetadata\");\n        if (windowsRuntimeMetadataAssembly != NULL)\n        {\n            const Il2CppImage* windowsRuntimeMetadataImage = Assembly::GetImage(windowsRuntimeMetadataAssembly);\n            il2cpp_defaults.ireference_class = Class::FromName(windowsRuntimeMetadataImage, \"Windows.Foundation\", \"IReference`1\");\n            il2cpp_defaults.ikey_value_pair_class = Class::FromName(windowsRuntimeMetadataImage, \"Windows.Foundation.Collections\", \"IKeyValuePair`2\");\n            il2cpp_defaults.ikey_value_pair_class = Class::FromName(windowsRuntimeMetadataImage, \"Windows.Foundation.Collections\", \"IKeyValuePair`2\");\n            il2cpp_defaults.windows_foundation_uri_class = Class::FromName(windowsRuntimeMetadataImage, \"Windows.Foundation\", \"Uri\");\n            il2cpp_defaults.windows_foundation_iuri_runtime_class_class = Class::FromName(windowsRuntimeMetadataImage, \"Windows.Foundation\", \"IUriRuntimeClass\");\n        }\n\n        Class::Init(il2cpp_defaults.string_class);\n\n        Il2CppDomain* domain = Domain::GetCurrent();\n\n        Thread::Attach(domain);\n\n        Il2CppAppDomainSetup* setup = (Il2CppAppDomainSetup*)Object::NewPinned(il2cpp_defaults.appdomain_setup_class);\n\n        Il2CppAppDomain* ad = (Il2CppAppDomain*)Object::NewPinned(il2cpp_defaults.appdomain_class);\n        ad->data = domain;\n        domain->domain = ad;\n        domain->setup = setup;\n        domain->domain_id = 1; // Only have a single domain ATM.\n\n        domain->friendly_name = basepath(filename);\n\n#if IL2CPP_DEBUGGER_ENABLED\n        // The current thread needs to be attached before sending any debugger event.\n        il2cpp_debugger_notify_appdomain_create(domain);\n#endif\n\n        LastError::InitializeLastErrorThreadStatic();\n\n        gc::GarbageCollector::InitializeFinalizer();\n\n        MetadataCache::InitializeGCSafe();\n\n#if !NET_4_0\n        ThreadPool::Initialize();\n#endif\n\n        String::InitializeEmptyString(il2cpp_defaults.string_class);\n#if NET_4_0 // .NET 2.0 mscorlib does it with a static constructor\n        InitializeStringEmpty();\n#endif\n\n        os::Socket::Startup();\n        g_il2cpp_is_fully_initialized = true;\n\n        // Force binary serialization in Mono to use reflection instead of code generation.\n    #undef SetEnvironmentVariable // Get rid of windows.h #define.\n        os::Environment::SetEnvironmentVariable(\"MONO_REFLECTION_SERIALIZER\", \"yes\");\n        os::Environment::SetEnvironmentVariable(\"MONO_XMLSERIALIZER_THS\", \"no\");\n\n        Domain::ContextInit(domain);\n        Domain::ContextSet(domain->default_context);\n\n        VerifyApiVersion();\n    }\n\n    void Runtime::Shutdown()\n    {\n        shutting_down = true;\n\n#if !NET_4_0\n        ThreadPool::Shutdown();\n#endif\n\n#if NET_4_0\n        threadpool_ms_cleanup();\n#endif\n\n        // Foreground threads will make us wait here. Background threads\n        // will get terminated abruptly.\n        Thread::KillAllBackgroundThreadsAndWaitForForegroundThreads();\n\n        os::Socket::Cleanup();\n        String::CleanupEmptyString();\n\n        il2cpp::gc::GarbageCollector::UninitializeFinalizers();\n\n        // after the gc cleanup so the finalizer thread can unregister itself\n        Thread::UnInitialize();\n\n        os::Thread::Shutdown();\n\n        // We need to do this after thread shut down because it is freeing GC fixed memory\n        il2cpp::gc::GarbageCollector::UninitializeGC();\n\n        // This needs to happen after no managed code can run anymore, including GC finalizers\n        os::LibraryLoader::CleanupLoadedLibraries();\n\n        vm::Image::ClearCachedResourceData();\n        MetadataAllocCleanup();\n\n        os::Locale::UnInitialize();\n        os::Uninitialize();\n    }\n\n    bool Runtime::IsShuttingDown()\n    {\n        return shutting_down;\n    }\n\n    void Runtime::SetConfigDir(const char *path)\n    {\n        s_ConfigDir = path;\n    }\n\n    static void SetConfigStr(const std::string& executablePath)\n    {\n        Il2CppDomain* domain = vm::Domain::GetCurrent();\n        std::string configFileName = utils::PathUtils::Basename(executablePath);\n        configFileName.append(\".config\");\n        std::string appBase = utils::PathUtils::DirectoryName(executablePath);\n        IL2CPP_OBJECT_SETREF(domain->setup, application_base, vm::String::New(appBase.c_str()));\n        IL2CPP_OBJECT_SETREF(domain->setup, configuration_file, vm::String::New(configFileName.c_str()));\n    }\n\n    void Runtime::SetConfigUtf16(const Il2CppChar* executablePath)\n    {\n        IL2CPP_ASSERT(executablePath);\n\n        std::string exePathUtf8 = il2cpp::utils::StringUtils::Utf16ToUtf8(executablePath);\n        SetConfigStr(exePathUtf8);\n    }\n\n    void Runtime::SetConfig(const char* executablePath)\n    {\n        IL2CPP_ASSERT(executablePath);\n        std::string executablePathStr(executablePath);\n        SetConfigStr(executablePathStr);\n    }\n\n    const char *Runtime::GetFrameworkVersion()\n    {\n        return s_FrameworkVersion;\n    }\n\n    std::string Runtime::GetConfigDir()\n    {\n        if (s_ConfigDir.size() > 0)\n            return s_ConfigDir;\n\n        return utils::PathUtils::Combine(utils::Runtime::GetDataDir(), utils::StringView<char>(\"etc\"));\n    }\n\n    const MethodInfo* Runtime::GetDelegateInvoke(Il2CppClass* klass)\n    {\n        const MethodInfo* invoke = Class::GetMethodFromName(klass, \"Invoke\", -1);\n        IL2CPP_ASSERT(invoke);\n        return invoke;\n    }\n\n    Il2CppObject* Runtime::DelegateInvoke(Il2CppDelegate *delegate, void **params, Il2CppException **exc)\n    {\n        const MethodInfo* invoke = GetDelegateInvoke(delegate->object.klass);\n        return Invoke(invoke, delegate, params, exc);\n    }\n\n    const MethodInfo* Runtime::GetGenericVirtualMethod(const MethodInfo* methodDefinition, const MethodInfo* inflatedMethod)\n    {\n        NOT_IMPLEMENTED_NO_ASSERT(GetGenericVirtualMethod, \"We should only do the following slow method lookup once and then cache on type itself.\");\n\n        const Il2CppGenericInst* classInst = NULL;\n        if (methodDefinition->is_inflated)\n        {\n            classInst = methodDefinition->genericMethod->context.class_inst;\n            methodDefinition = methodDefinition->genericMethod->methodDefinition;\n        }\n\n        const Il2CppGenericMethod* gmethod = MetadataCache::GetGenericMethod(const_cast<MethodInfo*>(methodDefinition), classInst, inflatedMethod->genericMethod->context.method_inst);\n        const MethodInfo* method = metadata::GenericMethod::GetMethod(gmethod);\n\n        RaiseExecutionEngineExceptionIfMethodIsNotFound(method, gmethod);\n\n        return method;\n    }\n\n    void Runtime::RaiseExecutionEngineExceptionIfMethodIsNotFound(const MethodInfo* method)\n    {\n        if (method->methodPointer == NULL)\n        {\n            if (Method::GetClass(method))\n                RaiseExecutionEngineException(Method::GetFullName(method).c_str());\n            else\n                RaiseExecutionEngineException(Method::GetName(method));\n        }\n    }\n\n    void Runtime::AlwaysRaiseExecutionEngineException(const MethodInfo* method)\n    {\n        if (Method::GetClass(method))\n            RaiseExecutionEngineException(Method::GetFullName(method).c_str());\n        else\n            RaiseExecutionEngineException(Method::GetName(method));\n    }\n\n    Il2CppObject* Runtime::Invoke(const MethodInfo *method, void *obj, void **params, Il2CppException **exc)\n    {\n        if (exc)\n            *exc = NULL;\n\n        // we wrap invoker call in try/catch here, rather than emitting a try/catch\n        // in every invoke call as that blows up the code size.\n        try\n        {\n            RaiseExecutionEngineExceptionIfMethodIsNotFound(method);\n            return (Il2CppObject*)method->invoker_method(method->methodPointer, method, obj, params);\n        }\n        catch (Il2CppExceptionWrapper& ex)\n        {\n            if (exc)\n                *exc = ex.ex;\n            return NULL;\n        }\n    }\n\n    Il2CppObject* Runtime::InvokeWithThrow(const MethodInfo *method, void *obj, void **params)\n    {\n        RaiseExecutionEngineExceptionIfMethodIsNotFound(method);\n        return (Il2CppObject*)method->invoker_method(method->methodPointer, method, obj, params);\n    }\n\n    Il2CppObject* Runtime::InvokeArray(const MethodInfo *method, void *obj, Il2CppArray *params, Il2CppException **exc)\n    {\n        if (params == NULL)\n            return InvokeConvertArgs(method, obj, NULL, 0, exc);\n\n        // TO DO: when changing GC to one that moves managed objects around, mark params array local variable as pinned!\n        return InvokeConvertArgs(method, obj, reinterpret_cast<Il2CppObject**>(Array::GetFirstElementAddress(params)), Array::GetLength(params), exc);\n    }\n\n    void Runtime::ObjectInit(Il2CppObject *object)\n    {\n        ObjectInitException(object, NULL);\n    }\n\n    void Runtime::ObjectInitException(Il2CppObject *object, Il2CppException **exc)\n    {\n        const MethodInfo *method = NULL;\n        Il2CppClass *klass = object->klass;\n\n        method = Class::GetMethodFromName(klass, \".ctor\", 0);\n        IL2CPP_ASSERT(method != NULL && \"ObjectInit; no default constructor for object is found\");\n\n        if (method->declaring_type->valuetype)\n            object = (Il2CppObject*)Object::Unbox(object);\n        Invoke(method, object, NULL, exc);\n    }\n\n    void Runtime::SetUnhandledExceptionPolicy(Il2CppRuntimeUnhandledExceptionPolicy value)\n    {\n        s_UnhandledExceptionPolicy = value;\n    }\n\n    Il2CppRuntimeUnhandledExceptionPolicy Runtime::GetUnhandledExceptionPolicy()\n    {\n        return s_UnhandledExceptionPolicy;\n    }\n\n    void Runtime::UnhandledException(Il2CppException* exc)\n    {\n        Il2CppDomain *currentDomain = Domain::GetCurrent();\n        Il2CppDomain *rootDomain = Domain::GetRoot();\n        FieldInfo *field;\n        Il2CppObject *current_appdomain_delegate = NULL;\n        Il2CppObject *root_appdomain_delegate = NULL;\n\n        field = Class::GetFieldFromName(il2cpp_defaults.appdomain_class, \"UnhandledException\");\n        IL2CPP_ASSERT(field);\n\n        Il2CppObject* excObject = (Il2CppObject*)exc;\n\n        if (excObject->klass != il2cpp_defaults.threadabortexception_class)\n        {\n            //bool abort_process = (Thread::Current () == Thread::Main ()) ||\n            //  (Runtime::GetUnhandledExceptionPolicy () == IL2CPP_UNHANDLED_POLICY_CURRENT);\n\n            Field::GetValue((Il2CppObject*)rootDomain->domain, field, &root_appdomain_delegate);\n\n            NOT_IMPLEMENTED_NO_ASSERT(Runtime::UnhandledException, \"We don't have runtime version info yet\");\n            //if (currentDomain != rootDomain && (mono_framework_version () >= 2)) {\n            //  Field::GetValue ((Il2CppObject*)currentDomain->domain, field, &current_appdomain_delegate);\n            //}\n            //else\n            //{\n            //  current_appdomain_delegate = NULL;\n            //}\n\n            ///* set exitcode only if we will abort the process */\n            //if (abort_process)\n            //  mono_environment_exitcode_set (1);\n            //if ((current_appdomain_delegate == NULL) && (root_appdomain_delegate == NULL)\n            //{\n            //  mono_print_unhandled_exception (exc);\n            //}\n            //else\n            {\n                if (root_appdomain_delegate)\n                {\n                    CallUnhandledExceptionDelegate(rootDomain, (Il2CppDelegate*)root_appdomain_delegate, exc);\n                }\n                if (current_appdomain_delegate)\n                {\n                    CallUnhandledExceptionDelegate(currentDomain, (Il2CppDelegate*)current_appdomain_delegate, exc);\n                }\n            }\n        }\n    }\n\n    static inline Il2CppObject* InvokeConvertThis(const MethodInfo* method, void* thisArg, void** convertedParameters, Il2CppException** exception)\n    {\n        Il2CppClass* thisType = method->declaring_type;\n\n        // If it's not a constructor, just invoke directly\n        if (strcmp(method->name, \".ctor\") != 0 || method->declaring_type == il2cpp_defaults.string_class)\n            return Runtime::Invoke(method, thisArg, convertedParameters, exception);\n\n        // If it is a construction, we need to construct a return value and allocate object if needed\n        Il2CppObject* instance;\n\n        if (thisArg == NULL)\n        {\n            thisArg = instance = Object::New(thisType);\n            Runtime::Invoke(method, thisArg, convertedParameters, exception);\n        }\n        else\n        {\n            // thisArg is pointer to data in case of a value type\n            // We need to invoke the constructor first, passing point to the value\n            // Since the constructor may modify the value, we need to box the result\n            // AFTER the constructor was invoked\n            Runtime::Invoke(method, thisArg, convertedParameters, exception);\n            instance = Object::Box(thisType, thisArg);\n        }\n\n        return instance;\n    }\n\n    Il2CppObject* Runtime::InvokeConvertArgs(const MethodInfo *method, void* thisArg, Il2CppObject** parameters, int paramCount, Il2CppException** exception)\n    {\n        void** convertedParameters = NULL;\n        bool hasByRefNullables = false;\n\n        // Convert parameters if they are not null\n        if (parameters != NULL)\n        {\n            convertedParameters = (void**)alloca(sizeof(void*) * paramCount);\n\n            for (int i = 0; i < paramCount; i++)\n            {\n                bool passedByReference = method->parameters[i].parameter_type->byref;\n                Il2CppClass* parameterType = Class::FromIl2CppType(method->parameters[i].parameter_type);\n                Class::Init(parameterType);\n\n                if (parameterType->valuetype)\n                {\n                    if (Class::IsNullable(parameterType))\n                    {\n                        // Since we don't really store boxed nullables, we need to create a new one.\n                        void* nullableStorage = alloca(parameterType->instance_size - sizeof(Il2CppObject));\n                        Object::UnboxNullable(parameters[i], Class::GetNullableArgument(parameterType), nullableStorage);\n                        convertedParameters[i] = nullableStorage;\n                        hasByRefNullables |= passedByReference;\n                    }\n                    else if (passedByReference)\n                    {\n                        // If value type is passed by reference, just pass pointer to value directly\n                        // If null was passed in, create a new boxed value type in its place\n                        if (parameters[i] == NULL)\n                            parameters[i] = Object::New(parameterType);\n\n                        convertedParameters[i] = Object::Unbox(parameters[i]);\n                    }\n                    else if (parameters[i] == NULL) // If value type is passed by value, we need to pass pointer to its value\n                    {\n                        // If null was passed in, allocate a new value with default value\n                        uint32_t valueSize = parameterType->instance_size - sizeof(Il2CppObject);\n                        convertedParameters[i] = alloca(valueSize);\n                        memset(convertedParameters[i], 0, valueSize);\n                    }\n                    else\n                    {\n                        // Otherwise, pass the original\n                        convertedParameters[i] = Object::Unbox(parameters[i]);\n                    }\n                }\n                else if (passedByReference)\n                {\n                    convertedParameters[i] = &parameters[i]; // Reference type passed by reference\n                }\n                else if (parameterType->byval_arg->type == IL2CPP_TYPE_PTR)\n                {\n                    if (parameters[i] != NULL)\n                    {\n                        IL2CPP_ASSERT(parameters[i]->klass == il2cpp_defaults.int_class);\n                        convertedParameters[i] = static_cast<Il2CppIntPtr*>(Object::Unbox(parameters[i]))->m_value;\n                    }\n                    else\n                    {\n                        convertedParameters[i] = NULL;\n                    }\n                }\n                else\n                {\n                    convertedParameters[i] = parameters[i]; // Reference type passed by value\n                }\n            }\n        }\n\n        Il2CppObject* result = InvokeConvertThis(method, thisArg, convertedParameters, exception);\n\n        if (hasByRefNullables)\n        {\n            // We need to copy by reference nullables back to original argument array\n            for (int i = 0; i < paramCount; i++)\n            {\n                if (!method->parameters[i].parameter_type->byref)\n                    continue;\n\n                Il2CppClass* parameterType = Class::FromIl2CppType(method->parameters[i].parameter_type);\n\n                if (Class::IsNullable(parameterType))\n                    parameters[i] = Object::Box(parameterType, convertedParameters[i]);\n            }\n        }\n\n        if (method->return_type->type == IL2CPP_TYPE_PTR)\n        {\n            static Il2CppClass* pointerClass = Class::FromName(il2cpp_defaults.corlib, \"System.Reflection\", \"Pointer\");\n            Il2CppReflectionPointer* pointer = reinterpret_cast<Il2CppReflectionPointer*>(Object::New(pointerClass));\n            pointer->data = result;\n            pointer->type = Reflection::GetTypeObject(method->return_type);\n            result = reinterpret_cast<Il2CppObject*>(pointer);\n        }\n\n        return result;\n    }\n\n    void Runtime::CallUnhandledExceptionDelegate(Il2CppDomain* domain, Il2CppDelegate* delegate, Il2CppException* exc)\n    {\n        Il2CppException *e = NULL;\n        void* pa[2];\n\n        pa[0] = domain->domain;\n        pa[1] = CreateUnhandledExceptionEventArgs(exc);\n        DelegateInvoke(delegate, pa, &e);\n\n        IL2CPP_ASSERT(!e);\n    }\n\n    static il2cpp::os::FastMutex s_TypeInitializationLock;\n\n// We currently call Runtime::ClassInit in 4 places:\n// 1. Just after we allocate storage for a new object (Object::NewAllocSpecific)\n// 2. Just before reading any static field\n// 3. Just before calling any static method\n// 4. Just before calling class instance constructor from a derived class instance constructor\n    void Runtime::ClassInit(Il2CppClass *klass)\n    {\n        // Nothing to do if class has no static constructor.\n        if (!klass->has_cctor)\n            return;\n\n        // Nothing to do if class constructor already ran.\n        if (os::Atomic::CompareExchange(&klass->cctor_finished, 1, 1) == 1)\n            return;\n\n        s_TypeInitializationLock.Lock();\n\n        // See if some thread ran it while we acquired the lock.\n        if (os::Atomic::CompareExchange(&klass->cctor_finished, 1, 1) == 1)\n        {\n            s_TypeInitializationLock.Unlock();\n            return;\n        }\n\n        // See if some other thread got there first and already started running the constructor.\n        if (os::Atomic::CompareExchange(&klass->cctor_started, 1, 1) == 1)\n        {\n            s_TypeInitializationLock.Unlock();\n\n            // May have been us and we got here through recursion.\n            os::Thread::ThreadId currentThread = os::Thread::CurrentThreadId();\n            if (os::Atomic::CompareExchange64(&klass->cctor_thread, currentThread, currentThread) == currentThread)\n                return;\n\n            // Wait for other thread to finish executing the constructor.\n            while (os::Atomic::CompareExchange(&klass->cctor_finished, 1, 1) == 0)\n            {\n                os::Thread::Sleep(1);\n            }\n        }\n        else\n        {\n            // Let others know we have started executing the constructor.\n            os::Atomic::Exchange64(&klass->cctor_thread, os::Thread::CurrentThreadId());\n            os::Atomic::Exchange(&klass->cctor_started, 1);\n\n            s_TypeInitializationLock.Unlock();\n\n            // Run it.\n            Il2CppException* exception = NULL;\n            const MethodInfo* cctor = Class::GetCCtor(klass);\n            if (cctor != NULL)\n            {\n                vm::Runtime::Invoke(cctor, NULL, NULL, &exception);\n            }\n\n            // Let other threads know we finished.\n            os::Atomic::Exchange(&klass->cctor_finished, 1);\n            os::Atomic::Exchange64(&klass->cctor_thread, 0);\n\n            // Deal with exceptions.\n            if (exception != NULL)\n            {\n                const Il2CppType *type = Class::GetType(klass);\n                std::string n = StringUtils::Printf(\"The type initializer for '%s' threw an exception.\", Type::GetName(type, IL2CPP_TYPE_NAME_FORMAT_IL).c_str());\n                Il2CppException* typeInitializationException = Exception::GetTypeInitializationException(n.c_str(), exception);\n                Exception::Raise(typeInitializationException);\n            }\n        }\n    }\n\n    struct ConstCharCompare\n    {\n        bool operator()(char const *a, char const *b) const\n        {\n            return strcmp(a, b) < 0;\n        }\n    };\n\n    Il2CppObject* Runtime::CreateUnhandledExceptionEventArgs(Il2CppException *exc)\n    {\n        Il2CppClass *klass;\n        void* args[2];\n        const MethodInfo *method = NULL;\n        bool is_terminating = true;\n        Il2CppObject *obj;\n\n        klass = Class::FromName(il2cpp_defaults.corlib, \"System\", \"UnhandledExceptionEventArgs\");\n        IL2CPP_ASSERT(klass);\n\n        Class::Init(klass);\n\n        /* UnhandledExceptionEventArgs only has 1 public ctor with 2 args */\n        method = Class::GetMethodFromNameFlags(klass, \".ctor\", 2, METHOD_ATTRIBUTE_PUBLIC);\n        IL2CPP_ASSERT(method);\n\n        args[0] = exc;\n        args[1] = &is_terminating;\n\n        obj = Object::New(klass);\n        Runtime::Invoke(method, obj, args, NULL);\n\n        return obj;\n    }\n\n    const char *Runtime::GetBundledMachineConfig()\n    {\n        return s_BundledMachineConfig;\n    }\n\n    void Runtime::RegisterBundledMachineConfig(const char *config_xml)\n    {\n        s_BundledMachineConfig = config_xml;\n    }\n\n    void Runtime::VerifyApiVersion()\n    {\n#if IL2CPP_DEBUG\n        Il2CppClass *klass = Class::FromName(il2cpp_defaults.corlib, \"System\", \"Environment\");\n        Class::Init(klass);\n        FieldInfo *field = Class::GetFieldFromName(klass, \"mono_corlib_version\");\n        int32_t value;\n        Field::StaticGetValue(field, &value);\n\n#if !NET_4_0\n        IL2CPP_ASSERT(value == 82);\n#else\n        IL2CPP_ASSERT(value == 156);\n#endif\n#endif\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Runtime.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include <string>\n#include \"il2cpp-config.h\"\n#include \"il2cpp-metadata.h\"\n#include \"object-internals.h\"\n#include \"metadata/GenericMethod.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Class.h\"\n#include \"vm/MetadataCache.h\"\n#include \"utils/StringUtils.h\"\n\nstruct Il2CppArray;\nstruct Il2CppDelegate;\nstruct Il2CppObject;\nstruct MethodInfo;\nstruct Il2CppClass;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API Runtime\n    {\n    public:\n        static void Init(const char* filename, const char *runtime_version);\n        static void Shutdown();\n        static bool IsShuttingDown();\n        static void SetConfigDir(const char *path);\n        static void SetConfigUtf16(const Il2CppChar* executablePath);\n        static void SetConfig(const char* executablePath);\n        static std::string GetConfigDir();\n        static const char *GetFrameworkVersion();\n        static const MethodInfo* GetDelegateInvoke(Il2CppClass* klass);\n        static Il2CppObject* DelegateInvoke(Il2CppDelegate *obj, void **params, Il2CppException **exc);\n        static Il2CppObject* Invoke(const MethodInfo *method, void *obj, void **params, Il2CppException **exc);\n        static Il2CppObject* InvokeWithThrow(const MethodInfo *method, void *obj, void **params);\n        static Il2CppObject* InvokeConvertArgs(const MethodInfo *method, void *obj, Il2CppObject **params, int paramCount, Il2CppException **exc);\n        static Il2CppObject* InvokeArray(const MethodInfo *method, void *obj, Il2CppArray *params, Il2CppException **exc);\n        static void ObjectInit(Il2CppObject* object);\n        static void ObjectInitException(Il2CppObject* object, Il2CppException **exc);\n        static void SetUnhandledExceptionPolicy(Il2CppRuntimeUnhandledExceptionPolicy value);\n\n        static const MethodInfo* GetGenericVirtualMethod(const MethodInfo* methodDefinition, const MethodInfo* inflatedMethod);\n        static void RaiseExecutionEngineExceptionIfMethodIsNotFound(const MethodInfo* method);\n        static void AlwaysRaiseExecutionEngineException(const MethodInfo* method);\n\n    public:\n        // internal\n        static Il2CppRuntimeUnhandledExceptionPolicy GetUnhandledExceptionPolicy();\n        static void UnhandledException(Il2CppException* exc);\n        static void ClassInit(Il2CppClass *klass);\n\n        static const char *GetBundledMachineConfig();\n        static void RegisterBundledMachineConfig(const char *config_xml);\n\n    private:\n        static void CallUnhandledExceptionDelegate(Il2CppDomain* domain, Il2CppDelegate* delegate, Il2CppException* exc);\n        static Il2CppObject* CreateUnhandledExceptionEventArgs(Il2CppException* exc);\n\n        static void VerifyApiVersion();\n\n        static inline void RaiseExecutionEngineExceptionIfMethodIsNotFound(const MethodInfo* method, const Il2CppGenericMethod* genericMethod)\n        {\n            if (method->methodPointer == NULL)\n                RaiseExecutionEngineException(metadata::GenericMethod::GetFullName(genericMethod).c_str());\n        }\n\n        static inline void RaiseExecutionEngineException(const char* methodFullName)\n        {\n            Exception::Raise(Exception::GetExecutionEngineException(utils::StringUtils::Printf(\"Attempting to call method '%s' for which no ahead of time (AOT) code was generated.\", methodFullName).c_str()));\n        }\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/StackTrace.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"StackTrace.h\"\n#include \"il2cpp-debugger.h\"\n#include \"object-internals.h\"\n#include \"os/Event.h\"\n#include \"os/StackTrace.h\"\n#include \"os/Thread.h\"\n#include \"os/ThreadLocalValue.h\"\n#include \"vm-utils/NativeSymbol.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n#if IL2CPP_ENABLE_STACKTRACES\n\n    class MethodStack\n    {\n    protected:\n        os::ThreadLocalValue s_StackFrames;\n\n        inline StackFrames* GetStackFramesRaw()\n        {\n            StackFrames* stackFrames;\n\n            os::ErrorCode result = s_StackFrames.GetValue(reinterpret_cast<void**>(&stackFrames));\n            Assert(result == os::kErrorCodeSuccess);\n\n            return stackFrames;\n        }\n\n    public:\n        inline void InitializeForCurrentThread()\n        {\n            if (GetStackFramesRaw() != NULL)\n                return;\n\n            StackFrames* stackFrames = new StackFrames();\n            stackFrames->reserve(64);\n\n            os::ErrorCode result = s_StackFrames.SetValue(stackFrames);\n            Assert(result == os::kErrorCodeSuccess);\n        }\n\n        inline void CleanupForCurrentThread()\n        {\n            StackFrames* frames = GetStackFramesRaw();\n\n            if (frames == NULL)\n                return;\n\n            delete frames;\n\n            os::ErrorCode result = s_StackFrames.SetValue(NULL);\n            Assert(result == os::kErrorCodeSuccess);\n        }\n    };\n\n#if IL2CPP_ENABLE_STACKTRACE_SENTRIES\n\n    class StacktraceSentryMethodStack : public MethodStack\n    {\n    public:\n        inline const StackFrames* GetStackFrames()\n        {\n            return GetStackFramesRaw();\n        }\n\n        inline bool GetStackFrameAt(int32_t depth, Il2CppStackFrameInfo& frame)\n        {\n            const StackFrames& frames = *GetStackFramesRaw();\n\n            if (static_cast<int>(frames.size()) + depth < 1)\n                return false;\n\n            frame = frames[frames.size() - 1 + depth];\n            return true;\n        }\n\n        inline void PushFrame(Il2CppStackFrameInfo& frame)\n        {\n            GetStackFramesRaw()->push_back(frame);\n\n#if IL2CPP_DEBUGGER_ENABLED\n            il2cpp_debugger_method_entry(frame);\n#endif\n        }\n\n        inline void PopFrame()\n        {\n            StackFrames* stackFrames = GetStackFramesRaw();\n\n#if IL2CPP_DEBUGGER_ENABLED\n            Il2CppStackFrameInfo frame = stackFrames->back();\n#endif\n\n            stackFrames->pop_back();\n\n#if IL2CPP_DEBUGGER_ENABLED\n            il2cpp_debugger_method_exit(frame);\n#endif\n        }\n    };\n\n#endif // IL2CPP_ENABLE_STACKTRACE_SENTRIES\n\n#if IL2CPP_ENABLE_NATIVE_STACKTRACES\n\n    class NativeMethodStack : public MethodStack\n    {\n        static bool GetStackFramesCallback(Il2CppMethodPointer frame, void* context)\n        {\n            const MethodInfo* method = il2cpp::utils::NativeSymbol::GetMethodFromNativeSymbol(frame);\n            StackFrames* stackFrames = static_cast<StackFrames*>(context);\n\n            if (method != NULL)\n            {\n                Il2CppStackFrameInfo frameInfo = { 0 };\n                frameInfo.method = method;\n                stackFrames->push_back(frameInfo);\n            }\n\n            return true;\n        }\n\n        struct GetStackFrameAtContext\n        {\n            int32_t currentDepth;\n            const MethodInfo* method;\n        };\n\n        static bool GetStackFrameAtCallback(Il2CppMethodPointer frame, void* context)\n        {\n            const MethodInfo* method = il2cpp::utils::NativeSymbol::GetMethodFromNativeSymbol(frame);\n            GetStackFrameAtContext* ctx = static_cast<GetStackFrameAtContext*>(context);\n\n            if (method != NULL)\n            {\n                if (ctx->currentDepth == 0)\n                {\n                    ctx->method = method;\n                    return false;\n                }\n\n                ctx->currentDepth++;\n            }\n\n            return true;\n        }\n\n    public:\n        inline const StackFrames* GetStackFrames()\n        {\n            StackFrames* stackFrames = GetStackFramesRaw();\n            stackFrames->clear();\n\n            os::StackTrace::WalkStack(&NativeMethodStack::GetStackFramesCallback, stackFrames, os::StackTrace::kFirstCalledToLastCalled);\n\n            return stackFrames;\n        }\n\n        inline bool GetStackFrameAt(int32_t depth, Il2CppStackFrameInfo& frame)\n        {\n            GetStackFrameAtContext context = { depth, NULL };\n\n            os::StackTrace::WalkStack(&NativeMethodStack::GetStackFrameAtCallback, &context, os::StackTrace::kLastCalledToFirstCalled);\n\n            if (context.method != NULL)\n            {\n                frame.method = context.method;\n                return true;\n            }\n\n            return false;\n        }\n\n        inline void PushFrame(Il2CppStackFrameInfo& frame)\n        {\n        }\n\n        inline void PopFrame()\n        {\n        }\n    };\n\n#endif // IL2CPP_ENABLE_NATIVE_STACKTRACES\n\n#else\n\n    static StackFrames s_EmptyStack;\n\n    class NoOpMethodStack\n    {\n    public:\n        inline void InitializeForCurrentThread()\n        {\n        }\n\n        inline void CleanupForCurrentThread()\n        {\n        }\n\n        inline const StackFrames* GetStackFrames()\n        {\n            return &s_EmptyStack;\n        }\n\n        inline bool GetStackFrameAt(int32_t depth, Il2CppStackFrameInfo& frame)\n        {\n            return false;\n        }\n\n        inline void PushFrame(Il2CppStackFrameInfo& frame)\n        {\n        }\n\n        inline void PopFrame()\n        {\n        }\n    };\n\n#endif // IL2CPP_ENABLE_STACKTRACES\n\n#if IL2CPP_ENABLE_STACKTRACES\n\n#if IL2CPP_ENABLE_STACKTRACE_SENTRIES\n\n    StacktraceSentryMethodStack s_MethodStack;\n\n#elif IL2CPP_ENABLE_NATIVE_STACKTRACES\n\n    NativeMethodStack s_MethodStack;\n\n#endif\n\n#else\n\n    NoOpMethodStack s_MethodStack;\n\n#endif // IL2CPP_ENABLE_STACKTRACES\n\n// Current thread functions\n\n    void StackTrace::InitializeStackTracesForCurrentThread()\n    {\n        s_MethodStack.InitializeForCurrentThread();\n    }\n\n    void StackTrace::CleanupStackTracesForCurrentThread()\n    {\n        s_MethodStack.CleanupForCurrentThread();\n    }\n\n    const StackFrames* StackTrace::GetStackFrames()\n    {\n        return s_MethodStack.GetStackFrames();\n    }\n\n    bool StackTrace::GetStackFrameAt(int32_t depth, Il2CppStackFrameInfo& frame)\n    {\n        Assert(depth <= 0 && \"Frame depth must be 0 or less\");\n        return s_MethodStack.GetStackFrameAt(depth, frame);\n    }\n\n    void StackTrace::WalkFrameStack(Il2CppFrameWalkFunc callback, void* context)\n    {\n        const StackFrames& frames = *GetStackFrames();\n\n        for (StackFrames::const_iterator it = frames.begin(); it != frames.end(); it++)\n            callback(&*it, context);\n    }\n\n    void StackTrace::PushFrame(Il2CppStackFrameInfo& frame)\n    {\n        s_MethodStack.PushFrame(frame);\n    }\n\n    void StackTrace::PopFrame()\n    {\n        s_MethodStack.PopFrame();\n    }\n\n// Remote thread functions\n\n    struct GetThreadFrameAtContext\n    {\n        il2cpp::os::Event apcDoneEvent;\n        int32_t depth;\n        Il2CppStackFrameInfo* frame;\n        bool hasResult;\n    };\n\n    struct WalkThreadFrameStackContext\n    {\n        il2cpp::os::Event apcDoneEvent;\n        Il2CppFrameWalkFunc callback;\n        void* userContext;\n    };\n\n    struct GetThreadStackDepthContext\n    {\n        il2cpp::os::Event apcDoneEvent;\n        int32_t stackDepth;\n    };\n\n    struct GetThreadTopFrameContext\n    {\n        il2cpp::os::Event apcDoneEvent;\n        Il2CppStackFrameInfo* frame;\n        bool hasResult;\n    };\n\n    static void STDCALL GetThreadFrameAtCallback(void* context)\n    {\n        GetThreadFrameAtContext* ctx = static_cast<GetThreadFrameAtContext*>(context);\n\n        ctx->hasResult = StackTrace::GetStackFrameAt(ctx->depth, *ctx->frame);\n        ctx->apcDoneEvent.Set();\n    }\n\n    bool StackTrace::GetThreadStackFrameAt(Il2CppThread* thread, int32_t depth, Il2CppStackFrameInfo& frame)\n    {\n#if IL2CPP_ENABLE_STACKTRACES\n        GetThreadFrameAtContext apcContext;\n\n        apcContext.depth = depth;\n        apcContext.frame = &frame;\n\n        thread->GetInternalThread()->handle->QueueUserAPC(GetThreadFrameAtCallback, &apcContext);\n        apcContext.apcDoneEvent.Wait();\n\n        return apcContext.hasResult;\n#else\n        return false;\n#endif\n    }\n\n    static void STDCALL WalkThreadFrameStackCallback(void* context)\n    {\n        WalkThreadFrameStackContext* ctx = static_cast<WalkThreadFrameStackContext*>(context);\n\n        StackTrace::WalkFrameStack(ctx->callback, ctx->userContext);\n        ctx->apcDoneEvent.Set();\n    }\n\n    void StackTrace::WalkThreadFrameStack(Il2CppThread* thread, Il2CppFrameWalkFunc callback, void* context)\n    {\n#if IL2CPP_ENABLE_STACKTRACES\n        WalkThreadFrameStackContext apcContext;\n\n        apcContext.callback = callback;\n        apcContext.userContext = context;\n\n        thread->GetInternalThread()->handle->QueueUserAPC(WalkThreadFrameStackCallback, &apcContext);\n        apcContext.apcDoneEvent.Wait();\n#endif\n    }\n\n    static void STDCALL GetThreadStackDepthCallback(void* context)\n    {\n        GetThreadStackDepthContext* ctx = static_cast<GetThreadStackDepthContext*>(context);\n\n        ctx->stackDepth = static_cast<int32_t>(StackTrace::GetStackDepth());\n        ctx->apcDoneEvent.Set();\n    }\n\n    int32_t StackTrace::GetThreadStackDepth(Il2CppThread* thread)\n    {\n#if IL2CPP_ENABLE_STACKTRACES\n        GetThreadStackDepthContext apcContext;\n\n        thread->GetInternalThread()->handle->QueueUserAPC(GetThreadStackDepthCallback, &apcContext);\n        apcContext.apcDoneEvent.Wait();\n\n        return apcContext.stackDepth;\n#else\n        return 0;\n#endif\n    }\n\n    static void STDCALL GetThreadTopFrameCallback(void* context)\n    {\n        GetThreadTopFrameContext* ctx = static_cast<GetThreadTopFrameContext*>(context);\n\n        ctx->hasResult = StackTrace::GetTopStackFrame(*ctx->frame);\n        ctx->apcDoneEvent.Set();\n    }\n\n    bool StackTrace::GetThreadTopStackFrame(Il2CppThread* thread, Il2CppStackFrameInfo& frame)\n    {\n#if IL2CPP_ENABLE_STACKTRACES\n        GetThreadTopFrameContext apcContext;\n        apcContext.frame = &frame;\n\n        thread->GetInternalThread()->handle->QueueUserAPC(GetThreadTopFrameCallback, &apcContext);\n        apcContext.apcDoneEvent.Wait();\n\n        return apcContext.hasResult;\n#else\n        return false;\n#endif\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/StackTrace.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include \"il2cpp-config.h\"\n#include \"il2cpp-metadata.h\"\n\n#if IL2CPP_ENABLE_NATIVE_STACKTRACES\nstruct MethodDefinitionKey\n{\n    Il2CppMethodPointer method;\n    MethodIndex methodIndex;\n};\n#endif\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    typedef std::vector<Il2CppStackFrameInfo> StackFrames;\n\n    class LIBIL2CPP_CODEGEN_API StackTrace\n    {\n    public:\n        static void InitializeStackTracesForCurrentThread();\n        static void CleanupStackTracesForCurrentThread();\n\n        // Current thread functions\n        static const StackFrames* GetStackFrames();\n        static bool GetStackFrameAt(int32_t depth, Il2CppStackFrameInfo& frame);\n        static void WalkFrameStack(Il2CppFrameWalkFunc callback, void* context);\n\n        inline static size_t GetStackDepth() { return GetStackFrames()->size(); }\n        inline static bool GetTopStackFrame(Il2CppStackFrameInfo& frame) { return GetStackFrameAt(0, frame); }\n\n        static void PushFrame(Il2CppStackFrameInfo& frame);\n        static void PopFrame();\n\n        // Remote thread functions\n        static bool GetThreadStackFrameAt(Il2CppThread* thread, int32_t depth, Il2CppStackFrameInfo& frame);\n        static void WalkThreadFrameStack(Il2CppThread* thread, Il2CppFrameWalkFunc callback, void* context);\n        static int32_t GetThreadStackDepth(Il2CppThread* thread);\n        static bool GetThreadTopStackFrame(Il2CppThread* thread, Il2CppStackFrameInfo& frame);\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/String.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"gc/Allocator.h\"\n#include \"gc/GarbageCollector.h\"\n#include \"gc/GCHandle.h\"\n#include \"os/Mutex.h\"\n#include \"vm/Exception.h\"\n#include \"vm/String.h\"\n#include \"vm/Object.h\"\n#include \"vm/Profiler.h\"\n#include \"gc/AppendOnlyGCHashMap.h\"\n#include \"utils/StringUtils.h\"\n#include <string>\n#include <memory.h>\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    static Il2CppString* s_EmptyString;\n\n    void String::InitializeEmptyString(Il2CppClass* stringClass)\n    {\n        IL2CPP_ASSERT(s_EmptyString == NULL && \"Empty string was already initialized\");\n\n        // size for string and null terminator\n        s_EmptyString = static_cast<Il2CppString*>(gc::GarbageCollector::AllocateFixed(sizeof(Il2CppString) + 2, 0));\n        s_EmptyString->object.klass = stringClass;\n        s_EmptyString->length = 0;\n        s_EmptyString->chars[0] = 0;\n    }\n\n    void String::CleanupEmptyString()\n    {\n        IL2CPP_ASSERT(s_EmptyString && \"Empty string was not yet initialized\");\n        gc::GarbageCollector::FreeFixed(s_EmptyString);\n        s_EmptyString = NULL;\n    }\n\n    Il2CppString* String::Empty()\n    {\n        IL2CPP_ASSERT(s_EmptyString && \"Empty string was not yet initialized\");\n        return s_EmptyString;\n    }\n\n    int32_t String::GetHash(Il2CppString* str)\n    {\n        const Il2CppChar* p = utils::StringUtils::GetChars(str);\n        int i, len = utils::StringUtils::GetLength(str);\n        uint32_t h = 0;\n\n        for (i = 0; i < len; i++)\n        {\n            h = (h << 5) - h + *p;\n            p++;\n        }\n\n        return h;\n    }\n\n    Il2CppString* String::New(const char* str)\n    {\n        return NewLen(str, (uint32_t)strlen(str));\n    }\n\n    Il2CppString* String::NewWrapper(const char* str)\n    {\n        return New(str);\n    }\n\n    Il2CppString* String::NewLen(const char* str, uint32_t length)\n    {\n        UTF16String utf16Chars = il2cpp::utils::StringUtils::Utf8ToUtf16(str, length);\n\n        return NewUtf16(utf16Chars.c_str(), (uint32_t)utf16Chars.length());\n    }\n\n    Il2CppString* String::NewUtf16(const Il2CppChar* text, int32_t len)\n    {\n        Il2CppString *s;\n\n        s = NewSize(len);\n        IL2CPP_ASSERT(s != NULL);\n\n        memcpy(utils::StringUtils::GetChars(s), text, len * 2);\n\n        return s;\n    }\n\n    Il2CppString* String::NewUtf16(const utils::StringView<Il2CppChar>& text)\n    {\n        assert(text.Length() < static_cast<uint32_t>(std::numeric_limits<int32_t>::max()));\n        return NewUtf16(text.Str(), static_cast<int32_t>(text.Length()));\n    }\n\n    Il2CppString* String::NewSize(int32_t len)\n    {\n        if (len == 0)\n            return Empty();\n\n        Il2CppString *s;\n        IL2CPP_ASSERT(len >= 0);\n        size_t size = (sizeof(Il2CppString) + ((len + 1) * 2));\n\n        /* overflow ? can't fit it, can't allocate it! */\n        if (static_cast<uint32_t>(len) > size)\n            Exception::RaiseOutOfMemoryException();\n\n        s = reinterpret_cast<Il2CppString*>(Object::AllocatePtrFree(size, il2cpp_defaults.string_class));\n\n        s->length = len;\n#if NEED_TO_ZERO_PTRFREE\n        s->chars[len] = 0;\n#endif\n\n#if IL2CPP_ENABLE_PROFILER\n        if (Profiler::ProfileAllocations())\n            Profiler::Allocation((Il2CppObject*)s, il2cpp_defaults.string_class);\n#endif\n\n        return s;\n    }\n\n    struct InternedString\n    {\n        int32_t length;\n        const Il2CppChar* chars;\n    };\n\n    class InternedStringHash\n    {\n    public:\n        size_t operator()(const InternedString& ea) const\n        {\n            return utils::StringUtils::Hash(ea.chars, ea.length);\n        }\n    };\n\n    class InternedStringCompare\n    {\n    public:\n        bool operator()(const InternedString& ea, const InternedString& eb) const\n        {\n            return (ea.length == eb.length) && (0 == memcmp(ea.chars, eb.chars, sizeof(Il2CppChar) * ea.length));\n        }\n    };\n\n\n    typedef il2cpp::gc::AppendOnlyGCHashMap<InternedString, Il2CppString*, InternedStringHash, InternedStringCompare> InternedStringMap;\n\n    static os::FastMutex s_InternedStringMapMutex;\n    static InternedStringMap* s_InternedStringMap;\n\n    Il2CppString* String::Intern(Il2CppString* str)\n    {\n        os::FastAutoLock lockMap(&s_InternedStringMapMutex);\n\n        // allocate this are runtime since it uses GC allocator to keep managed strings alive and needs GC initialized\n        if (s_InternedStringMap == NULL)\n            s_InternedStringMap = new InternedStringMap();\n\n        InternedString internedString = { str->length, str->chars };\n        Il2CppString* value = NULL;\n        if (s_InternedStringMap->TryGetValue(internedString, &value))\n            return value;\n\n        internedString.chars = utils::StringUtils::GetChars(str);\n        s_InternedStringMap->Add(internedString, str);\n\n        return str;\n    }\n\n    Il2CppString* String::IsInterned(Il2CppString* str)\n    {\n        os::FastAutoLock lockMap(&s_InternedStringMapMutex);\n\n        // if this is NULL, it means we have no interned strings\n        if (s_InternedStringMap == NULL)\n            return NULL;\n\n        InternedString internedString = { str->length, str->chars };\n        Il2CppString* value = NULL;\n        if (s_InternedStringMap->TryGetValue(internedString, &value))\n            return value;\n\n        return NULL;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/String.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include \"il2cpp-config.h\"\n#include \"utils/StringView.h\"\n\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API String\n    {\n    public:\n        //exported\n        static Il2CppString* Empty();\n        static int32_t GetLength(Il2CppString* str);\n        static int32_t GetHash(Il2CppString* str);\n        static Il2CppString* New(const char* str);\n        static Il2CppString* NewWrapper(const char* str);\n        static Il2CppString* NewLen(const char* str, uint32_t length);\n        static Il2CppString* NewSize(int32_t len);\n        static Il2CppString* NewUtf16(const Il2CppChar *text, int32_t len);\n        static Il2CppString* NewUtf16(const utils::StringView<Il2CppChar>& text);\n\n    public:\n        static void InitializeEmptyString(Il2CppClass* stringClass);\n        static void CleanupEmptyString();\n        static Il2CppString* Intern(Il2CppString* str);\n        static Il2CppString* IsInterned(Il2CppString* str);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Thread.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/Atomic.h\"\n#include \"os/Mutex.h\"\n#include \"os/Thread.h\"\n#include \"os/ThreadLocalValue.h\"\n#include \"os/StackTrace.h\"\n#include \"os/Semaphore.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Object.h\"\n#include \"vm/Object.h\"\n#include \"vm/Runtime.h\"\n#include \"vm/StackTrace.h\"\n#include \"vm/Thread.h\"\n#include \"vm/String.h\"\n#include \"gc/Allocator.h\"\n#include \"gc/GarbageCollector.h\"\n#include \"gc/GCHandle.h\"\n#include \"utils/Memory.h\"\n#include \"utils/StringUtils.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include <algorithm>\n#include <map>\n\n#if IL2CPP_DEBUGGER_ENABLED\n#include \"../il2cpp-debugger.h\"\n#endif\n\nusing namespace il2cpp::os;\nusing il2cpp::gc::GarbageCollector;\nusing il2cpp::os::FastMutex;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    Il2CppThread* Thread::s_MainThread = NULL;\n\n    typedef std::vector<Il2CppThread*, il2cpp::gc::Allocator<Il2CppThread*> > GCTrackedThreadVector;\n\n// we need to allocate this ourselves so the CRT does not initialize it and try to allocate GC memory on startup before the GC is initialized\n    static GCTrackedThreadVector* s_AttachedThreads;\n\n    static bool s_BlockNewThreads = false;\n\n#define AUTO_LOCK_THREADS() \\\n    il2cpp::os::FastAutoLock lock(&s_ThreadMutex)\n    static FastMutex s_ThreadMutex;\n\n    static std::vector<int32_t> s_ThreadStaticSizes;\n\n    static ThreadLocalValue s_CurrentThread;\n\n    static volatile int32_t s_NextManagedThreadId = 0;\n\n    static void\n    thread_cleanup_on_cancel(void* arg)\n    {\n        Thread::Detach((Il2CppThread*)arg);\n    }\n\n    void Thread::Initialize()\n    {\n#if IL2CPP_HAS_NATIVE_THREAD_CLEANUP\n        os::Thread::SetNativeThreadCleanup(&thread_cleanup_on_cancel);\n#endif\n        s_AttachedThreads = new GCTrackedThreadVector();\n    }\n\n    void Thread::UnInitialize()\n    {\n#if IL2CPP_HAS_NATIVE_THREAD_CLEANUP\n        os::Thread::SetNativeThreadCleanup(NULL);\n#endif\n        delete s_AttachedThreads;\n        s_AttachedThreads = NULL;\n    }\n\n    Il2CppThread* Thread::Attach(Il2CppDomain *domain)\n    {\n        Il2CppThread* thread = Current();\n\n        if (thread != NULL)\n            return thread;\n\n        int temp = 0;\n        if (!GarbageCollector::RegisterThread(&temp))\n            IL2CPP_ASSERT(0 && \"GarbageCollector::RegisterThread failed\");\n\n        StackTrace::InitializeStackTracesForCurrentThread();\n\n        // Get/create OS thread representing the current thread. For pre-existing threads such as\n        // the main thread, this will create an OS thread instance on demand. For threads that have\n        // been started through our OS layer, there will already be an instance.\n        os::Thread* osThread = os::Thread::GetOrCreateCurrentThread();\n\n        // Create managed object representing the current thread.\n\n        thread = (Il2CppThread*)Object::New(il2cpp_defaults.thread_class);\n#if NET_4_0\n        thread->internal_thread = (Il2CppInternalThread*)Object::New(il2cpp_defaults.internal_thread_class);\n#endif\n        thread->GetInternalThread()->handle = osThread;\n        thread->GetInternalThread()->state = kThreadStateRunning;\n        thread->GetInternalThread()->tid = osThread->Id();\n        thread->GetInternalThread()->managed_id = GetNewManagedId();\n        Setup(thread);\n\n        Initialize(thread, domain);\n\n        return thread;\n    }\n\n    void Thread::Setup(Il2CppThread* thread)\n    {\n        thread->GetInternalThread()->synch_cs = new il2cpp::os::FastMutex();\n        thread->GetInternalThread()->apartment_state = kApartmentStateUnknown;\n    }\n\n    void Thread::Initialize(Il2CppThread* thread, Il2CppDomain* domain)\n    {\n        IL2CPP_ASSERT(thread->GetInternalThread()->handle != NULL);\n        IL2CPP_ASSERT(thread->GetInternalThread()->synch_cs != NULL);\n\n        s_CurrentThread.SetValue(thread);\n\n        Domain::ContextSet(domain->default_context);\n\n        Register(thread);\n        AdjustStaticData();\n\n#if IL2CPP_DEBUGGER_ENABLED\n        il2cpp_debugger_notify_thread_attach(thread);\n#endif\n\n        // Sync thread name.\n        if (thread->GetInternalThread()->name)\n        {\n            std::string utf8Name = il2cpp::utils::StringUtils::Utf16ToUtf8(thread->GetInternalThread()->name);\n            thread->GetInternalThread()->handle->SetName(utf8Name);\n        }\n\n        // Sync thread apartment state.\n        thread->GetInternalThread()->apartment_state = thread->GetInternalThread()->handle->GetApartment();\n\n#if IL2CPP_HAS_NATIVE_THREAD_CLEANUP\n        // register us for platform specific cleanup attempt in case thread is not exited cleanly\n        os::Thread::RegisterCurrentThreadForCleanup(thread);\n#endif\n\n        // If an interrupt has been requested before the thread was started, re-request\n        // the interrupt now.\n        if (thread->GetInternalThread()->interruption_requested)\n            RequestInterrupt(thread);\n    }\n\n    void Thread::Uninitialize(Il2CppThread *thread)\n    {\n#if IL2CPP_HAS_NATIVE_THREAD_CLEANUP\n        // unregister from special cleanup since we are doing it now\n        os::Thread::UnregisterCurrentThreadForCleanup();\n#endif\n\n        if (!GarbageCollector::UnregisterThread())\n            IL2CPP_ASSERT(0 && \"GarbageCollector::UnregisterThread failed\");\n\n#if IL2CPP_DEBUGGER_ENABLED\n        il2cpp_debugger_notify_thread_detach(thread);\n#endif\n\n        Unregister(thread);\n        FreeThreadStaticData(thread);\n\n#if !NET_4_0\n        delete[] thread->GetInternalThread()->serialized_culture_info;\n#endif\n\n        os::Thread::DetachCurrentThread();\n        s_CurrentThread.SetValue(NULL);\n    }\n\n    Il2CppThread* Thread::Current()\n    {\n        void* value = NULL;\n        s_CurrentThread.GetValue(&value);\n        return (Il2CppThread*)value;\n    }\n\n    Il2CppThread** Thread::GetAllAttachedThreads(size_t &size)\n    {\n        size = s_AttachedThreads->size();\n        return &(*s_AttachedThreads)[0];\n    }\n\n    static void STDCALL TerminateBackgroundThread(void* context)\n    {\n        // We throw a dummy exception to make sure things clean up properly\n        // and we don't leave any locks behind (such as global locks in the allocator which\n        // would then deadlock other threads). This could work off ThreadAbortException\n        // but we don't want to deal with a managed exception here. So we use a C++ exception.\n        throw Thread::NativeThreadAbortException();\n    }\n\n    void Thread::KillAllBackgroundThreadsAndWaitForForegroundThreads()\n    {\n#if IL2CPP_SUPPORT_THREADS\n        Il2CppThread* gcFinalizerThread = NULL;\n        Il2CppThread* currentThread = Current();\n        IL2CPP_ASSERT(currentThread != NULL && \"No current thread!\");\n\n        s_ThreadMutex.Lock();\n        s_BlockNewThreads = true;\n        GCTrackedThreadVector attachedThreadsCopy = *s_AttachedThreads;\n        s_ThreadMutex.Unlock();\n\n        std::vector<os::Thread*> backgroundThreads;\n        std::vector<os::Thread*> foregroundThreads;\n\n        // Kill all threads but the finalizer and current one. We temporarily flush out\n        // the entire list and then just put the two threads back.\n        while (attachedThreadsCopy.size())\n        {\n            Il2CppThread* thread = attachedThreadsCopy.back();\n            os::Thread* osThread = thread->GetInternalThread()->handle;\n\n            if (GarbageCollector::IsFinalizerThread(thread))\n            {\n                IL2CPP_ASSERT(gcFinalizerThread == NULL && \"There seems to be more than one finalizer thread!\");\n                gcFinalizerThread = thread;\n            }\n            else if (thread != currentThread)\n            {\n                // If it's a background thread, request it to kill itself.\n                if (GetState(thread) & kThreadStateBackground)\n                {\n                    ////TODO: use Thread.Abort() instead\n                    osThread->QueueUserAPC(TerminateBackgroundThread, NULL);\n\n                    backgroundThreads.push_back(osThread);\n                }\n                else\n                    foregroundThreads.push_back(osThread);\n            }\n\n            attachedThreadsCopy.pop_back();\n        }\n\n        ////FIXME: While we don't have stable thread abortion in place yet, work around problems in\n        ////    the current implementation by repeatedly requesting threads to terminate. This works around\n        ////    race condition to some extent.\n        while (backgroundThreads.size())\n        {\n            os::Thread* osThread = backgroundThreads.back();\n\n            // Wait for the thread.\n            if (osThread->Join(10) == kWaitStatusSuccess)\n                backgroundThreads.pop_back();\n            else\n            {\n                ////TODO: use Thread.Abort() instead\n                osThread->QueueUserAPC(TerminateBackgroundThread, NULL);\n            }\n        }\n\n        for (unsigned i = 0; i < foregroundThreads.size(); ++i)\n        {\n            foregroundThreads[i]->Join();\n        }\n\n\n        AUTO_LOCK_THREADS();\n        s_AttachedThreads->clear();\n\n        // Put finalizer and current thread back in list.\n        IL2CPP_ASSERT(gcFinalizerThread != NULL && \"GC finalizer thread was not found in list of attached threads!\");\n        if (gcFinalizerThread)\n            s_AttachedThreads->push_back(gcFinalizerThread);\n        if (currentThread)\n            s_AttachedThreads->push_back(currentThread);\n#endif\n    }\n\n    void Thread::Detach(Il2CppThread *thread)\n    {\n        IL2CPP_ASSERT(thread != NULL && \"Cannot detach a NULL thread\");\n\n        Uninitialize(thread);\n        il2cpp::vm::StackTrace::CleanupStackTracesForCurrentThread();\n    }\n\n    Il2CppThread* Thread::Main()\n    {\n        return s_MainThread;\n    }\n\n    void Thread::SetMain(Il2CppThread* thread)\n    {\n        s_MainThread = thread;\n    }\n\n    void Thread::SetState(Il2CppThread *thread, ThreadState value)\n    {\n        il2cpp::os::FastAutoLock lock(thread->GetInternalThread()->synch_cs);\n        thread->GetInternalThread()->state |= value;\n    }\n\n#if NET_4_0\n    void Thread::ClrState(Il2CppInternalThread* thread, ThreadState clr)\n    {\n        il2cpp::os::FastAutoLock lock(thread->synch_cs);\n        thread->state &= ~clr;\n    }\n\n    void Thread::SetState(Il2CppInternalThread *thread, ThreadState value)\n    {\n        il2cpp::os::FastAutoLock lock(thread->synch_cs);\n        thread->state |= value;\n    }\n\n    ThreadState Thread::GetState(Il2CppInternalThread *thread)\n    {\n        il2cpp::os::FastAutoLock lock(thread->synch_cs);\n        return (ThreadState)thread->state;\n    }\n\n    bool Thread::TestState(Il2CppInternalThread* thread, ThreadState value)\n    {\n        il2cpp::os::FastAutoLock lock(thread->synch_cs);\n        return (thread->state & value) != 0;\n    }\n\n    Il2CppInternalThread* Thread::CurrentInternal()\n    {\n        return Current()->GetInternalThread();\n    }\n\n#endif\n\n    ThreadState Thread::GetState(Il2CppThread *thread)\n    {\n        il2cpp::os::FastAutoLock lock(thread->GetInternalThread()->synch_cs);\n        return (ThreadState)thread->GetInternalThread()->state;\n    }\n\n    void Thread::ClrState(Il2CppThread* thread, ThreadState state)\n    {\n        il2cpp::os::FastAutoLock lock(thread->GetInternalThread()->synch_cs);\n        thread->GetInternalThread()->state &= ~state;\n    }\n\n    const int32_t kMaxThreadStaticSlots = 2048;\n\n    void Thread::AdjustStaticData()\n    {\n        AUTO_LOCK_THREADS();\n        size_t index = 0;\n        Il2CppThread* thread = Current();\n        if (!thread->GetInternalThread()->static_data)\n            thread->GetInternalThread()->static_data = (void**)IL2CPP_CALLOC(kMaxThreadStaticSlots, sizeof(void*));\n        for (std::vector<int32_t>::const_iterator iter = s_ThreadStaticSizes.begin(); iter != s_ThreadStaticSizes.end(); ++iter)\n        {\n            if (!thread->GetInternalThread()->static_data[index])\n                thread->GetInternalThread()->static_data[index] = GarbageCollector::AllocateFixed(*iter, NULL);\n            index++;\n        }\n    }\n\n    int32_t Thread::AllocThreadStaticData(int32_t size)\n    {\n        AUTO_LOCK_THREADS();\n        int32_t index = (int32_t)s_ThreadStaticSizes.size();\n        IL2CPP_ASSERT(index < kMaxThreadStaticSlots);\n        s_ThreadStaticSizes.push_back(size);\n        for (GCTrackedThreadVector::const_iterator iter = s_AttachedThreads->begin(); iter != s_AttachedThreads->end(); ++iter)\n        {\n            Il2CppThread* thread = *iter;\n            if (!thread->GetInternalThread()->static_data)\n                thread->GetInternalThread()->static_data = (void**)IL2CPP_CALLOC(kMaxThreadStaticSlots, sizeof(void*));\n            thread->GetInternalThread()->static_data[index] = GarbageCollector::AllocateFixed(size, NULL);\n        }\n\n        return index;\n    }\n\n    void Thread::FreeThreadStaticData(Il2CppThread *thread)\n    {\n        AUTO_LOCK_THREADS();\n        size_t index = 0;\n        for (std::vector<int32_t>::const_iterator iter = s_ThreadStaticSizes.begin(); iter != s_ThreadStaticSizes.end(); ++iter)\n        {\n            if (thread->GetInternalThread()->static_data[index])\n                GarbageCollector::FreeFixed(thread->GetInternalThread()->static_data[index]);\n            index++;\n        }\n        IL2CPP_FREE(thread->GetInternalThread()->static_data);\n        thread->GetInternalThread()->static_data = NULL;\n    }\n\n    void* Thread::GetThreadStaticData(int32_t offset)\n    {\n        // No lock. We allocate static_data once with a fixed size so we can read it\n        // safely without a lock here.\n        IL2CPP_ASSERT(offset >= 0 && static_cast<uint32_t>(offset) < s_ThreadStaticSizes.size());\n        return Current()->GetInternalThread()->static_data[offset];\n    }\n\n    void Thread::Register(Il2CppThread *thread)\n    {\n        AUTO_LOCK_THREADS();\n        if (s_BlockNewThreads)\n            TerminateBackgroundThread(NULL);\n        else\n            s_AttachedThreads->push_back(thread);\n    }\n\n    void Thread::Unregister(Il2CppThread *thread)\n    {\n        AUTO_LOCK_THREADS();\n        GCTrackedThreadVector::iterator it = std::find(s_AttachedThreads->begin(), s_AttachedThreads->end(), thread);\n        IL2CPP_ASSERT(it != s_AttachedThreads->end() && \"Vm thread not found in list of attached threads.\");\n        s_AttachedThreads->erase(it);\n    }\n\n    bool Thread::IsVmThread(Il2CppThread *thread)\n    {\n        return !GarbageCollector::IsFinalizerThread(thread);\n    }\n\n    char *Thread::GetName(uint32_t *len)\n    {\n        *len = 0;\n\n        // TODO: not implemented\n\n        return NULL;\n    }\n\n    void Thread::SetName(Il2CppThread* thread, Il2CppString* name)\n    {\n        il2cpp::os::FastAutoLock lock(thread->GetInternalThread()->synch_cs);\n\n        // Throw if already set.\n        if (thread->GetInternalThread()->name_len != 0)\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetInvalidOperationException(\"Thread name can only be set once.\"));\n\n        // Store name.\n        thread->GetInternalThread()->name_len = utils::StringUtils::GetLength(name);\n        thread->GetInternalThread()->name = il2cpp::utils::StringUtils::StringDuplicate(utils::StringUtils::GetChars(name), thread->GetInternalThread()->name_len);\n\n        // Hand over to OS layer, if thread has been started already.\n        if (thread->GetInternalThread()->handle)\n        {\n            std::string utf8Name = il2cpp::utils::StringUtils::Utf16ToUtf8(thread->GetInternalThread()->name);\n            thread->GetInternalThread()->handle->SetName(utf8Name);\n        }\n    }\n\n#if NET_4_0\n    void Thread::SetName(Il2CppInternalThread* thread, Il2CppString* name)\n    {\n        il2cpp::os::FastAutoLock lock(thread->synch_cs);\n\n        // Throw if already set.\n        if (thread->name_len != 0)\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetInvalidOperationException(\"Thread name can only be set once.\"));\n\n        // Store name.\n        thread->name_len = utils::StringUtils::GetLength(name);\n        thread->name = il2cpp::utils::StringUtils::StringDuplicate(utils::StringUtils::GetChars(name), thread->name_len);\n\n        // Hand over to OS layer, if thread has been started already.\n        if (thread->handle)\n        {\n            std::string utf8Name = il2cpp::utils::StringUtils::Utf16ToUtf8(thread->name);\n            thread->handle->SetName(utf8Name);\n        }\n    }\n\n#endif\n\n    static void STDCALL CheckCurrentThreadForInterruptCallback(void* context)\n    {\n        Thread::CheckCurrentThreadForInterruptAndThrowIfNecessary();\n    }\n\n    void Thread::RequestInterrupt(Il2CppThread* thread)\n    {\n        il2cpp::os::FastAutoLock lock(thread->GetInternalThread()->synch_cs);\n\n        thread->GetInternalThread()->interruption_requested = true;\n\n        // If thread has already been started, queue an interrupt now.\n        il2cpp::os::Thread* osThread = thread->GetInternalThread()->handle;\n        if (osThread)\n            osThread->QueueUserAPC(CheckCurrentThreadForInterruptCallback, NULL);\n    }\n\n    void Thread::CheckCurrentThreadForInterruptAndThrowIfNecessary()\n    {\n        Il2CppThread* currentThread = il2cpp::vm::Thread::Current();\n        if (!currentThread)\n            return;\n\n        il2cpp::os::FastAutoLock lock(currentThread->GetInternalThread()->synch_cs);\n\n        // Don't throw if thread is not currently in waiting state or if there's\n        // no pending interrupt.\n        if (!currentThread->GetInternalThread()->interruption_requested\n            || !(il2cpp::vm::Thread::GetState(currentThread) & il2cpp::vm::kThreadStateWaitSleepJoin))\n            return;\n\n        // Mark the current thread as being unblocked.\n        currentThread->GetInternalThread()->interruption_requested = false;\n        il2cpp::vm::Thread::ClrState(currentThread, il2cpp::vm::kThreadStateWaitSleepJoin);\n\n        // Throw interrupt exception.\n        il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetThreadInterruptedException());\n    }\n\n    static void STDCALL CheckCurrentThreadForAbortCallback(void* context)\n    {\n        Thread::CheckCurrentThreadForAbortAndThrowIfNecessary();\n    }\n\n    bool Thread::RequestAbort(Il2CppThread* thread)\n    {\n        il2cpp::os::FastAutoLock lock(thread->GetInternalThread()->synch_cs);\n\n        ThreadState state = il2cpp::vm::Thread::GetState(thread);\n        if (state & kThreadStateAbortRequested || state & kThreadStateStopped || state & kThreadStateStopRequested)\n            return false;\n\n        il2cpp::os::Thread* osThread = thread->GetInternalThread()->handle;\n        if (osThread)\n        {\n            // If thread has already been started, queue an abort now.\n            Thread::SetState(thread, kThreadStateAbortRequested);\n            osThread->QueueUserAPC(CheckCurrentThreadForAbortCallback, NULL);\n        }\n        else\n        {\n            // If thread has not started, put it in the aborted state.\n            Thread::SetState(thread, kThreadStateAborted);\n        }\n\n        return true;\n    }\n\n#if NET_4_0\n    bool Thread::RequestAbort(Il2CppInternalThread* thread)\n    {\n        il2cpp::os::FastAutoLock lock(thread->synch_cs);\n\n        ThreadState state = il2cpp::vm::Thread::GetState(thread);\n        if (state & kThreadStateAbortRequested || state & kThreadStateStopped || state & kThreadStateStopRequested)\n            return false;\n\n        il2cpp::os::Thread* osThread = thread->handle;\n        if (osThread)\n        {\n            // If thread has already been started, queue an abort now.\n            Thread::SetState(thread, kThreadStateAbortRequested);\n            osThread->QueueUserAPC(CheckCurrentThreadForAbortCallback, NULL);\n        }\n        else\n        {\n            // If thread has not started, put it in the aborted state.\n            Thread::SetState(thread, kThreadStateAborted);\n        }\n\n        return true;\n    }\n\n    void Thread::SetPriority(Il2CppThread* thread, int32_t priority)\n    {\n        Il2CppInternalThread* internalThread = thread->GetInternalThread();\n        il2cpp::os::FastAutoLock lock(internalThread->synch_cs);\n        internalThread->handle->SetPriority((ThreadPriority)priority);\n    }\n\n    int32_t Thread::GetPriority(Il2CppThread* thread)\n    {\n        Il2CppInternalThread* internalThread = thread->GetInternalThread();\n        il2cpp::os::FastAutoLock lock(internalThread->synch_cs);\n        return internalThread->handle->GetPriority();\n    }\n\n    struct StartDataInternal\n    {\n        Il2CppThread* m_Thread;\n        Il2CppDomain* m_Domain;\n        void* m_Delegate;\n        void* m_StartArg;\n        il2cpp::os::Semaphore* m_Semaphore;\n    };\n\n    static void ThreadStart(void* arg)\n    {\n        StartDataInternal* startData = (StartDataInternal*)arg;\n\n        startData->m_Semaphore->Wait();\n\n        {\n            int temp = 0;\n            if (!GarbageCollector::RegisterThread(&temp))\n                IL2CPP_ASSERT(0 && \"GarbageCollector::RegisterThread failed\");\n\n            il2cpp::vm::StackTrace::InitializeStackTracesForCurrentThread();\n\n            il2cpp::vm::Thread::Initialize(startData->m_Thread, startData->m_Domain);\n            il2cpp::vm::Thread::SetState(startData->m_Thread, kThreadStateRunning);\n\n            try\n            {\n                try\n                {\n                    ((void(*)(void*))startData->m_Delegate)(startData->m_StartArg);\n                }\n                catch (Il2CppExceptionWrapper& ex)\n                {\n                    Runtime::UnhandledException(ex.ex);\n                }\n            }\n            catch (il2cpp::vm::Thread::NativeThreadAbortException)\n            {\n                // Nothing to do. We've successfully aborted the thread.\n                il2cpp::vm::Thread::SetState(startData->m_Thread, kThreadStateAborted);\n            }\n\n            il2cpp::vm::Thread::ClrState(startData->m_Thread, kThreadStateRunning);\n            il2cpp::vm::Thread::SetState(startData->m_Thread, kThreadStateStopped);\n            il2cpp::vm::Thread::Uninitialize(startData->m_Thread);\n\n            il2cpp::vm::StackTrace::CleanupStackTracesForCurrentThread();\n        }\n\n        delete startData->m_Semaphore;\n        GarbageCollector::FreeFixed(startData);\n    }\n\n    Il2CppInternalThread* Thread::CreateInternal(void(*func)(void*), void* arg, bool threadpool_thread, uint32_t stack_size)\n    {\n        os::Thread* osThread = new os::Thread();\n\n        Il2CppThread* thread = (Il2CppThread*)Object::New(il2cpp_defaults.thread_class);\n        Il2CppInternalThread* internal = (Il2CppInternalThread*)Object::New(il2cpp_defaults.internal_thread_class);\n\n        thread->internal_thread = internal;\n\n        internal->state = kThreadStateUnstarted;\n        internal->handle = osThread;\n        internal->synch_cs = new il2cpp::os::FastMutex();\n        internal->apartment_state = il2cpp::os::kApartmentStateUnknown;\n        internal->threadpool_thread = threadpool_thread;\n\n        // use fixed GC memory since we are storing managed object pointers\n        StartDataInternal* startData = (StartDataInternal*)GarbageCollector::AllocateFixed(sizeof(StartDataInternal), NULL);\n        startData->m_Thread = thread;\n        startData->m_Domain = Domain::GetCurrent();\n        startData->m_Delegate = (void*)func;\n        startData->m_StartArg = arg;\n        startData->m_Semaphore = new il2cpp::os::Semaphore(0);\n\n        osThread->SetStackSize(stack_size);\n        osThread->SetExplicitApartment(static_cast<il2cpp::os::ApartmentState>(internal->apartment_state));\n        il2cpp::os::ErrorCode status = osThread->Run(&ThreadStart, startData);\n        if (status != il2cpp::os::kErrorCodeSuccess)\n        {\n            delete osThread;\n            return NULL;\n        }\n\n        internal->state &= ~kThreadStateUnstarted;\n        internal->tid = osThread->Id();\n        internal->managed_id = GetNewManagedId();\n\n        startData->m_Semaphore->Post(1, NULL);\n\n        return internal;\n    }\n\n    void Thread::Stop(Il2CppInternalThread* thread)\n    {\n        IL2CPP_ASSERT(thread != CurrentInternal());\n        if (!RequestAbort(thread))\n            return;\n\n        os::Thread* osThread = thread->handle;\n\n        ////FIXME: While we don't have stable thread abortion in place yet, work around problems in\n        ////    the current implementation by repeatedly requesting threads to terminate. This works around\n        ////    race condition to some extent.\n        while (true)\n        {\n            // If it's a background thread, request it to kill itself.\n            if (GetState(thread) & kThreadStateBackground)\n            {\n                ////TODO: use Thread.Abort() instead\n                osThread->QueueUserAPC(TerminateBackgroundThread, NULL);\n            }\n\n            // Wait for the thread.\n            if (osThread->Join(10) == kWaitStatusSuccess)\n                break;\n        }\n    }\n\n    void Thread::Sleep(uint32_t ms)\n    {\n        CurrentInternal()->handle->Sleep(ms);\n    }\n\n    bool Thread::YieldInternal()\n    {\n        return os::Thread::YieldInternal();\n    }\n\n#endif\n\n    void Thread::CheckCurrentThreadForAbortAndThrowIfNecessary()\n    {\n        Il2CppThread* currentThread = il2cpp::vm::Thread::Current();\n        if (!currentThread)\n            return;\n\n        il2cpp::os::FastAutoLock lock(currentThread->GetInternalThread()->synch_cs);\n\n        ThreadState state = il2cpp::vm::Thread::GetState(currentThread);\n        if (!(state & kThreadStateAbortRequested))\n            return;\n\n        // Mark the current thread as being unblocked.\n        il2cpp::vm::Thread::ClrState(currentThread, kThreadStateAbortRequested);\n\n        // Throw interrupt exception.\n        Il2CppException* abortException = il2cpp::vm::Exception::GetThreadAbortException();\n        IL2CPP_OBJECT_SETREF(currentThread->GetInternalThread(), abort_exc, (Il2CppObject*)abortException);\n        il2cpp::vm::Exception::Raise(abortException);\n    }\n\n    void Thread::ResetAbort(Il2CppThread* thread)\n    {\n        il2cpp::vm::Thread::ClrState(thread, kThreadStateAbortRequested);\n        if (thread->GetInternalThread()->abort_exc == NULL)\n            il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetThreadStateException(\"Unable to reset abort because no abort was requested.\"));\n    }\n\n    void Thread::MemoryBarrier()\n    {\n        os::Atomic::MemoryBarrier();\n    }\n\n    int32_t Thread::GetNewManagedId()\n    {\n        return os::Atomic::Increment(&s_NextManagedThreadId);\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Thread.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include \"il2cpp-config.h\"\n#include \"utils/NonCopyable.h\"\n\nstruct MethodInfo;\n\nstruct Il2CppArray;\nstruct Il2CppDomain;\nstruct Il2CppObject;\nstruct Il2CppThread;\nstruct Il2CppInternalThread;\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n// System.Threading.ThreadState\n    enum ThreadState\n    {\n        kThreadStateRunning = 0x00000000,\n        kThreadStateStopRequested = 0x00000001,\n        kThreadStateSuspendRequested = 0x00000002,\n        kThreadStateBackground = 0x00000004,\n        kThreadStateUnstarted = 0x00000008,\n        kThreadStateStopped = 0x00000010,\n        kThreadStateWaitSleepJoin = 0x00000020,\n        kThreadStateSuspended = 0x00000040,\n        kThreadStateAbortRequested = 0x00000080,\n        kThreadStateAborted = 0x00000100\n    };\n\n\n// System.Threading.ApartmentState\n    enum ThreadApartmentState\n    {\n        kThreadApartmentStateSTA = 0x00000000,\n        kThreadApartmentStateMTA = 0x00000001,\n        kThreadApartmentStateUnknown = 0x00000002\n    };\n\n\n    class LIBIL2CPP_CODEGEN_API Thread\n    {\n    public:\n        static char *GetName(uint32_t *len);\n        static void SetName(Il2CppThread* thread, Il2CppString* name);\n        static void SetName(Il2CppInternalThread* thread, Il2CppString* name);\n        static Il2CppThread* Current();\n        static Il2CppThread* Attach(Il2CppDomain *domain);\n        static void Detach(Il2CppThread *thread);\n        static void WalkFrameStack(Il2CppThread *thread, Il2CppFrameWalkFunc func, void *user_data);\n        static Il2CppThread** GetAllAttachedThreads(size_t &size);\n        static void KillAllBackgroundThreadsAndWaitForForegroundThreads();\n        static Il2CppThread* Main();\n        static bool IsVmThread(Il2CppThread *thread);\n\n        static void RequestInterrupt(Il2CppThread* thread);\n        static void CheckCurrentThreadForInterruptAndThrowIfNecessary();\n\n        static bool RequestAbort(Il2CppThread* thread);\n        static void CheckCurrentThreadForAbortAndThrowIfNecessary();\n        static void ResetAbort(Il2CppThread* thread);\n#if NET_4_0\n        static bool RequestAbort(Il2CppInternalThread* thread);\n        static void SetPriority(Il2CppThread* thread, int32_t priority);\n        static int32_t GetPriority(Il2CppThread* thread);\n#endif\n\n        struct NativeThreadAbortException {};\n\n    public:\n        // internal\n        static void Initialize();\n        static void UnInitialize();\n\n        static void AdjustStaticData();\n        static int32_t AllocThreadStaticData(int32_t size);\n        static void FreeThreadStaticData(Il2CppThread *thread);\n        static void* GetThreadStaticData(int32_t offset);\n\n        static void Register(Il2CppThread *thread);\n        static void Unregister(Il2CppThread *thread);\n\n        static void Setup(Il2CppThread* thread);\n\n        /// Initialize and register thread.\n        /// NOTE: Must be called on thread!\n        static void Initialize(Il2CppThread *thread, Il2CppDomain* domain);\n        static void Uninitialize(Il2CppThread *thread);\n\n        static void SetMain(Il2CppThread* thread);\n\n        static void SetState(Il2CppThread *thread, ThreadState value);\n        static ThreadState GetState(Il2CppThread *thread);\n        static void ClrState(Il2CppThread* thread, ThreadState clr);\n\n        static void MemoryBarrier();\n\n        static int32_t GetNewManagedId();\n\n#if NET_4_0\n        static Il2CppInternalThread* CurrentInternal();\n\n        static void ClrState(Il2CppInternalThread* thread, ThreadState clr);\n        static void SetState(Il2CppInternalThread *thread, ThreadState value);\n        static ThreadState GetState(Il2CppInternalThread *thread);\n        static bool TestState(Il2CppInternalThread* thread, ThreadState value);\n\n        static Il2CppInternalThread* CreateInternal(void(*func)(void*), void* arg, bool threadpool_thread, uint32_t stack_size);\n\n        static void Stop(Il2CppInternalThread* thread);\n\n        static void Sleep(uint32_t ms);\n\n        static bool YieldInternal();\n\n#endif\n\n    private:\n        static Il2CppThread* s_MainThread;\n    };\n\n    class ThreadAttacher : il2cpp::utils::NonCopyable\n    {\n    public:\n        ThreadAttacher(Il2CppDomain *domain)\n        {\n            m_Thread = Thread::Attach(domain);\n        }\n\n        ~ThreadAttacher()\n        {\n            Thread::Detach(m_Thread);\n        }\n\n    private:\n        Il2CppThread* m_Thread;\n    };\n\n    class ThreadStateSetter : il2cpp::utils::NonCopyable\n    {\n    public:\n        ThreadStateSetter(ThreadState state) : m_State(state)\n        {\n            m_Thread = il2cpp::vm::Thread::Current();\n            Thread::SetState(m_Thread, m_State);\n        }\n\n        ~ThreadStateSetter()\n        {\n            Thread::ClrState(m_Thread, m_State);\n        }\n\n    private:\n        ThreadState m_State;\n        Il2CppThread* m_Thread;\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/ThreadPool.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include \"class-internals.h\"\n#include \"il2cpp-api.h\"\n#include \"object-internals.h\"\n#include \"vm/Array.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/Image.h\"\n#include \"vm/Object.h\"\n#include \"vm/Thread.h\"\n#include \"vm/ThreadPool.h\"\n#include \"vm/WaitHandle.h\"\n#include \"os/Atomic.h\"\n#include \"os/Environment.h\"\n#include \"os/Event.h\"\n#include \"os/Mutex.h\"\n#include \"os/Semaphore.h\"\n#include \"os/Socket.h\"\n#include \"os/Thread.h\"\n#include \"gc/Allocator.h\"\n#include \"gc/GCHandle.h\"\n#include \"utils/Memory.h\"\n#include \"icalls/System/System.Net.Sockets/Socket.h\"\n\n#include <queue>\n#include <vector>\n#include <list>\n#include <limits>\n#include <algorithm>\n\n#if IL2CPP_TARGET_POSIX\n#include <unistd.h>\n#include \"os/Posix/PosixHelpers.h\"\n#elif IL2CPP_TARGET_WINDOWS\n#include \"os/Win32/WindowsHeaders.h\"\n#include \"os/Win32/ThreadImpl.h\"\n#include <winsock2.h>\n#endif\n\n#if IL2CPP_USE_SOCKET_MULTIPLEX_IO\n#include \"MultiplexIO.h\"\n#endif\n\n////TODO: Currently the pool uses a single global lock for each compartment; doesn't scale well and provides room for optimization.\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    enum\n    {\n        THREADS_PER_CORE = 10\n    };\n\n    typedef gc::Allocator<Il2CppAsyncResult*> AsyncResultAllocator;\n    typedef std::list<Il2CppAsyncResult*, AsyncResultAllocator> AsyncResultList;\n    typedef std::vector<Il2CppAsyncResult*, AsyncResultAllocator> AsyncResultVector;\n    typedef std::queue<Il2CppAsyncResult*, AsyncResultList> AsyncResultQueue;\n\n\n    static const Il2CppClass* g_SocketAsyncCallClass;\n    static const Il2CppClass* g_ProcessAsyncCallClass;\n    static const Il2CppClass* g_WriteDelegateClass;\n    static const Il2CppClass* g_ReadDelegateClass;\n////TODO: add System.Net.Sockets.Socket.SendFileHandler?\n\n    static bool IsInstanceOfDelegateClass(Il2CppDelegate* delegate, const char* delegateClassName, const char* outerClassName, const Il2CppClass*& cachePtr)\n    {\n        Il2CppClass* klass = delegate->object.klass;\n\n        Il2CppClass* declaringType = Class::GetDeclaringType(klass);\n\n        if (cachePtr == 0 &&\n            strcmp(klass->name, delegateClassName) == 0 &&\n            (strcmp(vm::Image::GetName(klass->image), \"System\") == 0 ||\n             strcmp(vm::Image::GetName(klass->image), \"System.dll\") == 0) &&\n            declaringType && strcmp(declaringType->name, outerClassName) == 0)\n        {\n            cachePtr = klass;\n        }\n\n        return (klass == cachePtr);\n    }\n\n    static bool IsSocketAsyncCall(Il2CppDelegate* delegate)\n    {\n        return IsInstanceOfDelegateClass(delegate, \"SocketAsyncCall\", \"Socket\", g_SocketAsyncCallClass);\n    }\n\n    static bool IsProcessAsyncCall(Il2CppDelegate* delegate)\n    {\n        return IsInstanceOfDelegateClass(delegate, \"AsyncReadHandler\", \"Process\", g_ProcessAsyncCallClass);\n    }\n\n    static bool IsFileStreamAsyncCall(Il2CppDelegate* delegate)\n    {\n        return IsInstanceOfDelegateClass(delegate, \"WriteDelegate\", \"FileStream\", g_WriteDelegateClass) ||\n            IsInstanceOfDelegateClass(delegate, \"ReadDelegate\", \"FileStream\", g_ReadDelegateClass);\n    }\n\n/// Socket operations enumeration taken from Mono. (Mostly) corresponds\n/// to System.Net.Sockets.Socket.SocketOperation.\n    enum\n    {\n        AIO_OP_FIRST,\n        AIO_OP_ACCEPT = 0,\n        AIO_OP_CONNECT,\n        AIO_OP_RECEIVE,\n        AIO_OP_RECEIVEFROM,\n        AIO_OP_SEND,\n        AIO_OP_SENDTO,\n        AIO_OP_RECV_JUST_CALLBACK,\n        AIO_OP_SEND_JUST_CALLBACK,\n        AIO_OP_READPIPE,\n        AIO_OP_LAST\n    };\n\n/// We use a dedicated thread to pre-screen sockets for activity and only then handing them\n/// on to the pool. This avoids having async I/O threads being hogged by single long-running\n/// network requests. It's basically a separate staging step for socket AsyncResults.\n    struct SocketPollingThread\n    {\n        os::FastMutex mutex;\n        AsyncResultQueue queue;\n        os::Thread* thread;\n        os::Event threadStartupAcknowledged;\n\n#if IL2CPP_USE_SOCKET_MULTIPLEX_IO\n        Sockets::MultiplexIO multiplexIO; // container class to allow access to multiplex io socket functions\n#elif IL2CPP_TARGET_POSIX || IL2CPP_TARGET_WINDOWS\n        /// On POSIX, we have no way to interrupt polls() with user APCs in a way that isn't prone\n        /// to race conditions so what we do instead is create a pipe that we include in the poll()\n        /// call and then write to that in order to interrupt an ongoing poll().\n        ///\n        /// On Windows, we used to do QueueUserAPC and throw an exception in order to interrupt poll(),\n        /// however, that is not safe and corrupts memory/leaves dangling pointers to the stack as\n        /// WinSock2 is not exception safe. So we do it in a similar way as POSIX, but instead of pipes\n        /// we use sockets.\n\n        enum\n        {\n            kMessageTerminate,\n            kMessageNewAsyncResult\n        };\n\n#if IL2CPP_TARGET_POSIX\n        typedef int PipeType;\n#elif IL2CPP_TARGET_WINDOWS\n        typedef SOCKET PipeType;\n#endif\n\n        PipeType readPipe;\n        PipeType writePipe;\n\n        static inline void WritePipe(PipeType pipe, char message)\n        {\n#if IL2CPP_TARGET_POSIX\n            write(pipe, &message, 1);\n#elif IL2CPP_TARGET_WINDOWS\n            send(pipe, &message, 1, 0);\n#endif\n        }\n\n        static inline char ReadPipe(PipeType pipe, char* message, int length)\n        {\n#if IL2CPP_TARGET_POSIX\n            return read(pipe, message, length);\n#elif IL2CPP_TARGET_WINDOWS\n            return recv(pipe, message, length, 0);\n#endif\n        }\n\n#endif\n\n        SocketPollingThread()\n            : threadStartupAcknowledged(true)\n            , thread(NULL)\n#if !IL2CPP_USE_SOCKET_MULTIPLEX_IO && (IL2CPP_TARGET_POSIX || IL2CPP_TARGET_WINDOWS)\n            , readPipe(0)\n            , writePipe(0)\n#endif\n        {\n        }\n\n        void QueueRequest(Il2CppAsyncResult* asyncResult)\n        {\n            // Put in queue.\n            {\n                os::FastAutoLock lock(&mutex);\n                queue.push(asyncResult);\n            }\n\n            // Interrupt polling thread to pick up new request.\n#if IL2CPP_USE_SOCKET_MULTIPLEX_IO\n            multiplexIO.InterruptPoll(); // causes the current blocking poll to abort and recheck the queue\n#elif IL2CPP_TARGET_POSIX || IL2CPP_TARGET_WINDOWS\n            char message = static_cast<char>(kMessageNewAsyncResult);\n            WritePipe(writePipe, message);\n#endif\n        }\n\n        Il2CppAsyncResult* DequeueRequest()\n        {\n            os::FastAutoLock lock(&mutex);\n            if (queue.empty())\n                return NULL;\n            Il2CppAsyncResult* asyncResult = queue.front();\n            queue.pop();\n            return asyncResult;\n        }\n\n        bool ResultReady()\n        {\n            os::FastAutoLock lock(&mutex);\n            return !queue.empty();\n        }\n\n        void RunLoop();\n        void Terminate();\n    };\n\n/// Data for a single pool of threads. We compartmentalize the pool to deal with async I/O and \"normal\" work\n/// items separately.\n    struct ThreadPoolCompartment\n    {\n        /// Human readable name of the compartment (mostly for debugging).\n        const char* compartmentName;\n\n        /// Minimum number of threads to be kept around. This is the number that the pool will\n        /// actively try to maintain. Actual thread count can be less during startup of pool.\n        /// NOTE: Can be changed without locking.\n        int minThreads;\n\n        /// Maximum number of threads the pool will ever have running at the same time.\n        /// NOTE: Can be changed without locking.\n        int maxThreads;\n\n        /// Number of threads currently waiting for new work.\n        /// NOTE: Changed atomically.\n        volatile int32_t numIdleThreads;\n\n        /// Semaphore that worker threads listen on.\n        os::Semaphore signalThreads;\n\n        /// Mutex for queue and threads vector.\n        os::FastMutex mutex;\n\n        /// Queue of pending items.\n        /// NOTE: Requires lock on mutex.\n        AsyncResultQueue queue;\n\n        /// List of threads in the pool. Worker threads register and unregister themselves here.\n        /// NOTE: Requires lock on mutex.\n        std::vector<Il2CppThread*> threads;\n\n        ThreadPoolCompartment()\n            : compartmentName(NULL)\n            , minThreads(0)\n            , maxThreads(4)\n            , signalThreads(0, std::numeric_limits<int32_t>::max())\n            , numIdleThreads(0)\n        {\n        }\n\n        void QueueWorkItem(Il2CppAsyncResult* asyncResult);\n        Il2CppAsyncResult* DequeueNextWorkItem();\n\n        int AttachThread(Il2CppThread* thread)\n        {\n            os::FastAutoLock lock(&mutex);\n            threads.push_back(thread);\n            return (int)threads.size();\n        }\n\n        void DetachThread(Il2CppThread* thread)\n        {\n            os::FastAutoLock lock(&mutex);\n            threads.erase(std::remove(threads.begin(), threads.end(), thread),\n                threads.end());\n        }\n\n        void SignalAllThreads()\n        {\n            signalThreads.Post((int32_t)threads.size());\n        }\n\n        void SpawnNewWorkerThread();\n        void WorkerThreadRunLoop();\n\n        enum\n        {\n            /// Time (in milliseconds) that a worker thread will wait before terminating after finding\n            /// that the pool already has enough threads.\n            kGracePeriodBeforeExtranenousWorkerThreadTerminates = 5000\n        };\n    };\n\n    enum\n    {\n        kWorkerThreadPool,\n        kAsyncIOPool,\n        kNumThreadPoolCompartments\n    };\n\n    static ThreadPoolCompartment* g_ThreadPoolCompartments[kNumThreadPoolCompartments];\n    static SocketPollingThread* g_SocketPollingThread;\n\n#if IL2CPP_TARGET_POSIX && !IL2CPP_USE_SOCKET_MULTIPLEX_IO\n    typedef pollfd NativePollRequest;\n#else\n    typedef os::PollRequest NativePollRequest;\n#endif\n\n\n    static Il2CppSocketAsyncResult* GetSocketAsyncResult(Il2CppAsyncResult* asyncResult)\n    {\n        ////TODO: assert\n        return reinterpret_cast<Il2CppSocketAsyncResult*>(asyncResult->async_state);\n    }\n\n    static bool IsSocketAsyncOperation(Il2CppAsyncResult* asyncResult)\n    {\n        int32_t operation = GetSocketAsyncResult(asyncResult)->operation;\n        return (operation >= AIO_OP_FIRST && operation <= AIO_OP_LAST);\n    }\n\n    static void InitPollRequest(NativePollRequest& request, Il2CppSocketAsyncResult* socketAsyncResult, os::SocketHandleWrapper& socketHandle)\n    {\n        request.revents = os::kPollFlagsNone;\n#if IL2CPP_TARGET_POSIX && !IL2CPP_USE_SOCKET_MULTIPLEX_IO\n        request.events = 0xFFFF;\n#else\n        request.events = os::kPollFlagsNone;\n\n        switch (socketAsyncResult->operation)\n        {\n            case AIO_OP_ACCEPT:\n            case AIO_OP_RECEIVE:\n            case AIO_OP_RECV_JUST_CALLBACK:\n            case AIO_OP_RECEIVEFROM:\n            case AIO_OP_READPIPE:\n                request.events |= os::kPollFlagsIn;\n                break;\n\n            case AIO_OP_SEND:\n            case AIO_OP_SEND_JUST_CALLBACK:\n            case AIO_OP_SENDTO:\n            case AIO_OP_CONNECT:\n                request.events |= os::kPollFlagsOut;\n                break;\n\n            default: // Should never happen\n                IL2CPP_ASSERT(false && \"Unrecognized socket async I/O operation\");\n                break;\n        }\n#endif\n\n#if !NET_4_0\n        // Acquire socket.\n        socketHandle.Acquire(os::PointerToSocketHandle(socketAsyncResult->handle.m_value));\n#else\n        IL2CPP_ASSERT(false && \"Todo .net 4\");\n#endif\n        request.fd = socketHandle.IsValid() ? socketHandle.GetSocket()->GetDescriptor() : -1;\n    }\n\n    void SocketPollingThread::RunLoop()\n    {\n#if !IL2CPP_USE_SOCKET_MULTIPLEX_IO && !IL2CPP_TARGET_POSIX && !IL2CPP_TARGET_WINDOWS\n        IL2CPP_ASSERT(false && \"Platform has no SocketPollingThread mechanism. This function WILL deadlock.\");\n#endif\n\n#if IL2CPP_TARGET_POSIX && !IL2CPP_USE_SOCKET_MULTIPLEX_IO\n        const short kNativePollIn = POLLIN;\n#else\n        const os::PollFlags kNativePollIn = os::kPollFlagsIn;\n#endif\n\n        // List of poll requests that we pass to os::Socket::Poll().\n        std::vector<NativePollRequest> pollRequests;\n\n        // List of AsyncResults corresponding to pollRequests. Needs to be its own list as\n        // this is memory that we need the GC to scan.\n        AsyncResultVector asyncResults;\n\n        // List of socket handles we're currently using. If destructed, will automatically\n        // release all sockets.\n        std::vector<os::SocketHandleWrapper> socketHandles;\n\n#if !IL2CPP_USE_SOCKET_MULTIPLEX_IO && (IL2CPP_TARGET_POSIX || IL2CPP_TARGET_WINDOWS)\n        {\n            NativePollRequest pollRequest;\n            pollRequest.fd = readPipe;\n            pollRequest.events = kNativePollIn;\n            pollRequest.revents = os::kPollFlagsNone;\n            pollRequests.push_back(pollRequest);\n\n            // Push back dummy values to asyncResults and socketHandles so their indices match pollrequest indices\n            asyncResults.push_back(NULL);\n            socketHandles.push_back(os::SocketHandleWrapper());\n        }\n#endif\n\n        // Let other threads know we're ready to take requests.\n        threadStartupAcknowledged.Set();\n\n        while (true)\n        {\n            // See if there's anything new in the queue.\n            while (ResultReady())\n            {\n                // Grab next request.\n                Il2CppAsyncResult* asyncResult = DequeueRequest();\n                if (!asyncResult)\n                    break;\n\n                Il2CppSocketAsyncResult* socketAsyncResult = GetSocketAsyncResult(asyncResult);\n\n                // Add socket handle.\n                socketHandles.push_back(os::SocketHandleWrapper());\n                os::SocketHandleWrapper& socketHandle = socketHandles.back();\n\n                asyncResults.push_back(asyncResult);\n\n                // Add the request to the list.\n                NativePollRequest pollRequest;\n                InitPollRequest(pollRequest, socketAsyncResult, socketHandle);\n                pollRequests.push_back(pollRequest);\n            }\n\n            // Poll the list.\n#if IL2CPP_USE_SOCKET_MULTIPLEX_IO\n            int32_t errorCode = 0;\n            int32_t results = 0;\n            multiplexIO.Poll(pollRequests, -1, &results, &errorCode);\n#elif IL2CPP_TARGET_POSIX || IL2CPP_TARGET_WINDOWS\n#if IL2CPP_TARGET_POSIX\n            os::posix::Poll(pollRequests.data(), pollRequests.size(), -1);\n#else\n            int32_t result, error;\n            os::Socket::Poll(pollRequests, -1, &result, &error);\n#endif\n            if (pollRequests[0].revents != os::kPollFlagsNone)\n            {\n                char message;\n                if (ReadPipe(readPipe, &message, 1) == 1 && message == kMessageTerminate)\n                    throw vm::Thread::NativeThreadAbortException();\n            }\n#endif\n\n            // Go through our requests and see which ones we can forward, which ones are\n            // obsolete, and which ones still need to be waited on.\n#if IL2CPP_USE_SOCKET_MULTIPLEX_IO || (!IL2CPP_TARGET_POSIX && !IL2CPP_TARGET_WINDOWS)\n            const size_t startIndex = 0;\n#else\n            const size_t startIndex = 1;\n#endif\n            for (size_t i = startIndex; i < pollRequests.size();)\n            {\n                // See if there's been some activity that allows us to forward the request\n                // to the thread pool. We don't care what event(s) exactly happened on the\n                // socket and the socket may even have been closed already. All we want is\n                // to forward a socket to the pool as soon as there is some activity and then\n                // have the normal processing chain sort out what kind of activity that was.\n                if (pollRequests[i].revents)\n                {\n                    // Yes.\n                    g_ThreadPoolCompartments[kAsyncIOPool]->QueueWorkItem(asyncResults[i]);\n\n                    pollRequests.erase(pollRequests.begin() + i);\n                    asyncResults.erase(asyncResults.begin() + i);\n                    socketHandles.erase(socketHandles.begin() + i);\n                }\n                else\n                {\n                    ++i;\n                }\n            }\n        }\n    }\n\n    static void FreeThreadHandle(void* data)\n    {\n        uint32_t handle = (uint32_t)(uintptr_t)data;\n        gc::GCHandle::Free(handle);\n    }\n\n#if IL2CPP_TARGET_WINDOWS\n    struct ConnectToSocketArgs\n    {\n        SOCKET s;\n        const sockaddr_in* socketAddress;\n    };\n\n    static void ConnectToSocket(void* arg)\n    {\n        ConnectToSocketArgs* connectArgs = static_cast<ConnectToSocketArgs*>(arg);\n        const int kRetryCount = 3;\n\n        for (int i = 0; i < kRetryCount; i++)\n        {\n            int connectResult = connect(connectArgs->s, reinterpret_cast<const sockaddr*>(connectArgs->socketAddress), sizeof(sockaddr_in));\n\n            if (connectResult == 0)\n                return;\n\n            Sleep(100);\n        }\n\n        IL2CPP_ASSERT(false && \"Failed to connect to socket\");\n    }\n\n#endif\n\n    static void SocketPollingThreadEntryPoint(void* data)\n    {\n        SocketPollingThread* pollingThread = reinterpret_cast<SocketPollingThread*>(data);\n\n        // Properly attach us to the VM and mark us as a background thread.\n        Il2CppThread* managedThread = vm::Thread::Attach(il2cpp_domain_get());\n        uint32_t handle = gc::GCHandle::New((Il2CppObject*)managedThread, true);\n        vm::Thread::SetState(managedThread, kThreadStateBackground);\n        managedThread->GetInternalThread()->handle->SetName(\"Socket I/O Polling Thread\");\n        managedThread->GetInternalThread()->handle->SetPriority(os::kThreadPriorityLow);\n        managedThread->GetInternalThread()->handle->SetCleanupFunction(&FreeThreadHandle, (void*)(uintptr_t)handle);\n\n        // The socket polling thread is not technically a worker pool thread but for all\n        // intents and purposes it is part of the async I/O thread pool. It is important to\n        // mark it as a thread pool thread so that the queueing logic correctly detects\n        // when it is necessary to spin up a new thread to avoid deadlocks.\n        managedThread->GetInternalThread()->threadpool_thread = true;\n\n#if IL2CPP_USE_SOCKET_MULTIPLEX_IO\n#elif IL2CPP_TARGET_POSIX\n        int pipeHandles[2];\n        if (::pipe(pipeHandles) != 0)\n        {\n            vm::Exception::Raise(vm::Exception::GetExecutionEngineException(\"Initialization socket polling thread for thread pool failed!\"));\n        }\n        pollingThread->readPipe = pipeHandles[0];\n        pollingThread->writePipe = pipeHandles[1];\n#elif IL2CPP_TARGET_WINDOWS\n        {\n            SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n            IL2CPP_ASSERT(server != INVALID_SOCKET);\n\n            sockaddr_in serverAddress;\n            int serverAddressLength = sizeof(serverAddress);\n\n            ZeroMemory(&serverAddress, sizeof(serverAddress));\n            serverAddress.sin_family = AF_INET;\n            serverAddress.sin_addr.S_un.S_addr = inet_addr(\"127.0.0.1\");\n\n            int bindResult = bind(server, reinterpret_cast<const sockaddr*>(&serverAddress), serverAddressLength);\n            IL2CPP_ASSERT(bindResult == 0);\n\n            int getsocknameResult = getsockname(server, reinterpret_cast<sockaddr*>(&serverAddress), &serverAddressLength);\n            IL2CPP_ASSERT(getsocknameResult == 0);\n\n            int listenResult = listen(server, 1);\n            IL2CPP_ASSERT(listenResult == 0);\n\n            pollingThread->writePipe = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n            IL2CPP_ASSERT(pollingThread->writePipe != INVALID_SOCKET);\n\n            os::Thread connectThread;\n            ConnectToSocketArgs args = { pollingThread->writePipe, &serverAddress };\n            connectThread.Run(ConnectToSocket, &args);\n\n            sockaddr_in clientAddress = {};\n            int clientAddressLength = sizeof(clientAddress);\n            pollingThread->readPipe = accept(server, reinterpret_cast<sockaddr*>(&clientAddress), &clientAddressLength);\n            if (pollingThread->readPipe == INVALID_SOCKET)\n            {\n                int error = WSAGetLastError();\n                wchar_t errorMessage[512];\n\n                FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, errorMessage, 256, NULL);\n                OutputDebugStringW(errorMessage);\n                OutputDebugStringW(L\"\\r\\n\");\n                IL2CPP_ASSERT(false && \"Failed to accept poll interrupt socket connection\");\n            }\n\n            connectThread.Join();\n            closesocket(server);\n        }\n#endif\n\n        // Do work.\n        try\n        {\n            pollingThread->RunLoop();\n        }\n        catch (Thread::NativeThreadAbortException)\n        {\n            // Runtime cleanup asked us to exit.\n            // Cleanup pipes/sockets that we created\n\n#if IL2CPP_USE_SOCKET_MULTIPLEX_IO\n#elif IL2CPP_TARGET_POSIX\n            close(pollingThread->readPipe);\n            close(pollingThread->writePipe);\n#elif IL2CPP_TARGET_WINDOWS\n            closesocket(pollingThread->readPipe);\n            closesocket(pollingThread->writePipe);\n#endif\n        }\n\n        // Clean up.\n        vm::Thread::Detach(managedThread);\n    }\n\n    static void SpawnSocketPollingThreadIfNeeded()\n    {\n        if (g_SocketPollingThread->thread)\n            return;\n\n        // Spawn thread.\n        {\n            os::FastAutoLock lock(&g_SocketPollingThread->mutex);\n            // Double-check after lock to avoid race condition.\n            if (!g_SocketPollingThread->thread)\n            {\n                g_SocketPollingThread->thread = new os::Thread();\n                g_SocketPollingThread->thread->Run(SocketPollingThreadEntryPoint, g_SocketPollingThread);\n            }\n        }\n\n        // Wait for thread to have started up so we can queue requests on it.\n        g_SocketPollingThread->threadStartupAcknowledged.Wait();\n    }\n\n    void SocketPollingThread::Terminate()\n    {\n#if IL2CPP_TARGET_WINDOWS || IL2CPP_TARGET_POSIX\n        if (!g_SocketPollingThread->thread)\n            return;\n\n#if !IL2CPP_USE_SOCKET_MULTIPLEX_IO\n        WritePipe(writePipe, static_cast<char>(kMessageTerminate));\n#endif\n\n        g_SocketPollingThread->thread->Join();\n#endif\n    }\n\n    static bool IsCurrentThreadAWorkerThread()\n    {\n        Il2CppThread* thread = vm::Thread::Current();\n        return thread->GetInternalThread()->threadpool_thread;\n    }\n\n    void ThreadPoolCompartment::QueueWorkItem(Il2CppAsyncResult* asyncResult)\n    {\n        bool forceNewThread = false;\n        // Put the item in the queue.\n        {\n            os::FastAutoLock lock(&mutex);\n            queue.push(asyncResult);\n            IL2CPP_ASSERT(numIdleThreads >= 0);\n            if (queue.size() > static_cast<uint32_t>(numIdleThreads))\n                forceNewThread = true;\n        }\n\n        // If all our worker threads are tied up and we have room to grow, spawn a\n        // new worker thread. Also, if an item is queued from within a work item that\n        // is currently being processed and we don't have idle threads, force a new\n        // thread to be spawned even if we are at max capacity. This prevents deadlocks\n        // if the code queuing the item then goes and waits on the item it just queued.\n        IL2CPP_ASSERT(maxThreads >= 0);\n        if (forceNewThread &&\n            (threads.size() < static_cast<uint32_t>(maxThreads) || IsCurrentThreadAWorkerThread()))\n        {\n            SpawnNewWorkerThread();\n        }\n        else\n        {\n            // Signal existing thread.\n            signalThreads.Post();\n        }\n    }\n\n    Il2CppAsyncResult* ThreadPoolCompartment::DequeueNextWorkItem()\n    {\n        os::FastAutoLock lock(&mutex);\n\n        if (queue.empty())\n            return NULL;\n\n        Il2CppAsyncResult* result = queue.front();\n        queue.pop();\n\n        return result;\n    }\n\n    static void WorkerThreadEntryPoint(void* data);\n    void ThreadPoolCompartment::SpawnNewWorkerThread()\n    {\n        os::Thread* thread = new os::Thread();\n        thread->Run(WorkerThreadEntryPoint, this);\n    }\n\n    static void HandleSocketAsyncOperation(Il2CppAsyncResult* asyncResult)\n    {\n        Il2CppSocketAsyncResult* socketAsyncResult = GetSocketAsyncResult(asyncResult);\n\n        const icalls::System::System::Net::Sockets::SocketFlags flags =\n            static_cast<icalls::System::System::Net::Sockets::SocketFlags>(socketAsyncResult->socket_flags);\n        Il2CppArray* buffer = socketAsyncResult->buffer;\n        int32_t offset = socketAsyncResult->offset;\n        int32_t count = socketAsyncResult->size;\n\n#if !NET_4_0\n        // Perform send/receive.\n        switch (socketAsyncResult->operation)\n        {\n            case AIO_OP_RECEIVE:\n                socketAsyncResult->total = icalls::System::System::Net::Sockets::Socket::Receive\n                        (socketAsyncResult->handle, buffer, offset, count, flags, &socketAsyncResult->error);\n                break;\n\n            case AIO_OP_SEND:\n                socketAsyncResult->total = icalls::System::System::Net::Sockets::Socket::Send\n                        (socketAsyncResult->handle, buffer, offset, count, flags, &socketAsyncResult->error);\n                break;\n        }\n#else\n        IL2CPP_ASSERT(false && \"TO DO .net 4\");\n#endif\n    }\n\n    void ThreadPoolCompartment::WorkerThreadRunLoop()\n    {\n        bool waitingToTerminate = false;\n\n        // Pump AsyncResults until we're killed.\n        while (true)\n        {\n            // Grab next work item.\n            Il2CppAsyncResult* asyncResult = DequeueNextWorkItem();\n            if (!asyncResult)\n            {\n                // There's no work for us to do so decide what to do.\n\n                // If we've exceeded the normal number of threads for the pool (minThreads),\n                // wait around for a bit and then, if there is no work to do,\n                // terminate.\n                IL2CPP_ASSERT(minThreads >= 0);\n                if (threads.size() > static_cast<uint32_t>(minThreads))\n                {\n                    if (waitingToTerminate)\n                    {\n                        // We've already waited so now is the time to go.\n                        break;\n                    }\n\n                    waitingToTerminate = true;\n                }\n\n                // No item so wait for signal. We need to allow interruptions here as we don't yet\n                // have proper abort support and the runtime currently uses interruptions to get\n                // background threads to exit.\n                os::Atomic::Increment(&numIdleThreads);\n                if (waitingToTerminate)\n                    signalThreads.Wait(kGracePeriodBeforeExtranenousWorkerThreadTerminates, true);\n                else\n                    signalThreads.Wait(true);\n                os::Atomic::Decrement(&numIdleThreads);\n\n                // Try again.\n                continue;\n            }\n            waitingToTerminate = false;\n\n            // See if it's a socket async call and if so, do whatever I/O we need to\n            // do before invoking the delegate.\n            Il2CppDelegate* delegate = asyncResult->async_delegate;\n            const bool isSocketAsyncCall = IsSocketAsyncCall(delegate);\n            if (isSocketAsyncCall)\n                HandleSocketAsyncOperation(asyncResult);\n\n            // Invoke delegate.\n            Il2CppAsyncCall* asyncCall = asyncResult->object_data;\n            Il2CppException* exception = NULL;\n            uint32_t argsGCHandle = (uint32_t)((uintptr_t)asyncResult->data);\n            Il2CppArray* args = (Il2CppArray*)gc::GCHandle::GetTarget(argsGCHandle);\n\n            const uint8_t paramsCount = delegate->method->parameters_count;\n\n            uint8_t byRefArgsCount = 0;\n            for (uint8_t i = 0; i < paramsCount; ++i)\n            {\n                const Il2CppType* paramType = (Il2CppType*)delegate->method->parameters[i].parameter_type;\n                if (paramType->byref)\n                    ++byRefArgsCount;\n            }\n\n            void** byRefArgs = 0;\n            if (byRefArgsCount > 0)\n            {\n                asyncCall->out_args = vm::Array::New(il2cpp_defaults.object_class, byRefArgsCount);\n                byRefArgs = (void**)il2cpp_array_addr(asyncCall->out_args, Il2CppObject*, 0);\n            }\n\n            void** argsPtr = (void**)il2cpp_array_addr(args, Il2CppObject*, 0);\n            void** params = (void**)IL2CPP_MALLOC(paramsCount * sizeof(void*));\n\n            int byRefIndex = 0;\n            for (uint8_t i = 0; i < paramsCount; ++i)\n            {\n                Il2CppType* paramType = (Il2CppType*)delegate->method->parameters[i].parameter_type;\n                const Il2CppClass* paramClass = il2cpp_class_from_type(paramType);\n                const bool isValueType = il2cpp_class_is_valuetype(paramClass);\n\n                if (paramType->byref)\n                {\n                    if (isValueType)\n                    {\n                        // Value types are always boxed\n                        byRefArgs[byRefIndex] = il2cpp_object_unbox((Il2CppObject*)argsPtr[i]);\n                        params[i] = byRefArgs[byRefIndex++];\n                    }\n                    else\n                    {\n                        byRefArgs[byRefIndex] = argsPtr[i];\n                        params[i] = &byRefArgs[byRefIndex++];\n                    }\n                }\n                else\n                {\n                    params[i] = isValueType\n                        ? il2cpp_object_unbox((Il2CppObject*)argsPtr[i]) // Value types are always boxed\n                        : argsPtr[i];\n                }\n            }\n\n            Il2CppObject* result = il2cpp_runtime_invoke(delegate->method, delegate->target, params, &exception);\n\n            IL2CPP_FREE(params);\n            gc::GCHandle::Free(argsGCHandle);\n\n            // Store result.\n            asyncCall->res = result;\n#if !NET_4_0\n            asyncCall->msg = exception;\n#else\n            asyncCall->msg = (Il2CppMethodMessage*)exception;\n#endif\n            os::Atomic::MemoryBarrier();\n            asyncResult->completed = true;\n\n            // Invoke callback, if we have one.\n            Il2CppDelegate* asyncCallback = asyncCall->cb_target;\n            if (asyncCallback)\n            {\n                void* args[1] = { asyncResult };\n                il2cpp_runtime_invoke(asyncCallback->method, asyncCallback->target, args, &exception);\n#if !NET_4_0\n                asyncCall->msg = exception;\n#else\n                asyncCall->msg = (Il2CppMethodMessage*)exception;\n#endif\n            }\n\n            // Signal wait handle, if there's one.\n            il2cpp_monitor_enter(&asyncResult->base);\n            if (asyncResult->handle)\n            {\n                os::Handle* osHandle = vm::WaitHandle::GetPlatformHandle(asyncResult->handle);\n                osHandle->Signal();\n            }\n\n            il2cpp_monitor_exit(&asyncResult->base);\n        }\n    }\n\n    static void WorkerThreadEntryPoint(void* data)\n    {\n        ThreadPoolCompartment* compartment = reinterpret_cast<ThreadPoolCompartment*>(data);\n        Il2CppThread* managedThread = NULL;\n\n        // Do work.\n        try\n        {\n            // Properly attach us to the VM and mark us as a background\n            // worker thread.\n            managedThread = vm::Thread::Attach(il2cpp_domain_get());\n            uint32_t handle = gc::GCHandle::New((Il2CppObject*)managedThread, true);\n            vm::Thread::SetState(managedThread, kThreadStateBackground);\n            managedThread->GetInternalThread()->threadpool_thread = true;\n            int threadCount = compartment->AttachThread(managedThread);\n\n            // Configure OS thread.\n            char name[2048];\n            sprintf(name, \"%s Thread #%i\", compartment->compartmentName, threadCount - 1);\n            managedThread->GetInternalThread()->handle->SetName(name);\n            managedThread->GetInternalThread()->handle->SetPriority(os::kThreadPriorityLow);\n            managedThread->GetInternalThread()->handle->SetCleanupFunction(&FreeThreadHandle, (void*)(uintptr_t)handle);\n            compartment->WorkerThreadRunLoop();\n        }\n        catch (Thread::NativeThreadAbortException)\n        {\n            // Nothing to do. Runtime cleanup asked us to exit.\n        }\n        catch (Il2CppExceptionWrapper e)\n        {\n            // Only eat a ThreadAbortException, as it may have been thrown by the runtime\n            // when there was managed code on the stack, but that managed code exited already.\n            if (strcmp(e.ex->klass->name, \"ThreadAbortException\") != 0)\n                throw;\n        }\n\n        // Clean up.\n        if (managedThread)\n        {\n            compartment->DetachThread(managedThread);\n            vm::Thread::Detach(managedThread);\n        }\n    }\n\n    void ThreadPool::Initialize()\n    {\n#if NET_4_0\n        NOT_SUPPORTED_IL2CPP(ThreadPool::Initialize, \"vm::ThreadPool is not supported in .NET 4.5, use threadpool-ms instead\");\n#else\n        g_SocketPollingThread = new SocketPollingThread();\n        g_ThreadPoolCompartments[kWorkerThreadPool] = new ThreadPoolCompartment();\n        g_ThreadPoolCompartments[kAsyncIOPool] = new ThreadPoolCompartment();\n\n        g_ThreadPoolCompartments[kWorkerThreadPool]->compartmentName = \"Worker Pool\";\n        g_ThreadPoolCompartments[kAsyncIOPool]->compartmentName = \"Async I/O Pool\";\n\n        int numCores = os::Environment::GetProcessorCount();\n        g_ThreadPoolCompartments[kWorkerThreadPool]->minThreads = numCores;\n        g_ThreadPoolCompartments[kWorkerThreadPool]->maxThreads = 20 + THREADS_PER_CORE * numCores;\n        g_ThreadPoolCompartments[kAsyncIOPool]->minThreads = g_ThreadPoolCompartments[kWorkerThreadPool]->minThreads;\n        g_ThreadPoolCompartments[kAsyncIOPool]->maxThreads = g_ThreadPoolCompartments[kWorkerThreadPool]->maxThreads;\n#endif\n    }\n\n    void ThreadPool::Shutdown()\n    {\n#if NET_4_0\n        NOT_SUPPORTED_IL2CPP(ThreadPool::Shutdown, \"vm::ThreadPool is not supported in .NET 4.5, use threadpool-ms instead\");\n#else\n        g_SocketPollingThread->Terminate();\n        // avoid cleaning up until we properly handle race condition from other threads queueing jobs\n        // delete g_SocketPollingThread;\n        // g_SocketPollingThread = NULL;\n#endif\n    }\n\n    ThreadPool::Configuration ThreadPool::GetConfiguration()\n    {\n#if NET_4_0\n        NOT_SUPPORTED_IL2CPP(ThreadPool::GetConfiguration, \"vm::ThreadPool is not supported in .NET 4.5, use threadpool-ms instead\");\n        IL2CPP_UNREACHABLE;\n        return Configuration();\n#else\n        Configuration configuration;\n\n        configuration.availableThreads = g_ThreadPoolCompartments[kWorkerThreadPool]->numIdleThreads;\n        configuration.availableAsyncIOThreads = g_ThreadPoolCompartments[kAsyncIOPool]->numIdleThreads;\n        configuration.minThreads = g_ThreadPoolCompartments[kWorkerThreadPool]->minThreads;\n        configuration.maxThreads = g_ThreadPoolCompartments[kWorkerThreadPool]->maxThreads;\n        configuration.minAsyncIOThreads = g_ThreadPoolCompartments[kAsyncIOPool]->minThreads;\n        configuration.maxAsyncIOThreads = g_ThreadPoolCompartments[kAsyncIOPool]->maxThreads;\n\n        return configuration;\n#endif\n    }\n\n    void ThreadPool::SetConfiguration(const Configuration& configuration)\n    {\n#if NET_4_0\n        NOT_SUPPORTED_IL2CPP(ThreadPool::SetConfiguration, \"vm::ThreadPool is not supported in .NET 4.5, use threadpool-ms instead\");\n#else\n        IL2CPP_ASSERT(configuration.maxThreads >= configuration.minThreads && \"Invalid configuration\");\n        IL2CPP_ASSERT(configuration.maxAsyncIOThreads >= configuration.minAsyncIOThreads && \"Invalid configuration\");\n        IL2CPP_ASSERT(configuration.minThreads > 0 && \"Invalid configuration\");\n        IL2CPP_ASSERT(configuration.minAsyncIOThreads > 0 && \"Invalid configuration\");\n        IL2CPP_ASSERT(configuration.maxThreads > 0 && \"Invalid configuration\");\n        IL2CPP_ASSERT(configuration.maxAsyncIOThreads > 0 && \"Invalid configuration\");\n\n        g_ThreadPoolCompartments[kWorkerThreadPool]->minThreads = configuration.minThreads;\n        g_ThreadPoolCompartments[kWorkerThreadPool]->maxThreads = configuration.maxThreads;\n        g_ThreadPoolCompartments[kAsyncIOPool]->minThreads = configuration.minAsyncIOThreads;\n        g_ThreadPoolCompartments[kAsyncIOPool]->maxThreads = configuration.maxAsyncIOThreads;\n\n        // Get our worker threads to respond and exit, if necessary.\n        // The method here isn't very smart and in fact won't even work reliably as idle worker\n        // threads will steal the signal from threads that are currently busy.\n        g_ThreadPoolCompartments[kWorkerThreadPool]->SignalAllThreads();\n        g_ThreadPoolCompartments[kAsyncIOPool]->SignalAllThreads();\n#endif\n    }\n\n    Il2CppAsyncResult* ThreadPool::Queue(Il2CppDelegate* delegate, void** params, Il2CppDelegate* asyncCallback, Il2CppObject* state)\n    {\n#if NET_4_0\n        NOT_SUPPORTED_IL2CPP(ThreadPool::Queue, \"vm::ThreadPool is not supported in .NET 4.5, use threadpool-ms instead\");\n        IL2CPP_UNREACHABLE;\n        return NULL;\n#else\n        // Create AsyncCall.\n        Il2CppAsyncCall* asyncCall = (Il2CppAsyncCall*)il2cpp::vm::Object::New(il2cpp_defaults.async_call_class);\n        asyncCall->cb_target = asyncCallback;\n        asyncCall->state = state;\n\n        // Copy arguments.\n        const uint8_t parametersCount = delegate->method->parameters_count;\n        IL2CPP_ASSERT(!params[parametersCount] && \"Expecting NULL as last element of the params array!\");\n\n        Il2CppArray* args = vm::Array::New(il2cpp_defaults.object_class, parametersCount);\n        for (uint8_t i = 0; i < parametersCount; ++i)\n            il2cpp_array_setref(args, i, params[i]);\n\n        // Create AsyncResult.\n        Il2CppAsyncResult* asyncResult = (Il2CppAsyncResult*)il2cpp::vm::Object::New(il2cpp_defaults.asyncresult_class);\n        asyncResult->async_delegate = delegate;\n\n        // NOTE: we store a GC handle here because .data is an IntPtr on the managed side and it won't be scanned by the GC.\n        asyncResult->data = (void*)(uintptr_t)gc::GCHandle::New((Il2CppObject*)args, true);\n        asyncResult->object_data = asyncCall;\n        asyncResult->async_state = state;\n\n        // See which compartment we should process this request with and whether we\n        // need to first pipe it through the socket polling stage.\n        if (IsProcessAsyncCall(delegate))\n        {\n            NOT_SUPPORTED_IL2CPP(AsyncReadHandler, \"Async Process operations are not supported by Il2Cpp\");\n        }\n        else if (IsSocketAsyncCall(delegate))\n        {\n            Il2CppSocketAsyncResult* socketAsyncResult = GetSocketAsyncResult(asyncResult);\n            socketAsyncResult->ares = asyncResult;\n\n            // Apparently, using poll/WSAPoll to listen for connect() isn't reliable, so\n            // we bypass the polling stage in that case.\n            // Also, Mono has some AIO_OP_xxx operations that are only defined in C# and are not\n            // meant to go through the polling stage.\n            if ((socketAsyncResult->operation == AIO_OP_CONNECT && socketAsyncResult->blocking)\n                || !IsSocketAsyncOperation(asyncResult))\n            {\n                g_ThreadPoolCompartments[kAsyncIOPool]->QueueWorkItem(asyncResult);\n            }\n            else\n            {\n                // Give it to polling thread.\n                SpawnSocketPollingThreadIfNeeded();\n                g_SocketPollingThread->QueueRequest(asyncResult);\n            }\n        }\n        else if (IsFileStreamAsyncCall(delegate))\n        {\n            g_ThreadPoolCompartments[kAsyncIOPool]->QueueWorkItem(asyncResult);\n        }\n        else\n        {\n            g_ThreadPoolCompartments[kWorkerThreadPool]->QueueWorkItem(asyncResult);\n        }\n\n        return asyncResult;\n#endif\n    }\n\n    Il2CppObject* ThreadPool::Wait(Il2CppAsyncResult* asyncResult, void** outArgs)\n    {\n#if NET_4_0\n        NOT_SUPPORTED_IL2CPP(ThreadPool::Wait, \"vm::ThreadPool is not supported in .NET 4.5, use threadpool-ms instead\");\n        IL2CPP_UNREACHABLE;\n        return NULL;\n#else\n        // Need lock already here to ensure only a single call to EndInvoke() gets to be the first one.\n        il2cpp_monitor_enter(&asyncResult->base);\n\n        // Throw if this result has already been waited on.\n        if (asyncResult->endinvoke_called)\n        {\n            il2cpp_monitor_exit(&asyncResult->base);\n            Exception::Raise(Exception::GetInvalidOperationException\n                    (\"Cannot call EndInvoke() repeatedly or concurrently on the same AsyncResult!\"));\n        }\n\n        asyncResult->endinvoke_called = 1;\n\n        // Wait if the AsyncResult hasn't yet been processed.\n        if (!asyncResult->completed)\n        {\n            if (!asyncResult->handle)\n                asyncResult->handle = WaitHandle::NewManualResetEvent(false);\n            os::Handle* osHandle = WaitHandle::GetPlatformHandle(asyncResult->handle);\n\n            il2cpp_monitor_exit(&asyncResult->base);\n\n            osHandle->Wait();\n        }\n        else\n            il2cpp_monitor_exit(&asyncResult->base);\n\n        // Raise exception now if the delegate threw while we were running it on\n        // the worker thread.\n        Il2CppAsyncCall* asyncCall = asyncResult->object_data;\n        if (asyncCall->msg != NULL)\n            il2cpp_raise_exception((Il2CppException*)asyncCall->msg);\n\n        // Copy out arguments.\n        if (asyncCall->out_args != NULL)\n        {\n            void** outArgsPtr = (void**)il2cpp_array_addr(asyncCall->out_args, Il2CppObject*, 0);\n            Il2CppDelegate* delegate = asyncResult->async_delegate;\n            const uint8_t paramsCount = delegate->method->parameters_count;\n\n            uint8_t index = 0;\n            for (uint8_t i = 0; i < paramsCount; ++i)\n            {\n                Il2CppType* paramType = (Il2CppType*)delegate->method->parameters[i].parameter_type;\n                const Il2CppClass* paramClass = il2cpp_class_from_type(paramType);\n\n                if (!paramType->byref)\n                    continue;\n\n                const bool isValueType = il2cpp_class_is_valuetype(paramClass);\n                if (isValueType)\n                {\n                    IL2CPP_ASSERT(paramClass->native_size > 0 && \"EndInvoke: Invalid native_size found when trying to copy a value type in the out_args.\");\n\n                    // NOTE(gab): in case of value types, we need to copy the data over.\n                    memcpy(outArgs[index], outArgsPtr[index], paramClass->native_size);\n                }\n                else\n                {\n                    *((void**)outArgs[index]) = outArgsPtr[index];\n                }\n\n                ++index;\n            }\n        }\n\n        return asyncResult->object_data->res;\n#endif\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/ThreadPool.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\nstruct Il2CppObject;\nstruct Il2CppDelegate;\nstruct Il2CppAsyncResult;\n\n#if NET_4_0\n\n/* Keep in sync with System.IOOperation in mcs/class/System/System/IOSelector.cs */\nenum Il2CppIOOperation\n{\n    EVENT_IN = 1 << 0,\n    EVENT_OUT = 1 << 1,\n    EVENT_ERR = 1 << 2, /* not in managed */\n};\n\n#endif\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API ThreadPool\n    {\n    public:\n\n        struct Configuration\n        {\n            int minThreads;\n            int maxThreads;\n            int minAsyncIOThreads;\n            int maxAsyncIOThreads;\n\n            // These are read-only.\n            int availableThreads;\n            int availableAsyncIOThreads;\n        };\n\n#if NET_4_0\n        typedef struct\n        {\n            bool(*init)(int wakeup_pipe_fd);\n            void(*register_fd)(int fd, int events, bool is_new);\n            void(*remove_fd)(int fd);\n            int(*event_wait)(void(*callback)(int fd, int events, void* user_data), void* user_data);\n        } ThreadPoolIOBackend;\n#endif\n\n        static void Initialize();\n        static void Shutdown();\n\n        /// On a thread, call the given delegate with 'params' as arguments. Upon completion,\n        /// call 'asyncCallback'.\n        static Il2CppAsyncResult* Queue(Il2CppDelegate* delegate, void** params, Il2CppDelegate* asyncCallback, Il2CppObject* state);\n\n        /// Wait for the execution of the given asynchronous call to have completed and return\n        /// the value returned by the delegate wrapped in the call (or null if the delegate has\n        /// a void return type).\n        /// NOTE: Any AsyncResult can only be waited on once! Repeated or concurrent calls to Wait() on the same AsyncResult\n        ///       will throw InvalidOperationExceptions.\n        static Il2CppObject* Wait(Il2CppAsyncResult* asyncResult, void** outArgs);\n\n        static Configuration GetConfiguration();\n        static void SetConfiguration(const Configuration& configuration);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/ThreadPoolMs.cpp",
    "content": "#if NET_4_0\n\n#include \"il2cpp-api.h\"\n#include \"utils/dynamic_array.h\"\n#include \"vm/ThreadPoolMs.h\"\n#include \"vm/Domain.h\"\n#include \"vm/Array.h\"\n#include \"vm/Object.h\"\n#include \"vm/Runtime.h\"\n#include \"os/Atomic.h\"\n#include \"gc/WriteBarrier.h\"\n#include \"mono/ThreadPool/threadpool-ms.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    Il2CppAsyncResult* ThreadPoolMs::DelegateBeginInvoke(Il2CppDelegate* delegate, void** params, Il2CppDelegate* asyncCallback, Il2CppObject* state)\n    {\n        int numParams = delegate->method->parameters_count;\n        il2cpp::utils::dynamic_array<void*> newParams(numParams + 2);\n        for (int i = 0; i < numParams; ++i)\n            newParams[i] = params[i];\n\n        newParams[numParams] = asyncCallback;\n        newParams[numParams + 1] = state;\n\n        return threadpool_ms_begin_invoke(il2cpp::vm::Domain::GetCurrent(), (Il2CppObject*)delegate, const_cast<MethodInfo*>(delegate->method), newParams.data());\n    }\n\n    Il2CppObject* ThreadPoolMs::DelegateEndInvoke(Il2CppAsyncResult* asyncResult, void **out_args)\n    {\n        Il2CppArray *arrayOutArgs;\n        Il2CppObject *exc, *retVal;\n\n        retVal = threadpool_ms_end_invoke(asyncResult, &arrayOutArgs, &exc);\n\n        if (exc)\n            il2cpp_raise_exception((Il2CppException*)exc);\n\n        if (out_args)\n        {\n            const MethodInfo *method = asyncResult->async_delegate->method;\n            void** outArgsPtr = (void**)il2cpp_array_addr(arrayOutArgs, Il2CppObject*, 0);\n\n            for (int i = 0; i < arrayOutArgs->max_length; ++i)\n            {\n                const Il2CppType* paramType = method->parameters[i].parameter_type;\n\n                if (!paramType->byref)\n                    continue;\n\n                Il2CppClass *paramClass = il2cpp_class_from_type(paramType);\n\n                if (paramClass->valuetype)\n                {\n                    IL2CPP_ASSERT(paramClass->native_size > 0 && \"EndInvoke: Invalid native_size found when trying to copy a value type in the out_args.\");\n\n                    // NOTE(gab): in case of value types, we need to copy the data over.\n                    memcpy(out_args[i], il2cpp::vm::Object::Unbox((Il2CppObject*)outArgsPtr[i]), paramClass->native_size);\n                }\n                else\n                {\n                    *((void**)out_args[i]) = outArgsPtr[i];\n                }\n            }\n        }\n\n        return retVal;\n    }\n\n    Il2CppObject* ThreadPoolMs::MessageInvoke(Il2CppObject *target, Il2CppMethodMessage *msg, Il2CppObject **exc, Il2CppArray **out_args)\n    {\n        static Il2CppClass *object_array_klass = NULL;\n        MethodInfo *method;\n        Il2CppObject *ret;\n        Il2CppArray *arr;\n        int i, j, outarg_count = 0;\n\n        method = (MethodInfo*)msg->method->method;\n\n        for (i = 0; i < method->parameters_count; i++)\n        {\n            if (method->parameters[i].parameter_type->byref)\n                outarg_count++;\n        }\n\n        if (!object_array_klass)\n        {\n            Il2CppClass *klass;\n\n            klass = il2cpp_array_class_get(il2cpp_defaults.object_class, 1);\n            IL2CPP_ASSERT(klass);\n\n            os::Atomic::MemoryBarrier();\n            object_array_klass = klass;\n        }\n\n        arr = il2cpp_array_new(object_array_klass, outarg_count);\n\n        il2cpp::gc::WriteBarrier::GenericStore(out_args, (Il2CppObject*)arr);\n        *exc = NULL;\n\n        ret = vm::Runtime::InvokeArray(method, method->declaring_type->valuetype ? il2cpp_object_unbox(target) : target, method->parameters_count > 0 ? msg->args : NULL, (Il2CppException**)exc);\n\n        for (i = 0, j = 0; i < method->parameters_count; i++)\n        {\n            if (method->parameters[i].parameter_type->byref)\n            {\n                Il2CppObject* arg;\n                arg = (Il2CppObject*)il2cpp_array_get(msg->args, void*, i);\n                il2cpp_array_setref(*out_args, j, arg);\n                j++;\n            }\n        }\n\n        return ret;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/ThreadPoolMs.h",
    "content": "#pragma once\n\n#if NET_4_0\n\n#include \"il2cpp-config.h\"\n#include \"object-internals.h\"\n#include \"class-internals.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API ThreadPoolMs\n    {\n    public:\n        static Il2CppAsyncResult* DelegateBeginInvoke(Il2CppDelegate* delegate, void** params, Il2CppDelegate* asyncCallback, Il2CppObject* state);\n        static Il2CppObject* DelegateEndInvoke(Il2CppAsyncResult* asyncResult, void **out_args);\n        static Il2CppObject* MessageInvoke(Il2CppObject *target, Il2CppMethodMessage *msg, Il2CppObject **exc, Il2CppArray **out_args);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Type.cpp",
    "content": "#include \"il2cpp-config.h\"\n\n#include <string>\n#include <cstring>\n#include <algorithm>\n#include <ctype.h>\n\n#include \"utils/StringUtils.h\"\n#include \"vm/Assembly.h\"\n#include \"vm/AssemblyName.h\"\n#include \"vm/Class.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/GenericContainer.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/Reflection.h\"\n#include \"vm/String.h\"\n#include \"vm/Type.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"tabledefs.h\"\n#include \"vm/Array.h\"\n\nstatic char* copy_name(const char* name)\n{\n    const size_t len = strlen(name);\n    char* cname = new char[len + 1];\n\n    strncpy(cname, name, len);\n\n    cname[len] = '\\0';\n\n    return cname;\n}\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    TypeNameParser::TypeNameParser(std::string &name, TypeNameParseInfo &info, bool is_nested) :\n        _info(info),\n        _is_nested(is_nested),\n        _accept_assembly_name(true),\n        _p(name.begin()),\n        _end(name.end())\n    {\n    }\n\n    TypeNameParser::TypeNameParser(std::string::const_iterator &begin, std::string::const_iterator &end, TypeNameParseInfo &info, bool is_nested) :\n        _info(info),\n        _is_nested(is_nested),\n        _accept_assembly_name(true),\n        _p(begin),\n        _end(end)\n    {\n    }\n\n    bool TypeNameParser::Parse(bool acceptAssemblyName)\n    {\n        _accept_assembly_name = acceptAssemblyName;\n\n        int32_t arity = 0;\n\n        InitializeParser();\n\n        if (IsEOL())\n            return false;\n        if (!ParseTypeName(arity))\n            return false;\n        if (!ParseNestedTypeOptional(arity))\n            return false;\n        if (!ParseTypeArgumentsOptional(arity))\n            return false;\n        if (!ParsePointerModifiersOptional())\n            return false;\n        if (!ParseArrayModifierOptional())\n            return false;\n        if (!ParseByRefModifiersOptional())\n            return false;\n        if (!ParseAssemblyNameOptional())\n            return false;\n\n        return (_p == _end) || _is_nested;\n    }\n\n    bool TypeNameParser::ParseAssembly()\n    {\n        InitializeParser();\n\n        if (IsEOL())\n            return false;\n        if (!ParseAssemblyName())\n            return false;\n\n        return true;\n    }\n\n    bool TypeNameParser::ParseTypeName(int32_t &arity)\n    {\n        std::string::const_iterator begin = _p;\n        std::string::const_iterator last_dot = _end;\n\n        while (true)\n        {\n            ConsumeIdentifier();\n\n            if (!CurrentIs('.'))\n                break;\n\n            last_dot = _p;\n\n            if (!Next())\n                return false; // Invalid format\n        }\n\n        if (CurrentIs('`'))\n        {\n            if (!Next())\n                return false; // Invalid format\n\n            if (!ConsumeNumber(arity))\n                return false; // Invalid format\n        }\n\n        if (last_dot == _end)\n        {\n            _info._name.assign(begin, _p);\n        }\n        else\n        {\n            _info._namespace.assign(begin, last_dot);\n            _info._name.assign(last_dot + 1, _p);\n        }\n\n        return true;\n    }\n\n    bool TypeNameParser::ParseNestedTypeOptional(int32_t &arity)\n    {\n        while (CurrentIs('+'))\n        {\n            if (!Next())\n                return false; // Invalid format\n\n            std::string::const_iterator begin = _p;\n\n            ConsumeIdentifier();\n\n            if (CurrentIs('`'))\n            {\n                if (!Next())\n                    return false; // Invalid format\n\n                int32_t nested_arity = 0;\n\n                if (!ConsumeNumber(nested_arity))\n                    return false; // Invalid format\n\n                arity += nested_arity;\n            }\n\n            _info._nested.push_back(std::string(begin, _p));\n        }\n\n        return true;\n    }\n\n    bool TypeNameParser::ParsePointerModifiersOptional()\n    {\n        if (IsEOL())\n            return true;\n\n        while (CurrentIs('*'))\n        {\n            _info._modifiers.push_back(-1);\n            if (!Next(true))\n                break;\n        }\n\n        return true;\n    }\n\n    bool TypeNameParser::ParseByRefModifiersOptional()\n    {\n        if (IsEOL())\n            return true;\n\n        if (CurrentIs('&'))\n        {\n            if (std::find(_info._modifiers.begin(), _info._modifiers.end(), 0) != _info._modifiers.end())\n                return false; // Invalid format, already marked as reference\n\n            _info._modifiers.push_back(0);\n\n            Next(true);\n        }\n\n        return true;\n    }\n\n    bool TypeNameParser::ParseTypeArgumentsOptional(int32_t &arity)\n    {\n        SkipWhites();\n\n        if (IsEOL())\n            return true;\n\n        if (!CurrentIs('['))\n            return true;\n\n        if (NextWillBe(']', true) || NextWillBe(',', true) || NextWillBe('*', true))\n            return true;\n\n        if (!Next(true))\n            return false; // Invalid format\n\n        _info._type_arguments.reserve(arity);\n\n        while (true)\n        {\n            bool acceptAssemblyName = false;\n\n            if (CurrentIs('['))\n            {\n                acceptAssemblyName = true;\n\n                if (!Next(true))\n                    return false; // Invalid format\n            }\n\n            TypeNameParseInfo info;\n            TypeNameParser parser(_p, _end, info, true);\n\n            if (!parser.Parse(acceptAssemblyName))\n                return false; // Invalid format\n\n            _p = parser._p;\n\n            _info._type_arguments.push_back(info);\n\n            SkipWhites();\n\n            if (IsEOL())\n                return false; // Invalid format\n\n            if (acceptAssemblyName)\n            {\n                if (!CurrentIs(']'))\n                    return false; // Invalid format\n\n                if (!Next(true))\n                    return false; // Invalid format\n            }\n\n            if (CurrentIs(']'))\n                break;\n\n            if (CurrentIs(','))\n            {\n                if (!Next(true))\n                    return false; // Invalid format\n            }\n            else\n            {\n                return false; // Invalid format\n            }\n        }\n\n        if (_info._type_arguments.size() != arity)\n            return false; // Invalid format\n\n        Next(true);\n\n        return true;\n    }\n\n    bool TypeNameParser::ParseArrayModifierOptional()\n    {\n        SkipWhites();\n\n        if (IsEOL())\n            return true;\n\n        if (!CurrentIs('['))\n            return true;\n\n        if (!NextWillBe(']', true) && !NextWillBe(',', true) && !NextWillBe('*', true))\n            return true;\n\n        if (!Next(true))\n            return false; // Invalid format\n\n        int32_t rank = 1;\n\n        while (true)\n        {\n            if (CurrentIs(']'))\n            {\n                Next(true);\n                break;\n            }\n            else if (CurrentIs(','))\n            {\n                ++rank;\n                if (!Next(true))\n                    return false; // invalid format\n            }\n            else if (CurrentIs('*'))\n            {\n                _info._modifiers.push_back(-2);\n\n                if (!Next(true))\n                    return false; // invalid format\n            }\n            else\n            {\n                return false; // invalid format\n            }\n        }\n\n        _info._modifiers.push_back(rank);\n\n        // This is to support arrays of array\n        return ParseArrayModifierOptional();\n    }\n\n    bool TypeNameParser::ParseAssemblyNameOptional()\n    {\n        if (!_accept_assembly_name)\n            return true;\n\n        if (!CurrentIs(','))\n            return true;\n\n        if (!Next())\n            return false; // Invalid format\n\n        SkipWhites();\n\n        return ParseAssemblyName();\n    }\n\n    bool TypeNameParser::ParseAssemblyName()\n    {\n        std::string::const_iterator begin = _p;\n\n        ConsumeAssemblyIdentifier();\n\n        _info._assembly_name.name.assign(begin, _p);\n\n        SkipWhites();\n\n        ParsePropertiesOptional();\n\n        return true;\n    }\n\n    bool TypeNameParser::ParsePropertiesOptional()\n    {\n        while (CurrentIs(','))\n        {\n            if (!Next(true))\n                return false; // Invalid format\n\n            std::string::const_iterator begin = _p;\n            ConsumePropertyIdentifier();\n            std::string propertyName(begin, _p);\n\n            if (!CurrentIs('='))\n                return false;\n\n            if (!Next())\n                return false; // Invalid format\n\n            begin = _p;\n            ConsumePropertyValue();\n            std::string propertyValue(begin, _p);\n\n            if (propertyName == \"Version\")\n            {\n                if (!ParseVersion(propertyValue, _info._assembly_name.major, _info._assembly_name.minor, _info._assembly_name.build, _info._assembly_name.revision))\n                    return false;\n            }\n            else if (propertyName == \"PublicKey\")\n            {\n                if (propertyValue != \"null\")\n                    _info._assembly_name.public_key = propertyValue;\n            }\n            else if (propertyName == \"PublicKeyToken\")\n            {\n                if (propertyValue != \"null\")\n                {\n                    if ((kPublicKeyTokenLength - 1) != propertyValue.size())\n                        return false;\n                    strncpy(_info._assembly_name.public_key_token, propertyValue.c_str(), kPublicKeyTokenLength);\n                }\n            }\n            else if (propertyName == \"Culture\")\n            {\n                _info._assembly_name.culture = propertyValue;\n            }\n            else\n            {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    bool TypeNameParser::ParseVersion(const std::string& version, uint16_t& major, uint16_t& minor, uint16_t& build, uint16_t& revision)\n    {\n        size_t start = 0;\n        size_t index = version.find('.');\n        if (-1 == index)\n            return false;\n        std::string component = version.substr(start, index - start);\n        major = atoi(component.c_str());\n\n        start = index + 1;\n        index = version.find('.', start);\n        if (-1 == index)\n            return false;\n        component = version.substr(start, index - start);\n        minor = atoi(component.c_str());\n\n        start = index + 1;\n        index = version.find('.', start);\n        if (-1 == index)\n            return false;\n        component = version.substr(start, index - start);\n        build = atoi(component.c_str());\n\n        start = index + 1;\n        component = version.substr(start, version.size() - start);\n        revision = atoi(component.c_str());\n\n        return true;\n    }\n\n    bool TypeNameParser::NextWillBe(char v, bool skipWhites) const\n    {\n        if (IsEOL())\n            return false;\n\n        int32_t i = 1;\n        if (skipWhites)\n        {\n            if ((*(_p + i) == ' ') || (*(_p + i) == '\\t'))\n                ++i;\n\n            if ((_p + i) >= _end)\n                return false;\n        }\n\n        return *(_p + i) == v;\n    }\n\n    bool TypeNameParser::ConsumeNumber(int32_t &value)\n    {\n        if (!isdigit(*_p))\n            return false;\n\n        std::string::const_iterator begin = _p;\n\n        while (isdigit(*_p))\n        {\n            if (!Next())\n                break;\n        }\n\n        value = (int32_t)strtol(&(*begin), NULL, 10);\n\n        return true;\n    }\n\n    void TypeNameParser::ConsumeAssemblyIdentifier()\n    {\n        do\n        {\n            switch (*_p)\n            {\n                case ',':\n                case '+':\n                case '&':\n                case '*':\n                case '[':\n                case ']':\n                case '=':\n                case '\"':\n                case '`':\n                    return;\n\n                case '\\\\':\n                    Next();\n                    break;\n            }\n        }\n        while (Next());\n    }\n\n    void TypeNameParser::ConsumePropertyIdentifier()\n    {\n        do\n        {\n            switch (*_p)\n            {\n                case '=':\n                    return;\n            }\n        }\n        while (Next());\n    }\n\n    void TypeNameParser::ConsumePropertyValue()\n    {\n        do\n        {\n            switch (*_p)\n            {\n                case ',':\n                case ']':\n                    return;\n            }\n        }\n        while (Next());\n    }\n\n    void TypeNameParser::ConsumeIdentifier()\n    {\n        do\n        {\n            switch (*_p)\n            {\n                case ',':\n                case '+':\n                case '&':\n                case '*':\n                case '[':\n                case ']':\n                case '.':\n                case '=':\n                case '\"':\n                case '`':\n                    return;\n\n                case '\\\\':\n                    Next();\n                    break;\n            }\n        }\n        while (Next());\n    }\n\n    void TypeNameParser::InitializeParser()\n    {\n        SkipWhites();\n    }\n\n    void TypeNameParser::SkipWhites()\n    {\n        while ((CurrentIs(' ') || CurrentIs('\\t')) && !IsEOL())\n            ++_p;\n    }\n\n    TypeNameParseInfo::TypeNameParseInfo()\n    {\n    }\n\n    TypeNameParseInfo::~TypeNameParseInfo()\n    {\n        _type_arguments.clear();\n        _modifiers.clear();\n        _nested.clear();\n    }\n\n    int Type::GetType(const Il2CppType *type)\n    {\n        return type->type;\n    }\n\n    void Type::GetNameInternal(std::string &str, const Il2CppType *type, Il2CppTypeNameFormat format, bool is_nested)\n    {\n        switch (type->type)\n        {\n            case IL2CPP_TYPE_ARRAY:\n            {\n                Il2CppClass* arrayClass = Class::FromIl2CppType(type);\n                Il2CppClass* elementClass = Class::GetElementClass(arrayClass);\n                Type::GetNameInternal(\n                    str,\n                    elementClass->byval_arg,\n                    format == IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED ? IL2CPP_TYPE_NAME_FORMAT_FULL_NAME : format,\n                    false);\n\n                str += '[';\n\n                if (arrayClass->rank == 1)\n                    str += '*';\n\n                for (int32_t i = 1; i < arrayClass->rank; i++)\n                    str += ',';\n\n                str += ']';\n\n                if (type->byref)\n                    str += '&';\n\n                if (format == IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED)\n                {\n                    const Il2CppAssembly *ta = MetadataCache::GetAssemblyFromIndex(elementClass->image->assemblyIndex);\n                    str += \", \" + vm::AssemblyName::AssemblyNameToString(ta->aname);\n                }\n\n                break;\n            }\n\n            case IL2CPP_TYPE_SZARRAY:\n            {\n                Il2CppClass* elementClass = Class::FromIl2CppType(type->data.type);\n                Type::GetNameInternal(\n                    str,\n                    elementClass->byval_arg,\n                    format == IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED ? IL2CPP_TYPE_NAME_FORMAT_FULL_NAME : format,\n                    false);\n\n                str += \"[]\";\n\n                if (type->byref)\n                    str += '&';\n\n                if (format == IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED)\n                {\n                    const Il2CppAssembly *ta = MetadataCache::GetAssemblyFromIndex(elementClass->image->assemblyIndex);\n                    str += \", \" + vm::AssemblyName::AssemblyNameToString(ta->aname);\n                }\n                break;\n            }\n\n            case IL2CPP_TYPE_PTR:\n            {\n                Type::GetNameInternal(\n                    str,\n                    type->data.type,\n                    format == IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED ? IL2CPP_TYPE_NAME_FORMAT_FULL_NAME : format,\n                    false);\n\n                str += '*';\n\n                if (type->byref)\n                    str += '&';\n\n                if (format == IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED)\n                {\n                    const Il2CppAssembly *ta = MetadataCache::GetAssemblyFromIndex(Class::FromIl2CppType(type->data.type)->image->assemblyIndex);\n                    str += \", \" + vm::AssemblyName::AssemblyNameToString(ta->aname);\n                }\n                break;\n            }\n\n            case IL2CPP_TYPE_VAR:\n            case IL2CPP_TYPE_MVAR:\n                str += MetadataCache::GetStringFromIndex(Type::GetGenericParameter(type)->nameIndex);\n\n                if (type->byref)\n                    str += '&';\n                break;\n\n            default:\n            {\n                Il2CppClass *klass = Class::FromIl2CppType(type);\n                Class::Init(klass);\n\n                Il2CppClass* declaringType = Class::GetDeclaringType(klass);\n                if (declaringType)\n                {\n                    Type::GetNameInternal(str, declaringType->byval_arg, format, true);\n                    str += (format == IL2CPP_TYPE_NAME_FORMAT_IL ? '.' : '+');\n                }\n                else if (*klass->namespaze)\n                {\n                    str += klass->namespaze;\n                    str += '.';\n                }\n\n                if (format == IL2CPP_TYPE_NAME_FORMAT_IL)\n                {\n                    const char *s = strchr(klass->name, '`');\n                    str += (s ? std::string(klass->name, s) : klass->name);\n                }\n                else\n                    str += klass->name;\n\n                if (is_nested)\n                    break;\n\n                if (klass->generic_class)\n                {\n                    Il2CppGenericClass *gclass = klass->generic_class;\n                    const Il2CppGenericInst *inst = gclass->context.class_inst;\n                    Il2CppTypeNameFormat nested_format;\n\n                    nested_format = format == IL2CPP_TYPE_NAME_FORMAT_FULL_NAME ? IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED : format;\n\n                    str += (format == IL2CPP_TYPE_NAME_FORMAT_IL ? '<' : '[');\n\n                    for (uint32_t i = 0; i < inst->type_argc; i++)\n                    {\n                        const Il2CppType *t = inst->type_argv[i];\n\n                        if (i)\n                            str += ',';\n\n                        if ((nested_format == IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED) && (t->type != IL2CPP_TYPE_VAR) && (type->type != IL2CPP_TYPE_MVAR))\n                            str += '[';\n\n                        Type::GetNameInternal(str, inst->type_argv[i], nested_format, false);\n\n                        if ((nested_format == IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED) && (t->type != IL2CPP_TYPE_VAR) && (type->type != IL2CPP_TYPE_MVAR))\n                            str += ']';\n                    }\n\n                    str += (format == IL2CPP_TYPE_NAME_FORMAT_IL ? '>' : ']');\n                }\n                else if (Class::IsGeneric(klass) && (format != IL2CPP_TYPE_NAME_FORMAT_FULL_NAME) && (format != IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED))\n                {\n                    const Il2CppGenericContainer* container = Class::GetGenericContainer(klass);\n\n                    str += (format == IL2CPP_TYPE_NAME_FORMAT_IL ? '<' : '[');\n\n                    for (int32_t i = 0; i < container->type_argc; i++)\n                    {\n                        if (i)\n                            str += ',';\n                        str += MetadataCache::GetStringFromIndex(GenericContainer::GetGenericParameter(container, i)->nameIndex);\n                    }\n\n                    str += (format == IL2CPP_TYPE_NAME_FORMAT_IL ? '>' : ']');\n                }\n\n                if (type->byref)\n                    str += '&';\n\n                if ((format == IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED) && (type->type != IL2CPP_TYPE_VAR) && (type->type != IL2CPP_TYPE_MVAR))\n                {\n                    const Il2CppAssembly *ta = MetadataCache::GetAssemblyFromIndex(klass->image->assemblyIndex);\n                    str += \", \" + vm::AssemblyName::AssemblyNameToString(ta->aname);\n                }\n                break;\n            }\n        }\n    }\n\n    std::string Type::GetName(const Il2CppType *type, Il2CppTypeNameFormat format)\n    {\n        std::string str;\n        Type::GetNameInternal(str, type, format, false);\n        return str;\n    }\n\n    Il2CppClass* Type::GetClassOrElementClass(const Il2CppType *type)\n    {\n        // This is a weird function to mimic old mono behaviour.\n        // We incorrectly used the analogous mono function in Unity.\n        // Expectations: Return class if type is not an array. Return element type if it is an array.\n        if (type->type == IL2CPP_TYPE_ARRAY)\n            return Class::FromIl2CppType(type->data.array->etype);\n\n        if (type->type == IL2CPP_TYPE_SZARRAY)\n            return Class::FromIl2CppType(type->data.type);\n\n        // IL2CPP_TYPE_SZARRAY stores element class in klass\n        return MetadataCache::GetTypeInfoFromTypeDefinitionIndex(type->data.klassIndex);\n    }\n\n    const Il2CppType* Type::GetUnderlyingType(const Il2CppType *type)\n    {\n        if (type->type == IL2CPP_TYPE_VALUETYPE && MetadataCache::GetTypeInfoFromTypeDefinitionIndex(type->data.klassIndex)->enumtype && !type->byref)\n            return Class::GetEnumBaseType(MetadataCache::GetTypeInfoFromTypeDefinitionIndex(type->data.klassIndex));\n        if (IsGenericInstance(type))\n        {\n            Il2CppClass* definition = GenericClass::GetTypeDefinition(type->data.generic_class);\n            if (definition != NULL && definition->enumtype && !type->byref)\n                return Class::GetEnumBaseType(definition);\n        }\n        return type;\n    }\n\n    bool Type::IsGenericInstance(const Il2CppType* type)\n    {\n        return type->type == IL2CPP_TYPE_GENERICINST;\n    }\n\n    Il2CppReflectionType* Type::GetDeclaringType(const Il2CppType* type)\n    {\n        Il2CppClass *typeInfo = NULL;\n\n        if (type->byref)\n            return NULL;\n        if (type->type == IL2CPP_TYPE_VAR || type->type == IL2CPP_TYPE_MVAR)\n        {\n            const Il2CppGenericParameter* genericParameter = GetGenericParameter(type);\n            const Il2CppGenericContainer* container = MetadataCache::GetGenericContainerFromIndex(genericParameter->ownerIndex);\n            typeInfo = GenericContainer::GetDeclaringType(container);\n        }\n        else\n        {\n            typeInfo = Class::GetDeclaringType(Class::FromIl2CppType(type));\n        }\n\n        return typeInfo ? Reflection::GetTypeObject(typeInfo->byval_arg) : NULL;\n    }\n\n    Il2CppArray* Type::GetGenericArgumentsInternal(Il2CppReflectionType* type, bool runtimeArray)\n    {\n        Il2CppArray *res;\n        Il2CppClass *klass, *pklass;\n\n        klass = Class::FromIl2CppType(type->type);\n\n#if NET_4_0\n        Il2CppClass *arrType = runtimeArray ? il2cpp_defaults.runtimetype_class : il2cpp_defaults.systemtype_class;\n#else\n        Il2CppClass *arrType = il2cpp_defaults.systemtype_class;\n#endif\n\n        if (Class::IsGeneric(klass))\n        {\n            const Il2CppGenericContainer *container = MetadataCache::GetGenericContainerFromIndex(klass->genericContainerIndex);\n            res = Array::New(arrType, container->type_argc);\n            for (int32_t i = 0; i < container->type_argc; ++i)\n            {\n                pklass = Class::FromGenericParameter(GenericContainer::GetGenericParameter(container, i));\n                il2cpp_array_setref(res, i, Reflection::GetTypeObject(pklass->byval_arg));\n            }\n        }\n        else if (klass->generic_class)\n        {\n            const Il2CppGenericInst *inst = klass->generic_class->context.class_inst;\n            res = Array::New(arrType, inst->type_argc);\n            for (uint32_t i = 0; i < inst->type_argc; ++i)\n                il2cpp_array_setref(res, i, Reflection::GetTypeObject(inst->type_argv[i]));\n        }\n        else\n        {\n            res = Array::New(arrType, 0);\n        }\n        return res;\n    }\n\n    uint32_t Type::GetToken(const Il2CppType *type)\n    {\n        if (IsGenericInstance(type))\n            return GenericClass::GetTypeDefinition(type->data.generic_class)->token;\n        return GetClass(type)->token;\n    }\n\n    bool Type::IsReference(const Il2CppType* type)\n    {\n        if (!type)\n            return false;\n\n        if (type->type == IL2CPP_TYPE_STRING ||\n            type->type == IL2CPP_TYPE_SZARRAY ||\n            type->type == IL2CPP_TYPE_CLASS ||\n            type->type == IL2CPP_TYPE_OBJECT ||\n            type->type == IL2CPP_TYPE_ARRAY)\n            return true;\n\n        if (IsGenericInstance(type) && !GenericClass::IsValueType(type->data.generic_class))\n            return true;\n\n        return false;\n    }\n\n    bool Type::IsStruct(const Il2CppType* type)\n    {\n        if (type->byref)\n            return false;\n\n        if (type->type == IL2CPP_TYPE_VALUETYPE && !MetadataCache::GetTypeInfoFromTypeDefinitionIndex(type->data.klassIndex)->enumtype)\n            return true;\n\n        if (type->type == IL2CPP_TYPE_TYPEDBYREF)\n            return true;\n\n        if (IsGenericInstance(type) &&\n            GenericClass::IsValueType(type->data.generic_class) &&\n            !GenericClass::IsEnum(type->data.generic_class))\n            return true;\n\n        return false;\n    }\n\n    bool Type::GenericInstIsValuetype(const Il2CppType* type)\n    {\n        IL2CPP_ASSERT(IsGenericInstance(type));\n        return GenericClass::IsValueType(type->data.generic_class);\n    }\n\n    bool Type::IsEnum(const Il2CppType *type)\n    {\n        if (type->type != IL2CPP_TYPE_VALUETYPE)\n            return false;\n\n        Il2CppClass* klass = GetClass(type);\n        return klass->enumtype;\n    }\n\n    bool Type::IsValueType(const Il2CppType *type)\n    {\n        Il2CppClass* klass = GetClass(type);\n        return klass->valuetype;\n    }\n\n    bool Type::IsEmptyType(const Il2CppType *type)\n    {\n        return IsGenericInstance(type) && type->data.generic_class->typeDefinitionIndex == kTypeIndexInvalid;\n    }\n\n    bool Type::IsSystemDBNull(const Il2CppType *type)\n    {\n        Il2CppClass* klass = GetClass(type);\n        return (klass->image == il2cpp_defaults.corlib && strcmp(klass->namespaze, \"System\") == 0 && strcmp(klass->name, \"DBNull\") == 0);\n    }\n\n    bool Type::IsSystemDateTime(const Il2CppType *type)\n    {\n        Il2CppClass* klass = GetClass(type);\n        return (klass->image == il2cpp_defaults.corlib && strcmp(klass->namespaze, \"System\") == 0 && strcmp(klass->name, \"DateTime\") == 0);\n    }\n\n    bool Type::IsSystemDecimal(const Il2CppType *type)\n    {\n        Il2CppClass* klass = GetClass(type);\n        return (klass->image == il2cpp_defaults.corlib && strcmp(klass->namespaze, \"System\") == 0 && strcmp(klass->name, \"Decimal\") == 0);\n    }\n\n    Il2CppClass* Type::GetClass(const Il2CppType *type)\n    {\n        IL2CPP_ASSERT(type->type == IL2CPP_TYPE_CLASS || type->type == IL2CPP_TYPE_VALUETYPE);\n        return MetadataCache::GetTypeInfoFromTypeDefinitionIndex(type->data.klassIndex);\n    }\n\n    const Il2CppGenericParameter* Type::GetGenericParameter(const Il2CppType *type)\n    {\n        IL2CPP_ASSERT(type->type == IL2CPP_TYPE_VAR || type->type == IL2CPP_TYPE_MVAR);\n        return MetadataCache::GetGenericParameterFromIndex(type->data.genericParameterIndex);\n    }\n\n/**\n* Type::ConstructDelegate:\n* @delegate: pointer to an uninitialized delegate object\n* @target: target object\n* @addr: pointer to native code\n* @method: method\n*\n* Initialize a delegate and set a specific method, not the one\n* associated with addr. This is useful when sharing generic code.\n* In that case addr will most probably not be associated with the\n* correct instantiation of the method.\n*/\n    void Type::ConstructDelegate(Il2CppDelegate* delegate, Il2CppObject* target, Il2CppMethodPointer addr, const MethodInfo* method)\n    {\n        IL2CPP_ASSERT(delegate);\n\n        if (method)\n            delegate->method = method;\n\n        delegate->method_ptr = addr;\n        if (target != NULL)\n            IL2CPP_OBJECT_SETREF(delegate, target, target);\n\n        delegate->invoke_impl = method->invoker_method; //TODO:figure out if this is needed at all\n    }\n\n    Il2CppString* Type::AppendAssemblyNameIfNecessary(Il2CppString* typeName, const char* assemblyName)\n    {\n        if (typeName != NULL)\n        {\n            std::string name = utils::StringUtils::Utf16ToUtf8(utils::StringUtils::GetChars(typeName));\n\n            il2cpp::vm::TypeNameParseInfo info;\n            il2cpp::vm::TypeNameParser parser(name, info, false);\n\n            if (parser.Parse())\n            {\n                if (info.assembly_name().name.empty())\n                {\n                    std::string assemblyQualifiedName;\n                    assemblyQualifiedName = name + \", \" + assemblyName;\n                    return vm::String::New(assemblyQualifiedName.c_str());\n                }\n            }\n        }\n\n        return typeName;\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/Type.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <string>\n#include <list>\n#include <vector>\n#include <algorithm>\n\n#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n\n#ifdef major\n# undef major\n# undef minor\n#endif\n\nstruct FieldInfo;\nstruct Il2CppType;\nstruct Il2CppClass;\nstruct Il2CppGenericParameter;\nstruct Il2CppString;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    static const int32_t kPublicKeyTokenLength = 17;\n\n    class TypeNameParseInfo\n    {\n    public:\n        struct AssemblyName\n        {\n            std::string name;\n            std::string culture;\n            std::string hash_value;\n            std::string public_key;\n            char public_key_token[kPublicKeyTokenLength];\n            uint32_t hash_alg;\n            uint32_t hash_len;\n            uint32_t flags;\n            uint16_t major;\n            uint16_t minor;\n            uint16_t build;\n            uint16_t revision;\n\n            AssemblyName() :\n                hash_alg(0),\n                hash_len(0),\n                flags(0),\n                major(0),\n                minor(0),\n                build(0),\n                revision(0)\n            {\n                memset(public_key_token, 0, kPublicKeyTokenLength);\n            }\n        };\n\n        TypeNameParseInfo();\n        ~TypeNameParseInfo();\n\n        inline const std::string &ns() const\n        {\n            return _namespace;\n        }\n\n        inline const std::string &name() const\n        {\n            return _name;\n        }\n\n        inline const AssemblyName &assembly_name() const\n        {\n            return _assembly_name;\n        }\n\n        inline const std::vector<int> &modifiers() const\n        {\n            return _modifiers;\n        }\n\n        inline const std::vector<TypeNameParseInfo> &type_arguments() const\n        {\n            return _type_arguments;\n        }\n\n        inline const std::vector<std::string> &nested() const\n        {\n            return _nested;\n        }\n\n        inline bool is_byref() const\n        {\n            return std::find(_modifiers.begin(), _modifiers.end(), 0) != _modifiers.end();\n        }\n\n        inline bool has_generic_arguments() const\n        {\n            return _type_arguments.size() > 0;\n        }\n\n        inline bool is_pointer() const\n        {\n            return std::find(_modifiers.begin(), _modifiers.end(), -1) != _modifiers.end();\n        }\n\n        inline bool is_bounded() const\n        {\n            return std::find(_modifiers.begin(), _modifiers.end(), -2) != _modifiers.end();\n        }\n\n        inline bool is_array() const\n        {\n            std::vector<int32_t>::const_iterator it = _modifiers.begin();\n            while (it != _modifiers.end())\n            {\n                if (*it > 0)\n                    return true;\n\n                ++it;\n            }\n\n            return false;\n        }\n\n    private:\n\n        std::string _namespace;\n        std::string _name;\n        AssemblyName _assembly_name;\n        std::vector<int32_t> _modifiers;\n        std::vector<TypeNameParseInfo> _type_arguments;\n        std::vector<std::string> _nested;\n\n        friend class TypeNameParser;\n    };\n\n    class TypeNameParser\n    {\n    public:\n\n        TypeNameParser(std::string &name, TypeNameParseInfo &info, bool is_nested);\n        TypeNameParser(std::string::const_iterator &begin, std::string::const_iterator &end, TypeNameParseInfo &info, bool is_nested);\n\n        bool Parse(bool acceptAssemblyName = true);\n        bool ParseAssembly();\n\n    private:\n\n        inline bool IsEOL() const\n        {\n            return _p >= _end;\n        }\n\n        inline bool CurrentIs(char v) const\n        {\n            if (IsEOL())\n                return false;\n\n            return *_p == v;\n        }\n\n        inline bool Next(bool skipWhites = false)\n        {\n            ++_p;\n\n            if (skipWhites)\n                SkipWhites();\n\n            return !IsEOL();\n        }\n\n        bool NextWillBe(char v, bool skipWhites = false) const;\n\n        void InitializeParser();\n        void SkipWhites();\n        void ConsumeIdentifier();\n        void ConsumeAssemblyIdentifier();\n        void ConsumePropertyIdentifier();\n        void ConsumePropertyValue();\n        bool ConsumeNumber(int32_t &value);\n        bool ParseTypeName(int32_t &arity);\n        bool ParseNestedTypeOptional(int32_t &arity);\n        bool ParseTypeArgumentsOptional(int32_t &arity);\n        bool ParseAssemblyNameOptional();\n        bool ParseAssemblyName();\n        bool ParsePropertiesOptional();\n        bool ParseArrayModifierOptional();\n        bool ParsePointerModifiersOptional();\n        bool ParseByRefModifiersOptional();\n\n        static bool ParseVersion(const std::string& version, uint16_t& major, uint16_t& minor, uint16_t& build, uint16_t& revision);\n\n        TypeNameParseInfo &_info;\n\n        bool _is_nested;\n        bool _accept_assembly_name;\n        std::string::const_iterator _p;\n        std::string::const_iterator _end;\n    };\n\n    class LIBIL2CPP_CODEGEN_API Type\n    {\n    public:\n        // exported\n        static std::string GetName(const Il2CppType *type, Il2CppTypeNameFormat format);\n        static int GetType(const Il2CppType *type);\n        static Il2CppClass* GetClassOrElementClass(const Il2CppType *type);\n        static const Il2CppType* GetUnderlyingType(const Il2CppType *type);\n        static uint32_t GetToken(const Il2CppType *type);\n        static bool IsGenericInstance(const Il2CppType *type);\n        static Il2CppReflectionType* GetDeclaringType(const Il2CppType* type);\n        static Il2CppArray* GetGenericArgumentsInternal(Il2CppReflectionType* type, bool runtimeArray);\n\n    public:\n        // internal\n        static void GetNameInternal(std::string &oss, const Il2CppType *type, Il2CppTypeNameFormat format, bool is_nested);\n        static bool IsReference(const Il2CppType* type);\n        static bool IsStruct(const Il2CppType* type);\n        static bool GenericInstIsValuetype(const Il2CppType* type);\n\n        static bool IsEnum(const Il2CppType *type);\n        static bool IsValueType(const Il2CppType *type);\n        static bool IsEmptyType(const Il2CppType *type);\n\n        static bool IsSystemDBNull(const Il2CppType *type);\n        static bool IsSystemDateTime(const Il2CppType *type);\n        static bool IsSystemDecimal(const Il2CppType *type);\n\n        static Il2CppClass* GetClass(const Il2CppType *type);\n        static const Il2CppGenericParameter* GetGenericParameter(const Il2CppType *type);\n\n        static void ConstructDelegate(Il2CppDelegate* delegate, Il2CppObject* target, Il2CppMethodPointer addr, const MethodInfo* method);\n\n        static Il2CppString* AppendAssemblyNameIfNecessary(Il2CppString* typeName, const char* assemblyName);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/VisualizerHelpers.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n\n#if _MSC_VER\n\n// These structs aren't actually used anywhere, but they are used by the VS debugger visualizer to help visualize various types\nnamespace VisualizerHelpers\n{\n    struct Il2CppRawTypeName\n    {\n        Il2CppClass t;\n    };\n\n    struct Il2CppRawTypeNameWithoutDeclaringType\n    {\n        Il2CppClass t;\n    };\n\n    struct Il2CppGenericParameters_DeclaringTypeHas0Parameters\n    {\n        Il2CppGenericContainer c;\n    };\n\n    struct Il2CppGenericParameters_DeclaringTypeHas1Parameters\n    {\n        Il2CppGenericContainer c;\n    };\n\n    struct Il2CppGenericParameters_DeclaringTypeHas2Parameters\n    {\n        Il2CppGenericContainer c;\n    };\n\n    struct Il2CppGenericParameters_DeclaringTypeHas3Parameters\n    {\n        Il2CppGenericContainer c;\n    };\n\n    struct Il2CppGenericParameters_DeclaringTypeHas4Parameters\n    {\n        Il2CppGenericContainer c;\n    };\n\n    struct Il2CppGenericParameters_DeclaringTypeHas5Parameters\n    {\n        Il2CppGenericContainer c;\n    };\n\n    struct Il2CppGenericParameters\n    {\n        Il2CppGenericContainer c;\n    };\n\n    struct Il2CppGenericArguments_DeclaringTypeHas0Arguments\n    {\n        Il2CppGenericInst gi;\n    };\n\n    struct Il2CppGenericArguments_DeclaringTypeHas1Arguments\n    {\n        Il2CppGenericInst gi;\n    };\n\n    struct Il2CppGenericArguments_DeclaringTypeHas2Arguments\n    {\n        Il2CppGenericInst gi;\n    };\n\n    struct Il2CppGenericArguments_DeclaringTypeHas3Arguments\n    {\n        Il2CppGenericInst gi;\n    };\n\n    struct Il2CppGenericArguments_DeclaringTypeHas4Arguments\n    {\n        Il2CppGenericInst gi;\n    };\n\n    struct Il2CppGenericArguments_DeclaringTypeHas5Arguments\n    {\n        Il2CppGenericInst gi;\n    };\n\n    struct Il2CppGenericArguments\n    {\n        Il2CppGenericClass gi;\n    };\n\n    struct Il2CppMethodParameters\n    {\n        MethodInfo m;\n    };\n\n    struct Il2CppMethodGenericParameters\n    {\n        MethodInfo m;\n    };\n\n    struct PreventLinkerFromStrippingTypesFromDebugInfo\n    {\n        Il2CppRawTypeName* ___rawTypeName;\n        Il2CppRawTypeNameWithoutDeclaringType* ___rawTypeNameWithoutDeclaringType;\n        Il2CppGenericParameters_DeclaringTypeHas0Parameters* ___genericParameters0;\n        Il2CppGenericParameters_DeclaringTypeHas1Parameters* ___genericParameters1;\n        Il2CppGenericParameters_DeclaringTypeHas2Parameters* ___genericParameters2;\n        Il2CppGenericParameters_DeclaringTypeHas3Parameters* ___genericParameters3;\n        Il2CppGenericParameters_DeclaringTypeHas4Parameters* ___genericParameters4;\n        Il2CppGenericParameters_DeclaringTypeHas5Parameters* ___genericParameters5;\n        Il2CppGenericParameters* ___genericParameters;\n        Il2CppGenericArguments_DeclaringTypeHas0Arguments* ___genericArguments0;\n        Il2CppGenericArguments_DeclaringTypeHas1Arguments* ___genericArguments1;\n        Il2CppGenericArguments_DeclaringTypeHas2Arguments* ___genericArguments2;\n        Il2CppGenericArguments_DeclaringTypeHas3Arguments* ___genericArguments3;\n        Il2CppGenericArguments_DeclaringTypeHas4Arguments* ___genericArguments4;\n        Il2CppGenericArguments_DeclaringTypeHas5Arguments* ___genericArguments5;\n        Il2CppGenericArguments* ___genericArguments;\n        Il2CppMethodParameters* ___methodParameters;\n        Il2CppMethodGenericParameters* ___methodGenericParameters;\n    };\n}\n\n// We need to declare a global variable, otherwise compiler strips all type information from PDBs, and in result debugger can't visualize them\nextern \"C\" VisualizerHelpers::PreventLinkerFromStrippingTypesFromDebugInfo * ____visualizerHelpersPreventLinkerStripping = NULL;\n\n#endif\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/WaitHandle.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"class-internals.h\"\n#include \"object-internals.h\"\n#include \"vm/WaitHandle.h\"\n\n#include \"vm/Class.h\"\n#include \"vm/Field.h\"\n#include \"vm/Object.h\"\n#include \"vm/Runtime.h\"\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    Il2CppWaitHandle* WaitHandle::NewManualResetEvent(bool initialState)\n    {\n        static const MethodInfo* constructor = NULL;\n        if (!constructor)\n            constructor = Class::GetMethodFromName(il2cpp_defaults.manualresetevent_class, \".ctor\", 1);\n\n        Il2CppObject* instance = Object::New(il2cpp_defaults.manualresetevent_class);\n        void* args[1] = { &initialState };\n        // NOTE: passing NULL here as Mono does, as long as the WaitHandle ctor will never throw an exception.\n        Runtime::Invoke(constructor, instance, args, NULL);\n\n        return reinterpret_cast<Il2CppWaitHandle*>(instance);\n    }\n\n    os::Handle* WaitHandle::GetPlatformHandle(Il2CppWaitHandle* waitHandle)\n    {\n        static FieldInfo *s_osHandle;\n        static FieldInfo *s_safeHandle;\n\n        if (!s_osHandle && !s_safeHandle)\n        {\n#if !NET_4_0\n            s_osHandle = vm::Class::GetFieldFromName(il2cpp_defaults.manualresetevent_class, \"os_handle\");\n            s_safeHandle = vm::Class::GetFieldFromName(il2cpp_defaults.manualresetevent_class, \"safe_wait_handle\");\n#else\n            s_osHandle = vm::Class::GetFieldFromName(il2cpp_defaults.manualresetevent_class, \"Handle\");\n            s_safeHandle = vm::Class::GetFieldFromName(il2cpp_defaults.manualresetevent_class, \"safeWaitHandle\");\n#endif\n        }\n\n        Il2CppIntPtr retval;\n        if (s_osHandle)\n        {\n            vm::Field::GetValue((Il2CppObject*)waitHandle, s_osHandle, &retval);\n        }\n        else\n        {\n            Il2CppSafeHandle *sh;\n            vm::Field::GetValue((Il2CppObject*)waitHandle, s_safeHandle, &sh);\n            retval.m_value = sh->handle;\n        }\n\n        return static_cast<os::Handle*>(retval.m_value);\n    }\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/WaitHandle.h",
    "content": "#pragma once\n\nstruct Il2CppWaitHandle;\nnamespace il2cpp\n{ namespace os\n{ class Handle; } }\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API WaitHandle\n    {\n    public:\n        static Il2CppWaitHandle* NewManualResetEvent(bool initialState);\n        static os::Handle* GetPlatformHandle(Il2CppWaitHandle* waitHandle);\n    };\n} /* namespace vm */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/WindowsRuntime.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"metadata/GenericMetadata.h\"\n#include \"os/LibraryLoader.h\"\n#include \"os/WindowsRuntime.h\"\n#include \"utils/Il2CppHStringReference.h\"\n#include \"utils/StringUtils.h\"\n#include \"vm/Class.h\"\n#include \"vm/Exception.h\"\n#include \"vm/GenericClass.h\"\n#include \"vm/MetadataCache.h\"\n#include \"vm/WindowsRuntime.h\"\n\nusing namespace il2cpp::metadata;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    Il2CppIActivationFactory* WindowsRuntime::GetActivationFactory(const utils::StringView<Il2CppNativeChar>& runtimeClassName)\n    {\n        utils::Il2CppHStringReference className(runtimeClassName);\n        Il2CppIActivationFactory* factory = NULL;\n        il2cpp_hresult_t hr = os::WindowsRuntime::GetActivationFactory(className, &factory);\n\n        if (IL2CPP_HR_SUCCEEDED(hr))\n            return factory;\n\n        if (hr != IL2CPP_REGDB_E_CLASSNOTREG)\n            Exception::Raise(hr, false);\n\n        // If GetActivationFactory doesn't find the class, we can still try to find it manually\n        // All Windows runtime classes must be in namespaces, and that class has to be in a DLL\n        // that is named after the namespace of a part of it.\n        // For example, MyNamespace.MySubNamespace.MyClass can be in either\n        // MyNamespace.MySubNamespace.dll or MyNamespace.dll\n        IL2CPP_ASSERT(runtimeClassName.Length() > 1);\n        size_t namespaceEnd = runtimeClassName.Length() - 1;\n\n        do\n        {\n            namespaceEnd--;\n        }\n        while (namespaceEnd > 0 && runtimeClassName[namespaceEnd] != '.');\n\n        Il2CppNativeChar* nativeDll = static_cast<Il2CppNativeChar*>(alloca((namespaceEnd + 5) * sizeof(Il2CppNativeChar)));\n        memcpy(nativeDll, runtimeClassName.Str(), namespaceEnd * sizeof(Il2CppNativeChar));\n\n        while (namespaceEnd > 0)\n        {\n            memcpy(nativeDll + namespaceEnd, IL2CPP_NATIVE_STRING(\".dll\"), 4 * sizeof(Il2CppNativeChar));\n            nativeDll[namespaceEnd + 4] = 0;\n\n            void* dynamicLibrary = os::LibraryLoader::LoadDynamicLibrary(utils::StringView<Il2CppNativeChar>(nativeDll, namespaceEnd + 4));\n            if (dynamicLibrary != NULL)\n            {\n                typedef il2cpp_hresult_t(STDCALL * DllGetActivationFactory)(Il2CppHString activatableClassId, Il2CppIActivationFactory** factory);\n                DllGetActivationFactory dllGetActivationFactory = reinterpret_cast<DllGetActivationFactory>(os::LibraryLoader::GetFunctionPointer(dynamicLibrary, \"DllGetActivationFactory\"));\n\n                if (dllGetActivationFactory != NULL)\n                {\n                    hr = dllGetActivationFactory(className, &factory);\n\n                    if (IL2CPP_HR_SUCCEEDED(hr))\n                        return factory;\n\n                    if (hr != IL2CPP_REGDB_E_CLASSNOTREG)\n                        Exception::Raise(hr, false);\n                }\n            }\n\n            do\n            {\n                namespaceEnd--;\n            }\n            while (namespaceEnd > 0 && runtimeClassName[namespaceEnd] != '.');\n        }\n\n        Exception::Raise(IL2CPP_REGDB_E_CLASSNOTREG, false);\n\n        return NULL;\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm/WindowsRuntime.h",
    "content": "#pragma once\n#include \"il2cpp-vm-support.h\"\n#include \"os/WindowsRuntime.h\"\n#include \"vm/Exception.h\"\n#include \"utils/StringView.h\"\n\nstruct Il2CppIActivationFactory;\n\nnamespace il2cpp\n{\nnamespace vm\n{\n    class LIBIL2CPP_CODEGEN_API WindowsRuntime\n    {\n    public:\n        static Il2CppIActivationFactory* GetActivationFactory(const utils::StringView<Il2CppNativeChar>& runtimeClassName);\n\n        static inline void CreateHStringReference(const utils::StringView<Il2CppNativeChar>& str, Il2CppHStringHeader* header, Il2CppHString* hstring)\n        {\n            il2cpp_hresult_t hr = os::WindowsRuntime::CreateHStringReference(str, header, hstring);\n            IL2CPP_VM_RAISE_IF_FAILED(hr, false);\n        }\n\n        static inline Il2CppHString CreateHString(Il2CppString* str)\n        {\n            Il2CppHString result;\n            il2cpp_hresult_t hr = os::WindowsRuntime::CreateHString(utils::StringView<Il2CppChar>(str->chars, str->length), &result);\n            IL2CPP_VM_RAISE_IF_FAILED(hr, false);\n            return result;\n        }\n\n        static inline void DeleteHString(Il2CppHString hstring)\n        {\n            il2cpp_hresult_t hr = os::WindowsRuntime::DeleteHString(hstring);\n            IL2CPP_VM_RAISE_IF_FAILED(hr, false);\n        }\n\n        static inline Il2CppString* HStringToManagedString(Il2CppHString hstring)\n        {\n            return os::WindowsRuntime::HStringToManagedString(hstring);\n        }\n    };\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm-utils/BlobReader.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include <stdint.h>\n#include \"BlobReader.h\"\n#include \"utils/MemoryRead.h\"\n#include \"object-internals.h\"\n#include \"il2cpp-vm-support.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    int BlobReader::GetConstantValueFromBlob(Il2CppTypeEnum type, const char *blob, void *value)\n    {\n        int retval = 0;\n        const char *p = blob;\n\n        switch (type)\n        {\n            case IL2CPP_TYPE_BOOLEAN:\n            case IL2CPP_TYPE_U1:\n            case IL2CPP_TYPE_I1:\n                *(uint8_t*)value = *p;\n                break;\n            case IL2CPP_TYPE_CHAR:\n                *(Il2CppChar*)value = ReadChar(p);\n                break;\n            case IL2CPP_TYPE_U2:\n            case IL2CPP_TYPE_I2:\n                *(uint16_t*)value = Read16(p);\n                break;\n            case IL2CPP_TYPE_U4:\n            case IL2CPP_TYPE_I4:\n                *(uint32_t*)value = Read32(p);\n                break;\n            case IL2CPP_TYPE_U8:\n            case IL2CPP_TYPE_I8:\n                *(uint64_t*)value = Read64(p);\n                break;\n            case IL2CPP_TYPE_R4:\n                *(float*)value = ReadFloat(p);\n                break;\n            case IL2CPP_TYPE_R8:\n                *(double*)value = ReadDouble(p);\n                break;\n            case IL2CPP_TYPE_STRING:\n            {\n                *(void**)value = NULL;\n                if (p != NULL)\n                {\n                    // int32_t length followed by non-null terminated utf-8 byte stream\n                    uint32_t length = Read32(p);\n                    *(VmString**)value = IL2CPP_VM_STRING_NEW_LEN(p + sizeof(uint32_t), length);\n                }\n                break;\n            }\n            case IL2CPP_TYPE_CLASS:\n            case IL2CPP_TYPE_OBJECT:\n            case IL2CPP_TYPE_GENERICINST:\n            case IL2CPP_TYPE_SZARRAY:\n                IL2CPP_ASSERT(p == NULL);\n                *(void**)value = NULL;\n                break;\n            default:\n                retval = -1;\n                IL2CPP_ASSERT(0);\n        }\n        return retval;\n    }\n} /* utils */\n} /* il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm-utils/BlobReader.h",
    "content": "#pragma once\n\n#include \"../blob.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class BlobReader\n    {\n    public:\n        // internal\n        static int GetConstantValueFromBlob(Il2CppTypeEnum type, const char *blob, void *value);\n    };\n} /* utils */\n} /* il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm-utils/NativeDelegateMethodCache.cpp",
    "content": "#include \"NativeDelegateMethodCache.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    il2cpp::os::FastMutex NativeDelegateMethodCache::m_CacheMutex;\n    NativeDelegateMap NativeDelegateMethodCache::m_NativeDelegateMethods;\n\n    const VmMethod* NativeDelegateMethodCache::GetNativeDelegate(Il2CppMethodPointer nativeFunctionPointer)\n    {\n        os::FastAutoLock lock(&m_CacheMutex);\n\n        NativeDelegateMap::iterator i = m_NativeDelegateMethods.find(nativeFunctionPointer);\n        if (i == m_NativeDelegateMethods.end())\n            return NULL;\n\n        return i->second;\n    }\n\n    void NativeDelegateMethodCache::AddNativeDelegate(Il2CppMethodPointer nativeFunctionPointer, const VmMethod* managedMethodInfo)\n    {\n        os::FastAutoLock lock(&m_CacheMutex);\n        m_NativeDelegateMethods.insert(std::make_pair(nativeFunctionPointer, managedMethodInfo));\n    }\n} // namespace utils\n} // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm-utils/NativeDelegateMethodCache.h",
    "content": "#pragma once\n\n#include \"il2cpp-api-types.h\"\n#include \"il2cpp-vm-support.h\"\n#include \"os/Mutex.h\"\n#include <map>\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    typedef std::map<Il2CppMethodPointer, const VmMethod*> NativeDelegateMap;\n\n    class NativeDelegateMethodCache\n    {\n    public:\n        static const VmMethod* GetNativeDelegate(Il2CppMethodPointer nativeFunctionPointer);\n        static void AddNativeDelegate(Il2CppMethodPointer nativeFunctionPointer, const VmMethod* managedMethodInfo);\n    private:\n        static il2cpp::os::FastMutex m_CacheMutex;\n        static NativeDelegateMap m_NativeDelegateMethods;\n    };\n} // namespace utils\n} // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm-utils/NativeSymbol.cpp",
    "content": "#include \"il2cpp-config.h\"\n#include \"os/Environment.h\"\n#include \"os/File.h\"\n#include \"os/Image.h\"\n#include \"os/Initialize.h\"\n#include \"os/LibraryLoader.h\"\n#include \"os/Locale.h\"\n#include \"os/MemoryMappedFile.h\"\n#include \"os/Path.h\"\n#include \"NativeSymbol.h\"\n#include \"utils/Collections.h\"\n#include \"utils/PathUtils.h\"\n#include \"utils/Runtime.h\"\n#include <string>\n\nnamespace il2cpp\n{\nnamespace utils\n{\n#if IL2CPP_ENABLE_NATIVE_STACKTRACES\n\n    static Il2CppMethodPointer MaskSpareBits(const Il2CppMethodPointer method)\n    {\n        return (Il2CppMethodPointer)((size_t)method & ~IL2CPP_POINTER_SPARE_BITS);\n    }\n\n    struct MethodInfoToMethodPointerConverter\n    {\n        Il2CppMethodPointer operator()(const MethodDefinitionKey& methodInfo) const\n        {\n            return MaskSpareBits(methodInfo.method);\n        }\n    };\n\n    typedef il2cpp::utils::collections::ArrayValueMap<Il2CppMethodPointer, MethodDefinitionKey, MethodInfoToMethodPointerConverter> NativeMethodMap;\n    static NativeMethodMap s_NativeMethods;\n\n    void NativeSymbol::RegisterMethods(const std::vector<MethodDefinitionKey>& managedMethods)\n    {\n        s_NativeMethods.assign(managedMethods);\n    }\n\n#pragma pack(push, p1, 4)\n    struct SymbolInfo\n    {\n        uint64_t address;\n        uint32_t length;\n    };\n#pragma pack(pop, p1)\n\n    static int32_t s_SymbolCount;\n    static SymbolInfo* s_SymbolInfos;\n    static void* s_ImageBase;\n\n    static void* LoadSymbolInfoFileFrom(const std::string& path)\n    {\n        int error;\n        il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(path, kFileModeOpen, kFileAccessRead, kFileShareRead, kFileOptionsNone, &error);\n\n        if (error != 0)\n            return NULL;\n\n        // Note that we won't unmap this file, we'll leave it open the entire lifetime of the process.\n        void* mappedFile = il2cpp::os::MemoryMappedFile::Map(handle);\n\n        il2cpp::os::File::Close(handle, &error);\n        IL2CPP_ASSERT(error == 0);\n\n        return mappedFile;\n    }\n\n    static void* LoadSymbolInfoFile()\n    {\n#if IL2CPP_TARGET_ANDROID\n    #if defined(__i386__)\n        std::string symbolMapFileName = \"SymbolMap-x86\";\n    #else\n        std::string symbolMapFileName = \"SymbolMap-ARMv7\";\n    #endif\n#else\n    #if !IL2CPP_CAN_USE_MULTIPLE_SYMBOL_MAPS\n        std::string symbolMapFileName = \"SymbolMap\";\n    #elif IL2CPP_SIZEOF_VOID_P == 4\n        std::string symbolMapFileName = \"SymbolMap-32\";\n    #elif IL2CPP_SIZEOF_VOID_P == 8\n        std::string symbolMapFileName = \"SymbolMap-64\";\n    #else\n        #error Unknown symbol map file name\n    #endif\n#endif\n\n        void* result = LoadSymbolInfoFileFrom(il2cpp::utils::PathUtils::Combine(il2cpp::utils::PathUtils::DirectoryName(il2cpp::os::Path::GetExecutablePath()), symbolMapFileName));\n        if (result != NULL)\n            return result;\n\n        return LoadSymbolInfoFileFrom(il2cpp::utils::PathUtils::Combine(utils::Runtime::GetDataDir(), symbolMapFileName));\n    }\n\n    static void InitializeSymbolInfos()\n    {\n        s_ImageBase = il2cpp::os::Image::GetImageBase();\n\n        void* fileBuffer = LoadSymbolInfoFile();\n        if (fileBuffer == NULL)\n            return;\n\n        s_SymbolCount = *((int32_t*)fileBuffer);\n        s_SymbolInfos = (SymbolInfo*)((uint8_t*)fileBuffer + sizeof(s_SymbolCount));\n    }\n\n    static bool CompareEndOfSymbols(const SymbolInfo &a, const SymbolInfo &b)\n    {\n        return a.address + a.length < b.address + b.length;\n    }\n\n    static bool s_TriedToInitializeSymbolInfo = false;\n\n    const VmMethod* NativeSymbol::GetMethodFromNativeSymbol(Il2CppMethodPointer nativeMethod)\n    {\n        if (!s_TriedToInitializeSymbolInfo)\n        {\n            // Only attempt to initialize the symbol information once. If it is not present the first time,\n            // it likely won't be there later either. Repeated chcecking can cause performance problems.\n            s_TriedToInitializeSymbolInfo = true;\n            InitializeSymbolInfos();\n        }\n\n        // address has to be above our base address\n        if ((void*)nativeMethod < (void*)s_ImageBase)\n            return NULL;\n\n\n        if (s_SymbolCount > 0)\n        {\n            SymbolInfo* end = s_SymbolInfos + s_SymbolCount;\n\n            // our 'key' could be anywhere within a symbol. Our comparison function compares the end address\n            // of the symbols. By doing this, upper bound returns the first symbol whose end address is greater\n            // than our 'key'. This is our symbol since our end is the first end above an interior value.\n            SymbolInfo interiorSymbol = { (size_t)((char*)nativeMethod - (char*)s_ImageBase), 0 };\n            SymbolInfo* containingSymbol = std::upper_bound(s_SymbolInfos, end, interiorSymbol, &CompareEndOfSymbols);\n\n            if (containingSymbol == end)\n                return NULL;\n\n            // We only include managed methods in the symbol data. A lookup for a native method might find the\n            // previous or next managed method in the data. This will be incorrect, so check the start and the size,\n            // to make sure the interior symbol is really within the method found in the containing symbol.\n            if ((interiorSymbol.address != containingSymbol->address) &&\n                ((interiorSymbol.address < containingSymbol->address) ||\n                 (interiorSymbol.address - containingSymbol->address > containingSymbol->length)))\n                return NULL;\n\n            nativeMethod = (Il2CppMethodPointer)((char*)s_ImageBase + containingSymbol->address);\n\n            // We can't assume that the map file is aligned.\n            // We must use the same masking/no masking logic used to insert into the data structure for the lookup.\n            // If we don't, the find will try to look up unmasked in a table full of masked values.\n\n            // do exact lookup based on the symbol start address, as that is our key\n            NativeMethodMap::iterator iter = s_NativeMethods.find_first(MaskSpareBits(nativeMethod));\n            if (iter != s_NativeMethods.end())\n            {\n                return IL2CPP_VM_METHOD_METADATA_FROM_INDEX(iter->isGeneric, iter->methodIndex);\n            }\n        }\n        else\n        {\n            // get the first symbol greater than the one we want\n            NativeMethodMap::iterator iter = s_NativeMethods.upper_bound(nativeMethod);\n\n            // This will cause it to fail to pickup the last method, but we cannot do anything about it\n            if (iter != s_NativeMethods.begin() && iter != s_NativeMethods.end())\n            {\n                // go back one to get the symbol we actually want\n                iter--;\n                return IL2CPP_VM_METHOD_METADATA_FROM_INDEX(iter->isGeneric, iter->methodIndex);\n            }\n        }\n\n        return NULL;\n    }\n\n#endif\n} /* namespace utils */\n} /* namespace il2cpp */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm-utils/NativeSymbol.h",
    "content": "#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include \"il2cpp-vm-support.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class NativeSymbol\n    {\n    public:\n#if IL2CPP_ENABLE_NATIVE_STACKTRACES\n        static void RegisterMethods(const std::vector<MethodDefinitionKey>& managedMethods);\n        static const VmMethod* GetMethodFromNativeSymbol(Il2CppMethodPointer nativeMethod);\n#endif\n    };\n} /* namespace vm */\n} /* namespace mono */\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm-utils/VmStringUtils.cpp",
    "content": "#include \"VmStringUtils.h\"\n#include \"../object-internals.h\"\n#include \"../char-conversions.h\"\n#include \"utils/Functional.h\"\n#include \"utils/StringUtils.h\"\n#include \"utils/utf8-cpp/source/utf8/unchecked.h\"\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    Il2CppChar VmStringUtils::Utf16ToLower(Il2CppChar c)\n    {\n        const Il2CppChar kDataLowThreshold = 9423;\n        const Il2CppChar kDataHighThreshold = 65313;\n\n        if (c <= kDataLowThreshold)\n        {\n            c = ToLowerDataLow[c];\n        }\n        else if (c >= kDataHighThreshold)\n        {\n            c = ToLowerDataHigh[c - kDataHighThreshold];\n        }\n\n        return c;\n    }\n\n    bool VmStringUtils::CaseSensitiveComparer::operator()(const std::string& left, const std::string& right) const\n    {\n        return left == right;\n    }\n\n    bool VmStringUtils::CaseSensitiveComparer::operator()(const std::string& left, const char* right) const\n    {\n        return left.compare(right) == 0;\n    }\n\n    bool VmStringUtils::CaseSensitiveComparer::operator()(const char* left, const std::string& right) const\n    {\n        return right.compare(left) == 0;\n    }\n\n    bool VmStringUtils::CaseSensitiveComparer::operator()(const char* left, const char* right) const\n    {\n        return strcmp(left, right) == 0;\n    }\n\n    static inline void Utf32CharToSurrogatePair(uint32_t c, Il2CppChar(&surrogatePair)[2])\n    {\n        const Il2CppChar kLeadOffset = 55232;\n        const Il2CppChar kTrailSurrogateMin = 56320;\n\n        if (c > 0xffff)\n        {\n            surrogatePair[0] = static_cast<Il2CppChar>((c >> 10) + kLeadOffset);\n            surrogatePair[1] = static_cast<Il2CppChar>((c & 0x3ff) + kTrailSurrogateMin);\n        }\n        else\n        {\n            surrogatePair[0] = static_cast<Il2CppChar>(c);\n            surrogatePair[1] = 0;\n        }\n    }\n\n    static inline bool Utf16CharEqualsIgnoreCase(Il2CppChar left, Il2CppChar right)\n    {\n        return VmStringUtils::Utf16ToLower(left) == VmStringUtils::Utf16ToLower(right);\n    }\n\n    bool VmStringUtils::CaseInsensitiveComparer::operator()(const std::string& left, const std::string& right) const\n    {\n        return operator()(left.c_str(), right.c_str());\n    }\n\n    bool VmStringUtils::CaseInsensitiveComparer::operator()(const std::string& left, const char* right) const\n    {\n        return operator()(left.c_str(), right);\n    }\n\n    bool VmStringUtils::CaseInsensitiveComparer::operator()(const char* left, const std::string& right) const\n    {\n        return operator()(left, right.c_str());\n    }\n\n    bool VmStringUtils::CaseInsensitiveComparer::operator()(const char* left, const char* right) const\n    {\n#if IL2CPP_DEBUG    // Invalid UTF8 strings shouldn't be passed here, so let's assert in debug mode\n        IL2CPP_ASSERT(utf8::is_valid(left, left + strlen(left)));\n        IL2CPP_ASSERT(utf8::is_valid(right, right + strlen(right)));\n#endif\n\n        Il2CppChar utf16Left[2];\n        Il2CppChar utf16Right[2];\n\n        while (*left && *right)\n        {\n            Utf32CharToSurrogatePair(utf8::unchecked::next(left), utf16Left);\n            Utf32CharToSurrogatePair(utf8::unchecked::next(right), utf16Right);\n\n            if (!Utf16CharEqualsIgnoreCase(utf16Left[0], utf16Right[0]) ||\n                !Utf16CharEqualsIgnoreCase(utf16Left[1], utf16Right[1]))\n            {\n                return false;\n            }\n        }\n\n        return *left == '\\0' && *right == '\\0';\n    }\n\n    bool VmStringUtils::CaseSensitiveEquals(Il2CppString* left, const char* right)\n    {\n        std::string leftString = StringUtils::Utf16ToUtf8(left->chars);\n        functional::Filter<const char*, CaseSensitiveComparer> equalsLeft(leftString.c_str());\n        return equalsLeft(right);\n    }\n\n    bool VmStringUtils::CaseSensitiveEquals(const char* left, const char* right)\n    {\n        functional::Filter<const char*, CaseSensitiveComparer> equalsLeft(left);\n        return equalsLeft(right);\n    }\n\n    bool VmStringUtils::CaseInsensitiveEquals(Il2CppString* left, const char* right)\n    {\n        std::string leftString = StringUtils::Utf16ToUtf8(left->chars);\n        functional::Filter<const char*, CaseInsensitiveComparer> equalsLeft(leftString.c_str());\n        return equalsLeft(right);\n    }\n\n    bool VmStringUtils::CaseInsensitiveEquals(const char* left, const char* right)\n    {\n        functional::Filter<const char *, CaseInsensitiveComparer> equalsLeft(left);\n        return equalsLeft(right);\n    }\n}\n}\n"
  },
  {
    "path": "unity_decoder/libil2cpp/vm-utils/VmStringUtils.h",
    "content": "#pragma once\n\n#include \"il2cpp-config.h\"\n#include <string>\n\nnamespace il2cpp\n{\nnamespace utils\n{\n    class LIBIL2CPP_CODEGEN_API VmStringUtils\n    {\n    public:\n        static Il2CppChar Utf16ToLower(Il2CppChar c);\n        static bool CaseSensitiveEquals(Il2CppString* left, const char* right);\n        static bool CaseSensitiveEquals(const char* left, const char* right);\n        static bool CaseInsensitiveEquals(Il2CppString* left, const char* right);\n        static bool CaseInsensitiveEquals(const char* left, const char* right);\n\n        struct CaseSensitiveComparer\n        {\n            bool operator()(const std::string& left, const std::string& right) const;\n            bool operator()(const std::string& left, const char* right) const;\n            bool operator()(const char* left, const std::string& right) const;\n            bool operator()(const char* left, const char* right) const;\n        };\n\n        struct CaseInsensitiveComparer\n        {\n            bool operator()(const std::string& left, const std::string& right) const;\n            bool operator()(const std::string& left, const char* right) const;\n            bool operator()(const char* left, const std::string& right) const;\n            bool operator()(const char* left, const char* right) const;\n        };\n    };\n} // namespace utils\n} // namespace il2cpp\n"
  },
  {
    "path": "unity_decoder/main.cpp",
    "content": "#include \"core.h\"\n#include <iostream>\n#include <iostream>\n#include <fstream>\n#include <string>\n#include <vector>\n#include <cstring>\n#include <cstddef>\n#include <cstdlib>\n#include <iomanip>\n#include <il2cpp-metadata.h>\n#include <vm/String.h>\n#include <vm/MetadataCache.h>\n#include <windows.h>\n#include <fstream>\n#include <cstdio>\n#include <cstdlib>\n\n\n//Define file names\nconst char *MetadataFileName = \"./global-metadata.dat\";\nconst char *StringLiteralFileName = \"./string_literal.txt\";\nconst char *MethodNameFileName = \"./method_name.txt\";\n\nstatic Il2CppGlobalMetadataHeader* s_GlobalMetadataHeader;\nstatic void* s_GlobalMetadata;\n\n\n#define MAX_META_COUNT\t100000\nchar *g_metadataUsages[MAX_META_COUNT] = { NULL };\n//Il2CppMethodPointer g_methodPointers[MAX_META_COUNT] = { NULL };\nIl2CppClass* g_classes[MAX_META_COUNT] = { NULL };\nchar *g_methodNames[MAX_META_COUNT] = { NULL };\n\nchar* removeAllChars(char* str, char c)\n{\n\tchar *pr = str, *pw = str;\n\twhile (*pr) {\n\t\t*pw = *pr++;\n\t\tpw += (*pw != c);\n\t}\n\t*pw = '\\0';\n\n\treturn str;\n}\n\nconst char* GetStringFromIndex(StringIndex index)\n{\n\tassert(index <= s_GlobalMetadataHeader->stringCount);\n\tconst char* strings = ((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->stringOffset) + index;\n\treturn strings;\n}\n\nstatic Il2CppClass* FromTypeDefinition(TypeDefinitionIndex index)\n{\n\tassert(index >= 0 && static_cast<uint32_t>(index) < s_GlobalMetadataHeader->typeDefinitionsCount / sizeof(Il2CppTypeDefinition));\n\tconst Il2CppTypeDefinition* typeDefinitions = (const Il2CppTypeDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->typeDefinitionsOffset);\n\tconst Il2CppTypeDefinition* typeDefinition = typeDefinitions + index;\n\t//const Il2CppTypeDefinitionSizes* typeDefinitionSizes = s_Il2CppMetadataRegistration->typeDefinitionsSizes + index;\n\tIl2CppClass* typeInfo = (Il2CppClass*)malloc(sizeof(Il2CppClass));\n\t//typeInfo->image = GetImageForTypeDefinitionIndex(index);\n\ttypeInfo->name = GetStringFromIndex(typeDefinition->nameIndex);\n\ttypeInfo->namespaze = GetStringFromIndex(typeDefinition->namespaceIndex);\n\ttypeInfo->customAttributeIndex = typeDefinition->customAttributeIndex;\n\t//typeInfo->byval_arg = MetadataCache::GetIl2CppTypeFromIndex(typeDefinition->byvalTypeIndex);\n\t//typeInfo->this_arg = MetadataCache::GetIl2CppTypeFromIndex(typeDefinition->byrefTypeIndex);\n\ttypeInfo->typeDefinition = typeDefinition;\n\ttypeInfo->genericContainerIndex = typeDefinition->genericContainerIndex;\n\t//typeInfo->instance_size = typeDefinitionSizes->instance_size;\n\t//typeInfo->actualSize = typeDefinitionSizes->instance_size; // actualySize is instance_size for compiler generated values\n\t//typeInfo->native_size = typeDefinitionSizes->native_size;\n\t//typeInfo->static_fields_size = typeDefinitionSizes->static_fields_size;\n\t//typeInfo->thread_static_fields_size = typeDefinitionSizes->thread_static_fields_size;\n\ttypeInfo->thread_static_fields_offset = -1;\n\ttypeInfo->flags = typeDefinition->flags;\n\t//typeInfo->valuetype = (typeDefinition->bitfield >> (kBitIsValueType - 1)) & 0x1;\n\t//typeInfo->enumtype = (typeDefinition->bitfield >> (kBitIsEnum - 1)) & 0x1;\n\ttypeInfo->is_generic = typeDefinition->genericContainerIndex != kGenericContainerIndexInvalid; // generic if we have a generic container\n\t//typeInfo->has_finalize = (typeDefinition->bitfield >> (kBitHasFinalizer - 1)) & 0x1;\n\t//typeInfo->has_cctor = (typeDefinition->bitfield >> (kBitHasStaticConstructor - 1)) & 0x1;\n\t//typeInfo->is_blittable = (typeDefinition->bitfield >> (kBitIsBlittable - 1)) & 0x1;\n\t//typeInfo->is_import_or_windows_runtime = (typeDefinition->bitfield >> (kBitIsImportOrWindowsRuntime - 1)) & 0x1;\n\t//typeInfo->packingSize = ConvertPackingSizeEnumToValue(static_cast<PackingSize>((typeDefinition->bitfield >> (kPackingSize - 1)) & 0xF));\n\ttypeInfo->method_count = typeDefinition->method_count;\n\ttypeInfo->property_count = typeDefinition->property_count;\n\ttypeInfo->field_count = typeDefinition->field_count;\n\ttypeInfo->event_count = typeDefinition->event_count;\n\ttypeInfo->nested_type_count = typeDefinition->nested_type_count;\n\ttypeInfo->vtable_count = typeDefinition->vtable_count;\n\ttypeInfo->interfaces_count = typeDefinition->interfaces_count;\n\ttypeInfo->interface_offsets_count = typeDefinition->interface_offsets_count;\n\ttypeInfo->token = typeDefinition->token;\n\n\t/*\n\tif (typeDefinition->parentIndex != kTypeIndexInvalid)\n\t\ttypeInfo->parent = Class::FromIl2CppType(MetadataCache::GetIl2CppTypeFromIndex(typeDefinition->parentIndex));\n\n\tif (typeDefinition->declaringTypeIndex != kTypeIndexInvalid)\n\t\ttypeInfo->declaringType = Class::FromIl2CppType(MetadataCache::GetIl2CppTypeFromIndex(typeDefinition->declaringTypeIndex));\n\n\ttypeInfo->castClass = typeInfo->element_class = typeInfo;\n\tif (typeInfo->enumtype)\n\t\ttypeInfo->castClass = typeInfo->element_class = Class::FromIl2CppType(MetadataCache::GetIl2CppTypeFromIndex(typeDefinition->elementTypeIndex));\n\t*/\n\n\treturn typeInfo;\n}\n\nconst Il2CppMethodDefinition* GetMethodDefinitionFromIndex(MethodIndex index)\n{\n\tassert(index >= 0 && static_cast<uint32_t>(index) <= s_GlobalMetadataHeader->methodsCount / sizeof(Il2CppMethodDefinition));\n\tconst Il2CppMethodDefinition* methods = (const Il2CppMethodDefinition*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->methodsOffset);\n\treturn methods + index;\n}\n\n\nvoid SetupMethods(Il2CppClass *klass)\n{\n\n\tif (klass->method_count == 0)\n\t{\n\t\tklass->methods = NULL;\n\t\treturn;\n\t}\n\n\tklass->methods = (const MethodInfo**)malloc(klass->method_count * sizeof(MethodInfo*));\n\tMethodInfo* methods = (MethodInfo*)malloc(klass->method_count * sizeof(MethodInfo));\n\tmemset(methods, 0, klass->method_count * sizeof(MethodInfo));\n\tMethodInfo* newMethod = methods;\n\n\tMethodIndex start = klass->typeDefinition->methodStart;\n\tassert(start != kFieldIndexInvalid);\n\tMethodIndex end = start + klass->method_count;\n\n\tfor (MethodIndex index = start; index < end; ++index)\n\t{\n\t\tconst Il2CppMethodDefinition* methodDefinition = GetMethodDefinitionFromIndex(index);\n\n\t\tnewMethod->name = GetStringFromIndex(methodDefinition->nameIndex);\n\t\t//newMethod->methodPointer = GetMethodPointerFromIndex(methodDefinition->methodIndex);\n\t\t//newMethod->invoker_method = GetMethodInvokerFromIndex(methodDefinition->invokerIndex);\n\t\tnewMethod->declaring_type = klass;\n\t\t//newMethod->return_type = GetIl2CppTypeFromIndex(methodDefinition->returnType);\n\n\t\t/*\n\t\tParameterInfo* parameters = (ParameterInfo*)malloc(methodDefinition->parameterCount * sizeof(ParameterInfo));\n\t\tParameterInfo* newParameter = parameters;\n\t\tfor (uint16_t paramIndex = 0; paramIndex < methodDefinition->parameterCount; ++paramIndex)\n\t\t{\n\t\t\tconst Il2CppParameterDefinition* parameterDefinition = GetParameterDefinitionFromIndex(methodDefinition->parameterStart + paramIndex);\n\t\t\tnewParameter->name = GetStringFromIndex(parameterDefinition->nameIndex);\n\t\t\tnewParameter->position = paramIndex;\n\t\t\tnewParameter->token = parameterDefinition->token;\n\t\t\tnewParameter->customAttributeIndex = parameterDefinition->customAttributeIndex;\n\t\t\tnewParameter->parameter_type = GetIl2CppTypeFromIndex(parameterDefinition->typeIndex);\n\n\t\t\tnewParameter++;\n\t\t}\n\t\tnewMethod->parameters = parameters;\n\n\t\tnewMethod->customAttributeIndex = methodDefinition->customAttributeIndex;\n\t\tnewMethod->flags = methodDefinition->flags;\n\t\tnewMethod->iflags = methodDefinition->iflags;\n\t\tnewMethod->slot = methodDefinition->slot;\n\t\tnewMethod->parameters_count = static_cast<const uint8_t>(methodDefinition->parameterCount);\n\t\tnewMethod->is_inflated = false;\n\t\tnewMethod->token = methodDefinition->token;\n\t\tnewMethod->methodDefinition = methodDefinition;\n\t\tnewMethod->genericContainer = GetGenericContainerFromIndex(methodDefinition->genericContainerIndex);\n\t\t*/\n\n\t\tif (newMethod->genericContainer)\n\t\t\tnewMethod->is_generic = true;\n\n\n\t\tklass->methods[index - start] = newMethod;\n\n\t\tif (methodDefinition->methodIndex >= 0 && newMethod->name != NULL) {\n\t\t\tint totalLen = strlen(klass->name) + strlen(newMethod->name) + 3;\n\t\t\tchar *name = new char[totalLen];\n\t\t\tsnprintf(name, totalLen, \"%s$$%s\\0\", klass->name, newMethod->name);\n\t\t\tg_methodNames[methodDefinition->methodIndex] = name;\n\t\t}\n\n\t\tnewMethod++;\n\t\t\n\t}\n\n}\n\n\nIl2CppClass* GetTypeInfoFromTypeDefinitionIndex(TypeDefinitionIndex index)\n{\n\tif (index == kTypeIndexInvalid)\n\t\treturn NULL;\n\n\tassert(index >= 0 && static_cast<uint32_t>(index) < s_GlobalMetadataHeader->typeDefinitionsCount / sizeof(Il2CppTypeDefinition));\n\n\treturn FromTypeDefinition(index);\n}\n\nchar* GetStringLiteralFromIndex(StringLiteralIndex index)\n{\n\t\n\tassert(index >= 0 && static_cast<uint32_t>(index) < s_GlobalMetadataHeader->stringLiteralCount / sizeof(Il2CppStringLiteral) && \"Invalid string literal index \");\n\n\tconst Il2CppStringLiteral* stringLiteral = (const Il2CppStringLiteral*)((const char*)s_GlobalMetadata + s_GlobalMetadataHeader->stringLiteralOffset) + index;\n\t\n\tconst char* srcStr = (const char*)s_GlobalMetadata + s_GlobalMetadataHeader->stringLiteralDataOffset + stringLiteral->dataIndex;\n\t\n\tchar *dstStr = new char[stringLiteral->length+1];\n\tsnprintf(dstStr, stringLiteral->length+1, \"%s\", srcStr);\n\n\tdstStr = removeAllChars(dstStr, '\\r');\n\tdstStr = removeAllChars(dstStr, '\\n');\n\n\treturn dstStr;\n}\n\n\ntemplate <typename T>\nstatic T MetadataOffset(void* metadata, size_t sectionOffset, size_t itemIndex)\n{\n\treturn reinterpret_cast<T> (reinterpret_cast<uint8_t*> (metadata) + sectionOffset) + itemIndex;\n}\n\n\nvoid InitializeMethodMetadata(uint32_t index)\n{\n\tassert(s_GlobalMetadataHeader->metadataUsageListsCount >= 0 && index <= static_cast<uint32_t>(s_GlobalMetadataHeader->metadataUsageListsCount));\n\t\n\n\tconst Il2CppMetadataUsageList* metadataUsageLists = MetadataOffset<const Il2CppMetadataUsageList*>(s_GlobalMetadata, s_GlobalMetadataHeader->metadataUsageListsOffset, index);\n\n\tuint32_t start = metadataUsageLists->start;\n\tuint32_t count = metadataUsageLists->count;\n\n\tfor (uint32_t i = 0; i < count; i++)\n\t{\n\t\tuint32_t offset = start + i;\n\t\tassert(s_GlobalMetadataHeader->metadataUsagePairsCount >= 0 && offset <= static_cast<uint32_t>(s_GlobalMetadataHeader->metadataUsagePairsCount));\n\t\tconst Il2CppMetadataUsagePair* metadataUsagePairs = MetadataOffset<const Il2CppMetadataUsagePair*>(s_GlobalMetadata, s_GlobalMetadataHeader->metadataUsagePairsOffset, offset);\n\t\tuint32_t destinationIndex = metadataUsagePairs->destinationIndex;\n\t\tuint32_t encodedSourceIndex = metadataUsagePairs->encodedSourceIndex;\n\n\t\tIl2CppMetadataUsage usage = GetEncodedIndexType(encodedSourceIndex);\n\t\tuint32_t decodedIndex = GetDecodedMethodIndex(encodedSourceIndex);\n\t\tswitch (usage)\n\t\t{\n\t\tcase kIl2CppMetadataUsageTypeInfo:\n\t\t\t//metadataUsages[destinationIndex] = GetTypeInfoFromTypeIndex(decodedIndex);\n\t\t\tbreak;\n\t\tcase kIl2CppMetadataUsageIl2CppType:\n\t\t\t//metadataUsages[destinationIndex] = const_cast<Il2CppType*>(GetIl2CppTypeFromIndex(decodedIndex));\n\t\t\t//break;\n\t\tcase kIl2CppMetadataUsageMethodDef:\n\t\t\t//metadataUsages_method[destinationIndex] = const_cast<MethodInfo*>(GetMethodInfoFromMethodDefinitionIndex(encodedSourceIndex));\n\t\t\tbreak;\n\t\tcase kIl2CppMetadataUsageMethodRef:\n\t\t\t//metadataUsages_method[destinationIndex] = const_cast<MethodInfo*>(GetMethodInfoFromMethodDefinitionIndex(encodedSourceIndex));\n\t\t\t//metadataUsages[destinationIndex] = const_cast<char*>(GetMethodInfoFromIndex(encodedSourceIndex));\n\t\t\tbreak;\n\t\tcase kIl2CppMetadataUsageFieldInfo:\n\t\t\t//metadataUsages[destinationIndex] = GetFieldInfoFromIndex(decodedIndex);\n\t\t\tbreak;\n\t\tcase kIl2CppMetadataUsageStringLiteral:\n\t\t\tg_metadataUsages[destinationIndex] = GetStringLiteralFromIndex(decodedIndex);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t//std::cout << \"not implemented\" << std::endl;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\nint main()\n{\n\n\tstd::ofstream stringLiteralFile, methodNameFile;\n\tstd::ifstream metadataFile;\n\t\n\tmetadataFile.open(MetadataFileName, std::ios::binary | std::ios::ate);\n\tstd::streamsize size = metadataFile.tellg();\n\tmetadataFile.seekg(0, std::ios::beg);\n\tchar *addr = (char*)malloc(size + 1);\n\tmetadataFile.read(&addr[0], size);\n\taddr[size] = 0;\n\n\ts_GlobalMetadata = addr;\n\ts_GlobalMetadataHeader = (Il2CppGlobalMetadataHeader*)addr;\n\n\n\tstd::cout << \"metadata version is: \" << s_GlobalMetadataHeader->version << std::endl;\n\n\n\tassert(s_GlobalMetadataHeader->sanity == 0xFAB11BAF);\n\tassert(s_GlobalMetadataHeader->version == 24);\n\n\n\n\tstringLiteralFile.open(StringLiteralFileName);\n\tint usagePairCount = s_GlobalMetadataHeader->metadataUsageListsCount / sizeof(Il2CppMetadataUsagePair);\n\tfor (int i = 0; i < usagePairCount; i++) {\n\t\tInitializeMethodMetadata(i);\n\t}\n\n\n\tint strCount = s_GlobalMetadataHeader->stringLiteralCount / sizeof(Il2CppStringLiteral);\n\t\n\t/*\n\tfor (int i = MAX_META_COUNT - 1 ; i >= 0 ; i--) {\n\t\tif (g_metadataUsages[i] != NULL) {\n\t\t\tstringLiteralFile << g_metadataUsages[i] << std::endl;\n\t\t}\n\t}\n\t*/\n\tint skip = 0;\n\tint i = 0;\n\tfor (i = 0; i < MAX_META_COUNT; i++) {\n\t\tif (g_metadataUsages[i] == NULL) {\n\t\t\tskip++;\n\t\t}\n\t\telse {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\n\tint totalStrNum = skip + strCount;\n\n\tstringLiteralFile << totalStrNum << std::endl << strCount << std::endl;\n\tfor (; i < MAX_META_COUNT; i++) {\n\t\tif (g_metadataUsages[i] == NULL) {\n\t\t\tbreak;\n\t\t}\n\t\tstringLiteralFile << g_metadataUsages[i] << std::endl;\n\t}\n\t\n\t\n\tstringLiteralFile.close();\n\n\tmethodNameFile.open(MethodNameFileName);\n\n\tint typeCount = s_GlobalMetadataHeader->typeDefinitionsCount / sizeof(Il2CppTypeDefinition);\n\tfor (int i = 0; i < typeCount; i++) {\n\t\tg_classes[i] = GetTypeInfoFromTypeDefinitionIndex(i);\n\t\tSetupMethods(g_classes[i]);\n\t}\n\n\tint methodCount = 0;\n\tfor (int i = 0; i < MAX_META_COUNT; i++) {\n\t\tif (g_methodNames[i] != NULL) {\n\t\t\tmethodCount++;\n\t\t}\n\t}\n\n\tmethodNameFile << methodCount << std::endl;\n\tfor (int i = 0; i < MAX_META_COUNT; i++) {\n\t\tif (g_methodNames[i] != NULL) {\n\t\t\tmethodNameFile << g_methodNames[i] << std::endl;\n\t\t}\n\t}\n\tmethodNameFile.close();\n\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "unity_decoder/unity_decoder.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{326A24E3-C74E-4B12-9BFE-E69F0C6493D4}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>unity_decoder</RootNamespace>\n    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <IncludePath>$(IncludePath)</IncludePath>\n    <LibraryPath>$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <IncludePath>D:\\vs_project\\unity_decoder\\unity_decoder\\libil2cpp;D:\\local\\boost_1_61_0;$(IncludePath)</IncludePath>\n    <LibraryPath>D:\\local\\boost_1_61_0\\lib64-msvc-14.0;$(LibraryPath)</LibraryPath>\n    <SourcePath>D:\\vs_project\\unity_decoder\\unity_decoder\\libil2cpp;$(SourcePath)</SourcePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <IncludePath>$(WindowsSdkDir)\\include;$(ProjectDir)\\libil2cpp;$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n      <AdditionalIncludeDirectories>.\\libil2cpp;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n    </Link>\n    <PostBuildEvent>\n      <Command>\n      </Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"main.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"core.h\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "unity_decoder/unity_decoder.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"ソース ファイル\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"ヘッダー ファイル\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"リソース ファイル\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"main.cpp\">\n      <Filter>ソース ファイル</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"core.h\">\n      <Filter>ヘッダー ファイル</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "unity_decoder/unity_decoder.vcxproj.user",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <ShowAllFiles>true</ShowAllFiles>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "unity_decoder.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"unity_decoder\", \"unity_decoder\\unity_decoder.vcxproj\", \"{326A24E3-C74E-4B12-9BFE-E69F0C6493D4}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{326A24E3-C74E-4B12-9BFE-E69F0C6493D4}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{326A24E3-C74E-4B12-9BFE-E69F0C6493D4}.Debug|x64.Build.0 = Debug|x64\n\t\t{326A24E3-C74E-4B12-9BFE-E69F0C6493D4}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{326A24E3-C74E-4B12-9BFE-E69F0C6493D4}.Debug|x86.Build.0 = Debug|Win32\n\t\t{326A24E3-C74E-4B12-9BFE-E69F0C6493D4}.Release|x64.ActiveCfg = Release|x64\n\t\t{326A24E3-C74E-4B12-9BFE-E69F0C6493D4}.Release|x64.Build.0 = Release|x64\n\t\t{326A24E3-C74E-4B12-9BFE-E69F0C6493D4}.Release|x86.ActiveCfg = Release|Win32\n\t\t{326A24E3-C74E-4B12-9BFE-E69F0C6493D4}.Release|x86.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "unity_loader.py",
    "content": "import os, sys\nimport re\nimport random\nimport idaapi\nimport idc\nimport idautils\n\n\nINFO = idaapi.get_inf_structure()\n\nif INFO.is_64bit():\n    BITS = 64\nelif INFO.is_32bit():\n    BITS = 32\nelse:\n    BITS = 16\n\n\nENUM_FILE_TYPE =\\\n[\n  \"f_EXE_old\",            #// MS DOS EXE File\n  \"f_COM_old\",            #// MS DOS COM File\n  \"f_BIN\",                #// Binary File\n  \"f_DRV\",                #// MS DOS Driver\n  \"f_WIN\",                #// New Executable (NE)\n  \"f_HEX\",                #// Intel Hex Object File\n  \"f_MEX\",                #// MOS Technology Hex Object File\n  \"f_LX\",                 #// Linear Executable (LX)\n  \"f_LE\",                 #// Linear Executable (LE)\n  \"f_NLM\",                #// Netware Loadable Module (NLM)\n  \"f_COFF\",               #// Common Object File Format (COFF)\n  \"f_PE\",                 #// Portable Executable (PE)\n  \"f_OMF\",                #// Object Module Format\n  \"f_SREC\",               #// R-records\n  \"f_ZIP\",                #// ZIP file (this file is never loaded to IDA database)\n  \"f_OMFLIB\",             #// Library of OMF Modules\n  \"f_AR\",                 #// ar library\n  \"f_LOADER\",             #// file is loaded using LOADER DLL\n  \"f_ELF\",                #// Executable and Linkable Format (ELF)\n  \"f_W32RUN\",             #// Watcom DOS32 Extender (W32RUN)\n  \"f_AOUT\",               #// Linux a.out (AOUT)\n  \"f_PRC\",                #// PalmPilot program file\n  \"f_EXE\",                #// MS DOS EXE File\n  \"f_COM\",                #// MS DOS COM File\n  \"f_AIXAR\",              #// AIX ar library\n  \"f_MACHO\",              #// Max OS X\n];\n\n\nFILE_TYPE = ENUM_FILE_TYPE[INFO.filetype]\n\n\ndef IncreaseAddr(addr):\n    if BITS == 64:\n        return addr+8\n    elif BITS == 32:\n        return addr+4\n        \n        \ndef DecreaseAddr(addr):\n    if BITS == 64:\n        return addr-8\n    elif BITS == 32:\n        return addr-4\n        \ndef GetVarFromAddr(addr):\n    if BITS == 64:\n        return idc.Qword(addr)\n    elif BITS == 32:\n        return idc.Dword(addr)\n\ndef GetMethodFromAddr(addr):\n    return GetVarFromAddr(addr) & 0xFFFFFFFE\n    \ndef IsCode(addr):\n    return idc.isCode(idc.GetFlags(addr))\n\ndef IsData(addr):\n    return idc.isData(idc.GetFlags(addr))\n\ndef IsSubFollowing(addr):\n    i = 0\n    while i < 20:\n        pAddr = GetMethodFromAddr(addr)\n        if not IsCode(pAddr):\n            return False;\n\n        addr = idc.NextHead(addr)\n        i = i + 1\n\n    return True\n\ndef IsDataFollowing(addr):\n    i = 0\n    while i < 20:\n        pAddr = GetVarFromAddr(addr)\n        if not IsData(addr):\n            return False;\n\n        addr = idc.NextHead(addr)\n        i = i + 1\n\n    return True\n\ndef LocateMethodPointers():\n    seg = idc.FirstSeg()\n    initArrayAddr = 0\n    while seg != idc.BADADDR:\n        seg = idc.NextSeg(seg)\n        segName = idc.SegName(seg)\n        if segName == \".data.rel.ro\":\n            data_rel_ro = idc.SegStart(seg)\n            break\n\n    addr = data_rel_ro\n    referedVars = []\n    while idc.SegName(addr) == \".data.rel.ro\":\n        for r in idautils.XrefsTo(addr,0):\n            #print \"is refered: 0x%x\" % addr\n            referedVars.append(addr)\n            break\n\n        addr += 4\n\n    candidateMethodPointers = []\n    for var in referedVars:\n        if IsSubFollowing(var):\n            candidateMethodPointers.append(var)\n\n    for candidate in candidateMethodPointers:\n        for referedVar in referedVars:\n            if referedVar == candidate:\n                nextVar = referedVars[referedVars.index(referedVar)+1]\n                print \"candidate: 0x%x, candidate end: 0x%x, method numbers: %d\" % (candidate, nextVar, (nextVar-candidate)/4)\n                break\n\n\ndef LocateStringLiterals():\n    seg = idc.FirstSeg()\n    initArrayAddr = 0\n    while seg != idc.BADADDR:\n        seg = idc.NextSeg(seg)\n        segName = idc.SegName(seg)\n        if segName == \".data.rel.ro\":\n            data_rel_ro = idc.SegStart(seg)\n            break\n\n    addr = data_rel_ro\n    referedVars = []\n    while idc.SegName(addr) == \".data.rel.ro\":\n        for r in idautils.XrefsTo(addr,0):\n            referedVars.append(addr)\n            break\n        addr += 4\n\n    candidateMetadaUsages = []\n    for idx, var in enumerate(referedVars):\n        if idx < (len(referedVars)-1) and (referedVars[idx+1]-referedVars[idx]) >= 1024:\n            if idc.Dword(var) == 0x0:\n                continue\n            if IsDataFollowing(var) and idc.SegName(idc.Dword(var) ) == '.bss':\n                candidateMetadaUsages.append(var)\n\n    for candidate in candidateMetadaUsages:\n        for referedVar in referedVars:\n            if referedVar == candidate:\n                nextVar = referedVars[referedVars.index(referedVar)+1]\n                print \"candidate: 0x%x, candidate end: 0x%x, data numbers: %d\" % (candidate, nextVar, (nextVar-candidate)/4)\n                break\n\n\ndef LoadMethods(ea = None):\n    \n    if ea is None:\n        ea = ScreenEA();\n    \n    path = os.getcwd()\n    os.system(path+'/unity_decoder.exe')\n    file = open('./method_name.txt')\n    \n    str_count = file.readline()\n    i = 0;\n\n    for line in file:\n        line = line.strip(' ').replace('\\r', '').replace('\\n', '')\n        new_line = re.sub(r'[^a-zA-Z0-9_$]', '_', line)\n        \n        i = 0;\n        addr = GetMethodFromAddr(ea)\n        ret = idc.MakeNameEx(addr, str(new_line), SN_NOWARN)\n        while ret == 0 and i < 5: # failed\n            new_line_rand = new_line + '_' + str(random.randint(0, 99999))\n            ret = idc.MakeNameEx(addr, str(new_line_rand), SN_NOWARN)\n            idc.MakeComm(ea, str(line))\n            i = i + 1\n            \n        ea = IncreaseAddr(ea)\n\n    file.close()\n    \ndef LoadStringLiterals(ea = None):\n\n    if ea is None:\n        ea = ScreenEA();\n    \n    path = os.getcwd()\n    os.system(path+'/unity_decoder.exe')\n    file = open('./string_literal.txt')\n    \n    total_count = file.readline()\n    str_count = file.readline()\n    skip_count = int(total_count) - int(str_count)\n    ea += int(skip_count) * 0x4\n\n    for line in file:\n        line = line.strip(' ').replace('\\r', '').replace('\\n', '')\n        new_line = re.sub(r'[^a-zA-Z0-9_]', '_', line)\n        new_line = 'StringLiteral_' + new_line\n        \n       \n        i = 0;\n        addr = GetVarFromAddr(ea)\n        ret = idc.MakeNameEx(addr, str(new_line), SN_NOWARN)\n        #ret = idc.MakeNameEx(addr, \"\", SN_NOWARN)\n        while ret == 0 and i < 5: # failed\n            new_line_rand = new_line + '_' + str(random.randint(0, 99999))\n            ret = idc.MakeNameEx(addr, str(new_line_rand), SN_NOWARN)\n            i = i + 1\n             \n        idc.MakeComm(ea, str(line))\n        #idc.MakeComm(ea, \"\")\n        ea = IncreaseAddr(ea)\n    \n    file.close()\n\nprint \"Type LocateMethodPointers() to print suggested candidate for method pointers\"\nprint \"Click the location where you believe the method pointers start, type LoadMethods()\"\nprint \"Type LocateStringLiterals() to print suggested candidate for string literals\"\nprint \"Click the location where you believe the string literals start, type LoadStringLiterals()\"\n"
  }
]