diff --git a/.gitignore b/.gitignore
index fbbc1e8..cd5c3cc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,5 +8,9 @@ rom/*
# Debugging
config/options.tal
+src/repl/routines.tal
src/debugger/routines/after-eval.tal
src/debugger/routines/before-eval.tal
+src/repl/data.tal
+src/talos/main.tal
+src/talos/macros.tal
diff --git a/build.sh b/build.sh
index ece79a3..7b26184 100755
--- a/build.sh
+++ b/build.sh
@@ -66,15 +66,20 @@ if [ -z "$DEBUG" ]; then
DEBUG="NO_DBG"
fi
-# Sorry
-cpp -P -w -D $DEBUG config/options.talp -o config/options.tal
-cpp -P -w -D $DEBUG src/debugger/routines/after-eval.talp \
- -o src/debugger/routines/after-eval.tal
-cpp -P -w -D $DEBUG src/debugger/routines/before-eval.talp \
- -o src/debugger/routines/before-eval.tal
-cpp -P -w -D $DEBUG src/repl/data.talp -o src/repl/data.tal
-cpp -P -w -D $DEBUG src/talos/main.talp -o src/talos/main.tal
-cpp -P -w -D $DEBUG src/talos/macros.talp -o src/talos/macros.tal
+jinja2 --format yaml config/options.tal.tpl \
+ -o config/options.tal config.yaml
+jinja2 --format yaml src/repl/routines.tal.tpl \
+ -o src/repl/routines.tal config.yaml
+jinja2 --format yaml src/debugger/routines/after-eval.tal.tpl \
+ -o src/debugger/routines/after-eval.tal config.yaml
+jinja2 --format yaml src/debugger/routines/before-eval.tal.tpl \
+ -o src/debugger/routines/before-eval.tal config.yaml
+jinja2 --format yaml src/repl/data.tal.tpl \
+ -o src/repl/data.tal config.yaml
+jinja2 --format yaml src/talos/main.tal.tpl \
+ -o src/talos/main.tal config.yaml
+jinja2 --format yaml src/talos/macros.tal.tpl \
+ -o src/talos/macros.tal config.yaml
# Build
mkdir -p rom
diff --git a/config.yaml b/config.yaml
new file mode 100644
index 0000000..4066db4
--- /dev/null
+++ b/config.yaml
@@ -0,0 +1,64 @@
+print_banner: true # Print TalOS banner on startup.
+ansi_escapes: false # Support for ANSI escape sequences.
+redstone_device: true # Define MineCraft's Redstone device.
+
+logger:
+ level: debug # From least to most verbose: `off` `info` `warn` or `debug`.
+
+ info:
+ stacks: true # Print stacks after each evaluation.
+ prompt: true # Print the heap's `head` pointer inside the prompt.
+ summary: true # Print the assembled definition summary.
+
+ warn:
+ abort: true # Warn each time an evaluation is aborted.
+ redef: true # Warn on each redefinition.
+
+ debug:
+ input: false # Print the input buffer.
+ length: false # Print the assembled bytecode `length`.
+ head: false # Print the head bytecode.
+ head_ptr: false # Print the head pointer.
+ tail: false # Print the tail symbols.
+ tail_ptr: false # Print the tail pointer.
+
+theme:
+ # RGB in decimal.
+ tui:
+ red:
+ # 16-bit 32-bit Decimal
+ # Default: 3ce9 33ccee99 (51, 204, 238, 153)
+ background: 51
+ foreground: 204
+ emphasis: 238
+ error: 153
+
+ green:
+ # 16-bit 32-bit Decimal
+ # Default: 0b75 00bb7755 (0, 187, 119, 34)
+ background: 0
+ foreground: 187
+ emphasis: 119
+ error: 85
+
+ blue:
+ # 16-bit 32-bit Decimal
+ # Default: 2b59 22bb5599 (34, 187, 55, 68)
+ background: 34
+ foreground: 187
+ emphasis: 55
+ error: 153
+
+ # RGB in hexadecimal.
+ gui:
+ # Default
+ # 16-bit 24-bit Decimal
+ # background #302 #330022 (51, 0, 34)
+ # |foreground #cbb #ccbbbb (204, 187, 187)
+ # ||emphasis #e75 #ee7755 (238, 119, 55)
+ # |||error #959 #995599 (153, 0, 68)
+ # ||||
+ # vvvv )
+ red: 3ce9
+ green: 0b75
+ blue: 2b59
diff --git a/config/options.tal.tpl b/config/options.tal.tpl
new file mode 100644
index 0000000..3d2ae06
--- /dev/null
+++ b/config/options.tal.tpl
@@ -0,0 +1,33 @@
+{% if print_banner %}ENABLE{% else %}DISABLE{% endif %} @PRINT-BANNER
+
+( GUI )
+%\RED { #{{ theme.gui.red }} }
+%\GREEN { #{{ theme.gui.green }} }
+%\BLUE { #{{ theme.gui.blue }} }
+
+( TUI )
+%\BACKGROUND { "{{ theme.tui.red.background }}; "{{ theme.tui.green.background }}; "{{ theme.tui.blue.background }} }
+%\FOREGROUND { "{{ theme.tui.red.foreground }}; "{{ theme.tui.green.foreground }}; "{{ theme.tui.blue.foreground }} }
+%\EMPHASIS { "{{ theme.tui.red.emphasis }}; "{{ theme.tui.green.emphasis }}; "{{ theme.tui.blue.emphasis }} }
+%\ERROR { "{{ theme.tui.red.error }}; "{{ theme.tui.green.error }}; "{{ theme.tui.blue.error }} }
+
+( LOGGER )
+{{ logger.level | upper }} @LOG-LEVEL
+
+( INFO )
+{% if logger.info.stacks %}ENABLE{% else %}DISABLE{% endif %} @INFO-STACKS
+{% if logger.info.prompt %}ENABLE{% else %}DISABLE{% endif %} @INFO-PROMPT
+{% if logger.info.summary %}ENABLE{% else %}DISABLE{% endif %} @INFO-SUMMARY
+
+( WARN )
+{% if logger.warn.abort %}ENABLE{% else %}DISABLE{% endif %} @WARN-ABORT
+{% if logger.warn.redef %}ENABLE{% else %}DISABLE{% endif %} @WARN-REDEF
+{% if logger.level == "debug" %}
+( DEBUG )
+{% if logger.debug.length %}ENABLE{% else %}DISABLE{% endif %} @DEBUG-LENGTH
+{% if logger.debug.head_ptr %}ENABLE{% else %}DISABLE{% endif %} @DEBUG-HEAD-PTR
+{% if logger.debug.tail_ptr %}ENABLE{% else %}DISABLE{% endif %} @DEBUG-TAIL-PTR
+{% if logger.debug.input %}ENABLE{% else %}DISABLE{% endif %} @DEBUG-INPUT
+{% if logger.debug.heap %}ENABLE{% else %}DISABLE{% endif %} @DEBUG-HEAD
+{% if logger.debug.symbols %}ENABLE{% else %}DISABLE{% endif %} @DEBUG-TAIL
+{% endif %}
\ No newline at end of file
diff --git a/config/options.talp b/config/options.talp
deleted file mode 100644
index cad919b..0000000
--- a/config/options.talp
+++ /dev/null
@@ -1,69 +0,0 @@
-( @|options )
-
-( &|colors
-
-Default Theme Colors:
- color 0: #302 #330022 (51, 0, 34) Dark Purple Background Dark Theme
- color 1: #cbb #ccbbbb (204, 187, 187) Light Grey Foreground
- color 2: #e75 #ee7755 (238, 119, 55) Light Red High Emphasis
- color 3: #959 #995599 (153, 85, 153) Light Purple Normal Emphasis
- color 4: #424 #442244 (68, 34, 68) Mid Purple Background Light Theme
-
- GUI Screen
- color-0
- |color-1
- ||color-2
- |||color-3
- ||||
- vvvv )
-%\RED { #3ce9 }
-%\GREEN { #0b75 }
-%\BLUE { #2b59 }
-
-( TUI Screen
- RED GREEN BLUE )
-%DARK-PURPLE { "51; "0; "34 }
-%LIGHT-GREY { "204; "187; "187 }
-%LIGHT-RED { "238; "119; "55 }
-%LIGHT-PURPLE { "153; "85; "153 }
-%MID-PURPLE { "68; "34; "68 }
-
-%\color-0 { DARK-PURPLE }
-%\color-1 { LIGHT-GREY }
-%\color-2 { LIGHT-RED }
-%\color-3 { LIGHT-PURPLE }
-
-
-( &|config
-
-All the options accept: `ENABLE` or `DISABLE`, except for `LOG-LEVEL` which
-accepts from least to most verbose: `OFF`, `INFO`, `WARN` or `DEBUG`.
-
- VALUE OPTION
-****************************************************************************** )
-ENABLE @PRINT-BANNER ( print TalOS banner on startup )
-( ENABLE @LOG-FILE ( log session to a file ) )
-
-(
-&|logger )
-DEBUG @LOG-LEVEL ( valid values: OFF INFO WARN DEBUG ( most verbose ) )
-
-ENABLE @INFO-STACKS ( print stacks after each evaluation )
-DISABLE @INFO-PROMPT ( print the heap's `head` pointer inside the prompt )
-DISABLE @INFO-ASSEMBLER-SUMMARY ( print the assembled definition summary )
-
-ENABLE @WARN-ABORT ( warn each time an evaluation is aborted )
-ENABLE @WARN-REDEFINITION ( warn on each redefinition )
-(
- ENABLE @WARN-LOW-MEMORY ( warn when there are less than 512 free bytes )
- ENABLE @WARN-LOW-MEMORY-ZEROPAGE ( warn if less than 25 free bytes )
-)
-
-#ifdef DBG
-DISABLE @DEBUG-LENGTH ( print the assembled bytecode `length` )
-DISABLE @DEBUG-HEAD-POINTER ( print the head pointer )
-DISABLE @DEBUG-TAIL-POINTER ( print the tail pointer )
-ENABLE @DEBUG-INPUT ( print the input buffer )
-DISABLE @DEBUG-HEAP ( print the heap )
-DISABLE @DEBUG-SYMBOLS ( print the symbols )
-#endif
diff --git a/etc/assets/dis.tal b/etc/assets/dis.tal
new file mode 100644
index 0000000..7639653
--- /dev/null
+++ b/etc/assets/dis.tal
@@ -0,0 +1,27 @@
+@Main
+|0100 ( a0 1214 ... ) ;meta
+|0103 ( 80 06 .. ) #06
+|0105 ( 37 7 ) DEO2
+
+|0106 ( a0 1ac0 ... ) ;tail/end
+|0109 ( a0 1313 ... LIT2 1313 #1313 ) ;tail
+|010c ( 39 9 ) SUB2
+|010d ( af . ) STH2k
+|010e ( a0 00 00 ... ) LIT2 0000
+|0111 ( a0 1313 ... ) LIT2 1313
+|0114 ( a0 0000 ... ) LIT2 0000
+
+|0117 ( a0 fb40 ..@ ) LIT2 fb40
+|011a ( ef . ) STH2kr
+|011b ( 39 9 ) SUB2
+|011c ( af . ) STH2k
+|011d ( 60 ` ) 60
+|011e ( 0b . ) LTH
+|011f ( 34 4 ) LDA2
+|0120 ( 64 d ) SWP2r
+|0121 ( 6f o ) STH2r
+|0122 ( a0 00 00 ... ) LIT2 0000
+|0125 ( a0 13 13 ... ) LIT2 1313
+|0128 ( 60 ` ) 60
+|0129 ( 0b . ) LTH
+|012a ( 11 . ) STZ
diff --git a/lib/string/macros.tal b/lib/string/macros.tal
index e93aab6..481eeda 100644
--- a/lib/string/macros.tal
+++ b/lib/string/macros.tal
@@ -52,15 +52,15 @@
%\italic { \CSI "3m }
%\underline { \CSI "4m }
-%\bg-0 { \CSI "48;2; \color-0 "m }
-%\bg-1 { \CSI "48;2; \color-1 "m }
-%\bg-2 { \CSI "48;2; \color-2 "m }
-%\bg-3 { \CSI "48;2; \color-3 "m }
-
-%\fg-0 { \CSI "38;2; \color-0 "m }
-%\fg-1 { \CSI "38;2; \color-1 "m }
-%\fg-2 { \CSI "38;2; \color-2 "m }
-%\fg-3 { \CSI "38;2; \color-3 "m }
+%\bg-0 { \CSI "48;2; \BACKGROUND "m }
+%\bg-1 { \CSI "48;2; \FOREGROUND "m }
+%\bg-2 { \CSI "48;2; \EMPHASIS "m }
+%\bg-3 { \CSI "48;2; \ERROR "m }
+
+%\fg-0 { \CSI "38;2; \BACKGROUND "m }
+%\fg-1 { \CSI "38;2; \FOREGROUND "m }
+%\fg-2 { \CSI "38;2; \EMPHASIS "m }
+%\fg-3 { \CSI "38;2; \ERROR "m }
%\reset-console-style { \CSI "m }
%\reset-console-cursor { \CSI "H }
diff --git a/node_modules/.bin/json5 b/node_modules/.bin/json5
new file mode 120000
index 0000000..217f379
--- /dev/null
+++ b/node_modules/.bin/json5
@@ -0,0 +1 @@
+../json5/lib/cli.js
\ No newline at end of file
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
new file mode 100644
index 0000000..004e797
--- /dev/null
+++ b/node_modules/.package-lock.json
@@ -0,0 +1,19 @@
+{
+ "name": "talos",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ }
+ }
+}
diff --git a/node_modules/json5/LICENSE.md b/node_modules/json5/LICENSE.md
new file mode 100644
index 0000000..2171aca
--- /dev/null
+++ b/node_modules/json5/LICENSE.md
@@ -0,0 +1,23 @@
+MIT License
+
+Copyright (c) 2012-2018 Aseem Kishore, and [others].
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+[others]: https://github.com/json5/json5/contributors
diff --git a/node_modules/json5/README.md b/node_modules/json5/README.md
new file mode 100644
index 0000000..00ee793
--- /dev/null
+++ b/node_modules/json5/README.md
@@ -0,0 +1,282 @@
+# JSON5 – JSON for Humans
+
+[![Build Status](https://app.travis-ci.com/json5/json5.svg?branch=main)][Build
+Status] [![Coverage
+Status](https://coveralls.io/repos/github/json5/json5/badge.svg)][Coverage
+Status]
+
+JSON5 is an extension to the popular [JSON] file format that aims to be
+easier to **write and maintain _by hand_ (e.g. for config files)**.
+It is _not intended_ to be used for machine-to-machine communication.
+(Keep using JSON or other file formats for that. 🙂)
+
+JSON5 was started in 2012, and as of 2022, now gets **[>65M downloads/week](https://www.npmjs.com/package/json5)**,
+ranks in the **[top 0.1%](https://gist.github.com/anvaka/8e8fa57c7ee1350e3491)** of the most depended-upon packages on npm,
+and has been adopted by major projects like
+**[Chromium](https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/runtime_enabled_features.json5;drc=5de823b36e68fd99009a29281b17bc3a1d6b329c),
+[Next.js](https://github.com/vercel/next.js/blob/b88f20c90bf4659b8ad5cb2a27956005eac2c7e8/packages/next/lib/find-config.ts#L43-L46),
+[Babel](https://babeljs.io/docs/en/config-files#supported-file-extensions),
+[Retool](https://community.retool.com/t/i-am-attempting-to-append-several-text-fields-to-a-google-sheet-but-receiving-a-json5-invalid-character-error/7626),
+[WebStorm](https://www.jetbrains.com/help/webstorm/json.html),
+and [more](https://github.com/json5/json5/wiki/In-the-Wild)**.
+It's also natively supported on **[Apple platforms](https://developer.apple.com/documentation/foundation/jsondecoder/3766916-allowsjson5)**
+like **MacOS** and **iOS**.
+
+Formally, the **[JSON5 Data Interchange Format](https://spec.json5.org/)** is a superset of JSON
+(so valid JSON files will always be valid JSON5 files)
+that expands its syntax to include some productions from [ECMAScript 5.1] (ES5).
+It's also a strict _subset_ of ES5, so valid JSON5 files will always be valid ES5.
+
+This JavaScript library is a reference implementation for JSON5 parsing and serialization,
+and is directly used in many of the popular projects mentioned above
+(where e.g. extreme performance isn't necessary),
+but others have created [many other libraries](https://github.com/json5/json5/wiki/In-the-Wild)
+across many other platforms.
+
+[Build Status]: https://app.travis-ci.com/json5/json5
+
+[Coverage Status]: https://coveralls.io/github/json5/json5
+
+[JSON]: https://tools.ietf.org/html/rfc7159
+
+[ECMAScript 5.1]: https://www.ecma-international.org/ecma-262/5.1/
+
+## Summary of Features
+The following ECMAScript 5.1 features, which are not supported in JSON, have
+been extended to JSON5.
+
+### Objects
+- Object keys may be an ECMAScript 5.1 _[IdentifierName]_.
+- Objects may have a single trailing comma.
+
+### Arrays
+- Arrays may have a single trailing comma.
+
+### Strings
+- Strings may be single quoted.
+- Strings may span multiple lines by escaping new line characters.
+- Strings may include character escapes.
+
+### Numbers
+- Numbers may be hexadecimal.
+- Numbers may have a leading or trailing decimal point.
+- Numbers may be [IEEE 754] positive infinity, negative infinity, and NaN.
+- Numbers may begin with an explicit plus sign.
+
+### Comments
+- Single and multi-line comments are allowed.
+
+### White Space
+- Additional white space characters are allowed.
+
+[IdentifierName]: https://www.ecma-international.org/ecma-262/5.1/#sec-7.6
+
+[IEEE 754]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933
+
+## Example
+Kitchen-sink example:
+
+```js
+{
+ // comments
+ unquoted: 'and you can quote me on that',
+ singleQuotes: 'I can use "double quotes" here',
+ lineBreaks: "Look, Mom! \
+No \\n's!",
+ hexadecimal: 0xdecaf,
+ leadingDecimalPoint: .8675309, andTrailing: 8675309.,
+ positiveSign: +1,
+ trailingComma: 'in objects', andIn: ['arrays',],
+ "backwardsCompatible": "with JSON",
+}
+```
+
+A more real-world example is [this config file](https://github.com/chromium/chromium/blob/feb3c9f670515edf9a88f185301cbd7794ee3e52/third_party/blink/renderer/platform/runtime_enabled_features.json5)
+from the Chromium/Blink project.
+
+## Specification
+For a detailed explanation of the JSON5 format, please read the [official
+specification](https://json5.github.io/json5-spec/).
+
+## Installation and Usage
+### Node.js
+```sh
+npm install json5
+```
+
+#### CommonJS
+```js
+const JSON5 = require('json5')
+```
+
+#### Modules
+```js
+import JSON5 from 'json5'
+```
+
+### Browsers
+#### UMD
+```html
+
+
+```
+
+#### Modules
+```html
+
+```
+
+## API
+The JSON5 API is compatible with the [JSON API].
+
+[JSON API]:
+https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON
+
+### JSON5.parse()
+Parses a JSON5 string, constructing the JavaScript value or object described by
+the string. An optional reviver function can be provided to perform a
+transformation on the resulting object before it is returned.
+
+#### Syntax
+ JSON5.parse(text[, reviver])
+
+#### Parameters
+- `text`: The string to parse as JSON5.
+- `reviver`: If a function, this prescribes how the value originally produced by
+ parsing is transformed, before being returned.
+
+#### Return value
+The object corresponding to the given JSON5 text.
+
+### JSON5.stringify()
+Converts a JavaScript value to a JSON5 string, optionally replacing values if a
+replacer function is specified, or optionally including only the specified
+properties if a replacer array is specified.
+
+#### Syntax
+ JSON5.stringify(value[, replacer[, space]])
+ JSON5.stringify(value[, options])
+
+#### Parameters
+- `value`: The value to convert to a JSON5 string.
+- `replacer`: A function that alters the behavior of the stringification
+ process, or an array of String and Number objects that serve as a whitelist
+ for selecting/filtering the properties of the value object to be included in
+ the JSON5 string. If this value is null or not provided, all properties of the
+ object are included in the resulting JSON5 string.
+- `space`: A String or Number object that's used to insert white space into the
+ output JSON5 string for readability purposes. If this is a Number, it
+ indicates the number of space characters to use as white space; this number is
+ capped at 10 (if it is greater, the value is just 10). Values less than 1
+ indicate that no space should be used. If this is a String, the string (or the
+ first 10 characters of the string, if it's longer than that) is used as white
+ space. If this parameter is not provided (or is null), no white space is used.
+ If white space is used, trailing commas will be used in objects and arrays.
+- `options`: An object with the following properties:
+ - `replacer`: Same as the `replacer` parameter.
+ - `space`: Same as the `space` parameter.
+ - `quote`: A String representing the quote character to use when serializing
+ strings.
+
+#### Return value
+A JSON5 string representing the value.
+
+### Node.js `require()` JSON5 files
+When using Node.js, you can `require()` JSON5 files by adding the following
+statement.
+
+```js
+require('json5/lib/register')
+```
+
+Then you can load a JSON5 file with a Node.js `require()` statement. For
+example:
+
+```js
+const config = require('./config.json5')
+```
+
+## CLI
+Since JSON is more widely used than JSON5, this package includes a CLI for
+converting JSON5 to JSON and for validating the syntax of JSON5 documents.
+
+### Installation
+```sh
+npm install --global json5
+```
+
+### Usage
+```sh
+json5 [options]
+```
+
+If `` is not provided, then STDIN is used.
+
+#### Options:
+- `-s`, `--space`: The number of spaces to indent or `t` for tabs
+- `-o`, `--out-file [file]`: Output to the specified file, otherwise STDOUT
+- `-v`, `--validate`: Validate JSON5 but do not output JSON
+- `-V`, `--version`: Output the version number
+- `-h`, `--help`: Output usage information
+
+## Contributing
+### Development
+```sh
+git clone https://github.com/json5/json5
+cd json5
+npm install
+```
+
+When contributing code, please write relevant tests and run `npm test` and `npm
+run lint` before submitting pull requests. Please use an editor that supports
+[EditorConfig](http://editorconfig.org/).
+
+### Issues
+To report bugs or request features regarding the JSON5 **data format**,
+please submit an issue to the official
+**[_specification_ repository](https://github.com/json5/json5-spec)**.
+
+Note that we will never add any features that make JSON5 incompatible with ES5;
+that compatibility is a fundamental premise of JSON5.
+
+To report bugs or request features regarding this **JavaScript implementation**
+of JSON5, please submit an issue to **_this_ repository**.
+
+### Security Vulnerabilities and Disclosures
+To report a security vulnerability, please follow the follow the guidelines
+described in our [security policy](./SECURITY.md).
+
+## License
+MIT. See [LICENSE.md](./LICENSE.md) for details.
+
+## Credits
+[Aseem Kishore](https://github.com/aseemk) founded this project.
+He wrote a [blog post](https://aseemk.substack.com/p/ignore-the-f-ing-haters-json5)
+about the journey and lessons learned 10 years in.
+
+[Michael Bolin](http://bolinfest.com/) independently arrived at and published
+some of these same ideas with awesome explanations and detail. Recommended
+reading: [Suggested Improvements to JSON](http://bolinfest.com/essays/json.html)
+
+[Douglas Crockford](http://www.crockford.com/) of course designed and built
+JSON, but his state machine diagrams on the [JSON website](http://json.org/), as
+cheesy as it may sound, gave us motivation and confidence that building a new
+parser to implement these ideas was within reach! The original
+implementation of JSON5 was also modeled directly off of Doug’s open-source
+[json_parse.js] parser. We’re grateful for that clean and well-documented
+code.
+
+[json_parse.js]:
+https://github.com/douglascrockford/JSON-js/blob/03157639c7a7cddd2e9f032537f346f1a87c0f6d/json_parse.js
+
+[Max Nanasy](https://github.com/MaxNanasy) has been an early and prolific
+supporter, contributing multiple patches and ideas.
+
+[Andrew Eisenberg](https://github.com/aeisenberg) contributed the original
+`stringify` method.
+
+[Jordan Tucker](https://github.com/jordanbtucker) has aligned JSON5 more closely
+with ES5, wrote the official JSON5 specification, completely rewrote the
+codebase from the ground up, and is actively maintaining this project.
diff --git a/node_modules/json5/dist/index.js b/node_modules/json5/dist/index.js
new file mode 100644
index 0000000..bf86533
--- /dev/null
+++ b/node_modules/json5/dist/index.js
@@ -0,0 +1,1737 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global.JSON5 = factory());
+}(this, (function () { 'use strict';
+
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
+
+ var _global = createCommonjsModule(function (module) {
+ // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+ var global = module.exports = typeof window != 'undefined' && window.Math == Math
+ ? window : typeof self != 'undefined' && self.Math == Math ? self
+ // eslint-disable-next-line no-new-func
+ : Function('return this')();
+ if (typeof __g == 'number') { __g = global; } // eslint-disable-line no-undef
+ });
+
+ var _core = createCommonjsModule(function (module) {
+ var core = module.exports = { version: '2.6.5' };
+ if (typeof __e == 'number') { __e = core; } // eslint-disable-line no-undef
+ });
+ var _core_1 = _core.version;
+
+ var _isObject = function (it) {
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
+ };
+
+ var _anObject = function (it) {
+ if (!_isObject(it)) { throw TypeError(it + ' is not an object!'); }
+ return it;
+ };
+
+ var _fails = function (exec) {
+ try {
+ return !!exec();
+ } catch (e) {
+ return true;
+ }
+ };
+
+ // Thank's IE8 for his funny defineProperty
+ var _descriptors = !_fails(function () {
+ return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+ });
+
+ var document = _global.document;
+ // typeof document.createElement is 'object' in old IE
+ var is = _isObject(document) && _isObject(document.createElement);
+ var _domCreate = function (it) {
+ return is ? document.createElement(it) : {};
+ };
+
+ var _ie8DomDefine = !_descriptors && !_fails(function () {
+ return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
+ });
+
+ // 7.1.1 ToPrimitive(input [, PreferredType])
+
+ // instead of the ES6 spec version, we didn't implement @@toPrimitive case
+ // and the second argument - flag - preferred type is a string
+ var _toPrimitive = function (it, S) {
+ if (!_isObject(it)) { return it; }
+ var fn, val;
+ if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }
+ if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) { return val; }
+ if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }
+ throw TypeError("Can't convert object to primitive value");
+ };
+
+ var dP = Object.defineProperty;
+
+ var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+ _anObject(O);
+ P = _toPrimitive(P, true);
+ _anObject(Attributes);
+ if (_ie8DomDefine) { try {
+ return dP(O, P, Attributes);
+ } catch (e) { /* empty */ } }
+ if ('get' in Attributes || 'set' in Attributes) { throw TypeError('Accessors not supported!'); }
+ if ('value' in Attributes) { O[P] = Attributes.value; }
+ return O;
+ };
+
+ var _objectDp = {
+ f: f
+ };
+
+ var _propertyDesc = function (bitmap, value) {
+ return {
+ enumerable: !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable: !(bitmap & 4),
+ value: value
+ };
+ };
+
+ var _hide = _descriptors ? function (object, key, value) {
+ return _objectDp.f(object, key, _propertyDesc(1, value));
+ } : function (object, key, value) {
+ object[key] = value;
+ return object;
+ };
+
+ var hasOwnProperty = {}.hasOwnProperty;
+ var _has = function (it, key) {
+ return hasOwnProperty.call(it, key);
+ };
+
+ var id = 0;
+ var px = Math.random();
+ var _uid = function (key) {
+ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+ };
+
+ var _library = false;
+
+ var _shared = createCommonjsModule(function (module) {
+ var SHARED = '__core-js_shared__';
+ var store = _global[SHARED] || (_global[SHARED] = {});
+
+ (module.exports = function (key, value) {
+ return store[key] || (store[key] = value !== undefined ? value : {});
+ })('versions', []).push({
+ version: _core.version,
+ mode: _library ? 'pure' : 'global',
+ copyright: '© 2019 Denis Pushkarev (zloirock.ru)'
+ });
+ });
+
+ var _functionToString = _shared('native-function-to-string', Function.toString);
+
+ var _redefine = createCommonjsModule(function (module) {
+ var SRC = _uid('src');
+
+ var TO_STRING = 'toString';
+ var TPL = ('' + _functionToString).split(TO_STRING);
+
+ _core.inspectSource = function (it) {
+ return _functionToString.call(it);
+ };
+
+ (module.exports = function (O, key, val, safe) {
+ var isFunction = typeof val == 'function';
+ if (isFunction) { _has(val, 'name') || _hide(val, 'name', key); }
+ if (O[key] === val) { return; }
+ if (isFunction) { _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); }
+ if (O === _global) {
+ O[key] = val;
+ } else if (!safe) {
+ delete O[key];
+ _hide(O, key, val);
+ } else if (O[key]) {
+ O[key] = val;
+ } else {
+ _hide(O, key, val);
+ }
+ // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
+ })(Function.prototype, TO_STRING, function toString() {
+ return typeof this == 'function' && this[SRC] || _functionToString.call(this);
+ });
+ });
+
+ var _aFunction = function (it) {
+ if (typeof it != 'function') { throw TypeError(it + ' is not a function!'); }
+ return it;
+ };
+
+ // optional / simple context binding
+
+ var _ctx = function (fn, that, length) {
+ _aFunction(fn);
+ if (that === undefined) { return fn; }
+ switch (length) {
+ case 1: return function (a) {
+ return fn.call(that, a);
+ };
+ case 2: return function (a, b) {
+ return fn.call(that, a, b);
+ };
+ case 3: return function (a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function (/* ...args */) {
+ return fn.apply(that, arguments);
+ };
+ };
+
+ var PROTOTYPE = 'prototype';
+
+ var $export = function (type, name, source) {
+ var IS_FORCED = type & $export.F;
+ var IS_GLOBAL = type & $export.G;
+ var IS_STATIC = type & $export.S;
+ var IS_PROTO = type & $export.P;
+ var IS_BIND = type & $export.B;
+ var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];
+ var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});
+ var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
+ var key, own, out, exp;
+ if (IS_GLOBAL) { source = name; }
+ for (key in source) {
+ // contains in native
+ own = !IS_FORCED && target && target[key] !== undefined;
+ // export native or passed
+ out = (own ? target : source)[key];
+ // bind timers to global for call from export context
+ exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
+ // extend global
+ if (target) { _redefine(target, key, out, type & $export.U); }
+ // export
+ if (exports[key] != out) { _hide(exports, key, exp); }
+ if (IS_PROTO && expProto[key] != out) { expProto[key] = out; }
+ }
+ };
+ _global.core = _core;
+ // type bitmap
+ $export.F = 1; // forced
+ $export.G = 2; // global
+ $export.S = 4; // static
+ $export.P = 8; // proto
+ $export.B = 16; // bind
+ $export.W = 32; // wrap
+ $export.U = 64; // safe
+ $export.R = 128; // real proto method for `library`
+ var _export = $export;
+
+ // 7.1.4 ToInteger
+ var ceil = Math.ceil;
+ var floor = Math.floor;
+ var _toInteger = function (it) {
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+ };
+
+ // 7.2.1 RequireObjectCoercible(argument)
+ var _defined = function (it) {
+ if (it == undefined) { throw TypeError("Can't call method on " + it); }
+ return it;
+ };
+
+ // true -> String#at
+ // false -> String#codePointAt
+ var _stringAt = function (TO_STRING) {
+ return function (that, pos) {
+ var s = String(_defined(that));
+ var i = _toInteger(pos);
+ var l = s.length;
+ var a, b;
+ if (i < 0 || i >= l) { return TO_STRING ? '' : undefined; }
+ a = s.charCodeAt(i);
+ return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+ ? TO_STRING ? s.charAt(i) : a
+ : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+ };
+ };
+
+ var $at = _stringAt(false);
+ _export(_export.P, 'String', {
+ // 21.1.3.3 String.prototype.codePointAt(pos)
+ codePointAt: function codePointAt(pos) {
+ return $at(this, pos);
+ }
+ });
+
+ var codePointAt = _core.String.codePointAt;
+
+ var max = Math.max;
+ var min = Math.min;
+ var _toAbsoluteIndex = function (index, length) {
+ index = _toInteger(index);
+ return index < 0 ? max(index + length, 0) : min(index, length);
+ };
+
+ var fromCharCode = String.fromCharCode;
+ var $fromCodePoint = String.fromCodePoint;
+
+ // length should be 1, old FF problem
+ _export(_export.S + _export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
+ // 21.1.2.2 String.fromCodePoint(...codePoints)
+ fromCodePoint: function fromCodePoint(x) {
+ var arguments$1 = arguments;
+ // eslint-disable-line no-unused-vars
+ var res = [];
+ var aLen = arguments.length;
+ var i = 0;
+ var code;
+ while (aLen > i) {
+ code = +arguments$1[i++];
+ if (_toAbsoluteIndex(code, 0x10ffff) !== code) { throw RangeError(code + ' is not a valid code point'); }
+ res.push(code < 0x10000
+ ? fromCharCode(code)
+ : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
+ );
+ } return res.join('');
+ }
+ });
+
+ var fromCodePoint = _core.String.fromCodePoint;
+
+ // This is a generated file. Do not edit.
+ var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/;
+ var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/;
+ var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/;
+
+ var unicode = {
+ Space_Separator: Space_Separator,
+ ID_Start: ID_Start,
+ ID_Continue: ID_Continue
+ };
+
+ var util = {
+ isSpaceSeparator: function isSpaceSeparator (c) {
+ return typeof c === 'string' && unicode.Space_Separator.test(c)
+ },
+
+ isIdStartChar: function isIdStartChar (c) {
+ return typeof c === 'string' && (
+ (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c === '$') || (c === '_') ||
+ unicode.ID_Start.test(c)
+ )
+ },
+
+ isIdContinueChar: function isIdContinueChar (c) {
+ return typeof c === 'string' && (
+ (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c >= '0' && c <= '9') ||
+ (c === '$') || (c === '_') ||
+ (c === '\u200C') || (c === '\u200D') ||
+ unicode.ID_Continue.test(c)
+ )
+ },
+
+ isDigit: function isDigit (c) {
+ return typeof c === 'string' && /[0-9]/.test(c)
+ },
+
+ isHexDigit: function isHexDigit (c) {
+ return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)
+ },
+ };
+
+ var source;
+ var parseState;
+ var stack;
+ var pos;
+ var line;
+ var column;
+ var token;
+ var key;
+ var root;
+
+ var parse = function parse (text, reviver) {
+ source = String(text);
+ parseState = 'start';
+ stack = [];
+ pos = 0;
+ line = 1;
+ column = 0;
+ token = undefined;
+ key = undefined;
+ root = undefined;
+
+ do {
+ token = lex();
+
+ // This code is unreachable.
+ // if (!parseStates[parseState]) {
+ // throw invalidParseState()
+ // }
+
+ parseStates[parseState]();
+ } while (token.type !== 'eof')
+
+ if (typeof reviver === 'function') {
+ return internalize({'': root}, '', reviver)
+ }
+
+ return root
+ };
+
+ function internalize (holder, name, reviver) {
+ var value = holder[name];
+ if (value != null && typeof value === 'object') {
+ if (Array.isArray(value)) {
+ for (var i = 0; i < value.length; i++) {
+ var key = String(i);
+ var replacement = internalize(value, key, reviver);
+ if (replacement === undefined) {
+ delete value[key];
+ } else {
+ Object.defineProperty(value, key, {
+ value: replacement,
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ });
+ }
+ }
+ } else {
+ for (var key$1 in value) {
+ var replacement$1 = internalize(value, key$1, reviver);
+ if (replacement$1 === undefined) {
+ delete value[key$1];
+ } else {
+ Object.defineProperty(value, key$1, {
+ value: replacement$1,
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ });
+ }
+ }
+ }
+ }
+
+ return reviver.call(holder, name, value)
+ }
+
+ var lexState;
+ var buffer;
+ var doubleQuote;
+ var sign;
+ var c;
+
+ function lex () {
+ lexState = 'default';
+ buffer = '';
+ doubleQuote = false;
+ sign = 1;
+
+ for (;;) {
+ c = peek();
+
+ // This code is unreachable.
+ // if (!lexStates[lexState]) {
+ // throw invalidLexState(lexState)
+ // }
+
+ var token = lexStates[lexState]();
+ if (token) {
+ return token
+ }
+ }
+ }
+
+ function peek () {
+ if (source[pos]) {
+ return String.fromCodePoint(source.codePointAt(pos))
+ }
+ }
+
+ function read () {
+ var c = peek();
+
+ if (c === '\n') {
+ line++;
+ column = 0;
+ } else if (c) {
+ column += c.length;
+ } else {
+ column++;
+ }
+
+ if (c) {
+ pos += c.length;
+ }
+
+ return c
+ }
+
+ var lexStates = {
+ default: function default$1 () {
+ switch (c) {
+ case '\t':
+ case '\v':
+ case '\f':
+ case ' ':
+ case '\u00A0':
+ case '\uFEFF':
+ case '\n':
+ case '\r':
+ case '\u2028':
+ case '\u2029':
+ read();
+ return
+
+ case '/':
+ read();
+ lexState = 'comment';
+ return
+
+ case undefined:
+ read();
+ return newToken('eof')
+ }
+
+ if (util.isSpaceSeparator(c)) {
+ read();
+ return
+ }
+
+ // This code is unreachable.
+ // if (!lexStates[parseState]) {
+ // throw invalidLexState(parseState)
+ // }
+
+ return lexStates[parseState]()
+ },
+
+ comment: function comment () {
+ switch (c) {
+ case '*':
+ read();
+ lexState = 'multiLineComment';
+ return
+
+ case '/':
+ read();
+ lexState = 'singleLineComment';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ multiLineComment: function multiLineComment () {
+ switch (c) {
+ case '*':
+ read();
+ lexState = 'multiLineCommentAsterisk';
+ return
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ read();
+ },
+
+ multiLineCommentAsterisk: function multiLineCommentAsterisk () {
+ switch (c) {
+ case '*':
+ read();
+ return
+
+ case '/':
+ read();
+ lexState = 'default';
+ return
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ read();
+ lexState = 'multiLineComment';
+ },
+
+ singleLineComment: function singleLineComment () {
+ switch (c) {
+ case '\n':
+ case '\r':
+ case '\u2028':
+ case '\u2029':
+ read();
+ lexState = 'default';
+ return
+
+ case undefined:
+ read();
+ return newToken('eof')
+ }
+
+ read();
+ },
+
+ value: function value () {
+ switch (c) {
+ case '{':
+ case '[':
+ return newToken('punctuator', read())
+
+ case 'n':
+ read();
+ literal('ull');
+ return newToken('null', null)
+
+ case 't':
+ read();
+ literal('rue');
+ return newToken('boolean', true)
+
+ case 'f':
+ read();
+ literal('alse');
+ return newToken('boolean', false)
+
+ case '-':
+ case '+':
+ if (read() === '-') {
+ sign = -1;
+ }
+
+ lexState = 'sign';
+ return
+
+ case '.':
+ buffer = read();
+ lexState = 'decimalPointLeading';
+ return
+
+ case '0':
+ buffer = read();
+ lexState = 'zero';
+ return
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ buffer = read();
+ lexState = 'decimalInteger';
+ return
+
+ case 'I':
+ read();
+ literal('nfinity');
+ return newToken('numeric', Infinity)
+
+ case 'N':
+ read();
+ literal('aN');
+ return newToken('numeric', NaN)
+
+ case '"':
+ case "'":
+ doubleQuote = (read() === '"');
+ buffer = '';
+ lexState = 'string';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ identifierNameStartEscape: function identifierNameStartEscape () {
+ if (c !== 'u') {
+ throw invalidChar(read())
+ }
+
+ read();
+ var u = unicodeEscape();
+ switch (u) {
+ case '$':
+ case '_':
+ break
+
+ default:
+ if (!util.isIdStartChar(u)) {
+ throw invalidIdentifier()
+ }
+
+ break
+ }
+
+ buffer += u;
+ lexState = 'identifierName';
+ },
+
+ identifierName: function identifierName () {
+ switch (c) {
+ case '$':
+ case '_':
+ case '\u200C':
+ case '\u200D':
+ buffer += read();
+ return
+
+ case '\\':
+ read();
+ lexState = 'identifierNameEscape';
+ return
+ }
+
+ if (util.isIdContinueChar(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('identifier', buffer)
+ },
+
+ identifierNameEscape: function identifierNameEscape () {
+ if (c !== 'u') {
+ throw invalidChar(read())
+ }
+
+ read();
+ var u = unicodeEscape();
+ switch (u) {
+ case '$':
+ case '_':
+ case '\u200C':
+ case '\u200D':
+ break
+
+ default:
+ if (!util.isIdContinueChar(u)) {
+ throw invalidIdentifier()
+ }
+
+ break
+ }
+
+ buffer += u;
+ lexState = 'identifierName';
+ },
+
+ sign: function sign$1 () {
+ switch (c) {
+ case '.':
+ buffer = read();
+ lexState = 'decimalPointLeading';
+ return
+
+ case '0':
+ buffer = read();
+ lexState = 'zero';
+ return
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ buffer = read();
+ lexState = 'decimalInteger';
+ return
+
+ case 'I':
+ read();
+ literal('nfinity');
+ return newToken('numeric', sign * Infinity)
+
+ case 'N':
+ read();
+ literal('aN');
+ return newToken('numeric', NaN)
+ }
+
+ throw invalidChar(read())
+ },
+
+ zero: function zero () {
+ switch (c) {
+ case '.':
+ buffer += read();
+ lexState = 'decimalPoint';
+ return
+
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+
+ case 'x':
+ case 'X':
+ buffer += read();
+ lexState = 'hexadecimal';
+ return
+ }
+
+ return newToken('numeric', sign * 0)
+ },
+
+ decimalInteger: function decimalInteger () {
+ switch (c) {
+ case '.':
+ buffer += read();
+ lexState = 'decimalPoint';
+ return
+
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalPointLeading: function decimalPointLeading () {
+ if (util.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalFraction';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalPoint: function decimalPoint () {
+ switch (c) {
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalFraction';
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalFraction: function decimalFraction () {
+ switch (c) {
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalExponent: function decimalExponent () {
+ switch (c) {
+ case '+':
+ case '-':
+ buffer += read();
+ lexState = 'decimalExponentSign';
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalExponentInteger';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalExponentSign: function decimalExponentSign () {
+ if (util.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalExponentInteger';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalExponentInteger: function decimalExponentInteger () {
+ if (util.isDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ hexadecimal: function hexadecimal () {
+ if (util.isHexDigit(c)) {
+ buffer += read();
+ lexState = 'hexadecimalInteger';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ hexadecimalInteger: function hexadecimalInteger () {
+ if (util.isHexDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ string: function string () {
+ switch (c) {
+ case '\\':
+ read();
+ buffer += escape();
+ return
+
+ case '"':
+ if (doubleQuote) {
+ read();
+ return newToken('string', buffer)
+ }
+
+ buffer += read();
+ return
+
+ case "'":
+ if (!doubleQuote) {
+ read();
+ return newToken('string', buffer)
+ }
+
+ buffer += read();
+ return
+
+ case '\n':
+ case '\r':
+ throw invalidChar(read())
+
+ case '\u2028':
+ case '\u2029':
+ separatorChar(c);
+ break
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+ },
+
+ start: function start () {
+ switch (c) {
+ case '{':
+ case '[':
+ return newToken('punctuator', read())
+
+ // This code is unreachable since the default lexState handles eof.
+ // case undefined:
+ // return newToken('eof')
+ }
+
+ lexState = 'value';
+ },
+
+ beforePropertyName: function beforePropertyName () {
+ switch (c) {
+ case '$':
+ case '_':
+ buffer = read();
+ lexState = 'identifierName';
+ return
+
+ case '\\':
+ read();
+ lexState = 'identifierNameStartEscape';
+ return
+
+ case '}':
+ return newToken('punctuator', read())
+
+ case '"':
+ case "'":
+ doubleQuote = (read() === '"');
+ lexState = 'string';
+ return
+ }
+
+ if (util.isIdStartChar(c)) {
+ buffer += read();
+ lexState = 'identifierName';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ afterPropertyName: function afterPropertyName () {
+ if (c === ':') {
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ beforePropertyValue: function beforePropertyValue () {
+ lexState = 'value';
+ },
+
+ afterPropertyValue: function afterPropertyValue () {
+ switch (c) {
+ case ',':
+ case '}':
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ beforeArrayValue: function beforeArrayValue () {
+ if (c === ']') {
+ return newToken('punctuator', read())
+ }
+
+ lexState = 'value';
+ },
+
+ afterArrayValue: function afterArrayValue () {
+ switch (c) {
+ case ',':
+ case ']':
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ end: function end () {
+ // This code is unreachable since it's handled by the default lexState.
+ // if (c === undefined) {
+ // read()
+ // return newToken('eof')
+ // }
+
+ throw invalidChar(read())
+ },
+ };
+
+ function newToken (type, value) {
+ return {
+ type: type,
+ value: value,
+ line: line,
+ column: column,
+ }
+ }
+
+ function literal (s) {
+ for (var i = 0, list = s; i < list.length; i += 1) {
+ var c = list[i];
+
+ var p = peek();
+
+ if (p !== c) {
+ throw invalidChar(read())
+ }
+
+ read();
+ }
+ }
+
+ function escape () {
+ var c = peek();
+ switch (c) {
+ case 'b':
+ read();
+ return '\b'
+
+ case 'f':
+ read();
+ return '\f'
+
+ case 'n':
+ read();
+ return '\n'
+
+ case 'r':
+ read();
+ return '\r'
+
+ case 't':
+ read();
+ return '\t'
+
+ case 'v':
+ read();
+ return '\v'
+
+ case '0':
+ read();
+ if (util.isDigit(peek())) {
+ throw invalidChar(read())
+ }
+
+ return '\0'
+
+ case 'x':
+ read();
+ return hexEscape()
+
+ case 'u':
+ read();
+ return unicodeEscape()
+
+ case '\n':
+ case '\u2028':
+ case '\u2029':
+ read();
+ return ''
+
+ case '\r':
+ read();
+ if (peek() === '\n') {
+ read();
+ }
+
+ return ''
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ throw invalidChar(read())
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ return read()
+ }
+
+ function hexEscape () {
+ var buffer = '';
+ var c = peek();
+
+ if (!util.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+
+ c = peek();
+ if (!util.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+
+ return String.fromCodePoint(parseInt(buffer, 16))
+ }
+
+ function unicodeEscape () {
+ var buffer = '';
+ var count = 4;
+
+ while (count-- > 0) {
+ var c = peek();
+ if (!util.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+ }
+
+ return String.fromCodePoint(parseInt(buffer, 16))
+ }
+
+ var parseStates = {
+ start: function start () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ push();
+ },
+
+ beforePropertyName: function beforePropertyName () {
+ switch (token.type) {
+ case 'identifier':
+ case 'string':
+ key = token.value;
+ parseState = 'afterPropertyName';
+ return
+
+ case 'punctuator':
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.value !== '}') {
+ // throw invalidToken()
+ // }
+
+ pop();
+ return
+
+ case 'eof':
+ throw invalidEOF()
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ afterPropertyName: function afterPropertyName () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator' || token.value !== ':') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ parseState = 'beforePropertyValue';
+ },
+
+ beforePropertyValue: function beforePropertyValue () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ push();
+ },
+
+ beforeArrayValue: function beforeArrayValue () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ if (token.type === 'punctuator' && token.value === ']') {
+ pop();
+ return
+ }
+
+ push();
+ },
+
+ afterPropertyValue: function afterPropertyValue () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ switch (token.value) {
+ case ',':
+ parseState = 'beforePropertyName';
+ return
+
+ case '}':
+ pop();
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ afterArrayValue: function afterArrayValue () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ switch (token.value) {
+ case ',':
+ parseState = 'beforeArrayValue';
+ return
+
+ case ']':
+ pop();
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ end: function end () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'eof') {
+ // throw invalidToken()
+ // }
+ },
+ };
+
+ function push () {
+ var value;
+
+ switch (token.type) {
+ case 'punctuator':
+ switch (token.value) {
+ case '{':
+ value = {};
+ break
+
+ case '[':
+ value = [];
+ break
+ }
+
+ break
+
+ case 'null':
+ case 'boolean':
+ case 'numeric':
+ case 'string':
+ value = token.value;
+ break
+
+ // This code is unreachable.
+ // default:
+ // throw invalidToken()
+ }
+
+ if (root === undefined) {
+ root = value;
+ } else {
+ var parent = stack[stack.length - 1];
+ if (Array.isArray(parent)) {
+ parent.push(value);
+ } else {
+ Object.defineProperty(parent, key, {
+ value: value,
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ });
+ }
+ }
+
+ if (value !== null && typeof value === 'object') {
+ stack.push(value);
+
+ if (Array.isArray(value)) {
+ parseState = 'beforeArrayValue';
+ } else {
+ parseState = 'beforePropertyName';
+ }
+ } else {
+ var current = stack[stack.length - 1];
+ if (current == null) {
+ parseState = 'end';
+ } else if (Array.isArray(current)) {
+ parseState = 'afterArrayValue';
+ } else {
+ parseState = 'afterPropertyValue';
+ }
+ }
+ }
+
+ function pop () {
+ stack.pop();
+
+ var current = stack[stack.length - 1];
+ if (current == null) {
+ parseState = 'end';
+ } else if (Array.isArray(current)) {
+ parseState = 'afterArrayValue';
+ } else {
+ parseState = 'afterPropertyValue';
+ }
+ }
+
+ // This code is unreachable.
+ // function invalidParseState () {
+ // return new Error(`JSON5: invalid parse state '${parseState}'`)
+ // }
+
+ // This code is unreachable.
+ // function invalidLexState (state) {
+ // return new Error(`JSON5: invalid lex state '${state}'`)
+ // }
+
+ function invalidChar (c) {
+ if (c === undefined) {
+ return syntaxError(("JSON5: invalid end of input at " + line + ":" + column))
+ }
+
+ return syntaxError(("JSON5: invalid character '" + (formatChar(c)) + "' at " + line + ":" + column))
+ }
+
+ function invalidEOF () {
+ return syntaxError(("JSON5: invalid end of input at " + line + ":" + column))
+ }
+
+ // This code is unreachable.
+ // function invalidToken () {
+ // if (token.type === 'eof') {
+ // return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
+ // }
+
+ // const c = String.fromCodePoint(token.value.codePointAt(0))
+ // return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
+ // }
+
+ function invalidIdentifier () {
+ column -= 5;
+ return syntaxError(("JSON5: invalid identifier character at " + line + ":" + column))
+ }
+
+ function separatorChar (c) {
+ console.warn(("JSON5: '" + (formatChar(c)) + "' in strings is not valid ECMAScript; consider escaping"));
+ }
+
+ function formatChar (c) {
+ var replacements = {
+ "'": "\\'",
+ '"': '\\"',
+ '\\': '\\\\',
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+ '\v': '\\v',
+ '\0': '\\0',
+ '\u2028': '\\u2028',
+ '\u2029': '\\u2029',
+ };
+
+ if (replacements[c]) {
+ return replacements[c]
+ }
+
+ if (c < ' ') {
+ var hexString = c.charCodeAt(0).toString(16);
+ return '\\x' + ('00' + hexString).substring(hexString.length)
+ }
+
+ return c
+ }
+
+ function syntaxError (message) {
+ var err = new SyntaxError(message);
+ err.lineNumber = line;
+ err.columnNumber = column;
+ return err
+ }
+
+ var stringify = function stringify (value, replacer, space) {
+ var stack = [];
+ var indent = '';
+ var propertyList;
+ var replacerFunc;
+ var gap = '';
+ var quote;
+
+ if (
+ replacer != null &&
+ typeof replacer === 'object' &&
+ !Array.isArray(replacer)
+ ) {
+ space = replacer.space;
+ quote = replacer.quote;
+ replacer = replacer.replacer;
+ }
+
+ if (typeof replacer === 'function') {
+ replacerFunc = replacer;
+ } else if (Array.isArray(replacer)) {
+ propertyList = [];
+ for (var i = 0, list = replacer; i < list.length; i += 1) {
+ var v = list[i];
+
+ var item = (void 0);
+
+ if (typeof v === 'string') {
+ item = v;
+ } else if (
+ typeof v === 'number' ||
+ v instanceof String ||
+ v instanceof Number
+ ) {
+ item = String(v);
+ }
+
+ if (item !== undefined && propertyList.indexOf(item) < 0) {
+ propertyList.push(item);
+ }
+ }
+ }
+
+ if (space instanceof Number) {
+ space = Number(space);
+ } else if (space instanceof String) {
+ space = String(space);
+ }
+
+ if (typeof space === 'number') {
+ if (space > 0) {
+ space = Math.min(10, Math.floor(space));
+ gap = ' '.substr(0, space);
+ }
+ } else if (typeof space === 'string') {
+ gap = space.substr(0, 10);
+ }
+
+ return serializeProperty('', {'': value})
+
+ function serializeProperty (key, holder) {
+ var value = holder[key];
+ if (value != null) {
+ if (typeof value.toJSON5 === 'function') {
+ value = value.toJSON5(key);
+ } else if (typeof value.toJSON === 'function') {
+ value = value.toJSON(key);
+ }
+ }
+
+ if (replacerFunc) {
+ value = replacerFunc.call(holder, key, value);
+ }
+
+ if (value instanceof Number) {
+ value = Number(value);
+ } else if (value instanceof String) {
+ value = String(value);
+ } else if (value instanceof Boolean) {
+ value = value.valueOf();
+ }
+
+ switch (value) {
+ case null: return 'null'
+ case true: return 'true'
+ case false: return 'false'
+ }
+
+ if (typeof value === 'string') {
+ return quoteString(value, false)
+ }
+
+ if (typeof value === 'number') {
+ return String(value)
+ }
+
+ if (typeof value === 'object') {
+ return Array.isArray(value) ? serializeArray(value) : serializeObject(value)
+ }
+
+ return undefined
+ }
+
+ function quoteString (value) {
+ var quotes = {
+ "'": 0.1,
+ '"': 0.2,
+ };
+
+ var replacements = {
+ "'": "\\'",
+ '"': '\\"',
+ '\\': '\\\\',
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+ '\v': '\\v',
+ '\0': '\\0',
+ '\u2028': '\\u2028',
+ '\u2029': '\\u2029',
+ };
+
+ var product = '';
+
+ for (var i = 0; i < value.length; i++) {
+ var c = value[i];
+ switch (c) {
+ case "'":
+ case '"':
+ quotes[c]++;
+ product += c;
+ continue
+
+ case '\0':
+ if (util.isDigit(value[i + 1])) {
+ product += '\\x00';
+ continue
+ }
+ }
+
+ if (replacements[c]) {
+ product += replacements[c];
+ continue
+ }
+
+ if (c < ' ') {
+ var hexString = c.charCodeAt(0).toString(16);
+ product += '\\x' + ('00' + hexString).substring(hexString.length);
+ continue
+ }
+
+ product += c;
+ }
+
+ var quoteChar = quote || Object.keys(quotes).reduce(function (a, b) { return (quotes[a] < quotes[b]) ? a : b; });
+
+ product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);
+
+ return quoteChar + product + quoteChar
+ }
+
+ function serializeObject (value) {
+ if (stack.indexOf(value) >= 0) {
+ throw TypeError('Converting circular structure to JSON5')
+ }
+
+ stack.push(value);
+
+ var stepback = indent;
+ indent = indent + gap;
+
+ var keys = propertyList || Object.keys(value);
+ var partial = [];
+ for (var i = 0, list = keys; i < list.length; i += 1) {
+ var key = list[i];
+
+ var propertyString = serializeProperty(key, value);
+ if (propertyString !== undefined) {
+ var member = serializeKey(key) + ':';
+ if (gap !== '') {
+ member += ' ';
+ }
+ member += propertyString;
+ partial.push(member);
+ }
+ }
+
+ var final;
+ if (partial.length === 0) {
+ final = '{}';
+ } else {
+ var properties;
+ if (gap === '') {
+ properties = partial.join(',');
+ final = '{' + properties + '}';
+ } else {
+ var separator = ',\n' + indent;
+ properties = partial.join(separator);
+ final = '{\n' + indent + properties + ',\n' + stepback + '}';
+ }
+ }
+
+ stack.pop();
+ indent = stepback;
+ return final
+ }
+
+ function serializeKey (key) {
+ if (key.length === 0) {
+ return quoteString(key, true)
+ }
+
+ var firstChar = String.fromCodePoint(key.codePointAt(0));
+ if (!util.isIdStartChar(firstChar)) {
+ return quoteString(key, true)
+ }
+
+ for (var i = firstChar.length; i < key.length; i++) {
+ if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {
+ return quoteString(key, true)
+ }
+ }
+
+ return key
+ }
+
+ function serializeArray (value) {
+ if (stack.indexOf(value) >= 0) {
+ throw TypeError('Converting circular structure to JSON5')
+ }
+
+ stack.push(value);
+
+ var stepback = indent;
+ indent = indent + gap;
+
+ var partial = [];
+ for (var i = 0; i < value.length; i++) {
+ var propertyString = serializeProperty(String(i), value);
+ partial.push((propertyString !== undefined) ? propertyString : 'null');
+ }
+
+ var final;
+ if (partial.length === 0) {
+ final = '[]';
+ } else {
+ if (gap === '') {
+ var properties = partial.join(',');
+ final = '[' + properties + ']';
+ } else {
+ var separator = ',\n' + indent;
+ var properties$1 = partial.join(separator);
+ final = '[\n' + indent + properties$1 + ',\n' + stepback + ']';
+ }
+ }
+
+ stack.pop();
+ indent = stepback;
+ return final
+ }
+ };
+
+ var JSON5 = {
+ parse: parse,
+ stringify: stringify,
+ };
+
+ var lib = JSON5;
+
+ var es5 = lib;
+
+ return es5;
+
+})));
diff --git a/node_modules/json5/dist/index.min.js b/node_modules/json5/dist/index.min.js
new file mode 100644
index 0000000..ddce3e2
--- /dev/null
+++ b/node_modules/json5/dist/index.min.js
@@ -0,0 +1 @@
+!function(u,D){"object"==typeof exports&&"undefined"!=typeof module?module.exports=D():"function"==typeof define&&define.amd?define(D):u.JSON5=D()}(this,function(){"use strict";function u(u,D){return u(D={exports:{}},D.exports),D.exports}var D=u(function(u){var D=u.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=D)}),e=u(function(u){var D=u.exports={version:"2.6.5"};"number"==typeof __e&&(__e=D)}),r=(e.version,function(u){return"object"==typeof u?null!==u:"function"==typeof u}),t=function(u){if(!r(u))throw TypeError(u+" is not an object!");return u},n=function(u){try{return!!u()}catch(u){return!0}},F=!n(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),C=D.document,A=r(C)&&r(C.createElement),i=!F&&!n(function(){return 7!=Object.defineProperty((u="div",A?C.createElement(u):{}),"a",{get:function(){return 7}}).a;var u}),E=Object.defineProperty,o={f:F?Object.defineProperty:function(u,D,e){if(t(u),D=function(u,D){if(!r(u))return u;var e,t;if(D&&"function"==typeof(e=u.toString)&&!r(t=e.call(u)))return t;if("function"==typeof(e=u.valueOf)&&!r(t=e.call(u)))return t;if(!D&&"function"==typeof(e=u.toString)&&!r(t=e.call(u)))return t;throw TypeError("Can't convert object to primitive value")}(D,!0),t(e),i)try{return E(u,D,e)}catch(u){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(u[D]=e.value),u}},a=F?function(u,D,e){return o.f(u,D,function(u,D){return{enumerable:!(1&u),configurable:!(2&u),writable:!(4&u),value:D}}(1,e))}:function(u,D,e){return u[D]=e,u},c={}.hasOwnProperty,B=function(u,D){return c.call(u,D)},s=0,f=Math.random(),l=u(function(u){var r=D["__core-js_shared__"]||(D["__core-js_shared__"]={});(u.exports=function(u,D){return r[u]||(r[u]=void 0!==D?D:{})})("versions",[]).push({version:e.version,mode:"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})})("native-function-to-string",Function.toString),d=u(function(u){var r,t="Symbol(".concat(void 0===(r="src")?"":r,")_",(++s+f).toString(36)),n=(""+l).split("toString");e.inspectSource=function(u){return l.call(u)},(u.exports=function(u,e,r,F){var C="function"==typeof r;C&&(B(r,"name")||a(r,"name",e)),u[e]!==r&&(C&&(B(r,t)||a(r,t,u[e]?""+u[e]:n.join(String(e)))),u===D?u[e]=r:F?u[e]?u[e]=r:a(u,e,r):(delete u[e],a(u,e,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[t]||l.call(this)})}),v=function(u,D,e){if(function(u){if("function"!=typeof u)throw TypeError(u+" is not a function!")}(u),void 0===D)return u;switch(e){case 1:return function(e){return u.call(D,e)};case 2:return function(e,r){return u.call(D,e,r)};case 3:return function(e,r,t){return u.call(D,e,r,t)}}return function(){return u.apply(D,arguments)}},p=function(u,r,t){var n,F,C,A,i=u&p.F,E=u&p.G,o=u&p.S,c=u&p.P,B=u&p.B,s=E?D:o?D[r]||(D[r]={}):(D[r]||{}).prototype,f=E?e:e[r]||(e[r]={}),l=f.prototype||(f.prototype={});for(n in E&&(t=r),t)C=((F=!i&&s&&void 0!==s[n])?s:t)[n],A=B&&F?v(C,D):c&&"function"==typeof C?v(Function.call,C):C,s&&d(s,n,C,u&p.U),f[n]!=C&&a(f,n,A),c&&l[n]!=C&&(l[n]=C)};D.core=e,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,p.U=64,p.R=128;var h,m=p,g=Math.ceil,y=Math.floor,w=function(u){return isNaN(u=+u)?0:(u>0?y:g)(u)},b=(h=!1,function(u,D){var e,r,t=String(function(u){if(null==u)throw TypeError("Can't call method on "+u);return u}(u)),n=w(D),F=t.length;return n<0||n>=F?h?"":void 0:(e=t.charCodeAt(n))<55296||e>56319||n+1===F||(r=t.charCodeAt(n+1))<56320||r>57343?h?t.charAt(n):e:h?t.slice(n,n+2):r-56320+(e-55296<<10)+65536});m(m.P,"String",{codePointAt:function(u){return b(this,u)}});e.String.codePointAt;var S=Math.max,x=Math.min,N=String.fromCharCode,P=String.fromCodePoint;m(m.S+m.F*(!!P&&1!=P.length),"String",{fromCodePoint:function(u){for(var D,e,r,t=arguments,n=[],F=arguments.length,C=0;F>C;){if(D=+t[C++],r=1114111,((e=w(e=D))<0?S(e+r,0):x(e,r))!==D)throw RangeError(D+" is not a valid code point");n.push(D<65536?N(D):N(55296+((D-=65536)>>10),D%1024+56320))}return n.join("")}});e.String.fromCodePoint;var _,O,j,I,V,J,M,k,L,T,z,H,$,R,G={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},U={isSpaceSeparator:function(u){return"string"==typeof u&&G.Space_Separator.test(u)},isIdStartChar:function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||G.ID_Start.test(u))},isIdContinueChar:function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||""===u||""===u||G.ID_Continue.test(u))},isDigit:function(u){return"string"==typeof u&&/[0-9]/.test(u)},isHexDigit:function(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};function Z(){for(T="default",z="",H=!1,$=1;;){R=q();var u=X[T]();if(u)return u}}function q(){if(_[I])return String.fromCodePoint(_.codePointAt(I))}function W(){var u=q();return"\n"===u?(V++,J=0):u?J+=u.length:J++,u&&(I+=u.length),u}var X={default:function(){switch(R){case"\t":case"\v":case"\f":case" ":case" ":case"\ufeff":case"\n":case"\r":case"\u2028":case"\u2029":return void W();case"/":return W(),void(T="comment");case void 0:return W(),K("eof")}if(!U.isSpaceSeparator(R))return X[O]();W()},comment:function(){switch(R){case"*":return W(),void(T="multiLineComment");case"/":return W(),void(T="singleLineComment")}throw ru(W())},multiLineComment:function(){switch(R){case"*":return W(),void(T="multiLineCommentAsterisk");case void 0:throw ru(W())}W()},multiLineCommentAsterisk:function(){switch(R){case"*":return void W();case"/":return W(),void(T="default");case void 0:throw ru(W())}W(),T="multiLineComment"},singleLineComment:function(){switch(R){case"\n":case"\r":case"\u2028":case"\u2029":return W(),void(T="default");case void 0:return W(),K("eof")}W()},value:function(){switch(R){case"{":case"[":return K("punctuator",W());case"n":return W(),Q("ull"),K("null",null);case"t":return W(),Q("rue"),K("boolean",!0);case"f":return W(),Q("alse"),K("boolean",!1);case"-":case"+":return"-"===W()&&($=-1),void(T="sign");case".":return z=W(),void(T="decimalPointLeading");case"0":return z=W(),void(T="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return z=W(),void(T="decimalInteger");case"I":return W(),Q("nfinity"),K("numeric",1/0);case"N":return W(),Q("aN"),K("numeric",NaN);case'"':case"'":return H='"'===W(),z="",void(T="string")}throw ru(W())},identifierNameStartEscape:function(){if("u"!==R)throw ru(W());W();var u=Y();switch(u){case"$":case"_":break;default:if(!U.isIdStartChar(u))throw nu()}z+=u,T="identifierName"},identifierName:function(){switch(R){case"$":case"_":case"":case"":return void(z+=W());case"\\":return W(),void(T="identifierNameEscape")}if(!U.isIdContinueChar(R))return K("identifier",z);z+=W()},identifierNameEscape:function(){if("u"!==R)throw ru(W());W();var u=Y();switch(u){case"$":case"_":case"":case"":break;default:if(!U.isIdContinueChar(u))throw nu()}z+=u,T="identifierName"},sign:function(){switch(R){case".":return z=W(),void(T="decimalPointLeading");case"0":return z=W(),void(T="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return z=W(),void(T="decimalInteger");case"I":return W(),Q("nfinity"),K("numeric",$*(1/0));case"N":return W(),Q("aN"),K("numeric",NaN)}throw ru(W())},zero:function(){switch(R){case".":return z+=W(),void(T="decimalPoint");case"e":case"E":return z+=W(),void(T="decimalExponent");case"x":case"X":return z+=W(),void(T="hexadecimal")}return K("numeric",0*$)},decimalInteger:function(){switch(R){case".":return z+=W(),void(T="decimalPoint");case"e":case"E":return z+=W(),void(T="decimalExponent")}if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},decimalPointLeading:function(){if(U.isDigit(R))return z+=W(),void(T="decimalFraction");throw ru(W())},decimalPoint:function(){switch(R){case"e":case"E":return z+=W(),void(T="decimalExponent")}return U.isDigit(R)?(z+=W(),void(T="decimalFraction")):K("numeric",$*Number(z))},decimalFraction:function(){switch(R){case"e":case"E":return z+=W(),void(T="decimalExponent")}if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},decimalExponent:function(){switch(R){case"+":case"-":return z+=W(),void(T="decimalExponentSign")}if(U.isDigit(R))return z+=W(),void(T="decimalExponentInteger");throw ru(W())},decimalExponentSign:function(){if(U.isDigit(R))return z+=W(),void(T="decimalExponentInteger");throw ru(W())},decimalExponentInteger:function(){if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},hexadecimal:function(){if(U.isHexDigit(R))return z+=W(),void(T="hexadecimalInteger");throw ru(W())},hexadecimalInteger:function(){if(!U.isHexDigit(R))return K("numeric",$*Number(z));z+=W()},string:function(){switch(R){case"\\":return W(),void(z+=function(){switch(q()){case"b":return W(),"\b";case"f":return W(),"\f";case"n":return W(),"\n";case"r":return W(),"\r";case"t":return W(),"\t";case"v":return W(),"\v";case"0":if(W(),U.isDigit(q()))throw ru(W());return"\0";case"x":return W(),function(){var u="",D=q();if(!U.isHexDigit(D))throw ru(W());if(u+=W(),D=q(),!U.isHexDigit(D))throw ru(W());return u+=W(),String.fromCodePoint(parseInt(u,16))}();case"u":return W(),Y();case"\n":case"\u2028":case"\u2029":return W(),"";case"\r":return W(),"\n"===q()&&W(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw ru(W())}return W()}());case'"':return H?(W(),K("string",z)):void(z+=W());case"'":return H?void(z+=W()):(W(),K("string",z));case"\n":case"\r":throw ru(W());case"\u2028":case"\u2029":!function(u){console.warn("JSON5: '"+Fu(u)+"' in strings is not valid ECMAScript; consider escaping")}(R);break;case void 0:throw ru(W())}z+=W()},start:function(){switch(R){case"{":case"[":return K("punctuator",W())}T="value"},beforePropertyName:function(){switch(R){case"$":case"_":return z=W(),void(T="identifierName");case"\\":return W(),void(T="identifierNameStartEscape");case"}":return K("punctuator",W());case'"':case"'":return H='"'===W(),void(T="string")}if(U.isIdStartChar(R))return z+=W(),void(T="identifierName");throw ru(W())},afterPropertyName:function(){if(":"===R)return K("punctuator",W());throw ru(W())},beforePropertyValue:function(){T="value"},afterPropertyValue:function(){switch(R){case",":case"}":return K("punctuator",W())}throw ru(W())},beforeArrayValue:function(){if("]"===R)return K("punctuator",W());T="value"},afterArrayValue:function(){switch(R){case",":case"]":return K("punctuator",W())}throw ru(W())},end:function(){throw ru(W())}};function K(u,D){return{type:u,value:D,line:V,column:J}}function Q(u){for(var D=0,e=u;D0;){var e=q();if(!U.isHexDigit(e))throw ru(W());u+=W()}return String.fromCodePoint(parseInt(u,16))}var uu={start:function(){if("eof"===M.type)throw tu();Du()},beforePropertyName:function(){switch(M.type){case"identifier":case"string":return k=M.value,void(O="afterPropertyName");case"punctuator":return void eu();case"eof":throw tu()}},afterPropertyName:function(){if("eof"===M.type)throw tu();O="beforePropertyValue"},beforePropertyValue:function(){if("eof"===M.type)throw tu();Du()},beforeArrayValue:function(){if("eof"===M.type)throw tu();"punctuator"!==M.type||"]"!==M.value?Du():eu()},afterPropertyValue:function(){if("eof"===M.type)throw tu();switch(M.value){case",":return void(O="beforePropertyName");case"}":eu()}},afterArrayValue:function(){if("eof"===M.type)throw tu();switch(M.value){case",":return void(O="beforeArrayValue");case"]":eu()}},end:function(){}};function Du(){var u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}if(void 0===L)L=u;else{var D=j[j.length-1];Array.isArray(D)?D.push(u):Object.defineProperty(D,k,{value:u,writable:!0,enumerable:!0,configurable:!0})}if(null!==u&&"object"==typeof u)j.push(u),O=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{var e=j[j.length-1];O=null==e?"end":Array.isArray(e)?"afterArrayValue":"afterPropertyValue"}}function eu(){j.pop();var u=j[j.length-1];O=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function ru(u){return Cu(void 0===u?"JSON5: invalid end of input at "+V+":"+J:"JSON5: invalid character '"+Fu(u)+"' at "+V+":"+J)}function tu(){return Cu("JSON5: invalid end of input at "+V+":"+J)}function nu(){return Cu("JSON5: invalid identifier character at "+V+":"+(J-=5))}function Fu(u){var D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){var e=u.charCodeAt(0).toString(16);return"\\x"+("00"+e).substring(e.length)}return u}function Cu(u){var D=new SyntaxError(u);return D.lineNumber=V,D.columnNumber=J,D}return{parse:function(u,D){_=String(u),O="start",j=[],I=0,V=1,J=0,M=void 0,k=void 0,L=void 0;do{M=Z(),uu[O]()}while("eof"!==M.type);return"function"==typeof D?function u(D,e,r){var t=D[e];if(null!=t&&"object"==typeof t)if(Array.isArray(t))for(var n=0;n0&&(e=Math.min(10,Math.floor(e)),A=" ".substr(0,e)):"string"==typeof e&&(A=e.substr(0,10)),c("",{"":u});function c(u,D){var e=D[u];switch(null!=e&&("function"==typeof e.toJSON5?e=e.toJSON5(u):"function"==typeof e.toJSON&&(e=e.toJSON(u))),t&&(e=t.call(D,u,e)),e instanceof Number?e=Number(e):e instanceof String?e=String(e):e instanceof Boolean&&(e=e.valueOf()),e){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof e?B(e):"number"==typeof e?String(e):"object"==typeof e?Array.isArray(e)?function(u){if(F.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");F.push(u);var D=C;C+=A;for(var e,r=[],t=0;t=0)throw TypeError("Converting circular structure to JSON5");F.push(u);var D=C;C+=A;for(var e,t,n=r||Object.keys(u),i=[],E=0,o=n;E"string"==typeof u&&unicode.Space_Separator.test(u),isIdStartChar:u=>"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||unicode.ID_Start.test(u)),isIdContinueChar:u=>"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||""===u||""===u||unicode.ID_Continue.test(u)),isDigit:u=>"string"==typeof u&&/[0-9]/.test(u),isHexDigit:u=>"string"==typeof u&&/[0-9A-Fa-f]/.test(u)};let source,parseState,stack,pos,line,column,token,key,root;var parse=function(u,D){source=String(u),parseState="start",stack=[],pos=0,line=1,column=0,token=void 0,key=void 0,root=void 0;do{token=lex(),parseStates[parseState]()}while("eof"!==token.type);return"function"==typeof D?internalize({"":root},"",D):root};function internalize(u,D,e){const r=u[D];if(null!=r&&"object"==typeof r)if(Array.isArray(r))for(let u=0;u0;){const D=peek();if(!util.isHexDigit(D))throw invalidChar(read());u+=read()}return String.fromCodePoint(parseInt(u,16))}const parseStates={start(){if("eof"===token.type)throw invalidEOF();push()},beforePropertyName(){switch(token.type){case"identifier":case"string":return key=token.value,void(parseState="afterPropertyName");case"punctuator":return void pop();case"eof":throw invalidEOF()}},afterPropertyName(){if("eof"===token.type)throw invalidEOF();parseState="beforePropertyValue"},beforePropertyValue(){if("eof"===token.type)throw invalidEOF();push()},beforeArrayValue(){if("eof"===token.type)throw invalidEOF();"punctuator"!==token.type||"]"!==token.value?push():pop()},afterPropertyValue(){if("eof"===token.type)throw invalidEOF();switch(token.value){case",":return void(parseState="beforePropertyName");case"}":pop()}},afterArrayValue(){if("eof"===token.type)throw invalidEOF();switch(token.value){case",":return void(parseState="beforeArrayValue");case"]":pop()}},end(){}};function push(){let u;switch(token.type){case"punctuator":switch(token.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=token.value}if(void 0===root)root=u;else{const D=stack[stack.length-1];Array.isArray(D)?D.push(u):Object.defineProperty(D,key,{value:u,writable:!0,enumerable:!0,configurable:!0})}if(null!==u&&"object"==typeof u)stack.push(u),parseState=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=stack[stack.length-1];parseState=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}}function pop(){stack.pop();const u=stack[stack.length-1];parseState=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function invalidChar(u){return syntaxError(void 0===u?`JSON5: invalid end of input at ${line}:${column}`:`JSON5: invalid character '${formatChar(u)}' at ${line}:${column}`)}function invalidEOF(){return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)}function invalidIdentifier(){return syntaxError(`JSON5: invalid identifier character at ${line}:${column-=5}`)}function separatorChar(u){console.warn(`JSON5: '${formatChar(u)}' in strings is not valid ECMAScript; consider escaping`)}function formatChar(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return"\\x"+("00"+D).substring(D.length)}return u}function syntaxError(u){const D=new SyntaxError(u);return D.lineNumber=line,D.columnNumber=column,D}var stringify=function(u,D,e){const r=[];let t,F,C,a="",A="";if(null==D||"object"!=typeof D||Array.isArray(D)||(e=D.space,C=D.quote,D=D.replacer),"function"==typeof D)F=D;else if(Array.isArray(D)){t=[];for(const u of D){let D;"string"==typeof u?D=u:("number"==typeof u||u instanceof String||u instanceof Number)&&(D=String(u)),void 0!==D&&t.indexOf(D)<0&&t.push(D)}}return e instanceof Number?e=Number(e):e instanceof String&&(e=String(e)),"number"==typeof e?e>0&&(e=Math.min(10,Math.floor(e)),A=" ".substr(0,e)):"string"==typeof e&&(A=e.substr(0,10)),n("",{"":u});function n(u,D){let e=D[u];switch(null!=e&&("function"==typeof e.toJSON5?e=e.toJSON5(u):"function"==typeof e.toJSON&&(e=e.toJSON(u))),F&&(e=F.call(D,u,e)),e instanceof Number?e=Number(e):e instanceof String?e=String(e):e instanceof Boolean&&(e=e.valueOf()),e){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof e?E(e):"number"==typeof e?String(e):"object"==typeof e?Array.isArray(e)?function(u){if(r.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");r.push(u);let D=a;a+=A;let e,t=[];for(let D=0;D=0)throw TypeError("Converting circular structure to JSON5");r.push(u);let D=a;a+=A;let e,F=t||Object.keys(u),C=[];for(const D of F){const e=n(D,u);if(void 0!==e){let u=i(D)+":";""!==A&&(u+=" "),u+=e,C.push(u)}}if(0===C.length)e="{}";else{let u;if(""===A)u=C.join(","),e="{"+u+"}";else{let r=",\n"+a;u=C.join(r),e="{\n"+a+u+",\n"+D+"}"}}return r.pop(),a=D,e}(e):void 0}function E(u){const D={"'":.1,'"':.2},e={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};let r="";for(let t=0;tD[u]= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c === '$') || (c === '_') ||
+ unicode.ID_Start.test(c)
+ )
+ },
+
+ isIdContinueChar (c) {
+ return typeof c === 'string' && (
+ (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c >= '0' && c <= '9') ||
+ (c === '$') || (c === '_') ||
+ (c === '\u200C') || (c === '\u200D') ||
+ unicode.ID_Continue.test(c)
+ )
+ },
+
+ isDigit (c) {
+ return typeof c === 'string' && /[0-9]/.test(c)
+ },
+
+ isHexDigit (c) {
+ return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)
+ },
+};
+
+let source;
+let parseState;
+let stack;
+let pos;
+let line;
+let column;
+let token;
+let key;
+let root;
+
+var parse = function parse (text, reviver) {
+ source = String(text);
+ parseState = 'start';
+ stack = [];
+ pos = 0;
+ line = 1;
+ column = 0;
+ token = undefined;
+ key = undefined;
+ root = undefined;
+
+ do {
+ token = lex();
+
+ // This code is unreachable.
+ // if (!parseStates[parseState]) {
+ // throw invalidParseState()
+ // }
+
+ parseStates[parseState]();
+ } while (token.type !== 'eof')
+
+ if (typeof reviver === 'function') {
+ return internalize({'': root}, '', reviver)
+ }
+
+ return root
+};
+
+function internalize (holder, name, reviver) {
+ const value = holder[name];
+ if (value != null && typeof value === 'object') {
+ if (Array.isArray(value)) {
+ for (let i = 0; i < value.length; i++) {
+ const key = String(i);
+ const replacement = internalize(value, key, reviver);
+ if (replacement === undefined) {
+ delete value[key];
+ } else {
+ Object.defineProperty(value, key, {
+ value: replacement,
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ });
+ }
+ }
+ } else {
+ for (const key in value) {
+ const replacement = internalize(value, key, reviver);
+ if (replacement === undefined) {
+ delete value[key];
+ } else {
+ Object.defineProperty(value, key, {
+ value: replacement,
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ });
+ }
+ }
+ }
+ }
+
+ return reviver.call(holder, name, value)
+}
+
+let lexState;
+let buffer;
+let doubleQuote;
+let sign;
+let c;
+
+function lex () {
+ lexState = 'default';
+ buffer = '';
+ doubleQuote = false;
+ sign = 1;
+
+ for (;;) {
+ c = peek();
+
+ // This code is unreachable.
+ // if (!lexStates[lexState]) {
+ // throw invalidLexState(lexState)
+ // }
+
+ const token = lexStates[lexState]();
+ if (token) {
+ return token
+ }
+ }
+}
+
+function peek () {
+ if (source[pos]) {
+ return String.fromCodePoint(source.codePointAt(pos))
+ }
+}
+
+function read () {
+ const c = peek();
+
+ if (c === '\n') {
+ line++;
+ column = 0;
+ } else if (c) {
+ column += c.length;
+ } else {
+ column++;
+ }
+
+ if (c) {
+ pos += c.length;
+ }
+
+ return c
+}
+
+const lexStates = {
+ default () {
+ switch (c) {
+ case '\t':
+ case '\v':
+ case '\f':
+ case ' ':
+ case '\u00A0':
+ case '\uFEFF':
+ case '\n':
+ case '\r':
+ case '\u2028':
+ case '\u2029':
+ read();
+ return
+
+ case '/':
+ read();
+ lexState = 'comment';
+ return
+
+ case undefined:
+ read();
+ return newToken('eof')
+ }
+
+ if (util.isSpaceSeparator(c)) {
+ read();
+ return
+ }
+
+ // This code is unreachable.
+ // if (!lexStates[parseState]) {
+ // throw invalidLexState(parseState)
+ // }
+
+ return lexStates[parseState]()
+ },
+
+ comment () {
+ switch (c) {
+ case '*':
+ read();
+ lexState = 'multiLineComment';
+ return
+
+ case '/':
+ read();
+ lexState = 'singleLineComment';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ multiLineComment () {
+ switch (c) {
+ case '*':
+ read();
+ lexState = 'multiLineCommentAsterisk';
+ return
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ read();
+ },
+
+ multiLineCommentAsterisk () {
+ switch (c) {
+ case '*':
+ read();
+ return
+
+ case '/':
+ read();
+ lexState = 'default';
+ return
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ read();
+ lexState = 'multiLineComment';
+ },
+
+ singleLineComment () {
+ switch (c) {
+ case '\n':
+ case '\r':
+ case '\u2028':
+ case '\u2029':
+ read();
+ lexState = 'default';
+ return
+
+ case undefined:
+ read();
+ return newToken('eof')
+ }
+
+ read();
+ },
+
+ value () {
+ switch (c) {
+ case '{':
+ case '[':
+ return newToken('punctuator', read())
+
+ case 'n':
+ read();
+ literal('ull');
+ return newToken('null', null)
+
+ case 't':
+ read();
+ literal('rue');
+ return newToken('boolean', true)
+
+ case 'f':
+ read();
+ literal('alse');
+ return newToken('boolean', false)
+
+ case '-':
+ case '+':
+ if (read() === '-') {
+ sign = -1;
+ }
+
+ lexState = 'sign';
+ return
+
+ case '.':
+ buffer = read();
+ lexState = 'decimalPointLeading';
+ return
+
+ case '0':
+ buffer = read();
+ lexState = 'zero';
+ return
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ buffer = read();
+ lexState = 'decimalInteger';
+ return
+
+ case 'I':
+ read();
+ literal('nfinity');
+ return newToken('numeric', Infinity)
+
+ case 'N':
+ read();
+ literal('aN');
+ return newToken('numeric', NaN)
+
+ case '"':
+ case "'":
+ doubleQuote = (read() === '"');
+ buffer = '';
+ lexState = 'string';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ identifierNameStartEscape () {
+ if (c !== 'u') {
+ throw invalidChar(read())
+ }
+
+ read();
+ const u = unicodeEscape();
+ switch (u) {
+ case '$':
+ case '_':
+ break
+
+ default:
+ if (!util.isIdStartChar(u)) {
+ throw invalidIdentifier()
+ }
+
+ break
+ }
+
+ buffer += u;
+ lexState = 'identifierName';
+ },
+
+ identifierName () {
+ switch (c) {
+ case '$':
+ case '_':
+ case '\u200C':
+ case '\u200D':
+ buffer += read();
+ return
+
+ case '\\':
+ read();
+ lexState = 'identifierNameEscape';
+ return
+ }
+
+ if (util.isIdContinueChar(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('identifier', buffer)
+ },
+
+ identifierNameEscape () {
+ if (c !== 'u') {
+ throw invalidChar(read())
+ }
+
+ read();
+ const u = unicodeEscape();
+ switch (u) {
+ case '$':
+ case '_':
+ case '\u200C':
+ case '\u200D':
+ break
+
+ default:
+ if (!util.isIdContinueChar(u)) {
+ throw invalidIdentifier()
+ }
+
+ break
+ }
+
+ buffer += u;
+ lexState = 'identifierName';
+ },
+
+ sign () {
+ switch (c) {
+ case '.':
+ buffer = read();
+ lexState = 'decimalPointLeading';
+ return
+
+ case '0':
+ buffer = read();
+ lexState = 'zero';
+ return
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ buffer = read();
+ lexState = 'decimalInteger';
+ return
+
+ case 'I':
+ read();
+ literal('nfinity');
+ return newToken('numeric', sign * Infinity)
+
+ case 'N':
+ read();
+ literal('aN');
+ return newToken('numeric', NaN)
+ }
+
+ throw invalidChar(read())
+ },
+
+ zero () {
+ switch (c) {
+ case '.':
+ buffer += read();
+ lexState = 'decimalPoint';
+ return
+
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+
+ case 'x':
+ case 'X':
+ buffer += read();
+ lexState = 'hexadecimal';
+ return
+ }
+
+ return newToken('numeric', sign * 0)
+ },
+
+ decimalInteger () {
+ switch (c) {
+ case '.':
+ buffer += read();
+ lexState = 'decimalPoint';
+ return
+
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalPointLeading () {
+ if (util.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalFraction';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalPoint () {
+ switch (c) {
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalFraction';
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalFraction () {
+ switch (c) {
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalExponent () {
+ switch (c) {
+ case '+':
+ case '-':
+ buffer += read();
+ lexState = 'decimalExponentSign';
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalExponentInteger';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalExponentSign () {
+ if (util.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalExponentInteger';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalExponentInteger () {
+ if (util.isDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ hexadecimal () {
+ if (util.isHexDigit(c)) {
+ buffer += read();
+ lexState = 'hexadecimalInteger';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ hexadecimalInteger () {
+ if (util.isHexDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ string () {
+ switch (c) {
+ case '\\':
+ read();
+ buffer += escape();
+ return
+
+ case '"':
+ if (doubleQuote) {
+ read();
+ return newToken('string', buffer)
+ }
+
+ buffer += read();
+ return
+
+ case "'":
+ if (!doubleQuote) {
+ read();
+ return newToken('string', buffer)
+ }
+
+ buffer += read();
+ return
+
+ case '\n':
+ case '\r':
+ throw invalidChar(read())
+
+ case '\u2028':
+ case '\u2029':
+ separatorChar(c);
+ break
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+ },
+
+ start () {
+ switch (c) {
+ case '{':
+ case '[':
+ return newToken('punctuator', read())
+
+ // This code is unreachable since the default lexState handles eof.
+ // case undefined:
+ // return newToken('eof')
+ }
+
+ lexState = 'value';
+ },
+
+ beforePropertyName () {
+ switch (c) {
+ case '$':
+ case '_':
+ buffer = read();
+ lexState = 'identifierName';
+ return
+
+ case '\\':
+ read();
+ lexState = 'identifierNameStartEscape';
+ return
+
+ case '}':
+ return newToken('punctuator', read())
+
+ case '"':
+ case "'":
+ doubleQuote = (read() === '"');
+ lexState = 'string';
+ return
+ }
+
+ if (util.isIdStartChar(c)) {
+ buffer += read();
+ lexState = 'identifierName';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ afterPropertyName () {
+ if (c === ':') {
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ beforePropertyValue () {
+ lexState = 'value';
+ },
+
+ afterPropertyValue () {
+ switch (c) {
+ case ',':
+ case '}':
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ beforeArrayValue () {
+ if (c === ']') {
+ return newToken('punctuator', read())
+ }
+
+ lexState = 'value';
+ },
+
+ afterArrayValue () {
+ switch (c) {
+ case ',':
+ case ']':
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ end () {
+ // This code is unreachable since it's handled by the default lexState.
+ // if (c === undefined) {
+ // read()
+ // return newToken('eof')
+ // }
+
+ throw invalidChar(read())
+ },
+};
+
+function newToken (type, value) {
+ return {
+ type,
+ value,
+ line,
+ column,
+ }
+}
+
+function literal (s) {
+ for (const c of s) {
+ const p = peek();
+
+ if (p !== c) {
+ throw invalidChar(read())
+ }
+
+ read();
+ }
+}
+
+function escape () {
+ const c = peek();
+ switch (c) {
+ case 'b':
+ read();
+ return '\b'
+
+ case 'f':
+ read();
+ return '\f'
+
+ case 'n':
+ read();
+ return '\n'
+
+ case 'r':
+ read();
+ return '\r'
+
+ case 't':
+ read();
+ return '\t'
+
+ case 'v':
+ read();
+ return '\v'
+
+ case '0':
+ read();
+ if (util.isDigit(peek())) {
+ throw invalidChar(read())
+ }
+
+ return '\0'
+
+ case 'x':
+ read();
+ return hexEscape()
+
+ case 'u':
+ read();
+ return unicodeEscape()
+
+ case '\n':
+ case '\u2028':
+ case '\u2029':
+ read();
+ return ''
+
+ case '\r':
+ read();
+ if (peek() === '\n') {
+ read();
+ }
+
+ return ''
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ throw invalidChar(read())
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ return read()
+}
+
+function hexEscape () {
+ let buffer = '';
+ let c = peek();
+
+ if (!util.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+
+ c = peek();
+ if (!util.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+
+ return String.fromCodePoint(parseInt(buffer, 16))
+}
+
+function unicodeEscape () {
+ let buffer = '';
+ let count = 4;
+
+ while (count-- > 0) {
+ const c = peek();
+ if (!util.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+ }
+
+ return String.fromCodePoint(parseInt(buffer, 16))
+}
+
+const parseStates = {
+ start () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ push();
+ },
+
+ beforePropertyName () {
+ switch (token.type) {
+ case 'identifier':
+ case 'string':
+ key = token.value;
+ parseState = 'afterPropertyName';
+ return
+
+ case 'punctuator':
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.value !== '}') {
+ // throw invalidToken()
+ // }
+
+ pop();
+ return
+
+ case 'eof':
+ throw invalidEOF()
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ afterPropertyName () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator' || token.value !== ':') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ parseState = 'beforePropertyValue';
+ },
+
+ beforePropertyValue () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ push();
+ },
+
+ beforeArrayValue () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ if (token.type === 'punctuator' && token.value === ']') {
+ pop();
+ return
+ }
+
+ push();
+ },
+
+ afterPropertyValue () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ switch (token.value) {
+ case ',':
+ parseState = 'beforePropertyName';
+ return
+
+ case '}':
+ pop();
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ afterArrayValue () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ switch (token.value) {
+ case ',':
+ parseState = 'beforeArrayValue';
+ return
+
+ case ']':
+ pop();
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ end () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'eof') {
+ // throw invalidToken()
+ // }
+ },
+};
+
+function push () {
+ let value;
+
+ switch (token.type) {
+ case 'punctuator':
+ switch (token.value) {
+ case '{':
+ value = {};
+ break
+
+ case '[':
+ value = [];
+ break
+ }
+
+ break
+
+ case 'null':
+ case 'boolean':
+ case 'numeric':
+ case 'string':
+ value = token.value;
+ break
+
+ // This code is unreachable.
+ // default:
+ // throw invalidToken()
+ }
+
+ if (root === undefined) {
+ root = value;
+ } else {
+ const parent = stack[stack.length - 1];
+ if (Array.isArray(parent)) {
+ parent.push(value);
+ } else {
+ Object.defineProperty(parent, key, {
+ value,
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ });
+ }
+ }
+
+ if (value !== null && typeof value === 'object') {
+ stack.push(value);
+
+ if (Array.isArray(value)) {
+ parseState = 'beforeArrayValue';
+ } else {
+ parseState = 'beforePropertyName';
+ }
+ } else {
+ const current = stack[stack.length - 1];
+ if (current == null) {
+ parseState = 'end';
+ } else if (Array.isArray(current)) {
+ parseState = 'afterArrayValue';
+ } else {
+ parseState = 'afterPropertyValue';
+ }
+ }
+}
+
+function pop () {
+ stack.pop();
+
+ const current = stack[stack.length - 1];
+ if (current == null) {
+ parseState = 'end';
+ } else if (Array.isArray(current)) {
+ parseState = 'afterArrayValue';
+ } else {
+ parseState = 'afterPropertyValue';
+ }
+}
+
+// This code is unreachable.
+// function invalidParseState () {
+// return new Error(`JSON5: invalid parse state '${parseState}'`)
+// }
+
+// This code is unreachable.
+// function invalidLexState (state) {
+// return new Error(`JSON5: invalid lex state '${state}'`)
+// }
+
+function invalidChar (c) {
+ if (c === undefined) {
+ return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
+ }
+
+ return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
+}
+
+function invalidEOF () {
+ return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
+}
+
+// This code is unreachable.
+// function invalidToken () {
+// if (token.type === 'eof') {
+// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
+// }
+
+// const c = String.fromCodePoint(token.value.codePointAt(0))
+// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
+// }
+
+function invalidIdentifier () {
+ column -= 5;
+ return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`)
+}
+
+function separatorChar (c) {
+ console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`);
+}
+
+function formatChar (c) {
+ const replacements = {
+ "'": "\\'",
+ '"': '\\"',
+ '\\': '\\\\',
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+ '\v': '\\v',
+ '\0': '\\0',
+ '\u2028': '\\u2028',
+ '\u2029': '\\u2029',
+ };
+
+ if (replacements[c]) {
+ return replacements[c]
+ }
+
+ if (c < ' ') {
+ const hexString = c.charCodeAt(0).toString(16);
+ return '\\x' + ('00' + hexString).substring(hexString.length)
+ }
+
+ return c
+}
+
+function syntaxError (message) {
+ const err = new SyntaxError(message);
+ err.lineNumber = line;
+ err.columnNumber = column;
+ return err
+}
+
+var stringify = function stringify (value, replacer, space) {
+ const stack = [];
+ let indent = '';
+ let propertyList;
+ let replacerFunc;
+ let gap = '';
+ let quote;
+
+ if (
+ replacer != null &&
+ typeof replacer === 'object' &&
+ !Array.isArray(replacer)
+ ) {
+ space = replacer.space;
+ quote = replacer.quote;
+ replacer = replacer.replacer;
+ }
+
+ if (typeof replacer === 'function') {
+ replacerFunc = replacer;
+ } else if (Array.isArray(replacer)) {
+ propertyList = [];
+ for (const v of replacer) {
+ let item;
+
+ if (typeof v === 'string') {
+ item = v;
+ } else if (
+ typeof v === 'number' ||
+ v instanceof String ||
+ v instanceof Number
+ ) {
+ item = String(v);
+ }
+
+ if (item !== undefined && propertyList.indexOf(item) < 0) {
+ propertyList.push(item);
+ }
+ }
+ }
+
+ if (space instanceof Number) {
+ space = Number(space);
+ } else if (space instanceof String) {
+ space = String(space);
+ }
+
+ if (typeof space === 'number') {
+ if (space > 0) {
+ space = Math.min(10, Math.floor(space));
+ gap = ' '.substr(0, space);
+ }
+ } else if (typeof space === 'string') {
+ gap = space.substr(0, 10);
+ }
+
+ return serializeProperty('', {'': value})
+
+ function serializeProperty (key, holder) {
+ let value = holder[key];
+ if (value != null) {
+ if (typeof value.toJSON5 === 'function') {
+ value = value.toJSON5(key);
+ } else if (typeof value.toJSON === 'function') {
+ value = value.toJSON(key);
+ }
+ }
+
+ if (replacerFunc) {
+ value = replacerFunc.call(holder, key, value);
+ }
+
+ if (value instanceof Number) {
+ value = Number(value);
+ } else if (value instanceof String) {
+ value = String(value);
+ } else if (value instanceof Boolean) {
+ value = value.valueOf();
+ }
+
+ switch (value) {
+ case null: return 'null'
+ case true: return 'true'
+ case false: return 'false'
+ }
+
+ if (typeof value === 'string') {
+ return quoteString(value, false)
+ }
+
+ if (typeof value === 'number') {
+ return String(value)
+ }
+
+ if (typeof value === 'object') {
+ return Array.isArray(value) ? serializeArray(value) : serializeObject(value)
+ }
+
+ return undefined
+ }
+
+ function quoteString (value) {
+ const quotes = {
+ "'": 0.1,
+ '"': 0.2,
+ };
+
+ const replacements = {
+ "'": "\\'",
+ '"': '\\"',
+ '\\': '\\\\',
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+ '\v': '\\v',
+ '\0': '\\0',
+ '\u2028': '\\u2028',
+ '\u2029': '\\u2029',
+ };
+
+ let product = '';
+
+ for (let i = 0; i < value.length; i++) {
+ const c = value[i];
+ switch (c) {
+ case "'":
+ case '"':
+ quotes[c]++;
+ product += c;
+ continue
+
+ case '\0':
+ if (util.isDigit(value[i + 1])) {
+ product += '\\x00';
+ continue
+ }
+ }
+
+ if (replacements[c]) {
+ product += replacements[c];
+ continue
+ }
+
+ if (c < ' ') {
+ let hexString = c.charCodeAt(0).toString(16);
+ product += '\\x' + ('00' + hexString).substring(hexString.length);
+ continue
+ }
+
+ product += c;
+ }
+
+ const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b);
+
+ product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);
+
+ return quoteChar + product + quoteChar
+ }
+
+ function serializeObject (value) {
+ if (stack.indexOf(value) >= 0) {
+ throw TypeError('Converting circular structure to JSON5')
+ }
+
+ stack.push(value);
+
+ let stepback = indent;
+ indent = indent + gap;
+
+ let keys = propertyList || Object.keys(value);
+ let partial = [];
+ for (const key of keys) {
+ const propertyString = serializeProperty(key, value);
+ if (propertyString !== undefined) {
+ let member = serializeKey(key) + ':';
+ if (gap !== '') {
+ member += ' ';
+ }
+ member += propertyString;
+ partial.push(member);
+ }
+ }
+
+ let final;
+ if (partial.length === 0) {
+ final = '{}';
+ } else {
+ let properties;
+ if (gap === '') {
+ properties = partial.join(',');
+ final = '{' + properties + '}';
+ } else {
+ let separator = ',\n' + indent;
+ properties = partial.join(separator);
+ final = '{\n' + indent + properties + ',\n' + stepback + '}';
+ }
+ }
+
+ stack.pop();
+ indent = stepback;
+ return final
+ }
+
+ function serializeKey (key) {
+ if (key.length === 0) {
+ return quoteString(key, true)
+ }
+
+ const firstChar = String.fromCodePoint(key.codePointAt(0));
+ if (!util.isIdStartChar(firstChar)) {
+ return quoteString(key, true)
+ }
+
+ for (let i = firstChar.length; i < key.length; i++) {
+ if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {
+ return quoteString(key, true)
+ }
+ }
+
+ return key
+ }
+
+ function serializeArray (value) {
+ if (stack.indexOf(value) >= 0) {
+ throw TypeError('Converting circular structure to JSON5')
+ }
+
+ stack.push(value);
+
+ let stepback = indent;
+ indent = indent + gap;
+
+ let partial = [];
+ for (let i = 0; i < value.length; i++) {
+ const propertyString = serializeProperty(String(i), value);
+ partial.push((propertyString !== undefined) ? propertyString : 'null');
+ }
+
+ let final;
+ if (partial.length === 0) {
+ final = '[]';
+ } else {
+ if (gap === '') {
+ let properties = partial.join(',');
+ final = '[' + properties + ']';
+ } else {
+ let separator = ',\n' + indent;
+ let properties = partial.join(separator);
+ final = '[\n' + indent + properties + ',\n' + stepback + ']';
+ }
+ }
+
+ stack.pop();
+ indent = stepback;
+ return final
+ }
+};
+
+const JSON5 = {
+ parse,
+ stringify,
+};
+
+var lib = JSON5;
+
+export default lib;
diff --git a/node_modules/json5/lib/cli.js b/node_modules/json5/lib/cli.js
new file mode 100755
index 0000000..93cb809
--- /dev/null
+++ b/node_modules/json5/lib/cli.js
@@ -0,0 +1,152 @@
+#!/usr/bin/env node
+
+const fs = require('fs')
+const path = require('path')
+const pkg = require('../package.json')
+const JSON5 = require('./')
+
+const argv = parseArgs()
+
+if (argv.version) {
+ version()
+} else if (argv.help) {
+ usage()
+} else {
+ const inFilename = argv.defaults[0]
+
+ let readStream
+ if (inFilename) {
+ readStream = fs.createReadStream(inFilename)
+ } else {
+ readStream = process.stdin
+ }
+
+ let json5 = ''
+ readStream.on('data', data => {
+ json5 += data
+ })
+
+ readStream.on('end', () => {
+ let space
+ if (argv.space === 't' || argv.space === 'tab') {
+ space = '\t'
+ } else {
+ space = Number(argv.space)
+ }
+
+ let value
+ try {
+ value = JSON5.parse(json5)
+ if (!argv.validate) {
+ const json = JSON.stringify(value, null, space)
+
+ let writeStream
+
+ // --convert is for backward compatibility with v0.5.1. If
+ // specified with and not --out-file, then a file with
+ // the same name but with a .json extension will be written.
+ if (argv.convert && inFilename && !argv.outFile) {
+ const parsedFilename = path.parse(inFilename)
+ const outFilename = path.format(
+ Object.assign(
+ parsedFilename,
+ {base: path.basename(parsedFilename.base, parsedFilename.ext) + '.json'}
+ )
+ )
+
+ writeStream = fs.createWriteStream(outFilename)
+ } else if (argv.outFile) {
+ writeStream = fs.createWriteStream(argv.outFile)
+ } else {
+ writeStream = process.stdout
+ }
+
+ writeStream.write(json)
+ }
+ } catch (err) {
+ console.error(err.message)
+ process.exit(1)
+ }
+ })
+}
+
+function parseArgs () {
+ let convert
+ let space
+ let validate
+ let outFile
+ let version
+ let help
+ const defaults = []
+
+ const args = process.argv.slice(2)
+ for (let i = 0; i < args.length; i++) {
+ const arg = args[i]
+ switch (arg) {
+ case '--convert':
+ case '-c':
+ convert = true
+ break
+
+ case '--space':
+ case '-s':
+ space = args[++i]
+ break
+
+ case '--validate':
+ case '-v':
+ validate = true
+ break
+
+ case '--out-file':
+ case '-o':
+ outFile = args[++i]
+ break
+
+ case '--version':
+ case '-V':
+ version = true
+ break
+
+ case '--help':
+ case '-h':
+ help = true
+ break
+
+ default:
+ defaults.push(arg)
+ break
+ }
+ }
+
+ return {
+ convert,
+ space,
+ validate,
+ outFile,
+ version,
+ help,
+ defaults,
+ }
+}
+
+function version () {
+ console.log(pkg.version)
+}
+
+function usage () {
+ console.log(
+ `
+ Usage: json5 [options]
+
+ If is not provided, then STDIN is used.
+
+ Options:
+
+ -s, --space The number of spaces to indent or 't' for tabs
+ -o, --out-file [file] Output to the specified file, otherwise STDOUT
+ -v, --validate Validate JSON5 but do not output JSON
+ -V, --version Output the version number
+ -h, --help Output usage information`
+ )
+}
diff --git a/node_modules/json5/lib/index.d.ts b/node_modules/json5/lib/index.d.ts
new file mode 100644
index 0000000..1c45bca
--- /dev/null
+++ b/node_modules/json5/lib/index.d.ts
@@ -0,0 +1,4 @@
+import parse = require('./parse')
+import stringify = require('./stringify')
+
+export {parse, stringify}
diff --git a/node_modules/json5/lib/index.js b/node_modules/json5/lib/index.js
new file mode 100644
index 0000000..3679638
--- /dev/null
+++ b/node_modules/json5/lib/index.js
@@ -0,0 +1,9 @@
+const parse = require('./parse')
+const stringify = require('./stringify')
+
+const JSON5 = {
+ parse,
+ stringify,
+}
+
+module.exports = JSON5
diff --git a/node_modules/json5/lib/parse.d.ts b/node_modules/json5/lib/parse.d.ts
new file mode 100644
index 0000000..8c8d883
--- /dev/null
+++ b/node_modules/json5/lib/parse.d.ts
@@ -0,0 +1,15 @@
+/**
+ * Parses a JSON5 string, constructing the JavaScript value or object described
+ * by the string.
+ * @template T The type of the return value.
+ * @param text The string to parse as JSON5.
+ * @param reviver A function that prescribes how the value originally produced
+ * by parsing is transformed before being returned.
+ * @returns The JavaScript value converted from the JSON5 string.
+ */
+declare function parse(
+ text: string,
+ reviver?: ((this: any, key: string, value: any) => any) | null,
+): T
+
+export = parse
diff --git a/node_modules/json5/lib/parse.js b/node_modules/json5/lib/parse.js
new file mode 100644
index 0000000..da2078a
--- /dev/null
+++ b/node_modules/json5/lib/parse.js
@@ -0,0 +1,1114 @@
+const util = require('./util')
+
+let source
+let parseState
+let stack
+let pos
+let line
+let column
+let token
+let key
+let root
+
+module.exports = function parse (text, reviver) {
+ source = String(text)
+ parseState = 'start'
+ stack = []
+ pos = 0
+ line = 1
+ column = 0
+ token = undefined
+ key = undefined
+ root = undefined
+
+ do {
+ token = lex()
+
+ // This code is unreachable.
+ // if (!parseStates[parseState]) {
+ // throw invalidParseState()
+ // }
+
+ parseStates[parseState]()
+ } while (token.type !== 'eof')
+
+ if (typeof reviver === 'function') {
+ return internalize({'': root}, '', reviver)
+ }
+
+ return root
+}
+
+function internalize (holder, name, reviver) {
+ const value = holder[name]
+ if (value != null && typeof value === 'object') {
+ if (Array.isArray(value)) {
+ for (let i = 0; i < value.length; i++) {
+ const key = String(i)
+ const replacement = internalize(value, key, reviver)
+ if (replacement === undefined) {
+ delete value[key]
+ } else {
+ Object.defineProperty(value, key, {
+ value: replacement,
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ })
+ }
+ }
+ } else {
+ for (const key in value) {
+ const replacement = internalize(value, key, reviver)
+ if (replacement === undefined) {
+ delete value[key]
+ } else {
+ Object.defineProperty(value, key, {
+ value: replacement,
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ })
+ }
+ }
+ }
+ }
+
+ return reviver.call(holder, name, value)
+}
+
+let lexState
+let buffer
+let doubleQuote
+let sign
+let c
+
+function lex () {
+ lexState = 'default'
+ buffer = ''
+ doubleQuote = false
+ sign = 1
+
+ for (;;) {
+ c = peek()
+
+ // This code is unreachable.
+ // if (!lexStates[lexState]) {
+ // throw invalidLexState(lexState)
+ // }
+
+ const token = lexStates[lexState]()
+ if (token) {
+ return token
+ }
+ }
+}
+
+function peek () {
+ if (source[pos]) {
+ return String.fromCodePoint(source.codePointAt(pos))
+ }
+}
+
+function read () {
+ const c = peek()
+
+ if (c === '\n') {
+ line++
+ column = 0
+ } else if (c) {
+ column += c.length
+ } else {
+ column++
+ }
+
+ if (c) {
+ pos += c.length
+ }
+
+ return c
+}
+
+const lexStates = {
+ default () {
+ switch (c) {
+ case '\t':
+ case '\v':
+ case '\f':
+ case ' ':
+ case '\u00A0':
+ case '\uFEFF':
+ case '\n':
+ case '\r':
+ case '\u2028':
+ case '\u2029':
+ read()
+ return
+
+ case '/':
+ read()
+ lexState = 'comment'
+ return
+
+ case undefined:
+ read()
+ return newToken('eof')
+ }
+
+ if (util.isSpaceSeparator(c)) {
+ read()
+ return
+ }
+
+ // This code is unreachable.
+ // if (!lexStates[parseState]) {
+ // throw invalidLexState(parseState)
+ // }
+
+ return lexStates[parseState]()
+ },
+
+ comment () {
+ switch (c) {
+ case '*':
+ read()
+ lexState = 'multiLineComment'
+ return
+
+ case '/':
+ read()
+ lexState = 'singleLineComment'
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ multiLineComment () {
+ switch (c) {
+ case '*':
+ read()
+ lexState = 'multiLineCommentAsterisk'
+ return
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ read()
+ },
+
+ multiLineCommentAsterisk () {
+ switch (c) {
+ case '*':
+ read()
+ return
+
+ case '/':
+ read()
+ lexState = 'default'
+ return
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ read()
+ lexState = 'multiLineComment'
+ },
+
+ singleLineComment () {
+ switch (c) {
+ case '\n':
+ case '\r':
+ case '\u2028':
+ case '\u2029':
+ read()
+ lexState = 'default'
+ return
+
+ case undefined:
+ read()
+ return newToken('eof')
+ }
+
+ read()
+ },
+
+ value () {
+ switch (c) {
+ case '{':
+ case '[':
+ return newToken('punctuator', read())
+
+ case 'n':
+ read()
+ literal('ull')
+ return newToken('null', null)
+
+ case 't':
+ read()
+ literal('rue')
+ return newToken('boolean', true)
+
+ case 'f':
+ read()
+ literal('alse')
+ return newToken('boolean', false)
+
+ case '-':
+ case '+':
+ if (read() === '-') {
+ sign = -1
+ }
+
+ lexState = 'sign'
+ return
+
+ case '.':
+ buffer = read()
+ lexState = 'decimalPointLeading'
+ return
+
+ case '0':
+ buffer = read()
+ lexState = 'zero'
+ return
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ buffer = read()
+ lexState = 'decimalInteger'
+ return
+
+ case 'I':
+ read()
+ literal('nfinity')
+ return newToken('numeric', Infinity)
+
+ case 'N':
+ read()
+ literal('aN')
+ return newToken('numeric', NaN)
+
+ case '"':
+ case "'":
+ doubleQuote = (read() === '"')
+ buffer = ''
+ lexState = 'string'
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ identifierNameStartEscape () {
+ if (c !== 'u') {
+ throw invalidChar(read())
+ }
+
+ read()
+ const u = unicodeEscape()
+ switch (u) {
+ case '$':
+ case '_':
+ break
+
+ default:
+ if (!util.isIdStartChar(u)) {
+ throw invalidIdentifier()
+ }
+
+ break
+ }
+
+ buffer += u
+ lexState = 'identifierName'
+ },
+
+ identifierName () {
+ switch (c) {
+ case '$':
+ case '_':
+ case '\u200C':
+ case '\u200D':
+ buffer += read()
+ return
+
+ case '\\':
+ read()
+ lexState = 'identifierNameEscape'
+ return
+ }
+
+ if (util.isIdContinueChar(c)) {
+ buffer += read()
+ return
+ }
+
+ return newToken('identifier', buffer)
+ },
+
+ identifierNameEscape () {
+ if (c !== 'u') {
+ throw invalidChar(read())
+ }
+
+ read()
+ const u = unicodeEscape()
+ switch (u) {
+ case '$':
+ case '_':
+ case '\u200C':
+ case '\u200D':
+ break
+
+ default:
+ if (!util.isIdContinueChar(u)) {
+ throw invalidIdentifier()
+ }
+
+ break
+ }
+
+ buffer += u
+ lexState = 'identifierName'
+ },
+
+ sign () {
+ switch (c) {
+ case '.':
+ buffer = read()
+ lexState = 'decimalPointLeading'
+ return
+
+ case '0':
+ buffer = read()
+ lexState = 'zero'
+ return
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ buffer = read()
+ lexState = 'decimalInteger'
+ return
+
+ case 'I':
+ read()
+ literal('nfinity')
+ return newToken('numeric', sign * Infinity)
+
+ case 'N':
+ read()
+ literal('aN')
+ return newToken('numeric', NaN)
+ }
+
+ throw invalidChar(read())
+ },
+
+ zero () {
+ switch (c) {
+ case '.':
+ buffer += read()
+ lexState = 'decimalPoint'
+ return
+
+ case 'e':
+ case 'E':
+ buffer += read()
+ lexState = 'decimalExponent'
+ return
+
+ case 'x':
+ case 'X':
+ buffer += read()
+ lexState = 'hexadecimal'
+ return
+ }
+
+ return newToken('numeric', sign * 0)
+ },
+
+ decimalInteger () {
+ switch (c) {
+ case '.':
+ buffer += read()
+ lexState = 'decimalPoint'
+ return
+
+ case 'e':
+ case 'E':
+ buffer += read()
+ lexState = 'decimalExponent'
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read()
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalPointLeading () {
+ if (util.isDigit(c)) {
+ buffer += read()
+ lexState = 'decimalFraction'
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalPoint () {
+ switch (c) {
+ case 'e':
+ case 'E':
+ buffer += read()
+ lexState = 'decimalExponent'
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read()
+ lexState = 'decimalFraction'
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalFraction () {
+ switch (c) {
+ case 'e':
+ case 'E':
+ buffer += read()
+ lexState = 'decimalExponent'
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read()
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalExponent () {
+ switch (c) {
+ case '+':
+ case '-':
+ buffer += read()
+ lexState = 'decimalExponentSign'
+ return
+ }
+
+ if (util.isDigit(c)) {
+ buffer += read()
+ lexState = 'decimalExponentInteger'
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalExponentSign () {
+ if (util.isDigit(c)) {
+ buffer += read()
+ lexState = 'decimalExponentInteger'
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalExponentInteger () {
+ if (util.isDigit(c)) {
+ buffer += read()
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ hexadecimal () {
+ if (util.isHexDigit(c)) {
+ buffer += read()
+ lexState = 'hexadecimalInteger'
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ hexadecimalInteger () {
+ if (util.isHexDigit(c)) {
+ buffer += read()
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ string () {
+ switch (c) {
+ case '\\':
+ read()
+ buffer += escape()
+ return
+
+ case '"':
+ if (doubleQuote) {
+ read()
+ return newToken('string', buffer)
+ }
+
+ buffer += read()
+ return
+
+ case "'":
+ if (!doubleQuote) {
+ read()
+ return newToken('string', buffer)
+ }
+
+ buffer += read()
+ return
+
+ case '\n':
+ case '\r':
+ throw invalidChar(read())
+
+ case '\u2028':
+ case '\u2029':
+ separatorChar(c)
+ break
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ buffer += read()
+ },
+
+ start () {
+ switch (c) {
+ case '{':
+ case '[':
+ return newToken('punctuator', read())
+
+ // This code is unreachable since the default lexState handles eof.
+ // case undefined:
+ // return newToken('eof')
+ }
+
+ lexState = 'value'
+ },
+
+ beforePropertyName () {
+ switch (c) {
+ case '$':
+ case '_':
+ buffer = read()
+ lexState = 'identifierName'
+ return
+
+ case '\\':
+ read()
+ lexState = 'identifierNameStartEscape'
+ return
+
+ case '}':
+ return newToken('punctuator', read())
+
+ case '"':
+ case "'":
+ doubleQuote = (read() === '"')
+ lexState = 'string'
+ return
+ }
+
+ if (util.isIdStartChar(c)) {
+ buffer += read()
+ lexState = 'identifierName'
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ afterPropertyName () {
+ if (c === ':') {
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ beforePropertyValue () {
+ lexState = 'value'
+ },
+
+ afterPropertyValue () {
+ switch (c) {
+ case ',':
+ case '}':
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ beforeArrayValue () {
+ if (c === ']') {
+ return newToken('punctuator', read())
+ }
+
+ lexState = 'value'
+ },
+
+ afterArrayValue () {
+ switch (c) {
+ case ',':
+ case ']':
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ end () {
+ // This code is unreachable since it's handled by the default lexState.
+ // if (c === undefined) {
+ // read()
+ // return newToken('eof')
+ // }
+
+ throw invalidChar(read())
+ },
+}
+
+function newToken (type, value) {
+ return {
+ type,
+ value,
+ line,
+ column,
+ }
+}
+
+function literal (s) {
+ for (const c of s) {
+ const p = peek()
+
+ if (p !== c) {
+ throw invalidChar(read())
+ }
+
+ read()
+ }
+}
+
+function escape () {
+ const c = peek()
+ switch (c) {
+ case 'b':
+ read()
+ return '\b'
+
+ case 'f':
+ read()
+ return '\f'
+
+ case 'n':
+ read()
+ return '\n'
+
+ case 'r':
+ read()
+ return '\r'
+
+ case 't':
+ read()
+ return '\t'
+
+ case 'v':
+ read()
+ return '\v'
+
+ case '0':
+ read()
+ if (util.isDigit(peek())) {
+ throw invalidChar(read())
+ }
+
+ return '\0'
+
+ case 'x':
+ read()
+ return hexEscape()
+
+ case 'u':
+ read()
+ return unicodeEscape()
+
+ case '\n':
+ case '\u2028':
+ case '\u2029':
+ read()
+ return ''
+
+ case '\r':
+ read()
+ if (peek() === '\n') {
+ read()
+ }
+
+ return ''
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ throw invalidChar(read())
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ return read()
+}
+
+function hexEscape () {
+ let buffer = ''
+ let c = peek()
+
+ if (!util.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read()
+
+ c = peek()
+ if (!util.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read()
+
+ return String.fromCodePoint(parseInt(buffer, 16))
+}
+
+function unicodeEscape () {
+ let buffer = ''
+ let count = 4
+
+ while (count-- > 0) {
+ const c = peek()
+ if (!util.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read()
+ }
+
+ return String.fromCodePoint(parseInt(buffer, 16))
+}
+
+const parseStates = {
+ start () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ push()
+ },
+
+ beforePropertyName () {
+ switch (token.type) {
+ case 'identifier':
+ case 'string':
+ key = token.value
+ parseState = 'afterPropertyName'
+ return
+
+ case 'punctuator':
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.value !== '}') {
+ // throw invalidToken()
+ // }
+
+ pop()
+ return
+
+ case 'eof':
+ throw invalidEOF()
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ afterPropertyName () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator' || token.value !== ':') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ parseState = 'beforePropertyValue'
+ },
+
+ beforePropertyValue () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ push()
+ },
+
+ beforeArrayValue () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ if (token.type === 'punctuator' && token.value === ']') {
+ pop()
+ return
+ }
+
+ push()
+ },
+
+ afterPropertyValue () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ switch (token.value) {
+ case ',':
+ parseState = 'beforePropertyName'
+ return
+
+ case '}':
+ pop()
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ afterArrayValue () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ switch (token.value) {
+ case ',':
+ parseState = 'beforeArrayValue'
+ return
+
+ case ']':
+ pop()
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ end () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'eof') {
+ // throw invalidToken()
+ // }
+ },
+}
+
+function push () {
+ let value
+
+ switch (token.type) {
+ case 'punctuator':
+ switch (token.value) {
+ case '{':
+ value = {}
+ break
+
+ case '[':
+ value = []
+ break
+ }
+
+ break
+
+ case 'null':
+ case 'boolean':
+ case 'numeric':
+ case 'string':
+ value = token.value
+ break
+
+ // This code is unreachable.
+ // default:
+ // throw invalidToken()
+ }
+
+ if (root === undefined) {
+ root = value
+ } else {
+ const parent = stack[stack.length - 1]
+ if (Array.isArray(parent)) {
+ parent.push(value)
+ } else {
+ Object.defineProperty(parent, key, {
+ value,
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ })
+ }
+ }
+
+ if (value !== null && typeof value === 'object') {
+ stack.push(value)
+
+ if (Array.isArray(value)) {
+ parseState = 'beforeArrayValue'
+ } else {
+ parseState = 'beforePropertyName'
+ }
+ } else {
+ const current = stack[stack.length - 1]
+ if (current == null) {
+ parseState = 'end'
+ } else if (Array.isArray(current)) {
+ parseState = 'afterArrayValue'
+ } else {
+ parseState = 'afterPropertyValue'
+ }
+ }
+}
+
+function pop () {
+ stack.pop()
+
+ const current = stack[stack.length - 1]
+ if (current == null) {
+ parseState = 'end'
+ } else if (Array.isArray(current)) {
+ parseState = 'afterArrayValue'
+ } else {
+ parseState = 'afterPropertyValue'
+ }
+}
+
+// This code is unreachable.
+// function invalidParseState () {
+// return new Error(`JSON5: invalid parse state '${parseState}'`)
+// }
+
+// This code is unreachable.
+// function invalidLexState (state) {
+// return new Error(`JSON5: invalid lex state '${state}'`)
+// }
+
+function invalidChar (c) {
+ if (c === undefined) {
+ return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
+ }
+
+ return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
+}
+
+function invalidEOF () {
+ return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
+}
+
+// This code is unreachable.
+// function invalidToken () {
+// if (token.type === 'eof') {
+// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
+// }
+
+// const c = String.fromCodePoint(token.value.codePointAt(0))
+// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
+// }
+
+function invalidIdentifier () {
+ column -= 5
+ return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`)
+}
+
+function separatorChar (c) {
+ console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`)
+}
+
+function formatChar (c) {
+ const replacements = {
+ "'": "\\'",
+ '"': '\\"',
+ '\\': '\\\\',
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+ '\v': '\\v',
+ '\0': '\\0',
+ '\u2028': '\\u2028',
+ '\u2029': '\\u2029',
+ }
+
+ if (replacements[c]) {
+ return replacements[c]
+ }
+
+ if (c < ' ') {
+ const hexString = c.charCodeAt(0).toString(16)
+ return '\\x' + ('00' + hexString).substring(hexString.length)
+ }
+
+ return c
+}
+
+function syntaxError (message) {
+ const err = new SyntaxError(message)
+ err.lineNumber = line
+ err.columnNumber = column
+ return err
+}
diff --git a/node_modules/json5/lib/register.js b/node_modules/json5/lib/register.js
new file mode 100644
index 0000000..935cdba
--- /dev/null
+++ b/node_modules/json5/lib/register.js
@@ -0,0 +1,13 @@
+const fs = require('fs')
+const JSON5 = require('./')
+
+// eslint-disable-next-line node/no-deprecated-api
+require.extensions['.json5'] = function (module, filename) {
+ const content = fs.readFileSync(filename, 'utf8')
+ try {
+ module.exports = JSON5.parse(content)
+ } catch (err) {
+ err.message = filename + ': ' + err.message
+ throw err
+ }
+}
diff --git a/node_modules/json5/lib/require.js b/node_modules/json5/lib/require.js
new file mode 100644
index 0000000..3aa29be
--- /dev/null
+++ b/node_modules/json5/lib/require.js
@@ -0,0 +1,4 @@
+// This file is for backward compatibility with v0.5.1.
+require('./register')
+
+console.warn("'json5/require' is deprecated. Please use 'json5/register' instead.")
diff --git a/node_modules/json5/lib/stringify.d.ts b/node_modules/json5/lib/stringify.d.ts
new file mode 100644
index 0000000..3c34838
--- /dev/null
+++ b/node_modules/json5/lib/stringify.d.ts
@@ -0,0 +1,89 @@
+declare type StringifyOptions = {
+ /**
+ * A function that alters the behavior of the stringification process, or an
+ * array of String and Number objects that serve as a allowlist for
+ * selecting/filtering the properties of the value object to be included in
+ * the JSON5 string. If this value is null or not provided, all properties
+ * of the object are included in the resulting JSON5 string.
+ */
+ replacer?:
+ | ((this: any, key: string, value: any) => any)
+ | (string | number)[]
+ | null
+
+ /**
+ * A String or Number object that's used to insert white space into the
+ * output JSON5 string for readability purposes. If this is a Number, it
+ * indicates the number of space characters to use as white space; this
+ * number is capped at 10 (if it is greater, the value is just 10). Values
+ * less than 1 indicate that no space should be used. If this is a String,
+ * the string (or the first 10 characters of the string, if it's longer than
+ * that) is used as white space. If this parameter is not provided (or is
+ * null), no white space is used. If white space is used, trailing commas
+ * will be used in objects and arrays.
+ */
+ space?: string | number | null
+
+ /**
+ * A String representing the quote character to use when serializing
+ * strings.
+ */
+ quote?: string | null
+}
+
+/**
+ * Converts a JavaScript value to a JSON5 string.
+ * @param value The value to convert to a JSON5 string.
+ * @param replacer A function that alters the behavior of the stringification
+ * process. If this value is null or not provided, all properties of the object
+ * are included in the resulting JSON5 string.
+ * @param space A String or Number object that's used to insert white space into
+ * the output JSON5 string for readability purposes. If this is a Number, it
+ * indicates the number of space characters to use as white space; this number
+ * is capped at 10 (if it is greater, the value is just 10). Values less than 1
+ * indicate that no space should be used. If this is a String, the string (or
+ * the first 10 characters of the string, if it's longer than that) is used as
+ * white space. If this parameter is not provided (or is null), no white space
+ * is used. If white space is used, trailing commas will be used in objects and
+ * arrays.
+ * @returns The JSON5 string converted from the JavaScript value.
+ */
+declare function stringify(
+ value: any,
+ replacer?: ((this: any, key: string, value: any) => any) | null,
+ space?: string | number | null,
+): string
+
+/**
+ * Converts a JavaScript value to a JSON5 string.
+ * @param value The value to convert to a JSON5 string.
+ * @param replacer An array of String and Number objects that serve as a
+ * allowlist for selecting/filtering the properties of the value object to be
+ * included in the JSON5 string. If this value is null or not provided, all
+ * properties of the object are included in the resulting JSON5 string.
+ * @param space A String or Number object that's used to insert white space into
+ * the output JSON5 string for readability purposes. If this is a Number, it
+ * indicates the number of space characters to use as white space; this number
+ * is capped at 10 (if it is greater, the value is just 10). Values less than 1
+ * indicate that no space should be used. If this is a String, the string (or
+ * the first 10 characters of the string, if it's longer than that) is used as
+ * white space. If this parameter is not provided (or is null), no white space
+ * is used. If white space is used, trailing commas will be used in objects and
+ * arrays.
+ * @returns The JSON5 string converted from the JavaScript value.
+ */
+declare function stringify(
+ value: any,
+ replacer: (string | number)[],
+ space?: string | number | null,
+): string
+
+/**
+ * Converts a JavaScript value to a JSON5 string.
+ * @param value The value to convert to a JSON5 string.
+ * @param options An object specifying options.
+ * @returns The JSON5 string converted from the JavaScript value.
+ */
+declare function stringify(value: any, options: StringifyOptions): string
+
+export = stringify
diff --git a/node_modules/json5/lib/stringify.js b/node_modules/json5/lib/stringify.js
new file mode 100644
index 0000000..7cb3b0e
--- /dev/null
+++ b/node_modules/json5/lib/stringify.js
@@ -0,0 +1,261 @@
+const util = require('./util')
+
+module.exports = function stringify (value, replacer, space) {
+ const stack = []
+ let indent = ''
+ let propertyList
+ let replacerFunc
+ let gap = ''
+ let quote
+
+ if (
+ replacer != null &&
+ typeof replacer === 'object' &&
+ !Array.isArray(replacer)
+ ) {
+ space = replacer.space
+ quote = replacer.quote
+ replacer = replacer.replacer
+ }
+
+ if (typeof replacer === 'function') {
+ replacerFunc = replacer
+ } else if (Array.isArray(replacer)) {
+ propertyList = []
+ for (const v of replacer) {
+ let item
+
+ if (typeof v === 'string') {
+ item = v
+ } else if (
+ typeof v === 'number' ||
+ v instanceof String ||
+ v instanceof Number
+ ) {
+ item = String(v)
+ }
+
+ if (item !== undefined && propertyList.indexOf(item) < 0) {
+ propertyList.push(item)
+ }
+ }
+ }
+
+ if (space instanceof Number) {
+ space = Number(space)
+ } else if (space instanceof String) {
+ space = String(space)
+ }
+
+ if (typeof space === 'number') {
+ if (space > 0) {
+ space = Math.min(10, Math.floor(space))
+ gap = ' '.substr(0, space)
+ }
+ } else if (typeof space === 'string') {
+ gap = space.substr(0, 10)
+ }
+
+ return serializeProperty('', {'': value})
+
+ function serializeProperty (key, holder) {
+ let value = holder[key]
+ if (value != null) {
+ if (typeof value.toJSON5 === 'function') {
+ value = value.toJSON5(key)
+ } else if (typeof value.toJSON === 'function') {
+ value = value.toJSON(key)
+ }
+ }
+
+ if (replacerFunc) {
+ value = replacerFunc.call(holder, key, value)
+ }
+
+ if (value instanceof Number) {
+ value = Number(value)
+ } else if (value instanceof String) {
+ value = String(value)
+ } else if (value instanceof Boolean) {
+ value = value.valueOf()
+ }
+
+ switch (value) {
+ case null: return 'null'
+ case true: return 'true'
+ case false: return 'false'
+ }
+
+ if (typeof value === 'string') {
+ return quoteString(value, false)
+ }
+
+ if (typeof value === 'number') {
+ return String(value)
+ }
+
+ if (typeof value === 'object') {
+ return Array.isArray(value) ? serializeArray(value) : serializeObject(value)
+ }
+
+ return undefined
+ }
+
+ function quoteString (value) {
+ const quotes = {
+ "'": 0.1,
+ '"': 0.2,
+ }
+
+ const replacements = {
+ "'": "\\'",
+ '"': '\\"',
+ '\\': '\\\\',
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+ '\v': '\\v',
+ '\0': '\\0',
+ '\u2028': '\\u2028',
+ '\u2029': '\\u2029',
+ }
+
+ let product = ''
+
+ for (let i = 0; i < value.length; i++) {
+ const c = value[i]
+ switch (c) {
+ case "'":
+ case '"':
+ quotes[c]++
+ product += c
+ continue
+
+ case '\0':
+ if (util.isDigit(value[i + 1])) {
+ product += '\\x00'
+ continue
+ }
+ }
+
+ if (replacements[c]) {
+ product += replacements[c]
+ continue
+ }
+
+ if (c < ' ') {
+ let hexString = c.charCodeAt(0).toString(16)
+ product += '\\x' + ('00' + hexString).substring(hexString.length)
+ continue
+ }
+
+ product += c
+ }
+
+ const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b)
+
+ product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar])
+
+ return quoteChar + product + quoteChar
+ }
+
+ function serializeObject (value) {
+ if (stack.indexOf(value) >= 0) {
+ throw TypeError('Converting circular structure to JSON5')
+ }
+
+ stack.push(value)
+
+ let stepback = indent
+ indent = indent + gap
+
+ let keys = propertyList || Object.keys(value)
+ let partial = []
+ for (const key of keys) {
+ const propertyString = serializeProperty(key, value)
+ if (propertyString !== undefined) {
+ let member = serializeKey(key) + ':'
+ if (gap !== '') {
+ member += ' '
+ }
+ member += propertyString
+ partial.push(member)
+ }
+ }
+
+ let final
+ if (partial.length === 0) {
+ final = '{}'
+ } else {
+ let properties
+ if (gap === '') {
+ properties = partial.join(',')
+ final = '{' + properties + '}'
+ } else {
+ let separator = ',\n' + indent
+ properties = partial.join(separator)
+ final = '{\n' + indent + properties + ',\n' + stepback + '}'
+ }
+ }
+
+ stack.pop()
+ indent = stepback
+ return final
+ }
+
+ function serializeKey (key) {
+ if (key.length === 0) {
+ return quoteString(key, true)
+ }
+
+ const firstChar = String.fromCodePoint(key.codePointAt(0))
+ if (!util.isIdStartChar(firstChar)) {
+ return quoteString(key, true)
+ }
+
+ for (let i = firstChar.length; i < key.length; i++) {
+ if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {
+ return quoteString(key, true)
+ }
+ }
+
+ return key
+ }
+
+ function serializeArray (value) {
+ if (stack.indexOf(value) >= 0) {
+ throw TypeError('Converting circular structure to JSON5')
+ }
+
+ stack.push(value)
+
+ let stepback = indent
+ indent = indent + gap
+
+ let partial = []
+ for (let i = 0; i < value.length; i++) {
+ const propertyString = serializeProperty(String(i), value)
+ partial.push((propertyString !== undefined) ? propertyString : 'null')
+ }
+
+ let final
+ if (partial.length === 0) {
+ final = '[]'
+ } else {
+ if (gap === '') {
+ let properties = partial.join(',')
+ final = '[' + properties + ']'
+ } else {
+ let separator = ',\n' + indent
+ let properties = partial.join(separator)
+ final = '[\n' + indent + properties + ',\n' + stepback + ']'
+ }
+ }
+
+ stack.pop()
+ indent = stepback
+ return final
+ }
+}
diff --git a/node_modules/json5/lib/unicode.d.ts b/node_modules/json5/lib/unicode.d.ts
new file mode 100644
index 0000000..610f805
--- /dev/null
+++ b/node_modules/json5/lib/unicode.d.ts
@@ -0,0 +1,3 @@
+export declare const Space_Separator: RegExp
+export declare const ID_Start: RegExp
+export declare const ID_Continue: RegExp
diff --git a/node_modules/json5/lib/unicode.js b/node_modules/json5/lib/unicode.js
new file mode 100644
index 0000000..215ccd8
--- /dev/null
+++ b/node_modules/json5/lib/unicode.js
@@ -0,0 +1,4 @@
+// This is a generated file. Do not edit.
+module.exports.Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/
+module.exports.ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/
+module.exports.ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
diff --git a/node_modules/json5/lib/util.d.ts b/node_modules/json5/lib/util.d.ts
new file mode 100644
index 0000000..a940cea
--- /dev/null
+++ b/node_modules/json5/lib/util.d.ts
@@ -0,0 +1,5 @@
+export declare function isSpaceSeparator(c?: string): boolean
+export declare function isIdStartChar(c?: string): boolean
+export declare function isIdContinueChar(c?: string): boolean
+export declare function isDigit(c?: string): boolean
+export declare function isHexDigit(c?: string): boolean
diff --git a/node_modules/json5/lib/util.js b/node_modules/json5/lib/util.js
new file mode 100644
index 0000000..40bfe2f
--- /dev/null
+++ b/node_modules/json5/lib/util.js
@@ -0,0 +1,35 @@
+const unicode = require('../lib/unicode')
+
+module.exports = {
+ isSpaceSeparator (c) {
+ return typeof c === 'string' && unicode.Space_Separator.test(c)
+ },
+
+ isIdStartChar (c) {
+ return typeof c === 'string' && (
+ (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c === '$') || (c === '_') ||
+ unicode.ID_Start.test(c)
+ )
+ },
+
+ isIdContinueChar (c) {
+ return typeof c === 'string' && (
+ (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c >= '0' && c <= '9') ||
+ (c === '$') || (c === '_') ||
+ (c === '\u200C') || (c === '\u200D') ||
+ unicode.ID_Continue.test(c)
+ )
+ },
+
+ isDigit (c) {
+ return typeof c === 'string' && /[0-9]/.test(c)
+ },
+
+ isHexDigit (c) {
+ return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)
+ },
+}
diff --git a/node_modules/json5/package.json b/node_modules/json5/package.json
new file mode 100644
index 0000000..60c51d9
--- /dev/null
+++ b/node_modules/json5/package.json
@@ -0,0 +1,72 @@
+{
+ "name": "json5",
+ "version": "2.2.3",
+ "description": "JSON for Humans",
+ "main": "lib/index.js",
+ "module": "dist/index.mjs",
+ "bin": "lib/cli.js",
+ "browser": "dist/index.js",
+ "types": "lib/index.d.ts",
+ "files": [
+ "lib/",
+ "dist/"
+ ],
+ "engines": {
+ "node": ">=6"
+ },
+ "scripts": {
+ "build": "rollup -c",
+ "build-package": "node build/package.js",
+ "build-unicode": "node build/unicode.js",
+ "coverage": "tap --coverage-report html test",
+ "lint": "eslint --fix .",
+ "lint-report": "eslint .",
+ "prepublishOnly": "npm run production",
+ "preversion": "npm run production",
+ "production": "run-s test build",
+ "tap": "tap -Rspec --100 test",
+ "test": "run-s lint-report tap",
+ "version": "npm run build-package && git add package.json5"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/json5/json5.git"
+ },
+ "keywords": [
+ "json",
+ "json5",
+ "es5",
+ "es2015",
+ "ecmascript"
+ ],
+ "author": "Aseem Kishore ",
+ "contributors": [
+ "Max Nanasy ",
+ "Andrew Eisenberg ",
+ "Jordan Tucker "
+ ],
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/json5/json5/issues"
+ },
+ "homepage": "http://json5.org/",
+ "devDependencies": {
+ "core-js": "^2.6.5",
+ "eslint": "^5.15.3",
+ "eslint-config-standard": "^12.0.0",
+ "eslint-plugin-import": "^2.16.0",
+ "eslint-plugin-node": "^8.0.1",
+ "eslint-plugin-promise": "^4.0.1",
+ "eslint-plugin-standard": "^4.0.0",
+ "npm-run-all": "^4.1.5",
+ "regenerate": "^1.4.0",
+ "rollup": "^0.64.1",
+ "rollup-plugin-buble": "^0.19.6",
+ "rollup-plugin-commonjs": "^9.2.1",
+ "rollup-plugin-node-resolve": "^3.4.0",
+ "rollup-plugin-terser": "^1.0.1",
+ "sinon": "^6.3.5",
+ "tap": "^12.6.0",
+ "unicode-10.0.0": "^0.7.5"
+ }
+}
diff --git a/src/debugger/routines/after-eval.talp b/src/debugger/routines/after-eval.tal.tpl
similarity index 83%
rename from src/debugger/routines/after-eval.talp
rename to src/debugger/routines/after-eval.tal.tpl
index a917829..50053ec 100644
--- a/src/debugger/routines/after-eval.talp
+++ b/src/debugger/routines/after-eval.tal.tpl
@@ -1,23 +1,23 @@
(
@|debugger/after-eval )
-#ifdef DBG
+{% if logger.level == "debug" %}
.LOG-LEVEL .Logger/warn GTH NOT ?{
pstr: \reset-console-style \bg-0 \fg-2 \0
- .DEBUG-HEAD-POINTER ?{
+ .DEBUG-HEAD-PTR ?{
{ "DEBUG: \s "head-ptr \s "after \s "eval: \s \0 } STH2r pstr
;head-ptr LDA2 phex <\n> }
- .DEBUG-HEAP ?{
+ .DEBUG-HEAD ?{
{ "DEBUG: \s "heap \s "after \s "eval: \n \0 }
;heap pobj }
- .DEBUG-TAIL-POINTER ?{
+ .DEBUG-TAIL-PTR ?{
{ "DEBUG: \s "tail-ptr \s "after \s "eval: \s \0 } STH2r pstr
;tail-ptr LDA2 phex <\n> }
- .DEBUG-SYMBOLS ?{
+ .DEBUG-TAIL ?{
{ "DEBUG: \s "symbols \s "after \s "eval: \n \0 }
;tail-ptr LDA2 pobj }
@@ -26,4 +26,4 @@
;length LDA2 pdec <\n> }
pstr: \reset-console-style \bg-0 \fg-1 \0 }
-#endif
+{% endif %}
diff --git a/src/debugger/routines/before-eval.talp b/src/debugger/routines/before-eval.tal.tpl
similarity index 85%
rename from src/debugger/routines/before-eval.talp
rename to src/debugger/routines/before-eval.tal.tpl
index 78871cf..20db765 100644
--- a/src/debugger/routines/before-eval.talp
+++ b/src/debugger/routines/before-eval.tal.tpl
@@ -1,7 +1,7 @@
(
@|debugger/before-eval )
-#ifdef DBG
+{% if logger.level == "debug" %}
.LOG-LEVEL .Logger/warn GTH NOT ?{
pstr: \reset-console-style \bg-0 \fg-2 \0
@@ -9,19 +9,19 @@
{ "DEBUG: \s "input \s "before \s "eval: \n \0 }
;input pobj }
- .DEBUG-HEAD-POINTER ?{
+ .DEBUG-HEAD-PTR ?{
{ "DEBUG: \s "head-ptr \s "before \s "eval: \s \0 } STH2r pstr
;head-ptr LDA2 phex <\n> }
- .DEBUG-HEAP ?{
+ .DEBUG-HEAD ?{
{ "DEBUG: \s "heap \s "before \s "eval: \n \0 }
;heap pobj }
- .DEBUG-TAIL-POINTER ?{
+ .DEBUG-TAIL-PTR ?{
{ "DEBUG: \s "tail-ptr \s "before \s "eval: \s \0 } STH2r pstr
;tail-ptr LDA2 phex <\n> }
- .DEBUG-SYMBOLS ?{
+ .DEBUG-TAIL ?{
{ "DEBUG: \s "symbols \s "before \s "eval: \n \0 }
;tail-ptr LDA2 pobj }
@@ -30,4 +30,4 @@
;length LDA2 pdec <\n> }
pstr: \reset-console-style \bg-0 \fg-1 \0 }
-#endif
+{% endif %}
diff --git a/src/logger/data.tal b/src/logger/data.tal
index c407c60..84d5c9d 100644
--- a/src/logger/data.tal
+++ b/src/logger/data.tal
@@ -7,7 +7,7 @@
&on-repl "expression \0
&assembled \n "Assembled \fg-2 \s \0
&in \s \fg-3 "in \s \0
- &bytes \s "bytes. \0
+ &bytes \s "bytes. \n \0
&labels \s "labels 29 ". \n \0
&sym-ext ".sym \0
&multiline-info-prompt \n "... \s "... \s ": \s \0
diff --git a/src/logger/info/summary.tal b/src/logger/info/summary.tal
index 1a2b596..16a7d8a 100644
--- a/src/logger/info/summary.tal
+++ b/src/logger/info/summary.tal
@@ -2,5 +2,5 @@
@|logger/info/summary )
.LOG-LEVEL .Logger/off GTH NOT ?{
- .INFO-ASSEMBLER-SUMMARY ?{
+ .INFO-SUMMARY ?{
} }
diff --git a/src/logger/warn/redefinition.tal b/src/logger/warn/redefinition.tal
index 180dd1a..4d743fa 100644
--- a/src/logger/warn/redefinition.tal
+++ b/src/logger/warn/redefinition.tal
@@ -2,5 +2,5 @@
@|logger/warn/redefinition )
.LOG-LEVEL .Logger/info GTH NOT ?{
- .WARN-REDEFINITION ?{
+ .WARN-REDEF ?{
;Warning/redefinition } }
diff --git a/src/repl/data.tal b/src/repl/data.tal
index df7cce9..dce055d 100644
--- a/src/repl/data.tal
+++ b/src/repl/data.tal
@@ -1,14 +1,23 @@
(
@|repl/data )
- @banner [
- \n \s \s \s \s \s "/_ \s \s "UXN \s \s \s \s \s NAME \s \s \s \s
- \s "v VERSION \s 28 DATE 29 \n
- \s \s "/_/ \s "/ \s \s "(c)2024 \s AUTHOR \n
- \s \s \s "/ \s \s \s \s \s "Type \s "help \s "for \s "more \s
- "information. \n \n \0 ]
- @ok [ "____ok \n \n \0 ]
- @shell-prompt \n \n "uxnsh> \s \0
- @prompt [ "uxn \s "> \s \0 ]
- @prompt-start [ "uxn \0 ]
- @multiline-prompt [ \n \s "... \s \0 ]
-@prompt-end [ "> \s \0 ]
+
+
+ @banner [
+ \n \s \s \s \s \s "/_ \s \s "UXN \s \s \s \s \s NAME \s \s \s \s
+ \s "v VERSION \s 28 DATE 29 \n
+
+ \s \s "/_/ \s "/ \s \s "(c)2024 \s AUTHOR \n
+
+ \s \s \s "/ \s \s \s \s \s "Type \s "help \s "for \s "more \s
+ "information. \n \n \0 ]
+
+ @ok [ \n \n \0 ]
+
+ @shell-prompt \n \n "uxnsh> \s \0
+
+ @prompt [ "uxn \s "> \s \0 ]
+ @prompt-start [ "uxn \0 ]
+ @multiline-prompt [ \n \s "... \s \0 ]
+
+
+@prompt-end [ "> \s \0 ]
diff --git a/src/repl/data.talp b/src/repl/data.tal.tpl
similarity index 92%
rename from src/repl/data.talp
rename to src/repl/data.tal.tpl
index 2dcc282..a05f2dd 100644
--- a/src/repl/data.talp
+++ b/src/repl/data.tal.tpl
@@ -1,7 +1,7 @@
(
@|repl/data )
-#ifdef ANSI
+{% if ansi_escapes %}
@banner [
\bold \bg-1 \fg-0 MARGIN \n
@@ -20,7 +20,7 @@
\reset-console-style \bg-0 \fg-1 \0 ]
- @ok [ \underline \fg-3 \s \s \s \s "ok \n \n \0 ]
+ @ok [ \underline \fg-3 \n \n \0 ]
@shell-prompt [
\r \s \s \s \s \s \s \s \s \s \r \bg-0 \fg-2 \bold "փsh> \s
@@ -32,7 +32,7 @@
@prompt-start [ "փ \s \0 ]
@multiline-prompt [ \n "... \s \0 ]
-#else
+{% else %}
@banner [
\n \s \s \s \s \s "/_ \s \s "UXN \s \s \s \s \s NAME \s \s \s \s
\s "v VERSION \s 28 DATE 29 \n
@@ -42,13 +42,13 @@
\s \s \s "/ \s \s \s \s \s "Type \s "help \s "for \s "more \s
"information. \n \n \0 ]
- @ok [ "____ok \n \n \0 ]
+ @ok [ \n \n \0 ]
@shell-prompt \n \n "uxnsh> \s \0
@prompt [ "uxn \s "> \s \0 ]
@prompt-start [ "uxn \0 ]
@multiline-prompt [ \n \s "... \s \0 ]
-#endif
+{% endif %}
@prompt-end [ "> \s \0 ]
diff --git a/src/repl/routines.tal b/src/repl/routines.tal
index 7b2116f..8432c96 100644
--- a/src/repl/routines.tal
+++ b/src/repl/routines.tal
@@ -220,18 +220,25 @@
JMP2r }
- pstr: \CSI "m \bold \bg-0 \fg-3 \0
-
+
( ;input ;input-ptr LDA2 NEQ2 ?{
pstr: \console-cursor-up \0 } )
- ;prompt-start pstr
+ ;&prompt-start pstr
~logger/info/prompt.tal
- ;prompt-end pstr
- pstr: \CSI "m \CSI "48;2;51;00;34m \CSI "38;2;170;170;170m \0
+ ;&prompt-end pstr
+
+
+
JMP2r
+
+ &prompt-start [ "uxn \0 ]
+
+
+ &prompt-end [ "> \s \0 ]
+
@ ( -- )
;ok !pstr
diff --git a/src/repl/routines.talp b/src/repl/routines.tal.tpl
similarity index 94%
rename from src/repl/routines.talp
rename to src/repl/routines.tal.tpl
index 3a7fb2d..c605cf5 100644
--- a/src/repl/routines.talp
+++ b/src/repl/routines.tal.tpl
@@ -220,8 +220,9 @@
JMP2r }
- pstr: \CSI "m \bold \bg-0 \fg-3 \0
-
+ {% if ansi_escapes %}
+ pstr: \CSI "m \bold \bg-0 \fg-3 \0
+ {% endif %}
( ;input ;input-ptr LDA2 NEQ2 ?{
pstr: \console-cursor-up \0 } )
@@ -229,14 +230,18 @@
;&prompt-start pstr
~logger/info/prompt.tal
;&prompt-end pstr
- pstr: \CSI "m \CSI "48;2;51;00;34m \CSI "38;2;170;170;170m \0
+
+ {% if ansi_escapes %}
+ pstr: \CSI "m \CSI "48;2;51;00;34m \CSI "38;2;170;170;170m \0
+ {% endif %}
+
JMP2r
- #ifdef ANSI
- &prompt-start [ "փ \s \0 ]
- #else
- &prompt-start [ "uxn \0 ]
- #endif
+ {% if ansi_escapes %}
+ &prompt-start [ "փ \s \0 ]
+ {% else %}
+ &prompt-start [ "uxn \0 ]
+ {% endif %}
&prompt-end [ "> \s \0 ]
diff --git a/src/talos/macros.tal b/src/talos/macros.tal
index ac24295..2629e2b 100644
--- a/src/talos/macros.tal
+++ b/src/talos/macros.tal
@@ -1,6 +1,10 @@
(
@|talos/macros )
+
%VERSION { "0.12 } %DATE { "18Q06 }
+
%NAME { "TalOS }
%DESCRIPTION { "A \s "Varvara \s "operating \s "system. }
- %AUTHOR { "Ismael \s "Venegas \s "Castello }
+
+
+ %AUTHOR { "Ismael \s "Venegas \s "Castello }
diff --git a/src/talos/macros.talp b/src/talos/macros.tal.tpl
similarity index 83%
rename from src/talos/macros.talp
rename to src/talos/macros.tal.tpl
index 88a0dce..25b2ffa 100644
--- a/src/talos/macros.talp
+++ b/src/talos/macros.tal.tpl
@@ -6,8 +6,8 @@
%NAME { "TalOS }
%DESCRIPTION { "A \s "Varvara \s "operating \s "system. }
-#ifdef ANSI
+{% if ansi_escapes %}
%AUTHOR { "Ismael \s "Venegas \s "Castelló }
-#else
+{% else %}
%AUTHOR { "Ismael \s "Venegas \s "Castello }
-#endif
\ No newline at end of file
+{% endif %}
\ No newline at end of file
diff --git a/src/talos/main.tal b/src/talos/main.tal
index ca80b87..8fab149 100644
--- a/src/talos/main.tal
+++ b/src/talos/main.tal
@@ -1,34 +1,50 @@
(
@|talos/main )
+
@Main ( -> )
- (
- @|setup )
- (
- &|metadata )
- ;meta #06 DEO2
- (
- &|symbols )
- ( Move the symbols before the input buffer. )
- ;tail/end ;tail SUB2 STH2k #0000 ;head #0000 ( | len* )
- ;syms STH2kr SUB2 STH2k mcpyl ( | len* dst* )
- SWP2r STH2r #0000 ;head mzero ( | dst* )
- (
- &|pointers )
- STH2r ;tail-ptr STA2 ( | )
- ;head ;head-ptr STA2
- ;input ;input-ptr STA2
- (
- &|theme )
- \RED .System/r DEO2
- \GREEN .System/g DEO2
- \BLUE .System/b DEO2
- (
- @|startup )
- .PRINT-BANNER ?{
- }
- free
- ~../config/startup.tal
-
- &no-first-prompt
- ;REPL .Console/vector DEO2
- BRK
+ (
+ @|setup )
+
+ (
+ &|metadata )
+ ;meta #06 DEO2
+
+ (
+ &|symbols )
+ ( Move the symbols before the input buffer. )
+ ;tail/end ;tail SUB2 STH2k #0000 ;head #0000 ( | len* )
+ ;syms STH2kr SUB2 STH2k mcpyl ( | len* dst* )
+ SWP2r STH2r #0000 ;head mzero ( | dst* )
+
+ (
+ &|pointers )
+ STH2r ;tail-ptr STA2 ( | )
+ ;head ;head-ptr STA2
+ ;input ;input-ptr STA2
+
+ (
+ &|theme )
+ \RED .System/r DEO2
+ \GREEN .System/g DEO2
+ \BLUE .System/b DEO2
+
+
+
+ (
+ @|startup )
+ .PRINT-BANNER ?{
+ }
+
+
+
+ free
+
+
+
+ ~../config/startup.tal
+
+
+ &no-first-prompt
+
+ ;REPL .Console/vector DEO2
+ BRK
diff --git a/src/talos/main.talp b/src/talos/main.tal.tpl
similarity index 86%
rename from src/talos/main.talp
rename to src/talos/main.tal.tpl
index bc87cb5..333d6de 100644
--- a/src/talos/main.talp
+++ b/src/talos/main.tal.tpl
@@ -28,34 +28,34 @@
\GREEN .System/g DEO2
\BLUE .System/b DEO2
- #ifdef ANSI
+ {% if ansi_escapes %}
pstr: [
\bg-0 \fg-1 \clear-console-screen-right \n \n \n \n \n \n
\console-cursor-up \console-cursor-up \console-cursor-up
\console-cursor-up \console-cursor-up \console-cursor-up \0 ]
- #endif
+ {% endif %}
(
@|startup )
.PRINT-BANNER ?{
}
- #ifdef ANSI
+ {% if ansi_escapes %}
pstr: \italic \underline \bold \fg-3 \0
- #endif
+ {% endif %}
free
- #ifdef ANSI
+ {% if ansi_escapes %}
pstr: \reset-console-style \bg-0 \fg-1 \n \0
- #endif
+ {% endif %}
~../config/startup.tal
&no-first-prompt
- #ifdef ANSI
+ {% if ansi_escapes %}
pstr: \enable-braketed-paste \0
- #endif
+ {% endif %}
;REPL .Console/vector DEO2
BRK
diff --git a/trit8.rom b/trit8.rom
new file mode 100644
index 0000000..e043883
Binary files /dev/null and b/trit8.rom differ
diff --git a/trit8.rom.sym b/trit8.rom.sym
new file mode 100644
index 0000000..0039774
Binary files /dev/null and b/trit8.rom.sym differ
diff --git a/trit8.tal b/trit8.tal
new file mode 100644
index 0000000..43cfb8d
--- /dev/null
+++ b/trit8.tal
@@ -0,0 +1,44 @@
+( Test 243 trit encoding in bytes
+| https://compilade.net/blog/ternary-packing )
+
+|000
+ @s1 $5 &end $1
+ @s2 $5 &end $1
+
+|100
+
+@on-reset ( -> )
+ #f300
+ &>l ( -- )
+ ( | encode )
+ STHk [ LIT2 -s1 -s1/end ]
+ &>l2 ( -- )
+ #01 SUB
+ ( :: ) STHkr #03 DIVk MUL SUB [ LIT "0 ] ADD OVR STZ
+ ( 3/ ) [ LITr 03 ] DIVr
+ ( .. ) NEQk ?&>l2
+ POP2 POPr
+ ( | decode )
+ DUP #f2 #00f3 DIV2 STH2
+ [ LIT2 -s2/end -s2 ]
+ &>l3 ( -- )
+ ( 3* ) [ LIT2r 0003 ] MUL2r
+ ( :: ) OVRr STHr [ LIT "0 ] ADD OVR STZ
+ [ LIT2r 00ff ] AND2r
+ ( .. ) INC GTHk ?&>l3
+ POP2 POP2r
+ ( | print )
+ ;s1
+ #2018 DEO
+ ;s2
+ #0a18 DEO
+ INC GTHk ?&>l
+ POP2 #010e DEO
+ #800f DEO
+ BRK
+
+@ ( addr* -- )
+ LDAk #18 DEO
+ INC2 LDAk ?
+ POP2 JMP2r
+