diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..06d9e2d
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,19 @@
+root = true
+
+[*]
+charset = utf-8
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+max_line_length = 120
+tab_width = 4
+trim_trailing_whitespace = true
+
+[*.json]
+indent_size = 2
+
+[*.jsonc]
+indent_size = 2
+
+[*.vsconfig]
+indent_size = 2
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..373c474
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,824 @@
+{
+ "$schema": "https://json.schemastore.org/eslintrc.json",
+ "extends": [
+ "eslint:all",
+ "plugin:@stylistic/all-extends",
+ "plugin:@typescript-eslint/all"
+ ],
+ "root": true,
+ "plugins": [
+ "@stylistic",
+ "@typescript-eslint"
+ ],
+ "parserOptions": {
+ "sourceType": "module",
+ "project": true
+ },
+ "rules": {
+ "@stylistic/array-bracket-newline": "error",
+ "@stylistic/array-bracket-spacing": "error",
+ "@stylistic/array-element-newline": [
+ "error",
+ "consistent"
+ ],
+ "@stylistic/arrow-parens": [
+ "error",
+ "as-needed"
+ ],
+ "@stylistic/arrow-spacing": "error",
+ "@stylistic/block-spacing": "error",
+ "@stylistic/brace-style": "error",
+ "@stylistic/comma-dangle": [
+ "error",
+ {
+ "arrays": "always-multiline",
+ "enums": "always-multiline",
+ "exports": "always-multiline",
+ "imports": "always-multiline",
+ "objects": "always-multiline"
+ }
+ ],
+ "@stylistic/comma-spacing": "error",
+ "@stylistic/comma-style": "error",
+ "@stylistic/computed-property-spacing": "error",
+ "@stylistic/dot-location": [
+ "error",
+ "property"
+ ],
+ "@stylistic/eol-last": "error",
+ "@stylistic/function-call-argument-newline": [
+ "error",
+ "consistent"
+ ],
+ "@stylistic/function-call-spacing": "error",
+ "@stylistic/function-paren-newline": "off",
+ "@stylistic/generator-star-spacing": "error",
+ "@stylistic/implicit-arrow-linebreak": "off",
+ // TODO: Configure the indent rules.
+ "@stylistic/indent": "off",
+ "@stylistic/indent-binary-ops": "off",
+ "@stylistic/key-spacing": [
+ "error",
+ {
+ "beforeColon": true
+ }
+ ],
+ "@stylistic/keyword-spacing": "error",
+ "@stylistic/linebreak-style": "off",
+ "@stylistic/lines-around-comment": [
+ "error",
+ {
+ "allowArrayEnd": true,
+ "allowArrayStart": true,
+ "allowBlockEnd": true,
+ "allowBlockStart": true,
+ "allowClassEnd": true,
+ "allowClassStart": true,
+ "allowEnumEnd": true,
+ "allowEnumStart": true,
+ "allowInterfaceEnd": true,
+ "allowInterfaceStart": true,
+ "allowModuleEnd": true,
+ "allowModuleStart": true,
+ "allowObjectEnd": true,
+ "allowObjectStart": true,
+ "allowTypeEnd": true,
+ "allowTypeStart": true,
+ "applyDefaultIgnorePatterns": false,
+ "ignorePattern": "^\\s*(eslint .*|@ts-expect-error\\s*)$"
+ }
+ ],
+ "@stylistic/lines-between-class-members": [
+ "error",
+ "always",
+ {
+ "exceptAfterOverload": false
+ }
+ ],
+ "@stylistic/max-len": [
+ "error",
+ {
+ "code": 120,
+ "ignoreComments": false,
+ "ignoreRegExpLiterals": false,
+ "ignoreStrings": false,
+ "ignoreTemplateLiterals": false,
+ "ignoreUrls": false
+ }
+ ],
+ "@stylistic/max-statements-per-line": "error",
+ "@stylistic/member-delimiter-style": "error",
+ "@stylistic/multiline-ternary": [
+ "error",
+ "always-multiline"
+ ],
+ "@stylistic/new-parens": "error",
+ "@stylistic/newline-per-chained-call": "off",
+ "@stylistic/no-confusing-arrow": "off",
+ "@stylistic/no-extra-parens": [
+ "error",
+ "all",
+ {
+ "nestedBinaryExpressions": true
+ }
+ ],
+ "@stylistic/no-extra-semi": "error",
+ "@stylistic/no-floating-decimal": "error",
+ "@stylistic/no-mixed-operators": [
+ "error",
+ {
+ "groups": [
+ [
+ "&&",
+ "||"
+ ]
+ ]
+ }
+ ],
+ "@stylistic/no-mixed-spaces-and-tabs": "error",
+ "@stylistic/no-multi-spaces": [
+ "error",
+ {
+ "exceptions": {
+ "Property": false
+ }
+ }
+ ],
+ "@stylistic/no-multiple-empty-lines": [
+ "error",
+ {
+ "max": 1
+ }
+ ],
+ "@stylistic/no-tabs": "error",
+ "@stylistic/no-trailing-spaces": "error",
+ "@stylistic/no-whitespace-before-property": "error",
+ "@stylistic/nonblock-statement-body-position": [
+ "error",
+ "below"
+ ],
+ "@stylistic/object-curly-newline": [
+ "error",
+ {
+ "multiline": true
+ }
+ ],
+ "@stylistic/object-curly-spacing": [
+ "error",
+ "always",
+ {
+ "arraysInObjects": true,
+ "objectsInObjects": true
+ }
+ ],
+ "@stylistic/object-property-newline": [
+ "error",
+ {
+ "allowAllPropertiesOnSameLine": true
+ }
+ ],
+ "@stylistic/one-var-declaration-per-line": "error",
+ "@stylistic/operator-linebreak": "error",
+ "@stylistic/padded-blocks": "off",
+ "@stylistic/padding-line-between-statements": "off",
+ "@stylistic/quote-props": [
+ "error",
+ "as-needed"
+ ],
+ "@stylistic/quotes": [
+ "error",
+ "double",
+ {
+ "allowTemplateLiterals": true
+ }
+ ],
+ "@stylistic/rest-spread-spacing": [
+ "error",
+ "always"
+ ],
+ "@stylistic/semi": "error",
+ "@stylistic/semi-spacing": "error",
+ "@stylistic/semi-style": "error",
+ "@stylistic/space-before-blocks": "error",
+ "@stylistic/space-before-function-paren": "off",
+ "@stylistic/space-in-parens": "error",
+ "@stylistic/space-infix-ops": "error",
+ "@stylistic/space-unary-ops": "error",
+ "@stylistic/spaced-comment": "error",
+ "@stylistic/switch-colon-spacing": "error",
+ "@stylistic/template-curly-spacing": "error",
+ "@stylistic/template-tag-spacing": "error",
+ "@stylistic/type-annotation-spacing": [
+ "error",
+ {
+ "overrides": {
+ "colon": {
+ "before": true
+ }
+ }
+ }
+ ],
+ "@stylistic/type-generic-spacing": "error",
+ "@stylistic/type-named-tuple-spacing": "error",
+ "@stylistic/wrap-iife": [
+ "error",
+ "inside"
+ ],
+ "@stylistic/wrap-regex": "error",
+ "@stylistic/yield-star-spacing": [
+ "error",
+ "before"
+ ],
+ "@typescript-eslint/adjacent-overload-signatures": "error",
+ "@typescript-eslint/array-type": [
+ "error",
+ {
+ "readonly": "array"
+ }
+ ],
+ "@typescript-eslint/await-thenable": "error",
+ "@typescript-eslint/ban-ts-comment": [
+ "error",
+ {
+ "ts-expect-error": false
+ }
+ ],
+ "@typescript-eslint/ban-types": "error",
+ "@typescript-eslint/class-literal-property-style": "error",
+ "@typescript-eslint/class-methods-use-this": "error",
+ "@typescript-eslint/consistent-generic-constructors": "error",
+ "@typescript-eslint/consistent-indexed-object-style": "error",
+ "@typescript-eslint/consistent-type-assertions": [
+ "error",
+ {
+ "assertionStyle": "as",
+ "objectLiteralTypeAssertions": "allow-as-parameter"
+ }
+ ],
+ "@typescript-eslint/consistent-type-definitions": "error",
+ "@typescript-eslint/consistent-type-exports": [
+ "error",
+ {
+ "fixMixedExportsWithInlineTypeSpecifier": true
+ }
+ ],
+ "@typescript-eslint/consistent-type-imports": [
+ "error",
+ {
+ "fixStyle": "inline-type-imports"
+ }
+ ],
+ "@typescript-eslint/default-param-last": "error",
+ "@typescript-eslint/dot-notation": [
+ "error",
+ {
+ "allowIndexSignaturePropertyAccess": true
+ }
+ ],
+ "@typescript-eslint/explicit-function-return-type": [
+ "error",
+ {
+ "allowConciseArrowFunctionExpressionsStartingWithVoid": true,
+ "allowFunctionsWithoutTypeParameters": true,
+ "allowIIFEs": true
+ }
+ ],
+ "@typescript-eslint/explicit-member-accessibility": "error",
+ "@typescript-eslint/explicit-module-boundary-types": [
+ "error",
+ {
+ "allowDirectConstAssertionInArrowFunctions": false,
+ "allowHigherOrderFunctions": false,
+ "allowTypedFunctionExpressions": false
+ }
+ ],
+ "@typescript-eslint/init-declarations": "error",
+ "@typescript-eslint/member-delimiter-style": "error",
+ "@typescript-eslint/member-ordering": "error",
+ "@typescript-eslint/method-signature-style": "error",
+ "@typescript-eslint/naming-convention": "error",
+ "@typescript-eslint/no-array-constructor": "error",
+ "@typescript-eslint/no-array-delete": "error",
+ "@typescript-eslint/no-base-to-string": [
+ "error",
+ {
+ "ignoredTypeNames": [
+ "Error",
+ "RegExp"
+ ]
+ }
+ ],
+ "@typescript-eslint/no-confusing-non-null-assertion": "off",
+ "@typescript-eslint/no-confusing-void-expression": [
+ "error",
+ {
+ "ignoreArrowShorthand": true
+ }
+ ],
+ "@typescript-eslint/no-dupe-class-members": "error",
+ "@typescript-eslint/no-duplicate-enum-values": "error",
+ "@typescript-eslint/no-duplicate-type-constituents": "error",
+ "@typescript-eslint/no-dynamic-delete": "error",
+ "@typescript-eslint/no-empty-function": "off",
+ "@typescript-eslint/no-empty-interface": "error",
+ "@typescript-eslint/no-explicit-any": [
+ "error",
+ {
+ "fixToUnknown": true
+ }
+ ],
+ "@typescript-eslint/no-extra-non-null-assertion": "error",
+ "@typescript-eslint/no-extraneous-class": [
+ "error",
+ {
+ "allowConstructorOnly": true,
+ "allowWithDecorator": true
+ }
+ ],
+ "@typescript-eslint/no-floating-promises": "error",
+ "@typescript-eslint/no-for-in-array": "error",
+ "@typescript-eslint/no-implied-eval": "error",
+ "@typescript-eslint/no-import-type-side-effects": "error",
+ "@typescript-eslint/no-inferrable-types": "off",
+ "@typescript-eslint/no-invalid-this": "error",
+ "@typescript-eslint/no-invalid-void-type": [
+ "error",
+ {
+ "allowAsThisParameter": true
+ }
+ ],
+ "@typescript-eslint/no-loop-func": "error",
+ "@typescript-eslint/no-loss-of-precision": "error",
+ "@typescript-eslint/no-magic-numbers": "off",
+ "@typescript-eslint/no-meaningless-void-operator": [
+ "error",
+ {
+ "checkNever": true
+ }
+ ],
+ "@typescript-eslint/no-misused-new": "error",
+ "@typescript-eslint/no-misused-promises": "error",
+ "@typescript-eslint/no-mixed-enums": "error",
+ "@typescript-eslint/no-namespace": [
+ "error",
+ {
+ "allowDefinitionFiles": false
+ }
+ ],
+ "@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error",
+ "@typescript-eslint/no-non-null-asserted-optional-chain": "error",
+ "@typescript-eslint/no-non-null-assertion": "off",
+ "@typescript-eslint/no-redeclare": [
+ "error",
+ {
+ "ignoreDeclarationMerge": false
+ }
+ ],
+ "@typescript-eslint/no-redundant-type-constituents": "error",
+ "@typescript-eslint/no-require-imports": "error",
+ "@typescript-eslint/no-restricted-imports": "off",
+ "@typescript-eslint/no-shadow": [
+ "error",
+ {
+ "builtinGlobals": true,
+ "hoist": "never",
+ "ignoreFunctionTypeParameterNameValueShadow": false,
+ "ignoreTypeValueShadow": false
+ }
+ ],
+ "@typescript-eslint/no-this-alias": "error",
+ "@typescript-eslint/no-throw-literal": "error",
+ "@typescript-eslint/no-type-alias": "off",
+ "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
+ "@typescript-eslint/no-unnecessary-condition": [
+ "error",
+ {
+ "allowConstantLoopConditions": true
+ }
+ ],
+ "@typescript-eslint/no-unnecessary-qualifier": "error",
+ "@typescript-eslint/no-unnecessary-type-arguments": "error",
+ "@typescript-eslint/no-unnecessary-type-assertion": "error",
+ "@typescript-eslint/no-unnecessary-type-constraint": "error",
+ "@typescript-eslint/no-unsafe-argument": "error",
+ "@typescript-eslint/no-unsafe-assignment": "error",
+ "@typescript-eslint/no-unsafe-call": "error",
+ "@typescript-eslint/no-unsafe-declaration-merging": "error",
+ "@typescript-eslint/no-unsafe-enum-comparison": "error",
+ "@typescript-eslint/no-unsafe-member-access": "error",
+ "@typescript-eslint/no-unsafe-return": "error",
+ "@typescript-eslint/no-unsafe-unary-minus": "error",
+ "@typescript-eslint/no-unused-expressions": [
+ "error",
+ {
+ "enforceForJSX": true
+ }
+ ],
+ "@typescript-eslint/no-unused-vars": [
+ "error",
+ {
+ "args": "all",
+ "argsIgnorePattern": "^_",
+ "caughtErrors": "all",
+ "caughtErrorsIgnorePattern": "^_",
+ "destructuredArrayIgnorePattern": "^_",
+ "varsIgnorePattern": "^_"
+ }
+ ],
+ "@typescript-eslint/no-use-before-define": [
+ "error",
+ {
+ "allowNamedExports": true,
+ "classes": false,
+ "functions": false
+ }
+ ],
+ "@typescript-eslint/no-useless-constructor": "error",
+ "@typescript-eslint/no-useless-empty-export": "error",
+ "@typescript-eslint/no-useless-template-literals": "error",
+ "@typescript-eslint/no-var-requires": "error",
+ "@typescript-eslint/non-nullable-type-assertion-style": "error",
+ "@typescript-eslint/parameter-properties": "error",
+ "@typescript-eslint/prefer-as-const": "error",
+ "@typescript-eslint/prefer-destructuring": [
+ "error",
+ {
+ "array": true,
+ "object": true
+ }
+ ],
+ "@typescript-eslint/prefer-enum-initializers": "off",
+ "@typescript-eslint/prefer-for-of": "error",
+ "@typescript-eslint/prefer-function-type": "error",
+ "@typescript-eslint/prefer-includes": "error",
+ "@typescript-eslint/prefer-literal-enum-member": [
+ "error",
+ {
+ "allowBitwiseExpressions": true
+ }
+ ],
+ "@typescript-eslint/prefer-namespace-keyword": "error",
+ "@typescript-eslint/prefer-nullish-coalescing": "error",
+ "@typescript-eslint/prefer-optional-chain": "error",
+ "@typescript-eslint/prefer-promise-reject-errors": "error",
+ "@typescript-eslint/prefer-readonly": "error",
+ "@typescript-eslint/prefer-readonly-parameter-types": "off",
+ "@typescript-eslint/prefer-reduce-type-parameter": "error",
+ "@typescript-eslint/prefer-regexp-exec": "error",
+ "@typescript-eslint/prefer-return-this-type": "error",
+ "@typescript-eslint/prefer-string-starts-ends-with": "error",
+ "@typescript-eslint/prefer-ts-expect-error": "error",
+ "@typescript-eslint/promise-function-async": [
+ "error",
+ {
+ "allowAny": false
+ }
+ ],
+ "@typescript-eslint/require-array-sort-compare": "error",
+ "@typescript-eslint/require-await": "error",
+ "@typescript-eslint/restrict-plus-operands": "error",
+ "@typescript-eslint/restrict-template-expressions": "off",
+ "@typescript-eslint/return-await": "error",
+ "@typescript-eslint/sort-type-constituents": [
+ "error",
+ {
+ "groupOrder": [
+ "keyword",
+ "operator",
+ "named",
+ "conditional",
+ "object",
+ "import",
+ "function",
+ "tuple",
+ "intersection",
+ "union",
+ "literal",
+ "nullish"
+ ]
+ }
+ ],
+ "@typescript-eslint/strict-boolean-expressions": [
+ "error",
+ {
+ "allowNumber": false,
+ "allowString": false
+ }
+ ],
+ "@typescript-eslint/switch-exhaustiveness-check": [
+ "error",
+ {
+ "allowDefaultCaseForExhaustiveSwitch": false
+ }
+ ],
+ "@typescript-eslint/triple-slash-reference": [
+ "error",
+ {
+ "lib": "never",
+ "types": "never"
+ }
+ ],
+ "@typescript-eslint/typedef": [
+ "error",
+ {
+ "memberVariableDeclaration": true,
+ "parameter": true,
+ "propertyDeclaration": true
+ }
+ ],
+ "@typescript-eslint/unbound-method": [
+ "error",
+ {
+ "ignoreStatic": true
+ }
+ ],
+ "@typescript-eslint/unified-signatures": "error",
+ "accessor-pairs": "error",
+ "array-callback-return": "error",
+ "arrow-body-style": "error",
+ "block-scoped-var": "error",
+ "camelcase": "error",
+ "capitalized-comments": "off",
+ "complexity": "off",
+ "consistent-return": "error",
+ "consistent-this": "error",
+ "constructor-super": "error",
+ "curly": "off",
+ "default-case": "off",
+ "default-case-last": "error",
+ "default-param-last": "off",
+ "dot-notation": "off",
+ "eqeqeq": "error",
+ "for-direction": "error",
+ "func-name-matching": "off",
+ "func-names": [
+ "error",
+ "never"
+ ],
+ "func-style": [
+ "error",
+ "declaration"
+ ],
+ "getter-return": "error",
+ "grouped-accessor-pairs": [
+ "error",
+ "getBeforeSet"
+ ],
+ "guard-for-in": "off",
+ "id-denylist": "off",
+ "id-length": "off",
+ "id-match": "off",
+ "init-declarations": "off",
+ "line-comment-position": "off",
+ "logical-assignment-operators": [
+ "error",
+ "always",
+ {
+ "enforceForIfStatements": true
+ }
+ ],
+ "max-classes-per-file": "off",
+ "max-depth": "off",
+ "max-lines": "off",
+ "max-lines-per-function": "off",
+ "max-nested-callbacks": "off",
+ "max-params": "off",
+ "max-statements": "off",
+ "multiline-comment-style": [
+ "error",
+ "separate-lines",
+ {
+ "checkJSDoc": true
+ }
+ ],
+ "new-cap": "error",
+ "no-alert": "off",
+ "no-array-constructor": "off",
+ "no-async-promise-executor": "error",
+ "no-await-in-loop": "error",
+ "no-bitwise": "off",
+ "no-caller": "error",
+ "no-case-declarations": "off",
+ "no-class-assign": "error",
+ "no-compare-neg-zero": "error",
+ "no-cond-assign": "off",
+ "no-console": "off",
+ "no-const-assign": "error",
+ "no-constant-binary-expression": "error",
+ "no-constant-condition": "error",
+ "no-constructor-return": "error",
+ "no-continue": "off",
+ "no-control-regex": "error",
+ "no-debugger": "off",
+ "no-delete-var": "error",
+ "no-div-regex": "off",
+ "no-dupe-args": "error",
+ "no-dupe-class-members": "off",
+ "no-dupe-else-if": "error",
+ "no-dupe-keys": "error",
+ "no-duplicate-case": "error",
+ "no-else-return": [
+ "error",
+ {
+ "allowElseIf": false
+ }
+ ],
+ "no-empty": "error",
+ "no-empty-character-class": "error",
+ "no-empty-function": "off",
+ "no-empty-pattern": "error",
+ "no-empty-static-block": "error",
+ "no-eq-null": "error",
+ "no-eval": [
+ "error",
+ {
+ "allowIndirect": true
+ }
+ ],
+ "no-ex-assign": "error",
+ "no-extend-native": "error",
+ "no-extra-bind": "error",
+ "no-extra-boolean-cast": [
+ "error",
+ {
+ "enforceForLogicalOperands": true
+ }
+ ],
+ "no-extra-label": "error",
+ "no-fallthrough": "error",
+ "no-func-assign": "error",
+ "no-global-assign": "error",
+ "no-implicit-coercion": [
+ "error",
+ {
+ "boolean": false
+ }
+ ],
+ "no-implicit-globals": "error",
+ "no-implied-eval": "off",
+ "no-import-assign": "error",
+ "no-inline-comments": "off",
+ "no-inner-declarations": [
+ "error",
+ "both"
+ ],
+ "no-invalid-regexp": "error",
+ "no-invalid-this": "off",
+ "no-irregular-whitespace": [
+ "error",
+ {
+ "skipStrings": false
+ }
+ ],
+ "no-iterator": "error",
+ "no-label-var": "error",
+ "no-labels": "off",
+ "no-lone-blocks": "off",
+ "no-lonely-if": "error",
+ "no-loop-func": "off",
+ "no-loss-of-precision": "off",
+ "no-magic-numbers": "off",
+ "no-misleading-character-class": "error",
+ "no-multi-assign": "off",
+ "no-multi-str": "off",
+ "no-negated-condition": "off",
+ "no-nested-ternary": "off",
+ "no-new": "off",
+ "no-new-func": "off",
+ "no-new-native-nonconstructor": "error",
+ "no-new-object": "error",
+ "no-new-symbol": "off",
+ "no-new-wrappers": "error",
+ "no-nonoctal-decimal-escape": "error",
+ "no-octal": "off",
+ "no-octal-escape": "error",
+ "no-obj-calls": "error",
+ "no-param-reassign": "error",
+ "no-plusplus": "off",
+ "no-promise-executor-return": "error",
+ "no-proto": "error",
+ "no-prototype-builtins": "error",
+ "no-redeclare": "off",
+ "no-regex-spaces": "error",
+ "no-restricted-exports": "off",
+ "no-restricted-globals": "off",
+ "no-restricted-imports": "off",
+ "no-restricted-properties": "off",
+ "no-restricted-syntax": "off",
+ "no-return-assign": "off",
+ "no-return-await": "error",
+ "no-script-url": "error",
+ "no-self-assign": "error",
+ "no-self-compare": "error",
+ "no-sequences": [
+ "error",
+ {
+ "allowInParentheses": false
+ }
+ ],
+ "no-setter-return": "error",
+ "no-shadow": "off",
+ "no-shadow-restricted-names": "error",
+ "no-sparse-arrays": "error",
+ "no-template-curly-in-string": "error",
+ "no-ternary": "off",
+ "no-this-before-super": "error",
+ "no-throw-literal": "off",
+ "no-undef": "off",
+ "no-undef-init": "error",
+ "no-undefined": "off",
+ "no-underscore-dangle": "off",
+ "no-unexpected-multiline": "error",
+ "no-unmodified-loop-condition": "error",
+ "no-unneeded-ternary": "error",
+ "no-unreachable": "error",
+ "no-unreachable-loop": "error",
+ "no-unsafe-finally": "error",
+ "no-unsafe-negation": [
+ "error",
+ {
+ "enforceForOrderingRelations": true
+ }
+ ],
+ "no-unsafe-optional-chaining": "error",
+ "no-unused-expressions": "off",
+ "no-unused-labels": "error",
+ "no-unused-private-class-members": "error",
+ "no-unused-vars": "off",
+ "no-use-before-define": "off",
+ "no-useless-backreference": "error",
+ "no-useless-call": "error",
+ "no-useless-catch": "error",
+ "no-useless-computed-key": [
+ "error",
+ {
+ "enforceForClassMembers": true
+ }
+ ],
+ "no-useless-concat": "error",
+ "no-useless-constructor": "off",
+ "no-useless-escape": "error",
+ "no-useless-rename": "error",
+ "no-useless-return": "error",
+ "no-var": "error",
+ "no-void": "off",
+ "no-warning-comments": "off",
+ "no-with": "error",
+ "object-shorthand": "error",
+ "one-var": [
+ "error",
+ "never"
+ ],
+ "operator-assignment": "error",
+ "prefer-arrow-callback": "error",
+ "prefer-const": "error",
+ "prefer-exponentiation-operator": "error",
+ "prefer-named-capture-group": "off",
+ "prefer-numeric-literals": "error",
+ "prefer-object-has-own": "error",
+ "prefer-object-spread": "error",
+ "prefer-regex-literals": [
+ "error",
+ {
+ "disallowRedundantWrapping": true
+ }
+ ],
+ "prefer-rest-params": "error",
+ "prefer-spread": "error",
+ "prefer-template": "error",
+ "radix": "error",
+ "require-atomic-updates": "error",
+ "require-await": "off",
+ "require-unicode-regexp": "error",
+ "require-yield": "error",
+ "return-await": "off",
+ "sort-imports": [
+ "error",
+ {
+ "memberSyntaxSortOrder": [
+ "none",
+ "single",
+ "multiple",
+ "all"
+ ]
+ }
+ ],
+ "sort-keys": "off",
+ "sort-vars": "off",
+ "strict": "error",
+ "symbol-description": "off",
+ "unicode-bom": "error",
+ "use-isnan": [
+ "error",
+ {
+ "enforceForIndexOf": true
+ }
+ ],
+ "valid-typeof": "error",
+ "vars-on-top": "error",
+ "yoda": "error"
+ },
+ "ignorePatterns": [
+ "/out"
+ ]
+}
diff --git a/.fleet/settings.json b/.fleet/settings.json
new file mode 100644
index 0000000..591e558
--- /dev/null
+++ b/.fleet/settings.json
@@ -0,0 +1,8 @@
+{
+ "files.exclude": [
+ "out",
+ ".idea",
+ ".vs",
+ "node_modules"
+ ]
+}
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..db06c14
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,5 @@
+* text
+*.verified.* text eol=lf
+*.ico binary
+*.png binary
+*.zig eol=lf
diff --git a/.gitbook.yaml b/.gitbook.yaml
new file mode 100644
index 0000000..c4f40a2
--- /dev/null
+++ b/.gitbook.yaml
@@ -0,0 +1,4 @@
+root: doc
+structure:
+ readme: index.md
+ summary: toc.md
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 0000000..9e0cae6
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1 @@
+* @vezel-dev/ton-maintainers
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..1c5fcdc
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,35 @@
+# yaml-language-server: $schema=https://json.schemastore.org/dependabot-2.0.json
+version: 2
+updates:
+ - directory: /
+ package-ecosystem: github-actions
+ schedule:
+ interval: daily
+ timezone: Europe/Copenhagen
+ time: "12:00"
+ open-pull-requests-limit: 25
+ labels: []
+ - directory: /doc
+ package-ecosystem: npm
+ schedule:
+ interval: daily
+ timezone: Europe/Copenhagen
+ time: "12:00"
+ open-pull-requests-limit: 25
+ labels: []
+ - directory: /src/vscode
+ package-ecosystem: npm
+ schedule:
+ interval: daily
+ timezone: Europe/Copenhagen
+ time: "12:00"
+ open-pull-requests-limit: 25
+ labels: []
+ - directory: /
+ package-ecosystem: nuget
+ schedule:
+ interval: daily
+ timezone: Europe/Copenhagen
+ time: "12:00"
+ open-pull-requests-limit: 25
+ labels: []
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..7a324ba
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,58 @@
+# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
+name: Build
+on:
+ push:
+ branches-ignore:
+ - dependabot/**
+ pull_request:
+ workflow_dispatch:
+permissions:
+ contents: read
+defaults:
+ run:
+ shell: bash
+env:
+ DOTNET_CLI_TELEMETRY_OPTOUT: true
+ DOTNET_GENERATE_ASPNET_CERTIFICATE: false
+ DOTNET_NOLOGO: true
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ os:
+ - macos-13
+ - macos-14
+ - ubuntu-20.04
+ - ubuntu-22.04
+ - windows-2019
+ - windows-2022
+ cfg:
+ - Debug
+ - Release
+ runs-on: ${{ matrix.os }}
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v4.1.1
+ with:
+ fetch-depth: 0
+ submodules: recursive
+ - name: Set up .NET
+ uses: actions/setup-dotnet@v4.0.0
+ - name: Set up Node.js
+ uses: actions/setup-node@v4.0.1
+ with:
+ node-version-file: src/vscode/package.json
+ - name: Run Cake
+ run: |
+ ./cake -c ${{ matrix.cfg }}
+ - name: Upload artifacts
+ if: always()
+ uses: actions/upload-artifact@v4.3.0
+ with:
+ name: ${{ github.workflow }}-${{ github.run_number }}-${{ github.run_attempt }}-${{ matrix.os }}-${{ matrix.cfg }}
+ path: |
+ out/log
+ out/pkg
+ out/pub
+ out/trx
diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml
new file mode 100644
index 0000000..41ee0f3
--- /dev/null
+++ b/.github/workflows/package.yml
@@ -0,0 +1,46 @@
+# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
+name: Package
+on:
+ push:
+ branches:
+ - master
+permissions:
+ contents: read
+ packages: write
+defaults:
+ run:
+ shell: bash
+env:
+ DOTNET_CLI_TELEMETRY_OPTOUT: true
+ DOTNET_GENERATE_ASPNET_CERTIFICATE: false
+ DOTNET_NOLOGO: true
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+jobs:
+ package:
+ if: github.repository == 'vezel-dev/ton'
+ runs-on: ubuntu-22.04
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v4.1.1
+ with:
+ fetch-depth: 0
+ submodules: recursive
+ - name: Set up .NET
+ uses: actions/setup-dotnet@v4.0.0
+ - name: Set up Node.js
+ uses: actions/setup-node@v4.0.1
+ with:
+ node-version-file: src/vscode/package.json
+ - name: Run Cake
+ run: |
+ ./cake upload-core-github
+ - name: Upload artifacts
+ if: always()
+ uses: actions/upload-artifact@v4.3.0
+ with:
+ name: ${{ github.workflow }}-${{ github.run_number }}-${{ github.run_attempt }}
+ path: |
+ out/log
+ out/pkg
+ out/pub
+ out/trx
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..2793e49
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,49 @@
+# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
+name: Release
+on:
+ release:
+ types:
+ - published
+permissions:
+ contents: read
+defaults:
+ run:
+ shell: bash
+env:
+ DOTNET_CLI_TELEMETRY_OPTOUT: true
+ DOTNET_GENERATE_ASPNET_CERTIFICATE: false
+ DOTNET_NOLOGO: true
+ NUGET_TOKEN: ${{ secrets.NUGET_TOKEN }}
+ OVSX_TOKEN: ${{ secrets.OVSX_TOKEN }}
+ VSCE_TOKEN: ${{ secrets.VSCE_TOKEN }}
+jobs:
+ release:
+ if: github.repository == 'vezel-dev/ton'
+ runs-on: ubuntu-22.04
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v4.1.1
+ with:
+ fetch-depth: 0
+ submodules: recursive
+ - name: Set up .NET
+ uses: actions/setup-dotnet@v4.0.0
+ - name: Set up Node.js
+ uses: actions/setup-node@v4.0.1
+ with:
+ node-version-file: src/vscode/package.json
+ - name: Run Cake
+ run: |
+ ./cake upload-core-nuget -c Release
+ ./cake upload-vscode-vsce -c Release
+ ./cake upload-vscode-ovsx -c Release
+ - name: Upload artifacts
+ if: always()
+ uses: actions/upload-artifact@v4.3.0
+ with:
+ name: ${{ github.workflow }}-${{ github.run_number }}-${{ github.run_attempt }}
+ path: |
+ out/log
+ out/pkg
+ out/pub
+ out/trx
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..aa67d64
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+/out
+*.received.*
+*.user
+.idea
+.vs
+node_modules
diff --git a/.globalconfig b/.globalconfig
new file mode 100644
index 0000000..72216ab
--- /dev/null
+++ b/.globalconfig
@@ -0,0 +1,1005 @@
+global_level = 0
+
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_case_contents_when_block = false
+csharp_indent_labels = one_less_than_current
+csharp_indent_switch_labels = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_else = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_open_brace = all
+csharp_new_line_between_query_expression_clauses = true
+csharp_preferred_modifier_order = public, private, protected, internal, file, static, extern, new, virtual, abstract, override, sealed, readonly, unsafe, required, volatile, async
+csharp_prefer_braces = false
+csharp_prefer_simple_default_expression = true
+csharp_prefer_simple_using_statement = true
+csharp_prefer_static_local_function = true
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = false
+csharp_space_after_cast = false
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_after_dot = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_around_declaration_statements = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_before_comma = false
+csharp_space_before_dot = false
+csharp_space_before_open_square_brackets = false
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_between_square_brackets = false
+csharp_style_conditional_delegate_call = true
+csharp_style_deconstructed_variable_declaration = true
+csharp_style_expression_bodied_accessors = true
+csharp_style_expression_bodied_constructors = false
+csharp_style_expression_bodied_indexers = true
+csharp_style_expression_bodied_lambdas = true
+csharp_style_expression_bodied_local_functions = false
+csharp_style_expression_bodied_methods = false
+csharp_style_expression_bodied_operators = true
+csharp_style_expression_bodied_properties = true
+csharp_style_implicit_object_creation_when_type_is_apparent = true
+csharp_style_inlined_variable_declaration = true
+csharp_style_namespace_declarations = file_scoped
+csharp_style_pattern_matching_over_as_with_null_check = true
+csharp_style_pattern_matching_over_is_with_cast_check = true
+csharp_style_prefer_extended_property_pattern = true
+csharp_style_prefer_index_operator = true
+csharp_style_prefer_local_over_anonymous_function = true
+csharp_style_prefer_method_group_conversion = true
+csharp_style_prefer_not_pattern = true
+csharp_style_prefer_null_check_over_type_check = true
+csharp_style_prefer_pattern_matching = true
+csharp_style_prefer_range_operator = true
+csharp_style_prefer_readonly_struct = true
+csharp_style_prefer_readonly_struct_member = true
+csharp_style_prefer_switch_expression = true
+csharp_style_prefer_top_level_statements = true
+csharp_style_prefer_tuple_swap = true
+csharp_style_prefer_utf8_string_literals = true
+csharp_style_throw_expression = true
+csharp_style_unused_value_assignment_preference = discard_variable
+csharp_style_unused_value_expression_statement_preference = discard_variable
+csharp_style_var_elsewhere = true
+csharp_style_var_for_built_in_types = true
+csharp_style_var_when_type_is_apparent = true
+csharp_using_directive_placement = outside_namespace
+
+dotnet_code_quality_unused_parameters = all
+dotnet_separate_import_directive_groups = false
+dotnet_sort_system_directives_first = true
+dotnet_style_coalesce_expression = true
+dotnet_style_collection_initializer = true
+dotnet_style_explicit_tuple_names = true
+dotnet_style_namespace_match_folder = true
+dotnet_style_null_propagation = true
+dotnet_style_object_initializer = true
+dotnet_style_operator_placement_when_wrapping = end_of_line
+dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
+dotnet_style_predefined_type_for_locals_parameters_members = true
+dotnet_style_predefined_type_for_member_access = true
+dotnet_style_prefer_auto_properties = true
+dotnet_style_prefer_compound_assignment = true
+dotnet_style_prefer_conditional_expression_over_assignment = true
+dotnet_style_prefer_conditional_expression_over_return = true
+dotnet_style_prefer_foreach_explicit_cast_in_source = always
+dotnet_style_prefer_inferred_anonymous_type_member_names = true
+dotnet_style_prefer_inferred_tuple_names = true
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true
+dotnet_style_prefer_simplified_boolean_expressions = true
+dotnet_style_prefer_simplified_interpolation = true
+dotnet_style_qualification_for_event = false
+dotnet_style_qualification_for_field = false
+dotnet_style_qualification_for_method = false
+dotnet_style_qualification_for_property = false
+dotnet_style_readonly_field = true
+dotnet_style_require_accessibility_modifiers = always
+
+dotnet_public_api_analyzer.require_api_files = true
+
+dotnet_diagnostic.EnableGenerateDocumentationFile.severity = none # TODO: https://github.com/dotnet/roslyn/issues/41640
+
+dotnet_diagnostic.CA1000.severity = none
+dotnet_diagnostic.CA1001.severity = error
+dotnet_diagnostic.CA1002.severity = error
+dotnet_diagnostic.CA1003.severity = none
+dotnet_diagnostic.CA1005.severity = none
+dotnet_diagnostic.CA1008.severity = error
+dotnet_diagnostic.CA1010.severity = error
+dotnet_diagnostic.CA1012.severity = error
+dotnet_diagnostic.CA1014.severity = none
+dotnet_diagnostic.CA1016.severity = error
+dotnet_diagnostic.CA1017.severity = none
+dotnet_diagnostic.CA1018.severity = error
+dotnet_diagnostic.CA1019.severity = error
+dotnet_diagnostic.CA1021.severity = none
+dotnet_diagnostic.CA1024.severity = error
+dotnet_diagnostic.CA1027.severity = error
+dotnet_diagnostic.CA1028.severity = none
+dotnet_diagnostic.CA1030.severity = error
+dotnet_diagnostic.CA1031.severity = error
+dotnet_diagnostic.CA1032.severity = error
+dotnet_diagnostic.CA1033.severity = error
+dotnet_diagnostic.CA1034.severity = none
+dotnet_diagnostic.CA1036.severity = error
+dotnet_diagnostic.CA1040.severity = none
+dotnet_diagnostic.CA1041.severity = error
+dotnet_diagnostic.CA1043.severity = none
+dotnet_diagnostic.CA1044.severity = error
+dotnet_diagnostic.CA1045.severity = none
+dotnet_diagnostic.CA1046.severity = none
+dotnet_diagnostic.CA1047.severity = error
+dotnet_diagnostic.CA1050.severity = error
+dotnet_diagnostic.CA1051.severity = error
+dotnet_diagnostic.CA1052.severity = error
+dotnet_diagnostic.CA1053.severity = error
+dotnet_diagnostic.CA1054.severity = error
+dotnet_diagnostic.CA1055.severity = error
+dotnet_diagnostic.CA1056.severity = error
+dotnet_diagnostic.CA1058.severity = error
+dotnet_diagnostic.CA1060.severity = none
+dotnet_diagnostic.CA1061.severity = error
+dotnet_diagnostic.CA1062.severity = error
+dotnet_diagnostic.CA1063.severity = error
+dotnet_diagnostic.CA1064.severity = error
+dotnet_diagnostic.CA1065.severity = error
+dotnet_diagnostic.CA1066.severity = error
+dotnet_diagnostic.CA1067.severity = error
+dotnet_diagnostic.CA1068.severity = error
+dotnet_diagnostic.CA1069.severity = error
+dotnet_diagnostic.CA1070.severity = error
+dotnet_diagnostic.CA1200.severity = error
+dotnet_diagnostic.CA1303.severity = none
+dotnet_diagnostic.CA1304.severity = error
+dotnet_diagnostic.CA1305.severity = error
+dotnet_diagnostic.CA1307.severity = error
+dotnet_diagnostic.CA1308.severity = error
+dotnet_diagnostic.CA1309.severity = error
+dotnet_diagnostic.CA1310.severity = error
+dotnet_diagnostic.CA1311.severity = error
+dotnet_diagnostic.CA1401.severity = error
+dotnet_diagnostic.CA1416.severity = none
+dotnet_diagnostic.CA1417.severity = error
+dotnet_diagnostic.CA1418.severity = error
+dotnet_diagnostic.CA1419.severity = error
+dotnet_diagnostic.CA1420.severity = error
+dotnet_diagnostic.CA1421.severity = error
+dotnet_diagnostic.CA1422.severity = error
+dotnet_diagnostic.CA1501.severity = none
+dotnet_diagnostic.CA1502.severity = none
+dotnet_diagnostic.CA1505.severity = none
+dotnet_diagnostic.CA1506.severity = none
+dotnet_diagnostic.CA1507.severity = error
+dotnet_diagnostic.CA1508.severity = error
+dotnet_diagnostic.CA1509.severity = error
+dotnet_diagnostic.CA1510.severity = error
+dotnet_diagnostic.CA1511.severity = error
+dotnet_diagnostic.CA1512.severity = error
+dotnet_diagnostic.CA1513.severity = error
+dotnet_diagnostic.CA1514.severity = error
+dotnet_diagnostic.CA1700.severity = error
+dotnet_diagnostic.CA1707.severity = error
+dotnet_diagnostic.CA1708.severity = error
+dotnet_diagnostic.CA1710.severity = error
+dotnet_diagnostic.CA1711.severity = error
+dotnet_diagnostic.CA1712.severity = error
+dotnet_diagnostic.CA1713.severity = error
+dotnet_diagnostic.CA1714.severity = error
+dotnet_diagnostic.CA1715.severity = error
+dotnet_diagnostic.CA1716.severity = none
+dotnet_diagnostic.CA1717.severity = error
+dotnet_diagnostic.CA1720.severity = none
+dotnet_diagnostic.CA1721.severity = error
+dotnet_diagnostic.CA1724.severity = error
+dotnet_diagnostic.CA1725.severity = error
+dotnet_diagnostic.CA1727.severity = error
+dotnet_diagnostic.CA1802.severity = error
+dotnet_diagnostic.CA1805.severity = error
+dotnet_diagnostic.CA1806.severity = error
+dotnet_diagnostic.CA1810.severity = error
+dotnet_diagnostic.CA1812.severity = error
+dotnet_diagnostic.CA1813.severity = none
+dotnet_diagnostic.CA1814.severity = none
+dotnet_diagnostic.CA1815.severity = error
+dotnet_diagnostic.CA1816.severity = error
+dotnet_diagnostic.CA1820.severity = error
+dotnet_diagnostic.CA1821.severity = error
+dotnet_diagnostic.CA1822.severity = error
+dotnet_diagnostic.CA1823.severity = error
+dotnet_diagnostic.CA1824.severity = error
+dotnet_diagnostic.CA1825.severity = error
+dotnet_diagnostic.CA1826.severity = error
+dotnet_diagnostic.CA1827.severity = error
+dotnet_diagnostic.CA1828.severity = error
+dotnet_diagnostic.CA1829.severity = error
+dotnet_diagnostic.CA1830.severity = error
+dotnet_diagnostic.CA1831.severity = error
+dotnet_diagnostic.CA1832.severity = error
+dotnet_diagnostic.CA1833.severity = error
+dotnet_diagnostic.CA1834.severity = error
+dotnet_diagnostic.CA1835.severity = error
+dotnet_diagnostic.CA1836.severity = error
+dotnet_diagnostic.CA1837.severity = error
+dotnet_diagnostic.CA1838.severity = error
+dotnet_diagnostic.CA1839.severity = error
+dotnet_diagnostic.CA1840.severity = error
+dotnet_diagnostic.CA1841.severity = error
+dotnet_diagnostic.CA1842.severity = error
+dotnet_diagnostic.CA1843.severity = error
+dotnet_diagnostic.CA1844.severity = error
+dotnet_diagnostic.CA1845.severity = error
+dotnet_diagnostic.CA1846.severity = error
+dotnet_diagnostic.CA1847.severity = error
+dotnet_diagnostic.CA1848.severity = error
+dotnet_diagnostic.CA1849.severity = error
+dotnet_diagnostic.CA1850.severity = error
+dotnet_diagnostic.CA1851.severity = error
+dotnet_diagnostic.CA1852.severity = error
+dotnet_diagnostic.CA1853.severity = error
+dotnet_diagnostic.CA1854.severity = error
+dotnet_diagnostic.CA1855.severity = error
+dotnet_diagnostic.CA1856.severity = error
+dotnet_diagnostic.CA1857.severity = error
+dotnet_diagnostic.CA1858.severity = error
+dotnet_diagnostic.CA1859.severity = none
+dotnet_diagnostic.CA1860.severity = error
+dotnet_diagnostic.CA1861.severity = error
+dotnet_diagnostic.CA1862.severity = error
+dotnet_diagnostic.CA1863.severity = error
+dotnet_diagnostic.CA1864.severity = error
+dotnet_diagnostic.CA1865.severity = error
+dotnet_diagnostic.CA1866.severity = error
+dotnet_diagnostic.CA1867.severity = error
+dotnet_diagnostic.CA1868.severity = error
+dotnet_diagnostic.CA1869.severity = error
+dotnet_diagnostic.CA1870.severity = error
+dotnet_diagnostic.CA2000.severity = error
+dotnet_diagnostic.CA2002.severity = error
+dotnet_diagnostic.CA2007.severity = error
+dotnet_diagnostic.CA2008.severity = error
+dotnet_diagnostic.CA2009.severity = error
+dotnet_diagnostic.CA2011.severity = error
+dotnet_diagnostic.CA2012.severity = error
+dotnet_diagnostic.CA2013.severity = error
+dotnet_diagnostic.CA2014.severity = error
+dotnet_diagnostic.CA2015.severity = error
+dotnet_diagnostic.CA2016.severity = error
+dotnet_diagnostic.CA2017.severity = error
+dotnet_diagnostic.CA2018.severity = error
+dotnet_diagnostic.CA2019.severity = error
+dotnet_diagnostic.CA2020.severity = error
+dotnet_diagnostic.CA2021.severity = error
+dotnet_diagnostic.CA2100.severity = error
+dotnet_diagnostic.CA2101.severity = error
+dotnet_diagnostic.CA2119.severity = error
+dotnet_diagnostic.CA2153.severity = error
+dotnet_diagnostic.CA2200.severity = error
+dotnet_diagnostic.CA2201.severity = error
+dotnet_diagnostic.CA2207.severity = error
+dotnet_diagnostic.CA2208.severity = error
+dotnet_diagnostic.CA2211.severity = error
+dotnet_diagnostic.CA2213.severity = error
+dotnet_diagnostic.CA2214.severity = error
+dotnet_diagnostic.CA2215.severity = error
+dotnet_diagnostic.CA2216.severity = error
+dotnet_diagnostic.CA2217.severity = error
+dotnet_diagnostic.CA2218.severity = error
+dotnet_diagnostic.CA2219.severity = error
+dotnet_diagnostic.CA2224.severity = error
+dotnet_diagnostic.CA2225.severity = none
+dotnet_diagnostic.CA2226.severity = error
+dotnet_diagnostic.CA2227.severity = error
+dotnet_diagnostic.CA2231.severity = error
+dotnet_diagnostic.CA2234.severity = error
+dotnet_diagnostic.CA2235.severity = none
+dotnet_diagnostic.CA2237.severity = none
+dotnet_diagnostic.CA2241.severity = error
+dotnet_diagnostic.CA2242.severity = error
+dotnet_diagnostic.CA2243.severity = error
+dotnet_diagnostic.CA2244.severity = error
+dotnet_diagnostic.CA2245.severity = error
+dotnet_diagnostic.CA2246.severity = none
+dotnet_diagnostic.CA2247.severity = error
+dotnet_diagnostic.CA2248.severity = error
+dotnet_diagnostic.CA2249.severity = error
+dotnet_diagnostic.CA2250.severity = error
+dotnet_diagnostic.CA2251.severity = error
+dotnet_diagnostic.CA2252.severity = error
+dotnet_diagnostic.CA2253.severity = error
+dotnet_diagnostic.CA2254.severity = error
+dotnet_diagnostic.CA2255.severity = error
+dotnet_diagnostic.CA2256.severity = error
+dotnet_diagnostic.CA2257.severity = error
+dotnet_diagnostic.CA2259.severity = error
+dotnet_diagnostic.CA2260.severity = error
+dotnet_diagnostic.CA2261.severity = error
+dotnet_diagnostic.CA2300.severity = error
+dotnet_diagnostic.CA2301.severity = error
+dotnet_diagnostic.CA2302.severity = error
+dotnet_diagnostic.CA2305.severity = error
+dotnet_diagnostic.CA2310.severity = error
+dotnet_diagnostic.CA2311.severity = error
+dotnet_diagnostic.CA2312.severity = error
+dotnet_diagnostic.CA2315.severity = error
+dotnet_diagnostic.CA2321.severity = error
+dotnet_diagnostic.CA2322.severity = error
+dotnet_diagnostic.CA2326.severity = error
+dotnet_diagnostic.CA2327.severity = error
+dotnet_diagnostic.CA2328.severity = error
+dotnet_diagnostic.CA2329.severity = error
+dotnet_diagnostic.CA2330.severity = error
+dotnet_diagnostic.CA2350.severity = error
+dotnet_diagnostic.CA2351.severity = error
+dotnet_diagnostic.CA2352.severity = error
+dotnet_diagnostic.CA2353.severity = error
+dotnet_diagnostic.CA2354.severity = error
+dotnet_diagnostic.CA2355.severity = error
+dotnet_diagnostic.CA2356.severity = error
+dotnet_diagnostic.CA2361.severity = error
+dotnet_diagnostic.CA2362.severity = error
+dotnet_diagnostic.CA3001.severity = error
+dotnet_diagnostic.CA3002.severity = error
+dotnet_diagnostic.CA3003.severity = error
+dotnet_diagnostic.CA3004.severity = error
+dotnet_diagnostic.CA3006.severity = error
+dotnet_diagnostic.CA3007.severity = error
+dotnet_diagnostic.CA3008.severity = error
+dotnet_diagnostic.CA3009.severity = error
+dotnet_diagnostic.CA3010.severity = error
+dotnet_diagnostic.CA3011.severity = error
+dotnet_diagnostic.CA3012.severity = error
+dotnet_diagnostic.CA3061.severity = error
+dotnet_diagnostic.CA3075.severity = error
+dotnet_diagnostic.CA3076.severity = error
+dotnet_diagnostic.CA3077.severity = error
+dotnet_diagnostic.CA3147.severity = error
+dotnet_diagnostic.CA5350.severity = error
+dotnet_diagnostic.CA5351.severity = error
+dotnet_diagnostic.CA5358.severity = error
+dotnet_diagnostic.CA5359.severity = error
+dotnet_diagnostic.CA5360.severity = error
+dotnet_diagnostic.CA5361.severity = error
+dotnet_diagnostic.CA5362.severity = error
+dotnet_diagnostic.CA5363.severity = error
+dotnet_diagnostic.CA5364.severity = error
+dotnet_diagnostic.CA5365.severity = error
+dotnet_diagnostic.CA5366.severity = error
+dotnet_diagnostic.CA5367.severity = error
+dotnet_diagnostic.CA5368.severity = error
+dotnet_diagnostic.CA5369.severity = error
+dotnet_diagnostic.CA5370.severity = error
+dotnet_diagnostic.CA5371.severity = error
+dotnet_diagnostic.CA5372.severity = error
+dotnet_diagnostic.CA5373.severity = error
+dotnet_diagnostic.CA5374.severity = error
+dotnet_diagnostic.CA5375.severity = error
+dotnet_diagnostic.CA5376.severity = error
+dotnet_diagnostic.CA5377.severity = error
+dotnet_diagnostic.CA5378.severity = error
+dotnet_diagnostic.CA5379.severity = error
+dotnet_diagnostic.CA5380.severity = error
+dotnet_diagnostic.CA5381.severity = error
+dotnet_diagnostic.CA5382.severity = error
+dotnet_diagnostic.CA5383.severity = error
+dotnet_diagnostic.CA5384.severity = error
+dotnet_diagnostic.CA5385.severity = error
+dotnet_diagnostic.CA5386.severity = error
+dotnet_diagnostic.CA5387.severity = error
+dotnet_diagnostic.CA5388.severity = error
+dotnet_diagnostic.CA5389.severity = error
+dotnet_diagnostic.CA5390.severity = error
+dotnet_diagnostic.CA5391.severity = error
+dotnet_diagnostic.CA5392.severity = none
+dotnet_diagnostic.CA5393.severity = error
+dotnet_diagnostic.CA5394.severity = error
+dotnet_diagnostic.CA5395.severity = error
+dotnet_diagnostic.CA5396.severity = error
+dotnet_diagnostic.CA5397.severity = error
+dotnet_diagnostic.CA5398.severity = error
+dotnet_diagnostic.CA5399.severity = error
+dotnet_diagnostic.CA5400.severity = error
+dotnet_diagnostic.CA5401.severity = error
+dotnet_diagnostic.CA5402.severity = error
+dotnet_diagnostic.CA5403.severity = error
+dotnet_diagnostic.CA5404.severity = error
+dotnet_diagnostic.CA5405.severity = error
+
+dotnet_diagnostic.IDE0001.severity = error
+dotnet_diagnostic.IDE0002.severity = error
+dotnet_diagnostic.IDE0003.severity = error
+dotnet_diagnostic.IDE0004.severity = error
+dotnet_diagnostic.IDE0005.severity = error
+dotnet_diagnostic.IDE0007.severity = error
+dotnet_diagnostic.IDE0008.severity = error
+dotnet_diagnostic.IDE0009.severity = error
+dotnet_diagnostic.IDE0010.severity = silent
+dotnet_diagnostic.IDE0011.severity = error
+dotnet_diagnostic.IDE0016.severity = error
+dotnet_diagnostic.IDE0017.severity = error
+dotnet_diagnostic.IDE0018.severity = error
+dotnet_diagnostic.IDE0019.severity = error
+dotnet_diagnostic.IDE0020.severity = error
+dotnet_diagnostic.IDE0021.severity = error
+dotnet_diagnostic.IDE0022.severity = error
+dotnet_diagnostic.IDE0023.severity = error
+dotnet_diagnostic.IDE0024.severity = error
+dotnet_diagnostic.IDE0025.severity = error
+dotnet_diagnostic.IDE0026.severity = error
+dotnet_diagnostic.IDE0027.severity = error
+dotnet_diagnostic.IDE0028.severity = error
+dotnet_diagnostic.IDE0029.severity = error
+dotnet_diagnostic.IDE0030.severity = error
+dotnet_diagnostic.IDE0031.severity = error
+dotnet_diagnostic.IDE0032.severity = error
+dotnet_diagnostic.IDE0033.severity = error
+dotnet_diagnostic.IDE0034.severity = error
+dotnet_diagnostic.IDE0035.severity = error
+dotnet_diagnostic.IDE0036.severity = error
+dotnet_diagnostic.IDE0037.severity = error
+dotnet_diagnostic.IDE0038.severity = error
+dotnet_diagnostic.IDE0039.severity = error
+dotnet_diagnostic.IDE0040.severity = error
+dotnet_diagnostic.IDE0041.severity = error
+dotnet_diagnostic.IDE0042.severity = error
+dotnet_diagnostic.IDE0044.severity = error
+dotnet_diagnostic.IDE0045.severity = error
+dotnet_diagnostic.IDE0046.severity = error
+dotnet_diagnostic.IDE0047.severity = error
+dotnet_diagnostic.IDE0048.severity = error
+dotnet_diagnostic.IDE0049.severity = error
+dotnet_diagnostic.IDE0051.severity = error
+dotnet_diagnostic.IDE0052.severity = error
+dotnet_diagnostic.IDE0053.severity = error
+dotnet_diagnostic.IDE0054.severity = error
+dotnet_diagnostic.IDE0055.severity = error
+dotnet_diagnostic.IDE0056.severity = error
+dotnet_diagnostic.IDE0057.severity = error
+dotnet_diagnostic.IDE0058.severity = error
+dotnet_diagnostic.IDE0059.severity = error
+dotnet_diagnostic.IDE0060.severity = error
+dotnet_diagnostic.IDE0061.severity = error
+dotnet_diagnostic.IDE0062.severity = error
+dotnet_diagnostic.IDE0063.severity = error
+dotnet_diagnostic.IDE0064.severity = error
+dotnet_diagnostic.IDE0065.severity = error
+dotnet_diagnostic.IDE0066.severity = error
+dotnet_diagnostic.IDE0070.severity = error
+dotnet_diagnostic.IDE0071.severity = error
+dotnet_diagnostic.IDE0072.severity = silent
+dotnet_diagnostic.IDE0073.severity = none
+dotnet_diagnostic.IDE0074.severity = error
+dotnet_diagnostic.IDE0075.severity = error
+dotnet_diagnostic.IDE0076.severity = error
+dotnet_diagnostic.IDE0077.severity = error
+dotnet_diagnostic.IDE0078.severity = error
+dotnet_diagnostic.IDE0079.severity = error
+dotnet_diagnostic.IDE0080.severity = error
+dotnet_diagnostic.IDE0082.severity = error
+dotnet_diagnostic.IDE0083.severity = error
+dotnet_diagnostic.IDE0090.severity = error
+dotnet_diagnostic.IDE0100.severity = error
+dotnet_diagnostic.IDE0110.severity = error
+dotnet_diagnostic.IDE0120.severity = error
+dotnet_diagnostic.IDE0130.severity = error
+dotnet_diagnostic.IDE0150.severity = error
+dotnet_diagnostic.IDE0160.severity = error
+dotnet_diagnostic.IDE0161.severity = error
+dotnet_diagnostic.IDE0170.severity = error
+dotnet_diagnostic.IDE0180.severity = error
+dotnet_diagnostic.IDE0200.severity = error
+dotnet_diagnostic.IDE0210.severity = error
+dotnet_diagnostic.IDE0211.severity = error
+dotnet_diagnostic.IDE0220.severity = error
+dotnet_diagnostic.IDE0230.severity = error
+dotnet_diagnostic.IDE0240.severity = error
+dotnet_diagnostic.IDE0241.severity = error
+dotnet_diagnostic.IDE0250.severity = error
+dotnet_diagnostic.IDE0251.severity = error
+dotnet_diagnostic.IDE0260.severity = error
+dotnet_diagnostic.IDE0270.severity = error
+dotnet_diagnostic.IDE0280.severity = error
+dotnet_diagnostic.IDE0290.severity = none
+dotnet_diagnostic.IDE0300.severity = error
+dotnet_diagnostic.IDE0301.severity = error
+dotnet_diagnostic.IDE0302.severity = error
+dotnet_diagnostic.IDE0303.severity = error
+dotnet_diagnostic.IDE0304.severity = error
+dotnet_diagnostic.IDE0305.severity = error
+dotnet_diagnostic.IDE1005.severity = error
+dotnet_diagnostic.IDE1006.severity = error
+
+dotnet_diagnostic.RS0016.severity = error
+dotnet_diagnostic.RS0017.severity = error
+dotnet_diagnostic.RS0022.severity = error
+dotnet_diagnostic.RS0024.severity = error
+dotnet_diagnostic.RS0025.severity = error
+dotnet_diagnostic.RS0026.severity = none
+dotnet_diagnostic.RS0027.severity = error
+dotnet_diagnostic.RS0036.severity = error
+dotnet_diagnostic.RS0037.severity = error
+dotnet_diagnostic.RS0041.severity = error
+dotnet_diagnostic.RS0048.severity = error
+dotnet_diagnostic.RS0050.severity = error
+dotnet_diagnostic.RS0051.severity = none
+dotnet_diagnostic.RS0052.severity = none
+dotnet_diagnostic.RS0053.severity = none
+dotnet_diagnostic.RS0054.severity = none
+dotnet_diagnostic.RS0055.severity = none
+dotnet_diagnostic.RS0056.severity = none
+dotnet_diagnostic.RS0057.severity = none
+dotnet_diagnostic.RS0058.severity = none
+dotnet_diagnostic.RS0059.severity = none
+dotnet_diagnostic.RS0060.severity = none
+dotnet_diagnostic.RS0061.severity = none
+dotnet_diagnostic.RS1001.severity = error
+dotnet_diagnostic.RS1002.severity = error
+dotnet_diagnostic.RS1003.severity = error
+dotnet_diagnostic.RS1004.severity = none
+dotnet_diagnostic.RS1005.severity = error
+dotnet_diagnostic.RS1006.severity = error
+dotnet_diagnostic.RS1007.severity = none
+dotnet_diagnostic.RS1008.severity = error
+dotnet_diagnostic.RS1009.severity = error
+dotnet_diagnostic.RS1010.severity = error
+dotnet_diagnostic.RS1011.severity = error
+dotnet_diagnostic.RS1012.severity = error
+dotnet_diagnostic.RS1013.severity = error
+dotnet_diagnostic.RS1015.severity = none
+dotnet_diagnostic.RS1016.severity = error
+dotnet_diagnostic.RS1017.severity = error
+dotnet_diagnostic.RS1018.severity = error
+dotnet_diagnostic.RS1019.severity = error
+dotnet_diagnostic.RS1020.severity = error
+dotnet_diagnostic.RS1021.severity = error
+dotnet_diagnostic.RS1022.severity = error
+dotnet_diagnostic.RS1023.severity = error
+dotnet_diagnostic.RS1024.severity = error
+dotnet_diagnostic.RS1025.severity = error
+dotnet_diagnostic.RS1026.severity = error
+dotnet_diagnostic.RS1027.severity = error
+dotnet_diagnostic.RS1028.severity = error
+dotnet_diagnostic.RS1029.severity = error
+dotnet_diagnostic.RS1030.severity = error
+dotnet_diagnostic.RS1031.severity = error
+dotnet_diagnostic.RS1032.severity = error
+dotnet_diagnostic.RS1033.severity = error
+dotnet_diagnostic.RS1034.severity = error
+dotnet_diagnostic.RS1035.severity = error
+dotnet_diagnostic.RS1036.severity = error
+dotnet_diagnostic.RS1037.severity = error
+dotnet_diagnostic.RS2000.severity = none
+dotnet_diagnostic.RS2001.severity = none
+dotnet_diagnostic.RS2002.severity = none
+dotnet_diagnostic.RS2003.severity = none
+dotnet_diagnostic.RS2004.severity = none
+dotnet_diagnostic.RS2005.severity = none
+dotnet_diagnostic.RS2006.severity = none
+dotnet_diagnostic.RS2007.severity = none
+dotnet_diagnostic.RS2008.severity = none
+
+dotnet_diagnostic.SA0001.severity = none
+dotnet_diagnostic.SA0002.severity = error
+dotnet_diagnostic.SA1000.severity = error
+dotnet_diagnostic.SA1001.severity = error
+dotnet_diagnostic.SA1002.severity = error
+dotnet_diagnostic.SA1003.severity = error
+dotnet_diagnostic.SA1004.severity = error
+dotnet_diagnostic.SA1005.severity = error
+dotnet_diagnostic.SA1006.severity = none
+dotnet_diagnostic.SA1007.severity = error
+dotnet_diagnostic.SA1008.severity = error
+dotnet_diagnostic.SA1009.severity = error
+dotnet_diagnostic.SA1010.severity = error
+dotnet_diagnostic.SA1011.severity = error
+dotnet_diagnostic.SA1012.severity = error
+dotnet_diagnostic.SA1013.severity = error
+dotnet_diagnostic.SA1014.severity = error
+dotnet_diagnostic.SA1015.severity = error
+dotnet_diagnostic.SA1016.severity = error
+dotnet_diagnostic.SA1017.severity = error
+dotnet_diagnostic.SA1018.severity = error
+dotnet_diagnostic.SA1019.severity = error
+dotnet_diagnostic.SA1020.severity = error
+dotnet_diagnostic.SA1021.severity = error
+dotnet_diagnostic.SA1022.severity = error
+dotnet_diagnostic.SA1023.severity = error
+dotnet_diagnostic.SA1024.severity = error
+dotnet_diagnostic.SA1025.severity = error
+dotnet_diagnostic.SA1026.severity = error
+dotnet_diagnostic.SA1027.severity = error
+dotnet_diagnostic.SA1028.severity = error
+dotnet_diagnostic.SA1100.severity = error
+dotnet_diagnostic.SA1101.severity = none
+dotnet_diagnostic.SA1102.severity = error
+dotnet_diagnostic.SA1103.severity = error
+dotnet_diagnostic.SA1104.severity = error
+dotnet_diagnostic.SA1105.severity = error
+dotnet_diagnostic.SA1106.severity = error
+dotnet_diagnostic.SA1107.severity = error
+dotnet_diagnostic.SA1108.severity = error
+dotnet_diagnostic.SA1110.severity = error
+dotnet_diagnostic.SA1111.severity = error
+dotnet_diagnostic.SA1112.severity = error
+dotnet_diagnostic.SA1113.severity = error
+dotnet_diagnostic.SA1114.severity = error
+dotnet_diagnostic.SA1115.severity = error
+dotnet_diagnostic.SA1116.severity = error
+dotnet_diagnostic.SA1117.severity = error
+dotnet_diagnostic.SA1118.severity = none
+dotnet_diagnostic.SA1119.severity = error
+dotnet_diagnostic.SA1120.severity = error
+dotnet_diagnostic.SA1121.severity = error
+dotnet_diagnostic.SA1122.severity = error
+dotnet_diagnostic.SA1123.severity = error
+dotnet_diagnostic.SA1124.severity = error
+dotnet_diagnostic.SA1125.severity = error
+dotnet_diagnostic.SA1127.severity = error
+dotnet_diagnostic.SA1128.severity = error
+dotnet_diagnostic.SA1129.severity = error
+dotnet_diagnostic.SA1130.severity = error
+dotnet_diagnostic.SA1131.severity = error
+dotnet_diagnostic.SA1132.severity = error
+dotnet_diagnostic.SA1133.severity = error
+dotnet_diagnostic.SA1134.severity = error
+dotnet_diagnostic.SA1135.severity = error
+dotnet_diagnostic.SA1136.severity = error
+dotnet_diagnostic.SA1137.severity = error
+dotnet_diagnostic.SA1139.severity = error
+dotnet_diagnostic.SA1141.severity = error
+dotnet_diagnostic.SA1142.severity = error
+dotnet_diagnostic.SA1200.severity = error
+dotnet_diagnostic.SA1201.severity = none
+dotnet_diagnostic.SA1202.severity = none
+dotnet_diagnostic.SA1203.severity = error
+dotnet_diagnostic.SA1204.severity = none
+dotnet_diagnostic.SA1205.severity = error
+dotnet_diagnostic.SA1206.severity = error
+dotnet_diagnostic.SA1207.severity = error
+dotnet_diagnostic.SA1208.severity = error
+dotnet_diagnostic.SA1209.severity = error
+dotnet_diagnostic.SA1210.severity = error
+dotnet_diagnostic.SA1211.severity = error
+dotnet_diagnostic.SA1212.severity = error
+dotnet_diagnostic.SA1213.severity = error
+dotnet_diagnostic.SA1214.severity = error
+dotnet_diagnostic.SA1216.severity = error
+dotnet_diagnostic.SA1217.severity = error
+dotnet_diagnostic.SA1300.severity = error
+dotnet_diagnostic.SA1301.severity = none
+dotnet_diagnostic.SA1302.severity = error
+dotnet_diagnostic.SA1303.severity = error
+dotnet_diagnostic.SA1304.severity = error
+dotnet_diagnostic.SA1305.severity = none
+dotnet_diagnostic.SA1306.severity = error
+dotnet_diagnostic.SA1307.severity = error
+dotnet_diagnostic.SA1308.severity = error
+dotnet_diagnostic.SA1309.severity = none
+dotnet_diagnostic.SA1310.severity = error
+dotnet_diagnostic.SA1311.severity = error
+dotnet_diagnostic.SA1312.severity = error
+dotnet_diagnostic.SA1313.severity = error
+dotnet_diagnostic.SA1314.severity = error
+dotnet_diagnostic.SA1316.severity = error
+dotnet_diagnostic.SA1400.severity = error
+dotnet_diagnostic.SA1401.severity = error
+dotnet_diagnostic.SA1402.severity = error
+dotnet_diagnostic.SA1403.severity = error
+dotnet_diagnostic.SA1404.severity = none
+dotnet_diagnostic.SA1405.severity = error
+dotnet_diagnostic.SA1406.severity = error
+dotnet_diagnostic.SA1407.severity = none
+dotnet_diagnostic.SA1408.severity = error
+dotnet_diagnostic.SA1410.severity = error
+dotnet_diagnostic.SA1411.severity = error
+dotnet_diagnostic.SA1412.severity = none
+dotnet_diagnostic.SA1413.severity = error
+dotnet_diagnostic.SA1414.severity = error
+dotnet_diagnostic.SA1500.severity = error
+dotnet_diagnostic.SA1501.severity = error
+dotnet_diagnostic.SA1502.severity = error
+dotnet_diagnostic.SA1503.severity = none
+dotnet_diagnostic.SA1504.severity = error
+dotnet_diagnostic.SA1505.severity = error
+dotnet_diagnostic.SA1506.severity = error
+dotnet_diagnostic.SA1507.severity = error
+dotnet_diagnostic.SA1508.severity = error
+dotnet_diagnostic.SA1509.severity = none # TODO: https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3539
+dotnet_diagnostic.SA1510.severity = error
+dotnet_diagnostic.SA1511.severity = error
+dotnet_diagnostic.SA1512.severity = none
+dotnet_diagnostic.SA1513.severity = error
+dotnet_diagnostic.SA1514.severity = error
+dotnet_diagnostic.SA1515.severity = error
+dotnet_diagnostic.SA1516.severity = error
+dotnet_diagnostic.SA1517.severity = error
+dotnet_diagnostic.SA1518.severity = error
+dotnet_diagnostic.SA1519.severity = none
+dotnet_diagnostic.SA1520.severity = none
+dotnet_diagnostic.SA1600.severity = none
+dotnet_diagnostic.SA1601.severity = none
+dotnet_diagnostic.SA1602.severity = none
+dotnet_diagnostic.SA1604.severity = error
+dotnet_diagnostic.SA1605.severity = error
+dotnet_diagnostic.SA1606.severity = error
+dotnet_diagnostic.SA1607.severity = error
+dotnet_diagnostic.SA1608.severity = error
+dotnet_diagnostic.SA1609.severity = error
+dotnet_diagnostic.SA1610.severity = error
+dotnet_diagnostic.SA1611.severity = error
+dotnet_diagnostic.SA1612.severity = error
+dotnet_diagnostic.SA1613.severity = error
+dotnet_diagnostic.SA1614.severity = error
+dotnet_diagnostic.SA1615.severity = error
+dotnet_diagnostic.SA1616.severity = error
+dotnet_diagnostic.SA1617.severity = error
+dotnet_diagnostic.SA1618.severity = error
+dotnet_diagnostic.SA1619.severity = error
+dotnet_diagnostic.SA1620.severity = error
+dotnet_diagnostic.SA1621.severity = error
+dotnet_diagnostic.SA1622.severity = error
+dotnet_diagnostic.SA1623.severity = error
+dotnet_diagnostic.SA1624.severity = error
+dotnet_diagnostic.SA1625.severity = error
+dotnet_diagnostic.SA1626.severity = error
+dotnet_diagnostic.SA1627.severity = error
+dotnet_diagnostic.SA1629.severity = error
+dotnet_diagnostic.SA1633.severity = none
+dotnet_diagnostic.SA1634.severity = none
+dotnet_diagnostic.SA1635.severity = none
+dotnet_diagnostic.SA1636.severity = none
+dotnet_diagnostic.SA1637.severity = none
+dotnet_diagnostic.SA1638.severity = none
+dotnet_diagnostic.SA1639.severity = none
+dotnet_diagnostic.SA1640.severity = none
+dotnet_diagnostic.SA1641.severity = none
+dotnet_diagnostic.SA1642.severity = error
+dotnet_diagnostic.SA1643.severity = error
+dotnet_diagnostic.SA1648.severity = error
+dotnet_diagnostic.SA1649.severity = error
+dotnet_diagnostic.SA1651.severity = error
+
+dotnet_diagnostic.SX1101.severity = error
+dotnet_diagnostic.SX1309.severity = error
+dotnet_diagnostic.SX1309S.severity = error
+
+dotnet_diagnostic.SYSLIB0001.severity = error
+dotnet_diagnostic.SYSLIB0002.severity = error
+dotnet_diagnostic.SYSLIB0003.severity = error
+dotnet_diagnostic.SYSLIB0004.severity = error
+dotnet_diagnostic.SYSLIB0005.severity = error
+dotnet_diagnostic.SYSLIB0006.severity = error
+dotnet_diagnostic.SYSLIB0007.severity = error
+dotnet_diagnostic.SYSLIB0008.severity = error
+dotnet_diagnostic.SYSLIB0009.severity = error
+dotnet_diagnostic.SYSLIB0010.severity = error
+dotnet_diagnostic.SYSLIB0011.severity = error
+dotnet_diagnostic.SYSLIB0012.severity = error
+dotnet_diagnostic.SYSLIB0013.severity = error
+dotnet_diagnostic.SYSLIB0014.severity = error
+dotnet_diagnostic.SYSLIB0015.severity = error
+dotnet_diagnostic.SYSLIB0016.severity = error
+dotnet_diagnostic.SYSLIB0017.severity = error
+dotnet_diagnostic.SYSLIB0018.severity = error
+dotnet_diagnostic.SYSLIB0019.severity = error
+dotnet_diagnostic.SYSLIB0020.severity = error
+dotnet_diagnostic.SYSLIB0021.severity = error
+dotnet_diagnostic.SYSLIB0022.severity = error
+dotnet_diagnostic.SYSLIB0023.severity = error
+dotnet_diagnostic.SYSLIB0024.severity = error
+dotnet_diagnostic.SYSLIB0025.severity = error
+dotnet_diagnostic.SYSLIB0026.severity = error
+dotnet_diagnostic.SYSLIB0027.severity = error
+dotnet_diagnostic.SYSLIB0028.severity = error
+dotnet_diagnostic.SYSLIB0029.severity = error
+dotnet_diagnostic.SYSLIB0030.severity = error
+dotnet_diagnostic.SYSLIB0031.severity = error
+dotnet_diagnostic.SYSLIB0032.severity = error
+dotnet_diagnostic.SYSLIB0033.severity = error
+dotnet_diagnostic.SYSLIB0034.severity = error
+dotnet_diagnostic.SYSLIB0035.severity = error
+dotnet_diagnostic.SYSLIB0036.severity = error
+dotnet_diagnostic.SYSLIB0037.severity = error
+dotnet_diagnostic.SYSLIB0038.severity = error
+dotnet_diagnostic.SYSLIB0039.severity = error
+dotnet_diagnostic.SYSLIB0040.severity = error
+dotnet_diagnostic.SYSLIB0041.severity = error
+dotnet_diagnostic.SYSLIB0042.severity = error
+dotnet_diagnostic.SYSLIB0043.severity = error
+dotnet_diagnostic.SYSLIB0044.severity = error
+dotnet_diagnostic.SYSLIB0045.severity = error
+dotnet_diagnostic.SYSLIB0046.severity = error
+dotnet_diagnostic.SYSLIB0047.severity = error
+dotnet_diagnostic.SYSLIB0048.severity = error
+dotnet_diagnostic.SYSLIB0049.severity = error
+dotnet_diagnostic.SYSLIB0050.severity = error
+dotnet_diagnostic.SYSLIB0051.severity = error
+dotnet_diagnostic.SYSLIB0052.severity = error
+dotnet_diagnostic.SYSLIB0053.severity = error
+dotnet_diagnostic.SYSLIB1001.severity = error
+dotnet_diagnostic.SYSLIB1002.severity = error
+dotnet_diagnostic.SYSLIB1003.severity = error
+dotnet_diagnostic.SYSLIB1005.severity = error
+dotnet_diagnostic.SYSLIB1006.severity = error
+dotnet_diagnostic.SYSLIB1007.severity = error
+dotnet_diagnostic.SYSLIB1008.severity = error
+dotnet_diagnostic.SYSLIB1009.severity = error
+dotnet_diagnostic.SYSLIB1010.severity = error
+dotnet_diagnostic.SYSLIB1011.severity = error
+dotnet_diagnostic.SYSLIB1012.severity = error
+dotnet_diagnostic.SYSLIB1013.severity = error
+dotnet_diagnostic.SYSLIB1014.severity = error
+dotnet_diagnostic.SYSLIB1015.severity = error
+dotnet_diagnostic.SYSLIB1016.severity = error
+dotnet_diagnostic.SYSLIB1017.severity = error
+dotnet_diagnostic.SYSLIB1018.severity = error
+dotnet_diagnostic.SYSLIB1019.severity = error
+dotnet_diagnostic.SYSLIB1020.severity = error
+dotnet_diagnostic.SYSLIB1021.severity = error
+dotnet_diagnostic.SYSLIB1022.severity = error
+dotnet_diagnostic.SYSLIB1023.severity = error
+dotnet_diagnostic.SYSLIB1024.severity = error
+dotnet_diagnostic.SYSLIB1025.severity = error
+dotnet_diagnostic.SYSLIB1026.severity = error
+dotnet_diagnostic.SYSLIB1030.severity = error
+dotnet_diagnostic.SYSLIB1031.severity = error
+dotnet_diagnostic.SYSLIB1032.severity = error
+dotnet_diagnostic.SYSLIB1033.severity = error
+dotnet_diagnostic.SYSLIB1034.severity = error
+dotnet_diagnostic.SYSLIB1035.severity = error
+dotnet_diagnostic.SYSLIB1036.severity = error
+dotnet_diagnostic.SYSLIB1037.severity = error
+dotnet_diagnostic.SYSLIB1038.severity = error
+dotnet_diagnostic.SYSLIB1039.severity = error
+dotnet_diagnostic.SYSLIB1040.severity = error
+dotnet_diagnostic.SYSLIB1041.severity = error
+dotnet_diagnostic.SYSLIB1042.severity = error
+dotnet_diagnostic.SYSLIB1043.severity = error
+dotnet_diagnostic.SYSLIB1044.severity = error
+dotnet_diagnostic.SYSLIB1045.severity = error
+dotnet_diagnostic.SYSLIB1050.severity = error
+dotnet_diagnostic.SYSLIB1051.severity = error
+dotnet_diagnostic.SYSLIB1052.severity = error
+dotnet_diagnostic.SYSLIB1053.severity = error
+dotnet_diagnostic.SYSLIB1054.severity = error
+dotnet_diagnostic.SYSLIB1055.severity = error
+dotnet_diagnostic.SYSLIB1056.severity = error
+dotnet_diagnostic.SYSLIB1057.severity = error
+dotnet_diagnostic.SYSLIB1058.severity = error
+dotnet_diagnostic.SYSLIB1059.severity = error
+dotnet_diagnostic.SYSLIB1060.severity = error
+dotnet_diagnostic.SYSLIB1061.severity = error
+dotnet_diagnostic.SYSLIB1062.severity = error
+dotnet_diagnostic.SYSLIB1070.severity = error
+dotnet_diagnostic.SYSLIB1071.severity = error
+dotnet_diagnostic.SYSLIB1072.severity = error
+dotnet_diagnostic.SYSLIB1073.severity = error
+dotnet_diagnostic.SYSLIB1074.severity = error
+dotnet_diagnostic.SYSLIB1075.severity = error
+dotnet_diagnostic.SYSLIB1090.severity = error
+dotnet_diagnostic.SYSLIB1091.severity = error
+dotnet_diagnostic.SYSLIB1092.severity = error
+dotnet_diagnostic.SYSLIB1093.severity = error
+dotnet_diagnostic.SYSLIB1094.severity = error
+dotnet_diagnostic.SYSLIB1095.severity = error
+dotnet_diagnostic.SYSLIB1096.severity = error
+dotnet_diagnostic.SYSLIB1097.severity = error
+dotnet_diagnostic.SYSLIB1098.severity = error
+dotnet_diagnostic.SYSLIB1099.severity = error
+dotnet_diagnostic.SYSLIB1100.severity = error
+dotnet_diagnostic.SYSLIB1101.severity = error
+dotnet_diagnostic.SYSLIB1102.severity = error
+dotnet_diagnostic.SYSLIB1103.severity = error
+dotnet_diagnostic.SYSLIB1104.severity = error
+dotnet_diagnostic.SYSLIB1201.severity = error
+dotnet_diagnostic.SYSLIB1202.severity = error
+dotnet_diagnostic.SYSLIB1203.severity = error
+dotnet_diagnostic.SYSLIB1204.severity = error
+dotnet_diagnostic.SYSLIB1205.severity = error
+dotnet_diagnostic.SYSLIB1206.severity = error
+dotnet_diagnostic.SYSLIB1207.severity = error
+dotnet_diagnostic.SYSLIB1208.severity = error
+dotnet_diagnostic.SYSLIB1209.severity = error
+dotnet_diagnostic.SYSLIB1210.severity = error
+dotnet_diagnostic.SYSLIB1211.severity = error
+dotnet_diagnostic.SYSLIB1212.severity = error
+dotnet_diagnostic.SYSLIB1213.severity = error
+dotnet_diagnostic.SYSLIB1214.severity = error
+dotnet_diagnostic.SYSLIB1215.severity = error
+dotnet_diagnostic.SYSLIB1216.severity = error
+dotnet_diagnostic.SYSLIB1220.severity = error
+dotnet_diagnostic.SYSLIB1221.severity = error
+dotnet_diagnostic.SYSLIB1222.severity = error
+dotnet_diagnostic.SYSLIB1223.severity = error
+dotnet_diagnostic.SYSLIB1224.severity = error
+
+dotnet_diagnostic.VSTHRD001.severity = none
+dotnet_diagnostic.VSTHRD002.severity = none
+dotnet_diagnostic.VSTHRD003.severity = none
+dotnet_diagnostic.VSTHRD004.severity = none
+dotnet_diagnostic.VSTHRD010.severity = none
+dotnet_diagnostic.VSTHRD011.severity = none
+dotnet_diagnostic.VSTHRD012.severity = none
+dotnet_diagnostic.VSTHRD100.severity = error
+dotnet_diagnostic.VSTHRD101.severity = error
+dotnet_diagnostic.VSTHRD102.severity = error
+dotnet_diagnostic.VSTHRD103.severity = none
+dotnet_diagnostic.VSTHRD104.severity = none
+dotnet_diagnostic.VSTHRD105.severity = none
+dotnet_diagnostic.VSTHRD106.severity = none
+dotnet_diagnostic.VSTHRD107.severity = error
+dotnet_diagnostic.VSTHRD108.severity = none
+dotnet_diagnostic.VSTHRD109.severity = none
+dotnet_diagnostic.VSTHRD110.severity = none
+dotnet_diagnostic.VSTHRD111.severity = none
+dotnet_diagnostic.VSTHRD112.severity = none
+dotnet_diagnostic.VSTHRD113.severity = none
+dotnet_diagnostic.VSTHRD114.severity = error
+dotnet_diagnostic.VSTHRD200.severity = error
+
+dotnet_diagnostic.xUnit1000.severity = error
+dotnet_diagnostic.xUnit1001.severity = error
+dotnet_diagnostic.xUnit1002.severity = error
+dotnet_diagnostic.xUnit1003.severity = error
+dotnet_diagnostic.xUnit1004.severity = none
+dotnet_diagnostic.xUnit1005.severity = error
+dotnet_diagnostic.xUnit1006.severity = error
+dotnet_diagnostic.xUnit1007.severity = error
+dotnet_diagnostic.xUnit1008.severity = error
+dotnet_diagnostic.xUnit1009.severity = error
+dotnet_diagnostic.xUnit1010.severity = error
+dotnet_diagnostic.xUnit1011.severity = error
+dotnet_diagnostic.xUnit1012.severity = error
+dotnet_diagnostic.xUnit1013.severity = error
+dotnet_diagnostic.xUnit1014.severity = error
+dotnet_diagnostic.xUnit1015.severity = error
+dotnet_diagnostic.xUnit1016.severity = error
+dotnet_diagnostic.xUnit1017.severity = error
+dotnet_diagnostic.xUnit1018.severity = error
+dotnet_diagnostic.xUnit1019.severity = error
+dotnet_diagnostic.xUnit1020.severity = error
+dotnet_diagnostic.xUnit1021.severity = error
+dotnet_diagnostic.xUnit1022.severity = error
+dotnet_diagnostic.xUnit1023.severity = error
+dotnet_diagnostic.xUnit1024.severity = error
+dotnet_diagnostic.xUnit1025.severity = error
+dotnet_diagnostic.xUnit1026.severity = error
+dotnet_diagnostic.xUnit1027.severity = error
+dotnet_diagnostic.xUnit1033.severity = error
+dotnet_diagnostic.xUnit2000.severity = error
+dotnet_diagnostic.xUnit2001.severity = error
+dotnet_diagnostic.xUnit2002.severity = error
+dotnet_diagnostic.xUnit2003.severity = error
+dotnet_diagnostic.xUnit2004.severity = error
+dotnet_diagnostic.xUnit2005.severity = error
+dotnet_diagnostic.xUnit2006.severity = error
+dotnet_diagnostic.xUnit2007.severity = error
+dotnet_diagnostic.xUnit2008.severity = error
+dotnet_diagnostic.xUnit2009.severity = error
+dotnet_diagnostic.xUnit2010.severity = error
+dotnet_diagnostic.xUnit2011.severity = error
+dotnet_diagnostic.xUnit2012.severity = error
+dotnet_diagnostic.xUnit2013.severity = error
+dotnet_diagnostic.xUnit2014.severity = error
+dotnet_diagnostic.xUnit2015.severity = error
+dotnet_diagnostic.xUnit2016.severity = error
+dotnet_diagnostic.xUnit2017.severity = error
+dotnet_diagnostic.xUnit2018.severity = error
+dotnet_diagnostic.xUnit3000.severity = error
+dotnet_diagnostic.xUnit3001.severity = error
diff --git a/.markdownlint.json b/.markdownlint.json
new file mode 100644
index 0000000..a6b6600
--- /dev/null
+++ b/.markdownlint.json
@@ -0,0 +1,95 @@
+{
+ "$schema": "https://raw.githubusercontent.com/DavidAnson/markdownlint/main/schema/markdownlint-config-schema.json",
+ "default": true,
+ "MD001": true,
+ "MD003": {
+ "style": "atx"
+ },
+ "MD004": {
+ "style": "asterisk"
+ },
+ "MD005": true,
+ "MD007": {
+ "start_indented": false,
+ "start_indent": 4,
+ "indent": 4
+ },
+ "MD009": {
+ "br_spaces": 0,
+ "strict": true
+ },
+ "MD010": {
+ "spaces_per_tab": 4
+ },
+ "MD011": true,
+ "MD012": true,
+ "MD013": {
+ "code_blocks": false,
+ "headings": false,
+ "tables": false
+ },
+ "MD014": true,
+ "MD018": true,
+ "MD019": true,
+ "MD020": true,
+ "MD021": true,
+ "MD022": true,
+ "MD023": true,
+ "MD024": true,
+ "MD025": true,
+ "MD026": {
+ "punctuation": "!,.:;?"
+ },
+ "MD027": true,
+ "MD028": true,
+ "MD029": {
+ "style": "ordered"
+ },
+ "MD030": true,
+ "MD031": true,
+ "MD032": true,
+ "MD033": {
+ "allowed_elements": [
+ "div",
+ "img",
+ "p",
+ "strong"
+ ]
+ },
+ "MD034": true,
+ "MD035": {
+ "style": "--------------------------------------------------------------------------------"
+ },
+ "MD036": {
+ "punctuation": "!,.:;?"
+ },
+ "MD037": true,
+ "MD038": true,
+ "MD039": true,
+ "MD040": {
+ "language_only": true
+ },
+ "MD041": true,
+ "MD042": true,
+ "MD043": false,
+ "MD044": true,
+ "MD045": true,
+ "MD046": {
+ "style": "fenced"
+ },
+ "MD047": true,
+ "MD048": {
+ "style": "backtick"
+ },
+ "MD049": {
+ "style": "asterisk"
+ },
+ "MD050": {
+ "style": "asterisk"
+ },
+ "MD051": true,
+ "MD052": true,
+ "MD053": {
+ "ignored_definitions": []
+ }
+}
diff --git a/.netconfig b/.netconfig
new file mode 100644
index 0000000..6f483d7
--- /dev/null
+++ b/.netconfig
@@ -0,0 +1,65 @@
+[file "doc/.markdownlint-cli2.jsonc"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/doc/.markdownlint-cli2.jsonc
+ sha = 7d581ae5eedad5892855cebc673edafad664856b
+ etag = 485e4786a640cfe0b7d29c169baab04e9f2a7c24964ec56b55017bc26a1d796d
+ weak
+[file "doc/.markdownlint.json"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/doc/.markdownlint.json
+ sha = 7d581ae5eedad5892855cebc673edafad664856b
+ etag = d763492a10cc6e14ba8f8ffe3279eda7964580ed9e18bcd6c7875fe2f53f226b
+ weak
+[file ".editorconfig"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/.editorconfig
+ sha = 7d581ae5eedad5892855cebc673edafad664856b
+ etag = 8fa5a445045c6e24f51af44560a6449adf8d297f9e0d7412b39e5e39062cde54
+ weak
+[file ".gitattributes"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/.gitattributes
+ sha = e1d60d738e36f3741104a47c67156614aa5b9d8b
+ etag = 57083d3c73ff7ab2740ab17fd99d31cedcff606818190f9a415d97d27b62e7d4
+ weak
+[file ".gitbook.yaml"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/.gitbook.yaml
+ sha = 7d581ae5eedad5892855cebc673edafad664856b
+ etag = 66c2b9789da757c440568a36fefd050103c146bfd88f9eb0208961fa6e08b659
+ weak
+[file ".globalconfig"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/.globalconfig
+ sha = e8b6d2e00d7720592fe9740777eafcb219d9a613
+ etag = d9c8f0bf4802deeedff637bbff0e0164bbbc6986bb5c1c8cd4301dde2692fce4
+ weak
+[file ".markdownlint.json"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/.markdownlint.json
+ sha = 7d581ae5eedad5892855cebc673edafad664856b
+ etag = cf98ac95cf318b52e206b9003e342de9db2ecb7be062eab6edf1681b1f374b3a
+ weak
+[file ".stylecop.json"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/.stylecop.json
+ sha = 843f34128afef9feee7e200a09871d8cf46d4637
+ etag = 7e9d4601916a771495bb6c8e6ac9c2143c0aee9a1498e01f09525872fce21a52
+ weak
+[file "LICENSE-0BSD"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/LICENSE-0BSD
+ sha = 7d581ae5eedad5892855cebc673edafad664856b
+ etag = 4fe195e9c11a20688615d92035ac752eeac4ab3f3d82b20df798ea6dc1b49aab
+ weak
+[file "cake"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/cake
+ sha = 7d581ae5eedad5892855cebc673edafad664856b
+ etag = e01672adb9650fad761fd21f0e2349afaf9294d5f00825a429ae3060a2f3576f
+ weak
+[file "cake.config"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/cake.config
+ sha = 7d581ae5eedad5892855cebc673edafad664856b
+ etag = 71fbce2c699768f363332125e11b7e6335672c19932a369f7e146faf579371e9
+ weak
+[file "tasks.vs.json"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/tasks.vs.json
+ sha = d3266cef4044ccbe6e51133fcac3a77a5b42dde1
+ etag = e37280c2dccfe881742b68239db201d39758cff1f1c7472f358b7a1164a5771d
+ weak
+[file "tsconfig.json"]
+ url = https://github.com/vezel-dev/.github/blob/master/syn/tsconfig.json
+ sha = 7d581ae5eedad5892855cebc673edafad664856b
+ etag = 1592ee04962b18721bddf6a191b0b9b4737c390477fc9651e4b3cdf4bcc99bc3
+ weak
diff --git a/.stylecop.json b/.stylecop.json
new file mode 100644
index 0000000..03cb3f5
--- /dev/null
+++ b/.stylecop.json
@@ -0,0 +1,58 @@
+{
+ "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
+ "settings": {
+ "indentation": {
+ "indentationSize": 4,
+ "tabSize": 4,
+ "useTabs": false
+ },
+ "readabilityRules": {
+ "allowBuiltInTypeAliases": false
+ },
+ "orderingRules": {
+ "elementOrder": [
+ "kind",
+ "constant",
+ "static",
+ "readonly"
+ ],
+ "usingDirectivesPlacement": "outsideNamespace",
+ "systemUsingDirectivesFirst": true,
+ "blankLinesBetweenUsingGroups": "omit"
+ },
+ "namingRules": {
+ "tupleElementNameCasing": "PascalCase",
+ "includeInferredTupleElementNames": false
+ },
+ "maintainabilityRules": {
+ "topLevelTypes": [
+ "class",
+ "enum",
+ "delegate",
+ "interface",
+ "struct"
+ ]
+ },
+ "layoutRules": {
+ "allowDoWhileOnClosingBrace": false,
+ "allowConsecutiveUsings": true,
+ "newlineAtEndOfFile": "require"
+ },
+ "documentationRules": {
+ "companyName": "Vezel",
+ "copyrightText": "Copyright © {companyName} Contributors. Licensed under the Zero-Clause BSD License.",
+ "headerDecoration": "---------------------------------------------------------------------------",
+ "xmlHeader": false,
+ "fileNamingConvention": "metadata",
+ "documentationCulture": "en-US",
+ "documentExposedElements": true,
+ "documentInternalElements": false,
+ "documentPrivateElements": false,
+ "documentPrivateFields": false,
+ "documentInterfaces": false,
+ "excludeFromPunctuationCheck": [
+ "seealso"
+ ]
+ }
+ }
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..3ef07c3
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,19 @@
+{
+ "recommendations": [
+ "cake-build.cake-vscode",
+ "chdsbd.github-code-owners",
+ "codezombiech.gitignore",
+ "davidanson.vscode-markdownlint",
+ "dbaeumer.vscode-eslint",
+ "editorconfig.editorconfig",
+ "github.vscode-github-actions",
+ "github.vscode-pull-request-github",
+ "jock.svg",
+ "ms-dotnettools.csdevkit",
+ "ms-dotnettools.csharp",
+ "redhat.vscode-xml",
+ "redhat.vscode-yaml",
+ "tintoy.msbuild-project-tools",
+ "yy0931.gitconfig-lsp"
+ ]
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..c910170
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,31 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": ".NET: Attach",
+ "presentation": {
+ "group": "ton"
+ },
+ "type": "coreclr",
+ "request": "attach",
+ "suppressJITOptimizations": true,
+ "justMyCode": false,
+ "symbolOptions": {
+ "searchMicrosoftSymbolServer": true,
+ "searchNuGetOrgSymbolServer": true
+ },
+ "processId": "${command:pickProcess}"
+ },
+ {
+ "name": "VS Code: Launch Extension",
+ "presentation": {
+ "group": "ton"
+ },
+ "type": "extensionHost",
+ "request": "launch",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceFolder}/out/bin/src/vscode"
+ ]
+ }
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..2860d5d
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,10 @@
+{
+ "files.exclude": {
+ "out": true,
+ "**/*.received.*": true,
+ "**/*.verified.*": true,
+ "**/.idea": true,
+ "**/.vs": true,
+ "**/node_modules": true
+ }
+}
diff --git a/.vsconfig b/.vsconfig
new file mode 100644
index 0000000..4e6a0d4
--- /dev/null
+++ b/.vsconfig
@@ -0,0 +1,9 @@
+{
+ "$schema": "https://json.schemastore.org/vsconfig.json",
+ "version": "1.0",
+ "components": [
+ "Microsoft.VisualStudio.Workload.CoreEditor",
+ "Microsoft.VisualStudio.Workload.ManagedDesktop",
+ "Microsoft.VisualStudio.Workload.Node"
+ ]
+}
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..41c72b7
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,38 @@
+
+
+ TON
+ $(Product) is a human-friendly language for programmatic authoring and safe interchange of tree-structured data.
+ Vezel
+ $(Company) Contributors
+ Copyright © $(Authors)
+
+
+
+ true
+ latest-all
+ true
+ true
+ true
+ true
+ false
+ false
+ latest
+ enable
+ false
+ 0BSD
+ https://docs.vezel.dev/ton
+ true
+ false
+ https://github.com/vezel-dev/ton.git
+ net8.0
+ true
+
+
+
+ true
+ $(MSBuildThisFileDirectory)out
+ $([MSBuild]::MakeRelative('$(MSBuildThisFileDirectory)', '$(MSBuildProjectDirectory)'))
+ pub
+ pkg/dotnet
+
+
diff --git a/Directory.Build.rsp b/Directory.Build.rsp
new file mode 100644
index 0000000..becb644
--- /dev/null
+++ b/Directory.Build.rsp
@@ -0,0 +1,3 @@
+-err
+-nr:false
+-tl
diff --git a/Directory.Build.targets b/Directory.Build.targets
new file mode 100644
index 0000000..9ff839b
--- /dev/null
+++ b/Directory.Build.targets
@@ -0,0 +1,71 @@
+
+
+ $(RootNamespace)
+
+
+
+ trx
+ $(ArtifactsPath)/trx/$(ArtifactsProjectName)/$(ArtifactsPivots)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(MSBuildThisFileDirectory)ton.ico
+ true
+ ton.png
+ PACKAGE.md
+
+
+
+
+
+
+
+
+
+
+
+ https://github.com/vezel-dev/ton/releases/tag/v$(Version)
+
+
+
+
+
+
+ <_CachedFiles Include="$(NuGetPackageRoot)/$(PackageId.ToLowerInvariant())/**" />
+
+
+
+
+
diff --git a/Directory.Packages.props b/Directory.Packages.props
new file mode 100644
index 0000000..bdd0b17
--- /dev/null
+++ b/Directory.Packages.props
@@ -0,0 +1,53 @@
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LICENSE-0BSD b/LICENSE-0BSD
new file mode 100644
index 0000000..e850493
--- /dev/null
+++ b/LICENSE-0BSD
@@ -0,0 +1,12 @@
+BSD Zero Clause License (0BSD)
+
+Permission to use, copy, modify, and/or distribute this software for any purpose
+with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
diff --git a/PACKAGE.md b/PACKAGE.md
new file mode 100644
index 0000000..24c0f47
--- /dev/null
+++ b/PACKAGE.md
@@ -0,0 +1,39 @@
+# TON
+
+**TON** (Tree Object Notation) is a modern data language featuring two dialects:
+One for programmatic generation of data, and a static subset for safe data
+interchange.
+
+**TON** is designed to be a pleasant and compact replacement for both
+[XML](https://www.w3.org/TR/xml) and [JSON](https://www.json.org), combining the
+best qualities of each, while allowing advanced users to programmatically
+generate large data sets using the full language dialect. At its simplest,
+**TON** can be used as a static data format just like XML or JSON, while at its
+full potential, it can be used to maintain large and complex textual databases
+at a level of maintainability that such data formats simply cannot achieve.
+
+The original motivation for the creation of **TON** was the maintenance of the
+sorts of large data sheets that video games often use to describe things like
+areas, items, quests, characters, skills, etc. The code dialect should be
+well-suited to any similar use case. On the other hand, the data dialect can
+is well-suited as a safe and more compact replacement for XML and JSON, e.g. in
+networked APIs.
+
+**TON** is an open standard. This project provides both the specification and
+the reference implementation in C#.
+
+This project offers the following packages:
+
+* [ton](https://www.nuget.org/packages/ton): Provides the .NET global tool.
+* [Vezel.Ton](https://www.nuget.org/packages/Vezel.Ton): Provides the core
+ parsing, analysis, and runtime services.
+* [Vezel.Ton.Tooling](https://www.nuget.org/packages/Vezel.Ton.Tooling):
+ Provides user-facing tooling such as syntax coloring and diagnostic
+ rendering.
+* [Vezel.Ton.Service](https://www.nuget.org/packages/Vezel.Ton.Service):
+ Provides the Language Server Protocol implementation.
+* [Vezel.Ton.Runtime](https://www.nuget.org/packages/Vezel.Ton.Runtime):
+ Provides the interpreter and just-in-time compiler.
+
+For more information, please visit the
+[project home page](https://docs.vezel.dev/ton).
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..eacc6fe
--- /dev/null
+++ b/README.md
@@ -0,0 +1,98 @@
+# TON
+
+
+
![TON](ton.svg)
+
+
+
+
+ A human-friendly language for programmatic authoring and safe
+ interchange of tree-structured data.
+
+
+
+
+
+[![License](https://img.shields.io/github/license/vezel-dev/ton?color=brown)](LICENSE-0BSD)
+[![Commits](https://img.shields.io/github/commit-activity/m/vezel-dev/ton/master?label=commits&color=slateblue)](https://github.com/vezel-dev/ton/commits/master)
+[![Build](https://img.shields.io/github/actions/workflow/status/vezel-dev/ton/build.yml?branch=master)](https://github.com/vezel-dev/ton/actions/workflows/build.yml)
+[![Discussions](https://img.shields.io/github/discussions/vezel-dev/ton?color=teal)](https://github.com/vezel-dev/ton/discussions)
+[![Discord](https://img.shields.io/discord/960716713136095232?color=peru&label=discord)](https://discord.gg/uD8maMVVFX)
+
+
+
+--------------------------------------------------------------------------------
+
+**TON** (Tree Object Notation) is a modern data language featuring two dialects:
+One for programmatic generation of data, and a static subset for safe data
+interchange.
+
+**TON** is designed to be a pleasant and compact replacement for both
+[XML](https://www.w3.org/TR/xml) and [JSON](https://www.json.org), combining the
+best qualities of each, while allowing advanced users to programmatically
+generate large data sets using the full language dialect. At its simplest,
+**TON** can be used as a static data format just like XML or JSON, while at its
+full potential, it can be used to maintain large and complex textual databases
+at a level of maintainability that such data formats simply cannot achieve.
+
+The original motivation for the creation of **TON** was the maintenance of the
+sorts of large data sheets that video games often use to describe things like
+areas, items, quests, characters, skills, etc. The code dialect should be
+well-suited to any similar use case. On the other hand, the data dialect can
+is well-suited as a safe and more compact replacement for XML and JSON, e.g. in
+networked APIs.
+
+**TON** is an open standard. This project provides both the specification and
+the reference implementation in C#.
+
+## Usage
+
+This project offers the following packages:
+
+| Package | Description | Downloads |
+| -: | - | :- |
+| [![ton][driver-img]][ton-pkg] | Provides the .NET global tool. | ![Downloads][ton-dls] |
+| [![Vezel.Ton][core-img]][core-pkg] | Provides the core parsing, analysis, and runtime services. | ![Downloads][core-dls] |
+| [![Vezel.Ton.Tooling][tooling-img]][tooling-pkg] | Provides user-facing tooling such as syntax coloring and diagnostic rendering. | ![Downloads][tooling-dls] |
+| [![Vezel.Ton.Service][service-img]][service-pkg] | Provides the Language Server Protocol implementation. | ![Downloads][service-dls] |
+
+[driver-pkg]: https://www.nuget.org/packages/ton
+[core-pkg]: https://www.nuget.org/packages/Vezel.Ton
+[tooling-pkg]: https://www.nuget.org/packages/Vezel.Ton.Tooling
+[service-pkg]: https://www.nuget.org/packages/Vezel.Ton.Service
+
+[driver-img]: https://img.shields.io/nuget/v/ton?label=ton
+[core-img]: https://img.shields.io/nuget/v/Vezel.Ton?label=Vezel.Ton
+[tooling-img]: https://img.shields.io/nuget/v/Vezel.Ton.Tooling?label=Vezel.Ton.Tooling
+[service-img]: https://img.shields.io/nuget/v/Vezel.Ton.Service?label=Vezel.Ton.Service
+
+[driver-dls]: https://img.shields.io/nuget/dt/ton?label=
+[core-dls]: https://img.shields.io/nuget/dt/Vezel.Ton?label=
+[tooling-dls]: https://img.shields.io/nuget/dt/Vezel.Ton.Tooling?label=
+[service-dls]: https://img.shields.io/nuget/dt/Vezel.Ton.Service?label=
+
+To install a tool package in a project, run `dotnet tool install `. To
+install it globally, also pass `-g`.
+
+To install a library package, run `dotnet add package `.
+
+For more information, please visit the
+[project home page](https://docs.vezel.dev/ton).
+
+## Building
+
+You will need the .NET SDK and Node.js installed. Simply run `./cake`
+(a [Bash](https://www.gnu.org/software/bash) script) to build artifacts and run
+tests. You can also run `./cake pack` to avoid running tests, or `./cake test`
+to just build and run tests.
+
+These commands will use the `Debug` configuration by default, which is suitable
+for development and debugging. Pass `-c Release` instead to get an optimized
+build.
+
+## License
+
+This project is licensed under the terms found in
+[`LICENSE-0BSD`](LICENSE-0BSD).
diff --git a/RELEASE.md b/RELEASE.md
new file mode 100644
index 0000000..33074bd
--- /dev/null
+++ b/RELEASE.md
@@ -0,0 +1,28 @@
+# Release
+
+Every major/minor release should come with its own `release/vX.Y` branch. To
+create this branch, run `dotnet nbgv prepare-release` from the `master` branch.
+Pass `--versionIncrement major` if the version being developed after this
+release is going to involve a major version bump.
+
+Patch-level releases should be done out of the relevant major/minor branch. For
+example, both `1.0.1` and `1.0.5` should come out of `release/v1.0`. So, there
+is no need to run `dotnet nbgv prepare-release` in this case.
+
+Before tagging a release, run `./cake` in the release branch locally on all
+platforms that you have access to, and do some manual system testing. Verify
+that nothing has regressed. Also, ensure that the release branch builds and
+tests successfully on [CI](https://github.com/vezel-dev/ton/actions).
+
+Next, run `dotnet nbgv tag` from the release branch to create a release tag,
+followed by `git tag -f -m -s` to sign it, and then push it
+with `git push origin `. Again, wait for CI to build and test the tag. If
+something goes wrong on CI, you can run `git tag -d ` and
+`git push origin :` to delete the tag until you resolve the issue(s), and
+then repeat this step.
+
+Finally, to actually publish the release, go to the
+[releases page](https://github.com/vezel-dev/ton/releases) to create a release
+from the tag you pushed, ideally with some well-written release notes. Once the
+release is published, a workflow will build and publish NuGet packages from the
+tag.
diff --git a/build.cake b/build.cake
new file mode 100644
index 0000000..c8681be
--- /dev/null
+++ b/build.cake
@@ -0,0 +1,328 @@
+#addin nuget:?package=Cake.DoInDirectory&version=6.0.0
+#addin nuget:?package=Cake.GitVersioning&version=3.6.133
+#addin nuget:?package=Cake.Npm&version=2.0.0
+#addin nuget:?package=Cake.Npx&version=1.7.0
+
+#nullable enable
+
+// Arguments
+
+var target = Argument("t", "default");
+var configuration = Argument("c", "Debug");
+var filter = Argument("f", default(string));
+
+// Environment
+
+var githubToken = EnvironmentVariable("GITHUB_TOKEN");
+var nugetToken = EnvironmentVariable("NUGET_TOKEN");
+var vsceToken = EnvironmentVariable("VSCE_TOKEN");
+var ovsxToken = EnvironmentVariable("OVSX_TOKEN");
+
+// Paths
+
+var root = Context.Environment.WorkingDirectory;
+var tonProj = root.CombineWithFilePath("ton.proj");
+var doc = root.Combine("doc");
+var src = root.Combine("src");
+var srcVscode = src.Combine("vscode");
+var driverCsproj = src.Combine("driver").CombineWithFilePath("driver.csproj");
+var testsCsproj = src.Combine("tests").CombineWithFilePath("tests.csproj");
+var trimmingCsproj = src.Combine("trimming").CombineWithFilePath("trimming.csproj");
+var @out = root.Combine("out");
+var outLogDotnet = @out.Combine("log").Combine("dotnet");
+var outPkg = @out.Combine("pkg");
+var outPkgDotnet = outPkg.Combine("dotnet");
+var outPkgVscode = outPkg.Combine("vscode");
+
+// Globs
+
+var githubGlob = new GlobPattern(outPkgDotnet.Combine("debug").CombineWithFilePath("*.nupkg").FullPath);
+var nugetGlob = new GlobPattern(outPkgDotnet.Combine("release").CombineWithFilePath("*.nupkg").FullPath);
+var vscodeGlob = new GlobPattern(outPkgVscode.CombineWithFilePath("*.vsix").FullPath);
+
+// Utilities
+
+DotNetMSBuildSettings ConfigureMSBuild(string target)
+{
+ var prefix = $"{target}_{Environment.UserName}_{Environment.MachineName}_";
+ var time = DateTime.Now;
+
+ string name;
+
+ do
+ {
+ name = $"{prefix}{time:yyyy-MM-dd_HH_mm_ss}.binlog";
+ time = time.AddSeconds(1);
+ }
+ while (System.IO.File.Exists(name));
+
+ return new()
+ {
+ // TODO: https://github.com/dotnet/msbuild/issues/6756
+ NoLogo = true,
+ BinaryLogger = new()
+ {
+ Enabled = true,
+ FileName = outLogDotnet.CombineWithFilePath(name).FullPath,
+ },
+ ConsoleLoggerSettings = new()
+ {
+ NoSummary = true,
+ },
+ ArgumentCustomization = args => args.Append("-ds:false"),
+ };
+}
+
+void NpmInstall(DirectoryPath directory)
+{
+ DoInDirectory(directory, NpmInstall);
+}
+
+void RunCommand(
+ string name,
+ string[] tools,
+ Func appender,
+ Func checker)
+{
+ var code = StartProcess(
+ Context.Tools.Resolve(tools) ?? throw new CakeException($"{name}: Could not locate executable."),
+ new()
+ {
+ Arguments = appender(new()),
+ RedirectStandardOutput = true,
+ RedirectStandardError = true,
+ RedirectedStandardOutputHandler = text =>
+ {
+ Console.Out.WriteLine(text);
+
+ return text;
+ },
+ RedirectedStandardErrorHandler = text =>
+ {
+ Console.Error.WriteLine(text);
+
+ return text;
+ },
+ },
+ out var stdOut,
+ out var stdErr);
+
+ if (code != 0 && checker(string.Join(null, stdOut), string.Join(null, stdErr)))
+ throw new CakeException(code, $"{name}: Process returned an error (exit code {code}).");
+}
+
+void RunDotNet(Func appender, Func checker)
+{
+ RunCommand(".NET CLI", new[] { "dotnet", "dotnet.exe" }, appender, checker);
+}
+
+void RunVSCode(Func appender)
+{
+ RunCommand("VS Code", new[] { "code.cmd", "code" }, appender, (_, _) => true);
+}
+
+void UploadVSCode(string command, string token)
+{
+ var args = new ProcessArgumentBuilder()
+ .Append("--pre-release")
+ .Append("--skip-duplicate")
+ .AppendSwitchQuotedSecret("-p", token);
+
+ foreach (var file in GetFiles(vscodeGlob))
+ _ = args.AppendSwitchQuoted("-i", file.FullPath);
+
+ DoInDirectory(srcVscode, () => Npx($"{command} publish", args));
+}
+
+// Tasks
+
+Task("default")
+ .IsDependentOn("test")
+ .IsDependentOn("build")
+ .IsDependentOn("pack");
+
+Task("default-editor")
+ .IsDependentOn("build")
+ .IsDependentOn("pack");
+
+Task("restore-core")
+ .Does(() =>
+ DotNetRestore(
+ tonProj.FullPath,
+ new()
+ {
+ MSBuildSettings = ConfigureMSBuild("restore"),
+ }));
+
+Task("restore-vscode")
+ .Does(() => NpmInstall(srcVscode));
+
+Task("restore-doc")
+ .Does(() => NpmInstall(doc));
+
+Task("restore")
+ .IsDependentOn("restore-core")
+ .IsDependentOn("restore-vscode")
+ .IsDependentOn("restore-doc");
+
+Task("build-core")
+ .IsDependentOn("restore-core")
+ .Does(() =>
+ DotNetBuild(
+ tonProj.FullPath,
+ new()
+ {
+ MSBuildSettings = ConfigureMSBuild("build"),
+ Configuration = configuration,
+ NoRestore = true,
+ }));
+
+Task("build-trimming")
+ .IsDependentOn("build-core")
+ .Does(() =>
+ DotNetPublish(
+ trimmingCsproj.FullPath,
+ new()
+ {
+ MSBuildSettings = ConfigureMSBuild("publish"),
+ Configuration = configuration,
+ NoBuild = true,
+ }));
+
+Task("build-vscode")
+ .IsDependentOn("restore-vscode")
+ .Does(() => DoInDirectory(srcVscode, () => NpmRunScript("build")));
+
+Task("build-doc")
+ .IsDependentOn("restore-doc")
+ .Does(() => DoInDirectory(doc, () => NpmRunScript("build")));
+
+Task("build")
+ .IsDependentOn("build-trimming")
+ .IsDependentOn("build-vscode")
+ .IsDependentOn("build-doc");
+
+Task("pack-core")
+ .IsDependentOn("build-core")
+ .Does(() =>
+ DotNetPack(
+ tonProj.FullPath,
+ new()
+ {
+ MSBuildSettings = ConfigureMSBuild("pack"),
+ Configuration = configuration,
+ NoBuild = true,
+ }));
+
+Task("pack-vscode")
+ .IsDependentOn("build-vscode")
+ .Does(() => DoInDirectory(srcVscode, () => NpmRunScript("pack")));
+
+Task("pack")
+ .IsDependentOn("pack-core")
+ .IsDependentOn("pack-vscode");
+
+Task("test-core")
+ .IsDependentOn("build-core")
+ .Does(() =>
+ DotNetTest(
+ testsCsproj.FullPath,
+ new()
+ {
+ MSBuildSettings = ConfigureMSBuild("test"),
+ Configuration = configuration,
+ NoBuild = true,
+ }));
+
+Task("test")
+ .IsDependentOn("test-core");
+
+Task("install-core")
+ .IsDependentOn("pack-core")
+ .Does(() =>
+ RunDotNet(
+ args =>
+ args
+ .Append("tool")
+ .Append("update")
+ .Append("ton")
+ .Append("--prerelease")
+ .Append("-g"),
+ (_, _) => true));
+
+Task("install-vscode")
+ .IsDependentOn("pack-vscode")
+ .Does(() =>
+ {
+ var version = GitVersioningGetVersion(root.FullPath);
+
+ RunVSCode(
+ args => args.AppendSwitchQuoted(
+ "--install-extension",
+ outPkgVscode.CombineWithFilePath($"ton-{version.NpmPackageVersion}.vsix").FullPath));
+ });
+
+Task("install")
+ .IsDependentOn("install-core")
+ .IsDependentOn("install-vscode");
+
+Task("uninstall-core")
+ .Does(() =>
+ RunDotNet(
+ args =>
+ args
+ .Append("tool")
+ .Append("uninstall")
+ .Append("ton")
+ .Append("-g"),
+ (_, stdErr) => !stdErr.StartsWith("A tool with the package Id 'ton' could not be found.")));
+
+Task("uninstall-vscode")
+ .Does(() => RunVSCode(args => args.AppendSwitchQuoted("--uninstall-extension", "vezel.ton")));
+
+Task("uninstall")
+ .IsDependentOn("uninstall-core")
+ .IsDependentOn("uninstall-vscode");
+
+Task("upload-core-github")
+ .WithCriteria(BuildSystem.GitHubActions.Environment.Workflow.Ref == "refs/heads/master")
+ .WithCriteria(configuration == "Debug")
+ .IsDependentOn("pack-core")
+ .Does(() =>
+ DotNetTool(
+ null,
+ "gpr push",
+ new ProcessArgumentBuilder()
+ .AppendQuoted(githubGlob)
+ .AppendSwitchQuotedSecret("-k", githubToken)));
+
+Task("upload-core-nuget")
+ .WithCriteria(BuildSystem.GitHubActions.Environment.Workflow.Ref.StartsWith("refs/tags/v"))
+ .WithCriteria(configuration == "Release")
+ .IsDependentOn("pack-core")
+ .Does(() =>
+ {
+ foreach (var pkg in GetFiles(nugetGlob))
+ DotNetNuGetPush(
+ pkg,
+ new()
+ {
+ Source = "https://api.nuget.org/v3/index.json",
+ ApiKey = nugetToken,
+ SkipDuplicate = true,
+ });
+ });
+
+Task("upload-vscode-vsce")
+ .WithCriteria(BuildSystem.GitHubActions.Environment.Workflow.Ref.StartsWith("refs/tags/v"))
+ .WithCriteria(configuration == "Release")
+ .IsDependentOn("pack-vscode")
+ .Does(() => UploadVSCode("vsce", vsceToken));
+
+Task("upload-vscode-ovsx")
+ .WithCriteria(BuildSystem.GitHubActions.Environment.Workflow.Ref.StartsWith("refs/tags/v"))
+ .WithCriteria(configuration == "Release")
+ .IsDependentOn("pack-vscode")
+ .Does(() => UploadVSCode("ovsx", ovsxToken));
+
+RunTarget(target);
diff --git a/cake b/cake
new file mode 100755
index 0000000..0c7a7fc
--- /dev/null
+++ b/cake
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+set -eou pipefail
+
+cd -- "$(dirname -- "$(readlink -e -- "${BASH_SOURCE[0]}")")"
+
+dotnet tool restore
+dotnet cake build.cake -t "${1:-default}" "${@:2}"
diff --git a/cake.config b/cake.config
new file mode 100644
index 0000000..db9a181
--- /dev/null
+++ b/cake.config
@@ -0,0 +1,8 @@
+[Paths]
+Addins=out/bld/addins
+Cache=out/bld/cache
+Tools=out/bld/tools
+
+[Settings]
+SkipVerification=true
+EnableScriptCache=true
diff --git a/doc/.markdownlint-cli2.jsonc b/doc/.markdownlint-cli2.jsonc
new file mode 100644
index 0000000..caf9f0a
--- /dev/null
+++ b/doc/.markdownlint-cli2.jsonc
@@ -0,0 +1,8 @@
+{
+ "globs": [
+ "**/*.md"
+ ],
+ "ignores": [
+ "node_modules"
+ ]
+}
diff --git a/doc/.markdownlint.json b/doc/.markdownlint.json
new file mode 100644
index 0000000..50f3fd6
--- /dev/null
+++ b/doc/.markdownlint.json
@@ -0,0 +1,7 @@
+{
+ "$schema": "https://raw.githubusercontent.com/DavidAnson/markdownlint/main/schema/markdownlint-config-schema.json",
+ "extends": "../.markdownlint.json",
+ "MD033": {
+ "allowed_elements": []
+ }
+}
diff --git a/doc/.npmrc b/doc/.npmrc
new file mode 100644
index 0000000..d20c2fe
--- /dev/null
+++ b/doc/.npmrc
@@ -0,0 +1,6 @@
+audit = false
+engine-strict = true
+fund = false
+logs-dir = ../out/log/node/doc
+logs-max = 9007199254740991
+save-exact = true
diff --git a/doc/index.md b/doc/index.md
new file mode 100644
index 0000000..3c46f48
--- /dev/null
+++ b/doc/index.md
@@ -0,0 +1,23 @@
+# Home
+
+**TON** (Tree Object Notation) is a modern data language featuring two dialects:
+One for programmatic generation of data, and a static subset for safe data
+interchange.
+
+**TON** is designed to be a pleasant and compact replacement for both
+[XML](https://www.w3.org/TR/xml) and [JSON](https://www.json.org), combining the
+best qualities of each, while allowing advanced users to programmatically
+generate large data sets using the full language dialect. At its simplest,
+**TON** can be used as a static data format just like XML or JSON, while at its
+full potential, it can be used to maintain large and complex textual databases
+at a level of maintainability that such data formats simply cannot achieve.
+
+The original motivation for the creation of **TON** was the maintenance of the
+sorts of large data sheets that video games often use to describe things like
+areas, items, quests, characters, skills, etc. The code dialect should be
+well-suited to any similar use case. On the other hand, the data dialect can
+is well-suited as a safe and more compact replacement for XML and JSON, e.g. in
+networked APIs.
+
+**TON** is an open standard. This project provides both the specification and
+the reference implementation in C#.
diff --git a/doc/installation.md b/doc/installation.md
new file mode 100644
index 0000000..bca2d71
--- /dev/null
+++ b/doc/installation.md
@@ -0,0 +1,15 @@
+# Installation
+
+TON can be installed as a
+[.NET tool](https://learn.microsoft.com/en-us/dotnet/core/tools/global-tools) in
+two ways:
+
+* To install TON globally, run `dotnet tool install ton -g`. This will allow you
+ to run the `ton` CLI driver anywhere, assuming you have
+ [set up your `PATH` appropriately](https://learn.microsoft.com/en-us/dotnet/core/tools/global-tools#install-a-global-tool).
+* To install TON locally in a .NET-based project with a
+ [tool manifest](https://learn.microsoft.com/en-us/dotnet/core/tools/local-tools-how-to-use#create-a-manifest-file),
+ omit the `-g` option. This will require you to run `dotnet ton` from the
+ project directory.
+
+
diff --git a/doc/package-lock.json b/doc/package-lock.json
new file mode 100644
index 0000000..59c9237
--- /dev/null
+++ b/doc/package-lock.json
@@ -0,0 +1,457 @@
+{
+ "name": "doc",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "devDependencies": {
+ "markdownlint-cli2": "0.12.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz",
+ "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
+ "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globby": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz",
+ "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==",
+ "dev": true,
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^1.0.0",
+ "fast-glob": "^3.3.2",
+ "ignore": "^5.2.4",
+ "path-type": "^5.0.0",
+ "slash": "^5.1.0",
+ "unicorn-magic": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
+ "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+ "dev": true
+ },
+ "node_modules/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "dev": true,
+ "dependencies": {
+ "uc.micro": "^2.0.0"
+ }
+ },
+ "node_modules/markdown-it": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.0.0.tgz",
+ "integrity": "sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.0.0"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.mjs"
+ }
+ },
+ "node_modules/markdownlint": {
+ "version": "0.33.0",
+ "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.33.0.tgz",
+ "integrity": "sha512-4lbtT14A3m0LPX1WS/3d1m7Blg+ZwiLq36WvjQqFGsX3Gik99NV+VXp/PW3n+Q62xyPdbvGOCfjPqjW+/SKMig==",
+ "dev": true,
+ "dependencies": {
+ "markdown-it": "14.0.0",
+ "markdownlint-micromark": "0.1.8"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/DavidAnson"
+ }
+ },
+ "node_modules/markdownlint-cli2": {
+ "version": "0.12.1",
+ "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.12.1.tgz",
+ "integrity": "sha512-RcK+l5FjJEyrU3REhrThiEUXNK89dLYNJCYbvOUKypxqIGfkcgpz8g08EKqhrmUbYfYoLC5nEYQy53NhJSEtfQ==",
+ "dev": true,
+ "dependencies": {
+ "globby": "14.0.0",
+ "jsonc-parser": "3.2.0",
+ "markdownlint": "0.33.0",
+ "markdownlint-cli2-formatter-default": "0.0.4",
+ "micromatch": "4.0.5",
+ "yaml": "2.3.4"
+ },
+ "bin": {
+ "markdownlint-cli2": "markdownlint-cli2.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/DavidAnson"
+ }
+ },
+ "node_modules/markdownlint-cli2-formatter-default": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.4.tgz",
+ "integrity": "sha512-xm2rM0E+sWgjpPn1EesPXx5hIyrN2ddUnUwnbCsD/ONxYtw3PX6LydvdH6dciWAoFDpwzbHM1TO7uHfcMd6IYg==",
+ "dev": true,
+ "peerDependencies": {
+ "markdownlint-cli2": ">=0.0.4"
+ }
+ },
+ "node_modules/markdownlint-micromark": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.8.tgz",
+ "integrity": "sha512-1ouYkMRo9/6gou9gObuMDnvZM8jC/ly3QCFQyoSPCS2XV1ZClU0xpKbL1Ar3bWWRT1RnBZkWUEiNKrI2CwiBQA==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/DavidAnson"
+ }
+ },
+ "node_modules/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz",
+ "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/uc.micro": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.0.0.tgz",
+ "integrity": "sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==",
+ "dev": true
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+ "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
+ "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ }
+ }
+}
diff --git a/doc/package.json b/doc/package.json
new file mode 100644
index 0000000..60bfc30
--- /dev/null
+++ b/doc/package.json
@@ -0,0 +1,13 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "devDependencies": {
+ "markdownlint-cli2": "0.12.1"
+ },
+ "scripts": {
+ "build": "npx markdownlint-cli2"
+ }
+}
diff --git a/doc/toc.md b/doc/toc.md
new file mode 100644
index 0000000..4b611ff
--- /dev/null
+++ b/doc/toc.md
@@ -0,0 +1,13 @@
+# Table of Contents
+
+* [Home](index.md)
+* [Installation](installation.md)
+
+## Language
+
+
+
+## Tooling
+
+* [CLI Driver](tooling/cli-driver.md)
+* [Editor Extensions](tooling/editor-extensions.md)
diff --git a/doc/tooling/cli-driver.md b/doc/tooling/cli-driver.md
new file mode 100644
index 0000000..e478b0f
--- /dev/null
+++ b/doc/tooling/cli-driver.md
@@ -0,0 +1,113 @@
+# CLI Driver
+
+```text
+ton [arguments...] [options...]
+```
+
+The ton command line tool is the driver for the reference implementation of TON.
+It supports evaluation, validation, formatting, and conversion of TON code and
+data files, and provides a language service for use in text editors.
+
+| Option | Description | Default |
+| - | - | - |
+| `--color ` | Specifies when to use colored output (`auto`, `always`, `never`). | `auto` |
+
+## ton check
+
+```text
+ton check
+```
+
+Checks that a TON file evaluates successfully.
+
+For a code file, this command runs the script to completion and discards any
+resulting data. For a data file, this command just checks whether the file
+parses successfully.
+
+## ton convert
+
+```text
+ton convert