Browse Source

bring log allocator up to date

Colin Davidson 1 year ago
parent
commit
d0bb1fb844
100 changed files with 11551 additions and 6407 deletions
  1. 1 0
      .gitattributes
  2. 1 1
      .github/workflows/ci.yml
  3. 5 0
      .gitignore
  4. BIN
      bin/lld-link.exe
  5. BIN
      bin/wasm-ld.exe
  6. 1 1
      core/builtin/builtin.odin
  7. 1 1
      core/bytes/bytes.odin
  8. 101 0
      core/c/libc/stdio.odin
  9. 31 41
      core/compress/common.odin
  10. 15 0
      core/container/priority_queue/priority_queue.odin
  11. 5 1
      core/dynlib/doc.odin
  12. 36 0
      core/dynlib/example/example.odin
  13. 14 0
      core/dynlib/example/lib.odin
  14. 99 9
      core/dynlib/lib.odin
  15. 4 0
      core/dynlib/lib_js.odin
  16. 5 0
      core/dynlib/lib_unix.odin
  17. 7 0
      core/dynlib/lib_windows.odin
  18. 2 6
      core/encoding/entity/example/entity_example.odin
  19. 2625 5027
      core/encoding/entity/generated.odin
  20. 30 13
      core/encoding/json/unmarshal.odin
  21. 4 2
      core/encoding/xml/debug_print.odin
  22. 2 2
      core/encoding/xml/example/xml_example.odin
  23. 4 2
      core/encoding/xml/helpers.odin
  24. 4 2
      core/encoding/xml/tokenizer.odin
  25. 71 148
      core/encoding/xml/xml_reader.odin
  26. 15 9
      core/fmt/fmt.odin
  27. 2 1
      core/fmt/fmt_os.odin
  28. 68 61
      core/log/log_allocator.odin
  29. 7 5
      core/math/fixed/fixed.odin
  30. 4 4
      core/math/linalg/general.odin
  31. 64 64
      core/math/linalg/specific.odin
  32. 5 5
      core/mem/virtual/arena.odin
  33. 4 4
      core/mem/virtual/virtual.odin
  34. 1 1
      core/mem/virtual/virtual_darwin.odin
  35. 1 1
      core/mem/virtual/virtual_linux.odin
  36. 1 1
      core/mem/virtual/virtual_windows.odin
  37. 1 1
      core/odin/parser/parser.odin
  38. 42 20
      core/os/os_linux.odin
  39. 1 0
      core/runtime/core.odin
  40. 8 3
      core/runtime/core_builtin.odin
  41. 10 10
      core/runtime/default_allocators_arena.odin
  42. 1 0
      core/runtime/entry_unix.odin
  43. 1 0
      core/runtime/entry_wasm.odin
  44. 3 2
      core/runtime/entry_windows.odin
  45. 14 10
      core/runtime/error_checks.odin
  46. 6 6
      core/runtime/internal.odin
  47. 5 1
      core/runtime/os_specific_any.odin
  48. 1 1
      core/runtime/os_specific_darwin.odin
  49. 1 1
      core/runtime/os_specific_windows.odin
  50. 13 2
      core/runtime/procs.odin
  51. 2 1
      core/runtime/procs_windows_amd64.odin
  52. 2 1
      core/runtime/procs_windows_i386.odin
  53. 1 1
      core/simd/x86/adx.odin
  54. 1 1
      core/simd/x86/fxsr.odin
  55. 2 2
      core/simd/x86/pclmulqdq.odin
  56. 1 1
      core/simd/x86/rdtsc.odin
  57. 1 1
      core/simd/x86/sha.odin
  58. 1 1
      core/simd/x86/sse.odin
  59. 1 1
      core/simd/x86/sse2.odin
  60. 1 1
      core/simd/x86/sse3.odin
  61. 1 1
      core/simd/x86/sse41.odin
  62. 1 1
      core/simd/x86/sse42.odin
  63. 1 1
      core/simd/x86/ssse3.odin
  64. 91 44
      core/slice/slice.odin
  65. 1 1
      core/slice/sort.odin
  66. 5 2
      core/strconv/generic_float.odin
  67. 3 1
      core/strings/strings.odin
  68. 3 3
      core/sync/futex_windows.odin
  69. 4 4
      core/sys/info/cpu_intel.odin
  70. 356 306
      core/sys/info/platform_darwin.odin
  71. 423 65
      core/sys/linux/bits.odin
  72. 166 29
      core/sys/linux/constants.odin
  73. 548 176
      core/sys/linux/sys.odin
  74. 746 73
      core/sys/linux/types.odin
  75. 7 2
      core/sys/windows/advapi32.odin
  76. 1 1
      core/sys/windows/bcrypt.odin
  77. 1 1
      core/sys/windows/bluetooth.odin
  78. 1 1
      core/sys/windows/comctl32.odin
  79. 2 2
      core/sys/windows/comdlg32.odin
  80. 2 2
      core/sys/windows/dbghelp.odin
  81. 1 1
      core/sys/windows/dnsapi.odin
  82. 1 1
      core/sys/windows/dwmapi.odin
  83. 1 1
      core/sys/windows/gdi32.odin
  84. 134 0
      core/sys/windows/hidpi.odin
  85. 1 1
      core/sys/windows/ip_helper.odin
  86. 20 20
      core/sys/windows/kernel32.odin
  87. 1 1
      core/sys/windows/netapi32.odin
  88. 1 1
      core/sys/windows/ntdll.odin
  89. 4 5
      core/sys/windows/ole32.odin
  90. 1 1
      core/sys/windows/shell32.odin
  91. 1 1
      core/sys/windows/shlwapi.odin
  92. 1 1
      core/sys/windows/synchronization.odin
  93. 169 167
      core/sys/windows/types.odin
  94. 5 5
      core/sys/windows/user32.odin
  95. 1 1
      core/sys/windows/userenv.odin
  96. 1 1
      core/sys/windows/ux_theme.odin
  97. 1 1
      core/sys/windows/wgl.odin
  98. 5482 0
      core/sys/windows/winerror.odin
  99. 1 1
      core/sys/windows/winmm.odin
  100. 1 1
      core/sys/windows/ws2_32.odin

+ 1 - 0
.gitattributes

@@ -1 +1,2 @@
 *.odin linguist-language=Odin
+* text=auto

+ 1 - 1
.github/workflows/ci.yml

@@ -163,7 +163,7 @@ jobs:
         run: |
           call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat
           cd tests\documentation
-          call build.bat
+          rem call build.bat
         timeout-minutes: 10
       - name: core:math/big tests
         shell: cmd

+ 5 - 0
.gitignore

@@ -47,6 +47,8 @@ tests/core/test_linalg_glsl_math
 tests/core/test_noise
 tests/core/test_varint
 tests/core/test_xml
+tests/core/test_core_slice
+tests/core/test_core_thread
 tests/vendor/vendor_botan
 # Visual Studio 2015 cache/options directory
 .vs/
@@ -312,3 +314,6 @@ shared/
 examples/bug/
 build.sh
 !core/debug/
+
+# RAD debugger project file
+*.raddbg

BIN
bin/lld-link.exe


BIN
bin/wasm-ld.exe


+ 1 - 1
core/builtin/builtin.odin

@@ -110,7 +110,7 @@ typeid_of    :: proc($T: typeid) -> typeid ---
 swizzle :: proc(x: [N]T, indices: ..int) -> [len(indices)]T ---
 
 complex    :: proc(real, imag: Float) -> Complex_Type ---
-quaternion :: proc(real, imag, jmag, kmag: Float) -> Quaternion_Type ---
+quaternion :: proc(imag, jmag, kmag, real: Float) -> Quaternion_Type --- // fields must be named
 real       :: proc(value: Complex_Or_Quaternion) -> Float ---
 imag       :: proc(value: Complex_Or_Quaternion) -> Float ---
 jmag       :: proc(value: Quaternion) -> Float ---

+ 1 - 1
core/bytes/bytes.odin

@@ -895,7 +895,7 @@ split_multi_iterator :: proc(s: ^[]byte, substrs: [][]byte, skip_empty := false)
 
 
 
-// scrub scruvs invalid utf-8 characters and replaces them with the replacement string
+// Scrubs invalid utf-8 characters and replaces them with the replacement string
 // Adjacent invalid bytes are only replaced once
 scrub :: proc(s: []byte, replacement: []byte, allocator := context.allocator) -> []byte {
 	str := s

+ 101 - 0
core/c/libc/stdio.odin

@@ -1,5 +1,7 @@
 package libc
 
+import "core:io"
+
 when ODIN_OS == .Windows {
 	foreign import libc {
 		"system:libucrt.lib",
@@ -218,3 +220,102 @@ foreign libc {
 	ferror    :: proc(stream: ^FILE) -> int ---
 	perror    :: proc(s: cstring) ---
 }
+
+to_stream :: proc(file: ^FILE) -> io.Stream {
+	stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
+		unknown_or_eof :: proc(f: ^FILE) -> io.Error {
+			switch {
+			case ferror(f) != 0:
+				return .Unknown
+			case feof(f) != 0:
+				return .EOF
+			case:
+				return nil
+			}
+		}
+
+		file := (^FILE)(stream_data)
+		switch mode {
+		case .Close:
+			if fclose(file) != 0 {
+				return 0, unknown_or_eof(file)
+			}
+
+		case .Flush:
+			if fflush(file) != 0 {
+				return 0, unknown_or_eof(file)
+			}
+
+		case .Read:
+			n = i64(fread(raw_data(p), size_of(byte), len(p), file))
+			if n == 0 { err = unknown_or_eof(file) }
+
+		case .Read_At:
+			curr := ftell(file)
+			if curr == -1 {
+				return 0, unknown_or_eof(file)
+			}
+
+			if fseek(file, long(offset), SEEK_SET) != 0 {
+				return 0, unknown_or_eof(file)
+			}
+
+			defer fseek(file, long(curr), SEEK_SET)
+
+			n = i64(fread(raw_data(p), size_of(byte), len(p), file))
+			if n == 0 { err = unknown_or_eof(file) }
+		
+		case .Write:
+			n = i64(fwrite(raw_data(p), size_of(byte), len(p), file))
+			if n == 0 { err = unknown_or_eof(file) }
+
+		case .Write_At:
+			curr := ftell(file)
+			if curr == -1 {
+				return 0, unknown_or_eof(file)
+			}
+
+			if fseek(file, long(offset), SEEK_SET) != 0 {
+				return 0, unknown_or_eof(file)
+			}
+
+			defer fseek(file, long(curr), SEEK_SET)
+
+			n = i64(fwrite(raw_data(p), size_of(byte), len(p), file))
+			if n == 0 { err = unknown_or_eof(file) }
+
+		case .Seek:
+			if fseek(file, long(offset), int(whence)) != 0 {
+				return 0, unknown_or_eof(file)
+			}
+		
+		case .Size:
+			curr := ftell(file)
+			if curr == -1 {
+				return 0, unknown_or_eof(file)
+			}
+			defer fseek(file, curr, SEEK_SET)
+
+			if fseek(file, 0, SEEK_END) != 0 {
+				return 0, unknown_or_eof(file)
+			}
+
+			n = i64(ftell(file))
+			if n == -1 {
+				return 0, unknown_or_eof(file)
+			}
+
+		case .Destroy:
+			return 0, .Empty
+		
+		case .Query:
+			return io.query_utility({ .Close, .Flush, .Read, .Read_At, .Write, .Write_At, .Seek, .Size })
+		}
+		return
+	}
+
+	return {
+		data      = file,
+		procedure = stream_proc,
+	}
+}

+ 31 - 41
core/compress/common.odin

@@ -20,10 +20,9 @@ import "core:runtime"
 
 */
 
-/*
-	When a decompression routine doesn't stream its output, but writes to a buffer,
-	we pre-allocate an output buffer to speed up decompression. The default is 1 MiB.
-*/
+
+// When a decompression routine doesn't stream its output, but writes to a buffer,
+// we pre-allocate an output buffer to speed up decompression. The default is 1 MiB.
 COMPRESS_OUTPUT_ALLOCATE_MIN :: int(#config(COMPRESS_OUTPUT_ALLOCATE_MIN, 1 << 20))
 
 /*
@@ -34,16 +33,14 @@ COMPRESS_OUTPUT_ALLOCATE_MIN :: int(#config(COMPRESS_OUTPUT_ALLOCATE_MIN, 1 << 2
 
 */
 when size_of(uintptr) == 8 {
-	/*
-		For 64-bit platforms, we set the default max buffer size to 4 GiB,
-		which is GZIP and PKZIP's max payload size.
-	*/	
+
+        // For 64-bit platforms, we set the default max buffer size to 4 GiB,
+        // which is GZIP and PKZIP's max payload size.
 	COMPRESS_OUTPUT_ALLOCATE_MAX :: int(#config(COMPRESS_OUTPUT_ALLOCATE_MAX, 1 << 32))
 } else {
-	/*
-		For 32-bit platforms, we set the default max buffer size to 512 MiB.
-	*/
-	COMPRESS_OUTPUT_ALLOCATE_MAX :: int(#config(COMPRESS_OUTPUT_ALLOCATE_MAX, 1 << 29))
+	
+	// For 32-bit platforms, we set the default max buffer size to 512 MiB.
+        COMPRESS_OUTPUT_ALLOCATE_MAX :: int(#config(COMPRESS_OUTPUT_ALLOCATE_MAX, 1 << 29))
 }
 
 
@@ -69,9 +66,8 @@ General_Error :: enum {
 	Incompatible_Options,
 	Unimplemented,
 
-	/*
-		Memory errors
-	*/
+	// Memory errors
+
 	Allocation_Failed,
 	Resize_Failed,
 }
@@ -86,17 +82,16 @@ GZIP_Error :: enum {
 	Payload_Length_Invalid,
 	Payload_CRC_Invalid,
 
-	/*
-		GZIP's payload can be a maximum of max(u32le), or 4 GiB.
-		If you tell it you expect it to contain more, that's obviously an error.
-	*/
+	// GZIP's payload can be a maximum of max(u32le), or 4 GiB.
+	// If you tell it you expect it to contain more, that's obviously an error.
+
 	Payload_Size_Exceeds_Max_Payload,
-	/*
-		For buffered instead of streamed output, the payload size can't exceed
-		the max set by the `COMPRESS_OUTPUT_ALLOCATE_MAX` switch in compress/common.odin.
 
-		You can tweak this setting using `-define:COMPRESS_OUTPUT_ALLOCATE_MAX=size_in_bytes`
-	*/
+	// For buffered instead of streamed output, the payload size can't exceed
+	// the max set by the `COMPRESS_OUTPUT_ALLOCATE_MAX` switch in compress/common.odin.
+	//
+	// You can tweak this setting using `-define:COMPRESS_OUTPUT_ALLOCATE_MAX=size_in_bytes`
+
 	Output_Exceeds_COMPRESS_OUTPUT_ALLOCATE_MAX,
 
 }
@@ -137,9 +132,8 @@ Context_Memory_Input :: struct #packed {
 	code_buffer:       u64,
 	num_bits:          u64,
 
-	/*
-		If we know the data size, we can optimize the reads and writes.
-	*/
+	// If we know the data size, we can optimize the reads and writes.
+
 	size_packed:       i64,
 	size_unpacked:     i64,
 }
@@ -159,18 +153,16 @@ Context_Stream_Input :: struct #packed {
 	code_buffer:       u64,
 	num_bits:          u64,
 
-	/*
-		If we know the data size, we can optimize the reads and writes.
-	*/
+	// If we know the data size, we can optimize the reads and writes.
+
 	size_packed:       i64,
 	size_unpacked:     i64,
 
-	/*
-		Flags:
-			`input_fully_in_memory`
-				true  = This tells us we read input from `input_data` exclusively. [] = EOF.
-				false = Try to refill `input_data` from the `input` stream.
-	*/
+	// Flags:
+	// `input_fully_in_memory`
+	//   true  = This tells us we read input from `input_data` exclusively. [] = EOF.
+	//   false = Try to refill `input_data` from the `input` stream.
+
 	input_fully_in_memory: b8,
 
 	padding: [1]u8,
@@ -214,7 +206,7 @@ read_slice_from_memory :: #force_inline proc(z: ^Context_Memory_Input, size: int
 @(optimization_mode="speed")
 read_slice_from_stream :: #force_inline proc(z: ^Context_Stream_Input, size: int) -> (res: []u8, err: io.Error) {
 	// TODO: REMOVE ALL USE OF context.temp_allocator here
-	// the is literally no need for it
+	// there is literally no need for it
 	b := make([]u8, size, context.temp_allocator)
 	_ = io.read(z.input, b[:]) or_return
 	return b, nil
@@ -248,10 +240,8 @@ read_u8_from_stream :: #force_inline proc(z: ^Context_Stream_Input) -> (res: u8,
 
 read_u8 :: proc{read_u8_from_memory, read_u8_from_stream}
 
-/*
-	You would typically only use this at the end of Inflate, to drain bits from the code buffer
-	preferentially.
-*/
+// You would typically only use this at the end of Inflate, to drain bits from the code buffer
+// preferentially.
 @(optimization_mode="speed")
 read_u8_prefer_code_buffer_lsb :: #force_inline proc(z: ^$C) -> (res: u8, err: io.Error) {
 	if z.num_bits >= 8 {

+ 15 - 0
core/container/priority_queue/priority_queue.odin

@@ -140,3 +140,18 @@ remove :: proc(pq: ^$Q/Priority_Queue($T), i: int) -> (value: T, ok: bool) {
 	return
 }
 
+peek_safe :: proc(pq: $Q/Priority_Queue($T), loc := #caller_location) -> (res: T, ok: bool) {
+	if builtin.len(pq.queue) > 0 {
+		return pq.queue[0], true
+	}
+	return
+}
+
+peek :: proc(pq: $Q/Priority_Queue($T), loc := #caller_location) -> (res: T) {
+	assert(condition=builtin.len(pq.queue)>0, loc=loc)
+
+	if builtin.len(pq.queue) > 0 {
+		return pq.queue[0]
+	}
+	return
+}

+ 5 - 1
core/dynlib/doc.odin

@@ -1,7 +1,11 @@
+//+build ignore
 /*
 Package core:dynlib implements loading of shared libraries/DLLs and their symbols.
 
 The behaviour of dynamically loaded libraries is specific to the target platform of the program.
 For in depth detail on the underlying behaviour please refer to your target platform's documentation.
+
+See `example` directory for an example library exporting 3 symbols and a host program loading them automatically
+by defining a symbol table struct.
 */
-package dynlib
+package dynlib

+ 36 - 0
core/dynlib/example/example.odin

@@ -0,0 +1,36 @@
+package example
+
+import "core:dynlib"
+import "core:fmt"
+
+Symbols :: struct {
+	// `foo_` is prefixed, so we look for the symbol `foo_add`.
+	add: proc "c" (int, int) -> int,
+	// We use the tag here to override the symbol to look for, namely `bar_sub`.
+	sub: proc "c" (int, int) -> int `dynlib:"bar_sub"`,
+
+	// Exported global (if exporting an i32, the type must be ^i32 because the symbol is a pointer to the export.)
+	// If it's not a pointer or procedure type, we'll skip the struct field.
+	hellope: ^i32,
+
+	// Handle to free library.
+	// We can have more than one of these so we can match symbols for more than one DLL with one struct.
+	_my_lib_handle: dynlib.Library,
+}
+
+main :: proc() {
+	sym: Symbols
+
+	// Load symbols from `lib.dll` into Symbols struct.
+	// Each struct field is prefixed with `foo_` before lookup in the DLL's symbol table.
+	// The library's Handle (to unload) will be stored in `sym._my_lib_handle`. This way you can load multiple DLLs in one struct.
+	count, ok := dynlib.initialize_symbols(&sym, "lib.dll", "foo_", "_my_lib_handle")
+	defer dynlib.unload_library(sym._my_lib_handle)
+	fmt.printf("ok: %v. %v symbols loaded from lib.dll (%p).\n", ok, count, sym._my_lib_handle)
+
+	if count > 0 {
+		fmt.println("42 + 42 =", sym.add(42, 42))
+		fmt.println("84 - 13 =", sym.sub(84, 13))
+		fmt.println("hellope =", sym.hellope^)
+	}
+}

+ 14 - 0
core/dynlib/example/lib.odin

@@ -0,0 +1,14 @@
+package library
+
+@(export)
+foo_add :: proc "c" (a, b: int) -> (res: int) {
+	return a + b
+}
+
+@(export)
+bar_sub :: proc "c" (a, b: int) -> (res: int) {
+	return a - b
+}
+
+@(export)
+foo_hellope: i32 = 42

+ 99 - 9
core/dynlib/lib.odin

@@ -1,5 +1,12 @@
 package dynlib
 
+import "core:intrinsics"
+import "core:reflect"
+import "core:runtime"
+_ :: intrinsics
+_ :: reflect
+_ :: runtime
+
 /*
 A handle to a dynamically loaded library.
 */
@@ -12,11 +19,11 @@ library available to resolve references in subsequently loaded libraries.
 The paramater `global_symbols` is only used for the platforms `linux`, `darwin`, `freebsd` and `openbsd`.
 On `windows` this paramater is ignored.
 
-The underlying behaviour is platform specific.  
-On `linux`, `darwin`, `freebsd` and `openbsd` refer to `dlopen`.  
+The underlying behaviour is platform specific.
+On `linux`, `darwin`, `freebsd` and `openbsd` refer to `dlopen`.
 On `windows` refer to `LoadLibraryW`.
 
-**Implicit Allocators**  
+**Implicit Allocators**
 `context.temp_allocator`
 
 Example:
@@ -27,6 +34,7 @@ Example:
 		LIBRARY_PATH :: "my_library.dll"
 		library, ok := dynlib.load_library(LIBRARY_PATH)
 		if ! ok {
+			fmt.eprintln(dynlib.last_error())
 			return
 		}
 		fmt.println("The library %q was successfully loaded", LIBRARY_PATH)
@@ -39,8 +47,8 @@ load_library :: proc(path: string, global_symbols := false) -> (library: Library
 /*
 Unloads a dynamic library.
 
-The underlying behaviour is platform specific.  
-On `linux`, `darwin`, `freebsd` and `openbsd` refer to `dlclose`.  
+The underlying behaviour is platform specific.
+On `linux`, `darwin`, `freebsd` and `openbsd` refer to `dlclose`.
 On `windows` refer to `FreeLibrary`.
 
 Example:
@@ -51,10 +59,12 @@ Example:
 		LIBRARY_PATH :: "my_library.dll"
 		library, ok := dynlib.load_library(LIBRARY_PATH)
 		if ! ok {
+			fmt.eprintln(dynlib.last_error())
 			return
 		}
 		did_unload := dynlib.unload_library(library)
 		if ! did_unload {
+			fmt.eprintln(dynlib.last_error())
 			return
 		}
 		fmt.println("The library %q was successfully unloaded", LIBRARY_PATH)
@@ -67,11 +77,11 @@ unload_library :: proc(library: Library) -> (did_unload: bool) {
 /*
 Loads the address of a procedure/variable from a dynamic library.
 
-The underlying behaviour is platform specific.  
-On `linux`, `darwin`, `freebsd` and `openbsd` refer to `dlsym`.  
+The underlying behaviour is platform specific.
+On `linux`, `darwin`, `freebsd` and `openbsd` refer to `dlsym`.
 On `windows` refer to `GetProcAddress`.
 
-**Implicit Allocators**  
+**Implicit Allocators**
 `context.temp_allocator`
 
 Example:
@@ -82,13 +92,93 @@ Example:
 		LIBRARY_PATH :: "my_library.dll"
 		library, ok := dynlib.load_library(LIBRARY_PATH)
 		if ! ok {
+			fmt.eprintln(dynlib.last_error())
 			return
 		}
 
 		a, found_a := dynlib.symbol_address(library, "a")
-		if found_a do fmt.printf("The symbol %q was found at the address %v", "a", a)
+		if found_a {
+			fmt.printf("The symbol %q was found at the address %v", "a", a)
+		} else {
+			fmt.eprintln(dynlib.last_error())
+		}
 	}
 */
 symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found: bool) #optional_ok {
 	return _symbol_address(library, symbol)
 }
+
+/*
+Scans a dynamic library for symbols matching a struct's members, assigning found procedure pointers to the corresponding entry.
+Optionally takes a symbol prefix added to the struct's member name to construct the symbol looked up in the library.
+Optionally also takes the struct member to assign the library handle to, `__handle` by default.
+
+This allows using one struct to hold library handles and symbol pointers for more than 1 dynamic library.
+
+Returns:
+* `-1, false` if the library could not be loaded.
+* The number of symbols assigned on success. `ok` = true if `count` > 0
+
+See doc.odin for an example.
+*/
+initialize_symbols :: proc(symbol_table: ^$T, library_name: string, symbol_prefix := "", handle_field_name := "__handle") -> (count: int, ok: bool) where intrinsics.type_is_struct(T) {
+	assert(symbol_table != nil)
+	handle: Library
+
+	if handle, ok = load_library(library_name); !ok {
+		return -1, false
+	}
+
+	// `symbol_table` must be a struct because of the where clause, so this can't fail.
+	ti := runtime.type_info_base(type_info_of(T))
+	s, _ := ti.variant.(runtime.Type_Info_Struct)
+
+	// Buffer to concatenate the prefix + symbol name.
+	prefixed_symbol_buf: [2048]u8 = ---
+
+	sym_ptr: rawptr
+	for field_name, i in s.names {
+		// Calculate address of struct member
+		field_ptr := rawptr(uintptr(rawptr(symbol_table)) + uintptr(s.offsets[i]))
+
+		// If we've come across the struct member for the handle, store it and continue scanning for other symbols.
+		if field_name == handle_field_name {
+			(^Library)(field_ptr)^ = handle
+			continue
+		}
+
+		// We're not the library handle, so the field needs to be a pointer type, be it a procedure pointer or an exported global.
+		if !(reflect.is_procedure(s.types[i]) || reflect.is_pointer(s.types[i])) {
+			continue
+		}
+
+		// Let's look up or construct the symbol name to find in the library
+		prefixed_name: string
+
+		// Do we have a symbol override tag?
+		if override, tag_ok := reflect.struct_tag_lookup(reflect.Struct_Tag(s.tags[i]), "dynlib"); tag_ok {
+			prefixed_name = string(override)
+		}
+
+		// No valid symbol override tag found, fall back to `<symbol_prefix>name`.
+		if len(prefixed_name) == 0 {
+			offset := copy(prefixed_symbol_buf[:], symbol_prefix)
+			copy(prefixed_symbol_buf[offset:], field_name)
+			prefixed_name = string(prefixed_symbol_buf[:len(symbol_prefix) + len(field_name)])
+		}
+
+		// Assign procedure (or global) pointer if found.
+		if sym_ptr, ok = symbol_address(handle, prefixed_name); ok {
+			(^rawptr)(field_ptr)^ = sym_ptr
+			count += 1
+		}
+	}
+	return count, count > 0
+}
+
+/*
+Returns an error message for the last failed procedure call.
+*/
+last_error :: proc() -> string {
+	return _last_error()
+}

+ 4 - 0
core/dynlib/lib_js.odin

@@ -13,3 +13,7 @@ _unload_library :: proc(library: Library) -> bool {
 _symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found: bool) {
 	return nil, false
 }
+
+_last_error :: proc() -> string {
+	return ""
+}

+ 5 - 0
core/dynlib/lib_unix.odin

@@ -22,3 +22,8 @@ _symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found
 	found = ptr != nil
 	return
 }
+
+_last_error :: proc() -> string {
+	err := os.dlerror()
+	return "unknown" if err == "" else err
+}

+ 7 - 0
core/dynlib/lib_windows.odin

@@ -5,6 +5,7 @@ package dynlib
 import win32 "core:sys/windows"
 import "core:strings"
 import "core:runtime"
+import "core:reflect"
 
 _load_library :: proc(path: string, global_symbols := false) -> (Library, bool) {
 	// NOTE(bill): 'global_symbols' is here only for consistency with POSIX which has RTLD_GLOBAL
@@ -27,3 +28,9 @@ _symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found
 	found = ptr != nil
 	return
 }
+
+_last_error :: proc() -> string {
+	err := win32.System_Error(win32.GetLastError())
+	err_msg := reflect.enum_string(err)
+	return "unknown" if err_msg == "" else err_msg
+}

+ 2 - 6
core/encoding/entity/example/entity_example.odin

@@ -47,8 +47,6 @@ _entities :: proc() {
 }
 
 _main :: proc() {
-	using fmt
-
 	options := xml.Options{ flags = { .Ignore_Unsupported, .Intern_Comments, .Unbox_CDATA, .Decode_SGML_Entities }}
 
 	doc, _ := xml.parse(#load("test.html"), options)
@@ -58,8 +56,6 @@ _main :: proc() {
 }
 
 main :: proc() {
-	using fmt
-
 	track: mem.Tracking_Allocator
 	mem.tracking_allocator_init(&track, context.allocator)
 	context.allocator = mem.tracking_allocator(&track)
@@ -68,9 +64,9 @@ main :: proc() {
 	_entities()
 
 	if len(track.allocation_map) > 0 {
-		println()
+		fmt.println()
 		for _, v in track.allocation_map {
-			printf("%v Leaked %v bytes.\n", v.location, v.size)
+			fmt.printf("%v Leaked %v bytes.\n", v.location, v.size)
 		}
 	}	
 }

+ 2625 - 5027
core/encoding/entity/generated.odin

@@ -5,7 +5,7 @@ package unicode_entity
 */
 
 /*
-	This file is generated from "https://www.w3.org/2003/entities/2007xml/unicode.xml".
+	This file is generated from "https://github.com/w3c/xml-entities/blob/gh-pages/unicode.xml".
 	
 	UPDATE:
 		- Ensure the XML file was downloaded using "tests\core\download_assets.py".
@@ -13,15 +13,21 @@ package unicode_entity
 
 	Odin unicode generated tables: https://github.com/odin-lang/Odin/tree/master/core/encoding/entity
 
-		Copyright © 2021 World Wide Web Consortium, (Massachusetts Institute of Technology,
-		European Research Consortium for Informatics and Mathematics, Keio University, Beihang).
+		Copyright David Carlisle 1999-2023
 
-		All Rights Reserved.
+		Use and distribution of this code are permitted under the terms of the
+		W3C Software Notice and License.
+		http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html
 
-		This work is distributed under the W3C® Software License [1] in the hope that it will be useful,
-		but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
-		[1] http://www.w3.org/Consortium/Legal/copyright-software
+
+		This file is a collection of information about how to map
+		Unicode entities to LaTeX, and various SGML/XML entity
+		sets (ISO and MathML/HTML). A Unicode character may be mapped
+		to several entities.
+
+		Originally designed by Sebastian Rahtz in conjunction with
+		Barbara Beeton for the STIX project
 
 	See also: LICENSE_table.md
 */
@@ -55,7433 +61,5025 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: rune, ok: bool) {
 
 	case 'A':
 		switch name {
-			case "AElig": 
-				// LATIN CAPITAL LETTER AE
+			case "AElig":                           // LATIN CAPITAL LETTER AE
 				return rune(0xc6), true
-			case "AMP": 
-				// AMPERSAND
+			case "AMP":                             // AMPERSAND
 				return rune(0x26), true
-			case "Aacgr": 
-				// GREEK CAPITAL LETTER ALPHA WITH TONOS
+			case "Aacgr":                           // GREEK CAPITAL LETTER ALPHA WITH TONOS
 				return rune(0x0386), true
-			case "Aacute": 
-				// LATIN CAPITAL LETTER A WITH ACUTE
+			case "Aacute":                          // LATIN CAPITAL LETTER A WITH ACUTE
 				return rune(0xc1), true
-			case "Abreve": 
-				// LATIN CAPITAL LETTER A WITH BREVE
+			case "Abreve":                          // LATIN CAPITAL LETTER A WITH BREVE
 				return rune(0x0102), true
-			case "Acirc": 
-				// LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+			case "Acirc":                           // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
 				return rune(0xc2), true
-			case "Acy": 
-				// CYRILLIC CAPITAL LETTER A
+			case "Acy":                             // CYRILLIC CAPITAL LETTER A
 				return rune(0x0410), true
-			case "Afr": 
-				// MATHEMATICAL FRAKTUR CAPITAL A
+			case "Afr":                             // MATHEMATICAL FRAKTUR CAPITAL A
 				return rune(0x01d504), true
-			case "Agrave": 
-				// LATIN CAPITAL LETTER A WITH GRAVE
-				return rune(0xc0), true
-			case "Agr": 
-				// GREEK CAPITAL LETTER ALPHA
+			case "Agr":                             // GREEK CAPITAL LETTER ALPHA
 				return rune(0x0391), true
-			case "Alpha": 
-				// GREEK CAPITAL LETTER ALPHA
+			case "Agrave":                          // LATIN CAPITAL LETTER A WITH GRAVE
+				return rune(0xc0), true
+			case "Alpha":                           // GREEK CAPITAL LETTER ALPHA
 				return rune(0x0391), true
-			case "Amacr": 
-				// LATIN CAPITAL LETTER A WITH MACRON
+			case "Amacr":                           // LATIN CAPITAL LETTER A WITH MACRON
 				return rune(0x0100), true
-			case "And": 
-				// DOUBLE LOGICAL AND
+			case "And":                             // DOUBLE LOGICAL AND
 				return rune(0x2a53), true
-			case "Aogon": 
-				// LATIN CAPITAL LETTER A WITH OGONEK
+			case "Aogon":                           // LATIN CAPITAL LETTER A WITH OGONEK
 				return rune(0x0104), true
-			case "Aopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+			case "Aopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL A
 				return rune(0x01d538), true
-			case "ApplyFunction": 
-				// FUNCTION APPLICATION
+			case "ApplyFunction":                   // FUNCTION APPLICATION
 				return rune(0x2061), true
-			case "Aring": 
-				// LATIN CAPITAL LETTER A WITH RING ABOVE
+			case "Aring":                           // LATIN CAPITAL LETTER A WITH RING ABOVE
 				return rune(0xc5), true
-			case "Ascr": 
-				// MATHEMATICAL SCRIPT CAPITAL A
+			case "Ascr":                            // MATHEMATICAL SCRIPT CAPITAL A
 				return rune(0x01d49c), true
-			case "Assign": 
-				// COLON EQUALS
+			case "Assign":                          // COLON EQUALS
 				return rune(0x2254), true
-			case "Ast": 
-				// TWO ASTERISKS ALIGNED VERTICALLY
+			case "Ast":                             // TWO ASTERISKS ALIGNED VERTICALLY
 				return rune(0x2051), true
-			case "Atilde": 
-				// LATIN CAPITAL LETTER A WITH TILDE
+			case "Atilde":                          // LATIN CAPITAL LETTER A WITH TILDE
 				return rune(0xc3), true
-			case "Auml": 
-				// LATIN CAPITAL LETTER A WITH DIAERESIS
+			case "Auml":                            // LATIN CAPITAL LETTER A WITH DIAERESIS
 				return rune(0xc4), true
 		}
 
 	case 'B':
 		switch name {
-			case "Backslash": 
-				// SET MINUS
+			case "Backslash":                       // SET MINUS
 				return rune(0x2216), true
-			case "Barint": 
-				// INTEGRAL WITH DOUBLE STROKE
+			case "Barint":                          // INTEGRAL WITH DOUBLE STROKE
 				return rune(0x2a0e), true
-			case "Barv": 
-				// SHORT DOWN TACK WITH OVERBAR
+			case "Barv":                            // SHORT DOWN TACK WITH OVERBAR
 				return rune(0x2ae7), true
-			case "Barwedl": 
-				// LOGICAL AND WITH DOUBLE OVERBAR
-				return rune(0x2a5e), true
-			case "Barwed": 
-				// PERSPECTIVE
+			case "Barwed":                          // PERSPECTIVE
 				return rune(0x2306), true
-			case "Bcy": 
-				// CYRILLIC CAPITAL LETTER BE
+			case "Barwedl":                         // LOGICAL AND WITH DOUBLE OVERBAR
+				return rune(0x2a5e), true
+			case "Bcy":                             // CYRILLIC CAPITAL LETTER BE
 				return rune(0x0411), true
-			case "Because": 
-				// BECAUSE
+			case "Because":                         // BECAUSE
 				return rune(0x2235), true
-			case "Bernoullis": 
-				// SCRIPT CAPITAL B
+			case "Bernoullis":                      // SCRIPT CAPITAL B
 				return rune(0x212c), true
-			case "Beta": 
-				// GREEK CAPITAL LETTER BETA
+			case "Beta":                            // GREEK CAPITAL LETTER BETA
 				return rune(0x0392), true
-			case "Bfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL B
+			case "Bfr":                             // MATHEMATICAL FRAKTUR CAPITAL B
 				return rune(0x01d505), true
-			case "Bgr": 
-				// GREEK CAPITAL LETTER BETA
+			case "Bgr":                             // GREEK CAPITAL LETTER BETA
 				return rune(0x0392), true
-			case "Bopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+			case "Bopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL B
 				return rune(0x01d539), true
-			case "Breve": 
-				// BREVE
+			case "Breve":                           // BREVE
 				return rune(0x02d8), true
-			case "Bscr": 
-				// SCRIPT CAPITAL B
+			case "Bscr":                            // SCRIPT CAPITAL B
 				return rune(0x212c), true
-			case "Bumpeq": 
-				// GEOMETRICALLY EQUIVALENT TO
+			case "Bumpeq":                          // GEOMETRICALLY EQUIVALENT TO
 				return rune(0x224e), true
-			case "Bvert": 
-				// BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+			case "Bvert":                           // BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
 				return rune(0x2506), true
 		}
 
 	case 'C':
 		switch name {
-			case "CHcy": 
-				// CYRILLIC CAPITAL LETTER CHE
+			case "CHcy":                            // CYRILLIC CAPITAL LETTER CHE
 				return rune(0x0427), true
-			case "COPY": 
-				// COPYRIGHT SIGN
+			case "COPY":                            // COPYRIGHT SIGN
 				return rune(0xa9), true
-			case "Cacute": 
-				// LATIN CAPITAL LETTER C WITH ACUTE
+			case "Cacute":                          // LATIN CAPITAL LETTER C WITH ACUTE
 				return rune(0x0106), true
-			case "CapitalDifferentialD": 
-				// DOUBLE-STRUCK ITALIC CAPITAL D
-				return rune(0x2145), true
-			case "Cap": 
-				// DOUBLE INTERSECTION
+			case "Cap":                             // DOUBLE INTERSECTION
 				return rune(0x22d2), true
-			case "Cayleys": 
-				// BLACK-LETTER CAPITAL C
+			case "CapitalDifferentialD":            // DOUBLE-STRUCK ITALIC CAPITAL D
+				return rune(0x2145), true
+			case "Cayleys":                         // BLACK-LETTER CAPITAL C
 				return rune(0x212d), true
-			case "Ccaron": 
-				// LATIN CAPITAL LETTER C WITH CARON
+			case "Ccaron":                          // LATIN CAPITAL LETTER C WITH CARON
 				return rune(0x010c), true
-			case "Ccedil": 
-				// LATIN CAPITAL LETTER C WITH CEDILLA
+			case "Ccedil":                          // LATIN CAPITAL LETTER C WITH CEDILLA
 				return rune(0xc7), true
-			case "Ccirc": 
-				// LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+			case "Ccirc":                           // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
 				return rune(0x0108), true
-			case "Cconint": 
-				// VOLUME INTEGRAL
+			case "Cconint":                         // VOLUME INTEGRAL
 				return rune(0x2230), true
-			case "Cdot": 
-				// LATIN CAPITAL LETTER C WITH DOT ABOVE
+			case "Cdot":                            // LATIN CAPITAL LETTER C WITH DOT ABOVE
 				return rune(0x010a), true
-			case "Cedilla": 
-				// CEDILLA
+			case "Cedilla":                         // CEDILLA
 				return rune(0xb8), true
-			case "CenterDot": 
-				// MIDDLE DOT
+			case "CenterDot":                       // MIDDLE DOT
 				return rune(0xb7), true
-			case "Cfr": 
-				// BLACK-LETTER CAPITAL C
+			case "Cfr":                             // BLACK-LETTER CAPITAL C
 				return rune(0x212d), true
-			case "Chi": 
-				// GREEK CAPITAL LETTER CHI
+			case "Chi":                             // GREEK CAPITAL LETTER CHI
 				return rune(0x03a7), true
-			case "CircleDot": 
-				// CIRCLED DOT OPERATOR
+			case "CircleDot":                       // CIRCLED DOT OPERATOR
 				return rune(0x2299), true
-			case "CircleMinus": 
-				// CIRCLED MINUS
+			case "CircleMinus":                     // CIRCLED MINUS
 				return rune(0x2296), true
-			case "CirclePlus": 
-				// CIRCLED PLUS
+			case "CirclePlus":                      // CIRCLED PLUS
 				return rune(0x2295), true
-			case "CircleTimes": 
-				// CIRCLED TIMES
+			case "CircleTimes":                     // CIRCLED TIMES
 				return rune(0x2297), true
-			case "ClockwiseContourIntegral": 
-				// CLOCKWISE CONTOUR INTEGRAL
+			case "ClockwiseContourIntegral":        // CLOCKWISE CONTOUR INTEGRAL
 				return rune(0x2232), true
-			case "CloseCurlyDoubleQuote": 
-				// RIGHT DOUBLE QUOTATION MARK
+			case "CloseCurlyDoubleQuote":           // RIGHT DOUBLE QUOTATION MARK
 				return rune(0x201d), true
-			case "CloseCurlyQuote": 
-				// RIGHT SINGLE QUOTATION MARK
+			case "CloseCurlyQuote":                 // RIGHT SINGLE QUOTATION MARK
 				return rune(0x2019), true
-			case "Colon": 
-				// PROPORTION
+			case "Colon":                           // PROPORTION
 				return rune(0x2237), true
-			case "Colone": 
-				// DOUBLE COLON EQUAL
+			case "Colone":                          // DOUBLE COLON EQUAL
 				return rune(0x2a74), true
-			case "Congruent": 
-				// IDENTICAL TO
+			case "Congruent":                       // IDENTICAL TO
 				return rune(0x2261), true
-			case "Conint": 
-				// SURFACE INTEGRAL
+			case "Conint":                          // SURFACE INTEGRAL
 				return rune(0x222f), true
-			case "ContourIntegral": 
-				// CONTOUR INTEGRAL
+			case "ContourIntegral":                 // CONTOUR INTEGRAL
 				return rune(0x222e), true
-			case "Copf": 
-				// DOUBLE-STRUCK CAPITAL C
+			case "Copf":                            // DOUBLE-STRUCK CAPITAL C
 				return rune(0x2102), true
-			case "Coproduct": 
-				// N-ARY COPRODUCT
+			case "Coproduct":                       // N-ARY COPRODUCT
 				return rune(0x2210), true
-			case "CounterClockwiseContourIntegral": 
-				// ANTICLOCKWISE CONTOUR INTEGRAL
+			case "CounterClockwiseContourIntegral": // ANTICLOCKWISE CONTOUR INTEGRAL
 				return rune(0x2233), true
-			case "Cross": 
-				// VECTOR OR CROSS PRODUCT
+			case "Cross":                           // VECTOR OR CROSS PRODUCT
 				return rune(0x2a2f), true
-			case "Cscr": 
-				// MATHEMATICAL SCRIPT CAPITAL C
+			case "Cscr":                            // MATHEMATICAL SCRIPT CAPITAL C
 				return rune(0x01d49e), true
-			case "CupCap": 
-				// EQUIVALENT TO
-				return rune(0x224d), true
-			case "Cup": 
-				// DOUBLE UNION
+			case "Cup":                             // DOUBLE UNION
 				return rune(0x22d3), true
+			case "CupCap":                          // EQUIVALENT TO
+				return rune(0x224d), true
 		}
 
 	case 'D':
 		switch name {
-			case "DD": 
-				// DOUBLE-STRUCK ITALIC CAPITAL D
+			case "DD":                              // DOUBLE-STRUCK ITALIC CAPITAL D
 				return rune(0x2145), true
-			case "DDotrahd": 
-				// RIGHTWARDS ARROW WITH DOTTED STEM
+			case "DDotrahd":                        // RIGHTWARDS ARROW WITH DOTTED STEM
 				return rune(0x2911), true
-			case "DJcy": 
-				// CYRILLIC CAPITAL LETTER DJE
+			case "DJcy":                            // CYRILLIC CAPITAL LETTER DJE
 				return rune(0x0402), true
-			case "DScy": 
-				// CYRILLIC CAPITAL LETTER DZE
+			case "DScy":                            // CYRILLIC CAPITAL LETTER DZE
 				return rune(0x0405), true
-			case "DZcy": 
-				// CYRILLIC CAPITAL LETTER DZHE
+			case "DZcy":                            // CYRILLIC CAPITAL LETTER DZHE
 				return rune(0x040f), true
-			case "Dagger": 
-				// DOUBLE DAGGER
+			case "Dagger":                          // DOUBLE DAGGER
 				return rune(0x2021), true
-			case "Darr": 
-				// DOWNWARDS TWO HEADED ARROW
+			case "Darr":                            // DOWNWARDS TWO HEADED ARROW
 				return rune(0x21a1), true
-			case "Dashv": 
-				// VERTICAL BAR DOUBLE LEFT TURNSTILE
+			case "Dashv":                           // VERTICAL BAR DOUBLE LEFT TURNSTILE
 				return rune(0x2ae4), true
-			case "Dcaron": 
-				// LATIN CAPITAL LETTER D WITH CARON
+			case "Dcaron":                          // LATIN CAPITAL LETTER D WITH CARON
 				return rune(0x010e), true
-			case "Dcy": 
-				// CYRILLIC CAPITAL LETTER DE
+			case "Dcy":                             // CYRILLIC CAPITAL LETTER DE
 				return rune(0x0414), true
-			case "Del": 
-				// NABLA
+			case "Del":                             // NABLA
 				return rune(0x2207), true
-			case "Delta": 
-				// GREEK CAPITAL LETTER DELTA
+			case "Delta":                           // GREEK CAPITAL LETTER DELTA
 				return rune(0x0394), true
-			case "Dfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL D
+			case "Dfr":                             // MATHEMATICAL FRAKTUR CAPITAL D
 				return rune(0x01d507), true
-			case "Dgr": 
-				// GREEK CAPITAL LETTER DELTA
+			case "Dgr":                             // GREEK CAPITAL LETTER DELTA
 				return rune(0x0394), true
-			case "DiacriticalAcute": 
-				// ACUTE ACCENT
+			case "DiacriticalAcute":                // ACUTE ACCENT
 				return rune(0xb4), true
-			case "DiacriticalDot": 
-				// DOT ABOVE
+			case "DiacriticalDot":                  // DOT ABOVE
 				return rune(0x02d9), true
-			case "DiacriticalDoubleAcute": 
-				// DOUBLE ACUTE ACCENT
+			case "DiacriticalDoubleAcute":          // DOUBLE ACUTE ACCENT
 				return rune(0x02dd), true
-			case "DiacriticalGrave": 
-				// GRAVE ACCENT
+			case "DiacriticalGrave":                // GRAVE ACCENT
 				return rune(0x60), true
-			case "DiacriticalTilde": 
-				// SMALL TILDE
+			case "DiacriticalTilde":                // SMALL TILDE
 				return rune(0x02dc), true
-			case "Diamond": 
-				// DIAMOND OPERATOR
+			case "Diamond":                         // DIAMOND OPERATOR
 				return rune(0x22c4), true
-			case "DifferentialD": 
-				// DOUBLE-STRUCK ITALIC SMALL D
+			case "DifferentialD":                   // DOUBLE-STRUCK ITALIC SMALL D
 				return rune(0x2146), true
-			case "Dopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+			case "Dopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL D
 				return rune(0x01d53b), true
-			case "Dot": 
-				// DIAERESIS
+			case "Dot":                             // DIAERESIS
 				return rune(0xa8), true
-			case "DotDot": 
-				// COMBINING FOUR DOTS ABOVE
+			case "DotDot":                          // COMBINING FOUR DOTS ABOVE
 				return rune(0x20dc), true
-			case "DotEqual": 
-				// APPROACHES THE LIMIT
+			case "DotEqual":                        // APPROACHES THE LIMIT
 				return rune(0x2250), true
-			case "DoubleContourIntegral": 
-				// SURFACE INTEGRAL
+			case "DoubleContourIntegral":           // SURFACE INTEGRAL
 				return rune(0x222f), true
-			case "DoubleDot": 
-				// DIAERESIS
+			case "DoubleDot":                       // DIAERESIS
 				return rune(0xa8), true
-			case "DoubleDownArrow": 
-				// DOWNWARDS DOUBLE ARROW
+			case "DoubleDownArrow":                 // DOWNWARDS DOUBLE ARROW
 				return rune(0x21d3), true
-			case "DoubleLeftArrow": 
-				// LEFTWARDS DOUBLE ARROW
+			case "DoubleLeftArrow":                 // LEFTWARDS DOUBLE ARROW
 				return rune(0x21d0), true
-			case "DoubleLeftRightArrow": 
-				// LEFT RIGHT DOUBLE ARROW
+			case "DoubleLeftRightArrow":            // LEFT RIGHT DOUBLE ARROW
 				return rune(0x21d4), true
-			case "DoubleLeftTee": 
-				// VERTICAL BAR DOUBLE LEFT TURNSTILE
+			case "DoubleLeftTee":                   // VERTICAL BAR DOUBLE LEFT TURNSTILE
 				return rune(0x2ae4), true
-			case "DoubleLongLeftArrow": 
-				// LONG LEFTWARDS DOUBLE ARROW
+			case "DoubleLongLeftArrow":             // LONG LEFTWARDS DOUBLE ARROW
 				return rune(0x27f8), true
-			case "DoubleLongLeftRightArrow": 
-				// LONG LEFT RIGHT DOUBLE ARROW
+			case "DoubleLongLeftRightArrow":        // LONG LEFT RIGHT DOUBLE ARROW
 				return rune(0x27fa), true
-			case "DoubleLongRightArrow": 
-				// LONG RIGHTWARDS DOUBLE ARROW
+			case "DoubleLongRightArrow":            // LONG RIGHTWARDS DOUBLE ARROW
 				return rune(0x27f9), true
-			case "DoubleRightArrow": 
-				// RIGHTWARDS DOUBLE ARROW
+			case "DoubleRightArrow":                // RIGHTWARDS DOUBLE ARROW
 				return rune(0x21d2), true
-			case "DoubleRightTee": 
-				// TRUE
+			case "DoubleRightTee":                  // TRUE
 				return rune(0x22a8), true
-			case "DoubleUpArrow": 
-				// UPWARDS DOUBLE ARROW
+			case "DoubleUpArrow":                   // UPWARDS DOUBLE ARROW
 				return rune(0x21d1), true
-			case "DoubleUpDownArrow": 
-				// UP DOWN DOUBLE ARROW
+			case "DoubleUpDownArrow":               // UP DOWN DOUBLE ARROW
 				return rune(0x21d5), true
-			case "DoubleVerticalBar": 
-				// PARALLEL TO
+			case "DoubleVerticalBar":               // PARALLEL TO
 				return rune(0x2225), true
-			case "DownArrowUpArrow": 
-				// DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
-				return rune(0x21f5), true
-			case "DownArrow": 
-				// DOWNWARDS ARROW
+			case "DownArrow":                       // DOWNWARDS ARROW
 				return rune(0x2193), true
-			case "DownArrowBar": 
-				// DOWNWARDS ARROW TO BAR
+			case "DownArrowBar":                    // DOWNWARDS ARROW TO BAR
 				return rune(0x2913), true
-			case "DownBreve": 
-				// COMBINING INVERTED BREVE
+			case "DownArrowUpArrow":                // DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+				return rune(0x21f5), true
+			case "DownBreve":                       // COMBINING INVERTED BREVE
 				return rune(0x0311), true
-			case "DownLeftRightVector": 
-				// LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+			case "DownLeftRightVector":             // LEFT BARB DOWN RIGHT BARB DOWN HARPOON
 				return rune(0x2950), true
-			case "DownLeftTeeVector": 
-				// LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+			case "DownLeftTeeVector":               // LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
 				return rune(0x295e), true
-			case "DownLeftVector": 
-				// LEFTWARDS HARPOON WITH BARB DOWNWARDS
+			case "DownLeftVector":                  // LEFTWARDS HARPOON WITH BARB DOWNWARDS
 				return rune(0x21bd), true
-			case "DownLeftVectorBar": 
-				// LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+			case "DownLeftVectorBar":               // LEFTWARDS HARPOON WITH BARB DOWN TO BAR
 				return rune(0x2956), true
-			case "DownRightTeeVector": 
-				// RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+			case "DownRightTeeVector":              // RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
 				return rune(0x295f), true
-			case "DownRightVector": 
-				// RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+			case "DownRightVector":                 // RIGHTWARDS HARPOON WITH BARB DOWNWARDS
 				return rune(0x21c1), true
-			case "DownRightVectorBar": 
-				// RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+			case "DownRightVectorBar":              // RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
 				return rune(0x2957), true
-			case "DownTeeArrow": 
-				// DOWNWARDS ARROW FROM BAR
-				return rune(0x21a7), true
-			case "DownTee": 
-				// DOWN TACK
+			case "DownTee":                         // DOWN TACK
 				return rune(0x22a4), true
-			case "Downarrow": 
-				// DOWNWARDS DOUBLE ARROW
+			case "DownTeeArrow":                    // DOWNWARDS ARROW FROM BAR
+				return rune(0x21a7), true
+			case "Downarrow":                       // DOWNWARDS DOUBLE ARROW
 				return rune(0x21d3), true
-			case "Dscr": 
-				// MATHEMATICAL SCRIPT CAPITAL D
+			case "Dscr":                            // MATHEMATICAL SCRIPT CAPITAL D
 				return rune(0x01d49f), true
-			case "Dstrok": 
-				// LATIN CAPITAL LETTER D WITH STROKE
+			case "Dstrok":                          // LATIN CAPITAL LETTER D WITH STROKE
 				return rune(0x0110), true
 		}
 
 	case 'E':
 		switch name {
-			case "EEacgr": 
-				// GREEK CAPITAL LETTER ETA WITH TONOS
+			case "EEacgr":                          // GREEK CAPITAL LETTER ETA WITH TONOS
 				return rune(0x0389), true
-			case "EEgr": 
-				// GREEK CAPITAL LETTER ETA
+			case "EEgr":                            // GREEK CAPITAL LETTER ETA
 				return rune(0x0397), true
-			case "ENG": 
-				// LATIN CAPITAL LETTER ENG
+			case "ENG":                             // LATIN CAPITAL LETTER ENG
 				return rune(0x014a), true
-			case "ETH": 
-				// LATIN CAPITAL LETTER ETH
+			case "ETH":                             // LATIN CAPITAL LETTER ETH
 				return rune(0xd0), true
-			case "Eacgr": 
-				// GREEK CAPITAL LETTER EPSILON WITH TONOS
+			case "Eacgr":                           // GREEK CAPITAL LETTER EPSILON WITH TONOS
 				return rune(0x0388), true
-			case "Eacute": 
-				// LATIN CAPITAL LETTER E WITH ACUTE
+			case "Eacute":                          // LATIN CAPITAL LETTER E WITH ACUTE
 				return rune(0xc9), true
-			case "Ecaron": 
-				// LATIN CAPITAL LETTER E WITH CARON
+			case "Ecaron":                          // LATIN CAPITAL LETTER E WITH CARON
 				return rune(0x011a), true
-			case "Ecirc": 
-				// LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+			case "Ecirc":                           // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
 				return rune(0xca), true
-			case "Ecy": 
-				// CYRILLIC CAPITAL LETTER E
+			case "Ecy":                             // CYRILLIC CAPITAL LETTER E
 				return rune(0x042d), true
-			case "Edot": 
-				// LATIN CAPITAL LETTER E WITH DOT ABOVE
+			case "Edot":                            // LATIN CAPITAL LETTER E WITH DOT ABOVE
 				return rune(0x0116), true
-			case "Efr": 
-				// MATHEMATICAL FRAKTUR CAPITAL E
+			case "Efr":                             // MATHEMATICAL FRAKTUR CAPITAL E
 				return rune(0x01d508), true
-			case "Egrave": 
-				// LATIN CAPITAL LETTER E WITH GRAVE
-				return rune(0xc8), true
-			case "Egr": 
-				// GREEK CAPITAL LETTER EPSILON
+			case "Egr":                             // GREEK CAPITAL LETTER EPSILON
 				return rune(0x0395), true
-			case "Element": 
-				// ELEMENT OF
+			case "Egrave":                          // LATIN CAPITAL LETTER E WITH GRAVE
+				return rune(0xc8), true
+			case "Element":                         // ELEMENT OF
 				return rune(0x2208), true
-			case "Emacr": 
-				// LATIN CAPITAL LETTER E WITH MACRON
+			case "Emacr":                           // LATIN CAPITAL LETTER E WITH MACRON
 				return rune(0x0112), true
-			case "EmptySmallSquare": 
-				// WHITE MEDIUM SQUARE
+			case "EmptySmallSquare":                // WHITE MEDIUM SQUARE
 				return rune(0x25fb), true
-			case "EmptyVerySmallSquare": 
-				// WHITE SMALL SQUARE
+			case "EmptyVerySmallSquare":            // WHITE SMALL SQUARE
 				return rune(0x25ab), true
-			case "Eogon": 
-				// LATIN CAPITAL LETTER E WITH OGONEK
+			case "Eogon":                           // LATIN CAPITAL LETTER E WITH OGONEK
 				return rune(0x0118), true
-			case "Eopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+			case "Eopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL E
 				return rune(0x01d53c), true
-			case "Epsilon": 
-				// GREEK CAPITAL LETTER EPSILON
+			case "Epsilon":                         // GREEK CAPITAL LETTER EPSILON
 				return rune(0x0395), true
-			case "EqualTilde": 
-				// MINUS TILDE
-				return rune(0x2242), true
-			case "Equal": 
-				// TWO CONSECUTIVE EQUALS SIGNS
+			case "Equal":                           // TWO CONSECUTIVE EQUALS SIGNS
 				return rune(0x2a75), true
-			case "Equilibrium": 
-				// RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+			case "EqualTilde":                      // MINUS TILDE
+				return rune(0x2242), true
+			case "Equilibrium":                     // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
 				return rune(0x21cc), true
-			case "Escr": 
-				// SCRIPT CAPITAL E
+			case "Escr":                            // SCRIPT CAPITAL E
 				return rune(0x2130), true
-			case "Esim": 
-				// EQUALS SIGN ABOVE TILDE OPERATOR
+			case "Esim":                            // EQUALS SIGN ABOVE TILDE OPERATOR
 				return rune(0x2a73), true
-			case "Eta": 
-				// GREEK CAPITAL LETTER ETA
+			case "Eta":                             // GREEK CAPITAL LETTER ETA
 				return rune(0x0397), true
-			case "Euml": 
-				// LATIN CAPITAL LETTER E WITH DIAERESIS
+			case "Euml":                            // LATIN CAPITAL LETTER E WITH DIAERESIS
 				return rune(0xcb), true
-			case "Exists": 
-				// THERE EXISTS
+			case "Exists":                          // THERE EXISTS
 				return rune(0x2203), true
-			case "ExponentialE": 
-				// DOUBLE-STRUCK ITALIC SMALL E
+			case "ExponentialE":                    // DOUBLE-STRUCK ITALIC SMALL E
 				return rune(0x2147), true
 		}
 
 	case 'F':
 		switch name {
-			case "Fcy": 
-				// CYRILLIC CAPITAL LETTER EF
+			case "Fcy":                             // CYRILLIC CAPITAL LETTER EF
 				return rune(0x0424), true
-			case "Ffr": 
-				// MATHEMATICAL FRAKTUR CAPITAL F
+			case "Ffr":                             // MATHEMATICAL FRAKTUR CAPITAL F
 				return rune(0x01d509), true
-			case "FilledSmallSquare": 
-				// BLACK MEDIUM SQUARE
+			case "FilledSmallSquare":               // BLACK MEDIUM SQUARE
 				return rune(0x25fc), true
-			case "FilledVerySmallSquare": 
-				// BLACK SMALL SQUARE
+			case "FilledVerySmallSquare":           // BLACK SMALL SQUARE
 				return rune(0x25aa), true
-			case "Fopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+			case "Fopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL F
 				return rune(0x01d53d), true
-			case "ForAll": 
-				// FOR ALL
+			case "ForAll":                          // FOR ALL
 				return rune(0x2200), true
-			case "Fouriertrf": 
-				// SCRIPT CAPITAL F
+			case "Fouriertrf":                      // SCRIPT CAPITAL F
 				return rune(0x2131), true
-			case "Fscr": 
-				// SCRIPT CAPITAL F
+			case "Fscr":                            // SCRIPT CAPITAL F
 				return rune(0x2131), true
 		}
 
 	case 'G':
 		switch name {
-			case "GJcy": 
-				// CYRILLIC CAPITAL LETTER GJE
+			case "GJcy":                            // CYRILLIC CAPITAL LETTER GJE
 				return rune(0x0403), true
-			case "GT": 
-				// GREATER-THAN SIGN
+			case "GT":                              // GREATER-THAN SIGN
 				return rune(0x3e), true
-			case "Game": 
-				// TURNED SANS-SERIF CAPITAL G
+			case "Game":                            // TURNED SANS-SERIF CAPITAL G
 				return rune(0x2141), true
-			case "Gamma": 
-				// GREEK CAPITAL LETTER GAMMA
+			case "Gamma":                           // GREEK CAPITAL LETTER GAMMA
 				return rune(0x0393), true
-			case "Gammad": 
-				// GREEK LETTER DIGAMMA
+			case "Gammad":                          // GREEK LETTER DIGAMMA
 				return rune(0x03dc), true
-			case "Gbreve": 
-				// LATIN CAPITAL LETTER G WITH BREVE
+			case "Gbreve":                          // LATIN CAPITAL LETTER G WITH BREVE
 				return rune(0x011e), true
-			case "Gcedil": 
-				// LATIN CAPITAL LETTER G WITH CEDILLA
+			case "Gcedil":                          // LATIN CAPITAL LETTER G WITH CEDILLA
 				return rune(0x0122), true
-			case "Gcirc": 
-				// LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+			case "Gcirc":                           // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
 				return rune(0x011c), true
-			case "Gcy": 
-				// CYRILLIC CAPITAL LETTER GHE
+			case "Gcy":                             // CYRILLIC CAPITAL LETTER GHE
 				return rune(0x0413), true
-			case "Gdot": 
-				// LATIN CAPITAL LETTER G WITH DOT ABOVE
+			case "Gdot":                            // LATIN CAPITAL LETTER G WITH DOT ABOVE
 				return rune(0x0120), true
-			case "Gfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL G
+			case "Gfr":                             // MATHEMATICAL FRAKTUR CAPITAL G
 				return rune(0x01d50a), true
-			case "Ggr": 
-				// GREEK CAPITAL LETTER GAMMA
-				return rune(0x0393), true
-			case "Gg": 
-				// VERY MUCH GREATER-THAN
+			case "Gg":                              // VERY MUCH GREATER-THAN
 				return rune(0x22d9), true
-			case "Gopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+			case "Ggr":                             // GREEK CAPITAL LETTER GAMMA
+				return rune(0x0393), true
+			case "Gopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL G
 				return rune(0x01d53e), true
-			case "GreaterEqual": 
-				// GREATER-THAN OR EQUAL TO
+			case "GreaterEqual":                    // GREATER-THAN OR EQUAL TO
 				return rune(0x2265), true
-			case "GreaterEqualLess": 
-				// GREATER-THAN EQUAL TO OR LESS-THAN
+			case "GreaterEqualLess":                // GREATER-THAN EQUAL TO OR LESS-THAN
 				return rune(0x22db), true
-			case "GreaterFullEqual": 
-				// GREATER-THAN OVER EQUAL TO
+			case "GreaterFullEqual":                // GREATER-THAN OVER EQUAL TO
 				return rune(0x2267), true
-			case "GreaterGreater": 
-				// DOUBLE NESTED GREATER-THAN
+			case "GreaterGreater":                  // DOUBLE NESTED GREATER-THAN
 				return rune(0x2aa2), true
-			case "GreaterLess": 
-				// GREATER-THAN OR LESS-THAN
+			case "GreaterLess":                     // GREATER-THAN OR LESS-THAN
 				return rune(0x2277), true
-			case "GreaterSlantEqual": 
-				// GREATER-THAN OR SLANTED EQUAL TO
+			case "GreaterSlantEqual":               // GREATER-THAN OR SLANTED EQUAL TO
 				return rune(0x2a7e), true
-			case "GreaterTilde": 
-				// GREATER-THAN OR EQUIVALENT TO
+			case "GreaterTilde":                    // GREATER-THAN OR EQUIVALENT TO
 				return rune(0x2273), true
-			case "Gscr": 
-				// MATHEMATICAL SCRIPT CAPITAL G
+			case "Gscr":                            // MATHEMATICAL SCRIPT CAPITAL G
 				return rune(0x01d4a2), true
-			case "Gt": 
-				// MUCH GREATER-THAN
+			case "Gt":                              // MUCH GREATER-THAN
 				return rune(0x226b), true
 		}
 
 	case 'H':
 		switch name {
-			case "HARDcy": 
-				// CYRILLIC CAPITAL LETTER HARD SIGN
+			case "HARDcy":                          // CYRILLIC CAPITAL LETTER HARD SIGN
 				return rune(0x042a), true
-			case "Hacek": 
-				// CARON
+			case "Hacek":                           // CARON
 				return rune(0x02c7), true
-			case "Hat": 
-				// CIRCUMFLEX ACCENT
+			case "Hat":                             // CIRCUMFLEX ACCENT
 				return rune(0x5e), true
-			case "Hcirc": 
-				// LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+			case "Hcirc":                           // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
 				return rune(0x0124), true
-			case "Hfr": 
-				// BLACK-LETTER CAPITAL H
+			case "Hfr":                             // BLACK-LETTER CAPITAL H
 				return rune(0x210c), true
-			case "HilbertSpace": 
-				// SCRIPT CAPITAL H
+			case "HilbertSpace":                    // SCRIPT CAPITAL H
 				return rune(0x210b), true
-			case "Hopf": 
-				// DOUBLE-STRUCK CAPITAL H
+			case "Hopf":                            // DOUBLE-STRUCK CAPITAL H
 				return rune(0x210d), true
-			case "HorizontalLine": 
-				// BOX DRAWINGS LIGHT HORIZONTAL
+			case "HorizontalLine":                  // BOX DRAWINGS LIGHT HORIZONTAL
 				return rune(0x2500), true
-			case "Hscr": 
-				// SCRIPT CAPITAL H
+			case "Hscr":                            // SCRIPT CAPITAL H
 				return rune(0x210b), true
-			case "Hstrok": 
-				// LATIN CAPITAL LETTER H WITH STROKE
+			case "Hstrok":                          // LATIN CAPITAL LETTER H WITH STROKE
 				return rune(0x0126), true
-			case "HumpDownHump": 
-				// GEOMETRICALLY EQUIVALENT TO
+			case "HumpDownHump":                    // GEOMETRICALLY EQUIVALENT TO
 				return rune(0x224e), true
-			case "HumpEqual": 
-				// DIFFERENCE BETWEEN
+			case "HumpEqual":                       // DIFFERENCE BETWEEN
 				return rune(0x224f), true
 		}
 
 	case 'I':
 		switch name {
-			case "IEcy": 
-				// CYRILLIC CAPITAL LETTER IE
+			case "IEcy":                            // CYRILLIC CAPITAL LETTER IE
 				return rune(0x0415), true
-			case "IJlig": 
-				// LATIN CAPITAL LIGATURE IJ
+			case "IJlig":                           // LATIN CAPITAL LIGATURE IJ
 				return rune(0x0132), true
-			case "IOcy": 
-				// CYRILLIC CAPITAL LETTER IO
+			case "IOcy":                            // CYRILLIC CAPITAL LETTER IO
 				return rune(0x0401), true
-			case "Iacgr": 
-				// GREEK CAPITAL LETTER IOTA WITH TONOS
+			case "Iacgr":                           // GREEK CAPITAL LETTER IOTA WITH TONOS
 				return rune(0x038a), true
-			case "Iacute": 
-				// LATIN CAPITAL LETTER I WITH ACUTE
+			case "Iacute":                          // LATIN CAPITAL LETTER I WITH ACUTE
 				return rune(0xcd), true
-			case "Icirc": 
-				// LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+			case "Icirc":                           // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
 				return rune(0xce), true
-			case "Icy": 
-				// CYRILLIC CAPITAL LETTER I
+			case "Icy":                             // CYRILLIC CAPITAL LETTER I
 				return rune(0x0418), true
-			case "Idigr": 
-				// GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+			case "Idigr":                           // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
 				return rune(0x03aa), true
-			case "Idot": 
-				// LATIN CAPITAL LETTER I WITH DOT ABOVE
+			case "Idot":                            // LATIN CAPITAL LETTER I WITH DOT ABOVE
 				return rune(0x0130), true
-			case "Ifr": 
-				// BLACK-LETTER CAPITAL I
+			case "Ifr":                             // BLACK-LETTER CAPITAL I
 				return rune(0x2111), true
-			case "Igrave": 
-				// LATIN CAPITAL LETTER I WITH GRAVE
-				return rune(0xcc), true
-			case "Igr": 
-				// GREEK CAPITAL LETTER IOTA
+			case "Igr":                             // GREEK CAPITAL LETTER IOTA
 				return rune(0x0399), true
-			case "Imacr": 
-				// LATIN CAPITAL LETTER I WITH MACRON
+			case "Igrave":                          // LATIN CAPITAL LETTER I WITH GRAVE
+				return rune(0xcc), true
+			case "Im":                              // BLACK-LETTER CAPITAL I
+				return rune(0x2111), true
+			case "Imacr":                           // LATIN CAPITAL LETTER I WITH MACRON
 				return rune(0x012a), true
-			case "ImaginaryI": 
-				// DOUBLE-STRUCK ITALIC SMALL I
+			case "ImaginaryI":                      // DOUBLE-STRUCK ITALIC SMALL I
 				return rune(0x2148), true
-			case "Implies": 
-				// RIGHTWARDS DOUBLE ARROW
+			case "Implies":                         // RIGHTWARDS DOUBLE ARROW
 				return rune(0x21d2), true
-			case "Im": 
-				// BLACK-LETTER CAPITAL I
-				return rune(0x2111), true
-			case "Integral": 
-				// INTEGRAL
-				return rune(0x222b), true
-			case "Int": 
-				// DOUBLE INTEGRAL
+			case "Int":                             // DOUBLE INTEGRAL
 				return rune(0x222c), true
-			case "Intersection": 
-				// N-ARY INTERSECTION
+			case "Integral":                        // INTEGRAL
+				return rune(0x222b), true
+			case "Intersection":                    // N-ARY INTERSECTION
 				return rune(0x22c2), true
-			case "InvisibleComma": 
-				// INVISIBLE SEPARATOR
+			case "InvisibleComma":                  // INVISIBLE SEPARATOR
 				return rune(0x2063), true
-			case "InvisibleTimes": 
-				// INVISIBLE TIMES
+			case "InvisibleTimes":                  // INVISIBLE TIMES
 				return rune(0x2062), true
-			case "Iogon": 
-				// LATIN CAPITAL LETTER I WITH OGONEK
+			case "Iogon":                           // LATIN CAPITAL LETTER I WITH OGONEK
 				return rune(0x012e), true
-			case "Iopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+			case "Iopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL I
 				return rune(0x01d540), true
-			case "Iota": 
-				// GREEK CAPITAL LETTER IOTA
+			case "Iota":                            // GREEK CAPITAL LETTER IOTA
 				return rune(0x0399), true
-			case "Iscr": 
-				// SCRIPT CAPITAL I
+			case "Iscr":                            // SCRIPT CAPITAL I
 				return rune(0x2110), true
-			case "Itilde": 
-				// LATIN CAPITAL LETTER I WITH TILDE
+			case "Itilde":                          // LATIN CAPITAL LETTER I WITH TILDE
 				return rune(0x0128), true
-			case "Iukcy": 
-				// CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+			case "Iukcy":                           // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
 				return rune(0x0406), true
-			case "Iuml": 
-				// LATIN CAPITAL LETTER I WITH DIAERESIS
+			case "Iuml":                            // LATIN CAPITAL LETTER I WITH DIAERESIS
 				return rune(0xcf), true
 		}
 
 	case 'J':
 		switch name {
-			case "Jcirc": 
-				// LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+			case "Jcirc":                           // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
 				return rune(0x0134), true
-			case "Jcy": 
-				// CYRILLIC CAPITAL LETTER SHORT I
+			case "Jcy":                             // CYRILLIC CAPITAL LETTER SHORT I
 				return rune(0x0419), true
-			case "Jfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL J
+			case "Jfr":                             // MATHEMATICAL FRAKTUR CAPITAL J
 				return rune(0x01d50d), true
-			case "Jopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+			case "Jopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL J
 				return rune(0x01d541), true
-			case "Jscr": 
-				// MATHEMATICAL SCRIPT CAPITAL J
+			case "Jscr":                            // MATHEMATICAL SCRIPT CAPITAL J
 				return rune(0x01d4a5), true
-			case "Jsercy": 
-				// CYRILLIC CAPITAL LETTER JE
+			case "Jsercy":                          // CYRILLIC CAPITAL LETTER JE
 				return rune(0x0408), true
-			case "Jukcy": 
-				// CYRILLIC CAPITAL LETTER UKRAINIAN IE
+			case "Jukcy":                           // CYRILLIC CAPITAL LETTER UKRAINIAN IE
 				return rune(0x0404), true
 		}
 
 	case 'K':
 		switch name {
-			case "KHcy": 
-				// CYRILLIC CAPITAL LETTER HA
+			case "KHcy":                            // CYRILLIC CAPITAL LETTER HA
 				return rune(0x0425), true
-			case "KHgr": 
-				// GREEK CAPITAL LETTER CHI
+			case "KHgr":                            // GREEK CAPITAL LETTER CHI
 				return rune(0x03a7), true
-			case "KJcy": 
-				// CYRILLIC CAPITAL LETTER KJE
+			case "KJcy":                            // CYRILLIC CAPITAL LETTER KJE
 				return rune(0x040c), true
-			case "Kappa": 
-				// GREEK CAPITAL LETTER KAPPA
+			case "Kappa":                           // GREEK CAPITAL LETTER KAPPA
 				return rune(0x039a), true
-			case "Kcedil": 
-				// LATIN CAPITAL LETTER K WITH CEDILLA
+			case "Kcedil":                          // LATIN CAPITAL LETTER K WITH CEDILLA
 				return rune(0x0136), true
-			case "Kcy": 
-				// CYRILLIC CAPITAL LETTER KA
+			case "Kcy":                             // CYRILLIC CAPITAL LETTER KA
 				return rune(0x041a), true
-			case "Kfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL K
+			case "Kfr":                             // MATHEMATICAL FRAKTUR CAPITAL K
 				return rune(0x01d50e), true
-			case "Kgr": 
-				// GREEK CAPITAL LETTER KAPPA
+			case "Kgr":                             // GREEK CAPITAL LETTER KAPPA
 				return rune(0x039a), true
-			case "Kopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+			case "Kopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL K
 				return rune(0x01d542), true
-			case "Kscr": 
-				// MATHEMATICAL SCRIPT CAPITAL K
+			case "Kscr":                            // MATHEMATICAL SCRIPT CAPITAL K
 				return rune(0x01d4a6), true
 		}
 
 	case 'L':
 		switch name {
-			case "LJcy": 
-				// CYRILLIC CAPITAL LETTER LJE
+			case "LJcy":                            // CYRILLIC CAPITAL LETTER LJE
 				return rune(0x0409), true
-			case "LT": 
-				// LESS-THAN SIGN
+			case "LT":                              // LESS-THAN SIGN
 				return rune(0x3c), true
-			case "Lacute": 
-				// LATIN CAPITAL LETTER L WITH ACUTE
+			case "Lacute":                          // LATIN CAPITAL LETTER L WITH ACUTE
 				return rune(0x0139), true
-			case "Lambda": 
-				// GREEK CAPITAL LETTER LAMDA
+			case "Lambda":                          // GREEK CAPITAL LETTER LAMDA
 				return rune(0x039b), true
-			case "Lang": 
-				// MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+			case "Lang":                            // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
 				return rune(0x27ea), true
-			case "Laplacetrf": 
-				// SCRIPT CAPITAL L
+			case "Laplacetrf":                      // SCRIPT CAPITAL L
 				return rune(0x2112), true
-			case "Larr": 
-				// LEFTWARDS TWO HEADED ARROW
+			case "Larr":                            // LEFTWARDS TWO HEADED ARROW
 				return rune(0x219e), true
-			case "Lcaron": 
-				// LATIN CAPITAL LETTER L WITH CARON
+			case "Lcaron":                          // LATIN CAPITAL LETTER L WITH CARON
 				return rune(0x013d), true
-			case "Lcedil": 
-				// LATIN CAPITAL LETTER L WITH CEDILLA
+			case "Lcedil":                          // LATIN CAPITAL LETTER L WITH CEDILLA
 				return rune(0x013b), true
-			case "Lcy": 
-				// CYRILLIC CAPITAL LETTER EL
+			case "Lcy":                             // CYRILLIC CAPITAL LETTER EL
 				return rune(0x041b), true
-			case "LeftAngleBracket": 
-				// MATHEMATICAL LEFT ANGLE BRACKET
+			case "LeftAngleBracket":                // MATHEMATICAL LEFT ANGLE BRACKET
 				return rune(0x27e8), true
-			case "LeftArrowBar": 
-				// LEFTWARDS ARROW TO BAR
+			case "LeftArrow":                       // LEFTWARDS ARROW
+				return rune(0x2190), true
+			case "LeftArrowBar":                    // LEFTWARDS ARROW TO BAR
 				return rune(0x21e4), true
-			case "LeftArrowRightArrow": 
-				// LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+			case "LeftArrowRightArrow":             // LEFTWARDS ARROW OVER RIGHTWARDS ARROW
 				return rune(0x21c6), true
-			case "LeftArrow": 
-				// LEFTWARDS ARROW
-				return rune(0x2190), true
-			case "LeftCeiling": 
-				// LEFT CEILING
+			case "LeftCeiling":                     // LEFT CEILING
 				return rune(0x2308), true
-			case "LeftDoubleBracket": 
-				// MATHEMATICAL LEFT WHITE SQUARE BRACKET
+			case "LeftDoubleBracket":               // MATHEMATICAL LEFT WHITE SQUARE BRACKET
 				return rune(0x27e6), true
-			case "LeftDownTeeVector": 
-				// DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+			case "LeftDownTeeVector":               // DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
 				return rune(0x2961), true
-			case "LeftDownVector": 
-				// DOWNWARDS HARPOON WITH BARB LEFTWARDS
+			case "LeftDownVector":                  // DOWNWARDS HARPOON WITH BARB LEFTWARDS
 				return rune(0x21c3), true
-			case "LeftDownVectorBar": 
-				// DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+			case "LeftDownVectorBar":               // DOWNWARDS HARPOON WITH BARB LEFT TO BAR
 				return rune(0x2959), true
-			case "LeftFloor": 
-				// LEFT FLOOR
+			case "LeftFloor":                       // LEFT FLOOR
 				return rune(0x230a), true
-			case "LeftRightArrow": 
-				// LEFT RIGHT ARROW
+			case "LeftRightArrow":                  // LEFT RIGHT ARROW
 				return rune(0x2194), true
-			case "LeftRightVector": 
-				// LEFT BARB UP RIGHT BARB UP HARPOON
+			case "LeftRightVector":                 // LEFT BARB UP RIGHT BARB UP HARPOON
 				return rune(0x294e), true
-			case "LeftTeeArrow": 
-				// LEFTWARDS ARROW FROM BAR
+			case "LeftTee":                         // LEFT TACK
+				return rune(0x22a3), true
+			case "LeftTeeArrow":                    // LEFTWARDS ARROW FROM BAR
 				return rune(0x21a4), true
-			case "LeftTeeVector": 
-				// LEFTWARDS HARPOON WITH BARB UP FROM BAR
+			case "LeftTeeVector":                   // LEFTWARDS HARPOON WITH BARB UP FROM BAR
 				return rune(0x295a), true
-			case "LeftTee": 
-				// LEFT TACK
-				return rune(0x22a3), true
-			case "LeftTriangleBar": 
-				// LEFT TRIANGLE BESIDE VERTICAL BAR
-				return rune(0x29cf), true
-			case "LeftTriangle": 
-				// NORMAL SUBGROUP OF
+			case "LeftTriangle":                    // NORMAL SUBGROUP OF
 				return rune(0x22b2), true
-			case "LeftTriangleEqual": 
-				// NORMAL SUBGROUP OF OR EQUAL TO
+			case "LeftTriangleBar":                 // LEFT TRIANGLE BESIDE VERTICAL BAR
+				return rune(0x29cf), true
+			case "LeftTriangleEqual":               // NORMAL SUBGROUP OF OR EQUAL TO
 				return rune(0x22b4), true
-			case "LeftUpDownVector": 
-				// UP BARB LEFT DOWN BARB LEFT HARPOON
+			case "LeftUpDownVector":                // UP BARB LEFT DOWN BARB LEFT HARPOON
 				return rune(0x2951), true
-			case "LeftUpTeeVector": 
-				// UPWARDS HARPOON WITH BARB LEFT FROM BAR
+			case "LeftUpTeeVector":                 // UPWARDS HARPOON WITH BARB LEFT FROM BAR
 				return rune(0x2960), true
-			case "LeftUpVector": 
-				// UPWARDS HARPOON WITH BARB LEFTWARDS
+			case "LeftUpVector":                    // UPWARDS HARPOON WITH BARB LEFTWARDS
 				return rune(0x21bf), true
-			case "LeftUpVectorBar": 
-				// UPWARDS HARPOON WITH BARB LEFT TO BAR
+			case "LeftUpVectorBar":                 // UPWARDS HARPOON WITH BARB LEFT TO BAR
 				return rune(0x2958), true
-			case "LeftVector": 
-				// LEFTWARDS HARPOON WITH BARB UPWARDS
+			case "LeftVector":                      // LEFTWARDS HARPOON WITH BARB UPWARDS
 				return rune(0x21bc), true
-			case "LeftVectorBar": 
-				// LEFTWARDS HARPOON WITH BARB UP TO BAR
+			case "LeftVectorBar":                   // LEFTWARDS HARPOON WITH BARB UP TO BAR
 				return rune(0x2952), true
-			case "Leftarrow": 
-				// LEFTWARDS DOUBLE ARROW
+			case "Leftarrow":                       // LEFTWARDS DOUBLE ARROW
 				return rune(0x21d0), true
-			case "Leftrightarrow": 
-				// LEFT RIGHT DOUBLE ARROW
+			case "Leftrightarrow":                  // LEFT RIGHT DOUBLE ARROW
 				return rune(0x21d4), true
-			case "LessEqualGreater": 
-				// LESS-THAN EQUAL TO OR GREATER-THAN
+			case "LessEqualGreater":                // LESS-THAN EQUAL TO OR GREATER-THAN
 				return rune(0x22da), true
-			case "LessFullEqual": 
-				// LESS-THAN OVER EQUAL TO
+			case "LessFullEqual":                   // LESS-THAN OVER EQUAL TO
 				return rune(0x2266), true
-			case "LessGreater": 
-				// LESS-THAN OR GREATER-THAN
+			case "LessGreater":                     // LESS-THAN OR GREATER-THAN
 				return rune(0x2276), true
-			case "LessLess": 
-				// DOUBLE NESTED LESS-THAN
+			case "LessLess":                        // DOUBLE NESTED LESS-THAN
 				return rune(0x2aa1), true
-			case "LessSlantEqual": 
-				// LESS-THAN OR SLANTED EQUAL TO
+			case "LessSlantEqual":                  // LESS-THAN OR SLANTED EQUAL TO
 				return rune(0x2a7d), true
-			case "LessTilde": 
-				// LESS-THAN OR EQUIVALENT TO
+			case "LessTilde":                       // LESS-THAN OR EQUIVALENT TO
 				return rune(0x2272), true
-			case "Lfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL L
+			case "Lfr":                             // MATHEMATICAL FRAKTUR CAPITAL L
 				return rune(0x01d50f), true
-			case "Lgr": 
-				// GREEK CAPITAL LETTER LAMDA
+			case "Lgr":                             // GREEK CAPITAL LETTER LAMDA
 				return rune(0x039b), true
-			case "Lleftarrow": 
-				// LEFTWARDS TRIPLE ARROW
-				return rune(0x21da), true
-			case "Ll": 
-				// VERY MUCH LESS-THAN
+			case "Ll":                              // VERY MUCH LESS-THAN
 				return rune(0x22d8), true
-			case "Lmidot": 
-				// LATIN CAPITAL LETTER L WITH MIDDLE DOT
+			case "Lleftarrow":                      // LEFTWARDS TRIPLE ARROW
+				return rune(0x21da), true
+			case "Lmidot":                          // LATIN CAPITAL LETTER L WITH MIDDLE DOT
 				return rune(0x013f), true
-			case "LongLeftArrow": 
-				// LONG LEFTWARDS ARROW
+			case "LongLeftArrow":                   // LONG LEFTWARDS ARROW
 				return rune(0x27f5), true
-			case "LongLeftRightArrow": 
-				// LONG LEFT RIGHT ARROW
+			case "LongLeftRightArrow":              // LONG LEFT RIGHT ARROW
 				return rune(0x27f7), true
-			case "LongRightArrow": 
-				// LONG RIGHTWARDS ARROW
+			case "LongRightArrow":                  // LONG RIGHTWARDS ARROW
 				return rune(0x27f6), true
-			case "Longleftarrow": 
-				// LONG LEFTWARDS DOUBLE ARROW
+			case "Longleftarrow":                   // LONG LEFTWARDS DOUBLE ARROW
 				return rune(0x27f8), true
-			case "Longleftrightarrow": 
-				// LONG LEFT RIGHT DOUBLE ARROW
+			case "Longleftrightarrow":              // LONG LEFT RIGHT DOUBLE ARROW
 				return rune(0x27fa), true
-			case "Longrightarrow": 
-				// LONG RIGHTWARDS DOUBLE ARROW
+			case "Longrightarrow":                  // LONG RIGHTWARDS DOUBLE ARROW
 				return rune(0x27f9), true
-			case "Lopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+			case "Lopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL L
 				return rune(0x01d543), true
-			case "LowerLeftArrow": 
-				// SOUTH WEST ARROW
+			case "LowerLeftArrow":                  // SOUTH WEST ARROW
 				return rune(0x2199), true
-			case "LowerRightArrow": 
-				// SOUTH EAST ARROW
+			case "LowerRightArrow":                 // SOUTH EAST ARROW
 				return rune(0x2198), true
-			case "Lscr": 
-				// SCRIPT CAPITAL L
+			case "Lscr":                            // SCRIPT CAPITAL L
 				return rune(0x2112), true
-			case "Lsh": 
-				// UPWARDS ARROW WITH TIP LEFTWARDS
+			case "Lsh":                             // UPWARDS ARROW WITH TIP LEFTWARDS
 				return rune(0x21b0), true
-			case "Lstrok": 
-				// LATIN CAPITAL LETTER L WITH STROKE
+			case "Lstrok":                          // LATIN CAPITAL LETTER L WITH STROKE
 				return rune(0x0141), true
-			case "Ltbar": 
-				// DOUBLE NESTED LESS-THAN WITH UNDERBAR
-				return rune(0x2aa3), true
-			case "Lt": 
-				// MUCH LESS-THAN
+			case "Lt":                              // MUCH LESS-THAN
 				return rune(0x226a), true
+			case "Ltbar":                           // DOUBLE NESTED LESS-THAN WITH UNDERBAR
+				return rune(0x2aa3), true
 		}
 
 	case 'M':
 		switch name {
-			case "Mapfrom": 
-				// LEFTWARDS DOUBLE ARROW FROM BAR
+			case "Map":                             // RIGHTWARDS TWO-HEADED ARROW FROM BAR
+				return rune(0x2905), true
+			case "Mapfrom":                         // LEFTWARDS DOUBLE ARROW FROM BAR
 				return rune(0x2906), true
-			case "Mapto": 
-				// RIGHTWARDS DOUBLE ARROW FROM BAR
+			case "Mapto":                           // RIGHTWARDS DOUBLE ARROW FROM BAR
 				return rune(0x2907), true
-			case "Map": 
-				// RIGHTWARDS TWO-HEADED ARROW FROM BAR
-				return rune(0x2905), true
-			case "Mcy": 
-				// CYRILLIC CAPITAL LETTER EM
+			case "Mcy":                             // CYRILLIC CAPITAL LETTER EM
 				return rune(0x041c), true
-			case "MediumSpace": 
-				// MEDIUM MATHEMATICAL SPACE
+			case "MediumSpace":                     // MEDIUM MATHEMATICAL SPACE
 				return rune(0x205f), true
-			case "Mellintrf": 
-				// SCRIPT CAPITAL M
+			case "Mellintrf":                       // SCRIPT CAPITAL M
 				return rune(0x2133), true
-			case "Mfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL M
+			case "Mfr":                             // MATHEMATICAL FRAKTUR CAPITAL M
 				return rune(0x01d510), true
-			case "Mgr": 
-				// GREEK CAPITAL LETTER MU
+			case "Mgr":                             // GREEK CAPITAL LETTER MU
 				return rune(0x039c), true
-			case "MinusPlus": 
-				// MINUS-OR-PLUS SIGN
+			case "MinusPlus":                       // MINUS-OR-PLUS SIGN
 				return rune(0x2213), true
-			case "Mopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+			case "Mopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL M
 				return rune(0x01d544), true
-			case "Mscr": 
-				// SCRIPT CAPITAL M
+			case "Mscr":                            // SCRIPT CAPITAL M
 				return rune(0x2133), true
-			case "Mu": 
-				// GREEK CAPITAL LETTER MU
+			case "Mu":                              // GREEK CAPITAL LETTER MU
 				return rune(0x039c), true
 		}
 
 	case 'N':
 		switch name {
-			case "NJcy": 
-				// CYRILLIC CAPITAL LETTER NJE
+			case "NJcy":                            // CYRILLIC CAPITAL LETTER NJE
 				return rune(0x040a), true
-			case "Nacute": 
-				// LATIN CAPITAL LETTER N WITH ACUTE
+			case "Nacute":                          // LATIN CAPITAL LETTER N WITH ACUTE
 				return rune(0x0143), true
-			case "Ncaron": 
-				// LATIN CAPITAL LETTER N WITH CARON
+			case "Ncaron":                          // LATIN CAPITAL LETTER N WITH CARON
 				return rune(0x0147), true
-			case "Ncedil": 
-				// LATIN CAPITAL LETTER N WITH CEDILLA
+			case "Ncedil":                          // LATIN CAPITAL LETTER N WITH CEDILLA
 				return rune(0x0145), true
-			case "Ncy": 
-				// CYRILLIC CAPITAL LETTER EN
+			case "Ncy":                             // CYRILLIC CAPITAL LETTER EN
 				return rune(0x041d), true
-			case "NegativeMediumSpace": 
-				// ZERO WIDTH SPACE
+			case "NegativeMediumSpace":             // ZERO WIDTH SPACE
 				return rune(0x200b), true
-			case "NegativeThickSpace": 
-				// ZERO WIDTH SPACE
+			case "NegativeThickSpace":              // ZERO WIDTH SPACE
 				return rune(0x200b), true
-			case "NegativeThinSpace": 
-				// ZERO WIDTH SPACE
+			case "NegativeThinSpace":               // ZERO WIDTH SPACE
 				return rune(0x200b), true
-			case "NegativeVeryThinSpace": 
-				// ZERO WIDTH SPACE
+			case "NegativeVeryThinSpace":           // ZERO WIDTH SPACE
 				return rune(0x200b), true
-			case "NestedGreaterGreater": 
-				// MUCH GREATER-THAN
+			case "NestedGreaterGreater":            // MUCH GREATER-THAN
 				return rune(0x226b), true
-			case "NestedLessLess": 
-				// MUCH LESS-THAN
+			case "NestedLessLess":                  // MUCH LESS-THAN
 				return rune(0x226a), true
-			case "NewLine": 
-				// LINE FEED (LF)
+			case "NewLine":                         // LINE FEED (LF)
 				return rune(0x0a), true
-			case "Nfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL N
+			case "Nfr":                             // MATHEMATICAL FRAKTUR CAPITAL N
 				return rune(0x01d511), true
-			case "Ngr": 
-				// GREEK CAPITAL LETTER NU
+			case "Ngr":                             // GREEK CAPITAL LETTER NU
 				return rune(0x039d), true
-			case "NoBreak": 
-				// WORD JOINER
+			case "NoBreak":                         // WORD JOINER
 				return rune(0x2060), true
-			case "NonBreakingSpace": 
-				// NO-BREAK SPACE
+			case "NonBreakingSpace":                // NO-BREAK SPACE
 				return rune(0xa0), true
-			case "Nopf": 
-				// DOUBLE-STRUCK CAPITAL N
+			case "Nopf":                            // DOUBLE-STRUCK CAPITAL N
 				return rune(0x2115), true
-			case "NotDoubleVerticalBar": 
-				// NOT PARALLEL TO
+			case "Not":                             // DOUBLE STROKE NOT SIGN
+				return rune(0x2aec), true
+			case "NotCongruent":                    // NOT IDENTICAL TO
+				return rune(0x2262), true
+			case "NotCupCap":                       // NOT EQUIVALENT TO
+				return rune(0x226d), true
+			case "NotDoubleVerticalBar":            // NOT PARALLEL TO
 				return rune(0x2226), true
-			case "NotElement": 
-				// NOT AN ELEMENT OF
+			case "NotElement":                      // NOT AN ELEMENT OF
 				return rune(0x2209), true
-			case "NotEqualTilde": 
-				// MINUS TILDE with slash
-				return rune(0x2242), true
-			case "NotEqual": 
-				// NOT EQUAL TO
+			case "NotEqual":                        // NOT EQUAL TO
 				return rune(0x2260), true
-			case "NotExists": 
-				// THERE DOES NOT EXIST
+			case "NotEqualTilde":                   // MINUS TILDE with slash
+				return rune(0x2242), true
+			case "NotExists":                       // THERE DOES NOT EXIST
 				return rune(0x2204), true
-			case "NotHumpDownHump": 
-				// GEOMETRICALLY EQUIVALENT TO with slash
-				return rune(0x224e), true
-			case "NotHumpEqual": 
-				// DIFFERENCE BETWEEN with slash
-				return rune(0x224f), true
-			case "NotLessGreater": 
-				// NEITHER LESS-THAN NOR GREATER-THAN
-				return rune(0x2278), true
-			case "NotReverseElement": 
-				// DOES NOT CONTAIN AS MEMBER
-				return rune(0x220c), true
-			case "NotTilde": 
-				// NOT TILDE
-				return rune(0x2241), true
-			case "NotTildeEqual": 
-				// NOT ASYMPTOTICALLY EQUAL TO
-				return rune(0x2244), true
-			case "NotTildeFullEqual": 
-				// NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
-				return rune(0x2247), true
-			case "NotTildeTilde": 
-				// NOT ALMOST EQUAL TO
-				return rune(0x2249), true
-			case "NotVerticalBar": 
-				// DOES NOT DIVIDE
-				return rune(0x2224), true
-			case "Not": 
-				// DOUBLE STROKE NOT SIGN
-				return rune(0x2aec), true
-			case "NotCongruent": 
-				// NOT IDENTICAL TO
-				return rune(0x2262), true
-			case "NotCupCap": 
-				// NOT EQUIVALENT TO
-				return rune(0x226d), true
-			case "NotGreaterFullEqual": 
-				// GREATER-THAN OVER EQUAL TO with slash
-				return rune(0x2267), true
-			case "NotGreaterGreater": 
-				// MUCH GREATER THAN with slash
-				return rune(0x226b), true
-			case "NotGreaterSlantEqual": 
-				// GREATER-THAN OR SLANTED EQUAL TO with slash
-				return rune(0x2a7e), true
-			case "NotGreater": 
-				// NOT GREATER-THAN
+			case "NotGreater":                      // NOT GREATER-THAN
 				return rune(0x226f), true
-			case "NotGreaterEqual": 
-				// NEITHER GREATER-THAN NOR EQUAL TO
+			case "NotGreaterEqual":                 // NEITHER GREATER-THAN NOR EQUAL TO
 				return rune(0x2271), true
-			case "NotGreaterLess": 
-				// NEITHER GREATER-THAN NOR LESS-THAN
+			case "NotGreaterFullEqual":             // GREATER-THAN OVER EQUAL TO with slash
+				return rune(0x2267), true
+			case "NotGreaterGreater":               // MUCH GREATER THAN with slash
+				return rune(0x226b), true
+			case "NotGreaterLess":                  // NEITHER GREATER-THAN NOR LESS-THAN
 				return rune(0x2279), true
-			case "NotGreaterTilde": 
-				// NEITHER GREATER-THAN NOR EQUIVALENT TO
+			case "NotGreaterSlantEqual":            // GREATER-THAN OR SLANTED EQUAL TO with slash
+				return rune(0x2a7e), true
+			case "NotGreaterTilde":                 // NEITHER GREATER-THAN NOR EQUIVALENT TO
 				return rune(0x2275), true
-			case "NotLeftTriangleBar": 
-				// LEFT TRIANGLE BESIDE VERTICAL BAR with slash
-				return rune(0x29cf), true
-			case "NotLeftTriangle": 
-				// NOT NORMAL SUBGROUP OF
+			case "NotHumpDownHump":                 // GEOMETRICALLY EQUIVALENT TO with slash
+				return rune(0x224e), true
+			case "NotHumpEqual":                    // DIFFERENCE BETWEEN with slash
+				return rune(0x224f), true
+			case "NotLeftTriangle":                 // NOT NORMAL SUBGROUP OF
 				return rune(0x22ea), true
-			case "NotLeftTriangleEqual": 
-				// NOT NORMAL SUBGROUP OF OR EQUAL TO
+			case "NotLeftTriangleBar":              // LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+				return rune(0x29cf), true
+			case "NotLeftTriangleEqual":            // NOT NORMAL SUBGROUP OF OR EQUAL TO
 				return rune(0x22ec), true
-			case "NotLessLess": 
-				// MUCH LESS THAN with slash
-				return rune(0x226a), true
-			case "NotLessSlantEqual": 
-				// LESS-THAN OR SLANTED EQUAL TO with slash
-				return rune(0x2a7d), true
-			case "NotLess": 
-				// NOT LESS-THAN
+			case "NotLess":                         // NOT LESS-THAN
 				return rune(0x226e), true
-			case "NotLessEqual": 
-				// NEITHER LESS-THAN NOR EQUAL TO
+			case "NotLessEqual":                    // NEITHER LESS-THAN NOR EQUAL TO
 				return rune(0x2270), true
-			case "NotLessTilde": 
-				// NEITHER LESS-THAN NOR EQUIVALENT TO
+			case "NotLessGreater":                  // NEITHER LESS-THAN NOR GREATER-THAN
+				return rune(0x2278), true
+			case "NotLessLess":                     // MUCH LESS THAN with slash
+				return rune(0x226a), true
+			case "NotLessSlantEqual":               // LESS-THAN OR SLANTED EQUAL TO with slash
+				return rune(0x2a7d), true
+			case "NotLessTilde":                    // NEITHER LESS-THAN NOR EQUIVALENT TO
 				return rune(0x2274), true
-			case "NotNestedGreaterGreater": 
-				// DOUBLE NESTED GREATER-THAN with slash
+			case "NotNestedGreaterGreater":         // DOUBLE NESTED GREATER-THAN with slash
 				return rune(0x2aa2), true
-			case "NotNestedLessLess": 
-				// DOUBLE NESTED LESS-THAN with slash
+			case "NotNestedLessLess":               // DOUBLE NESTED LESS-THAN with slash
 				return rune(0x2aa1), true
-			case "NotPrecedesEqual": 
-				// PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
-				return rune(0x2aaf), true
-			case "NotPrecedes": 
-				// DOES NOT PRECEDE
+			case "NotPrecedes":                     // DOES NOT PRECEDE
 				return rune(0x2280), true
-			case "NotPrecedesSlantEqual": 
-				// DOES NOT PRECEDE OR EQUAL
+			case "NotPrecedesEqual":                // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+				return rune(0x2aaf), true
+			case "NotPrecedesSlantEqual":           // DOES NOT PRECEDE OR EQUAL
 				return rune(0x22e0), true
-			case "NotRightTriangleBar": 
-				// VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
-				return rune(0x29d0), true
-			case "NotRightTriangle": 
-				// DOES NOT CONTAIN AS NORMAL SUBGROUP
+			case "NotReverseElement":               // DOES NOT CONTAIN AS MEMBER
+				return rune(0x220c), true
+			case "NotRightTriangle":                // DOES NOT CONTAIN AS NORMAL SUBGROUP
 				return rune(0x22eb), true
-			case "NotRightTriangleEqual": 
-				// DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+			case "NotRightTriangleBar":             // VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+				return rune(0x29d0), true
+			case "NotRightTriangleEqual":           // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
 				return rune(0x22ed), true
-			case "NotSquareSubset": 
-				// SQUARE IMAGE OF with slash
+			case "NotSquareSubset":                 // SQUARE IMAGE OF with slash
 				return rune(0x228f), true
-			case "NotSquareSubsetEqual": 
-				// NOT SQUARE IMAGE OF OR EQUAL TO
+			case "NotSquareSubsetEqual":            // NOT SQUARE IMAGE OF OR EQUAL TO
 				return rune(0x22e2), true
-			case "NotSquareSuperset": 
-				// SQUARE ORIGINAL OF with slash
+			case "NotSquareSuperset":               // SQUARE ORIGINAL OF with slash
 				return rune(0x2290), true
-			case "NotSquareSupersetEqual": 
-				// NOT SQUARE ORIGINAL OF OR EQUAL TO
+			case "NotSquareSupersetEqual":          // NOT SQUARE ORIGINAL OF OR EQUAL TO
 				return rune(0x22e3), true
-			case "NotSubset": 
-				// SUBSET OF with vertical line
+			case "NotSubset":                       // SUBSET OF with vertical line
 				return rune(0x2282), true
-			case "NotSubsetEqual": 
-				// NEITHER A SUBSET OF NOR EQUAL TO
+			case "NotSubsetEqual":                  // NEITHER A SUBSET OF NOR EQUAL TO
 				return rune(0x2288), true
-			case "NotSucceedsEqual": 
-				// SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
-				return rune(0x2ab0), true
-			case "NotSucceedsTilde": 
-				// SUCCEEDS OR EQUIVALENT TO with slash
-				return rune(0x227f), true
-			case "NotSucceeds": 
-				// DOES NOT SUCCEED
+			case "NotSucceeds":                     // DOES NOT SUCCEED
 				return rune(0x2281), true
-			case "NotSucceedsSlantEqual": 
-				// DOES NOT SUCCEED OR EQUAL
+			case "NotSucceedsEqual":                // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+				return rune(0x2ab0), true
+			case "NotSucceedsSlantEqual":           // DOES NOT SUCCEED OR EQUAL
 				return rune(0x22e1), true
-			case "NotSuperset": 
-				// SUPERSET OF with vertical line
+			case "NotSucceedsTilde":                // SUCCEEDS OR EQUIVALENT TO with slash
+				return rune(0x227f), true
+			case "NotSuperset":                     // SUPERSET OF with vertical line
 				return rune(0x2283), true
-			case "NotSupersetEqual": 
-				// NEITHER A SUPERSET OF NOR EQUAL TO
+			case "NotSupersetEqual":                // NEITHER A SUPERSET OF NOR EQUAL TO
 				return rune(0x2289), true
-			case "Nscr": 
-				// MATHEMATICAL SCRIPT CAPITAL N
+			case "NotTilde":                        // NOT TILDE
+				return rune(0x2241), true
+			case "NotTildeEqual":                   // NOT ASYMPTOTICALLY EQUAL TO
+				return rune(0x2244), true
+			case "NotTildeFullEqual":               // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+				return rune(0x2247), true
+			case "NotTildeTilde":                   // NOT ALMOST EQUAL TO
+				return rune(0x2249), true
+			case "NotVerticalBar":                  // DOES NOT DIVIDE
+				return rune(0x2224), true
+			case "Nscr":                            // MATHEMATICAL SCRIPT CAPITAL N
 				return rune(0x01d4a9), true
-			case "Ntilde": 
-				// LATIN CAPITAL LETTER N WITH TILDE
+			case "Ntilde":                          // LATIN CAPITAL LETTER N WITH TILDE
 				return rune(0xd1), true
-			case "Nu": 
-				// GREEK CAPITAL LETTER NU
+			case "Nu":                              // GREEK CAPITAL LETTER NU
 				return rune(0x039d), true
 		}
 
 	case 'O':
 		switch name {
-			case "OElig": 
-				// LATIN CAPITAL LIGATURE OE
+			case "OElig":                           // LATIN CAPITAL LIGATURE OE
 				return rune(0x0152), true
-			case "OHacgr": 
-				// GREEK CAPITAL LETTER OMEGA WITH TONOS
+			case "OHacgr":                          // GREEK CAPITAL LETTER OMEGA WITH TONOS
 				return rune(0x038f), true
-			case "OHgr": 
-				// GREEK CAPITAL LETTER OMEGA
+			case "OHgr":                            // GREEK CAPITAL LETTER OMEGA
 				return rune(0x03a9), true
-			case "Oacgr": 
-				// GREEK CAPITAL LETTER OMICRON WITH TONOS
+			case "Oacgr":                           // GREEK CAPITAL LETTER OMICRON WITH TONOS
 				return rune(0x038c), true
-			case "Oacute": 
-				// LATIN CAPITAL LETTER O WITH ACUTE
+			case "Oacute":                          // LATIN CAPITAL LETTER O WITH ACUTE
 				return rune(0xd3), true
-			case "Ocirc": 
-				// LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+			case "Ocirc":                           // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
 				return rune(0xd4), true
-			case "Ocy": 
-				// CYRILLIC CAPITAL LETTER O
+			case "Ocy":                             // CYRILLIC CAPITAL LETTER O
 				return rune(0x041e), true
-			case "Odblac": 
-				// LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+			case "Odblac":                          // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
 				return rune(0x0150), true
-			case "Ofr": 
-				// MATHEMATICAL FRAKTUR CAPITAL O
+			case "Ofr":                             // MATHEMATICAL FRAKTUR CAPITAL O
 				return rune(0x01d512), true
-			case "Ograve": 
-				// LATIN CAPITAL LETTER O WITH GRAVE
-				return rune(0xd2), true
-			case "Ogr": 
-				// GREEK CAPITAL LETTER OMICRON
+			case "Ogr":                             // GREEK CAPITAL LETTER OMICRON
 				return rune(0x039f), true
-			case "Omacr": 
-				// LATIN CAPITAL LETTER O WITH MACRON
+			case "Ograve":                          // LATIN CAPITAL LETTER O WITH GRAVE
+				return rune(0xd2), true
+			case "Omacr":                           // LATIN CAPITAL LETTER O WITH MACRON
 				return rune(0x014c), true
-			case "Omega": 
-				// GREEK CAPITAL LETTER OMEGA
+			case "Omega":                           // GREEK CAPITAL LETTER OMEGA
 				return rune(0x03a9), true
-			case "Omicron": 
-				// GREEK CAPITAL LETTER OMICRON
+			case "Omicron":                         // GREEK CAPITAL LETTER OMICRON
 				return rune(0x039f), true
-			case "Oopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+			case "Oopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL O
 				return rune(0x01d546), true
-			case "OpenCurlyDoubleQuote": 
-				// LEFT DOUBLE QUOTATION MARK
+			case "OpenCurlyDoubleQuote":            // LEFT DOUBLE QUOTATION MARK
 				return rune(0x201c), true
-			case "OpenCurlyQuote": 
-				// LEFT SINGLE QUOTATION MARK
+			case "OpenCurlyQuote":                  // LEFT SINGLE QUOTATION MARK
 				return rune(0x2018), true
-			case "Or": 
-				// DOUBLE LOGICAL OR
+			case "Or":                              // DOUBLE LOGICAL OR
 				return rune(0x2a54), true
-			case "Oscr": 
-				// MATHEMATICAL SCRIPT CAPITAL O
+			case "Oscr":                            // MATHEMATICAL SCRIPT CAPITAL O
 				return rune(0x01d4aa), true
-			case "Oslash": 
-				// LATIN CAPITAL LETTER O WITH STROKE
+			case "Oslash":                          // LATIN CAPITAL LETTER O WITH STROKE
 				return rune(0xd8), true
-			case "Otilde": 
-				// LATIN CAPITAL LETTER O WITH TILDE
+			case "Otilde":                          // LATIN CAPITAL LETTER O WITH TILDE
 				return rune(0xd5), true
-			case "Otimes": 
-				// MULTIPLICATION SIGN IN DOUBLE CIRCLE
+			case "Otimes":                          // MULTIPLICATION SIGN IN DOUBLE CIRCLE
 				return rune(0x2a37), true
-			case "Ouml": 
-				// LATIN CAPITAL LETTER O WITH DIAERESIS
+			case "Ouml":                            // LATIN CAPITAL LETTER O WITH DIAERESIS
 				return rune(0xd6), true
-			case "OverBar": 
-				// OVERLINE
+			case "OverBar":                         // OVERLINE
 				return rune(0x203e), true
-			case "OverBrace": 
-				// TOP CURLY BRACKET
+			case "OverBrace":                       // TOP CURLY BRACKET
 				return rune(0x23de), true
-			case "OverBracket": 
-				// TOP SQUARE BRACKET
+			case "OverBracket":                     // TOP SQUARE BRACKET
 				return rune(0x23b4), true
-			case "OverParenthesis": 
-				// TOP PARENTHESIS
+			case "OverParenthesis":                 // TOP PARENTHESIS
 				return rune(0x23dc), true
 		}
 
 	case 'P':
 		switch name {
-			case "PHgr": 
-				// GREEK CAPITAL LETTER PHI
+			case "PHgr":                            // GREEK CAPITAL LETTER PHI
 				return rune(0x03a6), true
-			case "PSgr": 
-				// GREEK CAPITAL LETTER PSI
+			case "PSgr":                            // GREEK CAPITAL LETTER PSI
 				return rune(0x03a8), true
-			case "PartialD": 
-				// PARTIAL DIFFERENTIAL
+			case "PartialD":                        // PARTIAL DIFFERENTIAL
 				return rune(0x2202), true
-			case "Pcy": 
-				// CYRILLIC CAPITAL LETTER PE
+			case "Pcy":                             // CYRILLIC CAPITAL LETTER PE
 				return rune(0x041f), true
-			case "Pfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL P
+			case "Pfr":                             // MATHEMATICAL FRAKTUR CAPITAL P
 				return rune(0x01d513), true
-			case "Pgr": 
-				// GREEK CAPITAL LETTER PI
+			case "Pgr":                             // GREEK CAPITAL LETTER PI
 				return rune(0x03a0), true
-			case "Phi": 
-				// GREEK CAPITAL LETTER PHI
+			case "Phi":                             // GREEK CAPITAL LETTER PHI
 				return rune(0x03a6), true
-			case "Pi": 
-				// GREEK CAPITAL LETTER PI
+			case "Pi":                              // GREEK CAPITAL LETTER PI
 				return rune(0x03a0), true
-			case "PlusMinus": 
-				// PLUS-MINUS SIGN
+			case "PlusMinus":                       // PLUS-MINUS SIGN
 				return rune(0xb1), true
-			case "Poincareplane": 
-				// BLACK-LETTER CAPITAL H
+			case "Poincareplane":                   // BLACK-LETTER CAPITAL H
 				return rune(0x210c), true
-			case "Popf": 
-				// DOUBLE-STRUCK CAPITAL P
+			case "Popf":                            // DOUBLE-STRUCK CAPITAL P
 				return rune(0x2119), true
-			case "Product": 
-				// N-ARY PRODUCT
-				return rune(0x220f), true
-			case "Proportional": 
-				// PROPORTIONAL TO
-				return rune(0x221d), true
-			case "Proportion": 
-				// PROPORTION
-				return rune(0x2237), true
-			case "Pr": 
-				// DOUBLE PRECEDES
+			case "Pr":                              // DOUBLE PRECEDES
 				return rune(0x2abb), true
-			case "PrecedesEqual": 
-				// PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
-				return rune(0x2aaf), true
-			case "Precedes": 
-				// PRECEDES
+			case "Precedes":                        // PRECEDES
 				return rune(0x227a), true
-			case "PrecedesSlantEqual": 
-				// PRECEDES OR EQUAL TO
+			case "PrecedesEqual":                   // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+				return rune(0x2aaf), true
+			case "PrecedesSlantEqual":              // PRECEDES OR EQUAL TO
 				return rune(0x227c), true
-			case "PrecedesTilde": 
-				// PRECEDES OR EQUIVALENT TO
+			case "PrecedesTilde":                   // PRECEDES OR EQUIVALENT TO
 				return rune(0x227e), true
-			case "Prime": 
-				// DOUBLE PRIME
+			case "Prime":                           // DOUBLE PRIME
 				return rune(0x2033), true
-			case "Pscr": 
-				// MATHEMATICAL SCRIPT CAPITAL P
+			case "Product":                         // N-ARY PRODUCT
+				return rune(0x220f), true
+			case "Proportion":                      // PROPORTION
+				return rune(0x2237), true
+			case "Proportional":                    // PROPORTIONAL TO
+				return rune(0x221d), true
+			case "Pscr":                            // MATHEMATICAL SCRIPT CAPITAL P
 				return rune(0x01d4ab), true
-			case "Psi": 
-				// GREEK CAPITAL LETTER PSI
+			case "Psi":                             // GREEK CAPITAL LETTER PSI
 				return rune(0x03a8), true
 		}
 
 	case 'Q':
 		switch name {
-			case "QUOT": 
-				// QUOTATION MARK
+			case "QUOT":                            // QUOTATION MARK
 				return rune(0x22), true
-			case "Qfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL Q
+			case "Qfr":                             // MATHEMATICAL FRAKTUR CAPITAL Q
 				return rune(0x01d514), true
-			case "Qopf": 
-				// DOUBLE-STRUCK CAPITAL Q
+			case "Qopf":                            // DOUBLE-STRUCK CAPITAL Q
 				return rune(0x211a), true
-			case "Qscr": 
-				// MATHEMATICAL SCRIPT CAPITAL Q
+			case "Qscr":                            // MATHEMATICAL SCRIPT CAPITAL Q
 				return rune(0x01d4ac), true
 		}
 
 	case 'R':
 		switch name {
-			case "RBarr": 
-				// RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+			case "RBarr":                           // RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
 				return rune(0x2910), true
-			case "REG": 
-				// REGISTERED SIGN
+			case "REG":                             // REGISTERED SIGN
 				return rune(0xae), true
-			case "Racute": 
-				// LATIN CAPITAL LETTER R WITH ACUTE
+			case "Racute":                          // LATIN CAPITAL LETTER R WITH ACUTE
 				return rune(0x0154), true
-			case "Rang": 
-				// MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+			case "Rang":                            // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
 				return rune(0x27eb), true
-			case "Rarr": 
-				// RIGHTWARDS TWO HEADED ARROW
+			case "Rarr":                            // RIGHTWARDS TWO HEADED ARROW
 				return rune(0x21a0), true
-			case "Rarrtl": 
-				// RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+			case "Rarrtl":                          // RIGHTWARDS TWO-HEADED ARROW WITH TAIL
 				return rune(0x2916), true
-			case "Rcaron": 
-				// LATIN CAPITAL LETTER R WITH CARON
+			case "Rcaron":                          // LATIN CAPITAL LETTER R WITH CARON
 				return rune(0x0158), true
-			case "Rcedil": 
-				// LATIN CAPITAL LETTER R WITH CEDILLA
+			case "Rcedil":                          // LATIN CAPITAL LETTER R WITH CEDILLA
 				return rune(0x0156), true
-			case "Rcy": 
-				// CYRILLIC CAPITAL LETTER ER
+			case "Rcy":                             // CYRILLIC CAPITAL LETTER ER
 				return rune(0x0420), true
-			case "ReverseElement": 
-				// CONTAINS AS MEMBER
+			case "Re":                              // BLACK-LETTER CAPITAL R
+				return rune(0x211c), true
+			case "ReverseElement":                  // CONTAINS AS MEMBER
 				return rune(0x220b), true
-			case "ReverseEquilibrium": 
-				// LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+			case "ReverseEquilibrium":              // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
 				return rune(0x21cb), true
-			case "Re": 
-				// BLACK-LETTER CAPITAL R
-				return rune(0x211c), true
-			case "ReverseUpEquilibrium": 
-				// DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+			case "ReverseUpEquilibrium":            // DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
 				return rune(0x296f), true
-			case "Rfr": 
-				// BLACK-LETTER CAPITAL R
+			case "Rfr":                             // BLACK-LETTER CAPITAL R
 				return rune(0x211c), true
-			case "Rgr": 
-				// GREEK CAPITAL LETTER RHO
+			case "Rgr":                             // GREEK CAPITAL LETTER RHO
 				return rune(0x03a1), true
-			case "Rho": 
-				// GREEK CAPITAL LETTER RHO
+			case "Rho":                             // GREEK CAPITAL LETTER RHO
 				return rune(0x03a1), true
-			case "RightAngleBracket": 
-				// MATHEMATICAL RIGHT ANGLE BRACKET
+			case "RightAngleBracket":               // MATHEMATICAL RIGHT ANGLE BRACKET
 				return rune(0x27e9), true
-			case "RightArrowBar": 
-				// RIGHTWARDS ARROW TO BAR
-				return rune(0x21e5), true
-			case "RightArrow": 
-				// RIGHTWARDS ARROW
+			case "RightArrow":                      // RIGHTWARDS ARROW
 				return rune(0x2192), true
-			case "RightArrowLeftArrow": 
-				// RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+			case "RightArrowBar":                   // RIGHTWARDS ARROW TO BAR
+				return rune(0x21e5), true
+			case "RightArrowLeftArrow":             // RIGHTWARDS ARROW OVER LEFTWARDS ARROW
 				return rune(0x21c4), true
-			case "RightCeiling": 
-				// RIGHT CEILING
+			case "RightCeiling":                    // RIGHT CEILING
 				return rune(0x2309), true
-			case "RightDoubleBracket": 
-				// MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+			case "RightDoubleBracket":              // MATHEMATICAL RIGHT WHITE SQUARE BRACKET
 				return rune(0x27e7), true
-			case "RightDownTeeVector": 
-				// DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+			case "RightDownTeeVector":              // DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
 				return rune(0x295d), true
-			case "RightDownVector": 
-				// DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+			case "RightDownVector":                 // DOWNWARDS HARPOON WITH BARB RIGHTWARDS
 				return rune(0x21c2), true
-			case "RightDownVectorBar": 
-				// DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+			case "RightDownVectorBar":              // DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
 				return rune(0x2955), true
-			case "RightFloor": 
-				// RIGHT FLOOR
+			case "RightFloor":                      // RIGHT FLOOR
 				return rune(0x230b), true
-			case "RightTeeArrow": 
-				// RIGHTWARDS ARROW FROM BAR
+			case "RightTee":                        // RIGHT TACK
+				return rune(0x22a2), true
+			case "RightTeeArrow":                   // RIGHTWARDS ARROW FROM BAR
 				return rune(0x21a6), true
-			case "RightTeeVector": 
-				// RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+			case "RightTeeVector":                  // RIGHTWARDS HARPOON WITH BARB UP FROM BAR
 				return rune(0x295b), true
-			case "RightTee": 
-				// RIGHT TACK
-				return rune(0x22a2), true
-			case "RightTriangleBar": 
-				// VERTICAL BAR BESIDE RIGHT TRIANGLE
-				return rune(0x29d0), true
-			case "RightTriangle": 
-				// CONTAINS AS NORMAL SUBGROUP
+			case "RightTriangle":                   // CONTAINS AS NORMAL SUBGROUP
 				return rune(0x22b3), true
-			case "RightTriangleEqual": 
-				// CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+			case "RightTriangleBar":                // VERTICAL BAR BESIDE RIGHT TRIANGLE
+				return rune(0x29d0), true
+			case "RightTriangleEqual":              // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
 				return rune(0x22b5), true
-			case "RightUpDownVector": 
-				// UP BARB RIGHT DOWN BARB RIGHT HARPOON
+			case "RightUpDownVector":               // UP BARB RIGHT DOWN BARB RIGHT HARPOON
 				return rune(0x294f), true
-			case "RightUpTeeVector": 
-				// UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+			case "RightUpTeeVector":                // UPWARDS HARPOON WITH BARB RIGHT FROM BAR
 				return rune(0x295c), true
-			case "RightUpVector": 
-				// UPWARDS HARPOON WITH BARB RIGHTWARDS
+			case "RightUpVector":                   // UPWARDS HARPOON WITH BARB RIGHTWARDS
 				return rune(0x21be), true
-			case "RightUpVectorBar": 
-				// UPWARDS HARPOON WITH BARB RIGHT TO BAR
+			case "RightUpVectorBar":                // UPWARDS HARPOON WITH BARB RIGHT TO BAR
 				return rune(0x2954), true
-			case "RightVector": 
-				// RIGHTWARDS HARPOON WITH BARB UPWARDS
+			case "RightVector":                     // RIGHTWARDS HARPOON WITH BARB UPWARDS
 				return rune(0x21c0), true
-			case "RightVectorBar": 
-				// RIGHTWARDS HARPOON WITH BARB UP TO BAR
+			case "RightVectorBar":                  // RIGHTWARDS HARPOON WITH BARB UP TO BAR
 				return rune(0x2953), true
-			case "Rightarrow": 
-				// RIGHTWARDS DOUBLE ARROW
+			case "Rightarrow":                      // RIGHTWARDS DOUBLE ARROW
 				return rune(0x21d2), true
-			case "Ropf": 
-				// DOUBLE-STRUCK CAPITAL R
+			case "Ropf":                            // DOUBLE-STRUCK CAPITAL R
 				return rune(0x211d), true
-			case "RoundImplies": 
-				// RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+			case "RoundImplies":                    // RIGHT DOUBLE ARROW WITH ROUNDED HEAD
 				return rune(0x2970), true
-			case "Rrightarrow": 
-				// RIGHTWARDS TRIPLE ARROW
+			case "Rrightarrow":                     // RIGHTWARDS TRIPLE ARROW
 				return rune(0x21db), true
-			case "Rscr": 
-				// SCRIPT CAPITAL R
+			case "Rscr":                            // SCRIPT CAPITAL R
 				return rune(0x211b), true
-			case "Rsh": 
-				// UPWARDS ARROW WITH TIP RIGHTWARDS
+			case "Rsh":                             // UPWARDS ARROW WITH TIP RIGHTWARDS
 				return rune(0x21b1), true
-			case "RuleDelayed": 
-				// RULE-DELAYED
+			case "RuleDelayed":                     // RULE-DELAYED
 				return rune(0x29f4), true
 		}
 
 	case 'S':
 		switch name {
-			case "SHCHcy": 
-				// CYRILLIC CAPITAL LETTER SHCHA
+			case "SHCHcy":                          // CYRILLIC CAPITAL LETTER SHCHA
 				return rune(0x0429), true
-			case "SHcy": 
-				// CYRILLIC CAPITAL LETTER SHA
+			case "SHcy":                            // CYRILLIC CAPITAL LETTER SHA
 				return rune(0x0428), true
-			case "SOFTcy": 
-				// CYRILLIC CAPITAL LETTER SOFT SIGN
+			case "SOFTcy":                          // CYRILLIC CAPITAL LETTER SOFT SIGN
 				return rune(0x042c), true
-			case "Sacute": 
-				// LATIN CAPITAL LETTER S WITH ACUTE
+			case "Sacute":                          // LATIN CAPITAL LETTER S WITH ACUTE
 				return rune(0x015a), true
-			case "Sc": 
-				// DOUBLE SUCCEEDS
+			case "Sc":                              // DOUBLE SUCCEEDS
 				return rune(0x2abc), true
-			case "Scaron": 
-				// LATIN CAPITAL LETTER S WITH CARON
+			case "Scaron":                          // LATIN CAPITAL LETTER S WITH CARON
 				return rune(0x0160), true
-			case "Scedil": 
-				// LATIN CAPITAL LETTER S WITH CEDILLA
+			case "Scedil":                          // LATIN CAPITAL LETTER S WITH CEDILLA
 				return rune(0x015e), true
-			case "Scirc": 
-				// LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+			case "Scirc":                           // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
 				return rune(0x015c), true
-			case "Scy": 
-				// CYRILLIC CAPITAL LETTER ES
+			case "Scy":                             // CYRILLIC CAPITAL LETTER ES
 				return rune(0x0421), true
-			case "Sfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL S
+			case "Sfr":                             // MATHEMATICAL FRAKTUR CAPITAL S
 				return rune(0x01d516), true
-			case "Sgr": 
-				// GREEK CAPITAL LETTER SIGMA
+			case "Sgr":                             // GREEK CAPITAL LETTER SIGMA
 				return rune(0x03a3), true
-			case "ShortDownArrow": 
-				// DOWNWARDS ARROW
+			case "ShortDownArrow":                  // DOWNWARDS ARROW
 				return rune(0x2193), true
-			case "ShortLeftArrow": 
-				// LEFTWARDS ARROW
+			case "ShortLeftArrow":                  // LEFTWARDS ARROW
 				return rune(0x2190), true
-			case "ShortRightArrow": 
-				// RIGHTWARDS ARROW
+			case "ShortRightArrow":                 // RIGHTWARDS ARROW
 				return rune(0x2192), true
-			case "ShortUpArrow": 
-				// UPWARDS ARROW
+			case "ShortUpArrow":                    // UPWARDS ARROW
 				return rune(0x2191), true
-			case "Sigma": 
-				// GREEK CAPITAL LETTER SIGMA
+			case "Sigma":                           // GREEK CAPITAL LETTER SIGMA
 				return rune(0x03a3), true
-			case "SmallCircle": 
-				// RING OPERATOR
+			case "SmallCircle":                     // RING OPERATOR
 				return rune(0x2218), true
-			case "Sopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+			case "Sopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL S
 				return rune(0x01d54a), true
-			case "Sqrt": 
-				// SQUARE ROOT
+			case "Sqrt":                            // SQUARE ROOT
 				return rune(0x221a), true
-			case "SquareIntersection": 
-				// SQUARE CAP
+			case "Square":                          // WHITE SQUARE
+				return rune(0x25a1), true
+			case "SquareIntersection":              // SQUARE CAP
 				return rune(0x2293), true
-			case "SquareSubset": 
-				// SQUARE IMAGE OF
+			case "SquareSubset":                    // SQUARE IMAGE OF
 				return rune(0x228f), true
-			case "SquareSubsetEqual": 
-				// SQUARE IMAGE OF OR EQUAL TO
+			case "SquareSubsetEqual":               // SQUARE IMAGE OF OR EQUAL TO
 				return rune(0x2291), true
-			case "Square": 
-				// WHITE SQUARE
-				return rune(0x25a1), true
-			case "SquareSuperset": 
-				// SQUARE ORIGINAL OF
+			case "SquareSuperset":                  // SQUARE ORIGINAL OF
 				return rune(0x2290), true
-			case "SquareSupersetEqual": 
-				// SQUARE ORIGINAL OF OR EQUAL TO
+			case "SquareSupersetEqual":             // SQUARE ORIGINAL OF OR EQUAL TO
 				return rune(0x2292), true
-			case "SquareUnion": 
-				// SQUARE CUP
+			case "SquareUnion":                     // SQUARE CUP
 				return rune(0x2294), true
-			case "Sscr": 
-				// MATHEMATICAL SCRIPT CAPITAL S
+			case "Sscr":                            // MATHEMATICAL SCRIPT CAPITAL S
 				return rune(0x01d4ae), true
-			case "Star": 
-				// STAR OPERATOR
+			case "Star":                            // STAR OPERATOR
 				return rune(0x22c6), true
-			case "Sub": 
-				// DOUBLE SUBSET
+			case "Sub":                             // DOUBLE SUBSET
 				return rune(0x22d0), true
-			case "Subset": 
-				// DOUBLE SUBSET
+			case "Subset":                          // DOUBLE SUBSET
 				return rune(0x22d0), true
-			case "SubsetEqual": 
-				// SUBSET OF OR EQUAL TO
+			case "SubsetEqual":                     // SUBSET OF OR EQUAL TO
 				return rune(0x2286), true
-			case "Succeeds": 
-				// SUCCEEDS
+			case "Succeeds":                        // SUCCEEDS
 				return rune(0x227b), true
-			case "SucceedsEqual": 
-				// SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+			case "SucceedsEqual":                   // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
 				return rune(0x2ab0), true
-			case "SucceedsSlantEqual": 
-				// SUCCEEDS OR EQUAL TO
+			case "SucceedsSlantEqual":              // SUCCEEDS OR EQUAL TO
 				return rune(0x227d), true
-			case "SucceedsTilde": 
-				// SUCCEEDS OR EQUIVALENT TO
+			case "SucceedsTilde":                   // SUCCEEDS OR EQUIVALENT TO
 				return rune(0x227f), true
-			case "SuchThat": 
-				// CONTAINS AS MEMBER
+			case "SuchThat":                        // CONTAINS AS MEMBER
 				return rune(0x220b), true
-			case "Sum": 
-				// N-ARY SUMMATION
+			case "Sum":                             // N-ARY SUMMATION
 				return rune(0x2211), true
-			case "SupersetEqual": 
-				// SUPERSET OF OR EQUAL TO
-				return rune(0x2287), true
-			case "Sup": 
-				// DOUBLE SUPERSET
+			case "Sup":                             // DOUBLE SUPERSET
 				return rune(0x22d1), true
-			case "Superset": 
-				// SUPERSET OF
+			case "Superset":                        // SUPERSET OF
 				return rune(0x2283), true
-			case "Supset": 
-				// DOUBLE SUPERSET
+			case "SupersetEqual":                   // SUPERSET OF OR EQUAL TO
+				return rune(0x2287), true
+			case "Supset":                          // DOUBLE SUPERSET
 				return rune(0x22d1), true
 		}
 
 	case 'T':
 		switch name {
-			case "THORN": 
-				// LATIN CAPITAL LETTER THORN
+			case "THORN":                           // LATIN CAPITAL LETTER THORN
 				return rune(0xde), true
-			case "THgr": 
-				// GREEK CAPITAL LETTER THETA
+			case "THgr":                            // GREEK CAPITAL LETTER THETA
 				return rune(0x0398), true
-			case "TRADE": 
-				// TRADE MARK SIGN
+			case "TRADE":                           // TRADE MARK SIGN
 				return rune(0x2122), true
-			case "TSHcy": 
-				// CYRILLIC CAPITAL LETTER TSHE
+			case "TSHcy":                           // CYRILLIC CAPITAL LETTER TSHE
 				return rune(0x040b), true
-			case "TScy": 
-				// CYRILLIC CAPITAL LETTER TSE
+			case "TScy":                            // CYRILLIC CAPITAL LETTER TSE
 				return rune(0x0426), true
-			case "Tab": 
-				// CHARACTER TABULATION
+			case "Tab":                             // CHARACTER TABULATION
 				return rune(0x09), true
-			case "Tau": 
-				// GREEK CAPITAL LETTER TAU
+			case "Tau":                             // GREEK CAPITAL LETTER TAU
 				return rune(0x03a4), true
-			case "Tcaron": 
-				// LATIN CAPITAL LETTER T WITH CARON
+			case "Tcaron":                          // LATIN CAPITAL LETTER T WITH CARON
 				return rune(0x0164), true
-			case "Tcedil": 
-				// LATIN CAPITAL LETTER T WITH CEDILLA
+			case "Tcedil":                          // LATIN CAPITAL LETTER T WITH CEDILLA
 				return rune(0x0162), true
-			case "Tcy": 
-				// CYRILLIC CAPITAL LETTER TE
+			case "Tcy":                             // CYRILLIC CAPITAL LETTER TE
 				return rune(0x0422), true
-			case "Tfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL T
+			case "Tfr":                             // MATHEMATICAL FRAKTUR CAPITAL T
 				return rune(0x01d517), true
-			case "Tgr": 
-				// GREEK CAPITAL LETTER TAU
+			case "Tgr":                             // GREEK CAPITAL LETTER TAU
 				return rune(0x03a4), true
-			case "Therefore": 
-				// THEREFORE
+			case "Therefore":                       // THEREFORE
 				return rune(0x2234), true
-			case "Theta": 
-				// GREEK CAPITAL LETTER THETA
+			case "Theta":                           // GREEK CAPITAL LETTER THETA
 				return rune(0x0398), true
-			case "Thetav": 
-				// GREEK CAPITAL THETA SYMBOL
+			case "Thetav":                          // GREEK CAPITAL THETA SYMBOL
 				return rune(0x03f4), true
-			case "ThickSpace": 
-				// space of width 5/18 em
+			case "ThickSpace":                      // space of width 5/18 em
 				return rune(0x205f), true
-			case "ThinSpace": 
-				// THIN SPACE
+			case "ThinSpace":                       // THIN SPACE
 				return rune(0x2009), true
-			case "Tilde": 
-				// TILDE OPERATOR
+			case "Tilde":                           // TILDE OPERATOR
 				return rune(0x223c), true
-			case "TildeEqual": 
-				// ASYMPTOTICALLY EQUAL TO
+			case "TildeEqual":                      // ASYMPTOTICALLY EQUAL TO
 				return rune(0x2243), true
-			case "TildeFullEqual": 
-				// APPROXIMATELY EQUAL TO
+			case "TildeFullEqual":                  // APPROXIMATELY EQUAL TO
 				return rune(0x2245), true
-			case "TildeTilde": 
-				// ALMOST EQUAL TO
+			case "TildeTilde":                      // ALMOST EQUAL TO
 				return rune(0x2248), true
-			case "Topf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+			case "Topf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL T
 				return rune(0x01d54b), true
-			case "TripleDot": 
-				// COMBINING THREE DOTS ABOVE
+			case "TripleDot":                       // COMBINING THREE DOTS ABOVE
 				return rune(0x20db), true
-			case "Tscr": 
-				// MATHEMATICAL SCRIPT CAPITAL T
+			case "Tscr":                            // MATHEMATICAL SCRIPT CAPITAL T
 				return rune(0x01d4af), true
-			case "Tstrok": 
-				// LATIN CAPITAL LETTER T WITH STROKE
+			case "Tstrok":                          // LATIN CAPITAL LETTER T WITH STROKE
 				return rune(0x0166), true
 		}
 
 	case 'U':
 		switch name {
-			case "Uacgr": 
-				// GREEK CAPITAL LETTER UPSILON WITH TONOS
+			case "Uacgr":                           // GREEK CAPITAL LETTER UPSILON WITH TONOS
 				return rune(0x038e), true
-			case "Uacute": 
-				// LATIN CAPITAL LETTER U WITH ACUTE
+			case "Uacute":                          // LATIN CAPITAL LETTER U WITH ACUTE
 				return rune(0xda), true
-			case "Uarrocir": 
-				// UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
-				return rune(0x2949), true
-			case "Uarr": 
-				// UPWARDS TWO HEADED ARROW
+			case "Uarr":                            // UPWARDS TWO HEADED ARROW
 				return rune(0x219f), true
-			case "Ubrcy": 
-				// CYRILLIC CAPITAL LETTER SHORT U
+			case "Uarrocir":                        // UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+				return rune(0x2949), true
+			case "Ubrcy":                           // CYRILLIC CAPITAL LETTER SHORT U
 				return rune(0x040e), true
-			case "Ubreve": 
-				// LATIN CAPITAL LETTER U WITH BREVE
+			case "Ubreve":                          // LATIN CAPITAL LETTER U WITH BREVE
 				return rune(0x016c), true
-			case "Ucirc": 
-				// LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+			case "Ucirc":                           // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
 				return rune(0xdb), true
-			case "Ucy": 
-				// CYRILLIC CAPITAL LETTER U
+			case "Ucy":                             // CYRILLIC CAPITAL LETTER U
 				return rune(0x0423), true
-			case "Udblac": 
-				// LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+			case "Udblac":                          // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
 				return rune(0x0170), true
-			case "Udigr": 
-				// GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+			case "Udigr":                           // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
 				return rune(0x03ab), true
-			case "Ufr": 
-				// MATHEMATICAL FRAKTUR CAPITAL U
+			case "Ufr":                             // MATHEMATICAL FRAKTUR CAPITAL U
 				return rune(0x01d518), true
-			case "Ugrave": 
-				// LATIN CAPITAL LETTER U WITH GRAVE
-				return rune(0xd9), true
-			case "Ugr": 
-				// GREEK CAPITAL LETTER UPSILON
+			case "Ugr":                             // GREEK CAPITAL LETTER UPSILON
 				return rune(0x03a5), true
-			case "Umacr": 
-				// LATIN CAPITAL LETTER U WITH MACRON
+			case "Ugrave":                          // LATIN CAPITAL LETTER U WITH GRAVE
+				return rune(0xd9), true
+			case "Umacr":                           // LATIN CAPITAL LETTER U WITH MACRON
 				return rune(0x016a), true
-			case "UnderBar": 
-				// LOW LINE
+			case "UnderBar":                        // LOW LINE
 				return rune(0x5f), true
-			case "UnderBrace": 
-				// BOTTOM CURLY BRACKET
+			case "UnderBrace":                      // BOTTOM CURLY BRACKET
 				return rune(0x23df), true
-			case "UnderBracket": 
-				// BOTTOM SQUARE BRACKET
+			case "UnderBracket":                    // BOTTOM SQUARE BRACKET
 				return rune(0x23b5), true
-			case "UnderParenthesis": 
-				// BOTTOM PARENTHESIS
+			case "UnderParenthesis":                // BOTTOM PARENTHESIS
 				return rune(0x23dd), true
-			case "Union": 
-				// N-ARY UNION
+			case "Union":                           // N-ARY UNION
 				return rune(0x22c3), true
-			case "UnionPlus": 
-				// MULTISET UNION
+			case "UnionPlus":                       // MULTISET UNION
 				return rune(0x228e), true
-			case "Uogon": 
-				// LATIN CAPITAL LETTER U WITH OGONEK
+			case "Uogon":                           // LATIN CAPITAL LETTER U WITH OGONEK
 				return rune(0x0172), true
-			case "Uopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+			case "Uopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL U
 				return rune(0x01d54c), true
-			case "UpArrow": 
-				// UPWARDS ARROW
+			case "UpArrow":                         // UPWARDS ARROW
 				return rune(0x2191), true
-			case "UpArrowBar": 
-				// UPWARDS ARROW TO BAR
+			case "UpArrowBar":                      // UPWARDS ARROW TO BAR
 				return rune(0x2912), true
-			case "UpArrowDownArrow": 
-				// UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+			case "UpArrowDownArrow":                // UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
 				return rune(0x21c5), true
-			case "UpDownArrow": 
-				// UP DOWN ARROW
+			case "UpDownArrow":                     // UP DOWN ARROW
 				return rune(0x2195), true
-			case "UpEquilibrium": 
-				// UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+			case "UpEquilibrium":                   // UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
 				return rune(0x296e), true
-			case "UpTee": 
-				// UP TACK
+			case "UpTee":                           // UP TACK
 				return rune(0x22a5), true
-			case "UpTeeArrow": 
-				// UPWARDS ARROW FROM BAR
+			case "UpTeeArrow":                      // UPWARDS ARROW FROM BAR
 				return rune(0x21a5), true
-			case "Uparrow": 
-				// UPWARDS DOUBLE ARROW
+			case "Uparrow":                         // UPWARDS DOUBLE ARROW
 				return rune(0x21d1), true
-			case "Updownarrow": 
-				// UP DOWN DOUBLE ARROW
+			case "Updownarrow":                     // UP DOWN DOUBLE ARROW
 				return rune(0x21d5), true
-			case "UpperLeftArrow": 
-				// NORTH WEST ARROW
+			case "UpperLeftArrow":                  // NORTH WEST ARROW
 				return rune(0x2196), true
-			case "UpperRightArrow": 
-				// NORTH EAST ARROW
+			case "UpperRightArrow":                 // NORTH EAST ARROW
 				return rune(0x2197), true
-			case "Upsilon": 
-				// GREEK CAPITAL LETTER UPSILON
-				return rune(0x03a5), true
-			case "Upsi": 
-				// GREEK UPSILON WITH HOOK SYMBOL
+			case "Upsi":                            // GREEK UPSILON WITH HOOK SYMBOL
 				return rune(0x03d2), true
-			case "Uring": 
-				// LATIN CAPITAL LETTER U WITH RING ABOVE
+			case "Upsilon":                         // GREEK CAPITAL LETTER UPSILON
+				return rune(0x03a5), true
+			case "Uring":                           // LATIN CAPITAL LETTER U WITH RING ABOVE
 				return rune(0x016e), true
-			case "Uscr": 
-				// MATHEMATICAL SCRIPT CAPITAL U
+			case "Uscr":                            // MATHEMATICAL SCRIPT CAPITAL U
 				return rune(0x01d4b0), true
-			case "Utilde": 
-				// LATIN CAPITAL LETTER U WITH TILDE
+			case "Utilde":                          // LATIN CAPITAL LETTER U WITH TILDE
 				return rune(0x0168), true
-			case "Uuml": 
-				// LATIN CAPITAL LETTER U WITH DIAERESIS
+			case "Uuml":                            // LATIN CAPITAL LETTER U WITH DIAERESIS
 				return rune(0xdc), true
 		}
 
 	case 'V':
 		switch name {
-			case "VDash": 
-				// DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+			case "VDash":                           // DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
 				return rune(0x22ab), true
-			case "Vbar": 
-				// DOUBLE UP TACK
+			case "Vbar":                            // DOUBLE UP TACK
 				return rune(0x2aeb), true
-			case "Vcy": 
-				// CYRILLIC CAPITAL LETTER VE
+			case "Vcy":                             // CYRILLIC CAPITAL LETTER VE
 				return rune(0x0412), true
-			case "Vdashl": 
-				// LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
-				return rune(0x2ae6), true
-			case "Vdash": 
-				// FORCES
+			case "Vdash":                           // FORCES
 				return rune(0x22a9), true
-			case "Vee": 
-				// N-ARY LOGICAL OR
+			case "Vdashl":                          // LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+				return rune(0x2ae6), true
+			case "Vee":                             // N-ARY LOGICAL OR
 				return rune(0x22c1), true
-			case "Verbar": 
-				// DOUBLE VERTICAL LINE
+			case "Verbar":                          // DOUBLE VERTICAL LINE
 				return rune(0x2016), true
-			case "Vert": 
-				// DOUBLE VERTICAL LINE
+			case "Vert":                            // DOUBLE VERTICAL LINE
 				return rune(0x2016), true
-			case "VerticalBar": 
-				// DIVIDES
+			case "VerticalBar":                     // DIVIDES
 				return rune(0x2223), true
-			case "VerticalLine": 
-				// VERTICAL LINE
+			case "VerticalLine":                    // VERTICAL LINE
 				return rune(0x7c), true
-			case "VerticalSeparator": 
-				// LIGHT VERTICAL BAR
+			case "VerticalSeparator":               // LIGHT VERTICAL BAR
 				return rune(0x2758), true
-			case "VerticalTilde": 
-				// WREATH PRODUCT
+			case "VerticalTilde":                   // WREATH PRODUCT
 				return rune(0x2240), true
-			case "VeryThinSpace": 
-				// HAIR SPACE
+			case "VeryThinSpace":                   // HAIR SPACE
 				return rune(0x200a), true
-			case "Vfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL V
+			case "Vfr":                             // MATHEMATICAL FRAKTUR CAPITAL V
 				return rune(0x01d519), true
-			case "Vopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+			case "Vopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL V
 				return rune(0x01d54d), true
-			case "Vscr": 
-				// MATHEMATICAL SCRIPT CAPITAL V
+			case "Vscr":                            // MATHEMATICAL SCRIPT CAPITAL V
 				return rune(0x01d4b1), true
-			case "Vvdash": 
-				// TRIPLE VERTICAL BAR RIGHT TURNSTILE
+			case "Vvdash":                          // TRIPLE VERTICAL BAR RIGHT TURNSTILE
 				return rune(0x22aa), true
 		}
 
 	case 'W':
 		switch name {
-			case "Wcirc": 
-				// LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+			case "Wcirc":                           // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
 				return rune(0x0174), true
-			case "Wedge": 
-				// N-ARY LOGICAL AND
+			case "Wedge":                           // N-ARY LOGICAL AND
 				return rune(0x22c0), true
-			case "Wfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL W
+			case "Wfr":                             // MATHEMATICAL FRAKTUR CAPITAL W
 				return rune(0x01d51a), true
-			case "Wopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+			case "Wopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL W
 				return rune(0x01d54e), true
-			case "Wscr": 
-				// MATHEMATICAL SCRIPT CAPITAL W
+			case "Wscr":                            // MATHEMATICAL SCRIPT CAPITAL W
 				return rune(0x01d4b2), true
 		}
 
 	case 'X':
 		switch name {
-			case "Xfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL X
+			case "Xfr":                             // MATHEMATICAL FRAKTUR CAPITAL X
 				return rune(0x01d51b), true
-			case "Xgr": 
-				// GREEK CAPITAL LETTER XI
+			case "Xgr":                             // GREEK CAPITAL LETTER XI
 				return rune(0x039e), true
-			case "Xi": 
-				// GREEK CAPITAL LETTER XI
+			case "Xi":                              // GREEK CAPITAL LETTER XI
 				return rune(0x039e), true
-			case "Xopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+			case "Xopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL X
 				return rune(0x01d54f), true
-			case "Xscr": 
-				// MATHEMATICAL SCRIPT CAPITAL X
+			case "Xscr":                            // MATHEMATICAL SCRIPT CAPITAL X
 				return rune(0x01d4b3), true
 		}
 
 	case 'Y':
 		switch name {
-			case "YAcy": 
-				// CYRILLIC CAPITAL LETTER YA
+			case "YAcy":                            // CYRILLIC CAPITAL LETTER YA
 				return rune(0x042f), true
-			case "YIcy": 
-				// CYRILLIC CAPITAL LETTER YI
+			case "YIcy":                            // CYRILLIC CAPITAL LETTER YI
 				return rune(0x0407), true
-			case "YUcy": 
-				// CYRILLIC CAPITAL LETTER YU
+			case "YUcy":                            // CYRILLIC CAPITAL LETTER YU
 				return rune(0x042e), true
-			case "Yacute": 
-				// LATIN CAPITAL LETTER Y WITH ACUTE
+			case "Yacute":                          // LATIN CAPITAL LETTER Y WITH ACUTE
 				return rune(0xdd), true
-			case "Ycirc": 
-				// LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+			case "Ycirc":                           // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
 				return rune(0x0176), true
-			case "Ycy": 
-				// CYRILLIC CAPITAL LETTER YERU
+			case "Ycy":                             // CYRILLIC CAPITAL LETTER YERU
 				return rune(0x042b), true
-			case "Yfr": 
-				// MATHEMATICAL FRAKTUR CAPITAL Y
+			case "Yfr":                             // MATHEMATICAL FRAKTUR CAPITAL Y
 				return rune(0x01d51c), true
-			case "Yopf": 
-				// MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+			case "Yopf":                            // MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
 				return rune(0x01d550), true
-			case "Yscr": 
-				// MATHEMATICAL SCRIPT CAPITAL Y
+			case "Yscr":                            // MATHEMATICAL SCRIPT CAPITAL Y
 				return rune(0x01d4b4), true
-			case "Yuml": 
-				// LATIN CAPITAL LETTER Y WITH DIAERESIS
+			case "Yuml":                            // LATIN CAPITAL LETTER Y WITH DIAERESIS
 				return rune(0x0178), true
 		}
 
 	case 'Z':
 		switch name {
-			case "ZHcy": 
-				// CYRILLIC CAPITAL LETTER ZHE
+			case "ZHcy":                            // CYRILLIC CAPITAL LETTER ZHE
 				return rune(0x0416), true
-			case "Zacute": 
-				// LATIN CAPITAL LETTER Z WITH ACUTE
+			case "Zacute":                          // LATIN CAPITAL LETTER Z WITH ACUTE
 				return rune(0x0179), true
-			case "Zcaron": 
-				// LATIN CAPITAL LETTER Z WITH CARON
+			case "Zcaron":                          // LATIN CAPITAL LETTER Z WITH CARON
 				return rune(0x017d), true
-			case "Zcy": 
-				// CYRILLIC CAPITAL LETTER ZE
+			case "Zcy":                             // CYRILLIC CAPITAL LETTER ZE
 				return rune(0x0417), true
-			case "Zdot": 
-				// LATIN CAPITAL LETTER Z WITH DOT ABOVE
+			case "Zdot":                            // LATIN CAPITAL LETTER Z WITH DOT ABOVE
 				return rune(0x017b), true
-			case "ZeroWidthSpace": 
-				// ZERO WIDTH SPACE
+			case "ZeroWidthSpace":                  // ZERO WIDTH SPACE
 				return rune(0x200b), true
-			case "Zeta": 
-				// GREEK CAPITAL LETTER ZETA
+			case "Zeta":                            // GREEK CAPITAL LETTER ZETA
 				return rune(0x0396), true
-			case "Zfr": 
-				// BLACK-LETTER CAPITAL Z
+			case "Zfr":                             // BLACK-LETTER CAPITAL Z
 				return rune(0x2128), true
-			case "Zgr": 
-				// GREEK CAPITAL LETTER ZETA
+			case "Zgr":                             // GREEK CAPITAL LETTER ZETA
 				return rune(0x0396), true
-			case "Zopf": 
-				// DOUBLE-STRUCK CAPITAL Z
+			case "Zopf":                            // DOUBLE-STRUCK CAPITAL Z
 				return rune(0x2124), true
-			case "Zscr": 
-				// MATHEMATICAL SCRIPT CAPITAL Z
+			case "Zscr":                            // MATHEMATICAL SCRIPT CAPITAL Z
 				return rune(0x01d4b5), true
 		}
 
 	case 'a':
 		switch name {
-			case "aacgr": 
-				// GREEK SMALL LETTER ALPHA WITH TONOS
+			case "aacgr":                           // GREEK SMALL LETTER ALPHA WITH TONOS
 				return rune(0x03ac), true
-			case "aacute": 
-				// LATIN SMALL LETTER A WITH ACUTE
+			case "aacute":                          // LATIN SMALL LETTER A WITH ACUTE
 				return rune(0xe1), true
-			case "abreve": 
-				// LATIN SMALL LETTER A WITH BREVE
+			case "abreve":                          // LATIN SMALL LETTER A WITH BREVE
 				return rune(0x0103), true
-			case "acE": 
-				// INVERTED LAZY S with double underline
+			case "ac":                              // INVERTED LAZY S
 				return rune(0x223e), true
-			case "acd": 
-				// SINE WAVE
-				return rune(0x223f), true
-			case "acute": 
-				// ACUTE ACCENT
-				return rune(0xb4), true
-			case "ac": 
-				// INVERTED LAZY S
+			case "acE":                             // INVERTED LAZY S with double underline
 				return rune(0x223e), true
-			case "acirc": 
-				// LATIN SMALL LETTER A WITH CIRCUMFLEX
+			case "acd":                             // SINE WAVE
+				return rune(0x223f), true
+			case "acirc":                           // LATIN SMALL LETTER A WITH CIRCUMFLEX
 				return rune(0xe2), true
-			case "actuary": 
-				// COMBINING ANNUITY SYMBOL
+			case "actuary":                         // COMBINING ANNUITY SYMBOL
 				return rune(0x20e7), true
-			case "acy": 
-				// CYRILLIC SMALL LETTER A
+			case "acute":                           // ACUTE ACCENT
+				return rune(0xb4), true
+			case "acy":                             // CYRILLIC SMALL LETTER A
 				return rune(0x0430), true
-			case "aelig": 
-				// LATIN SMALL LETTER AE
+			case "aelig":                           // LATIN SMALL LETTER AE
 				return rune(0xe6), true
-			case "af": 
-				// FUNCTION APPLICATION
+			case "af":                              // FUNCTION APPLICATION
 				return rune(0x2061), true
-			case "afr": 
-				// MATHEMATICAL FRAKTUR SMALL A
+			case "afr":                             // MATHEMATICAL FRAKTUR SMALL A
 				return rune(0x01d51e), true
-			case "agr": 
-				// GREEK SMALL LETTER ALPHA
+			case "agr":                             // GREEK SMALL LETTER ALPHA
 				return rune(0x03b1), true
-			case "agrave": 
-				// LATIN SMALL LETTER A WITH GRAVE
+			case "agrave":                          // LATIN SMALL LETTER A WITH GRAVE
 				return rune(0xe0), true
-			case "alefsym": 
-				// ALEF SYMBOL
+			case "alefsym":                         // ALEF SYMBOL
 				return rune(0x2135), true
-			case "aleph": 
-				// ALEF SYMBOL
+			case "aleph":                           // ALEF SYMBOL
 				return rune(0x2135), true
-			case "alpha": 
-				// GREEK SMALL LETTER ALPHA
+			case "alpha":                           // GREEK SMALL LETTER ALPHA
 				return rune(0x03b1), true
-			case "amacr": 
-				// LATIN SMALL LETTER A WITH MACRON
+			case "amacr":                           // LATIN SMALL LETTER A WITH MACRON
 				return rune(0x0101), true
-			case "amalg": 
-				// AMALGAMATION OR COPRODUCT
+			case "amalg":                           // AMALGAMATION OR COPRODUCT
 				return rune(0x2a3f), true
-			case "amp": 
-				// AMPERSAND
+			case "amp":                             // AMPERSAND
 				return rune(0x26), true
-			case "andand": 
-				// TWO INTERSECTING LOGICAL AND
+			case "and":                             // LOGICAL AND
+				return rune(0x2227), true
+			case "andand":                          // TWO INTERSECTING LOGICAL AND
 				return rune(0x2a55), true
-			case "andd": 
-				// LOGICAL AND WITH HORIZONTAL DASH
+			case "andd":                            // LOGICAL AND WITH HORIZONTAL DASH
 				return rune(0x2a5c), true
-			case "andslope": 
-				// SLOPING LARGE AND
+			case "andslope":                        // SLOPING LARGE AND
 				return rune(0x2a58), true
-			case "andv": 
-				// LOGICAL AND WITH MIDDLE STEM
+			case "andv":                            // LOGICAL AND WITH MIDDLE STEM
 				return rune(0x2a5a), true
-			case "and": 
-				// LOGICAL AND
-				return rune(0x2227), true
-			case "angdnl": 
-				// TURNED ANGLE
+			case "ang":                             // ANGLE
+				return rune(0x2220), true
+			case "ang90":                           // RIGHT ANGLE
+				return rune(0x221f), true
+			case "angdnl":                          // TURNED ANGLE
 				return rune(0x29a2), true
-			case "angdnr": 
-				// ACUTE ANGLE
+			case "angdnr":                          // ACUTE ANGLE
 				return rune(0x299f), true
-			case "ange": 
-				// ANGLE WITH UNDERBAR
+			case "ange":                            // ANGLE WITH UNDERBAR
 				return rune(0x29a4), true
-			case "angles": 
-				// ANGLE WITH S INSIDE
-				return rune(0x299e), true
-			case "angle": 
-				// ANGLE
+			case "angle":                           // ANGLE
 				return rune(0x2220), true
-			case "angmsdaa": 
-				// MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+			case "angles":                          // ANGLE WITH S INSIDE
+				return rune(0x299e), true
+			case "angmsd":                          // MEASURED ANGLE
+				return rune(0x2221), true
+			case "angmsdaa":                        // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
 				return rune(0x29a8), true
-			case "angmsdab": 
-				// MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+			case "angmsdab":                        // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
 				return rune(0x29a9), true
-			case "angmsdac": 
-				// MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+			case "angmsdac":                        // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
 				return rune(0x29aa), true
-			case "angmsdad": 
-				// MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+			case "angmsdad":                        // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
 				return rune(0x29ab), true
-			case "angmsdae": 
-				// MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+			case "angmsdae":                        // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
 				return rune(0x29ac), true
-			case "angmsdaf": 
-				// MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+			case "angmsdaf":                        // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
 				return rune(0x29ad), true
-			case "angmsdag": 
-				// MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+			case "angmsdag":                        // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
 				return rune(0x29ae), true
-			case "angmsdah": 
-				// MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+			case "angmsdah":                        // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
 				return rune(0x29af), true
-			case "angmsd": 
-				// MEASURED ANGLE
-				return rune(0x2221), true
-			case "angrtvbd": 
-				// MEASURED RIGHT ANGLE WITH DOT
-				return rune(0x299d), true
-			case "angrtvb": 
-				// RIGHT ANGLE WITH ARC
+			case "angrt":                           // RIGHT ANGLE
+				return rune(0x221f), true
+			case "angrtvb":                         // RIGHT ANGLE WITH ARC
 				return rune(0x22be), true
-			case "angsph": 
-				// SPHERICAL ANGLE
+			case "angrtvbd":                        // MEASURED RIGHT ANGLE WITH DOT
+				return rune(0x299d), true
+			case "angsph":                          // SPHERICAL ANGLE
 				return rune(0x2222), true
-			case "angst": 
-				// LATIN CAPITAL LETTER A WITH RING ABOVE
+			case "angst":                           // LATIN CAPITAL LETTER A WITH RING ABOVE
 				return rune(0xc5), true
-			case "angupl": 
-				// REVERSED ANGLE
+			case "angupl":                          // REVERSED ANGLE
 				return rune(0x29a3), true
-			case "angzarr": 
-				// RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+			case "angzarr":                         // RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
 				return rune(0x237c), true
-			case "ang": 
-				// ANGLE
-				return rune(0x2220), true
-			case "ang90": 
-				// RIGHT ANGLE
-				return rune(0x221f), true
-			case "angrt": 
-				// RIGHT ANGLE
-				return rune(0x221f), true
-			case "aogon": 
-				// LATIN SMALL LETTER A WITH OGONEK
+			case "aogon":                           // LATIN SMALL LETTER A WITH OGONEK
 				return rune(0x0105), true
-			case "aopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL A
+			case "aopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL A
 				return rune(0x01d552), true
-			case "apE": 
-				// APPROXIMATELY EQUAL OR EQUAL TO
+			case "ap":                              // ALMOST EQUAL TO
+				return rune(0x2248), true
+			case "apE":                             // APPROXIMATELY EQUAL OR EQUAL TO
 				return rune(0x2a70), true
-			case "apacir": 
-				// ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+			case "apacir":                          // ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
 				return rune(0x2a6f), true
-			case "ape": 
-				// ALMOST EQUAL OR EQUAL TO
+			case "ape":                             // ALMOST EQUAL OR EQUAL TO
 				return rune(0x224a), true
-			case "apid": 
-				// TRIPLE TILDE
+			case "apid":                            // TRIPLE TILDE
 				return rune(0x224b), true
-			case "approxeq": 
-				// ALMOST EQUAL OR EQUAL TO
-				return rune(0x224a), true
-			case "approx": 
-				// ALMOST EQUAL TO
-				return rune(0x2248), true
-			case "ap": 
-				// ALMOST EQUAL TO
-				return rune(0x2248), true
-			case "apos": 
-				// APOSTROPHE
+			case "apos":                            // APOSTROPHE
 				return rune(0x27), true
-			case "aring": 
-				// LATIN SMALL LETTER A WITH RING ABOVE
+			case "approx":                          // ALMOST EQUAL TO
+				return rune(0x2248), true
+			case "approxeq":                        // ALMOST EQUAL OR EQUAL TO
+				return rune(0x224a), true
+			case "aring":                           // LATIN SMALL LETTER A WITH RING ABOVE
 				return rune(0xe5), true
-			case "arrllsr": 
-				// LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+			case "arrllsr":                         // LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
 				return rune(0x2943), true
-			case "arrlrsl": 
-				// RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+			case "arrlrsl":                         // RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
 				return rune(0x2942), true
-			case "arrsrll": 
-				// SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+			case "arrsrll":                         // SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
 				return rune(0x2944), true
-			case "ascr": 
-				// MATHEMATICAL SCRIPT SMALL A
+			case "ascr":                            // MATHEMATICAL SCRIPT SMALL A
 				return rune(0x01d4b6), true
-			case "astb": 
-				// SQUARED ASTERISK
-				return rune(0x29c6), true
-			case "ast": 
-				// ASTERISK
+			case "ast":                             // ASTERISK
 				return rune(0x2a), true
-			case "asympeq": 
-				// EQUIVALENT TO
-				return rune(0x224d), true
-			case "asymp": 
-				// ALMOST EQUAL TO
+			case "astb":                            // SQUARED ASTERISK
+				return rune(0x29c6), true
+			case "asymp":                           // ALMOST EQUAL TO
 				return rune(0x2248), true
-			case "atilde": 
-				// LATIN SMALL LETTER A WITH TILDE
+			case "asympeq":                         // EQUIVALENT TO
+				return rune(0x224d), true
+			case "atilde":                          // LATIN SMALL LETTER A WITH TILDE
 				return rune(0xe3), true
-			case "auml": 
-				// LATIN SMALL LETTER A WITH DIAERESIS
+			case "auml":                            // LATIN SMALL LETTER A WITH DIAERESIS
 				return rune(0xe4), true
-			case "awconint": 
-				// ANTICLOCKWISE CONTOUR INTEGRAL
+			case "awconint":                        // ANTICLOCKWISE CONTOUR INTEGRAL
 				return rune(0x2233), true
-			case "awint": 
-				// ANTICLOCKWISE INTEGRATION
+			case "awint":                           // ANTICLOCKWISE INTEGRATION
 				return rune(0x2a11), true
 		}
 
 	case 'b':
 		switch name {
-			case "b.Delta": 
-				// MATHEMATICAL BOLD CAPITAL DELTA
+			case "b.Delta":                         // MATHEMATICAL BOLD CAPITAL DELTA
 				return rune(0x01d6ab), true
-			case "b.Gamma": 
-				// MATHEMATICAL BOLD CAPITAL GAMMA
+			case "b.Gamma":                         // MATHEMATICAL BOLD CAPITAL GAMMA
 				return rune(0x01d6aa), true
-			case "b.Gammad": 
-				// MATHEMATICAL BOLD CAPITAL DIGAMMA
+			case "b.Gammad":                        // MATHEMATICAL BOLD CAPITAL DIGAMMA
 				return rune(0x01d7ca), true
-			case "b.Lambda": 
-				// MATHEMATICAL BOLD CAPITAL LAMDA
+			case "b.Lambda":                        // MATHEMATICAL BOLD CAPITAL LAMDA
 				return rune(0x01d6b2), true
-			case "b.Omega": 
-				// MATHEMATICAL BOLD CAPITAL OMEGA
+			case "b.Omega":                         // MATHEMATICAL BOLD CAPITAL OMEGA
 				return rune(0x01d6c0), true
-			case "b.Phi": 
-				// MATHEMATICAL BOLD CAPITAL PHI
+			case "b.Phi":                           // MATHEMATICAL BOLD CAPITAL PHI
 				return rune(0x01d6bd), true
-			case "b.Pi": 
-				// MATHEMATICAL BOLD CAPITAL PI
+			case "b.Pi":                            // MATHEMATICAL BOLD CAPITAL PI
 				return rune(0x01d6b7), true
-			case "b.Psi": 
-				// MATHEMATICAL BOLD CAPITAL PSI
+			case "b.Psi":                           // MATHEMATICAL BOLD CAPITAL PSI
 				return rune(0x01d6bf), true
-			case "b.Sigma": 
-				// MATHEMATICAL BOLD CAPITAL SIGMA
+			case "b.Sigma":                         // MATHEMATICAL BOLD CAPITAL SIGMA
 				return rune(0x01d6ba), true
-			case "b.Theta": 
-				// MATHEMATICAL BOLD CAPITAL THETA
+			case "b.Theta":                         // MATHEMATICAL BOLD CAPITAL THETA
 				return rune(0x01d6af), true
-			case "b.Upsi": 
-				// MATHEMATICAL BOLD CAPITAL UPSILON
+			case "b.Upsi":                          // MATHEMATICAL BOLD CAPITAL UPSILON
 				return rune(0x01d6bc), true
-			case "b.Xi": 
-				// MATHEMATICAL BOLD CAPITAL XI
+			case "b.Xi":                            // MATHEMATICAL BOLD CAPITAL XI
 				return rune(0x01d6b5), true
-			case "b.alpha": 
-				// MATHEMATICAL BOLD SMALL ALPHA
+			case "b.alpha":                         // MATHEMATICAL BOLD SMALL ALPHA
 				return rune(0x01d6c2), true
-			case "b.beta": 
-				// MATHEMATICAL BOLD SMALL BETA
+			case "b.beta":                          // MATHEMATICAL BOLD SMALL BETA
 				return rune(0x01d6c3), true
-			case "b.chi": 
-				// MATHEMATICAL BOLD SMALL CHI
+			case "b.chi":                           // MATHEMATICAL BOLD SMALL CHI
 				return rune(0x01d6d8), true
-			case "b.delta": 
-				// MATHEMATICAL BOLD SMALL DELTA
+			case "b.delta":                         // MATHEMATICAL BOLD SMALL DELTA
 				return rune(0x01d6c5), true
-			case "b.epsi": 
-				// MATHEMATICAL BOLD SMALL EPSILON
+			case "b.epsi":                          // MATHEMATICAL BOLD SMALL EPSILON
 				return rune(0x01d6c6), true
-			case "b.epsiv": 
-				// MATHEMATICAL BOLD EPSILON SYMBOL
+			case "b.epsiv":                         // MATHEMATICAL BOLD EPSILON SYMBOL
 				return rune(0x01d6dc), true
-			case "b.eta": 
-				// MATHEMATICAL BOLD SMALL ETA
+			case "b.eta":                           // MATHEMATICAL BOLD SMALL ETA
 				return rune(0x01d6c8), true
-			case "b.gammad": 
-				// MATHEMATICAL BOLD SMALL DIGAMMA
-				return rune(0x01d7cb), true
-			case "b.gamma": 
-				// MATHEMATICAL BOLD SMALL GAMMA
+			case "b.gamma":                         // MATHEMATICAL BOLD SMALL GAMMA
 				return rune(0x01d6c4), true
-			case "b.iota": 
-				// MATHEMATICAL BOLD SMALL IOTA
+			case "b.gammad":                        // MATHEMATICAL BOLD SMALL DIGAMMA
+				return rune(0x01d7cb), true
+			case "b.iota":                          // MATHEMATICAL BOLD SMALL IOTA
 				return rune(0x01d6ca), true
-			case "b.kappa": 
-				// MATHEMATICAL BOLD SMALL KAPPA
+			case "b.kappa":                         // MATHEMATICAL BOLD SMALL KAPPA
 				return rune(0x01d6cb), true
-			case "b.kappav": 
-				// MATHEMATICAL BOLD KAPPA SYMBOL
+			case "b.kappav":                        // MATHEMATICAL BOLD KAPPA SYMBOL
 				return rune(0x01d6de), true
-			case "b.lambda": 
-				// MATHEMATICAL BOLD SMALL LAMDA
+			case "b.lambda":                        // MATHEMATICAL BOLD SMALL LAMDA
 				return rune(0x01d6cc), true
-			case "b.mu": 
-				// MATHEMATICAL BOLD SMALL MU
+			case "b.mu":                            // MATHEMATICAL BOLD SMALL MU
 				return rune(0x01d6cd), true
-			case "b.nu": 
-				// MATHEMATICAL BOLD SMALL NU
+			case "b.nu":                            // MATHEMATICAL BOLD SMALL NU
 				return rune(0x01d6ce), true
-			case "b.omega": 
-				// MATHEMATICAL BOLD SMALL OMEGA
+			case "b.omega":                         // MATHEMATICAL BOLD SMALL OMEGA
 				return rune(0x01d6da), true
-			case "b.phi": 
-				// MATHEMATICAL BOLD SMALL PHI
+			case "b.phi":                           // MATHEMATICAL BOLD SMALL PHI
 				return rune(0x01d6d7), true
-			case "b.phiv": 
-				// MATHEMATICAL BOLD PHI SYMBOL
+			case "b.phiv":                          // MATHEMATICAL BOLD PHI SYMBOL
 				return rune(0x01d6df), true
-			case "b.pi": 
-				// MATHEMATICAL BOLD SMALL PI
+			case "b.pi":                            // MATHEMATICAL BOLD SMALL PI
 				return rune(0x01d6d1), true
-			case "b.piv": 
-				// MATHEMATICAL BOLD PI SYMBOL
+			case "b.piv":                           // MATHEMATICAL BOLD PI SYMBOL
 				return rune(0x01d6e1), true
-			case "b.psi": 
-				// MATHEMATICAL BOLD SMALL PSI
+			case "b.psi":                           // MATHEMATICAL BOLD SMALL PSI
 				return rune(0x01d6d9), true
-			case "b.rho": 
-				// MATHEMATICAL BOLD SMALL RHO
+			case "b.rho":                           // MATHEMATICAL BOLD SMALL RHO
 				return rune(0x01d6d2), true
-			case "b.rhov": 
-				// MATHEMATICAL BOLD RHO SYMBOL
+			case "b.rhov":                          // MATHEMATICAL BOLD RHO SYMBOL
 				return rune(0x01d6e0), true
-			case "b.sigmav": 
-				// MATHEMATICAL BOLD SMALL FINAL SIGMA
-				return rune(0x01d6d3), true
-			case "b.sigma": 
-				// MATHEMATICAL BOLD SMALL SIGMA
+			case "b.sigma":                         // MATHEMATICAL BOLD SMALL SIGMA
 				return rune(0x01d6d4), true
-			case "b.tau": 
-				// MATHEMATICAL BOLD SMALL TAU
+			case "b.sigmav":                        // MATHEMATICAL BOLD SMALL FINAL SIGMA
+				return rune(0x01d6d3), true
+			case "b.tau":                           // MATHEMATICAL BOLD SMALL TAU
 				return rune(0x01d6d5), true
-			case "b.thetas": 
-				// MATHEMATICAL BOLD SMALL THETA
+			case "b.thetas":                        // MATHEMATICAL BOLD SMALL THETA
 				return rune(0x01d6c9), true
-			case "b.thetav": 
-				// MATHEMATICAL BOLD THETA SYMBOL
+			case "b.thetav":                        // MATHEMATICAL BOLD THETA SYMBOL
 				return rune(0x01d6dd), true
-			case "b.upsi": 
-				// MATHEMATICAL BOLD SMALL UPSILON
+			case "b.upsi":                          // MATHEMATICAL BOLD SMALL UPSILON
 				return rune(0x01d6d6), true
-			case "b.xi": 
-				// MATHEMATICAL BOLD SMALL XI
+			case "b.xi":                            // MATHEMATICAL BOLD SMALL XI
 				return rune(0x01d6cf), true
-			case "b.zeta": 
-				// MATHEMATICAL BOLD SMALL ZETA
+			case "b.zeta":                          // MATHEMATICAL BOLD SMALL ZETA
 				return rune(0x01d6c7), true
-			case "bNot": 
-				// REVERSED DOUBLE STROKE NOT SIGN
+			case "bNot":                            // REVERSED DOUBLE STROKE NOT SIGN
 				return rune(0x2aed), true
-			case "backcong": 
-				// ALL EQUAL TO
+			case "backcong":                        // ALL EQUAL TO
 				return rune(0x224c), true
-			case "backepsilon": 
-				// GREEK REVERSED LUNATE EPSILON SYMBOL
+			case "backepsilon":                     // GREEK REVERSED LUNATE EPSILON SYMBOL
 				return rune(0x03f6), true
-			case "backprime": 
-				// REVERSED PRIME
+			case "backprime":                       // REVERSED PRIME
 				return rune(0x2035), true
-			case "backsimeq": 
-				// REVERSED TILDE EQUALS
-				return rune(0x22cd), true
-			case "backsim": 
-				// REVERSED TILDE
+			case "backsim":                         // REVERSED TILDE
 				return rune(0x223d), true
-			case "barV": 
-				// DOUBLE DOWN TACK
+			case "backsimeq":                       // REVERSED TILDE EQUALS
+				return rune(0x22cd), true
+			case "barV":                            // DOUBLE DOWN TACK
 				return rune(0x2aea), true
-			case "barvee": 
-				// NOR
+			case "barvee":                          // NOR
 				return rune(0x22bd), true
-			case "barwed": 
-				// PROJECTIVE
+			case "barwed":                          // PROJECTIVE
 				return rune(0x2305), true
-			case "barwedge": 
-				// PROJECTIVE
+			case "barwedge":                        // PROJECTIVE
 				return rune(0x2305), true
-			case "bbrk": 
-				// BOTTOM SQUARE BRACKET
+			case "bbrk":                            // BOTTOM SQUARE BRACKET
 				return rune(0x23b5), true
-			case "bbrktbrk": 
-				// BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+			case "bbrktbrk":                        // BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
 				return rune(0x23b6), true
-			case "bcong": 
-				// ALL EQUAL TO
+			case "bcong":                           // ALL EQUAL TO
 				return rune(0x224c), true
-			case "bcy": 
-				// CYRILLIC SMALL LETTER BE
+			case "bcy":                             // CYRILLIC SMALL LETTER BE
 				return rune(0x0431), true
-			case "bdlhar": 
-				// DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+			case "bdlhar":                          // DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
 				return rune(0x2961), true
-			case "bdquo": 
-				// DOUBLE LOW-9 QUOTATION MARK
+			case "bdquo":                           // DOUBLE LOW-9 QUOTATION MARK
 				return rune(0x201e), true
-			case "bdrhar": 
-				// DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+			case "bdrhar":                          // DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
 				return rune(0x295d), true
-			case "because": 
-				// BECAUSE
+			case "becaus":                          // BECAUSE
 				return rune(0x2235), true
-			case "becaus": 
-				// BECAUSE
+			case "because":                         // BECAUSE
 				return rune(0x2235), true
-			case "bemptyv": 
-				// REVERSED EMPTY SET
+			case "bemptyv":                         // REVERSED EMPTY SET
 				return rune(0x29b0), true
-			case "bepsi": 
-				// GREEK REVERSED LUNATE EPSILON SYMBOL
+			case "bepsi":                           // GREEK REVERSED LUNATE EPSILON SYMBOL
 				return rune(0x03f6), true
-			case "bernou": 
-				// SCRIPT CAPITAL B
+			case "bernou":                          // SCRIPT CAPITAL B
 				return rune(0x212c), true
-			case "beta": 
-				// GREEK SMALL LETTER BETA
+			case "beta":                            // GREEK SMALL LETTER BETA
 				return rune(0x03b2), true
-			case "beth": 
-				// BET SYMBOL
+			case "beth":                            // BET SYMBOL
 				return rune(0x2136), true
-			case "between": 
-				// BETWEEN
+			case "between":                         // BETWEEN
 				return rune(0x226c), true
-			case "bfr": 
-				// MATHEMATICAL FRAKTUR SMALL B
+			case "bfr":                             // MATHEMATICAL FRAKTUR SMALL B
 				return rune(0x01d51f), true
-			case "bgr": 
-				// GREEK SMALL LETTER BETA
+			case "bgr":                             // GREEK SMALL LETTER BETA
 				return rune(0x03b2), true
-			case "bigcap": 
-				// N-ARY INTERSECTION
+			case "bigcap":                          // N-ARY INTERSECTION
 				return rune(0x22c2), true
-			case "bigcirc": 
-				// LARGE CIRCLE
+			case "bigcirc":                         // LARGE CIRCLE
 				return rune(0x25ef), true
-			case "bigcup": 
-				// N-ARY UNION
+			case "bigcup":                          // N-ARY UNION
 				return rune(0x22c3), true
-			case "bigodot": 
-				// N-ARY CIRCLED DOT OPERATOR
+			case "bigodot":                         // N-ARY CIRCLED DOT OPERATOR
 				return rune(0x2a00), true
-			case "bigoplus": 
-				// N-ARY CIRCLED PLUS OPERATOR
+			case "bigoplus":                        // N-ARY CIRCLED PLUS OPERATOR
 				return rune(0x2a01), true
-			case "bigotimes": 
-				// N-ARY CIRCLED TIMES OPERATOR
+			case "bigotimes":                       // N-ARY CIRCLED TIMES OPERATOR
 				return rune(0x2a02), true
-			case "bigsqcup": 
-				// N-ARY SQUARE UNION OPERATOR
+			case "bigsqcup":                        // N-ARY SQUARE UNION OPERATOR
 				return rune(0x2a06), true
-			case "bigstar": 
-				// BLACK STAR
+			case "bigstar":                         // BLACK STAR
 				return rune(0x2605), true
-			case "bigtriangledown": 
-				// WHITE DOWN-POINTING TRIANGLE
+			case "bigtriangledown":                 // WHITE DOWN-POINTING TRIANGLE
 				return rune(0x25bd), true
-			case "bigtriangleup": 
-				// WHITE UP-POINTING TRIANGLE
+			case "bigtriangleup":                   // WHITE UP-POINTING TRIANGLE
 				return rune(0x25b3), true
-			case "biguplus": 
-				// N-ARY UNION OPERATOR WITH PLUS
+			case "biguplus":                        // N-ARY UNION OPERATOR WITH PLUS
 				return rune(0x2a04), true
-			case "bigvee": 
-				// N-ARY LOGICAL OR
+			case "bigvee":                          // N-ARY LOGICAL OR
 				return rune(0x22c1), true
-			case "bigwedge": 
-				// N-ARY LOGICAL AND
+			case "bigwedge":                        // N-ARY LOGICAL AND
 				return rune(0x22c0), true
-			case "bkarow": 
-				// RIGHTWARDS DOUBLE DASH ARROW
+			case "bkarow":                          // RIGHTWARDS DOUBLE DASH ARROW
 				return rune(0x290d), true
-			case "blacklozenge": 
-				// BLACK LOZENGE
+			case "blacklozenge":                    // BLACK LOZENGE
 				return rune(0x29eb), true
-			case "blacksquare": 
-				// BLACK SMALL SQUARE
+			case "blacksquare":                     // BLACK SMALL SQUARE
 				return rune(0x25aa), true
-			case "blacktriangledown": 
-				// BLACK DOWN-POINTING SMALL TRIANGLE
+			case "blacktriangle":                   // BLACK UP-POINTING SMALL TRIANGLE
+				return rune(0x25b4), true
+			case "blacktriangledown":               // BLACK DOWN-POINTING SMALL TRIANGLE
 				return rune(0x25be), true
-			case "blacktriangleleft": 
-				// BLACK LEFT-POINTING SMALL TRIANGLE
+			case "blacktriangleleft":               // BLACK LEFT-POINTING SMALL TRIANGLE
 				return rune(0x25c2), true
-			case "blacktriangleright": 
-				// BLACK RIGHT-POINTING SMALL TRIANGLE
+			case "blacktriangleright":              // BLACK RIGHT-POINTING SMALL TRIANGLE
 				return rune(0x25b8), true
-			case "blacktriangle": 
-				// BLACK UP-POINTING SMALL TRIANGLE
-				return rune(0x25b4), true
-			case "blank": 
-				// BLANK SYMBOL
+			case "blank":                           // BLANK SYMBOL
 				return rune(0x2422), true
-			case "bldhar": 
-				// LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+			case "bldhar":                          // LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
 				return rune(0x295e), true
-			case "blk12": 
-				// MEDIUM SHADE
+			case "blk12":                           // MEDIUM SHADE
 				return rune(0x2592), true
-			case "blk14": 
-				// LIGHT SHADE
+			case "blk14":                           // LIGHT SHADE
 				return rune(0x2591), true
-			case "blk34": 
-				// DARK SHADE
+			case "blk34":                           // DARK SHADE
 				return rune(0x2593), true
-			case "block": 
-				// FULL BLOCK
+			case "block":                           // FULL BLOCK
 				return rune(0x2588), true
-			case "bluhar": 
-				// LEFTWARDS HARPOON WITH BARB UP FROM BAR
+			case "bluhar":                          // LEFTWARDS HARPOON WITH BARB UP FROM BAR
 				return rune(0x295a), true
-			case "bnequiv": 
-				// IDENTICAL TO with reverse slash
-				return rune(0x2261), true
-			case "bne": 
-				// EQUALS SIGN with reverse slash
+			case "bne":                             // EQUALS SIGN with reverse slash
 				return rune(0x3d), true
-			case "bnot": 
-				// REVERSED NOT SIGN
+			case "bnequiv":                         // IDENTICAL TO with reverse slash
+				return rune(0x2261), true
+			case "bnot":                            // REVERSED NOT SIGN
 				return rune(0x2310), true
-			case "bopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL B
+			case "bopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL B
 				return rune(0x01d553), true
-			case "bot": 
-				// UP TACK
+			case "bot":                             // UP TACK
 				return rune(0x22a5), true
-			case "bottom": 
-				// UP TACK
+			case "bottom":                          // UP TACK
 				return rune(0x22a5), true
-			case "bowtie": 
-				// BOWTIE
+			case "bowtie":                          // BOWTIE
 				return rune(0x22c8), true
-			case "boxDL": 
-				// BOX DRAWINGS DOUBLE DOWN AND LEFT
+			case "boxDL":                           // BOX DRAWINGS DOUBLE DOWN AND LEFT
 				return rune(0x2557), true
-			case "boxDR": 
-				// BOX DRAWINGS DOUBLE DOWN AND RIGHT
+			case "boxDR":                           // BOX DRAWINGS DOUBLE DOWN AND RIGHT
 				return rune(0x2554), true
-			case "boxDl": 
-				// BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+			case "boxDl":                           // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
 				return rune(0x2556), true
-			case "boxDr": 
-				// BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+			case "boxDr":                           // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
 				return rune(0x2553), true
-			case "boxHD": 
-				// BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+			case "boxH":                            // BOX DRAWINGS DOUBLE HORIZONTAL
+				return rune(0x2550), true
+			case "boxHD":                           // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
 				return rune(0x2566), true
-			case "boxHU": 
-				// BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+			case "boxHU":                           // BOX DRAWINGS DOUBLE UP AND HORIZONTAL
 				return rune(0x2569), true
-			case "boxHd": 
-				// BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+			case "boxHd":                           // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
 				return rune(0x2564), true
-			case "boxHu": 
-				// BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+			case "boxHu":                           // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
 				return rune(0x2567), true
-			case "boxH": 
-				// BOX DRAWINGS DOUBLE HORIZONTAL
-				return rune(0x2550), true
-			case "boxUL": 
-				// BOX DRAWINGS DOUBLE UP AND LEFT
+			case "boxUL":                           // BOX DRAWINGS DOUBLE UP AND LEFT
 				return rune(0x255d), true
-			case "boxUR": 
-				// BOX DRAWINGS DOUBLE UP AND RIGHT
+			case "boxUR":                           // BOX DRAWINGS DOUBLE UP AND RIGHT
 				return rune(0x255a), true
-			case "boxUl": 
-				// BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+			case "boxUl":                           // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
 				return rune(0x255c), true
-			case "boxUr": 
-				// BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+			case "boxUr":                           // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
 				return rune(0x2559), true
-			case "boxVH": 
-				// BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+			case "boxV":                            // BOX DRAWINGS DOUBLE VERTICAL
+				return rune(0x2551), true
+			case "boxVH":                           // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
 				return rune(0x256c), true
-			case "boxVL": 
-				// BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+			case "boxVL":                           // BOX DRAWINGS DOUBLE VERTICAL AND LEFT
 				return rune(0x2563), true
-			case "boxVR": 
-				// BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+			case "boxVR":                           // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
 				return rune(0x2560), true
-			case "boxVh": 
-				// BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+			case "boxVh":                           // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
 				return rune(0x256b), true
-			case "boxVl": 
-				// BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+			case "boxVl":                           // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
 				return rune(0x2562), true
-			case "boxVr": 
-				// BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+			case "boxVr":                           // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
 				return rune(0x255f), true
-			case "boxV": 
-				// BOX DRAWINGS DOUBLE VERTICAL
-				return rune(0x2551), true
-			case "boxbox": 
-				// TWO JOINED SQUARES
+			case "boxbox":                          // TWO JOINED SQUARES
 				return rune(0x29c9), true
-			case "boxdL": 
-				// BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+			case "boxdL":                           // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
 				return rune(0x2555), true
-			case "boxdR": 
-				// BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+			case "boxdR":                           // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
 				return rune(0x2552), true
-			case "boxdl": 
-				// BOX DRAWINGS LIGHT DOWN AND LEFT
+			case "boxdl":                           // BOX DRAWINGS LIGHT DOWN AND LEFT
 				return rune(0x2510), true
-			case "boxdr": 
-				// BOX DRAWINGS LIGHT DOWN AND RIGHT
+			case "boxdr":                           // BOX DRAWINGS LIGHT DOWN AND RIGHT
 				return rune(0x250c), true
-			case "boxhU": 
-				// BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
-				return rune(0x2568), true
-			case "boxh": 
-				// BOX DRAWINGS LIGHT HORIZONTAL
+			case "boxh":                            // BOX DRAWINGS LIGHT HORIZONTAL
 				return rune(0x2500), true
-			case "boxhD": 
-				// BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+			case "boxhD":                           // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
 				return rune(0x2565), true
-			case "boxhd": 
-				// BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+			case "boxhU":                           // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+				return rune(0x2568), true
+			case "boxhd":                           // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
 				return rune(0x252c), true
-			case "boxhu": 
-				// BOX DRAWINGS LIGHT UP AND HORIZONTAL
+			case "boxhu":                           // BOX DRAWINGS LIGHT UP AND HORIZONTAL
 				return rune(0x2534), true
-			case "boxminus": 
-				// SQUARED MINUS
+			case "boxminus":                        // SQUARED MINUS
 				return rune(0x229f), true
-			case "boxplus": 
-				// SQUARED PLUS
+			case "boxplus":                         // SQUARED PLUS
 				return rune(0x229e), true
-			case "boxtimes": 
-				// SQUARED TIMES
+			case "boxtimes":                        // SQUARED TIMES
 				return rune(0x22a0), true
-			case "boxuL": 
-				// BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+			case "boxuL":                           // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
 				return rune(0x255b), true
-			case "boxuR": 
-				// BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+			case "boxuR":                           // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
 				return rune(0x2558), true
-			case "boxul": 
-				// BOX DRAWINGS LIGHT UP AND LEFT
+			case "boxul":                           // BOX DRAWINGS LIGHT UP AND LEFT
 				return rune(0x2518), true
-			case "boxur": 
-				// BOX DRAWINGS LIGHT UP AND RIGHT
+			case "boxur":                           // BOX DRAWINGS LIGHT UP AND RIGHT
 				return rune(0x2514), true
-			case "boxvL": 
-				// BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+			case "boxv":                            // BOX DRAWINGS LIGHT VERTICAL
+				return rune(0x2502), true
+			case "boxvH":                           // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+				return rune(0x256a), true
+			case "boxvL":                           // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
 				return rune(0x2561), true
-			case "boxvR": 
-				// BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+			case "boxvR":                           // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
 				return rune(0x255e), true
-			case "boxvl": 
-				// BOX DRAWINGS LIGHT VERTICAL AND LEFT
+			case "boxvh":                           // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+				return rune(0x253c), true
+			case "boxvl":                           // BOX DRAWINGS LIGHT VERTICAL AND LEFT
 				return rune(0x2524), true
-			case "boxvr": 
-				// BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+			case "boxvr":                           // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
 				return rune(0x251c), true
-			case "boxv": 
-				// BOX DRAWINGS LIGHT VERTICAL
-				return rune(0x2502), true
-			case "boxvH": 
-				// BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
-				return rune(0x256a), true
-			case "boxvh": 
-				// BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
-				return rune(0x253c), true
-			case "bprime": 
-				// REVERSED PRIME
+			case "bprime":                          // REVERSED PRIME
 				return rune(0x2035), true
-			case "brdhar": 
-				// RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+			case "brdhar":                          // RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
 				return rune(0x295f), true
-			case "breve": 
-				// BREVE
+			case "breve":                           // BREVE
 				return rune(0x02d8), true
-			case "bruhar": 
-				// RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+			case "bruhar":                          // RIGHTWARDS HARPOON WITH BARB UP FROM BAR
 				return rune(0x295b), true
-			case "brvbar": 
-				// BROKEN BAR
+			case "brvbar":                          // BROKEN BAR
 				return rune(0xa6), true
-			case "bscr": 
-				// MATHEMATICAL SCRIPT SMALL B
+			case "bscr":                            // MATHEMATICAL SCRIPT SMALL B
 				return rune(0x01d4b7), true
-			case "bsemi": 
-				// REVERSED SEMICOLON
+			case "bsemi":                           // REVERSED SEMICOLON
 				return rune(0x204f), true
-			case "bsim": 
-				// REVERSED TILDE
+			case "bsim":                            // REVERSED TILDE
 				return rune(0x223d), true
-			case "bsime": 
-				// REVERSED TILDE EQUALS
+			case "bsime":                           // REVERSED TILDE EQUALS
 				return rune(0x22cd), true
-			case "bsolb": 
-				// SQUARED FALLING DIAGONAL SLASH
+			case "bsol":                            // REVERSE SOLIDUS
+				return rune(0x5c), true
+			case "bsolb":                           // SQUARED FALLING DIAGONAL SLASH
 				return rune(0x29c5), true
-			case "bsolhsub": 
-				// REVERSE SOLIDUS PRECEDING SUBSET
+			case "bsolhsub":                        // REVERSE SOLIDUS PRECEDING SUBSET
 				return rune(0x27c8), true
-			case "bsol": 
-				// REVERSE SOLIDUS
-				return rune(0x5c), true
-			case "btimes": 
-				// SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+			case "btimes":                          // SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
 				return rune(0x2a32), true
-			case "bulhar": 
-				// UPWARDS HARPOON WITH BARB LEFT FROM BAR
+			case "bulhar":                          // UPWARDS HARPOON WITH BARB LEFT FROM BAR
 				return rune(0x2960), true
-			case "bullet": 
-				// BULLET
+			case "bull":                            // BULLET
 				return rune(0x2022), true
-			case "bull": 
-				// BULLET
+			case "bullet":                          // BULLET
 				return rune(0x2022), true
-			case "bump": 
-				// GEOMETRICALLY EQUIVALENT TO
+			case "bump":                            // GEOMETRICALLY EQUIVALENT TO
 				return rune(0x224e), true
-			case "bumpE": 
-				// EQUALS SIGN WITH BUMPY ABOVE
+			case "bumpE":                           // EQUALS SIGN WITH BUMPY ABOVE
 				return rune(0x2aae), true
-			case "bumpe": 
-				// DIFFERENCE BETWEEN
+			case "bumpe":                           // DIFFERENCE BETWEEN
 				return rune(0x224f), true
-			case "bumpeq": 
-				// DIFFERENCE BETWEEN
+			case "bumpeq":                          // DIFFERENCE BETWEEN
 				return rune(0x224f), true
-			case "burhar": 
-				// UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+			case "burhar":                          // UPWARDS HARPOON WITH BARB RIGHT FROM BAR
 				return rune(0x295c), true
 		}
 
 	case 'c':
 		switch name {
-			case "cacute": 
-				// LATIN SMALL LETTER C WITH ACUTE
+			case "cacute":                          // LATIN SMALL LETTER C WITH ACUTE
 				return rune(0x0107), true
-			case "cap": 
-				// INTERSECTION
+			case "cap":                             // INTERSECTION
 				return rune(0x2229), true
-			case "capand": 
-				// INTERSECTION WITH LOGICAL AND
+			case "capand":                          // INTERSECTION WITH LOGICAL AND
 				return rune(0x2a44), true
-			case "capbrcup": 
-				// INTERSECTION ABOVE BAR ABOVE UNION
+			case "capbrcup":                        // INTERSECTION ABOVE BAR ABOVE UNION
 				return rune(0x2a49), true
-			case "capcap": 
-				// INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+			case "capcap":                          // INTERSECTION BESIDE AND JOINED WITH INTERSECTION
 				return rune(0x2a4b), true
-			case "capcup": 
-				// INTERSECTION ABOVE UNION
+			case "capcup":                          // INTERSECTION ABOVE UNION
 				return rune(0x2a47), true
-			case "capdot": 
-				// INTERSECTION WITH DOT
+			case "capdot":                          // INTERSECTION WITH DOT
 				return rune(0x2a40), true
-			case "capint": 
-				// INTEGRAL WITH INTERSECTION
+			case "capint":                          // INTEGRAL WITH INTERSECTION
 				return rune(0x2a19), true
-			case "caps": 
-				// INTERSECTION with serifs
+			case "caps":                            // INTERSECTION with serifs
 				return rune(0x2229), true
-			case "caret": 
-				// CARET INSERTION POINT
+			case "caret":                           // CARET INSERTION POINT
 				return rune(0x2041), true
-			case "caron": 
-				// CARON
+			case "caron":                           // CARON
 				return rune(0x02c7), true
-			case "ccaps": 
-				// CLOSED INTERSECTION WITH SERIFS
+			case "ccaps":                           // CLOSED INTERSECTION WITH SERIFS
 				return rune(0x2a4d), true
-			case "ccaron": 
-				// LATIN SMALL LETTER C WITH CARON
+			case "ccaron":                          // LATIN SMALL LETTER C WITH CARON
 				return rune(0x010d), true
-			case "ccedil": 
-				// LATIN SMALL LETTER C WITH CEDILLA
+			case "ccedil":                          // LATIN SMALL LETTER C WITH CEDILLA
 				return rune(0xe7), true
-			case "ccirc": 
-				// LATIN SMALL LETTER C WITH CIRCUMFLEX
+			case "ccirc":                           // LATIN SMALL LETTER C WITH CIRCUMFLEX
 				return rune(0x0109), true
-			case "ccups": 
-				// CLOSED UNION WITH SERIFS
+			case "ccups":                           // CLOSED UNION WITH SERIFS
 				return rune(0x2a4c), true
-			case "ccupssm": 
-				// CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+			case "ccupssm":                         // CLOSED UNION WITH SERIFS AND SMASH PRODUCT
 				return rune(0x2a50), true
-			case "cdot": 
-				// LATIN SMALL LETTER C WITH DOT ABOVE
+			case "cdot":                            // LATIN SMALL LETTER C WITH DOT ABOVE
 				return rune(0x010b), true
-			case "cedil": 
-				// CEDILLA
+			case "cedil":                           // CEDILLA
 				return rune(0xb8), true
-			case "cemptyv": 
-				// EMPTY SET WITH SMALL CIRCLE ABOVE
+			case "cemptyv":                         // EMPTY SET WITH SMALL CIRCLE ABOVE
 				return rune(0x29b2), true
-			case "centerdot": 
-				// MIDDLE DOT
-				return rune(0xb7), true
-			case "cent": 
-				// CENT SIGN
+			case "cent":                            // CENT SIGN
 				return rune(0xa2), true
-			case "cfr": 
-				// MATHEMATICAL FRAKTUR SMALL C
+			case "centerdot":                       // MIDDLE DOT
+				return rune(0xb7), true
+			case "cfr":                             // MATHEMATICAL FRAKTUR SMALL C
 				return rune(0x01d520), true
-			case "chcy": 
-				// CYRILLIC SMALL LETTER CHE
+			case "chcy":                            // CYRILLIC SMALL LETTER CHE
 				return rune(0x0447), true
-			case "check": 
-				// CHECK MARK
+			case "check":                           // CHECK MARK
 				return rune(0x2713), true
-			case "checkmark": 
-				// CHECK MARK
+			case "checkmark":                       // CHECK MARK
 				return rune(0x2713), true
-			case "chi": 
-				// GREEK SMALL LETTER CHI
+			case "chi":                             // GREEK SMALL LETTER CHI
 				return rune(0x03c7), true
-			case "circeq": 
-				// RING EQUAL TO
+			case "cir":                             // WHITE CIRCLE
+				return rune(0x25cb), true
+			case "cirE":                            // CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+				return rune(0x29c3), true
+			case "cirb":                            // SQUARED SMALL CIRCLE
+				return rune(0x29c7), true
+			case "circ":                            // MODIFIER LETTER CIRCUMFLEX ACCENT
+				return rune(0x02c6), true
+			case "circeq":                          // RING EQUAL TO
 				return rune(0x2257), true
-			case "circlearrowleft": 
-				// ANTICLOCKWISE OPEN CIRCLE ARROW
+			case "circlearrowleft":                 // ANTICLOCKWISE OPEN CIRCLE ARROW
 				return rune(0x21ba), true
-			case "circlearrowright": 
-				// CLOCKWISE OPEN CIRCLE ARROW
+			case "circlearrowright":                // CLOCKWISE OPEN CIRCLE ARROW
 				return rune(0x21bb), true
-			case "circledS": 
-				// CIRCLED LATIN CAPITAL LETTER S
+			case "circledR":                        // REGISTERED SIGN
+				return rune(0xae), true
+			case "circledS":                        // CIRCLED LATIN CAPITAL LETTER S
 				return rune(0x24c8), true
-			case "circledast": 
-				// CIRCLED ASTERISK OPERATOR
+			case "circledast":                      // CIRCLED ASTERISK OPERATOR
 				return rune(0x229b), true
-			case "circledcirc": 
-				// CIRCLED RING OPERATOR
+			case "circledcirc":                     // CIRCLED RING OPERATOR
 				return rune(0x229a), true
-			case "circleddash": 
-				// CIRCLED DASH
+			case "circleddash":                     // CIRCLED DASH
 				return rune(0x229d), true
-			case "cire": 
-				// RING EQUAL TO
-				return rune(0x2257), true
-			case "cir": 
-				// WHITE CIRCLE
-				return rune(0x25cb), true
-			case "cirE": 
-				// CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
-				return rune(0x29c3), true
-			case "cirb": 
-				// SQUARED SMALL CIRCLE
-				return rune(0x29c7), true
-			case "circ": 
-				// MODIFIER LETTER CIRCUMFLEX ACCENT
-				return rune(0x02c6), true
-			case "circledR": 
-				// REGISTERED SIGN
-				return rune(0xae), true
-			case "cirdarr": 
-				// WHITE CIRCLE WITH DOWN ARROW
+			case "cirdarr":                         // WHITE CIRCLE WITH DOWN ARROW
 				return rune(0x29ec), true
-			case "cirerr": 
-				// ERROR-BARRED WHITE CIRCLE
+			case "cire":                            // RING EQUAL TO
+				return rune(0x2257), true
+			case "cirerr":                          // ERROR-BARRED WHITE CIRCLE
 				return rune(0x29f2), true
-			case "cirfdarr": 
-				// BLACK CIRCLE WITH DOWN ARROW
+			case "cirfdarr":                        // BLACK CIRCLE WITH DOWN ARROW
 				return rune(0x29ed), true
-			case "cirferr": 
-				// ERROR-BARRED BLACK CIRCLE
+			case "cirferr":                         // ERROR-BARRED BLACK CIRCLE
 				return rune(0x29f3), true
-			case "cirfnint": 
-				// CIRCULATION FUNCTION
+			case "cirfnint":                        // CIRCULATION FUNCTION
 				return rune(0x2a10), true
-			case "cirmid": 
-				// VERTICAL LINE WITH CIRCLE ABOVE
+			case "cirmid":                          // VERTICAL LINE WITH CIRCLE ABOVE
 				return rune(0x2aef), true
-			case "cirscir": 
-				// CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+			case "cirscir":                         // CIRCLE WITH SMALL CIRCLE TO THE RIGHT
 				return rune(0x29c2), true
-			case "closur": 
-				// CLOSE UP
+			case "closur":                          // CLOSE UP
 				return rune(0x2050), true
-			case "clubs": 
-				// BLACK CLUB SUIT
+			case "clubs":                           // BLACK CLUB SUIT
 				return rune(0x2663), true
-			case "clubsuit": 
-				// BLACK CLUB SUIT
+			case "clubsuit":                        // BLACK CLUB SUIT
 				return rune(0x2663), true
-			case "colone": 
-				// COLON EQUALS
+			case "colon":                           // COLON
+				return rune(0x3a), true
+			case "colone":                          // COLON EQUALS
 				return rune(0x2254), true
-			case "coloneq": 
-				// COLON EQUALS
+			case "coloneq":                         // COLON EQUALS
 				return rune(0x2254), true
-			case "colon": 
-				// COLON
-				return rune(0x3a), true
-			case "commat": 
-				// COMMERCIAL AT
-				return rune(0x40), true
-			case "comma": 
-				// COMMA
+			case "comma":                           // COMMA
 				return rune(0x2c), true
-			case "comp": 
-				// COMPLEMENT
+			case "commat":                          // COMMERCIAL AT
+				return rune(0x40), true
+			case "comp":                            // COMPLEMENT
 				return rune(0x2201), true
-			case "compfn": 
-				// RING OPERATOR
+			case "compfn":                          // RING OPERATOR
 				return rune(0x2218), true
-			case "complement": 
-				// COMPLEMENT
+			case "complement":                      // COMPLEMENT
 				return rune(0x2201), true
-			case "complexes": 
-				// DOUBLE-STRUCK CAPITAL C
+			case "complexes":                       // DOUBLE-STRUCK CAPITAL C
 				return rune(0x2102), true
-			case "cong": 
-				// APPROXIMATELY EQUAL TO
+			case "cong":                            // APPROXIMATELY EQUAL TO
 				return rune(0x2245), true
-			case "congdot": 
-				// CONGRUENT WITH DOT ABOVE
+			case "congdot":                         // CONGRUENT WITH DOT ABOVE
 				return rune(0x2a6d), true
-			case "conint": 
-				// CONTOUR INTEGRAL
+			case "conint":                          // CONTOUR INTEGRAL
 				return rune(0x222e), true
-			case "copf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL C
+			case "copf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL C
 				return rune(0x01d554), true
-			case "coprod": 
-				// N-ARY COPRODUCT
+			case "coprod":                          // N-ARY COPRODUCT
 				return rune(0x2210), true
-			case "copysr": 
-				// SOUND RECORDING COPYRIGHT
-				return rune(0x2117), true
-			case "copy": 
-				// COPYRIGHT SIGN
+			case "copy":                            // COPYRIGHT SIGN
 				return rune(0xa9), true
-			case "crarr": 
-				// DOWNWARDS ARROW WITH CORNER LEFTWARDS
+			case "copysr":                          // SOUND RECORDING COPYRIGHT
+				return rune(0x2117), true
+			case "crarr":                           // DOWNWARDS ARROW WITH CORNER LEFTWARDS
 				return rune(0x21b5), true
-			case "cross": 
-				// BALLOT X
+			case "cross":                           // BALLOT X
 				return rune(0x2717), true
-			case "cscr": 
-				// MATHEMATICAL SCRIPT SMALL C
+			case "cscr":                            // MATHEMATICAL SCRIPT SMALL C
 				return rune(0x01d4b8), true
-			case "csub": 
-				// CLOSED SUBSET
+			case "csub":                            // CLOSED SUBSET
 				return rune(0x2acf), true
-			case "csube": 
-				// CLOSED SUBSET OR EQUAL TO
+			case "csube":                           // CLOSED SUBSET OR EQUAL TO
 				return rune(0x2ad1), true
-			case "csup": 
-				// CLOSED SUPERSET
+			case "csup":                            // CLOSED SUPERSET
 				return rune(0x2ad0), true
-			case "csupe": 
-				// CLOSED SUPERSET OR EQUAL TO
+			case "csupe":                           // CLOSED SUPERSET OR EQUAL TO
 				return rune(0x2ad2), true
-			case "ctdot": 
-				// MIDLINE HORIZONTAL ELLIPSIS
+			case "ctdot":                           // MIDLINE HORIZONTAL ELLIPSIS
 				return rune(0x22ef), true
-			case "cudarrl": 
-				// RIGHT-SIDE ARC CLOCKWISE ARROW
+			case "cudarrl":                         // RIGHT-SIDE ARC CLOCKWISE ARROW
 				return rune(0x2938), true
-			case "cudarrr": 
-				// ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+			case "cudarrr":                         // ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
 				return rune(0x2935), true
-			case "cuepr": 
-				// EQUAL TO OR PRECEDES
+			case "cuepr":                           // EQUAL TO OR PRECEDES
 				return rune(0x22de), true
-			case "cuesc": 
-				// EQUAL TO OR SUCCEEDS
+			case "cuesc":                           // EQUAL TO OR SUCCEEDS
 				return rune(0x22df), true
-			case "cularr": 
-				// ANTICLOCKWISE TOP SEMICIRCLE ARROW
+			case "cularr":                          // ANTICLOCKWISE TOP SEMICIRCLE ARROW
 				return rune(0x21b6), true
-			case "cularrp": 
-				// TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+			case "cularrp":                         // TOP ARC ANTICLOCKWISE ARROW WITH PLUS
 				return rune(0x293d), true
-			case "cup": 
-				// UNION
+			case "cup":                             // UNION
 				return rune(0x222a), true
-			case "cupbrcap": 
-				// UNION ABOVE BAR ABOVE INTERSECTION
+			case "cupbrcap":                        // UNION ABOVE BAR ABOVE INTERSECTION
 				return rune(0x2a48), true
-			case "cupcap": 
-				// UNION ABOVE INTERSECTION
+			case "cupcap":                          // UNION ABOVE INTERSECTION
 				return rune(0x2a46), true
-			case "cupcup": 
-				// UNION BESIDE AND JOINED WITH UNION
+			case "cupcup":                          // UNION BESIDE AND JOINED WITH UNION
 				return rune(0x2a4a), true
-			case "cupdot": 
-				// MULTISET MULTIPLICATION
+			case "cupdot":                          // MULTISET MULTIPLICATION
 				return rune(0x228d), true
-			case "cupint": 
-				// INTEGRAL WITH UNION
+			case "cupint":                          // INTEGRAL WITH UNION
 				return rune(0x2a1a), true
-			case "cupor": 
-				// UNION WITH LOGICAL OR
+			case "cupor":                           // UNION WITH LOGICAL OR
 				return rune(0x2a45), true
-			case "cupre": 
-				// PRECEDES OR EQUAL TO
+			case "cupre":                           // PRECEDES OR EQUAL TO
 				return rune(0x227c), true
-			case "cups": 
-				// UNION with serifs
+			case "cups":                            // UNION with serifs
 				return rune(0x222a), true
-			case "curarr": 
-				// CLOCKWISE TOP SEMICIRCLE ARROW
+			case "curarr":                          // CLOCKWISE TOP SEMICIRCLE ARROW
 				return rune(0x21b7), true
-			case "curarrm": 
-				// TOP ARC CLOCKWISE ARROW WITH MINUS
+			case "curarrm":                         // TOP ARC CLOCKWISE ARROW WITH MINUS
 				return rune(0x293c), true
-			case "curlyeqprec": 
-				// EQUAL TO OR PRECEDES
+			case "curlyeqprec":                     // EQUAL TO OR PRECEDES
 				return rune(0x22de), true
-			case "curlyeqsucc": 
-				// EQUAL TO OR SUCCEEDS
+			case "curlyeqsucc":                     // EQUAL TO OR SUCCEEDS
 				return rune(0x22df), true
-			case "curlyvee": 
-				// CURLY LOGICAL OR
+			case "curlyvee":                        // CURLY LOGICAL OR
 				return rune(0x22ce), true
-			case "curlywedge": 
-				// CURLY LOGICAL AND
+			case "curlywedge":                      // CURLY LOGICAL AND
 				return rune(0x22cf), true
-			case "curren": 
-				// CURRENCY SIGN
+			case "curren":                          // CURRENCY SIGN
 				return rune(0xa4), true
-			case "curvearrowleft": 
-				// ANTICLOCKWISE TOP SEMICIRCLE ARROW
+			case "curvearrowleft":                  // ANTICLOCKWISE TOP SEMICIRCLE ARROW
 				return rune(0x21b6), true
-			case "curvearrowright": 
-				// CLOCKWISE TOP SEMICIRCLE ARROW
+			case "curvearrowright":                 // CLOCKWISE TOP SEMICIRCLE ARROW
 				return rune(0x21b7), true
-			case "cuvee": 
-				// CURLY LOGICAL OR
+			case "cuvee":                           // CURLY LOGICAL OR
 				return rune(0x22ce), true
-			case "cuwed": 
-				// CURLY LOGICAL AND
+			case "cuwed":                           // CURLY LOGICAL AND
 				return rune(0x22cf), true
-			case "cwconint": 
-				// CLOCKWISE CONTOUR INTEGRAL
+			case "cwconint":                        // CLOCKWISE CONTOUR INTEGRAL
 				return rune(0x2232), true
-			case "cwint": 
-				// CLOCKWISE INTEGRAL
+			case "cwint":                           // CLOCKWISE INTEGRAL
 				return rune(0x2231), true
-			case "cylcty": 
-				// CYLINDRICITY
+			case "cylcty":                          // CYLINDRICITY
 				return rune(0x232d), true
 		}
 
 	case 'd':
 		switch name {
-			case "dAarr": 
-				// DOWNWARDS TRIPLE ARROW
+			case "dAarr":                           // DOWNWARDS TRIPLE ARROW
 				return rune(0x290b), true
-			case "dArr": 
-				// DOWNWARDS DOUBLE ARROW
+			case "dArr":                            // DOWNWARDS DOUBLE ARROW
 				return rune(0x21d3), true
-			case "dHar": 
-				// DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+			case "dHar":                            // DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
 				return rune(0x2965), true
-			case "dagger": 
-				// DAGGER
+			case "dagger":                          // DAGGER
 				return rune(0x2020), true
-			case "dalembrt": 
-				// SQUARE WITH CONTOURED OUTLINE
+			case "dalembrt":                        // SQUARE WITH CONTOURED OUTLINE
 				return rune(0x29e0), true
-			case "daleth": 
-				// DALET SYMBOL
+			case "daleth":                          // DALET SYMBOL
 				return rune(0x2138), true
-			case "darr2": 
-				// DOWNWARDS PAIRED ARROWS
-				return rune(0x21ca), true
-			case "darr": 
-				// DOWNWARDS ARROW
+			case "darr":                            // DOWNWARDS ARROW
 				return rune(0x2193), true
-			case "darrb": 
-				// DOWNWARDS ARROW TO BAR
+			case "darr2":                           // DOWNWARDS PAIRED ARROWS
+				return rune(0x21ca), true
+			case "darrb":                           // DOWNWARDS ARROW TO BAR
 				return rune(0x2913), true
-			case "darrln": 
-				// DOWNWARDS ARROW WITH HORIZONTAL STROKE
+			case "darrln":                          // DOWNWARDS ARROW WITH HORIZONTAL STROKE
 				return rune(0x2908), true
-			case "dashv": 
-				// LEFT TACK
-				return rune(0x22a3), true
-			case "dash": 
-				// HYPHEN
+			case "dash":                            // HYPHEN
 				return rune(0x2010), true
-			case "dashV": 
-				// DOUBLE VERTICAL BAR LEFT TURNSTILE
+			case "dashV":                           // DOUBLE VERTICAL BAR LEFT TURNSTILE
 				return rune(0x2ae3), true
-			case "dbkarow": 
-				// RIGHTWARDS TRIPLE DASH ARROW
+			case "dashv":                           // LEFT TACK
+				return rune(0x22a3), true
+			case "dbkarow":                         // RIGHTWARDS TRIPLE DASH ARROW
 				return rune(0x290f), true
-			case "dblac": 
-				// DOUBLE ACUTE ACCENT
+			case "dblac":                           // DOUBLE ACUTE ACCENT
 				return rune(0x02dd), true
-			case "dcaron": 
-				// LATIN SMALL LETTER D WITH CARON
+			case "dcaron":                          // LATIN SMALL LETTER D WITH CARON
 				return rune(0x010f), true
-			case "dcy": 
-				// CYRILLIC SMALL LETTER DE
+			case "dcy":                             // CYRILLIC SMALL LETTER DE
 				return rune(0x0434), true
-			case "ddarr": 
-				// DOWNWARDS PAIRED ARROWS
-				return rune(0x21ca), true
-			case "dd": 
-				// DOUBLE-STRUCK ITALIC SMALL D
+			case "dd":                              // DOUBLE-STRUCK ITALIC SMALL D
 				return rune(0x2146), true
-			case "ddagger": 
-				// DOUBLE DAGGER
+			case "ddagger":                         // DOUBLE DAGGER
 				return rune(0x2021), true
-			case "ddotseq": 
-				// EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+			case "ddarr":                           // DOWNWARDS PAIRED ARROWS
+				return rune(0x21ca), true
+			case "ddotseq":                         // EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
 				return rune(0x2a77), true
-			case "deg": 
-				// DEGREE SIGN
+			case "deg":                             // DEGREE SIGN
 				return rune(0xb0), true
-			case "delta": 
-				// GREEK SMALL LETTER DELTA
+			case "delta":                           // GREEK SMALL LETTER DELTA
 				return rune(0x03b4), true
-			case "demptyv": 
-				// EMPTY SET WITH OVERBAR
+			case "demptyv":                         // EMPTY SET WITH OVERBAR
 				return rune(0x29b1), true
-			case "dfisht": 
-				// DOWN FISH TAIL
+			case "dfisht":                          // DOWN FISH TAIL
 				return rune(0x297f), true
-			case "dfr": 
-				// MATHEMATICAL FRAKTUR SMALL D
+			case "dfr":                             // MATHEMATICAL FRAKTUR SMALL D
 				return rune(0x01d521), true
-			case "dgr": 
-				// GREEK SMALL LETTER DELTA
+			case "dgr":                             // GREEK SMALL LETTER DELTA
 				return rune(0x03b4), true
-			case "dharl": 
-				// DOWNWARDS HARPOON WITH BARB LEFTWARDS
+			case "dharl":                           // DOWNWARDS HARPOON WITH BARB LEFTWARDS
 				return rune(0x21c3), true
-			case "dharr": 
-				// DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+			case "dharr":                           // DOWNWARDS HARPOON WITH BARB RIGHTWARDS
 				return rune(0x21c2), true
-			case "diam": 
-				// DIAMOND OPERATOR
+			case "diam":                            // DIAMOND OPERATOR
 				return rune(0x22c4), true
-			case "diamdarr": 
-				// BLACK DIAMOND WITH DOWN ARROW
+			case "diamdarr":                        // BLACK DIAMOND WITH DOWN ARROW
 				return rune(0x29ea), true
-			case "diamerr": 
-				// ERROR-BARRED WHITE DIAMOND
+			case "diamerr":                         // ERROR-BARRED WHITE DIAMOND
 				return rune(0x29f0), true
-			case "diamerrf": 
-				// ERROR-BARRED BLACK DIAMOND
+			case "diamerrf":                        // ERROR-BARRED BLACK DIAMOND
 				return rune(0x29f1), true
-			case "diamond": 
-				// DIAMOND OPERATOR
+			case "diamond":                         // DIAMOND OPERATOR
 				return rune(0x22c4), true
-			case "diamondsuit": 
-				// BLACK DIAMOND SUIT
+			case "diamondsuit":                     // BLACK DIAMOND SUIT
 				return rune(0x2666), true
-			case "diams": 
-				// BLACK DIAMOND SUIT
+			case "diams":                           // BLACK DIAMOND SUIT
 				return rune(0x2666), true
-			case "die": 
-				// DIAERESIS
+			case "die":                             // DIAERESIS
 				return rune(0xa8), true
-			case "digamma": 
-				// GREEK SMALL LETTER DIGAMMA
+			case "digamma":                         // GREEK SMALL LETTER DIGAMMA
 				return rune(0x03dd), true
-			case "disin": 
-				// ELEMENT OF WITH LONG HORIZONTAL STROKE
+			case "disin":                           // ELEMENT OF WITH LONG HORIZONTAL STROKE
 				return rune(0x22f2), true
-			case "divideontimes": 
-				// DIVISION TIMES
-				return rune(0x22c7), true
-			case "divonx": 
-				// DIVISION TIMES
-				return rune(0x22c7), true
-			case "div": 
-				// DIVISION SIGN
+			case "div":                             // DIVISION SIGN
 				return rune(0xf7), true
-			case "divide": 
-				// DIVISION SIGN
+			case "divide":                          // DIVISION SIGN
 				return rune(0xf7), true
-			case "djcy": 
-				// CYRILLIC SMALL LETTER DJE
+			case "divideontimes":                   // DIVISION TIMES
+				return rune(0x22c7), true
+			case "divonx":                          // DIVISION TIMES
+				return rune(0x22c7), true
+			case "djcy":                            // CYRILLIC SMALL LETTER DJE
 				return rune(0x0452), true
-			case "dlarr": 
-				// SOUTH WEST ARROW
+			case "dlarr":                           // SOUTH WEST ARROW
 				return rune(0x2199), true
-			case "dlcorn": 
-				// BOTTOM LEFT CORNER
+			case "dlcorn":                          // BOTTOM LEFT CORNER
 				return rune(0x231e), true
-			case "dlcrop": 
-				// BOTTOM LEFT CROP
+			case "dlcrop":                          // BOTTOM LEFT CROP
 				return rune(0x230d), true
-			case "dlharb": 
-				// DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+			case "dlharb":                          // DOWNWARDS HARPOON WITH BARB LEFT TO BAR
 				return rune(0x2959), true
-			case "dollar": 
-				// DOLLAR SIGN
+			case "dollar":                          // DOLLAR SIGN
 				return rune(0x24), true
-			case "dopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL D
+			case "dopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL D
 				return rune(0x01d555), true
-			case "doteq": 
-				// APPROACHES THE LIMIT
+			case "dot":                             // DOT ABOVE
+				return rune(0x02d9), true
+			case "doteq":                           // APPROACHES THE LIMIT
 				return rune(0x2250), true
-			case "doteqdot": 
-				// GEOMETRICALLY EQUAL TO
+			case "doteqdot":                        // GEOMETRICALLY EQUAL TO
 				return rune(0x2251), true
-			case "dotminus": 
-				// DOT MINUS
+			case "dotminus":                        // DOT MINUS
 				return rune(0x2238), true
-			case "dotplus": 
-				// DOT PLUS
+			case "dotplus":                         // DOT PLUS
 				return rune(0x2214), true
-			case "dotsquare": 
-				// SQUARED DOT OPERATOR
+			case "dotsquare":                       // SQUARED DOT OPERATOR
 				return rune(0x22a1), true
-			case "dot": 
-				// DOT ABOVE
-				return rune(0x02d9), true
-			case "doublebarwedge": 
-				// PERSPECTIVE
+			case "doublebarwedge":                  // PERSPECTIVE
 				return rune(0x2306), true
-			case "downarrow": 
-				// DOWNWARDS ARROW
+			case "downarrow":                       // DOWNWARDS ARROW
 				return rune(0x2193), true
-			case "downdownarrows": 
-				// DOWNWARDS PAIRED ARROWS
+			case "downdownarrows":                  // DOWNWARDS PAIRED ARROWS
 				return rune(0x21ca), true
-			case "downharpoonleft": 
-				// DOWNWARDS HARPOON WITH BARB LEFTWARDS
+			case "downharpoonleft":                 // DOWNWARDS HARPOON WITH BARB LEFTWARDS
 				return rune(0x21c3), true
-			case "downharpoonright": 
-				// DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+			case "downharpoonright":                // DOWNWARDS HARPOON WITH BARB RIGHTWARDS
 				return rune(0x21c2), true
-			case "drarr": 
-				// SOUTH EAST ARROW
+			case "drarr":                           // SOUTH EAST ARROW
 				return rune(0x2198), true
-			case "drbkarow": 
-				// RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+			case "drbkarow":                        // RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
 				return rune(0x2910), true
-			case "drcorn": 
-				// BOTTOM RIGHT CORNER
+			case "drcorn":                          // BOTTOM RIGHT CORNER
 				return rune(0x231f), true
-			case "drcrop": 
-				// BOTTOM RIGHT CROP
+			case "drcrop":                          // BOTTOM RIGHT CROP
 				return rune(0x230c), true
-			case "drharb": 
-				// DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+			case "drharb":                          // DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
 				return rune(0x2955), true
-			case "dscr": 
-				// MATHEMATICAL SCRIPT SMALL D
+			case "dscr":                            // MATHEMATICAL SCRIPT SMALL D
 				return rune(0x01d4b9), true
-			case "dscy": 
-				// CYRILLIC SMALL LETTER DZE
+			case "dscy":                            // CYRILLIC SMALL LETTER DZE
 				return rune(0x0455), true
-			case "dsol": 
-				// SOLIDUS WITH OVERBAR
+			case "dsol":                            // SOLIDUS WITH OVERBAR
 				return rune(0x29f6), true
-			case "dstrok": 
-				// LATIN SMALL LETTER D WITH STROKE
+			case "dstrok":                          // LATIN SMALL LETTER D WITH STROKE
 				return rune(0x0111), true
-			case "dtdot": 
-				// DOWN RIGHT DIAGONAL ELLIPSIS
+			case "dtdot":                           // DOWN RIGHT DIAGONAL ELLIPSIS
 				return rune(0x22f1), true
-			case "dtrif": 
-				// BLACK DOWN-POINTING SMALL TRIANGLE
-				return rune(0x25be), true
-			case "dtri": 
-				// WHITE DOWN-POINTING SMALL TRIANGLE
+			case "dtri":                            // WHITE DOWN-POINTING SMALL TRIANGLE
 				return rune(0x25bf), true
-			case "dtrilf": 
-				// DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+			case "dtrif":                           // BLACK DOWN-POINTING SMALL TRIANGLE
+				return rune(0x25be), true
+			case "dtrilf":                          // DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
 				return rune(0x29e8), true
-			case "dtrirf": 
-				// DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+			case "dtrirf":                          // DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
 				return rune(0x29e9), true
-			case "duarr": 
-				// DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+			case "duarr":                           // DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
 				return rune(0x21f5), true
-			case "duhar": 
-				// DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+			case "duhar":                           // DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
 				return rune(0x296f), true
-			case "dumap": 
-				// DOUBLE-ENDED MULTIMAP
+			case "dumap":                           // DOUBLE-ENDED MULTIMAP
 				return rune(0x29df), true
-			case "dwangle": 
-				// OBLIQUE ANGLE OPENING UP
+			case "dwangle":                         // OBLIQUE ANGLE OPENING UP
 				return rune(0x29a6), true
-			case "dzcy": 
-				// CYRILLIC SMALL LETTER DZHE
+			case "dzcy":                            // CYRILLIC SMALL LETTER DZHE
 				return rune(0x045f), true
-			case "dzigrarr": 
-				// LONG RIGHTWARDS SQUIGGLE ARROW
+			case "dzigrarr":                        // LONG RIGHTWARDS SQUIGGLE ARROW
 				return rune(0x27ff), true
 		}
 
 	case 'e':
 		switch name {
-			case "eDDot": 
-				// EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+			case "eDDot":                           // EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
 				return rune(0x2a77), true
-			case "eDot": 
-				// GEOMETRICALLY EQUAL TO
+			case "eDot":                            // GEOMETRICALLY EQUAL TO
 				return rune(0x2251), true
-			case "eacgr": 
-				// GREEK SMALL LETTER EPSILON WITH TONOS
+			case "eacgr":                           // GREEK SMALL LETTER EPSILON WITH TONOS
 				return rune(0x03ad), true
-			case "eacute": 
-				// LATIN SMALL LETTER E WITH ACUTE
+			case "eacute":                          // LATIN SMALL LETTER E WITH ACUTE
 				return rune(0xe9), true
-			case "easter": 
-				// EQUALS WITH ASTERISK
+			case "easter":                          // EQUALS WITH ASTERISK
 				return rune(0x2a6e), true
-			case "ecaron": 
-				// LATIN SMALL LETTER E WITH CARON
+			case "ecaron":                          // LATIN SMALL LETTER E WITH CARON
 				return rune(0x011b), true
-			case "ecir": 
-				// RING IN EQUAL TO
+			case "ecir":                            // RING IN EQUAL TO
 				return rune(0x2256), true
-			case "ecirc": 
-				// LATIN SMALL LETTER E WITH CIRCUMFLEX
+			case "ecirc":                           // LATIN SMALL LETTER E WITH CIRCUMFLEX
 				return rune(0xea), true
-			case "ecolon": 
-				// EQUALS COLON
+			case "ecolon":                          // EQUALS COLON
 				return rune(0x2255), true
-			case "ecy": 
-				// CYRILLIC SMALL LETTER E
+			case "ecy":                             // CYRILLIC SMALL LETTER E
 				return rune(0x044d), true
-			case "edot": 
-				// LATIN SMALL LETTER E WITH DOT ABOVE
+			case "edot":                            // LATIN SMALL LETTER E WITH DOT ABOVE
 				return rune(0x0117), true
-			case "ee": 
-				// DOUBLE-STRUCK ITALIC SMALL E
+			case "ee":                              // DOUBLE-STRUCK ITALIC SMALL E
 				return rune(0x2147), true
-			case "eeacgr": 
-				// GREEK SMALL LETTER ETA WITH TONOS
+			case "eeacgr":                          // GREEK SMALL LETTER ETA WITH TONOS
 				return rune(0x03ae), true
-			case "eegr": 
-				// GREEK SMALL LETTER ETA
+			case "eegr":                            // GREEK SMALL LETTER ETA
 				return rune(0x03b7), true
-			case "efDot": 
-				// APPROXIMATELY EQUAL TO OR THE IMAGE OF
+			case "efDot":                           // APPROXIMATELY EQUAL TO OR THE IMAGE OF
 				return rune(0x2252), true
-			case "efr": 
-				// MATHEMATICAL FRAKTUR SMALL E
+			case "efr":                             // MATHEMATICAL FRAKTUR SMALL E
 				return rune(0x01d522), true
-			case "egr": 
-				// GREEK SMALL LETTER EPSILON
+			case "eg":                              // DOUBLE-LINE EQUAL TO OR GREATER-THAN
+				return rune(0x2a9a), true
+			case "egr":                             // GREEK SMALL LETTER EPSILON
 				return rune(0x03b5), true
-			case "egs": 
-				// SLANTED EQUAL TO OR GREATER-THAN
+			case "egrave":                          // LATIN SMALL LETTER E WITH GRAVE
+				return rune(0xe8), true
+			case "egs":                             // SLANTED EQUAL TO OR GREATER-THAN
 				return rune(0x2a96), true
-			case "egsdot": 
-				// SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+			case "egsdot":                          // SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
 				return rune(0x2a98), true
-			case "eg": 
-				// DOUBLE-LINE EQUAL TO OR GREATER-THAN
-				return rune(0x2a9a), true
-			case "egrave": 
-				// LATIN SMALL LETTER E WITH GRAVE
-				return rune(0xe8), true
-			case "elinters": 
-				// ELECTRICAL INTERSECTION
+			case "el":                              // DOUBLE-LINE EQUAL TO OR LESS-THAN
+				return rune(0x2a99), true
+			case "elinters":                        // ELECTRICAL INTERSECTION
 				return rune(0x23e7), true
-			case "ell": 
-				// SCRIPT SMALL L
+			case "ell":                             // SCRIPT SMALL L
 				return rune(0x2113), true
-			case "els": 
-				// SLANTED EQUAL TO OR LESS-THAN
+			case "els":                             // SLANTED EQUAL TO OR LESS-THAN
 				return rune(0x2a95), true
-			case "elsdot": 
-				// SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+			case "elsdot":                          // SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
 				return rune(0x2a97), true
-			case "el": 
-				// DOUBLE-LINE EQUAL TO OR LESS-THAN
-				return rune(0x2a99), true
-			case "emacr": 
-				// LATIN SMALL LETTER E WITH MACRON
+			case "emacr":                           // LATIN SMALL LETTER E WITH MACRON
 				return rune(0x0113), true
-			case "empty": 
-				// EMPTY SET
+			case "empty":                           // EMPTY SET
 				return rune(0x2205), true
-			case "emptyset": 
-				// EMPTY SET
+			case "emptyset":                        // EMPTY SET
 				return rune(0x2205), true
-			case "emptyv": 
-				// EMPTY SET
+			case "emptyv":                          // EMPTY SET
 				return rune(0x2205), true
-			case "emsp13": 
-				// THREE-PER-EM SPACE
+			case "emsp":                            // EM SPACE
+				return rune(0x2003), true
+			case "emsp13":                          // THREE-PER-EM SPACE
 				return rune(0x2004), true
-			case "emsp14": 
-				// FOUR-PER-EM SPACE
+			case "emsp14":                          // FOUR-PER-EM SPACE
 				return rune(0x2005), true
-			case "emsp": 
-				// EM SPACE
-				return rune(0x2003), true
-			case "eng": 
-				// LATIN SMALL LETTER ENG
+			case "eng":                             // LATIN SMALL LETTER ENG
 				return rune(0x014b), true
-			case "ensp": 
-				// EN SPACE
+			case "ensp":                            // EN SPACE
 				return rune(0x2002), true
-			case "eogon": 
-				// LATIN SMALL LETTER E WITH OGONEK
+			case "eogon":                           // LATIN SMALL LETTER E WITH OGONEK
 				return rune(0x0119), true
-			case "eopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL E
+			case "eopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL E
 				return rune(0x01d556), true
-			case "epar": 
-				// EQUAL AND PARALLEL TO
+			case "epar":                            // EQUAL AND PARALLEL TO
 				return rune(0x22d5), true
-			case "eparsl": 
-				// EQUALS SIGN AND SLANTED PARALLEL
+			case "eparsl":                          // EQUALS SIGN AND SLANTED PARALLEL
 				return rune(0x29e3), true
-			case "eplus": 
-				// EQUALS SIGN ABOVE PLUS SIGN
+			case "eplus":                           // EQUALS SIGN ABOVE PLUS SIGN
 				return rune(0x2a71), true
-			case "epsilon": 
-				// GREEK SMALL LETTER EPSILON
+			case "epsi":                            // GREEK SMALL LETTER EPSILON
+				return rune(0x03b5), true
+			case "epsilon":                         // GREEK SMALL LETTER EPSILON
 				return rune(0x03b5), true
-			case "epsis": 
-				// GREEK LUNATE EPSILON SYMBOL
+			case "epsis":                           // GREEK LUNATE EPSILON SYMBOL
 				return rune(0x03f5), true
-			case "epsiv": 
-				// GREEK LUNATE EPSILON SYMBOL
+			case "epsiv":                           // GREEK LUNATE EPSILON SYMBOL
 				return rune(0x03f5), true
-			case "epsi": 
-				// GREEK SMALL LETTER EPSILON
-				return rune(0x03b5), true
-			case "eqcirc": 
-				// RING IN EQUAL TO
+			case "eqcirc":                          // RING IN EQUAL TO
 				return rune(0x2256), true
-			case "eqcolon": 
-				// EQUALS COLON
+			case "eqcolon":                         // EQUALS COLON
 				return rune(0x2255), true
-			case "eqeq": 
-				// TWO CONSECUTIVE EQUALS SIGNS
+			case "eqeq":                            // TWO CONSECUTIVE EQUALS SIGNS
 				return rune(0x2a75), true
-			case "eqsim": 
-				// MINUS TILDE
+			case "eqsim":                           // MINUS TILDE
 				return rune(0x2242), true
-			case "eqslantgtr": 
-				// SLANTED EQUAL TO OR GREATER-THAN
+			case "eqslantgtr":                      // SLANTED EQUAL TO OR GREATER-THAN
 				return rune(0x2a96), true
-			case "eqslantless": 
-				// SLANTED EQUAL TO OR LESS-THAN
+			case "eqslantless":                     // SLANTED EQUAL TO OR LESS-THAN
 				return rune(0x2a95), true
-			case "equals": 
-				// EQUALS SIGN
+			case "equals":                          // EQUALS SIGN
 				return rune(0x3d), true
-			case "equest": 
-				// QUESTIONED EQUAL TO
+			case "equest":                          // QUESTIONED EQUAL TO
 				return rune(0x225f), true
-			case "equiv": 
-				// IDENTICAL TO
+			case "equiv":                           // IDENTICAL TO
 				return rune(0x2261), true
-			case "equivDD": 
-				// EQUIVALENT WITH FOUR DOTS ABOVE
+			case "equivDD":                         // EQUIVALENT WITH FOUR DOTS ABOVE
 				return rune(0x2a78), true
-			case "eqvparsl": 
-				// IDENTICAL TO AND SLANTED PARALLEL
+			case "eqvparsl":                        // IDENTICAL TO AND SLANTED PARALLEL
 				return rune(0x29e5), true
-			case "erDot": 
-				// IMAGE OF OR APPROXIMATELY EQUAL TO
+			case "erDot":                           // IMAGE OF OR APPROXIMATELY EQUAL TO
 				return rune(0x2253), true
-			case "erarr": 
-				// EQUALS SIGN ABOVE RIGHTWARDS ARROW
+			case "erarr":                           // EQUALS SIGN ABOVE RIGHTWARDS ARROW
 				return rune(0x2971), true
-			case "escr": 
-				// SCRIPT SMALL E
+			case "escr":                            // SCRIPT SMALL E
 				return rune(0x212f), true
-			case "esdot": 
-				// APPROACHES THE LIMIT
+			case "esdot":                           // APPROACHES THE LIMIT
 				return rune(0x2250), true
-			case "esim": 
-				// MINUS TILDE
+			case "esim":                            // MINUS TILDE
 				return rune(0x2242), true
-			case "eta": 
-				// GREEK SMALL LETTER ETA
+			case "eta":                             // GREEK SMALL LETTER ETA
 				return rune(0x03b7), true
-			case "eth": 
-				// LATIN SMALL LETTER ETH
+			case "eth":                             // LATIN SMALL LETTER ETH
 				return rune(0xf0), true
-			case "euml": 
-				// LATIN SMALL LETTER E WITH DIAERESIS
+			case "euml":                            // LATIN SMALL LETTER E WITH DIAERESIS
 				return rune(0xeb), true
-			case "euro": 
-				// EURO SIGN
+			case "euro":                            // EURO SIGN
 				return rune(0x20ac), true
-			case "excl": 
-				// EXCLAMATION MARK
+			case "excl":                            // EXCLAMATION MARK
 				return rune(0x21), true
-			case "exist": 
-				// THERE EXISTS
+			case "exist":                           // THERE EXISTS
 				return rune(0x2203), true
-			case "expectation": 
-				// SCRIPT CAPITAL E
+			case "expectation":                     // SCRIPT CAPITAL E
 				return rune(0x2130), true
-			case "exponentiale": 
-				// DOUBLE-STRUCK ITALIC SMALL E
+			case "exponentiale":                    // DOUBLE-STRUCK ITALIC SMALL E
 				return rune(0x2147), true
 		}
 
 	case 'f':
 		switch name {
-			case "fallingdotseq": 
-				// APPROXIMATELY EQUAL TO OR THE IMAGE OF
+			case "fallingdotseq":                   // APPROXIMATELY EQUAL TO OR THE IMAGE OF
 				return rune(0x2252), true
-			case "fbowtie": 
-				// BLACK BOWTIE
+			case "fbowtie":                         // BLACK BOWTIE
 				return rune(0x29d3), true
-			case "fcy": 
-				// CYRILLIC SMALL LETTER EF
+			case "fcy":                             // CYRILLIC SMALL LETTER EF
 				return rune(0x0444), true
-			case "fdiag": 
-				// BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+			case "fdiag":                           // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
 				return rune(0x2572), true
-			case "fdiordi": 
-				// FALLING DIAGONAL CROSSING RISING DIAGONAL
+			case "fdiordi":                         // FALLING DIAGONAL CROSSING RISING DIAGONAL
 				return rune(0x292c), true
-			case "fdonearr": 
-				// FALLING DIAGONAL CROSSING NORTH EAST ARROW
+			case "fdonearr":                        // FALLING DIAGONAL CROSSING NORTH EAST ARROW
 				return rune(0x292f), true
-			case "female": 
-				// FEMALE SIGN
+			case "female":                          // FEMALE SIGN
 				return rune(0x2640), true
-			case "ffilig": 
-				// LATIN SMALL LIGATURE FFI
+			case "ffilig":                          // LATIN SMALL LIGATURE FFI
 				return rune(0xfb03), true
-			case "fflig": 
-				// LATIN SMALL LIGATURE FF
+			case "fflig":                           // LATIN SMALL LIGATURE FF
 				return rune(0xfb00), true
-			case "ffllig": 
-				// LATIN SMALL LIGATURE FFL
+			case "ffllig":                          // LATIN SMALL LIGATURE FFL
 				return rune(0xfb04), true
-			case "ffr": 
-				// MATHEMATICAL FRAKTUR SMALL F
+			case "ffr":                             // MATHEMATICAL FRAKTUR SMALL F
 				return rune(0x01d523), true
-			case "fhrglass": 
-				// BLACK HOURGLASS
+			case "fhrglass":                        // BLACK HOURGLASS
 				return rune(0x29d7), true
-			case "filig": 
-				// LATIN SMALL LIGATURE FI
+			case "filig":                           // LATIN SMALL LIGATURE FI
 				return rune(0xfb01), true
-			case "fjlig": 
-				// fj ligature
+			case "fjlig":                           // fj ligature
 				return rune(0x66), true
-			case "flat": 
-				// MUSIC FLAT SIGN
+			case "flat":                            // MUSIC FLAT SIGN
 				return rune(0x266d), true
-			case "fllig": 
-				// LATIN SMALL LIGATURE FL
+			case "fllig":                           // LATIN SMALL LIGATURE FL
 				return rune(0xfb02), true
-			case "fltns": 
-				// WHITE PARALLELOGRAM
+			case "fltns":                           // WHITE PARALLELOGRAM
 				return rune(0x25b1), true
-			case "fnof": 
-				// LATIN SMALL LETTER F WITH HOOK
+			case "fnof":                            // LATIN SMALL LETTER F WITH HOOK
 				return rune(0x0192), true
-			case "fopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL F
+			case "fopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL F
 				return rune(0x01d557), true
-			case "forall": 
-				// FOR ALL
+			case "forall":                          // FOR ALL
 				return rune(0x2200), true
-			case "fork": 
-				// PITCHFORK
+			case "fork":                            // PITCHFORK
 				return rune(0x22d4), true
-			case "forkv": 
-				// ELEMENT OF OPENING DOWNWARDS
+			case "forkv":                           // ELEMENT OF OPENING DOWNWARDS
 				return rune(0x2ad9), true
-			case "fpartint": 
-				// FINITE PART INTEGRAL
+			case "fpartint":                        // FINITE PART INTEGRAL
 				return rune(0x2a0d), true
-			case "frac12": 
-				// VULGAR FRACTION ONE HALF
+			case "frac12":                          // VULGAR FRACTION ONE HALF
 				return rune(0xbd), true
-			case "frac13": 
-				// VULGAR FRACTION ONE THIRD
+			case "frac13":                          // VULGAR FRACTION ONE THIRD
 				return rune(0x2153), true
-			case "frac14": 
-				// VULGAR FRACTION ONE QUARTER
+			case "frac14":                          // VULGAR FRACTION ONE QUARTER
 				return rune(0xbc), true
-			case "frac15": 
-				// VULGAR FRACTION ONE FIFTH
+			case "frac15":                          // VULGAR FRACTION ONE FIFTH
 				return rune(0x2155), true
-			case "frac16": 
-				// VULGAR FRACTION ONE SIXTH
+			case "frac16":                          // VULGAR FRACTION ONE SIXTH
 				return rune(0x2159), true
-			case "frac18": 
-				// VULGAR FRACTION ONE EIGHTH
+			case "frac18":                          // VULGAR FRACTION ONE EIGHTH
 				return rune(0x215b), true
-			case "frac23": 
-				// VULGAR FRACTION TWO THIRDS
+			case "frac23":                          // VULGAR FRACTION TWO THIRDS
 				return rune(0x2154), true
-			case "frac25": 
-				// VULGAR FRACTION TWO FIFTHS
+			case "frac25":                          // VULGAR FRACTION TWO FIFTHS
 				return rune(0x2156), true
-			case "frac34": 
-				// VULGAR FRACTION THREE QUARTERS
+			case "frac34":                          // VULGAR FRACTION THREE QUARTERS
 				return rune(0xbe), true
-			case "frac35": 
-				// VULGAR FRACTION THREE FIFTHS
+			case "frac35":                          // VULGAR FRACTION THREE FIFTHS
 				return rune(0x2157), true
-			case "frac38": 
-				// VULGAR FRACTION THREE EIGHTHS
+			case "frac38":                          // VULGAR FRACTION THREE EIGHTHS
 				return rune(0x215c), true
-			case "frac45": 
-				// VULGAR FRACTION FOUR FIFTHS
+			case "frac45":                          // VULGAR FRACTION FOUR FIFTHS
 				return rune(0x2158), true
-			case "frac56": 
-				// VULGAR FRACTION FIVE SIXTHS
+			case "frac56":                          // VULGAR FRACTION FIVE SIXTHS
 				return rune(0x215a), true
-			case "frac58": 
-				// VULGAR FRACTION FIVE EIGHTHS
+			case "frac58":                          // VULGAR FRACTION FIVE EIGHTHS
 				return rune(0x215d), true
-			case "frac78": 
-				// VULGAR FRACTION SEVEN EIGHTHS
+			case "frac78":                          // VULGAR FRACTION SEVEN EIGHTHS
 				return rune(0x215e), true
-			case "frasl": 
-				// FRACTION SLASH
+			case "frasl":                           // FRACTION SLASH
 				return rune(0x2044), true
-			case "frown": 
-				// FROWN
+			case "frown":                           // FROWN
 				return rune(0x2322), true
-			case "fscr": 
-				// MATHEMATICAL SCRIPT SMALL F
+			case "fscr":                            // MATHEMATICAL SCRIPT SMALL F
 				return rune(0x01d4bb), true
 		}
 
 	case 'g':
 		switch name {
-			case "gE": 
-				// GREATER-THAN OVER EQUAL TO
+			case "gE":                              // GREATER-THAN OVER EQUAL TO
 				return rune(0x2267), true
-			case "gEl": 
-				// GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+			case "gEl":                             // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
 				return rune(0x2a8c), true
-			case "gacute": 
-				// LATIN SMALL LETTER G WITH ACUTE
+			case "gacute":                          // LATIN SMALL LETTER G WITH ACUTE
 				return rune(0x01f5), true
-			case "gammad": 
-				// GREEK SMALL LETTER DIGAMMA
-				return rune(0x03dd), true
-			case "gamma": 
-				// GREEK SMALL LETTER GAMMA
+			case "gamma":                           // GREEK SMALL LETTER GAMMA
 				return rune(0x03b3), true
-			case "gap": 
-				// GREATER-THAN OR APPROXIMATE
+			case "gammad":                          // GREEK SMALL LETTER DIGAMMA
+				return rune(0x03dd), true
+			case "gap":                             // GREATER-THAN OR APPROXIMATE
 				return rune(0x2a86), true
-			case "gbreve": 
-				// LATIN SMALL LETTER G WITH BREVE
+			case "gbreve":                          // LATIN SMALL LETTER G WITH BREVE
 				return rune(0x011f), true
-			case "gcedil": 
-				// LATIN SMALL LETTER G WITH CEDILLA
+			case "gcedil":                          // LATIN SMALL LETTER G WITH CEDILLA
 				return rune(0x0123), true
-			case "gcirc": 
-				// LATIN SMALL LETTER G WITH CIRCUMFLEX
+			case "gcirc":                           // LATIN SMALL LETTER G WITH CIRCUMFLEX
 				return rune(0x011d), true
-			case "gcy": 
-				// CYRILLIC SMALL LETTER GHE
+			case "gcy":                             // CYRILLIC SMALL LETTER GHE
 				return rune(0x0433), true
-			case "gdot": 
-				// LATIN SMALL LETTER G WITH DOT ABOVE
+			case "gdot":                            // LATIN SMALL LETTER G WITH DOT ABOVE
 				return rune(0x0121), true
-			case "ge": 
-				// GREATER-THAN OR EQUAL TO
+			case "ge":                              // GREATER-THAN OR EQUAL TO
 				return rune(0x2265), true
-			case "gel": 
-				// GREATER-THAN EQUAL TO OR LESS-THAN
+			case "gel":                             // GREATER-THAN EQUAL TO OR LESS-THAN
 				return rune(0x22db), true
-			case "geq": 
-				// GREATER-THAN OR EQUAL TO
+			case "geq":                             // GREATER-THAN OR EQUAL TO
 				return rune(0x2265), true
-			case "geqq": 
-				// GREATER-THAN OVER EQUAL TO
+			case "geqq":                            // GREATER-THAN OVER EQUAL TO
 				return rune(0x2267), true
-			case "geqslant": 
-				// GREATER-THAN OR SLANTED EQUAL TO
+			case "geqslant":                        // GREATER-THAN OR SLANTED EQUAL TO
 				return rune(0x2a7e), true
-			case "gesl": 
-				// GREATER-THAN slanted EQUAL TO OR LESS-THAN
-				return rune(0x22db), true
-			case "ges": 
-				// GREATER-THAN OR SLANTED EQUAL TO
+			case "ges":                             // GREATER-THAN OR SLANTED EQUAL TO
 				return rune(0x2a7e), true
-			case "gescc": 
-				// GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+			case "gescc":                           // GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
 				return rune(0x2aa9), true
-			case "gesdot": 
-				// GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+			case "gesdot":                          // GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
 				return rune(0x2a80), true
-			case "gesdoto": 
-				// GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+			case "gesdoto":                         // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
 				return rune(0x2a82), true
-			case "gesdotol": 
-				// GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+			case "gesdotol":                        // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
 				return rune(0x2a84), true
-			case "gesles": 
-				// GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+			case "gesl":                            // GREATER-THAN slanted EQUAL TO OR LESS-THAN
+				return rune(0x22db), true
+			case "gesles":                          // GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
 				return rune(0x2a94), true
-			case "gfr": 
-				// MATHEMATICAL FRAKTUR SMALL G
+			case "gfr":                             // MATHEMATICAL FRAKTUR SMALL G
 				return rune(0x01d524), true
-			case "gg": 
-				// MUCH GREATER-THAN
+			case "gg":                              // MUCH GREATER-THAN
 				return rune(0x226b), true
-			case "ggg": 
-				// VERY MUCH GREATER-THAN
+			case "ggg":                             // VERY MUCH GREATER-THAN
 				return rune(0x22d9), true
-			case "ggr": 
-				// GREEK SMALL LETTER GAMMA
+			case "ggr":                             // GREEK SMALL LETTER GAMMA
 				return rune(0x03b3), true
-			case "gimel": 
-				// GIMEL SYMBOL
+			case "gimel":                           // GIMEL SYMBOL
 				return rune(0x2137), true
-			case "gjcy": 
-				// CYRILLIC SMALL LETTER GJE
+			case "gjcy":                            // CYRILLIC SMALL LETTER GJE
 				return rune(0x0453), true
-			case "gl": 
-				// GREATER-THAN OR LESS-THAN
+			case "gl":                              // GREATER-THAN OR LESS-THAN
 				return rune(0x2277), true
-			case "glE": 
-				// GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+			case "glE":                             // GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
 				return rune(0x2a92), true
-			case "gla": 
-				// GREATER-THAN BESIDE LESS-THAN
+			case "gla":                             // GREATER-THAN BESIDE LESS-THAN
 				return rune(0x2aa5), true
-			case "glj": 
-				// GREATER-THAN OVERLAPPING LESS-THAN
+			case "glj":                             // GREATER-THAN OVERLAPPING LESS-THAN
 				return rune(0x2aa4), true
-			case "gnE": 
-				// GREATER-THAN BUT NOT EQUAL TO
+			case "gnE":                             // GREATER-THAN BUT NOT EQUAL TO
 				return rune(0x2269), true
-			case "gnap": 
-				// GREATER-THAN AND NOT APPROXIMATE
+			case "gnap":                            // GREATER-THAN AND NOT APPROXIMATE
 				return rune(0x2a8a), true
-			case "gnapprox": 
-				// GREATER-THAN AND NOT APPROXIMATE
+			case "gnapprox":                        // GREATER-THAN AND NOT APPROXIMATE
 				return rune(0x2a8a), true
-			case "gneqq": 
-				// GREATER-THAN BUT NOT EQUAL TO
-				return rune(0x2269), true
-			case "gne": 
-				// GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+			case "gne":                             // GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
 				return rune(0x2a88), true
-			case "gneq": 
-				// GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+			case "gneq":                            // GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
 				return rune(0x2a88), true
-			case "gnsim": 
-				// GREATER-THAN BUT NOT EQUIVALENT TO
+			case "gneqq":                           // GREATER-THAN BUT NOT EQUAL TO
+				return rune(0x2269), true
+			case "gnsim":                           // GREATER-THAN BUT NOT EQUIVALENT TO
 				return rune(0x22e7), true
-			case "gopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL G
+			case "gopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL G
 				return rune(0x01d558), true
-			case "grave": 
-				// GRAVE ACCENT
+			case "grave":                           // GRAVE ACCENT
 				return rune(0x60), true
-			case "gscr": 
-				// SCRIPT SMALL G
+			case "gscr":                            // SCRIPT SMALL G
 				return rune(0x210a), true
-			case "gsdot": 
-				// GREATER-THAN WITH DOT
+			case "gsdot":                           // GREATER-THAN WITH DOT
 				return rune(0x22d7), true
-			case "gsim": 
-				// GREATER-THAN OR EQUIVALENT TO
+			case "gsim":                            // GREATER-THAN OR EQUIVALENT TO
 				return rune(0x2273), true
-			case "gsime": 
-				// GREATER-THAN ABOVE SIMILAR OR EQUAL
+			case "gsime":                           // GREATER-THAN ABOVE SIMILAR OR EQUAL
 				return rune(0x2a8e), true
-			case "gsiml": 
-				// GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+			case "gsiml":                           // GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
 				return rune(0x2a90), true
-			case "gtcc": 
-				// GREATER-THAN CLOSED BY CURVE
+			case "gt":                              // GREATER-THAN SIGN
+				return rune(0x3e), true
+			case "gtcc":                            // GREATER-THAN CLOSED BY CURVE
 				return rune(0x2aa7), true
-			case "gtcir": 
-				// GREATER-THAN WITH CIRCLE INSIDE
+			case "gtcir":                           // GREATER-THAN WITH CIRCLE INSIDE
 				return rune(0x2a7a), true
-			case "gtdot": 
-				// GREATER-THAN WITH DOT
+			case "gtdot":                           // GREATER-THAN WITH DOT
 				return rune(0x22d7), true
-			case "gtlPar": 
-				// DOUBLE LEFT ARC GREATER-THAN BRACKET
+			case "gtlPar":                          // DOUBLE LEFT ARC GREATER-THAN BRACKET
 				return rune(0x2995), true
-			case "gtquest": 
-				// GREATER-THAN WITH QUESTION MARK ABOVE
+			case "gtquest":                         // GREATER-THAN WITH QUESTION MARK ABOVE
 				return rune(0x2a7c), true
-			case "gtrapprox": 
-				// GREATER-THAN OR APPROXIMATE
+			case "gtrapprox":                       // GREATER-THAN OR APPROXIMATE
 				return rune(0x2a86), true
-			case "gtrarr": 
-				// GREATER-THAN ABOVE RIGHTWARDS ARROW
+			case "gtrarr":                          // GREATER-THAN ABOVE RIGHTWARDS ARROW
 				return rune(0x2978), true
-			case "gtrdot": 
-				// GREATER-THAN WITH DOT
+			case "gtrdot":                          // GREATER-THAN WITH DOT
 				return rune(0x22d7), true
-			case "gtreqless": 
-				// GREATER-THAN EQUAL TO OR LESS-THAN
+			case "gtreqless":                       // GREATER-THAN EQUAL TO OR LESS-THAN
 				return rune(0x22db), true
-			case "gtreqqless": 
-				// GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+			case "gtreqqless":                      // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
 				return rune(0x2a8c), true
-			case "gtrless": 
-				// GREATER-THAN OR LESS-THAN
+			case "gtrless":                         // GREATER-THAN OR LESS-THAN
 				return rune(0x2277), true
-			case "gtrpar": 
-				// SPHERICAL ANGLE OPENING LEFT
+			case "gtrpar":                          // SPHERICAL ANGLE OPENING LEFT
 				return rune(0x29a0), true
-			case "gtrsim": 
-				// GREATER-THAN OR EQUIVALENT TO
+			case "gtrsim":                          // GREATER-THAN OR EQUIVALENT TO
 				return rune(0x2273), true
-			case "gt": 
-				// GREATER-THAN SIGN
-				return rune(0x3e), true
-			case "gvertneqq": 
-				// GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+			case "gvertneqq":                       // GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
 				return rune(0x2269), true
-			case "gvnE": 
-				// GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+			case "gvnE":                            // GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
 				return rune(0x2269), true
 		}
 
 	case 'h':
 		switch name {
-			case "hArr": 
-				// LEFT RIGHT DOUBLE ARROW
+			case "hArr":                            // LEFT RIGHT DOUBLE ARROW
 				return rune(0x21d4), true
-			case "hairsp": 
-				// HAIR SPACE
+			case "hairsp":                          // HAIR SPACE
 				return rune(0x200a), true
-			case "half": 
-				// VULGAR FRACTION ONE HALF
+			case "half":                            // VULGAR FRACTION ONE HALF
 				return rune(0xbd), true
-			case "hamilt": 
-				// SCRIPT CAPITAL H
+			case "hamilt":                          // SCRIPT CAPITAL H
 				return rune(0x210b), true
-			case "hardcy": 
-				// CYRILLIC SMALL LETTER HARD SIGN
+			case "hardcy":                          // CYRILLIC SMALL LETTER HARD SIGN
 				return rune(0x044a), true
-			case "harrw": 
-				// LEFT RIGHT WAVE ARROW
-				return rune(0x21ad), true
-			case "harr": 
-				// LEFT RIGHT ARROW
+			case "harr":                            // LEFT RIGHT ARROW
 				return rune(0x2194), true
-			case "harrcir": 
-				// LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+			case "harrcir":                         // LEFT RIGHT ARROW THROUGH SMALL CIRCLE
 				return rune(0x2948), true
-			case "hbar": 
-				// PLANCK CONSTANT OVER TWO PI
+			case "harrw":                           // LEFT RIGHT WAVE ARROW
+				return rune(0x21ad), true
+			case "hbar":                            // PLANCK CONSTANT OVER TWO PI
 				return rune(0x210f), true
-			case "hcirc": 
-				// LATIN SMALL LETTER H WITH CIRCUMFLEX
+			case "hcirc":                           // LATIN SMALL LETTER H WITH CIRCUMFLEX
 				return rune(0x0125), true
-			case "hearts": 
-				// BLACK HEART SUIT
+			case "hearts":                          // BLACK HEART SUIT
 				return rune(0x2665), true
-			case "heartsuit": 
-				// BLACK HEART SUIT
+			case "heartsuit":                       // BLACK HEART SUIT
 				return rune(0x2665), true
-			case "hellip": 
-				// HORIZONTAL ELLIPSIS
+			case "hellip":                          // HORIZONTAL ELLIPSIS
 				return rune(0x2026), true
-			case "hercon": 
-				// HERMITIAN CONJUGATE MATRIX
+			case "hercon":                          // HERMITIAN CONJUGATE MATRIX
 				return rune(0x22b9), true
-			case "hfr": 
-				// MATHEMATICAL FRAKTUR SMALL H
+			case "hfr":                             // MATHEMATICAL FRAKTUR SMALL H
 				return rune(0x01d525), true
-			case "hksearow": 
-				// SOUTH EAST ARROW WITH HOOK
+			case "hksearow":                        // SOUTH EAST ARROW WITH HOOK
 				return rune(0x2925), true
-			case "hkswarow": 
-				// SOUTH WEST ARROW WITH HOOK
+			case "hkswarow":                        // SOUTH WEST ARROW WITH HOOK
 				return rune(0x2926), true
-			case "hoarr": 
-				// LEFT RIGHT OPEN-HEADED ARROW
+			case "hoarr":                           // LEFT RIGHT OPEN-HEADED ARROW
 				return rune(0x21ff), true
-			case "homtht": 
-				// HOMOTHETIC
+			case "homtht":                          // HOMOTHETIC
 				return rune(0x223b), true
-			case "hookleftarrow": 
-				// LEFTWARDS ARROW WITH HOOK
+			case "hookleftarrow":                   // LEFTWARDS ARROW WITH HOOK
 				return rune(0x21a9), true
-			case "hookrightarrow": 
-				// RIGHTWARDS ARROW WITH HOOK
+			case "hookrightarrow":                  // RIGHTWARDS ARROW WITH HOOK
 				return rune(0x21aa), true
-			case "hopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL H
+			case "hopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL H
 				return rune(0x01d559), true
-			case "horbar": 
-				// HORIZONTAL BAR
+			case "horbar":                          // HORIZONTAL BAR
 				return rune(0x2015), true
-			case "hrglass": 
-				// WHITE HOURGLASS
+			case "hrglass":                         // WHITE HOURGLASS
 				return rune(0x29d6), true
-			case "hscr": 
-				// MATHEMATICAL SCRIPT SMALL H
+			case "hscr":                            // MATHEMATICAL SCRIPT SMALL H
 				return rune(0x01d4bd), true
-			case "hslash": 
-				// PLANCK CONSTANT OVER TWO PI
+			case "hslash":                          // PLANCK CONSTANT OVER TWO PI
 				return rune(0x210f), true
-			case "hstrok": 
-				// LATIN SMALL LETTER H WITH STROKE
+			case "hstrok":                          // LATIN SMALL LETTER H WITH STROKE
 				return rune(0x0127), true
-			case "htimes": 
-				// VECTOR OR CROSS PRODUCT
+			case "htimes":                          // VECTOR OR CROSS PRODUCT
 				return rune(0x2a2f), true
-			case "hybull": 
-				// HYPHEN BULLET
+			case "hybull":                          // HYPHEN BULLET
 				return rune(0x2043), true
-			case "hyphen": 
-				// HYPHEN
+			case "hyphen":                          // HYPHEN
 				return rune(0x2010), true
 		}
 
 	case 'i':
 		switch name {
-			case "iacgr": 
-				// GREEK SMALL LETTER IOTA WITH TONOS
+			case "iacgr":                           // GREEK SMALL LETTER IOTA WITH TONOS
 				return rune(0x03af), true
-			case "iacute": 
-				// LATIN SMALL LETTER I WITH ACUTE
+			case "iacute":                          // LATIN SMALL LETTER I WITH ACUTE
 				return rune(0xed), true
-			case "ic": 
-				// INVISIBLE SEPARATOR
+			case "ic":                              // INVISIBLE SEPARATOR
 				return rune(0x2063), true
-			case "icirc": 
-				// LATIN SMALL LETTER I WITH CIRCUMFLEX
+			case "icirc":                           // LATIN SMALL LETTER I WITH CIRCUMFLEX
 				return rune(0xee), true
-			case "icy": 
-				// CYRILLIC SMALL LETTER I
+			case "icy":                             // CYRILLIC SMALL LETTER I
 				return rune(0x0438), true
-			case "idiagr": 
-				// GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+			case "idiagr":                          // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
 				return rune(0x0390), true
-			case "idigr": 
-				// GREEK SMALL LETTER IOTA WITH DIALYTIKA
+			case "idigr":                           // GREEK SMALL LETTER IOTA WITH DIALYTIKA
 				return rune(0x03ca), true
-			case "iecy": 
-				// CYRILLIC SMALL LETTER IE
+			case "iecy":                            // CYRILLIC SMALL LETTER IE
 				return rune(0x0435), true
-			case "iexcl": 
-				// INVERTED EXCLAMATION MARK
+			case "iexcl":                           // INVERTED EXCLAMATION MARK
 				return rune(0xa1), true
-			case "iff": 
-				// LEFT RIGHT DOUBLE ARROW
+			case "iff":                             // LEFT RIGHT DOUBLE ARROW
 				return rune(0x21d4), true
-			case "ifr": 
-				// MATHEMATICAL FRAKTUR SMALL I
+			case "ifr":                             // MATHEMATICAL FRAKTUR SMALL I
 				return rune(0x01d526), true
-			case "igr": 
-				// GREEK SMALL LETTER IOTA
+			case "igr":                             // GREEK SMALL LETTER IOTA
 				return rune(0x03b9), true
-			case "igrave": 
-				// LATIN SMALL LETTER I WITH GRAVE
+			case "igrave":                          // LATIN SMALL LETTER I WITH GRAVE
 				return rune(0xec), true
-			case "iiint": 
-				// TRIPLE INTEGRAL
-				return rune(0x222d), true
-			case "ii": 
-				// DOUBLE-STRUCK ITALIC SMALL I
+			case "ii":                              // DOUBLE-STRUCK ITALIC SMALL I
 				return rune(0x2148), true
-			case "iiiint": 
-				// QUADRUPLE INTEGRAL OPERATOR
+			case "iiiint":                          // QUADRUPLE INTEGRAL OPERATOR
 				return rune(0x2a0c), true
-			case "iinfin": 
-				// INCOMPLETE INFINITY
+			case "iiint":                           // TRIPLE INTEGRAL
+				return rune(0x222d), true
+			case "iinfin":                          // INCOMPLETE INFINITY
 				return rune(0x29dc), true
-			case "iiota": 
-				// TURNED GREEK SMALL LETTER IOTA
+			case "iiota":                           // TURNED GREEK SMALL LETTER IOTA
 				return rune(0x2129), true
-			case "ijlig": 
-				// LATIN SMALL LIGATURE IJ
+			case "ijlig":                           // LATIN SMALL LIGATURE IJ
 				return rune(0x0133), true
-			case "imacr": 
-				// LATIN SMALL LETTER I WITH MACRON
+			case "imacr":                           // LATIN SMALL LETTER I WITH MACRON
 				return rune(0x012b), true
-			case "image": 
-				// BLACK-LETTER CAPITAL I
+			case "image":                           // BLACK-LETTER CAPITAL I
 				return rune(0x2111), true
-			case "imagline": 
-				// SCRIPT CAPITAL I
+			case "imagline":                        // SCRIPT CAPITAL I
 				return rune(0x2110), true
-			case "imagpart": 
-				// BLACK-LETTER CAPITAL I
+			case "imagpart":                        // BLACK-LETTER CAPITAL I
 				return rune(0x2111), true
-			case "imath": 
-				// LATIN SMALL LETTER DOTLESS I
+			case "imath":                           // LATIN SMALL LETTER DOTLESS I
 				return rune(0x0131), true
-			case "imof": 
-				// IMAGE OF
+			case "imof":                            // IMAGE OF
 				return rune(0x22b7), true
-			case "imped": 
-				// LATIN CAPITAL LETTER Z WITH STROKE
+			case "imped":                           // LATIN CAPITAL LETTER Z WITH STROKE
 				return rune(0x01b5), true
-			case "in": 
-				// ELEMENT OF
+			case "in":                              // ELEMENT OF
 				return rune(0x2208), true
-			case "incare": 
-				// CARE OF
+			case "incare":                          // CARE OF
 				return rune(0x2105), true
-			case "infin": 
-				// INFINITY
+			case "infin":                           // INFINITY
 				return rune(0x221e), true
-			case "infintie": 
-				// TIE OVER INFINITY
+			case "infintie":                        // TIE OVER INFINITY
 				return rune(0x29dd), true
-			case "inodot": 
-				// LATIN SMALL LETTER DOTLESS I
+			case "inodot":                          // LATIN SMALL LETTER DOTLESS I
 				return rune(0x0131), true
-			case "int": 
-				// INTEGRAL
+			case "int":                             // INTEGRAL
 				return rune(0x222b), true
-			case "intcal": 
-				// INTERCALATE
+			case "intcal":                          // INTERCALATE
 				return rune(0x22ba), true
-			case "integers": 
-				// DOUBLE-STRUCK CAPITAL Z
+			case "integers":                        // DOUBLE-STRUCK CAPITAL Z
 				return rune(0x2124), true
-			case "intercal": 
-				// INTERCALATE
+			case "intercal":                        // INTERCALATE
 				return rune(0x22ba), true
-			case "intlarhk": 
-				// INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+			case "intlarhk":                        // INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
 				return rune(0x2a17), true
-			case "intprod": 
-				// INTERIOR PRODUCT
+			case "intprod":                         // INTERIOR PRODUCT
 				return rune(0x2a3c), true
-			case "iocy": 
-				// CYRILLIC SMALL LETTER IO
+			case "iocy":                            // CYRILLIC SMALL LETTER IO
 				return rune(0x0451), true
-			case "iogon": 
-				// LATIN SMALL LETTER I WITH OGONEK
+			case "iogon":                           // LATIN SMALL LETTER I WITH OGONEK
 				return rune(0x012f), true
-			case "iopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL I
+			case "iopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL I
 				return rune(0x01d55a), true
-			case "iota": 
-				// GREEK SMALL LETTER IOTA
+			case "iota":                            // GREEK SMALL LETTER IOTA
 				return rune(0x03b9), true
-			case "iprod": 
-				// INTERIOR PRODUCT
+			case "iprod":                           // INTERIOR PRODUCT
 				return rune(0x2a3c), true
-			case "iprodr": 
-				// RIGHTHAND INTERIOR PRODUCT
+			case "iprodr":                          // RIGHTHAND INTERIOR PRODUCT
 				return rune(0x2a3d), true
-			case "iquest": 
-				// INVERTED QUESTION MARK
+			case "iquest":                          // INVERTED QUESTION MARK
 				return rune(0xbf), true
-			case "iscr": 
-				// MATHEMATICAL SCRIPT SMALL I
+			case "iscr":                            // MATHEMATICAL SCRIPT SMALL I
 				return rune(0x01d4be), true
-			case "isin": 
-				// ELEMENT OF
+			case "isin":                            // ELEMENT OF
 				return rune(0x2208), true
-			case "isinE": 
-				// ELEMENT OF WITH TWO HORIZONTAL STROKES
+			case "isinE":                           // ELEMENT OF WITH TWO HORIZONTAL STROKES
 				return rune(0x22f9), true
-			case "isindot": 
-				// ELEMENT OF WITH DOT ABOVE
+			case "isindot":                         // ELEMENT OF WITH DOT ABOVE
 				return rune(0x22f5), true
-			case "isinsv": 
-				// ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
-				return rune(0x22f3), true
-			case "isins": 
-				// SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+			case "isins":                           // SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
 				return rune(0x22f4), true
-			case "isinv": 
-				// ELEMENT OF
+			case "isinsv":                          // ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+				return rune(0x22f3), true
+			case "isinv":                           // ELEMENT OF
 				return rune(0x2208), true
-			case "isinvb": 
-				// ELEMENT OF WITH UNDERBAR
+			case "isinvb":                          // ELEMENT OF WITH UNDERBAR
 				return rune(0x22f8), true
-			case "it": 
-				// INVISIBLE TIMES
+			case "it":                              // INVISIBLE TIMES
 				return rune(0x2062), true
-			case "itilde": 
-				// LATIN SMALL LETTER I WITH TILDE
+			case "itilde":                          // LATIN SMALL LETTER I WITH TILDE
 				return rune(0x0129), true
-			case "iukcy": 
-				// CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+			case "iukcy":                           // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
 				return rune(0x0456), true
-			case "iuml": 
-				// LATIN SMALL LETTER I WITH DIAERESIS
+			case "iuml":                            // LATIN SMALL LETTER I WITH DIAERESIS
 				return rune(0xef), true
 		}
 
 	case 'j':
 		switch name {
-			case "jcirc": 
-				// LATIN SMALL LETTER J WITH CIRCUMFLEX
+			case "jcirc":                           // LATIN SMALL LETTER J WITH CIRCUMFLEX
 				return rune(0x0135), true
-			case "jcy": 
-				// CYRILLIC SMALL LETTER SHORT I
+			case "jcy":                             // CYRILLIC SMALL LETTER SHORT I
 				return rune(0x0439), true
-			case "jfr": 
-				// MATHEMATICAL FRAKTUR SMALL J
+			case "jfr":                             // MATHEMATICAL FRAKTUR SMALL J
 				return rune(0x01d527), true
-			case "jmath": 
-				// LATIN SMALL LETTER DOTLESS J
+			case "jmath":                           // LATIN SMALL LETTER DOTLESS J
 				return rune(0x0237), true
-			case "jnodot": 
-				// LATIN SMALL LETTER DOTLESS J
+			case "jnodot":                          // LATIN SMALL LETTER DOTLESS J
 				return rune(0x0237), true
-			case "jopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL J
+			case "jopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL J
 				return rune(0x01d55b), true
-			case "jscr": 
-				// MATHEMATICAL SCRIPT SMALL J
+			case "jscr":                            // MATHEMATICAL SCRIPT SMALL J
 				return rune(0x01d4bf), true
-			case "jsercy": 
-				// CYRILLIC SMALL LETTER JE
+			case "jsercy":                          // CYRILLIC SMALL LETTER JE
 				return rune(0x0458), true
-			case "jukcy": 
-				// CYRILLIC SMALL LETTER UKRAINIAN IE
+			case "jukcy":                           // CYRILLIC SMALL LETTER UKRAINIAN IE
 				return rune(0x0454), true
 		}
 
 	case 'k':
 		switch name {
-			case "kappav": 
-				// GREEK KAPPA SYMBOL
-				return rune(0x03f0), true
-			case "kappa": 
-				// GREEK SMALL LETTER KAPPA
+			case "kappa":                           // GREEK SMALL LETTER KAPPA
 				return rune(0x03ba), true
-			case "kcedil": 
-				// LATIN SMALL LETTER K WITH CEDILLA
+			case "kappav":                          // GREEK KAPPA SYMBOL
+				return rune(0x03f0), true
+			case "kcedil":                          // LATIN SMALL LETTER K WITH CEDILLA
 				return rune(0x0137), true
-			case "kcy": 
-				// CYRILLIC SMALL LETTER KA
+			case "kcy":                             // CYRILLIC SMALL LETTER KA
 				return rune(0x043a), true
-			case "kfr": 
-				// MATHEMATICAL FRAKTUR SMALL K
+			case "kfr":                             // MATHEMATICAL FRAKTUR SMALL K
 				return rune(0x01d528), true
-			case "kgr": 
-				// GREEK SMALL LETTER KAPPA
+			case "kgr":                             // GREEK SMALL LETTER KAPPA
 				return rune(0x03ba), true
-			case "kgreen": 
-				// LATIN SMALL LETTER KRA
+			case "kgreen":                          // LATIN SMALL LETTER KRA
 				return rune(0x0138), true
-			case "khcy": 
-				// CYRILLIC SMALL LETTER HA
+			case "khcy":                            // CYRILLIC SMALL LETTER HA
 				return rune(0x0445), true
-			case "khgr": 
-				// GREEK SMALL LETTER CHI
+			case "khgr":                            // GREEK SMALL LETTER CHI
 				return rune(0x03c7), true
-			case "kjcy": 
-				// CYRILLIC SMALL LETTER KJE
+			case "kjcy":                            // CYRILLIC SMALL LETTER KJE
 				return rune(0x045c), true
-			case "kopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL K
+			case "kopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL K
 				return rune(0x01d55c), true
-			case "koppa": 
-				// GREEK LETTER KOPPA
+			case "koppa":                           // GREEK LETTER KOPPA
 				return rune(0x03de), true
-			case "kscr": 
-				// MATHEMATICAL SCRIPT SMALL K
+			case "kscr":                            // MATHEMATICAL SCRIPT SMALL K
 				return rune(0x01d4c0), true
 		}
 
 	case 'l':
 		switch name {
-			case "lAarr": 
-				// LEFTWARDS TRIPLE ARROW
+			case "lAarr":                           // LEFTWARDS TRIPLE ARROW
 				return rune(0x21da), true
-			case "lArr": 
-				// LEFTWARDS DOUBLE ARROW
+			case "lArr":                            // LEFTWARDS DOUBLE ARROW
 				return rune(0x21d0), true
-			case "lAtail": 
-				// LEFTWARDS DOUBLE ARROW-TAIL
+			case "lAtail":                          // LEFTWARDS DOUBLE ARROW-TAIL
 				return rune(0x291b), true
-			case "lBarr": 
-				// LEFTWARDS TRIPLE DASH ARROW
+			case "lBarr":                           // LEFTWARDS TRIPLE DASH ARROW
 				return rune(0x290e), true
-			case "lE": 
-				// LESS-THAN OVER EQUAL TO
+			case "lE":                              // LESS-THAN OVER EQUAL TO
 				return rune(0x2266), true
-			case "lEg": 
-				// LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+			case "lEg":                             // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
 				return rune(0x2a8b), true
-			case "lHar": 
-				// LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+			case "lHar":                            // LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
 				return rune(0x2962), true
-			case "lacute": 
-				// LATIN SMALL LETTER L WITH ACUTE
+			case "lacute":                          // LATIN SMALL LETTER L WITH ACUTE
 				return rune(0x013a), true
-			case "laemptyv": 
-				// EMPTY SET WITH LEFT ARROW ABOVE
+			case "laemptyv":                        // EMPTY SET WITH LEFT ARROW ABOVE
 				return rune(0x29b4), true
-			case "lagran": 
-				// SCRIPT CAPITAL L
+			case "lagran":                          // SCRIPT CAPITAL L
 				return rune(0x2112), true
-			case "lambda": 
-				// GREEK SMALL LETTER LAMDA
+			case "lambda":                          // GREEK SMALL LETTER LAMDA
 				return rune(0x03bb), true
-			case "lang": 
-				// MATHEMATICAL LEFT ANGLE BRACKET
+			case "lang":                            // MATHEMATICAL LEFT ANGLE BRACKET
 				return rune(0x27e8), true
-			case "langd": 
-				// LEFT ANGLE BRACKET WITH DOT
+			case "langd":                           // LEFT ANGLE BRACKET WITH DOT
 				return rune(0x2991), true
-			case "langle": 
-				// MATHEMATICAL LEFT ANGLE BRACKET
+			case "langle":                          // MATHEMATICAL LEFT ANGLE BRACKET
 				return rune(0x27e8), true
-			case "lap": 
-				// LESS-THAN OR APPROXIMATE
+			case "lap":                             // LESS-THAN OR APPROXIMATE
 				return rune(0x2a85), true
-			case "laquo": 
-				// LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+			case "laquo":                           // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
 				return rune(0xab), true
-			case "larr2": 
-				// LEFTWARDS PAIRED ARROWS
+			case "larr":                            // LEFTWARDS ARROW
+				return rune(0x2190), true
+			case "larr2":                           // LEFTWARDS PAIRED ARROWS
 				return rune(0x21c7), true
-			case "larrb": 
-				// LEFTWARDS ARROW TO BAR
+			case "larrb":                           // LEFTWARDS ARROW TO BAR
 				return rune(0x21e4), true
-			case "larrhk": 
-				// LEFTWARDS ARROW WITH HOOK
-				return rune(0x21a9), true
-			case "larrlp": 
-				// LEFTWARDS ARROW WITH LOOP
-				return rune(0x21ab), true
-			case "larrtl": 
-				// LEFTWARDS ARROW WITH TAIL
-				return rune(0x21a2), true
-			case "larr": 
-				// LEFTWARDS ARROW
-				return rune(0x2190), true
-			case "larrbfs": 
-				// LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+			case "larrbfs":                         // LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
 				return rune(0x291f), true
-			case "larrfs": 
-				// LEFTWARDS ARROW TO BLACK DIAMOND
+			case "larrfs":                          // LEFTWARDS ARROW TO BLACK DIAMOND
 				return rune(0x291d), true
-			case "larrpl": 
-				// LEFT-SIDE ARC ANTICLOCKWISE ARROW
+			case "larrhk":                          // LEFTWARDS ARROW WITH HOOK
+				return rune(0x21a9), true
+			case "larrlp":                          // LEFTWARDS ARROW WITH LOOP
+				return rune(0x21ab), true
+			case "larrpl":                          // LEFT-SIDE ARC ANTICLOCKWISE ARROW
 				return rune(0x2939), true
-			case "larrsim": 
-				// LEFTWARDS ARROW ABOVE TILDE OPERATOR
+			case "larrsim":                         // LEFTWARDS ARROW ABOVE TILDE OPERATOR
 				return rune(0x2973), true
-			case "latail": 
-				// LEFTWARDS ARROW-TAIL
-				return rune(0x2919), true
-			case "lat": 
-				// LARGER THAN
+			case "larrtl":                          // LEFTWARDS ARROW WITH TAIL
+				return rune(0x21a2), true
+			case "lat":                             // LARGER THAN
 				return rune(0x2aab), true
-			case "late": 
-				// LARGER THAN OR EQUAL TO
+			case "latail":                          // LEFTWARDS ARROW-TAIL
+				return rune(0x2919), true
+			case "late":                            // LARGER THAN OR EQUAL TO
 				return rune(0x2aad), true
-			case "lates": 
-				// LARGER THAN OR slanted EQUAL
+			case "lates":                           // LARGER THAN OR slanted EQUAL
 				return rune(0x2aad), true
-			case "lbarr": 
-				// LEFTWARDS DOUBLE DASH ARROW
+			case "lbarr":                           // LEFTWARDS DOUBLE DASH ARROW
 				return rune(0x290c), true
-			case "lbbrk": 
-				// LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+			case "lbbrk":                           // LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
 				return rune(0x2772), true
-			case "lbrace": 
-				// LEFT CURLY BRACKET
+			case "lbrace":                          // LEFT CURLY BRACKET
 				return rune(0x7b), true
-			case "lbrack": 
-				// LEFT SQUARE BRACKET
+			case "lbrack":                          // LEFT SQUARE BRACKET
 				return rune(0x5b), true
-			case "lbrke": 
-				// LEFT SQUARE BRACKET WITH UNDERBAR
+			case "lbrke":                           // LEFT SQUARE BRACKET WITH UNDERBAR
 				return rune(0x298b), true
-			case "lbrksld": 
-				// LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+			case "lbrksld":                         // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
 				return rune(0x298f), true
-			case "lbrkslu": 
-				// LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+			case "lbrkslu":                         // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
 				return rune(0x298d), true
-			case "lcaron": 
-				// LATIN SMALL LETTER L WITH CARON
+			case "lcaron":                          // LATIN SMALL LETTER L WITH CARON
 				return rune(0x013e), true
-			case "lcedil": 
-				// LATIN SMALL LETTER L WITH CEDILLA
+			case "lcedil":                          // LATIN SMALL LETTER L WITH CEDILLA
 				return rune(0x013c), true
-			case "lceil": 
-				// LEFT CEILING
+			case "lceil":                           // LEFT CEILING
 				return rune(0x2308), true
-			case "lcub": 
-				// LEFT CURLY BRACKET
+			case "lcub":                            // LEFT CURLY BRACKET
 				return rune(0x7b), true
-			case "lcy": 
-				// CYRILLIC SMALL LETTER EL
+			case "lcy":                             // CYRILLIC SMALL LETTER EL
 				return rune(0x043b), true
-			case "ldca": 
-				// ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+			case "ldca":                            // ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
 				return rune(0x2936), true
-			case "ldharb": 
-				// LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+			case "ldharb":                          // LEFTWARDS HARPOON WITH BARB DOWN TO BAR
 				return rune(0x2956), true
-			case "ldot": 
-				// LESS-THAN WITH DOT
+			case "ldot":                            // LESS-THAN WITH DOT
 				return rune(0x22d6), true
-			case "ldquor": 
-				// DOUBLE LOW-9 QUOTATION MARK
-				return rune(0x201e), true
-			case "ldquo": 
-				// LEFT DOUBLE QUOTATION MARK
+			case "ldquo":                           // LEFT DOUBLE QUOTATION MARK
 				return rune(0x201c), true
-			case "ldrdhar": 
-				// LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+			case "ldquor":                          // DOUBLE LOW-9 QUOTATION MARK
+				return rune(0x201e), true
+			case "ldrdhar":                         // LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
 				return rune(0x2967), true
-			case "ldrdshar": 
-				// LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+			case "ldrdshar":                        // LEFT BARB DOWN RIGHT BARB DOWN HARPOON
 				return rune(0x2950), true
-			case "ldrushar": 
-				// LEFT BARB DOWN RIGHT BARB UP HARPOON
+			case "ldrushar":                        // LEFT BARB DOWN RIGHT BARB UP HARPOON
 				return rune(0x294b), true
-			case "ldsh": 
-				// DOWNWARDS ARROW WITH TIP LEFTWARDS
+			case "ldsh":                            // DOWNWARDS ARROW WITH TIP LEFTWARDS
 				return rune(0x21b2), true
-			case "leftarrowtail": 
-				// LEFTWARDS ARROW WITH TAIL
-				return rune(0x21a2), true
-			case "leftarrow": 
-				// LEFTWARDS ARROW
+			case "le":                              // LESS-THAN OR EQUAL TO
+				return rune(0x2264), true
+			case "leftarrow":                       // LEFTWARDS ARROW
 				return rune(0x2190), true
-			case "leftharpoondown": 
-				// LEFTWARDS HARPOON WITH BARB DOWNWARDS
+			case "leftarrowtail":                   // LEFTWARDS ARROW WITH TAIL
+				return rune(0x21a2), true
+			case "leftharpoondown":                 // LEFTWARDS HARPOON WITH BARB DOWNWARDS
 				return rune(0x21bd), true
-			case "leftharpoonup": 
-				// LEFTWARDS HARPOON WITH BARB UPWARDS
+			case "leftharpoonup":                   // LEFTWARDS HARPOON WITH BARB UPWARDS
 				return rune(0x21bc), true
-			case "leftleftarrows": 
-				// LEFTWARDS PAIRED ARROWS
+			case "leftleftarrows":                  // LEFTWARDS PAIRED ARROWS
 				return rune(0x21c7), true
-			case "leftrightarrows": 
-				// LEFTWARDS ARROW OVER RIGHTWARDS ARROW
-				return rune(0x21c6), true
-			case "leftrightarrow": 
-				// LEFT RIGHT ARROW
+			case "leftrightarrow":                  // LEFT RIGHT ARROW
 				return rune(0x2194), true
-			case "leftrightharpoons": 
-				// LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+			case "leftrightarrows":                 // LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+				return rune(0x21c6), true
+			case "leftrightharpoons":               // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
 				return rune(0x21cb), true
-			case "leftrightsquigarrow": 
-				// LEFT RIGHT WAVE ARROW
+			case "leftrightsquigarrow":             // LEFT RIGHT WAVE ARROW
 				return rune(0x21ad), true
-			case "le": 
-				// LESS-THAN OR EQUAL TO
-				return rune(0x2264), true
-			case "leftthreetimes": 
-				// LEFT SEMIDIRECT PRODUCT
+			case "leftthreetimes":                  // LEFT SEMIDIRECT PRODUCT
 				return rune(0x22cb), true
-			case "leg": 
-				// LESS-THAN EQUAL TO OR GREATER-THAN
+			case "leg":                             // LESS-THAN EQUAL TO OR GREATER-THAN
 				return rune(0x22da), true
-			case "leq": 
-				// LESS-THAN OR EQUAL TO
+			case "leq":                             // LESS-THAN OR EQUAL TO
 				return rune(0x2264), true
-			case "leqq": 
-				// LESS-THAN OVER EQUAL TO
+			case "leqq":                            // LESS-THAN OVER EQUAL TO
 				return rune(0x2266), true
-			case "leqslant": 
-				// LESS-THAN OR SLANTED EQUAL TO
+			case "leqslant":                        // LESS-THAN OR SLANTED EQUAL TO
 				return rune(0x2a7d), true
-			case "lesg": 
-				// LESS-THAN slanted EQUAL TO OR GREATER-THAN
-				return rune(0x22da), true
-			case "lessdot": 
-				// LESS-THAN WITH DOT
-				return rune(0x22d6), true
-			case "lesseqgtr": 
-				// LESS-THAN EQUAL TO OR GREATER-THAN
-				return rune(0x22da), true
-			case "lessgtr": 
-				// LESS-THAN OR GREATER-THAN
-				return rune(0x2276), true
-			case "lesssim": 
-				// LESS-THAN OR EQUIVALENT TO
-				return rune(0x2272), true
-			case "les": 
-				// LESS-THAN OR SLANTED EQUAL TO
+			case "les":                             // LESS-THAN OR SLANTED EQUAL TO
 				return rune(0x2a7d), true
-			case "lescc": 
-				// LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+			case "lescc":                           // LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
 				return rune(0x2aa8), true
-			case "lesdot": 
-				// LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+			case "lesdot":                          // LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
 				return rune(0x2a7f), true
-			case "lesdoto": 
-				// LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+			case "lesdoto":                         // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
 				return rune(0x2a81), true
-			case "lesdotor": 
-				// LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+			case "lesdotor":                        // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
 				return rune(0x2a83), true
-			case "lesges": 
-				// LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+			case "lesg":                            // LESS-THAN slanted EQUAL TO OR GREATER-THAN
+				return rune(0x22da), true
+			case "lesges":                          // LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
 				return rune(0x2a93), true
-			case "lessapprox": 
-				// LESS-THAN OR APPROXIMATE
+			case "lessapprox":                      // LESS-THAN OR APPROXIMATE
 				return rune(0x2a85), true
-			case "lesseqqgtr": 
-				// LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+			case "lessdot":                         // LESS-THAN WITH DOT
+				return rune(0x22d6), true
+			case "lesseqgtr":                       // LESS-THAN EQUAL TO OR GREATER-THAN
+				return rune(0x22da), true
+			case "lesseqqgtr":                      // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
 				return rune(0x2a8b), true
-			case "lfbowtie": 
-				// BOWTIE WITH LEFT HALF BLACK
+			case "lessgtr":                         // LESS-THAN OR GREATER-THAN
+				return rune(0x2276), true
+			case "lesssim":                         // LESS-THAN OR EQUIVALENT TO
+				return rune(0x2272), true
+			case "lfbowtie":                        // BOWTIE WITH LEFT HALF BLACK
 				return rune(0x29d1), true
-			case "lfisht": 
-				// LEFT FISH TAIL
+			case "lfisht":                          // LEFT FISH TAIL
 				return rune(0x297c), true
-			case "lfloor": 
-				// LEFT FLOOR
+			case "lfloor":                          // LEFT FLOOR
 				return rune(0x230a), true
-			case "lfr": 
-				// MATHEMATICAL FRAKTUR SMALL L
+			case "lfr":                             // MATHEMATICAL FRAKTUR SMALL L
 				return rune(0x01d529), true
-			case "lftimes": 
-				// TIMES WITH LEFT HALF BLACK
+			case "lftimes":                         // TIMES WITH LEFT HALF BLACK
 				return rune(0x29d4), true
-			case "lg": 
-				// LESS-THAN OR GREATER-THAN
+			case "lg":                              // LESS-THAN OR GREATER-THAN
 				return rune(0x2276), true
-			case "lgE": 
-				// LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+			case "lgE":                             // LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
 				return rune(0x2a91), true
-			case "lgr": 
-				// GREEK SMALL LETTER LAMDA
+			case "lgr":                             // GREEK SMALL LETTER LAMDA
 				return rune(0x03bb), true
-			case "lhard": 
-				// LEFTWARDS HARPOON WITH BARB DOWNWARDS
+			case "lhard":                           // LEFTWARDS HARPOON WITH BARB DOWNWARDS
 				return rune(0x21bd), true
-			case "lharu": 
-				// LEFTWARDS HARPOON WITH BARB UPWARDS
+			case "lharu":                           // LEFTWARDS HARPOON WITH BARB UPWARDS
 				return rune(0x21bc), true
-			case "lharul": 
-				// LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+			case "lharul":                          // LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
 				return rune(0x296a), true
-			case "lhblk": 
-				// LOWER HALF BLOCK
+			case "lhblk":                           // LOWER HALF BLOCK
 				return rune(0x2584), true
-			case "ljcy": 
-				// CYRILLIC SMALL LETTER LJE
+			case "ljcy":                            // CYRILLIC SMALL LETTER LJE
 				return rune(0x0459), true
-			case "llarr": 
-				// LEFTWARDS PAIRED ARROWS
-				return rune(0x21c7), true
-			case "ll": 
-				// MUCH LESS-THAN
+			case "ll":                              // MUCH LESS-THAN
 				return rune(0x226a), true
-			case "llcorner": 
-				// BOTTOM LEFT CORNER
+			case "llarr":                           // LEFTWARDS PAIRED ARROWS
+				return rune(0x21c7), true
+			case "llcorner":                        // BOTTOM LEFT CORNER
 				return rune(0x231e), true
-			case "llhard": 
-				// LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+			case "llhard":                          // LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
 				return rune(0x296b), true
-			case "lltrif": 
-				// BLACK LOWER LEFT TRIANGLE
-				return rune(0x25e3), true
-			case "lltri": 
-				// LOWER LEFT TRIANGLE
+			case "lltri":                           // LOWER LEFT TRIANGLE
 				return rune(0x25fa), true
-			case "lmidot": 
-				// LATIN SMALL LETTER L WITH MIDDLE DOT
+			case "lltrif":                          // BLACK LOWER LEFT TRIANGLE
+				return rune(0x25e3), true
+			case "lmidot":                          // LATIN SMALL LETTER L WITH MIDDLE DOT
 				return rune(0x0140), true
-			case "lmoust": 
-				// UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+			case "lmoust":                          // UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
 				return rune(0x23b0), true
-			case "lmoustache": 
-				// UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+			case "lmoustache":                      // UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
 				return rune(0x23b0), true
-			case "lnE": 
-				// LESS-THAN BUT NOT EQUAL TO
+			case "lnE":                             // LESS-THAN BUT NOT EQUAL TO
 				return rune(0x2268), true
-			case "lnap": 
-				// LESS-THAN AND NOT APPROXIMATE
+			case "lnap":                            // LESS-THAN AND NOT APPROXIMATE
 				return rune(0x2a89), true
-			case "lnapprox": 
-				// LESS-THAN AND NOT APPROXIMATE
+			case "lnapprox":                        // LESS-THAN AND NOT APPROXIMATE
 				return rune(0x2a89), true
-			case "lneqq": 
-				// LESS-THAN BUT NOT EQUAL TO
-				return rune(0x2268), true
-			case "lne": 
-				// LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+			case "lne":                             // LESS-THAN AND SINGLE-LINE NOT EQUAL TO
 				return rune(0x2a87), true
-			case "lneq": 
-				// LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+			case "lneq":                            // LESS-THAN AND SINGLE-LINE NOT EQUAL TO
 				return rune(0x2a87), true
-			case "lnsim": 
-				// LESS-THAN BUT NOT EQUIVALENT TO
+			case "lneqq":                           // LESS-THAN BUT NOT EQUAL TO
+				return rune(0x2268), true
+			case "lnsim":                           // LESS-THAN BUT NOT EQUIVALENT TO
 				return rune(0x22e6), true
-			case "loang": 
-				// MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+			case "loang":                           // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
 				return rune(0x27ec), true
-			case "loarr": 
-				// LEFTWARDS OPEN-HEADED ARROW
+			case "loarr":                           // LEFTWARDS OPEN-HEADED ARROW
 				return rune(0x21fd), true
-			case "lobrk": 
-				// MATHEMATICAL LEFT WHITE SQUARE BRACKET
+			case "lobrk":                           // MATHEMATICAL LEFT WHITE SQUARE BRACKET
 				return rune(0x27e6), true
-			case "locub": 
-				// LEFT WHITE CURLY BRACKET
+			case "locub":                           // LEFT WHITE CURLY BRACKET
 				return rune(0x2983), true
-			case "longleftarrow": 
-				// LONG LEFTWARDS ARROW
+			case "longleftarrow":                   // LONG LEFTWARDS ARROW
 				return rune(0x27f5), true
-			case "longleftrightarrow": 
-				// LONG LEFT RIGHT ARROW
+			case "longleftrightarrow":              // LONG LEFT RIGHT ARROW
 				return rune(0x27f7), true
-			case "longmapsto": 
-				// LONG RIGHTWARDS ARROW FROM BAR
+			case "longmapsto":                      // LONG RIGHTWARDS ARROW FROM BAR
 				return rune(0x27fc), true
-			case "longrightarrow": 
-				// LONG RIGHTWARDS ARROW
+			case "longrightarrow":                  // LONG RIGHTWARDS ARROW
 				return rune(0x27f6), true
-			case "looparrowleft": 
-				// LEFTWARDS ARROW WITH LOOP
+			case "looparrowleft":                   // LEFTWARDS ARROW WITH LOOP
 				return rune(0x21ab), true
-			case "looparrowright": 
-				// RIGHTWARDS ARROW WITH LOOP
+			case "looparrowright":                  // RIGHTWARDS ARROW WITH LOOP
 				return rune(0x21ac), true
-			case "lopar": 
-				// LEFT WHITE PARENTHESIS
+			case "lopar":                           // LEFT WHITE PARENTHESIS
 				return rune(0x2985), true
-			case "lopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL L
+			case "lopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL L
 				return rune(0x01d55d), true
-			case "loplus": 
-				// PLUS SIGN IN LEFT HALF CIRCLE
+			case "loplus":                          // PLUS SIGN IN LEFT HALF CIRCLE
 				return rune(0x2a2d), true
-			case "lotimes": 
-				// MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+			case "lotimes":                         // MULTIPLICATION SIGN IN LEFT HALF CIRCLE
 				return rune(0x2a34), true
-			case "lowast": 
-				// LOW ASTERISK
+			case "lowast":                          // LOW ASTERISK
 				return rune(0x204e), true
-			case "lowbar": 
-				// LOW LINE
+			case "lowbar":                          // LOW LINE
 				return rune(0x5f), true
-			case "lowint": 
-				// INTEGRAL WITH UNDERBAR
+			case "lowint":                          // INTEGRAL WITH UNDERBAR
 				return rune(0x2a1c), true
-			case "loz": 
-				// LOZENGE
+			case "loz":                             // LOZENGE
 				return rune(0x25ca), true
-			case "lozenge": 
-				// LOZENGE
+			case "lozenge":                         // LOZENGE
 				return rune(0x25ca), true
-			case "lozf": 
-				// BLACK LOZENGE
+			case "lozf":                            // BLACK LOZENGE
 				return rune(0x29eb), true
-			case "lpargt": 
-				// SPHERICAL ANGLE OPENING LEFT
+			case "lpar":                            // LEFT PARENTHESIS
+				return rune(0x28), true
+			case "lpargt":                          // SPHERICAL ANGLE OPENING LEFT
 				return rune(0x29a0), true
-			case "lparlt": 
-				// LEFT ARC LESS-THAN BRACKET
+			case "lparlt":                          // LEFT ARC LESS-THAN BRACKET
 				return rune(0x2993), true
-			case "lpar": 
-				// LEFT PARENTHESIS
-				return rune(0x28), true
-			case "lrarr2": 
-				// LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+			case "lrarr":                           // LEFTWARDS ARROW OVER RIGHTWARDS ARROW
 				return rune(0x21c6), true
-			case "lrarr": 
-				// LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+			case "lrarr2":                          // LEFTWARDS ARROW OVER RIGHTWARDS ARROW
 				return rune(0x21c6), true
-			case "lrcorner": 
-				// BOTTOM RIGHT CORNER
+			case "lrcorner":                        // BOTTOM RIGHT CORNER
 				return rune(0x231f), true
-			case "lrhar": 
-				// LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+			case "lrhar":                           // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
 				return rune(0x21cb), true
-			case "lrhar2": 
-				// LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+			case "lrhar2":                          // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
 				return rune(0x21cb), true
-			case "lrhard": 
-				// RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+			case "lrhard":                          // RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
 				return rune(0x296d), true
-			case "lrm": 
-				// LEFT-TO-RIGHT MARK
+			case "lrm":                             // LEFT-TO-RIGHT MARK
 				return rune(0x200e), true
-			case "lrtri": 
-				// RIGHT TRIANGLE
+			case "lrtri":                           // RIGHT TRIANGLE
 				return rune(0x22bf), true
-			case "lsaquo": 
-				// SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+			case "lsaquo":                          // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
 				return rune(0x2039), true
-			case "lscr": 
-				// MATHEMATICAL SCRIPT SMALL L
+			case "lscr":                            // MATHEMATICAL SCRIPT SMALL L
 				return rune(0x01d4c1), true
-			case "lsh": 
-				// UPWARDS ARROW WITH TIP LEFTWARDS
+			case "lsh":                             // UPWARDS ARROW WITH TIP LEFTWARDS
 				return rune(0x21b0), true
-			case "lsim": 
-				// LESS-THAN OR EQUIVALENT TO
+			case "lsim":                            // LESS-THAN OR EQUIVALENT TO
 				return rune(0x2272), true
-			case "lsime": 
-				// LESS-THAN ABOVE SIMILAR OR EQUAL
+			case "lsime":                           // LESS-THAN ABOVE SIMILAR OR EQUAL
 				return rune(0x2a8d), true
-			case "lsimg": 
-				// LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+			case "lsimg":                           // LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
 				return rune(0x2a8f), true
-			case "lsqb": 
-				// LEFT SQUARE BRACKET
+			case "lsqb":                            // LEFT SQUARE BRACKET
 				return rune(0x5b), true
-			case "lsquor": 
-				// SINGLE LOW-9 QUOTATION MARK
-				return rune(0x201a), true
-			case "lsquo": 
-				// LEFT SINGLE QUOTATION MARK
+			case "lsquo":                           // LEFT SINGLE QUOTATION MARK
 				return rune(0x2018), true
-			case "lstrok": 
-				// LATIN SMALL LETTER L WITH STROKE
+			case "lsquor":                          // SINGLE LOW-9 QUOTATION MARK
+				return rune(0x201a), true
+			case "lstrok":                          // LATIN SMALL LETTER L WITH STROKE
 				return rune(0x0142), true
-			case "ltcc": 
-				// LESS-THAN CLOSED BY CURVE
+			case "lt":                              // LESS-THAN SIGN
+				return rune(0x3c), true
+			case "ltcc":                            // LESS-THAN CLOSED BY CURVE
 				return rune(0x2aa6), true
-			case "ltcir": 
-				// LESS-THAN WITH CIRCLE INSIDE
+			case "ltcir":                           // LESS-THAN WITH CIRCLE INSIDE
 				return rune(0x2a79), true
-			case "ltdot": 
-				// LESS-THAN WITH DOT
+			case "ltdot":                           // LESS-THAN WITH DOT
 				return rune(0x22d6), true
-			case "lthree": 
-				// LEFT SEMIDIRECT PRODUCT
+			case "lthree":                          // LEFT SEMIDIRECT PRODUCT
 				return rune(0x22cb), true
-			case "ltimes": 
-				// LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+			case "ltimes":                          // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
 				return rune(0x22c9), true
-			case "ltlarr": 
-				// LESS-THAN ABOVE LEFTWARDS ARROW
+			case "ltlarr":                          // LESS-THAN ABOVE LEFTWARDS ARROW
 				return rune(0x2976), true
-			case "ltquest": 
-				// LESS-THAN WITH QUESTION MARK ABOVE
+			case "ltquest":                         // LESS-THAN WITH QUESTION MARK ABOVE
 				return rune(0x2a7b), true
-			case "ltrPar": 
-				// DOUBLE RIGHT ARC LESS-THAN BRACKET
+			case "ltrPar":                          // DOUBLE RIGHT ARC LESS-THAN BRACKET
 				return rune(0x2996), true
-			case "ltrie": 
-				// NORMAL SUBGROUP OF OR EQUAL TO
+			case "ltri":                            // WHITE LEFT-POINTING SMALL TRIANGLE
+				return rune(0x25c3), true
+			case "ltrie":                           // NORMAL SUBGROUP OF OR EQUAL TO
 				return rune(0x22b4), true
-			case "ltrif": 
-				// BLACK LEFT-POINTING SMALL TRIANGLE
+			case "ltrif":                           // BLACK LEFT-POINTING SMALL TRIANGLE
 				return rune(0x25c2), true
-			case "ltri": 
-				// WHITE LEFT-POINTING SMALL TRIANGLE
-				return rune(0x25c3), true
-			case "ltrivb": 
-				// LEFT TRIANGLE BESIDE VERTICAL BAR
+			case "ltrivb":                          // LEFT TRIANGLE BESIDE VERTICAL BAR
 				return rune(0x29cf), true
-			case "lt": 
-				// LESS-THAN SIGN
-				return rune(0x3c), true
-			case "luharb": 
-				// LEFTWARDS HARPOON WITH BARB UP TO BAR
+			case "luharb":                          // LEFTWARDS HARPOON WITH BARB UP TO BAR
 				return rune(0x2952), true
-			case "lurdshar": 
-				// LEFT BARB UP RIGHT BARB DOWN HARPOON
+			case "lurdshar":                        // LEFT BARB UP RIGHT BARB DOWN HARPOON
 				return rune(0x294a), true
-			case "luruhar": 
-				// LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+			case "luruhar":                         // LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
 				return rune(0x2966), true
-			case "lurushar": 
-				// LEFT BARB UP RIGHT BARB UP HARPOON
+			case "lurushar":                        // LEFT BARB UP RIGHT BARB UP HARPOON
 				return rune(0x294e), true
-			case "lvertneqq": 
-				// LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+			case "lvertneqq":                       // LESS-THAN BUT NOT EQUAL TO - with vertical stroke
 				return rune(0x2268), true
-			case "lvnE": 
-				// LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+			case "lvnE":                            // LESS-THAN BUT NOT EQUAL TO - with vertical stroke
 				return rune(0x2268), true
 		}
 
 	case 'm':
 		switch name {
-			case "mDDot": 
-				// GEOMETRIC PROPORTION
+			case "mDDot":                           // GEOMETRIC PROPORTION
 				return rune(0x223a), true
-			case "macr": 
-				// MACRON
+			case "macr":                            // MACRON
 				return rune(0xaf), true
-			case "male": 
-				// MALE SIGN
+			case "male":                            // MALE SIGN
 				return rune(0x2642), true
-			case "malt": 
-				// MALTESE CROSS
+			case "malt":                            // MALTESE CROSS
 				return rune(0x2720), true
-			case "maltese": 
-				// MALTESE CROSS
+			case "maltese":                         // MALTESE CROSS
 				return rune(0x2720), true
-			case "mapstodown": 
-				// DOWNWARDS ARROW FROM BAR
-				return rune(0x21a7), true
-			case "mapsto": 
-				// RIGHTWARDS ARROW FROM BAR
+			case "map":                             // RIGHTWARDS ARROW FROM BAR
 				return rune(0x21a6), true
-			case "map": 
-				// RIGHTWARDS ARROW FROM BAR
+			case "mapsto":                          // RIGHTWARDS ARROW FROM BAR
 				return rune(0x21a6), true
-			case "mapstoleft": 
-				// LEFTWARDS ARROW FROM BAR
+			case "mapstodown":                      // DOWNWARDS ARROW FROM BAR
+				return rune(0x21a7), true
+			case "mapstoleft":                      // LEFTWARDS ARROW FROM BAR
 				return rune(0x21a4), true
-			case "mapstoup": 
-				// UPWARDS ARROW FROM BAR
+			case "mapstoup":                        // UPWARDS ARROW FROM BAR
 				return rune(0x21a5), true
-			case "marker": 
-				// BLACK VERTICAL RECTANGLE
+			case "marker":                          // BLACK VERTICAL RECTANGLE
 				return rune(0x25ae), true
-			case "mcomma": 
-				// MINUS SIGN WITH COMMA ABOVE
+			case "mcomma":                          // MINUS SIGN WITH COMMA ABOVE
 				return rune(0x2a29), true
-			case "mcy": 
-				// CYRILLIC SMALL LETTER EM
+			case "mcy":                             // CYRILLIC SMALL LETTER EM
 				return rune(0x043c), true
-			case "mdash": 
-				// EM DASH
+			case "mdash":                           // EM DASH
 				return rune(0x2014), true
-			case "measuredangle": 
-				// MEASURED ANGLE
+			case "measuredangle":                   // MEASURED ANGLE
 				return rune(0x2221), true
-			case "mfr": 
-				// MATHEMATICAL FRAKTUR SMALL M
+			case "mfr":                             // MATHEMATICAL FRAKTUR SMALL M
 				return rune(0x01d52a), true
-			case "mgr": 
-				// GREEK SMALL LETTER MU
+			case "mgr":                             // GREEK SMALL LETTER MU
 				return rune(0x03bc), true
-			case "mho": 
-				// INVERTED OHM SIGN
+			case "mho":                             // INVERTED OHM SIGN
 				return rune(0x2127), true
-			case "micro": 
-				// MICRO SIGN
+			case "micro":                           // MICRO SIGN
 				return rune(0xb5), true
-			case "mid": 
-				// DIVIDES
+			case "mid":                             // DIVIDES
 				return rune(0x2223), true
-			case "midast": 
-				// ASTERISK
+			case "midast":                          // ASTERISK
 				return rune(0x2a), true
-			case "midcir": 
-				// VERTICAL LINE WITH CIRCLE BELOW
+			case "midcir":                          // VERTICAL LINE WITH CIRCLE BELOW
 				return rune(0x2af0), true
-			case "middot": 
-				// MIDDLE DOT
+			case "middot":                          // MIDDLE DOT
 				return rune(0xb7), true
-			case "minus": 
-				// MINUS SIGN
+			case "minus":                           // MINUS SIGN
 				return rune(0x2212), true
-			case "minusb": 
-				// SQUARED MINUS
+			case "minusb":                          // SQUARED MINUS
 				return rune(0x229f), true
-			case "minusd": 
-				// DOT MINUS
+			case "minusd":                          // DOT MINUS
 				return rune(0x2238), true
-			case "minusdu": 
-				// MINUS SIGN WITH DOT BELOW
+			case "minusdu":                         // MINUS SIGN WITH DOT BELOW
 				return rune(0x2a2a), true
-			case "mlcp": 
-				// TRANSVERSAL INTERSECTION
+			case "mlcp":                            // TRANSVERSAL INTERSECTION
 				return rune(0x2adb), true
-			case "mldr": 
-				// HORIZONTAL ELLIPSIS
+			case "mldr":                            // HORIZONTAL ELLIPSIS
 				return rune(0x2026), true
-			case "mnplus": 
-				// MINUS-OR-PLUS SIGN
+			case "mnplus":                          // MINUS-OR-PLUS SIGN
 				return rune(0x2213), true
-			case "models": 
-				// MODELS
+			case "models":                          // MODELS
 				return rune(0x22a7), true
-			case "mopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL M
+			case "mopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL M
 				return rune(0x01d55e), true
-			case "mp": 
-				// MINUS-OR-PLUS SIGN
+			case "mp":                              // MINUS-OR-PLUS SIGN
 				return rune(0x2213), true
-			case "mscr": 
-				// MATHEMATICAL SCRIPT SMALL M
+			case "mscr":                            // MATHEMATICAL SCRIPT SMALL M
 				return rune(0x01d4c2), true
-			case "mstpos": 
-				// INVERTED LAZY S
+			case "mstpos":                          // INVERTED LAZY S
 				return rune(0x223e), true
-			case "multimap": 
-				// MULTIMAP
+			case "mu":                              // GREEK SMALL LETTER MU
+				return rune(0x03bc), true
+			case "multimap":                        // MULTIMAP
 				return rune(0x22b8), true
-			case "mumap": 
-				// MULTIMAP
+			case "mumap":                           // MULTIMAP
 				return rune(0x22b8), true
-			case "mu": 
-				// GREEK SMALL LETTER MU
-				return rune(0x03bc), true
 		}
 
 	case 'n':
 		switch name {
-			case "nGg": 
-				// VERY MUCH GREATER-THAN with slash
+			case "nGg":                             // VERY MUCH GREATER-THAN with slash
 				return rune(0x22d9), true
-			case "nGtv": 
-				// MUCH GREATER THAN with slash
+			case "nGt":                             // MUCH GREATER THAN with vertical line
 				return rune(0x226b), true
-			case "nGt": 
-				// MUCH GREATER THAN with vertical line
+			case "nGtv":                            // MUCH GREATER THAN with slash
 				return rune(0x226b), true
-			case "nLeftarrow": 
-				// LEFTWARDS DOUBLE ARROW WITH STROKE
+			case "nLeftarrow":                      // LEFTWARDS DOUBLE ARROW WITH STROKE
 				return rune(0x21cd), true
-			case "nLeftrightarrow": 
-				// LEFT RIGHT DOUBLE ARROW WITH STROKE
+			case "nLeftrightarrow":                 // LEFT RIGHT DOUBLE ARROW WITH STROKE
 				return rune(0x21ce), true
-			case "nLl": 
-				// VERY MUCH LESS-THAN with slash
+			case "nLl":                             // VERY MUCH LESS-THAN with slash
 				return rune(0x22d8), true
-			case "nLtv": 
-				// MUCH LESS THAN with slash
+			case "nLt":                             // MUCH LESS THAN with vertical line
 				return rune(0x226a), true
-			case "nLt": 
-				// MUCH LESS THAN with vertical line
+			case "nLtv":                            // MUCH LESS THAN with slash
 				return rune(0x226a), true
-			case "nRightarrow": 
-				// RIGHTWARDS DOUBLE ARROW WITH STROKE
+			case "nRightarrow":                     // RIGHTWARDS DOUBLE ARROW WITH STROKE
 				return rune(0x21cf), true
-			case "nVDash": 
-				// NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+			case "nVDash":                          // NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
 				return rune(0x22af), true
-			case "nVdash": 
-				// DOES NOT FORCE
+			case "nVdash":                          // DOES NOT FORCE
 				return rune(0x22ae), true
-			case "nabla": 
-				// NABLA
+			case "nabla":                           // NABLA
 				return rune(0x2207), true
-			case "nacute": 
-				// LATIN SMALL LETTER N WITH ACUTE
+			case "nacute":                          // LATIN SMALL LETTER N WITH ACUTE
 				return rune(0x0144), true
-			case "nang": 
-				// ANGLE with vertical line
+			case "nang":                            // ANGLE with vertical line
 				return rune(0x2220), true
-			case "nap": 
-				// NOT ALMOST EQUAL TO
+			case "nap":                             // NOT ALMOST EQUAL TO
 				return rune(0x2249), true
-			case "napE": 
-				// APPROXIMATELY EQUAL OR EQUAL TO with slash
+			case "napE":                            // APPROXIMATELY EQUAL OR EQUAL TO with slash
 				return rune(0x2a70), true
-			case "napid": 
-				// TRIPLE TILDE with slash
+			case "napid":                           // TRIPLE TILDE with slash
 				return rune(0x224b), true
-			case "napos": 
-				// LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+			case "napos":                           // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
 				return rune(0x0149), true
-			case "napprox": 
-				// NOT ALMOST EQUAL TO
+			case "napprox":                         // NOT ALMOST EQUAL TO
 				return rune(0x2249), true
-			case "naturals": 
-				// DOUBLE-STRUCK CAPITAL N
-				return rune(0x2115), true
-			case "natur": 
-				// MUSIC NATURAL SIGN
+			case "natur":                           // MUSIC NATURAL SIGN
 				return rune(0x266e), true
-			case "natural": 
-				// MUSIC NATURAL SIGN
+			case "natural":                         // MUSIC NATURAL SIGN
 				return rune(0x266e), true
-			case "nbsp": 
-				// NO-BREAK SPACE
+			case "naturals":                        // DOUBLE-STRUCK CAPITAL N
+				return rune(0x2115), true
+			case "nbsp":                            // NO-BREAK SPACE
 				return rune(0xa0), true
-			case "nbump": 
-				// GEOMETRICALLY EQUIVALENT TO with slash
+			case "nbump":                           // GEOMETRICALLY EQUIVALENT TO with slash
 				return rune(0x224e), true
-			case "nbumpe": 
-				// DIFFERENCE BETWEEN with slash
+			case "nbumpe":                          // DIFFERENCE BETWEEN with slash
 				return rune(0x224f), true
-			case "ncap": 
-				// INTERSECTION WITH OVERBAR
+			case "ncap":                            // INTERSECTION WITH OVERBAR
 				return rune(0x2a43), true
-			case "ncaron": 
-				// LATIN SMALL LETTER N WITH CARON
+			case "ncaron":                          // LATIN SMALL LETTER N WITH CARON
 				return rune(0x0148), true
-			case "ncedil": 
-				// LATIN SMALL LETTER N WITH CEDILLA
+			case "ncedil":                          // LATIN SMALL LETTER N WITH CEDILLA
 				return rune(0x0146), true
-			case "ncong": 
-				// NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+			case "ncong":                           // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
 				return rune(0x2247), true
-			case "ncongdot": 
-				// CONGRUENT WITH DOT ABOVE with slash
+			case "ncongdot":                        // CONGRUENT WITH DOT ABOVE with slash
 				return rune(0x2a6d), true
-			case "ncup": 
-				// UNION WITH OVERBAR
+			case "ncup":                            // UNION WITH OVERBAR
 				return rune(0x2a42), true
-			case "ncy": 
-				// CYRILLIC SMALL LETTER EN
+			case "ncy":                             // CYRILLIC SMALL LETTER EN
 				return rune(0x043d), true
-			case "ndash": 
-				// EN DASH
+			case "ndash":                           // EN DASH
 				return rune(0x2013), true
-			case "neArr": 
-				// NORTH EAST DOUBLE ARROW
+			case "ne":                              // NOT EQUAL TO
+				return rune(0x2260), true
+			case "neArr":                           // NORTH EAST DOUBLE ARROW
 				return rune(0x21d7), true
-			case "nearrow": 
-				// NORTH EAST ARROW
+			case "nearhk":                          // NORTH EAST ARROW WITH HOOK
+				return rune(0x2924), true
+			case "nearr":                           // NORTH EAST ARROW
 				return rune(0x2197), true
-			case "nearr": 
-				// NORTH EAST ARROW
+			case "nearrow":                         // NORTH EAST ARROW
 				return rune(0x2197), true
-			case "nedot": 
-				// APPROACHES THE LIMIT with slash
+			case "nedot":                           // APPROACHES THE LIMIT with slash
 				return rune(0x2250), true
-			case "nesim": 
-				// MINUS TILDE with slash
-				return rune(0x2242), true
-			case "nexist": 
-				// THERE DOES NOT EXIST
-				return rune(0x2204), true
-			case "nexists": 
-				// THERE DOES NOT EXIST
-				return rune(0x2204), true
-			case "ne": 
-				// NOT EQUAL TO
-				return rune(0x2260), true
-			case "nearhk": 
-				// NORTH EAST ARROW WITH HOOK
-				return rune(0x2924), true
-			case "neonwarr": 
-				// NORTH EAST ARROW CROSSING NORTH WEST ARROW
+			case "neonwarr":                        // NORTH EAST ARROW CROSSING NORTH WEST ARROW
 				return rune(0x2931), true
-			case "neosearr": 
-				// NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+			case "neosearr":                        // NORTH EAST ARROW CROSSING SOUTH EAST ARROW
 				return rune(0x292e), true
-			case "nequiv": 
-				// NOT IDENTICAL TO
+			case "nequiv":                          // NOT IDENTICAL TO
 				return rune(0x2262), true
-			case "nesear": 
-				// NORTH EAST ARROW AND SOUTH EAST ARROW
+			case "nesear":                          // NORTH EAST ARROW AND SOUTH EAST ARROW
 				return rune(0x2928), true
-			case "neswsarr": 
-				// NORTH EAST AND SOUTH WEST ARROW
+			case "nesim":                           // MINUS TILDE with slash
+				return rune(0x2242), true
+			case "neswsarr":                        // NORTH EAST AND SOUTH WEST ARROW
 				return rune(0x2922), true
-			case "nfr": 
-				// MATHEMATICAL FRAKTUR SMALL N
+			case "nexist":                          // THERE DOES NOT EXIST
+				return rune(0x2204), true
+			case "nexists":                         // THERE DOES NOT EXIST
+				return rune(0x2204), true
+			case "nfr":                             // MATHEMATICAL FRAKTUR SMALL N
 				return rune(0x01d52b), true
-			case "ngE": 
-				// GREATER-THAN OVER EQUAL TO with slash
-				return rune(0x2267), true
-			case "ngeqq": 
-				// GREATER-THAN OVER EQUAL TO with slash
+			case "ngE":                             // GREATER-THAN OVER EQUAL TO with slash
 				return rune(0x2267), true
-			case "nge": 
-				// NEITHER GREATER-THAN NOR EQUAL TO
+			case "nge":                             // NEITHER GREATER-THAN NOR EQUAL TO
 				return rune(0x2271), true
-			case "ngeq": 
-				// NEITHER GREATER-THAN NOR EQUAL TO
+			case "ngeq":                            // NEITHER GREATER-THAN NOR EQUAL TO
 				return rune(0x2271), true
-			case "ngeqslant": 
-				// GREATER-THAN OR SLANTED EQUAL TO with slash
+			case "ngeqq":                           // GREATER-THAN OVER EQUAL TO with slash
+				return rune(0x2267), true
+			case "ngeqslant":                       // GREATER-THAN OR SLANTED EQUAL TO with slash
 				return rune(0x2a7e), true
-			case "nges": 
-				// GREATER-THAN OR SLANTED EQUAL TO with slash
+			case "nges":                            // GREATER-THAN OR SLANTED EQUAL TO with slash
 				return rune(0x2a7e), true
-			case "ngr": 
-				// GREEK SMALL LETTER NU
+			case "ngr":                             // GREEK SMALL LETTER NU
 				return rune(0x03bd), true
-			case "ngsim": 
-				// NEITHER GREATER-THAN NOR EQUIVALENT TO
+			case "ngsim":                           // NEITHER GREATER-THAN NOR EQUIVALENT TO
 				return rune(0x2275), true
-			case "ngt": 
-				// NOT GREATER-THAN
+			case "ngt":                             // NOT GREATER-THAN
 				return rune(0x226f), true
-			case "ngtr": 
-				// NOT GREATER-THAN
+			case "ngtr":                            // NOT GREATER-THAN
 				return rune(0x226f), true
-			case "nhArr": 
-				// LEFT RIGHT DOUBLE ARROW WITH STROKE
+			case "nhArr":                           // LEFT RIGHT DOUBLE ARROW WITH STROKE
 				return rune(0x21ce), true
-			case "nharr": 
-				// LEFT RIGHT ARROW WITH STROKE
+			case "nharr":                           // LEFT RIGHT ARROW WITH STROKE
 				return rune(0x21ae), true
-			case "nhpar": 
-				// PARALLEL WITH HORIZONTAL STROKE
+			case "nhpar":                           // PARALLEL WITH HORIZONTAL STROKE
 				return rune(0x2af2), true
-			case "niv": 
-				// CONTAINS AS MEMBER
-				return rune(0x220b), true
-			case "ni": 
-				// CONTAINS AS MEMBER
+			case "ni":                              // CONTAINS AS MEMBER
 				return rune(0x220b), true
-			case "nisd": 
-				// CONTAINS WITH LONG HORIZONTAL STROKE
-				return rune(0x22fa), true
-			case "nis": 
-				// SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+			case "nis":                             // SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
 				return rune(0x22fc), true
-			case "njcy": 
-				// CYRILLIC SMALL LETTER NJE
+			case "nisd":                            // CONTAINS WITH LONG HORIZONTAL STROKE
+				return rune(0x22fa), true
+			case "niv":                             // CONTAINS AS MEMBER
+				return rune(0x220b), true
+			case "njcy":                            // CYRILLIC SMALL LETTER NJE
 				return rune(0x045a), true
-			case "nlArr": 
-				// LEFTWARDS DOUBLE ARROW WITH STROKE
+			case "nlArr":                           // LEFTWARDS DOUBLE ARROW WITH STROKE
 				return rune(0x21cd), true
-			case "nlE": 
-				// LESS-THAN OVER EQUAL TO with slash
+			case "nlE":                             // LESS-THAN OVER EQUAL TO with slash
 				return rune(0x2266), true
-			case "nlarr": 
-				// LEFTWARDS ARROW WITH STROKE
+			case "nlarr":                           // LEFTWARDS ARROW WITH STROKE
 				return rune(0x219a), true
-			case "nldr": 
-				// TWO DOT LEADER
+			case "nldr":                            // TWO DOT LEADER
 				return rune(0x2025), true
-			case "nleftarrow": 
-				// LEFTWARDS ARROW WITH STROKE
+			case "nle":                             // NEITHER LESS-THAN NOR EQUAL TO
+				return rune(0x2270), true
+			case "nleftarrow":                      // LEFTWARDS ARROW WITH STROKE
 				return rune(0x219a), true
-			case "nleftrightarrow": 
-				// LEFT RIGHT ARROW WITH STROKE
+			case "nleftrightarrow":                 // LEFT RIGHT ARROW WITH STROKE
 				return rune(0x21ae), true
-			case "nleqq": 
-				// LESS-THAN OVER EQUAL TO with slash
-				return rune(0x2266), true
-			case "nless": 
-				// NOT LESS-THAN
-				return rune(0x226e), true
-			case "nle": 
-				// NEITHER LESS-THAN NOR EQUAL TO
+			case "nleq":                            // NEITHER LESS-THAN NOR EQUAL TO
 				return rune(0x2270), true
-			case "nleq": 
-				// NEITHER LESS-THAN NOR EQUAL TO
-				return rune(0x2270), true
-			case "nleqslant": 
-				// LESS-THAN OR SLANTED EQUAL TO with slash
+			case "nleqq":                           // LESS-THAN OVER EQUAL TO with slash
+				return rune(0x2266), true
+			case "nleqslant":                       // LESS-THAN OR SLANTED EQUAL TO with slash
 				return rune(0x2a7d), true
-			case "nles": 
-				// LESS-THAN OR SLANTED EQUAL TO with slash
+			case "nles":                            // LESS-THAN OR SLANTED EQUAL TO with slash
 				return rune(0x2a7d), true
-			case "nlsim": 
-				// NEITHER LESS-THAN NOR EQUIVALENT TO
+			case "nless":                           // NOT LESS-THAN
+				return rune(0x226e), true
+			case "nlsim":                           // NEITHER LESS-THAN NOR EQUIVALENT TO
 				return rune(0x2274), true
-			case "nlt": 
-				// NOT LESS-THAN
+			case "nlt":                             // NOT LESS-THAN
 				return rune(0x226e), true
-			case "nltri": 
-				// NOT NORMAL SUBGROUP OF
+			case "nltri":                           // NOT NORMAL SUBGROUP OF
 				return rune(0x22ea), true
-			case "nltrie": 
-				// NOT NORMAL SUBGROUP OF OR EQUAL TO
+			case "nltrie":                          // NOT NORMAL SUBGROUP OF OR EQUAL TO
 				return rune(0x22ec), true
-			case "nltrivb": 
-				// LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+			case "nltrivb":                         // LEFT TRIANGLE BESIDE VERTICAL BAR with slash
 				return rune(0x29cf), true
-			case "nmid": 
-				// DOES NOT DIVIDE
+			case "nmid":                            // DOES NOT DIVIDE
 				return rune(0x2224), true
-			case "nopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL N
+			case "nopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL N
 				return rune(0x01d55f), true
-			case "notin": 
-				// NOT AN ELEMENT OF
+			case "not":                             // NOT SIGN
+				return rune(0xac), true
+			case "notin":                           // NOT AN ELEMENT OF
 				return rune(0x2209), true
-			case "notinE": 
-				// ELEMENT OF WITH TWO HORIZONTAL STROKES with slash
+			case "notinE":                          // ELEMENT OF WITH TWO HORIZONTAL STROKES with slash
 				return rune(0x22f9), true
-			case "notindot": 
-				// ELEMENT OF WITH DOT ABOVE with slash
+			case "notindot":                        // ELEMENT OF WITH DOT ABOVE with slash
 				return rune(0x22f5), true
-			case "notinva": 
-				// NOT AN ELEMENT OF
+			case "notinva":                         // NOT AN ELEMENT OF
 				return rune(0x2209), true
-			case "notinvb": 
-				// SMALL ELEMENT OF WITH OVERBAR
+			case "notinvb":                         // SMALL ELEMENT OF WITH OVERBAR
 				return rune(0x22f7), true
-			case "notinvc": 
-				// ELEMENT OF WITH OVERBAR
+			case "notinvc":                         // ELEMENT OF WITH OVERBAR
 				return rune(0x22f6), true
-			case "notni": 
-				// DOES NOT CONTAIN AS MEMBER
+			case "notni":                           // DOES NOT CONTAIN AS MEMBER
 				return rune(0x220c), true
-			case "notniva": 
-				// DOES NOT CONTAIN AS MEMBER
+			case "notniva":                         // DOES NOT CONTAIN AS MEMBER
 				return rune(0x220c), true
-			case "notnivb": 
-				// SMALL CONTAINS WITH OVERBAR
+			case "notnivb":                         // SMALL CONTAINS WITH OVERBAR
 				return rune(0x22fe), true
-			case "notnivc": 
-				// CONTAINS WITH OVERBAR
+			case "notnivc":                         // CONTAINS WITH OVERBAR
 				return rune(0x22fd), true
-			case "not": 
-				// NOT SIGN
-				return rune(0xac), true
-			case "npart": 
-				// PARTIAL DIFFERENTIAL with slash
-				return rune(0x2202), true
-			case "npar": 
-				// NOT PARALLEL TO
+			case "npar":                            // NOT PARALLEL TO
 				return rune(0x2226), true
-			case "nparallel": 
-				// NOT PARALLEL TO
+			case "nparallel":                       // NOT PARALLEL TO
 				return rune(0x2226), true
-			case "nparsl": 
-				// DOUBLE SOLIDUS OPERATOR with reverse slash
+			case "nparsl":                          // DOUBLE SOLIDUS OPERATOR with reverse slash
 				return rune(0x2afd), true
-			case "npolint": 
-				// LINE INTEGRATION NOT INCLUDING THE POLE
+			case "npart":                           // PARTIAL DIFFERENTIAL with slash
+				return rune(0x2202), true
+			case "npolint":                         // LINE INTEGRATION NOT INCLUDING THE POLE
 				return rune(0x2a14), true
-			case "nprsim": 
-				// PRECEDES OR EQUIVALENT TO with slash
-				return rune(0x227e), true
-			case "npr": 
-				// DOES NOT PRECEDE
+			case "npr":                             // DOES NOT PRECEDE
 				return rune(0x2280), true
-			case "nprcue": 
-				// DOES NOT PRECEDE OR EQUAL
+			case "nprcue":                          // DOES NOT PRECEDE OR EQUAL
 				return rune(0x22e0), true
-			case "nprec": 
-				// DOES NOT PRECEDE
-				return rune(0x2280), true
-			case "npre": 
-				// PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+			case "npre":                            // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
 				return rune(0x2aaf), true
-			case "npreceq": 
-				// PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+			case "nprec":                           // DOES NOT PRECEDE
+				return rune(0x2280), true
+			case "npreceq":                         // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
 				return rune(0x2aaf), true
-			case "nrArr": 
-				// RIGHTWARDS DOUBLE ARROW WITH STROKE
+			case "nprsim":                          // PRECEDES OR EQUIVALENT TO with slash
+				return rune(0x227e), true
+			case "nrArr":                           // RIGHTWARDS DOUBLE ARROW WITH STROKE
 				return rune(0x21cf), true
-			case "nrarrw": 
-				// RIGHTWARDS WAVE ARROW with slash
-				return rune(0x219d), true
-			case "nrarr": 
-				// RIGHTWARDS ARROW WITH STROKE
+			case "nrarr":                           // RIGHTWARDS ARROW WITH STROKE
 				return rune(0x219b), true
-			case "nrarrc": 
-				// WAVE ARROW POINTING DIRECTLY RIGHT with slash
+			case "nrarrc":                          // WAVE ARROW POINTING DIRECTLY RIGHT with slash
 				return rune(0x2933), true
-			case "nrightarrow": 
-				// RIGHTWARDS ARROW WITH STROKE
+			case "nrarrw":                          // RIGHTWARDS WAVE ARROW with slash
+				return rune(0x219d), true
+			case "nrightarrow":                     // RIGHTWARDS ARROW WITH STROKE
 				return rune(0x219b), true
-			case "nrtri": 
-				// DOES NOT CONTAIN AS NORMAL SUBGROUP
+			case "nrtri":                           // DOES NOT CONTAIN AS NORMAL SUBGROUP
 				return rune(0x22eb), true
-			case "nrtrie": 
-				// DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+			case "nrtrie":                          // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
 				return rune(0x22ed), true
-			case "nsGt": 
-				// DOUBLE NESTED GREATER-THAN with slash
+			case "nsGt":                            // DOUBLE NESTED GREATER-THAN with slash
 				return rune(0x2aa2), true
-			case "nsLt": 
-				// DOUBLE NESTED LESS-THAN with slash
+			case "nsLt":                            // DOUBLE NESTED LESS-THAN with slash
 				return rune(0x2aa1), true
-			case "nscsim": 
-				// SUCCEEDS OR EQUIVALENT TO with slash
-				return rune(0x227f), true
-			case "nsc": 
-				// DOES NOT SUCCEED
+			case "nsc":                             // DOES NOT SUCCEED
 				return rune(0x2281), true
-			case "nsccue": 
-				// DOES NOT SUCCEED OR EQUAL
+			case "nsccue":                          // DOES NOT SUCCEED OR EQUAL
 				return rune(0x22e1), true
-			case "nsce": 
-				// SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+			case "nsce":                            // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
 				return rune(0x2ab0), true
-			case "nscr": 
-				// MATHEMATICAL SCRIPT SMALL N
+			case "nscr":                            // MATHEMATICAL SCRIPT SMALL N
 				return rune(0x01d4c3), true
-			case "nshortmid": 
-				// DOES NOT DIVIDE
+			case "nscsim":                          // SUCCEEDS OR EQUIVALENT TO with slash
+				return rune(0x227f), true
+			case "nshortmid":                       // DOES NOT DIVIDE
 				return rune(0x2224), true
-			case "nshortparallel": 
-				// NOT PARALLEL TO
+			case "nshortparallel":                  // NOT PARALLEL TO
 				return rune(0x2226), true
-			case "nsim": 
-				// NOT TILDE
+			case "nsim":                            // NOT TILDE
 				return rune(0x2241), true
-			case "nsime": 
-				// NOT ASYMPTOTICALLY EQUAL TO
+			case "nsime":                           // NOT ASYMPTOTICALLY EQUAL TO
 				return rune(0x2244), true
-			case "nsimeq": 
-				// NOT ASYMPTOTICALLY EQUAL TO
+			case "nsimeq":                          // NOT ASYMPTOTICALLY EQUAL TO
 				return rune(0x2244), true
-			case "nsmid": 
-				// DOES NOT DIVIDE
+			case "nsmid":                           // DOES NOT DIVIDE
 				return rune(0x2224), true
-			case "nspar": 
-				// NOT PARALLEL TO
+			case "nspar":                           // NOT PARALLEL TO
 				return rune(0x2226), true
-			case "nsqsub": 
-				// SQUARE IMAGE OF with slash
+			case "nsqsub":                          // SQUARE IMAGE OF with slash
 				return rune(0x228f), true
-			case "nsqsube": 
-				// NOT SQUARE IMAGE OF OR EQUAL TO
+			case "nsqsube":                         // NOT SQUARE IMAGE OF OR EQUAL TO
 				return rune(0x22e2), true
-			case "nsqsup": 
-				// SQUARE ORIGINAL OF with slash
+			case "nsqsup":                          // SQUARE ORIGINAL OF with slash
 				return rune(0x2290), true
-			case "nsqsupe": 
-				// NOT SQUARE ORIGINAL OF OR EQUAL TO
+			case "nsqsupe":                         // NOT SQUARE ORIGINAL OF OR EQUAL TO
 				return rune(0x22e3), true
-			case "nsubset": 
-				// SUBSET OF with vertical line
-				return rune(0x2282), true
-			case "nsub": 
-				// NOT A SUBSET OF
+			case "nsub":                            // NOT A SUBSET OF
 				return rune(0x2284), true
-			case "nsubE": 
-				// SUBSET OF ABOVE EQUALS SIGN with slash
+			case "nsubE":                           // SUBSET OF ABOVE EQUALS SIGN with slash
 				return rune(0x2ac5), true
-			case "nsube": 
-				// NEITHER A SUBSET OF NOR EQUAL TO
+			case "nsube":                           // NEITHER A SUBSET OF NOR EQUAL TO
 				return rune(0x2288), true
-			case "nsubseteq": 
-				// NEITHER A SUBSET OF NOR EQUAL TO
+			case "nsubset":                         // SUBSET OF with vertical line
+				return rune(0x2282), true
+			case "nsubseteq":                       // NEITHER A SUBSET OF NOR EQUAL TO
 				return rune(0x2288), true
-			case "nsubseteqq": 
-				// SUBSET OF ABOVE EQUALS SIGN with slash
+			case "nsubseteqq":                      // SUBSET OF ABOVE EQUALS SIGN with slash
 				return rune(0x2ac5), true
-			case "nsucc": 
-				// DOES NOT SUCCEED
+			case "nsucc":                           // DOES NOT SUCCEED
 				return rune(0x2281), true
-			case "nsucceq": 
-				// SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+			case "nsucceq":                         // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
 				return rune(0x2ab0), true
-			case "nsupset": 
-				// SUPERSET OF with vertical line
-				return rune(0x2283), true
-			case "nsup": 
-				// NOT A SUPERSET OF
+			case "nsup":                            // NOT A SUPERSET OF
 				return rune(0x2285), true
-			case "nsupE": 
-				// SUPERSET OF ABOVE EQUALS SIGN with slash
+			case "nsupE":                           // SUPERSET OF ABOVE EQUALS SIGN with slash
 				return rune(0x2ac6), true
-			case "nsupe": 
-				// NEITHER A SUPERSET OF NOR EQUAL TO
+			case "nsupe":                           // NEITHER A SUPERSET OF NOR EQUAL TO
 				return rune(0x2289), true
-			case "nsupseteq": 
-				// NEITHER A SUPERSET OF NOR EQUAL TO
+			case "nsupset":                         // SUPERSET OF with vertical line
+				return rune(0x2283), true
+			case "nsupseteq":                       // NEITHER A SUPERSET OF NOR EQUAL TO
 				return rune(0x2289), true
-			case "nsupseteqq": 
-				// SUPERSET OF ABOVE EQUALS SIGN with slash
+			case "nsupseteqq":                      // SUPERSET OF ABOVE EQUALS SIGN with slash
 				return rune(0x2ac6), true
-			case "ntgl": 
-				// NEITHER GREATER-THAN NOR LESS-THAN
+			case "ntgl":                            // NEITHER GREATER-THAN NOR LESS-THAN
 				return rune(0x2279), true
-			case "ntilde": 
-				// LATIN SMALL LETTER N WITH TILDE
+			case "ntilde":                          // LATIN SMALL LETTER N WITH TILDE
 				return rune(0xf1), true
-			case "ntlg": 
-				// NEITHER LESS-THAN NOR GREATER-THAN
+			case "ntlg":                            // NEITHER LESS-THAN NOR GREATER-THAN
 				return rune(0x2278), true
-			case "ntriangleleft": 
-				// NOT NORMAL SUBGROUP OF
+			case "ntriangleleft":                   // NOT NORMAL SUBGROUP OF
 				return rune(0x22ea), true
-			case "ntrianglelefteq": 
-				// NOT NORMAL SUBGROUP OF OR EQUAL TO
+			case "ntrianglelefteq":                 // NOT NORMAL SUBGROUP OF OR EQUAL TO
 				return rune(0x22ec), true
-			case "ntriangleright": 
-				// DOES NOT CONTAIN AS NORMAL SUBGROUP
+			case "ntriangleright":                  // DOES NOT CONTAIN AS NORMAL SUBGROUP
 				return rune(0x22eb), true
-			case "ntrianglerighteq": 
-				// DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+			case "ntrianglerighteq":                // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
 				return rune(0x22ed), true
-			case "numero": 
-				// NUMERO SIGN
-				return rune(0x2116), true
-			case "numsp": 
-				// FIGURE SPACE
-				return rune(0x2007), true
-			case "nu": 
-				// GREEK SMALL LETTER NU
+			case "nu":                              // GREEK SMALL LETTER NU
 				return rune(0x03bd), true
-			case "num": 
-				// NUMBER SIGN
+			case "num":                             // NUMBER SIGN
 				return rune(0x23), true
-			case "nvDash": 
-				// NOT TRUE
+			case "numero":                          // NUMERO SIGN
+				return rune(0x2116), true
+			case "numsp":                           // FIGURE SPACE
+				return rune(0x2007), true
+			case "nvDash":                          // NOT TRUE
 				return rune(0x22ad), true
-			case "nvHarr": 
-				// LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+			case "nvHarr":                          // LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
 				return rune(0x2904), true
-			case "nvap": 
-				// EQUIVALENT TO with vertical line
+			case "nvap":                            // EQUIVALENT TO with vertical line
 				return rune(0x224d), true
-			case "nvbrtri": 
-				// VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+			case "nvbrtri":                         // VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
 				return rune(0x29d0), true
-			case "nvdash": 
-				// DOES NOT PROVE
+			case "nvdash":                          // DOES NOT PROVE
 				return rune(0x22ac), true
-			case "nvge": 
-				// GREATER-THAN OR EQUAL TO with vertical line
+			case "nvge":                            // GREATER-THAN OR EQUAL TO with vertical line
 				return rune(0x2265), true
-			case "nvgt": 
-				// GREATER-THAN SIGN with vertical line
+			case "nvgt":                            // GREATER-THAN SIGN with vertical line
 				return rune(0x3e), true
-			case "nvinfin": 
-				// INFINITY NEGATED WITH VERTICAL BAR
+			case "nvinfin":                         // INFINITY NEGATED WITH VERTICAL BAR
 				return rune(0x29de), true
-			case "nvlArr": 
-				// LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+			case "nvlArr":                          // LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
 				return rune(0x2902), true
-			case "nvle": 
-				// LESS-THAN OR EQUAL TO with vertical line
+			case "nvle":                            // LESS-THAN OR EQUAL TO with vertical line
 				return rune(0x2264), true
-			case "nvltrie": 
-				// NORMAL SUBGROUP OF OR EQUAL TO with vertical line
-				return rune(0x22b4), true
-			case "nvlt": 
-				// LESS-THAN SIGN with vertical line
+			case "nvlt":                            // LESS-THAN SIGN with vertical line
 				return rune(0x3c), true
-			case "nvrArr": 
-				// RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+			case "nvltrie":                         // NORMAL SUBGROUP OF OR EQUAL TO with vertical line
+				return rune(0x22b4), true
+			case "nvrArr":                          // RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
 				return rune(0x2903), true
-			case "nvrtrie": 
-				// CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line
+			case "nvrtrie":                         // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line
 				return rune(0x22b5), true
-			case "nvsim": 
-				// TILDE OPERATOR with vertical line
+			case "nvsim":                           // TILDE OPERATOR with vertical line
 				return rune(0x223c), true
-			case "nwArr": 
-				// NORTH WEST DOUBLE ARROW
+			case "nwArr":                           // NORTH WEST DOUBLE ARROW
 				return rune(0x21d6), true
-			case "nwarhk": 
-				// NORTH WEST ARROW WITH HOOK
+			case "nwarhk":                          // NORTH WEST ARROW WITH HOOK
 				return rune(0x2923), true
-			case "nwarrow": 
-				// NORTH WEST ARROW
+			case "nwarr":                           // NORTH WEST ARROW
 				return rune(0x2196), true
-			case "nwarr": 
-				// NORTH WEST ARROW
+			case "nwarrow":                         // NORTH WEST ARROW
 				return rune(0x2196), true
-			case "nwnear": 
-				// NORTH WEST ARROW AND NORTH EAST ARROW
+			case "nwnear":                          // NORTH WEST ARROW AND NORTH EAST ARROW
 				return rune(0x2927), true
-			case "nwonearr": 
-				// NORTH WEST ARROW CROSSING NORTH EAST ARROW
+			case "nwonearr":                        // NORTH WEST ARROW CROSSING NORTH EAST ARROW
 				return rune(0x2932), true
-			case "nwsesarr": 
-				// NORTH WEST AND SOUTH EAST ARROW
+			case "nwsesarr":                        // NORTH WEST AND SOUTH EAST ARROW
 				return rune(0x2921), true
 		}
 
 	case 'o':
 		switch name {
-			case "oS": 
-				// CIRCLED LATIN CAPITAL LETTER S
+			case "oS":                              // CIRCLED LATIN CAPITAL LETTER S
 				return rune(0x24c8), true
-			case "oacgr": 
-				// GREEK SMALL LETTER OMICRON WITH TONOS
+			case "oacgr":                           // GREEK SMALL LETTER OMICRON WITH TONOS
 				return rune(0x03cc), true
-			case "oacute": 
-				// LATIN SMALL LETTER O WITH ACUTE
+			case "oacute":                          // LATIN SMALL LETTER O WITH ACUTE
 				return rune(0xf3), true
-			case "oast": 
-				// CIRCLED ASTERISK OPERATOR
+			case "oast":                            // CIRCLED ASTERISK OPERATOR
 				return rune(0x229b), true
-			case "obsol": 
-				// CIRCLED REVERSE SOLIDUS
+			case "obsol":                           // CIRCLED REVERSE SOLIDUS
 				return rune(0x29b8), true
-			case "ocir": 
-				// CIRCLED RING OPERATOR
+			case "ocir":                            // CIRCLED RING OPERATOR
 				return rune(0x229a), true
-			case "ocirc": 
-				// LATIN SMALL LETTER O WITH CIRCUMFLEX
+			case "ocirc":                           // LATIN SMALL LETTER O WITH CIRCUMFLEX
 				return rune(0xf4), true
-			case "ocy": 
-				// CYRILLIC SMALL LETTER O
+			case "ocy":                             // CYRILLIC SMALL LETTER O
 				return rune(0x043e), true
-			case "odash": 
-				// CIRCLED DASH
+			case "odash":                           // CIRCLED DASH
 				return rune(0x229d), true
-			case "odblac": 
-				// LATIN SMALL LETTER O WITH DOUBLE ACUTE
+			case "odblac":                          // LATIN SMALL LETTER O WITH DOUBLE ACUTE
 				return rune(0x0151), true
-			case "odiv": 
-				// CIRCLED DIVISION SIGN
+			case "odiv":                            // CIRCLED DIVISION SIGN
 				return rune(0x2a38), true
-			case "odot": 
-				// CIRCLED DOT OPERATOR
+			case "odot":                            // CIRCLED DOT OPERATOR
 				return rune(0x2299), true
-			case "odsold": 
-				// CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+			case "odsold":                          // CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
 				return rune(0x29bc), true
-			case "oelig": 
-				// LATIN SMALL LIGATURE OE
+			case "oelig":                           // LATIN SMALL LIGATURE OE
 				return rune(0x0153), true
-			case "ofcir": 
-				// CIRCLED BULLET
+			case "ofcir":                           // CIRCLED BULLET
 				return rune(0x29bf), true
-			case "ofr": 
-				// MATHEMATICAL FRAKTUR SMALL O
+			case "ofr":                             // MATHEMATICAL FRAKTUR SMALL O
 				return rune(0x01d52c), true
-			case "ogon": 
-				// OGONEK
+			case "ogon":                            // OGONEK
 				return rune(0x02db), true
-			case "ogr": 
-				// GREEK SMALL LETTER OMICRON
+			case "ogr":                             // GREEK SMALL LETTER OMICRON
 				return rune(0x03bf), true
-			case "ograve": 
-				// LATIN SMALL LETTER O WITH GRAVE
+			case "ograve":                          // LATIN SMALL LETTER O WITH GRAVE
 				return rune(0xf2), true
-			case "ogt": 
-				// CIRCLED GREATER-THAN
+			case "ogt":                             // CIRCLED GREATER-THAN
 				return rune(0x29c1), true
-			case "ohacgr": 
-				// GREEK SMALL LETTER OMEGA WITH TONOS
+			case "ohacgr":                          // GREEK SMALL LETTER OMEGA WITH TONOS
 				return rune(0x03ce), true
-			case "ohbar": 
-				// CIRCLE WITH HORIZONTAL BAR
+			case "ohbar":                           // CIRCLE WITH HORIZONTAL BAR
 				return rune(0x29b5), true
-			case "ohgr": 
-				// GREEK SMALL LETTER OMEGA
+			case "ohgr":                            // GREEK SMALL LETTER OMEGA
 				return rune(0x03c9), true
-			case "ohm": 
-				// GREEK CAPITAL LETTER OMEGA
+			case "ohm":                             // GREEK CAPITAL LETTER OMEGA
 				return rune(0x03a9), true
-			case "oint": 
-				// CONTOUR INTEGRAL
+			case "oint":                            // CONTOUR INTEGRAL
 				return rune(0x222e), true
-			case "olarr": 
-				// ANTICLOCKWISE OPEN CIRCLE ARROW
+			case "olarr":                           // ANTICLOCKWISE OPEN CIRCLE ARROW
 				return rune(0x21ba), true
-			case "olcir": 
-				// CIRCLED WHITE BULLET
+			case "olcir":                           // CIRCLED WHITE BULLET
 				return rune(0x29be), true
-			case "olcross": 
-				// CIRCLE WITH SUPERIMPOSED X
+			case "olcross":                         // CIRCLE WITH SUPERIMPOSED X
 				return rune(0x29bb), true
-			case "oline": 
-				// OVERLINE
+			case "oline":                           // OVERLINE
 				return rune(0x203e), true
-			case "olt": 
-				// CIRCLED LESS-THAN
+			case "olt":                             // CIRCLED LESS-THAN
 				return rune(0x29c0), true
-			case "omacr": 
-				// LATIN SMALL LETTER O WITH MACRON
+			case "omacr":                           // LATIN SMALL LETTER O WITH MACRON
 				return rune(0x014d), true
-			case "omega": 
-				// GREEK SMALL LETTER OMEGA
+			case "omega":                           // GREEK SMALL LETTER OMEGA
 				return rune(0x03c9), true
-			case "omicron": 
-				// GREEK SMALL LETTER OMICRON
+			case "omicron":                         // GREEK SMALL LETTER OMICRON
 				return rune(0x03bf), true
-			case "omid": 
-				// CIRCLED VERTICAL BAR
+			case "omid":                            // CIRCLED VERTICAL BAR
 				return rune(0x29b6), true
-			case "ominus": 
-				// CIRCLED MINUS
+			case "ominus":                          // CIRCLED MINUS
 				return rune(0x2296), true
-			case "oopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL O
+			case "oopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL O
 				return rune(0x01d560), true
-			case "opar": 
-				// CIRCLED PARALLEL
+			case "opar":                            // CIRCLED PARALLEL
 				return rune(0x29b7), true
-			case "operp": 
-				// CIRCLED PERPENDICULAR
+			case "operp":                           // CIRCLED PERPENDICULAR
 				return rune(0x29b9), true
-			case "opfgamma": 
-				// DOUBLE-STRUCK SMALL GAMMA
+			case "opfgamma":                        // DOUBLE-STRUCK SMALL GAMMA
 				return rune(0x213d), true
-			case "opfpi": 
-				// DOUBLE-STRUCK CAPITAL PI
+			case "opfpi":                           // DOUBLE-STRUCK CAPITAL PI
 				return rune(0x213f), true
-			case "opfsum": 
-				// DOUBLE-STRUCK N-ARY SUMMATION
+			case "opfsum":                          // DOUBLE-STRUCK N-ARY SUMMATION
 				return rune(0x2140), true
-			case "oplus": 
-				// CIRCLED PLUS
+			case "oplus":                           // CIRCLED PLUS
 				return rune(0x2295), true
-			case "orarr": 
-				// CLOCKWISE OPEN CIRCLE ARROW
-				return rune(0x21bb), true
-			case "or": 
-				// LOGICAL OR
+			case "or":                              // LOGICAL OR
 				return rune(0x2228), true
-			case "orderof": 
-				// SCRIPT SMALL O
+			case "orarr":                           // CLOCKWISE OPEN CIRCLE ARROW
+				return rune(0x21bb), true
+			case "ord":                             // LOGICAL OR WITH HORIZONTAL DASH
+				return rune(0x2a5d), true
+			case "order":                           // SCRIPT SMALL O
 				return rune(0x2134), true
-			case "order": 
-				// SCRIPT SMALL O
+			case "orderof":                         // SCRIPT SMALL O
 				return rune(0x2134), true
-			case "ord": 
-				// LOGICAL OR WITH HORIZONTAL DASH
-				return rune(0x2a5d), true
-			case "ordf": 
-				// FEMININE ORDINAL INDICATOR
+			case "ordf":                            // FEMININE ORDINAL INDICATOR
 				return rune(0xaa), true
-			case "ordm": 
-				// MASCULINE ORDINAL INDICATOR
+			case "ordm":                            // MASCULINE ORDINAL INDICATOR
 				return rune(0xba), true
-			case "origof": 
-				// ORIGINAL OF
+			case "origof":                          // ORIGINAL OF
 				return rune(0x22b6), true
-			case "oror": 
-				// TWO INTERSECTING LOGICAL OR
+			case "oror":                            // TWO INTERSECTING LOGICAL OR
 				return rune(0x2a56), true
-			case "orslope": 
-				// SLOPING LARGE OR
+			case "orslope":                         // SLOPING LARGE OR
 				return rune(0x2a57), true
-			case "orv": 
-				// LOGICAL OR WITH MIDDLE STEM
+			case "orv":                             // LOGICAL OR WITH MIDDLE STEM
 				return rune(0x2a5b), true
-			case "oscr": 
-				// SCRIPT SMALL O
+			case "oscr":                            // SCRIPT SMALL O
 				return rune(0x2134), true
-			case "oslash": 
-				// LATIN SMALL LETTER O WITH STROKE
+			case "oslash":                          // LATIN SMALL LETTER O WITH STROKE
 				return rune(0xf8), true
-			case "osol": 
-				// CIRCLED DIVISION SLASH
+			case "osol":                            // CIRCLED DIVISION SLASH
 				return rune(0x2298), true
-			case "otilde": 
-				// LATIN SMALL LETTER O WITH TILDE
+			case "otilde":                          // LATIN SMALL LETTER O WITH TILDE
 				return rune(0xf5), true
-			case "otimes": 
-				// CIRCLED TIMES
+			case "otimes":                          // CIRCLED TIMES
 				return rune(0x2297), true
-			case "otimesas": 
-				// CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+			case "otimesas":                        // CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
 				return rune(0x2a36), true
-			case "ouml": 
-				// LATIN SMALL LETTER O WITH DIAERESIS
+			case "ouml":                            // LATIN SMALL LETTER O WITH DIAERESIS
 				return rune(0xf6), true
-			case "ovbar": 
-				// APL FUNCTIONAL SYMBOL CIRCLE STILE
+			case "ovbar":                           // APL FUNCTIONAL SYMBOL CIRCLE STILE
 				return rune(0x233d), true
-			case "ovrbrk": 
-				// TOP SQUARE BRACKET
+			case "ovrbrk":                          // TOP SQUARE BRACKET
 				return rune(0x23b4), true
-			case "ovrcub": 
-				// TOP CURLY BRACKET
+			case "ovrcub":                          // TOP CURLY BRACKET
 				return rune(0x23de), true
-			case "ovrpar": 
-				// TOP PARENTHESIS
+			case "ovrpar":                          // TOP PARENTHESIS
 				return rune(0x23dc), true
-			case "oxuarr": 
-				// UP ARROW THROUGH CIRCLE
+			case "oxuarr":                          // UP ARROW THROUGH CIRCLE
 				return rune(0x29bd), true
 		}
 
 	case 'p':
 		switch name {
-			case "part": 
-				// PARTIAL DIFFERENTIAL
-				return rune(0x2202), true
-			case "par": 
-				// PARALLEL TO
+			case "par":                             // PARALLEL TO
 				return rune(0x2225), true
-			case "parallel": 
-				// PARALLEL TO
-				return rune(0x2225), true
-			case "para": 
-				// PILCROW SIGN
+			case "para":                            // PILCROW SIGN
 				return rune(0xb6), true
-			case "parsim": 
-				// PARALLEL WITH TILDE OPERATOR
+			case "parallel":                        // PARALLEL TO
+				return rune(0x2225), true
+			case "parsim":                          // PARALLEL WITH TILDE OPERATOR
 				return rune(0x2af3), true
-			case "parsl": 
-				// DOUBLE SOLIDUS OPERATOR
+			case "parsl":                           // DOUBLE SOLIDUS OPERATOR
 				return rune(0x2afd), true
-			case "pcy": 
-				// CYRILLIC SMALL LETTER PE
+			case "part":                            // PARTIAL DIFFERENTIAL
+				return rune(0x2202), true
+			case "pcy":                             // CYRILLIC SMALL LETTER PE
 				return rune(0x043f), true
-			case "percnt": 
-				// PERCENT SIGN
+			case "percnt":                          // PERCENT SIGN
 				return rune(0x25), true
-			case "period": 
-				// FULL STOP
+			case "period":                          // FULL STOP
 				return rune(0x2e), true
-			case "permil": 
-				// PER MILLE SIGN
+			case "permil":                          // PER MILLE SIGN
 				return rune(0x2030), true
-			case "perp": 
-				// UP TACK
+			case "perp":                            // UP TACK
 				return rune(0x22a5), true
-			case "pertenk": 
-				// PER TEN THOUSAND SIGN
+			case "pertenk":                         // PER TEN THOUSAND SIGN
 				return rune(0x2031), true
-			case "pfr": 
-				// MATHEMATICAL FRAKTUR SMALL P
+			case "pfr":                             // MATHEMATICAL FRAKTUR SMALL P
 				return rune(0x01d52d), true
-			case "pgr": 
-				// GREEK SMALL LETTER PI
+			case "pgr":                             // GREEK SMALL LETTER PI
 				return rune(0x03c0), true
-			case "phgr": 
-				// GREEK SMALL LETTER PHI
+			case "phgr":                            // GREEK SMALL LETTER PHI
+				return rune(0x03c6), true
+			case "phi":                             // GREEK SMALL LETTER PHI
 				return rune(0x03c6), true
-			case "phis": 
-				// GREEK PHI SYMBOL
+			case "phis":                            // GREEK PHI SYMBOL
 				return rune(0x03d5), true
-			case "phiv": 
-				// GREEK PHI SYMBOL
+			case "phiv":                            // GREEK PHI SYMBOL
 				return rune(0x03d5), true
-			case "phi": 
-				// GREEK SMALL LETTER PHI
-				return rune(0x03c6), true
-			case "phmmat": 
-				// SCRIPT CAPITAL M
+			case "phmmat":                          // SCRIPT CAPITAL M
 				return rune(0x2133), true
-			case "phone": 
-				// BLACK TELEPHONE
+			case "phone":                           // BLACK TELEPHONE
 				return rune(0x260e), true
-			case "pitchfork": 
-				// PITCHFORK
+			case "pi":                              // GREEK SMALL LETTER PI
+				return rune(0x03c0), true
+			case "pitchfork":                       // PITCHFORK
 				return rune(0x22d4), true
-			case "piv": 
-				// GREEK PI SYMBOL
+			case "piv":                             // GREEK PI SYMBOL
 				return rune(0x03d6), true
-			case "pi": 
-				// GREEK SMALL LETTER PI
-				return rune(0x03c0), true
-			case "planck": 
-				// PLANCK CONSTANT OVER TWO PI
+			case "planck":                          // PLANCK CONSTANT OVER TWO PI
 				return rune(0x210f), true
-			case "planckh": 
-				// PLANCK CONSTANT
+			case "planckh":                         // PLANCK CONSTANT
 				return rune(0x210e), true
-			case "plankv": 
-				// PLANCK CONSTANT OVER TWO PI
+			case "plankv":                          // PLANCK CONSTANT OVER TWO PI
 				return rune(0x210f), true
-			case "plusacir": 
-				// PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+			case "plus":                            // PLUS SIGN
+				return rune(0x2b), true
+			case "plusacir":                        // PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
 				return rune(0x2a23), true
-			case "plusb": 
-				// SQUARED PLUS
+			case "plusb":                           // SQUARED PLUS
 				return rune(0x229e), true
-			case "pluscir": 
-				// PLUS SIGN WITH SMALL CIRCLE ABOVE
+			case "pluscir":                         // PLUS SIGN WITH SMALL CIRCLE ABOVE
 				return rune(0x2a22), true
-			case "plusdo": 
-				// DOT PLUS
+			case "plusdo":                          // DOT PLUS
 				return rune(0x2214), true
-			case "plusdu": 
-				// PLUS SIGN WITH DOT BELOW
+			case "plusdu":                          // PLUS SIGN WITH DOT BELOW
 				return rune(0x2a25), true
-			case "pluse": 
-				// PLUS SIGN ABOVE EQUALS SIGN
+			case "pluse":                           // PLUS SIGN ABOVE EQUALS SIGN
 				return rune(0x2a72), true
-			case "plusmn": 
-				// PLUS-MINUS SIGN
+			case "plusmn":                          // PLUS-MINUS SIGN
 				return rune(0xb1), true
-			case "plussim": 
-				// PLUS SIGN WITH TILDE BELOW
+			case "plussim":                         // PLUS SIGN WITH TILDE BELOW
 				return rune(0x2a26), true
-			case "plustrif": 
-				// PLUS SIGN WITH BLACK TRIANGLE
+			case "plustrif":                        // PLUS SIGN WITH BLACK TRIANGLE
 				return rune(0x2a28), true
-			case "plustwo": 
-				// PLUS SIGN WITH SUBSCRIPT TWO
+			case "plustwo":                         // PLUS SIGN WITH SUBSCRIPT TWO
 				return rune(0x2a27), true
-			case "plus": 
-				// PLUS SIGN
-				return rune(0x2b), true
-			case "pm": 
-				// PLUS-MINUS SIGN
+			case "pm":                              // PLUS-MINUS SIGN
 				return rune(0xb1), true
-			case "pointint": 
-				// INTEGRAL AROUND A POINT OPERATOR
+			case "pointint":                        // INTEGRAL AROUND A POINT OPERATOR
 				return rune(0x2a15), true
-			case "popf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL P
+			case "popf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL P
 				return rune(0x01d561), true
-			case "pound": 
-				// POUND SIGN
+			case "pound":                           // POUND SIGN
 				return rune(0xa3), true
-			case "prod": 
-				// N-ARY PRODUCT
-				return rune(0x220f), true
-			case "prop": 
-				// PROPORTIONAL TO
-				return rune(0x221d), true
-			case "propto": 
-				// PROPORTIONAL TO
-				return rune(0x221d), true
-			case "pr": 
-				// PRECEDES
+			case "pr":                              // PRECEDES
 				return rune(0x227a), true
-			case "prE": 
-				// PRECEDES ABOVE EQUALS SIGN
+			case "prE":                             // PRECEDES ABOVE EQUALS SIGN
 				return rune(0x2ab3), true
-			case "prap": 
-				// PRECEDES ABOVE ALMOST EQUAL TO
+			case "prap":                            // PRECEDES ABOVE ALMOST EQUAL TO
 				return rune(0x2ab7), true
-			case "prcue": 
-				// PRECEDES OR EQUAL TO
-				return rune(0x227c), true
-			case "prec": 
-				// PRECEDES
-				return rune(0x227a), true
-			case "preccurlyeq": 
-				// PRECEDES OR EQUAL TO
+			case "prcue":                           // PRECEDES OR EQUAL TO
 				return rune(0x227c), true
-			case "precnsim": 
-				// PRECEDES BUT NOT EQUIVALENT TO
-				return rune(0x22e8), true
-			case "precsim": 
-				// PRECEDES OR EQUIVALENT TO
-				return rune(0x227e), true
-			case "pre": 
-				// PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+			case "pre":                             // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
 				return rune(0x2aaf), true
-			case "precapprox": 
-				// PRECEDES ABOVE ALMOST EQUAL TO
+			case "prec":                            // PRECEDES
+				return rune(0x227a), true
+			case "precapprox":                      // PRECEDES ABOVE ALMOST EQUAL TO
 				return rune(0x2ab7), true
-			case "preceq": 
-				// PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+			case "preccurlyeq":                     // PRECEDES OR EQUAL TO
+				return rune(0x227c), true
+			case "preceq":                          // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
 				return rune(0x2aaf), true
-			case "precnapprox": 
-				// PRECEDES ABOVE NOT ALMOST EQUAL TO
+			case "precnapprox":                     // PRECEDES ABOVE NOT ALMOST EQUAL TO
 				return rune(0x2ab9), true
-			case "precneqq": 
-				// PRECEDES ABOVE NOT EQUAL TO
+			case "precneqq":                        // PRECEDES ABOVE NOT EQUAL TO
 				return rune(0x2ab5), true
-			case "primes": 
-				// DOUBLE-STRUCK CAPITAL P
-				return rune(0x2119), true
-			case "prime": 
-				// PRIME
+			case "precnsim":                        // PRECEDES BUT NOT EQUIVALENT TO
+				return rune(0x22e8), true
+			case "precsim":                         // PRECEDES OR EQUIVALENT TO
+				return rune(0x227e), true
+			case "prime":                           // PRIME
 				return rune(0x2032), true
-			case "prnE": 
-				// PRECEDES ABOVE NOT EQUAL TO
+			case "primes":                          // DOUBLE-STRUCK CAPITAL P
+				return rune(0x2119), true
+			case "prnE":                            // PRECEDES ABOVE NOT EQUAL TO
 				return rune(0x2ab5), true
-			case "prnap": 
-				// PRECEDES ABOVE NOT ALMOST EQUAL TO
+			case "prnap":                           // PRECEDES ABOVE NOT ALMOST EQUAL TO
 				return rune(0x2ab9), true
-			case "prnsim": 
-				// PRECEDES BUT NOT EQUIVALENT TO
+			case "prnsim":                          // PRECEDES BUT NOT EQUIVALENT TO
 				return rune(0x22e8), true
-			case "profalar": 
-				// ALL AROUND-PROFILE
+			case "prod":                            // N-ARY PRODUCT
+				return rune(0x220f), true
+			case "profalar":                        // ALL AROUND-PROFILE
 				return rune(0x232e), true
-			case "profline": 
-				// ARC
+			case "profline":                        // ARC
 				return rune(0x2312), true
-			case "profsurf": 
-				// SEGMENT
+			case "profsurf":                        // SEGMENT
 				return rune(0x2313), true
-			case "prsim": 
-				// PRECEDES OR EQUIVALENT TO
+			case "prop":                            // PROPORTIONAL TO
+				return rune(0x221d), true
+			case "propto":                          // PROPORTIONAL TO
+				return rune(0x221d), true
+			case "prsim":                           // PRECEDES OR EQUIVALENT TO
 				return rune(0x227e), true
-			case "prurel": 
-				// PRECEDES UNDER RELATION
+			case "prurel":                          // PRECEDES UNDER RELATION
 				return rune(0x22b0), true
-			case "pscr": 
-				// MATHEMATICAL SCRIPT SMALL P
+			case "pscr":                            // MATHEMATICAL SCRIPT SMALL P
 				return rune(0x01d4c5), true
-			case "psgr": 
-				// GREEK SMALL LETTER PSI
+			case "psgr":                            // GREEK SMALL LETTER PSI
 				return rune(0x03c8), true
-			case "psi": 
-				// GREEK SMALL LETTER PSI
+			case "psi":                             // GREEK SMALL LETTER PSI
 				return rune(0x03c8), true
-			case "puncsp": 
-				// PUNCTUATION SPACE
+			case "puncsp":                          // PUNCTUATION SPACE
 				return rune(0x2008), true
 		}
 
 	case 'q':
 		switch name {
-			case "qfr": 
-				// MATHEMATICAL FRAKTUR SMALL Q
+			case "qfr":                             // MATHEMATICAL FRAKTUR SMALL Q
 				return rune(0x01d52e), true
-			case "qint": 
-				// QUADRUPLE INTEGRAL OPERATOR
+			case "qint":                            // QUADRUPLE INTEGRAL OPERATOR
 				return rune(0x2a0c), true
-			case "qopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL Q
+			case "qopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL Q
 				return rune(0x01d562), true
-			case "qprime": 
-				// QUADRUPLE PRIME
+			case "qprime":                          // QUADRUPLE PRIME
 				return rune(0x2057), true
-			case "qscr": 
-				// MATHEMATICAL SCRIPT SMALL Q
+			case "qscr":                            // MATHEMATICAL SCRIPT SMALL Q
 				return rune(0x01d4c6), true
-			case "quaternions": 
-				// DOUBLE-STRUCK CAPITAL H
+			case "quaternions":                     // DOUBLE-STRUCK CAPITAL H
 				return rune(0x210d), true
-			case "quatint": 
-				// QUATERNION INTEGRAL OPERATOR
+			case "quatint":                         // QUATERNION INTEGRAL OPERATOR
 				return rune(0x2a16), true
-			case "questeq": 
-				// QUESTIONED EQUAL TO
-				return rune(0x225f), true
-			case "quest": 
-				// QUESTION MARK
+			case "quest":                           // QUESTION MARK
 				return rune(0x3f), true
-			case "quot": 
-				// QUOTATION MARK
+			case "questeq":                         // QUESTIONED EQUAL TO
+				return rune(0x225f), true
+			case "quot":                            // QUOTATION MARK
 				return rune(0x22), true
 		}
 
 	case 'r':
 		switch name {
-			case "rAarr": 
-				// RIGHTWARDS TRIPLE ARROW
+			case "rAarr":                           // RIGHTWARDS TRIPLE ARROW
 				return rune(0x21db), true
-			case "rArr": 
-				// RIGHTWARDS DOUBLE ARROW
+			case "rArr":                            // RIGHTWARDS DOUBLE ARROW
 				return rune(0x21d2), true
-			case "rAtail": 
-				// RIGHTWARDS DOUBLE ARROW-TAIL
+			case "rAtail":                          // RIGHTWARDS DOUBLE ARROW-TAIL
 				return rune(0x291c), true
-			case "rBarr": 
-				// RIGHTWARDS TRIPLE DASH ARROW
+			case "rBarr":                           // RIGHTWARDS TRIPLE DASH ARROW
 				return rune(0x290f), true
-			case "rHar": 
-				// RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+			case "rHar":                            // RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
 				return rune(0x2964), true
-			case "race": 
-				// REVERSED TILDE with underline
+			case "race":                            // REVERSED TILDE with underline
 				return rune(0x223d), true
-			case "racute": 
-				// LATIN SMALL LETTER R WITH ACUTE
+			case "racute":                          // LATIN SMALL LETTER R WITH ACUTE
 				return rune(0x0155), true
-			case "radic": 
-				// SQUARE ROOT
+			case "radic":                           // SQUARE ROOT
 				return rune(0x221a), true
-			case "raemptyv": 
-				// EMPTY SET WITH RIGHT ARROW ABOVE
+			case "raemptyv":                        // EMPTY SET WITH RIGHT ARROW ABOVE
 				return rune(0x29b3), true
-			case "rang": 
-				// MATHEMATICAL RIGHT ANGLE BRACKET
+			case "rang":                            // MATHEMATICAL RIGHT ANGLE BRACKET
 				return rune(0x27e9), true
-			case "rangd": 
-				// RIGHT ANGLE BRACKET WITH DOT
+			case "rangd":                           // RIGHT ANGLE BRACKET WITH DOT
 				return rune(0x2992), true
-			case "range": 
-				// REVERSED ANGLE WITH UNDERBAR
+			case "range":                           // REVERSED ANGLE WITH UNDERBAR
 				return rune(0x29a5), true
-			case "rangle": 
-				// MATHEMATICAL RIGHT ANGLE BRACKET
+			case "rangle":                          // MATHEMATICAL RIGHT ANGLE BRACKET
 				return rune(0x27e9), true
-			case "raquo": 
-				// RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+			case "raquo":                           // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
 				return rune(0xbb), true
-			case "rarr2": 
-				// RIGHTWARDS PAIRED ARROWS
+			case "rarr":                            // RIGHTWARDS ARROW
+				return rune(0x2192), true
+			case "rarr2":                           // RIGHTWARDS PAIRED ARROWS
 				return rune(0x21c9), true
-			case "rarr3": 
-				// THREE RIGHTWARDS ARROWS
+			case "rarr3":                           // THREE RIGHTWARDS ARROWS
 				return rune(0x21f6), true
-			case "rarrb": 
-				// RIGHTWARDS ARROW TO BAR
-				return rune(0x21e5), true
-			case "rarrhk": 
-				// RIGHTWARDS ARROW WITH HOOK
-				return rune(0x21aa), true
-			case "rarrlp": 
-				// RIGHTWARDS ARROW WITH LOOP
-				return rune(0x21ac), true
-			case "rarrtl": 
-				// RIGHTWARDS ARROW WITH TAIL
-				return rune(0x21a3), true
-			case "rarrw": 
-				// RIGHTWARDS WAVE ARROW
-				return rune(0x219d), true
-			case "rarr": 
-				// RIGHTWARDS ARROW
-				return rune(0x2192), true
-			case "rarrap": 
-				// RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+			case "rarrap":                          // RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
 				return rune(0x2975), true
-			case "rarrbfs": 
-				// RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+			case "rarrb":                           // RIGHTWARDS ARROW TO BAR
+				return rune(0x21e5), true
+			case "rarrbfs":                         // RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
 				return rune(0x2920), true
-			case "rarrc": 
-				// WAVE ARROW POINTING DIRECTLY RIGHT
+			case "rarrc":                           // WAVE ARROW POINTING DIRECTLY RIGHT
 				return rune(0x2933), true
-			case "rarrfs": 
-				// RIGHTWARDS ARROW TO BLACK DIAMOND
+			case "rarrfs":                          // RIGHTWARDS ARROW TO BLACK DIAMOND
 				return rune(0x291e), true
-			case "rarrpl": 
-				// RIGHTWARDS ARROW WITH PLUS BELOW
+			case "rarrhk":                          // RIGHTWARDS ARROW WITH HOOK
+				return rune(0x21aa), true
+			case "rarrlp":                          // RIGHTWARDS ARROW WITH LOOP
+				return rune(0x21ac), true
+			case "rarrpl":                          // RIGHTWARDS ARROW WITH PLUS BELOW
 				return rune(0x2945), true
-			case "rarrsim": 
-				// RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+			case "rarrsim":                         // RIGHTWARDS ARROW ABOVE TILDE OPERATOR
 				return rune(0x2974), true
-			case "rarrx": 
-				// RIGHTWARDS ARROW THROUGH X
+			case "rarrtl":                          // RIGHTWARDS ARROW WITH TAIL
+				return rune(0x21a3), true
+			case "rarrw":                           // RIGHTWARDS WAVE ARROW
+				return rune(0x219d), true
+			case "rarrx":                           // RIGHTWARDS ARROW THROUGH X
 				return rune(0x2947), true
-			case "ratail": 
-				// RIGHTWARDS ARROW-TAIL
+			case "ratail":                          // RIGHTWARDS ARROW-TAIL
 				return rune(0x291a), true
-			case "ratio": 
-				// RATIO
+			case "ratio":                           // RATIO
 				return rune(0x2236), true
-			case "rationals": 
-				// DOUBLE-STRUCK CAPITAL Q
+			case "rationals":                       // DOUBLE-STRUCK CAPITAL Q
 				return rune(0x211a), true
-			case "rbarr": 
-				// RIGHTWARDS DOUBLE DASH ARROW
+			case "rbarr":                           // RIGHTWARDS DOUBLE DASH ARROW
 				return rune(0x290d), true
-			case "rbbrk": 
-				// LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+			case "rbbrk":                           // LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
 				return rune(0x2773), true
-			case "rbrace": 
-				// RIGHT CURLY BRACKET
+			case "rbrace":                          // RIGHT CURLY BRACKET
 				return rune(0x7d), true
-			case "rbrack": 
-				// RIGHT SQUARE BRACKET
+			case "rbrack":                          // RIGHT SQUARE BRACKET
 				return rune(0x5d), true
-			case "rbrke": 
-				// RIGHT SQUARE BRACKET WITH UNDERBAR
+			case "rbrke":                           // RIGHT SQUARE BRACKET WITH UNDERBAR
 				return rune(0x298c), true
-			case "rbrksld": 
-				// RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+			case "rbrksld":                         // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
 				return rune(0x298e), true
-			case "rbrkslu": 
-				// RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+			case "rbrkslu":                         // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
 				return rune(0x2990), true
-			case "rcaron": 
-				// LATIN SMALL LETTER R WITH CARON
+			case "rcaron":                          // LATIN SMALL LETTER R WITH CARON
 				return rune(0x0159), true
-			case "rcedil": 
-				// LATIN SMALL LETTER R WITH CEDILLA
+			case "rcedil":                          // LATIN SMALL LETTER R WITH CEDILLA
 				return rune(0x0157), true
-			case "rceil": 
-				// RIGHT CEILING
+			case "rceil":                           // RIGHT CEILING
 				return rune(0x2309), true
-			case "rcub": 
-				// RIGHT CURLY BRACKET
+			case "rcub":                            // RIGHT CURLY BRACKET
 				return rune(0x7d), true
-			case "rcy": 
-				// CYRILLIC SMALL LETTER ER
+			case "rcy":                             // CYRILLIC SMALL LETTER ER
 				return rune(0x0440), true
-			case "rdca": 
-				// ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+			case "rdca":                            // ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
 				return rune(0x2937), true
-			case "rdharb": 
-				// RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+			case "rdharb":                          // RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
 				return rune(0x2957), true
-			case "rdiag": 
-				// BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+			case "rdiag":                           // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
 				return rune(0x2571), true
-			case "rdiofdi": 
-				// RISING DIAGONAL CROSSING FALLING DIAGONAL
+			case "rdiofdi":                         // RISING DIAGONAL CROSSING FALLING DIAGONAL
 				return rune(0x292b), true
-			case "rdldhar": 
-				// RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+			case "rdldhar":                         // RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
 				return rune(0x2969), true
-			case "rdosearr": 
-				// RISING DIAGONAL CROSSING SOUTH EAST ARROW
+			case "rdosearr":                        // RISING DIAGONAL CROSSING SOUTH EAST ARROW
 				return rune(0x2930), true
-			case "rdquor": 
-				// RIGHT DOUBLE QUOTATION MARK
+			case "rdquo":                           // RIGHT DOUBLE QUOTATION MARK
 				return rune(0x201d), true
-			case "rdquo": 
-				// RIGHT DOUBLE QUOTATION MARK
+			case "rdquor":                          // RIGHT DOUBLE QUOTATION MARK
 				return rune(0x201d), true
-			case "rdsh": 
-				// DOWNWARDS ARROW WITH TIP RIGHTWARDS
+			case "rdsh":                            // DOWNWARDS ARROW WITH TIP RIGHTWARDS
 				return rune(0x21b3), true
-			case "realpart": 
-				// BLACK-LETTER CAPITAL R
+			case "real":                            // BLACK-LETTER CAPITAL R
 				return rune(0x211c), true
-			case "reals": 
-				// DOUBLE-STRUCK CAPITAL R
-				return rune(0x211d), true
-			case "real": 
-				// BLACK-LETTER CAPITAL R
-				return rune(0x211c), true
-			case "realine": 
-				// SCRIPT CAPITAL R
+			case "realine":                         // SCRIPT CAPITAL R
 				return rune(0x211b), true
-			case "rect": 
-				// WHITE RECTANGLE
+			case "realpart":                        // BLACK-LETTER CAPITAL R
+				return rune(0x211c), true
+			case "reals":                           // DOUBLE-STRUCK CAPITAL R
+				return rune(0x211d), true
+			case "rect":                            // WHITE RECTANGLE
 				return rune(0x25ad), true
-			case "reg": 
-				// REGISTERED SIGN
+			case "reg":                             // REGISTERED SIGN
 				return rune(0xae), true
-			case "rfbowtie": 
-				// BOWTIE WITH RIGHT HALF BLACK
+			case "rfbowtie":                        // BOWTIE WITH RIGHT HALF BLACK
 				return rune(0x29d2), true
-			case "rfisht": 
-				// RIGHT FISH TAIL
+			case "rfisht":                          // RIGHT FISH TAIL
 				return rune(0x297d), true
-			case "rfloor": 
-				// RIGHT FLOOR
+			case "rfloor":                          // RIGHT FLOOR
 				return rune(0x230b), true
-			case "rfr": 
-				// MATHEMATICAL FRAKTUR SMALL R
+			case "rfr":                             // MATHEMATICAL FRAKTUR SMALL R
 				return rune(0x01d52f), true
-			case "rftimes": 
-				// TIMES WITH RIGHT HALF BLACK
+			case "rftimes":                         // TIMES WITH RIGHT HALF BLACK
 				return rune(0x29d5), true
-			case "rgr": 
-				// GREEK SMALL LETTER RHO
+			case "rgr":                             // GREEK SMALL LETTER RHO
 				return rune(0x03c1), true
-			case "rhard": 
-				// RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+			case "rhard":                           // RIGHTWARDS HARPOON WITH BARB DOWNWARDS
 				return rune(0x21c1), true
-			case "rharu": 
-				// RIGHTWARDS HARPOON WITH BARB UPWARDS
+			case "rharu":                           // RIGHTWARDS HARPOON WITH BARB UPWARDS
 				return rune(0x21c0), true
-			case "rharul": 
-				// RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+			case "rharul":                          // RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
 				return rune(0x296c), true
-			case "rhov": 
-				// GREEK RHO SYMBOL
-				return rune(0x03f1), true
-			case "rho": 
-				// GREEK SMALL LETTER RHO
+			case "rho":                             // GREEK SMALL LETTER RHO
 				return rune(0x03c1), true
-			case "rightarrowtail": 
-				// RIGHTWARDS ARROW WITH TAIL
-				return rune(0x21a3), true
-			case "rightarrow": 
-				// RIGHTWARDS ARROW
+			case "rhov":                            // GREEK RHO SYMBOL
+				return rune(0x03f1), true
+			case "rightarrow":                      // RIGHTWARDS ARROW
 				return rune(0x2192), true
-			case "rightharpoondown": 
-				// RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+			case "rightarrowtail":                  // RIGHTWARDS ARROW WITH TAIL
+				return rune(0x21a3), true
+			case "rightharpoondown":                // RIGHTWARDS HARPOON WITH BARB DOWNWARDS
 				return rune(0x21c1), true
-			case "rightharpoonup": 
-				// RIGHTWARDS HARPOON WITH BARB UPWARDS
+			case "rightharpoonup":                  // RIGHTWARDS HARPOON WITH BARB UPWARDS
 				return rune(0x21c0), true
-			case "rightleftarrows": 
-				// RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+			case "rightleftarrows":                 // RIGHTWARDS ARROW OVER LEFTWARDS ARROW
 				return rune(0x21c4), true
-			case "rightleftharpoons": 
-				// RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+			case "rightleftharpoons":               // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
 				return rune(0x21cc), true
-			case "rightrightarrows": 
-				// RIGHTWARDS PAIRED ARROWS
+			case "rightrightarrows":                // RIGHTWARDS PAIRED ARROWS
 				return rune(0x21c9), true
-			case "rightsquigarrow": 
-				// RIGHTWARDS WAVE ARROW
+			case "rightsquigarrow":                 // RIGHTWARDS WAVE ARROW
 				return rune(0x219d), true
-			case "rightthreetimes": 
-				// RIGHT SEMIDIRECT PRODUCT
+			case "rightthreetimes":                 // RIGHT SEMIDIRECT PRODUCT
 				return rune(0x22cc), true
-			case "rimply": 
-				// RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+			case "rimply":                          // RIGHT DOUBLE ARROW WITH ROUNDED HEAD
 				return rune(0x2970), true
-			case "ring": 
-				// RING ABOVE
+			case "ring":                            // RING ABOVE
 				return rune(0x02da), true
-			case "risingdotseq": 
-				// IMAGE OF OR APPROXIMATELY EQUAL TO
+			case "risingdotseq":                    // IMAGE OF OR APPROXIMATELY EQUAL TO
 				return rune(0x2253), true
-			case "rlarr2": 
-				// RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+			case "rlarr":                           // RIGHTWARDS ARROW OVER LEFTWARDS ARROW
 				return rune(0x21c4), true
-			case "rlarr": 
-				// RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+			case "rlarr2":                          // RIGHTWARDS ARROW OVER LEFTWARDS ARROW
 				return rune(0x21c4), true
-			case "rlhar": 
-				// RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+			case "rlhar":                           // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
 				return rune(0x21cc), true
-			case "rlhar2": 
-				// RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+			case "rlhar2":                          // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
 				return rune(0x21cc), true
-			case "rlm": 
-				// RIGHT-TO-LEFT MARK
+			case "rlm":                             // RIGHT-TO-LEFT MARK
 				return rune(0x200f), true
-			case "rmoust": 
-				// UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+			case "rmoust":                          // UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
 				return rune(0x23b1), true
-			case "rmoustache": 
-				// UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+			case "rmoustache":                      // UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
 				return rune(0x23b1), true
-			case "rnmid": 
-				// DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+			case "rnmid":                           // DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
 				return rune(0x2aee), true
-			case "roang": 
-				// MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+			case "roang":                           // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
 				return rune(0x27ed), true
-			case "roarr": 
-				// RIGHTWARDS OPEN-HEADED ARROW
+			case "roarr":                           // RIGHTWARDS OPEN-HEADED ARROW
 				return rune(0x21fe), true
-			case "robrk": 
-				// MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+			case "robrk":                           // MATHEMATICAL RIGHT WHITE SQUARE BRACKET
 				return rune(0x27e7), true
-			case "rocub": 
-				// RIGHT WHITE CURLY BRACKET
+			case "rocub":                           // RIGHT WHITE CURLY BRACKET
 				return rune(0x2984), true
-			case "ropar": 
-				// RIGHT WHITE PARENTHESIS
+			case "ropar":                           // RIGHT WHITE PARENTHESIS
 				return rune(0x2986), true
-			case "ropf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL R
+			case "ropf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL R
 				return rune(0x01d563), true
-			case "roplus": 
-				// PLUS SIGN IN RIGHT HALF CIRCLE
+			case "roplus":                          // PLUS SIGN IN RIGHT HALF CIRCLE
 				return rune(0x2a2e), true
-			case "rotimes": 
-				// MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+			case "rotimes":                         // MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
 				return rune(0x2a35), true
-			case "rpargt": 
-				// RIGHT ARC GREATER-THAN BRACKET
-				return rune(0x2994), true
-			case "rpar": 
-				// RIGHT PARENTHESIS
+			case "rpar":                            // RIGHT PARENTHESIS
 				return rune(0x29), true
-			case "rppolint": 
-				// LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+			case "rpargt":                          // RIGHT ARC GREATER-THAN BRACKET
+				return rune(0x2994), true
+			case "rppolint":                        // LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
 				return rune(0x2a12), true
-			case "rrarr": 
-				// RIGHTWARDS PAIRED ARROWS
+			case "rrarr":                           // RIGHTWARDS PAIRED ARROWS
 				return rune(0x21c9), true
-			case "rsaquo": 
-				// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+			case "rsaquo":                          // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
 				return rune(0x203a), true
-			case "rscr": 
-				// MATHEMATICAL SCRIPT SMALL R
+			case "rscr":                            // MATHEMATICAL SCRIPT SMALL R
 				return rune(0x01d4c7), true
-			case "rsh": 
-				// UPWARDS ARROW WITH TIP RIGHTWARDS
+			case "rsh":                             // UPWARDS ARROW WITH TIP RIGHTWARDS
 				return rune(0x21b1), true
-			case "rsolbar": 
-				// REVERSE SOLIDUS WITH HORIZONTAL STROKE
+			case "rsolbar":                         // REVERSE SOLIDUS WITH HORIZONTAL STROKE
 				return rune(0x29f7), true
-			case "rsqb": 
-				// RIGHT SQUARE BRACKET
+			case "rsqb":                            // RIGHT SQUARE BRACKET
 				return rune(0x5d), true
-			case "rsquor": 
-				// RIGHT SINGLE QUOTATION MARK
+			case "rsquo":                           // RIGHT SINGLE QUOTATION MARK
 				return rune(0x2019), true
-			case "rsquo": 
-				// RIGHT SINGLE QUOTATION MARK
+			case "rsquor":                          // RIGHT SINGLE QUOTATION MARK
 				return rune(0x2019), true
-			case "rthree": 
-				// RIGHT SEMIDIRECT PRODUCT
+			case "rthree":                          // RIGHT SEMIDIRECT PRODUCT
 				return rune(0x22cc), true
-			case "rtimes": 
-				// RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+			case "rtimes":                          // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
 				return rune(0x22ca), true
-			case "rtrie": 
-				// CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+			case "rtri":                            // WHITE RIGHT-POINTING SMALL TRIANGLE
+				return rune(0x25b9), true
+			case "rtrie":                           // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
 				return rune(0x22b5), true
-			case "rtrif": 
-				// BLACK RIGHT-POINTING SMALL TRIANGLE
+			case "rtrif":                           // BLACK RIGHT-POINTING SMALL TRIANGLE
 				return rune(0x25b8), true
-			case "rtri": 
-				// WHITE RIGHT-POINTING SMALL TRIANGLE
-				return rune(0x25b9), true
-			case "rtriltri": 
-				// RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+			case "rtriltri":                        // RIGHT TRIANGLE ABOVE LEFT TRIANGLE
 				return rune(0x29ce), true
-			case "ruharb": 
-				// RIGHTWARDS HARPOON WITH BARB UP TO BAR
+			case "ruharb":                          // RIGHTWARDS HARPOON WITH BARB UP TO BAR
 				return rune(0x2953), true
-			case "ruluhar": 
-				// RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+			case "ruluhar":                         // RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
 				return rune(0x2968), true
-			case "rx": 
-				// PRESCRIPTION TAKE
+			case "rx":                              // PRESCRIPTION TAKE
 				return rune(0x211e), true
 		}
 
 	case 's':
 		switch name {
-			case "sacute": 
-				// LATIN SMALL LETTER S WITH ACUTE
+			case "sacute":                          // LATIN SMALL LETTER S WITH ACUTE
 				return rune(0x015b), true
-			case "samalg": 
-				// N-ARY COPRODUCT
+			case "samalg":                          // N-ARY COPRODUCT
 				return rune(0x2210), true
-			case "sampi": 
-				// GREEK LETTER SAMPI
+			case "sampi":                           // GREEK LETTER SAMPI
 				return rune(0x03e0), true
-			case "sbquo": 
-				// SINGLE LOW-9 QUOTATION MARK
+			case "sbquo":                           // SINGLE LOW-9 QUOTATION MARK
 				return rune(0x201a), true
-			case "sbsol": 
-				// SMALL REVERSE SOLIDUS
+			case "sbsol":                           // SMALL REVERSE SOLIDUS
 				return rune(0xfe68), true
-			case "sc": 
-				// SUCCEEDS
+			case "sc":                              // SUCCEEDS
 				return rune(0x227b), true
-			case "scE": 
-				// SUCCEEDS ABOVE EQUALS SIGN
+			case "scE":                             // SUCCEEDS ABOVE EQUALS SIGN
 				return rune(0x2ab4), true
-			case "scap": 
-				// SUCCEEDS ABOVE ALMOST EQUAL TO
+			case "scap":                            // SUCCEEDS ABOVE ALMOST EQUAL TO
 				return rune(0x2ab8), true
-			case "scaron": 
-				// LATIN SMALL LETTER S WITH CARON
+			case "scaron":                          // LATIN SMALL LETTER S WITH CARON
 				return rune(0x0161), true
-			case "sccue": 
-				// SUCCEEDS OR EQUAL TO
+			case "sccue":                           // SUCCEEDS OR EQUAL TO
 				return rune(0x227d), true
-			case "scedil": 
-				// LATIN SMALL LETTER S WITH CEDILLA
-				return rune(0x015f), true
-			case "sce": 
-				// SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+			case "sce":                             // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
 				return rune(0x2ab0), true
-			case "scirc": 
-				// LATIN SMALL LETTER S WITH CIRCUMFLEX
+			case "scedil":                          // LATIN SMALL LETTER S WITH CEDILLA
+				return rune(0x015f), true
+			case "scirc":                           // LATIN SMALL LETTER S WITH CIRCUMFLEX
 				return rune(0x015d), true
-			case "scnE": 
-				// SUCCEEDS ABOVE NOT EQUAL TO
+			case "scnE":                            // SUCCEEDS ABOVE NOT EQUAL TO
 				return rune(0x2ab6), true
-			case "scnap": 
-				// SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+			case "scnap":                           // SUCCEEDS ABOVE NOT ALMOST EQUAL TO
 				return rune(0x2aba), true
-			case "scnsim": 
-				// SUCCEEDS BUT NOT EQUIVALENT TO
+			case "scnsim":                          // SUCCEEDS BUT NOT EQUIVALENT TO
 				return rune(0x22e9), true
-			case "scpolint": 
-				// LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+			case "scpolint":                        // LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
 				return rune(0x2a13), true
-			case "scsim": 
-				// SUCCEEDS OR EQUIVALENT TO
+			case "scsim":                           // SUCCEEDS OR EQUIVALENT TO
 				return rune(0x227f), true
-			case "scy": 
-				// CYRILLIC SMALL LETTER ES
+			case "scy":                             // CYRILLIC SMALL LETTER ES
 				return rune(0x0441), true
-			case "sdotb": 
-				// SQUARED DOT OPERATOR
-				return rune(0x22a1), true
-			case "sdot": 
-				// DOT OPERATOR
+			case "sdot":                            // DOT OPERATOR
 				return rune(0x22c5), true
-			case "sdote": 
-				// EQUALS SIGN WITH DOT BELOW
+			case "sdotb":                           // SQUARED DOT OPERATOR
+				return rune(0x22a1), true
+			case "sdote":                           // EQUALS SIGN WITH DOT BELOW
 				return rune(0x2a66), true
-			case "seArr": 
-				// SOUTH EAST DOUBLE ARROW
+			case "seArr":                           // SOUTH EAST DOUBLE ARROW
 				return rune(0x21d8), true
-			case "searhk": 
-				// SOUTH EAST ARROW WITH HOOK
+			case "searhk":                          // SOUTH EAST ARROW WITH HOOK
 				return rune(0x2925), true
-			case "searrow": 
-				// SOUTH EAST ARROW
+			case "searr":                           // SOUTH EAST ARROW
 				return rune(0x2198), true
-			case "searr": 
-				// SOUTH EAST ARROW
+			case "searrow":                         // SOUTH EAST ARROW
 				return rune(0x2198), true
-			case "sect": 
-				// SECTION SIGN
+			case "sect":                            // SECTION SIGN
 				return rune(0xa7), true
-			case "semi": 
-				// SEMICOLON
+			case "semi":                            // SEMICOLON
 				return rune(0x3b), true
-			case "seonearr": 
-				// SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+			case "seonearr":                        // SOUTH EAST ARROW CROSSING NORTH EAST ARROW
 				return rune(0x292d), true
-			case "seswar": 
-				// SOUTH EAST ARROW AND SOUTH WEST ARROW
+			case "seswar":                          // SOUTH EAST ARROW AND SOUTH WEST ARROW
 				return rune(0x2929), true
-			case "setminus": 
-				// SET MINUS
+			case "setminus":                        // SET MINUS
 				return rune(0x2216), true
-			case "setmn": 
-				// SET MINUS
+			case "setmn":                           // SET MINUS
 				return rune(0x2216), true
-			case "sext": 
-				// SIX POINTED BLACK STAR
+			case "sext":                            // SIX POINTED BLACK STAR
 				return rune(0x2736), true
-			case "sfgr": 
-				// GREEK SMALL LETTER FINAL SIGMA
+			case "sfgr":                            // GREEK SMALL LETTER FINAL SIGMA
 				return rune(0x03c2), true
-			case "sfrown": 
-				// FROWN
-				return rune(0x2322), true
-			case "sfr": 
-				// MATHEMATICAL FRAKTUR SMALL S
+			case "sfr":                             // MATHEMATICAL FRAKTUR SMALL S
 				return rune(0x01d530), true
-			case "sgr": 
-				// GREEK SMALL LETTER SIGMA
+			case "sfrown":                          // FROWN
+				return rune(0x2322), true
+			case "sgr":                             // GREEK SMALL LETTER SIGMA
 				return rune(0x03c3), true
-			case "sharp": 
-				// MUSIC SHARP SIGN
+			case "sharp":                           // MUSIC SHARP SIGN
 				return rune(0x266f), true
-			case "shchcy": 
-				// CYRILLIC SMALL LETTER SHCHA
+			case "shchcy":                          // CYRILLIC SMALL LETTER SHCHA
 				return rune(0x0449), true
-			case "shcy": 
-				// CYRILLIC SMALL LETTER SHA
+			case "shcy":                            // CYRILLIC SMALL LETTER SHA
 				return rune(0x0448), true
-			case "shortmid": 
-				// DIVIDES
+			case "shortmid":                        // DIVIDES
 				return rune(0x2223), true
-			case "shortparallel": 
-				// PARALLEL TO
+			case "shortparallel":                   // PARALLEL TO
 				return rune(0x2225), true
-			case "shuffle": 
-				// SHUFFLE PRODUCT
+			case "shuffle":                         // SHUFFLE PRODUCT
 				return rune(0x29e2), true
-			case "shy": 
-				// SOFT HYPHEN
+			case "shy":                             // SOFT HYPHEN
 				return rune(0xad), true
-			case "sigma": 
-				// GREEK SMALL LETTER SIGMA
+			case "sigma":                           // GREEK SMALL LETTER SIGMA
 				return rune(0x03c3), true
-			case "sigmaf": 
-				// GREEK SMALL LETTER FINAL SIGMA
+			case "sigmaf":                          // GREEK SMALL LETTER FINAL SIGMA
 				return rune(0x03c2), true
-			case "sigmav": 
-				// GREEK SMALL LETTER FINAL SIGMA
+			case "sigmav":                          // GREEK SMALL LETTER FINAL SIGMA
 				return rune(0x03c2), true
-			case "sim": 
-				// TILDE OPERATOR
+			case "sim":                             // TILDE OPERATOR
 				return rune(0x223c), true
-			case "simdot": 
-				// TILDE OPERATOR WITH DOT ABOVE
+			case "simdot":                          // TILDE OPERATOR WITH DOT ABOVE
 				return rune(0x2a6a), true
-			case "sime": 
-				// ASYMPTOTICALLY EQUAL TO
+			case "sime":                            // ASYMPTOTICALLY EQUAL TO
 				return rune(0x2243), true
-			case "simeq": 
-				// ASYMPTOTICALLY EQUAL TO
+			case "simeq":                           // ASYMPTOTICALLY EQUAL TO
 				return rune(0x2243), true
-			case "simg": 
-				// SIMILAR OR GREATER-THAN
+			case "simg":                            // SIMILAR OR GREATER-THAN
 				return rune(0x2a9e), true
-			case "simgE": 
-				// SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+			case "simgE":                           // SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
 				return rune(0x2aa0), true
-			case "siml": 
-				// SIMILAR OR LESS-THAN
+			case "siml":                            // SIMILAR OR LESS-THAN
 				return rune(0x2a9d), true
-			case "simlE": 
-				// SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+			case "simlE":                           // SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
 				return rune(0x2a9f), true
-			case "simne": 
-				// APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+			case "simne":                           // APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
 				return rune(0x2246), true
-			case "simplus": 
-				// PLUS SIGN WITH TILDE ABOVE
+			case "simplus":                         // PLUS SIGN WITH TILDE ABOVE
 				return rune(0x2a24), true
-			case "simrarr": 
-				// TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+			case "simrarr":                         // TILDE OPERATOR ABOVE RIGHTWARDS ARROW
 				return rune(0x2972), true
-			case "slarr": 
-				// LEFTWARDS ARROW
+			case "slarr":                           // LEFTWARDS ARROW
 				return rune(0x2190), true
-			case "slint": 
-				// INTEGRAL AVERAGE WITH SLASH
+			case "slint":                           // INTEGRAL AVERAGE WITH SLASH
 				return rune(0x2a0f), true
-			case "smallsetminus": 
-				// SET MINUS
+			case "smallsetminus":                   // SET MINUS
 				return rune(0x2216), true
-			case "smashp": 
-				// SMASH PRODUCT
+			case "smashp":                          // SMASH PRODUCT
 				return rune(0x2a33), true
-			case "smeparsl": 
-				// EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+			case "smeparsl":                        // EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
 				return rune(0x29e4), true
-			case "smid": 
-				// DIVIDES
+			case "smid":                            // DIVIDES
 				return rune(0x2223), true
-			case "smile": 
-				// SMILE
+			case "smile":                           // SMILE
 				return rune(0x2323), true
-			case "smt": 
-				// SMALLER THAN
+			case "smt":                             // SMALLER THAN
 				return rune(0x2aaa), true
-			case "smte": 
-				// SMALLER THAN OR EQUAL TO
+			case "smte":                            // SMALLER THAN OR EQUAL TO
 				return rune(0x2aac), true
-			case "smtes": 
-				// SMALLER THAN OR slanted EQUAL
+			case "smtes":                           // SMALLER THAN OR slanted EQUAL
 				return rune(0x2aac), true
-			case "softcy": 
-				// CYRILLIC SMALL LETTER SOFT SIGN
+			case "softcy":                          // CYRILLIC SMALL LETTER SOFT SIGN
 				return rune(0x044c), true
-			case "solbar": 
-				// APL FUNCTIONAL SYMBOL SLASH BAR
-				return rune(0x233f), true
-			case "solb": 
-				// SQUARED RISING DIAGONAL SLASH
-				return rune(0x29c4), true
-			case "sol": 
-				// SOLIDUS
+			case "sol":                             // SOLIDUS
 				return rune(0x2f), true
-			case "sopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL S
+			case "solb":                            // SQUARED RISING DIAGONAL SLASH
+				return rune(0x29c4), true
+			case "solbar":                          // APL FUNCTIONAL SYMBOL SLASH BAR
+				return rune(0x233f), true
+			case "sopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL S
 				return rune(0x01d564), true
-			case "spades": 
-				// BLACK SPADE SUIT
+			case "spades":                          // BLACK SPADE SUIT
 				return rune(0x2660), true
-			case "spadesuit": 
-				// BLACK SPADE SUIT
+			case "spadesuit":                       // BLACK SPADE SUIT
 				return rune(0x2660), true
-			case "spar": 
-				// PARALLEL TO
+			case "spar":                            // PARALLEL TO
 				return rune(0x2225), true
-			case "sqcap": 
-				// SQUARE CAP
+			case "sqcap":                           // SQUARE CAP
 				return rune(0x2293), true
-			case "sqcaps": 
-				// SQUARE CAP with serifs
+			case "sqcaps":                          // SQUARE CAP with serifs
 				return rune(0x2293), true
-			case "sqcup": 
-				// SQUARE CUP
+			case "sqcup":                           // SQUARE CUP
 				return rune(0x2294), true
-			case "sqcups": 
-				// SQUARE CUP with serifs
+			case "sqcups":                          // SQUARE CUP with serifs
 				return rune(0x2294), true
-			case "sqsub": 
-				// SQUARE IMAGE OF
+			case "sqsub":                           // SQUARE IMAGE OF
 				return rune(0x228f), true
-			case "sqsube": 
-				// SQUARE IMAGE OF OR EQUAL TO
+			case "sqsube":                          // SQUARE IMAGE OF OR EQUAL TO
 				return rune(0x2291), true
-			case "sqsubset": 
-				// SQUARE IMAGE OF
+			case "sqsubset":                        // SQUARE IMAGE OF
 				return rune(0x228f), true
-			case "sqsubseteq": 
-				// SQUARE IMAGE OF OR EQUAL TO
+			case "sqsubseteq":                      // SQUARE IMAGE OF OR EQUAL TO
 				return rune(0x2291), true
-			case "sqsup": 
-				// SQUARE ORIGINAL OF
+			case "sqsup":                           // SQUARE ORIGINAL OF
 				return rune(0x2290), true
-			case "sqsupe": 
-				// SQUARE ORIGINAL OF OR EQUAL TO
+			case "sqsupe":                          // SQUARE ORIGINAL OF OR EQUAL TO
 				return rune(0x2292), true
-			case "sqsupset": 
-				// SQUARE ORIGINAL OF
+			case "sqsupset":                        // SQUARE ORIGINAL OF
 				return rune(0x2290), true
-			case "sqsupseteq": 
-				// SQUARE ORIGINAL OF OR EQUAL TO
+			case "sqsupseteq":                      // SQUARE ORIGINAL OF OR EQUAL TO
 				return rune(0x2292), true
-			case "squ": 
-				// WHITE SQUARE
+			case "squ":                             // WHITE SQUARE
 				return rune(0x25a1), true
-			case "square": 
-				// WHITE SQUARE
+			case "square":                          // WHITE SQUARE
 				return rune(0x25a1), true
-			case "squarf": 
-				// BLACK SMALL SQUARE
+			case "squarf":                          // BLACK SMALL SQUARE
 				return rune(0x25aa), true
-			case "squb": 
-				// SQUARED SQUARE
+			case "squb":                            // SQUARED SQUARE
 				return rune(0x29c8), true
-			case "squerr": 
-				// ERROR-BARRED WHITE SQUARE
+			case "squerr":                          // ERROR-BARRED WHITE SQUARE
 				return rune(0x29ee), true
-			case "squf": 
-				// BLACK SMALL SQUARE
+			case "squf":                            // BLACK SMALL SQUARE
 				return rune(0x25aa), true
-			case "squferr": 
-				// ERROR-BARRED BLACK SQUARE
+			case "squferr":                         // ERROR-BARRED BLACK SQUARE
 				return rune(0x29ef), true
-			case "srarr": 
-				// RIGHTWARDS ARROW
+			case "srarr":                           // RIGHTWARDS ARROW
 				return rune(0x2192), true
-			case "sscr": 
-				// MATHEMATICAL SCRIPT SMALL S
+			case "sscr":                            // MATHEMATICAL SCRIPT SMALL S
 				return rune(0x01d4c8), true
-			case "ssetmn": 
-				// SET MINUS
+			case "ssetmn":                          // SET MINUS
 				return rune(0x2216), true
-			case "ssmile": 
-				// SMILE
+			case "ssmile":                          // SMILE
 				return rune(0x2323), true
-			case "sstarf": 
-				// STAR OPERATOR
+			case "sstarf":                          // STAR OPERATOR
 				return rune(0x22c6), true
-			case "starf": 
-				// BLACK STAR
-				return rune(0x2605), true
-			case "star": 
-				// WHITE STAR
+			case "star":                            // WHITE STAR
 				return rune(0x2606), true
-			case "stigma": 
-				// GREEK LETTER STIGMA
+			case "starf":                           // BLACK STAR
+				return rune(0x2605), true
+			case "stigma":                          // GREEK LETTER STIGMA
 				return rune(0x03da), true
-			case "straightepsilon": 
-				// GREEK LUNATE EPSILON SYMBOL
+			case "straightepsilon":                 // GREEK LUNATE EPSILON SYMBOL
 				return rune(0x03f5), true
-			case "straightphi": 
-				// GREEK PHI SYMBOL
+			case "straightphi":                     // GREEK PHI SYMBOL
 				return rune(0x03d5), true
-			case "strns": 
-				// MACRON
+			case "strns":                           // MACRON
 				return rune(0xaf), true
-			case "sub": 
-				// SUBSET OF
+			case "sub":                             // SUBSET OF
 				return rune(0x2282), true
-			case "subE": 
-				// SUBSET OF ABOVE EQUALS SIGN
+			case "subE":                            // SUBSET OF ABOVE EQUALS SIGN
 				return rune(0x2ac5), true
-			case "subdot": 
-				// SUBSET WITH DOT
+			case "subdot":                          // SUBSET WITH DOT
 				return rune(0x2abd), true
-			case "sube": 
-				// SUBSET OF OR EQUAL TO
+			case "sube":                            // SUBSET OF OR EQUAL TO
 				return rune(0x2286), true
-			case "subedot": 
-				// SUBSET OF OR EQUAL TO WITH DOT ABOVE
+			case "subedot":                         // SUBSET OF OR EQUAL TO WITH DOT ABOVE
 				return rune(0x2ac3), true
-			case "submult": 
-				// SUBSET WITH MULTIPLICATION SIGN BELOW
+			case "submult":                         // SUBSET WITH MULTIPLICATION SIGN BELOW
 				return rune(0x2ac1), true
-			case "subnE": 
-				// SUBSET OF ABOVE NOT EQUAL TO
+			case "subnE":                           // SUBSET OF ABOVE NOT EQUAL TO
 				return rune(0x2acb), true
-			case "subne": 
-				// SUBSET OF WITH NOT EQUAL TO
+			case "subne":                           // SUBSET OF WITH NOT EQUAL TO
 				return rune(0x228a), true
-			case "subplus": 
-				// SUBSET WITH PLUS SIGN BELOW
+			case "subplus":                         // SUBSET WITH PLUS SIGN BELOW
 				return rune(0x2abf), true
-			case "subrarr": 
-				// SUBSET ABOVE RIGHTWARDS ARROW
+			case "subrarr":                         // SUBSET ABOVE RIGHTWARDS ARROW
 				return rune(0x2979), true
-			case "subset": 
-				// SUBSET OF
+			case "subset":                          // SUBSET OF
 				return rune(0x2282), true
-			case "subseteq": 
-				// SUBSET OF OR EQUAL TO
+			case "subseteq":                        // SUBSET OF OR EQUAL TO
 				return rune(0x2286), true
-			case "subseteqq": 
-				// SUBSET OF ABOVE EQUALS SIGN
+			case "subseteqq":                       // SUBSET OF ABOVE EQUALS SIGN
 				return rune(0x2ac5), true
-			case "subsetneq": 
-				// SUBSET OF WITH NOT EQUAL TO
+			case "subsetneq":                       // SUBSET OF WITH NOT EQUAL TO
 				return rune(0x228a), true
-			case "subsetneqq": 
-				// SUBSET OF ABOVE NOT EQUAL TO
+			case "subsetneqq":                      // SUBSET OF ABOVE NOT EQUAL TO
 				return rune(0x2acb), true
-			case "subsim": 
-				// SUBSET OF ABOVE TILDE OPERATOR
+			case "subsim":                          // SUBSET OF ABOVE TILDE OPERATOR
 				return rune(0x2ac7), true
-			case "subsub": 
-				// SUBSET ABOVE SUBSET
+			case "subsub":                          // SUBSET ABOVE SUBSET
 				return rune(0x2ad5), true
-			case "subsup": 
-				// SUBSET ABOVE SUPERSET
+			case "subsup":                          // SUBSET ABOVE SUPERSET
 				return rune(0x2ad3), true
-			case "succ": 
-				// SUCCEEDS
+			case "succ":                            // SUCCEEDS
 				return rune(0x227b), true
-			case "succapprox": 
-				// SUCCEEDS ABOVE ALMOST EQUAL TO
+			case "succapprox":                      // SUCCEEDS ABOVE ALMOST EQUAL TO
 				return rune(0x2ab8), true
-			case "succcurlyeq": 
-				// SUCCEEDS OR EQUAL TO
+			case "succcurlyeq":                     // SUCCEEDS OR EQUAL TO
 				return rune(0x227d), true
-			case "succeq": 
-				// SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+			case "succeq":                          // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
 				return rune(0x2ab0), true
-			case "succnapprox": 
-				// SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+			case "succnapprox":                     // SUCCEEDS ABOVE NOT ALMOST EQUAL TO
 				return rune(0x2aba), true
-			case "succneqq": 
-				// SUCCEEDS ABOVE NOT EQUAL TO
+			case "succneqq":                        // SUCCEEDS ABOVE NOT EQUAL TO
 				return rune(0x2ab6), true
-			case "succnsim": 
-				// SUCCEEDS BUT NOT EQUIVALENT TO
+			case "succnsim":                        // SUCCEEDS BUT NOT EQUIVALENT TO
 				return rune(0x22e9), true
-			case "succsim": 
-				// SUCCEEDS OR EQUIVALENT TO
+			case "succsim":                         // SUCCEEDS OR EQUIVALENT TO
 				return rune(0x227f), true
-			case "sum": 
-				// N-ARY SUMMATION
+			case "sum":                             // N-ARY SUMMATION
 				return rune(0x2211), true
-			case "sumint": 
-				// SUMMATION WITH INTEGRAL
+			case "sumint":                          // SUMMATION WITH INTEGRAL
 				return rune(0x2a0b), true
-			case "sung": 
-				// EIGHTH NOTE
+			case "sung":                            // EIGHTH NOTE
 				return rune(0x266a), true
-			case "sup": 
-				// SUPERSET OF
+			case "sup":                             // SUPERSET OF
 				return rune(0x2283), true
-			case "sup1": 
-				// SUPERSCRIPT ONE
+			case "sup1":                            // SUPERSCRIPT ONE
 				return rune(0xb9), true
-			case "sup2": 
-				// SUPERSCRIPT TWO
+			case "sup2":                            // SUPERSCRIPT TWO
 				return rune(0xb2), true
-			case "sup3": 
-				// SUPERSCRIPT THREE
+			case "sup3":                            // SUPERSCRIPT THREE
 				return rune(0xb3), true
-			case "supE": 
-				// SUPERSET OF ABOVE EQUALS SIGN
+			case "supE":                            // SUPERSET OF ABOVE EQUALS SIGN
 				return rune(0x2ac6), true
-			case "supdot": 
-				// SUPERSET WITH DOT
+			case "supdot":                          // SUPERSET WITH DOT
 				return rune(0x2abe), true
-			case "supdsub": 
-				// SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+			case "supdsub":                         // SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
 				return rune(0x2ad8), true
-			case "supe": 
-				// SUPERSET OF OR EQUAL TO
+			case "supe":                            // SUPERSET OF OR EQUAL TO
 				return rune(0x2287), true
-			case "supedot": 
-				// SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+			case "supedot":                         // SUPERSET OF OR EQUAL TO WITH DOT ABOVE
 				return rune(0x2ac4), true
-			case "suphsol": 
-				// SUPERSET PRECEDING SOLIDUS
+			case "suphsol":                         // SUPERSET PRECEDING SOLIDUS
 				return rune(0x27c9), true
-			case "suphsub": 
-				// SUPERSET BESIDE SUBSET
+			case "suphsub":                         // SUPERSET BESIDE SUBSET
 				return rune(0x2ad7), true
-			case "suplarr": 
-				// SUPERSET ABOVE LEFTWARDS ARROW
+			case "suplarr":                         // SUPERSET ABOVE LEFTWARDS ARROW
 				return rune(0x297b), true
-			case "supmult": 
-				// SUPERSET WITH MULTIPLICATION SIGN BELOW
+			case "supmult":                         // SUPERSET WITH MULTIPLICATION SIGN BELOW
 				return rune(0x2ac2), true
-			case "supnE": 
-				// SUPERSET OF ABOVE NOT EQUAL TO
+			case "supnE":                           // SUPERSET OF ABOVE NOT EQUAL TO
 				return rune(0x2acc), true
-			case "supne": 
-				// SUPERSET OF WITH NOT EQUAL TO
+			case "supne":                           // SUPERSET OF WITH NOT EQUAL TO
 				return rune(0x228b), true
-			case "supplus": 
-				// SUPERSET WITH PLUS SIGN BELOW
+			case "supplus":                         // SUPERSET WITH PLUS SIGN BELOW
 				return rune(0x2ac0), true
-			case "supset": 
-				// SUPERSET OF
+			case "supset":                          // SUPERSET OF
 				return rune(0x2283), true
-			case "supseteq": 
-				// SUPERSET OF OR EQUAL TO
+			case "supseteq":                        // SUPERSET OF OR EQUAL TO
 				return rune(0x2287), true
-			case "supseteqq": 
-				// SUPERSET OF ABOVE EQUALS SIGN
+			case "supseteqq":                       // SUPERSET OF ABOVE EQUALS SIGN
 				return rune(0x2ac6), true
-			case "supsetneq": 
-				// SUPERSET OF WITH NOT EQUAL TO
+			case "supsetneq":                       // SUPERSET OF WITH NOT EQUAL TO
 				return rune(0x228b), true
-			case "supsetneqq": 
-				// SUPERSET OF ABOVE NOT EQUAL TO
+			case "supsetneqq":                      // SUPERSET OF ABOVE NOT EQUAL TO
 				return rune(0x2acc), true
-			case "supsim": 
-				// SUPERSET OF ABOVE TILDE OPERATOR
+			case "supsim":                          // SUPERSET OF ABOVE TILDE OPERATOR
 				return rune(0x2ac8), true
-			case "supsub": 
-				// SUPERSET ABOVE SUBSET
+			case "supsub":                          // SUPERSET ABOVE SUBSET
 				return rune(0x2ad4), true
-			case "supsup": 
-				// SUPERSET ABOVE SUPERSET
+			case "supsup":                          // SUPERSET ABOVE SUPERSET
 				return rune(0x2ad6), true
-			case "swArr": 
-				// SOUTH WEST DOUBLE ARROW
+			case "swArr":                           // SOUTH WEST DOUBLE ARROW
 				return rune(0x21d9), true
-			case "swarhk": 
-				// SOUTH WEST ARROW WITH HOOK
+			case "swarhk":                          // SOUTH WEST ARROW WITH HOOK
 				return rune(0x2926), true
-			case "swarrow": 
-				// SOUTH WEST ARROW
+			case "swarr":                           // SOUTH WEST ARROW
 				return rune(0x2199), true
-			case "swarr": 
-				// SOUTH WEST ARROW
+			case "swarrow":                         // SOUTH WEST ARROW
 				return rune(0x2199), true
-			case "swnwar": 
-				// SOUTH WEST ARROW AND NORTH WEST ARROW
+			case "swnwar":                          // SOUTH WEST ARROW AND NORTH WEST ARROW
 				return rune(0x292a), true
-			case "szlig": 
-				// LATIN SMALL LETTER SHARP S
+			case "szlig":                           // LATIN SMALL LETTER SHARP S
 				return rune(0xdf), true
 		}
 
 	case 't':
 		switch name {
-			case "target": 
-				// POSITION INDICATOR
+			case "target":                          // POSITION INDICATOR
 				return rune(0x2316), true
-			case "tau": 
-				// GREEK SMALL LETTER TAU
+			case "tau":                             // GREEK SMALL LETTER TAU
 				return rune(0x03c4), true
-			case "tbrk": 
-				// TOP SQUARE BRACKET
+			case "tbrk":                            // TOP SQUARE BRACKET
 				return rune(0x23b4), true
-			case "tcaron": 
-				// LATIN SMALL LETTER T WITH CARON
+			case "tcaron":                          // LATIN SMALL LETTER T WITH CARON
 				return rune(0x0165), true
-			case "tcedil": 
-				// LATIN SMALL LETTER T WITH CEDILLA
+			case "tcedil":                          // LATIN SMALL LETTER T WITH CEDILLA
 				return rune(0x0163), true
-			case "tcy": 
-				// CYRILLIC SMALL LETTER TE
+			case "tcy":                             // CYRILLIC SMALL LETTER TE
 				return rune(0x0442), true
-			case "tdot": 
-				// COMBINING THREE DOTS ABOVE
+			case "tdot":                            // COMBINING THREE DOTS ABOVE
 				return rune(0x20db), true
-			case "telrec": 
-				// TELEPHONE RECORDER
+			case "telrec":                          // TELEPHONE RECORDER
 				return rune(0x2315), true
-			case "tfr": 
-				// MATHEMATICAL FRAKTUR SMALL T
+			case "tfr":                             // MATHEMATICAL FRAKTUR SMALL T
 				return rune(0x01d531), true
-			case "tgr": 
-				// GREEK SMALL LETTER TAU
+			case "tgr":                             // GREEK SMALL LETTER TAU
 				return rune(0x03c4), true
-			case "there4": 
-				// THEREFORE
+			case "there4":                          // THEREFORE
 				return rune(0x2234), true
-			case "therefore": 
-				// THEREFORE
+			case "therefore":                       // THEREFORE
 				return rune(0x2234), true
-			case "thermod": 
-				// THERMODYNAMIC
+			case "thermod":                         // THERMODYNAMIC
 				return rune(0x29e7), true
-			case "thetasym": 
-				// GREEK THETA SYMBOL
-				return rune(0x03d1), true
-			case "thetas": 
-				// GREEK SMALL LETTER THETA
+			case "theta":                           // GREEK SMALL LETTER THETA
 				return rune(0x03b8), true
-			case "thetav": 
-				// GREEK THETA SYMBOL
-				return rune(0x03d1), true
-			case "theta": 
-				// GREEK SMALL LETTER THETA
+			case "thetas":                          // GREEK SMALL LETTER THETA
 				return rune(0x03b8), true
-			case "thgr": 
-				// GREEK SMALL LETTER THETA
+			case "thetasym":                        // GREEK THETA SYMBOL
+				return rune(0x03d1), true
+			case "thetav":                          // GREEK THETA SYMBOL
+				return rune(0x03d1), true
+			case "thgr":                            // GREEK SMALL LETTER THETA
 				return rune(0x03b8), true
-			case "thickapprox": 
-				// ALMOST EQUAL TO
+			case "thickapprox":                     // ALMOST EQUAL TO
 				return rune(0x2248), true
-			case "thicksim": 
-				// TILDE OPERATOR
+			case "thicksim":                        // TILDE OPERATOR
 				return rune(0x223c), true
-			case "thinsp": 
-				// THIN SPACE
+			case "thinsp":                          // THIN SPACE
 				return rune(0x2009), true
-			case "thkap": 
-				// ALMOST EQUAL TO
+			case "thkap":                           // ALMOST EQUAL TO
 				return rune(0x2248), true
-			case "thksim": 
-				// TILDE OPERATOR
+			case "thksim":                          // TILDE OPERATOR
 				return rune(0x223c), true
-			case "thorn": 
-				// LATIN SMALL LETTER THORN
+			case "thorn":                           // LATIN SMALL LETTER THORN
 				return rune(0xfe), true
-			case "tilde": 
-				// SMALL TILDE
+			case "tilde":                           // SMALL TILDE
 				return rune(0x02dc), true
-			case "timeint": 
-				// INTEGRAL WITH TIMES SIGN
+			case "timeint":                         // INTEGRAL WITH TIMES SIGN
 				return rune(0x2a18), true
-			case "timesb": 
-				// SQUARED TIMES
+			case "times":                           // MULTIPLICATION SIGN
+				return rune(0xd7), true
+			case "timesb":                          // SQUARED TIMES
 				return rune(0x22a0), true
-			case "timesbar": 
-				// MULTIPLICATION SIGN WITH UNDERBAR
+			case "timesbar":                        // MULTIPLICATION SIGN WITH UNDERBAR
 				return rune(0x2a31), true
-			case "timesd": 
-				// MULTIPLICATION SIGN WITH DOT ABOVE
+			case "timesd":                          // MULTIPLICATION SIGN WITH DOT ABOVE
 				return rune(0x2a30), true
-			case "times": 
-				// MULTIPLICATION SIGN
-				return rune(0xd7), true
-			case "tint": 
-				// TRIPLE INTEGRAL
+			case "tint":                            // TRIPLE INTEGRAL
 				return rune(0x222d), true
-			case "toea": 
-				// NORTH EAST ARROW AND SOUTH EAST ARROW
+			case "toea":                            // NORTH EAST ARROW AND SOUTH EAST ARROW
 				return rune(0x2928), true
-			case "top": 
-				// DOWN TACK
+			case "top":                             // DOWN TACK
 				return rune(0x22a4), true
-			case "topbot": 
-				// APL FUNCTIONAL SYMBOL I-BEAM
+			case "topbot":                          // APL FUNCTIONAL SYMBOL I-BEAM
 				return rune(0x2336), true
-			case "topcir": 
-				// DOWN TACK WITH CIRCLE BELOW
+			case "topcir":                          // DOWN TACK WITH CIRCLE BELOW
 				return rune(0x2af1), true
-			case "topfork": 
-				// PITCHFORK WITH TEE TOP
-				return rune(0x2ada), true
-			case "topf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL T
+			case "topf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL T
 				return rune(0x01d565), true
-			case "tosa": 
-				// SOUTH EAST ARROW AND SOUTH WEST ARROW
+			case "topfork":                         // PITCHFORK WITH TEE TOP
+				return rune(0x2ada), true
+			case "tosa":                            // SOUTH EAST ARROW AND SOUTH WEST ARROW
 				return rune(0x2929), true
-			case "tprime": 
-				// TRIPLE PRIME
+			case "tprime":                          // TRIPLE PRIME
 				return rune(0x2034), true
-			case "trade": 
-				// TRADE MARK SIGN
+			case "trade":                           // TRADE MARK SIGN
 				return rune(0x2122), true
-			case "triS": 
-				// S IN TRIANGLE
+			case "triS":                            // S IN TRIANGLE
 				return rune(0x29cc), true
-			case "trianglelefteq": 
-				// NORMAL SUBGROUP OF OR EQUAL TO
-				return rune(0x22b4), true
-			case "triangleq": 
-				// DELTA EQUAL TO
-				return rune(0x225c), true
-			case "trianglerighteq": 
-				// CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
-				return rune(0x22b5), true
-			case "triangle": 
-				// WHITE UP-POINTING SMALL TRIANGLE
+			case "triangle":                        // WHITE UP-POINTING SMALL TRIANGLE
 				return rune(0x25b5), true
-			case "triangledown": 
-				// WHITE DOWN-POINTING SMALL TRIANGLE
+			case "triangledown":                    // WHITE DOWN-POINTING SMALL TRIANGLE
 				return rune(0x25bf), true
-			case "triangleleft": 
-				// WHITE LEFT-POINTING SMALL TRIANGLE
+			case "triangleleft":                    // WHITE LEFT-POINTING SMALL TRIANGLE
 				return rune(0x25c3), true
-			case "triangleright": 
-				// WHITE RIGHT-POINTING SMALL TRIANGLE
+			case "trianglelefteq":                  // NORMAL SUBGROUP OF OR EQUAL TO
+				return rune(0x22b4), true
+			case "triangleq":                       // DELTA EQUAL TO
+				return rune(0x225c), true
+			case "triangleright":                   // WHITE RIGHT-POINTING SMALL TRIANGLE
 				return rune(0x25b9), true
-			case "tribar": 
-				// TRIANGLE WITH UNDERBAR
+			case "trianglerighteq":                 // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+				return rune(0x22b5), true
+			case "tribar":                          // TRIANGLE WITH UNDERBAR
 				return rune(0x29cb), true
-			case "tridot": 
-				// WHITE UP-POINTING TRIANGLE WITH DOT
+			case "tridot":                          // WHITE UP-POINTING TRIANGLE WITH DOT
 				return rune(0x25ec), true
-			case "tridoto": 
-				// TRIANGLE WITH DOT ABOVE
+			case "tridoto":                         // TRIANGLE WITH DOT ABOVE
 				return rune(0x29ca), true
-			case "trie": 
-				// DELTA EQUAL TO
+			case "trie":                            // DELTA EQUAL TO
 				return rune(0x225c), true
-			case "triminus": 
-				// MINUS SIGN IN TRIANGLE
+			case "triminus":                        // MINUS SIGN IN TRIANGLE
 				return rune(0x2a3a), true
-			case "triplus": 
-				// PLUS SIGN IN TRIANGLE
+			case "triplus":                         // PLUS SIGN IN TRIANGLE
 				return rune(0x2a39), true
-			case "trisb": 
-				// TRIANGLE WITH SERIFS AT BOTTOM
+			case "trisb":                           // TRIANGLE WITH SERIFS AT BOTTOM
 				return rune(0x29cd), true
-			case "tritime": 
-				// MULTIPLICATION SIGN IN TRIANGLE
+			case "tritime":                         // MULTIPLICATION SIGN IN TRIANGLE
 				return rune(0x2a3b), true
-			case "trpezium": 
-				// WHITE TRAPEZIUM
+			case "trpezium":                        // WHITE TRAPEZIUM
 				return rune(0x23e2), true
-			case "tscr": 
-				// MATHEMATICAL SCRIPT SMALL T
+			case "tscr":                            // MATHEMATICAL SCRIPT SMALL T
 				return rune(0x01d4c9), true
-			case "tscy": 
-				// CYRILLIC SMALL LETTER TSE
+			case "tscy":                            // CYRILLIC SMALL LETTER TSE
 				return rune(0x0446), true
-			case "tshcy": 
-				// CYRILLIC SMALL LETTER TSHE
+			case "tshcy":                           // CYRILLIC SMALL LETTER TSHE
 				return rune(0x045b), true
-			case "tstrok": 
-				// LATIN SMALL LETTER T WITH STROKE
+			case "tstrok":                          // LATIN SMALL LETTER T WITH STROKE
 				return rune(0x0167), true
-			case "tverbar": 
-				// TRIPLE VERTICAL BAR DELIMITER
+			case "tverbar":                         // TRIPLE VERTICAL BAR DELIMITER
 				return rune(0x2980), true
-			case "twixt": 
-				// BETWEEN
+			case "twixt":                           // BETWEEN
 				return rune(0x226c), true
-			case "twoheadleftarrow": 
-				// LEFTWARDS TWO HEADED ARROW
+			case "twoheadleftarrow":                // LEFTWARDS TWO HEADED ARROW
 				return rune(0x219e), true
-			case "twoheadrightarrow": 
-				// RIGHTWARDS TWO HEADED ARROW
+			case "twoheadrightarrow":               // RIGHTWARDS TWO HEADED ARROW
 				return rune(0x21a0), true
 		}
 
 	case 'u':
 		switch name {
-			case "uAarr": 
-				// UPWARDS TRIPLE ARROW
+			case "uAarr":                           // UPWARDS TRIPLE ARROW
 				return rune(0x290a), true
-			case "uArr": 
-				// UPWARDS DOUBLE ARROW
+			case "uArr":                            // UPWARDS DOUBLE ARROW
 				return rune(0x21d1), true
-			case "uHar": 
-				// UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+			case "uHar":                            // UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
 				return rune(0x2963), true
-			case "uacgr": 
-				// GREEK SMALL LETTER UPSILON WITH TONOS
+			case "uacgr":                           // GREEK SMALL LETTER UPSILON WITH TONOS
 				return rune(0x03cd), true
-			case "uacute": 
-				// LATIN SMALL LETTER U WITH ACUTE
+			case "uacute":                          // LATIN SMALL LETTER U WITH ACUTE
 				return rune(0xfa), true
-			case "uarr2": 
-				// UPWARDS PAIRED ARROWS
-				return rune(0x21c8), true
-			case "uarr": 
-				// UPWARDS ARROW
+			case "uarr":                            // UPWARDS ARROW
 				return rune(0x2191), true
-			case "uarrb": 
-				// UPWARDS ARROW TO BAR
+			case "uarr2":                           // UPWARDS PAIRED ARROWS
+				return rune(0x21c8), true
+			case "uarrb":                           // UPWARDS ARROW TO BAR
 				return rune(0x2912), true
-			case "uarrln": 
-				// UPWARDS ARROW WITH HORIZONTAL STROKE
+			case "uarrln":                          // UPWARDS ARROW WITH HORIZONTAL STROKE
 				return rune(0x2909), true
-			case "ubrcy": 
-				// CYRILLIC SMALL LETTER SHORT U
+			case "ubrcy":                           // CYRILLIC SMALL LETTER SHORT U
 				return rune(0x045e), true
-			case "ubreve": 
-				// LATIN SMALL LETTER U WITH BREVE
+			case "ubreve":                          // LATIN SMALL LETTER U WITH BREVE
 				return rune(0x016d), true
-			case "ucirc": 
-				// LATIN SMALL LETTER U WITH CIRCUMFLEX
+			case "ucirc":                           // LATIN SMALL LETTER U WITH CIRCUMFLEX
 				return rune(0xfb), true
-			case "ucy": 
-				// CYRILLIC SMALL LETTER U
+			case "ucy":                             // CYRILLIC SMALL LETTER U
 				return rune(0x0443), true
-			case "udarr": 
-				// UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+			case "udarr":                           // UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
 				return rune(0x21c5), true
-			case "udblac": 
-				// LATIN SMALL LETTER U WITH DOUBLE ACUTE
+			case "udblac":                          // LATIN SMALL LETTER U WITH DOUBLE ACUTE
 				return rune(0x0171), true
-			case "udhar": 
-				// UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+			case "udhar":                           // UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
 				return rune(0x296e), true
-			case "udiagr": 
-				// GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+			case "udiagr":                          // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
 				return rune(0x03b0), true
-			case "udigr": 
-				// GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+			case "udigr":                           // GREEK SMALL LETTER UPSILON WITH DIALYTIKA
 				return rune(0x03cb), true
-			case "udrbrk": 
-				// BOTTOM SQUARE BRACKET
+			case "udrbrk":                          // BOTTOM SQUARE BRACKET
 				return rune(0x23b5), true
-			case "udrcub": 
-				// BOTTOM CURLY BRACKET
+			case "udrcub":                          // BOTTOM CURLY BRACKET
 				return rune(0x23df), true
-			case "udrpar": 
-				// BOTTOM PARENTHESIS
+			case "udrpar":                          // BOTTOM PARENTHESIS
 				return rune(0x23dd), true
-			case "ufisht": 
-				// UP FISH TAIL
+			case "ufisht":                          // UP FISH TAIL
 				return rune(0x297e), true
-			case "ufr": 
-				// MATHEMATICAL FRAKTUR SMALL U
+			case "ufr":                             // MATHEMATICAL FRAKTUR SMALL U
 				return rune(0x01d532), true
-			case "ugr": 
-				// GREEK SMALL LETTER UPSILON
+			case "ugr":                             // GREEK SMALL LETTER UPSILON
 				return rune(0x03c5), true
-			case "ugrave": 
-				// LATIN SMALL LETTER U WITH GRAVE
+			case "ugrave":                          // LATIN SMALL LETTER U WITH GRAVE
 				return rune(0xf9), true
-			case "uharl": 
-				// UPWARDS HARPOON WITH BARB LEFTWARDS
+			case "uharl":                           // UPWARDS HARPOON WITH BARB LEFTWARDS
 				return rune(0x21bf), true
-			case "uharr": 
-				// UPWARDS HARPOON WITH BARB RIGHTWARDS
+			case "uharr":                           // UPWARDS HARPOON WITH BARB RIGHTWARDS
 				return rune(0x21be), true
-			case "uhblk": 
-				// UPPER HALF BLOCK
+			case "uhblk":                           // UPPER HALF BLOCK
 				return rune(0x2580), true
-			case "ulcorn": 
-				// TOP LEFT CORNER
+			case "ulcorn":                          // TOP LEFT CORNER
 				return rune(0x231c), true
-			case "ulcorner": 
-				// TOP LEFT CORNER
+			case "ulcorner":                        // TOP LEFT CORNER
 				return rune(0x231c), true
-			case "ulcrop": 
-				// TOP LEFT CROP
+			case "ulcrop":                          // TOP LEFT CROP
 				return rune(0x230f), true
-			case "uldlshar": 
-				// UP BARB LEFT DOWN BARB LEFT HARPOON
+			case "uldlshar":                        // UP BARB LEFT DOWN BARB LEFT HARPOON
 				return rune(0x2951), true
-			case "ulharb": 
-				// UPWARDS HARPOON WITH BARB LEFT TO BAR
+			case "ulharb":                          // UPWARDS HARPOON WITH BARB LEFT TO BAR
 				return rune(0x2958), true
-			case "ultri": 
-				// UPPER LEFT TRIANGLE
+			case "ultri":                           // UPPER LEFT TRIANGLE
 				return rune(0x25f8), true
-			case "umacr": 
-				// LATIN SMALL LETTER U WITH MACRON
+			case "umacr":                           // LATIN SMALL LETTER U WITH MACRON
 				return rune(0x016b), true
-			case "uml": 
-				// DIAERESIS
+			case "uml":                             // DIAERESIS
 				return rune(0xa8), true
-			case "uogon": 
-				// LATIN SMALL LETTER U WITH OGONEK
+			case "uogon":                           // LATIN SMALL LETTER U WITH OGONEK
 				return rune(0x0173), true
-			case "uopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL U
+			case "uopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL U
 				return rune(0x01d566), true
-			case "uparrow": 
-				// UPWARDS ARROW
+			case "uparrow":                         // UPWARDS ARROW
 				return rune(0x2191), true
-			case "updownarrow": 
-				// UP DOWN ARROW
+			case "updownarrow":                     // UP DOWN ARROW
 				return rune(0x2195), true
-			case "upharpoonleft": 
-				// UPWARDS HARPOON WITH BARB LEFTWARDS
+			case "upharpoonleft":                   // UPWARDS HARPOON WITH BARB LEFTWARDS
 				return rune(0x21bf), true
-			case "upharpoonright": 
-				// UPWARDS HARPOON WITH BARB RIGHTWARDS
+			case "upharpoonright":                  // UPWARDS HARPOON WITH BARB RIGHTWARDS
 				return rune(0x21be), true
-			case "upint": 
-				// INTEGRAL WITH OVERBAR
+			case "upint":                           // INTEGRAL WITH OVERBAR
 				return rune(0x2a1b), true
-			case "uplus": 
-				// MULTISET UNION
+			case "uplus":                           // MULTISET UNION
 				return rune(0x228e), true
-			case "upsih": 
-				// GREEK UPSILON WITH HOOK SYMBOL
-				return rune(0x03d2), true
-			case "upsilon": 
-				// GREEK SMALL LETTER UPSILON
+			case "upsi":                            // GREEK SMALL LETTER UPSILON
 				return rune(0x03c5), true
-			case "upsi": 
-				// GREEK SMALL LETTER UPSILON
+			case "upsih":                           // GREEK UPSILON WITH HOOK SYMBOL
+				return rune(0x03d2), true
+			case "upsilon":                         // GREEK SMALL LETTER UPSILON
 				return rune(0x03c5), true
-			case "upuparrows": 
-				// UPWARDS PAIRED ARROWS
+			case "upuparrows":                      // UPWARDS PAIRED ARROWS
 				return rune(0x21c8), true
-			case "urcorn": 
-				// TOP RIGHT CORNER
+			case "urcorn":                          // TOP RIGHT CORNER
 				return rune(0x231d), true
-			case "urcorner": 
-				// TOP RIGHT CORNER
+			case "urcorner":                        // TOP RIGHT CORNER
 				return rune(0x231d), true
-			case "urcrop": 
-				// TOP RIGHT CROP
+			case "urcrop":                          // TOP RIGHT CROP
 				return rune(0x230e), true
-			case "urdrshar": 
-				// UP BARB RIGHT DOWN BARB RIGHT HARPOON
+			case "urdrshar":                        // UP BARB RIGHT DOWN BARB RIGHT HARPOON
 				return rune(0x294f), true
-			case "urharb": 
-				// UPWARDS HARPOON WITH BARB RIGHT TO BAR
+			case "urharb":                          // UPWARDS HARPOON WITH BARB RIGHT TO BAR
 				return rune(0x2954), true
-			case "uring": 
-				// LATIN SMALL LETTER U WITH RING ABOVE
+			case "uring":                           // LATIN SMALL LETTER U WITH RING ABOVE
 				return rune(0x016f), true
-			case "urtrif": 
-				// BLACK UPPER RIGHT TRIANGLE
-				return rune(0x25e5), true
-			case "urtri": 
-				// UPPER RIGHT TRIANGLE
+			case "urtri":                           // UPPER RIGHT TRIANGLE
 				return rune(0x25f9), true
-			case "uscr": 
-				// MATHEMATICAL SCRIPT SMALL U
+			case "urtrif":                          // BLACK UPPER RIGHT TRIANGLE
+				return rune(0x25e5), true
+			case "uscr":                            // MATHEMATICAL SCRIPT SMALL U
 				return rune(0x01d4ca), true
-			case "utdot": 
-				// UP RIGHT DIAGONAL ELLIPSIS
+			case "utdot":                           // UP RIGHT DIAGONAL ELLIPSIS
 				return rune(0x22f0), true
-			case "utilde": 
-				// LATIN SMALL LETTER U WITH TILDE
+			case "utilde":                          // LATIN SMALL LETTER U WITH TILDE
 				return rune(0x0169), true
-			case "utrif": 
-				// BLACK UP-POINTING SMALL TRIANGLE
-				return rune(0x25b4), true
-			case "utri": 
-				// WHITE UP-POINTING SMALL TRIANGLE
+			case "utri":                            // WHITE UP-POINTING SMALL TRIANGLE
 				return rune(0x25b5), true
-			case "uuarr": 
-				// UPWARDS PAIRED ARROWS
+			case "utrif":                           // BLACK UP-POINTING SMALL TRIANGLE
+				return rune(0x25b4), true
+			case "uuarr":                           // UPWARDS PAIRED ARROWS
 				return rune(0x21c8), true
-			case "uuml": 
-				// LATIN SMALL LETTER U WITH DIAERESIS
+			case "uuml":                            // LATIN SMALL LETTER U WITH DIAERESIS
 				return rune(0xfc), true
-			case "uwangle": 
-				// OBLIQUE ANGLE OPENING DOWN
+			case "uwangle":                         // OBLIQUE ANGLE OPENING DOWN
 				return rune(0x29a7), true
 		}
 
 	case 'v':
 		switch name {
-			case "vArr": 
-				// UP DOWN DOUBLE ARROW
+			case "vArr":                            // UP DOWN DOUBLE ARROW
 				return rune(0x21d5), true
-			case "vBar": 
-				// SHORT UP TACK WITH UNDERBAR
+			case "vBar":                            // SHORT UP TACK WITH UNDERBAR
 				return rune(0x2ae8), true
-			case "vBarv": 
-				// SHORT UP TACK ABOVE SHORT DOWN TACK
+			case "vBarv":                           // SHORT UP TACK ABOVE SHORT DOWN TACK
 				return rune(0x2ae9), true
-			case "vDash": 
-				// TRUE
+			case "vDash":                           // TRUE
 				return rune(0x22a8), true
-			case "vDdash": 
-				// VERTICAL BAR TRIPLE RIGHT TURNSTILE
+			case "vDdash":                          // VERTICAL BAR TRIPLE RIGHT TURNSTILE
 				return rune(0x2ae2), true
-			case "vangrt": 
-				// RIGHT ANGLE VARIANT WITH SQUARE
+			case "vangrt":                          // RIGHT ANGLE VARIANT WITH SQUARE
 				return rune(0x299c), true
-			case "varepsilon": 
-				// GREEK LUNATE EPSILON SYMBOL
+			case "varepsilon":                      // GREEK LUNATE EPSILON SYMBOL
 				return rune(0x03f5), true
-			case "varkappa": 
-				// GREEK KAPPA SYMBOL
+			case "varkappa":                        // GREEK KAPPA SYMBOL
 				return rune(0x03f0), true
-			case "varnothing": 
-				// EMPTY SET
+			case "varnothing":                      // EMPTY SET
 				return rune(0x2205), true
-			case "varphi": 
-				// GREEK PHI SYMBOL
+			case "varphi":                          // GREEK PHI SYMBOL
 				return rune(0x03d5), true
-			case "varpi": 
-				// GREEK PI SYMBOL
+			case "varpi":                           // GREEK PI SYMBOL
 				return rune(0x03d6), true
-			case "varpropto": 
-				// PROPORTIONAL TO
+			case "varpropto":                       // PROPORTIONAL TO
 				return rune(0x221d), true
-			case "varr": 
-				// UP DOWN ARROW
+			case "varr":                            // UP DOWN ARROW
 				return rune(0x2195), true
-			case "varrho": 
-				// GREEK RHO SYMBOL
+			case "varrho":                          // GREEK RHO SYMBOL
 				return rune(0x03f1), true
-			case "varsigma": 
-				// GREEK SMALL LETTER FINAL SIGMA
+			case "varsigma":                        // GREEK SMALL LETTER FINAL SIGMA
 				return rune(0x03c2), true
-			case "varsubsetneq": 
-				// SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+			case "varsubsetneq":                    // SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
 				return rune(0x228a), true
-			case "varsubsetneqq": 
-				// SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+			case "varsubsetneqq":                   // SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
 				return rune(0x2acb), true
-			case "varsupsetneq": 
-				// SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+			case "varsupsetneq":                    // SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
 				return rune(0x228b), true
-			case "varsupsetneqq": 
-				// SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+			case "varsupsetneqq":                   // SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
 				return rune(0x2acc), true
-			case "vartheta": 
-				// GREEK THETA SYMBOL
+			case "vartheta":                        // GREEK THETA SYMBOL
 				return rune(0x03d1), true
-			case "vartriangleleft": 
-				// NORMAL SUBGROUP OF
+			case "vartriangleleft":                 // NORMAL SUBGROUP OF
 				return rune(0x22b2), true
-			case "vartriangleright": 
-				// CONTAINS AS NORMAL SUBGROUP
+			case "vartriangleright":                // CONTAINS AS NORMAL SUBGROUP
 				return rune(0x22b3), true
-			case "vbrtri": 
-				// VERTICAL BAR BESIDE RIGHT TRIANGLE
+			case "vbrtri":                          // VERTICAL BAR BESIDE RIGHT TRIANGLE
 				return rune(0x29d0), true
-			case "vcy": 
-				// CYRILLIC SMALL LETTER VE
+			case "vcy":                             // CYRILLIC SMALL LETTER VE
 				return rune(0x0432), true
-			case "vdash": 
-				// RIGHT TACK
+			case "vdash":                           // RIGHT TACK
 				return rune(0x22a2), true
-			case "vee": 
-				// LOGICAL OR
+			case "vee":                             // LOGICAL OR
 				return rune(0x2228), true
-			case "veeBar": 
-				// LOGICAL OR WITH DOUBLE UNDERBAR
+			case "veeBar":                          // LOGICAL OR WITH DOUBLE UNDERBAR
 				return rune(0x2a63), true
-			case "veebar": 
-				// XOR
+			case "veebar":                          // XOR
 				return rune(0x22bb), true
-			case "veeeq": 
-				// EQUIANGULAR TO
+			case "veeeq":                           // EQUIANGULAR TO
 				return rune(0x225a), true
-			case "vellip": 
-				// VERTICAL ELLIPSIS
+			case "vellip":                          // VERTICAL ELLIPSIS
 				return rune(0x22ee), true
-			case "vellip4": 
-				// DOTTED FENCE
+			case "vellip4":                         // DOTTED FENCE
 				return rune(0x2999), true
-			case "vellipv": 
-				// TRIPLE COLON OPERATOR
+			case "vellipv":                         // TRIPLE COLON OPERATOR
 				return rune(0x2af6), true
-			case "verbar": 
-				// VERTICAL LINE
+			case "verbar":                          // VERTICAL LINE
 				return rune(0x7c), true
-			case "vert3": 
-				// TRIPLE VERTICAL BAR BINARY RELATION
-				return rune(0x2af4), true
-			case "vert": 
-				// VERTICAL LINE
+			case "vert":                            // VERTICAL LINE
 				return rune(0x7c), true
-			case "vfr": 
-				// MATHEMATICAL FRAKTUR SMALL V
+			case "vert3":                           // TRIPLE VERTICAL BAR BINARY RELATION
+				return rune(0x2af4), true
+			case "vfr":                             // MATHEMATICAL FRAKTUR SMALL V
 				return rune(0x01d533), true
-			case "vldash": 
-				// LEFT SQUARE BRACKET LOWER CORNER
+			case "vldash":                          // LEFT SQUARE BRACKET LOWER CORNER
 				return rune(0x23a3), true
-			case "vltri": 
-				// NORMAL SUBGROUP OF
+			case "vltri":                           // NORMAL SUBGROUP OF
 				return rune(0x22b2), true
-			case "vnsub": 
-				// SUBSET OF with vertical line
+			case "vnsub":                           // SUBSET OF with vertical line
 				return rune(0x2282), true
-			case "vnsup": 
-				// SUPERSET OF with vertical line
+			case "vnsup":                           // SUPERSET OF with vertical line
 				return rune(0x2283), true
-			case "vopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL V
+			case "vopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL V
 				return rune(0x01d567), true
-			case "vprime": 
-				// PRIME
+			case "vprime":                          // PRIME
 				return rune(0x2032), true
-			case "vprop": 
-				// PROPORTIONAL TO
+			case "vprop":                           // PROPORTIONAL TO
 				return rune(0x221d), true
-			case "vrtri": 
-				// CONTAINS AS NORMAL SUBGROUP
+			case "vrtri":                           // CONTAINS AS NORMAL SUBGROUP
 				return rune(0x22b3), true
-			case "vscr": 
-				// MATHEMATICAL SCRIPT SMALL V
+			case "vscr":                            // MATHEMATICAL SCRIPT SMALL V
 				return rune(0x01d4cb), true
-			case "vsubnE": 
-				// SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+			case "vsubnE":                          // SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
 				return rune(0x2acb), true
-			case "vsubne": 
-				// SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+			case "vsubne":                          // SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
 				return rune(0x228a), true
-			case "vsupnE": 
-				// SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+			case "vsupnE":                          // SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
 				return rune(0x2acc), true
-			case "vsupne": 
-				// SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+			case "vsupne":                          // SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
 				return rune(0x228b), true
-			case "vzigzag": 
-				// VERTICAL ZIGZAG LINE
+			case "vzigzag":                         // VERTICAL ZIGZAG LINE
 				return rune(0x299a), true
 		}
 
 	case 'w':
 		switch name {
-			case "wcirc": 
-				// LATIN SMALL LETTER W WITH CIRCUMFLEX
+			case "wcirc":                           // LATIN SMALL LETTER W WITH CIRCUMFLEX
 				return rune(0x0175), true
-			case "wedbar": 
-				// LOGICAL AND WITH UNDERBAR
+			case "wedbar":                          // LOGICAL AND WITH UNDERBAR
 				return rune(0x2a5f), true
-			case "wedge": 
-				// LOGICAL AND
+			case "wedge":                           // LOGICAL AND
 				return rune(0x2227), true
-			case "wedgeq": 
-				// ESTIMATES
+			case "wedgeq":                          // ESTIMATES
 				return rune(0x2259), true
-			case "weierp": 
-				// SCRIPT CAPITAL P
+			case "weierp":                          // SCRIPT CAPITAL P
 				return rune(0x2118), true
-			case "wfr": 
-				// MATHEMATICAL FRAKTUR SMALL W
+			case "wfr":                             // MATHEMATICAL FRAKTUR SMALL W
 				return rune(0x01d534), true
-			case "wopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL W
+			case "wopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL W
 				return rune(0x01d568), true
-			case "wp": 
-				// SCRIPT CAPITAL P
+			case "wp":                              // SCRIPT CAPITAL P
 				return rune(0x2118), true
-			case "wreath": 
-				// WREATH PRODUCT
+			case "wr":                              // WREATH PRODUCT
 				return rune(0x2240), true
-			case "wr": 
-				// WREATH PRODUCT
+			case "wreath":                          // WREATH PRODUCT
 				return rune(0x2240), true
-			case "wscr": 
-				// MATHEMATICAL SCRIPT SMALL W
+			case "wscr":                            // MATHEMATICAL SCRIPT SMALL W
 				return rune(0x01d4cc), true
 		}
 
 	case 'x':
 		switch name {
-			case "xandand": 
-				// TWO LOGICAL AND OPERATOR
+			case "xandand":                         // TWO LOGICAL AND OPERATOR
 				return rune(0x2a07), true
-			case "xbsol": 
-				// BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+			case "xbsol":                           // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
 				return rune(0x2571), true
-			case "xcap": 
-				// N-ARY INTERSECTION
+			case "xcap":                            // N-ARY INTERSECTION
 				return rune(0x22c2), true
-			case "xcirc": 
-				// LARGE CIRCLE
+			case "xcirc":                           // LARGE CIRCLE
 				return rune(0x25ef), true
-			case "xcup": 
-				// N-ARY UNION
+			case "xcup":                            // N-ARY UNION
 				return rune(0x22c3), true
-			case "xcupdot": 
-				// N-ARY UNION OPERATOR WITH DOT
+			case "xcupdot":                         // N-ARY UNION OPERATOR WITH DOT
 				return rune(0x2a03), true
-			case "xdtri": 
-				// WHITE DOWN-POINTING TRIANGLE
+			case "xdtri":                           // WHITE DOWN-POINTING TRIANGLE
 				return rune(0x25bd), true
-			case "xfr": 
-				// MATHEMATICAL FRAKTUR SMALL X
+			case "xfr":                             // MATHEMATICAL FRAKTUR SMALL X
 				return rune(0x01d535), true
-			case "xgr": 
-				// GREEK SMALL LETTER XI
+			case "xgr":                             // GREEK SMALL LETTER XI
 				return rune(0x03be), true
-			case "xhArr": 
-				// LONG LEFT RIGHT DOUBLE ARROW
+			case "xhArr":                           // LONG LEFT RIGHT DOUBLE ARROW
 				return rune(0x27fa), true
-			case "xharr": 
-				// LONG LEFT RIGHT ARROW
+			case "xharr":                           // LONG LEFT RIGHT ARROW
 				return rune(0x27f7), true
-			case "xi": 
-				// GREEK SMALL LETTER XI
+			case "xi":                              // GREEK SMALL LETTER XI
 				return rune(0x03be), true
-			case "xlArr": 
-				// LONG LEFTWARDS DOUBLE ARROW
+			case "xlArr":                           // LONG LEFTWARDS DOUBLE ARROW
 				return rune(0x27f8), true
-			case "xlarr": 
-				// LONG LEFTWARDS ARROW
+			case "xlarr":                           // LONG LEFTWARDS ARROW
 				return rune(0x27f5), true
-			case "xmap": 
-				// LONG RIGHTWARDS ARROW FROM BAR
+			case "xmap":                            // LONG RIGHTWARDS ARROW FROM BAR
 				return rune(0x27fc), true
-			case "xnis": 
-				// CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+			case "xnis":                            // CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
 				return rune(0x22fb), true
-			case "xodot": 
-				// N-ARY CIRCLED DOT OPERATOR
+			case "xodot":                           // N-ARY CIRCLED DOT OPERATOR
 				return rune(0x2a00), true
-			case "xopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL X
+			case "xopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL X
 				return rune(0x01d569), true
-			case "xoplus": 
-				// N-ARY CIRCLED PLUS OPERATOR
+			case "xoplus":                          // N-ARY CIRCLED PLUS OPERATOR
 				return rune(0x2a01), true
-			case "xoror": 
-				// TWO LOGICAL OR OPERATOR
+			case "xoror":                           // TWO LOGICAL OR OPERATOR
 				return rune(0x2a08), true
-			case "xotime": 
-				// N-ARY CIRCLED TIMES OPERATOR
+			case "xotime":                          // N-ARY CIRCLED TIMES OPERATOR
 				return rune(0x2a02), true
-			case "xrArr": 
-				// LONG RIGHTWARDS DOUBLE ARROW
+			case "xrArr":                           // LONG RIGHTWARDS DOUBLE ARROW
 				return rune(0x27f9), true
-			case "xrarr": 
-				// LONG RIGHTWARDS ARROW
+			case "xrarr":                           // LONG RIGHTWARDS ARROW
 				return rune(0x27f6), true
-			case "xscr": 
-				// MATHEMATICAL SCRIPT SMALL X
+			case "xscr":                            // MATHEMATICAL SCRIPT SMALL X
 				return rune(0x01d4cd), true
-			case "xsol": 
-				// BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+			case "xsol":                            // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
 				return rune(0x2572), true
-			case "xsqcap": 
-				// N-ARY SQUARE INTERSECTION OPERATOR
+			case "xsqcap":                          // N-ARY SQUARE INTERSECTION OPERATOR
 				return rune(0x2a05), true
-			case "xsqcup": 
-				// N-ARY SQUARE UNION OPERATOR
+			case "xsqcup":                          // N-ARY SQUARE UNION OPERATOR
 				return rune(0x2a06), true
-			case "xsqu": 
-				// WHITE MEDIUM SQUARE
+			case "xsqu":                            // WHITE MEDIUM SQUARE
 				return rune(0x25fb), true
-			case "xsquf": 
-				// BLACK MEDIUM SQUARE
+			case "xsquf":                           // BLACK MEDIUM SQUARE
 				return rune(0x25fc), true
-			case "xtimes": 
-				// N-ARY TIMES OPERATOR
+			case "xtimes":                          // N-ARY TIMES OPERATOR
 				return rune(0x2a09), true
-			case "xuplus": 
-				// N-ARY UNION OPERATOR WITH PLUS
+			case "xuplus":                          // N-ARY UNION OPERATOR WITH PLUS
 				return rune(0x2a04), true
-			case "xutri": 
-				// WHITE UP-POINTING TRIANGLE
+			case "xutri":                           // WHITE UP-POINTING TRIANGLE
 				return rune(0x25b3), true
-			case "xvee": 
-				// N-ARY LOGICAL OR
+			case "xvee":                            // N-ARY LOGICAL OR
 				return rune(0x22c1), true
-			case "xwedge": 
-				// N-ARY LOGICAL AND
+			case "xwedge":                          // N-ARY LOGICAL AND
 				return rune(0x22c0), true
 		}
 
 	case 'y':
 		switch name {
-			case "yacute": 
-				// LATIN SMALL LETTER Y WITH ACUTE
+			case "yacute":                          // LATIN SMALL LETTER Y WITH ACUTE
 				return rune(0xfd), true
-			case "yacy": 
-				// CYRILLIC SMALL LETTER YA
+			case "yacy":                            // CYRILLIC SMALL LETTER YA
 				return rune(0x044f), true
-			case "ycirc": 
-				// LATIN SMALL LETTER Y WITH CIRCUMFLEX
+			case "ycirc":                           // LATIN SMALL LETTER Y WITH CIRCUMFLEX
 				return rune(0x0177), true
-			case "ycy": 
-				// CYRILLIC SMALL LETTER YERU
+			case "ycy":                             // CYRILLIC SMALL LETTER YERU
 				return rune(0x044b), true
-			case "yen": 
-				// YEN SIGN
+			case "yen":                             // YEN SIGN
 				return rune(0xa5), true
-			case "yfr": 
-				// MATHEMATICAL FRAKTUR SMALL Y
+			case "yfr":                             // MATHEMATICAL FRAKTUR SMALL Y
 				return rune(0x01d536), true
-			case "yicy": 
-				// CYRILLIC SMALL LETTER YI
+			case "yicy":                            // CYRILLIC SMALL LETTER YI
 				return rune(0x0457), true
-			case "yopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL Y
+			case "yopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL Y
 				return rune(0x01d56a), true
-			case "yscr": 
-				// MATHEMATICAL SCRIPT SMALL Y
+			case "yscr":                            // MATHEMATICAL SCRIPT SMALL Y
 				return rune(0x01d4ce), true
-			case "yucy": 
-				// CYRILLIC SMALL LETTER YU
+			case "yucy":                            // CYRILLIC SMALL LETTER YU
 				return rune(0x044e), true
-			case "yuml": 
-				// LATIN SMALL LETTER Y WITH DIAERESIS
+			case "yuml":                            // LATIN SMALL LETTER Y WITH DIAERESIS
 				return rune(0xff), true
 		}
 
 	case 'z':
 		switch name {
-			case "zacute": 
-				// LATIN SMALL LETTER Z WITH ACUTE
+			case "zacute":                          // LATIN SMALL LETTER Z WITH ACUTE
 				return rune(0x017a), true
-			case "zcaron": 
-				// LATIN SMALL LETTER Z WITH CARON
+			case "zcaron":                          // LATIN SMALL LETTER Z WITH CARON
 				return rune(0x017e), true
-			case "zcy": 
-				// CYRILLIC SMALL LETTER ZE
+			case "zcy":                             // CYRILLIC SMALL LETTER ZE
 				return rune(0x0437), true
-			case "zdot": 
-				// LATIN SMALL LETTER Z WITH DOT ABOVE
+			case "zdot":                            // LATIN SMALL LETTER Z WITH DOT ABOVE
 				return rune(0x017c), true
-			case "zeetrf": 
-				// BLACK-LETTER CAPITAL Z
+			case "zeetrf":                          // BLACK-LETTER CAPITAL Z
 				return rune(0x2128), true
-			case "zeta": 
-				// GREEK SMALL LETTER ZETA
+			case "zeta":                            // GREEK SMALL LETTER ZETA
 				return rune(0x03b6), true
-			case "zfr": 
-				// MATHEMATICAL FRAKTUR SMALL Z
+			case "zfr":                             // MATHEMATICAL FRAKTUR SMALL Z
 				return rune(0x01d537), true
-			case "zgr": 
-				// GREEK SMALL LETTER ZETA
+			case "zgr":                             // GREEK SMALL LETTER ZETA
 				return rune(0x03b6), true
-			case "zhcy": 
-				// CYRILLIC SMALL LETTER ZHE
+			case "zhcy":                            // CYRILLIC SMALL LETTER ZHE
 				return rune(0x0436), true
-			case "zigrarr": 
-				// RIGHTWARDS SQUIGGLE ARROW
+			case "zigrarr":                         // RIGHTWARDS SQUIGGLE ARROW
 				return rune(0x21dd), true
-			case "zopf": 
-				// MATHEMATICAL DOUBLE-STRUCK SMALL Z
+			case "zopf":                            // MATHEMATICAL DOUBLE-STRUCK SMALL Z
 				return rune(0x01d56b), true
-			case "zscr": 
-				// MATHEMATICAL SCRIPT SMALL Z
+			case "zscr":                            // MATHEMATICAL SCRIPT SMALL Z
 				return rune(0x01d4cf), true
-			case "zwj": 
-				// ZERO WIDTH JOINER
+			case "zwj":                             // ZERO WIDTH JOINER
 				return rune(0x200d), true
-			case "zwnj": 
-				// ZERO WIDTH NON-JOINER
+			case "zwnj":                            // ZERO WIDTH NON-JOINER
 				return rune(0x200c), true
 		}
 	}

+ 30 - 13
core/encoding/json/unmarshal.odin

@@ -137,9 +137,9 @@ assign_float :: proc(val: any, f: $T) -> bool {
 	case complex64:  dst = complex(f32(f), 0)
 	case complex128: dst = complex(f64(f), 0)
 	
-	case quaternion64:  dst = quaternion(f16(f), 0, 0, 0)
-	case quaternion128: dst = quaternion(f32(f), 0, 0, 0)
-	case quaternion256: dst = quaternion(f64(f), 0, 0, 0)
+	case quaternion64:  dst = quaternion(w=f16(f), x=0, y=0, z=0)
+	case quaternion128: dst = quaternion(w=f32(f), x=0, y=0, z=0)
+	case quaternion256: dst = quaternion(w=f64(f), x=0, y=0, z=0)
 	
 	case: return false
 	}
@@ -201,20 +201,37 @@ unmarshal_string_token :: proc(p: ^Parser, val: any, str: string, ti: ^reflect.T
 unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) {
 	UNSUPPORTED_TYPE := Unsupported_Type_Error{v.id, p.curr_token}
 	token := p.curr_token
-	
+
 	v := v
 	ti := reflect.type_info_base(type_info_of(v.id))
-	// NOTE: If it's a union with only one variant, then treat it as that variant
-	if u, ok := ti.variant.(reflect.Type_Info_Union); ok && len(u.variants) == 1 && token.kind != .Null {
-		variant := u.variants[0]
-		v.id = variant.id
-		ti = reflect.type_info_base(variant)
-		if !reflect.is_pointer_internally(variant) {
-			tag := any{rawptr(uintptr(v.data) + u.tag_offset), u.tag_type.id}
-			assign_int(tag, 1)
+	if u, ok := ti.variant.(reflect.Type_Info_Union); ok && token.kind != .Null {
+		// NOTE: If it's a union with only one variant, then treat it as that variant
+		if len(u.variants) == 1 {
+			variant := u.variants[0]
+			v.id = variant.id
+			ti = reflect.type_info_base(variant)
+			if !reflect.is_pointer_internally(variant) {
+				tag := any{rawptr(uintptr(v.data) + u.tag_offset), u.tag_type.id}
+				assign_int(tag, 1)
+			}
+		} else if v.id != Value {
+			for variant, i in u.variants {
+				variant_any := any{v.data, variant.id}
+				variant_p := p^
+				if err = unmarshal_value(&variant_p, variant_any); err == nil {
+					p^ = variant_p
+
+					raw_tag := i
+					if !u.no_nil { raw_tag += 1 }
+					tag := any{rawptr(uintptr(v.data) + u.tag_offset), u.tag_type.id}
+					assign_int(tag, raw_tag)
+					return
+				}
+			}
+			return UNSUPPORTED_TYPE
 		}
 	}
-	
+
 	switch &dst in v {
 	// Handle json.Value as an unknown type
 	case Value:

+ 4 - 2
core/encoding/xml/debug_print.odin

@@ -1,3 +1,5 @@
+package xml
+
 /*
 	An XML 1.0 / 1.1 parser
 
@@ -9,7 +11,7 @@
 	List of contributors:
 		Jeroen van Rijn: Initial implementation.
 */
-package xml
+
 
 import "core:io"
 import "core:fmt"
@@ -81,4 +83,4 @@ print_element :: proc(writer: io.Writer, doc: ^Document, element_id: Element_ID,
 	}
 
 	return written, .None
-}
+}

+ 2 - 2
core/encoding/xml/example/xml_example.odin

@@ -20,7 +20,7 @@ example :: proc() {
 		xml.destroy(docs[round])
 	}
 
-	DOC :: #load("../../../../tests/core/assets/XML/unicode.xml")
+	DOC :: #load("../../../../tests/core/assets/XML/utf8.xml")
 	input := DOC
 
 	for round in 0..<N {
@@ -109,4 +109,4 @@ main :: proc() {
 		}
 	}
 	println("Done and cleaned up!")
-}
+}

+ 4 - 2
core/encoding/xml/helpers.odin

@@ -1,3 +1,5 @@
+package xml
+
 /*
 	An XML 1.0 / 1.1 parser
 
@@ -6,7 +8,7 @@
 
 	This file contains helper functions.
 */
-package xml
+
 
 // Find parent's nth child with a given ident.
 find_child_by_ident :: proc(doc: ^Document, parent_id: Element_ID, ident: string, nth := 0) -> (res: Element_ID, found: bool) {
@@ -47,4 +49,4 @@ find_attribute_val_by_key :: proc(doc: ^Document, parent_id: Element_ID, key: st
 		if attr.key == key { return attr.val, true }
 	}
 	return "", false
-}
+}

+ 4 - 2
core/encoding/xml/tokenizer.odin

@@ -1,3 +1,5 @@
+package xml
+
 /*
 	An XML 1.0 / 1.1 parser
 
@@ -9,7 +11,7 @@
 	List of contributors:
 		Jeroen van Rijn: Initial implementation.
 */
-package xml
+
 
 import "core:fmt"
 import "core:unicode"
@@ -433,4 +435,4 @@ scan :: proc(t: ^Tokenizer) -> Token {
 		lit = string(t.src[offset : t.offset])
 	}
 	return Token{kind, lit, pos}
-}
+}

+ 71 - 148
core/encoding/xml/xml_reader.odin

@@ -1,28 +1,28 @@
 /*
-	An XML 1.0 / 1.1 parser
+ XML 1.0 / 1.1 parser
 
-	Copyright 2021-2022 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-3 license.
+ 2021-2022 Jeroen van Rijn <[email protected]>.
+ available under Odin's BSD-3 license.
 
-	A from-scratch XML implementation, loosely modelled on the [spec](https://www.w3.org/TR/2006/REC-xml11-20060816).
+ from-scratch XML implementation, loosely modelled on the [spec](https://www.w3.org/TR/2006/REC-xml11-20060816).
 
-	Features:
-		- Supports enough of the XML 1.0/1.1 spec to handle the 99.9% of XML documents in common current usage.
-		- Simple to understand and use. Small.
+Features:
+- Supports enough of the XML 1.0/1.1 spec to handle the 99.9% of XML documents in common current usage.
+- Simple to understand and use. Small.
 
-	Caveats:
-		- We do NOT support HTML in this package, as that may or may not be valid XML.
-		  If it works, great. If it doesn't, that's not considered a bug.
+Caveats:
+- We do NOT support HTML in this package, as that may or may not be valid XML.
+  If it works, great. If it doesn't, that's not considered a bug.
 
-		- We do NOT support UTF-16. If you have a UTF-16 XML file, please convert it to UTF-8 first. Also, our condolences.
-		- <[!ELEMENT and <[!ATTLIST are not supported, and will be either ignored or return an error depending on the parser options.
+- We do NOT support UTF-16. If you have a UTF-16 XML file, please convert it to UTF-8 first. Also, our condolences.
+- <[!ELEMENT and <[!ATTLIST are not supported, and will be either ignored or return an error depending on the parser options.
 
-	MAYBE:
-	- XML writer?
-	- Serialize/deserialize Odin types?
+MAYBE:
+- XML writer?
+- Serialize/deserialize Odin types?
 
-	List of contributors:
-		Jeroen van Rijn: Initial implementation.
+List of contributors:
+- Jeroen van Rijn: Initial implementation.
 */
 package xml
 // An XML 1.0 / 1.1 parser
@@ -43,48 +43,32 @@ DEFAULT_OPTIONS :: Options{
 }
 
 Option_Flag :: enum {
-	/*
-		If the caller says that input may be modified, we can perform in-situ parsing.
-		If this flag isn't provided, the XML parser first duplicates the input so that it can.
-	*/
+	// If the caller says that input may be modified, we can perform in-situ parsing.
+	// If this flag isn't provided, the XML parser first duplicates the input so that it can.
 	Input_May_Be_Modified,
 
-	/*
-		Document MUST start with `<?xml` prologue.
-	*/
+	// Document MUST start with `<?xml` prologue.
 	Must_Have_Prolog,
 
-	/*
-		Document MUST have a `<!DOCTYPE`.
-	*/
+	// Document MUST have a `<!DOCTYPE`.
 	Must_Have_DocType,
 
-	/*
-		By default we skip comments. Use this option to intern a comment on a parented Element.
-	*/
+	// By default we skip comments. Use this option to intern a comment on a parented Element.
 	Intern_Comments,
 
-	/*
-		How to handle unsupported parts of the specification, like <! other than <!DOCTYPE and <![CDATA[
-	*/
+	// How to handle unsupported parts of the specification, like <! other than <!DOCTYPE and <![CDATA[
 	Error_on_Unsupported,
 	Ignore_Unsupported,
 
-	/*
-		By default CDATA tags are passed-through as-is.
-		This option unwraps them when encountered.
-	*/
+	// By default CDATA tags are passed-through as-is.
+	// This option unwraps them when encountered.
 	Unbox_CDATA,
 
-	/*
-		By default SGML entities like `&gt;`, `&#32;` and `&#x20;` are passed-through as-is.
-		This option decodes them when encountered.
-	*/
+	// By default SGML entities like `&gt;`, `&#32;` and `&#x20;` are passed-through as-is.
+	// This option decodes them when encountered.
 	Decode_SGML_Entities,
 
-	/*
-		If a tag body has a comment, it will be stripped unless this option is given.
-	*/
+	// If a tag body has a comment, it will be stripped unless this option is given.
 	Keep_Tag_Body_Comments,
 }
 Option_Flags :: bit_set[Option_Flag; u16]
@@ -97,28 +81,20 @@ Document :: struct {
 	encoding: Encoding,
 
 	doctype: struct {
-		/*
-			We only scan the <!DOCTYPE IDENT part and skip the rest.
-		*/
+		// We only scan the <!DOCTYPE IDENT part and skip the rest.
 		ident:   string,
 		rest:    string,
 	},
 
-	/*
-		If we encounter comments before the root node, and the option to intern comments is given, this is where they'll live.
-		Otherwise they'll be in the element tree.
-	*/
+	// If we encounter comments before the root node, and the option to intern comments is given, this is where they'll live.
+	// Otherwise they'll be in the element tree.
 	comments: [dynamic]string,
 
-	/*
-		Internal
-	*/
+	// Internal
 	tokenizer: ^Tokenizer,
 	allocator: mem.Allocator,
 
-	/*
-		Input. Either the original buffer, or a copy if `.Input_May_Be_Modified` isn't specified.
-	*/
+	// Input. Either the original buffer, or a copy if `.Input_May_Be_Modified` isn't specified.
 	input:           []u8,
 	strings_to_free: [dynamic]string,
 }
@@ -158,34 +134,24 @@ Encoding :: enum {
 	UTF_8,
 	ISO_8859_1,
 
-	/*
-		Aliases
-	*/
+	// Aliases
 	LATIN_1 = ISO_8859_1,
 }
 
 Error :: enum {
-	/*
-		General return values.
-	*/
+	// General return values.
 	None = 0,
 	General_Error,
 	Unexpected_Token,
 	Invalid_Token,
 
-	/*
-		Couldn't find, open or read file.
-	*/
+	// Couldn't find, open or read file.
 	File_Error,
 
-	/*
-		File too short.
-	*/
+	// File too short.
 	Premature_EOF,
 
-	/*
-		XML-specific errors.
-	*/
+	// XML-specific errors.
 	No_Prolog,
 	Invalid_Prolog,
 	Too_Many_Prologs,
@@ -194,11 +160,9 @@ Error :: enum {
 	Too_Many_DocTypes,
 	DocType_Must_Preceed_Elements,
 
-	/*
-		If a DOCTYPE is present _or_ the caller
-		asked for a specific DOCTYPE and the DOCTYPE
-		and root tag don't match, we return `.Invalid_DocType`.
-	*/
+	// If a DOCTYPE is present _or_ the caller
+	// asked for a specific DOCTYPE and the DOCTYPE
+	// and root tag don't match, we return `.Invalid_DocType`.
 	Invalid_DocType,
 
 	Invalid_Tag_Value,
@@ -211,27 +175,20 @@ Error :: enum {
 	Unsupported_Version,
 	Unsupported_Encoding,
 
-	/*
-		<!FOO are usually skipped.
-	*/
+	// <!FOO are usually skipped.
 	Unhandled_Bang,
 
 	Duplicate_Attribute,
 	Conflicting_Options,
 }
 
-/*
-	Implementation starts here.
-*/
 parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_handler := default_error_handler, allocator := context.allocator) -> (doc: ^Document, err: Error) {
 	data := data
 	context.allocator = allocator
 
 	opts := validate_options(options) or_return
 
-	/*
-		If `.Input_May_Be_Modified` is not specified, we duplicate the input so that we can modify it in-place.
-	*/
+	// If `.Input_May_Be_Modified` is not specified, we duplicate the input so that we can modify it in-place.
 	if .Input_May_Be_Modified not_in opts.flags {
 		data = bytes.clone(data)
 	}
@@ -252,10 +209,8 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha
 	element, parent: Element_ID
 	open: Token
 
-	/*
-		If a DOCTYPE is present, the root tag has to match.
-		If an expected DOCTYPE is given in options (i.e. it's non-empty), the DOCTYPE (if present) and root tag have to match.
-	*/
+	// If a DOCTYPE is present, the root tag has to match.
+	// If an expected DOCTYPE is given in options (i.e. it's non-empty), the DOCTYPE (if present) and root tag have to match.
 	expected_doctype := options.expected_doctype
 
 	loop: for {
@@ -263,17 +218,13 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha
 		// NOTE(Jeroen): This is faster as a switch.
 		switch t.ch {
 		case '<':
-			/*
-				Consume peeked `<`
-			*/
+			// Consume peeked `<`
 			advance_rune(t)
 
 			open = scan(t)
 			// NOTE(Jeroen): We're not using a switch because this if-else chain ordered by likelihood is 2.5% faster at -o:size and -o:speed.
 			if likely(open.kind, Token_Kind.Ident) == .Ident {
-				/*
-					e.g. <odin - Start of new element.
-				*/
+				// e.g. <odin - Start of new element.
 				element = new_element(doc)
 				if element == 0 { // First Element
 					parent = element
@@ -286,11 +237,9 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha
 
 				parse_attributes(doc, &doc.elements[element].attribs) or_return
 
-				/*
-					If a DOCTYPE is present _or_ the caller
-					asked for a specific DOCTYPE and the DOCTYPE
-					and root tag don't match, we return .Invalid_Root_Tag.
-				*/
+				// If a DOCTYPE is present _or_ the caller
+				// asked for a specific DOCTYPE and the DOCTYPE
+				// and root tag don't match, we return .Invalid_Root_Tag.
 				if element == 0 { // Root tag?
 					if len(expected_doctype) > 0 && expected_doctype != open.text {
 						error(t, t.offset, "Root Tag doesn't match DOCTYPE. Expected: %v, got: %v\n", expected_doctype, open.text)
@@ -298,23 +247,17 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha
 					}
 				}
 
-				/*
-					One of these should follow:
-					- `>`,  which means we've just opened this tag and expect a later element to close it.
-					- `/>`, which means this is an 'empty' or self-closing tag.
-				*/
+				// One of these should follow:
+				// - `>`,  which means we've just opened this tag and expect a later element to close it.
+				// - `/>`, which means this is an 'empty' or self-closing tag.
 				end_token := scan(t)
 				#partial switch end_token.kind {
 				case .Gt:
-					/*
-						We're now the new parent.
-					*/
+					// We're now the new parent.
 					parent = element
 
 				case .Slash:
-					/*
-						Empty tag. Close it.
-					*/
+					// Empty tag. Close it.
 					expect(t, .Gt) or_return
 					parent      = doc.elements[element].parent
 					element     = parent
@@ -325,9 +268,7 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha
 				}
 
 			} else if open.kind == .Slash {
-				/*
-					Close tag.
-				*/
+				// Close tag.
 				ident := expect(t, .Ident) or_return
 				_      = expect(t, .Gt)    or_return
 
@@ -339,9 +280,7 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha
 				element     = parent
 
 			} else if open.kind == .Exclaim {
-				/*
-					<!
-				*/
+				// <!
 				next := scan(t)
 				#partial switch next.kind {
 				case .Ident:
@@ -370,10 +309,8 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha
 					}
 
 				case .Dash:
-					/*
-						Comment: <!-- -->.
-						The grammar does not allow a comment to end in --->
-					*/
+					// Comment: <!-- -->.
+					// The grammar does not allow a comment to end in --->
 					expect(t, .Dash)
 					comment := scan_comment(t) or_return
 
@@ -395,23 +332,17 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha
 				}
 
 			} else if open.kind == .Question {
-				/*
-					<?xml
-				*/
+				// <?xml
 				next := scan(t)
 				#partial switch next.kind {
 				case .Ident:
 					if len(next.text) == 3 && strings.equal_fold(next.text, "xml") {
 						parse_prologue(doc) or_return
 					} else if len(doc.prologue) > 0 {
-						/*
-							We've already seen a prologue.
-						*/
+						// We've already seen a prologue.
 						return doc, .Too_Many_Prologs
 					} else {
-						/*
-							Could be `<?xml-stylesheet`, etc. Ignore it.
-						*/
+						// Could be `<?xml-stylesheet`, etc. Ignore it.
 						skip_element(t) or_return
 					}
 				case:
@@ -425,15 +356,11 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha
 			}
 
 		case -1:
-			/*
-				End of file.
-			*/
+			// End of file.
 			break loop
 
 		case:
-			/*
-				This should be a tag's body text.
-			*/
+			// This should be a tag's body text.
 			body_text        := scan_string(t, t.offset) or_return
 			needs_processing := .Unbox_CDATA          in opts.flags
 			needs_processing |= .Decode_SGML_Entities in opts.flags
@@ -613,9 +540,7 @@ parse_prologue :: proc(doc: ^Document) -> (err: Error) {
 				doc.encoding = .LATIN_1
 
 			case:
-				/*
-					Unrecognized encoding, assume UTF-8.
-				*/
+				// Unrecognized encoding, assume UTF-8.
 				error(t, offset, "[parse_prologue] Warning: Unrecognized encoding: %v\n", attr.val)
 			}
 
@@ -658,11 +583,11 @@ skip_element :: proc(t: ^Tokenizer) -> (err: Error) {
 
 parse_doctype :: proc(doc: ^Document) -> (err: Error) {
 	/*
-		<!DOCTYPE greeting SYSTEM "hello.dtd">
+	<!DOCTYPE greeting SYSTEM "hello.dtd">
 
-		<!DOCTYPE greeting [
-			<!ELEMENT greeting (#PCDATA)>
-		]>
+	<!DOCTYPE greeting [
+		<!ELEMENT greeting (#PCDATA)>
+	]>
 	*/
 	assert(doc != nil)
 	context.allocator = doc.allocator
@@ -675,9 +600,7 @@ parse_doctype :: proc(doc: ^Document) -> (err: Error) {
 	offset := t.offset
 	skip_element(t) or_return
 
-	/*
-		-1 because the current offset is that of the closing tag, so the rest of the DOCTYPE tag ends just before it.
-	*/
+	// 	-1 because the current offset is that of the closing tag, so the rest of the DOCTYPE tag ends just before it.
 	doc.doctype.rest = string(t.src[offset : t.offset - 1])
 	return .None
 }
@@ -700,4 +623,4 @@ new_element :: proc(doc: ^Document) -> (id: Element_ID) {
 	cur := doc.element_count
 	doc.element_count += 1
 	return cur
-}
+}

+ 15 - 9
core/fmt/fmt.odin

@@ -216,7 +216,7 @@ tprintf :: proc(fmt: string, args: ..any) -> string {
 // Returns: A formatted string
 //
 bprint :: proc(buf: []byte, args: ..any, sep := " ") -> string {
-	sb := strings.builder_from_bytes(buf[0:len(buf)])
+	sb := strings.builder_from_bytes(buf)
 	return sbprint(&sb, ..args, sep=sep)
 }
 // Creates a formatted string using a supplied buffer as the backing array, appends newline. Writes into the buffer.
@@ -229,7 +229,7 @@ bprint :: proc(buf: []byte, args: ..any, sep := " ") -> string {
 // Returns: A formatted string with a newline character at the end
 //
 bprintln :: proc(buf: []byte, args: ..any, sep := " ") -> string {
-	sb := strings.builder_from_bytes(buf[0:len(buf)])
+	sb := strings.builder_from_bytes(buf)
 	return sbprintln(&sb, ..args, sep=sep)
 }
 // Creates a formatted string using a supplied buffer as the backing array. Writes into the buffer.
@@ -242,7 +242,7 @@ bprintln :: proc(buf: []byte, args: ..any, sep := " ") -> string {
 // Returns: A formatted string
 //
 bprintf :: proc(buf: []byte, fmt: string, args: ..any) -> string {
-	sb := strings.builder_from_bytes(buf[0:len(buf)])
+	sb := strings.builder_from_bytes(buf)
 	return sbprintf(&sb, fmt, ..args)
 }
 // Runtime assertion with a formatted message
@@ -1232,8 +1232,12 @@ _pad :: proc(fi: ^Info, s: string) {
 //
 // NOTE: Can return "NaN", "+Inf", "-Inf", "+<value>", or "-<value>".
 //
-_fmt_float_as :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune, float_fmt: byte) {
-	prec := fi.prec if fi.prec_set else 3
+_fmt_float_as :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune, float_fmt: byte, prec: int) {
+	prec := prec
+	if fi.prec_set {
+		prec = fi.prec
+	}
+
 	buf: [386]byte
 
 	// Can return "NaN", "+Inf", "-Inf", "+<value>", "-<value>".
@@ -1242,7 +1246,7 @@ _fmt_float_as :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune, float_fmt: b
 	if !fi.plus {
 		// Strip sign from "+<value>" but not "+Inf".
 		if str[0] == '+' && str[1] != 'I' {
-			str = str[1:] 
+			str = str[1:]
 		}
 	}
 
@@ -1258,11 +1262,13 @@ _fmt_float_as :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune, float_fmt: b
 //
 fmt_float :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune) {
 	switch verb {
-	case 'f', 'F', 'g', 'G', 'v':
-		_fmt_float_as(fi, v, bit_size, verb, 'f')
+	case 'g', 'G', 'v':
+		_fmt_float_as(fi, v, bit_size, verb, 'g', -1)
+	case 'f', 'F':
+		_fmt_float_as(fi, v, bit_size, verb, 'f', 3)
 	case 'e', 'E':
 		// BUG(): "%.3e" returns "3.000e+00"
-		_fmt_float_as(fi, v, bit_size, verb, 'e')
+		_fmt_float_as(fi, v, bit_size, verb, 'e', 6)
 
 	case 'h', 'H':
 		prev_fi := fi^

+ 2 - 1
core/fmt/fmt_os.odin

@@ -1,4 +1,5 @@
-//+build !freestanding !js
+//+build !freestanding
+//+build !js
 package fmt
 
 import "core:runtime"

+ 68 - 61
core/log/log_allocator.odin

@@ -1,19 +1,28 @@
 package log
 
 import "core:runtime"
+import "core:fmt"
+
+Log_Allocator_Format :: enum {
+	Bytes, // Actual number of bytes.
+	Human, // Bytes in human units like bytes, kibibytes, etc. as appropriate.
+}
 
 Log_Allocator :: struct {
 	allocator: runtime.Allocator,
 	level:     Level,
 	prefix:    string,
 	locked:    bool,
+	size_fmt:  Log_Allocator_Format,
 }
 
-log_allocator_init :: proc(la: ^Log_Allocator, level: Level, allocator := context.allocator, prefix := "") {
+log_allocator_init :: proc(la: ^Log_Allocator, level: Level, size_fmt := Log_Allocator_Format.Bytes,
+                           allocator := context.allocator, prefix := "") {
 	la.allocator = allocator
 	la.level = level
 	la.prefix = prefix
 	la.locked = false
+	la.size_fmt = size_fmt
 }
 
 
@@ -29,78 +38,80 @@ log_allocator_proc :: proc(allocator_data: rawptr, mode: runtime.Allocator_Mode,
                            old_memory: rawptr, old_size: int, location := #caller_location) -> ([]byte, runtime.Allocator_Error)  {
 	la := (^Log_Allocator)(allocator_data)
 
+	if context.logger.procedure == nil || la.level < context.logger.lowest_level {
+		return la.allocator.procedure(la.allocator.data, mode, size, alignment, old_memory, old_size, location)
+	}
+
 	padding := " " if la.prefix != "" else ""
 
+	buf: [256]byte = ---
+
 	if !la.locked {
 		la.locked = true
 		defer la.locked = false
 
 		switch mode {
 		case .Alloc:
-			logf(
-				la.level,
-				"%s%s>>> ALLOCATOR(mode=.Alloc, size=%d, alignment=%d)",
-				la.prefix, padding, size, alignment,
-				location = location,
-			)
+			format: string
+			switch la.size_fmt {
+			case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Alloc, size=%d, alignment=%d)"
+			case .Human: format = "%s%s>>> ALLOCATOR(mode=.Alloc, size=%m, alignment=%d)"
+			}
+			str := fmt.bprintf(buf[:], format, la.prefix, padding, size, alignment)
+			context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
+
 		case .Alloc_Non_Zeroed:
-			logf(
-				la.level,
-				"%s%s>>> ALLOCATOR(mode=.Alloc_Non_Zeroed, size=%d, alignment=%d)",
-				la.prefix, padding, size, alignment,
-				location = location,
-			)
+			format: string
+			switch la.size_fmt {
+			case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Alloc_Non_Zeroed, size=%d, alignment=%d)"
+			case .Human: format = "%s%s>>> ALLOCATOR(mode=.Alloc_Non_Zeroed, size=%m, alignment=%d)"
+			}
+			str := fmt.bprintf(buf[:], format, la.prefix, padding, size, alignment)
+			context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
+
 		case .Free:
 			if old_size != 0 {
-				logf(
-					la.level,
-					"%s%s<<< ALLOCATOR(mode=.Free, ptr=%p, size=%d)",
-					la.prefix, padding, old_memory, old_size,
-					location = location,
-				)
+				format: string
+				switch la.size_fmt {
+				case .Bytes: format = "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p, size=%d)"
+				case .Human: format = "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p, size=%m)"
+				}
+				str := fmt.bprintf(buf[:], format, la.prefix, padding, old_memory, old_size)
+				context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
 			} else {
-				logf(
-					la.level,
-					"%s%s<<< ALLOCATOR(mode=.Free, ptr=%p)",
-					la.prefix, padding, old_memory,
-					location = location,
-				)
+				str := fmt.bprintf(buf[:], "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p)", la.prefix, padding, old_memory)
+				context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
 			}
+
 		case .Free_All:
-			logf(
-				la.level,
-				"%s%s<<< ALLOCATOR(mode=.Free_All)",
-				la.prefix, padding,
-				location = location,
-			)
+			str := fmt.bprintf(buf[:], "%s%s<<< ALLOCATOR(mode=.Free_All)", la.prefix, padding)
+			context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
+
 		case .Resize:
-			logf(
-				la.level,
-				"%s%s>>> ALLOCATOR(mode=.Resize, ptr=%p, old_size=%d, size=%d, alignment=%d)",
-				la.prefix, padding, old_memory, old_size, size, alignment,
-				location = location,
-			)
+			format: string
+			switch la.size_fmt {
+			case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Resize, ptr=%p, old_size=%d, size=%d, alignment=%d)"
+			case .Human: format = "%s%s>>> ALLOCATOR(mode=.Resize, ptr=%p, old_size=%m, size=%m, alignment=%d)"
+			}
+			str := fmt.bprintf(buf[:], format, la.prefix, padding, old_memory, old_size, size, alignment)
+			context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
+
 		case .Resize_Non_Zeroed:
-			logf(
-				la.level,
-				"%s%s>>> ALLOCATOR(mode=.Resize_Non_Zeroed, ptr=%p, old_size=%d, size=%d, alignment=%d)",
-				la.prefix, padding, old_memory, old_size, size, alignment,
-				location = location,
-			)
+			format: string
+			switch la.size_fmt {
+			case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Resize_Non_Zeroed, ptr=%p, old_size=%d, size=%d, alignment=%d)"
+			case .Human: format = "%s%s>>> ALLOCATOR(mode=.Resize_Non_Zeroed, ptr=%p, old_size=%m, size=%m, alignment=%d)"
+			}
+			str := fmt.bprintf(buf[:], format, la.prefix, padding, old_memory, old_size, size, alignment)
+			context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
+
 		case .Query_Features:
-			logf(
-				la.level,
-				"%s%ALLOCATOR(mode=.Query_Features)",
-				la.prefix, padding,
-				location = location,
-			)
+			str := fmt.bprintf(buf[:], "%s%sALLOCATOR(mode=.Query_Features)", la.prefix, padding)
+			context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
+
 		case .Query_Info:
-			logf(
-				la.level,
-				"%s%ALLOCATOR(mode=.Query_Info)",
-				la.prefix, padding,
-				location = location,
-			)
+			str := fmt.bprintf(buf[:], "%s%sALLOCATOR(mode=.Query_Info)", la.prefix, padding)
+			context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
 		}
 	}
 
@@ -109,12 +120,8 @@ log_allocator_proc :: proc(allocator_data: rawptr, mode: runtime.Allocator_Mode,
 		la.locked = true
 		defer la.locked = false
 		if err != nil {
-			logf(
-				la.level,
-				"%s%ALLOCATOR ERROR=%v",
-				la.prefix, padding, error,
-				location = location,
-			)
+			str := fmt.bprintf(buf[:], "%s%sALLOCATOR ERROR=%v", la.prefix, padding, err)
+			context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
 		}
 	}
 	return data, err

+ 7 - 5
core/math/fixed/fixed.odin

@@ -88,17 +88,19 @@ div_sat :: proc(x, y: $T/Fixed($Backing, $Fraction_Width)) -> (z: T) {
 
 @(require_results)
 floor :: proc(x: $T/Fixed($Backing, $Fraction_Width)) -> Backing {
-	return x.i >> Fraction_Width
+	if x.i >= 0 {
+		return x.i >> Fraction_Width
+	} else {
+		return (x.i - (1 << (Fraction_Width - 1)) + (1 << (Fraction_Width - 2))) >> Fraction_Width
+	}
 }
 @(require_results)
 ceil :: proc(x: $T/Fixed($Backing, $Fraction_Width)) -> Backing {
-	Integer :: 8*size_of(Backing) - Fraction_Width
-	return (x.i + (1 << Integer-1)) >> Fraction_Width
+	return (x.i + (1 << Fraction_Width - 1)) >> Fraction_Width
 }
 @(require_results)
 round :: proc(x: $T/Fixed($Backing, $Fraction_Width)) -> Backing {
-	Integer :: 8*size_of(Backing) - Fraction_Width
-	return (x.i + (1 << (Integer - 1))) >> Fraction_Width
+	return (x.i + (1 << (Fraction_Width - 1))) >> Fraction_Width
 }
 
 

+ 4 - 4
core/math/linalg/general.odin

@@ -70,7 +70,7 @@ outer_product :: builtin.outer_product
 
 @(require_results)
 quaternion_inverse :: proc "contextless" (q: $Q) -> Q where IS_QUATERNION(Q) {
-	return conj(q) * quaternion(1.0/dot(q, q), 0, 0, 0)
+	return conj(q) * quaternion(w=1.0/dot(q, q), x=0, y=0, z=0)
 }
 
 
@@ -217,7 +217,7 @@ quaternion64_mul_vector3 :: proc "contextless" (q: $Q/quaternion64, v: $V/[3]$F/
 	Raw_Quaternion :: struct {xyz: [3]f16, r: f16}
 
 	q := transmute(Raw_Quaternion)q
-	v := transmute([3]f16)v
+	v := v
 
 	t := cross(2*q.xyz, v)
 	return V(v + q.r*t + cross(q.xyz, t))
@@ -227,7 +227,7 @@ quaternion128_mul_vector3 :: proc "contextless" (q: $Q/quaternion128, v: $V/[3]$
 	Raw_Quaternion :: struct {xyz: [3]f32, r: f32}
 
 	q := transmute(Raw_Quaternion)q
-	v := transmute([3]f32)v
+	v := v
 
 	t := cross(2*q.xyz, v)
 	return V(v + q.r*t + cross(q.xyz, t))
@@ -237,7 +237,7 @@ quaternion256_mul_vector3 :: proc "contextless" (q: $Q/quaternion256, v: $V/[3]$
 	Raw_Quaternion :: struct {xyz: [3]f64, r: f64}
 
 	q := transmute(Raw_Quaternion)q
-	v := transmute([3]f64)v
+	v := v
 
 	t := cross(2*q.xyz, v)
 	return V(v + q.r*t + cross(q.xyz, t))

+ 64 - 64
core/math/linalg/specific.odin

@@ -7,96 +7,96 @@ F16_EPSILON :: 1e-3
 F32_EPSILON :: 1e-7
 F64_EPSILON :: 1e-15
 
-Vector2f16 :: distinct [2]f16
-Vector3f16 :: distinct [3]f16
-Vector4f16 :: distinct [4]f16
-
-Matrix1x1f16 :: distinct matrix[1, 1]f16
-Matrix1x2f16 :: distinct matrix[1, 2]f16
-Matrix1x3f16 :: distinct matrix[1, 3]f16
-Matrix1x4f16 :: distinct matrix[1, 4]f16
-
-Matrix2x1f16 :: distinct matrix[2, 1]f16
-Matrix2x2f16 :: distinct matrix[2, 2]f16
-Matrix2x3f16 :: distinct matrix[2, 3]f16
-Matrix2x4f16 :: distinct matrix[2, 4]f16
-
-Matrix3x1f16 :: distinct matrix[3, 1]f16
-Matrix3x2f16 :: distinct matrix[3, 2]f16
-Matrix3x3f16 :: distinct matrix[3, 3]f16
-Matrix3x4f16 :: distinct matrix[3, 4]f16
-
-Matrix4x1f16 :: distinct matrix[4, 1]f16
-Matrix4x2f16 :: distinct matrix[4, 2]f16
-Matrix4x3f16 :: distinct matrix[4, 3]f16
-Matrix4x4f16 :: distinct matrix[4, 4]f16
+Vector2f16 :: [2]f16
+Vector3f16 :: [3]f16
+Vector4f16 :: [4]f16
+
+Matrix1x1f16 :: matrix[1, 1]f16
+Matrix1x2f16 :: matrix[1, 2]f16
+Matrix1x3f16 :: matrix[1, 3]f16
+Matrix1x4f16 :: matrix[1, 4]f16
+
+Matrix2x1f16 :: matrix[2, 1]f16
+Matrix2x2f16 :: matrix[2, 2]f16
+Matrix2x3f16 :: matrix[2, 3]f16
+Matrix2x4f16 :: matrix[2, 4]f16
+
+Matrix3x1f16 :: matrix[3, 1]f16
+Matrix3x2f16 :: matrix[3, 2]f16
+Matrix3x3f16 :: matrix[3, 3]f16
+Matrix3x4f16 :: matrix[3, 4]f16
+
+Matrix4x1f16 :: matrix[4, 1]f16
+Matrix4x2f16 :: matrix[4, 2]f16
+Matrix4x3f16 :: matrix[4, 3]f16
+Matrix4x4f16 :: matrix[4, 4]f16
 
 Matrix1f16 :: Matrix1x1f16
 Matrix2f16 :: Matrix2x2f16
 Matrix3f16 :: Matrix3x3f16
 Matrix4f16 :: Matrix4x4f16
 
-Vector2f32 :: distinct [2]f32
-Vector3f32 :: distinct [3]f32
-Vector4f32 :: distinct [4]f32
+Vector2f32 :: [2]f32
+Vector3f32 :: [3]f32
+Vector4f32 :: [4]f32
 
-Matrix1x1f32 :: distinct matrix[1, 1]f32
-Matrix1x2f32 :: distinct matrix[1, 2]f32
-Matrix1x3f32 :: distinct matrix[1, 3]f32
-Matrix1x4f32 :: distinct matrix[1, 4]f32
+Matrix1x1f32 :: matrix[1, 1]f32
+Matrix1x2f32 :: matrix[1, 2]f32
+Matrix1x3f32 :: matrix[1, 3]f32
+Matrix1x4f32 :: matrix[1, 4]f32
 
-Matrix2x1f32 :: distinct matrix[2, 1]f32
-Matrix2x2f32 :: distinct matrix[2, 2]f32
-Matrix2x3f32 :: distinct matrix[2, 3]f32
-Matrix2x4f32 :: distinct matrix[2, 4]f32
+Matrix2x1f32 :: matrix[2, 1]f32
+Matrix2x2f32 :: matrix[2, 2]f32
+Matrix2x3f32 :: matrix[2, 3]f32
+Matrix2x4f32 :: matrix[2, 4]f32
 
-Matrix3x1f32 :: distinct matrix[3, 1]f32
-Matrix3x2f32 :: distinct matrix[3, 2]f32
-Matrix3x3f32 :: distinct matrix[3, 3]f32
-Matrix3x4f32 :: distinct matrix[3, 4]f32
+Matrix3x1f32 :: matrix[3, 1]f32
+Matrix3x2f32 :: matrix[3, 2]f32
+Matrix3x3f32 :: matrix[3, 3]f32
+Matrix3x4f32 :: matrix[3, 4]f32
 
-Matrix4x1f32 :: distinct matrix[4, 1]f32
-Matrix4x2f32 :: distinct matrix[4, 2]f32
-Matrix4x3f32 :: distinct matrix[4, 3]f32
-Matrix4x4f32 :: distinct matrix[4, 4]f32
+Matrix4x1f32 :: matrix[4, 1]f32
+Matrix4x2f32 :: matrix[4, 2]f32
+Matrix4x3f32 :: matrix[4, 3]f32
+Matrix4x4f32 :: matrix[4, 4]f32
 
 Matrix1f32 :: Matrix1x1f32
 Matrix2f32 :: Matrix2x2f32
 Matrix3f32 :: Matrix3x3f32
 Matrix4f32 :: Matrix4x4f32
 
-Vector2f64 :: distinct [2]f64
-Vector3f64 :: distinct [3]f64
-Vector4f64 :: distinct [4]f64
+Vector2f64 :: [2]f64
+Vector3f64 :: [3]f64
+Vector4f64 :: [4]f64
 
-Matrix1x1f64 :: distinct matrix[1, 1]f64
-Matrix1x2f64 :: distinct matrix[1, 2]f64
-Matrix1x3f64 :: distinct matrix[1, 3]f64
-Matrix1x4f64 :: distinct matrix[1, 4]f64
+Matrix1x1f64 :: matrix[1, 1]f64
+Matrix1x2f64 :: matrix[1, 2]f64
+Matrix1x3f64 :: matrix[1, 3]f64
+Matrix1x4f64 :: matrix[1, 4]f64
 
-Matrix2x1f64 :: distinct matrix[2, 1]f64
-Matrix2x2f64 :: distinct matrix[2, 2]f64
-Matrix2x3f64 :: distinct matrix[2, 3]f64
-Matrix2x4f64 :: distinct matrix[2, 4]f64
+Matrix2x1f64 :: matrix[2, 1]f64
+Matrix2x2f64 :: matrix[2, 2]f64
+Matrix2x3f64 :: matrix[2, 3]f64
+Matrix2x4f64 :: matrix[2, 4]f64
 
-Matrix3x1f64 :: distinct matrix[3, 1]f64
-Matrix3x2f64 :: distinct matrix[3, 2]f64
-Matrix3x3f64 :: distinct matrix[3, 3]f64
-Matrix3x4f64 :: distinct matrix[3, 4]f64
+Matrix3x1f64 :: matrix[3, 1]f64
+Matrix3x2f64 :: matrix[3, 2]f64
+Matrix3x3f64 :: matrix[3, 3]f64
+Matrix3x4f64 :: matrix[3, 4]f64
 
-Matrix4x1f64 :: distinct matrix[4, 1]f64
-Matrix4x2f64 :: distinct matrix[4, 2]f64
-Matrix4x3f64 :: distinct matrix[4, 3]f64
-Matrix4x4f64 :: distinct matrix[4, 4]f64
+Matrix4x1f64 :: matrix[4, 1]f64
+Matrix4x2f64 :: matrix[4, 2]f64
+Matrix4x3f64 :: matrix[4, 3]f64
+Matrix4x4f64 :: matrix[4, 4]f64
 
 Matrix1f64 :: Matrix1x1f64
 Matrix2f64 :: Matrix2x2f64
 Matrix3f64 :: Matrix3x3f64
 Matrix4f64 :: Matrix4x4f64
 
-Quaternionf16 :: distinct quaternion64
-Quaternionf32 :: distinct quaternion128
-Quaternionf64 :: distinct quaternion256
+Quaternionf16 :: quaternion64
+Quaternionf32 :: quaternion128
+Quaternionf64 :: quaternion256
 
 MATRIX1F16_IDENTITY :: Matrix1f16(1)
 MATRIX2F16_IDENTITY :: Matrix2f16(1)

+ 5 - 5
core/mem/virtual/arena.odin

@@ -51,7 +51,7 @@ arena_init_growing :: proc(arena: ^Arena, reserved: uint = DEFAULT_ARENA_GROWING
 // Initialization of an `Arena` to be a `.Static` variant.
 // A static arena contains a single `Memory_Block` allocated with virtual memory.
 @(require_results)
-arena_init_static :: proc(arena: ^Arena, reserved: uint, commit_size: uint = DEFAULT_ARENA_STATIC_COMMIT_SIZE) -> (err: Allocator_Error) {
+arena_init_static :: proc(arena: ^Arena, reserved: uint = DEFAULT_ARENA_STATIC_RESERVE_SIZE, commit_size: uint = DEFAULT_ARENA_STATIC_COMMIT_SIZE) -> (err: Allocator_Error) {
 	arena.kind           = .Static
 	arena.curr_block     = memory_block_alloc(commit_size, reserved, {}) or_return
 	arena.total_used     = 0
@@ -98,15 +98,15 @@ arena_alloc :: proc(arena: ^Arena, size: uint, alignment: uint, loc := #caller_l
 
 	switch arena.kind {
 	case .Growing:
-		if arena.curr_block == nil || (safe_add(arena.curr_block.used, size) or_else 0) > arena.curr_block.reserved {
-			size = mem.align_forward_uint(size, alignment)
+		needed := mem.align_forward_uint(size, alignment)
+		if arena.curr_block == nil || (safe_add(arena.curr_block.used, needed) or_else 0) > arena.curr_block.reserved {
 			if arena.minimum_block_size == 0 {
 				arena.minimum_block_size = DEFAULT_ARENA_GROWING_MINIMUM_BLOCK_SIZE
 			}
 
-			block_size := max(size, arena.minimum_block_size)
+			block_size := max(needed, arena.minimum_block_size)
 
-			new_block := memory_block_alloc(size, block_size, {}) or_return
+			new_block := memory_block_alloc(needed, block_size, alignment, {}) or_return
 			new_block.prev = arena.curr_block
 			arena.curr_block = new_block
 			arena.total_reserved += new_block.reserved

+ 4 - 4
core/mem/virtual/virtual.odin

@@ -68,7 +68,7 @@ align_formula :: #force_inline proc "contextless" (size, align: uint) -> uint {
 }
 
 @(require_results)
-memory_block_alloc :: proc(committed, reserved: uint, flags: Memory_Block_Flags) -> (block: ^Memory_Block, err: Allocator_Error) {
+memory_block_alloc :: proc(committed, reserved: uint, alignment: uint = 0, flags: Memory_Block_Flags = {}) -> (block: ^Memory_Block, err: Allocator_Error) {
 	page_size := DEFAULT_PAGE_SIZE
 	assert(mem.is_power_of_two(uintptr(page_size)))
 
@@ -79,8 +79,8 @@ memory_block_alloc :: proc(committed, reserved: uint, flags: Memory_Block_Flags)
 	reserved  = align_formula(reserved, page_size)
 	committed = clamp(committed, 0, reserved)
 	
-	total_size     := uint(reserved + size_of(Platform_Memory_Block))
-	base_offset    := uintptr(size_of(Platform_Memory_Block))
+	total_size     := uint(reserved + max(alignment, size_of(Platform_Memory_Block)))
+	base_offset    := uintptr(max(alignment, size_of(Platform_Memory_Block)))
 	protect_offset := uintptr(0)
 	
 	do_protection := false
@@ -183,4 +183,4 @@ memory_block_dealloc :: proc(block_to_free: ^Memory_Block) {
 safe_add :: #force_inline proc "contextless" (x, y: uint) -> (uint, bool) {
 	z, did_overflow := intrinsics.overflow_add(x, y)
 	return z, !did_overflow
-}
+}

+ 1 - 1
core/mem/virtual/virtual_darwin.odin

@@ -136,7 +136,7 @@ _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags)
 	if .Write   in flags { pflags |= PROT_WRITE }
 	if .Execute in flags { pflags |= PROT_EXEC  }
 	err := _mprotect(data, size, pflags)
-	return err != 0
+	return err == 0
 }
 
 

+ 1 - 1
core/mem/virtual/virtual_linux.odin

@@ -40,7 +40,7 @@ _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags)
 	if .Write   in flags { pflags |= {.WRITE} }
 	if .Execute in flags { pflags |= {.EXEC}  }
 	errno := linux.mprotect(data, size, pflags)
-	return errno != .NONE
+	return errno == .NONE
 }
 
 _platform_memory_init :: proc() {

+ 1 - 1
core/mem/virtual/virtual_windows.odin

@@ -53,7 +53,7 @@ PAGE_TARGETS_NO_UPDATE :: 0x40000000
 ERROR_INVALID_ADDRESS :: 487
 ERROR_COMMITMENT_LIMIT :: 1455
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign Kernel32 {
 	GetSystemInfo  :: proc(lpSystemInfo: LPSYSTEM_INFO) ---
 	VirtualAlloc   :: proc(lpAddress: rawptr, dwSize: uint, flAllocationType: u32, flProtect: u32) -> rawptr ---

+ 1 - 1
core/odin/parser/parser.odin

@@ -1438,7 +1438,7 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt {
 				}
 				range.reverse = true
 			} else {
-				error(p, range.pos, "#reverse can only be applied to a 'for in' statement")
+				error(p, stmt.pos, "#reverse can only be applied to a 'for in' statement")
 			}
 			return stmt
 		case "include":

+ 42 - 20
core/os/os_linux.odin

@@ -263,26 +263,48 @@ Unix_File_Time :: struct {
 	nanoseconds: i64,
 }
 
-OS_Stat :: struct {
-	device_id:     u64, // ID of device containing file
-	serial:        u64, // File serial number
-	nlink:         u64, // Number of hard links
-	mode:          u32, // Mode of the file
-	uid:           u32, // User ID of the file's owner
-	gid:           u32, // Group ID of the file's group
-	_padding:      i32, // 32 bits of padding
-	rdev:          u64, // Device ID, if device
-	size:          i64, // Size of the file, in bytes
-	block_size:    i64, // Optimal bllocksize for I/O
-	blocks:        i64, // Number of 512-byte blocks allocated
-
-	last_access:   Unix_File_Time, // Time of last access
-	modified:      Unix_File_Time, // Time of last modification
-	status_change: Unix_File_Time, // Time of last status change
-
-	_reserve1,
-	_reserve2,
-	_reserve3:     i64,
+when ODIN_ARCH == .arm64 {
+	OS_Stat :: struct {
+		device_id:     u64, // ID of device containing file
+		serial:        u64, // File serial number
+		mode:          u32, // Mode of the file
+		nlink:         u32, // Number of hard links
+		uid:           u32, // User ID of the file's owner
+		gid:           u32, // Group ID of the file's group
+		rdev:          u64, // Device ID, if device
+		_:             u64, // Padding
+		size:          i64, // Size of the file, in bytes
+		block_size:    i32, // Optimal blocksize for I/O
+		_:             i32, // Padding
+		blocks:        i64, // Number of 512-byte blocks allocated
+
+		last_access:   Unix_File_Time, // Time of last access
+		modified:      Unix_File_Time, // Time of last modification
+		status_change: Unix_File_Time, // Time of last status change
+
+		_reserved:     [2]i32,
+	}
+	#assert(size_of(OS_Stat) == 128)
+} else {
+	OS_Stat :: struct {
+		device_id:     u64, // ID of device containing file
+		serial:        u64, // File serial number
+		nlink:         u64, // Number of hard links
+		mode:          u32, // Mode of the file
+		uid:           u32, // User ID of the file's owner
+		gid:           u32, // Group ID of the file's group
+		_:             i32, // 32 bits of padding
+		rdev:          u64, // Device ID, if device
+		size:          i64, // Size of the file, in bytes
+		block_size:    i64, // Optimal bllocksize for I/O
+		blocks:        i64, // Number of 512-byte blocks allocated
+
+		last_access:   Unix_File_Time, // Time of last access
+		modified:      Unix_File_Time, // Time of last modification
+		status_change: Unix_File_Time, // Time of last status change
+
+		_reserved:     [3]i64,
+	}
 }
 
 // NOTE(laleksic, 2021-01-21): Comment and rename these to match OS_Stat above

+ 1 - 0
core/runtime/core.odin

@@ -18,6 +18,7 @@
 // This could change at a later date if the all these data structures are
 // implemented within the compiler rather than in this "preload" file
 //
+//+no-instrumentation
 package runtime
 
 import "core:intrinsics"

+ 8 - 3
core/runtime/core_builtin.odin

@@ -240,6 +240,8 @@ delete :: proc{
 	delete_dynamic_array,
 	delete_slice,
 	delete_map,
+	delete_soa_slice,
+	delete_soa_dynamic_array,
 }
 
 
@@ -352,7 +354,7 @@ make_multi_pointer :: proc($T: typeid/[^]$E, #any_int len: int, allocator := con
 //
 // Similar to `new`, the first argument is a type, not a value. Unlike new, make's return type is the same as the
 // type of its argument, not a pointer to it.
-// Make uses the specified allocator, default is context.allocator, default is context.allocator
+// Make uses the specified allocator, default is context.allocator.
 @builtin
 make :: proc{
 	make_slice,
@@ -634,11 +636,14 @@ assign_at_elem :: proc(array: ^$T/[dynamic]$E, index: int, arg: E, loc := #calle
 
 @builtin
 assign_at_elems :: proc(array: ^$T/[dynamic]$E, index: int, args: ..E, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #no_bounds_check #optional_allocator_error {
-	if index+len(args) < len(array) {
+	new_size := index + len(args)
+	if len(args) == 0 {
+		ok = true
+	} else if new_size < len(array) {
 		copy(array[index:], args)
 		ok = true
 	} else {
-		resize(array, index+1+len(args), loc) or_return
+		resize(array, new_size, loc) or_return
 		copy(array[index:], args)
 		ok = true
 	}

+ 10 - 10
core/runtime/default_allocators_arena.odin

@@ -28,11 +28,11 @@ safe_add :: #force_inline proc "contextless" (x, y: uint) -> (uint, bool) {
 }
 
 @(require_results)
-memory_block_alloc :: proc(allocator: Allocator, capacity: uint, loc := #caller_location) -> (block: ^Memory_Block, err: Allocator_Error) {
-	total_size := uint(capacity + size_of(Memory_Block))
-	base_offset    := uintptr(size_of(Memory_Block))
+memory_block_alloc :: proc(allocator: Allocator, capacity: uint, alignment: uint, loc := #caller_location) -> (block: ^Memory_Block, err: Allocator_Error) {
+	total_size  := uint(capacity + max(alignment, size_of(Memory_Block)))
+	base_offset := uintptr(max(alignment, size_of(Memory_Block)))
 
-	min_alignment: int = max(16, align_of(Memory_Block))
+	min_alignment: int = max(16, align_of(Memory_Block), int(alignment))
 	data := mem_alloc(int(total_size), min_alignment, allocator, loc) or_return
 	block = (^Memory_Block)(raw_data(data))
 	end := uintptr(raw_data(data)[len(data):])
@@ -102,20 +102,20 @@ arena_alloc :: proc(arena: ^Arena, size, alignment: uint, loc := #caller_locatio
 	if size == 0 {
 		return
 	}
-
-	if arena.curr_block == nil || (safe_add(arena.curr_block.used, size) or_else 0) > arena.curr_block.capacity {
-		size = align_forward_uint(size, alignment)
+	
+	needed := align_forward_uint(size, alignment)
+	if arena.curr_block == nil || (safe_add(arena.curr_block.used, needed) or_else 0) > arena.curr_block.capacity {
 		if arena.minimum_block_size == 0 {
 			arena.minimum_block_size = DEFAULT_ARENA_GROWING_MINIMUM_BLOCK_SIZE
 		}
 
-		block_size := max(size, arena.minimum_block_size)
+		block_size := max(needed, arena.minimum_block_size)
 
 		if arena.backing_allocator.procedure == nil {
 			arena.backing_allocator = default_allocator()
 		}
 
-		new_block := memory_block_alloc(arena.backing_allocator, block_size, loc) or_return
+		new_block := memory_block_alloc(arena.backing_allocator, block_size, alignment, loc) or_return
 		new_block.prev = arena.curr_block
 		arena.curr_block = new_block
 		arena.total_capacity += new_block.capacity
@@ -134,7 +134,7 @@ arena_init :: proc(arena: ^Arena, size: uint, backing_allocator: Allocator, loc
 	arena^ = {}
 	arena.backing_allocator = backing_allocator
 	arena.minimum_block_size = max(size, 1<<12) // minimum block size of 4 KiB
-	new_block := memory_block_alloc(arena.backing_allocator, arena.minimum_block_size, loc) or_return
+	new_block := memory_block_alloc(arena.backing_allocator, arena.minimum_block_size, 0, loc) or_return
 	arena.curr_block = new_block
 	arena.total_capacity += new_block.capacity
 	return nil

+ 1 - 0
core/runtime/entry_unix.odin

@@ -1,5 +1,6 @@
 //+private
 //+build linux, darwin, freebsd, openbsd
+//+no-instrumentation
 package runtime
 
 import "core:intrinsics"

+ 1 - 0
core/runtime/entry_wasm.odin

@@ -1,5 +1,6 @@
 //+private
 //+build wasm32, wasm64p32
+//+no-instrumentation
 package runtime
 
 import "core:intrinsics"

+ 3 - 2
core/runtime/entry_windows.odin

@@ -1,12 +1,13 @@
 //+private
 //+build windows
+//+no-instrumentation
 package runtime
 
 import "core:intrinsics"
 
 when ODIN_BUILD_MODE == .Dynamic {
 	@(link_name="DllMain", linkage="strong", require)
-	DllMain :: proc "stdcall" (hinstDLL: rawptr, fdwReason: u32, lpReserved: rawptr) -> b32 {
+	DllMain :: proc "system" (hinstDLL: rawptr, fdwReason: u32, lpReserved: rawptr) -> b32 {
 		context = default_context()
 
 		// Populate Windows DLL-specific global
@@ -28,7 +29,7 @@ when ODIN_BUILD_MODE == .Dynamic {
 } else when !ODIN_TEST && !ODIN_NO_ENTRY_POINT {
 	when ODIN_ARCH == .i386 || ODIN_NO_CRT {
 		@(link_name="mainCRTStartup", linkage="strong", require)
-		mainCRTStartup :: proc "stdcall" () -> i32 {
+		mainCRTStartup :: proc "system" () -> i32 {
 			context = default_context()
 			#force_no_inline _startup_runtime()
 			intrinsics.__entry_point()

+ 14 - 10
core/runtime/error_checks.odin

@@ -1,5 +1,6 @@
 package runtime
 
+@(no_instrumentation)
 bounds_trap :: proc "contextless" () -> ! {
 	when ODIN_OS == .Windows {
 		windows_trap_array_bounds()
@@ -8,6 +9,7 @@ bounds_trap :: proc "contextless" () -> ! {
 	}
 }
 
+@(no_instrumentation)
 type_assertion_trap :: proc "contextless" () -> ! {
 	when ODIN_OS == .Windows {
 		windows_trap_type_assertion()
@@ -21,7 +23,7 @@ bounds_check_error :: proc "contextless" (file: string, line, column: i32, index
 	if uint(index) < uint(count) {
 		return
 	}
-	@(cold)
+	@(cold, no_instrumentation)
 	handle_error :: proc "contextless" (file: string, line, column: i32, index, count: int) -> ! {
 		print_caller_location(Source_Code_Location{file, line, column, ""})
 		print_string(" Index ")
@@ -34,6 +36,7 @@ bounds_check_error :: proc "contextless" (file: string, line, column: i32, index
 	handle_error(file, line, column, index, count)
 }
 
+@(no_instrumentation)
 slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) -> ! {
 	print_caller_location(Source_Code_Location{file, line, column, ""})
 	print_string(" Invalid slice indices ")
@@ -46,6 +49,7 @@ slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, h
 	bounds_trap()
 }
 
+@(no_instrumentation)
 multi_pointer_slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) -> ! {
 	print_caller_location(Source_Code_Location{file, line, column, ""})
 	print_string(" Invalid slice indices ")
@@ -82,7 +86,7 @@ dynamic_array_expr_error :: proc "contextless" (file: string, line, column: i32,
 	if 0 <= low && low <= high && high <= max {
 		return
 	}
-	@(cold)
+	@(cold, no_instrumentation)
 	handle_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) -> ! {
 		print_caller_location(Source_Code_Location{file, line, column, ""})
 		print_string(" Invalid dynamic array indices ")
@@ -103,7 +107,7 @@ matrix_bounds_check_error :: proc "contextless" (file: string, line, column: i32
 	   uint(column_index) < uint(column_count) {
 		return
 	}
-	@(cold)
+	@(cold, no_instrumentation)
 	handle_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) -> ! {
 		print_caller_location(Source_Code_Location{file, line, column, ""})
 		print_string(" Matrix indices [")
@@ -127,7 +131,7 @@ when ODIN_NO_RTTI {
 		if ok {
 			return
 		}
-		@(cold)
+		@(cold, no_instrumentation)
 		handle_error :: proc "contextless" (file: string, line, column: i32) -> ! {
 			print_caller_location(Source_Code_Location{file, line, column, ""})
 			print_string(" Invalid type assertion\n")
@@ -140,7 +144,7 @@ when ODIN_NO_RTTI {
 		if ok {
 			return
 		}
-		@(cold)
+		@(cold, no_instrumentation)
 		handle_error :: proc "contextless" (file: string, line, column: i32) -> ! {
 			print_caller_location(Source_Code_Location{file, line, column, ""})
 			print_string(" Invalid type assertion\n")
@@ -153,7 +157,7 @@ when ODIN_NO_RTTI {
 		if ok {
 			return
 		}
-		@(cold)
+		@(cold, no_instrumentation)
 		handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid) -> ! {
 			print_caller_location(Source_Code_Location{file, line, column, ""})
 			print_string(" Invalid type assertion from ")
@@ -198,7 +202,7 @@ when ODIN_NO_RTTI {
 			return id
 		}
 
-		@(cold)
+		@(cold, no_instrumentation)
 		handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid, from_data: rawptr) -> ! {
 
 			actual := variant_type(from, from_data)
@@ -224,7 +228,7 @@ make_slice_error_loc :: #force_inline proc "contextless" (loc := #caller_locatio
 	if 0 <= len {
 		return
 	}
-	@(cold)
+	@(cold, no_instrumentation)
 	handle_error :: proc "contextless" (loc: Source_Code_Location, len: int) -> ! {
 		print_caller_location(loc)
 		print_string(" Invalid slice length for make: ")
@@ -239,7 +243,7 @@ make_dynamic_array_error_loc :: #force_inline proc "contextless" (loc := #caller
 	if 0 <= len && len <= cap {
 		return
 	}
-	@(cold)
+	@(cold, no_instrumentation)
 	handle_error :: proc "contextless" (loc: Source_Code_Location, len, cap: int)  -> ! {
 		print_caller_location(loc)
 		print_string(" Invalid dynamic array parameters for make: ")
@@ -256,7 +260,7 @@ make_map_expr_error_loc :: #force_inline proc "contextless" (loc := #caller_loca
 	if 0 <= cap {
 		return
 	}
-	@(cold)
+	@(cold, no_instrumentation)
 	handle_error :: proc "contextless" (loc: Source_Code_Location, cap: int)  -> ! {
 		print_caller_location(loc)
 		print_string(" Invalid map capacity for make: ")

+ 6 - 6
core/runtime/internal.odin

@@ -749,7 +749,7 @@ mul_quaternion64 :: proc "contextless" (q, r: quaternion64) -> quaternion64 {
 	t2 := r0*q2 + r1*q3 + r2*q0 - r3*q1
 	t3 := r0*q3 - r1*q2 + r2*q1 + r3*q0
 
-	return quaternion(t0, t1, t2, t3)
+	return quaternion(w=t0, x=t1, y=t2, z=t3)
 }
 
 mul_quaternion128 :: proc "contextless" (q, r: quaternion128) -> quaternion128 {
@@ -761,7 +761,7 @@ mul_quaternion128 :: proc "contextless" (q, r: quaternion128) -> quaternion128 {
 	t2 := r0*q2 + r1*q3 + r2*q0 - r3*q1
 	t3 := r0*q3 - r1*q2 + r2*q1 + r3*q0
 
-	return quaternion(t0, t1, t2, t3)
+	return quaternion(w=t0, x=t1, y=t2, z=t3)
 }
 
 mul_quaternion256 :: proc "contextless" (q, r: quaternion256) -> quaternion256 {
@@ -773,7 +773,7 @@ mul_quaternion256 :: proc "contextless" (q, r: quaternion256) -> quaternion256 {
 	t2 := r0*q2 + r1*q3 + r2*q0 - r3*q1
 	t3 := r0*q3 - r1*q2 + r2*q1 + r3*q0
 
-	return quaternion(t0, t1, t2, t3)
+	return quaternion(w=t0, x=t1, y=t2, z=t3)
 }
 
 quo_quaternion64 :: proc "contextless" (q, r: quaternion64) -> quaternion64 {
@@ -787,7 +787,7 @@ quo_quaternion64 :: proc "contextless" (q, r: quaternion64) -> quaternion64 {
 	t2 := (r0*q2 - r1*q3 - r2*q0 + r3*q1) * invmag2
 	t3 := (r0*q3 + r1*q2 + r2*q1 - r3*q0) * invmag2
 
-	return quaternion(t0, t1, t2, t3)
+	return quaternion(w=t0, x=t1, y=t2, z=t3)
 }
 
 quo_quaternion128 :: proc "contextless" (q, r: quaternion128) -> quaternion128 {
@@ -801,7 +801,7 @@ quo_quaternion128 :: proc "contextless" (q, r: quaternion128) -> quaternion128 {
 	t2 := (r0*q2 - r1*q3 - r2*q0 + r3*q1) * invmag2
 	t3 := (r0*q3 + r1*q2 + r2*q1 - r3*q0) * invmag2
 
-	return quaternion(t0, t1, t2, t3)
+	return quaternion(w=t0, x=t1, y=t2, z=t3)
 }
 
 quo_quaternion256 :: proc "contextless" (q, r: quaternion256) -> quaternion256 {
@@ -815,7 +815,7 @@ quo_quaternion256 :: proc "contextless" (q, r: quaternion256) -> quaternion256 {
 	t2 := (r0*q2 - r1*q3 - r2*q0 + r3*q1) * invmag2
 	t3 := (r0*q3 + r1*q2 + r2*q1 - r3*q0) * invmag2
 
-	return quaternion(t0, t1, t2, t3)
+	return quaternion(w=t0, x=t1, y=t2, z=t3)
 }
 
 @(link_name="__truncsfhf2", linkage=RUNTIME_LINKAGE, require=RUNTIME_REQUIRE)

+ 5 - 1
core/runtime/os_specific_any.odin

@@ -1,4 +1,8 @@
-//+build !freestanding !wasi !windows !js !darwin
+//+build !darwin
+//+build !freestanding
+//+build !js
+//+build !wasi
+//+build !windows
 package runtime
 
 import "core:os"

+ 1 - 1
core/runtime/os_specific_darwin.odin

@@ -4,7 +4,7 @@ package runtime
 import "core:intrinsics"
 
 _os_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) {
-	ret := intrinsics.syscall(4, 1, uintptr(raw_data(data)), uintptr(len(data)))
+	ret := intrinsics.syscall(0x2000004, 1, uintptr(raw_data(data)), uintptr(len(data)))
 	if ret < 0 {
 		return 0, _OS_Errno(-ret)
 	}

+ 1 - 1
core/runtime/os_specific_windows.odin

@@ -4,7 +4,7 @@ package runtime
 foreign import kernel32 "system:Kernel32.lib"
 
 @(private="file")
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	// NOTE(bill): The types are not using the standard names (e.g. DWORD and LPVOID) to just minimizing the dependency
 

+ 13 - 2
core/runtime/procs.odin

@@ -4,7 +4,7 @@ when ODIN_NO_CRT && ODIN_OS == .Windows {
 	foreign import lib "system:NtDll.lib"
 	
 	@(private="file")
-	@(default_calling_convention="stdcall")
+	@(default_calling_convention="system")
 	foreign lib {
 		RtlMoveMemory :: proc(dst, s: rawptr, length: int) ---
 		RtlFillMemory :: proc(dst: rawptr, length: int, fill: i32) ---
@@ -37,7 +37,18 @@ when ODIN_NO_CRT && ODIN_OS == .Windows {
 		}
 		return ptr
 	}
-	
+
+	@(link_name="bzero", linkage="strong", require)
+	bzero :: proc "c" (ptr: rawptr, len: int) -> rawptr {
+		if ptr != nil && len != 0 {
+			p := ([^]byte)(ptr)
+			for i := 0; i < len; i += 1 {
+				p[i] = 0
+			}
+		}
+		return ptr
+	}
+
 	@(link_name="memmove", linkage="strong", require)
 	memmove :: proc "c" (dst, src: rawptr, len: int) -> rawptr {
 		d, s := ([^]byte)(dst), ([^]byte)(src)

+ 2 - 1
core/runtime/procs_windows_amd64.odin

@@ -1,11 +1,12 @@
 //+private
+//+no-instrumentation
 package runtime
 
 foreign import kernel32 "system:Kernel32.lib"
 
 @(private)
 foreign kernel32 {
-	RaiseException :: proc "stdcall" (dwExceptionCode, dwExceptionFlags, nNumberOfArguments: u32, lpArguments: ^uint) -> ! ---
+	RaiseException :: proc "system" (dwExceptionCode, dwExceptionFlags, nNumberOfArguments: u32, lpArguments: ^uint) -> ! ---
 }
 
 windows_trap_array_bounds :: proc "contextless" () -> ! {

+ 2 - 1
core/runtime/procs_windows_i386.odin

@@ -1,4 +1,5 @@
 //+private
+//+no-instrumentation
 package runtime
 
 @require foreign import "system:int64.lib"
@@ -12,7 +13,7 @@ windows_trap_array_bounds :: proc "contextless" () -> ! {
 	EXCEPTION_ARRAY_BOUNDS_EXCEEDED :: 0xC000008C
 
 	foreign kernel32 {
-		RaiseException :: proc "stdcall" (dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! ---
+		RaiseException :: proc "system" (dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! ---
 	}
 
 	RaiseException(EXCEPTION_ARRAY_BOUNDS_EXCEEDED, 0, 0, nil)

+ 1 - 1
core/simd/x86/adx.odin

@@ -37,7 +37,7 @@ when ODIN_ARCH == .amd64 {
 	}
 }
 
-@(private, default_calling_convention="c")
+@(private, default_calling_convention="none")
 foreign _ {
 	@(link_name="llvm.x86.addcarry.32")
 	llvm_addcarry_u32  :: proc(a: u8, b: u32, c: u32) -> (u8, u32) ---

+ 1 - 1
core/simd/x86/fxsr.odin

@@ -21,7 +21,7 @@ when ODIN_ARCH == .amd64 {
 	}
 }
 
-@(private, default_calling_convention="c")
+@(private, default_calling_convention="none")
 foreign _ {
 	@(link_name="llvm.x86.fxsave")
 	fxsave    :: proc(p: rawptr) ---

+ 2 - 2
core/simd/x86/pclmulqdq.odin

@@ -1,12 +1,12 @@
 //+build i386, amd64
 package simd_x86
 
-@(require_results, enable_target_feature="pclmulqdq")
+@(require_results, enable_target_feature="pclmul")
 _mm_clmulepi64_si128 :: #force_inline proc "c" (a, b: __m128i, $IMM8: u8) -> __m128i {
 	return pclmulqdq(a, b, u8(IMM8))
 }
 
-@(private, default_calling_convention="c")
+@(private, default_calling_convention="none")
 foreign _ {
 	@(link_name="llvm.x86.pclmulqdq")
 	pclmulqdq :: proc(a, round_key: __m128i, #const imm8: u8) -> __m128i ---

+ 1 - 1
core/simd/x86/rdtsc.odin

@@ -11,7 +11,7 @@ __rdtscp :: #force_inline proc "c" (aux: ^u32) -> u64 {
 	return rdtscp(aux)
 }
 
-@(private, default_calling_convention="c")
+@(private, default_calling_convention="none")
 foreign _ {
 	@(link_name="llvm.x86.rdtsc")
 	rdtsc  :: proc() -> u64 ---

+ 1 - 1
core/simd/x86/sha.odin

@@ -30,7 +30,7 @@ _mm_sha256rnds2_epu32 :: #force_inline proc "c" (a, b, k: __m128i) -> __m128i {
 	return transmute(__m128i)sha256rnds2(transmute(i32x4)a, transmute(i32x4)b, transmute(i32x4)k)
 }
 
-@(private, default_calling_convention="c")
+@(private, default_calling_convention="none")
 foreign _ {
 	@(link_name="llvm.x86.sha1msg1")
 	sha1msg1    :: proc(a, b: i32x4) -> i32x4 ---

+ 1 - 1
core/simd/x86/sse.odin

@@ -532,7 +532,7 @@ when ODIN_ARCH == .amd64 {
 }
 
 
-@(private, default_calling_convention="c")
+@(private, default_calling_convention="none")
 foreign _ {
 	@(link_name="llvm.x86.sse.add.ss")
 	addss       :: proc(a, b: __m128) -> __m128 ---

+ 1 - 1
core/simd/x86/sse2.odin

@@ -1040,7 +1040,7 @@ when ODIN_ARCH == .amd64 {
 }
 
 
-@(private, default_calling_convention="c")
+@(private, default_calling_convention="none")
 foreign _ {
 	@(link_name="llvm.x86.sse2.pause")
 	pause      :: proc() ---

+ 1 - 1
core/simd/x86/sse3.odin

@@ -49,7 +49,7 @@ _mm_moveldup_ps :: #force_inline proc "c" (a: __m128) -> __m128 {
 	return simd.shuffle(a, a, 0, 0, 2, 2)
 }
 
-@(private, default_calling_convention="c")
+@(private, default_calling_convention="none")
 foreign _ {
 	@(link_name = "llvm.x86.sse3.addsub.ps")
 	addsubps :: proc(a, b: __m128) -> __m128 ---

+ 1 - 1
core/simd/x86/sse41.odin

@@ -291,7 +291,7 @@ when ODIN_ARCH == .amd64 {
 }
 
 
-@(private, default_calling_convention="c")
+@(private, default_calling_convention="none")
 foreign _ {
 	@(link_name = "llvm.x86.sse41.pblendvb")
 	pblendvb   :: proc(a, b: i8x16, mask: i8x16) -> i8x16 ---

+ 1 - 1
core/simd/x86/sse42.odin

@@ -104,7 +104,7 @@ when ODIN_ARCH == .amd64 {
 	}
 }
 
-@(private, default_calling_convention="c")
+@(private, default_calling_convention="none")
 foreign _ {
 	// SSE 4.2 string and text comparison ops
 	@(link_name="llvm.x86.sse42.pcmpestrm128")

+ 1 - 1
core/simd/x86/ssse3.odin

@@ -105,7 +105,7 @@ _mm_sign_epi32 :: #force_inline proc "c" (a, b: __m128i) -> __m128i {
 
 
 
-@(private, default_calling_convention="c")
+@(private, default_calling_convention="none")
 foreign _ {
 	@(link_name = "llvm.x86.ssse3.pabs.b.128")
 	pabsb128     :: proc(a: i8x16) -> u8x16 ---

+ 91 - 44
core/slice/slice.odin

@@ -158,53 +158,25 @@ linear_search_proc :: proc(array: $A/[]$T, f: proc(T) -> bool) -> (index: int, f
 binary_search :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool)
 	where intrinsics.type_is_ordered(T) #no_bounds_check
 {
-	// I would like to use binary_search_by(array, key, cmp) here, but it doesn't like it:
-	// Cannot assign value 'cmp' of type 'proc($E, $E) -> Ordering' to 'proc(i32, i32) -> Ordering' in argument
-	return binary_search_by(array, key, proc(key: T, element: T) -> Ordering {
-		switch {
-			case element < key: return .Less
-			case element > key: return .Greater
-			case:               return .Equal
-		}
-	})
+	return binary_search_by(array, key, cmp_proc(T))
 }
 
 @(require_results)
-binary_search_by :: proc(array: $A/[]$T, key: T, f: proc(T, T) -> Ordering) -> (index: int, found: bool)
-	where intrinsics.type_is_ordered(T) #no_bounds_check
-{
-	// INVARIANTS:
-	// - 0 <= left <= (left + size = right) <= len(array)
-	// - f returns .Less    for everything in array[:left]
-	// - f returns .Greater for everything in array[right:]
-	size  := len(array)
-	left  := 0
-	right := size
-
+binary_search_by :: proc(array: $A/[]$T, key: T, f: proc(T, T) -> Ordering) -> (index: int, found: bool) #no_bounds_check {
+	n := len(array)
+	left, right := 0, n
 	for left < right {
-		mid := left + size / 2
-
-		// Steps to verify this is in-bounds:
-		// 1. We note that `size` is strictly positive due to the loop condition
-		// 2. Therefore `size/2 < size`
-		// 3. Adding `left` to both sides yields `(left + size/2) < (left + size)`
-		// 4. We know from the invariant that `left + size <= len(array)`
-		// 5. Therefore `left + size/2 < self.len()`
-		cmp := f(key, array[mid])
-
-		left  = mid + 1 if cmp == .Less    else left
-		right = mid     if cmp == .Greater else right
-
-		switch cmp {
-			case .Equal:   return mid, true
-			case .Less:    left  = mid + 1
-			case .Greater: right = mid
+		mid := int(uint(left+right) >> 1)
+		if f(array[mid], key) == .Less {
+			left = mid+1
+		} else {
+			// .Equal or .Greater
+			right = mid
 		}
-
-		size = right - left
 	}
-
-	return left, false
+	// left == right
+	// f(array[left-1], key) == .Less (if left > 0)
+	return left, left < n && f(array[left], key) == .Equal
 }
 
 @(require_results)
@@ -446,14 +418,35 @@ reduce :: proc(s: $S/[]$U, initializer: $V, f: proc(V, U) -> V) -> V {
 }
 
 @(require_results)
-filter :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) -> S {
-	r := make([dynamic]U, 0, 0, allocator)
+reduce_reverse :: proc(s: $S/[]$U, initializer: $V, f: proc(V, U) -> V) -> V {
+	r := initializer
+	for i := len(s)-1; i >= 0; i -= 1 {
+		#no_bounds_check r = f(r, s[i])
+	}
+	return r
+}
+
+@(require_results)
+filter :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error {
+	r := make([dynamic]U, 0, 0, allocator) or_return
 	for v in s {
 		if f(v) {
 			append(&r, v)
 		}
 	}
-	return r[:]
+	return r[:], nil
+}
+
+@(require_results)
+filter_reverse :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error {
+	r := make([dynamic]U, 0, 0, allocator) or_return
+	for i := len(s)-1; i >= 0; i -= 1 {
+		#no_bounds_check v := s[i]
+		if f(v) {
+			append(&r, v)
+		}
+	}
+	return r[:], nil
 }
 
 @(require_results)
@@ -476,6 +469,60 @@ scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U) -> V, allocator := c
 }
 
 
+@(require_results)
+repeat :: proc(s: $S/[]$U, count: int, allocator := context.allocator) -> (b: S, err: runtime.Allocator_Error) #optional_allocator_error {
+	if count < 0 {
+		panic("slice: negative repeat count")
+	} else if count > 0 && (len(s)*count)/count != len(s) {
+		panic("slice: repeat count will cause an overflow")
+	}
+
+	b = make(S, len(s)*count, allocator) or_return
+	i := copy(b, s)
+	for i < len(b) { // 2^N trick to reduce the need to copy
+		copy(b[i:], b[:i])
+		i *= 2
+	}
+	return
+}
+
+// 'unique' replaces consecutive runs of equal elements with a single copy.
+// The procedures modifies the slice in-place and returns the modified slice.
+@(require_results)
+unique :: proc(s: $S/[]$T) -> S where intrinsics.type_is_comparable(T) #no_bounds_check {
+	if len(s) < 2 {
+		return s
+	}
+	i := 1
+	for j in 1..<len(s) {
+		if s[j] != s[j-1] && i != j {
+			s[i] = s[j]
+		}
+		i += 1
+	}
+
+	return s[:i]
+}
+
+// 'unique_proc' replaces consecutive runs of equal elements with a single copy using a comparison procedure
+// The procedures modifies the slice in-place and returns the modified slice.
+@(require_results)
+unique_proc :: proc(s: $S/[]$T, eq: proc(T, T) -> bool) -> S #no_bounds_check {
+	if len(s) < 2 {
+		return s
+	}
+	i := 1
+	for j in 1..<len(s) {
+		if !eq(s[j], s[j-1]) && i != j {
+			s[i] = s[j]
+		}
+		i += 1
+	}
+
+	return s[:i]
+}
+
+
 @(require_results)
 min :: proc(s: $S/[]$T) -> (res: T, ok: bool) where intrinsics.type_is_ordered(T) #optional_ok {
 	if len(s) != 0 {

+ 1 - 1
core/slice/sort.odin

@@ -62,7 +62,7 @@ _sort_by_indices :: proc(data, sorted: $T/[]$E, indices: []int) {
 
 sort_by_indices_overwrite :: proc(data: $T/[]$E, indices: []int) {
 	assert(len(data) == len(indices))
-	temp := make([]int, len(data), context.allocator)
+	temp := make([]E, len(data), context.allocator)
 	defer delete(temp)
 	for v, i in indices {
 		temp[i] = data[v]

+ 5 - 2
core/strconv/generic_float.odin

@@ -103,8 +103,11 @@ generic_ftoa :: proc(buf: []byte, val: f64, fmt: byte, precision, bit_size: int)
 		}
 	} else {
 		switch fmt {
-		case 'e', 'E': decimal.round(d, prec+1)
-		case 'f', 'F': decimal.round(d, d.decimal_point+prec)
+		case 'e', 'E':
+			prec += 1
+			decimal.round(d, prec)
+		case 'f', 'F':
+			decimal.round(d, d.decimal_point+prec)
 		case 'g', 'G':
 			if prec == 0 {
 				prec = 1

+ 3 - 1
core/strings/strings.odin

@@ -885,6 +885,7 @@ Splits a string into parts based on a separator. If n < count of seperators, the
 Inputs:
 - s: The string to split.
 - sep: The separator string used to split the input string.
+- n: The maximum amount of parts to split the string into.
 - allocator: (default is context.allocator)
 
 Returns:
@@ -1791,7 +1792,8 @@ last_index_any :: proc(s, chars: string) -> (res: int) {
 		if r >= utf8.RUNE_SELF {
 			r = utf8.RUNE_ERROR
 		}
-		return index_rune(chars, r)
+		i := index_rune(chars, r)
+		return i if i < 0 else 0
 	}
 	
 	if len(s) > 8 {

+ 3 - 3
core/sync/futex_windows.odin

@@ -5,14 +5,14 @@ package sync
 import "core:time"
 
 foreign import Synchronization "system:Synchronization.lib"
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign Synchronization {
 	WakeByAddressSingle :: proc(Address: rawptr) ---
 	WakeByAddressAll    :: proc(Address: rawptr) ---
 }
 
 foreign import Ntdll "system:Ntdll.lib"
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign Ntdll {
 	RtlWaitOnAddress :: proc(Address: rawptr, CompareAddress: rawptr, AddressSize: uint, Timeout: ^i64) -> i32 ---
 	RtlNtStatusToDosError :: proc(status: i32) -> u32 ---
@@ -30,7 +30,7 @@ foreign Ntdll {
 
 	GODDAMN MICROSOFT!
 */
-CustomWaitOnAddress :: proc "stdcall" (Address: rawptr, CompareAddress: rawptr, AddressSize: uint, Timeout: ^i64) -> bool {
+CustomWaitOnAddress :: proc "system" (Address: rawptr, CompareAddress: rawptr, AddressSize: uint, Timeout: ^i64) -> bool {
 	status := RtlWaitOnAddress(Address, CompareAddress, AddressSize, Timeout)
 	if status != 0 {
 		SetLastError(RtlNtStatusToDosError(status))

+ 4 - 4
core/sys/info/cpu_intel.odin

@@ -37,11 +37,11 @@ cpu_name:     Maybe(string)
 
 @(init, private)
 init_cpu_features :: proc "c" () {
-	is_set :: #force_inline proc "c" (hwc: u32, value: u32) -> bool {
-		return hwc&(1 << value) != 0
+	is_set :: #force_inline proc "c" (bit: u32, value: u32) -> bool {
+		return (value>>bit) & 0x1 != 0
 	}
-	try_set :: #force_inline proc "c" (set: ^CPU_Features, feature: CPU_Feature, hwc: u32, value: u32) {
-		if is_set(hwc, value) {
+	try_set :: #force_inline proc "c" (set: ^CPU_Features, feature: CPU_Feature, bit: u32, value: u32) {
+		if is_set(bit, value) {
 			set^ += {feature}
 		}
 	}

+ 356 - 306
core/sys/info/platform_darwin.odin

@@ -138,338 +138,388 @@ Darwin_To_Release :: struct {
 @(private)
 macos_release_map: map[string]Darwin_To_Release = {
 	// MacOS Tiger
-	"8A428"   = {{8, 0, 0},   "macOS", {"Tiger",         {10,  4, 0}}},
-	"8A432"   = {{8, 0, 0},   "macOS", {"Tiger",         {10,  4, 0}}},
-	"8B15"    = {{8, 1, 0},   "macOS", {"Tiger",         {10,  4, 1}}},
-	"8B17"    = {{8, 1, 0},   "macOS", {"Tiger",         {10,  4, 1}}},
-	"8C46"    = {{8, 2, 0},   "macOS", {"Tiger",         {10,  4, 2}}},
-	"8C47"    = {{8, 2, 0},   "macOS", {"Tiger",         {10,  4, 2}}},
-	"8E102"   = {{8, 2, 0},   "macOS", {"Tiger",         {10,  4, 2}}},
-	"8E45"    = {{8, 2, 0},   "macOS", {"Tiger",         {10,  4, 2}}},
-	"8E90"    = {{8, 2, 0},   "macOS", {"Tiger",         {10,  4, 2}}},
-	"8F46"    = {{8, 3, 0},   "macOS", {"Tiger",         {10,  4, 3}}},
-	"8G32"    = {{8, 4, 0},   "macOS", {"Tiger",         {10,  4, 4}}},
-	"8G1165"  = {{8, 4, 0},   "macOS", {"Tiger",         {10,  4, 4}}},
-	"8H14"    = {{8, 5, 0},   "macOS", {"Tiger",         {10,  4, 5}}},
-	"8G1454"  = {{8, 5, 0},   "macOS", {"Tiger",         {10,  4, 5}}},
-	"8I127"   = {{8, 6, 0},   "macOS", {"Tiger",         {10,  4, 6}}},
-	"8I1119"  = {{8, 6, 0},   "macOS", {"Tiger",         {10,  4, 6}}},
-	"8J135"   = {{8, 7, 0},   "macOS", {"Tiger",         {10,  4, 7}}},
-	"8J2135a" = {{8, 7, 0},   "macOS", {"Tiger",         {10,  4, 7}}},
-	"8K1079"  = {{8, 7, 0},   "macOS", {"Tiger",         {10,  4, 7}}},
-	"8N5107"  = {{8, 7, 0},   "macOS", {"Tiger",         {10,  4, 7}}},
-	"8L127"   = {{8, 8, 0},   "macOS", {"Tiger",         {10,  4, 8}}},
-	"8L2127"  = {{8, 8, 0},   "macOS", {"Tiger",         {10,  4, 8}}},
-	"8P135"   = {{8, 9, 0},   "macOS", {"Tiger",         {10,  4, 9}}},
-	"8P2137"  = {{8, 9, 0},   "macOS", {"Tiger",         {10,  4, 9}}},
-	"8R218"   = {{8, 10, 0},  "macOS", {"Tiger",         {10,  4, 10}}},
-	"8R2218"  = {{8, 10, 0},  "macOS", {"Tiger",         {10,  4, 10}}},
-	"8R2232"  = {{8, 10, 0},  "macOS", {"Tiger",         {10,  4, 10}}},
-	"8S165"   = {{8, 11, 0},  "macOS", {"Tiger",         {10,  4, 11}}},
-	"8S2167"  = {{8, 11, 0},  "macOS", {"Tiger",         {10,  4, 11}}},
+	"8A428"      = {{8, 0, 0},   "macOS", {"Tiger",         {10,  4, 0}}},
+	"8A432"      = {{8, 0, 0},   "macOS", {"Tiger",         {10,  4, 0}}},
+	"8B15"       = {{8, 1, 0},   "macOS", {"Tiger",         {10,  4, 1}}},
+	"8B17"       = {{8, 1, 0},   "macOS", {"Tiger",         {10,  4, 1}}},
+	"8C46"       = {{8, 2, 0},   "macOS", {"Tiger",         {10,  4, 2}}},
+	"8C47"       = {{8, 2, 0},   "macOS", {"Tiger",         {10,  4, 2}}},
+	"8E102"      = {{8, 2, 0},   "macOS", {"Tiger",         {10,  4, 2}}},
+	"8E45"       = {{8, 2, 0},   "macOS", {"Tiger",         {10,  4, 2}}},
+	"8E90"       = {{8, 2, 0},   "macOS", {"Tiger",         {10,  4, 2}}},
+	"8F46"       = {{8, 3, 0},   "macOS", {"Tiger",         {10,  4, 3}}},
+	"8G32"       = {{8, 4, 0},   "macOS", {"Tiger",         {10,  4, 4}}},
+	"8G1165"     = {{8, 4, 0},   "macOS", {"Tiger",         {10,  4, 4}}},
+	"8H14"       = {{8, 5, 0},   "macOS", {"Tiger",         {10,  4, 5}}},
+	"8G1454"     = {{8, 5, 0},   "macOS", {"Tiger",         {10,  4, 5}}},
+	"8I127"      = {{8, 6, 0},   "macOS", {"Tiger",         {10,  4, 6}}},
+	"8I1119"     = {{8, 6, 0},   "macOS", {"Tiger",         {10,  4, 6}}},
+	"8J135"      = {{8, 7, 0},   "macOS", {"Tiger",         {10,  4, 7}}},
+	"8J2135a"    = {{8, 7, 0},   "macOS", {"Tiger",         {10,  4, 7}}},
+	"8K1079"     = {{8, 7, 0},   "macOS", {"Tiger",         {10,  4, 7}}},
+	"8N5107"     = {{8, 7, 0},   "macOS", {"Tiger",         {10,  4, 7}}},
+	"8L127"      = {{8, 8, 0},   "macOS", {"Tiger",         {10,  4, 8}}},
+	"8L2127"     = {{8, 8, 0},   "macOS", {"Tiger",         {10,  4, 8}}},
+	"8P135"      = {{8, 9, 0},   "macOS", {"Tiger",         {10,  4, 9}}},
+	"8P2137"     = {{8, 9, 0},   "macOS", {"Tiger",         {10,  4, 9}}},
+	"8R218"      = {{8, 10, 0},  "macOS", {"Tiger",         {10,  4, 10}}},
+	"8R2218"     = {{8, 10, 0},  "macOS", {"Tiger",         {10,  4, 10}}},
+	"8R2232"     = {{8, 10, 0},  "macOS", {"Tiger",         {10,  4, 10}}},
+	"8S165"      = {{8, 11, 0},  "macOS", {"Tiger",         {10,  4, 11}}},
+	"8S2167"     = {{8, 11, 0},  "macOS", {"Tiger",         {10,  4, 11}}},
 
 	// MacOS Leopard
-	"9A581"   = {{9, 0, 0},   "macOS", {"Leopard",       {10,  5, 0}}},
-	"9B18"    = {{9, 1, 0},   "macOS", {"Leopard",       {10,  5, 1}}},
-	"9B2117"  = {{9, 1, 1},   "macOS", {"Leopard",       {10,  5, 1}}},
-	"9C31"    = {{9, 2, 0},   "macOS", {"Leopard",       {10,  5, 2}}},
-	"9C7010"  = {{9, 2, 0},   "macOS", {"Leopard",       {10,  5, 2}}},
-	"9D34"    = {{9, 3, 0},   "macOS", {"Leopard",       {10,  5, 3}}},
-	"9E17"    = {{9, 4, 0},   "macOS", {"Leopard",       {10,  5, 4}}},
-	"9F33"    = {{9, 5, 0},   "macOS", {"Leopard",       {10,  5, 5}}},
-	"9G55"    = {{9, 6, 0},   "macOS", {"Leopard",       {10,  5, 6}}},
-	"9G66"    = {{9, 6, 0},   "macOS", {"Leopard",       {10,  5, 6}}},
-	"9G71"    = {{9, 6, 0},   "macOS", {"Leopard",       {10,  5, 6}}},
-	"9J61"    = {{9, 7, 0},   "macOS", {"Leopard",       {10,  5, 7}}},
-	"9L30"    = {{9, 8, 0},   "macOS", {"Leopard",       {10,  5, 8}}},
-	"9L34"    = {{9, 8, 0},   "macOS", {"Leopard",       {10,  5, 8}}},
+	"9A581"      = {{9, 0, 0},   "macOS", {"Leopard",       {10,  5, 0}}},
+	"9B18"       = {{9, 1, 0},   "macOS", {"Leopard",       {10,  5, 1}}},
+	"9B2117"     = {{9, 1, 1},   "macOS", {"Leopard",       {10,  5, 1}}},
+	"9C31"       = {{9, 2, 0},   "macOS", {"Leopard",       {10,  5, 2}}},
+	"9C7010"     = {{9, 2, 0},   "macOS", {"Leopard",       {10,  5, 2}}},
+	"9D34"       = {{9, 3, 0},   "macOS", {"Leopard",       {10,  5, 3}}},
+	"9E17"       = {{9, 4, 0},   "macOS", {"Leopard",       {10,  5, 4}}},
+	"9F33"       = {{9, 5, 0},   "macOS", {"Leopard",       {10,  5, 5}}},
+	"9G55"       = {{9, 6, 0},   "macOS", {"Leopard",       {10,  5, 6}}},
+	"9G66"       = {{9, 6, 0},   "macOS", {"Leopard",       {10,  5, 6}}},
+	"9G71"       = {{9, 6, 0},   "macOS", {"Leopard",       {10,  5, 6}}},
+	"9J61"       = {{9, 7, 0},   "macOS", {"Leopard",       {10,  5, 7}}},
+	"9L30"       = {{9, 8, 0},   "macOS", {"Leopard",       {10,  5, 8}}},
+	"9L34"       = {{9, 8, 0},   "macOS", {"Leopard",       {10,  5, 8}}},
 
 	// MacOS Snow Leopard
-	"10A432"  = {{10, 0, 0},  "macOS", {"Snow Leopard",  {10,  6, 0}}},
-	"10A433"  = {{10, 0, 0},  "macOS", {"Snow Leopard",  {10,  6, 0}}},
-	"10B504"  = {{10, 1, 0},  "macOS", {"Snow Leopard",  {10,  6, 1}}},
-	"10C540"  = {{10, 2, 0},  "macOS", {"Snow Leopard",  {10,  6, 2}}},
-	"10D573"  = {{10, 3, 0},  "macOS", {"Snow Leopard",  {10,  6, 3}}},
-	"10D575"  = {{10, 3, 0},  "macOS", {"Snow Leopard",  {10,  6, 3}}},
-	"10D578"  = {{10, 3, 0},  "macOS", {"Snow Leopard",  {10,  6, 3}}},
-	"10F569"  = {{10, 4, 0},  "macOS", {"Snow Leopard",  {10,  6, 4}}},
-	"10H574"  = {{10, 5, 0},  "macOS", {"Snow Leopard",  {10,  6, 5}}},
-	"10J567"  = {{10, 6, 0},  "macOS", {"Snow Leopard",  {10,  6, 6}}},
-	"10J869"  = {{10, 7, 0},  "macOS", {"Snow Leopard",  {10,  6, 7}}},
-	"10J3250" = {{10, 7, 0},  "macOS", {"Snow Leopard",  {10,  6, 7}}},
-	"10J4138" = {{10, 7, 0},  "macOS", {"Snow Leopard",  {10,  6, 7}}},
-	"10K540"  = {{10, 8, 0},  "macOS", {"Snow Leopard",  {10,  6, 8}}},
-	"10K549"  = {{10, 8, 0},  "macOS", {"Snow Leopard",  {10,  6, 8}}},
+	"10A432"     = {{10, 0, 0},  "macOS", {"Snow Leopard",  {10,  6, 0}}},
+	"10A433"     = {{10, 0, 0},  "macOS", {"Snow Leopard",  {10,  6, 0}}},
+	"10B504"     = {{10, 1, 0},  "macOS", {"Snow Leopard",  {10,  6, 1}}},
+	"10C540"     = {{10, 2, 0},  "macOS", {"Snow Leopard",  {10,  6, 2}}},
+	"10D573"     = {{10, 3, 0},  "macOS", {"Snow Leopard",  {10,  6, 3}}},
+	"10D575"     = {{10, 3, 0},  "macOS", {"Snow Leopard",  {10,  6, 3}}},
+	"10D578"     = {{10, 3, 0},  "macOS", {"Snow Leopard",  {10,  6, 3}}},
+	"10F569"     = {{10, 4, 0},  "macOS", {"Snow Leopard",  {10,  6, 4}}},
+	"10H574"     = {{10, 5, 0},  "macOS", {"Snow Leopard",  {10,  6, 5}}},
+	"10J567"     = {{10, 6, 0},  "macOS", {"Snow Leopard",  {10,  6, 6}}},
+	"10J869"     = {{10, 7, 0},  "macOS", {"Snow Leopard",  {10,  6, 7}}},
+	"10J3250"    = {{10, 7, 0},  "macOS", {"Snow Leopard",  {10,  6, 7}}},
+	"10J4138"    = {{10, 7, 0},  "macOS", {"Snow Leopard",  {10,  6, 7}}},
+	"10K540"     = {{10, 8, 0},  "macOS", {"Snow Leopard",  {10,  6, 8}}},
+	"10K549"     = {{10, 8, 0},  "macOS", {"Snow Leopard",  {10,  6, 8}}},
 
 	// MacOS Lion
-	"11A511"  = {{11, 0, 0},  "macOS", {"Lion",          {10,  7, 0}}},
-	"11A511s" = {{11, 0, 0},  "macOS", {"Lion",          {10,  7, 0}}},
-	"11A2061" = {{11, 0, 2},  "macOS", {"Lion",          {10,  7, 0}}},
-	"11A2063" = {{11, 0, 2},  "macOS", {"Lion",          {10,  7, 0}}},
-	"11B26"   = {{11, 1, 0},  "macOS", {"Lion",          {10,  7, 1}}},
-	"11B2118" = {{11, 1, 0},  "macOS", {"Lion",          {10,  7, 1}}},
-	"11C74"   = {{11, 2, 0},  "macOS", {"Lion",          {10,  7, 2}}},
-	"11D50"   = {{11, 3, 0},  "macOS", {"Lion",          {10,  7, 3}}},
-	"11E53"   = {{11, 4, 0},  "macOS", {"Lion",          {10,  7, 4}}},
-	"11G56"   = {{11, 4, 2},  "macOS", {"Lion",          {10,  7, 5}}},
-	"11G63"   = {{11, 4, 2},  "macOS", {"Lion",          {10,  7, 5}}},
+	"11A511"     = {{11, 0, 0},  "macOS", {"Lion",          {10,  7, 0}}},
+	"11A511s"    = {{11, 0, 0},  "macOS", {"Lion",          {10,  7, 0}}},
+	"11A2061"    = {{11, 0, 2},  "macOS", {"Lion",          {10,  7, 0}}},
+	"11A2063"    = {{11, 0, 2},  "macOS", {"Lion",          {10,  7, 0}}},
+	"11B26"      = {{11, 1, 0},  "macOS", {"Lion",          {10,  7, 1}}},
+	"11B2118"    = {{11, 1, 0},  "macOS", {"Lion",          {10,  7, 1}}},
+	"11C74"      = {{11, 2, 0},  "macOS", {"Lion",          {10,  7, 2}}},
+	"11D50"      = {{11, 3, 0},  "macOS", {"Lion",          {10,  7, 3}}},
+	"11E53"      = {{11, 4, 0},  "macOS", {"Lion",          {10,  7, 4}}},
+	"11G56"      = {{11, 4, 2},  "macOS", {"Lion",          {10,  7, 5}}},
+	"11G63"      = {{11, 4, 2},  "macOS", {"Lion",          {10,  7, 5}}},
 
 	// MacOS Mountain Lion
-	"12A269"  = {{12, 0, 0},  "macOS", {"Mountain Lion", {10,  8, 0}}},
-	"12B19"   = {{12, 1, 0},  "macOS", {"Mountain Lion", {10,  8, 1}}},
-	"12C54"   = {{12, 2, 0},  "macOS", {"Mountain Lion", {10,  8, 2}}},
-	"12C60"   = {{12, 2, 0},  "macOS", {"Mountain Lion", {10,  8, 2}}},
-	"12C2034" = {{12, 2, 0},  "macOS", {"Mountain Lion", {10,  8, 2}}},
-	"12C3104" = {{12, 2, 0},  "macOS", {"Mountain Lion", {10,  8, 2}}},
-	"12D78"   = {{12, 3, 0},  "macOS", {"Mountain Lion", {10,  8, 3}}},
-	"12E55"   = {{12, 4, 0},  "macOS", {"Mountain Lion", {10,  8, 4}}},
-	"12E3067" = {{12, 4, 0},  "macOS", {"Mountain Lion", {10,  8, 4}}},
-	"12E4022" = {{12, 4, 0},  "macOS", {"Mountain Lion", {10,  8, 4}}},
-	"12F37"   = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
-	"12F45"   = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
-	"12F2501" = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
-	"12F2518" = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
-	"12F2542" = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
-	"12F2560" = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
+	"12A269"     = {{12, 0, 0},  "macOS", {"Mountain Lion", {10,  8, 0}}},
+	"12B19"      = {{12, 1, 0},  "macOS", {"Mountain Lion", {10,  8, 1}}},
+	"12C54"      = {{12, 2, 0},  "macOS", {"Mountain Lion", {10,  8, 2}}},
+	"12C60"      = {{12, 2, 0},  "macOS", {"Mountain Lion", {10,  8, 2}}},
+	"12C2034"    = {{12, 2, 0},  "macOS", {"Mountain Lion", {10,  8, 2}}},
+	"12C3104"    = {{12, 2, 0},  "macOS", {"Mountain Lion", {10,  8, 2}}},
+	"12D78"      = {{12, 3, 0},  "macOS", {"Mountain Lion", {10,  8, 3}}},
+	"12E55"      = {{12, 4, 0},  "macOS", {"Mountain Lion", {10,  8, 4}}},
+	"12E3067"    = {{12, 4, 0},  "macOS", {"Mountain Lion", {10,  8, 4}}},
+	"12E4022"    = {{12, 4, 0},  "macOS", {"Mountain Lion", {10,  8, 4}}},
+	"12F37"      = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
+	"12F45"      = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
+	"12F2501"    = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
+	"12F2518"    = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
+	"12F2542"    = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
+	"12F2560"    = {{12, 5, 0},  "macOS", {"Mountain Lion", {10,  8, 5}}},
 
 	// MacOS Mavericks
-	"13A603"  = {{13, 0, 0},  "macOS", {"Mavericks",     {10,  9, 0}}},
-	"13B42"   = {{13, 0, 0},  "macOS", {"Mavericks",     {10,  9, 1}}},
-	"13C64"   = {{13, 1, 0},  "macOS", {"Mavericks",     {10,  9, 2}}},
-	"13C1021" = {{13, 1, 0},  "macOS", {"Mavericks",     {10,  9, 2}}},
-	"13D65"   = {{13, 2, 0},  "macOS", {"Mavericks",     {10,  9, 3}}},
-	"13E28"   = {{13, 3, 0},  "macOS", {"Mavericks",     {10,  9, 4}}},
-	"13F34"   = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
-	"13F1066" = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
-	"13F1077" = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
-	"13F1096" = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
-	"13F1112" = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
-	"13F1134" = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
-	"13F1507" = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
-	"13F1603" = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
-	"13F1712" = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
-	"13F1808" = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
-	"13F1911" = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
+	"13A603"     = {{13, 0, 0},  "macOS", {"Mavericks",     {10,  9, 0}}},
+	"13B42"      = {{13, 0, 0},  "macOS", {"Mavericks",     {10,  9, 1}}},
+	"13C64"      = {{13, 1, 0},  "macOS", {"Mavericks",     {10,  9, 2}}},
+	"13C1021"    = {{13, 1, 0},  "macOS", {"Mavericks",     {10,  9, 2}}},
+	"13D65"      = {{13, 2, 0},  "macOS", {"Mavericks",     {10,  9, 3}}},
+	"13E28"      = {{13, 3, 0},  "macOS", {"Mavericks",     {10,  9, 4}}},
+	"13F34"      = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
+	"13F1066"    = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
+	"13F1077"    = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
+	"13F1096"    = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
+	"13F1112"    = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
+	"13F1134"    = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
+	"13F1507"    = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
+	"13F1603"    = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
+	"13F1712"    = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
+	"13F1808"    = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
+	"13F1911"    = {{13, 4, 0},  "macOS", {"Mavericks",     {10,  9, 5}}},
 
 	// MacOS Yosemite
-	"14A389"  = {{14, 0, 0},  "macOS", {"Yosemite",      {10, 10, 0}}},
-	"14B25"   = {{14, 0, 0},  "macOS", {"Yosemite",      {10, 10, 1}}},
-	"14C109"  = {{14, 1, 0},  "macOS", {"Yosemite",      {10, 10, 2}}},
-	"14C1510" = {{14, 1, 0},  "macOS", {"Yosemite",      {10, 10, 2}}},
-	"14C2043" = {{14, 1, 0},  "macOS", {"Yosemite",      {10, 10, 2}}},
-	"14C1514" = {{14, 1, 0},  "macOS", {"Yosemite",      {10, 10, 2}}},
-	"14C2513" = {{14, 1, 0},  "macOS", {"Yosemite",      {10, 10, 2}}},
-	"14D131"  = {{14, 3, 0},  "macOS", {"Yosemite",      {10, 10, 3}}},
-	"14D136"  = {{14, 3, 0},  "macOS", {"Yosemite",      {10, 10, 3}}},
-	"14E46"   = {{14, 4, 0},  "macOS", {"Yosemite",      {10, 10, 4}}},
-	"14F27"   = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F1021" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F1505" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F1509" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F1605" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F1713" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F1808" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F1909" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F1912" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F2009" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F2109" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F2315" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F2411" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
-	"14F2511" = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14A389"     = {{14, 0, 0},  "macOS", {"Yosemite",      {10, 10, 0}}},
+	"14B25"      = {{14, 0, 0},  "macOS", {"Yosemite",      {10, 10, 1}}},
+	"14C109"     = {{14, 1, 0},  "macOS", {"Yosemite",      {10, 10, 2}}},
+	"14C1510"    = {{14, 1, 0},  "macOS", {"Yosemite",      {10, 10, 2}}},
+	"14C2043"    = {{14, 1, 0},  "macOS", {"Yosemite",      {10, 10, 2}}},
+	"14C1514"    = {{14, 1, 0},  "macOS", {"Yosemite",      {10, 10, 2}}},
+	"14C2513"    = {{14, 1, 0},  "macOS", {"Yosemite",      {10, 10, 2}}},
+	"14D131"     = {{14, 3, 0},  "macOS", {"Yosemite",      {10, 10, 3}}},
+	"14D136"     = {{14, 3, 0},  "macOS", {"Yosemite",      {10, 10, 3}}},
+	"14E46"      = {{14, 4, 0},  "macOS", {"Yosemite",      {10, 10, 4}}},
+	"14F27"      = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F1021"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F1505"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F1509"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F1605"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F1713"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F1808"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F1909"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F1912"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F2009"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F2109"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F2315"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F2411"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
+	"14F2511"    = {{14, 5, 0},  "macOS", {"Yosemite",      {10, 10, 5}}},
 
 	// MacOS El Capitan
-	"15A284"   = {{15, 0, 0}, "macOS", {"El Capitan",    {10, 11, 0}}},
-	"15B42"    = {{15, 0, 0}, "macOS", {"El Capitan",    {10, 11, 1}}},
-	"15C50"    = {{15, 2, 0}, "macOS", {"El Capitan",    {10, 11, 2}}},
-	"15D21"    = {{15, 3, 0}, "macOS", {"El Capitan",    {10, 11, 3}}},
-	"15E65"    = {{15, 4, 0}, "macOS", {"El Capitan",    {10, 11, 4}}},
-	"15F34"    = {{15, 5, 0}, "macOS", {"El Capitan",    {10, 11, 5}}},
-	"15G31"    = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G1004"  = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G1011"  = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G1108"  = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G1212"  = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G1217"  = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G1421"  = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G1510"  = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G1611"  = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G17023" = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G18013" = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G19009" = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G20015" = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G21013" = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
-	"15G22010" = {{15, 6, 0}, "macOS", {"El Capitan",    {10, 11, 6}}},
+	"15A284"     = {{15, 0, 0}, "macOS", {"El Capitan",     {10, 11, 0}}},
+	"15B42"      = {{15, 0, 0}, "macOS", {"El Capitan",     {10, 11, 1}}},
+	"15C50"      = {{15, 2, 0}, "macOS", {"El Capitan",     {10, 11, 2}}},
+	"15D21"      = {{15, 3, 0}, "macOS", {"El Capitan",     {10, 11, 3}}},
+	"15E65"      = {{15, 4, 0}, "macOS", {"El Capitan",     {10, 11, 4}}},
+	"15F34"      = {{15, 5, 0}, "macOS", {"El Capitan",     {10, 11, 5}}},
+	"15G31"      = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G1004"    = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G1011"    = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G1108"    = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G1212"    = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G1217"    = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G1421"    = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G1510"    = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G1611"    = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G17023"   = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G18013"   = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G19009"   = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G20015"   = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G21013"   = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
+	"15G22010"   = {{15, 6, 0}, "macOS", {"El Capitan",     {10, 11, 6}}},
 
 	// MacOS Sierra
-	"16A323"   = {{16, 0, 0}, "macOS", {"Sierra",        {10, 12, 0}}},
-	"16B2555"  = {{16, 1, 0}, "macOS", {"Sierra",        {10, 12, 1}}},
-	"16B2657"  = {{16, 1, 0}, "macOS", {"Sierra",        {10, 12, 1}}},
-	"16C67"    = {{16, 3, 0}, "macOS", {"Sierra",        {10, 12, 2}}},
-	"16C68"    = {{16, 3, 0}, "macOS", {"Sierra",        {10, 12, 2}}},
-	"16D32"    = {{16, 4, 0}, "macOS", {"Sierra",        {10, 12, 3}}},
-	"16E195"   = {{16, 5, 0}, "macOS", {"Sierra",        {10, 12, 4}}},
-	"16F73"    = {{16, 6, 0}, "macOS", {"Sierra",        {10, 12, 5}}},
-	"16F2073"  = {{16, 6, 0}, "macOS", {"Sierra",        {10, 12, 5}}},
-	"16G29"    = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G1036"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G1114"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G1212"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G1314"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G1408"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G1510"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G1618"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G1710"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G1815"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G1917"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G1918"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G2016"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G2127"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G2128"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
-	"16G2136"  = {{16, 7, 0}, "macOS", {"Sierra",        {10, 12, 6}}},
+	"16A323"     = {{16, 0, 0}, "macOS", {"Sierra",         {10, 12, 0}}},
+	"16B2555"    = {{16, 1, 0}, "macOS", {"Sierra",         {10, 12, 1}}},
+	"16B2657"    = {{16, 1, 0}, "macOS", {"Sierra",         {10, 12, 1}}},
+	"16C67"      = {{16, 3, 0}, "macOS", {"Sierra",         {10, 12, 2}}},
+	"16C68"      = {{16, 3, 0}, "macOS", {"Sierra",         {10, 12, 2}}},
+	"16D32"      = {{16, 4, 0}, "macOS", {"Sierra",         {10, 12, 3}}},
+	"16E195"     = {{16, 5, 0}, "macOS", {"Sierra",         {10, 12, 4}}},
+	"16F73"      = {{16, 6, 0}, "macOS", {"Sierra",         {10, 12, 5}}},
+	"16F2073"    = {{16, 6, 0}, "macOS", {"Sierra",         {10, 12, 5}}},
+	"16G29"      = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G1036"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G1114"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G1212"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G1314"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G1408"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G1510"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G1618"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G1710"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G1815"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G1917"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G1918"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G2016"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G2127"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G2128"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
+	"16G2136"    = {{16, 7, 0}, "macOS", {"Sierra",         {10, 12, 6}}},
 
 	// MacOS High Sierra
-	"17A365"   = {{17, 0, 0}, "macOS", {"High Sierra",   {10, 13, 0}}},
-	"17A405"   = {{17, 0, 0}, "macOS", {"High Sierra",   {10, 13, 0}}},
-	"17B48"    = {{17, 2, 0}, "macOS", {"High Sierra",   {10, 13, 1}}},
-	"17B1002"  = {{17, 2, 0}, "macOS", {"High Sierra",   {10, 13, 1}}},
-	"17B1003"  = {{17, 2, 0}, "macOS", {"High Sierra",   {10, 13, 1}}},
-	"17C88"    = {{17, 3, 0}, "macOS", {"High Sierra",   {10, 13, 2}}},
-	"17C89"    = {{17, 3, 0}, "macOS", {"High Sierra",   {10, 13, 2}}},
-	"17C205"   = {{17, 3, 0}, "macOS", {"High Sierra",   {10, 13, 2}}},
-	"17C2205"  = {{17, 3, 0}, "macOS", {"High Sierra",   {10, 13, 2}}},
-	"17D47"    = {{17, 4, 0}, "macOS", {"High Sierra",   {10, 13, 3}}},
-	"17D2047"  = {{17, 4, 0}, "macOS", {"High Sierra",   {10, 13, 3}}},
-	"17D102"   = {{17, 4, 0}, "macOS", {"High Sierra",   {10, 13, 3}}},
-	"17D2102"  = {{17, 4, 0}, "macOS", {"High Sierra",   {10, 13, 3}}},
-	"17E199"   = {{17, 5, 0}, "macOS", {"High Sierra",   {10, 13, 4}}},
-	"17E202"   = {{17, 5, 0}, "macOS", {"High Sierra",   {10, 13, 4}}},
-	"17F77"    = {{17, 6, 0}, "macOS", {"High Sierra",   {10, 13, 5}}},
-	"17G65"    = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G2208"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G2307"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G3025"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G4015"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G5019"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G6029"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G6030"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G7024"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G8029"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G8030"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G8037"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G9016"  = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G10021" = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G11023" = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G12034" = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G13033" = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G13035" = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G14019" = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G14033" = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
-	"17G14042" = {{17, 7, 0}, "macOS", {"High Sierra",   {10, 13, 6}}},
+	"17A365"     = {{17, 0, 0}, "macOS", {"High Sierra",    {10, 13, 0}}},
+	"17A405"     = {{17, 0, 0}, "macOS", {"High Sierra",    {10, 13, 0}}},
+	"17B48"      = {{17, 2, 0}, "macOS", {"High Sierra",    {10, 13, 1}}},
+	"17B1002"    = {{17, 2, 0}, "macOS", {"High Sierra",    {10, 13, 1}}},
+	"17B1003"    = {{17, 2, 0}, "macOS", {"High Sierra",    {10, 13, 1}}},
+	"17C88"      = {{17, 3, 0}, "macOS", {"High Sierra",    {10, 13, 2}}},
+	"17C89"      = {{17, 3, 0}, "macOS", {"High Sierra",    {10, 13, 2}}},
+	"17C205"     = {{17, 3, 0}, "macOS", {"High Sierra",    {10, 13, 2}}},
+	"17C2205"    = {{17, 3, 0}, "macOS", {"High Sierra",    {10, 13, 2}}},
+	"17D47"      = {{17, 4, 0}, "macOS", {"High Sierra",    {10, 13, 3}}},
+	"17D2047"    = {{17, 4, 0}, "macOS", {"High Sierra",    {10, 13, 3}}},
+	"17D102"     = {{17, 4, 0}, "macOS", {"High Sierra",    {10, 13, 3}}},
+	"17D2102"    = {{17, 4, 0}, "macOS", {"High Sierra",    {10, 13, 3}}},
+	"17E199"     = {{17, 5, 0}, "macOS", {"High Sierra",    {10, 13, 4}}},
+	"17E202"     = {{17, 5, 0}, "macOS", {"High Sierra",    {10, 13, 4}}},
+	"17F77"      = {{17, 6, 0}, "macOS", {"High Sierra",    {10, 13, 5}}},
+	"17G65"      = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G2208"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G2307"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G3025"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G4015"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G5019"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G6029"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G6030"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G7024"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G8029"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G8030"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G8037"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G9016"    = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G10021"   = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G11023"   = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G12034"   = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G13033"   = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G13035"   = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G14019"   = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G14033"   = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
+	"17G14042"   = {{17, 7, 0}, "macOS", {"High Sierra",    {10, 13, 6}}},
 
 	// MacOS Mojave
-	"18A391"   = {{18, 0, 0}, "macOS", {"Mojave",        {10, 14, 0}}},
-	"18B75"    = {{18, 2, 0}, "macOS", {"Mojave",        {10, 14, 1}}},
-	"18B2107"  = {{18, 2, 0}, "macOS", {"Mojave",        {10, 14, 1}}},
-	"18B3094"  = {{18, 2, 0}, "macOS", {"Mojave",        {10, 14, 1}}},
-	"18C54"    = {{18, 2, 0}, "macOS", {"Mojave",        {10, 14, 2}}},
-	"18D42"    = {{18, 2, 0}, "macOS", {"Mojave",        {10, 14, 3}}},
-	"18D43"    = {{18, 2, 0}, "macOS", {"Mojave",        {10, 14, 3}}},
-	"18D109"   = {{18, 2, 0}, "macOS", {"Mojave",        {10, 14, 3}}},
-	"18E226"   = {{18, 5, 0}, "macOS", {"Mojave",        {10, 14, 4}}},
-	"18E227"   = {{18, 5, 0}, "macOS", {"Mojave",        {10, 14, 4}}},
-	"18F132"   = {{18, 6, 0}, "macOS", {"Mojave",        {10, 14, 5}}},
-	"18G84"    = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G87"    = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G95"    = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G103"   = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G1012"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G2022"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G3020"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G4032"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G5033"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G6020"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G6032"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G6042"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G7016"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G8012"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G8022"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G9028"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G9216"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
-	"18G9323"  = {{18, 7, 0}, "macOS", {"Mojave",        {10, 14, 6}}},
+	"18A391"     = {{18, 0, 0}, "macOS", {"Mojave",         {10, 14, 0}}},
+	"18B75"      = {{18, 2, 0}, "macOS", {"Mojave",         {10, 14, 1}}},
+	"18B2107"    = {{18, 2, 0}, "macOS", {"Mojave",         {10, 14, 1}}},
+	"18B3094"    = {{18, 2, 0}, "macOS", {"Mojave",         {10, 14, 1}}},
+	"18C54"      = {{18, 2, 0}, "macOS", {"Mojave",         {10, 14, 2}}},
+	"18D42"      = {{18, 2, 0}, "macOS", {"Mojave",         {10, 14, 3}}},
+	"18D43"      = {{18, 2, 0}, "macOS", {"Mojave",         {10, 14, 3}}},
+	"18D109"     = {{18, 2, 0}, "macOS", {"Mojave",         {10, 14, 3}}},
+	"18E226"     = {{18, 5, 0}, "macOS", {"Mojave",         {10, 14, 4}}},
+	"18E227"     = {{18, 5, 0}, "macOS", {"Mojave",         {10, 14, 4}}},
+	"18F132"     = {{18, 6, 0}, "macOS", {"Mojave",         {10, 14, 5}}},
+	"18G84"      = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G87"      = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G95"      = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G103"     = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G1012"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G2022"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G3020"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G4032"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G5033"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G6020"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G6032"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G6042"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G7016"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G8012"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G8022"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G9028"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G9216"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
+	"18G9323"    = {{18, 7, 0}, "macOS", {"Mojave",         {10, 14, 6}}},
 
 	// MacOS Catalina
-	"19A583"   = {{19, 0, 0}, "macOS", {"Catalina",      {10, 15, 0}}},
-	"19A602"   = {{19, 0, 0}, "macOS", {"Catalina",      {10, 15, 0}}},
-	"19A603"   = {{19, 0, 0}, "macOS", {"Catalina",      {10, 15, 0}}},
-	"19B88"    = {{19, 0, 0}, "macOS", {"Catalina",      {10, 15, 1}}},
-	"19C57"    = {{19, 2, 0}, "macOS", {"Catalina",      {10, 15, 2}}},
-	"19C58"    = {{19, 2, 0}, "macOS", {"Catalina",      {10, 15, 2}}},
-	"19D76"    = {{19, 3, 0}, "macOS", {"Catalina",      {10, 15, 3}}},
-	"19E266"   = {{19, 4, 0}, "macOS", {"Catalina",      {10, 15, 4}}},
-	"19E287"   = {{19, 4, 0}, "macOS", {"Catalina",      {10, 15, 4}}},
-	"19F96"    = {{19, 5, 0}, "macOS", {"Catalina",      {10, 15, 5}}},
-	"19F101"   = {{19, 5, 0}, "macOS", {"Catalina",      {10, 15, 5}}},
-	"19G73"    = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 6}}},
-	"19G2021"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 6}}},
-	"19H2"     = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H4"     = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H15"    = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H114"   = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H512"   = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H524"   = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H1030"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H1217"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H1323"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H1417"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H1419"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H1519"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H1615"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H1713"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H1715"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H1824"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H1922"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
-	"19H2026"  = {{19, 6, 0}, "macOS", {"Catalina",      {10, 15, 7}}},
+	"19A583"     = {{19, 0, 0}, "macOS", {"Catalina",       {10, 15, 0}}},
+	"19A602"     = {{19, 0, 0}, "macOS", {"Catalina",       {10, 15, 0}}},
+	"19A603"     = {{19, 0, 0}, "macOS", {"Catalina",       {10, 15, 0}}},
+	"19B88"      = {{19, 0, 0}, "macOS", {"Catalina",       {10, 15, 1}}},
+	"19C57"      = {{19, 2, 0}, "macOS", {"Catalina",       {10, 15, 2}}},
+	"19C58"      = {{19, 2, 0}, "macOS", {"Catalina",       {10, 15, 2}}},
+	"19D76"      = {{19, 3, 0}, "macOS", {"Catalina",       {10, 15, 3}}},
+	"19E266"     = {{19, 4, 0}, "macOS", {"Catalina",       {10, 15, 4}}},
+	"19E287"     = {{19, 4, 0}, "macOS", {"Catalina",       {10, 15, 4}}},
+	"19F96"      = {{19, 5, 0}, "macOS", {"Catalina",       {10, 15, 5}}},
+	"19F101"     = {{19, 5, 0}, "macOS", {"Catalina",       {10, 15, 5}}},
+	"19G73"      = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 6}}},
+	"19G2021"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 6}}},
+	"19H2"       = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H4"       = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H15"      = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H114"     = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H512"     = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H524"     = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H1030"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H1217"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H1323"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H1417"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H1419"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H1519"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H1615"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H1713"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H1715"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H1824"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H1922"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
+	"19H2026"    = {{19, 6, 0}, "macOS", {"Catalina",       {10, 15, 7}}},
 
 	// MacOS Big Sur
-	"20A2411"  = {{20, 1, 0}, "macOS", {"Big Sur",       {11, 0, 0}}},
-	"20B29"    = {{20, 1, 0}, "macOS", {"Big Sur",       {11, 0, 1}}},
-	"20B50"    = {{20, 1, 0}, "macOS", {"Big Sur",       {11, 0, 1}}},
-	"20C69"    = {{20, 2, 0}, "macOS", {"Big Sur",       {11, 1, 0}}},
-	"20D64"    = {{20, 3, 0}, "macOS", {"Big Sur",       {11, 2, 0}}},
-	"20D74"    = {{20, 3, 0}, "macOS", {"Big Sur",       {11, 2, 1}}},
-	"20D75"    = {{20, 3, 0}, "macOS", {"Big Sur",       {11, 2, 1}}},
-	"20D80"    = {{20, 3, 0}, "macOS", {"Big Sur",       {11, 2, 2}}},
-	"20D91"    = {{20, 3, 0}, "macOS", {"Big Sur",       {11, 2, 3}}},
-	"20E232"   = {{20, 4, 0}, "macOS", {"Big Sur",       {11, 3, 0}}},
-	"20E241"   = {{20, 4, 0}, "macOS", {"Big Sur",       {11, 3, 1}}},
-	"20F71"    = {{20, 5, 0}, "macOS", {"Big Sur",       {11, 4, 0}}},
-	"20G71"    = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 5, 0}}},
-	"20G80"    = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 5, 1}}},
-	"20G95"    = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 5, 2}}},
-	"20G165"   = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 6, 0}}},
-	"20G224"   = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 6, 1}}},
-	"20G314"   = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 6, 2}}},
-	"20G415"   = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 6, 3}}},
-	"20G417"   = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 6, 4}}},
-	"20G527"   = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 6, 5}}},
-	"20G624"   = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 6, 6}}},
-	"20G630"   = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 6, 7}}},
-	"20G730"   = {{20, 6, 0}, "macOS", {"Big Sur",       {11, 6, 8}}},
+	"20A2411"    = {{20, 1, 0}, "macOS", {"Big Sur",        {11, 0, 0}}},
+	"20B29"      = {{20, 1, 0}, "macOS", {"Big Sur",        {11, 0, 1}}},
+	"20B50"      = {{20, 1, 0}, "macOS", {"Big Sur",        {11, 0, 1}}},
+	"20C69"      = {{20, 2, 0}, "macOS", {"Big Sur",        {11, 1, 0}}},
+	"20D64"      = {{20, 3, 0}, "macOS", {"Big Sur",        {11, 2, 0}}},
+	"20D74"      = {{20, 3, 0}, "macOS", {"Big Sur",        {11, 2, 1}}},
+	"20D75"      = {{20, 3, 0}, "macOS", {"Big Sur",        {11, 2, 1}}},
+	"20D80"      = {{20, 3, 0}, "macOS", {"Big Sur",        {11, 2, 2}}},
+	"20D91"      = {{20, 3, 0}, "macOS", {"Big Sur",        {11, 2, 3}}},
+	"20E232"     = {{20, 4, 0}, "macOS", {"Big Sur",        {11, 3, 0}}},
+	"20E241"     = {{20, 4, 0}, "macOS", {"Big Sur",        {11, 3, 1}}},
+	"20F71"      = {{20, 5, 0}, "macOS", {"Big Sur",        {11, 4, 0}}},
+	"20G71"      = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 5, 0}}},
+	"20G80"      = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 5, 1}}},
+	"20G95"      = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 5, 2}}},
+	"20G165"     = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 6, 0}}},
+	"20G224"     = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 6, 1}}},
+	"20G314"     = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 6, 2}}},
+	"20G415"     = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 6, 3}}},
+	"20G417"     = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 6, 4}}},
+	"20G527"     = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 6, 5}}},
+	"20G624"     = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 6, 6}}},
+	"20G630"     = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 6, 7}}},
+	"20G730"     = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 6, 8}}},
+	"20G817"     = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 7, 0}}},
+	"20G918"     = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 7, 1}}},
+	"20G1020"    = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 7, 2}}},
+	"20G1116"    = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 7, 3}}},
+	"20G1120"    = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 7, 4}}},
+	"20G1225"    = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 7, 5}}},
+	"20G1231"    = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 7, 6}}},
+	"20G1345"    = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 7, 7}}},
+	"20G1351"    = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 7, 8}}},
+	"20G1426"    = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 7, 9}}},
+	"20G1427"    = {{20, 6, 0}, "macOS", {"Big Sur",        {11, 7, 10}}},
 
 	// MacOS Monterey
-	"21A344"   = {{21, 0, 1}, "macOS", {"Monterey",      {12, 0, 0}}},
-	"21A559"   = {{21, 1, 0}, "macOS", {"Monterey",      {12, 0, 1}}},
-	"21C52"    = {{21, 2, 0}, "macOS", {"Monterey",      {12, 1, 0}}},
-	"21D49"    = {{21, 3, 0}, "macOS", {"Monterey",      {12, 2, 0}}},
-	"21D62"    = {{21, 3, 0}, "macOS", {"Monterey",      {12, 2, 1}}},
-	"21E230"   = {{21, 4, 0}, "macOS", {"Monterey",      {12, 3, 0}}},
-	"21E258"   = {{21, 4, 0}, "macOS", {"Monterey",      {12, 3, 1}}},
-	"21F79"    = {{21, 5, 0}, "macOS", {"Monterey",      {12, 4, 0}}},
-	"21F2081"  = {{21, 5, 0}, "macOS", {"Monterey",      {12, 4, 0}}},
-	"21F2092"  = {{21, 5, 0}, "macOS", {"Monterey",      {12, 4, 0}}},
-	"21G72"    = {{21, 6, 0}, "macOS", {"Monterey",      {12, 5, 0}}},
-	"21G83"    = {{21, 6, 0}, "macOS", {"Monterey",      {12, 5, 1}}},
-	"21G115"   = {{21, 6, 0}, "macOS", {"Monterey",      {12, 6, 0}}},
+	"21A344"     = {{21, 0, 1}, "macOS", {"Monterey",       {12, 0, 0}}},
+	"21A559"     = {{21, 1, 0}, "macOS", {"Monterey",       {12, 0, 1}}},
+	"21C52"      = {{21, 2, 0}, "macOS", {"Monterey",       {12, 1, 0}}},
+	"21D49"      = {{21, 3, 0}, "macOS", {"Monterey",       {12, 2, 0}}},
+	"21D62"      = {{21, 3, 0}, "macOS", {"Monterey",       {12, 2, 1}}},
+	"21E230"     = {{21, 4, 0}, "macOS", {"Monterey",       {12, 3, 0}}},
+	"21E258"     = {{21, 4, 0}, "macOS", {"Monterey",       {12, 3, 1}}},
+	"21F79"      = {{21, 5, 0}, "macOS", {"Monterey",       {12, 4, 0}}},
+	"21F2081"    = {{21, 5, 0}, "macOS", {"Monterey",       {12, 4, 0}}},
+	"21F2092"    = {{21, 5, 0}, "macOS", {"Monterey",       {12, 4, 0}}},
+	"21G72"      = {{21, 6, 0}, "macOS", {"Monterey",       {12, 5, 0}}},
+	"21G83"      = {{21, 6, 0}, "macOS", {"Monterey",       {12, 5, 1}}},
+	"21G115"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 6, 0}}},
+	"21G217"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 6, 1}}},
+	"21G320"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 6, 2}}},
+	"21G419"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 6, 3}}},
+	"21G526"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 6, 4}}},
+	"21G531"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 6, 5}}},
+	"21G646"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 6, 6}}},
+	"21G651"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 6, 7}}},
+	"21G725"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 6, 8}}},
+	"21G726"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 6, 9}}},
+	"21G816"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 7, 0}}},
+	"21G920"     = {{21, 6, 0}, "macOS", {"Monterey",       {12, 7, 1}}},
+	"21G1974"    = {{21, 6, 0}, "macOS", {"Monterey",       {12, 7, 2}}},
+
+	// MacOS Ventura 
+	"22A380"     = {{22, 1, 0}, "macOS", {"Ventura",        {13, 0, 0}}},
+	"22A400"     = {{22, 1, 0}, "macOS", {"Ventura",        {13, 0, 1}}},
+	"22C65"	     = {{22, 2, 0}, "macOS", {"Ventura",        {13, 1, 0}}},
+	"22D49"	     = {{22, 3, 0}, "macOS", {"Ventura",        {13, 2, 0}}},
+	"22D68"	     = {{22, 3, 0}, "macOS", {"Ventura",        {13, 2, 1}}},
+	"22E252"     = {{22, 4, 0}, "macOS", {"Ventura",        {13, 3, 0}}},
+	"22E261"     = {{22, 4, 0}, "macOS", {"Ventura",        {13, 3, 1}}},
+	"22F66"	     = {{22, 5, 0}, "macOS", {"Ventura",        {13, 4, 0}}},
+	"22F82"	     = {{22, 5, 0}, "macOS", {"Ventura",        {13, 4, 1}}},
+	"22E772610a" = {{22, 5, 0}, "macOS", {"Ventura",        {13, 4, 1}}},
+	"22F770820d" = {{22, 5, 0}, "macOS", {"Ventura",        {13, 4, 1}}},
+	"22G74"	     = {{22, 6, 0}, "macOS", {"Ventura",        {13, 5, 0}}},
+	"22G90"	     = {{22, 6, 0}, "macOS", {"Ventura",        {13, 5, 1}}},
+	"22G91"	     = {{22, 6, 0}, "macOS", {"Ventura",        {13, 5, 2}}},
+	"22G120"     = {{22, 6, 0}, "macOS", {"Ventura",        {13, 6, 0}}},
+	"22G313"     = {{22, 6, 0}, "macOS", {"Ventura",        {13, 6, 1}}},
+	"22G320"     = {{22, 6, 0}, "macOS", {"Ventura",        {13, 6, 2}}},
+
+	// MacOS Sonoma 
+	"23A344"     = {{23, 0, 0}, "macOS", {"Sonoma",         {14, 0, 0}}},
+	"23B74"      = {{23, 1, 0}, "macOS", {"Sonoma",         {14, 1, 0}}},
+	"23B81"      = {{23, 1, 0}, "macOS", {"Sonoma",         {14, 1, 1}}},
+	"23B92"      = {{23, 1, 0}, "macOS", {"Sonoma",         {14, 1, 2}}},
+	"23C64"      = {{23, 2, 0}, "macOS", {"Sonoma",         {14, 2, 0}}},
+	"23C71"      = {{23, 2, 0}, "macOS", {"Sonoma",         {14, 2, 1}}},
 }
 
 @(private)

+ 423 - 65
core/sys/linux/bits.odin

@@ -1,7 +1,9 @@
 package linux
 
 
-/// Represents an error returned by most of syscalls
+/*
+	Represents an error returned by most of syscalls
+*/
 Errno :: enum i32 {
 	NONE = 0,
 	// Errno-base
@@ -142,8 +144,9 @@ Errno :: enum i32 {
 	EDEADLOCK       = EDEADLK,
 }
 
-
-/// Bits for Open_Flags
+/*
+	Bits for Open_Flags
+*/
 Open_Flags_Bits :: enum {
 	RDONLY    = 0,
 	WRONLY    = 1,
@@ -164,7 +167,9 @@ Open_Flags_Bits :: enum {
 	PATH      = 21,
 }
 
-/// Bits for FD_Flags bitset
+/*
+	Bits for FD_Flags bitset
+*/
 FD_Flags_Bits :: enum {
 	SYMLINK_NOFOLLOW   = 8,
 	REMOVEDIR          = 9,
@@ -177,7 +182,9 @@ FD_Flags_Bits :: enum {
 	RECURSIVE          = 15,
 }
 
-/// The bits for the Mode bitset.
+/*
+	The bits for the Mode bitset.
+*/
 Mode_Bits :: enum {
 	IXOTH  = 0,  // 0o0000001
 	IWOTH  = 1,  // 0o0000002
@@ -197,7 +204,9 @@ Mode_Bits :: enum {
 	IFREG  = 15, // 0o0100000
 }
 
-/// The bits used by the Statx_Mask bitset
+/*
+	The bits used by the Statx_Mask bitset
+*/
 Statx_Mask_Bits :: enum {
 	TYPE         = 0,
 	MODE         = 1,
@@ -215,8 +224,10 @@ Statx_Mask_Bits :: enum {
 	DIOALIGN     = 13,
 }
 
-/// Bits found in Statx_Attr bitset
-/// You should not use these directly
+/*
+	Bits found in Statx_Attr bitset
+	You should not use these directly
+*/
 Statx_Attr_Bits :: enum {
 	COMPRESSED = 2,  // 0x00000004
 	IMMUTABLE  = 4,  // 0x00000010
@@ -229,7 +240,9 @@ Statx_Attr_Bits :: enum {
 	DAX        = 21, // 0x00200000
 }
 
-/// Magic bits for filesystems returned by Stat_FS
+/*
+	Magic bits for filesystems returned by Stat_FS
+*/
 FS_Magic :: enum u32 {
 	ADFS_SUPER_MAGIC      = 0xadf5,
 	AFFS_SUPER_MAGIC      = 0xadff,
@@ -317,7 +330,9 @@ FS_Magic :: enum u32 {
 	_XIAFS_SUPER_MAGIC    = 0x012fd16d,
 }
 
-/// Bits for FS_Flags bitset
+/*
+	Bits for FS_Flags bitset
+*/
 FS_Flags_Bits :: enum {
 	RDONLY       = 0,
 	NOSUID       = 1,
@@ -340,20 +355,26 @@ Seek_Whence :: enum i16 {
 	HOLE = 4,
 }
 
-/// Bits for Close_Range_Flags
+/*
+	Bits for Close_Range_Flags
+*/
 Close_Range_Flags_Bits :: enum {
 	CLOEXEC = 2,
 	UNSHARE = 1,
 }
 
-/// Bits for Rename_Flags
+/*
+	Bits for Rename_Flags
+*/
 Rename_Flags_Bits :: enum {
 	EXCHANGE  = 1,
 	NOREPLACE = 0,
 	WHITEOUT  = 2,
 }
 
-/// Type of the file in a directory entry
+/*
+	Type of the file in a directory entry
+*/
 Dirent_Type :: enum u8 {
 	UNKNOWN = 0,
 	FIFO    = 1,
@@ -366,14 +387,18 @@ Dirent_Type :: enum u8 {
 	WHT     = 14,
 }
 
-/// Type of a lock for fcntl.2
+/*
+	Type of a lock for fcntl(2)
+*/
 FLock_Type :: enum i16 {
 	RDLCK = 0,
 	WRLCK = 1,
 	UNLCK = 2,
 }
 
-/// Bits for FD_Notifications
+/*
+	Bits for FD_Notifications
+*/
 FD_Notifications_Bits :: enum {
 	ACCESS    = 0,
 	MODIFY    = 1,
@@ -384,7 +409,9 @@ FD_Notifications_Bits :: enum {
 	MULTISHOT = 31,
 }
 
-/// Bits for seal
+/*
+	Bits for seal
+*/
 Seal_Bits :: enum {
 	SEAL         = 0,
 	SHRINK       = 1,
@@ -408,14 +435,18 @@ FD_Lease :: enum {
 	UNLCK = 2,
 }
 
-/// Kind of owner for FD_Owner
+/*
+	Kind of owner for FD_Owner
+*/
 F_Owner_Type :: enum i32 {
 	OWNER_TID  = 0,
 	OWNER_PID  = 1,
 	OWNER_PGRP = 2,
 }
 
-/// Command for fcntl.2
+/*
+	Command for fcntl(2)
+*/
 FCntl_Command :: enum {
 	DUPFD             = 0,
 	GETFD             = 1,
@@ -465,7 +496,9 @@ Fd_Poll_Events_Bits :: enum {
 	RDHUP  = 13,
 }
 
-/// Bits for Mem_Protection bitfield
+/*
+	Bits for Mem_Protection bitfield
+*/
 Mem_Protection_Bits :: enum{
 	READ      = 0,
 	WRITE     = 1,
@@ -479,7 +512,9 @@ Mem_Protection_Bits :: enum{
 	GROWSUP   = 25,
 }
 
-/// Bits for Map_Flags
+/*
+	Bits for Map_Flags
+*/
 Map_Flags_Bits :: enum {
 	SHARED          = 0,
 	PRIVATE         = 1,
@@ -504,19 +539,25 @@ Map_Flags_Bits :: enum {
 	UNINITIALIZED   = 26,
 }
 
-/// Bits for MLock_Flags
+/*
+	Bits for MLock_Flags
+*/
 MLock_Flags_Bits :: enum {
 	ONFAULT   = 0,
 }
 
-/// Bits for MSync_Flags
+/*
+	Bits for MSync_Flags
+*/
 MSync_Flags_Bits :: enum {
 	ASYNC      = 0,
 	INVALIDATE = 1,
 	SYNC       = 2,
 }
 
-/// Argument for madvice.2
+/*
+	Argument for madvice(2)
+*/
 MAdvice :: enum {
 	NORMAL           = 0,
 	RANDOM           = 1,
@@ -545,27 +586,35 @@ MAdvice :: enum {
 	SOFT_OFFLINE     = 101,
 }
 
-/// Bits for PKey_Access_Rights
+/*
+	Bits for PKey_Access_Rights
+*/
 PKey_Access_Bits :: enum {
 	DISABLE_ACCESS = 0,
 	DISABLE_WRITE  = 2,
 }
 
-/// Bits for MRemap_Flags
+/*
+	Bits for MRemap_Flags
+*/
 MRemap_Flags_Bits :: enum {
 	MAYMOVE   = 0,
 	FIXED     = 1,
 	DONTUNMAP = 2,
 }
 
-/// Bits for Get_Random_Flags
+/*
+	Bits for Get_Random_Flags
+*/
 Get_Random_Flags_Bits :: enum {
 	RANDOM   = 0,
 	NONBLOCK = 1,
 	INSECURE = 2,
 }
 
-/// Bits for Perf_Flags
+/*
+	Bits for Perf_Flags
+*/
 Perf_Flags_Bits :: enum {
 	FD_NO_GROUP = 0,
 	FD_OUTPUT   = 1,
@@ -573,7 +622,9 @@ Perf_Flags_Bits :: enum {
 	FD_CLOEXEC  = 3,
 }
 
-///  Union tag for Perf_Event_Attr struct
+/*
+	Union tag for Perf_Event_Attr struct
+*/
 Perf_Event_Type :: enum u32 {
 	HARDWARE   = 0,
 	SOFTWARE   = 1,
@@ -633,7 +684,9 @@ Perf_Cap_Flags_Bits :: enum u64 {
 	User_Time_Short    = 5,
 }
 
-/// Specifies the type of the hardware event that you want to get info about
+/*
+	Specifies the type of the hardware event that you want to get info about
+*/
 Perf_Hardware_Id :: enum u64 {
 	CPU_CYCLES              = 0,
 	INSTRUCTIONS            = 1,
@@ -647,7 +700,9 @@ Perf_Hardware_Id :: enum u64 {
 	REF_CPU_CYCLES          = 9,
 }
 
-/// Specifies the cache for the particular cache event that you want to get info about
+/*
+	Specifies the cache for the particular cache event that you want to get info about
+*/
 Perf_Hardware_Cache_Id :: enum u64 {
 	L1D      = 0,
 	L1I      = 1,
@@ -658,20 +713,26 @@ Perf_Hardware_Cache_Id :: enum u64 {
 	NODE     = 6,
 }
 
-/// Specifies the cache op that you want to get info about
+/*
+	Specifies the cache op that you want to get info about
+*/
 Perf_Hardware_Cache_Op_Id :: enum u64 {
 	READ     = 0,
 	WRITE    = 1,
 	PREFETCH = 2,
 }
 
-/// Specifies the cache operation result that you want to get info about
+/*
+	Specifies the cache operation result that you want to get info about
+*/
 Perf_Hardware_Cache_Result_Id :: enum u64 {
 	ACCESS   = 0,
 	MISS     = 1,
 }
 
-/// Specifies the particular software event that you want to get info about
+/*
+	Specifies the particular software event that you want to get info about
+*/
 Perf_Software_Id :: enum u64 {
 	CPU_CLOCK         = 0,
 	TASK_CLOCK        = 1,
@@ -688,7 +749,9 @@ Perf_Software_Id :: enum u64 {
 
 }
 
-/// Specifies which values to include in the sample
+/*
+	Specifies which values to include in the sample
+*/
 Perf_Event_Sample_Type_Bits :: enum {
 	IP              = 0,
 	TID             = 1,
@@ -726,7 +789,9 @@ Perf_Read_Format_Bits :: enum {
 	LOST               = 4,
 }
 
-/// Chooses the breakpoint type
+/*
+	Chooses the breakpoint type
+*/
 Hardware_Breakpoint_Type :: enum u32 {
 	EMPTY   = 0,
 	R       = 1,
@@ -736,7 +801,9 @@ Hardware_Breakpoint_Type :: enum u32 {
 	INVALID = RW | X,
 }
 
-/// Bits for Branch_Sample_Type
+/*
+	Bits for Branch_Sample_Type
+*/
 Branch_Sample_Type_Bits :: enum {
 	USER       = 0,
 	KERNEL     = 1,
@@ -759,7 +826,9 @@ Branch_Sample_Type_Bits :: enum {
 	PRIV_SAVE  = 18,
 }
 
-/// Represent the type of Id
+/*
+	Represent the type of Id
+*/
 Id_Type :: enum uint {
 	ALL    = 0,
 	PID    = 1,
@@ -767,7 +836,9 @@ Id_Type :: enum uint {
 	PIDFD  = 3,
 }
 
-/// Options for wait syscalls
+/*
+	Options for wait syscalls
+*/
 Wait_Option :: enum {
 	WNOHANG     = 0,
 	WUNTRACED   = 1,
@@ -781,12 +852,16 @@ Wait_Option :: enum {
 	__WCLONE    = 31,
 }
 
-/// Bits for flags for pidfd
+/*
+	Bits for flags for pidfd
+*/
 Pid_FD_Flags_Bits :: enum {
 	NONBLOCK = 11,
 }
 
-/// Priority for process, process group, user
+/*
+	Priority for process, process group, user
+*/
 Priority_Which :: enum i32 {
 	PROCESS = 0,
 	PGRP    = 1,
@@ -849,10 +924,12 @@ Sig_Stack_Flag :: enum i32 {
 	AUTODISARM = 31,
 }
 
-/// Type of socket to create
-///   For TCP you want to use SOCK_STREAM
-///   For UDP you want to use SOCK_DGRAM
-/// Also see Protocol
+/*
+	Type of socket to create
+    - For TCP you want to use SOCK_STREAM
+	- For UDP you want to use SOCK_DGRAM
+	Also see `Protocol`
+*/
 Socket_Type :: enum {
 	STREAM    = 1,
 	DGRAM     = 2,
@@ -863,13 +940,17 @@ Socket_Type :: enum {
 	PACKET    = 10,
 }
 
-/// Bits for Socket_FD_Flags
+/*
+	Bits for Socket_FD_Flags
+*/
 Socket_FD_Flags_Bits :: enum {
 	NONBLOCK  = 14,
 	CLOEXEC   = 25,
 }
 
-/// Protocol family
+/*
+	Protocol family
+*/
 Protocol_Family :: enum u16 {
 	UNSPEC       = 0,
 	LOCAL        = 1,
@@ -922,11 +1003,13 @@ Protocol_Family :: enum u16 {
 	MCTP         = 45,
 }
 
-/// The protocol number according to IANA protocol number list
-/// Full list of protocol numbers:
-///   https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
-/// Supported by the OS protocols can be queried by reading:
-///   /etc/protocols
+/*
+	The protocol number according to IANA protocol number list
+	Full list of protocol numbers:
+	  https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
+	Supported by the OS protocols can be queried by reading:
+	  /etc/protocols
+*/
 Protocol :: enum {
 	HOPOPT          = 0,
 	ICMP            = 1,
@@ -1066,7 +1149,9 @@ Protocol :: enum {
 	Reserved        = 255,
 }
 
-/// API Level for get/setsockopt.2
+/*
+	API Level for getsockopt(2)/setsockopt(2)
+*/
 Socket_API_Level :: enum {
 	// Comes from <bits/socket-constants.h>
 	SOCKET          = 1,
@@ -1103,8 +1188,10 @@ Socket_API_Level :: enum {
 	SMC             = 286,
 }
 
-/// If Socket_API_Level == .SOCKET, these are the options
-/// you can specify in get/setsockopt.2
+/*
+	If Socket_API_Level == .SOCKET, these are the options
+	you can specify in getsockopt(2)/setsockopt(2)
+*/
 Socket_Option :: enum {
 	DEBUG                         = 1,
 	REUSEADDR                     = 2,
@@ -1249,7 +1336,9 @@ Socket_TCP_Option :: enum {
 	TX_DELAY             = 37,
 }
 
-/// Bits for Socket_Msg
+/*
+	Bits for Socket_Msg
+*/
 Socket_Msg_Bits :: enum {
 	OOB             = 0,
 	PEEK            = 1,
@@ -1275,14 +1364,18 @@ Socket_Msg_Bits :: enum {
 	CMSG_CLOEXEC    = 30,
 }
 
-/// Argument to shutdown.2
+/*
+	Argument to shutdown(2)
+*/
 Shutdown_How :: enum i32 {
 	RD   = 0,
 	WR   = 1,
 	RDWR = 2,
 }
 
-/// Second argument to futex.2 syscall
+/*
+	Second argument to futex(2) syscall
+*/
 Futex_Op :: enum u32 {
 	WAIT              = 0,
 	WAKE              = 1,
@@ -1300,13 +1393,17 @@ Futex_Op :: enum u32 {
 	LOCK_PI2          = 13,
 }
 
-/// Bits for Futex_Flags
+/*
+	Bits for Futex_Flags
+*/
 Futex_Flags_Bits :: enum {
 	PRIVATE    = 7,
 	REALTIME   = 8,
 }
 
-/// Kind of operation on futex, see FUTEX_WAKE_OP
+/*
+	Kind of operation on futex, see FUTEX_WAKE_OP
+*/
 Futex_Arg_Op :: enum {
 	SET      = 0,  /* uaddr2 =       oparg; */
 	ADD      = 1,  /* uaddr2 +=      oparg; */
@@ -1320,7 +1417,9 @@ Futex_Arg_Op :: enum {
 	PO2_XOR  = 4,  /* uaddr2 ^=   1<<oparg; */
 }
 
-/// Kind of comparison operation on futex, see FUTEX_WAKE_OP
+/*
+	Kind of comparison operation on futex, see FUTEX_WAKE_OP
+*/
 Futex_Cmp_Op :: enum {
 	EQ = 0,  /* if (oldval == cmparg) wake */
 	NE = 1,  /* if (oldval != cmparg) wake */
@@ -1330,7 +1429,9 @@ Futex_Cmp_Op :: enum {
 	GE = 5,  /* if (oldval >= cmparg) wake */
 }
 
-/// The kind of resource limits
+/*
+	The kind of resource limits
+*/
 RLimit_Kind :: enum i32 {
 	CPU        = 0,
 	FSIZE      = 1,
@@ -1351,7 +1452,9 @@ RLimit_Kind :: enum i32 {
 	NLIMITS    = 16,
 }
 
-/// Represents the user of resources
+/*
+	Represents the user of resources
+*/
 RUsage_Who :: enum i32 {
 	CHILDREN = -1,
 	SELF     =  0,
@@ -1359,7 +1462,9 @@ RUsage_Who :: enum i32 {
 	LWP      =  THREAD,
 }
 
-/// Bits for Personality_Flags
+/*
+	Bits for Personality_Flags
+*/
 UNAME26            :: 17
 ADDR_NO_RANDOMIZE  :: 18
 FDPIC_FUNCPTRS     :: 19
@@ -1372,8 +1477,10 @@ WHOLE_SECONDS      :: 25
 STICKY_TIMEOUTS    :: 26
 ADDR_LIMIT_3GB     :: 27
 
-/// Personality type
-/// These go into the bottom 8 bits of the personality value
+/*
+	Personality type
+	These go into the bottom 8 bits of the personality value
+*/
 PER_LINUX       :: 0x0000
 PER_LINUX_32BIT :: 0x0000 | ADDR_LIMIT_32BIT
 PER_LINUX_FDPIC :: 0x0000 | FDPIC_FUNCPTRS
@@ -1398,3 +1505,254 @@ PER_OSF4        :: 0x000f
 PER_HPUX        :: 0x0010
 PER_MASK        :: 0x00ff
 
+/*
+	Bits for access modes for shared memory
+*/
+IPC_Mode_Bits :: enum {
+	WROTH  = 1,
+	RDOTH  = 2,
+	WRGRP  = 4,
+	RDGRP  = 5,
+	WRUSR  = 7,
+	RDUSR  = 8,
+	DEST   = 9,
+	LOCKED = 10,
+}
+
+/*
+	Shared memory flags bits
+*/
+IPC_Flags_Bits :: enum {
+	IPC_CREAT     = 9,
+	IPC_EXCL      = 10,
+	IPC_NOWAIT    = 11,
+	// Semaphore
+	SEM_UNDO      = 9,
+	// Shared memory
+	SHM_HUGETLB   = 11,
+	SHM_NORESERVE = 12,
+	SHM_RDONLY    = 12,
+	SHM_RND       = 13,
+	SHM_REMAP     = 14,
+	SHM_EXEC      = 15,
+	// Message queue
+	MSG_NOERROR   = 12,
+	MSG_EXCEPT    = 13,
+	MSG_COPY      = 14,
+}
+
+/*
+	IPC memory commands
+*/
+IPC_Cmd :: enum i16 {
+	// IPC common
+	IPC_RMID     = 0,
+	IPC_SET      = 1,
+	IPC_STAT     = 2,
+	// Shared memory
+	SHM_LOCK     = 11,
+	SHM_UNLOCK   = 12,
+	SHM_STAT     = 13,
+	SHM_INFO     = 14,
+	SHM_STAT_ANY = 15,
+	// Semaphore
+	GETPID       = 11,
+	GETVAL       = 12,
+	GETALL       = 13,
+	GETNCNT      = 14,
+	GETZCNT      = 15,
+	SETVAL       = 16,
+	SETALL       = 17,
+	SEM_STAT     = 18,
+	SEM_INFO     = 19,
+	SEM_STAT_ANY = 20,
+	// Message queue
+	MSG_STAT     = 11,
+	MSG_INFO     = 12,
+	MSG_STAT_ANY = 13,
+}
+
+/*
+	File locking operation bits
+*/
+FLock_Op_Bits :: enum {
+	SH = 1,
+	EX = 2,
+	NB = 4,
+	UN = 8,
+}
+
+/*
+	ptrace requests
+*/
+PTrace_Request :: enum {
+	TRACEME                = 0,
+	PEEKTEXT               = 1,
+	PEEKDATA               = 2,
+	PEEKUSER               = 3,
+	POKETEXT               = 4,
+	POKEDATA               = 5,
+	POKEUSER               = 6,
+	CONT                   = 7,
+	KILL                   = 8,
+	SINGLESTEP             = 9,
+	GETREGS                = 12,
+	SETREGS                = 13,
+	GETFPREGS              = 14,
+	SETFPREGS              = 15,
+	ATTACH                 = 16,
+	DETACH                 = 17,
+	GETFPXREGS             = 18,
+	SETFPXREGS             = 19,
+	SYSCALL                = 24,
+	GET_THREAD_AREA        = 25,
+	SET_THREAD_AREA        = 26,
+	ARCH_PRCTL             = 30,
+	SYSEMU                 = 31,
+	SYSEMU_SINGLESTEP      = 32,
+	SINGLEBLOCK            = 33,
+	SETOPTIONS             = 0x4200,
+	GETEVENTMSG            = 0x4201,
+	GETSIGINFO             = 0x4202,
+	SETSIGINFO             = 0x4203,
+	GETREGSET              = 0x4204,
+	SETREGSET              = 0x4205,
+	SEIZE                  = 0x4206,
+	INTERRUPT              = 0x4207,
+	LISTEN                 = 0x4208,
+	PEEKSIGINFO            = 0x4209,
+	GETSIGMASK             = 0x420a,
+	SETSIGMASK             = 0x420b,
+	SECCOMP_GET_FILTER     = 0x420c,
+	SECCOMP_GET_METADATA   = 0x420d,
+	GET_SYSCALL_INFO       = 0x420e,
+	GET_RSEQ_CONFIGURATION = 0x420f,
+}
+
+/*
+	ptrace options
+*/
+PTrace_Options_Bits :: enum {
+	TRACESYSGOOD    = 0,
+	TRACEFORK       = 1,
+	TRACEVFORK      = 2,
+	TRACECLONE      = 3,
+	TRACEEXEC       = 4,
+	TRACEVFORKDONE  = 5,
+	TRACEEXIT       = 6,
+	TRACESECCOMP    = 7,
+	EXITKILL        = 20,
+	SUSPEND_SECCOMP = 21,
+}
+
+/*
+	ptrace event codes.
+*/
+PTrace_Event_Code :: enum {
+	EVENT_FORK       = 1,
+	EVENT_VFORK      = 2,
+	EVENT_CLONE      = 3,
+	EVENT_EXEC       = 4,
+	EVENT_VFORK_DONE = 5,
+	EVENT_EXIT       = 6,
+	EVENT_SECCOMP    = 7,
+	EVENT_STOP       = 128,
+}
+
+/*
+	ptrace's get syscall info operation.
+*/
+PTrace_Get_Syscall_Info_Op :: enum u8 {
+	NONE    = 0,
+	ENTRY   = 1,
+	EXIT    = 2,
+	SECCOMP = 3,
+}
+
+/*
+	ptrace's PEEKSIGINFO flags bits
+*/
+PTrace_Peek_Sig_Info_Flags_Bits :: enum {
+	SHARED = 0,
+}
+
+/*
+	Syslog actions.
+*/
+Syslog_Action :: enum i32 {
+	CLOSE         = 0,
+	OPEN          = 1,
+	READ          = 2,
+	READ_ALL      = 3,
+	READ_CLEAR    = 4,
+	CLEAR         = 5,
+	CONSOLE_OFF   = 6,
+	CONSOLE_ON    = 7,
+	CONSOLE_LEVEL = 8,
+	SIZE_UNREAD   = 9,
+	SIZE_BUFFER   = 10,
+}
+
+/*
+	Bits for splice flags.
+*/
+Splice_Flags_Bits :: enum {
+	MOVE     = 0x01,
+	NONBLOCK = 0x02,
+	MORE     = 0x04,
+	GIFT     = 0x08,
+}
+
+/*
+	Clock IDs for various system clocks.
+*/
+Clock_Id :: enum {
+	REALTIME           = 0,
+	MONOTONIC          = 1,
+	PROCESS_CPUTIME_ID = 2,
+	THREAD_CPUTIME_ID  = 3,
+	MONOTONIC_RAW      = 4,
+	REALTIME_COARSE    = 5,
+	MONOTONIC_COARSE   = 6,
+	BOOTTIME           = 7,
+	REALTIME_ALARM     = 8,
+	BOOTTIME_ALARM     = 9,
+}
+
+/*
+	Bits for POSIX interval timer flags.
+*/
+ITimer_Flags_Bits :: enum {
+	ABSTIME = 1,
+}
+
+/*
+	Bits for epoll_create(2) flags.
+*/
+EPoll_Flags_Bits :: enum {
+	FDCLOEXEC = 19,
+}
+
+EPoll_Event_Kind :: enum u32 {
+	IN        = 0x001,
+	PRI       = 0x002,
+	OUT       = 0x004,
+	RDNORM    = 0x040,
+	RDBAND    = 0x080,
+	WRNORM    = 0x100,
+	WRBAND    = 0x200,
+	MSG       = 0x400,
+	ERR       = 0x008,
+	HUP       = 0x010,
+	RDHUP     = 0x2000,
+	EXCLUSIVE = 1<<28,
+	WAKEUP    = 1<<29,
+	ONESHOT   = 1<<30,
+	ET        = 1<<31,
+}
+
+EPoll_Ctl_Opcode :: enum i32 {
+	ADD = 1,
+	DEL = 2,
+	MOD = 3,
+}

+ 166 - 29
core/sys/linux/constants.odin

@@ -1,26 +1,40 @@
 
 package linux
 
-/// Special file descriptor to pass to `*at` functions to specify
-/// that relative paths are relative to current directory
+/*
+	Special file descriptor to pass to `*at` functions to specify
+	that relative paths are relative to current directory.
+*/
 AT_FDCWD :: Fd(-100)
 
-/// Special value to put into timespec for utimensat() to set timestamp to the current time
+/*
+	Special value to put into timespec for utimensat() to set timestamp to the current time.
+*/
 UTIME_NOW  :: uint((1 << 30) - 1)
 
-/// Special value to put into the timespec for utimensat() to leave the corresponding field of the timestamp unchanged
+/*
+	Special value to put into the timespec for utimensat() to leave the corresponding field of the timestamp unchanged.
+*/
 UTIME_OMIT :: uint((1 << 30) - 2)
 
-/// For wait4: Pass this pid to wait for any process
+/*
+	For wait4: Pass this pid to wait for any process.
+*/
 WAIT_ANY    :: Pid(-1)
 
-/// For wait4: Pass this pid to wait for any process in current process group
+/*
+	For wait4: Pass this pid to wait for any process in current process group.
+*/
 WAIT_MYPGRP :: Pid(0)
 
-/// Maximum priority (aka nice value) for the process
+/*
+	Maximum priority (aka nice value) for the process.
+*/
 PRIO_MAX :: 20
 
-/// Minimum priority (aka nice value) for the process
+/*
+	Minimum priority (aka nice value) for the process.
+*/
 PRIO_MIN :: -20
 
 SIGRTMIN :: Signal(32)
@@ -35,40 +49,64 @@ S_IFCHR  :: Mode{.IFCHR}
 S_IFDIR  :: Mode{.IFDIR}
 S_IFREG  :: Mode{.IFREG}
 
-/// Checks the Mode bits to see if the file is a named pipe (FIFO)
+/*
+	Checks the Mode bits to see if the file is a named pipe (FIFO).
+*/
 S_ISFIFO :: #force_inline proc "contextless" (m: Mode) -> bool {return (S_IFFIFO  == (m & S_IFMT))}
 
-/// Check the Mode bits to see if the file is a character device
+/*
+	Check the Mode bits to see if the file is a character device.
+*/
 S_ISCHR  :: #force_inline proc "contextless" (m: Mode) -> bool {return (S_IFCHR  == (m & S_IFMT))}
-	
-/// Check the Mode bits to see if the file is a directory
+
+/*	
+	Check the Mode bits to see if the file is a directory.
+*/
 S_ISDIR  :: #force_inline proc "contextless" (m: Mode) -> bool {return (S_IFDIR  == (m & S_IFMT))}
 
-/// Check the Mode bits to see if the file is a register
+/*
+	Check the Mode bits to see if the file is a register.
+*/
 S_ISREG  :: #force_inline proc "contextless" (m: Mode) -> bool {return (S_IFREG  == (m & S_IFMT))}
 
-/// Check the Mode bits to see if the file is a socket
+/*
+	Check the Mode bits to see if the file is a socket.
+*/
 S_ISSOCK :: #force_inline proc "contextless" (m: Mode) -> bool {return (S_IFSOCK == (m & S_IFMT))}
 
-/// Check the Mode bits to see if the file is a symlink
+/*
+	Check the Mode bits to see if the file is a symlink.
+*/
 S_ISLNK  :: #force_inline proc "contextless" (m: Mode) -> bool {return (S_IFLNK  == (m & S_IFMT))}
 
-/// Check the Mode bits to see if the file is a block device
+/*
+	Check the Mode bits to see if the file is a block device.
+*/
 S_ISBLK  :: #force_inline proc "contextless" (m: Mode) -> bool {return (S_IFBLK  == (m & S_IFMT))}
 
-/// For access.2 syscall family: instruct to check if the file exists
+/*
+	For access.2 syscall family: instruct to check if the file exists.
+*/
 F_OK :: Mode{}
 
-/// For access.2 syscall family: instruct to check if the file is executable
+/*
+	For access.2 syscall family: instruct to check if the file is executable.
+*/
 X_OK :: Mode{.IXOTH}
 
-/// For access.2 syscall family: instruct to check if the file is writeable
+/*
+	For access.2 syscall family: instruct to check if the file is writeable.
+*/
 W_OK :: Mode{.IWOTH}
 
-/// For access.2 syscall family: instruct to check if the file is readable
+/*
+	For access.2 syscall family: instruct to check if the file is readable.
+*/
 R_OK :: Mode{.IROTH}
 
-/// The stats you get by calling `stat`
+/*
+	The stats you get by calling `stat`.
+*/
 STATX_BASIC_STATS :: Statx_Mask {
 	.TYPE,
 	.MODE,
@@ -83,6 +121,10 @@ STATX_BASIC_STATS :: Statx_Mask {
 	.BLOCKS,
 }
 
+/*
+	Tell `shmget` to create a new key
+*/
+IPC_PRIVATE :: Key(0)
 
 FCntl_Command_DUPFD            :: distinct FCntl_Command
 FCntl_Command_GETFD            :: distinct FCntl_Command
@@ -165,28 +207,44 @@ Futex_Wait_requeue_Pi_Type :: distinct Futex_Op
 Futex_Cmp_requeue_Pi_Type  :: distinct Futex_Op
 Futex_Lock_Pi2_Type        :: distinct Futex_Op
 
-/// Wait on futex wakeup signal
+/*
+	Wait on futex wakeup signal.
+*/
 FUTEX_WAIT            :: Futex_Wait_Type(.WAIT)
 
-/// Wake up other processes waiting on the futex
+/*
+	Wake up other processes waiting on the futex.
+*/
 FUTEX_WAKE            :: Futex_Wake_Type(.WAKE)
 
-/// Not implemented. Basically, since
+/*
+	Not implemented. Basically, since.
+*/
 FUTEX_FD              :: Futex_Fd_Type(.FD)
 
-/// Requeue waiters from one futex to another
+/*
+	Requeue waiters from one futex to another.
+*/
 FUTEX_REQUEUE         :: Futex_Requeue_Type(.REQUEUE)
 
-/// Requeue waiters from one futex to another if the value at mutex matches
+/*
+	Requeue waiters from one futex to another if the value at mutex matches.
+*/
 FUTEX_CMP_REQUEUE     :: Futex_Cmp_Requeue_Type(.CMP_REQUEUE)
 
-/// See man pages, I'm not describing it here
+/*
+	See man pages, I'm not describing it here.
+*/
 FUTEX_WAKE_OP         :: Futex_Wake_Op_Type(.WAKE_OP)
 
-/// Wait on a futex, but the value is a bitset
+/*
+	Wait on a futex, but the value is a bitset.
+*/
 FUTEX_WAIT_BITSET     :: Futex_Wait_Bitset_Type(.WAIT_BITSET)
 
-/// Wait on a futex, but the value is a bitset
+/*
+	Wait on a futex, but the value is a bitset.
+*/
 FUTEX_WAKE_BITSET     :: Futex_Wake_Bitset_Type(.WAKE_BITSET)
 
 // TODO(flysand): Priority inversion futexes
@@ -197,3 +255,82 @@ FUTEX_WAIT_REQUEUE_PI :: Futex_Wait_requeue_Pi_Type(.WAIT_REQUEUE_PI)
 FUTEX_CMP_REQUEUE_PI  :: Futex_Cmp_requeue_Pi_Type(.CMP_REQUEUE_PI)
 FUTEX_LOCK_PI2        :: Futex_Lock_Pi2_Type(.LOCK_PI2)
 
+PTrace_Traceme_Type                :: distinct PTrace_Request
+PTrace_Peek_Type                   :: distinct PTrace_Request
+PTrace_Poke_Type                   :: distinct PTrace_Request
+PTrace_Cont_Type                   :: distinct PTrace_Request
+PTrace_Kill_Type                   :: distinct PTrace_Request
+PTrace_Singlestep_Type             :: distinct PTrace_Request
+PTrace_Getregs_Type                :: distinct PTrace_Request
+PTrace_Setregs_Type                :: distinct PTrace_Request
+PTrace_Getfpregs_Type              :: distinct PTrace_Request
+PTrace_Setfpregs_Type              :: distinct PTrace_Request
+PTrace_Attach_Type                 :: distinct PTrace_Request
+PTrace_Detach_Type                 :: distinct PTrace_Request
+PTrace_Getfpxregs_Type             :: distinct PTrace_Request
+PTrace_Setfpxregs_Type             :: distinct PTrace_Request
+PTrace_Syscall_Type                :: distinct PTrace_Request
+PTrace_Get_Thread_Area_Type        :: distinct PTrace_Request
+PTrace_Set_Thread_Area_Type        :: distinct PTrace_Request
+PTrace_Arch_Prctl_Type             :: distinct PTrace_Request
+PTrace_Sysemu_Type                 :: distinct PTrace_Request
+PTrace_Sysemu_Singlestep_Type      :: distinct PTrace_Request
+PTrace_Singleblock_Type            :: distinct PTrace_Request
+PTrace_Setoptions_Type             :: distinct PTrace_Request
+PTrace_Geteventmsg_Type            :: distinct PTrace_Request
+PTrace_Getsiginfo_Type             :: distinct PTrace_Request
+PTrace_Setsiginfo_Type             :: distinct PTrace_Request
+PTrace_Getregset_Type              :: distinct PTrace_Request
+PTrace_Setregset_Type              :: distinct PTrace_Request
+PTrace_Seize_Type                  :: distinct PTrace_Request
+PTrace_Interrupt_Type              :: distinct PTrace_Request
+PTrace_Listen_Type                 :: distinct PTrace_Request
+PTrace_Peeksiginfo_Type            :: distinct PTrace_Request
+PTrace_Getsigmask_Type             :: distinct PTrace_Request
+PTrace_Setsigmask_Type             :: distinct PTrace_Request
+PTrace_Seccomp_Get_Filter_Type     :: distinct PTrace_Request
+PTrace_Seccomp_Get_Metadata_Type   :: distinct PTrace_Request
+PTrace_Get_Syscall_Info_Type       :: distinct PTrace_Request
+PTrace_Get_RSeq_Configuration_Type :: distinct PTrace_Request
+
+PTRACE_TRACEME                :: PTrace_Traceme_Type(.TRACEME)
+PTRACE_PEEKTEXT               :: PTrace_Peek_Type(.PEEKTEXT)
+PTRACE_PEEKDATA               :: PTrace_Peek_Type(.PEEKDATA)
+PTRACE_PEEKUSER               :: PTrace_Peek_Type(.PEEKUSER)
+PTRACE_POKETEXT               :: PTrace_Poke_Type(.POKETEXT)
+PTRACE_POKEDATA               :: PTrace_Poke_Type(.POKEDATA)
+PTRACE_POKEUSER               :: PTrace_Poke_Type(.POKEUSER)
+PTRACE_CONT                   :: PTrace_Cont_Type(.CONT)
+PTRACE_KILL                   :: PTrace_Kill_Type(.KILL)
+PTRACE_SINGLESTEP             :: PTrace_Singlestep_Type(.SINGLESTEP)
+PTRACE_GETREGS                :: PTrace_Getregs_Type(.GETREGS)
+PTRACE_SETREGS                :: PTrace_Setregs_Type(.SETREGS)
+PTRACE_GETFPREGS              :: PTrace_Getfpregs_Type(.GETFPREGS)
+PTRACE_SETFPREGS              :: PTrace_Setfpregs_Type(.SETFPREGS)
+PTRACE_ATTACH                 :: PTrace_Attach_Type(.ATTACH)
+PTRACE_DETACH                 :: PTrace_Detach_Type(.DETACH)
+PTRACE_GETFPXREGS             :: PTrace_Getfpxregs_Type(.GETFPXREGS)
+PTRACE_SETFPXREGS             :: PTrace_Setfpxregs_Type(.SETFPXREGS)
+PTRACE_SYSCALL                :: PTrace_Syscall_Type(.SYSCALL)
+PTRACE_GET_THREAD_AREA        :: PTrace_Get_Thread_Area_Type(.GET_THREAD_AREA)
+PTRACE_SET_THREAD_AREA        :: PTrace_Set_Thread_Area_Type(.SET_THREAD_AREA)
+PTRACE_ARCH_PRCTL             :: PTrace_Arch_Prctl_Type(.ARCH_PRCTL)
+PTRACE_SYSEMU                 :: PTrace_Sysemu_Type(.SYSEMU)
+PTRACE_SYSEMU_SINGLESTEP      :: PTrace_Sysemu_Singlestep_Type(.SYSEMU_SINGLESTEP)
+PTRACE_SINGLEBLOCK            :: PTrace_Singleblock_Type(.SINGLEBLOCK)
+PTRACE_SETOPTIONS             :: PTrace_Setoptions_Type(.SETOPTIONS)
+PTRACE_GETEVENTMSG            :: PTrace_Geteventmsg_Type(.GETEVENTMSG)
+PTRACE_GETSIGINFO             :: PTrace_Getsiginfo_Type(.GETSIGINFO)
+PTRACE_SETSIGINFO             :: PTrace_Setsiginfo_Type(.SETSIGINFO)
+PTRACE_GETREGSET              :: PTrace_Getregset_Type(.GETREGSET)
+PTRACE_SETREGSET              :: PTrace_Setregset_Type(.SETREGSET)
+PTRACE_SEIZE                  :: PTrace_Seize_Type(.SEIZE)
+PTRACE_INTERRUPT              :: PTrace_Interrupt_Type(.INTERRUPT)
+PTRACE_LISTEN                 :: PTrace_Listen_Type(.LISTEN)
+PTRACE_PEEKSIGINFO            :: PTrace_Peeksiginfo_Type(.PEEKSIGINFO)
+PTRACE_GETSIGMASK             :: PTrace_Getsigmask_Type(.GETSIGMASK)
+PTRACE_SETSIGMASK             :: PTrace_Setsigmask_Type(.SETSIGMASK)
+PTRACE_SECCOMP_GET_FILTER     :: PTrace_Seccomp_Get_Filter_Type(.SECCOMP_GET_FILTER)
+PTRACE_SECCOMP_GET_METADATA   :: PTrace_Seccomp_Get_Metadata_Type(.SECCOMP_GET_METADATA)
+PTRACE_GET_SYSCALL_INFO       :: PTrace_Get_Syscall_Info_Type(.GET_SYSCALL_INFO)
+PTRACE_GET_RSEQ_CONFIGURATION :: PTrace_Get_RSeq_Configuration_Type(.GET_RSEQ_CONFIGURATION)

File diff suppressed because it is too large
+ 548 - 176
core/sys/linux/sys.odin


+ 746 - 73
core/sys/linux/types.odin

@@ -1,56 +1,104 @@
 //+build linux
 package linux
 
-/// Represents storage device handle
+/*
+	Type for storage device handle.
+*/
 Dev :: distinct int
 
-/// Represents 32-bit user id
+/*
+	Type for 32-bit User IDs.
+*/
 Uid :: distinct u32
 
-/// Represents 32-bit group id
+/*
+	Type for 32-bit Group IDs.
+*/
 Gid :: distinct u32
 
-/// Process id's
+/*
+	Type for Process IDs, Thread IDs, Thread group ID.
+*/
 Pid :: distinct int
 
-/// Represents pid, pifd, pgid values in general
+/*
+	Type for any of: pid, pidfd, pgid.
+*/
 Id :: distinct uint
 
-/// Represents a file descriptor
+/*
+	Represents a file descriptor.
+*/
 Fd  :: distinct i32
 
-/// Represents a PID file descriptor
+/*
+	Type for PID file descriptors.
+*/
 Pid_FD :: distinct i32
 
-/// Represents 64-bit inode number for files
-/// Used pretty much only in struct Stat64 for 32-bit platforms
+/*
+	Type for 64-bit inode number for files.
+	Used pretty much only in struct Stat64 for 32-bit platforms.
+*/
 Inode :: distinct u64
 
-/// Represents time with nanosecond precision
+/*
+	Shared memory identifiers used by shmget(2) and other calls.
+*/
+Key :: distinct i32
+
+/*
+	Represents timer IDs.
+*/
+Timer :: distinct i32
+
+/*
+	Represents time with nanosecond precision.
+*/
 Time_Spec :: struct {
 	time_sec:  uint,
 	time_nsec: uint,
 }
 
-/// Represents time with millisecond precision
+/*
+	Represents time with millisecond precision.
+*/
 Time_Val :: struct {
 	seconds:      int,
 	microseconds: int,
 }
 
-/// open.2 flags
+/*
+	Access and modification times for files
+*/
+UTim_Buf :: struct {
+	actime:  uint,
+	modtime: uint,
+}
+
+/*
+	Flags for open(2).
+*/
 Open_Flags :: bit_set[Open_Flags_Bits; u32]
 
-/// Flags for the file descriptor to be passed in some syscalls
+/*
+	Flags for the file descriptors.
+*/
 FD_Flags :: bit_set[FD_Flags_Bits; i32]
 
-/// Represents file's permission and status bits
-/// Example:
-///   When you're passing a value of this type the recommended usage is
-///     sys.Mode{.S_IXOTH, .S_IROTH} | sys.S_IRWXU | sys.S_IRWXG
-///   This would generate a mode that has full permissions for the
-///   file's owner and group, and only "read" and "execute" bits
-///   for others.
+/*
+	Represents file's permission and status bits
+**Example:**
+	When you're passing a value of this type the recommended usage is:
+	
+	```
+	  linux.Mode{.S_IXOTH, .S_IROTH} | linux.S_IRWXU | linux.S_IRWXG
+	```
+	  
+	This would generate a mode that has full permissions for the
+	file's owner and group, and only "read" and "execute" bits
+	for others.
+*/
 Mode :: bit_set[Mode_Bits; u32]
 
 when ODIN_ARCH == .amd64 {
@@ -111,29 +159,38 @@ when ODIN_ARCH == .amd64 {
 	}
 }
 
-/// Represents the file state.
-/// Mirrors struct stat in glibc/linux kernel.
-/// If you're on 32-bit platform, consider using Stat64 instead
+/*
+	Represents the file state.
+	If you're on 32-bit platform, consider using Stat64 instead.
+*/
 Stat :: struct {
 	using _impl_stat: _Arch_Stat,
 }
 
-/// Timestamp type used for Statx struct
+/*
+	Timestamp type used for Statx struct
+*/
 Statx_Timestamp :: struct {
 	sec:  i64,
 	nsec: u32,
 	_:       i32,
 }
 
-/// Query params/results for `statx()`
+/*
+	Query params/results for `statx()`.
+*/
 Statx_Mask :: bit_set[Statx_Mask_Bits; u32]
 
-/// File attributes, returned by statx. This bitset is also
-/// used to specify which attributes are present, not just
-/// their value.
+/*
+	File attributes, returned by statx. This bitset is also
+	used to specify which attributes are present, not just
+	their value.
+*/
 Statx_Attr :: bit_set[Statx_Attr_Bits; u64]
 
-/// The extended Stat struct
+/*
+	The extended Stat struct, the argument to statx(2) syscall.
+*/
 Statx :: struct {
 	mask:                Statx_Mask,
 	blksize:             u32,
@@ -165,7 +222,9 @@ Statx :: struct {
 	_:                   [12]u64,
 }
 
-/// Mount flags for filesystem
+/*
+	Mount flags for filesystem.
+*/
 FS_Flags :: bit_set[FS_Flags_Bits; u32]
 
 when size_of(int) == 8 {
@@ -205,19 +264,28 @@ when size_of(int) == 8 {
 	}
 }
 
+/*
+	Struct for statfs(2).
+*/
 Stat_FS :: struct {
 	using _impl_stat_fs: _Arch_Stat_FS,
 }
 
-/// Flags for close_range.2
+/*
+	Flags for close_range(2).
+*/
 Close_Range_Flags :: bit_set[Close_Range_Flags_Bits; u32]
 
-/// Flags for rename.2
+/*
+	Flags for rename(2).
+*/
 Rename_Flags :: bit_set[Rename_Flags_Bits; u32]
 
-/// Directory entry
-/// Recommended to use this with dirent_iterator()
-/// and dirent_name()
+/*
+	Directory entry record.
+	Recommended iterate these with `dirent_iterator()`,
+	and obtain the name via `dirent_name()`.
+*/
 Dirent :: struct {
 	ino:    Inode,
 	off:    i64,
@@ -226,7 +294,9 @@ Dirent :: struct {
 	name:   [0]u8, // See dirent_name
 }
 
-/// Lock record for fcntl.2
+/*
+	Lock record for fcntl(2).
+*/
 FLock :: struct {
 	type:   FLock_Type,
 	whence: Seek_Whence,
@@ -235,50 +305,83 @@ FLock :: struct {
 	pid:    Pid,
 }
 
-/// Flags for fcntl_notify
+/*
+	File locking operations.
+	Use one of `EX`, `RW` or `UN` to specify the operation, and add `UN` if
+	you need a non-blocking operation.
+*/
+FLock_Op :: bit_set[FLock_Op_Bits; i32]
+
+/*
+	Flags for `fcntl_notify()`.
+*/
 FD_Notifications :: bit_set[FD_Notifications_Bits; i32]
 
-/// Seals for fcntl_add_seals
+/*
+	Seals for `fcntl_add_seals()`.
+*/
 Seal :: bit_set[Seal_Bits; i32]
 
-/// Represents owner that receives events on file updates
+/*
+	Represents owner that receives events on file updates.
+*/
 F_Owner :: struct {
 	type: F_Owner_Type,
 	pid:  Pid,
 }
 
-/// Events for ppoll
+/*
+	Events for ppoll(2).
+*/
 Fd_Poll_Events :: bit_set[Fd_Poll_Events_Bits; u16]
 
-/// Struct for ppoll
+/*
+	Struct for ppoll(2).
+*/
 Poll_Fd :: struct {
 	fd:      Fd,
 	events:  Fd_Poll_Events,
 	revents: Fd_Poll_Events,
 }
 
-/// Specifies protection for memory pages
+/*
+	Specifies protection for memory pages.
+*/
 Mem_Protection :: bit_set[Mem_Protection_Bits; i32]
 
-/// Flags for mmap
+/*
+	Flags for mmap.
+*/
 Map_Flags :: bit_set[Map_Flags_Bits; i32]
 
-/// Flags for mlock.2
+/*
+	Flags for mlock(2).
+*/
 MLock_Flags :: bit_set[MLock_Flags_Bits; u32]
 
-/// Flags for msync.2
+/*
+	Flags for msync(2).
+*/
 MSync_Flags :: bit_set[MSync_Flags_Bits; i32]
 
-/// Access rights for pkey_alloc.2
+/*
+	Access rights for pkey_alloc(2).
+*/
 PKey_Access_Rights :: bit_set[PKey_Access_Bits; u32]
 
-/// Flags for mremap.2
+/*
+	Flags for mremap(2).
+*/
 MRemap_Flags :: bit_set[MRemap_Flags_Bits; i32]
 
-/// Flags for getrandom syscall
+/*
+	Flags for getrandom(2) syscall.
+*/
 Get_Random_Flags :: bit_set[Get_Random_Flags_Bits; i32]
 
-/// Flags for perf_event_open syscall
+/*
+	Flags for perf_event_open(2) syscall.
+*/
 Perf_Flags :: bit_set[Perf_Flags_Bits; uint]
 
 Perf_Event_Flags :: distinct bit_set[Perf_Event_Flags_Bits; u64]
@@ -289,10 +392,14 @@ Perf_Cap_Flags :: distinct bit_set[Perf_Cap_Flags_Bits; u64]
 
 Perf_Event_Sample_Type :: bit_set[Perf_Event_Sample_Type_Bits; u64]
 
-/// Specifies which branches to include in branch record
+/*
+	Specifies which branches to include in branch record.
+*/
 Branch_Sample_Type :: bit_set[Branch_Sample_Type_Bits; u64]
 
-/// The struct for perf_event_open
+/*
+	The struct for perf_event_open.
+*/
 Perf_Event_Attr :: struct #packed {
 	type:               Perf_Event_Type,
 	size:               u32,
@@ -336,7 +443,9 @@ Perf_Event_Attr :: struct #packed {
 	_:                  u16,
 }
 
-/// The ring buffer structure when mmaping Perf_Event_Attr
+/*
+	The ring buffer structure when mmaping Perf_Event_Attr.
+*/
 Perf_Event_Mmap_Page :: struct #packed {
 	version:        u32,
 	compat_version: u32,
@@ -371,10 +480,14 @@ Perf_Event_Mmap_Page :: struct #packed {
 
 // TODO(flysand): Its taking too much effort to bind the other data structures related to perf_event_open
 
-/// Options for wait4() and waitpid()
+/*
+	Options for wait4(2) and waitpid(2).
+*/
 Wait_Options :: bit_set[Wait_Option; i32]
 
-/// Flags for pidfd_open.2
+/*
+	Flags for pidfd_open(2).
+*/
 Pid_FD_Flags :: bit_set[Pid_FD_Flags_Bits; i32]
 
 // Note(flysand): these could, in principle be implemented with bitfields,
@@ -441,6 +554,28 @@ Sig_Info :: struct #packed {
 	},
 }
 
+SIGEV_MAX_SIZE :: 64
+SIGEV_PAD_SIZE :: ((SIGEV_MAX_SIZE-size_of(i32)*2+size_of(Sig_Val))/size_of(i32))
+
+Sig_Val :: struct #raw_union {
+	sival_int: i32,
+	sival_ptr: rawptr,
+}
+
+Sig_Event :: struct {
+	value:  Sig_Val,
+	signo:  i32,
+	notify: i32,
+	using _: struct #raw_union {
+		_: [SIGEV_PAD_SIZE]u32,
+		thread_id: Pid,
+		using _: struct {
+			notify_function:  #type proc "c" (val: Sig_Val),
+			notify_attribute: rawptr,
+		},
+	},
+}
+
 Sig_Stack_Flags :: bit_set[Sig_Stack_Flag; i32]
 
 Sig_Stack :: struct {
@@ -459,27 +594,36 @@ Sig_Action :: struct($T: typeid) {
 	mask: Sig_Set,
 }
 
-
-/// Flags for the socket file descriptor
-/// Note, on linux these are technically passed by OR'ing together
-/// with Socket_Type, our wrapper does this under the hood.
+/*
+	Flags for the socket file descriptor.
+	Note, on linux these are technically passed by OR'ing together
+	with Socket_Type, our wrapper does this under the hood.
+*/
 Socket_FD_Flags :: bit_set[Socket_FD_Flags_Bits; int]
 
-/// Address family for the socket
-/// Typically there's one address family for every protocol family
+/*
+	Address family for the socket.
+	Typically there's one address family for every protocol family.
+*/
 Address_Family :: distinct Protocol_Family
 
-/// Flags for the socket for send/recv calls
+/*
+	Flags for the socket for send/recv calls.
+*/
 Socket_Msg :: bit_set[Socket_Msg_Bits; i32]
 
-/// Struct representing IPv4 socket address
+/*
+	Struct representing IPv4 socket address.
+*/
 Sock_Addr_In :: struct #packed {
 	sin_family: Address_Family,
 	sin_port:   u16be,
 	sin_addr:   [4]u8,
 }
 
-/// Struct representing IPv6 socket address
+/*
+	Struct representing IPv6 socket address.
+*/
 Sock_Addr_In6 :: struct #packed {
 	sin6_family:   Address_Family,
 	sin6_port:     u16be,
@@ -488,7 +632,9 @@ Sock_Addr_In6 :: struct #packed {
 	sin6_scope_id: u32,
 }
 
-/// Struct representing an arbitrary socket address
+/*
+	Struct representing an arbitrary socket address.
+*/
 Sock_Addr_Any :: struct #raw_union {
 	using _: struct {
 		family: Address_Family,
@@ -498,13 +644,38 @@ Sock_Addr_Any :: struct #raw_union {
 	using ipv6: Sock_Addr_In6,
 }
 
-/// Just an alias to make futex-values more visible
+/*
+	Message header for sendmsg/recvmsg
+*/
+Msg_Hdr :: struct {
+	name:       rawptr,
+	namelen:    i32,
+	iov:        []IO_Vec, // ptr followed by length, abi matches
+	control:    []u8,
+	flags:      Socket_Msg,
+}
+
+/*
+	Multiple message header for sendmmsg/recvmmsg
+*/
+MMsg_Hdr :: struct {
+	hdr: Msg_Hdr,
+	len: u32,
+}
+
+/*
+	Just an alias to make futex-values more visible
+*/
 Futex :: u32
 
-/// Flags for the futex (they are kept separately)
+/*
+	Flags for the futex (they are kept separately)
+*/
 Futex_Flags :: bit_set[Futex_Flags_Bits; u32]
 
-/// Times
+/*
+	Times
+*/
 Tms :: struct {
 	tms_utime:  int,
 	tms_stime:  int,
@@ -512,8 +683,10 @@ Tms :: struct {
 	tms_cstime: int,
 }
 
-/// "Unix time-sharing system name", allegedly
-/// Basically system info
+/*
+	"Unix time-sharing system name", allegedly.
+	Basically system info.
+*/
 UTS_Name :: struct {
 	sysname:    [65]u8 `fmt:"s,0"`,
 	nodename:   [65]u8 `fmt:"s,0"`,
@@ -523,7 +696,9 @@ UTS_Name :: struct {
 	domainname: [65]u8 `fmt:"s,0"`,
 }
 
-/// Return buffer for the sysinfo syscall
+/*
+	Return buffer for the sysinfo syscall
+*/
 Sys_Info :: struct {
 	uptime:    int,
 	loads:     [3]int,
@@ -540,14 +715,17 @@ Sys_Info :: struct {
 	_padding:  [20 - (2 * size_of(int)) - size_of(i32)]u8,
 }
 
-/// Resource limit
+/*
+	Resource limit
+*/
 RLimit :: struct {
 	cur: uint,
 	max: uint,
 }
 
-/// Structure representing how much of each resource
-/// got used.
+/*
+	Structure representing how much of each resource got used.
+*/	
 RUsage :: struct {
 	utime:         Time_Val,
 	stime:         Time_Val,
@@ -566,3 +744,498 @@ RUsage :: struct {
 	nvcsw_word:    int,
 	nivcsw_word:   int,
 }
+
+/*
+	Struct used for IO operations
+*/
+IO_Vec :: struct {
+	base: rawptr,
+	len:  uint,
+}
+
+/*
+	Access mode for shared memory
+*/
+IPC_Mode :: bit_set[IPC_Mode_Bits; u32]
+
+/*
+	Flags used by IPC objects
+*/
+IPC_Flags :: bit_set[IPC_Flags_Bits; i16]
+
+/*
+	Permissions for IPC objects
+*/
+IPC_Perm :: struct {
+	key:  Key,
+	uid:  u32,
+	gid:  u32,
+	cuid: u32,
+	cgid: u32,
+	mode: IPC_Mode,
+	seq:  u16,
+	_:    [2 + 2*size_of(int)]u8,
+}
+
+when size_of(int) == 8 || ODIN_ARCH == .i386 {
+	// 32-bit and 64-bit x86, 64-bit arm
+	_Arch_Shmid_DS :: struct {
+		perm:   IPC_Perm,
+		segsz:  uint,
+		atime:  int,
+		dtime:  int,
+		ctime:  int,
+		cpid:   Pid,
+		lpid:   Pid,
+		nattch: uint,
+		_:      [2]uint,
+	}
+} else {
+	// Other 32-bit platforms
+	// NOTE(flysand): I'm not risking assuming it's little endian...
+	_Arch_Shmid_DS :: struct {
+		perm:       IPC_Perm,
+		segsz:      uint,
+		atime:      uint,
+		atime_high: uint,
+		dtime:      uint,
+		dtime_high: uint,
+		ctime:      uint,
+		ctime_high: uint,
+		cpid:       Pid,
+		lpid:       Pid,
+		nattach:    uint,
+		_:          [2]uint,        
+	}
+}
+
+/*
+	SystemV shared memory data.
+*/
+Shmid_DS :: _Arch_Shmid_DS
+
+/*
+	SystemV shared memory info.
+*/
+Shm_Info :: struct {
+	used_ids:       i32,
+	shm_tot:        uint,
+	shm_rss:        uint,
+	shm_swp:        uint,
+	swap_attempts:  uint,
+	swap_successes: uint,
+}
+
+/*
+	SystemV semaphore operation.
+*/
+Sem_Buf :: struct {
+	num: u16,
+	op:  IPC_Cmd,
+	flg: IPC_Flags,
+}
+
+when ODIN_ARCH == .i386 {
+	_Arch_Semid_DS :: struct {
+		perm:       IPC_Perm,
+		otime:      uint,
+		otime_high: uint,
+		ctime:      uint,
+		ctime_high: uint,
+		nsems:      uint,
+		_:          [2]uint,
+	}
+} else when ODIN_ARCH == .amd64 {
+	_Arch_Semid_DS :: struct {
+		perm:       IPC_Perm,
+		otime:      int,
+		ctime:      int,
+		nsems:      uint,
+		_:          [2]uint,
+	}
+} else when ODIN_ARCH == .arm32 {
+	_Arch_Semid_DS :: struct {
+		perm:       IPC_Perm,
+		otime:      uint,
+		otime_high: uint,
+		ctime:      uint,
+		ctime_high: uint,
+		nsems:      uint,
+		_:          [2]uint,
+	}
+} else when ODIN_ARCH == .arm64 {
+	_Arch_Semid_DS :: struct {
+		perm:       IPC_Perm,
+		otime:      int,
+		ctime:      int,
+		sem_nsems:  uint,
+		__unused3:  uint,
+		__unused4:  uint,
+	}
+}
+
+/*
+	Architecture-specific semaphore data.
+*/
+Semid_DS :: _Arch_Semid_DS
+
+/*
+	Argument for semctl functions
+*/
+Sem_Un :: struct #raw_union {
+	val:   i32,
+	buf:   rawptr,
+	array: u16,
+	__buf: Sem_Info,
+	_:     uintptr,
+}
+
+/*
+	SystenV semaphore info.
+*/
+Sem_Info :: struct {
+	semmap: i32,
+	mni: i32,
+	mns: i32,
+	mnu: i32,
+	msl: i32,
+	opm: i32,
+	ume: i32,
+	usz: i32,
+	vmx: i32,
+	aem: i32,
+}
+
+/*
+	Template for the struct used for sending and receiving messages
+*/
+Msg_Buf :: struct {
+	type: int,
+	text: [0]u8,
+}
+
+/*
+	SystemV message queue data.
+*/
+Msqid_DS :: struct {
+	perm:   IPC_Perm,
+	stime:  uint,
+	rtime:  uint,
+	ctime:  uint,
+	cbytes: uint,
+	qnum:   uint,
+	qbytes: uint,
+	lspid:  Pid,
+	lrpid:  Pid,
+	_:      [2]uint,
+}
+
+/*
+	Interval timer types
+*/
+ITimer_Which :: enum {
+	REAL    = 0,
+	VIRTUAL = 1,
+	PROF    = 2,
+}
+
+/*
+	Interval timer value
+*/
+ITimer_Val :: struct {
+	interval: Time_Val,
+	value:    Time_Val,
+}
+
+ITimer_Spec :: struct {
+	interval: Time_Spec,
+	value:    Time_Spec,
+}
+
+/*
+	Flags for POSIX interval timers.
+*/
+ITimer_Flags :: bit_set[ITimer_Flags_Bits; u32]
+
+when ODIN_ARCH == .arm32 {
+	_Arch_User_Regs :: struct {
+		cpsr:             uint,
+		pc:               uint,
+		lr:               uint,
+		sp:               uint,
+		ip:               uint,
+		fp:               uint,
+		r10:              uint,
+		r9:               uint,
+		r8:               uint,
+		r7:               uint,
+		r6:               uint,
+		r5:               uint,
+		r4:               uint,
+		r3:               uint,
+		r2:               uint,
+		r1:               uint,
+		r0:               uint,
+		ORIG_r0:          uint,
+	}
+	// TODO(flysand): Idk what to do about these, couldn't find their
+	// definitions
+	_Arch_User_FP_Regs :: struct {}
+	_Arch_User_FPX_Regs :: struct {}
+} else when ODIN_ARCH == .arm64 {
+	_Arch_User_Regs :: struct {
+		regs:             [31]uint,
+		sp:               uint,
+		pc:               uint,
+		pstate:           uint,
+	}
+	_Arch_User_FP_Regs :: struct {
+		vregs:            [32]u128,
+		fpsr:             u32,
+		fpcr:             u32,
+		_:                [2]u32,
+	}
+	_Arch_User_FPX_Regs :: struct {}
+} else when ODIN_ARCH == .i386 {
+	_Arch_User_Regs :: struct {
+		ebx:              uint,
+		ecx:              uint,
+		edx:              uint,
+		esi:              uint,
+		edi:              uint,
+		ebp:              uint,
+		eax:              uint,
+		xds:              uint,
+		xes:              uint,
+		xfs:              uint,
+		xgs:              uint,
+		orig_eax:         uint,
+		eip:              uint,
+		xcs:              uint,
+		eflags:           uint,
+		esp:              uint,
+		xss:              uint,
+	}
+	// x87 FPU state
+	_Arch_User_FP_Regs :: struct {
+		cwd:              uint,
+		swd:              uint,
+		twd:              uint,
+		fip:              uint,
+		fcs:              uint,
+		foo:              uint,
+		fos:              uint,
+		st_space:         [20]uint,
+	}
+	// FXSR instruction set state
+	_Arch_User_FPX_Regs :: struct {
+		cwd:              u16,
+		swd:              u16,
+		twd:              u16,
+		fop:              u16,
+		fip:              uint,
+		fcs:              uint,
+		foo:              uint,
+		fos:              uint,
+		mxcsr:            uint,
+		_:                uint,
+		st_space:         [32]uint,
+		xmm_space:        [32]uint,
+		padding:          [56]uint,
+	}
+} else when ODIN_ARCH == .amd64 {
+	_Arch_User_Regs :: struct {
+		// Callee-preserved, may not be correct if the syscall doesn't need
+		// these registers
+		r15:              uint,
+		r14:              uint,
+		r13:              uint,
+		r12:              uint,
+		rbp:              uint,
+		rbx:              uint,
+		// Always saved
+		r11:              uint,
+		r10:              uint,
+		r9:               uint,
+		r8:               uint,
+		rax:              uint,
+		rcx:              uint,
+		rdx:              uint,
+		rsi:              uint,
+		rdi:              uint,
+		// On syscall entry this is the syscall number, on CPU exception this
+		// is the error code, on hardware interrupt this is its IRQ number
+		orig_rax:         uint,
+		// Return frame for iretq
+		rip:              uint,
+		cs:               uint,
+		eflags:           uint,
+		rsp:              uint,
+		ss:               uint,
+	}
+	// All floating point state
+	_Arch_User_FP_Regs :: struct {
+		cwd:              u16,
+		swd:              u16,
+		twd:              u16,
+		fop:              u16,
+		rip:              uint,
+		rdp:              uint,
+		mxcsr:            u32,
+		mxcsr_mask:       u32,
+		st_space:         [32]u32,
+		xmm_space:        [64]u32,
+		_:                [24]u32,
+	}
+	// FXSR instruction set state
+	_Arch_User_FPX_Regs :: struct {
+		cwd:              u16,
+		swd:              u16,
+		twd:              u16,
+		fop:              u16,
+		fip:              uint,
+		fcs:              uint,
+		foo:              uint,
+		fos:              uint,
+		mxcsr:            uint,
+		_:                uint,
+		st_space:         [32]uint,
+		xmm_space:        [32]uint,
+		padding:          [56]uint,
+	}
+}
+
+/*
+	Architecture-specific registers struct.
+*/
+User_Regs :: _Arch_User_Regs
+
+/*
+	Architecture-specific floating-point registers
+*/
+User_FP_Regs :: _Arch_User_FP_Regs
+
+/*
+	Architecture-specific extended floating-point registers.
+	Currently only used for x86 CPU's.
+*/
+User_FPX_Regs :: _Arch_User_FPX_Regs
+
+/*
+	ptrace options.
+*/
+PTrace_Options :: bit_set[PTrace_Options_Bits; u32]
+
+/*
+	ptrace's PEEKSIGINFO argument.
+*/
+PTrace_Peek_Sig_Info_Args :: struct {
+	off:   u64,
+	flags: PTrace_Peek_Sig_Info_Flags,
+	nr:    i32,
+}
+
+/*
+	ptrace's PEEKSIGINFO flags.
+*/
+PTrace_Peek_Sig_Info_Flags :: bit_set[PTrace_Peek_Sig_Info_Flags_Bits; u32]
+
+/*
+	ptrace's SECCOMP metadata.
+*/
+PTrace_Seccomp_Metadata :: struct {
+	filter_off: u64,
+	flags:      u64,
+}
+
+/*
+	ptrace's results of GET_SYSCALL_INFO.
+*/
+PTrace_Syscall_Info :: struct {
+	op:                  PTrace_Get_Syscall_Info_Op,
+	arch:                u32, // TODO: AUDIT_ARCH*
+	instruction_pointer: u64,
+	stack_pointer:       u64,
+	using _: struct #raw_union {
+		entry: struct {
+			nr:       u64,
+			args:     [6]u64,
+		},
+		exit: struct {
+			rval:     i64,
+			is_error: b8,
+		},
+		seccomp: struct {
+			nr:       u64,
+			args:     [6]u64,
+			ret_data: u32,
+		},
+	},
+}
+
+/*
+	ptrace's results of GET_RSEQ_CONFIGURATION.
+*/
+PTrace_RSeq_Configuration :: struct {
+	rseq_abi_pointer: u64,
+	rseq_abi_size:    u32,
+	signature:        u32,
+	flags:            u32,
+	_:                u32,
+}
+
+/*
+	Note types for PTRACE_GETREGSET. Mirrors constants in `elf` definition,
+	files though this enum only contains the constants defined for architectures
+	Odin can compile to.
+*/
+PTrace_Note_Type :: enum {
+	NT_PRSTATUS             = 1,
+	NT_PRFPREG              = 2,
+	NT_PRPSINFO             = 3,
+	NT_TASKSTRUCT           = 4,
+	NT_AUXV                 = 6,
+	NT_SIGINFO              = 0x53494749,
+	NT_FILE                 = 0x46494c45,
+	NT_PRXFPREG             = 0x46e62b7f,
+	NT_386_TLS              = 0x200,
+	NT_386_IOPERM           = 0x201,
+	NT_X86_XSTATE           = 0x202,
+	NT_X86_SHSTK            = 0x204,
+	NT_ARM_VFP              = 0x400,
+	NT_ARM_TLS              = 0x401,
+	NT_ARM_HW_BREAK         = 0x402,
+	NT_ARM_HW_WATCH         = 0x403,
+	NT_ARM_SYSTEM_CALL      = 0x404,
+	NT_ARM_SVE              = 0x405,
+	NT_ARM_PAC_MASK         = 0x406,
+	NT_ARM_PACA_KEYS        = 0x407,
+	NT_ARM_PACG_KEYS        = 0x408,
+	NT_ARM_TAGGED_ADDR_CTRL = 0x409,
+	NT_ARM_PAC_ENABLED_KEYS = 0x40a,
+	NT_ARM_SSVE             = 0x40b,
+	NT_ARM_ZA               = 0x40c,
+	NT_ARM_ZT               = 0x40d,
+}
+
+/*
+	Flags for splice(2) and tee(2) syscalls.
+*/
+Splice_Flags :: bit_set[Splice_Flags_Bits; u32]
+
+/*
+	Flags for epoll_create(2) syscall.
+*/
+EPoll_Flags :: bit_set[EPoll_Flags_Bits; i32]
+
+EPoll_Data :: struct #raw_union {
+	ptr: rawptr,
+	fd:  Fd,
+	u32: u32,
+	u64: u64,
+}
+
+EPoll_Event :: struct #packed {
+	events: EPoll_Event_Kind,
+	data:   EPoll_Data,
+}

+ 7 - 2
core/sys/windows/advapi32.odin

@@ -5,7 +5,7 @@ foreign import advapi32 "system:Advapi32.lib"
 
 HCRYPTPROV :: distinct HANDLE
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign advapi32 {
 	@(link_name = "SystemFunction036")
 	RtlGenRandom :: proc(RandomBuffer: ^u8, RandomBufferLength: ULONG) -> BOOLEAN ---
@@ -13,13 +13,18 @@ foreign advapi32 {
 	                         DesiredAccess: DWORD,
 	                         TokenHandle: ^HANDLE) -> BOOL ---
 
+	OpenThreadToken :: proc(ThreadHandle:  HANDLE,
+	                        DesiredAccess: DWORD,
+	                        OpenAsSelf:    BOOL,
+	                        TokenHandle:   ^HANDLE) -> BOOL ---
+
 	CryptAcquireContextW :: proc(hProv: ^HCRYPTPROV, szContainer, szProvider: wstring, dwProvType, dwFlags: DWORD) -> DWORD ---
 	CryptGenRandom       :: proc(hProv: HCRYPTPROV, dwLen: DWORD, buf: LPVOID) -> DWORD ---
 	CryptReleaseContext  :: proc(hProv: HCRYPTPROV, dwFlags: DWORD) -> DWORD ---
 }
 
 // Necessary to create a token to impersonate a user with for CreateProcessAsUser
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign advapi32 {
 	LogonUserW :: proc(
 		lpszUsername: LPCWSTR,

+ 1 - 1
core/sys/windows/bcrypt.odin

@@ -5,7 +5,7 @@ foreign import bcrypt "system:Bcrypt.lib"
 
 BCRYPT_USE_SYSTEM_PREFERRED_RNG: DWORD : 0x00000002
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign bcrypt {
 	BCryptGenRandom :: proc(hAlgorithm: LPVOID, pBuffer: [^]u8, cbBuffer: ULONG, dwFlags: ULONG) -> LONG ---
 }

+ 1 - 1
core/sys/windows/bluetooth.odin

@@ -51,7 +51,7 @@ BLUETOOTH_DEVICE_INFO :: struct {
 	name:          [BLUETOOTH_MAX_NAME_SIZE]u16, //  Name of the device
 }
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign bthprops {
 	/*
 		Version

+ 1 - 1
core/sys/windows/comctl32.odin

@@ -3,7 +3,7 @@ package sys_windows
 
 foreign import "system:Comctl32.lib"
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign Comctl32 {
 	LoadIconWithScaleDown :: proc(hinst: HINSTANCE, pszName: PCWSTR, cx: c_int, cy: c_int, phico: ^HICON) -> HRESULT ---
 }

+ 2 - 2
core/sys/windows/comdlg32.odin

@@ -3,7 +3,7 @@ package sys_windows
 
 foreign import "system:Comdlg32.lib"
 
-LPOFNHOOKPROC :: #type proc "stdcall" (hdlg: HWND, msg: u32, wparam: WPARAM, lparam: LPARAM) -> UINT_PTR
+LPOFNHOOKPROC :: #type proc "system" (hdlg: HWND, msg: u32, wparam: WPARAM, lparam: LPARAM) -> UINT_PTR
 
 OPENFILENAMEW :: struct {
 	lStructSize: 	        DWORD,
@@ -31,7 +31,7 @@ OPENFILENAMEW :: struct {
 	FlagsEx:                DWORD,
 }
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign Comdlg32 {
 	GetOpenFileNameW     :: proc(arg1: ^OPENFILENAMEW) -> BOOL ---
 	GetSaveFileNameW     :: proc(arg1: ^OPENFILENAMEW) -> BOOL ---

+ 2 - 2
core/sys/windows/dbghelp.odin

@@ -44,7 +44,7 @@ MINIDUMP_USER_STREAM_INFORMATION :: struct {
 	UserStreamArray: ^MINIDUMP_USER_STREAM,
 }
 
-MINIDUMP_CALLBACK_ROUTINE :: #type proc "stdcall" (
+MINIDUMP_CALLBACK_ROUTINE :: #type proc "system" (
 	CallbackParam: PVOID,
 	CallbackInput: ^MINIDUMP_CALLBACK_INPUT,
 	CallbackOutpu: ^MINIDUMP_CALLBACK_OUTPUT,
@@ -228,7 +228,7 @@ MINIDUMP_TYPE :: enum u32 {
 	ValidTypeFlags                 = 0x01ffffff,
 }
 
-@(default_calling_convention = "stdcall")
+@(default_calling_convention = "system")
 foreign Dbghelp {
 	MiniDumpWriteDump :: proc(
 		hProcess:        HANDLE,

+ 1 - 1
core/sys/windows/dnsapi.odin

@@ -3,7 +3,7 @@ package sys_windows
 
 foreign import "system:Dnsapi.lib"
 
-@(default_calling_convention="std")
+@(default_calling_convention="system")
 foreign Dnsapi {
     DnsQuery_UTF8 :: proc(name: cstring, type: u16, options: DWORD, extra: PVOID, results: ^^DNS_RECORD, reserved: PVOID) -> DNS_STATUS ---
     DnsRecordListFree :: proc(list: ^DNS_RECORD, options: DWORD) ---

+ 1 - 1
core/sys/windows/dwmapi.odin

@@ -38,7 +38,7 @@ DWMNCRENDERINGPOLICY :: enum {
 	DWMNCRP_LAST,
 }
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign dwmapi {
 	DwmFlush :: proc() -> HRESULT ---
 	DwmIsCompositionEnabled :: proc(pfEnabled: ^BOOL) -> HRESULT ---

+ 1 - 1
core/sys/windows/gdi32.odin

@@ -3,7 +3,7 @@ package sys_windows
 
 foreign import gdi32 "system:Gdi32.lib"
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign gdi32 {
 	GetStockObject :: proc(i: c_int) -> HGDIOBJ ---
 	SelectObject :: proc(hdc: HDC, h: HGDIOBJ) -> HGDIOBJ ---

+ 134 - 0
core/sys/windows/hidpi.odin

@@ -0,0 +1,134 @@
+// +build windows
+package sys_windows
+import "core:c"
+
+USAGE :: distinct USHORT
+PUSAGE :: ^USAGE
+
+HIDP_CAPS :: struct {
+	Usage: USAGE,
+	UsagePage: USAGE,
+	InputReportByteLength: USHORT,
+	OutputReportByteLength: USHORT,
+	FeatureReportByteLength: USHORT,
+	Reserved: [17]USHORT,
+	NumberLinkCollectionNodes: USHORT,
+	NumberInputButtonCaps: USHORT,
+	NumberInputValueCaps: USHORT,
+	NumberInputDataIndices: USHORT,
+	NumberOutputButtonCaps: USHORT,
+	NumberOutputValueCaps: USHORT,
+	NumberOutputDataIndices: USHORT,
+	NumberFeatureButtonCaps: USHORT,
+	NumberFeatureValueCaps: USHORT,
+	NumberFeatureDataIndices: USHORT,
+}
+PHIDP_CAPS :: ^HIDP_CAPS
+
+HIDP_BUTTON_CAPS :: struct {
+	UsagePage: USAGE,
+	ReportID: UCHAR,
+	IsAlias: BOOLEAN,
+	BitField: USHORT,
+	LinkCollection: USHORT,
+	LinkUsage: USAGE,
+	LinkUsagePage: USAGE,
+	IsRange: BOOLEAN,
+	IsStringRange: BOOLEAN,
+	IsDesignatorRange: BOOLEAN,
+	IsAbsolute: BOOLEAN,
+	ReportCount: USHORT,
+	Reserved2: USHORT,
+	Reserved: [9]ULONG,
+	using _: struct #raw_union {
+		Range: struct {
+			UsageMin: USAGE,
+			UsageMax: USAGE,
+			StringMin: USHORT,
+			StringMax: USHORT,
+			DesignatorMin: USHORT,
+			DesignatorMax: USHORT,
+			DataIndexMin: USHORT,
+			DataIndexMax: USHORT,
+		},
+		NotRange: struct {
+			Usage: USAGE,
+			Reserved1: USAGE,
+			StringIndex: USHORT,
+			Reserved2: USHORT,
+			DesignatorIndex: USHORT,
+			Reserved3: USHORT,
+			DataIndex: USHORT,
+			Reserved4: USHORT,
+		},
+	},
+}
+PHIDP_BUTTON_CAPS :: ^HIDP_BUTTON_CAPS
+
+HIDP_VALUE_CAPS :: struct {
+	UsagePage: USAGE,
+	ReportID: UCHAR,
+	IsAlias: BOOLEAN,
+	BitField: USHORT,
+	LinkCollection: USHORT,
+	LinkUsage: USAGE,
+	LinkUsagePage: USAGE,
+	IsRange: BOOLEAN,
+	IsStringRange: BOOLEAN,
+	IsDesignatorRange: BOOLEAN,
+	IsAbsolute: BOOLEAN,
+	HasNull: BOOLEAN,
+	Reserved: UCHAR,
+	BitSize: USHORT,
+	ReportCount: USHORT,
+	Reserved2: [5]USHORT,
+	UnitsExp: ULONG,
+	Units: ULONG,
+	LogicalMin: LONG,
+	LogicalMax: LONG,
+	PhysicalMin: LONG,
+	PhysicalMax: LONG,
+	using _: struct #raw_union {
+		Range: struct {
+			UsageMin: USAGE,
+			UsageMax: USAGE,
+			StringMin: USHORT,
+			StringMax: USHORT,
+			DesignatorMin: USHORT,
+			DesignatorMax: USHORT,
+			DataIndexMin: USHORT,
+			DataIndexMax: USHORT,
+		},
+		NotRange: struct {
+			Usage: USAGE,
+			Reserved1: USAGE,
+			StringIndex: USHORT,
+			Reserved2: USHORT,
+			DesignatorIndex: USHORT,
+			Reserved3: USHORT,
+			DataIndex: USHORT,
+			Reserved4: USHORT,
+		},
+	},
+}
+PHIDP_VALUE_CAPS :: ^HIDP_VALUE_CAPS
+
+PHIDP_PREPARSED_DATA :: rawptr
+
+HIDP_REPORT_TYPE :: enum c.int {
+	Input,
+	Output,
+	Feature,
+}
+
+HIDP_STATUS_SUCCESS : NTSTATUS : 0x110000
+
+foreign import hid "system:hid.lib"
+@(default_calling_convention="system")
+foreign hid {
+	HidP_GetCaps :: proc(PreparsedData: PHIDP_PREPARSED_DATA, Capabilities: PHIDP_CAPS) -> NTSTATUS ---
+	HidP_GetButtonCaps :: proc(ReportType: HIDP_REPORT_TYPE, ButtonCaps: PHIDP_BUTTON_CAPS, ButtonCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS ---
+	HidP_GetValueCaps :: proc(ReportType: HIDP_REPORT_TYPE, ValueCaps: PHIDP_VALUE_CAPS, ValueCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS ---
+	HidP_GetUsages :: proc(ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, UsageList: PUSAGE, UsageLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS ---
+	HidP_GetUsageValue :: proc(ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, UsageValue: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS ---
+}

+ 1 - 1
core/sys/windows/ip_helper.odin

@@ -217,7 +217,7 @@ NL_DAD_STATE :: enum i32 {
 	IpDadStatePreferred  = 4,
 }
 
-@(default_calling_convention = "std")
+@(default_calling_convention = "system")
 foreign iphlpapi {
 	/*
 		The GetAdaptersAddresses function retrieves the addresses associated with the adapters on the local computer.

+ 20 - 20
core/sys/windows/kernel32.odin

@@ -21,7 +21,7 @@ COMMON_LVB_REVERSE_VIDEO   :: WORD(0x4000)
 COMMON_LVB_UNDERSCORE      :: WORD(0x8000)
 COMMON_LVB_SBCSDBCS        :: WORD(0x0300)
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	OutputDebugStringA :: proc(lpOutputString: LPCSTR) --- // The only A thing that is allowed
 	OutputDebugStringW :: proc(lpOutputString: LPCWSTR) ---
@@ -112,7 +112,7 @@ foreign kernel32 {
 	CreateThread :: proc(
 		lpThreadAttributes: LPSECURITY_ATTRIBUTES,
 		dwStackSize: SIZE_T,
-		lpStartAddress: proc "stdcall" (rawptr) -> DWORD,
+		lpStartAddress: proc "system" (rawptr) -> DWORD,
 		lpParameter: LPVOID,
 		dwCreationFlags: DWORD,
 		lpThreadId: LPDWORD,
@@ -121,7 +121,7 @@ foreign kernel32 {
 		hProcess: HANDLE,
 		lpThreadAttributes: LPSECURITY_ATTRIBUTES,
 		dwStackSize: SIZE_T,
-		lpStartAddress: proc "stdcall" (rawptr) -> DWORD,
+		lpStartAddress: proc "system" (rawptr) -> DWORD,
 		lpParameter: LPVOID,
 		dwCreationFlags: DWORD,
 		lpThreadId: LPDWORD,
@@ -581,7 +581,7 @@ MEM_TOP_DOWN    :: 0x100000
 MEM_LARGE_PAGES :: 0x20000000
 MEM_4MB_PAGES   :: 0x80000000
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	VirtualAlloc :: proc(
 		lpAddress: LPVOID,
@@ -724,7 +724,7 @@ LowMemoryResourceNotification  :: MEMORY_RESOURCE_NOTIFICATION_TYPE.LowMemoryRes
 HighMemoryResourceNotification :: MEMORY_RESOURCE_NOTIFICATION_TYPE.HighMemoryResourceNotification
 
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	CreateMemoryResourceNotification :: proc(
 		NotificationType: MEMORY_RESOURCE_NOTIFICATION_TYPE,
@@ -740,7 +740,7 @@ FILE_CACHE_MAX_HARD_DISABLE :: DWORD(0x00000002)
 FILE_CACHE_MIN_HARD_ENABLE  :: DWORD(0x00000004)
 FILE_CACHE_MIN_HARD_DISABLE :: DWORD(0x00000008)
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	GetSystemFileCacheSize :: proc(
 		lpMinimumFileCacheSize: PSIZE_T,
@@ -770,7 +770,7 @@ WIN32_MEMORY_RANGE_ENTRY :: struct {
 
 PWIN32_MEMORY_RANGE_ENTRY :: ^WIN32_MEMORY_RANGE_ENTRY
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	PrefetchVirtualMemory :: proc(
 		hProcess: HANDLE,
@@ -828,23 +828,23 @@ foreign kernel32 {
 
 MEHC_PATROL_SCRUBBER_PRESENT :: ULONG(0x1)
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	GetMemoryErrorHandlingCapabilities :: proc(
 		Capabilities: PULONG,
 	) -> BOOL ---
 }
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	GlobalMemoryStatusEx :: proc(
 		lpBuffer: ^MEMORYSTATUSEX,
 	) -> BOOL ---
 }
 
-PBAD_MEMORY_CALLBACK_ROUTINE :: #type proc "stdcall" ()
+PBAD_MEMORY_CALLBACK_ROUTINE :: #type proc "system" ()
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	RegisterBadMemoryNotification :: proc(
 		Callback: PBAD_MEMORY_CALLBACK_ROUTINE,
@@ -865,7 +865,7 @@ VmOfferPriorityLow         :: OFFER_PRIORITY.VmOfferPriorityLow
 VmOfferPriorityBelowNormal :: OFFER_PRIORITY.VmOfferPriorityBelowNormal
 VmOfferPriorityNormal      :: OFFER_PRIORITY.VmOfferPriorityNormal
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	OfferVirtualMemory :: proc(
 		VirtualAddress: PVOID,
@@ -930,7 +930,7 @@ WIN32_MEMORY_REGION_INFORMATION_u_s_Bitfield :: distinct ULONG
 	Reserved       : 32-6,
 }*/
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign one_core {
 	QueryVirtualMemoryInformation :: proc(
 		Process: HANDLE,
@@ -955,7 +955,7 @@ foreign one_core {
 
 NUMA_NO_PREFERRED_NODE :: 0xffffffff
 
-MapViewOfFile2 :: #force_inline proc "stdcall" (
+MapViewOfFile2 :: #force_inline proc "system" (
 	FileMappingHandle: HANDLE,
 	ProcessHandle: HANDLE,
 	Offset: ULONG64,
@@ -976,7 +976,7 @@ MapViewOfFile2 :: #force_inline proc "stdcall" (
 	)
 }
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	UnmapViewOfFile2 :: proc(
 		ProcessHandle: HANDLE,
@@ -985,7 +985,7 @@ foreign kernel32 {
 	) -> BOOL ---
 }
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	GetProductInfo :: proc(
 		OSMajorVersion: DWORD,
@@ -996,7 +996,7 @@ foreign kernel32 {
 	) -> BOOL ---
 }
 
-HandlerRoutine :: proc "stdcall" (dwCtrlType: DWORD) -> BOOL
+HandlerRoutine :: proc "system" (dwCtrlType: DWORD) -> BOOL
 PHANDLER_ROUTINE :: HandlerRoutine
 
 
@@ -1137,16 +1137,16 @@ DCB :: struct {
 	wReserved1: WORD,
 }
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign kernel32 {
 	GetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
 	SetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
 }
 
 
-LPFIBER_START_ROUTINE :: #type proc "stdcall" (lpFiberParameter: LPVOID)
+LPFIBER_START_ROUTINE :: #type proc "system" (lpFiberParameter: LPVOID)
 
-@(default_calling_convention = "stdcall")
+@(default_calling_convention = "system")
 foreign kernel32 {
 	CreateFiber :: proc(dwStackSize: SIZE_T, lpStartAddress: LPFIBER_START_ROUTINE, lpParameter: LPVOID) -> LPVOID ---
 	DeleteFiber :: proc(lpFiber: LPVOID) ---

+ 1 - 1
core/sys/windows/netapi32.odin

@@ -3,7 +3,7 @@ package sys_windows
 
 foreign import netapi32 "system:Netapi32.lib"
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign netapi32 {
 	NetUserAdd :: proc(
 		servername: wstring,

+ 1 - 1
core/sys/windows/ntdll.odin

@@ -3,7 +3,7 @@ package sys_windows
 
 foreign import ntdll_lib "system:ntdll.lib"
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign ntdll_lib {
 	RtlGetVersion :: proc(lpVersionInformation: ^OSVERSIONINFOEXW) -> NTSTATUS ---
 }

+ 4 - 5
core/sys/windows/ole32.odin

@@ -1,4 +1,3 @@
-// +build windows
 package sys_windows
 
 foreign import "system:Ole32.lib"
@@ -15,14 +14,14 @@ IUnknown :: struct {
 	using Vtbl: ^IUnknownVtbl,
 }
 IUnknownVtbl :: struct {
-	QueryInterface: proc "stdcall" (This: ^IUnknown, riid: REFIID, ppvObject: ^rawptr) -> HRESULT,
-	AddRef:         proc "stdcall" (This: ^IUnknown) -> ULONG,
-	Release:        proc "stdcall" (This: ^IUnknown) -> ULONG,
+	QueryInterface: proc "system" (This: ^IUnknown, riid: REFIID, ppvObject: ^rawptr) -> HRESULT,
+	AddRef:         proc "system" (This: ^IUnknown) -> ULONG,
+	Release:        proc "system" (This: ^IUnknown) -> ULONG,
 }
 
 LPUNKNOWN :: ^IUnknown
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign Ole32 {
 	CoInitializeEx :: proc(reserved: rawptr, co_init: COINIT) -> HRESULT ---
 	CoUninitialize :: proc() ---

+ 1 - 1
core/sys/windows/shell32.odin

@@ -3,7 +3,7 @@ package sys_windows
 
 foreign import shell32 "system:Shell32.lib"
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign shell32 {
 	CommandLineToArgvW :: proc(cmd_list: wstring, num_args: ^c_int) -> ^wstring ---
 	ShellExecuteW :: proc(

+ 1 - 1
core/sys/windows/shlwapi.odin

@@ -3,7 +3,7 @@ package sys_windows
 
 foreign import shlwapi "system:shlwapi.lib"
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign shlwapi {
 	PathFileExistsW    :: proc(pszPath: wstring) -> BOOL ---
 	PathFindExtensionW :: proc(pszPath: wstring) -> wstring ---

+ 1 - 1
core/sys/windows/synchronization.odin

@@ -3,7 +3,7 @@ package sys_windows
 
 foreign import Synchronization "system:Synchronization.lib"
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign Synchronization {
 	WaitOnAddress       :: proc(Address: PVOID, CompareAddress: PVOID, AddressSize: SIZE_T, dwMilliseconds: DWORD) -> BOOL ---
 	WakeByAddressSingle :: proc(Address: PVOID) ---

+ 169 - 167
core/sys/windows/types.odin

@@ -1,4 +1,3 @@
-// +build windows
 package sys_windows
 
 import "core:c"
@@ -7,9 +6,9 @@ c_char      :: c.char
 c_uchar     :: c.uchar
 c_int       :: c.int
 c_uint      :: c.uint
-c_long      :: c.long
+c_long      :: i32
 c_longlong  :: c.longlong
-c_ulong     :: c.ulong
+c_ulong     :: u32
 c_ulonglong :: c.ulonglong
 c_short     :: c.short
 c_ushort    :: c.ushort
@@ -75,6 +74,8 @@ LPRECT :: ^RECT
 LPPOINT :: ^POINT
 LSTATUS :: LONG
 PHKEY :: ^HKEY
+PUSHORT :: ^USHORT
+PCHAR :: ^CHAR
 
 UINT8  ::  u8
 UINT16 :: u16
@@ -690,13 +691,13 @@ FW_DEMIBOLD   :: FW_SEMIBOLD
 FW_ULTRABOLD  :: FW_EXTRABOLD
 FW_BLACK      :: FW_HEAVY
 
-PTIMERAPCROUTINE :: #type proc "stdcall" (lpArgToCompletionRoutine: LPVOID, dwTimerLowValue, dwTimerHighValue: DWORD)
+PTIMERAPCROUTINE :: #type proc "system" (lpArgToCompletionRoutine: LPVOID, dwTimerLowValue, dwTimerHighValue: DWORD)
 
-TIMERPROC :: #type proc "stdcall" (HWND, UINT, UINT_PTR, DWORD)
+TIMERPROC :: #type proc "system" (HWND, UINT, UINT_PTR, DWORD)
 
-WNDPROC :: #type proc "stdcall" (HWND, UINT, WPARAM, LPARAM) -> LRESULT
+WNDPROC :: #type proc "system" (HWND, UINT, WPARAM, LPARAM) -> LRESULT
 
-HOOKPROC :: #type proc "stdcall" (code: c_int, wParam: WPARAM, lParam: LPARAM) -> LRESULT
+HOOKPROC :: #type proc "system" (code: c_int, wParam: WPARAM, lParam: LPARAM) -> LRESULT
 
 CWPRETSTRUCT :: struct {
 	lResult: LRESULT,
@@ -2323,7 +2324,7 @@ MOUNT_POINT_REPARSE_BUFFER :: struct {
 	PathBuffer: WCHAR,
 }
 
-LPPROGRESS_ROUTINE :: #type proc "stdcall" (
+LPPROGRESS_ROUTINE :: #type proc "system" (
 	TotalFileSize: LARGE_INTEGER,
 	TotalBytesTransferred: LARGE_INTEGER,
 	StreamSize: LARGE_INTEGER,
@@ -2493,7 +2494,7 @@ OVERLAPPED_ENTRY :: struct {
 	dwNumberOfBytesTransferred: DWORD,
 }
 
-LPOVERLAPPED_COMPLETION_ROUTINE :: #type proc "stdcall" (
+LPOVERLAPPED_COMPLETION_ROUTINE :: #type proc "system" (
 	dwErrorCode: DWORD,
 	dwNumberOfBytesTransfered: DWORD,
 	lpOverlapped: LPOVERLAPPED,
@@ -2557,7 +2558,7 @@ EXCEPTION_POINTERS :: struct {
 	ContextRecord: ^CONTEXT,
 }
 
-PVECTORED_EXCEPTION_HANDLER :: #type proc "stdcall" (ExceptionInfo: ^EXCEPTION_POINTERS) -> LONG
+PVECTORED_EXCEPTION_HANDLER :: #type proc "system" (ExceptionInfo: ^EXCEPTION_POINTERS) -> LONG
 
 CONSOLE_READCONSOLE_CONTROL :: struct {
 	nLength: ULONG,
@@ -2612,7 +2613,7 @@ ADDRINFOEXW :: struct {
 	ai_next:      ^ADDRINFOEXW,
 }
 
-LPLOOKUPSERVICE_COMPLETION_ROUTINE :: #type proc "stdcall" (
+LPLOOKUPSERVICE_COMPLETION_ROUTINE :: #type proc "system" (
 	dwErrorCode: DWORD,
 	dwNumberOfBytesTransfered: DWORD,
 	lpOverlapped: LPOVERLAPPED,
@@ -2718,16 +2719,17 @@ SECURITY_MAX_SID_SIZE :: 68
 
 // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-sid
 SID :: struct #packed {
-	Revision: byte,
-	SubAuthorityCount: byte,
+	Revision:            byte,
+	SubAuthorityCount:   byte,
 	IdentifierAuthority: SID_IDENTIFIER_AUTHORITY,
-	SubAuthority: [15]DWORD, // Array of DWORDs
+	SubAuthority:        [15]DWORD, // Array of DWORDs
 }
 #assert(size_of(SID) == SECURITY_MAX_SID_SIZE)
 
 SID_IDENTIFIER_AUTHORITY :: struct #packed {
 	Value: [6]u8,
 }
+#assert(size_of(SID_IDENTIFIER_AUTHORITY) == 6)
 
 // For NetAPI32
 // https://github.com/tpn/winsdk-10/blob/master/Include/10.0.14393.0/shared/lmerr.h
@@ -3425,7 +3427,7 @@ IModalWindow :: struct #raw_union {
 }
 IModalWindowVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	Show: proc "stdcall" (this: ^IModalWindow, hwndOwner: HWND) -> HRESULT,
+	Show: proc "system" (this: ^IModalWindow, hwndOwner: HWND) -> HRESULT,
 }
 
 ISequentialStream :: struct #raw_union {
@@ -3434,8 +3436,8 @@ ISequentialStream :: struct #raw_union {
 }
 ISequentialStreamVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	Read:  proc "stdcall" (this: ^ISequentialStream, pv: rawptr, cb: ULONG, pcbRead: ^ULONG) -> HRESULT,
-	Write: proc "stdcall" (this: ^ISequentialStream, pv: rawptr, cb: ULONG, pcbWritten: ^ULONG) -> HRESULT,
+	Read:  proc "system" (this: ^ISequentialStream, pv: rawptr, cb: ULONG, pcbRead: ^ULONG) -> HRESULT,
+	Write: proc "system" (this: ^ISequentialStream, pv: rawptr, cb: ULONG, pcbWritten: ^ULONG) -> HRESULT,
 }
 
 IStream :: struct #raw_union {
@@ -3444,15 +3446,15 @@ IStream :: struct #raw_union {
 }
 IStreamVtbl :: struct {
 	using ISequentialStreamVtbl: ISequentialStreamVtbl,
-	Seek:         proc "stdcall" (this: ^IStream, dlibMove: LARGE_INTEGER, dwOrigin: DWORD, plibNewPosition: ^ULARGE_INTEGER) -> HRESULT,
-	SetSize:      proc "stdcall" (this: ^IStream, libNewSize: ULARGE_INTEGER) -> HRESULT,
-	CopyTo:       proc "stdcall" (this: ^IStream, pstm: ^IStream, cb: ULARGE_INTEGER, pcbRead: ^ULARGE_INTEGER, pcbWritten: ^ULARGE_INTEGER) -> HRESULT,
-	Commit:       proc "stdcall" (this: ^IStream, grfCommitFlags: DWORD) -> HRESULT,
-	Revert:       proc "stdcall" (this: ^IStream) -> HRESULT,
-	LockRegion:   proc "stdcall" (this: ^IStream, libOffset: ULARGE_INTEGER, cb: ULARGE_INTEGER, dwLockType: DWORD) -> HRESULT,
-	UnlockRegion: proc "stdcall" (this: ^IStream, libOffset: ULARGE_INTEGER, cb: ULARGE_INTEGER, dwLockType: DWORD) -> HRESULT,
-	Stat:         proc "stdcall" (this: ^IStream, pstatstg: ^STATSTG, grfStatFlag: DWORD) -> HRESULT,
-	Clone:        proc "stdcall" (this: ^IStream, ppstm: ^^IStream) -> HRESULT,
+	Seek:         proc "system" (this: ^IStream, dlibMove: LARGE_INTEGER, dwOrigin: DWORD, plibNewPosition: ^ULARGE_INTEGER) -> HRESULT,
+	SetSize:      proc "system" (this: ^IStream, libNewSize: ULARGE_INTEGER) -> HRESULT,
+	CopyTo:       proc "system" (this: ^IStream, pstm: ^IStream, cb: ULARGE_INTEGER, pcbRead: ^ULARGE_INTEGER, pcbWritten: ^ULARGE_INTEGER) -> HRESULT,
+	Commit:       proc "system" (this: ^IStream, grfCommitFlags: DWORD) -> HRESULT,
+	Revert:       proc "system" (this: ^IStream) -> HRESULT,
+	LockRegion:   proc "system" (this: ^IStream, libOffset: ULARGE_INTEGER, cb: ULARGE_INTEGER, dwLockType: DWORD) -> HRESULT,
+	UnlockRegion: proc "system" (this: ^IStream, libOffset: ULARGE_INTEGER, cb: ULARGE_INTEGER, dwLockType: DWORD) -> HRESULT,
+	Stat:         proc "system" (this: ^IStream, pstatstg: ^STATSTG, grfStatFlag: DWORD) -> HRESULT,
+	Clone:        proc "system" (this: ^IStream, ppstm: ^^IStream) -> HRESULT,
 }
 
 IPersist :: struct #raw_union {
@@ -3461,7 +3463,7 @@ IPersist :: struct #raw_union {
 }
 IPersistVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	GetClassID: proc "stdcall" (this: ^IPersist, pClassID: ^CLSID) -> HRESULT,
+	GetClassID: proc "system" (this: ^IPersist, pClassID: ^CLSID) -> HRESULT,
 }
 
 IPersistStream :: struct #raw_union {
@@ -3470,10 +3472,10 @@ IPersistStream :: struct #raw_union {
 }
 IPersistStreamVtbl :: struct {
 	using IPersistVtbl: IPersistVtbl,
-	IsDirty:    proc "stdcall" (this: ^IPersistStream) -> HRESULT,
-	Load:       proc "stdcall" (this: ^IPersistStream, pStm: ^IStream) -> HRESULT,
-	Save:       proc "stdcall" (this: ^IPersistStream, pStm: ^IStream, fClearDirty: BOOL) -> HRESULT,
-	GetSizeMax: proc "stdcall" (this: ^IPersistStream, pcbSize: ^ULARGE_INTEGER) -> HRESULT,
+	IsDirty:    proc "system" (this: ^IPersistStream) -> HRESULT,
+	Load:       proc "system" (this: ^IPersistStream, pStm: ^IStream) -> HRESULT,
+	Save:       proc "system" (this: ^IPersistStream, pStm: ^IStream, fClearDirty: BOOL) -> HRESULT,
+	GetSizeMax: proc "system" (this: ^IPersistStream, pcbSize: ^ULARGE_INTEGER) -> HRESULT,
 }
 
 IMoniker :: struct #raw_union {
@@ -3482,21 +3484,21 @@ IMoniker :: struct #raw_union {
 }
 IMonikerVtbl :: struct {
 	using IPersistStreamVtbl: IPersistStreamVtbl,
-	BindToObject:        proc "stdcall" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, riidResult: REFIID, ppvResult: ^rawptr) -> HRESULT,
-	BindToStorage:       proc "stdcall" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, riid: REFIID, ppvObj: ^rawptr) -> HRESULT,
-	Reduce:              proc "stdcall" (this: ^IMoniker, pbc: ^IBindCtx, dwReduceHowFar: DWORD, ppmkToLeft: ^^IMoniker, ppmkReduced: ^^IMoniker) -> HRESULT,
-	ComposeWith:         proc "stdcall" (this: ^IMoniker, pmkRight: ^IMoniker, fOnlyIfNotGeneric: BOOL, ppmkComposite: ^^IMoniker) -> HRESULT,
-	Enum:                proc "stdcall" (this: ^IMoniker, fForward: BOOL, ppenumMoniker: ^^IEnumMoniker) -> HRESULT,
-	IsEqual:             proc "stdcall" (this: ^IMoniker, pmkOtherMoniker: ^IMoniker) -> HRESULT,
-	Hash:                proc "stdcall" (this: ^IMoniker, pdwHash: ^DWORD) -> HRESULT,
-	IsRunning:           proc "stdcall" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, pmkNewlyRunning: ^IMoniker) -> HRESULT,
-	GetTimeOfLastChange: proc "stdcall" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, pFileTime: ^FILETIME) -> HRESULT,
-	Inverse:             proc "stdcall" (this: ^IMoniker, ppmk: ^^IMoniker) -> HRESULT,
-	CommonPrefixWith:    proc "stdcall" (this: ^IMoniker, pmkOther: ^IMoniker, ppmkPrefix: ^^IMoniker) -> HRESULT,
-	RelativePathTo:      proc "stdcall" (this: ^IMoniker, pmkOther: ^IMoniker, ppmkRelPath: ^^IMoniker) -> HRESULT,
-	GetDisplayName:      proc "stdcall" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, ppszDisplayName: ^LPOLESTR) -> HRESULT,
-	ParseDisplayName:    proc "stdcall" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, pszDisplayName: LPOLESTR, pchEaten: ^ULONG, ppmkOut: ^^IMoniker) -> HRESULT,
-	IsSystemMoniker:     proc "stdcall" (this: ^IMoniker, pdwMksys: ^DWORD) -> HRESULT,
+	BindToObject:        proc "system" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, riidResult: REFIID, ppvResult: ^rawptr) -> HRESULT,
+	BindToStorage:       proc "system" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, riid: REFIID, ppvObj: ^rawptr) -> HRESULT,
+	Reduce:              proc "system" (this: ^IMoniker, pbc: ^IBindCtx, dwReduceHowFar: DWORD, ppmkToLeft: ^^IMoniker, ppmkReduced: ^^IMoniker) -> HRESULT,
+	ComposeWith:         proc "system" (this: ^IMoniker, pmkRight: ^IMoniker, fOnlyIfNotGeneric: BOOL, ppmkComposite: ^^IMoniker) -> HRESULT,
+	Enum:                proc "system" (this: ^IMoniker, fForward: BOOL, ppenumMoniker: ^^IEnumMoniker) -> HRESULT,
+	IsEqual:             proc "system" (this: ^IMoniker, pmkOtherMoniker: ^IMoniker) -> HRESULT,
+	Hash:                proc "system" (this: ^IMoniker, pdwHash: ^DWORD) -> HRESULT,
+	IsRunning:           proc "system" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, pmkNewlyRunning: ^IMoniker) -> HRESULT,
+	GetTimeOfLastChange: proc "system" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, pFileTime: ^FILETIME) -> HRESULT,
+	Inverse:             proc "system" (this: ^IMoniker, ppmk: ^^IMoniker) -> HRESULT,
+	CommonPrefixWith:    proc "system" (this: ^IMoniker, pmkOther: ^IMoniker, ppmkPrefix: ^^IMoniker) -> HRESULT,
+	RelativePathTo:      proc "system" (this: ^IMoniker, pmkOther: ^IMoniker, ppmkRelPath: ^^IMoniker) -> HRESULT,
+	GetDisplayName:      proc "system" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, ppszDisplayName: ^LPOLESTR) -> HRESULT,
+	ParseDisplayName:    proc "system" (this: ^IMoniker, pbc: ^IBindCtx, pmkToLeft: ^IMoniker, pszDisplayName: LPOLESTR, pchEaten: ^ULONG, ppmkOut: ^^IMoniker) -> HRESULT,
+	IsSystemMoniker:     proc "system" (this: ^IMoniker, pdwMksys: ^DWORD) -> HRESULT,
 }
 
 IEnumMoniker :: struct #raw_union {
@@ -3505,10 +3507,10 @@ IEnumMoniker :: struct #raw_union {
 }
 IEnumMonikerVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	Next:  proc "stdcall" (this: ^IEnumMoniker, celt: ULONG, rgelt: ^^IMoniker, pceltFetched: ^ULONG) -> HRESULT,
-	Skip:  proc "stdcall" (this: ^IEnumMoniker, celt: ULONG) -> HRESULT,
-	Reset: proc "stdcall" (this: ^IEnumMoniker) -> HRESULT,
-	Clone: proc "stdcall" (this: ^IEnumMoniker, ppenum: ^^IEnumMoniker) -> HRESULT,
+	Next:  proc "system" (this: ^IEnumMoniker, celt: ULONG, rgelt: ^^IMoniker, pceltFetched: ^ULONG) -> HRESULT,
+	Skip:  proc "system" (this: ^IEnumMoniker, celt: ULONG) -> HRESULT,
+	Reset: proc "system" (this: ^IEnumMoniker) -> HRESULT,
+	Clone: proc "system" (this: ^IEnumMoniker, ppenum: ^^IEnumMoniker) -> HRESULT,
 }
 
 IRunningObjectTable :: struct #raw_union {
@@ -3517,13 +3519,13 @@ IRunningObjectTable :: struct #raw_union {
 }
 IRunningObjectTableVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	Register:            proc "stdcall" (this: ^IRunningObjectTable, grfFlags: DWORD, punkObject: ^IUnknown, pmkObjectName: ^IMoniker, pdwRegister: ^DWORD) -> HRESULT,
-	Revoke:              proc "stdcall" (this: ^IRunningObjectTable, dwRegister: DWORD) -> HRESULT,
-	IsRunning:           proc "stdcall" (this: ^IRunningObjectTable, pmkObjectName: ^IMoniker) -> HRESULT,
-	GetObject:           proc "stdcall" (this: ^IRunningObjectTable, pmkObjectName: ^IMoniker, ppunkObject: ^^IUnknown) -> HRESULT,
-	NoteChangeTime:      proc "stdcall" (this: ^IRunningObjectTable, dwRegister: DWORD, pfiletime: ^FILETIME) -> HRESULT,
-	GetTimeOfLastChange: proc "stdcall" (this: ^IRunningObjectTable, pmkObjectName: ^IMoniker, pfiletime: ^FILETIME) -> HRESULT,
-	EnumRunning:         proc "stdcall" (this: ^IRunningObjectTable, ppenumMoniker: ^^IEnumMoniker) -> HRESULT,
+	Register:            proc "system" (this: ^IRunningObjectTable, grfFlags: DWORD, punkObject: ^IUnknown, pmkObjectName: ^IMoniker, pdwRegister: ^DWORD) -> HRESULT,
+	Revoke:              proc "system" (this: ^IRunningObjectTable, dwRegister: DWORD) -> HRESULT,
+	IsRunning:           proc "system" (this: ^IRunningObjectTable, pmkObjectName: ^IMoniker) -> HRESULT,
+	GetObject:           proc "system" (this: ^IRunningObjectTable, pmkObjectName: ^IMoniker, ppunkObject: ^^IUnknown) -> HRESULT,
+	NoteChangeTime:      proc "system" (this: ^IRunningObjectTable, dwRegister: DWORD, pfiletime: ^FILETIME) -> HRESULT,
+	GetTimeOfLastChange: proc "system" (this: ^IRunningObjectTable, pmkObjectName: ^IMoniker, pfiletime: ^FILETIME) -> HRESULT,
+	EnumRunning:         proc "system" (this: ^IRunningObjectTable, ppenumMoniker: ^^IEnumMoniker) -> HRESULT,
 }
 
 IEnumString :: struct #raw_union {
@@ -3532,10 +3534,10 @@ IEnumString :: struct #raw_union {
 }
 IEnumStringVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	Next:  proc "stdcall" (this: ^IEnumString, celt: ULONG, rgelt: ^LPOLESTR, pceltFetched: ^ULONG) -> HRESULT,
-	Skip:  proc "stdcall" (this: ^IEnumString, celt: ULONG) -> HRESULT,
-	Reset: proc "stdcall" (this: ^IEnumString) -> HRESULT,
-	Clone: proc "stdcall" (this: ^IEnumString, ppenum: ^^IEnumString) -> HRESULT,
+	Next:  proc "system" (this: ^IEnumString, celt: ULONG, rgelt: ^LPOLESTR, pceltFetched: ^ULONG) -> HRESULT,
+	Skip:  proc "system" (this: ^IEnumString, celt: ULONG) -> HRESULT,
+	Reset: proc "system" (this: ^IEnumString) -> HRESULT,
+	Clone: proc "system" (this: ^IEnumString, ppenum: ^^IEnumString) -> HRESULT,
 }
 
 IBindCtx :: struct #raw_union {
@@ -3544,16 +3546,16 @@ IBindCtx :: struct #raw_union {
 }
 IBindCtxVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	RegisterObjectBound:   proc "stdcall" (this: ^IBindCtx, punk: ^IUnknown) -> HRESULT,
-	RevokeObjectBound:     proc "stdcall" (this: ^IBindCtx, punk: ^IUnknown) -> HRESULT,
-	ReleaseBoundObjects:   proc "stdcall" (this: ^IBindCtx) -> HRESULT,
-	SetBindOptions:        proc "stdcall" (this: ^IBindCtx, pbindopts: ^BIND_OPTS) -> HRESULT,
-	GetBindOptions:        proc "stdcall" (this: ^IBindCtx, pbindopts: ^BIND_OPTS) -> HRESULT,
-	GetRunningObjectTable: proc "stdcall" (this: ^IBindCtx, pprot: ^^IRunningObjectTable) -> HRESULT,
-	RegisterObjectParam:   proc "stdcall" (this: ^IBindCtx, pszKey: LPOLESTR, punk: ^IUnknown) -> HRESULT,
-	GetObjectParam:        proc "stdcall" (this: ^IBindCtx, pszKey: LPOLESTR, ppunk: ^^IUnknown) -> HRESULT,
-	EnumObjectParam:       proc "stdcall" (this: ^IBindCtx, ppenum: ^^IEnumString) -> HRESULT,
-	RevokeObjectParam:     proc "stdcall" (this: ^IBindCtx, pszKey: LPOLESTR) -> HRESULT,
+	RegisterObjectBound:   proc "system" (this: ^IBindCtx, punk: ^IUnknown) -> HRESULT,
+	RevokeObjectBound:     proc "system" (this: ^IBindCtx, punk: ^IUnknown) -> HRESULT,
+	ReleaseBoundObjects:   proc "system" (this: ^IBindCtx) -> HRESULT,
+	SetBindOptions:        proc "system" (this: ^IBindCtx, pbindopts: ^BIND_OPTS) -> HRESULT,
+	GetBindOptions:        proc "system" (this: ^IBindCtx, pbindopts: ^BIND_OPTS) -> HRESULT,
+	GetRunningObjectTable: proc "system" (this: ^IBindCtx, pprot: ^^IRunningObjectTable) -> HRESULT,
+	RegisterObjectParam:   proc "system" (this: ^IBindCtx, pszKey: LPOLESTR, punk: ^IUnknown) -> HRESULT,
+	GetObjectParam:        proc "system" (this: ^IBindCtx, pszKey: LPOLESTR, ppunk: ^^IUnknown) -> HRESULT,
+	EnumObjectParam:       proc "system" (this: ^IBindCtx, ppenum: ^^IEnumString) -> HRESULT,
+	RevokeObjectParam:     proc "system" (this: ^IBindCtx, pszKey: LPOLESTR) -> HRESULT,
 }
 
 IEnumShellItems :: struct #raw_union {
@@ -3562,10 +3564,10 @@ IEnumShellItems :: struct #raw_union {
 }
 IEnumShellItemsVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	Next:  proc "stdcall" (this: ^IEnumShellItems, celt: ULONG, rgelt: ^^IShellItem, pceltFetched: ^ULONG) -> HRESULT,
-	Skip:  proc "stdcall" (this: ^IEnumShellItems, celt: ULONG) -> HRESULT,
-	Reset: proc "stdcall" (this: ^IEnumShellItems) -> HRESULT,
-	Clone: proc "stdcall" (this: ^IEnumShellItems, ppenum: ^^IEnumShellItems) -> HRESULT,
+	Next:  proc "system" (this: ^IEnumShellItems, celt: ULONG, rgelt: ^^IShellItem, pceltFetched: ^ULONG) -> HRESULT,
+	Skip:  proc "system" (this: ^IEnumShellItems, celt: ULONG) -> HRESULT,
+	Reset: proc "system" (this: ^IEnumShellItems) -> HRESULT,
+	Clone: proc "system" (this: ^IEnumShellItems, ppenum: ^^IEnumShellItems) -> HRESULT,
 }
 
 IShellItem :: struct #raw_union {
@@ -3574,11 +3576,11 @@ IShellItem :: struct #raw_union {
 }
 IShellItemVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	BindToHandler:  proc "stdcall" (this: ^IShellItem, pbc: ^IBindCtx, bhid: REFGUID, riid: REFIID, ppv: ^rawptr) -> HRESULT,
-	GetParent:      proc "stdcall" (this: ^IShellItem, ppsiFolder: ^^IShellItem) -> HRESULT,
-	GetDisplayName: proc "stdcall" (this: ^IShellItem, sigdnName: SIGDN, ppszName: ^LPWSTR) -> HRESULT,
-	GetAttributes:  proc "stdcall" (this: ^IShellItem, sfgaoMask: SFGAOF, psfgaoAttribs: ^SFGAOF) -> HRESULT,
-	Compare:        proc "stdcall" (this: ^IShellItem, psi: ^IShellItem, hint: SICHINTF, piOrder: ^c_int) -> HRESULT,
+	BindToHandler:  proc "system" (this: ^IShellItem, pbc: ^IBindCtx, bhid: REFGUID, riid: REFIID, ppv: ^rawptr) -> HRESULT,
+	GetParent:      proc "system" (this: ^IShellItem, ppsiFolder: ^^IShellItem) -> HRESULT,
+	GetDisplayName: proc "system" (this: ^IShellItem, sigdnName: SIGDN, ppszName: ^LPWSTR) -> HRESULT,
+	GetAttributes:  proc "system" (this: ^IShellItem, sfgaoMask: SFGAOF, psfgaoAttribs: ^SFGAOF) -> HRESULT,
+	Compare:        proc "system" (this: ^IShellItem, psi: ^IShellItem, hint: SICHINTF, piOrder: ^c_int) -> HRESULT,
 }
 
 IShellItemArray :: struct #raw_union {
@@ -3587,13 +3589,13 @@ IShellItemArray :: struct #raw_union {
 }
 IShellItemArrayVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	BindToHandler:              proc "stdcall" (this: ^IShellItemArray, pbc: ^IBindCtx, bhid: REFGUID, riid: REFIID, ppvOut: ^rawptr) -> HRESULT,
-	GetPropertyStore:           proc "stdcall" (this: ^IShellItemArray, flags: GETPROPERTYSTOREFLAGS, riid: REFIID, ppv: ^rawptr) -> HRESULT,
-	GetPropertyDescriptionList: proc "stdcall" (this: ^IShellItemArray, keyType: REFPROPERTYKEY, riid: REFIID, ppv: ^rawptr) -> HRESULT,
-	GetAttributes:              proc "stdcall" (this: ^IShellItemArray, AttribFlags: SIATTRIBFLAGS, sfgaoMask: SFGAOF, psfgaoAttribs: ^SFGAOF) -> HRESULT,
-	GetCount:                   proc "stdcall" (this: ^IShellItemArray, pdwNumItems: ^DWORD) -> HRESULT,
-	GetItemAt:                  proc "stdcall" (this: ^IShellItemArray, dwIndex: DWORD, ppsi: ^^IShellItem) -> HRESULT,
-	EnumItems:                  proc "stdcall" (this: ^IShellItemArray, ppenumShellItems: ^^IEnumShellItems) -> HRESULT,
+	BindToHandler:              proc "system" (this: ^IShellItemArray, pbc: ^IBindCtx, bhid: REFGUID, riid: REFIID, ppvOut: ^rawptr) -> HRESULT,
+	GetPropertyStore:           proc "system" (this: ^IShellItemArray, flags: GETPROPERTYSTOREFLAGS, riid: REFIID, ppv: ^rawptr) -> HRESULT,
+	GetPropertyDescriptionList: proc "system" (this: ^IShellItemArray, keyType: REFPROPERTYKEY, riid: REFIID, ppv: ^rawptr) -> HRESULT,
+	GetAttributes:              proc "system" (this: ^IShellItemArray, AttribFlags: SIATTRIBFLAGS, sfgaoMask: SFGAOF, psfgaoAttribs: ^SFGAOF) -> HRESULT,
+	GetCount:                   proc "system" (this: ^IShellItemArray, pdwNumItems: ^DWORD) -> HRESULT,
+	GetItemAt:                  proc "system" (this: ^IShellItemArray, dwIndex: DWORD, ppsi: ^^IShellItem) -> HRESULT,
+	EnumItems:                  proc "system" (this: ^IShellItemArray, ppenumShellItems: ^^IEnumShellItems) -> HRESULT,
 }
 
 IFileDialogEvents :: struct #raw_union {
@@ -3602,13 +3604,13 @@ IFileDialogEvents :: struct #raw_union {
 }
 IFileDialogEventsVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	OnFileOk:          proc "stdcall" (this: ^IFileDialogEvents, pfd: ^IFileDialog) -> HRESULT,
-	OnFolderChanging:  proc "stdcall" (this: ^IFileDialogEvents, pfd: ^IFileDialog, psiFolder: ^IShellItem) -> HRESULT,
-	OnFolderChange:    proc "stdcall" (this: ^IFileDialogEvents, pfd: ^IFileDialog) -> HRESULT,
-	OnSelectionChange: proc "stdcall" (this: ^IFileDialogEvents, pfd: ^IFileDialog) -> HRESULT,
-	OnShareViolation:  proc "stdcall" (this: ^IFileDialogEvents, pfd: ^IFileDialog, psi: ^IShellItem, pResponse: ^FDE_SHAREVIOLATION_RESPONSE) -> HRESULT,
-	OnTypeChange:      proc "stdcall" (this: ^IFileDialogEvents, pfd: ^IFileDialog) -> HRESULT,
-	OnOverwrite:       proc "stdcall" (this: ^IFileDialogEvents, pfd: ^IFileDialog, psi: ^IShellItem, pResponse: ^FDE_SHAREVIOLATION_RESPONSE) -> HRESULT,
+	OnFileOk:          proc "system" (this: ^IFileDialogEvents, pfd: ^IFileDialog) -> HRESULT,
+	OnFolderChanging:  proc "system" (this: ^IFileDialogEvents, pfd: ^IFileDialog, psiFolder: ^IShellItem) -> HRESULT,
+	OnFolderChange:    proc "system" (this: ^IFileDialogEvents, pfd: ^IFileDialog) -> HRESULT,
+	OnSelectionChange: proc "system" (this: ^IFileDialogEvents, pfd: ^IFileDialog) -> HRESULT,
+	OnShareViolation:  proc "system" (this: ^IFileDialogEvents, pfd: ^IFileDialog, psi: ^IShellItem, pResponse: ^FDE_SHAREVIOLATION_RESPONSE) -> HRESULT,
+	OnTypeChange:      proc "system" (this: ^IFileDialogEvents, pfd: ^IFileDialog) -> HRESULT,
+	OnOverwrite:       proc "system" (this: ^IFileDialogEvents, pfd: ^IFileDialog, psi: ^IShellItem, pResponse: ^FDE_SHAREVIOLATION_RESPONSE) -> HRESULT,
 }
 
 IShellItemFilter :: struct #raw_union {
@@ -3617,8 +3619,8 @@ IShellItemFilter :: struct #raw_union {
 }
 IShellItemFilterVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	IncludeItem:         proc "stdcall" (this: ^IShellItemFilter, psi: ^IShellItem) -> HRESULT,
-	GetEnumFlagsForItem: proc "stdcall" (this: ^IShellItemFilter, psi: ^IShellItem, pgrfFlags: ^SHCONTF) -> HRESULT,
+	IncludeItem:         proc "system" (this: ^IShellItemFilter, psi: ^IShellItem) -> HRESULT,
+	GetEnumFlagsForItem: proc "system" (this: ^IShellItemFilter, psi: ^IShellItem, pgrfFlags: ^SHCONTF) -> HRESULT,
 }
 
 IFileDialog :: struct #raw_union {
@@ -3627,29 +3629,29 @@ IFileDialog :: struct #raw_union {
 }
 IFileDialogVtbl :: struct {
 	using IModalWindowVtbl: IModalWindowVtbl,
-	SetFileTypes:        proc "stdcall" (this: ^IFileDialog, cFileTypes: UINT, rgFilterSpec: ^COMDLG_FILTERSPEC) -> HRESULT,
-	SetFileTypeIndex:    proc "stdcall" (this: ^IFileDialog, iFileType: UINT) -> HRESULT,
-	GetFileTypeIndex:    proc "stdcall" (this: ^IFileDialog, piFileType: ^UINT) -> HRESULT,
-	Advise:              proc "stdcall" (this: ^IFileDialog, pfde: ^IFileDialogEvents, pdwCookie: ^DWORD) -> HRESULT,
-	Unadvise:            proc "stdcall" (this: ^IFileDialog, dwCookie: DWORD) -> HRESULT,
-	SetOptions:          proc "stdcall" (this: ^IFileDialog, fos: FILEOPENDIALOGOPTIONS) -> HRESULT,
-	GetOptions:          proc "stdcall" (this: ^IFileDialog, pfos: ^FILEOPENDIALOGOPTIONS) -> HRESULT,
-	SetDefaultFolder:    proc "stdcall" (this: ^IFileDialog, psi: ^IShellItem) -> HRESULT,
-	SetFolder:           proc "stdcall" (this: ^IFileDialog, psi: ^IShellItem) -> HRESULT,
-	GetFolder:           proc "stdcall" (this: ^IFileDialog, ppsi: ^^IShellItem) -> HRESULT,
-	GetCurrentSelection: proc "stdcall" (this: ^IFileDialog, ppsi: ^^IShellItem) -> HRESULT,
-	SetFileName:         proc "stdcall" (this: ^IFileDialog, pszName: LPCWSTR) -> HRESULT,
-	GetFileName:         proc "stdcall" (this: ^IFileDialog, pszName: ^LPCWSTR) -> HRESULT,
-	SetTitle:            proc "stdcall" (this: ^IFileDialog, pszTitle: LPCWSTR) -> HRESULT,
-	SetOkButtonLabel:    proc "stdcall" (this: ^IFileDialog, pszText: LPCWSTR) -> HRESULT,
-	SetFileNameLabel:    proc "stdcall" (this: ^IFileDialog, pszLabel: LPCWSTR) -> HRESULT,
-	GetResult:           proc "stdcall" (this: ^IFileDialog, ppsi: ^^IShellItem) -> HRESULT,
-	AddPlace:            proc "stdcall" (this: ^IFileDialog, psi: ^IShellItem, fdap: FDAP) -> HRESULT,
-	SetDefaultExtension: proc "stdcall" (this: ^IFileDialog, pszDefaultExtension: LPCWSTR) -> HRESULT,
-	Close:               proc "stdcall" (this: ^IFileDialog, hr: HRESULT) -> HRESULT,
-	SetClientGuid:       proc "stdcall" (this: ^IFileDialog, guid: REFGUID) -> HRESULT,
-	ClearClientData:     proc "stdcall" (this: ^IFileDialog) -> HRESULT,
-	SetFilter:           proc "stdcall" (this: ^IFileDialog, pFilter: ^IShellItemFilter) -> HRESULT,
+	SetFileTypes:        proc "system" (this: ^IFileDialog, cFileTypes: UINT, rgFilterSpec: ^COMDLG_FILTERSPEC) -> HRESULT,
+	SetFileTypeIndex:    proc "system" (this: ^IFileDialog, iFileType: UINT) -> HRESULT,
+	GetFileTypeIndex:    proc "system" (this: ^IFileDialog, piFileType: ^UINT) -> HRESULT,
+	Advise:              proc "system" (this: ^IFileDialog, pfde: ^IFileDialogEvents, pdwCookie: ^DWORD) -> HRESULT,
+	Unadvise:            proc "system" (this: ^IFileDialog, dwCookie: DWORD) -> HRESULT,
+	SetOptions:          proc "system" (this: ^IFileDialog, fos: FILEOPENDIALOGOPTIONS) -> HRESULT,
+	GetOptions:          proc "system" (this: ^IFileDialog, pfos: ^FILEOPENDIALOGOPTIONS) -> HRESULT,
+	SetDefaultFolder:    proc "system" (this: ^IFileDialog, psi: ^IShellItem) -> HRESULT,
+	SetFolder:           proc "system" (this: ^IFileDialog, psi: ^IShellItem) -> HRESULT,
+	GetFolder:           proc "system" (this: ^IFileDialog, ppsi: ^^IShellItem) -> HRESULT,
+	GetCurrentSelection: proc "system" (this: ^IFileDialog, ppsi: ^^IShellItem) -> HRESULT,
+	SetFileName:         proc "system" (this: ^IFileDialog, pszName: LPCWSTR) -> HRESULT,
+	GetFileName:         proc "system" (this: ^IFileDialog, pszName: ^LPCWSTR) -> HRESULT,
+	SetTitle:            proc "system" (this: ^IFileDialog, pszTitle: LPCWSTR) -> HRESULT,
+	SetOkButtonLabel:    proc "system" (this: ^IFileDialog, pszText: LPCWSTR) -> HRESULT,
+	SetFileNameLabel:    proc "system" (this: ^IFileDialog, pszLabel: LPCWSTR) -> HRESULT,
+	GetResult:           proc "system" (this: ^IFileDialog, ppsi: ^^IShellItem) -> HRESULT,
+	AddPlace:            proc "system" (this: ^IFileDialog, psi: ^IShellItem, fdap: FDAP) -> HRESULT,
+	SetDefaultExtension: proc "system" (this: ^IFileDialog, pszDefaultExtension: LPCWSTR) -> HRESULT,
+	Close:               proc "system" (this: ^IFileDialog, hr: HRESULT) -> HRESULT,
+	SetClientGuid:       proc "system" (this: ^IFileDialog, guid: REFGUID) -> HRESULT,
+	ClearClientData:     proc "system" (this: ^IFileDialog) -> HRESULT,
+	SetFilter:           proc "system" (this: ^IFileDialog, pFilter: ^IShellItemFilter) -> HRESULT,
 }
 
 IFileOpenDialog :: struct #raw_union {
@@ -3658,8 +3660,8 @@ IFileOpenDialog :: struct #raw_union {
 }
 IFileOpenDialogVtbl :: struct {
 	using IFileDialogVtbl: IFileDialogVtbl,
-	GetResults:       proc "stdcall" (this: ^IFileOpenDialog, ppenum: ^^IShellItemArray) -> HRESULT,
-	GetSelectedItems: proc "stdcall" (this: ^IFileOpenDialog, ppsai: ^^IShellItemArray) -> HRESULT,
+	GetResults:       proc "system" (this: ^IFileOpenDialog, ppenum: ^^IShellItemArray) -> HRESULT,
+	GetSelectedItems: proc "system" (this: ^IFileOpenDialog, ppsai: ^^IShellItemArray) -> HRESULT,
 }
 
 IPropertyStore :: struct #raw_union {
@@ -3668,11 +3670,11 @@ IPropertyStore :: struct #raw_union {
 }
 IPropertyStoreVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	GetCount: proc "stdcall" (this: ^IPropertyStore, cProps: ^DWORD) -> HRESULT,
-	GetAt:    proc "stdcall" (this: ^IPropertyStore, iProp: DWORD, pkey: ^PROPERTYKEY) -> HRESULT,
-	GetValue: proc "stdcall" (this: ^IPropertyStore, key: REFPROPERTYKEY, pv: ^PROPVARIANT) -> HRESULT,
-	SetValue: proc "stdcall" (this: ^IPropertyStore, key: REFPROPERTYKEY, propvar: REFPROPVARIANT) -> HRESULT,
-	Commit:   proc "stdcall" (this: ^IPropertyStore) -> HRESULT,
+	GetCount: proc "system" (this: ^IPropertyStore, cProps: ^DWORD) -> HRESULT,
+	GetAt:    proc "system" (this: ^IPropertyStore, iProp: DWORD, pkey: ^PROPERTYKEY) -> HRESULT,
+	GetValue: proc "system" (this: ^IPropertyStore, key: REFPROPERTYKEY, pv: ^PROPVARIANT) -> HRESULT,
+	SetValue: proc "system" (this: ^IPropertyStore, key: REFPROPERTYKEY, propvar: REFPROPVARIANT) -> HRESULT,
+	Commit:   proc "system" (this: ^IPropertyStore) -> HRESULT,
 }
 
 IPropertyDescriptionList :: struct #raw_union {
@@ -3681,8 +3683,8 @@ IPropertyDescriptionList :: struct #raw_union {
 }
 IPropertyDescriptionListVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	GetCount: proc "stdcall" (this: ^IPropertyDescriptionList, pcElem: ^UINT) -> HRESULT,
-	GetAt:    proc "stdcall" (this: ^IPropertyDescriptionList, iElem: UINT, riid: REFIID, ppv: ^rawptr) -> HRESULT,
+	GetCount: proc "system" (this: ^IPropertyDescriptionList, pcElem: ^UINT) -> HRESULT,
+	GetAt:    proc "system" (this: ^IPropertyDescriptionList, iElem: UINT, riid: REFIID, ppv: ^rawptr) -> HRESULT,
 }
 
 IFileOperationProgressSink :: struct #raw_union {
@@ -3691,22 +3693,22 @@ IFileOperationProgressSink :: struct #raw_union {
 }
 IFileOperationProgressSinkVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	StartOperations:  proc "stdcall" (this: ^IFileOperationProgressSink) -> HRESULT,
-	FinishOperations: proc "stdcall" (this: ^IFileOperationProgressSink, hrResult: HRESULT) -> HRESULT,
-	PreRenameItem:    proc "stdcall" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, pszNewName: LPCWSTR) -> HRESULT,
-	PostRenameItem:   proc "stdcall" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, pszNewName: LPCWSTR, hrRename: HRESULT, psiNewlyCreated: ^IShellItem) -> HRESULT,
-	PreMoveItem:      proc "stdcall" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR) -> HRESULT,
-	PostMoveItem:     proc "stdcall" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR, hrMove: HRESULT, psiNewlyCreated: ^IShellItem) -> HRESULT,
-	PreCopyItem:      proc "stdcall" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR) -> HRESULT,
-	PostCopyItem:     proc "stdcall" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR, hrMove: HRESULT, psiNewlyCreated: ^IShellItem) -> HRESULT,
-	PreDeleteItem:    proc "stdcall" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem) -> HRESULT,
-	PostDeleteItem:   proc "stdcall" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, hrDelete: HRESULT, psiNewlyCreated: ^IShellItem) -> HRESULT,
-	PreNewItem:       proc "stdcall" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR) -> HRESULT,
-	PostNewItem:      proc "stdcall" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR, pszTemplateName: LPCWSTR, dwFileAttributes: DWORD, hrNew: HRESULT, psiNewItem: ^IShellItem) -> HRESULT,
-	UpdateProgress:   proc "stdcall" (this: ^IFileOperationProgressSink, iWorkTotal: UINT, iWorkSoFar: UINT) -> HRESULT,
-	ResetTimer:       proc "stdcall" (this: ^IFileOperationProgressSink) -> HRESULT,
-	PauseTimer:       proc "stdcall" (this: ^IFileOperationProgressSink) -> HRESULT,
-	ResumeTimer:      proc "stdcall" (this: ^IFileOperationProgressSink) -> HRESULT,
+	StartOperations:  proc "system" (this: ^IFileOperationProgressSink) -> HRESULT,
+	FinishOperations: proc "system" (this: ^IFileOperationProgressSink, hrResult: HRESULT) -> HRESULT,
+	PreRenameItem:    proc "system" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, pszNewName: LPCWSTR) -> HRESULT,
+	PostRenameItem:   proc "system" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, pszNewName: LPCWSTR, hrRename: HRESULT, psiNewlyCreated: ^IShellItem) -> HRESULT,
+	PreMoveItem:      proc "system" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR) -> HRESULT,
+	PostMoveItem:     proc "system" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR, hrMove: HRESULT, psiNewlyCreated: ^IShellItem) -> HRESULT,
+	PreCopyItem:      proc "system" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR) -> HRESULT,
+	PostCopyItem:     proc "system" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR, hrMove: HRESULT, psiNewlyCreated: ^IShellItem) -> HRESULT,
+	PreDeleteItem:    proc "system" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem) -> HRESULT,
+	PostDeleteItem:   proc "system" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiItem: ^IShellItem, hrDelete: HRESULT, psiNewlyCreated: ^IShellItem) -> HRESULT,
+	PreNewItem:       proc "system" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR) -> HRESULT,
+	PostNewItem:      proc "system" (this: ^IFileOperationProgressSink, dwFlags: DWORD, psiDestinationFolder: ^IShellItem, pszNewName: LPCWSTR, pszTemplateName: LPCWSTR, dwFileAttributes: DWORD, hrNew: HRESULT, psiNewItem: ^IShellItem) -> HRESULT,
+	UpdateProgress:   proc "system" (this: ^IFileOperationProgressSink, iWorkTotal: UINT, iWorkSoFar: UINT) -> HRESULT,
+	ResetTimer:       proc "system" (this: ^IFileOperationProgressSink) -> HRESULT,
+	PauseTimer:       proc "system" (this: ^IFileOperationProgressSink) -> HRESULT,
+	ResumeTimer:      proc "system" (this: ^IFileOperationProgressSink) -> HRESULT,
 }
 
 IFileSaveDialog :: struct #raw_union {
@@ -3715,11 +3717,11 @@ IFileSaveDialog :: struct #raw_union {
 }
 IFileSaveDialogVtbl :: struct {
 	using IFileDialogVtbl: IFileDialogVtbl,
-	SetSaveAsItem:          proc "stdcall" (this: ^IFileSaveDialog, psi: ^IShellItem) -> HRESULT,
-	SetProperties:          proc "stdcall" (this: ^IFileSaveDialog, pStore: ^IPropertyStore) -> HRESULT,
-	SetCollectedProperties: proc "stdcall" (this: ^IFileSaveDialog, pList: ^IPropertyDescriptionList, fAppendDefault: BOOL) -> HRESULT,
-	GetProperties:          proc "stdcall" (this: ^IFileSaveDialog, ppStore: ^^IPropertyStore) -> HRESULT,
-	ApplyProperties:        proc "stdcall" (this: ^IFileSaveDialog, psi: ^IShellItem, pStore: ^IPropertyStore, hwnd: HWND, pSink: ^IFileOperationProgressSink) -> HRESULT,
+	SetSaveAsItem:          proc "system" (this: ^IFileSaveDialog, psi: ^IShellItem) -> HRESULT,
+	SetProperties:          proc "system" (this: ^IFileSaveDialog, pStore: ^IPropertyStore) -> HRESULT,
+	SetCollectedProperties: proc "system" (this: ^IFileSaveDialog, pList: ^IPropertyDescriptionList, fAppendDefault: BOOL) -> HRESULT,
+	GetProperties:          proc "system" (this: ^IFileSaveDialog, ppStore: ^^IPropertyStore) -> HRESULT,
+	ApplyProperties:        proc "system" (this: ^IFileSaveDialog, psi: ^IShellItem, pStore: ^IPropertyStore, hwnd: HWND, pSink: ^IFileOperationProgressSink) -> HRESULT,
 }
 
 ITaskbarList :: struct #raw_union {
@@ -3728,11 +3730,11 @@ ITaskbarList :: struct #raw_union {
 }
 ITaskbarListVtbl :: struct {
 	using IUnknownVtbl: IUnknownVtbl,
-	HrInit: proc "stdcall" (this: ^ITaskbarList) -> HRESULT,
-	AddTab: proc "stdcall" (this: ^ITaskbarList, hwnd: HWND) -> HRESULT,
-	DeleteTab: proc "stdcall" (this: ^ITaskbarList, hwnd: HWND) -> HRESULT,
-	ActivateTab: proc "stdcall" (this: ^ITaskbarList, hwnd: HWND) -> HRESULT,
-	SetActiveAlt: proc "stdcall" (this: ^ITaskbarList, hwnd: HWND) -> HRESULT,
+	HrInit: proc "system" (this: ^ITaskbarList) -> HRESULT,
+	AddTab: proc "system" (this: ^ITaskbarList, hwnd: HWND) -> HRESULT,
+	DeleteTab: proc "system" (this: ^ITaskbarList, hwnd: HWND) -> HRESULT,
+	ActivateTab: proc "system" (this: ^ITaskbarList, hwnd: HWND) -> HRESULT,
+	SetActiveAlt: proc "system" (this: ^ITaskbarList, hwnd: HWND) -> HRESULT,
 }
 
 ITaskbarList2 :: struct #raw_union {
@@ -3741,7 +3743,7 @@ ITaskbarList2 :: struct #raw_union {
 }
 ITaskbarList2Vtbl :: struct {
 	using ITaskbarListVtbl: ITaskbarListVtbl,
-	MarkFullscreenWindow: proc "stdcall" (this: ^ITaskbarList2, hwnd: HWND, fFullscreen: BOOL) -> HRESULT,
+	MarkFullscreenWindow: proc "system" (this: ^ITaskbarList2, hwnd: HWND, fFullscreen: BOOL) -> HRESULT,
 }
 
 TBPFLAG :: enum c_int {
@@ -3786,18 +3788,18 @@ ITaskbarList3 :: struct #raw_union {
 }
 ITaskbarList3Vtbl :: struct {
 	using ITaskbarList2Vtbl: ITaskbarList2Vtbl,
-	SetProgressValue: proc "stdcall" (this: ^ITaskbarList3, hwnd: HWND, ullCompleted: ULONGLONG, ullTotal: ULONGLONG) -> HRESULT,
-	SetProgressState: proc "stdcall" (this: ^ITaskbarList3, hwnd: HWND, tbpFlags: TBPFLAG) -> HRESULT,
-	RegisterTab: proc "stdcall" (this: ^ITaskbarList3, hwndTab: HWND, hwndMDI: HWND) -> HRESULT,
-	UnregisterTab: proc "stdcall" (this: ^ITaskbarList3, hwndTab: HWND) -> HRESULT,
-	SetTabOrder: proc "stdcall" (this: ^ITaskbarList3, hwndTab: HWND, hwndInsertBefore: HWND) -> HRESULT,
-	SetTabActive: proc "stdcall" (this: ^ITaskbarList3, hwndTab: HWND, hwndMDI: HWND, dwReserved: DWORD) -> HRESULT,
-	ThumbBarAddButtons: proc "stdcall" (this: ^ITaskbarList3, hwnd: HWND, cButtons: UINT, pButton: LPTHUMBBUTTON) -> HRESULT,
-	ThumbBarUpdateButtons: proc "stdcall" (this: ^ITaskbarList3, hwnd: HWND, cButtons: UINT, pButton: LPTHUMBBUTTON) -> HRESULT,
-	ThumbBarSetImageList: proc "stdcall" (this: ^ITaskbarList3, hwnd: HWND, himl: HIMAGELIST) -> HRESULT,
-	SetOverlayIcon: proc "stdcall" (this: ^ITaskbarList3, hwnd: HWND, hIcon: HICON, pszDescription: LPCWSTR) -> HRESULT,
-	SetThumbnailTooltip: proc "stdcall" (this: ^ITaskbarList3, hwnd: HWND, pszTip: LPCWSTR) -> HRESULT,
-	SetThumbnailClip: proc "stdcall" (this: ^ITaskbarList3, hwnd: HWND, prcClip: ^RECT) -> HRESULT,
+	SetProgressValue: proc "system" (this: ^ITaskbarList3, hwnd: HWND, ullCompleted: ULONGLONG, ullTotal: ULONGLONG) -> HRESULT,
+	SetProgressState: proc "system" (this: ^ITaskbarList3, hwnd: HWND, tbpFlags: TBPFLAG) -> HRESULT,
+	RegisterTab: proc "system" (this: ^ITaskbarList3, hwndTab: HWND, hwndMDI: HWND) -> HRESULT,
+	UnregisterTab: proc "system" (this: ^ITaskbarList3, hwndTab: HWND) -> HRESULT,
+	SetTabOrder: proc "system" (this: ^ITaskbarList3, hwndTab: HWND, hwndInsertBefore: HWND) -> HRESULT,
+	SetTabActive: proc "system" (this: ^ITaskbarList3, hwndTab: HWND, hwndMDI: HWND, dwReserved: DWORD) -> HRESULT,
+	ThumbBarAddButtons: proc "system" (this: ^ITaskbarList3, hwnd: HWND, cButtons: UINT, pButton: LPTHUMBBUTTON) -> HRESULT,
+	ThumbBarUpdateButtons: proc "system" (this: ^ITaskbarList3, hwnd: HWND, cButtons: UINT, pButton: LPTHUMBBUTTON) -> HRESULT,
+	ThumbBarSetImageList: proc "system" (this: ^ITaskbarList3, hwnd: HWND, himl: HIMAGELIST) -> HRESULT,
+	SetOverlayIcon: proc "system" (this: ^ITaskbarList3, hwnd: HWND, hIcon: HICON, pszDescription: LPCWSTR) -> HRESULT,
+	SetThumbnailTooltip: proc "system" (this: ^ITaskbarList3, hwnd: HWND, pszTip: LPCWSTR) -> HRESULT,
+	SetThumbnailClip: proc "system" (this: ^ITaskbarList3, hwnd: HWND, prcClip: ^RECT) -> HRESULT,
 }
 
 MEMORYSTATUSEX :: struct {

+ 5 - 5
core/sys/windows/user32.odin

@@ -3,7 +3,7 @@ package sys_windows
 
 foreign import user32 "system:User32.lib"
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign user32 {
 	GetClassInfoW :: proc(hInstance: HINSTANCE, lpClassNAme: LPCWSTR, lpWndClass: ^WNDCLASSW) -> BOOL ---
 	GetClassInfoExW :: proc(hInsatnce: HINSTANCE, lpszClass: LPCWSTR, lpwcx: ^WNDCLASSEXW) -> BOOL ---
@@ -236,7 +236,7 @@ foreign user32 {
 	EnableMenuItem :: proc(hMenu: HMENU, uIDEnableItem: UINT, uEnable: UINT) -> BOOL ---
 }
 
-CreateWindowW :: #force_inline proc "stdcall" (
+CreateWindowW :: #force_inline proc "system" (
 	lpClassName: LPCTSTR,
 	lpWindowName: LPCTSTR,
 	dwStyle: DWORD,
@@ -266,7 +266,7 @@ CreateWindowW :: #force_inline proc "stdcall" (
 }
 
 when ODIN_ARCH == .amd64 {
-	@(default_calling_convention="stdcall")
+	@(default_calling_convention="system")
 	foreign user32 {
 		GetClassLongPtrW :: proc(hWnd: HWND, nIndex: c_int) -> ULONG_PTR ---
 		SetClassLongPtrW :: proc(hWnd: HWND, nIndex: c_int, dwNewLong: LONG_PTR) -> ULONG_PTR ---
@@ -312,8 +312,8 @@ Monitor_From_Flags :: enum DWORD {
 	MONITOR_DEFAULTTONEAREST = 0x00000002, // Returns a handle to the display monitor that is nearest to the window
 }
 
-Monitor_Enum_Proc :: #type proc "stdcall" (HMONITOR, HDC, LPRECT, LPARAM) -> BOOL
-Window_Enum_Proc :: #type proc "stdcall" (HWND, LPARAM) -> BOOL
+Monitor_Enum_Proc :: #type proc "system" (HMONITOR, HDC, LPRECT, LPARAM) -> BOOL
+Window_Enum_Proc :: #type proc "system" (HWND, LPARAM) -> BOOL
 
 USER_DEFAULT_SCREEN_DPI                    :: 96
 DPI_AWARENESS_CONTEXT                      :: distinct HANDLE

+ 1 - 1
core/sys/windows/userenv.odin

@@ -3,7 +3,7 @@ package sys_windows
 
 foreign import userenv "system:Userenv.lib"
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign userenv {
 	GetUserProfileDirectoryW :: proc(hToken: HANDLE,
 	                                 lpProfileDir: LPWSTR,

+ 1 - 1
core/sys/windows/ux_theme.odin

@@ -6,7 +6,7 @@ foreign import uxtheme "system:UxTheme.lib"
 MARGINS :: distinct [4]int
 PMARGINS :: ^MARGINS
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign uxtheme {
     IsThemeActive :: proc() -> BOOL ---
 }

+ 1 - 1
core/sys/windows/wgl.odin

@@ -66,7 +66,7 @@ GetExtensionsStringARBType  :: #type proc "c" (HDC) -> cstring
 	wglGetExtensionsStringARB:  GetExtensionsStringARBType
 
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign Opengl32 {
 	wglCreateContext          :: proc(hdc: HDC) -> HGLRC ---
 	wglMakeCurrent            :: proc(hdc: HDC, HGLRC: HGLRC) -> BOOL ---

+ 5482 - 0
core/sys/windows/winerror.odin

@@ -48,3 +48,5485 @@ ERROR_PIPE_BUSY              : DWORD : 231
 E_NOTIMPL :: HRESULT(-0x7fff_bfff) // 0x8000_4001
 
 SUCCEEDED :: #force_inline proc(#any_int result: int) -> bool { return result >= 0 }
+
+
+System_Error :: enum DWORD {
+	// The operation completed successfully.
+	SUCCESS = 0x0,
+	// Incorrect function.
+	INVALID_FUNCTION = 0x1,
+	// The system cannot find the file specified.
+	FILE_NOT_FOUND = 0x2,
+	// The system cannot find the path specified.
+	PATH_NOT_FOUND = 0x3,
+	// The system cannot open the file.
+	TOO_MANY_OPEN_FILES = 0x4,
+	// Access is denied.
+	ACCESS_DENIED = 0x5,
+	// The handle is invalid.
+	INVALID_HANDLE = 0x6,
+	// The storage control blocks were destroyed.
+	ARENA_TRASHED = 0x7,
+	// Not enough memory resources are available to process this command.
+	NOT_ENOUGH_MEMORY = 0x8,
+	// The storage control block address is invalid.
+	INVALID_BLOCK = 0x9,
+	// The environment is incorrect.
+	BAD_ENVIRONMENT = 0xA,
+	// An attempt was made to load a program with an incorrect format.
+	BAD_FORMAT = 0xB,
+	// The access code is invalid.
+	INVALID_ACCESS = 0xC,
+	// The data is invalid.
+	INVALID_DATA = 0xD,
+	// Not enough storage is available to complete this operation.
+	OUTOFMEMORY = 0xE,
+	// The system cannot find the drive specified.
+	INVALID_DRIVE = 0xF,
+	// The directory cannot be removed.
+	CURRENT_DIRECTORY = 0x10,
+	// The system cannot move the file to a different disk drive.
+	NOT_SAME_DEVICE = 0x11,
+	// There are no more files.
+	NO_MORE_FILES = 0x12,
+	// The media is write protected.
+	WRITE_PROTECT = 0x13,
+	// The system cannot find the device specified.
+	BAD_UNIT = 0x14,
+	// The device is not ready.
+	NOT_READY = 0x15,
+	// The device does not recognize the command.
+	BAD_COMMAND = 0x16,
+	// Data error cyclic redundancy check.
+	CRC = 0x17,
+	// The program issued a command but the command length is incorrect.
+	BAD_LENGTH = 0x18,
+	// The drive cannot locate a specific area or track on the disk.
+	SEEK = 0x19,
+	// The specified disk or diskette cannot be accessed.
+	NOT_DOS_DISK = 0x1A,
+	// The drive cannot find the sector requested.
+	SECTOR_NOT_FOUND = 0x1B,
+	// The printer is out of paper.
+	OUT_OF_PAPER = 0x1C,
+	// The system cannot write to the specified device.
+	WRITE_FAULT = 0x1D,
+	// The system cannot read from the specified device.
+	READ_FAULT = 0x1E,
+	// A device attached to the system is not functioning.
+	GEN_FAILURE = 0x1F,
+	// The process cannot access the file because it is being used by another process.
+	SHARING_VIOLATION = 0x20,
+	// The process cannot access the file because another process has locked a portion of the file.
+	LOCK_VIOLATION = 0x21,
+	// The wrong diskette is in the drive. Insert %2 Volume Serial Number: %3 into drive %1.
+	WRONG_DISK = 0x22,
+	// Too many files opened for sharing.
+	SHARING_BUFFER_EXCEEDED = 0x24,
+	// Reached the end of the file.
+	HANDLE_EOF = 0x26,
+	// The disk is full.
+	HANDLE_DISK_FULL = 0x27,
+	// The request is not supported.
+	NOT_SUPPORTED = 0x32,
+	// Windows cannot find the network path. Verify that the network path is correct and the destination computer is not busy or turned off. If Windows still cannot find the network path, contact your network administrator.
+	REM_NOT_LIST = 0x33,
+	// You were not connected because a duplicate name exists on the network. If joining a domain, go to System in Control Panel to change the computer name and try again. If joining a workgroup, choose another workgroup name.
+	DUP_NAME = 0x34,
+	// The network path was not found.
+	BAD_NETPATH = 0x35,
+	// The network is busy.
+	NETWORK_BUSY = 0x36,
+	// The specified network resource or device is no longer available.
+	DEV_NOT_EXIST = 0x37,
+	// The network BIOS command limit has been reached.
+	TOO_MANY_CMDS = 0x38,
+	// A network adapter hardware error occurred.
+	ADAP_HDW_ERR = 0x39,
+	// The specified server cannot perform the requested operation.
+	BAD_NET_RESP = 0x3A,
+	// An unexpected network error occurred.
+	UNEXP_NET_ERR = 0x3B,
+	// The remote adapter is not compatible.
+	BAD_REM_ADAP = 0x3C,
+	// The printer queue is full.
+	PRINTQ_FULL = 0x3D,
+	// Space to store the file waiting to be printed is not available on the server.
+	NO_SPOOL_SPACE = 0x3E,
+	// Your file waiting to be printed was deleted.
+	PRINT_CANCELLED = 0x3F,
+	// The specified network name is no longer available.
+	NETNAME_DELETED = 0x40,
+	// Network access is denied.
+	NETWORK_ACCESS_DENIED = 0x41,
+	// The network resource type is not correct.
+	BAD_DEV_TYPE = 0x42,
+	// The network name cannot be found.
+	BAD_NET_NAME = 0x43,
+	// The name limit for the local computer network adapter card was exceeded.
+	TOO_MANY_NAMES = 0x44,
+	// The network BIOS session limit was exceeded.
+	TOO_MANY_SESS = 0x45,
+	// The remote server has been paused or is in the process of being started.
+	SHARING_PAUSED = 0x46,
+	// No more connections can be made to this remote computer at this time because there are already as many connections as the computer can accept.
+	REQ_NOT_ACCEP = 0x47,
+	// The specified printer or disk device has been paused.
+	REDIR_PAUSED = 0x48,
+	// The file exists.
+	FILE_EXISTS = 0x50,
+	// The directory or file cannot be created.
+	CANNOT_MAKE = 0x52,
+	// Fail on INT 24.
+	FAIL_I24 = 0x53,
+	// Storage to process this request is not available.
+	OUT_OF_STRUCTURES = 0x54,
+	// The local device name is already in use.
+	ALREADY_ASSIGNED = 0x55,
+	// The specified network password is not correct.
+	INVALID_PASSWORD = 0x56,
+	// The parameter is incorrect.
+	INVALID_PARAMETER = 0x57,
+	// A write fault occurred on the network.
+	NET_WRITE_FAULT = 0x58,
+	// The system cannot start another process at this time.
+	NO_PROC_SLOTS = 0x59,
+	// Cannot create another system semaphore.
+	TOO_MANY_SEMAPHORES = 0x64,
+	// The exclusive semaphore is owned by another process.
+	EXCL_SEM_ALREADY_OWNED = 0x65,
+	// The semaphore is set and cannot be closed.
+	SEM_IS_SET = 0x66,
+	// The semaphore cannot be set again.
+	TOO_MANY_SEM_REQUESTS = 0x67,
+	// Cannot request exclusive semaphores at interrupt time.
+	INVALID_AT_INTERRUPT_TIME = 0x68,
+	// The previous ownership of this semaphore has ended.
+	SEM_OWNER_DIED = 0x69,
+	// Insert the diskette for drive %1.
+	SEM_USER_LIMIT = 0x6A,
+	// The program stopped because an alternate diskette was not inserted.
+	DISK_CHANGE = 0x6B,
+	// The disk is in use or locked by another process.
+	DRIVE_LOCKED = 0x6C,
+	// The pipe has been ended.
+	BROKEN_PIPE = 0x6D,
+	// The system cannot open the device or file specified.
+	OPEN_FAILED = 0x6E,
+	// The file name is too long.
+	BUFFER_OVERFLOW = 0x6F,
+	// There is not enough space on the disk.
+	DISK_FULL = 0x70,
+	// No more internal file identifiers available.
+	NO_MORE_SEARCH_HANDLES = 0x71,
+	// The target internal file identifier is incorrect.
+	INVALID_TARGET_HANDLE = 0x72,
+	// The IOCTL call made by the application program is not correct.
+	INVALID_CATEGORY = 0x75,
+	// The verify-on-write switch parameter value is not correct.
+	INVALID_VERIFY_SWITCH = 0x76,
+	// The system does not support the command requested.
+	BAD_DRIVER_LEVEL = 0x77,
+	// This function is not supported on this system.
+	CALL_NOT_IMPLEMENTED = 0x78,
+	// The semaphore timeout period has expired.
+	SEM_TIMEOUT = 0x79,
+	// The data area passed to a system call is too small.
+	INSUFFICIENT_BUFFER = 0x7A,
+	// The filename, directory name, or volume label syntax is incorrect.
+	INVALID_NAME = 0x7B,
+	// The system call level is not correct.
+	INVALID_LEVEL = 0x7C,
+	// The disk has no volume label.
+	NO_VOLUME_LABEL = 0x7D,
+	// The specified module could not be found.
+	MOD_NOT_FOUND = 0x7E,
+	// The specified procedure could not be found.
+	PROC_NOT_FOUND = 0x7F,
+	// There are no child processes to wait for.
+	WAIT_NO_CHILDREN = 0x80,
+	// The %1 application cannot be run in Win32 mode.
+	CHILD_NOT_COMPLETE = 0x81,
+	// Attempt to use a file handle to an open disk partition for an operation other than raw disk I/O.
+	DIRECT_ACCESS_HANDLE = 0x82,
+	// An attempt was made to move the file pointer before the beginning of the file.
+	NEGATIVE_SEEK = 0x83,
+	// The file pointer cannot be set on the specified device or file.
+	SEEK_ON_DEVICE = 0x84,
+	// A JOIN or SUBST command cannot be used for a drive that contains previously joined drives.
+	IS_JOIN_TARGET = 0x85,
+	// An attempt was made to use a JOIN or SUBST command on a drive that has already been joined.
+	IS_JOINED = 0x86,
+	// An attempt was made to use a JOIN or SUBST command on a drive that has already been substituted.
+	IS_SUBSTED = 0x87,
+	// The system tried to delete the JOIN of a drive that is not joined.
+	NOT_JOINED = 0x88,
+	// The system tried to delete the substitution of a drive that is not substituted.
+	NOT_SUBSTED = 0x89,
+	// The system tried to join a drive to a directory on a joined drive.
+	JOIN_TO_JOIN = 0x8A,
+	// The system tried to substitute a drive to a directory on a substituted drive.
+	SUBST_TO_SUBST = 0x8B,
+	// The system tried to join a drive to a directory on a substituted drive.
+	JOIN_TO_SUBST = 0x8C,
+	// The system tried to SUBST a drive to a directory on a joined drive.
+	SUBST_TO_JOIN = 0x8D,
+	// The system cannot perform a JOIN or SUBST at this time.
+	BUSY_DRIVE = 0x8E,
+	// The system cannot join or substitute a drive to or for a directory on the same drive.
+	SAME_DRIVE = 0x8F,
+	// The directory is not a subdirectory of the root directory.
+	DIR_NOT_ROOT = 0x90,
+	// The directory is not empty.
+	DIR_NOT_EMPTY = 0x91,
+	// The path specified is being used in a substitute.
+	IS_SUBST_PATH = 0x92,
+	// Not enough resources are available to process this command.
+	IS_JOIN_PATH = 0x93,
+	// The path specified cannot be used at this time.
+	PATH_BUSY = 0x94,
+	// An attempt was made to join or substitute a drive for which a directory on the drive is the target of a previous substitute.
+	IS_SUBST_TARGET = 0x95,
+	// System trace information was not specified in your CONFIG.SYS file, or tracing is disallowed.
+	SYSTEM_TRACE = 0x96,
+	// The number of specified semaphore events for DosMuxSemWait is not correct.
+	INVALID_EVENT_COUNT = 0x97,
+	// DosMuxSemWait did not execute; too many semaphores are already set.
+	TOO_MANY_MUXWAITERS = 0x98,
+	// The DosMuxSemWait list is not correct.
+	INVALID_LIST_FORMAT = 0x99,
+	// The volume label you entered exceeds the label character limit of the target file system.
+	LABEL_TOO_LONG = 0x9A,
+	// Cannot create another thread.
+	TOO_MANY_TCBS = 0x9B,
+	// The recipient process has refused the signal.
+	SIGNAL_REFUSED = 0x9C,
+	// The segment is already discarded and cannot be locked.
+	DISCARDED = 0x9D,
+	// The segment is already unlocked.
+	NOT_LOCKED = 0x9E,
+	// The address for the thread ID is not correct.
+	BAD_THREADID_ADDR = 0x9F,
+	// One or more arguments are not correct.
+	BAD_ARGUMENTS = 0xA0,
+	// The specified path is invalid.
+	BAD_PATHNAME = 0xA1,
+	// A signal is already pending.
+	SIGNAL_PENDING = 0xA2,
+	// No more threads can be created in the system.
+	MAX_THRDS_REACHED = 0xA4,
+	// Unable to lock a region of a file.
+	LOCK_FAILED = 0xA7,
+	// The requested resource is in use.
+	BUSY = 0xAA,
+	// Device's command support detection is in progress.
+	DEVICE_SUPPORT_IN_PROGRESS = 0xAB,
+	// A lock request was not outstanding for the supplied cancel region.
+	CANCEL_VIOLATION = 0xAD,
+	// The file system does not support atomic changes to the lock type.
+	ATOMIC_LOCKS_NOT_SUPPORTED = 0xAE,
+	// The system detected a segment number that was not correct.
+	INVALID_SEGMENT_NUMBER = 0xB4,
+	// The operating system cannot run %1.
+	INVALID_ORDINAL = 0xB6,
+	// Cannot create a file when that file already exists.
+	ALREADY_EXISTS = 0xB7,
+	// The flag passed is not correct.
+	INVALID_FLAG_NUMBER = 0xBA,
+	// The specified system semaphore name was not found.
+	SEM_NOT_FOUND = 0xBB,
+	// The operating system cannot run %1.
+	INVALID_STARTING_CODESEG = 0xBC,
+	// The operating system cannot run %1.
+	INVALID_STACKSEG = 0xBD,
+	// The operating system cannot run %1.
+	INVALID_MODULETYPE = 0xBE,
+	// Cannot run %1 in Win32 mode.
+	INVALID_EXE_SIGNATURE = 0xBF,
+	// The operating system cannot run %1.
+	EXE_MARKED_INVALID = 0xC0,
+	// %1 is not a valid Win32 application.
+	BAD_EXE_FORMAT = 0xC1,
+	// The operating system cannot run %1.
+	ITERATED_DATA_EXCEEDS_64k = 0xC2,
+	// The operating system cannot run %1.
+	INVALID_MINALLOCSIZE = 0xC3,
+	// The operating system cannot run this application program.
+	DYNLINK_FROM_INVALID_RING = 0xC4,
+	// The operating system is not presently configured to run this application.
+	IOPL_NOT_ENABLED = 0xC5,
+	// The operating system cannot run %1.
+	INVALID_SEGDPL = 0xC6,
+	// The operating system cannot run this application program.
+	AUTODATASEG_EXCEEDS_64k = 0xC7,
+	// The code segment cannot be greater than or equal to 64K.
+	RING2SEG_MUST_BE_MOVABLE = 0xC8,
+	// The operating system cannot run %1.
+	RELOC_CHAIN_XEEDS_SEGLIM = 0xC9,
+	// The operating system cannot run %1.
+	INFLOOP_IN_RELOC_CHAIN = 0xCA,
+	// The system could not find the environment option that was entered.
+	ENVVAR_NOT_FOUND = 0xCB,
+	// No process in the command subtree has a signal handler.
+	NO_SIGNAL_SENT = 0xCD,
+	// The filename or extension is too long.
+	FILENAME_EXCED_RANGE = 0xCE,
+	// The ring 2 stack is in use.
+	RING2_STACK_IN_USE = 0xCF,
+	// The global filename characters, * or ?, are entered incorrectly or too many global filename characters are specified.
+	META_EXPANSION_TOO_LONG = 0xD0,
+	// The signal being posted is not correct.
+	INVALID_SIGNAL_NUMBER = 0xD1,
+	// The signal handler cannot be set.
+	THREAD_1_INACTIVE = 0xD2,
+	// The segment is locked and cannot be reallocated.
+	LOCKED = 0xD4,
+	// Too many dynamic-link modules are attached to this program or dynamic-link module.
+	TOO_MANY_MODULES = 0xD6,
+	// Cannot nest calls to LoadModule.
+	NESTING_NOT_ALLOWED = 0xD7,
+	// This version of %1 is not compatible with the version of Windows you're running. Check your computer's system information and then contact the software publisher.
+	EXE_MACHINE_TYPE_MISMATCH = 0xD8,
+	// The image file %1 is signed, unable to modify.
+	EXE_CANNOT_MODIFY_SIGNED_BINARY = 0xD9,
+	// The image file %1 is strong signed, unable to modify.
+	EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY = 0xDA,
+	// This file is checked out or locked for editing by another user.
+	FILE_CHECKED_OUT = 0xDC,
+	// The file must be checked out before saving changes.
+	CHECKOUT_REQUIRED = 0xDD,
+	// The file type being saved or retrieved has been blocked.
+	BAD_FILE_TYPE = 0xDE,
+	// The file size exceeds the limit allowed and cannot be saved.
+	FILE_TOO_LARGE = 0xDF,
+	// Access Denied. Before opening files in this location, you must first add the web site to your trusted sites list, browse to the web site, and select the option to login automatically.
+	FORMS_AUTH_REQUIRED = 0xE0,
+	// Operation did not complete successfully because the file contains a virus or potentially unwanted software.
+	VIRUS_INFECTED = 0xE1,
+	// This file contains a virus or potentially unwanted software and cannot be opened. Due to the nature of this virus or potentially unwanted software, the file has been removed from this location.
+	VIRUS_DELETED = 0xE2,
+	// The pipe is local.
+	PIPE_LOCAL = 0xE5,
+	// The pipe state is invalid.
+	BAD_PIPE = 0xE6,
+	// All pipe instances are busy.
+	PIPE_BUSY = 0xE7,
+	// The pipe is being closed.
+	NO_DATA = 0xE8,
+	// No process is on the other end of the pipe.
+	PIPE_NOT_CONNECTED = 0xE9,
+	// More data is available.
+	MORE_DATA = 0xEA,
+	// The session was canceled.
+	VC_DISCONNECTED = 0xF0,
+	// The specified extended attribute name was invalid.
+	INVALID_EA_NAME = 0xFE,
+	// The extended attributes are inconsistent.
+	EA_LIST_INCONSISTENT = 0xFF,
+	// The wait operation timed out.
+	WAIT_TIMEOUT = 0x102,
+	// No more data is available.
+	NO_MORE_ITEMS = 0x103,
+	// The copy functions cannot be used.
+	CANNOT_COPY = 0x10A,
+	// The directory name is invalid.
+	DIRECTORY = 0x10B,
+	// The extended attributes did not fit in the buffer.
+	EAS_DIDNT_FIT = 0x113,
+	// The extended attribute file on the mounted file system is corrupt.
+	EA_FILE_CORRUPT = 0x114,
+	// The extended attribute table file is full.
+	EA_TABLE_FULL = 0x115,
+	// The specified extended attribute handle is invalid.
+	INVALID_EA_HANDLE = 0x116,
+	// The mounted file system does not support extended attributes.
+	EAS_NOT_SUPPORTED = 0x11A,
+	// Attempt to release mutex not owned by caller.
+	NOT_OWNER = 0x120,
+	// Too many posts were made to a semaphore.
+	TOO_MANY_POSTS = 0x12A,
+	// Only part of a ReadProcessMemory or WriteProcessMemory request was completed.
+	PARTIAL_COPY = 0x12B,
+	// The oplock request is denied.
+	OPLOCK_NOT_GRANTED = 0x12C,
+	// An invalid oplock acknowledgment was received by the system.
+	INVALID_OPLOCK_PROTOCOL = 0x12D,
+	// The volume is too fragmented to complete this operation.
+	DISK_TOO_FRAGMENTED = 0x12E,
+	// The file cannot be opened because it is in the process of being deleted.
+	DELETE_PENDING = 0x12F,
+	// Short name settings may not be changed on this volume due to the global registry setting.
+	INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING = 0x130,
+	// Short names are not enabled on this volume.
+	SHORT_NAMES_NOT_ENABLED_ON_VOLUME = 0x131,
+	// The security stream for the given volume is in an inconsistent state. Please run CHKDSK on the volume.
+	SECURITY_STREAM_IS_INCONSISTENT = 0x132,
+	// A requested file lock operation cannot be processed due to an invalid byte range.
+	INVALID_LOCK_RANGE = 0x133,
+	// The subsystem needed to support the image type is not present.
+	IMAGE_SUBSYSTEM_NOT_PRESENT = 0x134,
+	// The specified file already has a notification GUID associated with it.
+	NOTIFICATION_GUID_ALREADY_DEFINED = 0x135,
+	// An invalid exception handler routine has been detected.
+	INVALID_EXCEPTION_HANDLER = 0x136,
+	// Duplicate privileges were specified for the token.
+	DUPLICATE_PRIVILEGES = 0x137,
+	// No ranges for the specified operation were able to be processed.
+	NO_RANGES_PROCESSED = 0x138,
+	// Operation is not allowed on a file system internal file.
+	NOT_ALLOWED_ON_SYSTEM_FILE = 0x139,
+	// The physical resources of this disk have been exhausted.
+	DISK_RESOURCES_EXHAUSTED = 0x13A,
+	// The token representing the data is invalid.
+	INVALID_TOKEN = 0x13B,
+	// The device does not support the command feature.
+	DEVICE_FEATURE_NOT_SUPPORTED = 0x13C,
+	// The system cannot find message text for message number 0x%1 in the message file for %2.
+	MR_MID_NOT_FOUND = 0x13D,
+	// The scope specified was not found.
+	SCOPE_NOT_FOUND = 0x13E,
+	// The Central Access Policy specified is not defined on the target machine.
+	UNDEFINED_SCOPE = 0x13F,
+	// The Central Access Policy obtained from Active Directory is invalid.
+	INVALID_CAP = 0x140,
+	// The device is unreachable.
+	DEVICE_UNREACHABLE = 0x141,
+	// The target device has insufficient resources to complete the operation.
+	DEVICE_NO_RESOURCES = 0x142,
+	// A data integrity checksum error occurred. Data in the file stream is corrupt.
+	DATA_CHECKSUM_ERROR = 0x143,
+	// An attempt was made to modify both a KERNEL and normal Extended Attribute EA in the same operation.
+	INTERMIXED_KERNEL_EA_OPERATION = 0x144,
+	// Device does not support file-level TRIM.
+	FILE_LEVEL_TRIM_NOT_SUPPORTED = 0x146,
+	// The command specified a data offset that does not align to the device's granularity/alignment.
+	OFFSET_ALIGNMENT_VIOLATION = 0x147,
+	// The command specified an invalid field in its parameter list.
+	INVALID_FIELD_IN_PARAMETER_LIST = 0x148,
+	// An operation is currently in progress with the device.
+	OPERATION_IN_PROGRESS = 0x149,
+	// An attempt was made to send down the command via an invalid path to the target device.
+	BAD_DEVICE_PATH = 0x14A,
+	// The command specified a number of descriptors that exceeded the maximum supported by the device.
+	TOO_MANY_DESCRIPTORS = 0x14B,
+	// Scrub is disabled on the specified file.
+	SCRUB_DATA_DISABLED = 0x14C,
+	// The storage device does not provide redundancy.
+	NOT_REDUNDANT_STORAGE = 0x14D,
+	// An operation is not supported on a resident file.
+	RESIDENT_FILE_NOT_SUPPORTED = 0x14E,
+	// An operation is not supported on a compressed file.
+	COMPRESSED_FILE_NOT_SUPPORTED = 0x14F,
+	// An operation is not supported on a directory.
+	DIRECTORY_NOT_SUPPORTED = 0x150,
+	// The specified copy of the requested data could not be read.
+	NOT_READ_FROM_COPY = 0x151,
+	// No action was taken as a system reboot is required.
+	FAIL_NOACTION_REBOOT = 0x15E,
+	// The shutdown operation failed.
+	FAIL_SHUTDOWN = 0x15F,
+	// The restart operation failed.
+	FAIL_RESTART = 0x160,
+	// The maximum number of sessions has been reached.
+	MAX_SESSIONS_REACHED = 0x161,
+	// The thread is already in background processing mode.
+	THREAD_MODE_ALREADY_BACKGROUND = 0x190,
+	// The thread is not in background processing mode.
+	THREAD_MODE_NOT_BACKGROUND = 0x191,
+	// The process is already in background processing mode.
+	PROCESS_MODE_ALREADY_BACKGROUND = 0x192,
+	// The process is not in background processing mode.
+	PROCESS_MODE_NOT_BACKGROUND = 0x193,
+	// Attempt to access invalid address.
+	INVALID_ADDRESS = 0x1E7,
+
+	// User profile cannot be loaded.
+	USER_PROFILE_LOAD = 0x1F4,
+	// Arithmetic result exceeded 32 bits.
+	ARITHMETIC_OVERFLOW = 0x216,
+	// There is a process on other end of the pipe.
+	PIPE_CONNECTED = 0x217,
+	// Waiting for a process to open the other end of the pipe.
+	PIPE_LISTENING = 0x218,
+	// Application verifier has found an error in the current process.
+	VERIFIER_STOP = 0x219,
+	// An error occurred in the ABIOS subsystem.
+	ABIOS_ERROR = 0x21A,
+	// A warning occurred in the WX86 subsystem.
+	WX86_WARNING = 0x21B,
+	// An error occurred in the WX86 subsystem.
+	WX86_ERROR = 0x21C,
+	// An attempt was made to cancel or set a timer that has an associated APC and the subject thread is not the thread that originally set the timer with an associated APC routine.
+	TIMER_NOT_CANCELED = 0x21D,
+	// Unwind exception code.
+	UNWIND = 0x21E,
+	// An invalid or unaligned stack was encountered during an unwind operation.
+	BAD_STACK = 0x21F,
+	// An invalid unwind target was encountered during an unwind operation.
+	INVALID_UNWIND_TARGET = 0x220,
+	// Invalid Object Attributes specified to NtCreatePort or invalid Port Attributes specified to NtConnectPort
+	INVALID_PORT_ATTRIBUTES = 0x221,
+	// Length of message passed to NtRequestPort or NtRequestWaitReplyPort was longer than the maximum message allowed by the port.
+	PORT_MESSAGE_TOO_LONG = 0x222,
+	// An attempt was made to lower a quota limit below the current usage.
+	INVALID_QUOTA_LOWER = 0x223,
+	// An attempt was made to attach to a device that was already attached to another device.
+	DEVICE_ALREADY_ATTACHED = 0x224,
+	// An attempt was made to execute an instruction at an unaligned address and the host system does not support unaligned instruction references.
+	INSTRUCTION_MISALIGNMENT = 0x225,
+	// Profiling not started.
+	PROFILING_NOT_STARTED = 0x226,
+	// Profiling not stopped.
+	PROFILING_NOT_STOPPED = 0x227,
+	// The passed ACL did not contain the minimum required information.
+	COULD_NOT_INTERPRET = 0x228,
+	// The number of active profiling objects is at the maximum and no more may be started.
+	PROFILING_AT_LIMIT = 0x229,
+	// Used to indicate that an operation cannot continue without blocking for I/O.
+	CANT_WAIT = 0x22A,
+	// Indicates that a thread attempted to terminate itself by default (called NtTerminateThread with NULL) and it was the last thread in the current process.
+	CANT_TERMINATE_SELF = 0x22B,
+	// If an MM error is returned which is not defined in the standard FsRtl filter, it is converted to one of the following errors which is guaranteed to be in the filter. In this case information is lost, however, the filter correctly handles the exception.
+	UNEXPECTED_MM_CREATE_ERR = 0x22C,
+	// If an MM error is returned which is not defined in the standard FsRtl filter, it is converted to one of the following errors which is guaranteed to be in the filter. In this case information is lost, however, the filter correctly handles the exception.
+	UNEXPECTED_MM_MAP_ERROR = 0x22D,
+	// If an MM error is returned which is not defined in the standard FsRtl filter, it is converted to one of the following errors which is guaranteed to be in the filter. In this case information is lost, however, the filter correctly handles the exception.
+	UNEXPECTED_MM_EXTEND_ERR = 0x22E,
+	// A malformed function table was encountered during an unwind operation.
+	BAD_FUNCTION_TABLE = 0x22F,
+	// Indicates that an attempt was made to assign protection to a file system file or directory and one of the SIDs in the security descriptor could not be translated into a GUID that could be stored by the file system. This causes the protection attempt to fail, which may cause a file creation attempt to fail.
+	NO_GUID_TRANSLATION = 0x230,
+	// Indicates that an attempt was made to grow an LDT by setting its size, or that the size was not an even number of selectors.
+	INVALID_LDT_SIZE = 0x231,
+	// Indicates that the starting value for the LDT information was not an integral multiple of the selector size.
+	INVALID_LDT_OFFSET = 0x233,
+	// Indicates that the user supplied an invalid descriptor when trying to set up Ldt descriptors.
+	INVALID_LDT_DESCRIPTOR = 0x234,
+	// Indicates a process has too many threads to perform the requested action. For example, assignment of a primary token may only be performed when a process has zero or one threads.
+	TOO_MANY_THREADS = 0x235,
+	// An attempt was made to operate on a thread within a specific process, but the thread specified is not in the process specified.
+	THREAD_NOT_IN_PROCESS = 0x236,
+	// Page file quota was exceeded.
+	PAGEFILE_QUOTA_EXCEEDED = 0x237,
+	// The Netlogon service cannot start because another Netlogon service running in the domain conflicts with the specified role.
+	LOGON_SERVER_CONFLICT = 0x238,
+	// The SAM database on a Windows Server is significantly out of synchronization with the copy on the Domain Controller. A complete synchronization is required.
+	SYNCHRONIZATION_REQUIRED = 0x239,
+	// The NtCreateFile API failed. This error should never be returned to an application, it is a place holder for the Windows Lan Manager Redirector to use in its internal error mapping routines.
+	NET_OPEN_FAILED = 0x23A,
+	// {Privilege Failed} The I/O permissions for the process could not be changed.
+	IO_PRIVILEGE_FAILED = 0x23B,
+	// {Application Exit by CTRL+C} The application terminated as a result of a CTRL+C.
+	CONTROL_C_EXIT = 0x23C,
+	// {Missing System File} The required system file %hs is bad or missing.
+	MISSING_SYSTEMFILE = 0x23D,
+	// {Application Error} The exception %s (0x%08lx) occurred in the application at location 0x%08lx.
+	UNHANDLED_EXCEPTION = 0x23E,
+	// {Application Error} The application was unable to start correctly (0x%lx). Click OK to close the application.
+	APP_INIT_FAILURE = 0x23F,
+	// {Unable to Create Paging File} The creation of the paging file %hs failed (%lx). The requested size was %ld.
+	PAGEFILE_CREATE_FAILED = 0x240,
+	// Windows cannot verify the digital signature for this file. A recent hardware or software change might have installed a file that is signed incorrectly or damaged, or that might be malicious software from an unknown source.
+	INVALID_IMAGE_HASH = 0x241,
+	// {No Paging File Specified} No paging file was specified in the system configuration.
+	NO_PAGEFILE = 0x242,
+	// {EXCEPTION} A real-mode application issued a floating-point instruction and floating-point hardware is not present.
+	ILLEGAL_FLOAT_CONTEXT = 0x243,
+	// An event pair synchronization operation was performed using the thread specific client/server event pair object, but no event pair object was associated with the thread.
+	NO_EVENT_PAIR = 0x244,
+	// A Windows Server has an incorrect configuration.
+	DOMAIN_CTRLR_CONFIG_ERROR = 0x245,
+	// An illegal character was encountered. For a multi-byte character set this includes a lead byte without a succeeding trail byte. For the Unicode character set this includes the characters 0xFFFF and 0xFFFE.
+	ILLEGAL_CHARACTER = 0x246,
+	// The Unicode character is not defined in the Unicode character set installed on the system.
+	UNDEFINED_CHARACTER = 0x247,
+	// The paging file cannot be created on a floppy diskette.
+	FLOPPY_VOLUME = 0x248,
+	// The system BIOS failed to connect a system interrupt to the device or bus for which the device is connected.
+	BIOS_FAILED_TO_CONNECT_INTERRUPT = 0x249,
+	// This operation is only allowed for the Primary Domain Controller of the domain.
+	BACKUP_CONTROLLER = 0x24A,
+	// An attempt was made to acquire a mutant such that its maximum count would have been exceeded.
+	MUTANT_LIMIT_EXCEEDED = 0x24B,
+	// A volume has been accessed for which a file system driver is required that has not yet been loaded.
+	FS_DRIVER_REQUIRED = 0x24C,
+	// {Registry File Failure} The registry cannot load the hive (file): %hs or its log or alternate. It is corrupt, absent, or not writable.
+	CANNOT_LOAD_REGISTRY_FILE = 0x24D,
+	// {Unexpected Failure in DebugActiveProcess} An unexpected failure occurred while processing a DebugActiveProcess API request. You may choose OK to terminate the process, or Cancel to ignore the error.
+	DEBUG_ATTACH_FAILED = 0x24E,
+	// {Fatal System Error} The %hs system process terminated unexpectedly with a status of 0x%08x (0x%08x 0x%08x). The system has been shut down.
+	SYSTEM_PROCESS_TERMINATED = 0x24F,
+	// {Data Not Accepted} The TDI client could not handle the data received during an indication.
+	DATA_NOT_ACCEPTED = 0x250,
+	// NTVDM encountered a hard error.
+	VDM_HARD_ERROR = 0x251,
+	// {Cancel Timeout} The driver %hs failed to complete a cancelled I/O request in the allotted time.
+	DRIVER_CANCEL_TIMEOUT = 0x252,
+	// {Reply Message Mismatch} An attempt was made to reply to an LPC message, but the thread specified by the client ID in the message was not waiting on that message.
+	REPLY_MESSAGE_MISMATCH = 0x253,
+	// {Delayed Write Failed} Windows was unable to save all the data for the file %hs. The data has been lost. This error may be caused by a failure of your computer hardware or network connection. Please try to save this file elsewhere.
+	LOST_WRITEBEHIND_DATA = 0x254,
+	// The parameter(s) passed to the server in the client/server shared memory window were invalid. Too much data may have been put in the shared memory window.
+	CLIENT_SERVER_PARAMETERS_INVALID = 0x255,
+	// The stream is not a tiny stream.
+	NOT_TINY_STREAM = 0x256,
+	// The request must be handled by the stack overflow code.
+	STACK_OVERFLOW_READ = 0x257,
+	// Internal OFS status codes indicating how an allocation operation is handled. Either it is retried after the containing onode is moved or the extent stream is converted to a large stream.
+	CONVERT_TO_LARGE = 0x258,
+	// The attempt to find the object found an object matching by ID on the volume but it is out of the scope of the handle used for the operation.
+	FOUND_OUT_OF_SCOPE = 0x259,
+	// The bucket array must be grown. Retry transaction after doing so.
+	ALLOCATE_BUCKET = 0x25A,
+	// The user/kernel marshalling buffer has overflowed.
+	MARSHALL_OVERFLOW = 0x25B,
+	// The supplied variant structure contains invalid data.
+	INVALID_VARIANT = 0x25C,
+	// The specified buffer contains ill-formed data.
+	BAD_COMPRESSION_BUFFER = 0x25D,
+	// {Audit Failed} An attempt to generate a security audit failed.
+	AUDIT_FAILED = 0x25E,
+	// The timer resolution was not previously set by the current process.
+	TIMER_RESOLUTION_NOT_SET = 0x25F,
+	// There is insufficient account information to log you on.
+	INSUFFICIENT_LOGON_INFO = 0x260,
+	// {Invalid DLL Entrypoint} The dynamic link library %hs is not written correctly. The stack pointer has been left in an inconsistent state. The entrypoint should be declared as WINAPI or STDCALL. Select YES to fail the DLL load. Select NO to continue execution. Selecting NO may cause the application to operate incorrectly.
+	BAD_DLL_ENTRYPOINT = 0x261,
+	// {Invalid Service Callback Entrypoint} The %hs service is not written correctly. The stack pointer has been left in an inconsistent state. The callback entrypoint should be declared as WINAPI or STDCALL. Selecting OK will cause the service to continue operation. However, the service process may operate incorrectly.
+	BAD_SERVICE_ENTRYPOINT = 0x262,
+	// There is an IP address conflict with another system on the network.
+	IP_ADDRESS_CONFLICT1 = 0x263,
+	// There is an IP address conflict with another system on the network.
+	IP_ADDRESS_CONFLICT2 = 0x264,
+	// {Low On Registry Space} The system has reached the maximum size allowed for the system part of the registry. Additional storage requests will be ignored.
+	REGISTRY_QUOTA_LIMIT = 0x265,
+	// A callback return system service cannot be executed when no callback is active.
+	NO_CALLBACK_ACTIVE = 0x266,
+	// The password provided is too short to meet the policy of your user account. Please choose a longer password.
+	PWD_TOO_SHORT = 0x267,
+	// The policy of your user account does not allow you to change passwords too frequently. This is done to prevent users from changing back to a familiar, but potentially discovered, password. If you feel your password has been compromised then please contact your administrator immediately to have a new one assigned.
+	PWD_TOO_RECENT = 0x268,
+	// You have attempted to change your password to one that you have used in the past. The policy of your user account does not allow this. Please select a password that you have not previously used.
+	PWD_HISTORY_CONFLICT = 0x269,
+	// The specified compression format is unsupported.
+	UNSUPPORTED_COMPRESSION = 0x26A,
+	// The specified hardware profile configuration is invalid.
+	INVALID_HW_PROFILE = 0x26B,
+	// The specified Plug and Play registry device path is invalid.
+	INVALID_PLUGPLAY_DEVICE_PATH = 0x26C,
+	// The specified quota list is internally inconsistent with its descriptor.
+	QUOTA_LIST_INCONSISTENT = 0x26D,
+	// {Windows Evaluation Notification} The evaluation period for this installation of Windows has expired. This system will shutdown in 1 hour. To restore access to this installation of Windows, please upgrade this installation using a licensed distribution of this product.
+	EVALUATION_EXPIRATION = 0x26E,
+	// {Illegal System DLL Relocation} The system DLL %hs was relocated in memory. The application will not run properly. The relocation occurred because the DLL %hs occupied an address range reserved for Windows system DLLs. The vendor supplying the DLL should be contacted for a new DLL.
+	ILLEGAL_DLL_RELOCATION = 0x26F,
+	// {DLL Initialization Failed} The application failed to initialize because the window station is shutting down.
+	DLL_INIT_FAILED_LOGOFF = 0x270,
+	// The validation process needs to continue on to the next step.
+	VALIDATE_CONTINUE = 0x271,
+	// There are no more matches for the current index enumeration.
+	NO_MORE_MATCHES = 0x272,
+	// The range could not be added to the range list because of a conflict.
+	RANGE_LIST_CONFLICT = 0x273,
+	// The server process is running under a SID different than that required by client.
+	SERVER_SID_MISMATCH = 0x274,
+	// A group marked use for deny only cannot be enabled.
+	CANT_ENABLE_DENY_ONLY = 0x275,
+	// {EXCEPTION} Multiple floating point faults.
+	FLOAT_MULTIPLE_FAULTS = 0x276,
+	// {EXCEPTION} Multiple floating point traps.
+	FLOAT_MULTIPLE_TRAPS = 0x277,
+	// The requested interface is not supported.
+	NOINTERFACE = 0x278,
+	// {System Standby Failed} The driver %hs does not support standby mode. Updating this driver may allow the system to go to standby mode.
+	DRIVER_FAILED_SLEEP = 0x279,
+	// The system file %1 has become corrupt and has been replaced.
+	CORRUPT_SYSTEM_FILE = 0x27A,
+	// {Virtual Memory Minimum Too Low} Your system is low on virtual memory. Windows is increasing the size of your virtual memory paging file. During this process, memory requests for some applications may be denied. For more information, see Help.
+	COMMITMENT_MINIMUM = 0x27B,
+	// A device was removed so enumeration must be restarted.
+	PNP_RESTART_ENUMERATION = 0x27C,
+	// {Fatal System Error} The system image %s is not properly signed. The file has been replaced with the signed file. The system has been shut down.
+	SYSTEM_IMAGE_BAD_SIGNATURE = 0x27D,
+	// Device will not start without a reboot.
+	PNP_REBOOT_REQUIRED = 0x27E,
+	// There is not enough power to complete the requested operation.
+	INSUFFICIENT_POWER = 0x27F,
+	// MULTIPLE_FAULT_VIOLATION = , = 0x281,
+	MULTIPLE_FAULT_VIOLATION = 0x280, // The system is in the process of shutting down.
+ // An attempt to remove a processes DebugPort was made, but a port was not already associated with the process.
+	PORT_NOT_SET = 0x282,
+	// This version of Windows is not compatible with the behavior version of directory forest, domain or domain controller.
+	DS_VERSION_CHECK_FAILURE = 0x283,
+	// The specified range could not be found in the range list.
+	RANGE_NOT_FOUND = 0x284,
+	// The driver was not loaded because the system is booting into safe mode.
+	NOT_SAFE_MODE_DRIVER = 0x286,
+	// The driver was not loaded because it failed its initialization call.
+	FAILED_DRIVER_ENTRY = 0x287,
+	// The "%hs" encountered an error while applying power or reading the device configuration. This may be caused by a failure of your hardware or by a poor connection.
+	DEVICE_ENUMERATION_ERROR = 0x288,
+	// The create operation failed because the name contained at least one mount point which resolves to a volume to which the specified device object is not attached.
+	MOUNT_POINT_NOT_RESOLVED = 0x289,
+	// The device object parameter is either not a valid device object or is not attached to the volume specified by the file name.
+	INVALID_DEVICE_OBJECT_PARAMETER = 0x28A,
+	// A Machine Check Error has occurred. Please check the system eventlog for additional information.
+	MCA_OCCURED = 0x28B,
+	// There was error [%2] processing the driver database.
+	DRIVER_DATABASE_ERROR = 0x28C,
+	// System hive size has exceeded its limit.
+	SYSTEM_HIVE_TOO_LARGE = 0x28D,
+	// The driver could not be loaded because a previous version of the driver is still in memory.
+	DRIVER_FAILED_PRIOR_UNLOAD = 0x28E,
+	// {Volume Shadow Copy Service} Please wait while the Volume Shadow Copy Service prepares volume %hs for hibernation.
+	VOLSNAP_PREPARE_HIBERNATE = 0x28F,
+	// The system has failed to hibernate (The error code is %hs). Hibernation will be disabled until the system is restarted.
+	HIBERNATION_FAILURE = 0x290,
+	// The password provided is too long to meet the policy of your user account. Please choose a shorter password.
+	PWD_TOO_LONG = 0x291,
+	// The requested operation could not be completed due to a file system limitation.
+	FILE_SYSTEM_LIMITATION = 0x299,
+	// An assertion failure has occurred.
+	ASSERTION_FAILURE = 0x29C,
+	// An error occurred in the ACPI subsystem.
+	ACPI_ERROR = 0x29D,
+	// WOW Assertion Error.
+	WOW_ASSERTION = 0x29E,
+	// A device is missing in the system BIOS MPS table. This device will not be used. Please contact your system vendor for system BIOS update.
+	PNP_BAD_MPS_TABLE = 0x29F,
+	// A translator failed to translate resources.
+	PNP_TRANSLATION_FAILED = 0x2A0,
+	// A IRQ translator failed to translate resources.
+	PNP_IRQ_TRANSLATION_FAILED = 0x2A1,
+	// Driver %2 returned invalid ID for a child device (%3).
+	PNP_INVALID_ID = 0x2A2,
+	// {Kernel Debugger Awakened} the system debugger was awakened by an interrupt.
+	WAKE_SYSTEM_DEBUGGER = 0x2A3,
+	// {Handles Closed} Handles to objects have been automatically closed as a result of the requested operation.
+	HANDLES_CLOSED = 0x2A4,
+	// {Too Much Information} The specified access control list (ACL) contained more information than was expected.
+	EXTRANEOUS_INFORMATION = 0x2A5,
+	// This warning level status indicates that the transaction state already exists for the registry sub-tree, but that a transaction commit was previously aborted. The commit has NOT been completed, but has not been rolled back either (so it may still be committed if desired).
+	RXACT_COMMIT_NECESSARY = 0x2A6,
+	// {Media Changed} The media may have changed.
+	MEDIA_CHECK = 0x2A7,
+	// {GUID Substitution} During the translation of a global identifier (GUID) to a Windows security ID SID, no administratively-defined GUID prefix was found. A substitute prefix was used, which will not compromise system security. However, this may provide a more restrictive access than intended.
+	GUID_SUBSTITUTION_MADE = 0x2A8,
+	// The create operation stopped after reaching a symbolic link.
+	STOPPED_ON_SYMLINK = 0x2A9,
+	// A long jump has been executed.
+	LONGJUMP = 0x2AA,
+	// The Plug and Play query operation was not successful.
+	PLUGPLAY_QUERY_VETOED = 0x2AB,
+	// A frame consolidation has been executed.
+	UNWIND_CONSOLIDATE = 0x2AC,
+	// {Registry Hive Recovered} Registry hive (file): %hs was corrupted and it has been recovered. Some data might have been lost.
+	REGISTRY_HIVE_RECOVERED = 0x2AD,
+	// The application is attempting to run executable code from the module %hs. This may be insecure. An alternative, %hs, is available. Should the application use the secure module %hs?
+	DLL_MIGHT_BE_INSECURE = 0x2AE,
+	// The application is loading executable code from the module %hs. This is secure, but may be incompatible with previous releases of the operating system. An alternative, %hs, is available. Should the application use the secure module %hs?
+	DLL_MIGHT_BE_INCOMPATIBLE = 0x2AF,
+	// Debugger did not handle the exception.
+	DBG_EXCEPTION_NOT_HANDLED = 0x2B0,
+	// Debugger will reply later.
+	DBG_REPLY_LATER = 0x2B1,
+	// Debugger cannot provide handle.
+	DBG_UNABLE_TO_PROVIDE_HANDLE = 0x2B2,
+	// Debugger terminated thread.
+	DBG_TERMINATE_THREAD = 0x2B3,
+	// Debugger terminated process.
+	DBG_TERMINATE_PROCESS = 0x2B4,
+	// Debugger got control C.
+	DBG_CONTROL_C = 0x2B5,
+	// Debugger printed exception on control C.
+	DBG_PRINTEXCEPTION_C = 0x2B6,
+	// Debugger received RIP exception.
+	DBG_RIPEXCEPTION = 0x2B7,
+	// Debugger received control break.
+	DBG_CONTROL_BREAK = 0x2B8,
+	// Debugger command communication exception.
+	DBG_COMMAND_EXCEPTION = 0x2B9,
+	// {Object Exists} An attempt was made to create an object and the object name already existed.
+	OBJECT_NAME_EXISTS = 0x2BA,
+	// {Thread Suspended} A thread termination occurred while the thread was suspended. The thread was resumed, and termination proceeded.
+	THREAD_WAS_SUSPENDED = 0x2BB,
+	// {Image Relocated} An image file could not be mapped at the address specified in the image file. Local fixups must be performed on this image.
+	IMAGE_NOT_AT_BASE = 0x2BC,
+	// This informational level status indicates that a specified registry sub-tree transaction state did not yet exist and had to be created.
+	RXACT_STATE_CREATED = 0x2BD,
+	// {Segment Load} A virtual DOS machine (VDM) is loading, unloading, or moving an MS-DOS or Win16 program segment image. An exception is raised so a debugger can load, unload or track symbols and breakpoints within these 16-bit segments.
+	SEGMENT_NOTIFICATION = 0x2BE,
+	// {Invalid Current Directory} The process cannot switch to the startup current directory %hs. Select OK to set current directory to %hs, or select CANCEL to exit.
+	BAD_CURRENT_DIRECTORY = 0x2BF,
+	// {Redundant Read} To satisfy a read request, the NT fault-tolerant file system successfully read the requested data from a redundant copy. This was done because the file system encountered a failure on a member of the fault-tolerant volume, but was unable to reassign the failing area of the device.
+	FT_READ_RECOVERY_FROM_BACKUP = 0x2C0,
+	// {Redundant Write} To satisfy a write request, the NT fault-tolerant file system successfully wrote a redundant copy of the information. This was done because the file system encountered a failure on a member of the fault-tolerant volume, but was not able to reassign the failing area of the device.
+	FT_WRITE_RECOVERY = 0x2C1,
+	// {Machine Type Mismatch} The image file %hs is valid, but is for a machine type other than the current machine. Select OK to continue, or CANCEL to fail the DLL load.
+	IMAGE_MACHINE_TYPE_MISMATCH = 0x2C2,
+	// {Partial Data Received} The network transport returned partial data to its client. The remaining data will be sent later.
+	RECEIVE_PARTIAL = 0x2C3,
+	// {Expedited Data Received} The network transport returned data to its client that was marked as expedited by the remote system.
+	RECEIVE_EXPEDITED = 0x2C4,
+	// {Partial Expedited Data Received} The network transport returned partial data to its client and this data was marked as expedited by the remote system. The remaining data will be sent later.
+	RECEIVE_PARTIAL_EXPEDITED = 0x2C5,
+	// {TDI Event Done} The TDI indication has completed successfully.
+	EVENT_DONE = 0x2C6,
+	// {TDI Event Pending} The TDI indication has entered the pending state.
+	EVENT_PENDING = 0x2C7,
+	// Checking file system on %wZ.
+	CHECKING_FILE_SYSTEM = 0x2C8,
+	// {Fatal Application Exit} %hs.
+	FATAL_APP_EXIT = 0x2C9,
+	// The specified registry key is referenced by a predefined handle.
+	PREDEFINED_HANDLE = 0x2CA,
+	// {Page Unlocked} The page protection of a locked page was changed to 'No Access' and the page was unlocked from memory and from the process.
+	WAS_UNLOCKED = 0x2CB,
+	// %hs
+	SERVICE_NOTIFICATION = 0x2CC,
+	// {Page Locked} One of the pages to lock was already locked.
+	WAS_LOCKED = 0x2CD,
+	// Application popup: %1 : %2
+	LOG_HARD_ERROR = 0x2CE,
+	// ALREADY_WIN32 = , = 0x2D0,
+	ALREADY_WIN32 = 0x2CF, // {Machine Type Mismatch} The image file %hs is valid, but is for a machine type other than the current machine.
+ // A yield execution was performed and no thread was available to run.
+	NO_YIELD_PERFORMED = 0x2D1,
+	// The resumable flag to a timer API was ignored.
+	TIMER_RESUME_IGNORED = 0x2D2,
+	// The arbiter has deferred arbitration of these resources to its parent.
+	ARBITRATION_UNHANDLED = 0x2D3,
+	// The inserted CardBus device cannot be started because of a configuration error on "%hs".
+	CARDBUS_NOT_SUPPORTED = 0x2D4,
+	// The CPUs in this multiprocessor system are not all the same revision level. To use all processors the operating system restricts itself to the features of the least capable processor in the system. Should problems occur with this system, contact the CPU manufacturer to see if this mix of processors is supported.
+	MP_PROCESSOR_MISMATCH = 0x2D5,
+	// The system was put into hibernation.
+	HIBERNATED = 0x2D6,
+	// The system was resumed from hibernation.
+	RESUME_HIBERNATION = 0x2D7,
+	// Windows has detected that the system firmware (BIOS) was updated [previous firmware date = %2, current firmware date %3].
+	FIRMWARE_UPDATED = 0x2D8,
+	// A device driver is leaking locked I/O pages causing system degradation. The system has automatically enabled tracking code in order to try and catch the culprit.
+	DRIVERS_LEAKING_LOCKED_PAGES = 0x2D9,
+	// The system has awoken.
+	WAKE_SYSTEM = 0x2DA,
+	// WAIT_1 = , = 0x2DC,
+	WAIT_1 = 0x2DB, // WAIT_2 = , = 0x2DD, // WAIT_3 = , = 0x2DE, // WAIT_63 = , = 0x2DF, // ABANDONED_WAIT_0 = , = 0x2E0, // ABANDONED_WAIT_63 = , = 0x2E1, // USER_APC = , = 0x2E2, // KERNEL_APC = , = 0x2E3, // ALERTED = , = 0x2E4, // The requested operation requires elevation.
+ // A reparse should be performed by the Object Manager since the name of the file resulted in a symbolic link.
+	REPARSE = 0x2E5,
+	// An open/create operation completed while an oplock break is underway.
+	OPLOCK_BREAK_IN_PROGRESS = 0x2E6,
+	// A new volume has been mounted by a file system.
+	VOLUME_MOUNTED = 0x2E7,
+	// This success level status indicates that the transaction state already exists for the registry sub-tree, but that a transaction commit was previously aborted. The commit has now been completed.
+	RXACT_COMMITTED = 0x2E8,
+	// This indicates that a notify change request has been completed due to closing the handle which made the notify change request.
+	NOTIFY_CLEANUP = 0x2E9,
+	// {Connect Failure on Primary Transport} An attempt was made to connect to the remote server %hs on the primary transport, but the connection failed. The computer WAS able to connect on a secondary transport.
+	PRIMARY_TRANSPORT_CONNECT_FAILED = 0x2EA,
+	// Page fault was a transition fault.
+	PAGE_FAULT_TRANSITION = 0x2EB,
+	// Page fault was a demand zero fault.
+	PAGE_FAULT_DEMAND_ZERO = 0x2EC,
+	// Page fault was a demand zero fault.
+	PAGE_FAULT_COPY_ON_WRITE = 0x2ED,
+	// Page fault was a demand zero fault.
+	PAGE_FAULT_GUARD_PAGE = 0x2EE,
+	// Page fault was satisfied by reading from a secondary storage device.
+	PAGE_FAULT_PAGING_FILE = 0x2EF,
+	// Cached page was locked during operation.
+	CACHE_PAGE_LOCKED = 0x2F0,
+	// Crash dump exists in paging file.
+	CRASH_DUMP = 0x2F1,
+	// Specified buffer contains all zeros.
+	BUFFER_ALL_ZEROS = 0x2F2,
+	// A reparse should be performed by the Object Manager since the name of the file resulted in a symbolic link.
+	REPARSE_OBJECT = 0x2F3,
+	// The device has succeeded a query-stop and its resource requirements have changed.
+	RESOURCE_REQUIREMENTS_CHANGED = 0x2F4,
+	// The translator has translated these resources into the global space and no further translations should be performed.
+	TRANSLATION_COMPLETE = 0x2F5,
+	// A process being terminated has no threads to terminate.
+	NOTHING_TO_TERMINATE = 0x2F6,
+	// The specified process is not part of a job.
+	PROCESS_NOT_IN_JOB = 0x2F7,
+	// The specified process is part of a job.
+	PROCESS_IN_JOB = 0x2F8,
+	// {Volume Shadow Copy Service} The system is now ready for hibernation.
+	VOLSNAP_HIBERNATE_READY = 0x2F9,
+	// A file system or file system filter driver has successfully completed an FsFilter operation.
+	FSFILTER_OP_COMPLETED_SUCCESSFULLY = 0x2FA,
+	// The specified interrupt vector was already connected.
+	INTERRUPT_VECTOR_ALREADY_CONNECTED = 0x2FB,
+	// The specified interrupt vector is still connected.
+	INTERRUPT_STILL_CONNECTED = 0x2FC,
+	// An operation is blocked waiting for an oplock.
+	WAIT_FOR_OPLOCK = 0x2FD,
+	// Debugger handled exception.
+	DBG_EXCEPTION_HANDLED = 0x2FE,
+	// Debugger continued.
+	DBG_CONTINUE = 0x2FF,
+	// An exception occurred in a user mode callback and the kernel callback frame should be removed.
+	CALLBACK_POP_STACK = 0x300,
+	// Compression is disabled for this volume.
+	COMPRESSION_DISABLED = 0x301,
+	// The data provider cannot fetch backwards through a result set.
+	CANTFETCHBACKWARDS = 0x302,
+	// The data provider cannot scroll backwards through a result set.
+	CANTSCROLLBACKWARDS = 0x303,
+	// The data provider requires that previously fetched data is released before asking for more data.
+	ROWSNOTRELEASED = 0x304,
+	// The data provider was not able to interpret the flags set for a column binding in an accessor.
+	BAD_ACCESSOR_FLAGS = 0x305,
+	// One or more errors occurred while processing the request.
+	ERRORS_ENCOUNTERED = 0x306,
+	// The implementation is not capable of performing the request.
+	NOT_CAPABLE = 0x307,
+	// The client of a component requested an operation which is not valid given the state of the component instance.
+	REQUEST_OUT_OF_SEQUENCE = 0x308,
+	// A version number could not be parsed.
+	VERSION_PARSE_ERROR = 0x309,
+	// The iterator's start position is invalid.
+	BADSTARTPOSITION = 0x30A,
+	// The hardware has reported an uncorrectable memory error.
+	MEMORY_HARDWARE = 0x30B,
+	// The attempted operation required self healing to be enabled.
+	DISK_REPAIR_DISABLED = 0x30C,
+	// The Desktop heap encountered an error while allocating session memory. There is more information in the system event log.
+	INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE = 0x30D,
+	// The system power state is transitioning from %2 to %3.
+	SYSTEM_POWERSTATE_TRANSITION = 0x30E,
+	// The system power state is transitioning from %2 to %3 but could enter %4.
+	SYSTEM_POWERSTATE_COMPLEX_TRANSITION = 0x30F,
+	// A thread is getting dispatched with MCA EXCEPTION because of MCA.
+	MCA_EXCEPTION = 0x310,
+	// Access to %1 is monitored by policy rule %2.
+	ACCESS_AUDIT_BY_POLICY = 0x311,
+	// Access to %1 has been restricted by your Administrator by policy rule %2.
+	ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY = 0x312,
+	// A valid hibernation file has been invalidated and should be abandoned.
+	ABANDON_HIBERFILE = 0x313,
+	// {Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error may be caused by network connectivity issues. Please try to save this file elsewhere.
+	LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED = 0x314,
+	// {Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error was returned by the server on which the file exists. Please try to save this file elsewhere.
+	LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR = 0x315,
+	// {Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error may be caused if the device has been removed or the media is write-protected.
+	LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR = 0x316,
+	// The resources required for this device conflict with the MCFG table.
+	BAD_MCFG_TABLE = 0x317,
+	// The volume repair could not be performed while it is online. Please schedule to take the volume offline so that it can be repaired.
+	DISK_REPAIR_REDIRECTED = 0x318,
+	// The volume repair was not successful.
+	DISK_REPAIR_UNSUCCESSFUL = 0x319,
+	// One of the volume corruption logs is full. Further corruptions that may be detected won't be logged.
+	CORRUPT_LOG_OVERFULL = 0x31A,
+	// One of the volume corruption logs is internally corrupted and needs to be recreated. The volume may contain undetected corruptions and must be scanned.
+	CORRUPT_LOG_CORRUPTED = 0x31B,
+	// One of the volume corruption logs is unavailable for being operated on.
+	CORRUPT_LOG_UNAVAILABLE = 0x31C,
+	// One of the volume corruption logs was deleted while still having corruption records in them. The volume contains detected corruptions and must be scanned.
+	CORRUPT_LOG_DELETED_FULL = 0x31D,
+	// One of the volume corruption logs was cleared by chkdsk and no longer contains real corruptions.
+	CORRUPT_LOG_CLEARED = 0x31E,
+	// Orphaned files exist on the volume but could not be recovered because no more new names could be created in the recovery directory. Files must be moved from the recovery directory.
+	ORPHAN_NAME_EXHAUSTED = 0x31F,
+	// The oplock that was associated with this handle is now associated with a different handle.
+	OPLOCK_SWITCHED_TO_NEW_HANDLE = 0x320,
+	// An oplock of the requested level cannot be granted. An oplock of a lower level may be available.
+	CANNOT_GRANT_REQUESTED_OPLOCK = 0x321,
+	// The operation did not complete successfully because it would cause an oplock to be broken. The caller has requested that existing oplocks not be broken.
+	CANNOT_BREAK_OPLOCK = 0x322,
+	// The handle with which this oplock was associated has been closed. The oplock is now broken.
+	OPLOCK_HANDLE_CLOSED = 0x323,
+	// The specified access control entry (ACE) does not contain a condition.
+	NO_ACE_CONDITION = 0x324,
+	// The specified access control entry (ACE) contains an invalid condition.
+	INVALID_ACE_CONDITION = 0x325,
+	// Access to the specified file handle has been revoked.
+	FILE_HANDLE_REVOKED = 0x326,
+	// An image file was mapped at a different address from the one specified in the image file but fixups will still be automatically performed on the image.
+	IMAGE_AT_DIFFERENT_BASE = 0x327,
+	// Access to the extended attribute was denied.
+	EA_ACCESS_DENIED = 0x3E2,
+	// The I/O operation has been aborted because of either a thread exit or an application request.
+	OPERATION_ABORTED = 0x3E3,
+	// Overlapped I/O event is not in a signaled state.
+	IO_INCOMPLETE = 0x3E4,
+	// Overlapped I/O operation is in progress.
+	IO_PENDING = 0x3E5,
+	// Invalid access to memory location.
+	NOACCESS = 0x3E6,
+	// Error performing inpage operation.
+	SWAPERROR = 0x3E7,
+
+	// Recursion too deep; the stack overflowed.
+	STACK_OVERFLOW = 0x3E9,
+	// The window cannot act on the sent message.
+	INVALID_MESSAGE = 0x3EA,
+	// Cannot complete this function.
+	CAN_NOT_COMPLETE = 0x3EB,
+	// Invalid flags.
+	INVALID_FLAGS = 0x3EC,
+	// The volume does not contain a recognized file system. Please make sure that all required file system drivers are loaded and that the volume is not corrupted.
+	UNRECOGNIZED_VOLUME = 0x3ED,
+	// The volume for a file has been externally altered so that the opened file is no longer valid.
+	FILE_INVALID = 0x3EE,
+	// The requested operation cannot be performed in full-screen mode.
+	FULLSCREEN_MODE = 0x3EF,
+	// An attempt was made to reference a token that does not exist.
+	NO_TOKEN = 0x3F0,
+	// The configuration registry database is corrupt.
+	BADDB = 0x3F1,
+	// The configuration registry key is invalid.
+	BADKEY = 0x3F2,
+	// The configuration registry key could not be opened.
+	CANTOPEN = 0x3F3,
+	// The configuration registry key could not be read.
+	CANTREAD = 0x3F4,
+	// The configuration registry key could not be written.
+	CANTWRITE = 0x3F5,
+	// One of the files in the registry database had to be recovered by use of a log or alternate copy. The recovery was successful.
+	REGISTRY_RECOVERED = 0x3F6,
+	// The registry is corrupted. The structure of one of the files containing registry data is corrupted, or the system's memory image of the file is corrupted, or the file could not be recovered because the alternate copy or log was absent or corrupted.
+	REGISTRY_CORRUPT = 0x3F7,
+	// An I/O operation initiated by the registry failed unrecoverably. The registry could not read in, or write out, or flush, one of the files that contain the system's image of the registry.
+	REGISTRY_IO_FAILED = 0x3F8,
+	// The system has attempted to load or restore a file into the registry, but the specified file is not in a registry file format.
+	NOT_REGISTRY_FILE = 0x3F9,
+	// Illegal operation attempted on a registry key that has been marked for deletion.
+	KEY_DELETED = 0x3FA,
+	// System could not allocate the required space in a registry log.
+	NO_LOG_SPACE = 0x3FB,
+	// Cannot create a symbolic link in a registry key that already has subkeys or values.
+	KEY_HAS_CHILDREN = 0x3FC,
+	// Cannot create a stable subkey under a volatile parent key.
+	CHILD_MUST_BE_VOLATILE = 0x3FD,
+	// A notify change request is being completed and the information is not being returned in the caller's buffer. The caller now needs to enumerate the files to find the changes.
+	NOTIFY_ENUM_DIR = 0x3FE,
+	// A stop control has been sent to a service that other running services are dependent on.
+	DEPENDENT_SERVICES_RUNNING = 0x41B,
+	// The requested control is not valid for this service.
+	INVALID_SERVICE_CONTROL = 0x41C,
+	// The service did not respond to the start or control request in a timely fashion.
+	SERVICE_REQUEST_TIMEOUT = 0x41D,
+	// A thread could not be created for the service.
+	SERVICE_NO_THREAD = 0x41E,
+	// The service database is locked.
+	SERVICE_DATABASE_LOCKED = 0x41F,
+	// An instance of the service is already running.
+	SERVICE_ALREADY_RUNNING = 0x420,
+	// The account name is invalid or does not exist, or the password is invalid for the account name specified.
+	INVALID_SERVICE_ACCOUNT = 0x421,
+	// The service cannot be started, either because it is disabled or because it has no enabled devices associated with it.
+	SERVICE_DISABLED = 0x422,
+	// Circular service dependency was specified.
+	CIRCULAR_DEPENDENCY = 0x423,
+	// The specified service does not exist as an installed service.
+	SERVICE_DOES_NOT_EXIST = 0x424,
+	// The service cannot accept control messages at this time.
+	SERVICE_CANNOT_ACCEPT_CTRL = 0x425,
+	// The service has not been started.
+	SERVICE_NOT_ACTIVE = 0x426,
+	// The service process could not connect to the service controller.
+	FAILED_SERVICE_CONTROLLER_CONNECT = 0x427,
+	// An exception occurred in the service when handling the control request.
+	EXCEPTION_IN_SERVICE = 0x428,
+	// The database specified does not exist.
+	DATABASE_DOES_NOT_EXIST = 0x429,
+	// The service has returned a service-specific error code.
+	SERVICE_SPECIFIC_ERROR = 0x42A,
+	// The process terminated unexpectedly.
+	PROCESS_ABORTED = 0x42B,
+	// The dependency service or group failed to start.
+	SERVICE_DEPENDENCY_FAIL = 0x42C,
+	// The service did not start due to a logon failure.
+	SERVICE_LOGON_FAILED = 0x42D,
+	// After starting, the service hung in a start-pending state.
+	SERVICE_START_HANG = 0x42E,
+	// The specified service database lock is invalid.
+	INVALID_SERVICE_LOCK = 0x42F,
+	// The specified service has been marked for deletion.
+	SERVICE_MARKED_FOR_DELETE = 0x430,
+	// The specified service already exists.
+	SERVICE_EXISTS = 0x431,
+	// The system is currently running with the last-known-good configuration.
+	ALREADY_RUNNING_LKG = 0x432,
+	// The dependency service does not exist or has been marked for deletion.
+	SERVICE_DEPENDENCY_DELETED = 0x433,
+	// The current boot has already been accepted for use as the last-known-good control set.
+	BOOT_ALREADY_ACCEPTED = 0x434,
+	// No attempts to start the service have been made since the last boot.
+	SERVICE_NEVER_STARTED = 0x435,
+	// The name is already in use as either a service name or a service display name.
+	DUPLICATE_SERVICE_NAME = 0x436,
+	// The account specified for this service is different from the account specified for other services running in the same process.
+	DIFFERENT_SERVICE_ACCOUNT = 0x437,
+	// Failure actions can only be set for Win32 services, not for drivers.
+	CANNOT_DETECT_DRIVER_FAILURE = 0x438,
+	// This service runs in the same process as the service control manager. Therefore, the service control manager cannot take action if this service's process terminates unexpectedly.
+	CANNOT_DETECT_PROCESS_ABORT = 0x439,
+	// No recovery program has been configured for this service.
+	NO_RECOVERY_PROGRAM = 0x43A,
+	// The executable program that this service is configured to run in does not implement the service.
+	SERVICE_NOT_IN_EXE = 0x43B,
+	// This service cannot be started in Safe Mode.
+	NOT_SAFEBOOT_SERVICE = 0x43C,
+	// The physical end of the tape has been reached.
+	END_OF_MEDIA = 0x44C,
+	// A tape access reached a filemark.
+	FILEMARK_DETECTED = 0x44D,
+	// The beginning of the tape or a partition was encountered.
+	BEGINNING_OF_MEDIA = 0x44E,
+	// A tape access reached the end of a set of files.
+	SETMARK_DETECTED = 0x44F,
+	// No more data is on the tape.
+	NO_DATA_DETECTED = 0x450,
+	// Tape could not be partitioned.
+	PARTITION_FAILURE = 0x451,
+	// When accessing a new tape of a multivolume partition, the current block size is incorrect.
+	INVALID_BLOCK_LENGTH = 0x452,
+	// Tape partition information could not be found when loading a tape.
+	DEVICE_NOT_PARTITIONED = 0x453,
+	// Unable to lock the media eject mechanism.
+	UNABLE_TO_LOCK_MEDIA = 0x454,
+	// Unable to unload the media.
+	UNABLE_TO_UNLOAD_MEDIA = 0x455,
+	// The media in the drive may have changed.
+	MEDIA_CHANGED = 0x456,
+	// The I/O bus was reset.
+	BUS_RESET = 0x457,
+	// No media in drive.
+	NO_MEDIA_IN_DRIVE = 0x458,
+	// No mapping for the Unicode character exists in the target multi-byte code page.
+	NO_UNICODE_TRANSLATION = 0x459,
+	// A dynamic link library (DLL) initialization routine failed.
+	DLL_INIT_FAILED = 0x45A,
+	// A system shutdown is in progress.
+	SHUTDOWN_IN_PROGRESS = 0x45B,
+	// Unable to abort the system shutdown because no shutdown was in progress.
+	NO_SHUTDOWN_IN_PROGRESS = 0x45C,
+	// The request could not be performed because of an I/O device error.
+	IO_DEVICE = 0x45D,
+	// No serial device was successfully initialized. The serial driver will unload.
+	SERIAL_NO_DEVICE = 0x45E,
+	// Unable to open a device that was sharing an interrupt request (IRQ) with other devices. At least one other device that uses that IRQ was already opened.
+	IRQ_BUSY = 0x45F,
+	// A serial I/O operation was completed by another write to the serial port. The IOCTL_SERIAL_XOFF_COUNTER reached zero.)
+	MORE_WRITES = 0x460,
+	// A serial I/O operation completed because the timeout period expired. The IOCTL_SERIAL_XOFF_COUNTER did not reach zero.)
+	COUNTER_TIMEOUT = 0x461,
+	// No ID address mark was found on the floppy disk.
+	FLOPPY_ID_MARK_NOT_FOUND = 0x462,
+	// Mismatch between the floppy disk sector ID field and the floppy disk controller track address.
+	FLOPPY_WRONG_CYLINDER = 0x463,
+	// The floppy disk controller reported an error that is not recognized by the floppy disk driver.
+	FLOPPY_UNKNOWN_ERROR = 0x464,
+	// The floppy disk controller returned inconsistent results in its registers.
+	FLOPPY_BAD_REGISTERS = 0x465,
+	// While accessing the hard disk, a recalibrate operation failed, even after retries.
+	DISK_RECALIBRATE_FAILED = 0x466,
+	// While accessing the hard disk, a disk operation failed even after retries.
+	DISK_OPERATION_FAILED = 0x467,
+	// While accessing the hard disk, a disk controller reset was needed, but even that failed.
+	DISK_RESET_FAILED = 0x468,
+	// Physical end of tape encountered.
+	EOM_OVERFLOW = 0x469,
+	// Not enough server storage is available to process this command.
+	NOT_ENOUGH_SERVER_MEMORY = 0x46A,
+	// A potential deadlock condition has been detected.
+	POSSIBLE_DEADLOCK = 0x46B,
+	// The base address or the file offset specified does not have the proper alignment.
+	MAPPED_ALIGNMENT = 0x46C,
+	// An attempt to change the system power state was vetoed by another application or driver.
+	SET_POWER_STATE_VETOED = 0x474,
+	// The system BIOS failed an attempt to change the system power state.
+	SET_POWER_STATE_FAILED = 0x475,
+	// An attempt was made to create more links on a file than the file system supports.
+	TOO_MANY_LINKS = 0x476,
+	// The specified program requires a newer version of Windows.
+	OLD_WIN_VERSION = 0x47E,
+	// The specified program is not a Windows or MS-DOS program.
+	APP_WRONG_OS = 0x47F,
+	// Cannot start more than one instance of the specified program.
+	SINGLE_INSTANCE_APP = 0x480,
+	// The specified program was written for an earlier version of Windows.
+	RMODE_APP = 0x481,
+	// One of the library files needed to run this application is damaged.
+	INVALID_DLL = 0x482,
+	// No application is associated with the specified file for this operation.
+	NO_ASSOCIATION = 0x483,
+	// An error occurred in sending the command to the application.
+	DDE_FAIL = 0x484,
+	// One of the library files needed to run this application cannot be found.
+	DLL_NOT_FOUND = 0x485,
+	// The current process has used all of its system allowance of handles for Window Manager objects.
+	NO_MORE_USER_HANDLES = 0x486,
+	// The message can be used only with synchronous operations.
+	MESSAGE_SYNC_ONLY = 0x487,
+	// The indicated source element has no media.
+	SOURCE_ELEMENT_EMPTY = 0x488,
+	// The indicated destination element already contains media.
+	DESTINATION_ELEMENT_FULL = 0x489,
+	// The indicated element does not exist.
+	ILLEGAL_ELEMENT_ADDRESS = 0x48A,
+	// The indicated element is part of a magazine that is not present.
+	MAGAZINE_NOT_PRESENT = 0x48B,
+	// The indicated device requires reinitialization due to hardware errors.
+	DEVICE_REINITIALIZATION_NEEDED = 0x48C,
+	// The device has indicated that cleaning is required before further operations are attempted.
+	DEVICE_REQUIRES_CLEANING = 0x48D,
+	// The device has indicated that its door is open.
+	DEVICE_DOOR_OPEN = 0x48E,
+	// The device is not connected.
+	DEVICE_NOT_CONNECTED = 0x48F,
+	// Element not found.
+	NOT_FOUND = 0x490,
+	// There was no match for the specified key in the index.
+	NO_MATCH = 0x491,
+	// The property set specified does not exist on the object.
+	SET_NOT_FOUND = 0x492,
+	// The point passed to GetMouseMovePoints is not in the buffer.
+	POINT_NOT_FOUND = 0x493,
+	// The tracking (workstation) service is not running.
+	NO_TRACKING_SERVICE = 0x494,
+	// The Volume ID could not be found.
+	NO_VOLUME_ID = 0x495,
+	// Unable to remove the file to be replaced.
+	UNABLE_TO_REMOVE_REPLACED = 0x497,
+	// Unable to move the replacement file to the file to be replaced. The file to be replaced has retained its original name.
+	UNABLE_TO_MOVE_REPLACEMENT = 0x498,
+	// Unable to move the replacement file to the file to be replaced. The file to be replaced has been renamed using the backup name.
+	UNABLE_TO_MOVE_REPLACEMENT_2 = 0x499,
+	// The volume change journal is being deleted.
+	JOURNAL_DELETE_IN_PROGRESS = 0x49A,
+	// The volume change journal is not active.
+	JOURNAL_NOT_ACTIVE = 0x49B,
+	// A file was found, but it may not be the correct file.
+	POTENTIAL_FILE_FOUND = 0x49C,
+	// The journal entry has been deleted from the journal.
+	JOURNAL_ENTRY_DELETED = 0x49D,
+	// A system shutdown has already been scheduled.
+	SHUTDOWN_IS_SCHEDULED = 0x4A6,
+	// The system shutdown cannot be initiated because there are other users logged on to the computer.
+	SHUTDOWN_USERS_LOGGED_ON = 0x4A7,
+	// The specified device name is invalid.
+	BAD_DEVICE = 0x4B0,
+	// The device is not currently connected but it is a remembered connection.
+	CONNECTION_UNAVAIL = 0x4B1,
+	// The local device name has a remembered connection to another network resource.
+	DEVICE_ALREADY_REMEMBERED = 0x4B2,
+	// The network path was either typed incorrectly, does not exist, or the network provider is not currently available. Please try retyping the path or contact your network administrator.
+	NO_NET_OR_BAD_PATH = 0x4B3,
+	// The specified network provider name is invalid.
+	BAD_PROVIDER = 0x4B4,
+	// Unable to open the network connection profile.
+	CANNOT_OPEN_PROFILE = 0x4B5,
+	// The network connection profile is corrupted.
+	BAD_PROFILE = 0x4B6,
+	// Cannot enumerate a noncontainer.
+	NOT_CONTAINER = 0x4B7,
+	// An extended error has occurred.
+	EXTENDED_ERROR = 0x4B8,
+	// The format of the specified group name is invalid.
+	INVALID_GROUPNAME = 0x4B9,
+	// The format of the specified computer name is invalid.
+	INVALID_COMPUTERNAME = 0x4BA,
+	// The format of the specified event name is invalid.
+	INVALID_EVENTNAME = 0x4BB,
+	// The format of the specified domain name is invalid.
+	INVALID_DOMAINNAME = 0x4BC,
+	// The format of the specified service name is invalid.
+	INVALID_SERVICENAME = 0x4BD,
+	// The format of the specified network name is invalid.
+	INVALID_NETNAME = 0x4BE,
+	// The format of the specified share name is invalid.
+	INVALID_SHARENAME = 0x4BF,
+	// The format of the specified password is invalid.
+	INVALID_PASSWORDNAME = 0x4C0,
+	// The format of the specified message name is invalid.
+	INVALID_MESSAGENAME = 0x4C1,
+	// The format of the specified message destination is invalid.
+	INVALID_MESSAGEDEST = 0x4C2,
+	// Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again.
+	SESSION_CREDENTIAL_CONFLICT = 0x4C3,
+	// An attempt was made to establish a session to a network server, but there are already too many sessions established to that server.
+	REMOTE_SESSION_LIMIT_EXCEEDED = 0x4C4,
+	// The workgroup or domain name is already in use by another computer on the network.
+	DUP_DOMAINNAME = 0x4C5,
+	// The network is not present or not started.
+	NO_NETWORK = 0x4C6,
+	// The operation was canceled by the user.
+	CANCELLED = 0x4C7,
+	// The requested operation cannot be performed on a file with a user-mapped section open.
+	USER_MAPPED_FILE = 0x4C8,
+	// The remote computer refused the network connection.
+	CONNECTION_REFUSED = 0x4C9,
+	// The network connection was gracefully closed.
+	GRACEFUL_DISCONNECT = 0x4CA,
+	// The network transport endpoint already has an address associated with it.
+	ADDRESS_ALREADY_ASSOCIATED = 0x4CB,
+	// An address has not yet been associated with the network endpoint.
+	ADDRESS_NOT_ASSOCIATED = 0x4CC,
+	// An operation was attempted on a nonexistent network connection.
+	CONNECTION_INVALID = 0x4CD,
+	// An invalid operation was attempted on an active network connection.
+	CONNECTION_ACTIVE = 0x4CE,
+	// The network location cannot be reached. For information about network troubleshooting, see Windows Help.
+	NETWORK_UNREACHABLE = 0x4CF,
+	// The network location cannot be reached. For information about network troubleshooting, see Windows Help.
+	HOST_UNREACHABLE = 0x4D0,
+	// The network location cannot be reached. For information about network troubleshooting, see Windows Help.
+	PROTOCOL_UNREACHABLE = 0x4D1,
+	// No service is operating at the destination network endpoint on the remote system.
+	PORT_UNREACHABLE = 0x4D2,
+	// The request was aborted.
+	REQUEST_ABORTED = 0x4D3,
+	// The network connection was aborted by the local system.
+	CONNECTION_ABORTED = 0x4D4,
+	// The operation could not be completed. A retry should be performed.
+	RETRY = 0x4D5,
+	// A connection to the server could not be made because the limit on the number of concurrent connections for this account has been reached.
+	CONNECTION_COUNT_LIMIT = 0x4D6,
+	// Attempting to log in during an unauthorized time of day for this account.
+	LOGIN_TIME_RESTRICTION = 0x4D7,
+	// The account is not authorized to log in from this station.
+	LOGIN_WKSTA_RESTRICTION = 0x4D8,
+	// The network address could not be used for the operation requested.
+	INCORRECT_ADDRESS = 0x4D9,
+	// The service is already registered.
+	ALREADY_REGISTERED = 0x4DA,
+	// The specified service does not exist.
+	SERVICE_NOT_FOUND = 0x4DB,
+	// The operation being requested was not performed because the user has not been authenticated.
+	NOT_AUTHENTICATED = 0x4DC,
+	// The operation being requested was not performed because the user has not logged on to the network. The specified service does not exist.
+	NOT_LOGGED_ON = 0x4DD,
+	// Continue with work in progress.
+	CONTINUE = 0x4DE,
+	// An attempt was made to perform an initialization operation when initialization has already been completed.
+	ALREADY_INITIALIZED = 0x4DF,
+	// No more local devices.
+	NO_MORE_DEVICES = 0x4E0,
+	// The specified site does not exist.
+	NO_SUCH_SITE = 0x4E1,
+	// A domain controller with the specified name already exists.
+	DOMAIN_CONTROLLER_EXISTS = 0x4E2,
+	// This operation is supported only when you are connected to the server.
+	ONLY_IF_CONNECTED = 0x4E3,
+	// The group policy framework should call the extension even if there are no changes.
+	OVERRIDE_NOCHANGES = 0x4E4,
+	// The specified user does not have a valid profile.
+	BAD_USER_PROFILE = 0x4E5,
+	// This operation is not supported on a computer running Windows Server 2003 for Small Business Server.
+	NOT_SUPPORTED_ON_SBS = 0x4E6,
+	// The server machine is shutting down.
+	SERVER_SHUTDOWN_IN_PROGRESS = 0x4E7,
+	// The remote system is not available. For information about network troubleshooting, see Windows Help.
+	HOST_DOWN = 0x4E8,
+	// The security identifier provided is not from an account domain.
+	NON_ACCOUNT_SID = 0x4E9,
+	// The security identifier provided does not have a domain component.
+	NON_DOMAIN_SID = 0x4EA,
+	// AppHelp dialog canceled thus preventing the application from starting.
+	APPHELP_BLOCK = 0x4EB,
+	// This program is blocked by group policy. For more information, contact your system administrator.
+	ACCESS_DISABLED_BY_POLICY = 0x4EC,
+	// A program attempt to use an invalid register value. Normally caused by an uninitialized register. This error is Itanium specific.
+	REG_NAT_CONSUMPTION = 0x4ED,
+	// The share is currently offline or does not exist.
+	CSCSHARE_OFFLINE = 0x4EE,
+	// The Kerberos protocol encountered an error while validating the KDC certificate during smartcard logon. There is more information in the system event log.
+	PKINIT_FAILURE = 0x4EF,
+	// The Kerberos protocol encountered an error while attempting to utilize the smartcard subsystem.
+	SMARTCARD_SUBSYSTEM_FAILURE = 0x4F0,
+	// The system cannot contact a domain controller to service the authentication request. Please try again later.
+	DOWNGRADE_DETECTED = 0x4F1,
+	// The machine is locked and cannot be shut down without the force option.
+	MACHINE_LOCKED = 0x4F7,
+	// An application-defined callback gave invalid data when called.
+	CALLBACK_SUPPLIED_INVALID_DATA = 0x4F9,
+	// The group policy framework should call the extension in the synchronous foreground policy refresh.
+	SYNC_FOREGROUND_REFRESH_REQUIRED = 0x4FA,
+	// This driver has been blocked from loading.
+	DRIVER_BLOCKED = 0x4FB,
+	// A dynamic link library (DLL) referenced a module that was neither a DLL nor the process's executable image.
+	INVALID_IMPORT_OF_NON_DLL = 0x4FC,
+	// Windows cannot open this program since it has been disabled.
+	ACCESS_DISABLED_WEBBLADE = 0x4FD,
+	// Windows cannot open this program because the license enforcement system has been tampered with or become corrupted.
+	ACCESS_DISABLED_WEBBLADE_TAMPER = 0x4FE,
+	// A transaction recover failed.
+	RECOVERY_FAILURE = 0x4FF,
+	// The current thread has already been converted to a fiber.
+	ALREADY_FIBER = 0x500,
+	// The current thread has already been converted from a fiber.
+	ALREADY_THREAD = 0x501,
+	// The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.
+	STACK_BUFFER_OVERRUN = 0x502,
+	// Data present in one of the parameters is more than the function can operate on.
+	PARAMETER_QUOTA_EXCEEDED = 0x503,
+	// An attempt to do an operation on a debug object failed because the object is in the process of being deleted.
+	DEBUGGER_INACTIVE = 0x504,
+	// An attempt to delay-load a .dll or get a function address in a delay-loaded .dll failed.
+	DELAY_LOAD_FAILED = 0x505,
+	// %1 is a 16-bit application. You do not have permissions to execute 16-bit applications. Check your permissions with your system administrator.
+	VDM_DISALLOWED = 0x506,
+	// Insufficient information exists to identify the cause of failure.
+	UNIDENTIFIED_ERROR = 0x507,
+	// The parameter passed to a C runtime function is incorrect.
+	INVALID_CRUNTIME_PARAMETER = 0x508,
+	// The operation occurred beyond the valid data length of the file.
+	BEYOND_VDL = 0x509,
+	// The service start failed since one or more services in the same process have an incompatible service SID type setting. A service with restricted service SID type can only coexist in the same process with other services with a restricted SID type. If the service SID type for this service was just configured, the hosting process must be restarted in order to start this service.
+	// On Windows Server 2003 and Windows XP, an unrestricted service cannot coexist in the same process with other services. The service with the unrestricted service SID type must be moved to an owned process in order to start this service.
+	INCOMPATIBLE_SERVICE_SID_TYPE = 0x50A,
+	// The process hosting the driver for this device has been terminated.
+	DRIVER_PROCESS_TERMINATED = 0x50B,
+	// An operation attempted to exceed an implementation-defined limit.
+	IMPLEMENTATION_LIMIT = 0x50C,
+	// Either the target process, or the target thread's containing process, is a protected process.
+	PROCESS_IS_PROTECTED = 0x50D,
+	// The service notification client is lagging too far behind the current state of services in the machine.
+	SERVICE_NOTIFY_CLIENT_LAGGING = 0x50E,
+	// The requested file operation failed because the storage quota was exceeded. To free up disk space, move files to a different location or delete unnecessary files. For more information, contact your system administrator.
+	DISK_QUOTA_EXCEEDED = 0x50F,
+	// The requested file operation failed because the storage policy blocks that type of file. For more information, contact your system administrator.
+	CONTENT_BLOCKED = 0x510,
+	// A privilege that the service requires to function properly does not exist in the service account configuration. You may use the Services Microsoft Management Console (MMC) snap-in (services.msc) and the Local Security Settings MMC snap-in (secpol.msc) to view the service configuration and the account configuration.
+	INCOMPATIBLE_SERVICE_PRIVILEGE = 0x511,
+	// A thread involved in this operation appears to be unresponsive.
+	APP_HANG = 0x512,
+	// Indicates a particular Security ID may not be assigned as the label of an object.
+	INVALID_LABEL = 0x513,
+
+	// Not all privileges or groups referenced are assigned to the caller.
+	NOT_ALL_ASSIGNED = 0x514,
+	// Some mapping between account names and security IDs was not done.
+	SOME_NOT_MAPPED = 0x515,
+	// No system quota limits are specifically set for this account.
+	NO_QUOTAS_FOR_ACCOUNT = 0x516,
+	// No encryption key is available. A well-known encryption key was returned.
+	LOCAL_USER_SESSION_KEY = 0x517,
+	// The password is too complex to be converted to a LAN Manager password. The LAN Manager password returned is a NULL string.
+	NULL_LM_PASSWORD = 0x518,
+	// The revision level is unknown.
+	UNKNOWN_REVISION = 0x519,
+	// Indicates two revision levels are incompatible.
+	REVISION_MISMATCH = 0x51A,
+	// This security ID may not be assigned as the owner of this object.
+	INVALID_OWNER = 0x51B,
+	// This security ID may not be assigned as the primary group of an object.
+	INVALID_PRIMARY_GROUP = 0x51C,
+	// An attempt has been made to operate on an impersonation token by a thread that is not currently impersonating a client.
+	NO_IMPERSONATION_TOKEN = 0x51D,
+	// The group may not be disabled.
+	CANT_DISABLE_MANDATORY = 0x51E,
+	// There are currently no logon servers available to service the logon request.
+	NO_LOGON_SERVERS = 0x51F,
+	// A specified logon session does not exist. It may already have been terminated.
+	NO_SUCH_LOGON_SESSION = 0x520,
+	// A specified privilege does not exist.
+	NO_SUCH_PRIVILEGE = 0x521,
+	// A required privilege is not held by the client.
+	PRIVILEGE_NOT_HELD = 0x522,
+	// The name provided is not a properly formed account name.
+	INVALID_ACCOUNT_NAME = 0x523,
+	// The specified account already exists.
+	USER_EXISTS = 0x524,
+	// The specified account does not exist.
+	NO_SUCH_USER = 0x525,
+	// The specified group already exists.
+	GROUP_EXISTS = 0x526,
+	// The specified group does not exist.
+	NO_SUCH_GROUP = 0x527,
+	// Either the specified user account is already a member of the specified group, or the specified group cannot be deleted because it contains a member.
+	MEMBER_IN_GROUP = 0x528,
+	// The specified user account is not a member of the specified group account.
+	MEMBER_NOT_IN_GROUP = 0x529,
+	// This operation is disallowed as it could result in an administration account being disabled, deleted or unable to log on.
+	LAST_ADMIN = 0x52A,
+	// Unable to update the password. The value provided as the current password is incorrect.
+	WRONG_PASSWORD = 0x52B,
+	// Unable to update the password. The value provided for the new password contains values that are not allowed in passwords.
+	ILL_FORMED_PASSWORD = 0x52C,
+	// Unable to update the password. The value provided for the new password does not meet the length, complexity, or history requirements of the domain.
+	PASSWORD_RESTRICTION = 0x52D,
+	// The user name or password is incorrect.
+	LOGON_FAILURE = 0x52E,
+	// Account restrictions are preventing this user from signing in. For example: blank passwords aren't allowed, sign-in times are limited, or a policy restriction has been enforced.
+	ACCOUNT_RESTRICTION = 0x52F,
+	// Your account has time restrictions that keep you from signing in right now.
+	INVALID_LOGON_HOURS = 0x530,
+	// This user isn't allowed to sign in to this computer.
+	INVALID_WORKSTATION = 0x531,
+	// The password for this account has expired.
+	PASSWORD_EXPIRED = 0x532,
+	// This user can't sign in because this account is currently disabled.
+	ACCOUNT_DISABLED = 0x533,
+	// No mapping between account names and security IDs was done.
+	NONE_MAPPED = 0x534,
+	// Too many local user identifiers (LUIDs) were requested at one time.
+	TOO_MANY_LUIDS_REQUESTED = 0x535,
+	// No more local user identifiers (LUIDs) are available.
+	LUIDS_EXHAUSTED = 0x536,
+	// The subauthority part of a security ID is invalid for this particular use.
+	INVALID_SUB_AUTHORITY = 0x537,
+	// The access control list (ACL) structure is invalid.
+	INVALID_ACL = 0x538,
+	// The security ID structure is invalid.
+	INVALID_SID = 0x539,
+	// The security descriptor structure is invalid.
+	INVALID_SECURITY_DESCR = 0x53A,
+	// The inherited access control list (ACL) or access control entry (ACE) could not be built.
+	BAD_INHERITANCE_ACL = 0x53C,
+	// The server is currently disabled.
+	SERVER_DISABLED = 0x53D,
+	// The server is currently enabled.
+	SERVER_NOT_DISABLED = 0x53E,
+	// The value provided was an invalid value for an identifier authority.
+	INVALID_ID_AUTHORITY = 0x53F,
+	// No more memory is available for security information updates.
+	ALLOTTED_SPACE_EXCEEDED = 0x540,
+	// The specified attributes are invalid, or incompatible with the attributes for the group as a whole.
+	INVALID_GROUP_ATTRIBUTES = 0x541,
+	// Either a required impersonation level was not provided, or the provided impersonation level is invalid.
+	BAD_IMPERSONATION_LEVEL = 0x542,
+	// Cannot open an anonymous level security token.
+	CANT_OPEN_ANONYMOUS = 0x543,
+	// The validation information class requested was invalid.
+	BAD_VALIDATION_CLASS = 0x544,
+	// The type of the token is inappropriate for its attempted use.
+	BAD_TOKEN_TYPE = 0x545,
+	// Unable to perform a security operation on an object that has no associated security.
+	NO_SECURITY_ON_OBJECT = 0x546,
+	// Configuration information could not be read from the domain controller, either because the machine is unavailable, or access has been denied.
+	CANT_ACCESS_DOMAIN_INFO = 0x547,
+	// The security account manager (SAM) or local security authority (LSA) server was in the wrong state to perform the security operation.
+	INVALID_SERVER_STATE = 0x548,
+	// The domain was in the wrong state to perform the security operation.
+	INVALID_DOMAIN_STATE = 0x549,
+	// This operation is only allowed for the Primary Domain Controller of the domain.
+	INVALID_DOMAIN_ROLE = 0x54A,
+	// The specified domain either does not exist or could not be contacted.
+	NO_SUCH_DOMAIN = 0x54B,
+	// The specified domain already exists.
+	DOMAIN_EXISTS = 0x54C,
+	// An attempt was made to exceed the limit on the number of domains per server.
+	DOMAIN_LIMIT_EXCEEDED = 0x54D,
+	// Unable to complete the requested operation because of either a catastrophic media failure or a data structure corruption on the disk.
+	INTERNAL_DB_CORRUPTION = 0x54E,
+	// An internal error occurred.
+	INTERNAL_ERROR = 0x54F,
+	// Generic access types were contained in an access mask which should already be mapped to nongeneric types.
+	GENERIC_NOT_MAPPED = 0x550,
+	// A security descriptor is not in the right format (absolute or self-relative).
+	BAD_DESCRIPTOR_FORMAT = 0x551,
+	// The requested action is restricted for use by logon processes only. The calling process has not registered as a logon process.
+	NOT_LOGON_PROCESS = 0x552,
+	// Cannot start a new logon session with an ID that is already in use.
+	LOGON_SESSION_EXISTS = 0x553,
+	// A specified authentication package is unknown.
+	NO_SUCH_PACKAGE = 0x554,
+	// The logon session is not in a state that is consistent with the requested operation.
+	BAD_LOGON_SESSION_STATE = 0x555,
+	// The logon session ID is already in use.
+	LOGON_SESSION_COLLISION = 0x556,
+	// A logon request contained an invalid logon type value.
+	INVALID_LOGON_TYPE = 0x557,
+	// Unable to impersonate using a named pipe until data has been read from that pipe.
+	CANNOT_IMPERSONATE = 0x558,
+	// The transaction state of a registry subtree is incompatible with the requested operation.
+	RXACT_INVALID_STATE = 0x559,
+	// An internal security database corruption has been encountered.
+	RXACT_COMMIT_FAILURE = 0x55A,
+	// Cannot perform this operation on built-in accounts.
+	SPECIAL_ACCOUNT = 0x55B,
+	// Cannot perform this operation on this built-in special group.
+	SPECIAL_GROUP = 0x55C,
+	// Cannot perform this operation on this built-in special user.
+	SPECIAL_USER = 0x55D,
+	// The user cannot be removed from a group because the group is currently the user's primary group.
+	MEMBERS_PRIMARY_GROUP = 0x55E,
+	// The token is already in use as a primary token.
+	TOKEN_ALREADY_IN_USE = 0x55F,
+	// The specified local group does not exist.
+	NO_SUCH_ALIAS = 0x560,
+	// The specified account name is not a member of the group.
+	MEMBER_NOT_IN_ALIAS = 0x561,
+	// The specified account name is already a member of the group.
+	MEMBER_IN_ALIAS = 0x562,
+	// The specified local group already exists.
+	ALIAS_EXISTS = 0x563,
+	// Logon failure: the user has not been granted the requested logon type at this computer.
+	LOGON_NOT_GRANTED = 0x564,
+	// The maximum number of secrets that may be stored in a single system has been exceeded.
+	TOO_MANY_SECRETS = 0x565,
+	// The length of a secret exceeds the maximum length allowed.
+	SECRET_TOO_LONG = 0x566,
+	// The local security authority database contains an internal inconsistency.
+	INTERNAL_DB_ERROR = 0x567,
+	// During a logon attempt, the user's security context accumulated too many security IDs.
+	TOO_MANY_CONTEXT_IDS = 0x568,
+	// Logon failure: the user has not been granted the requested logon type at this computer.
+	LOGON_TYPE_NOT_GRANTED = 0x569,
+	// A cross-encrypted password is necessary to change a user password.
+	NT_CROSS_ENCRYPTION_REQUIRED = 0x56A,
+	// A member could not be added to or removed from the local group because the member does not exist.
+	NO_SUCH_MEMBER = 0x56B,
+	// A new member could not be added to a local group because the member has the wrong account type.
+	INVALID_MEMBER = 0x56C,
+	// Too many security IDs have been specified.
+	TOO_MANY_SIDS = 0x56D,
+	// A cross-encrypted password is necessary to change this user password.
+	LM_CROSS_ENCRYPTION_REQUIRED = 0x56E,
+	// Indicates an ACL contains no inheritable components.
+	NO_INHERITANCE = 0x56F,
+	// The file or directory is corrupted and unreadable.
+	FILE_CORRUPT = 0x570,
+	// The disk structure is corrupted and unreadable.
+	DISK_CORRUPT = 0x571,
+	// There is no user session key for the specified logon session.
+	NO_USER_SESSION_KEY = 0x572,
+	// The service being accessed is licensed for a particular number of connections. No more connections can be made to the service at this time because there are already as many connections as the service can accept.
+	LICENSE_QUOTA_EXCEEDED = 0x573,
+	// The target account name is incorrect.
+	WRONG_TARGET_NAME = 0x574,
+	// Mutual Authentication failed. The server's password is out of date at the domain controller.
+	MUTUAL_AUTH_FAILED = 0x575,
+	// There is a time and/or date difference between the client and server.
+	TIME_SKEW = 0x576,
+	// This operation cannot be performed on the current domain.
+	CURRENT_DOMAIN_NOT_ALLOWED = 0x577,
+	// Invalid window handle.
+	INVALID_WINDOW_HANDLE = 0x578,
+	// Invalid menu handle.
+	INVALID_MENU_HANDLE = 0x579,
+	// Invalid cursor handle.
+	INVALID_CURSOR_HANDLE = 0x57A,
+	// Invalid accelerator table handle.
+	INVALID_ACCEL_HANDLE = 0x57B,
+	// Invalid hook handle.
+	INVALID_HOOK_HANDLE = 0x57C,
+	// Invalid handle to a multiple-window position structure.
+	INVALID_DWP_HANDLE = 0x57D,
+	// Cannot create a top-level child window.
+	TLW_WITH_WSCHILD = 0x57E,
+	// Cannot find window class.
+	CANNOT_FIND_WND_CLASS = 0x57F,
+	// Invalid window; it belongs to other thread.
+	WINDOW_OF_OTHER_THREAD = 0x580,
+	// Hot key is already registered.
+	HOTKEY_ALREADY_REGISTERED = 0x581,
+	// Class already exists.
+	CLASS_ALREADY_EXISTS = 0x582,
+	// Class does not exist.
+	CLASS_DOES_NOT_EXIST = 0x583,
+	// Class still has open windows.
+	CLASS_HAS_WINDOWS = 0x584,
+	// Invalid index.
+	INVALID_INDEX = 0x585,
+	// Invalid icon handle.
+	INVALID_ICON_HANDLE = 0x586,
+	// Using private DIALOG window words.
+	PRIVATE_DIALOG_INDEX = 0x587,
+	// The list box identifier was not found.
+	LISTBOX_ID_NOT_FOUND = 0x588,
+	// No wildcards were found.
+	NO_WILDCARD_CHARACTERS = 0x589,
+	// Thread does not have a clipboard open.
+	CLIPBOARD_NOT_OPEN = 0x58A,
+	// Hot key is not registered.
+	HOTKEY_NOT_REGISTERED = 0x58B,
+	// The window is not a valid dialog window.
+	WINDOW_NOT_DIALOG = 0x58C,
+	// Control ID not found.
+	CONTROL_ID_NOT_FOUND = 0x58D,
+	// Invalid message for a combo box because it does not have an edit control.
+	INVALID_COMBOBOX_MESSAGE = 0x58E,
+	// The window is not a combo box.
+	WINDOW_NOT_COMBOBOX = 0x58F,
+	// Height must be less than 256.
+	INVALID_EDIT_HEIGHT = 0x590,
+	// Invalid device context (DC) handle.
+	DC_NOT_FOUND = 0x591,
+	// Invalid hook procedure type.
+	INVALID_HOOK_FILTER = 0x592,
+	// Invalid hook procedure.
+	INVALID_FILTER_PROC = 0x593,
+	// Cannot set nonlocal hook without a module handle.
+	HOOK_NEEDS_HMOD = 0x594,
+	// This hook procedure can only be set globally.
+	GLOBAL_ONLY_HOOK = 0x595,
+	// The journal hook procedure is already installed.
+	JOURNAL_HOOK_SET = 0x596,
+	// The hook procedure is not installed.
+	HOOK_NOT_INSTALLED = 0x597,
+	// Invalid message for single-selection list box.
+	INVALID_LB_MESSAGE = 0x598,
+	// LB_SETCOUNT sent to non-lazy list box.
+	SETCOUNT_ON_BAD_LB = 0x599,
+	// This list box does not support tab stops.
+	LB_WITHOUT_TABSTOPS = 0x59A,
+	// Cannot destroy object created by another thread.
+	DESTROY_OBJECT_OF_OTHER_THREAD = 0x59B,
+	// Child windows cannot have menus.
+	CHILD_WINDOW_MENU = 0x59C,
+	// The window does not have a system menu.
+	NO_SYSTEM_MENU = 0x59D,
+	// Invalid message box style.
+	INVALID_MSGBOX_STYLE = 0x59E,
+	// Invalid system-wide (SPI_*) parameter.
+	INVALID_SPI_VALUE = 0x59F,
+	// Screen already locked.
+	SCREEN_ALREADY_LOCKED = 0x5A0,
+	// All handles to windows in a multiple-window position structure must have the same parent.
+	HWNDS_HAVE_DIFF_PARENT = 0x5A1,
+	// The window is not a child window.
+	NOT_CHILD_WINDOW = 0x5A2,
+	// Invalid GW_* command.
+	INVALID_GW_COMMAND = 0x5A3,
+	// Invalid thread identifier.
+	INVALID_THREAD_ID = 0x5A4,
+	// Cannot process a message from a window that is not a multiple document interface (MDI) window.
+	NON_MDICHILD_WINDOW = 0x5A5,
+	// Popup menu already active.
+	POPUP_ALREADY_ACTIVE = 0x5A6,
+	// The window does not have scroll bars.
+	NO_SCROLLBARS = 0x5A7,
+	// Scroll bar range cannot be greater than MAXLONG.
+	INVALID_SCROLLBAR_RANGE = 0x5A8,
+	// Cannot show or remove the window in the way specified.
+	INVALID_SHOWWIN_COMMAND = 0x5A9,
+	// Insufficient system resources exist to complete the requested service.
+	NO_SYSTEM_RESOURCES = 0x5AA,
+	// Insufficient system resources exist to complete the requested service.
+	NONPAGED_SYSTEM_RESOURCES = 0x5AB,
+	// Insufficient system resources exist to complete the requested service.
+	PAGED_SYSTEM_RESOURCES = 0x5AC,
+	// Insufficient quota to complete the requested service.
+	WORKING_SET_QUOTA = 0x5AD,
+	// Insufficient quota to complete the requested service.
+	PAGEFILE_QUOTA = 0x5AE,
+	// The paging file is too small for this operation to complete.
+	COMMITMENT_LIMIT = 0x5AF,
+	// A menu item was not found.
+	MENU_ITEM_NOT_FOUND = 0x5B0,
+	// Invalid keyboard layout handle.
+	INVALID_KEYBOARD_HANDLE = 0x5B1,
+	// Hook type not allowed.
+	HOOK_TYPE_NOT_ALLOWED = 0x5B2,
+	// This operation requires an interactive window station.
+	REQUIRES_INTERACTIVE_WINDOWSTATION = 0x5B3,
+	// This operation returned because the timeout period expired.
+	TIMEOUT = 0x5B4,
+	// Invalid monitor handle.
+	INVALID_MONITOR_HANDLE = 0x5B5,
+	// Incorrect size argument.
+	INCORRECT_SIZE = 0x5B6,
+	// The symbolic link cannot be followed because its type is disabled.
+	SYMLINK_CLASS_DISABLED = 0x5B7,
+	// This application does not support the current operation on symbolic links.
+	SYMLINK_NOT_SUPPORTED = 0x5B8,
+	// Windows was unable to parse the requested XML data.
+	XML_PARSE_ERROR = 0x5B9,
+	// An error was encountered while processing an XML digital signature.
+	XMLDSIG_ERROR = 0x5BA,
+	// This application must be restarted.
+	RESTART_APPLICATION = 0x5BB,
+	// The caller made the connection request in the wrong routing compartment.
+	WRONG_COMPARTMENT = 0x5BC,
+	// There was an AuthIP failure when attempting to connect to the remote host.
+	AUTHIP_FAILURE = 0x5BD,
+	// Insufficient NVRAM resources exist to complete the requested service. A reboot might be required.
+	NO_NVRAM_RESOURCES = 0x5BE,
+	// Unable to finish the requested operation because the specified process is not a GUI process.
+	NOT_GUI_PROCESS = 0x5BF,
+	// The event log file is corrupted.
+	EVENTLOG_FILE_CORRUPT = 0x5DC,
+	// No event log file could be opened, so the event logging service did not start.
+	EVENTLOG_CANT_START = 0x5DD,
+	// The event log file is full.
+	LOG_FILE_FULL = 0x5DE,
+	// The event log file has changed between read operations.
+	EVENTLOG_FILE_CHANGED = 0x5DF,
+	// The specified task name is invalid.
+	INVALID_TASK_NAME = 0x60E,
+	// The specified task index is invalid.
+	INVALID_TASK_INDEX = 0x60F,
+	// The specified thread is already joining a task.
+	THREAD_ALREADY_IN_TASK = 0x610,
+	// The Windows Installer Service could not be accessed. This can occur if the Windows Installer is not correctly installed. Contact your support personnel for assistance.
+	INSTALL_SERVICE_FAILURE = 0x641,
+	// User cancelled installation.
+	INSTALL_USEREXIT = 0x642,
+	// Fatal error during installation.
+	INSTALL_FAILURE = 0x643,
+	// Installation suspended, incomplete.
+	INSTALL_SUSPEND = 0x644,
+	// This action is only valid for products that are currently installed.
+	UNKNOWN_PRODUCT = 0x645,
+	// Feature ID not registered.
+	UNKNOWN_FEATURE = 0x646,
+	// Component ID not registered.
+	UNKNOWN_COMPONENT = 0x647,
+	// Unknown property.
+	UNKNOWN_PROPERTY = 0x648,
+	// Handle is in an invalid state.
+	INVALID_HANDLE_STATE = 0x649,
+	// The configuration data for this product is corrupt. Contact your support personnel.
+	BAD_CONFIGURATION = 0x64A,
+	// Component qualifier not present.
+	INDEX_ABSENT = 0x64B,
+	// The installation source for this product is not available. Verify that the source exists and that you can access it.
+	INSTALL_SOURCE_ABSENT = 0x64C,
+	// This installation package cannot be installed by the Windows Installer service. You must install a Windows service pack that contains a newer version of the Windows Installer service.
+	INSTALL_PACKAGE_VERSION = 0x64D,
+	// Product is uninstalled.
+	PRODUCT_UNINSTALLED = 0x64E,
+	// SQL query syntax invalid or unsupported.
+	BAD_QUERY_SYNTAX = 0x64F,
+	// Record field does not exist.
+	INVALID_FIELD = 0x650,
+	// The device has been removed.
+	DEVICE_REMOVED = 0x651,
+	// Another installation is already in progress. Complete that installation before proceeding with this install.
+	INSTALL_ALREADY_RUNNING = 0x652,
+	// This installation package could not be opened. Verify that the package exists and that you can access it, or contact the application vendor to verify that this is a valid Windows Installer package.
+	INSTALL_PACKAGE_OPEN_FAILED = 0x653,
+	// This installation package could not be opened. Contact the application vendor to verify that this is a valid Windows Installer package.
+	INSTALL_PACKAGE_INVALID = 0x654,
+	// There was an error starting the Windows Installer service user interface. Contact your support personnel.
+	INSTALL_UI_FAILURE = 0x655,
+	// Error opening installation log file. Verify that the specified log file location exists and that you can write to it.
+	INSTALL_LOG_FAILURE = 0x656,
+	// The language of this installation package is not supported by your system.
+	INSTALL_LANGUAGE_UNSUPPORTED = 0x657,
+	// Error applying transforms. Verify that the specified transform paths are valid.
+	INSTALL_TRANSFORM_FAILURE = 0x658,
+	// This installation is forbidden by system policy. Contact your system administrator.
+	INSTALL_PACKAGE_REJECTED = 0x659,
+	// Function could not be executed.
+	FUNCTION_NOT_CALLED = 0x65A,
+	// Function failed during execution.
+	FUNCTION_FAILED = 0x65B,
+	// Invalid or unknown table specified.
+	INVALID_TABLE = 0x65C,
+	// Data supplied is of wrong type.
+	DATATYPE_MISMATCH = 0x65D,
+	// Data of this type is not supported.
+	UNSUPPORTED_TYPE = 0x65E,
+	// The Windows Installer service failed to start. Contact your support personnel.
+	CREATE_FAILED = 0x65F,
+	// The Temp folder is on a drive that is full or is inaccessible. Free up space on the drive or verify that you have write permission on the Temp folder.
+	INSTALL_TEMP_UNWRITABLE = 0x660,
+	// This installation package is not supported by this processor type. Contact your product vendor.
+	INSTALL_PLATFORM_UNSUPPORTED = 0x661,
+	// Component not used on this computer.
+	INSTALL_NOTUSED = 0x662,
+	// This update package could not be opened. Verify that the update package exists and that you can access it, or contact the application vendor to verify that this is a valid Windows Installer update package.
+	PATCH_PACKAGE_OPEN_FAILED = 0x663,
+	// This update package could not be opened. Contact the application vendor to verify that this is a valid Windows Installer update package.
+	PATCH_PACKAGE_INVALID = 0x664,
+	// This update package cannot be processed by the Windows Installer service. You must install a Windows service pack that contains a newer version of the Windows Installer service.
+	PATCH_PACKAGE_UNSUPPORTED = 0x665,
+	// Another version of this product is already installed. Installation of this version cannot continue. To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel.
+	PRODUCT_VERSION = 0x666,
+	// Invalid command line argument. Consult the Windows Installer SDK for detailed command line help.
+	INVALID_COMMAND_LINE = 0x667,
+	// Only administrators have permission to add, remove, or configure server software during a Terminal services remote session. If you want to install or configure software on the server, contact your network administrator.
+	INSTALL_REMOTE_DISALLOWED = 0x668,
+	// The requested operation completed successfully. The system will be restarted so the changes can take effect.
+	SUCCESS_REBOOT_INITIATED = 0x669,
+	// The upgrade cannot be installed by the Windows Installer service because the program to be upgraded may be missing, or the upgrade may update a different version of the program. Verify that the program to be upgraded exists on your computer and that you have the correct upgrade.
+	PATCH_TARGET_NOT_FOUND = 0x66A,
+	// The update package is not permitted by software restriction policy.
+	PATCH_PACKAGE_REJECTED = 0x66B,
+	// One or more customizations are not permitted by software restriction policy.
+	INSTALL_TRANSFORM_REJECTED = 0x66C,
+	// The Windows Installer does not permit installation from a Remote Desktop Connection.
+	INSTALL_REMOTE_PROHIBITED = 0x66D,
+	// Uninstallation of the update package is not supported.
+	PATCH_REMOVAL_UNSUPPORTED = 0x66E,
+	// The update is not applied to this product.
+	UNKNOWN_PATCH = 0x66F,
+	// No valid sequence could be found for the set of updates.
+	PATCH_NO_SEQUENCE = 0x670,
+	// Update removal was disallowed by policy.
+	PATCH_REMOVAL_DISALLOWED = 0x671,
+	// The XML update data is invalid.
+	INVALID_PATCH_XML = 0x672,
+	// Windows Installer does not permit updating of managed advertised products. At least one feature of the product must be installed before applying the update.
+	PATCH_MANAGED_ADVERTISED_PRODUCT = 0x673,
+	// The Windows Installer service is not accessible in Safe Mode. Please try again when your computer is not in Safe Mode or you can use System Restore to return your machine to a previous good state.
+	INSTALL_SERVICE_SAFEBOOT = 0x674,
+	// A fail fast exception occurred. Exception handlers will not be invoked and the process will be terminated immediately.
+	FAIL_FAST_EXCEPTION = 0x675,
+	// The app that you are trying to run is not supported on this version of Windows.
+	INSTALL_REJECTED = 0x676,
+
+	// The string binding is invalid.
+	RPC_S_INVALID_STRING_BINDING = 0x6A4,
+	// The binding handle is not the correct type.
+	RPC_S_WRONG_KIND_OF_BINDING = 0x6A5,
+	// The binding handle is invalid.
+	RPC_S_INVALID_BINDING = 0x6A6,
+	// The RPC protocol sequence is not supported.
+	RPC_S_PROTSEQ_NOT_SUPPORTED = 0x6A7,
+	// The RPC protocol sequence is invalid.
+	RPC_S_INVALID_RPC_PROTSEQ = 0x6A8,
+	// The string universal unique identifier (UUID) is invalid.
+	RPC_S_INVALID_STRING_UUID = 0x6A9,
+	// The endpoint format is invalid.
+	RPC_S_INVALID_ENDPOINT_FORMAT = 0x6AA,
+	// The network address is invalid.
+	RPC_S_INVALID_NET_ADDR = 0x6AB,
+	// No endpoint was found.
+	RPC_S_NO_ENDPOINT_FOUND = 0x6AC,
+	// The timeout value is invalid.
+	RPC_S_INVALID_TIMEOUT = 0x6AD,
+	// The object universal unique identifier (UUID) was not found.
+	RPC_S_OBJECT_NOT_FOUND = 0x6AE,
+	// The object universal unique identifier (UUID) has already been registered.
+	RPC_S_ALREADY_REGISTERED = 0x6AF,
+	// The type universal unique identifier (UUID) has already been registered.
+	RPC_S_TYPE_ALREADY_REGISTERED = 0x6B0,
+	// The RPC server is already listening.
+	RPC_S_ALREADY_LISTENING = 0x6B1,
+	// No protocol sequences have been registered.
+	RPC_S_NO_PROTSEQS_REGISTERED = 0x6B2,
+	// The RPC server is not listening.
+	RPC_S_NOT_LISTENING = 0x6B3,
+	// The manager type is unknown.
+	RPC_S_UNKNOWN_MGR_TYPE = 0x6B4,
+	// The interface is unknown.
+	RPC_S_UNKNOWN_IF = 0x6B5,
+	// There are no bindings.
+	RPC_S_NO_BINDINGS = 0x6B6,
+	// There are no protocol sequences.
+	RPC_S_NO_PROTSEQS = 0x6B7,
+	// The endpoint cannot be created.
+	RPC_S_CANT_CREATE_ENDPOINT = 0x6B8,
+	// Not enough resources are available to complete this operation.
+	RPC_S_OUT_OF_RESOURCES = 0x6B9,
+	// The RPC server is unavailable.
+	RPC_S_SERVER_UNAVAILABLE = 0x6BA,
+	// The RPC server is too busy to complete this operation.
+	RPC_S_SERVER_TOO_BUSY = 0x6BB,
+	// The network options are invalid.
+	RPC_S_INVALID_NETWORK_OPTIONS = 0x6BC,
+	// There are no remote procedure calls active on this thread.
+	RPC_S_NO_CALL_ACTIVE = 0x6BD,
+	// The remote procedure call failed.
+	RPC_S_CALL_FAILED = 0x6BE,
+	// The remote procedure call failed and did not execute.
+	RPC_S_CALL_FAILED_DNE = 0x6BF,
+	// A remote procedure call (RPC) protocol error occurred.
+	RPC_S_PROTOCOL_ERROR = 0x6C0,
+	// Access to the HTTP proxy is denied.
+	RPC_S_PROXY_ACCESS_DENIED = 0x6C1,
+	// The transfer syntax is not supported by the RPC server.
+	RPC_S_UNSUPPORTED_TRANS_SYN = 0x6C2,
+	// The universal unique identifier (UUID) type is not supported.
+	RPC_S_UNSUPPORTED_TYPE = 0x6C4,
+	// The tag is invalid.
+	RPC_S_INVALID_TAG = 0x6C5,
+	// The array bounds are invalid.
+	RPC_S_INVALID_BOUND = 0x6C6,
+	// The binding does not contain an entry name.
+	RPC_S_NO_ENTRY_NAME = 0x6C7,
+	// The name syntax is invalid.
+	RPC_S_INVALID_NAME_SYNTAX = 0x6C8,
+	// The name syntax is not supported.
+	RPC_S_UNSUPPORTED_NAME_SYNTAX = 0x6C9,
+	// No network address is available to use to construct a universal unique identifier (UUID).
+	RPC_S_UUID_NO_ADDRESS = 0x6CB,
+	// The endpoint is a duplicate.
+	RPC_S_DUPLICATE_ENDPOINT = 0x6CC,
+	// The authentication type is unknown.
+	RPC_S_UNKNOWN_AUTHN_TYPE = 0x6CD,
+	// The maximum number of calls is too small.
+	RPC_S_MAX_CALLS_TOO_SMALL = 0x6CE,
+	// The string is too long.
+	RPC_S_STRING_TOO_LONG = 0x6CF,
+	// The RPC protocol sequence was not found.
+	RPC_S_PROTSEQ_NOT_FOUND = 0x6D0,
+	// The procedure number is out of range.
+	RPC_S_PROCNUM_OUT_OF_RANGE = 0x6D1,
+	// The binding does not contain any authentication information.
+	RPC_S_BINDING_HAS_NO_AUTH = 0x6D2,
+	// The authentication service is unknown.
+	RPC_S_UNKNOWN_AUTHN_SERVICE = 0x6D3,
+	// The authentication level is unknown.
+	RPC_S_UNKNOWN_AUTHN_LEVEL = 0x6D4,
+	// The security context is invalid.
+	RPC_S_INVALID_AUTH_IDENTITY = 0x6D5,
+	// The authorization service is unknown.
+	RPC_S_UNKNOWN_AUTHZ_SERVICE = 0x6D6,
+	// The entry is invalid.
+	EPT_S_INVALID_ENTRY = 0x6D7,
+	// The server endpoint cannot perform the operation.
+	EPT_S_CANT_PERFORM_OP = 0x6D8,
+	// There are no more endpoints available from the endpoint mapper.
+	EPT_S_NOT_REGISTERED = 0x6D9,
+	// No interfaces have been exported.
+	RPC_S_NOTHING_TO_EXPORT = 0x6DA,
+	// The entry name is incomplete.
+	RPC_S_INCOMPLETE_NAME = 0x6DB,
+	// The version option is invalid.
+	RPC_S_INVALID_VERS_OPTION = 0x6DC,
+	// There are no more members.
+	RPC_S_NO_MORE_MEMBERS = 0x6DD,
+	// There is nothing to unexport.
+	RPC_S_NOT_ALL_OBJS_UNEXPORTED = 0x6DE,
+	// The interface was not found.
+	RPC_S_INTERFACE_NOT_FOUND = 0x6DF,
+	// The entry already exists.
+	RPC_S_ENTRY_ALREADY_EXISTS = 0x6E0,
+	// The entry is not found.
+	RPC_S_ENTRY_NOT_FOUND = 0x6E1,
+	// The name service is unavailable.
+	RPC_S_NAME_SERVICE_UNAVAILABLE = 0x6E2,
+	// The network address family is invalid.
+	RPC_S_INVALID_NAF_ID = 0x6E3,
+	// The requested operation is not supported.
+	RPC_S_CANNOT_SUPPORT = 0x6E4,
+	// No security context is available to allow impersonation.
+	RPC_S_NO_CONTEXT_AVAILABLE = 0x6E5,
+	// An internal error occurred in a remote procedure call (RPC).
+	RPC_S_INTERNAL_ERROR = 0x6E6,
+	// The RPC server attempted an integer division by zero.
+	RPC_S_ZERO_DIVIDE = 0x6E7,
+	// An addressing error occurred in the RPC server.
+	RPC_S_ADDRESS_ERROR = 0x6E8,
+	// A floating-point operation at the RPC server caused a division by zero.
+	RPC_S_FP_DIV_ZERO = 0x6E9,
+	// A floating-point underflow occurred at the RPC server.
+	RPC_S_FP_UNDERFLOW = 0x6EA,
+	// A floating-point overflow occurred at the RPC server.
+	RPC_S_FP_OVERFLOW = 0x6EB,
+	// The list of RPC servers available for the binding of auto handles has been exhausted.
+	RPC_X_NO_MORE_ENTRIES = 0x6EC,
+	// Unable to open the character translation table file.
+	RPC_X_SS_CHAR_TRANS_OPEN_FAIL = 0x6ED,
+	// The file containing the character translation table has fewer than 512 bytes.
+	RPC_X_SS_CHAR_TRANS_SHORT_FILE = 0x6EE,
+	// A null context handle was passed from the client to the host during a remote procedure call.
+	RPC_X_SS_IN_NULL_CONTEXT = 0x6EF,
+	// The context handle changed during a remote procedure call.
+	RPC_X_SS_CONTEXT_DAMAGED = 0x6F1,
+	// The binding handles passed to a remote procedure call do not match.
+	RPC_X_SS_HANDLES_MISMATCH = 0x6F2,
+	// The stub is unable to get the remote procedure call handle.
+	RPC_X_SS_CANNOT_GET_CALL_HANDLE = 0x6F3,
+	// A null reference pointer was passed to the stub.
+	RPC_X_NULL_REF_POINTER = 0x6F4,
+	// The enumeration value is out of range.
+	RPC_X_ENUM_VALUE_OUT_OF_RANGE = 0x6F5,
+	// The byte count is too small.
+	RPC_X_BYTE_COUNT_TOO_SMALL = 0x6F6,
+	// The stub received bad data.
+	RPC_X_BAD_STUB_DATA = 0x6F7,
+	// The supplied user buffer is not valid for the requested operation.
+	INVALID_USER_BUFFER = 0x6F8,
+	// The disk media is not recognized. It may not be formatted.
+	UNRECOGNIZED_MEDIA = 0x6F9,
+	// The workstation does not have a trust secret.
+	NO_TRUST_LSA_SECRET = 0x6FA,
+	// The security database on the server does not have a computer account for this workstation trust relationship.
+	NO_TRUST_SAM_ACCOUNT = 0x6FB,
+	// The trust relationship between the primary domain and the trusted domain failed.
+	TRUSTED_DOMAIN_FAILURE = 0x6FC,
+	// The trust relationship between this workstation and the primary domain failed.
+	TRUSTED_RELATIONSHIP_FAILURE = 0x6FD,
+	// The network logon failed.
+	TRUST_FAILURE = 0x6FE,
+	// A remote procedure call is already in progress for this thread.
+	RPC_S_CALL_IN_PROGRESS = 0x6FF,
+	// An attempt was made to logon, but the network logon service was not started.
+	NETLOGON_NOT_STARTED = 0x700,
+	// The user's account has expired.
+	ACCOUNT_EXPIRED = 0x701,
+	// The redirector is in use and cannot be unloaded.
+	REDIRECTOR_HAS_OPEN_HANDLES = 0x702,
+	// The specified printer driver is already installed.
+	PRINTER_DRIVER_ALREADY_INSTALLED = 0x703,
+	// The specified port is unknown.
+	UNKNOWN_PORT = 0x704,
+	// The printer driver is unknown.
+	UNKNOWN_PRINTER_DRIVER = 0x705,
+	// The print processor is unknown.
+	UNKNOWN_PRINTPROCESSOR = 0x706,
+	// The specified separator file is invalid.
+	INVALID_SEPARATOR_FILE = 0x707,
+	// The specified priority is invalid.
+	INVALID_PRIORITY = 0x708,
+	// The printer name is invalid.
+	INVALID_PRINTER_NAME = 0x709,
+	// The printer already exists.
+	PRINTER_ALREADY_EXISTS = 0x70A,
+	// The printer command is invalid.
+	INVALID_PRINTER_COMMAND = 0x70B,
+	// The specified datatype is invalid.
+	INVALID_DATATYPE = 0x70C,
+	// The environment specified is invalid.
+	INVALID_ENVIRONMENT = 0x70D,
+	// There are no more bindings.
+	RPC_S_NO_MORE_BINDINGS = 0x70E,
+	// The account used is an interdomain trust account. Use your global user account or local user account to access this server.
+	NOLOGON_INTERDOMAIN_TRUST_ACCOUNT = 0x70F,
+	// The account used is a computer account. Use your global user account or local user account to access this server.
+	NOLOGON_WORKSTATION_TRUST_ACCOUNT = 0x710,
+	// The account used is a server trust account. Use your global user account or local user account to access this server.
+	NOLOGON_SERVER_TRUST_ACCOUNT = 0x711,
+	// The name or security ID (SID) of the domain specified is inconsistent with the trust information for that domain.
+	DOMAIN_TRUST_INCONSISTENT = 0x712,
+	// The server is in use and cannot be unloaded.
+	SERVER_HAS_OPEN_HANDLES = 0x713,
+	// The specified image file did not contain a resource section.
+	RESOURCE_DATA_NOT_FOUND = 0x714,
+	// The specified resource type cannot be found in the image file.
+	RESOURCE_TYPE_NOT_FOUND = 0x715,
+	// The specified resource name cannot be found in the image file.
+	RESOURCE_NAME_NOT_FOUND = 0x716,
+	// The specified resource language ID cannot be found in the image file.
+	RESOURCE_LANG_NOT_FOUND = 0x717,
+	// Not enough quota is available to process this command.
+	NOT_ENOUGH_QUOTA = 0x718,
+	// No interfaces have been registered.
+	RPC_S_NO_INTERFACES = 0x719,
+	// The remote procedure call was cancelled.
+	RPC_S_CALL_CANCELLED = 0x71A,
+	// The binding handle does not contain all required information.
+	RPC_S_BINDING_INCOMPLETE = 0x71B,
+	// A communications failure occurred during a remote procedure call.
+	RPC_S_COMM_FAILURE = 0x71C,
+	// The requested authentication level is not supported.
+	RPC_S_UNSUPPORTED_AUTHN_LEVEL = 0x71D,
+	// No principal name registered.
+	RPC_S_NO_PRINC_NAME = 0x71E,
+	// The error specified is not a valid Windows RPC error code.
+	RPC_S_NOT_RPC_ERROR = 0x71F,
+	// A UUID that is valid only on this computer has been allocated.
+	RPC_S_UUID_LOCAL_ONLY = 0x720,
+	// A security package specific error occurred.
+	RPC_S_SEC_PKG_ERROR = 0x721,
+	// Thread is not canceled.
+	RPC_S_NOT_CANCELLED = 0x722,
+	// Invalid operation on the encoding/decoding handle.
+	RPC_X_INVALID_ES_ACTION = 0x723,
+	// Incompatible version of the serializing package.
+	RPC_X_WRONG_ES_VERSION = 0x724,
+	// Incompatible version of the RPC stub.
+	RPC_X_WRONG_STUB_VERSION = 0x725,
+	// The RPC pipe object is invalid or corrupted.
+	RPC_X_INVALID_PIPE_OBJECT = 0x726,
+	// An invalid operation was attempted on an RPC pipe object.
+	RPC_X_WRONG_PIPE_ORDER = 0x727,
+	// Unsupported RPC pipe version.
+	RPC_X_WRONG_PIPE_VERSION = 0x728,
+	// HTTP proxy server rejected the connection because the cookie authentication failed.
+	RPC_S_COOKIE_AUTH_FAILED = 0x729,
+	// The group member was not found.
+	RPC_S_GROUP_MEMBER_NOT_FOUND = 0x76A,
+	// The endpoint mapper database entry could not be created.
+	EPT_S_CANT_CREATE = 0x76B,
+	// The object universal unique identifier (UUID) is the nil UUID.
+	RPC_S_INVALID_OBJECT = 0x76C,
+	// The specified time is invalid.
+	INVALID_TIME = 0x76D,
+	// The specified form name is invalid.
+	INVALID_FORM_NAME = 0x76E,
+	// The specified form size is invalid.
+	INVALID_FORM_SIZE = 0x76F,
+	// The specified printer handle is already being waited on.
+	ALREADY_WAITING = 0x770,
+	// The specified printer has been deleted.
+	PRINTER_DELETED = 0x771,
+	// The state of the printer is invalid.
+	INVALID_PRINTER_STATE = 0x772,
+	// The user's password must be changed before signing in.
+	PASSWORD_MUST_CHANGE = 0x773,
+	// Could not find the domain controller for this domain.
+	DOMAIN_CONTROLLER_NOT_FOUND = 0x774,
+	// The referenced account is currently locked out and may not be logged on to.
+	ACCOUNT_LOCKED_OUT = 0x775,
+	// The object exporter specified was not found.
+	OR_INVALID_OXID = 0x776,
+	// The object specified was not found.
+	OR_INVALID_OID = 0x777,
+	// The object resolver set specified was not found.
+	OR_INVALID_SET = 0x778,
+	// Some data remains to be sent in the request buffer.
+	RPC_S_SEND_INCOMPLETE = 0x779,
+	// Invalid asynchronous remote procedure call handle.
+	RPC_S_INVALID_ASYNC_HANDLE = 0x77A,
+	// Invalid asynchronous RPC call handle for this operation.
+	RPC_S_INVALID_ASYNC_CALL = 0x77B,
+	// The RPC pipe object has already been closed.
+	RPC_X_PIPE_CLOSED = 0x77C,
+	// The RPC call completed before all pipes were processed.
+	RPC_X_PIPE_DISCIPLINE_ERROR = 0x77D,
+	// No more data is available from the RPC pipe.
+	RPC_X_PIPE_EMPTY = 0x77E,
+	// No site name is available for this machine.
+	NO_SITENAME = 0x77F,
+	// The file cannot be accessed by the system.
+	CANT_ACCESS_FILE = 0x780,
+	// The name of the file cannot be resolved by the system.
+	CANT_RESOLVE_FILENAME = 0x781,
+	// The entry is not of the expected type.
+	RPC_S_ENTRY_TYPE_MISMATCH = 0x782,
+	// Not all object UUIDs could be exported to the specified entry.
+	RPC_S_NOT_ALL_OBJS_EXPORTED = 0x783,
+	// Interface could not be exported to the specified entry.
+	RPC_S_INTERFACE_NOT_EXPORTED = 0x784,
+	// The specified profile entry could not be added.
+	RPC_S_PROFILE_NOT_ADDED = 0x785,
+	// The specified profile element could not be added.
+	RPC_S_PRF_ELT_NOT_ADDED = 0x786,
+	// The specified profile element could not be removed.
+	RPC_S_PRF_ELT_NOT_REMOVED = 0x787,
+	// The group element could not be added.
+	RPC_S_GRP_ELT_NOT_ADDED = 0x788,
+	// The group element could not be removed.
+	RPC_S_GRP_ELT_NOT_REMOVED = 0x789,
+	// The printer driver is not compatible with a policy enabled on your computer that blocks NT 4.0 drivers.
+	KM_DRIVER_BLOCKED = 0x78A,
+	// The context has expired and can no longer be used.
+	CONTEXT_EXPIRED = 0x78B,
+	// The current user's delegated trust creation quota has been exceeded.
+	PER_USER_TRUST_QUOTA_EXCEEDED = 0x78C,
+	// The total delegated trust creation quota has been exceeded.
+	ALL_USER_TRUST_QUOTA_EXCEEDED = 0x78D,
+	// The current user's delegated trust deletion quota has been exceeded.
+	USER_DELETE_TRUST_QUOTA_EXCEEDED = 0x78E,
+	// The computer you are signing into is protected by an authentication firewall. The specified account is not allowed to authenticate to the computer.
+	AUTHENTICATION_FIREWALL_FAILED = 0x78F,
+	// Remote connections to the Print Spooler are blocked by a policy set on your machine.
+	REMOTE_PRINT_CONNECTIONS_BLOCKED = 0x790,
+	// Authentication failed because NTLM authentication has been disabled.
+	NTLM_BLOCKED = 0x791,
+	// Logon Failure: EAS policy requires that the user change their password before this operation can be performed.
+	PASSWORD_CHANGE_REQUIRED = 0x792,
+	// The pixel format is invalid.
+	INVALID_PIXEL_FORMAT = 0x7D0,
+	// The specified driver is invalid.
+	BAD_DRIVER = 0x7D1,
+	// The window style or class attribute is invalid for this operation.
+	INVALID_WINDOW_STYLE = 0x7D2,
+	// The requested metafile operation is not supported.
+	METAFILE_NOT_SUPPORTED = 0x7D3,
+	// The requested transformation operation is not supported.
+	TRANSFORM_NOT_SUPPORTED = 0x7D4,
+	// The requested clipping operation is not supported.
+	CLIPPING_NOT_SUPPORTED = 0x7D5,
+	// The specified color management module is invalid.
+	INVALID_CMM = 0x7DA,
+	// The specified color profile is invalid.
+	INVALID_PROFILE = 0x7DB,
+	// The specified tag was not found.
+	TAG_NOT_FOUND = 0x7DC,
+	// A required tag is not present.
+	TAG_NOT_PRESENT = 0x7DD,
+	// The specified tag is already present.
+	DUPLICATE_TAG = 0x7DE,
+	// The specified color profile is not associated with the specified device.
+	PROFILE_NOT_ASSOCIATED_WITH_DEVICE = 0x7DF,
+	// The specified color profile was not found.
+	PROFILE_NOT_FOUND = 0x7E0,
+	// The specified color space is invalid.
+	INVALID_COLORSPACE = 0x7E1,
+	// Image Color Management is not enabled.
+	ICM_NOT_ENABLED = 0x7E2,
+	// There was an error while deleting the color transform.
+	DELETING_ICM_XFORM = 0x7E3,
+	// The specified color transform is invalid.
+	INVALID_TRANSFORM = 0x7E4,
+	// The specified transform does not match the bitmap's color space.
+	COLORSPACE_MISMATCH = 0x7E5,
+	// The specified named color index is not present in the profile.
+	INVALID_COLORINDEX = 0x7E6,
+	// The specified profile is intended for a device of a different type than the specified device.
+	PROFILE_DOES_NOT_MATCH_DEVICE = 0x7E7,
+	// The network connection was made successfully, but the user had to be prompted for a password other than the one originally specified.
+	CONNECTED_OTHER_PASSWORD = 0x83C,
+	// The network connection was made successfully using default credentials.
+	CONNECTED_OTHER_PASSWORD_DEFAULT = 0x83D,
+	// The specified username is invalid.
+	BAD_USERNAME = 0x89A,
+	// This network connection does not exist.
+	NOT_CONNECTED = 0x8CA,
+	// This network connection has files open or requests pending.
+	OPEN_FILES = 0x961,
+	// Active connections still exist.
+	ACTIVE_CONNECTIONS = 0x962,
+	// The device is in use by an active process and cannot be disconnected.
+	DEVICE_IN_USE = 0x964,
+	// The specified print monitor is unknown.
+	UNKNOWN_PRINT_MONITOR = 0xBB8,
+	// The specified printer driver is currently in use.
+	PRINTER_DRIVER_IN_USE = 0xBB9,
+	// The spool file was not found.
+	SPOOL_FILE_NOT_FOUND = 0xBBA,
+	// A StartDocPrinter call was not issued.
+	SPL_NO_STARTDOC = 0xBBB,
+	// An AddJob call was not issued.
+	SPL_NO_ADDJOB = 0xBBC,
+	// The specified print processor has already been installed.
+	PRINT_PROCESSOR_ALREADY_INSTALLED = 0xBBD,
+	// The specified print monitor has already been installed.
+	PRINT_MONITOR_ALREADY_INSTALLED = 0xBBE,
+	// The specified print monitor does not have the required functions.
+	INVALID_PRINT_MONITOR = 0xBBF,
+	// The specified print monitor is currently in use.
+	PRINT_MONITOR_IN_USE = 0xBC0,
+	// The requested operation is not allowed when there are jobs queued to the printer.
+	PRINTER_HAS_JOBS_QUEUED = 0xBC1,
+	// The requested operation is successful. Changes will not be effective until the system is rebooted.
+	SUCCESS_REBOOT_REQUIRED = 0xBC2,
+	// The requested operation is successful. Changes will not be effective until the service is restarted.
+	SUCCESS_RESTART_REQUIRED = 0xBC3,
+	// No printers were found.
+	PRINTER_NOT_FOUND = 0xBC4,
+	// The printer driver is known to be unreliable.
+	PRINTER_DRIVER_WARNED = 0xBC5,
+	// The printer driver is known to harm the system.
+	PRINTER_DRIVER_BLOCKED = 0xBC6,
+	// The specified printer driver package is currently in use.
+	PRINTER_DRIVER_PACKAGE_IN_USE = 0xBC7,
+	// Unable to find a core driver package that is required by the printer driver package.
+	CORE_DRIVER_PACKAGE_NOT_FOUND = 0xBC8,
+	// The requested operation failed. A system reboot is required to roll back changes made.
+	FAIL_REBOOT_REQUIRED = 0xBC9,
+	// The requested operation failed. A system reboot has been initiated to roll back changes made.
+	FAIL_REBOOT_INITIATED = 0xBCA,
+	// The specified printer driver was not found on the system and needs to be downloaded.
+	PRINTER_DRIVER_DOWNLOAD_NEEDED = 0xBCB,
+	// The requested print job has failed to print. A print system update requires the job to be resubmitted.
+	PRINT_JOB_RESTART_REQUIRED = 0xBCC,
+	// The printer driver does not contain a valid manifest, or contains too many manifests.
+	INVALID_PRINTER_DRIVER_MANIFEST = 0xBCD,
+	// The specified printer cannot be shared.
+	PRINTER_NOT_SHAREABLE = 0xBCE,
+	// The operation was paused.
+	REQUEST_PAUSED = 0xBEA,
+	// Reissue the given operation as a cached IO operation.
+	IO_REISSUE_AS_CACHED = 0xF6E,
+
+	// WINS encountered an error while processing the command.
+	WINS_INTERNAL = 0xFA0,
+	// The local WINS cannot be deleted.
+	CAN_NOT_DEL_LOCAL_WINS = 0xFA1,
+	// The importation from the file failed.
+	STATIC_INIT = 0xFA2,
+	// The backup failed. Was a full backup done before?
+	INC_BACKUP = 0xFA3,
+	// The backup failed. Check the directory to which you are backing the database.
+	FULL_BACKUP = 0xFA4,
+	// The name does not exist in the WINS database.
+	REC_NON_EXISTENT = 0xFA5,
+	// Replication with a nonconfigured partner is not allowed.
+	RPL_NOT_ALLOWED = 0xFA6,
+	// The version of the supplied content information is not supported.
+	PEERDIST_ERROR_CONTENTINFO_VERSION_UNSUPPORTED = 0xFD2,
+	// The supplied content information is malformed.
+	PEERDIST_ERROR_CANNOT_PARSE_CONTENTINFO = 0xFD3,
+	// The requested data cannot be found in local or peer caches.
+	PEERDIST_ERROR_MISSING_DATA = 0xFD4,
+	// No more data is available or required.
+	PEERDIST_ERROR_NO_MORE = 0xFD5,
+	// The supplied object has not been initialized.
+	PEERDIST_ERROR_NOT_INITIALIZED = 0xFD6,
+	// The supplied object has already been initialized.
+	PEERDIST_ERROR_ALREADY_INITIALIZED = 0xFD7,
+	// A shutdown operation is already in progress.
+	PEERDIST_ERROR_SHUTDOWN_IN_PROGRESS = 0xFD8,
+	// The supplied object has already been invalidated.
+	PEERDIST_ERROR_INVALIDATED = 0xFD9,
+	// An element already exists and was not replaced.
+	PEERDIST_ERROR_ALREADY_EXISTS = 0xFDA,
+	// Cannot cancel the requested operation as it has already been completed.
+	PEERDIST_ERROR_OPERATION_NOTFOUND = 0xFDB,
+	// Can not perform the reqested operation because it has already been carried out.
+	PEERDIST_ERROR_ALREADY_COMPLETED = 0xFDC,
+	// An operation accessed data beyond the bounds of valid data.
+	PEERDIST_ERROR_OUT_OF_BOUNDS = 0xFDD,
+	// The requested version is not supported.
+	PEERDIST_ERROR_VERSION_UNSUPPORTED = 0xFDE,
+	// A configuration value is invalid.
+	PEERDIST_ERROR_INVALID_CONFIGURATION = 0xFDF,
+	// The SKU is not licensed.
+	PEERDIST_ERROR_NOT_LICENSED = 0xFE0,
+	// PeerDist Service is still initializing and will be available shortly.
+	PEERDIST_ERROR_SERVICE_UNAVAILABLE = 0xFE1,
+	// Communication with one or more computers will be temporarily blocked due to recent errors.
+	PEERDIST_ERROR_TRUST_FAILURE = 0xFE2,
+	// The DHCP client has obtained an IP address that is already in use on the network. The local interface will be disabled until the DHCP client can obtain a new address.
+	DHCP_ADDRESS_CONFLICT = 0x1004,
+	// The GUID passed was not recognized as valid by a WMI data provider.
+	WMI_GUID_NOT_FOUND = 0x1068,
+	// The instance name passed was not recognized as valid by a WMI data provider.
+	WMI_INSTANCE_NOT_FOUND = 0x1069,
+	// The data item ID passed was not recognized as valid by a WMI data provider.
+	WMI_ITEMID_NOT_FOUND = 0x106A,
+	// The WMI request could not be completed and should be retried.
+	WMI_TRY_AGAIN = 0x106B,
+	// The WMI data provider could not be located.
+	WMI_DP_NOT_FOUND = 0x106C,
+	// The WMI data provider references an instance set that has not been registered.
+	WMI_UNRESOLVED_INSTANCE_REF = 0x106D,
+	// The WMI data block or event notification has already been enabled.
+	WMI_ALREADY_ENABLED = 0x106E,
+	// The WMI data block is no longer available.
+	WMI_GUID_DISCONNECTED = 0x106F,
+	// The WMI data service is not available.
+	WMI_SERVER_UNAVAILABLE = 0x1070,
+	// The WMI data provider failed to carry out the request.
+	WMI_DP_FAILED = 0x1071,
+	// The WMI MOF information is not valid.
+	WMI_INVALID_MOF = 0x1072,
+	// The WMI registration information is not valid.
+	WMI_INVALID_REGINFO = 0x1073,
+	// The WMI data block or event notification has already been disabled.
+	WMI_ALREADY_DISABLED = 0x1074,
+	// The WMI data item or data block is read only.
+	WMI_READ_ONLY = 0x1075,
+	// The WMI data item or data block could not be changed.
+	WMI_SET_FAILURE = 0x1076,
+	// This operation is only valid in the context of an app container.
+	NOT_APPCONTAINER = 0x109A,
+	// This application can only run in the context of an app container.
+	APPCONTAINER_REQUIRED = 0x109B,
+	// This functionality is not supported in the context of an app container.
+	NOT_SUPPORTED_IN_APPCONTAINER = 0x109C,
+	// The length of the SID supplied is not a valid length for app container SIDs.
+	INVALID_PACKAGE_SID_LENGTH = 0x109D,
+	// The media identifier does not represent a valid medium.
+	INVALID_MEDIA = 0x10CC,
+	// The library identifier does not represent a valid library.
+	INVALID_LIBRARY = 0x10CD,
+	// The media pool identifier does not represent a valid media pool.
+	INVALID_MEDIA_POOL = 0x10CE,
+	// The drive and medium are not compatible or exist in different libraries.
+	DRIVE_MEDIA_MISMATCH = 0x10CF,
+	// The medium currently exists in an offline library and must be online to perform this operation.
+	MEDIA_OFFLINE = 0x10D0,
+	// The operation cannot be performed on an offline library.
+	LIBRARY_OFFLINE = 0x10D1,
+	// The library, drive, or media pool is empty.
+	EMPTY = 0x10D2,
+	// The library, drive, or media pool must be empty to perform this operation.
+	NOT_EMPTY = 0x10D3,
+	// No media is currently available in this media pool or library.
+	MEDIA_UNAVAILABLE = 0x10D4,
+	// A resource required for this operation is disabled.
+	RESOURCE_DISABLED = 0x10D5,
+	// The media identifier does not represent a valid cleaner.
+	INVALID_CLEANER = 0x10D6,
+	// The drive cannot be cleaned or does not support cleaning.
+	UNABLE_TO_CLEAN = 0x10D7,
+	// The object identifier does not represent a valid object.
+	OBJECT_NOT_FOUND = 0x10D8,
+	// Unable to read from or write to the database.
+	DATABASE_FAILURE = 0x10D9,
+	// The database is full.
+	DATABASE_FULL = 0x10DA,
+	// The medium is not compatible with the device or media pool.
+	MEDIA_INCOMPATIBLE = 0x10DB,
+	// The resource required for this operation does not exist.
+	RESOURCE_NOT_PRESENT = 0x10DC,
+	// The operation identifier is not valid.
+	INVALID_OPERATION = 0x10DD,
+	// The media is not mounted or ready for use.
+	MEDIA_NOT_AVAILABLE = 0x10DE,
+	// The device is not ready for use.
+	DEVICE_NOT_AVAILABLE = 0x10DF,
+	// The operator or administrator has refused the request.
+	REQUEST_REFUSED = 0x10E0,
+	// The drive identifier does not represent a valid drive.
+	INVALID_DRIVE_OBJECT = 0x10E1,
+	// Library is full. No slot is available for use.
+	LIBRARY_FULL = 0x10E2,
+	// The transport cannot access the medium.
+	MEDIUM_NOT_ACCESSIBLE = 0x10E3,
+	// Unable to load the medium into the drive.
+	UNABLE_TO_LOAD_MEDIUM = 0x10E4,
+	// Unable to retrieve the drive status.
+	UNABLE_TO_INVENTORY_DRIVE = 0x10E5,
+	// Unable to retrieve the slot status.
+	UNABLE_TO_INVENTORY_SLOT = 0x10E6,
+	// Unable to retrieve status about the transport.
+	UNABLE_TO_INVENTORY_TRANSPORT = 0x10E7,
+	// Cannot use the transport because it is already in use.
+	TRANSPORT_FULL = 0x10E8,
+	// Unable to open or close the inject/eject port.
+	CONTROLLING_IEPORT = 0x10E9,
+	// Unable to eject the medium because it is in a drive.
+	UNABLE_TO_EJECT_MOUNTED_MEDIA = 0x10EA,
+	// A cleaner slot is already reserved.
+	CLEANER_SLOT_SET = 0x10EB,
+	// A cleaner slot is not reserved.
+	CLEANER_SLOT_NOT_SET = 0x10EC,
+	// The cleaner cartridge has performed the maximum number of drive cleanings.
+	CLEANER_CARTRIDGE_SPENT = 0x10ED,
+	// Unexpected on-medium identifier.
+	UNEXPECTED_OMID = 0x10EE,
+	// The last remaining item in this group or resource cannot be deleted.
+	CANT_DELETE_LAST_ITEM = 0x10EF,
+	// The message provided exceeds the maximum size allowed for this parameter.
+	MESSAGE_EXCEEDS_MAX_SIZE = 0x10F0,
+	// The volume contains system or paging files.
+	VOLUME_CONTAINS_SYS_FILES = 0x10F1,
+	// The media type cannot be removed from this library since at least one drive in the library reports it can support this media type.
+	INDIGENOUS_TYPE = 0x10F2,
+	// This offline media cannot be mounted on this system since no enabled drives are present which can be used.
+	NO_SUPPORTING_DRIVES = 0x10F3,
+	// A cleaner cartridge is present in the tape library.
+	CLEANER_CARTRIDGE_INSTALLED = 0x10F4,
+	// Cannot use the inject/eject port because it is not empty.
+	IEPORT_FULL = 0x10F5,
+	// This file is currently not available for use on this computer.
+	FILE_OFFLINE = 0x10FE,
+	// The remote storage service is not operational at this time.
+	REMOTE_STORAGE_NOT_ACTIVE = 0x10FF,
+	// The remote storage service encountered a media error.
+	REMOTE_STORAGE_MEDIA_ERROR = 0x1100,
+	// The file or directory is not a reparse point.
+	NOT_A_REPARSE_POINT = 0x1126,
+	// The reparse point attribute cannot be set because it conflicts with an existing attribute.
+	REPARSE_ATTRIBUTE_CONFLICT = 0x1127,
+	// The data present in the reparse point buffer is invalid.
+	INVALID_REPARSE_DATA = 0x1128,
+	// The tag present in the reparse point buffer is invalid.
+	REPARSE_TAG_INVALID = 0x1129,
+	// There is a mismatch between the tag specified in the request and the tag present in the reparse point.
+	REPARSE_TAG_MISMATCH = 0x112A,
+	// Fast Cache data not found.
+	APP_DATA_NOT_FOUND = 0x1130,
+	// Fast Cache data expired.
+	APP_DATA_EXPIRED = 0x1131,
+	// Fast Cache data corrupt.
+	APP_DATA_CORRUPT = 0x1132,
+	// Fast Cache data has exceeded its max size and cannot be updated.
+	APP_DATA_LIMIT_EXCEEDED = 0x1133,
+	// Fast Cache has been ReArmed and requires a reboot until it can be updated.
+	APP_DATA_REBOOT_REQUIRED = 0x1134,
+	// Secure Boot detected that rollback of protected data has been attempted.
+	SECUREBOOT_ROLLBACK_DETECTED = 0x1144,
+	// The value is protected by Secure Boot policy and cannot be modified or deleted.
+	SECUREBOOT_POLICY_VIOLATION = 0x1145,
+	// The Secure Boot policy is invalid.
+	SECUREBOOT_INVALID_POLICY = 0x1146,
+	// A new Secure Boot policy did not contain the current publisher on its update list.
+	SECUREBOOT_POLICY_PUBLISHER_NOT_FOUND = 0x1147,
+	// The Secure Boot policy is either not signed or is signed by a non-trusted signer.
+	SECUREBOOT_POLICY_NOT_SIGNED = 0x1148,
+	// Secure Boot is not enabled on this machine.
+	SECUREBOOT_NOT_ENABLED = 0x1149,
+	// Secure Boot requires that certain files and drivers are not replaced by other files or drivers.
+	SECUREBOOT_FILE_REPLACED = 0x114A,
+	// The copy offload read operation is not supported by a filter.
+	OFFLOAD_READ_FLT_NOT_SUPPORTED = 0x1158,
+	// The copy offload write operation is not supported by a filter.
+	OFFLOAD_WRITE_FLT_NOT_SUPPORTED = 0x1159,
+	// The copy offload read operation is not supported for the file.
+	OFFLOAD_READ_FILE_NOT_SUPPORTED = 0x115A,
+	// The copy offload write operation is not supported for the file.
+	OFFLOAD_WRITE_FILE_NOT_SUPPORTED = 0x115B,
+	// Single Instance Storage is not available on this volume.
+	VOLUME_NOT_SIS_ENABLED = 0x1194,
+	// The operation cannot be completed because other resources are dependent on this resource.
+	DEPENDENT_RESOURCE_EXISTS = 0x1389,
+	// The cluster resource dependency cannot be found.
+	DEPENDENCY_NOT_FOUND = 0x138A,
+	// The cluster resource cannot be made dependent on the specified resource because it is already dependent.
+	DEPENDENCY_ALREADY_EXISTS = 0x138B,
+	// The cluster resource is not online.
+	RESOURCE_NOT_ONLINE = 0x138C,
+	// A cluster node is not available for this operation.
+	HOST_NODE_NOT_AVAILABLE = 0x138D,
+	// The cluster resource is not available.
+	RESOURCE_NOT_AVAILABLE = 0x138E,
+	// The cluster resource could not be found.
+	RESOURCE_NOT_FOUND = 0x138F,
+	// The cluster is being shut down.
+	SHUTDOWN_CLUSTER = 0x1390,
+	// A cluster node cannot be evicted from the cluster unless the node is down or it is the last node.
+	CANT_EVICT_ACTIVE_NODE = 0x1391,
+	// The object already exists.
+	OBJECT_ALREADY_EXISTS = 0x1392,
+	// The object is already in the list.
+	OBJECT_IN_LIST = 0x1393,
+	// The cluster group is not available for any new requests.
+	GROUP_NOT_AVAILABLE = 0x1394,
+	// The cluster group could not be found.
+	GROUP_NOT_FOUND = 0x1395,
+	// The operation could not be completed because the cluster group is not online.
+	GROUP_NOT_ONLINE = 0x1396,
+	// The operation failed because either the specified cluster node is not the owner of the resource, or the node is not a possible owner of the resource.
+	HOST_NODE_NOT_RESOURCE_OWNER = 0x1397,
+	// The operation failed because either the specified cluster node is not the owner of the group, or the node is not a possible owner of the group.
+	HOST_NODE_NOT_GROUP_OWNER = 0x1398,
+	// The cluster resource could not be created in the specified resource monitor.
+	RESMON_CREATE_FAILED = 0x1399,
+	// The cluster resource could not be brought online by the resource monitor.
+	RESMON_ONLINE_FAILED = 0x139A,
+	// The operation could not be completed because the cluster resource is online.
+	RESOURCE_ONLINE = 0x139B,
+	// The cluster resource could not be deleted or brought offline because it is the quorum resource.
+	QUORUM_RESOURCE = 0x139C,
+	// The cluster could not make the specified resource a quorum resource because it is not capable of being a quorum resource.
+	NOT_QUORUM_CAPABLE = 0x139D,
+	// The cluster software is shutting down.
+	CLUSTER_SHUTTING_DOWN = 0x139E,
+	// The group or resource is not in the correct state to perform the requested operation.
+	INVALID_STATE = 0x139F,
+	// The properties were stored but not all changes will take effect until the next time the resource is brought online.
+	RESOURCE_PROPERTIES_STORED = 0x13A0,
+	// The cluster could not make the specified resource a quorum resource because it does not belong to a shared storage class.
+	NOT_QUORUM_CLASS = 0x13A1,
+	// The cluster resource could not be deleted since it is a core resource.
+	CORE_RESOURCE = 0x13A2,
+	// The quorum resource failed to come online.
+	QUORUM_RESOURCE_ONLINE_FAILED = 0x13A3,
+	// The quorum log could not be created or mounted successfully.
+	QUORUMLOG_OPEN_FAILED = 0x13A4,
+	// The cluster log is corrupt.
+	CLUSTERLOG_CORRUPT = 0x13A5,
+	// The record could not be written to the cluster log since it exceeds the maximum size.
+	CLUSTERLOG_RECORD_EXCEEDS_MAXSIZE = 0x13A6,
+	// The cluster log exceeds its maximum size.
+	CLUSTERLOG_EXCEEDS_MAXSIZE = 0x13A7,
+	// No checkpoint record was found in the cluster log.
+	CLUSTERLOG_CHKPOINT_NOT_FOUND = 0x13A8,
+	// The minimum required disk space needed for logging is not available.
+	CLUSTERLOG_NOT_ENOUGH_SPACE = 0x13A9,
+	// The cluster node failed to take control of the quorum resource because the resource is owned by another active node.
+	QUORUM_OWNER_ALIVE = 0x13AA,
+	// A cluster network is not available for this operation.
+	NETWORK_NOT_AVAILABLE = 0x13AB,
+	// A cluster node is not available for this operation.
+	NODE_NOT_AVAILABLE = 0x13AC,
+	// All cluster nodes must be running to perform this operation.
+	ALL_NODES_NOT_AVAILABLE = 0x13AD,
+	// A cluster resource failed.
+	RESOURCE_FAILED = 0x13AE,
+	// The cluster node is not valid.
+	CLUSTER_INVALID_NODE = 0x13AF,
+	// The cluster node already exists.
+	CLUSTER_NODE_EXISTS = 0x13B0,
+	// A node is in the process of joining the cluster.
+	CLUSTER_JOIN_IN_PROGRESS = 0x13B1,
+	// The cluster node was not found.
+	CLUSTER_NODE_NOT_FOUND = 0x13B2,
+	// The cluster local node information was not found.
+	CLUSTER_LOCAL_NODE_NOT_FOUND = 0x13B3,
+	// The cluster network already exists.
+	CLUSTER_NETWORK_EXISTS = 0x13B4,
+	// The cluster network was not found.
+	CLUSTER_NETWORK_NOT_FOUND = 0x13B5,
+	// The cluster network interface already exists.
+	CLUSTER_NETINTERFACE_EXISTS = 0x13B6,
+	// The cluster network interface was not found.
+	CLUSTER_NETINTERFACE_NOT_FOUND = 0x13B7,
+	// The cluster request is not valid for this object.
+	CLUSTER_INVALID_REQUEST = 0x13B8,
+	// The cluster network provider is not valid.
+	CLUSTER_INVALID_NETWORK_PROVIDER = 0x13B9,
+	// The cluster node is down.
+	CLUSTER_NODE_DOWN = 0x13BA,
+	// The cluster node is not reachable.
+	CLUSTER_NODE_UNREACHABLE = 0x13BB,
+	// The cluster node is not a member of the cluster.
+	CLUSTER_NODE_NOT_MEMBER = 0x13BC,
+	// A cluster join operation is not in progress.
+	CLUSTER_JOIN_NOT_IN_PROGRESS = 0x13BD,
+	// The cluster network is not valid.
+	CLUSTER_INVALID_NETWORK = 0x13BE,
+	// The cluster node is up.
+	CLUSTER_NODE_UP = 0x13C0,
+	// The cluster IP address is already in use.
+	CLUSTER_IPADDR_IN_USE = 0x13C1,
+	// The cluster node is not paused.
+	CLUSTER_NODE_NOT_PAUSED = 0x13C2,
+	// No cluster security context is available.
+	CLUSTER_NO_SECURITY_CONTEXT = 0x13C3,
+	// The cluster network is not configured for internal cluster communication.
+	CLUSTER_NETWORK_NOT_INTERNAL = 0x13C4,
+	// The cluster node is already up.
+	CLUSTER_NODE_ALREADY_UP = 0x13C5,
+	// The cluster node is already down.
+	CLUSTER_NODE_ALREADY_DOWN = 0x13C6,
+	// The cluster network is already online.
+	CLUSTER_NETWORK_ALREADY_ONLINE = 0x13C7,
+	// The cluster network is already offline.
+	CLUSTER_NETWORK_ALREADY_OFFLINE = 0x13C8,
+	// The cluster node is already a member of the cluster.
+	CLUSTER_NODE_ALREADY_MEMBER = 0x13C9,
+	// The cluster network is the only one configured for internal cluster communication between two or more active cluster nodes. The internal communication capability cannot be removed from the network.
+	CLUSTER_LAST_INTERNAL_NETWORK = 0x13CA,
+	// One or more cluster resources depend on the network to provide service to clients. The client access capability cannot be removed from the network.
+	CLUSTER_NETWORK_HAS_DEPENDENTS = 0x13CB,
+	// This operation cannot be performed on the cluster resource as it the quorum resource. You may not bring the quorum resource offline or modify its possible owners list.
+	INVALID_OPERATION_ON_QUORUM = 0x13CC,
+	// The cluster quorum resource is not allowed to have any dependencies.
+	DEPENDENCY_NOT_ALLOWED = 0x13CD,
+	// The cluster node is paused.
+	CLUSTER_NODE_PAUSED = 0x13CE,
+	// The cluster resource cannot be brought online. The owner node cannot run this resource.
+	NODE_CANT_HOST_RESOURCE = 0x13CF,
+	// The cluster node is not ready to perform the requested operation.
+	CLUSTER_NODE_NOT_READY = 0x13D0,
+	// The cluster node is shutting down.
+	CLUSTER_NODE_SHUTTING_DOWN = 0x13D1,
+	// The cluster join operation was aborted.
+	CLUSTER_JOIN_ABORTED = 0x13D2,
+	// The cluster join operation failed due to incompatible software versions between the joining node and its sponsor.
+	CLUSTER_INCOMPATIBLE_VERSIONS = 0x13D3,
+	// This resource cannot be created because the cluster has reached the limit on the number of resources it can monitor.
+	CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDED = 0x13D4,
+	// The system configuration changed during the cluster join or form operation. The join or form operation was aborted.
+	CLUSTER_SYSTEM_CONFIG_CHANGED = 0x13D5,
+	// The specified resource type was not found.
+	CLUSTER_RESOURCE_TYPE_NOT_FOUND = 0x13D6,
+	// The specified node does not support a resource of this type. This may be due to version inconsistencies or due to the absence of the resource DLL on this node.
+	CLUSTER_RESTYPE_NOT_SUPPORTED = 0x13D7,
+	// The specified resource name is not supported by this resource DLL. This may be due to a bad (or changed) name supplied to the resource DLL.
+	CLUSTER_RESNAME_NOT_FOUND = 0x13D8,
+	// No authentication package could be registered with the RPC server.
+	CLUSTER_NO_RPC_PACKAGES_REGISTERED = 0x13D9,
+	// You cannot bring the group online because the owner of the group is not in the preferred list for the group. To change the owner node for the group, move the group.
+	CLUSTER_OWNER_NOT_IN_PREFLIST = 0x13DA,
+	// The join operation failed because the cluster database sequence number has changed or is incompatible with the locker node. This may happen during a join operation if the cluster database was changing during the join.
+	CLUSTER_DATABASE_SEQMISMATCH = 0x13DB,
+	// The resource monitor will not allow the fail operation to be performed while the resource is in its current state. This may happen if the resource is in a pending state.
+	RESMON_INVALID_STATE = 0x13DC,
+	// A non locker code got a request to reserve the lock for making global updates.
+	CLUSTER_GUM_NOT_LOCKER = 0x13DD,
+	// The quorum disk could not be located by the cluster service.
+	QUORUM_DISK_NOT_FOUND = 0x13DE,
+	// The backed up cluster database is possibly corrupt.
+	DATABASE_BACKUP_CORRUPT = 0x13DF,
+	// A DFS root already exists in this cluster node.
+	CLUSTER_NODE_ALREADY_HAS_DFS_ROOT = 0x13E0,
+	// An attempt to modify a resource property failed because it conflicts with another existing property.
+	RESOURCE_PROPERTY_UNCHANGEABLE = 0x13E1,
+	// An operation was attempted that is incompatible with the current membership state of the node.
+	CLUSTER_MEMBERSHIP_INVALID_STATE = 0x1702,
+	// The quorum resource does not contain the quorum log.
+	CLUSTER_QUORUMLOG_NOT_FOUND = 0x1703,
+	// The membership engine requested shutdown of the cluster service on this node.
+	CLUSTER_MEMBERSHIP_HALT = 0x1704,
+	// The join operation failed because the cluster instance ID of the joining node does not match the cluster instance ID of the sponsor node.
+	CLUSTER_INSTANCE_ID_MISMATCH = 0x1705,
+	// A matching cluster network for the specified IP address could not be found.
+	CLUSTER_NETWORK_NOT_FOUND_FOR_IP = 0x1706,
+	// The actual data type of the property did not match the expected data type of the property.
+	CLUSTER_PROPERTY_DATA_TYPE_MISMATCH = 0x1707,
+	// The cluster node was evicted from the cluster successfully, but the node was not cleaned up. To determine what cleanup steps failed and how to recover, see the Failover Clustering application event log using Event Viewer.
+	CLUSTER_EVICT_WITHOUT_CLEANUP = 0x1708,
+	// Two or more parameter values specified for a resource's properties are in conflict.
+	CLUSTER_PARAMETER_MISMATCH = 0x1709,
+	// This computer cannot be made a member of a cluster.
+	NODE_CANNOT_BE_CLUSTERED = 0x170A,
+	// This computer cannot be made a member of a cluster because it does not have the correct version of Windows installed.
+	CLUSTER_WRONG_OS_VERSION = 0x170B,
+	// A cluster cannot be created with the specified cluster name because that cluster name is already in use. Specify a different name for the cluster.
+	CLUSTER_CANT_CREATE_DUP_CLUSTER_NAME = 0x170C,
+	// The cluster configuration action has already been committed.
+	CLUSCFG_ALREADY_COMMITTED = 0x170D,
+	// The cluster configuration action could not be rolled back.
+	CLUSCFG_ROLLBACK_FAILED = 0x170E,
+	// The drive letter assigned to a system disk on one node conflicted with the drive letter assigned to a disk on another node.
+	CLUSCFG_SYSTEM_DISK_DRIVE_LETTER_CONFLICT = 0x170F,
+	// One or more nodes in the cluster are running a version of Windows that does not support this operation.
+	CLUSTER_OLD_VERSION = 0x1710,
+	// The name of the corresponding computer account doesn't match the Network Name for this resource.
+	CLUSTER_MISMATCHED_COMPUTER_ACCT_NAME = 0x1711,
+	// No network adapters are available.
+	CLUSTER_NO_NET_ADAPTERS = 0x1712,
+	// The cluster node has been poisoned.
+	CLUSTER_POISONED = 0x1713,
+	// The group is unable to accept the request since it is moving to another node.
+	CLUSTER_GROUP_MOVING = 0x1714,
+	// The resource type cannot accept the request since is too busy performing another operation.
+	CLUSTER_RESOURCE_TYPE_BUSY = 0x1715,
+	// The call to the cluster resource DLL timed out.
+	RESOURCE_CALL_TIMED_OUT = 0x1716,
+	// The address is not valid for an IPv6 Address resource. A global IPv6 address is required, and it must match a cluster network. Compatibility addresses are not permitted.
+	INVALID_CLUSTER_IPV6_ADDRESS = 0x1717,
+	// An internal cluster error occurred. A call to an invalid function was attempted.
+	CLUSTER_INTERNAL_INVALID_FUNCTION = 0x1718,
+	// A parameter value is out of acceptable range.
+	CLUSTER_PARAMETER_OUT_OF_BOUNDS = 0x1719,
+	// A network error occurred while sending data to another node in the cluster. The number of bytes transmitted was less than required.
+	CLUSTER_PARTIAL_SEND = 0x171A,
+	// An invalid cluster registry operation was attempted.
+	CLUSTER_REGISTRY_INVALID_FUNCTION = 0x171B,
+	// An input string of characters is not properly terminated.
+	CLUSTER_INVALID_STRING_TERMINATION = 0x171C,
+	// An input string of characters is not in a valid format for the data it represents.
+	CLUSTER_INVALID_STRING_FORMAT = 0x171D,
+	// An internal cluster error occurred. A cluster database transaction was attempted while a transaction was already in progress.
+	CLUSTER_DATABASE_TRANSACTION_IN_PROGRESS = 0x171E,
+	// An internal cluster error occurred. There was an attempt to commit a cluster database transaction while no transaction was in progress.
+	CLUSTER_DATABASE_TRANSACTION_NOT_IN_PROGRESS = 0x171F,
+	// An internal cluster error occurred. Data was not properly initialized.
+	CLUSTER_NULL_DATA = 0x1720,
+	// An error occurred while reading from a stream of data. An unexpected number of bytes was returned.
+	CLUSTER_PARTIAL_READ = 0x1721,
+	// An error occurred while writing to a stream of data. The required number of bytes could not be written.
+	CLUSTER_PARTIAL_WRITE = 0x1722,
+	// An error occurred while deserializing a stream of cluster data.
+	CLUSTER_CANT_DESERIALIZE_DATA = 0x1723,
+	// One or more property values for this resource are in conflict with one or more property values associated with its dependent resource(s).
+	DEPENDENT_RESOURCE_PROPERTY_CONFLICT = 0x1724,
+	// A quorum of cluster nodes was not present to form a cluster.
+	CLUSTER_NO_QUORUM = 0x1725,
+	// The cluster network is not valid for an IPv6 Address resource, or it does not match the configured address.
+	CLUSTER_INVALID_IPV6_NETWORK = 0x1726,
+	// The cluster network is not valid for an IPv6 Tunnel resource. Check the configuration of the IP Address resource on which the IPv6 Tunnel resource depends.
+	CLUSTER_INVALID_IPV6_TUNNEL_NETWORK = 0x1727,
+	// Quorum resource cannot reside in the Available Storage group.
+	QUORUM_NOT_ALLOWED_IN_THIS_GROUP = 0x1728,
+	// The dependencies for this resource are nested too deeply.
+	DEPENDENCY_TREE_TOO_COMPLEX = 0x1729,
+	// The call into the resource DLL raised an unhandled exception.
+	EXCEPTION_IN_RESOURCE_CALL = 0x172A,
+	// The RHS process failed to initialize.
+	CLUSTER_RHS_FAILED_INITIALIZATION = 0x172B,
+	// The Failover Clustering feature is not installed on this node.
+	CLUSTER_NOT_INSTALLED = 0x172C,
+	// The resources must be online on the same node for this operation.
+	CLUSTER_RESOURCES_MUST_BE_ONLINE_ON_THE_SAME_NODE = 0x172D,
+	// A new node can not be added since this cluster is already at its maximum number of nodes.
+	CLUSTER_MAX_NODES_IN_CLUSTER = 0x172E,
+	// This cluster can not be created since the specified number of nodes exceeds the maximum allowed limit.
+	CLUSTER_TOO_MANY_NODES = 0x172F,
+	// An attempt to use the specified cluster name failed because an enabled computer object with the given name already exists in the domain.
+	CLUSTER_OBJECT_ALREADY_USED = 0x1730,
+	// This cluster cannot be destroyed. It has non-core application groups which must be deleted before the cluster can be destroyed.
+	NONCORE_GROUPS_FOUND = 0x1731,
+	// File share associated with file share witness resource cannot be hosted by this cluster or any of its nodes.
+	FILE_SHARE_RESOURCE_CONFLICT = 0x1732,
+	// Eviction of this node is invalid at this time. Due to quorum requirements node eviction will result in cluster shutdown. If it is the last node in the cluster, destroy cluster command should be used.
+	CLUSTER_EVICT_INVALID_REQUEST = 0x1733,
+	// Only one instance of this resource type is allowed in the cluster.
+	CLUSTER_SINGLETON_RESOURCE = 0x1734,
+	// Only one instance of this resource type is allowed per resource group.
+	CLUSTER_GROUP_SINGLETON_RESOURCE = 0x1735,
+	// The resource failed to come online due to the failure of one or more provider resources.
+	CLUSTER_RESOURCE_PROVIDER_FAILED = 0x1736,
+	// The resource has indicated that it cannot come online on any node.
+	CLUSTER_RESOURCE_CONFIGURATION_ERROR = 0x1737,
+	// The current operation cannot be performed on this group at this time.
+	CLUSTER_GROUP_BUSY = 0x1738,
+	// The directory or file is not located on a cluster shared volume.
+	CLUSTER_NOT_SHARED_VOLUME = 0x1739,
+	// The Security Descriptor does not meet the requirements for a cluster.
+	CLUSTER_INVALID_SECURITY_DESCRIPTOR = 0x173A,
+	// There is one or more shared volumes resources configured in the cluster. Those resources must be moved to available storage in order for operation to succeed.
+	CLUSTER_SHARED_VOLUMES_IN_USE = 0x173B,
+	// This group or resource cannot be directly manipulated. Use shared volume APIs to perform desired operation.
+	CLUSTER_USE_SHARED_VOLUMES_API = 0x173C,
+	// Back up is in progress. Please wait for backup completion before trying this operation again.
+	CLUSTER_BACKUP_IN_PROGRESS = 0x173D,
+	// The path does not belong to a cluster shared volume.
+	NON_CSV_PATH = 0x173E,
+	// The cluster shared volume is not locally mounted on this node.
+	CSV_VOLUME_NOT_LOCAL = 0x173F,
+	// The cluster watchdog is terminating.
+	CLUSTER_WATCHDOG_TERMINATING = 0x1740,
+	// A resource vetoed a move between two nodes because they are incompatible.
+	CLUSTER_RESOURCE_VETOED_MOVE_INCOMPATIBLE_NODES = 0x1741,
+	// The request is invalid either because node weight cannot be changed while the cluster is in disk-only quorum mode, or because changing the node weight would violate the minimum cluster quorum requirements.
+	CLUSTER_INVALID_NODE_WEIGHT = 0x1742,
+	// The resource vetoed the call.
+	CLUSTER_RESOURCE_VETOED_CALL = 0x1743,
+	// Resource could not start or run because it could not reserve sufficient system resources.
+	RESMON_SYSTEM_RESOURCES_LACKING = 0x1744,
+	// A resource vetoed a move between two nodes because the destination currently does not have enough resources to complete the operation.
+	CLUSTER_RESOURCE_VETOED_MOVE_NOT_ENOUGH_RESOURCES_ON_DESTINATION = 0x1745,
+	// A resource vetoed a move between two nodes because the source currently does not have enough resources to complete the operation.
+	CLUSTER_RESOURCE_VETOED_MOVE_NOT_ENOUGH_RESOURCES_ON_SOURCE = 0x1746,
+	// The requested operation can not be completed because the group is queued for an operation.
+	CLUSTER_GROUP_QUEUED = 0x1747,
+	// The requested operation can not be completed because a resource has locked status.
+	CLUSTER_RESOURCE_LOCKED_STATUS = 0x1748,
+	// The resource cannot move to another node because a cluster shared volume vetoed the operation.
+	CLUSTER_SHARED_VOLUME_FAILOVER_NOT_ALLOWED = 0x1749,
+	// A node drain is already in progress.
+	// This value was also named ERROR_CLUSTER_NODE_EVACUATION_IN_PROGRESS
+	CLUSTER_NODE_DRAIN_IN_PROGRESS = 0x174A,
+	// Clustered storage is not connected to the node.
+	CLUSTER_DISK_NOT_CONNECTED = 0x174B,
+	// The disk is not configured in a way to be used with CSV. CSV disks must have at least one partition that is formatted with NTFS.
+	DISK_NOT_CSV_CAPABLE = 0x174C,
+	// The resource must be part of the Available Storage group to complete this action.
+	RESOURCE_NOT_IN_AVAILABLE_STORAGE = 0x174D,
+	// CSVFS failed operation as volume is in redirected mode.
+	CLUSTER_SHARED_VOLUME_REDIRECTED = 0x174E,
+	// CSVFS failed operation as volume is not in redirected mode.
+	CLUSTER_SHARED_VOLUME_NOT_REDIRECTED = 0x174F,
+	// Cluster properties cannot be returned at this time.
+	CLUSTER_CANNOT_RETURN_PROPERTIES = 0x1750,
+	// The clustered disk resource contains software snapshot diff area that are not supported for Cluster Shared Volumes.
+	CLUSTER_RESOURCE_CONTAINS_UNSUPPORTED_DIFF_AREA_FOR_SHARED_VOLUMES = 0x1751,
+	// The operation cannot be completed because the resource is in maintenance mode.
+	CLUSTER_RESOURCE_IS_IN_MAINTENANCE_MODE = 0x1752,
+	// The operation cannot be completed because of cluster affinity conflicts.
+	CLUSTER_AFFINITY_CONFLICT = 0x1753,
+	// The operation cannot be completed because the resource is a replica virtual machine.
+	CLUSTER_RESOURCE_IS_REPLICA_VIRTUAL_MACHINE = 0x1754,
+
+	// The specified file could not be encrypted.
+	ENCRYPTION_FAILED = 0x1770,
+	// The specified file could not be decrypted.
+	DECRYPTION_FAILED = 0x1771,
+	// The specified file is encrypted and the user does not have the ability to decrypt it.
+	FILE_ENCRYPTED = 0x1772,
+	// There is no valid encryption recovery policy configured for this system.
+	NO_RECOVERY_POLICY = 0x1773,
+	// The required encryption driver is not loaded for this system.
+	NO_EFS = 0x1774,
+	// The file was encrypted with a different encryption driver than is currently loaded.
+	WRONG_EFS = 0x1775,
+	// There are no EFS keys defined for the user.
+	NO_USER_KEYS = 0x1776,
+	// The specified file is not encrypted.
+	FILE_NOT_ENCRYPTED = 0x1777,
+	// The specified file is not in the defined EFS export format.
+	NOT_EXPORT_FORMAT = 0x1778,
+	// The specified file is read only.
+	FILE_READ_ONLY = 0x1779,
+	// The directory has been disabled for encryption.
+	DIR_EFS_DISALLOWED = 0x177A,
+	// The server is not trusted for remote encryption operation.
+	EFS_SERVER_NOT_TRUSTED = 0x177B,
+	// Recovery policy configured for this system contains invalid recovery certificate.
+	BAD_RECOVERY_POLICY = 0x177C,
+	// The encryption algorithm used on the source file needs a bigger key buffer than the one on the destination file.
+	EFS_ALG_BLOB_TOO_BIG = 0x177D,
+	// The disk partition does not support file encryption.
+	VOLUME_NOT_SUPPORT_EFS = 0x177E,
+	// This machine is disabled for file encryption.
+	EFS_DISABLED = 0x177F,
+	// A newer system is required to decrypt this encrypted file.
+	EFS_VERSION_NOT_SUPPORT = 0x1780,
+	// The remote server sent an invalid response for a file being opened with Client Side Encryption.
+	CS_ENCRYPTION_INVALID_SERVER_RESPONSE = 0x1781,
+	// Client Side Encryption is not supported by the remote server even though it claims to support it.
+	CS_ENCRYPTION_UNSUPPORTED_SERVER = 0x1782,
+	// File is encrypted and should be opened in Client Side Encryption mode.
+	CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE = 0x1783,
+	// A new encrypted file is being created and a $EFS needs to be provided.
+	CS_ENCRYPTION_NEW_ENCRYPTED_FILE = 0x1784,
+	// The SMB client requested a CSE FSCTL on a non-CSE file.
+	CS_ENCRYPTION_FILE_NOT_CSE = 0x1785,
+	// The requested operation was blocked by policy. For more information, contact your system administrator.
+	ENCRYPTION_POLICY_DENIES_OPERATION = 0x1786,
+	// The list of servers for this workgroup is not currently available.
+	NO_BROWSER_SERVERS_FOUND = 0x17E6,
+	// The Task Scheduler service must be configured to run in the System account to function properly. Individual tasks may be configured to run in other accounts.
+	SCHED_E_SERVICE_NOT_LOCALSYSTEM = 0x1838,
+	// Log service encountered an invalid log sector.
+	LOG_SECTOR_INVALID = 0x19C8,
+	// Log service encountered a log sector with invalid block parity.
+	LOG_SECTOR_PARITY_INVALID = 0x19C9,
+	// Log service encountered a remapped log sector.
+	LOG_SECTOR_REMAPPED = 0x19CA,
+	// Log service encountered a partial or incomplete log block.
+	LOG_BLOCK_INCOMPLETE = 0x19CB,
+	// Log service encountered an attempt access data outside the active log range.
+	LOG_INVALID_RANGE = 0x19CC,
+	// Log service user marshalling buffers are exhausted.
+	LOG_BLOCKS_EXHAUSTED = 0x19CD,
+	// Log service encountered an attempt read from a marshalling area with an invalid read context.
+	LOG_READ_CONTEXT_INVALID = 0x19CE,
+	// Log service encountered an invalid log restart area.
+	LOG_RESTART_INVALID = 0x19CF,
+	// Log service encountered an invalid log block version.
+	LOG_BLOCK_VERSION = 0x19D0,
+	// Log service encountered an invalid log block.
+	LOG_BLOCK_INVALID = 0x19D1,
+	// Log service encountered an attempt to read the log with an invalid read mode.
+	LOG_READ_MODE_INVALID = 0x19D2,
+	// Log service encountered a log stream with no restart area.
+	LOG_NO_RESTART = 0x19D3,
+	// Log service encountered a corrupted metadata file.
+	LOG_METADATA_CORRUPT = 0x19D4,
+	// Log service encountered a metadata file that could not be created by the log file system.
+	LOG_METADATA_INVALID = 0x19D5,
+	// Log service encountered a metadata file with inconsistent data.
+	LOG_METADATA_INCONSISTENT = 0x19D6,
+	// Log service encountered an attempt to erroneous allocate or dispose reservation space.
+	LOG_RESERVATION_INVALID = 0x19D7,
+	// Log service cannot delete log file or file system container.
+	LOG_CANT_DELETE = 0x19D8,
+	// Log service has reached the maximum allowable containers allocated to a log file.
+	LOG_CONTAINER_LIMIT_EXCEEDED = 0x19D9,
+	// Log service has attempted to read or write backward past the start of the log.
+	LOG_START_OF_LOG = 0x19DA,
+	// Log policy could not be installed because a policy of the same type is already present.
+	LOG_POLICY_ALREADY_INSTALLED = 0x19DB,
+	// Log policy in question was not installed at the time of the request.
+	LOG_POLICY_NOT_INSTALLED = 0x19DC,
+	// The installed set of policies on the log is invalid.
+	LOG_POLICY_INVALID = 0x19DD,
+	// A policy on the log in question prevented the operation from completing.
+	LOG_POLICY_CONFLICT = 0x19DE,
+	// Log space cannot be reclaimed because the log is pinned by the archive tail.
+	LOG_PINNED_ARCHIVE_TAIL = 0x19DF,
+	// Log record is not a record in the log file.
+	LOG_RECORD_NONEXISTENT = 0x19E0,
+	// Number of reserved log records or the adjustment of the number of reserved log records is invalid.
+	LOG_RECORDS_RESERVED_INVALID = 0x19E1,
+	// Reserved log space or the adjustment of the log space is invalid.
+	LOG_SPACE_RESERVED_INVALID = 0x19E2,
+	// An new or existing archive tail or base of the active log is invalid.
+	LOG_TAIL_INVALID = 0x19E3,
+	// Log space is exhausted.
+	LOG_FULL = 0x19E4,
+	// The log could not be set to the requested size.
+	COULD_NOT_RESIZE_LOG = 0x19E5,
+	// Log is multiplexed, no direct writes to the physical log is allowed.
+	LOG_MULTIPLEXED = 0x19E6,
+	// The operation failed because the log is a dedicated log.
+	LOG_DEDICATED = 0x19E7,
+	// The operation requires an archive context.
+	LOG_ARCHIVE_NOT_IN_PROGRESS = 0x19E8,
+	// Log archival is in progress.
+	LOG_ARCHIVE_IN_PROGRESS = 0x19E9,
+	// The operation requires a non-ephemeral log, but the log is ephemeral.
+	LOG_EPHEMERAL = 0x19EA,
+	// The log must have at least two containers before it can be read from or written to.
+	LOG_NOT_ENOUGH_CONTAINERS = 0x19EB,
+	// A log client has already registered on the stream.
+	LOG_CLIENT_ALREADY_REGISTERED = 0x19EC,
+	// A log client has not been registered on the stream.
+	LOG_CLIENT_NOT_REGISTERED = 0x19ED,
+	// A request has already been made to handle the log full condition.
+	LOG_FULL_HANDLER_IN_PROGRESS = 0x19EE,
+	// Log service encountered an error when attempting to read from a log container.
+	LOG_CONTAINER_READ_FAILED = 0x19EF,
+	// Log service encountered an error when attempting to write to a log container.
+	LOG_CONTAINER_WRITE_FAILED = 0x19F0,
+	// Log service encountered an error when attempting open a log container.
+	LOG_CONTAINER_OPEN_FAILED = 0x19F1,
+	// Log service encountered an invalid container state when attempting a requested action.
+	LOG_CONTAINER_STATE_INVALID = 0x19F2,
+	// Log service is not in the correct state to perform a requested action.
+	LOG_STATE_INVALID = 0x19F3,
+	// Log space cannot be reclaimed because the log is pinned.
+	LOG_PINNED = 0x19F4,
+	// Log metadata flush failed.
+	LOG_METADATA_FLUSH_FAILED = 0x19F5,
+	// Security on the log and its containers is inconsistent.
+	LOG_INCONSISTENT_SECURITY = 0x19F6,
+	// Records were appended to the log or reservation changes were made, but the log could not be flushed.
+	LOG_APPENDED_FLUSH_FAILED = 0x19F7,
+	// The log is pinned due to reservation consuming most of the log space. Free some reserved records to make space available.
+	LOG_PINNED_RESERVATION = 0x19F8,
+	// The transaction handle associated with this operation is not valid.
+	INVALID_TRANSACTION = 0x1A2C,
+	// The requested operation was made in the context of a transaction that is no longer active.
+	TRANSACTION_NOT_ACTIVE = 0x1A2D,
+	// The requested operation is not valid on the Transaction object in its current state.
+	TRANSACTION_REQUEST_NOT_VALID = 0x1A2E,
+	// The caller has called a response API, but the response is not expected because the TM did not issue the corresponding request to the caller.
+	TRANSACTION_NOT_REQUESTED = 0x1A2F,
+	// It is too late to perform the requested operation, since the Transaction has already been aborted.
+	TRANSACTION_ALREADY_ABORTED = 0x1A30,
+	// It is too late to perform the requested operation, since the Transaction has already been committed.
+	TRANSACTION_ALREADY_COMMITTED = 0x1A31,
+	// The Transaction Manager was unable to be successfully initialized. Transacted operations are not supported.
+	TM_INITIALIZATION_FAILED = 0x1A32,
+	// The specified ResourceManager made no changes or updates to the resource under this transaction.
+	RESOURCEMANAGER_READ_ONLY = 0x1A33,
+	// The resource manager has attempted to prepare a transaction that it has not successfully joined.
+	TRANSACTION_NOT_JOINED = 0x1A34,
+	// The Transaction object already has a superior enlistment, and the caller attempted an operation that would have created a new superior. Only a single superior enlistment is allow.
+	TRANSACTION_SUPERIOR_EXISTS = 0x1A35,
+	// The RM tried to register a protocol that already exists.
+	CRM_PROTOCOL_ALREADY_EXISTS = 0x1A36,
+	// The attempt to propagate the Transaction failed.
+	TRANSACTION_PROPAGATION_FAILED = 0x1A37,
+	// The requested propagation protocol was not registered as a CRM.
+	CRM_PROTOCOL_NOT_FOUND = 0x1A38,
+	// The buffer passed in to PushTransaction or PullTransaction is not in a valid format.
+	TRANSACTION_INVALID_MARSHALL_BUFFER = 0x1A39,
+	// The current transaction context associated with the thread is not a valid handle to a transaction object.
+	CURRENT_TRANSACTION_NOT_VALID = 0x1A3A,
+	// The specified Transaction object could not be opened, because it was not found.
+	TRANSACTION_NOT_FOUND = 0x1A3B,
+	// The specified ResourceManager object could not be opened, because it was not found.
+	RESOURCEMANAGER_NOT_FOUND = 0x1A3C,
+	// The specified Enlistment object could not be opened, because it was not found.
+	ENLISTMENT_NOT_FOUND = 0x1A3D,
+	// The specified TransactionManager object could not be opened, because it was not found.
+	TRANSACTIONMANAGER_NOT_FOUND = 0x1A3E,
+	// The object specified could not be created or opened, because its associated TransactionManager is not online. The TransactionManager must be brought fully Online by calling RecoverTransactionManager to recover to the end of its LogFile before objects in its Transaction or ResourceManager namespaces can be opened. In addition, errors in writing records to its LogFile can cause a TransactionManager to go offline.
+	TRANSACTIONMANAGER_NOT_ONLINE = 0x1A3F,
+	// The specified TransactionManager was unable to create the objects contained in its logfile in the Ob namespace. Therefore, the TransactionManager was unable to recover.
+	TRANSACTIONMANAGER_RECOVERY_NAME_COLLISION = 0x1A40,
+	// The call to create a superior Enlistment on this Transaction object could not be completed, because the Transaction object specified for the enlistment is a subordinate branch of the Transaction. Only the root of the Transaction can be enlisted on as a superior.
+	TRANSACTION_NOT_ROOT = 0x1A41,
+	// Because the associated transaction manager or resource manager has been closed, the handle is no longer valid.
+	TRANSACTION_OBJECT_EXPIRED = 0x1A42,
+	// The specified operation could not be performed on this Superior enlistment, because the enlistment was not created with the corresponding completion response in the NotificationMask.
+	TRANSACTION_RESPONSE_NOT_ENLISTED = 0x1A43,
+	// The specified operation could not be performed, because the record that would be logged was too long. This can occur because of two conditions: either there are too many Enlistments on this Transaction, or the combined RecoveryInformation being logged on behalf of those Enlistments is too long.
+	TRANSACTION_RECORD_TOO_LONG = 0x1A44,
+	// Implicit transaction are not supported.
+	IMPLICIT_TRANSACTION_NOT_SUPPORTED = 0x1A45,
+	// The kernel transaction manager had to abort or forget the transaction because it blocked forward progress.
+	TRANSACTION_INTEGRITY_VIOLATED = 0x1A46,
+	// The TransactionManager identity that was supplied did not match the one recorded in the TransactionManager's log file.
+	TRANSACTIONMANAGER_IDENTITY_MISMATCH = 0x1A47,
+	// This snapshot operation cannot continue because a transactional resource manager cannot be frozen in its current state. Please try again.
+	RM_CANNOT_BE_FROZEN_FOR_SNAPSHOT = 0x1A48,
+	// The transaction cannot be enlisted on with the specified EnlistmentMask, because the transaction has already completed the PrePrepare phase. In order to ensure correctness, the ResourceManager must switch to a write- through mode and cease caching data within this transaction. Enlisting for only subsequent transaction phases may still succeed.
+	TRANSACTION_MUST_WRITETHROUGH = 0x1A49,
+	// The transaction does not have a superior enlistment.
+	TRANSACTION_NO_SUPERIOR = 0x1A4A,
+	// The attempt to commit the Transaction completed, but it is possible that some portion of the transaction tree did not commit successfully due to heuristics. Therefore it is possible that some data modified in the transaction may not have committed, resulting in transactional inconsistency. If possible, check the consistency of the associated data.
+	HEURISTIC_DAMAGE_POSSIBLE = 0x1A4B,
+	// The function attempted to use a name that is reserved for use by another transaction.
+	TRANSACTIONAL_CONFLICT = 0x1A90,
+	// Transaction support within the specified resource manager is not started or was shut down due to an error.
+	RM_NOT_ACTIVE = 0x1A91,
+	// The metadata of the RM has been corrupted. The RM will not function.
+	RM_METADATA_CORRUPT = 0x1A92,
+	// The specified directory does not contain a resource manager.
+	DIRECTORY_NOT_RM = 0x1A93,
+	// The remote server or share does not support transacted file operations.
+	TRANSACTIONS_UNSUPPORTED_REMOTE = 0x1A95,
+	// The requested log size is invalid.
+	LOG_RESIZE_INVALID_SIZE = 0x1A96,
+	// The object (file, stream, link) corresponding to the handle has been deleted by a Transaction Savepoint Rollback.
+	OBJECT_NO_LONGER_EXISTS = 0x1A97,
+	// The specified file miniversion was not found for this transacted file open.
+	STREAM_MINIVERSION_NOT_FOUND = 0x1A98,
+	// The specified file miniversion was found but has been invalidated. Most likely cause is a transaction savepoint rollback.
+	STREAM_MINIVERSION_NOT_VALID = 0x1A99,
+	// A miniversion may only be opened in the context of the transaction that created it.
+	MINIVERSION_INACCESSIBLE_FROM_SPECIFIED_TRANSACTION = 0x1A9A,
+	// It is not possible to open a miniversion with modify access.
+	CANT_OPEN_MINIVERSION_WITH_MODIFY_INTENT = 0x1A9B,
+	// It is not possible to create any more miniversions for this stream.
+	CANT_CREATE_MORE_STREAM_MINIVERSIONS = 0x1A9C,
+	// The remote server sent mismatching version number or Fid for a file opened with transactions.
+	REMOTE_FILE_VERSION_MISMATCH = 0x1A9E,
+	// The handle has been invalidated by a transaction. The most likely cause is the presence of memory mapping on a file or an open handle when the transaction ended or rolled back to savepoint.
+	HANDLE_NO_LONGER_VALID = 0x1A9F,
+	// There is no transaction metadata on the file.
+	NO_TXF_METADATA = 0x1AA0,
+	// The log data is corrupt.
+	LOG_CORRUPTION_DETECTED = 0x1AA1,
+	// The file can't be recovered because there is a handle still open on it.
+	CANT_RECOVER_WITH_HANDLE_OPEN = 0x1AA2,
+	// The transaction outcome is unavailable because the resource manager responsible for it has disconnected.
+	RM_DISCONNECTED = 0x1AA3,
+	// The request was rejected because the enlistment in question is not a superior enlistment.
+	ENLISTMENT_NOT_SUPERIOR = 0x1AA4,
+	// The transactional resource manager is already consistent. Recovery is not needed.
+	RECOVERY_NOT_NEEDED = 0x1AA5,
+	// The transactional resource manager has already been started.
+	RM_ALREADY_STARTED = 0x1AA6,
+	// The file cannot be opened transactionally, because its identity depends on the outcome of an unresolved transaction.
+	FILE_IDENTITY_NOT_PERSISTENT = 0x1AA7,
+	// The operation cannot be performed because another transaction is depending on the fact that this property will not change.
+	CANT_BREAK_TRANSACTIONAL_DEPENDENCY = 0x1AA8,
+	// The operation would involve a single file with two transactional resource managers and is therefore not allowed.
+	CANT_CROSS_RM_BOUNDARY = 0x1AA9,
+	// The $Txf directory must be empty for this operation to succeed.
+	TXF_DIR_NOT_EMPTY = 0x1AAA,
+	// The operation would leave a transactional resource manager in an inconsistent state and is therefore not allowed.
+	INDOUBT_TRANSACTIONS_EXIST = 0x1AAB,
+	// The operation could not be completed because the transaction manager does not have a log.
+	TM_VOLATILE = 0x1AAC,
+	// A rollback could not be scheduled because a previously scheduled rollback has already executed or been queued for execution.
+	ROLLBACK_TIMER_EXPIRED = 0x1AAD,
+	// The transactional metadata attribute on the file or directory is corrupt and unreadable.
+	TXF_ATTRIBUTE_CORRUPT = 0x1AAE,
+	// The encryption operation could not be completed because a transaction is active.
+	EFS_NOT_ALLOWED_IN_TRANSACTION = 0x1AAF,
+	// This object is not allowed to be opened in a transaction.
+	TRANSACTIONAL_OPEN_NOT_ALLOWED = 0x1AB0,
+	// An attempt to create space in the transactional resource manager's log failed. The failure status has been recorded in the event log.
+	LOG_GROWTH_FAILED = 0x1AB1,
+	// Memory mapping (creating a mapped section) a remote file under a transaction is not supported.
+	TRANSACTED_MAPPING_UNSUPPORTED_REMOTE = 0x1AB2,
+	// Transaction metadata is already present on this file and cannot be superseded.
+	TXF_METADATA_ALREADY_PRESENT = 0x1AB3,
+	// A transaction scope could not be entered because the scope handler has not been initialized.
+	TRANSACTION_SCOPE_CALLBACKS_NOT_SET = 0x1AB4,
+	// Promotion was required in order to allow the resource manager to enlist, but the transaction was set to disallow it.
+	TRANSACTION_REQUIRED_PROMOTION = 0x1AB5,
+	// This file is open for modification in an unresolved transaction and may be opened for execute only by a transacted reader.
+	CANNOT_EXECUTE_FILE_IN_TRANSACTION = 0x1AB6,
+	// The request to thaw frozen transactions was ignored because transactions had not previously been frozen.
+	TRANSACTIONS_NOT_FROZEN = 0x1AB7,
+	// Transactions cannot be frozen because a freeze is already in progress.
+	TRANSACTION_FREEZE_IN_PROGRESS = 0x1AB8,
+	// The target volume is not a snapshot volume. This operation is only valid on a volume mounted as a snapshot.
+	NOT_SNAPSHOT_VOLUME = 0x1AB9,
+	// The savepoint operation failed because files are open on the transaction. This is not permitted.
+	NO_SAVEPOINT_WITH_OPEN_FILES = 0x1ABA,
+	// Windows has discovered corruption in a file, and that file has since been repaired. Data loss may have occurred.
+	DATA_LOST_REPAIR = 0x1ABB,
+	// The sparse operation could not be completed because a transaction is active on the file.
+	SPARSE_NOT_ALLOWED_IN_TRANSACTION = 0x1ABC,
+	// The call to create a TransactionManager object failed because the Tm Identity stored in the logfile does not match the Tm Identity that was passed in as an argument.
+	TM_IDENTITY_MISMATCH = 0x1ABD,
+	// I/O was attempted on a section object that has been floated as a result of a transaction ending. There is no valid data.
+	FLOATED_SECTION = 0x1ABE,
+	// The transactional resource manager cannot currently accept transacted work due to a transient condition such as low resources.
+	CANNOT_ACCEPT_TRANSACTED_WORK = 0x1ABF,
+	// The transactional resource manager had too many tranactions outstanding that could not be aborted. The transactional resource manger has been shut down.
+	CANNOT_ABORT_TRANSACTIONS = 0x1AC0,
+	// The operation could not be completed due to bad clusters on disk.
+	BAD_CLUSTERS = 0x1AC1,
+	// The compression operation could not be completed because a transaction is active on the file.
+	COMPRESSION_NOT_ALLOWED_IN_TRANSACTION = 0x1AC2,
+	// The operation could not be completed because the volume is dirty. Please run chkdsk and try again.
+	VOLUME_DIRTY = 0x1AC3,
+	// The link tracking operation could not be completed because a transaction is active.
+	NO_LINK_TRACKING_IN_TRANSACTION = 0x1AC4,
+	// This operation cannot be performed in a transaction.
+	OPERATION_NOT_SUPPORTED_IN_TRANSACTION = 0x1AC5,
+	// The handle is no longer properly associated with its transaction. It may have been opened in a transactional resource manager that was subsequently forced to restart. Please close the handle and open a new one.
+	EXPIRED_HANDLE = 0x1AC6,
+	// The specified operation could not be performed because the resource manager is not enlisted in the transaction.
+	TRANSACTION_NOT_ENLISTED = 0x1AC7,
+	// The specified session name is invalid.
+	CTX_WINSTATION_NAME_INVALID = 0x1B59,
+	// The specified protocol driver is invalid.
+	CTX_INVALID_PD = 0x1B5A,
+	// The specified protocol driver was not found in the system path.
+	CTX_PD_NOT_FOUND = 0x1B5B,
+	// The specified terminal connection driver was not found in the system path.
+	CTX_WD_NOT_FOUND = 0x1B5C,
+	// A registry key for event logging could not be created for this session.
+	CTX_CANNOT_MAKE_EVENTLOG_ENTRY = 0x1B5D,
+	// A service with the same name already exists on the system.
+	CTX_SERVICE_NAME_COLLISION = 0x1B5E,
+	// A close operation is pending on the session.
+	CTX_CLOSE_PENDING = 0x1B5F,
+	// There are no free output buffers available.
+	CTX_NO_OUTBUF = 0x1B60,
+	// The MODEM.INF file was not found.
+	CTX_MODEM_INF_NOT_FOUND = 0x1B61,
+	// The modem name was not found in MODEM.INF.
+	CTX_INVALID_MODEMNAME = 0x1B62,
+	// The modem did not accept the command sent to it. Verify that the configured modem name matches the attached modem.
+	CTX_MODEM_RESPONSE_ERROR = 0x1B63,
+	// The modem did not respond to the command sent to it. Verify that the modem is properly cabled and powered on.
+	CTX_MODEM_RESPONSE_TIMEOUT = 0x1B64,
+	// Carrier detect has failed or carrier has been dropped due to disconnect.
+	CTX_MODEM_RESPONSE_NO_CARRIER = 0x1B65,
+	// Dial tone not detected within the required time. Verify that the phone cable is properly attached and functional.
+	CTX_MODEM_RESPONSE_NO_DIALTONE = 0x1B66,
+	// Busy signal detected at remote site on callback.
+	CTX_MODEM_RESPONSE_BUSY = 0x1B67,
+	// Voice detected at remote site on callback.
+	CTX_MODEM_RESPONSE_VOICE = 0x1B68,
+	// Transport driver error.
+	CTX_TD_ERROR = 0x1B69,
+	// The specified session cannot be found.
+	CTX_WINSTATION_NOT_FOUND = 0x1B6E,
+	// The specified session name is already in use.
+	CTX_WINSTATION_ALREADY_EXISTS = 0x1B6F,
+	// The task you are trying to do can't be completed because Remote Desktop Services is currently busy. Please try again in a few minutes. Other users should still be able to log on.
+	CTX_WINSTATION_BUSY = 0x1B70,
+	// An attempt has been made to connect to a session whose video mode is not supported by the current client.
+	CTX_BAD_VIDEO_MODE = 0x1B71,
+	// The application attempted to enable DOS graphics mode. DOS graphics mode is not supported.
+	CTX_GRAPHICS_INVALID = 0x1B7B,
+	// Your interactive logon privilege has been disabled. Please contact your administrator.
+	CTX_LOGON_DISABLED = 0x1B7D,
+	// The requested operation can be performed only on the system console. This is most often the result of a driver or system DLL requiring direct console access.
+	CTX_NOT_CONSOLE = 0x1B7E,
+	// The client failed to respond to the server connect message.
+	CTX_CLIENT_QUERY_TIMEOUT = 0x1B80,
+	// Disconnecting the console session is not supported.
+	CTX_CONSOLE_DISCONNECT = 0x1B81,
+	// Reconnecting a disconnected session to the console is not supported.
+	CTX_CONSOLE_CONNECT = 0x1B82,
+	// The request to control another session remotely was denied.
+	CTX_SHADOW_DENIED = 0x1B84,
+	// The requested session access is denied.
+	CTX_WINSTATION_ACCESS_DENIED = 0x1B85,
+	// The specified terminal connection driver is invalid.
+	CTX_INVALID_WD = 0x1B89,
+	// The requested session cannot be controlled remotely. This may be because the session is disconnected or does not currently have a user logged on.
+	CTX_SHADOW_INVALID = 0x1B8A,
+	// The requested session is not configured to allow remote control.
+	CTX_SHADOW_DISABLED = 0x1B8B,
+	// Your request to connect to this Terminal Server has been rejected. Your Terminal Server client license number is currently being used by another user. Please call your system administrator to obtain a unique license number.
+	CTX_CLIENT_LICENSE_IN_USE = 0x1B8C,
+	// Your request to connect to this Terminal Server has been rejected. Your Terminal Server client license number has not been entered for this copy of the Terminal Server client. Please contact your system administrator.
+	CTX_CLIENT_LICENSE_NOT_SET = 0x1B8D,
+	// The number of connections to this computer is limited and all connections are in use right now. Try connecting later or contact your system administrator.
+	CTX_LICENSE_NOT_AVAILABLE = 0x1B8E,
+	// The client you are using is not licensed to use this system. Your logon request is denied.
+	CTX_LICENSE_CLIENT_INVALID = 0x1B8F,
+	// The system license has expired. Your logon request is denied.
+	CTX_LICENSE_EXPIRED = 0x1B90,
+	// Remote control could not be terminated because the specified session is not currently being remotely controlled.
+	CTX_SHADOW_NOT_RUNNING = 0x1B91,
+	// The remote control of the console was terminated because the display mode was changed. Changing the display mode in a remote control session is not supported.
+	CTX_SHADOW_ENDED_BY_MODE_CHANGE = 0x1B92,
+	// Activation has already been reset the maximum number of times for this installation. Your activation timer will not be cleared.
+	ACTIVATION_COUNT_EXCEEDED = 0x1B93,
+	// Remote logins are currently disabled.
+	CTX_WINSTATIONS_DISABLED = 0x1B94,
+	// You do not have the proper encryption level to access this Session.
+	CTX_ENCRYPTION_LEVEL_REQUIRED = 0x1B95,
+	// The user %s\\%s is currently logged on to this computer. Only the current user or an administrator can log on to this computer.
+	CTX_SESSION_IN_USE = 0x1B96,
+	// The user %s\\%s is already logged on to the console of this computer. You do not have permission to log in at this time. To resolve this issue, contact %s\\%s and have them log off.
+	CTX_NO_FORCE_LOGOFF = 0x1B97,
+	// Unable to log you on because of an account restriction.
+	CTX_ACCOUNT_RESTRICTION = 0x1B98,
+	// The RDP protocol component %2 detected an error in the protocol stream and has disconnected the client.
+	RDP_PROTOCOL_ERROR = 0x1B99,
+	// The Client Drive Mapping Service Has Connected on Terminal Connection.
+	CTX_CDM_CONNECT = 0x1B9A,
+	// The Client Drive Mapping Service Has Disconnected on Terminal Connection.
+	CTX_CDM_DISCONNECT = 0x1B9B,
+	// The Terminal Server security layer detected an error in the protocol stream and has disconnected the client.
+	CTX_SECURITY_LAYER_ERROR = 0x1B9C,
+	// The target session is incompatible with the current session.
+	TS_INCOMPATIBLE_SESSIONS = 0x1B9D,
+	// Windows can't connect to your session because a problem occurred in the Windows video subsystem. Try connecting again later, or contact the server administrator for assistance.
+	TS_VIDEO_SUBSYSTEM_ERROR = 0x1B9E,
+	// The file replication service API was called incorrectly.
+	FRS_ERR_INVALID_API_SEQUENCE = 0x1F41,
+	// The file replication service cannot be started.
+	FRS_ERR_STARTING_SERVICE = 0x1F42,
+	// The file replication service cannot be stopped.
+	FRS_ERR_STOPPING_SERVICE = 0x1F43,
+	// The file replication service API terminated the request. The event log may have more information.
+	FRS_ERR_INTERNAL_API = 0x1F44,
+	// The file replication service terminated the request. The event log may have more information.
+	FRS_ERR_INTERNAL = 0x1F45,
+	// The file replication service cannot be contacted. The event log may have more information.
+	FRS_ERR_SERVICE_COMM = 0x1F46,
+	// The file replication service cannot satisfy the request because the user has insufficient privileges. The event log may have more information.
+	FRS_ERR_INSUFFICIENT_PRIV = 0x1F47,
+	// The file replication service cannot satisfy the request because authenticated RPC is not available. The event log may have more information.
+	FRS_ERR_AUTHENTICATION = 0x1F48,
+	// The file replication service cannot satisfy the request because the user has insufficient privileges on the domain controller. The event log may have more information.
+	FRS_ERR_PARENT_INSUFFICIENT_PRIV = 0x1F49,
+	// The file replication service cannot satisfy the request because authenticated RPC is not available on the domain controller. The event log may have more information.
+	FRS_ERR_PARENT_AUTHENTICATION = 0x1F4A,
+	// The file replication service cannot communicate with the file replication service on the domain controller. The event log may have more information.
+	FRS_ERR_CHILD_TO_PARENT_COMM = 0x1F4B,
+	// The file replication service on the domain controller cannot communicate with the file replication service on this computer. The event log may have more information.
+	FRS_ERR_PARENT_TO_CHILD_COMM = 0x1F4C,
+	// The file replication service cannot populate the system volume because of an internal error. The event log may have more information.
+	FRS_ERR_SYSVOL_POPULATE = 0x1F4D,
+	// The file replication service cannot populate the system volume because of an internal timeout. The event log may have more information.
+	FRS_ERR_SYSVOL_POPULATE_TIMEOUT = 0x1F4E,
+	// The file replication service cannot process the request. The system volume is busy with a previous request.
+	FRS_ERR_SYSVOL_IS_BUSY = 0x1F4F,
+	// The file replication service cannot stop replicating the system volume because of an internal error. The event log may have more information.
+	FRS_ERR_SYSVOL_DEMOTE = 0x1F50,
+	// The file replication service detected an invalid parameter.
+	FRS_ERR_INVALID_SERVICE_PARAMETER = 0x1F51,
+
+
+	// An error occurred while installing the directory service. For more information, see the event log.
+	DS_NOT_INSTALLED = 0x2008,
+	// The directory service evaluated group memberships locally.
+	DS_MEMBERSHIP_EVALUATED_LOCALLY = 0x2009,
+	// The specified directory service attribute or value does not exist.
+	DS_NO_ATTRIBUTE_OR_VALUE = 0x200A,
+	// The attribute syntax specified to the directory service is invalid.
+	DS_INVALID_ATTRIBUTE_SYNTAX = 0x200B,
+	// The attribute type specified to the directory service is not defined.
+	DS_ATTRIBUTE_TYPE_UNDEFINED = 0x200C,
+	// The specified directory service attribute or value already exists.
+	DS_ATTRIBUTE_OR_VALUE_EXISTS = 0x200D,
+	// The directory service is busy.
+	DS_BUSY = 0x200E,
+	// The directory service is unavailable.
+	DS_UNAVAILABLE = 0x200F,
+	// The directory service was unable to allocate a relative identifier.
+	DS_NO_RIDS_ALLOCATED = 0x2010,
+	// The directory service has exhausted the pool of relative identifiers.
+	DS_NO_MORE_RIDS = 0x2011,
+	// The requested operation could not be performed because the directory service is not the master for that type of operation.
+	DS_INCORRECT_ROLE_OWNER = 0x2012,
+	// The directory service was unable to initialize the subsystem that allocates relative identifiers.
+	DS_RIDMGR_INIT_ERROR = 0x2013,
+	// The requested operation did not satisfy one or more constraints associated with the class of the object.
+	DS_OBJ_CLASS_VIOLATION = 0x2014,
+	// The directory service can perform the requested operation only on a leaf object.
+	DS_CANT_ON_NON_LEAF = 0x2015,
+	// The directory service cannot perform the requested operation on the RDN attribute of an object.
+	DS_CANT_ON_RDN = 0x2016,
+	// The directory service detected an attempt to modify the object class of an object.
+	DS_CANT_MOD_OBJ_CLASS = 0x2017,
+	// The requested cross-domain move operation could not be performed.
+	DS_CROSS_DOM_MOVE_ERROR = 0x2018,
+	// Unable to contact the global catalog server.
+	DS_GC_NOT_AVAILABLE = 0x2019,
+	// The policy object is shared and can only be modified at the root.
+	SHARED_POLICY = 0x201A,
+	// The policy object does not exist.
+	POLICY_OBJECT_NOT_FOUND = 0x201B,
+	// The requested policy information is only in the directory service.
+	POLICY_ONLY_IN_DS = 0x201C,
+	// A domain controller promotion is currently active.
+	PROMOTION_ACTIVE = 0x201D,
+	// A domain controller promotion is not currently active.
+	NO_PROMOTION_ACTIVE = 0x201E,
+	// An operations error occurred.
+	DS_OPERATIONS_ERROR = 0x2020,
+	// A protocol error occurred.
+	DS_PROTOCOL_ERROR = 0x2021,
+	// The time limit for this request was exceeded.
+	DS_TIMELIMIT_EXCEEDED = 0x2022,
+	// The size limit for this request was exceeded.
+	DS_SIZELIMIT_EXCEEDED = 0x2023,
+	// The administrative limit for this request was exceeded.
+	DS_ADMIN_LIMIT_EXCEEDED = 0x2024,
+	// The compare response was false.
+	DS_COMPARE_FALSE = 0x2025,
+	// The compare response was true.
+	DS_COMPARE_TRUE = 0x2026,
+	// The requested authentication method is not supported by the server.
+	DS_AUTH_METHOD_NOT_SUPPORTED = 0x2027,
+	// A more secure authentication method is required for this server.
+	DS_STRONG_AUTH_REQUIRED = 0x2028,
+	// Inappropriate authentication.
+	DS_INAPPROPRIATE_AUTH = 0x2029,
+	// The authentication mechanism is unknown.
+	DS_AUTH_UNKNOWN = 0x202A,
+	// A referral was returned from the server.
+	DS_REFERRAL = 0x202B,
+	// The server does not support the requested critical extension.
+	DS_UNAVAILABLE_CRIT_EXTENSION = 0x202C,
+	// This request requires a secure connection.
+	DS_CONFIDENTIALITY_REQUIRED = 0x202D,
+	// Inappropriate matching.
+	DS_INAPPROPRIATE_MATCHING = 0x202E,
+	// A constraint violation occurred.
+	DS_CONSTRAINT_VIOLATION = 0x202F,
+	// There is no such object on the server.
+	DS_NO_SUCH_OBJECT = 0x2030,
+	// There is an alias problem.
+	DS_ALIAS_PROBLEM = 0x2031,
+	// An invalid dn syntax has been specified.
+	DS_INVALID_DN_SYNTAX = 0x2032,
+	// The object is a leaf object.
+	DS_IS_LEAF = 0x2033,
+	// There is an alias dereferencing problem.
+	DS_ALIAS_DEREF_PROBLEM = 0x2034,
+	// The server is unwilling to process the request.
+	DS_UNWILLING_TO_PERFORM = 0x2035,
+	// A loop has been detected.
+	DS_LOOP_DETECT = 0x2036,
+	// There is a naming violation.
+	DS_NAMING_VIOLATION = 0x2037,
+	// The result set is too large.
+	DS_OBJECT_RESULTS_TOO_LARGE = 0x2038,
+	// The operation affects multiple DSAs.
+	DS_AFFECTS_MULTIPLE_DSAS = 0x2039,
+	// The server is not operational.
+	DS_SERVER_DOWN = 0x203A,
+	// A local error has occurred.
+	DS_LOCAL_ERROR = 0x203B,
+	// An encoding error has occurred.
+	DS_ENCODING_ERROR = 0x203C,
+	// A decoding error has occurred.
+	DS_DECODING_ERROR = 0x203D,
+	// The search filter cannot be recognized.
+	DS_FILTER_UNKNOWN = 0x203E,
+	// One or more parameters are illegal.
+	DS_PARAM_ERROR = 0x203F,
+	// The specified method is not supported.
+	DS_NOT_SUPPORTED = 0x2040,
+	// No results were returned.
+	DS_NO_RESULTS_RETURNED = 0x2041,
+	// The specified control is not supported by the server.
+	DS_CONTROL_NOT_FOUND = 0x2042,
+	// A referral loop was detected by the client.
+	DS_CLIENT_LOOP = 0x2043,
+	// The preset referral limit was exceeded.
+	DS_REFERRAL_LIMIT_EXCEEDED = 0x2044,
+	// The search requires a SORT control.
+	DS_SORT_CONTROL_MISSING = 0x2045,
+	// The search results exceed the offset range specified.
+	DS_OFFSET_RANGE_ERROR = 0x2046,
+	// The directory service detected the subsystem that allocates relative identifiers is disabled. This can occur as a protective mechanism when the system determines a significant portion of relative identifiers (RIDs) have been exhausted. Please see https://go.microsoft.com/fwlink/p/?linkid=228610 for recommended diagnostic steps and the procedure to re-enable account creation.
+	DS_RIDMGR_DISABLED = 0x2047,
+	// The root object must be the head of a naming context. The root object cannot have an instantiated parent.
+	DS_ROOT_MUST_BE_NC = 0x206D,
+	// The add replica operation cannot be performed. The naming context must be writeable in order to create the replica.
+	DS_ADD_REPLICA_INHIBITED = 0x206E,
+	// A reference to an attribute that is not defined in the schema occurred.
+	DS_ATT_NOT_DEF_IN_SCHEMA = 0x206F,
+	// The maximum size of an object has been exceeded.
+	DS_MAX_OBJ_SIZE_EXCEEDED = 0x2070,
+	// An attempt was made to add an object to the directory with a name that is already in use.
+	DS_OBJ_STRING_NAME_EXISTS = 0x2071,
+	// An attempt was made to add an object of a class that does not have an RDN defined in the schema.
+	DS_NO_RDN_DEFINED_IN_SCHEMA = 0x2072,
+	// An attempt was made to add an object using an RDN that is not the RDN defined in the schema.
+	DS_RDN_DOESNT_MATCH_SCHEMA = 0x2073,
+	// None of the requested attributes were found on the objects.
+	DS_NO_REQUESTED_ATTS_FOUND = 0x2074,
+	// The user buffer is too small.
+	DS_USER_BUFFER_TO_SMALL = 0x2075,
+	// The attribute specified in the operation is not present on the object.
+	DS_ATT_IS_NOT_ON_OBJ = 0x2076,
+	// Illegal modify operation. Some aspect of the modification is not permitted.
+	DS_ILLEGAL_MOD_OPERATION = 0x2077,
+	// The specified object is too large.
+	DS_OBJ_TOO_LARGE = 0x2078,
+	// The specified instance type is not valid.
+	DS_BAD_INSTANCE_TYPE = 0x2079,
+	// The operation must be performed at a master DSA.
+	DS_MASTERDSA_REQUIRED = 0x207A,
+	// The object class attribute must be specified.
+	DS_OBJECT_CLASS_REQUIRED = 0x207B,
+	// A required attribute is missing.
+	DS_MISSING_REQUIRED_ATT = 0x207C,
+	// An attempt was made to modify an object to include an attribute that is not legal for its class.
+	DS_ATT_NOT_DEF_FOR_CLASS = 0x207D,
+	// The specified attribute is already present on the object.
+	DS_ATT_ALREADY_EXISTS = 0x207E,
+	// The specified attribute is not present, or has no values.
+	DS_CANT_ADD_ATT_VALUES = 0x2080,
+	// Multiple values were specified for an attribute that can have only one value.
+	DS_SINGLE_VALUE_CONSTRAINT = 0x2081,
+	// A value for the attribute was not in the acceptable range of values.
+	DS_RANGE_CONSTRAINT = 0x2082,
+	// The specified value already exists.
+	DS_ATT_VAL_ALREADY_EXISTS = 0x2083,
+	// The attribute cannot be removed because it is not present on the object.
+	DS_CANT_REM_MISSING_ATT = 0x2084,
+	// The attribute value cannot be removed because it is not present on the object.
+	DS_CANT_REM_MISSING_ATT_VAL = 0x2085,
+	// The specified root object cannot be a subref.
+	DS_ROOT_CANT_BE_SUBREF = 0x2086,
+	// Chaining is not permitted.
+	DS_NO_CHAINING = 0x2087,
+	// Chained evaluation is not permitted.
+	DS_NO_CHAINED_EVAL = 0x2088,
+	// The operation could not be performed because the object's parent is either uninstantiated or deleted.
+	DS_NO_PARENT_OBJECT = 0x2089,
+	// Having a parent that is an alias is not permitted. Aliases are leaf objects.
+	DS_PARENT_IS_AN_ALIAS = 0x208A,
+	// The object and parent must be of the same type, either both masters or both replicas.
+	DS_CANT_MIX_MASTER_AND_REPS = 0x208B,
+	// The operation cannot be performed because child objects exist. This operation can only be performed on a leaf object.
+	DS_CHILDREN_EXIST = 0x208C,
+	// Directory object not found.
+	DS_OBJ_NOT_FOUND = 0x208D,
+	// The aliased object is missing.
+	DS_ALIASED_OBJ_MISSING = 0x208E,
+	// The object name has bad syntax.
+	DS_BAD_NAME_SYNTAX = 0x208F,
+	// It is not permitted for an alias to refer to another alias.
+	DS_ALIAS_POINTS_TO_ALIAS = 0x2090,
+	// The alias cannot be dereferenced.
+	DS_CANT_DEREF_ALIAS = 0x2091,
+	// The operation is out of scope.
+	DS_OUT_OF_SCOPE = 0x2092,
+	// The operation cannot continue because the object is in the process of being removed.
+	DS_OBJECT_BEING_REMOVED = 0x2093,
+	// The DSA object cannot be deleted.
+	DS_CANT_DELETE_DSA_OBJ = 0x2094,
+	// A directory service error has occurred.
+	DS_GENERIC_ERROR = 0x2095,
+	// The operation can only be performed on an internal master DSA object.
+	DS_DSA_MUST_BE_INT_MASTER = 0x2096,
+	// The object must be of class DSA.
+	DS_CLASS_NOT_DSA = 0x2097,
+	// Insufficient access rights to perform the operation.
+	DS_INSUFF_ACCESS_RIGHTS = 0x2098,
+	// The object cannot be added because the parent is not on the list of possible superiors.
+	DS_ILLEGAL_SUPERIOR = 0x2099,
+	// Access to the attribute is not permitted because the attribute is owned by the Security Accounts Manager (SAM).
+	DS_ATTRIBUTE_OWNED_BY_SAM = 0x209A,
+	// The name has too many parts.
+	DS_NAME_TOO_MANY_PARTS = 0x209B,
+	// The name is too long.
+	DS_NAME_TOO_LONG = 0x209C,
+	// The name value is too long.
+	DS_NAME_VALUE_TOO_LONG = 0x209D,
+	// The directory service encountered an error parsing a name.
+	DS_NAME_UNPARSEABLE = 0x209E,
+	// The directory service cannot get the attribute type for a name.
+	DS_NAME_TYPE_UNKNOWN = 0x209F,
+	// The name does not identify an object; the name identifies a phantom.
+	DS_NOT_AN_OBJECT = 0x20A0,
+	// The security descriptor is too short.
+	DS_SEC_DESC_TOO_SHORT = 0x20A1,
+	// The security descriptor is invalid.
+	DS_SEC_DESC_INVALID = 0x20A2,
+	// Failed to create name for deleted object.
+	DS_NO_DELETED_NAME = 0x20A3,
+	// The parent of a new subref must exist.
+	DS_SUBREF_MUST_HAVE_PARENT = 0x20A4,
+	// The object must be a naming context.
+	DS_NCNAME_MUST_BE_NC = 0x20A5,
+	// It is not permitted to add an attribute which is owned by the system.
+	DS_CANT_ADD_SYSTEM_ONLY = 0x20A6,
+	// The class of the object must be structural; you cannot instantiate an abstract class.
+	DS_CLASS_MUST_BE_CONCRETE = 0x20A7,
+	// The schema object could not be found.
+	DS_INVALID_DMD = 0x20A8,
+	// A local object with this GUID (dead or alive) already exists.
+	DS_OBJ_GUID_EXISTS = 0x20A9,
+	// The operation cannot be performed on a back link.
+	DS_NOT_ON_BACKLINK = 0x20AA,
+	// The cross reference for the specified naming context could not be found.
+	DS_NO_CROSSREF_FOR_NC = 0x20AB,
+	// The operation could not be performed because the directory service is shutting down.
+	DS_SHUTTING_DOWN = 0x20AC,
+	// The directory service request is invalid.
+	DS_UNKNOWN_OPERATION = 0x20AD,
+	// The role owner attribute could not be read.
+	DS_INVALID_ROLE_OWNER = 0x20AE,
+	// The requested FSMO operation failed. The current FSMO holder could not be contacted.
+	DS_COULDNT_CONTACT_FSMO = 0x20AF,
+	// Modification of a DN across a naming context is not permitted.
+	DS_CROSS_NC_DN_RENAME = 0x20B0,
+	// The attribute cannot be modified because it is owned by the system.
+	DS_CANT_MOD_SYSTEM_ONLY = 0x20B1,
+	// Only the replicator can perform this function.
+	DS_REPLICATOR_ONLY = 0x20B2,
+	// The specified class is not defined.
+	DS_OBJ_CLASS_NOT_DEFINED = 0x20B3,
+	// The specified class is not a subclass.
+	DS_OBJ_CLASS_NOT_SUBCLASS = 0x20B4,
+	// The name reference is invalid.
+	DS_NAME_REFERENCE_INVALID = 0x20B5,
+	// A cross reference already exists.
+	DS_CROSS_REF_EXISTS = 0x20B6,
+	// It is not permitted to delete a master cross reference.
+	DS_CANT_DEL_MASTER_CROSSREF = 0x20B7,
+	// Subtree notifications are only supported on NC heads.
+	DS_SUBTREE_NOTIFY_NOT_NC_HEAD = 0x20B8,
+	// Notification filter is too complex.
+	DS_NOTIFY_FILTER_TOO_COMPLEX = 0x20B9,
+	// Schema update failed: duplicate RDN.
+	DS_DUP_RDN = 0x20BA,
+	// Schema update failed: duplicate OID.
+	DS_DUP_OID = 0x20BB,
+	// Schema update failed: duplicate MAPI identifier.
+	DS_DUP_MAPI_ID = 0x20BC,
+	// Schema update failed: duplicate schema-id GUID.
+	DS_DUP_SCHEMA_ID_GUID = 0x20BD,
+	// Schema update failed: duplicate LDAP display name.
+	DS_DUP_LDAP_DISPLAY_NAME = 0x20BE,
+	// Schema update failed: range-lower less than range upper.
+	DS_SEMANTIC_ATT_TEST = 0x20BF,
+	// Schema update failed: syntax mismatch.
+	DS_SYNTAX_MISMATCH = 0x20C0,
+	// Schema deletion failed: attribute is used in must-contain.
+	DS_EXISTS_IN_MUST_HAVE = 0x20C1,
+	// Schema deletion failed: attribute is used in may-contain.
+	DS_EXISTS_IN_MAY_HAVE = 0x20C2,
+	// Schema update failed: attribute in may-contain does not exist.
+	DS_NONEXISTENT_MAY_HAVE = 0x20C3,
+	// Schema update failed: attribute in must-contain does not exist.
+	DS_NONEXISTENT_MUST_HAVE = 0x20C4,
+	// Schema update failed: class in aux-class list does not exist or is not an auxiliary class.
+	DS_AUX_CLS_TEST_FAIL = 0x20C5,
+	// Schema update failed: class in poss-superiors does not exist.
+	DS_NONEXISTENT_POSS_SUP = 0x20C6,
+	// Schema update failed: class in subclassof list does not exist or does not satisfy hierarchy rules.
+	DS_SUB_CLS_TEST_FAIL = 0x20C7,
+	// Schema update failed: Rdn-Att-Id has wrong syntax.
+	DS_BAD_RDN_ATT_ID_SYNTAX = 0x20C8,
+	// Schema deletion failed: class is used as auxiliary class.
+	DS_EXISTS_IN_AUX_CLS = 0x20C9,
+	// Schema deletion failed: class is used as sub class.
+	DS_EXISTS_IN_SUB_CLS = 0x20CA,
+	// Schema deletion failed: class is used as poss superior.
+	DS_EXISTS_IN_POSS_SUP = 0x20CB,
+	// Schema update failed in recalculating validation cache.
+	DS_RECALCSCHEMA_FAILED = 0x20CC,
+	// The tree deletion is not finished. The request must be made again to continue deleting the tree.
+	DS_TREE_DELETE_NOT_FINISHED = 0x20CD,
+	// The requested delete operation could not be performed.
+	DS_CANT_DELETE = 0x20CE,
+	// Cannot read the governs class identifier for the schema record.
+	DS_ATT_SCHEMA_REQ_ID = 0x20CF,
+	// The attribute schema has bad syntax.
+	DS_BAD_ATT_SCHEMA_SYNTAX = 0x20D0,
+	// The attribute could not be cached.
+	DS_CANT_CACHE_ATT = 0x20D1,
+	// The class could not be cached.
+	DS_CANT_CACHE_CLASS = 0x20D2,
+	// The attribute could not be removed from the cache.
+	DS_CANT_REMOVE_ATT_CACHE = 0x20D3,
+	// The class could not be removed from the cache.
+	DS_CANT_REMOVE_CLASS_CACHE = 0x20D4,
+	// The distinguished name attribute could not be read.
+	DS_CANT_RETRIEVE_DN = 0x20D5,
+	// No superior reference has been configured for the directory service. The directory service is therefore unable to issue referrals to objects outside this forest.
+	DS_MISSING_SUPREF = 0x20D6,
+	// The instance type attribute could not be retrieved.
+	DS_CANT_RETRIEVE_INSTANCE = 0x20D7,
+	// An internal error has occurred.
+	DS_CODE_INCONSISTENCY = 0x20D8,
+	// A database error has occurred.
+	DS_DATABASE_ERROR = 0x20D9,
+	// The attribute GOVERNSID is missing.
+	DS_GOVERNSID_MISSING = 0x20DA,
+	// An expected attribute is missing.
+	DS_MISSING_EXPECTED_ATT = 0x20DB,
+	// The specified naming context is missing a cross reference.
+	DS_NCNAME_MISSING_CR_REF = 0x20DC,
+	// A security checking error has occurred.
+	DS_SECURITY_CHECKING_ERROR = 0x20DD,
+	// The schema is not loaded.
+	DS_SCHEMA_NOT_LOADED = 0x20DE,
+	// Schema allocation failed. Please check if the machine is running low on memory.
+	DS_SCHEMA_ALLOC_FAILED = 0x20DF,
+	// Failed to obtain the required syntax for the attribute schema.
+	DS_ATT_SCHEMA_REQ_SYNTAX = 0x20E0,
+	// The global catalog verification failed. The global catalog is not available or does not support the operation. Some part of the directory is currently not available.
+	DS_GCVERIFY_ERROR = 0x20E1,
+	// The replication operation failed because of a schema mismatch between the servers involved.
+	DS_DRA_SCHEMA_MISMATCH = 0x20E2,
+	// The DSA object could not be found.
+	DS_CANT_FIND_DSA_OBJ = 0x20E3,
+	// The naming context could not be found.
+	DS_CANT_FIND_EXPECTED_NC = 0x20E4,
+	// The naming context could not be found in the cache.
+	DS_CANT_FIND_NC_IN_CACHE = 0x20E5,
+	// The child object could not be retrieved.
+	DS_CANT_RETRIEVE_CHILD = 0x20E6,
+	// The modification was not permitted for security reasons.
+	DS_SECURITY_ILLEGAL_MODIFY = 0x20E7,
+	// The operation cannot replace the hidden record.
+	DS_CANT_REPLACE_HIDDEN_REC = 0x20E8,
+	// The hierarchy file is invalid.
+	DS_BAD_HIERARCHY_FILE = 0x20E9,
+	// The attempt to build the hierarchy table failed.
+	DS_BUILD_HIERARCHY_TABLE_FAILED = 0x20EA,
+	// The directory configuration parameter is missing from the registry.
+	DS_CONFIG_PARAM_MISSING = 0x20EB,
+	// The attempt to count the address book indices failed.
+	DS_COUNTING_AB_INDICES_FAILED = 0x20EC,
+	// The allocation of the hierarchy table failed.
+	DS_HIERARCHY_TABLE_MALLOC_FAILED = 0x20ED,
+	// The directory service encountered an internal failure.
+	DS_INTERNAL_FAILURE = 0x20EE,
+	// The directory service encountered an unknown failure.
+	DS_UNKNOWN_ERROR = 0x20EF,
+	// A root object requires a class of 'top'.
+	DS_ROOT_REQUIRES_CLASS_TOP = 0x20F0,
+	// This directory server is shutting down, and cannot take ownership of new floating single-master operation roles.
+	DS_REFUSING_FSMO_ROLES = 0x20F1,
+	// The directory service is missing mandatory configuration information, and is unable to determine the ownership of floating single-master operation roles.
+	DS_MISSING_FSMO_SETTINGS = 0x20F2,
+	// The directory service was unable to transfer ownership of one or more floating single-master operation roles to other servers.
+	DS_UNABLE_TO_SURRENDER_ROLES = 0x20F3,
+	// The replication operation failed.
+	DS_DRA_GENERIC = 0x20F4,
+	// An invalid parameter was specified for this replication operation.
+	DS_DRA_INVALID_PARAMETER = 0x20F5,
+	// The directory service is too busy to complete the replication operation at this time.
+	DS_DRA_BUSY = 0x20F6,
+	// The distinguished name specified for this replication operation is invalid.
+	DS_DRA_BAD_DN = 0x20F7,
+	// The naming context specified for this replication operation is invalid.
+	DS_DRA_BAD_NC = 0x20F8,
+	// The distinguished name specified for this replication operation already exists.
+	DS_DRA_DN_EXISTS = 0x20F9,
+	// The replication system encountered an internal error.
+	DS_DRA_INTERNAL_ERROR = 0x20FA,
+	// The replication operation encountered a database inconsistency.
+	DS_DRA_INCONSISTENT_DIT = 0x20FB,
+	// The server specified for this replication operation could not be contacted.
+	DS_DRA_CONNECTION_FAILED = 0x20FC,
+	// The replication operation encountered an object with an invalid instance type.
+	DS_DRA_BAD_INSTANCE_TYPE = 0x20FD,
+	// The replication operation failed to allocate memory.
+	DS_DRA_OUT_OF_MEM = 0x20FE,
+	// The replication operation encountered an error with the mail system.
+	DS_DRA_MAIL_PROBLEM = 0x20FF,
+	// The replication reference information for the target server already exists.
+	DS_DRA_REF_ALREADY_EXISTS = 0x2100,
+	// The replication reference information for the target server does not exist.
+	DS_DRA_REF_NOT_FOUND = 0x2101,
+	// The naming context cannot be removed because it is replicated to another server.
+	DS_DRA_OBJ_IS_REP_SOURCE = 0x2102,
+	// The replication operation encountered a database error.
+	DS_DRA_DB_ERROR = 0x2103,
+	// The naming context is in the process of being removed or is not replicated from the specified server.
+	DS_DRA_NO_REPLICA = 0x2104,
+	// Replication access was denied.
+	DS_DRA_ACCESS_DENIED = 0x2105,
+	// The requested operation is not supported by this version of the directory service.
+	DS_DRA_NOT_SUPPORTED = 0x2106,
+	// The replication remote procedure call was cancelled.
+	DS_DRA_RPC_CANCELLED = 0x2107,
+	// The source server is currently rejecting replication requests.
+	DS_DRA_SOURCE_DISABLED = 0x2108,
+	// The destination server is currently rejecting replication requests.
+	DS_DRA_SINK_DISABLED = 0x2109,
+	// The replication operation failed due to a collision of object names.
+	DS_DRA_NAME_COLLISION = 0x210A,
+	// The replication source has been reinstalled.
+	DS_DRA_SOURCE_REINSTALLED = 0x210B,
+	// The replication operation failed because a required parent object is missing.
+	DS_DRA_MISSING_PARENT = 0x210C,
+	// The replication operation was preempted.
+	DS_DRA_PREEMPTED = 0x210D,
+	// The replication synchronization attempt was abandoned because of a lack of updates.
+	DS_DRA_ABANDON_SYNC = 0x210E,
+	// The replication operation was terminated because the system is shutting down.
+	DS_DRA_SHUTDOWN = 0x210F,
+	// Synchronization attempt failed because the destination DC is currently waiting to synchronize new partial attributes from source. This condition is normal if a recent schema change modified the partial attribute set. The destination partial attribute set is not a subset of source partial attribute set.
+	DS_DRA_INCOMPATIBLE_PARTIAL_SET = 0x2110,
+	// The replication synchronization attempt failed because a master replica attempted to sync from a partial replica.
+	DS_DRA_SOURCE_IS_PARTIAL_REPLICA = 0x2111,
+	// The server specified for this replication operation was contacted, but that server was unable to contact an additional server needed to complete the operation.
+	DS_DRA_EXTN_CONNECTION_FAILED = 0x2112,
+	// The version of the directory service schema of the source forest is not compatible with the version of directory service on this computer.
+	DS_INSTALL_SCHEMA_MISMATCH = 0x2113,
+	// Schema update failed: An attribute with the same link identifier already exists.
+	DS_DUP_LINK_ID = 0x2114,
+	// Name translation: Generic processing error.
+	DS_NAME_ERROR_RESOLVING = 0x2115,
+	// Name translation: Could not find the name or insufficient right to see name.
+	DS_NAME_ERROR_NOT_FOUND = 0x2116,
+	// Name translation: Input name mapped to more than one output name.
+	DS_NAME_ERROR_NOT_UNIQUE = 0x2117,
+	// Name translation: Input name found, but not the associated output format.
+	DS_NAME_ERROR_NO_MAPPING = 0x2118,
+	// Name translation: Unable to resolve completely, only the domain was found.
+	DS_NAME_ERROR_DOMAIN_ONLY = 0x2119,
+	// Name translation: Unable to perform purely syntactical mapping at the client without going out to the wire.
+	DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING = 0x211A,
+	// Modification of a constructed attribute is not allowed.
+	DS_CONSTRUCTED_ATT_MOD = 0x211B,
+	// The OM-Object-Class specified is incorrect for an attribute with the specified syntax.
+	DS_WRONG_OM_OBJ_CLASS = 0x211C,
+	// The replication request has been posted; waiting for reply.
+	DS_DRA_REPL_PENDING = 0x211D,
+	// The requested operation requires a directory service, and none was available.
+	DS_DS_REQUIRED = 0x211E,
+	// The LDAP display name of the class or attribute contains non-ASCII characters.
+	DS_INVALID_LDAP_DISPLAY_NAME = 0x211F,
+	// The requested search operation is only supported for base searches.
+	DS_NON_BASE_SEARCH = 0x2120,
+	// The search failed to retrieve attributes from the database.
+	DS_CANT_RETRIEVE_ATTS = 0x2121,
+	// The schema update operation tried to add a backward link attribute that has no corresponding forward link.
+	DS_BACKLINK_WITHOUT_LINK = 0x2122,
+	// Source and destination of a cross-domain move do not agree on the object's epoch number. Either source or destination does not have the latest version of the object.
+	DS_EPOCH_MISMATCH = 0x2123,
+	// Source and destination of a cross-domain move do not agree on the object's current name. Either source or destination does not have the latest version of the object.
+	DS_SRC_NAME_MISMATCH = 0x2124,
+	// Source and destination for the cross-domain move operation are identical. Caller should use local move operation instead of cross-domain move operation.
+	DS_SRC_AND_DST_NC_IDENTICAL = 0x2125,
+	// Source and destination for a cross-domain move are not in agreement on the naming contexts in the forest. Either source or destination does not have the latest version of the Partitions container.
+	DS_DST_NC_MISMATCH = 0x2126,
+	// Destination of a cross-domain move is not authoritative for the destination naming context.
+	DS_NOT_AUTHORITIVE_FOR_DST_NC = 0x2127,
+	// Source and destination of a cross-domain move do not agree on the identity of the source object. Either source or destination does not have the latest version of the source object.
+	DS_SRC_GUID_MISMATCH = 0x2128,
+	// Object being moved across-domains is already known to be deleted by the destination server. The source server does not have the latest version of the source object.
+	DS_CANT_MOVE_DELETED_OBJECT = 0x2129,
+	// Another operation which requires exclusive access to the PDC FSMO is already in progress.
+	DS_PDC_OPERATION_IN_PROGRESS = 0x212A,
+	// A cross-domain move operation failed such that two versions of the moved object exist - one each in the source and destination domains. The destination object needs to be removed to restore the system to a consistent state.
+	DS_CROSS_DOMAIN_CLEANUP_REQD = 0x212B,
+	// This object may not be moved across domain boundaries either because cross-domain moves for this class are disallowed, or the object has some special characteristics, e.g.: trust account or restricted RID, which prevent its move.
+	DS_ILLEGAL_XDOM_MOVE_OPERATION = 0x212C,
+	// Can't move objects with memberships across domain boundaries as once moved, this would violate the membership conditions of the account group. Remove the object from any account group memberships and retry.
+	DS_CANT_WITH_ACCT_GROUP_MEMBERSHPS = 0x212D,
+	// A naming context head must be the immediate child of another naming context head, not of an interior node.
+	DS_NC_MUST_HAVE_NC_PARENT = 0x212E,
+	// The directory cannot validate the proposed naming context name because it does not hold a replica of the naming context above the proposed naming context. Please ensure that the domain naming master role is held by a server that is configured as a global catalog server, and that the server is up to date with its replication partners. (Applies only to Windows 2000 Domain Naming masters.)
+	DS_CR_IMPOSSIBLE_TO_VALIDATE = 0x212F,
+	// Destination domain must be in native mode.
+	DS_DST_DOMAIN_NOT_NATIVE = 0x2130,
+	// The operation cannot be performed because the server does not have an infrastructure container in the domain of interest.
+	DS_MISSING_INFRASTRUCTURE_CONTAINER = 0x2131,
+	// Cross-domain move of non-empty account groups is not allowed.
+	DS_CANT_MOVE_ACCOUNT_GROUP = 0x2132,
+	// Cross-domain move of non-empty resource groups is not allowed.
+	DS_CANT_MOVE_RESOURCE_GROUP = 0x2133,
+	// The search flags for the attribute are invalid. The ANR bit is valid only on attributes of Unicode or Teletex strings.
+	DS_INVALID_SEARCH_FLAG = 0x2134,
+	// Tree deletions starting at an object which has an NC head as a descendant are not allowed.
+	DS_NO_TREE_DELETE_ABOVE_NC = 0x2135,
+	// The directory service failed to lock a tree in preparation for a tree deletion because the tree was in use.
+	DS_COULDNT_LOCK_TREE_FOR_DELETE = 0x2136,
+	// The directory service failed to identify the list of objects to delete while attempting a tree deletion.
+	DS_COULDNT_IDENTIFY_OBJECTS_FOR_TREE_DELETE = 0x2137,
+	// Security Accounts Manager initialization failed because of the following error: %1. Error Status: 0x%2. Please shutdown this system and reboot into Directory Services Restore Mode, check the event log for more detailed information.
+	DS_SAM_INIT_FAILURE = 0x2138,
+	// Only an administrator can modify the membership list of an administrative group.
+	DS_SENSITIVE_GROUP_VIOLATION = 0x2139,
+	// Cannot change the primary group ID of a domain controller account.
+	DS_CANT_MOD_PRIMARYGROUPID = 0x213A,
+	// An attempt is made to modify the base schema.
+	DS_ILLEGAL_BASE_SCHEMA_MOD = 0x213B,
+	// Adding a new mandatory attribute to an existing class, deleting a mandatory attribute from an existing class, or adding an optional attribute to the special class Top that is not a backlink attribute (directly or through inheritance, for example, by adding or deleting an auxiliary class) is not allowed.
+	DS_NONSAFE_SCHEMA_CHANGE = 0x213C,
+	// Schema update is not allowed on this DC because the DC is not the schema FSMO Role Owner.
+	DS_SCHEMA_UPDATE_DISALLOWED = 0x213D,
+	// An object of this class cannot be created under the schema container. You can only create attribute-schema and class-schema objects under the schema container.
+	DS_CANT_CREATE_UNDER_SCHEMA = 0x213E,
+	// The replica/child install failed to get the objectVersion attribute on the schema container on the source DC. Either the attribute is missing on the schema container or the credentials supplied do not have permission to read it.
+	DS_INSTALL_NO_SRC_SCH_VERSION = 0x213F,
+	// The replica/child install failed to read the objectVersion attribute in the SCHEMA section of the file schema.ini in the system32 directory.
+	DS_INSTALL_NO_SCH_VERSION_IN_INIFILE = 0x2140,
+	// The specified group type is invalid.
+	DS_INVALID_GROUP_TYPE = 0x2141,
+	// You cannot nest global groups in a mixed domain if the group is security-enabled.
+	DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN = 0x2142,
+	// You cannot nest local groups in a mixed domain if the group is security-enabled.
+	DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN = 0x2143,
+	// A global group cannot have a local group as a member.
+	DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER = 0x2144,
+	// A global group cannot have a universal group as a member.
+	DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER = 0x2145,
+	// A universal group cannot have a local group as a member.
+	DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER = 0x2146,
+	// A global group cannot have a cross-domain member.
+	DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER = 0x2147,
+	// A local group cannot have another cross domain local group as a member.
+	DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER = 0x2148,
+	// A group with primary members cannot change to a security-disabled group.
+	DS_HAVE_PRIMARY_MEMBERS = 0x2149,
+	// The schema cache load failed to convert the string default SD on a class-schema object.
+	DS_STRING_SD_CONVERSION_FAILED = 0x214A,
+	// Only DSAs configured to be Global Catalog servers should be allowed to hold the Domain Naming Master FSMO role. (Applies only to Windows 2000 servers.)
+	DS_NAMING_MASTER_GC = 0x214B,
+	// The DSA operation is unable to proceed because of a DNS lookup failure.
+	DS_DNS_LOOKUP_FAILURE = 0x214C,
+	// While processing a change to the DNS Host Name for an object, the Service Principal Name values could not be kept in sync.
+	DS_COULDNT_UPDATE_SPNS = 0x214D,
+	// The Security Descriptor attribute could not be read.
+	DS_CANT_RETRIEVE_SD = 0x214E,
+	// The object requested was not found, but an object with that key was found.
+	DS_KEY_NOT_UNIQUE = 0x214F,
+	// The syntax of the linked attribute being added is incorrect. Forward links can only have syntax 2.5.5.1, 2.5.5.7, and 2.5.5.14, and backlinks can only have syntax 2.5.5.1.
+	DS_WRONG_LINKED_ATT_SYNTAX = 0x2150,
+	// Security Account Manager needs to get the boot password.
+	DS_SAM_NEED_BOOTKEY_PASSWORD = 0x2151,
+	// Security Account Manager needs to get the boot key from floppy disk.
+	DS_SAM_NEED_BOOTKEY_FLOPPY = 0x2152,
+	// Directory Service cannot start.
+	DS_CANT_START = 0x2153,
+	// Directory Services could not start.
+	DS_INIT_FAILURE = 0x2154,
+	// The connection between client and server requires packet privacy or better.
+	DS_NO_PKT_PRIVACY_ON_CONNECTION = 0x2155,
+	// The source domain may not be in the same forest as destination.
+	DS_SOURCE_DOMAIN_IN_FOREST = 0x2156,
+	// The destination domain must be in the forest.
+	DS_DESTINATION_DOMAIN_NOT_IN_FOREST = 0x2157,
+	// The operation requires that destination domain auditing be enabled.
+	DS_DESTINATION_AUDITING_NOT_ENABLED = 0x2158,
+	// The operation couldn't locate a DC for the source domain.
+	DS_CANT_FIND_DC_FOR_SRC_DOMAIN = 0x2159,
+	// The source object must be a group or user.
+	DS_SRC_OBJ_NOT_GROUP_OR_USER = 0x215A,
+	// The source object's SID already exists in destination forest.
+	DS_SRC_SID_EXISTS_IN_FOREST = 0x215B,
+	// The source and destination object must be of the same type.
+	DS_SRC_AND_DST_OBJECT_CLASS_MISMATCH = 0x215C,
+	// Security Accounts Manager initialization failed because of the following error: %1. Error Status: 0x%2. Click OK to shut down the system and reboot into Safe Mode. Check the event log for detailed information.
+	SAM_INIT_FAILURE = 0x215D,
+	// Schema information could not be included in the replication request.
+	DS_DRA_SCHEMA_INFO_SHIP = 0x215E,
+	// The replication operation could not be completed due to a schema incompatibility.
+	DS_DRA_SCHEMA_CONFLICT = 0x215F,
+	// The replication operation could not be completed due to a previous schema incompatibility.
+	DS_DRA_EARLIER_SCHEMA_CONFLICT = 0x2160,
+	// The replication update could not be applied because either the source or the destination has not yet received information regarding a recent cross-domain move operation.
+	DS_DRA_OBJ_NC_MISMATCH = 0x2161,
+	// The requested domain could not be deleted because there exist domain controllers that still host this domain.
+	DS_NC_STILL_HAS_DSAS = 0x2162,
+	// The requested operation can be performed only on a global catalog server.
+	DS_GC_REQUIRED = 0x2163,
+	// A local group can only be a member of other local groups in the same domain.
+	DS_LOCAL_MEMBER_OF_LOCAL_ONLY = 0x2164,
+	// Foreign security principals cannot be members of universal groups.
+	DS_NO_FPO_IN_UNIVERSAL_GROUPS = 0x2165,
+	// The attribute is not allowed to be replicated to the GC because of security reasons.
+	DS_CANT_ADD_TO_GC = 0x2166,
+	// The checkpoint with the PDC could not be taken because there too many modifications being processed currently.
+	DS_NO_CHECKPOINT_WITH_PDC = 0x2167,
+	// The operation requires that source domain auditing be enabled.
+	DS_SOURCE_AUDITING_NOT_ENABLED = 0x2168,
+	// Security principal objects can only be created inside domain naming contexts.
+	DS_CANT_CREATE_IN_NONDOMAIN_NC = 0x2169,
+	// A Service Principal Name (SPN) could not be constructed because the provided hostname is not in the necessary format.
+	DS_INVALID_NAME_FOR_SPN = 0x216A,
+	// A Filter was passed that uses constructed attributes.
+	DS_FILTER_USES_CONTRUCTED_ATTRS = 0x216B,
+	// The unicodePwd attribute value must be enclosed in double quotes.
+	DS_UNICODEPWD_NOT_IN_QUOTES = 0x216C,
+	// Your computer could not be joined to the domain. You have exceeded the maximum number of computer accounts you are allowed to create in this domain. Contact your system administrator to have this limit reset or increased.
+	DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED = 0x216D,
+	// For security reasons, the operation must be run on the destination DC.
+	DS_MUST_BE_RUN_ON_DST_DC = 0x216E,
+	// For security reasons, the source DC must be NT4SP4 or greater.
+	DS_SRC_DC_MUST_BE_SP4_OR_GREATER = 0x216F,
+	// Critical Directory Service System objects cannot be deleted during tree delete operations. The tree delete may have been partially performed.
+	DS_CANT_TREE_DELETE_CRITICAL_OBJ = 0x2170,
+	// Directory Services could not start because of the following error: %1. Error Status: 0x%2. Please click OK to shutdown the system. You can use the recovery console to diagnose the system further.
+	DS_INIT_FAILURE_CONSOLE = 0x2171,
+	// Security Accounts Manager initialization failed because of the following error: %1. Error Status: 0x%2. Please click OK to shutdown the system. You can use the recovery console to diagnose the system further.
+	DS_SAM_INIT_FAILURE_CONSOLE = 0x2172,
+	// The version of the operating system is incompatible with the current AD DS forest functional level or AD LDS Configuration Set functional level. You must upgrade to a new version of the operating system before this server can become an AD DS Domain Controller or add an AD LDS Instance in this AD DS Forest or AD LDS Configuration Set.
+	DS_FOREST_VERSION_TOO_HIGH = 0x2173,
+	// The version of the operating system installed is incompatible with the current domain functional level. You must upgrade to a new version of the operating system before this server can become a domain controller in this domain.
+	DS_DOMAIN_VERSION_TOO_HIGH = 0x2174,
+	// The version of the operating system installed on this server no longer supports the current AD DS Forest functional level or AD LDS Configuration Set functional level. You must raise the AD DS Forest functional level or AD LDS Configuration Set functional level before this server can become an AD DS Domain Controller or an AD LDS Instance in this Forest or Configuration Set.
+	DS_FOREST_VERSION_TOO_LOW = 0x2175,
+	// The version of the operating system installed on this server no longer supports the current domain functional level. You must raise the domain functional level before this server can become a domain controller in this domain.
+	DS_DOMAIN_VERSION_TOO_LOW = 0x2176,
+	// The version of the operating system installed on this server is incompatible with the functional level of the domain or forest.
+	DS_INCOMPATIBLE_VERSION = 0x2177,
+	// The functional level of the domain (or forest) cannot be raised to the requested value, because there exist one or more domain controllers in the domain (or forest) that are at a lower incompatible functional level.
+	DS_LOW_DSA_VERSION = 0x2178,
+	// The forest functional level cannot be raised to the requested value since one or more domains are still in mixed domain mode. All domains in the forest must be in native mode, for you to raise the forest functional level.
+	DS_NO_BEHAVIOR_VERSION_IN_MIXEDDOMAIN = 0x2179,
+	// The sort order requested is not supported.
+	DS_NOT_SUPPORTED_SORT_ORDER = 0x217A,
+	// The requested name already exists as a unique identifier.
+	DS_NAME_NOT_UNIQUE = 0x217B,
+	// The machine account was created pre-NT4. The account needs to be recreated.
+	DS_MACHINE_ACCOUNT_CREATED_PRENT4 = 0x217C,
+	// The database is out of version store.
+	DS_OUT_OF_VERSION_STORE = 0x217D,
+	// Unable to continue operation because multiple conflicting controls were used.
+	DS_INCOMPATIBLE_CONTROLS_USED = 0x217E,
+	// Unable to find a valid security descriptor reference domain for this partition.
+	DS_NO_REF_DOMAIN = 0x217F,
+	// Schema update failed: The link identifier is reserved.
+	DS_RESERVED_LINK_ID = 0x2180,
+	// Schema update failed: There are no link identifiers available.
+	DS_LINK_ID_NOT_AVAILABLE = 0x2181,
+	// An account group cannot have a universal group as a member.
+	DS_AG_CANT_HAVE_UNIVERSAL_MEMBER = 0x2182,
+	// Rename or move operations on naming context heads or read-only objects are not allowed.
+	DS_MODIFYDN_DISALLOWED_BY_INSTANCE_TYPE = 0x2183,
+	// Move operations on objects in the schema naming context are not allowed.
+	DS_NO_OBJECT_MOVE_IN_SCHEMA_NC = 0x2184,
+	// A system flag has been set on the object and does not allow the object to be moved or renamed.
+	DS_MODIFYDN_DISALLOWED_BY_FLAG = 0x2185,
+	// This object is not allowed to change its grandparent container. Moves are not forbidden on this object, but are restricted to sibling containers.
+	DS_MODIFYDN_WRONG_GRANDPARENT = 0x2186,
+	// Unable to resolve completely, a referral to another forest is generated.
+	DS_NAME_ERROR_TRUST_REFERRAL = 0x2187,
+	// The requested action is not supported on standard server.
+	NOT_SUPPORTED_ON_STANDARD_SERVER = 0x2188,
+	// Could not access a partition of the directory service located on a remote server. Make sure at least one server is running for the partition in question.
+	DS_CANT_ACCESS_REMOTE_PART_OF_AD = 0x2189,
+	// The directory cannot validate the proposed naming context (or partition) name because it does not hold a replica nor can it contact a replica of the naming context above the proposed naming context. Please ensure that the parent naming context is properly registered in DNS, and at least one replica of this naming context is reachable by the Domain Naming master.
+	DS_CR_IMPOSSIBLE_TO_VALIDATE_V2 = 0x218A,
+	// The thread limit for this request was exceeded.
+	DS_THREAD_LIMIT_EXCEEDED = 0x218B,
+	// The Global catalog server is not in the closest site.
+	DS_NOT_CLOSEST = 0x218C,
+	// The DS cannot derive a service principal name (SPN) with which to mutually authenticate the target server because the corresponding server object in the local DS database has no serverReference attribute.
+	DS_CANT_DERIVE_SPN_WITHOUT_SERVER_REF = 0x218D,
+	// The Directory Service failed to enter single user mode.
+	DS_SINGLE_USER_MODE_FAILED = 0x218E,
+	// The Directory Service cannot parse the script because of a syntax error.
+	DS_NTDSCRIPT_SYNTAX_ERROR = 0x218F,
+	// The Directory Service cannot process the script because of an error.
+	DS_NTDSCRIPT_PROCESS_ERROR = 0x2190,
+	// The directory service cannot perform the requested operation because the servers involved are of different replication epochs (which is usually related to a domain rename that is in progress).
+	DS_DIFFERENT_REPL_EPOCHS = 0x2191,
+	// The directory service binding must be renegotiated due to a change in the server extensions information.
+	DS_DRS_EXTENSIONS_CHANGED = 0x2192,
+	// Operation not allowed on a disabled cross ref.
+	DS_REPLICA_SET_CHANGE_NOT_ALLOWED_ON_DISABLED_CR = 0x2193,
+	// Schema update failed: No values for msDS-IntId are available.
+	DS_NO_MSDS_INTID = 0x2194,
+	// Schema update failed: Duplicate msDS-INtId. Retry the operation.
+	DS_DUP_MSDS_INTID = 0x2195,
+	// Schema deletion failed: attribute is used in rDNAttID.
+	DS_EXISTS_IN_RDNATTID = 0x2196,
+	// The directory service failed to authorize the request.
+	DS_AUTHORIZATION_FAILED = 0x2197,
+	// The Directory Service cannot process the script because it is invalid.
+	DS_INVALID_SCRIPT = 0x2198,
+	// The remote create cross reference operation failed on the Domain Naming Master FSMO. The operation's error is in the extended data.
+	DS_REMOTE_CROSSREF_OP_FAILED = 0x2199,
+	// A cross reference is in use locally with the same name.
+	DS_CROSS_REF_BUSY = 0x219A,
+	// The DS cannot derive a service principal name (SPN) with which to mutually authenticate the target server because the server's domain has been deleted from the forest.
+	DS_CANT_DERIVE_SPN_FOR_DELETED_DOMAIN = 0x219B,
+	// Writeable NCs prevent this DC from demoting.
+	DS_CANT_DEMOTE_WITH_WRITEABLE_NC = 0x219C,
+	// The requested object has a non-unique identifier and cannot be retrieved.
+	DS_DUPLICATE_ID_FOUND = 0x219D,
+	// Insufficient attributes were given to create an object. This object may not exist because it may have been deleted and already garbage collected.
+	DS_INSUFFICIENT_ATTR_TO_CREATE_OBJECT = 0x219E,
+	// The group cannot be converted due to attribute restrictions on the requested group type.
+	DS_GROUP_CONVERSION_ERROR = 0x219F,
+	// Cross-domain move of non-empty basic application groups is not allowed.
+	DS_CANT_MOVE_APP_BASIC_GROUP = 0x21A0,
+	// Cross-domain move of non-empty query based application groups is not allowed.
+	DS_CANT_MOVE_APP_QUERY_GROUP = 0x21A1,
+	// The FSMO role ownership could not be verified because its directory partition has not replicated successfully with at least one replication partner.
+	DS_ROLE_NOT_VERIFIED = 0x21A2,
+	// The target container for a redirection of a well known object container cannot already be a special container.
+	DS_WKO_CONTAINER_CANNOT_BE_SPECIAL = 0x21A3,
+	// The Directory Service cannot perform the requested operation because a domain rename operation is in progress.
+	DS_DOMAIN_RENAME_IN_PROGRESS = 0x21A4,
+	// The directory service detected a child partition below the requested partition name. The partition hierarchy must be created in a top down method.
+	DS_EXISTING_AD_CHILD_NC = 0x21A5,
+	// The directory service cannot replicate with this server because the time since the last replication with this server has exceeded the tombstone lifetime.
+	DS_REPL_LIFETIME_EXCEEDED = 0x21A6,
+	// The requested operation is not allowed on an object under the system container.
+	DS_DISALLOWED_IN_SYSTEM_CONTAINER = 0x21A7,
+	// The LDAP servers network send queue has filled up because the client is not processing the results of its requests fast enough. No more requests will be processed until the client catches up. If the client does not catch up then it will be disconnected.
+	DS_LDAP_SEND_QUEUE_FULL = 0x21A8,
+	// The scheduled replication did not take place because the system was too busy to execute the request within the schedule window. The replication queue is overloaded. Consider reducing the number of partners or decreasing the scheduled replication frequency.
+	DS_DRA_OUT_SCHEDULE_WINDOW = 0x21A9,
+	// At this time, it cannot be determined if the branch replication policy is available on the hub domain controller. Please retry at a later time to account for replication latencies.
+	DS_POLICY_NOT_KNOWN = 0x21AA,
+	// The site settings object for the specified site does not exist.
+	NO_SITE_SETTINGS_OBJECT = 0x21AB,
+	// The local account store does not contain secret material for the specified account.
+	NO_SECRETS = 0x21AC,
+	// Could not find a writable domain controller in the domain.
+	NO_WRITABLE_DC_FOUND = 0x21AD,
+	// The server object for the domain controller does not exist.
+	DS_NO_SERVER_OBJECT = 0x21AE,
+	// The NTDS Settings object for the domain controller does not exist.
+	DS_NO_NTDSA_OBJECT = 0x21AF,
+	// The requested search operation is not supported for ASQ searches.
+	DS_NON_ASQ_SEARCH = 0x21B0,
+	// A required audit event could not be generated for the operation.
+	DS_AUDIT_FAILURE = 0x21B1,
+	// The search flags for the attribute are invalid. The subtree index bit is valid only on single valued attributes.
+	DS_INVALID_SEARCH_FLAG_SUBTREE = 0x21B2,
+	// The search flags for the attribute are invalid. The tuple index bit is valid only on attributes of Unicode strings.
+	DS_INVALID_SEARCH_FLAG_TUPLE = 0x21B3,
+	// The address books are nested too deeply. Failed to build the hierarchy table.
+	DS_HIERARCHY_TABLE_TOO_DEEP = 0x21B4,
+	// The specified up-to-date-ness vector is corrupt.
+	DS_DRA_CORRUPT_UTD_VECTOR = 0x21B5,
+	// The request to replicate secrets is denied.
+	DS_DRA_SECRETS_DENIED = 0x21B6,
+	// Schema update failed: The MAPI identifier is reserved.
+	DS_RESERVED_MAPI_ID = 0x21B7,
+	// Schema update failed: There are no MAPI identifiers available.
+	DS_MAPI_ID_NOT_AVAILABLE = 0x21B8,
+	// The replication operation failed because the required attributes of the local krbtgt object are missing.
+	DS_DRA_MISSING_KRBTGT_SECRET = 0x21B9,
+	// The domain name of the trusted domain already exists in the forest.
+	DS_DOMAIN_NAME_EXISTS_IN_FOREST = 0x21BA,
+	// The flat name of the trusted domain already exists in the forest.
+	DS_FLAT_NAME_EXISTS_IN_FOREST = 0x21BB,
+	// The User Principal Name (UPN) is invalid.
+	INVALID_USER_PRINCIPAL_NAME = 0x21BC,
+	// OID mapped groups cannot have members.
+	DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS = 0x21BD,
+	// The specified OID cannot be found.
+	DS_OID_NOT_FOUND = 0x21BE,
+	// The replication operation failed because the target object referred by a link value is recycled.
+	DS_DRA_RECYCLED_TARGET = 0x21BF,
+	// The redirect operation failed because the target object is in a NC different from the domain NC of the current domain controller.
+	DS_DISALLOWED_NC_REDIRECT = 0x21C0,
+	// The functional level of the AD LDS configuration set cannot be lowered to the requested value.
+	DS_HIGH_ADLDS_FFL = 0x21C1,
+	// The functional level of the domain (or forest) cannot be lowered to the requested value.
+	DS_HIGH_DSA_VERSION = 0x21C2,
+	// The functional level of the AD LDS configuration set cannot be raised to the requested value, because there exist one or more ADLDS instances that are at a lower incompatible functional level.
+	DS_LOW_ADLDS_FFL = 0x21C3,
+	// The domain join cannot be completed because the SID of the domain you attempted to join was identical to the SID of this machine. This is a symptom of an improperly cloned operating system install. You should run sysprep on this machine in order to generate a new machine SID. Please see https://go.microsoft.com/fwlink/p/?linkid=168895 for more information.
+	DOMAIN_SID_SAME_AS_LOCAL_WORKSTATION = 0x21C4,
+	// The undelete operation failed because the Sam Account Name or Additional Sam Account Name of the object being undeleted conflicts with an existing live object.
+	DS_UNDELETE_SAM_VALIDATION_FAILED = 0x21C5,
+	// The system is not authoritative for the specified account and therefore cannot complete the operation. Please retry the operation using the provider associated with this account. If this is an online provider please use the provider's online site.
+	INCORRECT_ACCOUNT_TYPE = 0x21C6,
+
+
+	// DNS server unable to interpret format.
+	DNS_ERROR_RCODE_FORMAT_ERROR = 0x2329,
+	// DNS server failure.
+	DNS_ERROR_RCODE_SERVER_FAILURE = 0x232A,
+	// DNS name does not exist.
+	DNS_ERROR_RCODE_NAME_ERROR = 0x232B,
+	// DNS request not supported by name server.
+	DNS_ERROR_RCODE_NOT_IMPLEMENTED = 0x232C,
+	// DNS operation refused.
+	DNS_ERROR_RCODE_REFUSED = 0x232D,
+	// DNS name that ought not exist, does exist.
+	DNS_ERROR_RCODE_YXDOMAIN = 0x232E,
+	// DNS RR set that ought not exist, does exist.
+	DNS_ERROR_RCODE_YXRRSET = 0x232F,
+	// DNS RR set that ought to exist, does not exist.
+	DNS_ERROR_RCODE_NXRRSET = 0x2330,
+	// DNS server not authoritative for zone.
+	DNS_ERROR_RCODE_NOTAUTH = 0x2331,
+	// DNS name in update or prereq is not in zone.
+	DNS_ERROR_RCODE_NOTZONE = 0x2332,
+	// DNS signature failed to verify.
+	DNS_ERROR_RCODE_BADSIG = 0x2338,
+	// DNS bad key.
+	DNS_ERROR_RCODE_BADKEY = 0x2339,
+	// DNS signature validity expired.
+	DNS_ERROR_RCODE_BADTIME = 0x233A,
+	// Only the DNS server acting as the key master for the zone may perform this operation.
+	DNS_ERROR_KEYMASTER_REQUIRED = 0x238D,
+	// This operation is not allowed on a zone that is signed or has signing keys.
+	DNS_ERROR_NOT_ALLOWED_ON_SIGNED_ZONE = 0x238E,
+	// NSEC3 is not compatible with the RSA-SHA-1 algorithm. Choose a different algorithm or use NSEC.
+	// This value was also named DNS_ERROR_INVALID_NSEC3_PARAMETERS
+	DNS_ERROR_NSEC3_INCOMPATIBLE_WITH_RSA_SHA1 = 0x238F,
+	// The zone does not have enough signing keys. There must be at least one key signing key (KSK) and at least one zone signing key (ZSK).
+	DNS_ERROR_NOT_ENOUGH_SIGNING_KEY_DESCRIPTORS = 0x2390,
+	// The specified algorithm is not supported.
+	DNS_ERROR_UNSUPPORTED_ALGORITHM = 0x2391,
+	// The specified key size is not supported.
+	DNS_ERROR_INVALID_KEY_SIZE = 0x2392,
+	// One or more of the signing keys for a zone are not accessible to the DNS server. Zone signing will not be operational until this error is resolved.
+	DNS_ERROR_SIGNING_KEY_NOT_ACCESSIBLE = 0x2393,
+	// The specified key storage provider does not support DPAPI++ data protection. Zone signing will not be operational until this error is resolved.
+	DNS_ERROR_KSP_DOES_NOT_SUPPORT_PROTECTION = 0x2394,
+	// An unexpected DPAPI++ error was encountered. Zone signing will not be operational until this error is resolved.
+	DNS_ERROR_UNEXPECTED_DATA_PROTECTION_ERROR = 0x2395,
+	// An unexpected crypto error was encountered. Zone signing may not be operational until this error is resolved.
+	DNS_ERROR_UNEXPECTED_CNG_ERROR = 0x2396,
+	// The DNS server encountered a signing key with an unknown version. Zone signing will not be operational until this error is resolved.
+	DNS_ERROR_UNKNOWN_SIGNING_PARAMETER_VERSION = 0x2397,
+	// The specified key service provider cannot be opened by the DNS server.
+	DNS_ERROR_KSP_NOT_ACCESSIBLE = 0x2398,
+	// The DNS server cannot accept any more signing keys with the specified algorithm and KSK flag value for this zone.
+	DNS_ERROR_TOO_MANY_SKDS = 0x2399,
+	// The specified rollover period is invalid.
+	DNS_ERROR_INVALID_ROLLOVER_PERIOD = 0x239A,
+	// The specified initial rollover offset is invalid.
+	DNS_ERROR_INVALID_INITIAL_ROLLOVER_OFFSET = 0x239B,
+	// The specified signing key is already in process of rolling over keys.
+	DNS_ERROR_ROLLOVER_IN_PROGRESS = 0x239C,
+	// The specified signing key does not have a standby key to revoke.
+	DNS_ERROR_STANDBY_KEY_NOT_PRESENT = 0x239D,
+	// This operation is not allowed on a zone signing key (ZSK).
+	DNS_ERROR_NOT_ALLOWED_ON_ZSK = 0x239E,
+	// This operation is not allowed on an active signing key.
+	DNS_ERROR_NOT_ALLOWED_ON_ACTIVE_SKD = 0x239F,
+	// The specified signing key is already queued for rollover.
+	DNS_ERROR_ROLLOVER_ALREADY_QUEUED = 0x23A0,
+	// This operation is not allowed on an unsigned zone.
+	DNS_ERROR_NOT_ALLOWED_ON_UNSIGNED_ZONE = 0x23A1,
+	// This operation could not be completed because the DNS server listed as the current key master for this zone is down or misconfigured. Resolve the problem on the current key master for this zone or use another DNS server to seize the key master role.
+	DNS_ERROR_BAD_KEYMASTER = 0x23A2,
+	// The specified signature validity period is invalid.
+	DNS_ERROR_INVALID_SIGNATURE_VALIDITY_PERIOD = 0x23A3,
+	// The specified NSEC3 iteration count is higher than allowed by the minimum key length used in the zone.
+	DNS_ERROR_INVALID_NSEC3_ITERATION_COUNT = 0x23A4,
+	// This operation could not be completed because the DNS server has been configured with DNSSEC features disabled. Enable DNSSEC on the DNS server.
+	DNS_ERROR_DNSSEC_IS_DISABLED = 0x23A5,
+	// This operation could not be completed because the XML stream received is empty or syntactically invalid.
+	DNS_ERROR_INVALID_XML = 0x23A6,
+	// This operation completed, but no trust anchors were added because all of the trust anchors received were either invalid, unsupported, expired, or would not become valid in less than 30 days.
+	DNS_ERROR_NO_VALID_TRUST_ANCHORS = 0x23A7,
+	// The specified signing key is not waiting for parental DS update.
+	DNS_ERROR_ROLLOVER_NOT_POKEABLE = 0x23A8,
+	// Hash collision detected during NSEC3 signing. Specify a different user-provided salt, or use a randomly generated salt, and attempt to sign the zone again.
+	DNS_ERROR_NSEC3_NAME_COLLISION = 0x23A9,
+	// NSEC is not compatible with the NSEC3-RSA-SHA-1 algorithm. Choose a different algorithm or use NSEC3.
+	DNS_ERROR_NSEC_INCOMPATIBLE_WITH_NSEC3_RSA_SHA1 = 0x23AA,
+	// No records found for given DNS query.
+	DNS_INFO_NO_RECORDS = 0x251D,
+	// Bad DNS packet.
+	DNS_ERROR_BAD_PACKET = 0x251E,
+	// No DNS packet.
+	DNS_ERROR_NO_PACKET = 0x251F,
+	// DNS error, check rcode.
+	DNS_ERROR_RCODE = 0x2520,
+	// Unsecured DNS packet.
+	DNS_ERROR_UNSECURE_PACKET = 0x2521,
+	// DNS query request is pending.
+	DNS_REQUEST_PENDING = 0x2522,
+	// Invalid DNS type.
+	DNS_ERROR_INVALID_TYPE = 0x254F,
+	// Invalid IP address.
+	DNS_ERROR_INVALID_IP_ADDRESS = 0x2550,
+	// Invalid property.
+	DNS_ERROR_INVALID_PROPERTY = 0x2551,
+	// Try DNS operation again later.
+	DNS_ERROR_TRY_AGAIN_LATER = 0x2552,
+	// Record for given name and type is not unique.
+	DNS_ERROR_NOT_UNIQUE = 0x2553,
+	// DNS name does not comply with RFC specifications.
+	DNS_ERROR_NON_RFC_NAME = 0x2554,
+	// DNS name is a fully-qualified DNS name.
+	DNS_STATUS_FQDN = 0x2555,
+	// DNS name is dotted (multi-label).
+	DNS_STATUS_DOTTED_NAME = 0x2556,
+	// DNS name is a single-part name.
+	DNS_STATUS_SINGLE_PART_NAME = 0x2557,
+	// DNS name contains an invalid character.
+	DNS_ERROR_INVALID_NAME_CHAR = 0x2558,
+	// DNS name is entirely numeric.
+	DNS_ERROR_NUMERIC_NAME = 0x2559,
+	// The operation requested is not permitted on a DNS root server.
+	DNS_ERROR_NOT_ALLOWED_ON_ROOT_SERVER = 0x255A,
+	// The record could not be created because this part of the DNS namespace has been delegated to another server.
+	DNS_ERROR_NOT_ALLOWED_UNDER_DELEGATION = 0x255B,
+	// The DNS server could not find a set of root hints.
+	DNS_ERROR_CANNOT_FIND_ROOT_HINTS = 0x255C,
+	// The DNS server found root hints but they were not consistent across all adapters.
+	DNS_ERROR_INCONSISTENT_ROOT_HINTS = 0x255D,
+	// The specified value is too small for this parameter.
+	DNS_ERROR_DWORD_VALUE_TOO_SMALL = 0x255E,
+	// The specified value is too large for this parameter.
+	DNS_ERROR_DWORD_VALUE_TOO_LARGE = 0x255F,
+	// This operation is not allowed while the DNS server is loading zones in the background. Please try again later.
+	DNS_ERROR_BACKGROUND_LOADING = 0x2560,
+	// The operation requested is not permitted on against a DNS server running on a read-only DC.
+	DNS_ERROR_NOT_ALLOWED_ON_RODC = 0x2561,
+	// No data is allowed to exist underneath a DNAME record.
+	DNS_ERROR_NOT_ALLOWED_UNDER_DNAME = 0x2562,
+	// This operation requires credentials delegation.
+	DNS_ERROR_DELEGATION_REQUIRED = 0x2563,
+	// Name resolution policy table has been corrupted. DNS resolution will fail until it is fixed. Contact your network administrator.
+	DNS_ERROR_INVALID_POLICY_TABLE = 0x2564,
+	// DNS zone does not exist.
+	DNS_ERROR_ZONE_DOES_NOT_EXIST = 0x2581,
+	// DNS zone information not available.
+	DNS_ERROR_NO_ZONE_INFO = 0x2582,
+	// Invalid operation for DNS zone.
+	DNS_ERROR_INVALID_ZONE_OPERATION = 0x2583,
+	// Invalid DNS zone configuration.
+	DNS_ERROR_ZONE_CONFIGURATION_ERROR = 0x2584,
+	// DNS zone has no start of authority (SOA) record.
+	DNS_ERROR_ZONE_HAS_NO_SOA_RECORD = 0x2585,
+	// DNS zone has no Name Server (NS) record.
+	DNS_ERROR_ZONE_HAS_NO_NS_RECORDS = 0x2586,
+	// DNS zone is locked.
+	DNS_ERROR_ZONE_LOCKED = 0x2587,
+	// DNS zone creation failed.
+	DNS_ERROR_ZONE_CREATION_FAILED = 0x2588,
+	// DNS zone already exists.
+	DNS_ERROR_ZONE_ALREADY_EXISTS = 0x2589,
+	// DNS automatic zone already exists.
+	DNS_ERROR_AUTOZONE_ALREADY_EXISTS = 0x258A,
+	// Invalid DNS zone type.
+	DNS_ERROR_INVALID_ZONE_TYPE = 0x258B,
+	// Secondary DNS zone requires master IP address.
+	DNS_ERROR_SECONDARY_REQUIRES_MASTER_IP = 0x258C,
+	// DNS zone not secondary.
+	DNS_ERROR_ZONE_NOT_SECONDARY = 0x258D,
+	// Need secondary IP address.
+	DNS_ERROR_NEED_SECONDARY_ADDRESSES = 0x258E,
+	// WINS initialization failed.
+	DNS_ERROR_WINS_INIT_FAILED = 0x258F,
+	// Need WINS servers.
+	DNS_ERROR_NEED_WINS_SERVERS = 0x2590,
+	// NBTSTAT initialization call failed.
+	DNS_ERROR_NBSTAT_INIT_FAILED = 0x2591,
+	// Invalid delete of start of authority (SOA).
+	DNS_ERROR_SOA_DELETE_INVALID = 0x2592,
+	// A conditional forwarding zone already exists for that name.
+	DNS_ERROR_FORWARDER_ALREADY_EXISTS = 0x2593,
+	// This zone must be configured with one or more master DNS server IP addresses.
+	DNS_ERROR_ZONE_REQUIRES_MASTER_IP = 0x2594,
+	// The operation cannot be performed because this zone is shut down.
+	DNS_ERROR_ZONE_IS_SHUTDOWN = 0x2595,
+	// This operation cannot be performed because the zone is currently being signed. Please try again later.
+	DNS_ERROR_ZONE_LOCKED_FOR_SIGNING = 0x2596,
+	// Primary DNS zone requires datafile.
+	DNS_ERROR_PRIMARY_REQUIRES_DATAFILE = 0x25B3,
+	// Invalid datafile name for DNS zone.
+	DNS_ERROR_INVALID_DATAFILE_NAME = 0x25B4,
+	// Failed to open datafile for DNS zone.
+	DNS_ERROR_DATAFILE_OPEN_FAILURE = 0x25B5,
+	// Failed to write datafile for DNS zone.
+	DNS_ERROR_FILE_WRITEBACK_FAILED = 0x25B6,
+	// Failure while reading datafile for DNS zone.
+	DNS_ERROR_DATAFILE_PARSING = 0x25B7,
+	// DNS record does not exist.
+	DNS_ERROR_RECORD_DOES_NOT_EXIST = 0x25E5,
+	// DNS record format error.
+	DNS_ERROR_RECORD_FORMAT = 0x25E6,
+	// Node creation failure in DNS.
+	DNS_ERROR_NODE_CREATION_FAILED = 0x25E7,
+	// Unknown DNS record type.
+	DNS_ERROR_UNKNOWN_RECORD_TYPE = 0x25E8,
+	// DNS record timed out.
+	DNS_ERROR_RECORD_TIMED_OUT = 0x25E9,
+	// Name not in DNS zone.
+	DNS_ERROR_NAME_NOT_IN_ZONE = 0x25EA,
+	// CNAME loop detected.
+	DNS_ERROR_CNAME_LOOP = 0x25EB,
+	// Node is a CNAME DNS record.
+	DNS_ERROR_NODE_IS_CNAME = 0x25EC,
+	// A CNAME record already exists for given name.
+	DNS_ERROR_CNAME_COLLISION = 0x25ED,
+	// Record only at DNS zone root.
+	DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOT = 0x25EE,
+	// DNS record already exists.
+	DNS_ERROR_RECORD_ALREADY_EXISTS = 0x25EF,
+	// Secondary DNS zone data error.
+	DNS_ERROR_SECONDARY_DATA = 0x25F0,
+	// Could not create DNS cache data.
+	DNS_ERROR_NO_CREATE_CACHE_DATA = 0x25F1,
+	// DNS name does not exist.
+	DNS_ERROR_NAME_DOES_NOT_EXIST = 0x25F2,
+	// Could not create pointer (PTR) record.
+	DNS_WARNING_PTR_CREATE_FAILED = 0x25F3,
+	// DNS domain was undeleted.
+	DNS_WARNING_DOMAIN_UNDELETED = 0x25F4,
+	// The directory service is unavailable.
+	DNS_ERROR_DS_UNAVAILABLE = 0x25F5,
+	// DNS zone already exists in the directory service.
+	DNS_ERROR_DS_ZONE_ALREADY_EXISTS = 0x25F6,
+	// DNS server not creating or reading the boot file for the directory service integrated DNS zone.
+	DNS_ERROR_NO_BOOTFILE_IF_DS_ZONE = 0x25F7,
+	// Node is a DNAME DNS record.
+	DNS_ERROR_NODE_IS_DNAME = 0x25F8,
+	// A DNAME record already exists for given name.
+	DNS_ERROR_DNAME_COLLISION = 0x25F9,
+	// An alias loop has been detected with either CNAME or DNAME records.
+	DNS_ERROR_ALIAS_LOOP = 0x25FA,
+	// DNS AXFR (zone transfer) complete.
+	DNS_INFO_AXFR_COMPLETE = 0x2617,
+	// DNS zone transfer failed.
+	DNS_ERROR_AXFR = 0x2618,
+	// Added local WINS server.
+	DNS_INFO_ADDED_LOCAL_WINS = 0x2619,
+	// Secure update call needs to continue update request.
+	DNS_STATUS_CONTINUE_NEEDED = 0x2649,
+	// TCP/IP network protocol not installed.
+	DNS_ERROR_NO_TCPIP = 0x267B,
+	// No DNS servers configured for local system.
+	DNS_ERROR_NO_DNS_SERVERS = 0x267C,
+	// The specified directory partition does not exist.
+	DNS_ERROR_DP_DOES_NOT_EXIST = 0x26AD,
+	// The specified directory partition already exists.
+	DNS_ERROR_DP_ALREADY_EXISTS = 0x26AE,
+	// This DNS server is not enlisted in the specified directory partition.
+	DNS_ERROR_DP_NOT_ENLISTED = 0x26AF,
+	// This DNS server is already enlisted in the specified directory partition.
+	DNS_ERROR_DP_ALREADY_ENLISTED = 0x26B0,
+	// The directory partition is not available at this time. Please wait a few minutes and try again.
+	DNS_ERROR_DP_NOT_AVAILABLE = 0x26B1,
+	// The operation failed because the domain naming master FSMO role could not be reached. The domain controller holding the domain naming master FSMO role is down or unable to service the request or is not running Windows Server 2003 or later.
+	DNS_ERROR_DP_FSMO_ERROR = 0x26B2,
+	// A blocking operation was interrupted by a call to WSACancelBlockingCall.
+	WSAEINTR = 0x2714,
+	// The file handle supplied is not valid.
+	WSAEBADF = 0x2719,
+	// An attempt was made to access a socket in a way forbidden by its access permissions.
+	WSAEACCES = 0x271D,
+	// The system detected an invalid pointer address in attempting to use a pointer argument in a call.
+	WSAEFAULT = 0x271E,
+	// An invalid argument was supplied.
+	WSAEINVAL = 0x2726,
+	// Too many open sockets.
+	WSAEMFILE = 0x2728,
+	// A non-blocking socket operation could not be completed immediately.
+	WSAEWOULDBLOCK = 0x2733,
+	// A blocking operation is currently executing.
+	WSAEINPROGRESS = 0x2734,
+	// An operation was attempted on a non-blocking socket that already had an operation in progress.
+	WSAEALREADY = 0x2735,
+	// An operation was attempted on something that is not a socket.
+	WSAENOTSOCK = 0x2736,
+	// A required address was omitted from an operation on a socket.
+	WSAEDESTADDRREQ = 0x2737,
+	// A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.
+	WSAEMSGSIZE = 0x2738,
+	// A protocol was specified in the socket function call that does not support the semantics of the socket type requested.
+	WSAEPROTOTYPE = 0x2739,
+	// An unknown, invalid, or unsupported option or level was specified in a getsockopt or setsockopt call.
+	WSAENOPROTOOPT = 0x273A,
+	// The requested protocol has not been configured into the system, or no implementation for it exists.
+	WSAEPROTONOSUPPORT = 0x273B,
+	// The support for the specified socket type does not exist in this address family.
+	WSAESOCKTNOSUPPORT = 0x273C,
+	// The attempted operation is not supported for the type of object referenced.
+	WSAEOPNOTSUPP = 0x273D,
+	// The protocol family has not been configured into the system or no implementation for it exists.
+	WSAEPFNOSUPPORT = 0x273E,
+	// An address incompatible with the requested protocol was used.
+	WSAEAFNOSUPPORT = 0x273F,
+	// Only one usage of each socket address (protocol/network address/port) is normally permitted.
+	WSAEADDRINUSE = 0x2740,
+	// The requested address is not valid in its context.
+	WSAEADDRNOTAVAIL = 0x2741,
+	// A socket operation encountered a dead network.
+	WSAENETDOWN = 0x2742,
+	// A socket operation was attempted to an unreachable network.
+	WSAENETUNREACH = 0x2743,
+	// The connection has been broken due to keep-alive activity detecting a failure while the operation was in progress.
+	WSAENETRESET = 0x2744,
+	// An established connection was aborted by the software in your host machine.
+	WSAECONNABORTED = 0x2745,
+	// An existing connection was forcibly closed by the remote host.
+	WSAECONNRESET = 0x2746,
+	// An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
+	WSAENOBUFS = 0x2747,
+	// A connect request was made on an already connected socket.
+	WSAEISCONN = 0x2748,
+	// A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied.
+	WSAENOTCONN = 0x2749,
+	// A request to send or receive data was disallowed because the socket had already been shut down in that direction with a previous shutdown call.
+	WSAESHUTDOWN = 0x274A,
+	// Too many references to some kernel object.
+	WSAETOOMANYREFS = 0x274B,
+	// A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
+	WSAETIMEDOUT = 0x274C,
+	// No connection could be made because the target machine actively refused it.
+	WSAECONNREFUSED = 0x274D,
+	// Cannot translate name.
+	WSAELOOP = 0x274E,
+	// Name component or name was too long.
+	WSAENAMETOOLONG = 0x274F,
+	// A socket operation failed because the destination host was down.
+	WSAEHOSTDOWN = 0x2750,
+	// A socket operation was attempted to an unreachable host.
+	WSAEHOSTUNREACH = 0x2751,
+	// Cannot remove a directory that is not empty.
+	WSAENOTEMPTY = 0x2752,
+	// A Windows Sockets implementation may have a limit on the number of applications that may use it simultaneously.
+	WSAEPROCLIM = 0x2753,
+	// Ran out of quota.
+	WSAEUSERS = 0x2754,
+	// Ran out of disk quota.
+	WSAEDQUOT = 0x2755,
+	// File handle reference is no longer available.
+	WSAESTALE = 0x2756,
+	// Item is not available locally.
+	WSAEREMOTE = 0x2757,
+	// WSAStartup cannot function at this time because the underlying system it uses to provide network services is currently unavailable. = = 0x276C,
+	WSASYSNOTREADY = 0x276B, // The Windows Sockets version requested is not supported.
+ // Either the application has not called WSAStartup, or WSAStartup failed.
+	WSANOTINITIALISED = 0x276D,
+	// Returned by WSARecv or WSARecvFrom to indicate the remote party has initiated a graceful shutdown sequence.
+	WSAEDISCON = 0x2775,
+	// No more results can be returned by WSALookupServiceNext.
+	WSAENOMORE = 0x2776,
+	// A call to WSALookupServiceEnd was made while this call was still processing. The call has been canceled.
+	WSAECANCELLED = 0x2777,
+	// The procedure call table is invalid.
+	WSAEINVALIDPROCTABLE = 0x2778,
+	// The requested service provider is invalid.
+	WSAEINVALIDPROVIDER = 0x2779,
+	// The requested service provider could not be loaded or initialized.
+	WSAEPROVIDERFAILEDINIT = 0x277A,
+	// A system call has failed.
+	WSASYSCALLFAILURE = 0x277B,
+	// No such service is known. The service cannot be found in the specified name space.
+	WSASERVICE_NOT_FOUND = 0x277C,
+	// The specified class was not found.
+	WSATYPE_NOT_FOUND = 0x277D,
+	// No more results can be returned by WSALookupServiceNext.
+	WSA_E_NO_MORE = 0x277E,
+	// A call to WSALookupServiceEnd was made while this call was still processing. The call has been canceled.
+	WSA_E_CANCELLED = 0x277F,
+	// A database query failed because it was actively refused.
+	WSAEREFUSED = 0x2780,
+	// No such host is known.
+	WSAHOST_NOT_FOUND = 0x2AF9,
+	// This is usually a temporary error during hostname resolution and means that the local server did not receive a response from an authoritative server.
+	WSATRY_AGAIN = 0x2AFA,
+	// A non-recoverable error occurred during a database lookup.
+	WSANO_RECOVERY = 0x2AFB,
+	// The requested name is valid, but no data of the requested type was found.
+	WSANO_DATA = 0x2AFC,
+	// At least one reserve has arrived.
+	WSA_QOS_RECEIVERS = 0x2AFD,
+	// At least one path has arrived.
+	WSA_QOS_SENDERS = 0x2AFE,
+	// There are no senders.
+	WSA_QOS_NO_SENDERS = 0x2AFF,
+	// There are no receivers.
+	WSA_QOS_NO_RECEIVERS = 0x2B00,
+	// Reserve has been confirmed.
+	WSA_QOS_REQUEST_CONFIRMED = 0x2B01,
+	// Error due to lack of resources.
+	WSA_QOS_ADMISSION_FAILURE = 0x2B02,
+	// Rejected for administrative reasons - bad credentials.
+	WSA_QOS_POLICY_FAILURE = 0x2B03,
+	// Unknown or conflicting style.
+	WSA_QOS_BAD_STYLE = 0x2B04,
+	// Problem with some part of the filterspec or providerspecific buffer in general.
+	WSA_QOS_BAD_OBJECT = 0x2B05,
+	// Problem with some part of the flowspec.
+	WSA_QOS_TRAFFIC_CTRL_ERROR = 0x2B06,
+	// General QOS error.
+	WSA_QOS_GENERIC_ERROR = 0x2B07,
+	// An invalid or unrecognized service type was found in the flowspec.
+	WSA_QOS_ESERVICETYPE = 0x2B08,
+	// An invalid or inconsistent flowspec was found in the QOS structure.
+	WSA_QOS_EFLOWSPEC = 0x2B09,
+	// Invalid QOS provider-specific buffer.
+	WSA_QOS_EPROVSPECBUF = 0x2B0A,
+	// An invalid QOS filter style was used.
+	WSA_QOS_EFILTERSTYLE = 0x2B0B,
+	// An invalid QOS filter type was used.
+	WSA_QOS_EFILTERTYPE = 0x2B0C,
+	// An incorrect number of QOS FILTERSPECs were specified in the FLOWDESCRIPTOR.
+	WSA_QOS_EFILTERCOUNT = 0x2B0D,
+	// An object with an invalid ObjectLength field was specified in the QOS provider-specific buffer.
+	WSA_QOS_EOBJLENGTH = 0x2B0E,
+	// An incorrect number of flow descriptors was specified in the QOS structure.
+	WSA_QOS_EFLOWCOUNT = 0x2B0F,
+	// An unrecognized object was found in the QOS provider-specific buffer.
+	WSA_QOS_EUNKOWNPSOBJ = 0x2B10,
+	// An invalid policy object was found in the QOS provider-specific buffer.
+	WSA_QOS_EPOLICYOBJ = 0x2B11,
+	// An invalid QOS flow descriptor was found in the flow descriptor list.
+	WSA_QOS_EFLOWDESC = 0x2B12,
+	// An invalid or inconsistent flowspec was found in the QOS provider specific buffer.
+	WSA_QOS_EPSFLOWSPEC = 0x2B13,
+	// An invalid FILTERSPEC was found in the QOS provider-specific buffer.
+	WSA_QOS_EPSFILTERSPEC = 0x2B14,
+	// An invalid shape discard mode object was found in the QOS provider specific buffer.
+	WSA_QOS_ESDMODEOBJ = 0x2B15,
+	// An invalid shaping rate object was found in the QOS provider-specific buffer.
+	WSA_QOS_ESHAPERATEOBJ = 0x2B16,
+	// A reserved policy element was found in the QOS provider-specific buffer.
+	WSA_QOS_RESERVED_PETYPE = 0x2B17,
+	// No such host is known securely.
+	WSA_SECURE_HOST_NOT_FOUND = 0x2B18,
+	// Name based IPSEC policy could not be added.
+	WSA_IPSEC_NAME_POLICY_ERROR = 0x2B19,
+
+	// See Internet Error Codes and WinInet.h.
+	INTERNET_ = 0x2EE0,
+	// See WinHTTP Error Codes and Winhttp.h.
+	WINHTTP_ = 0x2EE1,
+	// The specified quick mode policy already exists.
+	IPSEC_QM_POLICY_EXISTS = 0x32C8,
+	// The specified quick mode policy was not found.
+	IPSEC_QM_POLICY_NOT_FOUND = 0x32C9,
+	// The specified quick mode policy is being used.
+	IPSEC_QM_POLICY_IN_USE = 0x32CA,
+	// The specified main mode policy already exists.
+	IPSEC_MM_POLICY_EXISTS = 0x32CB,
+	// The specified main mode policy was not found.
+	IPSEC_MM_POLICY_NOT_FOUND = 0x32CC,
+	// The specified main mode policy is being used.
+	IPSEC_MM_POLICY_IN_USE = 0x32CD,
+	// The specified main mode filter already exists.
+	IPSEC_MM_FILTER_EXISTS = 0x32CE,
+	// The specified main mode filter was not found.
+	IPSEC_MM_FILTER_NOT_FOUND = 0x32CF,
+	// The specified transport mode filter already exists.
+	IPSEC_TRANSPORT_FILTER_EXISTS = 0x32D0,
+	// The specified transport mode filter does not exist.
+	IPSEC_TRANSPORT_FILTER_NOT_FOUND = 0x32D1,
+	// The specified main mode authentication list exists.
+	IPSEC_MM_AUTH_EXISTS = 0x32D2,
+	// The specified main mode authentication list was not found.
+	IPSEC_MM_AUTH_NOT_FOUND = 0x32D3,
+	// The specified main mode authentication list is being used.
+	IPSEC_MM_AUTH_IN_USE = 0x32D4,
+	// The specified default main mode policy was not found.
+	IPSEC_DEFAULT_MM_POLICY_NOT_FOUND = 0x32D5,
+	// The specified default main mode authentication list was not found.
+	IPSEC_DEFAULT_MM_AUTH_NOT_FOUND = 0x32D6,
+	// The specified default quick mode policy was not found.
+	IPSEC_DEFAULT_QM_POLICY_NOT_FOUND = 0x32D7,
+	// The specified tunnel mode filter exists.
+	IPSEC_TUNNEL_FILTER_EXISTS = 0x32D8,
+	// The specified tunnel mode filter was not found.
+	IPSEC_TUNNEL_FILTER_NOT_FOUND = 0x32D9,
+	// The Main Mode filter is pending deletion.
+	IPSEC_MM_FILTER_PENDING_DELETION = 0x32DA,
+	// The transport filter is pending deletion.
+	IPSEC_TRANSPORT_FILTER_PENDING_DELETION = 0x32DB,
+	// The tunnel filter is pending deletion.
+	IPSEC_TUNNEL_FILTER_PENDING_DELETION = 0x32DC,
+	// The Main Mode policy is pending deletion.
+	IPSEC_MM_POLICY_PENDING_DELETION = 0x32DD,
+	// The Main Mode authentication bundle is pending deletion.
+	IPSEC_MM_AUTH_PENDING_DELETION = 0x32DE,
+	// The Quick Mode policy is pending deletion.
+	IPSEC_QM_POLICY_PENDING_DELETION = 0x32DF,
+	// The Main Mode policy was successfully added, but some of the requested offers are not supported.
+	WARNING_IPSEC_MM_POLICY_PRUNED = 0x32E0,
+	// The Quick Mode policy was successfully added, but some of the requested offers are not supported.
+	WARNING_IPSEC_QM_POLICY_PRUNED = 0x32E1,
+	// IPSEC_IKE_NEG_STATUS_BEGIN = = 0x35E9,
+	IPSEC_IKE_NEG_STATUS_BEGIN = 0x35E8, // IKE authentication credentials are unacceptable.
+ // IKE security attributes are unacceptable.
+	IPSEC_IKE_ATTRIB_FAIL = 0x35EA,
+	// IKE Negotiation in progress.
+	IPSEC_IKE_NEGOTIATION_PENDING = 0x35EB,
+	// General processing error.
+	IPSEC_IKE_GENERAL_PROCESSING_ERROR = 0x35EC,
+	// Negotiation timed out.
+	IPSEC_IKE_TIMED_OUT = 0x35ED,
+	// IKE failed to find valid machine certificate. Contact your Network Security Administrator about installing a valid certificate in the appropriate Certificate Store.
+	IPSEC_IKE_NO_CERT = 0x35EE,
+	// IKE SA deleted by peer before establishment completed.
+	IPSEC_IKE_SA_DELETED = 0x35EF,
+	// IKE SA deleted before establishment completed.
+	IPSEC_IKE_SA_REAPED = 0x35F0,
+	// Negotiation request sat in Queue too long.
+	IPSEC_IKE_MM_ACQUIRE_DROP = 0x35F1,
+	// Negotiation request sat in Queue too long.
+	IPSEC_IKE_QM_ACQUIRE_DROP = 0x35F2,
+	// Negotiation request sat in Queue too long.
+	IPSEC_IKE_QUEUE_DROP_MM = 0x35F3,
+	// Negotiation request sat in Queue too long.
+	IPSEC_IKE_QUEUE_DROP_NO_MM = 0x35F4,
+	// No response from peer.
+	IPSEC_IKE_DROP_NO_RESPONSE = 0x35F5,
+	// Negotiation took too long.
+	IPSEC_IKE_MM_DELAY_DROP = 0x35F6,
+	// Negotiation took too long.
+	IPSEC_IKE_QM_DELAY_DROP = 0x35F7,
+	// Unknown error occurred.
+	IPSEC_IKE_ERROR = 0x35F8,
+	// Certificate Revocation Check failed.
+	IPSEC_IKE_CRL_FAILED = 0x35F9,
+	// Invalid certificate key usage.
+	IPSEC_IKE_INVALID_KEY_USAGE = 0x35FA,
+	// Invalid certificate type.
+	IPSEC_IKE_INVALID_CERT_TYPE = 0x35FB,
+	// IKE negotiation failed because the machine certificate used does not have a private key. IPsec certificates require a private key. Contact your Network Security administrator about replacing with a certificate that has a private key.
+	IPSEC_IKE_NO_PRIVATE_KEY = 0x35FC,
+	// Simultaneous rekeys were detected.
+	IPSEC_IKE_SIMULTANEOUS_REKEY = 0x35FD,
+	// Failure in Diffie-Hellman computation.
+	IPSEC_IKE_DH_FAIL = 0x35FE,
+	// Don't know how to process critical payload.
+	IPSEC_IKE_CRITICAL_PAYLOAD_NOT_RECOGNIZED = 0x35FF,
+	// Invalid header.
+	IPSEC_IKE_INVALID_HEADER = 0x3600,
+	// No policy configured.
+	IPSEC_IKE_NO_POLICY = 0x3601,
+	// Failed to verify signature.
+	IPSEC_IKE_INVALID_SIGNATURE = 0x3602,
+	// Failed to authenticate using Kerberos.
+	IPSEC_IKE_KERBEROS_ERROR = 0x3603,
+	// Peer's certificate did not have a public key.
+	IPSEC_IKE_NO_PUBLIC_KEY = 0x3604,
+	// Error processing error payload.
+	IPSEC_IKE_PROCESS_ERR = 0x3605,
+	// Error processing SA payload.
+	IPSEC_IKE_PROCESS_ERR_SA = 0x3606,
+	// Error processing Proposal payload.
+	IPSEC_IKE_PROCESS_ERR_PROP = 0x3607,
+	// Error processing Transform payload.
+	IPSEC_IKE_PROCESS_ERR_TRANS = 0x3608,
+	// Error processing KE payload.
+	IPSEC_IKE_PROCESS_ERR_KE = 0x3609,
+	// Error processing ID payload.
+	IPSEC_IKE_PROCESS_ERR_ID = 0x360A,
+	// Error processing Cert payload.
+	IPSEC_IKE_PROCESS_ERR_CERT = 0x360B,
+	// Error processing Certificate Request payload.
+	IPSEC_IKE_PROCESS_ERR_CERT_REQ = 0x360C,
+	// Error processing Hash payload.
+	IPSEC_IKE_PROCESS_ERR_HASH = 0x360D,
+	// Error processing Signature payload.
+	IPSEC_IKE_PROCESS_ERR_SIG = 0x360E,
+	// Error processing Nonce payload.
+	IPSEC_IKE_PROCESS_ERR_NONCE = 0x360F,
+	// Error processing Notify payload.
+	IPSEC_IKE_PROCESS_ERR_NOTIFY = 0x3610,
+	// Error processing Delete Payload.
+	IPSEC_IKE_PROCESS_ERR_DELETE = 0x3611,
+	// Error processing VendorId payload.
+	IPSEC_IKE_PROCESS_ERR_VENDOR = 0x3612,
+	// Invalid payload received.
+	IPSEC_IKE_INVALID_PAYLOAD = 0x3613,
+	// Soft SA loaded.
+	IPSEC_IKE_LOAD_SOFT_SA = 0x3614,
+	// Soft SA torn down.
+	IPSEC_IKE_SOFT_SA_TORN_DOWN = 0x3615,
+	// Invalid cookie received.
+	IPSEC_IKE_INVALID_COOKIE = 0x3616,
+	// Peer failed to send valid machine certificate.
+	IPSEC_IKE_NO_PEER_CERT = 0x3617,
+	// Certification Revocation check of peer's certificate failed.
+	IPSEC_IKE_PEER_CRL_FAILED = 0x3618,
+	// New policy invalidated SAs formed with old policy.
+	IPSEC_IKE_POLICY_CHANGE = 0x3619,
+	// There is no available Main Mode IKE policy.
+	IPSEC_IKE_NO_MM_POLICY = 0x361A,
+	// Failed to enabled TCB privilege.
+	IPSEC_IKE_NOTCBPRIV = 0x361B,
+	// Failed to load SECURITY.DLL.
+	IPSEC_IKE_SECLOADFAIL = 0x361C,
+	// Failed to obtain security function table dispatch address from SSPI.
+	IPSEC_IKE_FAILSSPINIT = 0x361D,
+	// Failed to query Kerberos package to obtain max token size.
+	IPSEC_IKE_FAILQUERYSSP = 0x361E,
+	// Failed to obtain Kerberos server credentials for ISAKMP/ERROR_IPSEC_IKE service. Kerberos authentication will not function. The most likely reason for this is lack of domain membership. This is normal if your computer is a member of a workgroup.
+	IPSEC_IKE_SRVACQFAIL = 0x361F,
+	// Failed to determine SSPI principal name for ISAKMP/ERROR_IPSEC_IKE service (QueryCredentialsAttributes).
+	IPSEC_IKE_SRVQUERYCRED = 0x3620,
+	// Failed to obtain new SPI for the inbound SA from IPsec driver. The most common cause for this is that the driver does not have the correct filter. Check your policy to verify the filters.
+	IPSEC_IKE_GETSPIFAIL = 0x3621,
+	// Given filter is invalid.
+	IPSEC_IKE_INVALID_FILTER = 0x3622,
+	// Memory allocation failed.
+	IPSEC_IKE_OUT_OF_MEMORY = 0x3623,
+	// Failed to add Security Association to IPsec Driver. The most common cause for this is if the IKE negotiation took too long to complete. If the problem persists, reduce the load on the faulting machine.
+	IPSEC_IKE_ADD_UPDATE_KEY_FAILED = 0x3624,
+	// Invalid policy.
+	IPSEC_IKE_INVALID_POLICY = 0x3625,
+	// Invalid DOI.
+	IPSEC_IKE_UNKNOWN_DOI = 0x3626,
+	// Invalid situation.
+	IPSEC_IKE_INVALID_SITUATION = 0x3627,
+	// Diffie-Hellman failure.
+	IPSEC_IKE_DH_FAILURE = 0x3628,
+	// Invalid Diffie-Hellman group.
+	IPSEC_IKE_INVALID_GROUP = 0x3629,
+	// Error encrypting payload.
+	IPSEC_IKE_ENCRYPT = 0x362A,
+	// Error decrypting payload.
+	IPSEC_IKE_DECRYPT = 0x362B,
+	// Policy match error.
+	IPSEC_IKE_POLICY_MATCH = 0x362C,
+	// Unsupported ID.
+	IPSEC_IKE_UNSUPPORTED_ID = 0x362D,
+	// Hash verification failed.
+	IPSEC_IKE_INVALID_HASH = 0x362E,
+	// Invalid hash algorithm.
+	IPSEC_IKE_INVALID_HASH_ALG = 0x362F,
+	// Invalid hash size.
+	IPSEC_IKE_INVALID_HASH_SIZE = 0x3630,
+	// Invalid encryption algorithm.
+	IPSEC_IKE_INVALID_ENCRYPT_ALG = 0x3631,
+	// Invalid authentication algorithm.
+	IPSEC_IKE_INVALID_AUTH_ALG = 0x3632,
+	// Invalid certificate signature.
+	IPSEC_IKE_INVALID_SIG = 0x3633,
+	// Load failed.
+	IPSEC_IKE_LOAD_FAILED = 0x3634,
+	// Deleted via RPC call.
+	IPSEC_IKE_RPC_DELETE = 0x3635,
+	// Temporary state created to perform reinitialization. This is not a real failure.
+	IPSEC_IKE_BENIGN_REINIT = 0x3636,
+	// The lifetime value received in the Responder Lifetime Notify is below the Windows 2000 configured minimum value. Please fix the policy on the peer machine.
+	IPSEC_IKE_INVALID_RESPONDER_LIFETIME_NOTIFY = 0x3637,
+	// The recipient cannot handle version of IKE specified in the header.
+	IPSEC_IKE_INVALID_MAJOR_VERSION = 0x3638,
+	// Key length in certificate is too small for configured security requirements.
+	IPSEC_IKE_INVALID_CERT_KEYLEN = 0x3639,
+	// Max number of established MM SAs to peer exceeded.
+	IPSEC_IKE_MM_LIMIT = 0x363A,
+	// IKE received a policy that disables negotiation.
+	IPSEC_IKE_NEGOTIATION_DISABLED = 0x363B,
+	// Reached maximum quick mode limit for the main mode. New main mode will be started.
+	IPSEC_IKE_QM_LIMIT = 0x363C,
+	// Main mode SA lifetime expired or peer sent a main mode delete.
+	IPSEC_IKE_MM_EXPIRED = 0x363D,
+	// Main mode SA assumed to be invalid because peer stopped responding.
+	IPSEC_IKE_PEER_MM_ASSUMED_INVALID = 0x363E,
+	// Certificate doesn't chain to a trusted root in IPsec policy.
+	IPSEC_IKE_CERT_CHAIN_POLICY_MISMATCH = 0x363F,
+	// Received unexpected message ID.
+	IPSEC_IKE_UNEXPECTED_MESSAGE_ID = 0x3640,
+	// Received invalid authentication offers.
+	IPSEC_IKE_INVALID_AUTH_PAYLOAD = 0x3641,
+	// Sent DoS cookie notify to initiator.
+	IPSEC_IKE_DOS_COOKIE_SENT = 0x3642,
+	// IKE service is shutting down.
+	IPSEC_IKE_SHUTTING_DOWN = 0x3643,
+	// Could not verify binding between CGA address and certificate.
+	IPSEC_IKE_CGA_AUTH_FAILED = 0x3644,
+	// Error processing NatOA payload.
+	IPSEC_IKE_PROCESS_ERR_NATOA = 0x3645,
+	// Parameters of the main mode are invalid for this quick mode.
+	IPSEC_IKE_INVALID_MM_FOR_QM = 0x3646,
+	// Quick mode SA was expired by IPsec driver.
+	IPSEC_IKE_QM_EXPIRED = 0x3647,
+	// Too many dynamically added IKEEXT filters were detected.
+	IPSEC_IKE_TOO_MANY_FILTERS = 0x3648,
+	// IPSEC_IKE_NEG_STATUS_END = = 0x364A,
+	IPSEC_IKE_NEG_STATUS_END = 0x3649, // NAP reauth succeeded and must delete the dummy NAP IKEv2 tunnel.
+ // Error in assigning inner IP address to initiator in tunnel mode.
+	IPSEC_IKE_INNER_IP_ASSIGNMENT_FAILURE = 0x364B,
+	// Require configuration payload missing.
+	IPSEC_IKE_REQUIRE_CP_PAYLOAD_MISSING = 0x364C,
+	// A negotiation running as the security principle who issued the connection is in progress.
+	IPSEC_KEY_MODULE_IMPERSONATION_NEGOTIATION_PENDING = 0x364D,
+	// SA was deleted due to IKEv1/AuthIP co-existence suppress check.
+	IPSEC_IKE_COEXISTENCE_SUPPRESS = 0x364E,
+	// Incoming SA request was dropped due to peer IP address rate limiting.
+	IPSEC_IKE_RATELIMIT_DROP = 0x364F,
+	// Peer does not support MOBIKE.
+	IPSEC_IKE_PEER_DOESNT_SUPPORT_MOBIKE = 0x3650,
+	// SA establishment is not authorized.
+	IPSEC_IKE_AUTHORIZATION_FAILURE = 0x3651,
+	// SA establishment is not authorized because there is not a sufficiently strong PKINIT-based credential.
+	IPSEC_IKE_STRONG_CRED_AUTHORIZATION_FAILURE = 0x3652,
+	// SA establishment is not authorized. You may need to enter updated or different credentials such as a smartcard.
+	IPSEC_IKE_AUTHORIZATION_FAILURE_WITH_OPTIONAL_RETRY = 0x3653,
+	// SA establishment is not authorized because there is not a sufficiently strong PKINIT-based credential. This might be related to certificate-to-account mapping failure for the SA.
+	IPSEC_IKE_STRONG_CRED_AUTHORIZATION_AND_CERTMAP_FAILURE = 0x3654,
+	// IPSEC_IKE_NEG_STATUS_EXTENDED_END = = 0x3656,
+	IPSEC_IKE_NEG_STATUS_EXTENDED_END = 0x3655, // The SPI in the packet does not match a valid IPsec SA.
+ // Packet was received on an IPsec SA whose lifetime has expired.
+	IPSEC_SA_LIFETIME_EXPIRED = 0x3657,
+	// Packet was received on an IPsec SA that does not match the packet characteristics.
+	IPSEC_WRONG_SA = 0x3658,
+	// Packet sequence number replay check failed.
+	IPSEC_REPLAY_CHECK_FAILED = 0x3659,
+	// IPsec header and/or trailer in the packet is invalid.
+	IPSEC_INVALID_PACKET = 0x365A,
+	// IPsec integrity check failed.
+	IPSEC_INTEGRITY_CHECK_FAILED = 0x365B,
+	// IPsec dropped a clear text packet.
+	IPSEC_CLEAR_TEXT_DROP = 0x365C,
+	// IPsec dropped an incoming ESP packet in authenticated firewall mode. This drop is benign.
+	IPSEC_AUTH_FIREWALL_DROP = 0x365D,
+	// IPsec dropped a packet due to DoS throttling.
+	IPSEC_THROTTLE_DROP = 0x365E,
+	// IPsec DoS Protection matched an explicit block rule.
+	IPSEC_DOSP_BLOCK = 0x3665,
+	// IPsec DoS Protection received an IPsec specific multicast packet which is not allowed.
+	IPSEC_DOSP_RECEIVED_MULTICAST = 0x3666,
+	// IPsec DoS Protection received an incorrectly formatted packet.
+	IPSEC_DOSP_INVALID_PACKET = 0x3667,
+	// IPsec DoS Protection failed to look up state.
+	IPSEC_DOSP_STATE_LOOKUP_FAILED = 0x3668,
+	// IPsec DoS Protection failed to create state because the maximum number of entries allowed by policy has been reached.
+	IPSEC_DOSP_MAX_ENTRIES = 0x3669,
+	// IPsec DoS Protection received an IPsec negotiation packet for a keying module which is not allowed by policy.
+	IPSEC_DOSP_KEYMOD_NOT_ALLOWED = 0x366A,
+	// IPsec DoS Protection has not been enabled.
+	IPSEC_DOSP_NOT_INSTALLED = 0x366B,
+	// IPsec DoS Protection failed to create a per internal IP rate limit queue because the maximum number of queues allowed by policy has been reached.
+	IPSEC_DOSP_MAX_PER_IP_RATELIMIT_QUEUES = 0x366C,
+	// The requested section was not present in the activation context.
+	SXS_SECTION_NOT_FOUND = 0x36B0,
+	// The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log or use the command-line sxstrace.exe tool for more detail.
+	SXS_CANT_GEN_ACTCTX = 0x36B1,
+	// The application binding data format is invalid.
+	SXS_INVALID_ACTCTXDATA_FORMAT = 0x36B2,
+	// The referenced assembly is not installed on your system.
+	SXS_ASSEMBLY_NOT_FOUND = 0x36B3,
+	// The manifest file does not begin with the required tag and format information.
+	SXS_MANIFEST_FORMAT_ERROR = 0x36B4,
+	// The manifest file contains one or more syntax errors.
+	SXS_MANIFEST_PARSE_ERROR = 0x36B5,
+	// The application attempted to activate a disabled activation context.
+	SXS_ACTIVATION_CONTEXT_DISABLED = 0x36B6,
+	// The requested lookup key was not found in any active activation context.
+	SXS_KEY_NOT_FOUND = 0x36B7,
+	// A component version required by the application conflicts with another component version already active.
+	SXS_VERSION_CONFLICT = 0x36B8,
+	// The type requested activation context section does not match the query API used.
+	SXS_WRONG_SECTION_TYPE = 0x36B9,
+	// Lack of system resources has required isolated activation to be disabled for the current thread of execution.
+	SXS_THREAD_QUERIES_DISABLED = 0x36BA,
+	// An attempt to set the process default activation context failed because the process default activation context was already set.
+	SXS_PROCESS_DEFAULT_ALREADY_SET = 0x36BB,
+	// The encoding group identifier specified is not recognized.
+	SXS_UNKNOWN_ENCODING_GROUP = 0x36BC,
+	// The encoding requested is not recognized.
+	SXS_UNKNOWN_ENCODING = 0x36BD,
+	// The manifest contains a reference to an invalid URI.
+	SXS_INVALID_XML_NAMESPACE_URI = 0x36BE,
+	// The application manifest contains a reference to a dependent assembly which is not installed.
+	SXS_ROOT_MANIFEST_DEPENDENCY_NOT_INSTALLED = 0x36BF,
+	// The manifest for an assembly used by the application has a reference to a dependent assembly which is not installed.
+	SXS_LEAF_MANIFEST_DEPENDENCY_NOT_INSTALLED = 0x36C0,
+	// The manifest contains an attribute for the assembly identity which is not valid.
+	SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE = 0x36C1,
+	// The manifest is missing the required default namespace specification on the assembly element.
+	SXS_MANIFEST_MISSING_REQUIRED_DEFAULT_NAMESPACE = 0x36C2,
+	// The manifest has a default namespace specified on the assembly element but its value is not "urn:schemas-microsoft-com:asm.v1".
+	SXS_MANIFEST_INVALID_REQUIRED_DEFAULT_NAMESPACE = 0x36C3,
+	// The private manifest probed has crossed a path with an unsupported reparse point.
+	SXS_PRIVATE_MANIFEST_CROSS_PATH_WITH_REPARSE_POINT = 0x36C4,
+	// Two or more components referenced directly or indirectly by the application manifest have files by the same name.
+	SXS_DUPLICATE_DLL_NAME = 0x36C5,
+	// Two or more components referenced directly or indirectly by the application manifest have window classes with the same name.
+	SXS_DUPLICATE_WINDOWCLASS_NAME = 0x36C6,
+	// Two or more components referenced directly or indirectly by the application manifest have the same COM server CLSIDs.
+	SXS_DUPLICATE_CLSID = 0x36C7,
+	// Two or more components referenced directly or indirectly by the application manifest have proxies for the same COM interface IIDs.
+	SXS_DUPLICATE_IID = 0x36C8,
+	// Two or more components referenced directly or indirectly by the application manifest have the same COM type library TLBIDs.
+	SXS_DUPLICATE_TLBID = 0x36C9,
+	// Two or more components referenced directly or indirectly by the application manifest have the same COM ProgIDs.
+	SXS_DUPLICATE_PROGID = 0x36CA,
+	// Two or more components referenced directly or indirectly by the application manifest are different versions of the same component which is not permitted.
+	SXS_DUPLICATE_ASSEMBLY_NAME = 0x36CB,
+	// A component's file does not match the verification information present in the component manifest.
+	SXS_FILE_HASH_MISMATCH = 0x36CC,
+	// The policy manifest contains one or more syntax errors.
+	SXS_POLICY_PARSE_ERROR = 0x36CD,
+	// Manifest Parse Error : A string literal was expected, but no opening quote character was found.
+	SXS_XML_E_MISSINGQUOTE = 0x36CE,
+	// Manifest Parse Error : Incorrect syntax was used in a comment.
+	SXS_XML_E_COMMENTSYNTAX = 0x36CF,
+	// Manifest Parse Error : A name was started with an invalid character.
+	SXS_XML_E_BADSTARTNAMECHAR = 0x36D0,
+	// Manifest Parse Error : A name contained an invalid character.
+	SXS_XML_E_BADNAMECHAR = 0x36D1,
+	// Manifest Parse Error : A string literal contained an invalid character.
+	SXS_XML_E_BADCHARINSTRING = 0x36D2,
+	// Manifest Parse Error : Invalid syntax for an xml declaration.
+	SXS_XML_E_XMLDECLSYNTAX = 0x36D3,
+	// Manifest Parse Error : An Invalid character was found in text content.
+	SXS_XML_E_BADCHARDATA = 0x36D4,
+	// Manifest Parse Error : Required white space was missing.
+	SXS_XML_E_MISSINGWHITESPACE = 0x36D5,
+	// Manifest Parse Error : The character '>' was expected.
+	SXS_XML_E_EXPECTINGTAGEND = 0x36D6,
+	// Manifest Parse Error : A semi colon character was expected.
+	SXS_XML_E_MISSINGSEMICOLON = 0x36D7,
+	// Manifest Parse Error : Unbalanced parentheses.
+	SXS_XML_E_UNBALANCEDPAREN = 0x36D8,
+	// Manifest Parse Error : Internal error.
+	SXS_XML_E_INTERNALERROR = 0x36D9,
+	// Manifest Parse Error : Whitespace is not allowed at this location.
+	SXS_XML_E_UNEXPECTED_WHITESPACE = 0x36DA,
+	// Manifest Parse Error : End of file reached in invalid state for current encoding.
+	SXS_XML_E_INCOMPLETE_ENCODING = 0x36DB,
+	// Manifest Parse Error : Missing parenthesis.
+	SXS_XML_E_MISSING_PAREN = 0x36DC,
+	// Manifest Parse Error : A single or double closing quote character (\' or \") is missing.
+	SXS_XML_E_EXPECTINGCLOSEQUOTE = 0x36DD,
+	// Manifest Parse Error : Multiple colons are not allowed in a name.
+	SXS_XML_E_MULTIPLE_COLONS = 0x36DE,
+	// Manifest Parse Error : Invalid character for decimal digit.
+	SXS_XML_E_INVALID_DECIMAL = 0x36DF,
+	// Manifest Parse Error : Invalid character for hexadecimal digit.
+	SXS_XML_E_INVALID_HEXIDECIMAL = 0x36E0,
+	// Manifest Parse Error : Invalid unicode character value for this platform.
+	SXS_XML_E_INVALID_UNICODE = 0x36E1,
+	// Manifest Parse Error : Expecting whitespace or '?'.
+	SXS_XML_E_WHITESPACEORQUESTIONMARK = 0x36E2,
+	// Manifest Parse Error : End tag was not expected at this location.
+	SXS_XML_E_UNEXPECTEDENDTAG = 0x36E3,
+	// Manifest Parse Error : The following tags were not closed: %1.
+	SXS_XML_E_UNCLOSEDTAG = 0x36E4,
+	// Manifest Parse Error : Duplicate attribute.
+	SXS_XML_E_DUPLICATEATTRIBUTE = 0x36E5,
+	// Manifest Parse Error : Only one top level element is allowed in an XML document.
+	SXS_XML_E_MULTIPLEROOTS = 0x36E6,
+	// Manifest Parse Error : Invalid at the top level of the document.
+	SXS_XML_E_INVALIDATROOTLEVEL = 0x36E7,
+	// Manifest Parse Error : Invalid xml declaration.
+	SXS_XML_E_BADXMLDECL = 0x36E8,
+	// Manifest Parse Error : XML document must have a top level element.
+	SXS_XML_E_MISSINGROOT = 0x36E9,
+	// Manifest Parse Error : Unexpected end of file.
+	SXS_XML_E_UNEXPECTEDEOF = 0x36EA,
+	// Manifest Parse Error : Parameter entities cannot be used inside markup declarations in an internal subset.
+	SXS_XML_E_BADPEREFINSUBSET = 0x36EB,
+	// Manifest Parse Error : Element was not closed.
+	SXS_XML_E_UNCLOSEDSTARTTAG = 0x36EC,
+	// Manifest Parse Error : End element was missing the character '>'.
+	SXS_XML_E_UNCLOSEDENDTAG = 0x36ED,
+	// Manifest Parse Error : A string literal was not closed.
+	SXS_XML_E_UNCLOSEDSTRING = 0x36EE,
+	// Manifest Parse Error : A comment was not closed.
+	SXS_XML_E_UNCLOSEDCOMMENT = 0x36EF,
+	// Manifest Parse Error : A declaration was not closed.
+	SXS_XML_E_UNCLOSEDDECL = 0x36F0,
+	// Manifest Parse Error : A CDATA section was not closed.
+	SXS_XML_E_UNCLOSEDCDATA = 0x36F1,
+	// Manifest Parse Error : The namespace prefix is not allowed to start with the reserved string "xml".
+	SXS_XML_E_RESERVEDNAMESPACE = 0x36F2,
+	// Manifest Parse Error : System does not support the specified encoding.
+	SXS_XML_E_INVALIDENCODING = 0x36F3,
+	// Manifest Parse Error : Switch from current encoding to specified encoding not supported.
+	SXS_XML_E_INVALIDSWITCH = 0x36F4,
+	// Manifest Parse Error : The name 'xml' is reserved and must be lower case.
+	SXS_XML_E_BADXMLCASE = 0x36F5,
+	// Manifest Parse Error : The standalone attribute must have the value 'yes' or 'no'.
+	SXS_XML_E_INVALID_STANDALONE = 0x36F6,
+	// Manifest Parse Error : The standalone attribute cannot be used in external entities.
+	SXS_XML_E_UNEXPECTED_STANDALONE = 0x36F7,
+	// Manifest Parse Error : Invalid version number.
+	SXS_XML_E_INVALID_VERSION = 0x36F8,
+	// Manifest Parse Error : Missing equals sign between attribute and attribute value.
+	SXS_XML_E_MISSINGEQUALS = 0x36F9,
+	// Assembly Protection Error : Unable to recover the specified assembly.
+	SXS_PROTECTION_RECOVERY_FAILED = 0x36FA,
+	// Assembly Protection Error : The public key for an assembly was too short to be allowed.
+	SXS_PROTECTION_PUBLIC_KEY_TOO_SHORT = 0x36FB,
+	// Assembly Protection Error : The catalog for an assembly is not valid, or does not match the assembly's manifest.
+	SXS_PROTECTION_CATALOG_NOT_VALID = 0x36FC,
+	// An HRESULT could not be translated to a corresponding Win32 error code.
+	SXS_UNTRANSLATABLE_HRESULT = 0x36FD,
+	// Assembly Protection Error : The catalog for an assembly is missing.
+	SXS_PROTECTION_CATALOG_FILE_MISSING = 0x36FE,
+	// The supplied assembly identity is missing one or more attributes which must be present in this context.
+	SXS_MISSING_ASSEMBLY_IDENTITY_ATTRIBUTE = 0x36FF,
+	// The supplied assembly identity has one or more attribute names that contain characters not permitted in XML names.
+	SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME = 0x3700,
+	// The referenced assembly could not be found.
+	SXS_ASSEMBLY_MISSING = 0x3701,
+	// The activation context activation stack for the running thread of execution is corrupt.
+	SXS_CORRUPT_ACTIVATION_STACK = 0x3702,
+	// The application isolation metadata for this process or thread has become corrupt.
+	SXS_CORRUPTION = 0x3703,
+	// The activation context being deactivated is not the most recently activated one.
+	SXS_EARLY_DEACTIVATION = 0x3704,
+	// The activation context being deactivated is not active for the current thread of execution.
+	SXS_INVALID_DEACTIVATION = 0x3705,
+	// The activation context being deactivated has already been deactivated.
+	SXS_MULTIPLE_DEACTIVATION = 0x3706,
+	// A component used by the isolation facility has requested to terminate the process.
+	SXS_PROCESS_TERMINATION_REQUESTED = 0x3707,
+	// A kernel mode component is releasing a reference on an activation context.
+	SXS_RELEASE_ACTIVATION_CONTEXT = 0x3708,
+	// The activation context of system default assembly could not be generated.
+	SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY = 0x3709,
+	// The value of an attribute in an identity is not within the legal range.
+	SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE = 0x370A,
+	// The name of an attribute in an identity is not within the legal range.
+	SXS_INVALID_IDENTITY_ATTRIBUTE_NAME = 0x370B,
+	// An identity contains two definitions for the same attribute.
+	SXS_IDENTITY_DUPLICATE_ATTRIBUTE = 0x370C,
+	// The identity string is malformed. This may be due to a trailing comma, more than two unnamed attributes, missing attribute name or missing attribute value.
+	SXS_IDENTITY_PARSE_ERROR = 0x370D,
+	// A string containing localized substitutable content was malformed. Either a dollar sign ($) was followed by something other than a left parenthesis or another dollar sign or an substitution's right parenthesis was not found.
+	MALFORMED_SUBSTITUTION_STRING = 0x370E,
+	// The public key token does not correspond to the public key specified.
+	SXS_INCORRECT_PUBLIC_KEY_TOKEN = 0x370F,
+	// A substitution string had no mapping.
+	UNMAPPED_SUBSTITUTION_STRING = 0x3710,
+	// The component must be locked before making the request.
+	SXS_ASSEMBLY_NOT_LOCKED = 0x3711,
+	// The component store has been corrupted.
+	SXS_COMPONENT_STORE_CORRUPT = 0x3712,
+	// An advanced installer failed during setup or servicing.
+	ADVANCED_INSTALLER_FAILED = 0x3713,
+	// The character encoding in the XML declaration did not match the encoding used in the document.
+	XML_ENCODING_MISMATCH = 0x3714,
+	// The identities of the manifests are identical but their contents are different.
+	SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT = 0x3715,
+	// The component identities are different.
+	SXS_IDENTITIES_DIFFERENT = 0x3716,
+	// The assembly is not a deployment.
+	SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT = 0x3717,
+	// The file is not a part of the assembly.
+	SXS_FILE_NOT_PART_OF_ASSEMBLY = 0x3718,
+	// The size of the manifest exceeds the maximum allowed.
+	SXS_MANIFEST_TOO_BIG = 0x3719,
+	// The setting is not registered.
+	SXS_SETTING_NOT_REGISTERED = 0x371A,
+	// One or more required members of the transaction are not present.
+	SXS_TRANSACTION_CLOSURE_INCOMPLETE = 0x371B,
+	// The SMI primitive installer failed during setup or servicing.
+	SMI_PRIMITIVE_INSTALLER_FAILED = 0x371C,
+	// A generic command executable returned a result that indicates failure.
+	GENERIC_COMMAND_FAILED = 0x371D,
+	// A component is missing file verification information in its manifest.
+	SXS_FILE_HASH_MISSING = 0x371E,
+	// The specified channel path is invalid.
+	EVT_INVALID_CHANNEL_PATH = 0x3A98,
+	// The specified query is invalid.
+	EVT_INVALID_QUERY = 0x3A99,
+	// The publisher metadata cannot be found in the resource.
+	EVT_PUBLISHER_METADATA_NOT_FOUND = 0x3A9A,
+	// The template for an event definition cannot be found in the resource (error = %1).
+	EVT_EVENT_TEMPLATE_NOT_FOUND = 0x3A9B,
+	// The specified publisher name is invalid.
+	EVT_INVALID_PUBLISHER_NAME = 0x3A9C,
+	// The event data raised by the publisher is not compatible with the event template definition in the publisher's manifest.
+	EVT_INVALID_EVENT_DATA = 0x3A9D,
+	// The specified channel could not be found. Check channel configuration.
+	EVT_CHANNEL_NOT_FOUND = 0x3A9F,
+	// The specified xml text was not well-formed. See Extended Error for more details.
+	EVT_MALFORMED_XML_TEXT = 0x3AA0,
+	// The caller is trying to subscribe to a direct channel which is not allowed. The events for a direct channel go directly to a logfile and cannot be subscribed to.
+	EVT_SUBSCRIPTION_TO_DIRECT_CHANNEL = 0x3AA1,
+	// Configuration error.
+	EVT_CONFIGURATION_ERROR = 0x3AA2,
+	// The query result is stale / invalid. This may be due to the log being cleared or rolling over after the query result was created. Users should handle this code by releasing the query result object and reissuing the query.
+	EVT_QUERY_RESULT_STALE = 0x3AA3,
+	// Query result is currently at an invalid position.
+	EVT_QUERY_RESULT_INVALID_POSITION = 0x3AA4,
+	// Registered MSXML doesn't support validation.
+	EVT_NON_VALIDATING_MSXML = 0x3AA5,
+	// An expression can only be followed by a change of scope operation if it itself evaluates to a node set and is not already part of some other change of scope operation.
+	EVT_FILTER_ALREADYSCOPED = 0x3AA6,
+	// Can't perform a step operation from a term that does not represent an element set.
+	EVT_FILTER_NOTELTSET = 0x3AA7,
+	// Left hand side arguments to binary operators must be either attributes, nodes or variables and right hand side arguments must be constants.
+	EVT_FILTER_INVARG = 0x3AA8,
+	// A step operation must involve either a node test or, in the case of a predicate, an algebraic expression against which to test each node in the node set identified by the preceeding node set can be evaluated.
+	EVT_FILTER_INVTEST = 0x3AA9,
+	// This data type is currently unsupported.
+	EVT_FILTER_INVTYPE = 0x3AAA,
+	// A syntax error occurred at position %1!d!.
+	EVT_FILTER_PARSEERR = 0x3AAB,
+	// This operator is unsupported by this implementation of the filter.
+	EVT_FILTER_UNSUPPORTEDOP = 0x3AAC,
+	// The token encountered was unexpected.
+	EVT_FILTER_UNEXPECTEDTOKEN = 0x3AAD,
+	// The requested operation cannot be performed over an enabled direct channel. The channel must first be disabled before performing the requested operation.
+	EVT_INVALID_OPERATION_OVER_ENABLED_DIRECT_CHANNEL = 0x3AAE,
+	// Channel property %1!s! contains invalid value. The value has invalid type, is outside of valid range, can't be updated or is not supported by this type of channel.
+	EVT_INVALID_CHANNEL_PROPERTY_VALUE = 0x3AAF,
+	// Publisher property %1!s! contains invalid value. The value has invalid type, is outside of valid range, can't be updated or is not supported by this type of publisher.
+	EVT_INVALID_PUBLISHER_PROPERTY_VALUE = 0x3AB0,
+	// The channel fails to activate.
+	EVT_CHANNEL_CANNOT_ACTIVATE = 0x3AB1,
+	// The xpath expression exceeded supported complexity. Please symplify it or split it into two or more simple expressions.
+	EVT_FILTER_TOO_COMPLEX = 0x3AB2,
+	// the message resource is present but the message is not found in the string/message table.
+	EVT_MESSAGE_NOT_FOUND = 0x3AB3,
+	// The message id for the desired message could not be found.
+	EVT_MESSAGE_ID_NOT_FOUND = 0x3AB4,
+	// The substitution string for insert index (%1) could not be found.
+	EVT_UNRESOLVED_VALUE_INSERT = 0x3AB5,
+	// The description string for parameter reference (%1) could not be found.
+	EVT_UNRESOLVED_PARAMETER_INSERT = 0x3AB6,
+	// The maximum number of replacements has been reached.
+	EVT_MAX_INSERTS_REACHED = 0x3AB7,
+	// The event definition could not be found for event id (%1).
+	EVT_EVENT_DEFINITION_NOT_FOUND = 0x3AB8,
+	// The locale specific resource for the desired message is not present.
+	EVT_MESSAGE_LOCALE_NOT_FOUND = 0x3AB9,
+	// The resource is too old to be compatible.
+	EVT_VERSION_TOO_OLD = 0x3ABA,
+	// The resource is too new to be compatible.
+	EVT_VERSION_TOO_NEW = 0x3ABB,
+	// The channel at index %1!d! of the query can't be opened.
+	EVT_CANNOT_OPEN_CHANNEL_OF_QUERY = 0x3ABC,
+	// The publisher has been disabled and its resource is not available. This usually occurs when the publisher is in the process of being uninstalled or upgraded.
+	EVT_PUBLISHER_DISABLED = 0x3ABD,
+	// Attempted to create a numeric type that is outside of its valid range.
+	EVT_FILTER_OUT_OF_RANGE = 0x3ABE,
+	// The subscription fails to activate.
+	EC_SUBSCRIPTION_CANNOT_ACTIVATE = 0x3AE8,
+	// The log of the subscription is in disabled state, and cannot be used to forward events to. The log must first be enabled before the subscription can be activated.
+	EC_LOG_DISABLED = 0x3AE9,
+	// When forwarding events from local machine to itself, the query of the subscription can't contain target log of the subscription.
+	EC_CIRCULAR_FORWARDING = 0x3AEA,
+	// The credential store that is used to save credentials is full.
+	EC_CREDSTORE_FULL = 0x3AEB,
+	// The credential used by this subscription can't be found in credential store.
+	EC_CRED_NOT_FOUND = 0x3AEC,
+	// No active channel is found for the query.
+	EC_NO_ACTIVE_CHANNEL = 0x3AED,
+	// The resource loader failed to find MUI file.
+	MUI_FILE_NOT_FOUND = 0x3AFC,
+	// The resource loader failed to load MUI file because the file fail to pass validation.
+	MUI_INVALID_FILE = 0x3AFD,
+	// The RC Manifest is corrupted with garbage data or unsupported version or missing required item.
+	MUI_INVALID_RC_CONFIG = 0x3AFE,
+	// The RC Manifest has invalid culture name.
+	MUI_INVALID_LOCALE_NAME = 0x3AFF,
+	// The RC Manifest has invalid ultimatefallback name.
+	MUI_INVALID_ULTIMATEFALLBACK_NAME = 0x3B00,
+	// The resource loader cache doesn't have loaded MUI entry.
+	MUI_FILE_NOT_LOADED = 0x3B01,
+	// User stopped resource enumeration.
+	RESOURCE_ENUM_USER_STOP = 0x3B02,
+	// UI language installation failed.
+	MUI_INTLSETTINGS_UILANG_NOT_INSTALLED = 0x3B03,
+	// Locale installation failed.
+	MUI_INTLSETTINGS_INVALID_LOCALE_NAME = 0x3B04,
+	// A resource does not have default or neutral value.
+	MRM_RUNTIME_NO_DEFAULT_OR_NEUTRAL_RESOURCE = 0x3B06,
+	// Invalid PRI config file.
+	MRM_INVALID_PRICONFIG = 0x3B07,
+	// Invalid file type.
+	MRM_INVALID_FILE_TYPE = 0x3B08,
+	// Unknown qualifier.
+	MRM_UNKNOWN_QUALIFIER = 0x3B09,
+	// Invalid qualifier value.
+	MRM_INVALID_QUALIFIER_VALUE = 0x3B0A,
+	// No Candidate found.
+	MRM_NO_CANDIDATE = 0x3B0B,
+	// The ResourceMap or NamedResource has an item that does not have default or neutral resource..
+	MRM_NO_MATCH_OR_DEFAULT_CANDIDATE = 0x3B0C,
+	// Invalid ResourceCandidate type.
+	MRM_RESOURCE_TYPE_MISMATCH = 0x3B0D,
+	// Duplicate Resource Map.
+	MRM_DUPLICATE_MAP_NAME = 0x3B0E,
+	// Duplicate Entry.
+	MRM_DUPLICATE_ENTRY = 0x3B0F,
+	// Invalid Resource Identifier.
+	MRM_INVALID_RESOURCE_IDENTIFIER = 0x3B10,
+	// Filepath too long.
+	MRM_FILEPATH_TOO_LONG = 0x3B11,
+	// Unsupported directory type.
+	MRM_UNSUPPORTED_DIRECTORY_TYPE = 0x3B12,
+	// Invalid PRI File.
+	MRM_INVALID_PRI_FILE = 0x3B16,
+	// NamedResource Not Found.
+	MRM_NAMED_RESOURCE_NOT_FOUND = 0x3B17,
+	// ResourceMap Not Found.
+	MRM_MAP_NOT_FOUND = 0x3B1F,
+	// Unsupported MRT profile type.
+	MRM_UNSUPPORTED_PROFILE_TYPE = 0x3B20,
+	// Invalid qualifier operator.
+	MRM_INVALID_QUALIFIER_OPERATOR = 0x3B21,
+	// Unable to determine qualifier value or qualifier value has not been set.
+	MRM_INDETERMINATE_QUALIFIER_VALUE = 0x3B22,
+	// Automerge is enabled in the PRI file.
+	MRM_AUTOMERGE_ENABLED = 0x3B23,
+	// Too many resources defined for package.
+	MRM_TOO_MANY_RESOURCES = 0x3B24,
+	// The monitor returned a DDC/CI capabilities string that did not comply with the ACCESS.bus 3.0, DDC/CI 1.1 or MCCS 2 Revision 1 specification.
+	MCA_INVALID_CAPABILITIES_STRING = 0x3B60,
+	// The monitor's VCP Version (0xDF) VCP code returned an invalid version value.
+	MCA_INVALID_VCP_VERSION = 0x3B61,
+	// The monitor does not comply with the MCCS specification it claims to support.
+	MCA_MONITOR_VIOLATES_MCCS_SPECIFICATION = 0x3B62,
+	// The MCCS version in a monitor's mccs_ver capability does not match the MCCS version the monitor reports when the VCP Version (0xDF) VCP code is used.
+	MCA_MCCS_VERSION_MISMATCH = 0x3B63,
+	// The Monitor Configuration API only works with monitors that support the MCCS 1.0 specification, MCCS 2.0 specification or the MCCS 2.0 Revision 1 specification.
+	MCA_UNSUPPORTED_MCCS_VERSION = 0x3B64,
+	// An internal Monitor Configuration API error occurred.
+	MCA_INTERNAL_ERROR = 0x3B65,
+	// The monitor returned an invalid monitor technology type. CRT, Plasma and LCD (TFT) are examples of monitor technology types. This error implies that the monitor violated the MCCS 2.0 or MCCS 2.0 Revision 1 specification.
+	MCA_INVALID_TECHNOLOGY_TYPE_RETURNED = 0x3B66,
+	// The caller of SetMonitorColorTemperature specified a color temperature that the current monitor did not support. This error implies that the monitor violated the MCCS 2.0 or MCCS 2.0 Revision 1 specification.
+	MCA_UNSUPPORTED_COLOR_TEMPERATURE = 0x3B67,
+	// The requested system device cannot be identified due to multiple indistinguishable devices potentially matching the identification criteria.
+	AMBIGUOUS_SYSTEM_DEVICE = 0x3B92,
+	// The requested system device cannot be found.
+	SYSTEM_DEVICE_NOT_FOUND = 0x3BC3,
+	// Hash generation for the specified hash version and hash type is not enabled on the server.
+	HASH_NOT_SUPPORTED = 0x3BC4,
+	// The hash requested from the server is not available or no longer valid.
+	HASH_NOT_PRESENT = 0x3BC5,
+	// The secondary interrupt controller instance that manages the specified interrupt is not registered.
+	SECONDARY_IC_PROVIDER_NOT_REGISTERED = 0x3BD9,
+	// The information supplied by the GPIO client driver is invalid.
+	GPIO_CLIENT_INFORMATION_INVALID = 0x3BDA,
+	// The version specified by the GPIO client driver is not supported.
+	GPIO_VERSION_NOT_SUPPORTED = 0x3BDB,
+	// The registration packet supplied by the GPIO client driver is not valid.
+	GPIO_INVALID_REGISTRATION_PACKET = 0x3BDC,
+	// The requested operation is not supported for the specified handle.
+	GPIO_OPERATION_DENIED = 0x3BDD,
+	// The requested connect mode conflicts with an existing mode on one or more of the specified pins.
+	GPIO_INCOMPATIBLE_CONNECT_MODE = 0x3BDE,
+	// The interrupt requested to be unmasked is not masked.
+	GPIO_INTERRUPT_ALREADY_UNMASKED = 0x3BDF,
+	// The requested run level switch cannot be completed successfully.
+	CANNOT_SWITCH_RUNLEVEL = 0x3C28,
+	// The service has an invalid run level setting. The run level for a service must not be higher than the run level of its dependent services.
+	INVALID_RUNLEVEL_SETTING = 0x3C29,
+	// The requested run level switch cannot be completed successfully since one or more services will not stop or restart within the specified timeout.
+	RUNLEVEL_SWITCH_TIMEOUT = 0x3C2A,
+	// A run level switch agent did not respond within the specified timeout.
+	RUNLEVEL_SWITCH_AGENT_TIMEOUT = 0x3C2B,
+	// A run level switch is currently in progress.
+	RUNLEVEL_SWITCH_IN_PROGRESS = 0x3C2C,
+	// One or more services failed to start during the service startup phase of a run level switch.
+	SERVICES_FAILED_AUTOSTART = 0x3C2D,
+	// The task stop request cannot be completed immediately since task needs more time to shutdown.
+	COM_TASK_STOP_PENDING = 0x3C8D,
+	// Package could not be opened.
+	INSTALL_OPEN_PACKAGE_FAILED = 0x3CF0,
+	// Package was not found.
+	INSTALL_PACKAGE_NOT_FOUND = 0x3CF1,
+	// Package data is invalid.
+	INSTALL_INVALID_PACKAGE = 0x3CF2,
+	// Package failed updates, dependency or conflict validation.
+	INSTALL_RESOLVE_DEPENDENCY_FAILED = 0x3CF3,
+	// There is not enough disk space on your computer. Please free up some space and try again.
+	INSTALL_OUT_OF_DISK_SPACE = 0x3CF4,
+	// There was a problem downloading your product.
+	INSTALL_NETWORK_FAILURE = 0x3CF5,
+	// Package could not be registered.
+	INSTALL_REGISTRATION_FAILURE = 0x3CF6,
+	// Package could not be unregistered.
+	INSTALL_DEREGISTRATION_FAILURE = 0x3CF7,
+	// User cancelled the install request.
+	INSTALL_CANCEL = 0x3CF8,
+	// Install failed. Please contact your software vendor.
+	INSTALL_FAILED = 0x3CF9,
+	// Removal failed. Please contact your software vendor.
+	REMOVE_FAILED = 0x3CFA,
+	// The provided package is already installed, and reinstallation of the package was blocked. Check the AppXDeployment-Server event log for details.
+	PACKAGE_ALREADY_EXISTS = 0x3CFB,
+	// The application cannot be started. Try reinstalling the application to fix the problem.
+	NEEDS_REMEDIATION = 0x3CFC,
+	// A Prerequisite for an install could not be satisfied.
+	INSTALL_PREREQUISITE_FAILED = 0x3CFD,
+	// The package repository is corrupted.
+	PACKAGE_REPOSITORY_CORRUPTED = 0x3CFE,
+	// To install this application you need either a Windows developer license or a sideloading-enabled system.
+	INSTALL_POLICY_FAILURE = 0x3CFF,
+	// The application cannot be started because it is currently updating.
+	PACKAGE_UPDATING = 0x3D00,
+	// The package deployment operation is blocked by policy. Please contact your system administrator.
+	DEPLOYMENT_BLOCKED_BY_POLICY = 0x3D01,
+	// The package could not be installed because resources it modifies are currently in use.
+	PACKAGES_IN_USE = 0x3D02,
+	// The package could not be recovered because necessary data for recovery have been corrupted.
+	RECOVERY_FILE_CORRUPT = 0x3D03,
+	// The signature is invalid. To register in developer mode, AppxSignature.p7x and AppxBlockMap.xml must be valid or should not be present.
+	INVALID_STAGED_SIGNATURE = 0x3D04,
+	// An error occurred while deleting the package's previously existing application data.
+	DELETING_EXISTING_APPLICATIONDATA_STORE_FAILED = 0x3D05,
+	// The package could not be installed because a higher version of this package is already installed.
+	INSTALL_PACKAGE_DOWNGRADE = 0x3D06,
+	// An error in a system binary was detected. Try refreshing the PC to fix the problem.
+	SYSTEM_NEEDS_REMEDIATION = 0x3D07,
+	// A corrupted CLR NGEN binary was detected on the system.
+	APPX_INTEGRITY_FAILURE_CLR_NGEN = 0x3D08,
+	// The operation could not be resumed because necessary data for recovery have been corrupted.
+	RESILIENCY_FILE_CORRUPT = 0x3D09,
+	// The package could not be installed because the Windows Firewall service is not running. Enable the Windows Firewall service and try again.
+	INSTALL_FIREWALL_SERVICE_NOT_RUNNING = 0x3D0A,
+	// The process has no package identity.
+	APPMODEL_ERROR_NO_PACKAGE = 0x3D54,
+	// The package runtime information is corrupted.
+	APPMODEL_ERROR_PACKAGE_RUNTIME_CORRUPT = 0x3D55,
+	// The package identity is corrupted.
+	APPMODEL_ERROR_PACKAGE_IDENTITY_CORRUPT = 0x3D56,
+	// The process has no application identity.
+	APPMODEL_ERROR_NO_APPLICATION = 0x3D57,
+	// Loading the state store failed.
+	STATE_LOAD_STORE_FAILED = 0x3DB8,
+	// Retrieving the state version for the application failed.
+	STATE_GET_VERSION_FAILED = 0x3DB9,
+	// Setting the state version for the application failed.
+	STATE_SET_VERSION_FAILED = 0x3DBA,
+	// Resetting the structured state of the application failed.
+	STATE_STRUCTURED_RESET_FAILED = 0x3DBB,
+	// State Manager failed to open the container.
+	STATE_OPEN_CONTAINER_FAILED = 0x3DBC,
+	// State Manager failed to create the container.
+	STATE_CREATE_CONTAINER_FAILED = 0x3DBD,
+	// State Manager failed to delete the container.
+	STATE_DELETE_CONTAINER_FAILED = 0x3DBE,
+	// State Manager failed to read the setting.
+	STATE_READ_SETTING_FAILED = 0x3DBF,
+	// State Manager failed to write the setting.
+	STATE_WRITE_SETTING_FAILED = 0x3DC0,
+	// State Manager failed to delete the setting.
+	STATE_DELETE_SETTING_FAILED = 0x3DC1,
+	// State Manager failed to query the setting.
+	STATE_QUERY_SETTING_FAILED = 0x3DC2,
+	// State Manager failed to read the composite setting.
+	STATE_READ_COMPOSITE_SETTING_FAILED = 0x3DC3,
+	// State Manager failed to write the composite setting.
+	STATE_WRITE_COMPOSITE_SETTING_FAILED = 0x3DC4,
+	// State Manager failed to enumerate the containers.
+	STATE_ENUMERATE_CONTAINER_FAILED = 0x3DC5,
+	// State Manager failed to enumerate the settings.
+	STATE_ENUMERATE_SETTINGS_FAILED = 0x3DC6,
+	// The size of the state manager composite setting value has exceeded the limit.
+	STATE_COMPOSITE_SETTING_VALUE_SIZE_LIMIT_EXCEEDED = 0x3DC7,
+	// The size of the state manager setting value has exceeded the limit.
+	STATE_SETTING_VALUE_SIZE_LIMIT_EXCEEDED = 0x3DC8,
+	// The length of the state manager setting name has exceeded the limit.
+	STATE_SETTING_NAME_SIZE_LIMIT_EXCEEDED = 0x3DC9,
+	// The length of the state manager container name has exceeded the limit.
+	STATE_CONTAINER_NAME_SIZE_LIMIT_EXCEEDED = 0x3DCA,
+	// This API cannot be used in the context of the caller's application type.
+	API_UNAVAILABLE = 0x3DE1,
+}

+ 1 - 1
core/sys/windows/winmm.odin

@@ -5,7 +5,7 @@ foreign import winmm "system:Winmm.lib"
 
 MMRESULT :: UINT
 
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign winmm {
 	timeGetDevCaps  :: proc(ptc: LPTIMECAPS, cbtc: UINT) -> MMRESULT ---
 	timeBeginPeriod :: proc(uPeriod: UINT) -> MMRESULT ---

+ 1 - 1
core/sys/windows/ws2_32.odin

@@ -56,7 +56,7 @@ Example Load:
 */
 
 foreign import ws2_32 "system:Ws2_32.lib"
-@(default_calling_convention="stdcall")
+@(default_calling_convention="system")
 foreign ws2_32 {
 	// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsastartup)
 	WSAStartup :: proc(wVersionRequested: WORD, lpWSAData: LPWSADATA) -> c_int ---

Some files were not shown because too many files changed in this diff