From 6fd9e7e3e90bebf0c6ae968c731a59251f72c545 Mon Sep 17 00:00:00 2001 From: evanbacon Date: Fri, 27 Feb 2026 11:55:51 -0800 Subject: [PATCH 1/3] Replace Chevrotain parser with optimized single-pass parser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This replaces the Chevrotain-based parser with a hand-optimized single-pass parser that is 11.7x faster than the legacy xcode package and 42x faster than the previous Chevrotain implementation. Performance improvements: - Throughput: 7.5 MB/s → 315 MB/s (42x improvement) - react-native fixture (29KB): 2.47ms → 120µs (20x faster) - swift-protobuf fixture (263KB): 33ms → 800µs (41x faster) Key optimizations: - Single-pass parsing without CST intermediate representation - Pre-computed lookup tables (Uint8Array) for character classification - Char code comparisons instead of string operations - Fast path for strings without escape sequences - Direct object construction without visitor pattern overhead Additional improvements: - Better error messages with line and column numbers - Handles all edge cases that crash the legacy xcode package - Added benchmark suite (bun run bench) Co-Authored-By: Claude Opus 4.5 --- bench/parse.bench.ts | 143 ++++++++ bun.lock | 32 +- package.json | 5 +- src/json/__tests__/parser.test.ts | 136 +++++++ src/json/index.ts | 11 +- src/json/parser.ts | 495 ++++++++++++++++++++++++++ src/json/parser/chevrotain/index.d.ts | 2 - src/json/parser/chevrotain/index.js | 2 - src/json/parser/identifiers.ts | 202 ----------- src/json/parser/lexer.ts | 7 - src/json/parser/parser.ts | 100 ------ src/json/visitor/JsonVisitor.ts | 111 ------ 12 files changed, 809 insertions(+), 437 deletions(-) create mode 100644 bench/parse.bench.ts create mode 100644 src/json/__tests__/parser.test.ts create mode 100644 src/json/parser.ts delete mode 100644 src/json/parser/chevrotain/index.d.ts delete mode 100644 src/json/parser/chevrotain/index.js delete mode 100644 src/json/parser/identifiers.ts delete mode 100644 src/json/parser/lexer.ts delete mode 100644 src/json/parser/parser.ts delete mode 100644 src/json/visitor/JsonVisitor.ts diff --git a/bench/parse.bench.ts b/bench/parse.bench.ts new file mode 100644 index 0000000..d821628 --- /dev/null +++ b/bench/parse.bench.ts @@ -0,0 +1,143 @@ +import { bench, run, group, summary } from "mitata"; +import { readFileSync } from "fs"; +import { join } from "path"; + +// JSON parser +import { parse } from "../src/json"; +// High-level API +import { XcodeProject } from "../src/api/XcodeProject"; +// Legacy xcode package for comparison +import legacyXcode from "xcode"; + +const FIXTURES_DIR = join(__dirname, "../src/json/__tests__/fixtures"); + +// Test fixtures ordered by size (small to large) +const fixtures = [ + { name: "small (float)", file: "01-float.pbxproj", bytes: 264 }, + { name: "swift", file: "project-swift.pbxproj", bytes: 18593 }, + { name: "react-native-74", file: "project-rn74.pbxproj", bytes: 29812 }, + { name: "expo-app-clip", file: "009-expo-app-clip.pbxproj", bytes: 39922 }, + { name: "shopify-tophat", file: "shopify-tophat.pbxproj", bytes: 49021 }, + { name: "AFNetworking", file: "AFNetworking.pbxproj", bytes: 101506 }, + { name: "Cocoa-Application", file: "Cocoa-Application.pbxproj", bytes: 169497 }, + { name: "swift-protobuf", file: "swift-protobuf.pbxproj", bytes: 263169 }, +]; + +// Pre-load all fixture contents to measure pure parse time +const fixtureContents = new Map(); +const fixturePaths = new Map(); + +for (const fixture of fixtures) { + const filePath = join(FIXTURES_DIR, fixture.file); + fixtureContents.set(fixture.name, readFileSync(filePath, "utf8")); + fixturePaths.set(fixture.name, filePath); +} + +function formatSize(bytes: number): string { + if (bytes < 1024) return `${bytes}B`; + return `${(bytes / 1024).toFixed(0)}KB`; +} + +// Calculate total size for summary +const totalBytes = fixtures.reduce((sum, f) => sum + f.bytes, 0); + +console.log(`\n========================================`); +console.log(`@bacons/xcode Parser Benchmark`); +console.log(`========================================`); +console.log(`Total fixture data: ${(totalBytes / 1024).toFixed(1)}KB`); +console.log(`Fixtures: ${fixtures.length} files\n`); + +// Group 1: parse() across all fixtures +group("parse() - all fixtures", () => { + for (const fixture of fixtures) { + const content = fixtureContents.get(fixture.name)!; + bench(`${fixture.name} (${formatSize(fixture.bytes)})`, () => { + parse(content); + }); + } +}); + +// Group 2: Full XcodeProject load (parse + object graph inflation) +group("XcodeProject.open() - Full load", () => { + for (const fixture of fixtures) { + const filePath = fixturePaths.get(fixture.name)!; + bench(`${fixture.name} (${formatSize(fixture.bytes)})`, () => { + XcodeProject.open(filePath); + }); + } +}); + +// Group 3: Parse + build round-trip +group("Round-trip (parse + build)", () => { + const { build } = require("../src/json") as typeof import("../src/json"); + + for (const fixture of fixtures.slice(0, 5)) { + const content = fixtureContents.get(fixture.name)!; + bench(`${fixture.name} (${formatSize(fixture.bytes)})`, () => { + const json = parse(content); + build(json); + }); + } +}); + +// Group 4: Throughput test - largest file +group("Throughput (swift-protobuf 263KB)", () => { + const largestContent = fixtureContents.get("swift-protobuf")!; + const largestPath = fixturePaths.get("swift-protobuf")!; + + bench("parse() only", () => { + parse(largestContent); + }); + + bench("XcodeProject.open()", () => { + XcodeProject.open(largestPath); + }); +}); + +// Group 5: Comparison with legacy xcode package +summary(() => { + group("vs legacy xcode (react-native 29KB)", () => { + const content = fixtureContents.get("react-native-74")!; + const filePath = fixturePaths.get("react-native-74")!; + + bench("@bacons/xcode parse()", () => { + parse(content); + }); + + bench("legacy xcode parseSync()", () => { + legacyXcode.project(filePath).parseSync(); + }); + }); +}); + +// Note: Legacy xcode crashes on swift-protobuf with: +// "Expected "/*", "=", or [A-Za-z0-9_.] but "/" found" +// This demonstrates the spec-compliance advantage of @bacons/xcode + +await run({ + avg: true, + json: false, + colors: true, + min_max: true, + percentiles: true, +}); + +// Print throughput summary +console.log(`\n========================================`); +console.log(`Throughput Summary`); +console.log(`========================================`); + +const iterations = 20; +const largestContent = fixtureContents.get("swift-protobuf")!; +const largestBytes = fixtures.find(f => f.name === "swift-protobuf")!.bytes; + +const start = performance.now(); +for (let i = 0; i < iterations; i++) { + parse(largestContent); +} +const elapsed = performance.now() - start; +const throughput = (largestBytes * iterations / 1024 / 1024) / (elapsed / 1000); + +console.log(`parse() throughput: ${throughput.toFixed(2)} MB/s`); +console.log(`\nNote: Legacy xcode package crashes on swift-protobuf fixture`); +console.log(` demonstrating @bacons/xcode's spec-compliance advantage.\n`); diff --git a/bun.lock b/bun.lock index f2ee7af..45613f4 100644 --- a/bun.lock +++ b/bun.lock @@ -21,10 +21,12 @@ "@types/uuid": "^8.3.4", "jest": "^27.0.1", "jest-watch-typeahead": "^1.1.0", + "mitata": "^1.0.34", "tempy": "^0.7.1", "ts-jest": "^27.1.4", "ts-node": "^10.7.0", "typescript": "^4.6.3", + "xcode": "^3.0.1", }, }, }, @@ -253,6 +255,12 @@ "baseline-browser-mapping": ["baseline-browser-mapping@2.10.0", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA=="], + "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], + + "bplist-creator": ["bplist-creator@0.1.0", "", { "dependencies": { "stream-buffers": "2.2.x" } }, "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg=="], + + "bplist-parser": ["bplist-parser@0.3.1", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA=="], + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], @@ -299,7 +307,7 @@ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], @@ -591,6 +599,8 @@ "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "mitata": ["mitata@1.0.34", "", {}, "sha512-Mc3zrtNBKIMeHSCQ0XqRLo1vbdIx1wvFV9c8NJAiyho6AjNfMY8bVhbS12bwciUdd1t4rj8099CH3N3NFahaUA=="], + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], @@ -639,6 +649,8 @@ "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + "plist": ["plist@3.1.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ=="], + "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], @@ -683,6 +695,8 @@ "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "simple-plist": ["simple-plist@1.3.1", "", { "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", "plist": "^3.0.5" } }, "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw=="], + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], "slash": ["slash@4.0.0", "", {}, "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew=="], @@ -695,6 +709,8 @@ "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + "stream-buffers": ["stream-buffers@2.2.0", "", {}, "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg=="], + "string-length": ["string-length@5.0.1", "", { "dependencies": { "char-regex": "^2.0.0", "strip-ansi": "^7.0.1" } }, "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow=="], "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -783,6 +799,8 @@ "ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + "xcode": ["xcode@3.0.1", "", { "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" } }, "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA=="], + "xml-name-validator": ["xml-name-validator@3.0.0", "", {}, "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="], "xmlbuilder": ["xmlbuilder@14.0.0", "", {}, "sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg=="], @@ -799,8 +817,6 @@ "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], - "@babel/core/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], @@ -823,6 +839,8 @@ "@jest/reporters/string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="], + "@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "@jest/transform/jest-regex-util": ["jest-regex-util@27.5.1", "", {}, "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg=="], "@jest/transform/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], @@ -883,16 +901,24 @@ "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "plist/@xmldom/xmldom": ["@xmldom/xmldom@0.8.11", "", {}, "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw=="], + + "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "v8-to-istanbul/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "v8-to-istanbul/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "xcode/uuid": ["uuid@7.0.3", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="], + "@jest/core/jest-watcher/string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="], "@jest/reporters/string-length/char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], diff --git a/package.json b/package.json index 581b260..86e1544 100644 --- a/package.json +++ b/package.json @@ -54,15 +54,18 @@ "@types/uuid": "^8.3.4", "jest": "^27.0.1", "jest-watch-typeahead": "^1.1.0", + "mitata": "^1.0.34", "tempy": "^0.7.1", "ts-jest": "^27.1.4", "ts-node": "^10.7.0", - "typescript": "^4.6.3" + "typescript": "^4.6.3", + "xcode": "^3.0.1" }, "scripts": { "build": "tsc", "clean": "rm -rf build", "test": "jest", + "bench": "bun run bench/parse.bench.ts", "prepare": "bun run clean && bun run build" } } diff --git a/src/json/__tests__/parser.test.ts b/src/json/__tests__/parser.test.ts new file mode 100644 index 0000000..d56413c --- /dev/null +++ b/src/json/__tests__/parser.test.ts @@ -0,0 +1,136 @@ +import { parse } from ".."; +import path from "path"; +import fs from "fs"; + +describe("parse", () => { + it("should keep numeric object keys as strings", () => { + const input = `{ 123 = abc; 456 = { 789 = def; }; }`; + const result = parse(input) as any; + + expect(result).toEqual({ + "123": "abc", + "456": { + "789": "def", + }, + }); + + // Verify keys are strings, not numbers + expect(typeof Object.keys(result)[0]).toBe("string"); + expect(typeof Object.keys(result)[1]).toBe("string"); + expect(typeof Object.keys(result["456"])[0]).toBe("string"); + }); + + it("should handle quoted strings with escapes", () => { + const input = `{ key = "hello\\nworld"; }`; + const result = parse(input) as any; + expect(result.key).toBe("hello\nworld"); + }); + + it("should handle single quoted strings", () => { + const input = `{ key = 'single quoted'; }`; + const result = parse(input) as any; + expect(result.key).toBe("single quoted"); + }); + + it("should handle arrays", () => { + const input = `{ arr = (one, two, three); }`; + const result = parse(input) as any; + expect(result.arr).toEqual(["one", "two", "three"]); + }); + + it("should handle nested objects", () => { + const input = `{ outer = { inner = value; }; }`; + const result = parse(input) as any; + expect(result.outer.inner).toBe("value"); + }); + + it("should handle comments", () => { + const input = `{ + // single line comment + key = value; + /* multi + line + comment */ + key2 = value2; + }`; + const result = parse(input) as any; + expect(result.key).toBe("value"); + expect(result.key2).toBe("value2"); + }); + + it("should convert safe integers", () => { + const input = `{ num = 42; large = 123456789012345678901234; }`; + const result = parse(input) as any; + expect(result.num).toBe(42); + expect(typeof result.num).toBe("number"); + // Large numbers preserved as strings + expect(typeof result.large).toBe("string"); + }); + + it("should preserve octal literals", () => { + const input = `{ perm = 0755; }`; + const result = parse(input) as any; + expect(result.perm).toBe("0755"); + }); + + it("should handle data literals", () => { + const input = `{ data = <48454C4C4F>; }`; + const result = parse(input) as any; + expect(Buffer.isBuffer(result.data)).toBe(true); + expect(result.data.toString()).toBe("HELLO"); + }); + + describe("error messages", () => { + it("should provide line and column for missing brace", () => { + expect(() => parse(`{ key = value; `)).toThrow( + "Unexpected end of input in object at line 1, column 16" + ); + }); + + it("should provide line and column for missing semicolon", () => { + expect(() => parse(`{ key = value }`)).toThrow( + "Expected ';' at line 1, column 15" + ); + }); + + it("should provide line and column for unterminated string", () => { + expect(() => parse(`{ key = "unterminated; }`)).toThrow( + /Unterminated string at line 1/ + ); + }); + + it("should handle empty input", () => { + expect(() => parse(``)).toThrow("Expected '{' or '(' at line 1, column 1"); + }); + }); + + const fixtures = [ + "01-float.pbxproj", + "006-spm.pbxproj", + "007-xcode16.pbxproj", + "008-out-of-order-orphans.pbxproj", + "009-expo-app-clip.pbxproj", + "shopify-tophat.pbxproj", + "AFNetworking.pbxproj", + "project.pbxproj", + "project-rn74.pbxproj", + "Cocoa-Application.pbxproj", + "project-multitarget-missing-targetattributes.pbxproj", + "project-multitarget.pbxproj", + "project-rni.pbxproj", + "project-swift.pbxproj", + "swift-protobuf.pbxproj", + "watch.pbxproj", + ]; + + fixtures.forEach((fixture) => { + const filePath = path.join(__dirname, "./fixtures/", fixture); + const file = fs.readFileSync(filePath, "utf8"); + + it(`should parse fixture: ${fixture}`, () => { + const result = parse(file); + expect(result).toBeTruthy(); + expect(result.archiveVersion).toBeDefined(); + }); + }); +}); diff --git a/src/json/index.ts b/src/json/index.ts index 4435400..144e77a 100644 --- a/src/json/index.ts +++ b/src/json/index.ts @@ -1,15 +1,8 @@ -import * as parser from "./parser/parser"; +import { parse } from "./parser"; import { XcodeProject } from "./types"; -import { JsonVisitor } from "./visitor/JsonVisitor"; import { Writer } from "./writer"; -/** @returns a JSON representation of the given `pbxproj` file in string format. */ -export function parse(text: string): Partial { - const cst = parser.parse(text); - const visitor = new JsonVisitor(); - visitor.visit(cst); - return visitor.context; -} +export { parse } from "./parser"; /** @returns a string representation of the given `pbxproj` in Apple's [Old-Style Plist](http://www.opensource.apple.com/source/CF/CF-744.19/CFOldStylePList.c) `string` format. */ export function build(project: Partial): string { diff --git a/src/json/parser.ts b/src/json/parser.ts new file mode 100644 index 0000000..ae87c52 --- /dev/null +++ b/src/json/parser.ts @@ -0,0 +1,495 @@ +/** + * High-performance pbxproj parser - single pass, no CST overhead + * Optimized for speed while maintaining spec compliance + */ + +import type { XcodeProject } from "./types"; + +// NextStep Unicode mappings for Xcode compatibility +const NEXT_STEP_MAPPINGS: Record = { + 0x80: 0x00a0, 0x81: 0x00c0, 0x82: 0x00c1, 0x83: 0x00c2, 0x84: 0x00c3, 0x85: 0x00c4, + 0x86: 0x00c5, 0x87: 0x00c7, 0x88: 0x00c8, 0x89: 0x00c9, 0x8a: 0x00ca, 0x8b: 0x00cb, + 0x8c: 0x00cc, 0x8d: 0x00cd, 0x8e: 0x00ce, 0x8f: 0x00cf, 0x90: 0x00d0, 0x91: 0x00d1, + 0x92: 0x00d2, 0x93: 0x00d3, 0x94: 0x00d4, 0x95: 0x00d5, 0x96: 0x00d6, 0x97: 0x00d9, + 0x98: 0x00da, 0x99: 0x00db, 0x9a: 0x00dc, 0x9b: 0x00dd, 0x9c: 0x00de, 0x9d: 0x00b5, + 0x9e: 0x00d7, 0x9f: 0x00f7, 0xa0: 0x00a9, 0xa1: 0x00a1, 0xa2: 0x00a2, 0xa3: 0x00a3, + 0xa4: 0x2044, 0xa5: 0x00a5, 0xa6: 0x0192, 0xa7: 0x00a7, 0xa8: 0x00a4, 0xa9: 0x2019, + 0xaa: 0x201c, 0xab: 0x00ab, 0xac: 0x2039, 0xad: 0x203a, 0xae: 0xfb01, 0xaf: 0xfb02, + 0xb0: 0x00ae, 0xb1: 0x2013, 0xb2: 0x2020, 0xb3: 0x2021, 0xb4: 0x00b7, 0xb5: 0x00a6, + 0xb6: 0x00b6, 0xb7: 0x2022, 0xb8: 0x201a, 0xb9: 0x201e, 0xba: 0x201d, 0xbb: 0x00bb, + 0xbc: 0x2026, 0xbd: 0x2030, 0xbe: 0x00ac, 0xbf: 0x00bf, 0xc0: 0x00b9, 0xc1: 0x02cb, + 0xc2: 0x00b4, 0xc3: 0x02c6, 0xc4: 0x02dc, 0xc5: 0x00af, 0xc6: 0x02d8, 0xc7: 0x02d9, + 0xc8: 0x00a8, 0xc9: 0x00b2, 0xca: 0x02da, 0xcb: 0x00b8, 0xcc: 0x00b3, 0xcd: 0x02dd, + 0xce: 0x02db, 0xcf: 0x02c7, 0xd0: 0x2014, 0xd1: 0x00b1, 0xd2: 0x00bc, 0xd3: 0x00bd, + 0xd4: 0x00be, 0xd5: 0x00e0, 0xd6: 0x00e1, 0xd7: 0x00e2, 0xd8: 0x00e3, 0xd9: 0x00e4, + 0xda: 0x00e5, 0xdb: 0x00e7, 0xdc: 0x00e8, 0xdd: 0x00e9, 0xde: 0x00ea, 0xdf: 0x00eb, + 0xe0: 0x00ec, 0xe1: 0x00c6, 0xe2: 0x00ed, 0xe3: 0x00aa, 0xe4: 0x00ee, 0xe5: 0x00ef, + 0xe6: 0x00f0, 0xe7: 0x00f1, 0xe8: 0x0141, 0xe9: 0x00d8, 0xea: 0x0152, 0xeb: 0x00ba, + 0xec: 0x00f2, 0xed: 0x00f3, 0xee: 0x00f4, 0xef: 0x00f5, 0xf0: 0x00f6, 0xf1: 0x00e6, + 0xf2: 0x00f9, 0xf3: 0x00fa, 0xf4: 0x00fb, 0xf5: 0x0131, 0xf6: 0x00fc, 0xf7: 0x00fd, + 0xf8: 0x0142, 0xf9: 0x00f8, 0xfa: 0x0153, 0xfb: 0x00df, 0xfc: 0x00fe, 0xfd: 0x00ff, + 0xfe: 0xfffd, 0xff: 0xfffd +}; + +// Character codes for fast comparison +const CHAR_SPACE = 32; +const CHAR_TAB = 9; +const CHAR_NEWLINE = 10; +const CHAR_CARRIAGE = 13; +const CHAR_OPEN_BRACE = 123; // { +const CHAR_CLOSE_BRACE = 125; // } +const CHAR_OPEN_PAREN = 40; // ( +const CHAR_CLOSE_PAREN = 41; // ) +const CHAR_SEMICOLON = 59; // ; +const CHAR_COMMA = 44; // , +const CHAR_EQUALS = 61; // = +const CHAR_DOUBLE_QUOTE = 34; // " +const CHAR_SINGLE_QUOTE = 39; // ' +const CHAR_BACKSLASH = 92; // \ +const CHAR_SLASH = 47; // / +const CHAR_ASTERISK = 42; // * +const CHAR_LESS_THAN = 60; // < +const CHAR_GREATER_THAN = 62; // > + +// Escape character map using char codes +const ESCAPE_CODES: Record = { + 97: 7, // a -> \a (bell) + 98: 8, // b -> \b (backspace) + 102: 12, // f -> \f (form feed) + 110: 10, // n -> \n (newline) + 114: 13, // r -> \r (carriage return) + 116: 9, // t -> \t (tab) + 118: 11, // v -> \v (vertical tab) + 34: 34, // " -> " + 39: 39, // ' -> ' + 92: 92, // \ -> \ + 10: 10, // newline -> newline +}; + +// Pre-computed lookup tables +const IS_WHITESPACE = new Uint8Array(256); +IS_WHITESPACE[CHAR_SPACE] = 1; +IS_WHITESPACE[CHAR_TAB] = 1; +IS_WHITESPACE[CHAR_NEWLINE] = 1; +IS_WHITESPACE[CHAR_CARRIAGE] = 1; + +const IS_STRING_CHAR = new Uint8Array(256); +// a-z, A-Z, 0-9, _, $, /, :, ., - +for (let i = 65; i <= 90; i++) IS_STRING_CHAR[i] = 1; // A-Z +for (let i = 97; i <= 122; i++) IS_STRING_CHAR[i] = 1; // a-z +for (let i = 48; i <= 57; i++) IS_STRING_CHAR[i] = 1; // 0-9 +IS_STRING_CHAR[95] = 1; // _ +IS_STRING_CHAR[36] = 1; // $ +IS_STRING_CHAR[47] = 1; // / +IS_STRING_CHAR[58] = 1; // : +IS_STRING_CHAR[46] = 1; // . +IS_STRING_CHAR[45] = 1; // - + +const IS_HEX = new Uint8Array(256); +for (let i = 48; i <= 57; i++) IS_HEX[i] = 1; // 0-9 +for (let i = 65; i <= 70; i++) IS_HEX[i] = 1; // A-F +for (let i = 97; i <= 102; i++) IS_HEX[i] = 1; // a-f + +const IS_OCTAL = new Uint8Array(256); +for (let i = 48; i <= 55; i++) IS_OCTAL[i] = 1; // 0-7 + +const IS_DIGIT = new Uint8Array(256); +for (let i = 48; i <= 57; i++) IS_DIGIT[i] = 1; // 0-9 + +export class Parser { + private text: string; + private pos: number = 0; + private len: number; + + constructor(text: string) { + this.text = text; + this.len = text.length; + } + + parse(): Partial { + this.skipWhitespaceAndComments(); + const code = this.text.charCodeAt(this.pos); + if (code === CHAR_OPEN_BRACE) { + return this.parseObject(); + } else if (code === CHAR_OPEN_PAREN) { + return this.parseArray() as any; + } + throw this.error("Expected '{' or '('"); + } + + private skipWhitespaceAndComments(): void { + while (this.pos < this.len) { + const code = this.text.charCodeAt(this.pos); + + if (IS_WHITESPACE[code]) { + this.pos++; + continue; + } + + if (code === CHAR_SLASH) { + const next = this.text.charCodeAt(this.pos + 1); + if (next === CHAR_SLASH) { + // Single line comment + this.pos += 2; + while (this.pos < this.len && this.text.charCodeAt(this.pos) !== CHAR_NEWLINE) { + this.pos++; + } + continue; + } else if (next === CHAR_ASTERISK) { + // Multi-line comment + this.pos += 2; + while (this.pos < this.len - 1) { + if (this.text.charCodeAt(this.pos) === CHAR_ASTERISK && + this.text.charCodeAt(this.pos + 1) === CHAR_SLASH) { + this.pos += 2; + break; + } + this.pos++; + } + continue; + } + } + + break; + } + } + + private parseObject(): Record { + this.pos++; // skip '{' + const obj: Record = {}; + + while (true) { + this.skipWhitespaceAndComments(); + + if (this.pos >= this.len) { + throw this.error("Unexpected end of input in object"); + } + + const code = this.text.charCodeAt(this.pos); + if (code === CHAR_CLOSE_BRACE) { + this.pos++; + return obj; + } + + // Parse key + const key = this.parseIdentifierAsString(); + + this.skipWhitespaceAndComments(); + + // Expect '=' + if (this.text.charCodeAt(this.pos) !== CHAR_EQUALS) { + throw this.error("Expected '='"); + } + this.pos++; + + this.skipWhitespaceAndComments(); + + // Parse value + obj[key] = this.parseValue(); + + this.skipWhitespaceAndComments(); + + // Expect ';' + if (this.text.charCodeAt(this.pos) !== CHAR_SEMICOLON) { + throw this.error("Expected ';'"); + } + this.pos++; + } + } + + private parseArray(): any[] { + this.pos++; // skip '(' + const arr: any[] = []; + + while (true) { + this.skipWhitespaceAndComments(); + + if (this.pos >= this.len) { + throw this.error("Unexpected end of input in array"); + } + + const code = this.text.charCodeAt(this.pos); + if (code === CHAR_CLOSE_PAREN) { + this.pos++; + return arr; + } + + arr.push(this.parseValue()); + + this.skipWhitespaceAndComments(); + + // Optional comma + if (this.text.charCodeAt(this.pos) === CHAR_COMMA) { + this.pos++; + } + } + } + + private parseValue(): any { + this.skipWhitespaceAndComments(); + + const code = this.text.charCodeAt(this.pos); + + if (code === CHAR_OPEN_BRACE) { + return this.parseObject(); + } + + if (code === CHAR_OPEN_PAREN) { + return this.parseArray(); + } + + if (code === CHAR_LESS_THAN) { + return this.parseDataLiteral(); + } + + if (code === CHAR_DOUBLE_QUOTE || code === CHAR_SINGLE_QUOTE) { + return this.parseQuotedString(); + } + + return this.parseStringLiteral(); + } + + private parseIdentifierAsString(): string { + const code = this.text.charCodeAt(this.pos); + + if (code === CHAR_DOUBLE_QUOTE || code === CHAR_SINGLE_QUOTE) { + return this.parseQuotedString(); + } + + return this.parseStringLiteralRaw(); + } + + private parseStringLiteralRaw(): string { + const start = this.pos; + + while (this.pos < this.len && IS_STRING_CHAR[this.text.charCodeAt(this.pos)]) { + this.pos++; + } + + if (this.pos === start) { + throw this.error("Expected string literal"); + } + + return this.text.slice(start, this.pos); + } + + private parseStringLiteral(): string | number { + const literal = this.parseStringLiteralRaw(); + return this.parseType(literal); + } + + private parseType(literal: string): string | number { + const len = literal.length; + if (len === 0) return literal; + + const first = literal.charCodeAt(0); + + // Check if all digits + let allDigits = IS_DIGIT[first] === 1; + if (allDigits) { + for (let i = 1; i < len; i++) { + if (IS_DIGIT[literal.charCodeAt(i)] !== 1) { + allDigits = false; + break; + } + } + } + + if (allDigits) { + // Preserve octal literals with leading zeros + if (first === 48 && len > 1) { // starts with '0' + return literal; + } + + // Parse as integer if safe + const num = parseInt(literal, 10); + if (Number.isSafeInteger(num)) { + return num; + } + return literal; + } + + // Check for decimal number + let hasDot = false; + let isNumber = true; + let hasTrailingZero = false; + + for (let i = 0; i < len; i++) { + const c = literal.charCodeAt(i); + if (c === 46) { // . + if (hasDot) { + isNumber = false; + break; + } + hasDot = true; + } else if (c === 43 || c === 45) { // + or - + if (i !== 0) { + isNumber = false; + break; + } + } else if (IS_DIGIT[c] !== 1) { + isNumber = false; + break; + } + } + + if (isNumber && hasDot) { + // Check for trailing zero + if (literal.charCodeAt(len - 1) === 48) { // ends with '0' + return literal; + } + const num = parseFloat(literal); + if (!isNaN(num)) return num; + } + + return literal; + } + + private parseQuotedString(): string { + const quote = this.text.charCodeAt(this.pos); + this.pos++; // skip opening quote + + // Fast path: no escapes + const start = this.pos; + let hasEscape = false; + + while (this.pos < this.len) { + const code = this.text.charCodeAt(this.pos); + if (code === quote) { + if (!hasEscape) { + const result = this.text.slice(start, this.pos); + this.pos++; // skip closing quote + return result; + } + break; + } + if (code === CHAR_BACKSLASH) { + hasEscape = true; + this.pos += 2; // skip escape sequence + } else { + this.pos++; + } + } + + if (this.pos >= this.len) { + throw this.error("Unterminated string"); + } + + // Slow path: has escapes + const raw = this.text.slice(start, this.pos); + this.pos++; // skip closing quote + return this.unescapeString(raw); + } + + private unescapeString(input: string): string { + const result: string[] = []; + let i = 0; + const len = input.length; + + while (i < len) { + const code = input.charCodeAt(i); + + if (code === CHAR_BACKSLASH && i + 1 < len) { + const nextCode = input.charCodeAt(i + 1); + + const escaped = ESCAPE_CODES[nextCode]; + if (escaped !== undefined) { + result.push(String.fromCharCode(escaped)); + i += 2; + continue; + } + + // Unicode escape \UXXXX + if (nextCode === 85 && i + 5 < len) { // 'U' + const hex = input.slice(i + 2, i + 6); + if (this.isHexString(hex)) { + result.push(String.fromCharCode(parseInt(hex, 16))); + i += 6; + continue; + } + } + + // Octal escape + if (IS_OCTAL[nextCode]) { + let octal = ''; + let j = i + 1; + while (j < len && j < i + 4 && IS_OCTAL[input.charCodeAt(j)]) { + octal += input[j]; + j++; + } + const code = parseInt(octal, 8); + const mapped = code >= 0x80 ? (NEXT_STEP_MAPPINGS[code] || code) : code; + result.push(String.fromCharCode(mapped)); + i = j; + continue; + } + + // Unknown escape, keep both characters + result.push(input[i], input[i + 1]); + i += 2; + } else { + result.push(input[i]); + i++; + } + } + + return result.join(''); + } + + private isHexString(s: string): boolean { + if (s.length !== 4) return false; + for (let i = 0; i < 4; i++) { + if (!IS_HEX[s.charCodeAt(i)]) return false; + } + return true; + } + + private parseDataLiteral(): Buffer { + this.pos++; // skip '<' + + const hexChars: string[] = []; + + while (this.pos < this.len) { + const code = this.text.charCodeAt(this.pos); + + if (code === CHAR_GREATER_THAN) { + this.pos++; + return Buffer.from(hexChars.join(''), 'hex'); + } + + if (IS_WHITESPACE[code]) { + this.pos++; + continue; + } + + if (IS_HEX[code]) { + hexChars.push(this.text[this.pos]); + this.pos++; + continue; + } + + throw this.error("Invalid character in data literal"); + } + + throw this.error("Unterminated data literal"); + } + + private error(message: string): Error { + // Find line and column for error message + let line = 1; + let col = 1; + for (let i = 0; i < this.pos; i++) { + if (this.text.charCodeAt(i) === CHAR_NEWLINE) { + line++; + col = 1; + } else { + col++; + } + } + return new Error(`${message} at line ${line}, column ${col}`); + } +} + +export function parse(text: string): Partial { + return new Parser(text).parse(); +} diff --git a/src/json/parser/chevrotain/index.d.ts b/src/json/parser/chevrotain/index.d.ts deleted file mode 100644 index 47a6c32..0000000 --- a/src/json/parser/chevrotain/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "@chevrotain/types"; -export as namespace chevrotain; diff --git a/src/json/parser/chevrotain/index.js b/src/json/parser/chevrotain/index.js deleted file mode 100644 index 46b96c9..0000000 --- a/src/json/parser/chevrotain/index.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see chevrotain.min.js.LICENSE.txt */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("chevrotain",[],e):"object"==typeof exports?exports.chevrotain=e():t.chevrotain=e()}("undefined"!=typeof self?self:this,(function(){return(()=>{var t={9515:(t,e,r)=>{var n=r(8761)(r(7772),"DataView");t.exports=n},9612:(t,e,r)=>{var n=r(2118),o=r(6909),i=r(8138),a=r(4174),s=r(7942);function u(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e{var n=r(3945),o=r(1846),i=r(8028),a=r(2344),s=r(4769);function u(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e{var n=r(8761)(r(7772),"Map");t.exports=n},6738:(t,e,r)=>{var n=r(2411),o=r(6417),i=r(6928),a=r(9493),s=r(4150);function u(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e{var n=r(8761)(r(7772),"Promise");t.exports=n},2143:(t,e,r)=>{var n=r(8761)(r(7772),"Set");t.exports=n},5386:(t,e,r)=>{var n=r(6738),o=r(2842),i=r(2482);function a(t){var e=-1,r=null==t?0:t.length;for(this.__data__=new n;++e{var n=r(235),o=r(5243),i=r(2858),a=r(4417),s=r(8605),u=r(1418);function c(t){var e=this.__data__=new n(t);this.size=e.size}c.prototype.clear=o,c.prototype.delete=i,c.prototype.get=a,c.prototype.has=s,c.prototype.set=u,t.exports=c},857:(t,e,r)=>{var n=r(7772).Symbol;t.exports=n},9162:(t,e,r)=>{var n=r(7772).Uint8Array;t.exports=n},3215:(t,e,r)=>{var n=r(8761)(r(7772),"WeakMap");t.exports=n},9432:t=>{t.exports=function(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}},5338:t=>{t.exports=function(t,e,r,n){for(var o=-1,i=null==t?0:t.length;++o{t.exports=function(t,e){for(var r=-1,n=null==t?0:t.length;++r{t.exports=function(t,e){for(var r=-1,n=null==t?0:t.length;++r{t.exports=function(t,e){for(var r=-1,n=null==t?0:t.length,o=0,i=[];++r{var n=r(7832);t.exports=function(t,e){return!(null==t||!t.length)&&n(t,e,0)>-1}},4893:t=>{t.exports=function(t,e,r){for(var n=-1,o=null==t?0:t.length;++n{var n=r(6473),o=r(9631),i=r(6152),a=r(3226),s=r(9045),u=r(7598),c=Object.prototype.hasOwnProperty;t.exports=function(t,e){var r=i(t),l=!r&&o(t),f=!r&&!l&&a(t),p=!r&&!l&&!f&&u(t),d=r||l||f||p,h=d?n(t.length,String):[],v=h.length;for(var y in t)!e&&!c.call(t,y)||d&&("length"==y||f&&("offset"==y||"parent"==y)||p&&("buffer"==y||"byteLength"==y||"byteOffset"==y)||s(y,v))||h.push(y);return h}},343:t=>{t.exports=function(t,e){for(var r=-1,n=null==t?0:t.length,o=Array(n);++r{t.exports=function(t,e){for(var r=-1,n=e.length,o=t.length;++r{t.exports=function(t,e,r,n){var o=-1,i=null==t?0:t.length;for(n&&i&&(r=t[++o]);++o{t.exports=function(t,e){for(var r=-1,n=null==t?0:t.length;++r{t.exports=function(t){return t.split("")}},91:(t,e,r)=>{var n=r(3940),o=r(1225),i=Object.prototype.hasOwnProperty;t.exports=function(t,e,r){var a=t[e];i.call(t,e)&&o(a,r)&&(void 0!==r||e in t)||n(t,e,r)}},2218:(t,e,r)=>{var n=r(1225);t.exports=function(t,e){for(var r=t.length;r--;)if(n(t[r][0],e))return r;return-1}},2825:(t,e,r)=>{var n=r(4303);t.exports=function(t,e,r,o){return n(t,(function(t,n,i){e(o,t,r(t),i)})),o}},7993:(t,e,r)=>{var n=r(752),o=r(249);t.exports=function(t,e){return t&&n(e,o(e),t)}},5906:(t,e,r)=>{var n=r(752),o=r(8582);t.exports=function(t,e){return t&&n(e,o(e),t)}},3940:(t,e,r)=>{var n=r(3043);t.exports=function(t,e,r){"__proto__"==e&&n?n(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}},8874:(t,e,r)=>{var n=r(6571),o=r(2517),i=r(91),a=r(7993),s=r(5906),u=r(2175),c=r(1522),l=r(7680),f=r(9987),p=r(3483),d=r(6939),h=r(940),v=r(9917),y=r(8222),m=r(8725),T=r(6152),E=r(3226),_=r(4714),g=r(9259),O=r(3679),R=r(249),A=r(8582),I="[object Arguments]",x="[object Function]",N="[object Object]",P={};P[I]=P["[object Array]"]=P["[object ArrayBuffer]"]=P["[object DataView]"]=P["[object Boolean]"]=P["[object Date]"]=P["[object Float32Array]"]=P["[object Float64Array]"]=P["[object Int8Array]"]=P["[object Int16Array]"]=P["[object Int32Array]"]=P["[object Map]"]=P["[object Number]"]=P[N]=P["[object RegExp]"]=P["[object Set]"]=P["[object String]"]=P["[object Symbol]"]=P["[object Uint8Array]"]=P["[object Uint8ClampedArray]"]=P["[object Uint16Array]"]=P["[object Uint32Array]"]=!0,P["[object Error]"]=P[x]=P["[object WeakMap]"]=!1,t.exports=function t(e,r,S,b,k,L){var C,M=1&r,D=2&r,w=4&r;if(S&&(C=k?S(e,b,k,L):S(e)),void 0!==C)return C;if(!g(e))return e;var F=T(e);if(F){if(C=v(e),!M)return c(e,C)}else{var j=h(e),U=j==x||"[object GeneratorFunction]"==j;if(E(e))return u(e,M);if(j==N||j==I||U&&!k){if(C=D||U?{}:m(e),!M)return D?f(e,s(C,e)):l(e,a(C,e))}else{if(!P[j])return k?e:{};C=y(e,j,M)}}L||(L=new n);var B=L.get(e);if(B)return B;L.set(e,C),O(e)?e.forEach((function(n){C.add(t(n,r,S,n,e,L))})):_(e)&&e.forEach((function(n,o){C.set(o,t(n,r,S,o,e,L))}));var G=F?void 0:(w?D?d:p:D?A:R)(e);return o(G||e,(function(n,o){G&&(n=e[o=n]),i(C,o,t(n,r,S,o,e,L))})),C}},9413:(t,e,r)=>{var n=r(9259),o=Object.create,i=function(){function t(){}return function(e){if(!n(e))return{};if(o)return o(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();t.exports=i},5246:(t,e,r)=>{var n=r(5386),o=r(8333),i=r(4893),a=r(343),s=r(7826),u=r(9950);t.exports=function(t,e,r,c){var l=-1,f=o,p=!0,d=t.length,h=[],v=e.length;if(!d)return h;r&&(e=a(e,s(r))),c?(f=i,p=!1):e.length>=200&&(f=u,p=!1,e=new n(e));t:for(;++l{var n=r(6548),o=r(2019)(n);t.exports=o},80:(t,e,r)=>{var n=r(4303);t.exports=function(t,e){var r=!0;return n(t,(function(t,n,o){return r=!!e(t,n,o)})),r}},8043:(t,e,r)=>{var n=r(4303);t.exports=function(t,e){var r=[];return n(t,(function(t,n,o){e(t,n,o)&&r.push(t)})),r}},1359:t=>{t.exports=function(t,e,r,n){for(var o=t.length,i=r+(n?1:-1);n?i--:++i{var n=r(5067),o=r(5882);t.exports=function t(e,r,i,a,s){var u=-1,c=e.length;for(i||(i=o),s||(s=[]);++u0&&i(l)?r>1?t(l,r-1,i,a,s):n(s,l):a||(s[s.length]=l)}return s}},5308:(t,e,r)=>{var n=r(5463)();t.exports=n},6548:(t,e,r)=>{var n=r(5308),o=r(249);t.exports=function(t,e){return t&&n(t,e,o)}},3324:(t,e,r)=>{var n=r(7297),o=r(3812);t.exports=function(t,e){for(var r=0,i=(e=n(e,t)).length;null!=t&&r{var n=r(5067),o=r(6152);t.exports=function(t,e,r){var i=e(t);return o(t)?i:n(i,r(t))}},3366:(t,e,r)=>{var n=r(857),o=r(2107),i=r(7157),a=n?n.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},2726:t=>{var e=Object.prototype.hasOwnProperty;t.exports=function(t,r){return null!=t&&e.call(t,r)}},187:t=>{t.exports=function(t,e){return null!=t&&e in Object(t)}},7832:(t,e,r)=>{var n=r(1359),o=r(2195),i=r(6024);t.exports=function(t,e,r){return e==e?i(t,e,r):n(t,o,r)}},5183:(t,e,r)=>{var n=r(3366),o=r(5125);t.exports=function(t){return o(t)&&"[object Arguments]"==n(t)}},8746:(t,e,r)=>{var n=r(1952),o=r(5125);t.exports=function t(e,r,i,a,s){return e===r||(null==e||null==r||!o(e)&&!o(r)?e!=e&&r!=r:n(e,r,i,a,t,s))}},1952:(t,e,r)=>{var n=r(6571),o=r(4871),i=r(1491),a=r(7416),s=r(940),u=r(6152),c=r(3226),l=r(7598),f="[object Arguments]",p="[object Array]",d="[object Object]",h=Object.prototype.hasOwnProperty;t.exports=function(t,e,r,v,y,m){var T=u(t),E=u(e),_=T?p:s(t),g=E?p:s(e),O=(_=_==f?d:_)==d,R=(g=g==f?d:g)==d,A=_==g;if(A&&c(t)){if(!c(e))return!1;T=!0,O=!1}if(A&&!O)return m||(m=new n),T||l(t)?o(t,e,r,v,y,m):i(t,e,_,r,v,y,m);if(!(1&r)){var I=O&&h.call(t,"__wrapped__"),x=R&&h.call(e,"__wrapped__");if(I||x){var N=I?t.value():t,P=x?e.value():e;return m||(m=new n),y(N,P,r,v,m)}}return!!A&&(m||(m=new n),a(t,e,r,v,y,m))}},4511:(t,e,r)=>{var n=r(940),o=r(5125);t.exports=function(t){return o(t)&&"[object Map]"==n(t)}},7036:(t,e,r)=>{var n=r(6571),o=r(8746);t.exports=function(t,e,r,i){var a=r.length,s=a,u=!i;if(null==t)return!s;for(t=Object(t);a--;){var c=r[a];if(u&&c[2]?c[1]!==t[c[0]]:!(c[0]in t))return!1}for(;++a{t.exports=function(t){return t!=t}},6840:(t,e,r)=>{var n=r(1049),o=r(7394),i=r(9259),a=r(7035),s=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,l=u.toString,f=c.hasOwnProperty,p=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(n(t)?p:s).test(a(t))}},4333:(t,e,r)=>{var n=r(3366),o=r(5125);t.exports=function(t){return o(t)&&"[object RegExp]"==n(t)}},8436:(t,e,r)=>{var n=r(940),o=r(5125);t.exports=function(t){return o(t)&&"[object Set]"==n(t)}},5522:(t,e,r)=>{var n=r(3366),o=r(1158),i=r(5125),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,t.exports=function(t){return i(t)&&o(t.length)&&!!a[n(t)]}},8286:(t,e,r)=>{var n=r(6423),o=r(4716),i=r(3059),a=r(6152),s=r(5798);t.exports=function(t){return"function"==typeof t?t:null==t?i:"object"==typeof t?a(t)?o(t[0],t[1]):n(t):s(t)}},6411:(t,e,r)=>{var n=r(6001),o=r(4248),i=Object.prototype.hasOwnProperty;t.exports=function(t){if(!n(t))return o(t);var e=[];for(var r in Object(t))i.call(t,r)&&"constructor"!=r&&e.push(r);return e}},8390:(t,e,r)=>{var n=r(9259),o=r(6001),i=r(2966),a=Object.prototype.hasOwnProperty;t.exports=function(t){if(!n(t))return i(t);var e=o(t),r=[];for(var s in t)("constructor"!=s||!e&&a.call(t,s))&&r.push(s);return r}},3401:(t,e,r)=>{var n=r(4303),o=r(7878);t.exports=function(t,e){var r=-1,i=o(t)?Array(t.length):[];return n(t,(function(t,n,o){i[++r]=e(t,n,o)})),i}},6423:(t,e,r)=>{var n=r(7036),o=r(9882),i=r(3477);t.exports=function(t){var e=o(t);return 1==e.length&&e[0][2]?i(e[0][0],e[0][1]):function(r){return r===t||n(r,t,e)}}},4716:(t,e,r)=>{var n=r(8746),o=r(2579),i=r(5041),a=r(1401),s=r(8792),u=r(3477),c=r(3812);t.exports=function(t,e){return a(t)&&s(e)?u(c(t),e):function(r){var a=o(r,t);return void 0===a&&a===e?i(r,t):n(e,a,3)}}},3759:(t,e,r)=>{var n=r(3324),o=r(2857),i=r(7297);t.exports=function(t,e,r){for(var a=-1,s=e.length,u={};++a{t.exports=function(t){return function(e){return null==e?void 0:e[t]}}},2952:(t,e,r)=>{var n=r(3324);t.exports=function(t){return function(e){return n(e,t)}}},5877:t=>{t.exports=function(t,e,r,n,o){return o(t,(function(t,o,i){r=n?(n=!1,t):e(r,t,o,i)})),r}},6060:(t,e,r)=>{var n=r(3059),o=r(3114),i=r(5251);t.exports=function(t,e){return i(o(t,e,n),t+"")}},2857:(t,e,r)=>{var n=r(91),o=r(7297),i=r(9045),a=r(9259),s=r(3812);t.exports=function(t,e,r,u){if(!a(t))return t;for(var c=-1,l=(e=o(e,t)).length,f=l-1,p=t;null!=p&&++c{var n=r(6874),o=r(3043),i=r(3059),a=o?function(t,e){return o(t,"toString",{configurable:!0,enumerable:!1,value:n(e),writable:!0})}:i;t.exports=a},9872:t=>{t.exports=function(t,e,r){var n=-1,o=t.length;e<0&&(e=-e>o?0:o+e),(r=r>o?o:r)<0&&(r+=o),o=e>r?0:r-e>>>0,e>>>=0;for(var i=Array(o);++n{var n=r(4303);t.exports=function(t,e){var r;return n(t,(function(t,n,o){return!(r=e(t,n,o))})),!!r}},6473:t=>{t.exports=function(t,e){for(var r=-1,n=Array(t);++r{var n=r(857),o=r(343),i=r(6152),a=r(4795),s=n?n.prototype:void 0,u=s?s.toString:void 0;t.exports=function t(e){if("string"==typeof e)return e;if(i(e))return o(e,t)+"";if(a(e))return u?u.call(e):"";var r=e+"";return"0"==r&&1/e==-1/0?"-0":r}},1704:(t,e,r)=>{var n=r(2153),o=/^\s+/;t.exports=function(t){return t?t.slice(0,n(t)+1).replace(o,""):t}},7826:t=>{t.exports=function(t){return function(e){return t(e)}}},7326:(t,e,r)=>{var n=r(5386),o=r(8333),i=r(4893),a=r(9950),s=r(8803),u=r(4207);t.exports=function(t,e,r){var c=-1,l=o,f=t.length,p=!0,d=[],h=d;if(r)p=!1,l=i;else if(f>=200){var v=e?null:s(t);if(v)return u(v);p=!1,l=a,h=new n}else h=e?[]:d;t:for(;++c{var n=r(343);t.exports=function(t,e){return n(e,(function(e){return t[e]}))}},9950:t=>{t.exports=function(t,e){return t.has(e)}},9419:(t,e,r)=>{var n=r(3059);t.exports=function(t){return"function"==typeof t?t:n}},7297:(t,e,r)=>{var n=r(6152),o=r(1401),i=r(4452),a=r(6188);t.exports=function(t,e){return n(t)?t:o(t,e)?[t]:i(a(t))}},3895:(t,e,r)=>{var n=r(9872);t.exports=function(t,e,r){var o=t.length;return r=void 0===r?o:r,!e&&r>=o?t:n(t,e,r)}},897:(t,e,r)=>{var n=r(9162);t.exports=function(t){var e=new t.constructor(t.byteLength);return new n(e).set(new n(t)),e}},2175:(t,e,r)=>{t=r.nmd(t);var n=r(7772),o=e&&!e.nodeType&&e,i=o&&t&&!t.nodeType&&t,a=i&&i.exports===o?n.Buffer:void 0,s=a?a.allocUnsafe:void 0;t.exports=function(t,e){if(e)return t.slice();var r=t.length,n=s?s(r):new t.constructor(r);return t.copy(n),n}},4727:(t,e,r)=>{var n=r(897);t.exports=function(t,e){var r=e?n(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}},6058:t=>{var e=/\w*$/;t.exports=function(t){var r=new t.constructor(t.source,e.exec(t));return r.lastIndex=t.lastIndex,r}},169:(t,e,r)=>{var n=r(857),o=n?n.prototype:void 0,i=o?o.valueOf:void 0;t.exports=function(t){return i?Object(i.call(t)):{}}},6190:(t,e,r)=>{var n=r(897);t.exports=function(t,e){var r=e?n(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}},1522:t=>{t.exports=function(t,e){var r=-1,n=t.length;for(e||(e=Array(n));++r{var n=r(91),o=r(3940);t.exports=function(t,e,r,i){var a=!r;r||(r={});for(var s=-1,u=e.length;++s{var n=r(752),o=r(633);t.exports=function(t,e){return n(t,o(t),e)}},9987:(t,e,r)=>{var n=r(752),o=r(2680);t.exports=function(t,e){return n(t,o(t),e)}},4019:(t,e,r)=>{var n=r(7772)["__core-js_shared__"];t.exports=n},6740:(t,e,r)=>{var n=r(5338),o=r(2825),i=r(8286),a=r(6152);t.exports=function(t,e){return function(r,s){var u=a(r)?n:o,c=e?e():{};return u(r,t,i(s,2),c)}}},7263:(t,e,r)=>{var n=r(6060),o=r(2406);t.exports=function(t){return n((function(e,r){var n=-1,i=r.length,a=i>1?r[i-1]:void 0,s=i>2?r[2]:void 0;for(a=t.length>3&&"function"==typeof a?(i--,a):void 0,s&&o(r[0],r[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);++n{var n=r(7878);t.exports=function(t,e){return function(r,o){if(null==r)return r;if(!n(r))return t(r,o);for(var i=r.length,a=e?i:-1,s=Object(r);(e?a--:++a{t.exports=function(t){return function(e,r,n){for(var o=-1,i=Object(e),a=n(e),s=a.length;s--;){var u=a[t?s:++o];if(!1===r(i[u],u,i))break}return e}}},3126:(t,e,r)=>{var n=r(3895),o=r(3880),i=r(8435),a=r(6188);t.exports=function(t){return function(e){e=a(e);var r=o(e)?i(e):void 0,s=r?r[0]:e.charAt(0),u=r?n(r,1).join(""):e.slice(1);return s[t]()+u}}},8776:(t,e,r)=>{var n=r(8286),o=r(7878),i=r(249);t.exports=function(t){return function(e,r,a){var s=Object(e);if(!o(e)){var u=n(r,3);e=i(e),r=function(t){return u(s[t],t,s)}}var c=t(e,r,a);return c>-1?s[u?e[c]:c]:void 0}}},8803:(t,e,r)=>{var n=r(2143),o=r(4291),i=r(4207),a=n&&1/i(new n([,-0]))[1]==1/0?function(t){return new n(t)}:o;t.exports=a},3043:(t,e,r)=>{var n=r(8761),o=function(){try{var t=n(Object,"defineProperty");return t({},"",{}),t}catch(t){}}();t.exports=o},4871:(t,e,r)=>{var n=r(5386),o=r(7064),i=r(9950);t.exports=function(t,e,r,a,s,u){var c=1&r,l=t.length,f=e.length;if(l!=f&&!(c&&f>l))return!1;var p=u.get(t),d=u.get(e);if(p&&d)return p==e&&d==t;var h=-1,v=!0,y=2&r?new n:void 0;for(u.set(t,e),u.set(e,t);++h{var n=r(857),o=r(9162),i=r(1225),a=r(4871),s=r(5179),u=r(4207),c=n?n.prototype:void 0,l=c?c.valueOf:void 0;t.exports=function(t,e,r,n,c,f,p){switch(r){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=e.byteLength||!f(new o(t),new o(e)));case"[object Boolean]":case"[object Date]":case"[object Number]":return i(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]":var d=s;case"[object Set]":var h=1&n;if(d||(d=u),t.size!=e.size&&!h)return!1;var v=p.get(t);if(v)return v==e;n|=2,p.set(t,e);var y=a(d(t),d(e),n,c,f,p);return p.delete(t),y;case"[object Symbol]":if(l)return l.call(t)==l.call(e)}return!1}},7416:(t,e,r)=>{var n=r(3483),o=Object.prototype.hasOwnProperty;t.exports=function(t,e,r,i,a,s){var u=1&r,c=n(t),l=c.length;if(l!=n(e).length&&!u)return!1;for(var f=l;f--;){var p=c[f];if(!(u?p in e:o.call(e,p)))return!1}var d=s.get(t),h=s.get(e);if(d&&h)return d==e&&h==t;var v=!0;s.set(t,e),s.set(e,t);for(var y=u;++f{var n="object"==typeof r.g&&r.g&&r.g.Object===Object&&r.g;t.exports=n},3483:(t,e,r)=>{var n=r(1897),o=r(633),i=r(249);t.exports=function(t){return n(t,i,o)}},6939:(t,e,r)=>{var n=r(1897),o=r(2680),i=r(8582);t.exports=function(t){return n(t,i,o)}},7937:(t,e,r)=>{var n=r(8304);t.exports=function(t,e){var r=t.__data__;return n(e)?r["string"==typeof e?"string":"hash"]:r.map}},9882:(t,e,r)=>{var n=r(8792),o=r(249);t.exports=function(t){for(var e=o(t),r=e.length;r--;){var i=e[r],a=t[i];e[r]=[i,a,n(a)]}return e}},8761:(t,e,r)=>{var n=r(6840),o=r(8109);t.exports=function(t,e){var r=o(t,e);return n(r)?r:void 0}},7353:(t,e,r)=>{var n=r(241)(Object.getPrototypeOf,Object);t.exports=n},2107:(t,e,r)=>{var n=r(857),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,s=n?n.toStringTag:void 0;t.exports=function(t){var e=i.call(t,s),r=t[s];try{t[s]=void 0;var n=!0}catch(t){}var o=a.call(t);return n&&(e?t[s]=r:delete t[s]),o}},633:(t,e,r)=>{var n=r(7552),o=r(981),i=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,s=a?function(t){return null==t?[]:(t=Object(t),n(a(t),(function(e){return i.call(t,e)})))}:o;t.exports=s},2680:(t,e,r)=>{var n=r(5067),o=r(7353),i=r(633),a=r(981),s=Object.getOwnPropertySymbols?function(t){for(var e=[];t;)n(e,i(t)),t=o(t);return e}:a;t.exports=s},940:(t,e,r)=>{var n=r(9515),o=r(326),i=r(2760),a=r(2143),s=r(3215),u=r(3366),c=r(7035),l="[object Map]",f="[object Promise]",p="[object Set]",d="[object WeakMap]",h="[object DataView]",v=c(n),y=c(o),m=c(i),T=c(a),E=c(s),_=u;(n&&_(new n(new ArrayBuffer(1)))!=h||o&&_(new o)!=l||i&&_(i.resolve())!=f||a&&_(new a)!=p||s&&_(new s)!=d)&&(_=function(t){var e=u(t),r="[object Object]"==e?t.constructor:void 0,n=r?c(r):"";if(n)switch(n){case v:return h;case y:return l;case m:return f;case T:return p;case E:return d}return e}),t.exports=_},8109:t=>{t.exports=function(t,e){return null==t?void 0:t[e]}},1369:(t,e,r)=>{var n=r(7297),o=r(9631),i=r(6152),a=r(9045),s=r(1158),u=r(3812);t.exports=function(t,e,r){for(var c=-1,l=(e=n(e,t)).length,f=!1;++c{var e=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");t.exports=function(t){return e.test(t)}},2118:(t,e,r)=>{var n=r(9191);t.exports=function(){this.__data__=n?n(null):{},this.size=0}},6909:t=>{t.exports=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}},8138:(t,e,r)=>{var n=r(9191),o=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;if(n){var r=e[t];return"__lodash_hash_undefined__"===r?void 0:r}return o.call(e,t)?e[t]:void 0}},4174:(t,e,r)=>{var n=r(9191),o=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;return n?void 0!==e[t]:o.call(e,t)}},7942:(t,e,r)=>{var n=r(9191);t.exports=function(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=n&&void 0===e?"__lodash_hash_undefined__":e,this}},9917:t=>{var e=Object.prototype.hasOwnProperty;t.exports=function(t){var r=t.length,n=new t.constructor(r);return r&&"string"==typeof t[0]&&e.call(t,"index")&&(n.index=t.index,n.input=t.input),n}},8222:(t,e,r)=>{var n=r(897),o=r(4727),i=r(6058),a=r(169),s=r(6190);t.exports=function(t,e,r){var u=t.constructor;switch(e){case"[object ArrayBuffer]":return n(t);case"[object Boolean]":case"[object Date]":return new u(+t);case"[object DataView]":return o(t,r);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return s(t,r);case"[object Map]":return new u;case"[object Number]":case"[object String]":return new u(t);case"[object RegExp]":return i(t);case"[object Set]":return new u;case"[object Symbol]":return a(t)}}},8725:(t,e,r)=>{var n=r(9413),o=r(7353),i=r(6001);t.exports=function(t){return"function"!=typeof t.constructor||i(t)?{}:n(o(t))}},5882:(t,e,r)=>{var n=r(857),o=r(9631),i=r(6152),a=n?n.isConcatSpreadable:void 0;t.exports=function(t){return i(t)||o(t)||!!(a&&t&&t[a])}},9045:t=>{var e=/^(?:0|[1-9]\d*)$/;t.exports=function(t,r){var n=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==n||"symbol"!=n&&e.test(t))&&t>-1&&t%1==0&&t{var n=r(1225),o=r(7878),i=r(9045),a=r(9259);t.exports=function(t,e,r){if(!a(r))return!1;var s=typeof e;return!!("number"==s?o(r)&&i(e,r.length):"string"==s&&e in r)&&n(r[e],t)}},1401:(t,e,r)=>{var n=r(6152),o=r(4795),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;t.exports=function(t,e){if(n(t))return!1;var r=typeof t;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=t&&!o(t))||a.test(t)||!i.test(t)||null!=e&&t in Object(e)}},8304:t=>{t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},7394:(t,e,r)=>{var n,o=r(4019),i=(n=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"";t.exports=function(t){return!!i&&i in t}},6001:t=>{var e=Object.prototype;t.exports=function(t){var r=t&&t.constructor;return t===("function"==typeof r&&r.prototype||e)}},8792:(t,e,r)=>{var n=r(9259);t.exports=function(t){return t==t&&!n(t)}},3945:t=>{t.exports=function(){this.__data__=[],this.size=0}},1846:(t,e,r)=>{var n=r(2218),o=Array.prototype.splice;t.exports=function(t){var e=this.__data__,r=n(e,t);return!(r<0||(r==e.length-1?e.pop():o.call(e,r,1),--this.size,0))}},8028:(t,e,r)=>{var n=r(2218);t.exports=function(t){var e=this.__data__,r=n(e,t);return r<0?void 0:e[r][1]}},2344:(t,e,r)=>{var n=r(2218);t.exports=function(t){return n(this.__data__,t)>-1}},4769:(t,e,r)=>{var n=r(2218);t.exports=function(t,e){var r=this.__data__,o=n(r,t);return o<0?(++this.size,r.push([t,e])):r[o][1]=e,this}},2411:(t,e,r)=>{var n=r(9612),o=r(235),i=r(326);t.exports=function(){this.size=0,this.__data__={hash:new n,map:new(i||o),string:new n}}},6417:(t,e,r)=>{var n=r(7937);t.exports=function(t){var e=n(this,t).delete(t);return this.size-=e?1:0,e}},6928:(t,e,r)=>{var n=r(7937);t.exports=function(t){return n(this,t).get(t)}},9493:(t,e,r)=>{var n=r(7937);t.exports=function(t){return n(this,t).has(t)}},4150:(t,e,r)=>{var n=r(7937);t.exports=function(t,e){var r=n(this,t),o=r.size;return r.set(t,e),this.size+=r.size==o?0:1,this}},5179:t=>{t.exports=function(t){var e=-1,r=Array(t.size);return t.forEach((function(t,n){r[++e]=[n,t]})),r}},3477:t=>{t.exports=function(t,e){return function(r){return null!=r&&r[t]===e&&(void 0!==e||t in Object(r))}}},7777:(t,e,r)=>{var n=r(733);t.exports=function(t){var e=n(t,(function(t){return 500===r.size&&r.clear(),t})),r=e.cache;return e}},9191:(t,e,r)=>{var n=r(8761)(Object,"create");t.exports=n},4248:(t,e,r)=>{var n=r(241)(Object.keys,Object);t.exports=n},2966:t=>{t.exports=function(t){var e=[];if(null!=t)for(var r in Object(t))e.push(r);return e}},4146:(t,e,r)=>{t=r.nmd(t);var n=r(1242),o=e&&!e.nodeType&&e,i=o&&t&&!t.nodeType&&t,a=i&&i.exports===o&&n.process,s=function(){try{return i&&i.require&&i.require("util").types||a&&a.binding&&a.binding("util")}catch(t){}}();t.exports=s},7157:t=>{var e=Object.prototype.toString;t.exports=function(t){return e.call(t)}},241:t=>{t.exports=function(t,e){return function(r){return t(e(r))}}},3114:(t,e,r)=>{var n=r(9432),o=Math.max;t.exports=function(t,e,r){return e=o(void 0===e?t.length-1:e,0),function(){for(var i=arguments,a=-1,s=o(i.length-e,0),u=Array(s);++a{var n=r(1242),o="object"==typeof self&&self&&self.Object===Object&&self,i=n||o||Function("return this")();t.exports=i},2842:t=>{t.exports=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this}},2482:t=>{t.exports=function(t){return this.__data__.has(t)}},4207:t=>{t.exports=function(t){var e=-1,r=Array(t.size);return t.forEach((function(t){r[++e]=t})),r}},5251:(t,e,r)=>{var n=r(6532),o=r(7787)(n);t.exports=o},7787:t=>{var e=Date.now;t.exports=function(t){var r=0,n=0;return function(){var o=e(),i=16-(o-n);if(n=o,i>0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}},5243:(t,e,r)=>{var n=r(235);t.exports=function(){this.__data__=new n,this.size=0}},2858:t=>{t.exports=function(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}},4417:t=>{t.exports=function(t){return this.__data__.get(t)}},8605:t=>{t.exports=function(t){return this.__data__.has(t)}},1418:(t,e,r)=>{var n=r(235),o=r(326),i=r(6738);t.exports=function(t,e){var r=this.__data__;if(r instanceof n){var a=r.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++r.size,this;r=this.__data__=new i(a)}return r.set(t,e),this.size=r.size,this}},6024:t=>{t.exports=function(t,e,r){for(var n=r-1,o=t.length;++n{var n=r(217),o=r(3880),i=r(3344);t.exports=function(t){return o(t)?i(t):n(t)}},4452:(t,e,r)=>{var n=r(7777),o=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,i=/\\(\\)?/g,a=n((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(o,(function(t,r,n,o){e.push(n?o.replace(i,"$1"):r||t)})),e}));t.exports=a},3812:(t,e,r)=>{var n=r(4795);t.exports=function(t){if("string"==typeof t||n(t))return t;var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}},7035:t=>{var e=Function.prototype.toString;t.exports=function(t){if(null!=t){try{return e.call(t)}catch(t){}try{return t+""}catch(t){}}return""}},2153:t=>{var e=/\s/;t.exports=function(t){for(var r=t.length;r--&&e.test(t.charAt(r)););return r}},3344:t=>{var e="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",r="\\ud83c[\\udffb-\\udfff]",n="[^\\ud800-\\udfff]",o="(?:\\ud83c[\\udde6-\\uddff]){2}",i="[\\ud800-\\udbff][\\udc00-\\udfff]",a="(?:"+e+"|"+r+")?",s="[\\ufe0e\\ufe0f]?",u=s+a+"(?:\\u200d(?:"+[n,o,i].join("|")+")"+s+a+")*",c="(?:"+[n+e+"?",e,o,i,"[\\ud800-\\udfff]"].join("|")+")",l=RegExp(r+"(?="+r+")|"+c+u,"g");t.exports=function(t){return t.match(l)||[]}},19:(t,e,r)=>{var n=r(91),o=r(752),i=r(7263),a=r(7878),s=r(6001),u=r(249),c=Object.prototype.hasOwnProperty,l=i((function(t,e){if(s(e)||a(e))o(e,u(e),t);else for(var r in e)c.call(e,r)&&n(t,r,e[r])}));t.exports=l},4004:(t,e,r)=>{var n=r(8874);t.exports=function(t){return n(t,4)}},417:t=>{t.exports=function(t){for(var e=-1,r=null==t?0:t.length,n=0,o=[];++e{t.exports=function(t){return function(){return t}}},4573:(t,e,r)=>{var n=r(6060),o=r(1225),i=r(2406),a=r(8582),s=Object.prototype,u=s.hasOwnProperty,c=n((function(t,e){t=Object(t);var r=-1,n=e.length,c=n>2?e[2]:void 0;for(c&&i(e[0],e[1],c)&&(n=1);++r{var n=r(5246),o=r(2034),i=r(6060),a=r(3746),s=i((function(t,e){return a(t)?n(t,o(e,1,a,!0)):[]}));t.exports=s},7264:(t,e,r)=>{var n=r(9872),o=r(8101);t.exports=function(t,e,r){var i=null==t?0:t.length;return i?(e=r||void 0===e?1:o(e),n(t,e<0?0:e,i)):[]}},4934:(t,e,r)=>{var n=r(9872),o=r(8101);t.exports=function(t,e,r){var i=null==t?0:t.length;return i?(e=r||void 0===e?1:o(e),n(t,0,(e=i-e)<0?0:e)):[]}},1225:t=>{t.exports=function(t,e){return t===e||t!=t&&e!=e}},9794:(t,e,r)=>{var n=r(7603),o=r(80),i=r(8286),a=r(6152),s=r(2406);t.exports=function(t,e,r){var u=a(t)?n:o;return r&&s(t,e,r)&&(e=void 0),u(t,i(e,3))}},882:(t,e,r)=>{var n=r(7552),o=r(8043),i=r(8286),a=r(6152);t.exports=function(t,e){return(a(t)?n:o)(t,i(e,3))}},5281:(t,e,r)=>{var n=r(8776)(r(2982));t.exports=n},2982:(t,e,r)=>{var n=r(1359),o=r(8286),i=r(8101),a=Math.max;t.exports=function(t,e,r){var s=null==t?0:t.length;if(!s)return-1;var u=null==r?0:i(r);return u<0&&(u=a(s+u,0)),n(t,o(e,3),u)}},3237:(t,e,r)=>{t.exports=r(1092)},5838:(t,e,r)=>{var n=r(2034),o=r(6760);t.exports=function(t,e){return n(o(t,e),1)}},5676:(t,e,r)=>{var n=r(2034);t.exports=function(t){return null!=t&&t.length?n(t,1):[]}},9756:(t,e,r)=>{var n=r(2517),o=r(4303),i=r(9419),a=r(6152);t.exports=function(t,e){return(a(t)?n:o)(t,i(e))}},2579:(t,e,r)=>{var n=r(3324);t.exports=function(t,e,r){var o=null==t?void 0:n(t,e);return void 0===o?r:o}},3440:(t,e,r)=>{var n=r(3940),o=r(6740),i=Object.prototype.hasOwnProperty,a=o((function(t,e,r){i.call(t,r)?t[r].push(e):n(t,r,[e])}));t.exports=a},3352:(t,e,r)=>{var n=r(2726),o=r(1369);t.exports=function(t,e){return null!=t&&o(t,e,n)}},5041:(t,e,r)=>{var n=r(187),o=r(1369);t.exports=function(t,e){return null!=t&&o(t,e,n)}},1092:t=>{t.exports=function(t){return t&&t.length?t[0]:void 0}},3059:t=>{t.exports=function(t){return t}},1886:(t,e,r)=>{var n=r(7832),o=r(7878),i=r(5505),a=r(8101),s=r(8346),u=Math.max;t.exports=function(t,e,r,c){t=o(t)?t:s(t),r=r&&!c?a(r):0;var l=t.length;return r<0&&(r=u(l+r,0)),i(t)?r<=l&&t.indexOf(e,r)>-1:!!l&&n(t,e,r)>-1}},3493:(t,e,r)=>{var n=r(7832),o=r(8101),i=Math.max;t.exports=function(t,e,r){var a=null==t?0:t.length;if(!a)return-1;var s=null==r?0:o(r);return s<0&&(s=i(a+s,0)),n(t,e,s)}},9631:(t,e,r)=>{var n=r(5183),o=r(5125),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,u=n(function(){return arguments}())?n:function(t){return o(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=u},6152:t=>{var e=Array.isArray;t.exports=e},7878:(t,e,r)=>{var n=r(1049),o=r(1158);t.exports=function(t){return null!=t&&o(t.length)&&!n(t)}},3746:(t,e,r)=>{var n=r(7878),o=r(5125);t.exports=function(t){return o(t)&&n(t)}},3226:(t,e,r)=>{t=r.nmd(t);var n=r(7772),o=r(6330),i=e&&!e.nodeType&&e,a=i&&t&&!t.nodeType&&t,s=a&&a.exports===i?n.Buffer:void 0,u=(s?s.isBuffer:void 0)||o;t.exports=u},5455:(t,e,r)=>{var n=r(6411),o=r(940),i=r(9631),a=r(6152),s=r(7878),u=r(3226),c=r(6001),l=r(7598),f=Object.prototype.hasOwnProperty;t.exports=function(t){if(null==t)return!0;if(s(t)&&(a(t)||"string"==typeof t||"function"==typeof t.splice||u(t)||l(t)||i(t)))return!t.length;var e=o(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if(c(t))return!n(t).length;for(var r in t)if(f.call(t,r))return!1;return!0}},1049:(t,e,r)=>{var n=r(3366),o=r(9259);t.exports=function(t){if(!o(t))return!1;var e=n(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},1158:t=>{t.exports=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},4714:(t,e,r)=>{var n=r(4511),o=r(7826),i=r(4146),a=i&&i.isMap,s=a?o(a):n;t.exports=s},9259:t=>{t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},5125:t=>{t.exports=function(t){return null!=t&&"object"==typeof t}},859:(t,e,r)=>{var n=r(4333),o=r(7826),i=r(4146),a=i&&i.isRegExp,s=a?o(a):n;t.exports=s},3679:(t,e,r)=>{var n=r(8436),o=r(7826),i=r(4146),a=i&&i.isSet,s=a?o(a):n;t.exports=s},5505:(t,e,r)=>{var n=r(3366),o=r(6152),i=r(5125);t.exports=function(t){return"string"==typeof t||!o(t)&&i(t)&&"[object String]"==n(t)}},4795:(t,e,r)=>{var n=r(3366),o=r(5125);t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==n(t)}},7598:(t,e,r)=>{var n=r(5522),o=r(7826),i=r(4146),a=i&&i.isTypedArray,s=a?o(a):n;t.exports=s},4336:t=>{t.exports=function(t){return void 0===t}},249:(t,e,r)=>{var n=r(1634),o=r(6411),i=r(7878);t.exports=function(t){return i(t)?n(t):o(t)}},8582:(t,e,r)=>{var n=r(1634),o=r(8390),i=r(7878);t.exports=function(t){return i(t)?n(t,!0):o(t)}},6974:t=>{t.exports=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}},6760:(t,e,r)=>{var n=r(343),o=r(8286),i=r(3401),a=r(6152);t.exports=function(t,e){return(a(t)?n:i)(t,o(e,3))}},733:(t,e,r)=>{var n=r(6738);function o(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var r=function(){var n=arguments,o=e?e.apply(this,n):n[0],i=r.cache;if(i.has(o))return i.get(o);var a=t.apply(this,n);return r.cache=i.set(o,a)||i,a};return r.cache=new(o.Cache||n),r}o.Cache=n,t.exports=o},1570:t=>{t.exports=function(t){if("function"!=typeof t)throw new TypeError("Expected a function");return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}},4291:t=>{t.exports=function(){}},2208:(t,e,r)=>{var n=r(343),o=r(8286),i=r(3759),a=r(6939);t.exports=function(t,e){if(null==t)return{};var r=n(a(t),(function(t){return[t]}));return e=o(e),i(t,r,(function(t,r){return e(t,r[0])}))}},5798:(t,e,r)=>{var n=r(256),o=r(2952),i=r(1401),a=r(3812);t.exports=function(t){return i(t)?n(a(t)):o(t)}},8215:(t,e,r)=>{var n=r(1207),o=r(4303),i=r(8286),a=r(5877),s=r(6152);t.exports=function(t,e,r){var u=s(t)?n:a,c=arguments.length<3;return u(t,i(e,4),r,c,o)}},2070:(t,e,r)=>{var n=r(7552),o=r(8043),i=r(8286),a=r(6152),s=r(1570);t.exports=function(t,e){return(a(t)?n:o)(t,s(i(e,3)))}},1525:(t,e,r)=>{var n=r(7064),o=r(8286),i=r(4751),a=r(6152),s=r(2406);t.exports=function(t,e,r){var u=a(t)?n:i;return r&&s(t,e,r)&&(e=void 0),u(t,o(e,3))}},981:t=>{t.exports=function(){return[]}},6330:t=>{t.exports=function(){return!1}},5707:(t,e,r)=>{var n=r(7642);t.exports=function(t){return t?Infinity===(t=n(t))||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}},8101:(t,e,r)=>{var n=r(5707);t.exports=function(t){var e=n(t),r=e%1;return e==e?r?e-r:e:0}},7642:(t,e,r)=>{var n=r(1704),o=r(9259),i=r(4795),a=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,u=/^0o[0-7]+$/i,c=parseInt;t.exports=function(t){if("number"==typeof t)return t;if(i(t))return NaN;if(o(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=o(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=n(t);var r=s.test(t);return r||u.test(t)?c(t.slice(2),r?2:8):a.test(t)?NaN:+t}},6188:(t,e,r)=>{var n=r(1054);t.exports=function(t){return null==t?"":n(t)}},5652:(t,e,r)=>{var n=r(7326);t.exports=function(t){return t&&t.length?n(t):[]}},3779:(t,e,r)=>{var n=r(3126)("toUpperCase");t.exports=n},8346:(t,e,r)=>{var n=r(753),o=r(249);t.exports=function(t){return null==t?[]:n(t,o(t))}},4844:function(t,e){var r,n;"undefined"!=typeof self&&self,void 0===(n="function"==typeof(r=function(){function t(){}t.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},t.prototype.restoreState=function(t){this.idx=t.idx,this.input=t.input,this.groupIdx=t.groupIdx},t.prototype.pattern=function(t){this.idx=0,this.input=t,this.groupIdx=0,this.consumeChar("/");var e=this.disjunction();this.consumeChar("/");for(var r={type:"Flags",loc:{begin:this.idx,end:t.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":s(r,"global");break;case"i":s(r,"ignoreCase");break;case"m":s(r,"multiLine");break;case"u":s(r,"unicode");break;case"y":s(r,"sticky")}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:r,value:e,loc:this.loc(0)}},t.prototype.disjunction=function(){var t=[],e=this.idx;for(t.push(this.alternative());"|"===this.peekChar();)this.consumeChar("|"),t.push(this.alternative());return{type:"Disjunction",value:t,loc:this.loc(e)}},t.prototype.alternative=function(){for(var t=[],e=this.idx;this.isTerm();)t.push(this.term());return{type:"Alternative",value:t,loc:this.loc(e)}},t.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},t.prototype.assertion=function(){var t=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(t)};case"$":return{type:"EndAnchor",loc:this.loc(t)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(t)};case"B":return{type:"NonWordBoundary",loc:this.loc(t)}}throw Error("Invalid Assertion Escape");case"(":var e;switch(this.consumeChar("?"),this.popChar()){case"=":e="Lookahead";break;case"!":e="NegativeLookahead"}u(e);var r=this.disjunction();return this.consumeChar(")"),{type:e,value:r,loc:this.loc(t)}}!function(){throw Error("Internal Error - Should never get here!")}()},t.prototype.quantifier=function(t){var e,r=this.idx;switch(this.popChar()){case"*":e={atLeast:0,atMost:1/0};break;case"+":e={atLeast:1,atMost:1/0};break;case"?":e={atLeast:0,atMost:1};break;case"{":var n=this.integerIncludingZero();switch(this.popChar()){case"}":e={atLeast:n,atMost:n};break;case",":e=this.isDigit()?{atLeast:n,atMost:this.integerIncludingZero()}:{atLeast:n,atMost:1/0},this.consumeChar("}")}if(!0===t&&void 0===e)return;u(e)}if(!0!==t||void 0!==e)return u(e),"?"===this.peekChar(0)?(this.consumeChar("?"),e.greedy=!1):e.greedy=!0,e.type="Quantifier",e.loc=this.loc(r),e},t.prototype.atom=function(){var t,e=this.idx;switch(this.peekChar()){case".":t=this.dotAll();break;case"\\":t=this.atomEscape();break;case"[":t=this.characterClass();break;case"(":t=this.group()}return void 0===t&&this.isPatternCharacter()&&(t=this.patternCharacter()),u(t),t.loc=this.loc(e),this.isQuantifier()&&(t.quantifier=this.quantifier()),t},t.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[i("\n"),i("\r"),i("\u2028"),i("\u2029")]}},t.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.decimalEscapeAtom=function(){return{type:"GroupBackReference",value:this.positiveInteger()}},t.prototype.characterClassEscape=function(){var t,e=!1;switch(this.popChar()){case"d":t=c;break;case"D":t=c,e=!0;break;case"s":t=f;break;case"S":t=f,e=!0;break;case"w":t=l;break;case"W":t=l,e=!0}return u(t),{type:"Set",value:t,complement:e}},t.prototype.controlEscapeAtom=function(){var t;switch(this.popChar()){case"f":t=i("\f");break;case"n":t=i("\n");break;case"r":t=i("\r");break;case"t":t=i("\t");break;case"v":t=i("\v")}return u(t),{type:"Character",value:t}},t.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var t=this.popChar();if(!1===/[a-zA-Z]/.test(t))throw Error("Invalid ");return{type:"Character",value:t.toUpperCase().charCodeAt(0)-64}},t.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:i("\0")}},t.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},t.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},t.prototype.identityEscapeAtom=function(){return{type:"Character",value:i(this.popChar())}},t.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case"\n":case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:return{type:"Character",value:i(this.popChar())}}},t.prototype.characterClass=function(){var t=[],e=!1;for(this.consumeChar("["),"^"===this.peekChar(0)&&(this.consumeChar("^"),e=!0);this.isClassAtom();){var r=this.classAtom();if("Character"===r.type&&this.isRangeDash()){this.consumeChar("-");var n=this.classAtom();if("Character"===n.type){if(n.value=this.input.length)throw Error("Unexpected end of input");this.idx++},t.prototype.loc=function(t){return{begin:t,end:this.idx}};var e,r=/[0-9a-fA-F]/,n=/[0-9]/,o=/[1-9]/;function i(t){return t.charCodeAt(0)}function a(t,e){void 0!==t.length?t.forEach((function(t){e.push(t)})):e.push(t)}function s(t,e){if(!0===t[e])throw"duplicate flag "+e;t[e]=!0}function u(t){if(void 0===t)throw Error("Internal Error - Should never get here!")}var c=[];for(e=i("0");e<=i("9");e++)c.push(e);var l=[i("_")].concat(c);for(e=i("a");e<=i("z");e++)l.push(e);for(e=i("A");e<=i("Z");e++)l.push(e);var f=[i(" "),i("\f"),i("\n"),i("\r"),i("\t"),i("\v"),i("\t"),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i("\u2028"),i("\u2029"),i(" "),i(" "),i(" "),i("\ufeff")];function p(){}return p.prototype.visitChildren=function(t){for(var e in t){var r=t[e];t.hasOwnProperty(e)&&(void 0!==r.type?this.visit(r):Array.isArray(r)&&r.forEach((function(t){this.visit(t)}),this))}},p.prototype.visit=function(t){switch(t.type){case"Pattern":this.visitPattern(t);break;case"Flags":this.visitFlags(t);break;case"Disjunction":this.visitDisjunction(t);break;case"Alternative":this.visitAlternative(t);break;case"StartAnchor":this.visitStartAnchor(t);break;case"EndAnchor":this.visitEndAnchor(t);break;case"WordBoundary":this.visitWordBoundary(t);break;case"NonWordBoundary":this.visitNonWordBoundary(t);break;case"Lookahead":this.visitLookahead(t);break;case"NegativeLookahead":this.visitNegativeLookahead(t);break;case"Character":this.visitCharacter(t);break;case"Set":this.visitSet(t);break;case"Group":this.visitGroup(t);break;case"GroupBackReference":this.visitGroupBackReference(t);break;case"Quantifier":this.visitQuantifier(t)}this.visitChildren(t)},p.prototype.visitPattern=function(t){},p.prototype.visitFlags=function(t){},p.prototype.visitDisjunction=function(t){},p.prototype.visitAlternative=function(t){},p.prototype.visitStartAnchor=function(t){},p.prototype.visitEndAnchor=function(t){},p.prototype.visitWordBoundary=function(t){},p.prototype.visitNonWordBoundary=function(t){},p.prototype.visitLookahead=function(t){},p.prototype.visitNegativeLookahead=function(t){},p.prototype.visitCharacter=function(t){},p.prototype.visitSet=function(t){},p.prototype.visitGroup=function(t){},p.prototype.visitGroupBackReference=function(t){},p.prototype.visitQuantifier=function(t){},{RegExpParser:t,BaseRegExpVisitor:p,VERSION:"0.5.0"}})?r.apply(e,[]):r)||(t.exports=n)},5781:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createSyntaxDiagramsCode=void 0;var n=r(7979);e.createSyntaxDiagramsCode=function(t,e){var r=void 0===e?{}:e,o=r.resourceBase,i=void 0===o?"https://unpkg.com/chevrotain@".concat(n.VERSION,"/diagrams/"):o,a=r.css,s=void 0===a?"https://unpkg.com/chevrotain@".concat(n.VERSION,"/diagrams/diagrams.css"):a;return'\n\x3c!-- This is a generated file --\x3e\n\n\n\n\n'+"\n\n")+"\n