diff --git a/scroll/index.html b/scroll/index.html
new file mode 100644
index 0000000..ec442d3
--- /dev/null
+++ b/scroll/index.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+ Scroll
+
+
+
+
+
+
+
+
+
Scroll
+
+
+
Hello World
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/scroll/scroll.css b/scroll/scroll.css
new file mode 100644
index 0000000..5745450
--- /dev/null
+++ b/scroll/scroll.css
@@ -0,0 +1,118 @@
+/*
+* ConductorCalc - scroll.css
+*
+* Created by Janis Hutz 01/17/2024, Licensed under a proprietary License
+* https://janishutz.com, development@janishutz.com
+*
+*
+*/
+
+#scroll-indicator {
+ position: fixed;
+ right: 5%;
+ z-index: 7;
+ width: 90%;
+ bottom: -200px;
+}
+
+#scroll-indicator.show-scroll {
+ animation: pop-in 0.5s;
+ bottom: 5%;
+}
+
+#scroll-indicator.hide-scroll {
+ animation: pop-out 0.5s;
+ bottom: -200px;
+}
+
+@keyframes pop-in {
+ 0% {
+ bottom: -200px;
+ }
+
+ 70% {
+ bottom: 6.5%;
+ }
+
+ 80% {
+ bottom: 6%;
+ }
+
+ 100% {
+ bottom: 5%;
+ }
+}
+
+@keyframes pop-out {
+ 0% {
+ bottom: 5%;
+ }
+
+ 25% {
+ bottom: 6.5%
+ }
+
+ 35% {
+ bottom: 6%;
+ }
+
+ 100% {
+ bottom: -200px;
+ }
+}
+
+.content {
+ scroll-snap-type: y mandatory;
+}
+
+.snap {
+ scroll-snap-align: top;
+}
+
+
+.scroll-wrapper {
+ color: rgb(221, 221, 221);
+ font-size: 80%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ user-select: none;
+}
+
+.scroll-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ cursor: pointer;
+ padding: 15px;
+ background-color: rgba( 0, 0, 0, 0.2 );
+ border-radius: 30px;
+}
+
+.scroll-symbol {
+ font-size: 180%;
+ animation: scroll-animation infinite 4s ease-in-out;
+}
+
+@keyframes scroll-animation {
+ 0% {
+ opacity: 0;
+ transform: translateY(0);
+ }
+ 10% {
+ opacity: 1;
+ }
+ 65% {
+ opacity: 0.8;
+ }
+ 75% {
+ opacity: 0;
+ transform: translateY(25px);
+ }
+ 100% {
+ opacity: 0;
+ }
+}
\ No newline at end of file
diff --git a/scroll/scroll.js b/scroll/scroll.js
new file mode 100644
index 0000000..4d399c8
--- /dev/null
+++ b/scroll/scroll.js
@@ -0,0 +1,97 @@
+window.scrollHint = ( maxScroll ) => {
+ let isShowing = false;
+ const el = document.getElementById( 'scroll-indicator' );
+ if ( !el ) {
+ throw new Error( 'There is no element with ID "scroll-indicator" present on DOM' );
+ }
+ el.innerHTML = `
+ `;
+
+ el.onclick = () => {
+ if ( window.scrollY === 0 ) {
+ window.scrollTo( { 'top': window.innerHeight, 'behavior': 'smooth' } );
+ } else if ( window.scrollY % window.innerHeight === 0 ) {
+ window.scrollTo( { 'top': ( Math.ceil( window.scrollY / window.innerHeight ) + 1 ) * window.innerHeight, 'behavior': 'smooth' } );
+ } else {
+ window.scrollTo( { 'top': Math.ceil( window.scrollY / window.innerHeight ) * window.innerHeight, 'behavior': 'smooth' } );
+ }
+ el.classList.remove( 'show-scroll' );
+ el.classList.add( 'hide-scroll' );
+ try {
+ clearTimeout( scrollCorrectionTimeout );
+ } catch ( _err ) {};
+ isShowing = false;
+ timeout = setTimeout( () => { showHint() }, 2500 );
+ }
+
+ let lastScrollTimeStamp = new Date().getTime();
+ let scrollInterval = 0;
+ document.onscroll = () => {
+ try {
+ clearTimeout( timeout );
+ } catch ( _e ) {}
+ try {
+ clearTimeout( scrollCorrectionTimeout );
+ } catch ( _err ) {};
+ if ( isShowing ) {
+ isShowing = false;
+ el.classList.remove( 'show-scroll' );
+ el.classList.add( 'hide-scroll' );
+ }
+
+ if ( scrollInterval === 0 ) {
+ scrollInterval = setInterval( () => {
+ if ( lastScrollTimeStamp < new Date().getTime() + 500 ) {
+ scrollCorrectionTimeout = setTimeout( () => {
+ scrollCorrection();
+ }, 1000 );
+ timeout = setTimeout( () => {
+ showHint();
+ }, 2500 );
+ try {
+ clearInterval( scrollInterval );
+ scrollInterval = 0;
+ } catch ( e ) { /* empty */ }
+ }
+ }, 250 );
+ }
+
+ lastScrollTimeStamp = new Date().getTime();
+ };
+
+ window.onresize = () => {
+ scrollCorrection();
+ showHint();
+ }
+
+ let timeout = setTimeout( () => {
+ showHint();
+ }, 2500 );
+
+ let scrollCorrectionTimeout = 0;
+
+ const showHint = () => {
+ if ( Math.round( window.scrollY / window.innerHeight ) < maxScroll && maxScroll > 0 ) {
+ el.classList.remove( 'hide-scroll' );
+ el.classList.add( 'show-scroll' );
+ isShowing = true;
+ } else {
+ el.classList.remove( 'show-scroll' );
+ el.classList.add( 'hide-scroll' );
+ isShowing = false;
+ }
+ }
+
+ const scrollCorrection = () => {
+ if ( Math.round( window.scrollY / window.innerHeight ) <= maxScroll && maxScroll > 0 && Math.floor( window.scrollY / window.innerHeight ) < maxScroll ) {
+ window.scrollTo( { top: Math.round( window.scrollY / window.innerHeight ) * window.innerHeight, behavior: 'smooth' } );
+ }
+ }
+
+ scrollCorrection();
+}
\ No newline at end of file
diff --git a/slider/eslint.config.mjs b/slider/eslint.config.mjs
new file mode 100644
index 0000000..7c511cc
--- /dev/null
+++ b/slider/eslint.config.mjs
@@ -0,0 +1,704 @@
+import vue from 'eslint-plugin-vue';
+import eslint from '@eslint/js';
+import globals from 'globals';
+import typescript from '@typescript-eslint/eslint-plugin';
+import stylistic from '@stylistic/eslint-plugin';
+import tseslint from 'typescript-eslint';
+
+const style = {
+ 'plugins': {
+ '@stylistic': stylistic,
+ '@stylistic/js': stylistic,
+ '@stylistic/ts': stylistic,
+ },
+ 'files': [
+ '**/*.ts',
+ '**/*.js',
+ '**/*.mjs',
+ '**/*.cjs',
+ '**/*.tsx',
+ '**/*.jsx'
+ ],
+ 'rules': {
+ // Formatting
+ '@stylistic/array-bracket-newline': [
+ 'error',
+ {
+ 'multiline': true,
+ 'minItems': 2
+ }
+ ],
+ '@stylistic/array-bracket-spacing': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/array-element-newline': [
+ 'error',
+ {
+ 'multiline': true,
+ 'minItems': 2
+ }
+ ],
+ '@stylistic/arrow-parens': [
+ 'error',
+ 'as-needed'
+ ],
+ '@stylistic/arrow-spacing': [
+ 'error',
+ {
+ 'before': true,
+ 'after': true
+ }
+ ],
+ '@stylistic/block-spacing': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/brace-style': [
+ 'error',
+ '1tbs'
+ ],
+ '@stylistic/comma-spacing': [
+ 'error',
+ {
+ 'before': false,
+ 'after': true
+ }
+ ],
+ '@stylistic/comma-style': [
+ 'error',
+ 'last'
+ ],
+ '@stylistic/dot-location': [
+ 'error',
+ 'property'
+ ],
+ '@stylistic/eol-last': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/function-call-spacing': [
+ 'error',
+ 'never'
+ ],
+ '@stylistic/function-paren-newline': [
+ 'error',
+ {
+ 'minItems': 3
+ }
+ ],
+ '@stylistic/function-call-argument-newline': [
+ 'error',
+ 'consistent'
+ ],
+ '@stylistic/implicit-arrow-linebreak': [
+ 'error',
+ 'beside'
+ ],
+ '@stylistic/indent': [
+ 'error',
+ 4
+ ],
+ '@stylistic/key-spacing': [
+ 'error',
+ {
+ 'beforeColon': false,
+ 'afterColon': true
+ }
+ ],
+ '@stylistic/keyword-spacing': [
+ 'error',
+ {
+ 'before': true,
+ 'after': true
+ }
+ ],
+ '@stylistic/lines-between-class-members': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/max-len': [
+ 'warn',
+ {
+ 'code': 120,
+ 'comments': 140,
+ 'ignoreComments': false,
+ 'ignoreUrls': true,
+ 'ignoreStrings': false
+ }
+ ],
+ '@stylistic/new-parens': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/newline-per-chained-call': [ 'error' ],
+ '@stylistic/no-extra-parens': [
+ 'error',
+ 'all',
+ {
+ 'nestedBinaryExpressions': false,
+ 'ternaryOperandBinaryExpressions': false,
+ 'ignoreJSX': 'multi-line',
+ 'nestedConditionalExpressions': false
+ }
+ ],
+ '@stylistic/no-extra-semi': 'error',
+ '@stylistic/no-floating-decimal': 'error',
+ '@stylistic/no-mixed-operators': 'error',
+ '@stylistic/no-mixed-spaces-and-tabs': 'error',
+ '@stylistic/no-multi-spaces': 'error',
+ '@stylistic/no-multiple-empty-lines': [
+ 'error',
+ {
+ 'max': 3,
+ 'maxEOF': 2
+ }
+ ],
+ '@stylistic/no-tabs': 'error',
+ '@stylistic/no-trailing-spaces': 'error',
+ '@stylistic/no-whitespace-before-property': 'error',
+ '@stylistic/object-curly-newline': [
+ 'error',
+ {
+ 'multiline': true,
+ 'minProperties': 1
+ }
+ ],
+ '@stylistic/object-curly-spacing': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/object-property-newline': 'error',
+ '@stylistic/operator-linebreak': [
+ 'error',
+ 'before'
+ ],
+ '@stylistic/one-var-declaration-per-line': 'error',
+ '@stylistic/padded-blocks': [
+ 'error',
+ {
+ 'blocks': 'never',
+ 'classes': 'always',
+ 'switches': 'never',
+ }
+ ],
+
+ // Padding lines. The most in-depth part of this config
+ '@stylistic/padding-line-between-statements': [
+ 'error',
+ // Variables, Constants
+ {
+ 'blankLine': 'never',
+ 'prev': 'var',
+ 'next': 'var'
+ },
+ {
+ 'blankLine': 'never',
+ 'prev': 'let',
+ 'next': 'let'
+ },
+ {
+ 'blankLine': 'never',
+ 'prev': 'const',
+ 'next': 'const'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'var',
+ 'next': [
+ 'block',
+ 'block-like',
+ 'break',
+ 'cjs-export',
+ 'cjs-import',
+ 'class',
+ 'const',
+ 'continue',
+ 'debugger',
+ 'directive',
+ 'do',
+ 'empty',
+ 'export',
+ 'expression',
+ 'for',
+ 'function',
+ 'if',
+ 'iife',
+ 'import',
+ 'let',
+ 'return',
+ 'switch',
+ 'throw',
+ 'try',
+ 'var',
+ 'with'
+ ]
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'let',
+ 'next': [
+ 'block',
+ 'block-like',
+ 'break',
+ 'cjs-export',
+ 'cjs-import',
+ 'class',
+ 'const',
+ 'continue',
+ 'debugger',
+ 'directive',
+ 'do',
+ 'empty',
+ 'export',
+ 'expression',
+ 'for',
+ 'function',
+ 'if',
+ 'iife',
+ 'import',
+ 'return',
+ 'switch',
+ 'throw',
+ 'try',
+ 'var',
+ 'while',
+ 'with'
+ ]
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'const',
+ 'next': [
+ 'block',
+ 'block-like',
+ 'break',
+ 'cjs-export',
+ 'cjs-import',
+ 'class',
+ 'continue',
+ 'debugger',
+ 'directive',
+ 'do',
+ 'empty',
+ 'export',
+ 'expression',
+ 'for',
+ 'function',
+ 'if',
+ 'iife',
+ 'import',
+ 'let',
+ 'return',
+ 'switch',
+ 'throw',
+ 'try',
+ 'var',
+ 'while',
+ 'with'
+ ]
+ },
+ // Import
+ {
+ 'blankLine': 'never',
+ 'prev': 'import',
+ 'next': 'import'
+ },
+ {
+ 'blankLine': 'never',
+ 'prev': 'cjs-import',
+ 'next': 'cjs-import'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': [
+ 'block',
+ 'block-like',
+ 'break',
+ 'cjs-export',
+ 'class',
+ 'const',
+ 'continue',
+ 'debugger',
+ 'directive',
+ 'do',
+ 'empty',
+ 'export',
+ 'expression',
+ 'for',
+ 'function',
+ 'if',
+ 'iife',
+ 'let',
+ 'return',
+ 'switch',
+ 'throw',
+ 'try',
+ 'var',
+ 'while',
+ 'with'
+ ],
+ 'next': 'cjs-import'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'cjs-import',
+ 'next': [
+ 'block',
+ 'block-like',
+ 'break',
+ 'cjs-export',
+ 'class',
+ 'const',
+ 'continue',
+ 'debugger',
+ 'directive',
+ 'do',
+ 'empty',
+ 'export',
+ 'expression',
+ 'for',
+ 'function',
+ 'if',
+ 'iife',
+ 'let',
+ 'return',
+ 'switch',
+ 'throw',
+ 'try',
+ 'var',
+ 'while',
+ 'with'
+ ]
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': [
+ 'block',
+ 'block-like',
+ 'break',
+ 'cjs-export',
+ 'class',
+ 'const',
+ 'continue',
+ 'debugger',
+ 'directive',
+ 'do',
+ 'empty',
+ 'export',
+ 'expression',
+ 'for',
+ 'function',
+ 'if',
+ 'iife',
+ 'let',
+ 'return',
+ 'switch',
+ 'throw',
+ 'try',
+ 'var',
+ 'while',
+ 'with'
+ ],
+ 'next': 'import'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'import',
+ 'next': [
+ 'block',
+ 'block-like',
+ 'break',
+ 'cjs-export',
+ 'class',
+ 'const',
+ 'continue',
+ 'debugger',
+ 'directive',
+ 'do',
+ 'empty',
+ 'export',
+ 'expression',
+ 'for',
+ 'function',
+ 'if',
+ 'iife',
+ 'let',
+ 'return',
+ 'switch',
+ 'throw',
+ 'try',
+ 'var',
+ 'while',
+ 'with'
+ ]
+ },
+ // If
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'if'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'if',
+ 'next': '*'
+ },
+ // For
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'for'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'for',
+ 'next': '*'
+ },
+ // While
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'while'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'while',
+ 'next': '*'
+ },
+ // Functions
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'function'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'function',
+ 'next': '*'
+ },
+ // Block Statements
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'block-like'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'block-like',
+ 'next': '*'
+ },
+ // Switch
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'switch'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'switch',
+ 'next': '*'
+ },
+ // Try-Catch
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'try'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'try',
+ 'next': '*'
+ },
+ // Throw
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'throw'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'throw',
+ 'next': '*'
+ },
+ // Return
+ {
+ 'blankLine': 'never',
+ 'prev': 'return',
+ 'next': '*'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'return'
+ },
+ // Export
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'export'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'export',
+ 'next': '*'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'cjs-export'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'cjs-export',
+ 'next': '*'
+ },
+ // Classes
+ {
+ 'blankLine': 'always',
+ 'prev': '*',
+ 'next': 'class'
+ },
+ {
+ 'blankLine': 'always',
+ 'prev': 'class',
+ 'next': '*'
+ },
+ ],
+ '@stylistic/quote-props': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/quotes': [
+ 'error',
+ 'single'
+ ],
+ '@stylistic/rest-spread-spacing': [
+ 'error',
+ 'never'
+ ],
+ '@stylistic/semi': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/semi-spacing': [
+ 'error',
+ {
+ 'before': false,
+ 'after': true
+ }
+ ],
+ '@stylistic/semi-style': [
+ 'error',
+ 'last'
+ ],
+ '@stylistic/space-before-blocks': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/space-before-function-paren': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/space-in-parens': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/space-infix-ops': [
+ 'error',
+ {
+ 'int32Hint': false
+ }
+ ],
+ '@stylistic/space-unary-ops': 'error',
+ '@stylistic/spaced-comment': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/template-curly-spacing': [
+ 'error',
+ 'always'
+ ],
+ '@stylistic/switch-colon-spacing': 'error',
+ '@stylistic/wrap-iife': [
+ 'error',
+ 'inside'
+ ],
+ '@stylistic/wrap-regex': 'error',
+ '@stylistic/ts/type-annotation-spacing': 'error',
+ }
+};
+
+/** @type {import('eslint').Linter.Config} */
+export default tseslint.config(
+ // Base JavaScript rules
+ eslint.configs.recommended,
+ tseslint.configs.recommended,
+ style,
+
+ // Vue support (including TS and JSX inside SFCs)
+ {
+ 'files': [ '**/*.vue' ],
+ 'languageOptions': {
+ 'sourceType': 'module',
+ 'ecmaVersion': 'latest',
+ 'globals': globals.browser,
+ 'parserOptions': {
+ 'parser': tseslint.parser,
+ },
+ },
+ 'plugins': {
+ 'vue': vue,
+ '@stylistic': stylistic,
+ '@stylistic/js': stylistic,
+ '@stylistic/ts': stylistic,
+ '@typescript-eslint': typescript,
+ },
+ 'extends': [
+ eslint.configs.recommended,
+ ...vue.configs['flat/recommended']
+ ],
+ 'rules': {
+ ...typescript.configs.recommended.rules,
+ ...style.rules,
+
+ // Vue specific rules
+ '@stylistic/indent': 'off',
+ 'vue/html-indent': [
+ 'error',
+ 4
+ ],
+ 'vue/html-comment-indent': [
+ 'error',
+ 4
+ ],
+ 'vue/script-indent': [
+ 'error',
+ 4,
+ {
+ 'baseIndent': 1,
+ 'switchCase': 1
+ }
+ ],
+ 'vue/html-self-closing': [
+ 'error',
+ {
+ 'html': {
+ 'void': 'never',
+ 'normal': 'never',
+ 'component': 'always'
+ },
+ 'svg': 'always',
+ 'math': 'never'
+ }
+ ],
+ 'vue/max-attributes-per-line': [
+ 'error',
+ {
+ 'singleline': 3,
+ 'multiline': 1,
+ }
+ ],
+ },
+ },
+);
diff --git a/slider/index.html b/slider/index.html
new file mode 100644
index 0000000..265c5a3
--- /dev/null
+++ b/slider/index.html
@@ -0,0 +1,34 @@
+
+
+
+
+
+ Slider
+
+
+
+
+ Sliders
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/slider/js/slider.js b/slider/js/slider.js
new file mode 100644
index 0000000..443b814
--- /dev/null
+++ b/slider/js/slider.js
@@ -0,0 +1,173 @@
+/* eslint-disable no-var */
+const fetchedElements = document.getElementsByClassName('slider-element');
+const sliderElements = [];
+let okToMove = true;
+let currentSlideIndex = 0;
+const sliderContainer = document.getElementsByClassName('slider-container')[0];
+function sliderGoToIndex(index) {
+ if (okToMove) {
+ if (index < sliderElements.length && index >= 0) {
+ okToMove = false;
+ // Determine next and previous elements
+ let previousElement = 0;
+ let nextElement = 0;
+ let beforePreviousElement = 0;
+ if (index < sliderElements.length - 1) {
+ nextElement = index + 1;
+ }
+ else {
+ nextElement = 0;
+ }
+ if (index === 0) {
+ previousElement = sliderElements.length - 1;
+ }
+ else {
+ previousElement = index - 1;
+ }
+ if (index === 0) {
+ beforePreviousElement = sliderElements.length - 2;
+ }
+ else if (index === 1) {
+ beforePreviousElement = sliderElements.length - 1;
+ }
+ else {
+ beforePreviousElement = index - 2;
+ }
+ // Determine move direction:
+ // true = next, false = previous
+ let moveDirection = true;
+ if ((index < currentSlideIndex || (index === sliderElements.length - 1 && currentSlideIndex === 0))
+ && !(index === 0 && currentSlideIndex === sliderElements.length - 1)) {
+ moveDirection = false;
+ }
+ /*
+ Add correct classes to all elements
+ */
+ // New current element
+ sliderElements[index].classList.add('current');
+ sliderElements[index].classList.remove('next');
+ sliderElements[index].classList.remove('last');
+ sliderElements[index].classList.remove('past');
+ // New next element
+ if (moveDirection) {
+ sliderElements[nextElement].classList.add('future');
+ }
+ else {
+ sliderElements[nextElement].classList.add('next');
+ }
+ sliderElements[nextElement].classList.remove('current');
+ sliderElements[nextElement].classList.remove('past');
+ sliderElements[nextElement].classList.remove('last');
+ // new past element
+ sliderElements[previousElement].classList.add('last');
+ sliderElements[previousElement].classList.remove('current');
+ sliderElements[previousElement].classList.remove('past');
+ sliderElements[previousElement].classList.remove('next');
+ sliderElements[beforePreviousElement].classList.add('past');
+ sliderElements[beforePreviousElement].classList.remove('last');
+ sliderElements[beforePreviousElement].classList.remove('next');
+ sliderElements[beforePreviousElement].classList.remove('current');
+ // Glitch fixes
+ setTimeout(() => {
+ if (moveDirection) {
+ sliderElements[nextElement].classList.add('next');
+ sliderElements[nextElement].classList.remove('future');
+ }
+ currentSlideIndex = index;
+ setTimeout(() => {
+ okToMove = true;
+ }, 500);
+ }, 1000);
+ }
+ else if (index < 0) {
+ sliderGoToIndex(sliderElements.length - 1);
+ }
+ else {
+ sliderGoToIndex(0);
+ }
+ }
+}
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+var sliderControl = (action) => {
+ if (action === 'next') {
+ sliderGoToIndex(currentSlideIndex + 1);
+ }
+ else if (action === 'previous') {
+ sliderGoToIndex(currentSlideIndex - 1);
+ }
+ sliderAutoAdvance();
+};
+let sliderAutoAdvanceInterval = 0;
+let sliderInterval = 0;
+/**
+ * Set up the slider and give it an interval for auto advancing
+ * @param interval - The interval at which to auto advance
+ * @param name - The name of the platform (like desktop, used to load different images)
+ */
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+var activateSlider = (interval, name) => {
+ sliderAutoAdvanceInterval = interval;
+ sliderContainer.addEventListener('mouseenter', () => {
+ stopSliderAutoAdvance();
+ });
+ sliderContainer.addEventListener('mouseleave', () => {
+ sliderAutoAdvance();
+ });
+ document.addEventListener('blur', () => {
+ stopSliderAutoAdvance();
+ });
+ window.addEventListener('focus', () => {
+ sliderAutoAdvance();
+ });
+ sliderAutoAdvance();
+ loadImageType(name);
+};
+const sliderAutoAdvance = () => {
+ if (sliderAutoAdvanceInterval > 0) {
+ stopSliderAutoAdvance();
+ sliderInterval = setInterval(() => {
+ sliderGoToIndex(currentSlideIndex + 1);
+ }, sliderAutoAdvanceInterval);
+ }
+};
+const stopSliderAutoAdvance = () => {
+ try {
+ clearInterval(sliderInterval);
+ }
+ catch (e) {
+ console.debug(e);
+ }
+};
+const allowedExtensions = [
+ 'webp',
+ 'jpg',
+ 'jpeg',
+ 'svg',
+ 'png'
+];
+/**
+ * Load type of image, can be used to load images for different platforms (i.e. mobile optimization)
+ * @param name - The name appended to the image filename
+ */
+var loadImageType = (name) => {
+ sliderElements.forEach(el => {
+ const baseURL = el.dataset.imageBaseURL;
+ const filetype = el.dataset.filetype;
+ // TODO: Verification (i.e. baseURL cannot contain .something in the end, filetype may only be jpg, jpeg, webp, svg or png)
+ if (allowedExtensions.indexOf(filetype) === -1) {
+ console.warn('[ SLIDER ] Invalid filetype ' + filetype + ' for image element with id ' + el.id);
+ return;
+ }
+ if (baseURL.lastIndexOf('.') > baseURL.lastIndexOf('/')) {
+ console.warn('[ SLIDER ] ImageBaseURL incorrect for image element with id ' + el.id);
+ return;
+ }
+ el.style.setProperty('background-image', baseURL + name + filetype);
+ });
+};
+for (const el in fetchedElements) {
+ if (fetchedElements[el].className) {
+ sliderElements.push(fetchedElements[el]);
+ }
+}
+sliderGoToIndex(0);
diff --git a/slider/node_modules/.bin/acorn b/slider/node_modules/.bin/acorn
new file mode 120000
index 0000000..d2e62b1
--- /dev/null
+++ b/slider/node_modules/.bin/acorn
@@ -0,0 +1 @@
+../acorn/bin/acorn
\ No newline at end of file
diff --git a/slider/node_modules/.bin/cssesc b/slider/node_modules/.bin/cssesc
new file mode 120000
index 0000000..c88b1b1
--- /dev/null
+++ b/slider/node_modules/.bin/cssesc
@@ -0,0 +1 @@
+../cssesc/bin/cssesc
\ No newline at end of file
diff --git a/slider/node_modules/.bin/eslint b/slider/node_modules/.bin/eslint
new file mode 120000
index 0000000..7802727
--- /dev/null
+++ b/slider/node_modules/.bin/eslint
@@ -0,0 +1 @@
+../eslint/bin/eslint.js
\ No newline at end of file
diff --git a/slider/node_modules/.bin/js-yaml b/slider/node_modules/.bin/js-yaml
new file mode 120000
index 0000000..4eced6c
--- /dev/null
+++ b/slider/node_modules/.bin/js-yaml
@@ -0,0 +1 @@
+../js-yaml/bin/js-yaml.js
\ No newline at end of file
diff --git a/slider/node_modules/.bin/node-which b/slider/node_modules/.bin/node-which
new file mode 120000
index 0000000..fc120cb
--- /dev/null
+++ b/slider/node_modules/.bin/node-which
@@ -0,0 +1 @@
+../which/bin/node-which
\ No newline at end of file
diff --git a/slider/node_modules/.bin/semver b/slider/node_modules/.bin/semver
new file mode 120000
index 0000000..b3c9fa7
--- /dev/null
+++ b/slider/node_modules/.bin/semver
@@ -0,0 +1 @@
+../semver/bin/semver.js
\ No newline at end of file
diff --git a/slider/node_modules/.bin/tsc b/slider/node_modules/.bin/tsc
new file mode 120000
index 0000000..43e75c1
--- /dev/null
+++ b/slider/node_modules/.bin/tsc
@@ -0,0 +1 @@
+../typescript/bin/tsc
\ No newline at end of file
diff --git a/slider/node_modules/.bin/tsserver b/slider/node_modules/.bin/tsserver
new file mode 120000
index 0000000..27fcd4a
--- /dev/null
+++ b/slider/node_modules/.bin/tsserver
@@ -0,0 +1 @@
+../typescript/bin/tsserver
\ No newline at end of file
diff --git a/slider/node_modules/.package-lock.json b/slider/node_modules/.package-lock.json
new file mode 100644
index 0000000..52ae2c7
--- /dev/null
+++ b/slider/node_modules/.package-lock.json
@@ -0,0 +1,1837 @@
+{
+ "name": "slider",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+ "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.6",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz",
+ "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
+ "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.36.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz",
+ "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
+ "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@eslint/core": "^0.15.2",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@stylistic/eslint-plugin": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.4.0.tgz",
+ "integrity": "sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.0",
+ "@typescript-eslint/types": "^8.44.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "estraverse": "^5.3.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=9.0.0"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.44.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz",
+ "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.44.1",
+ "@typescript-eslint/type-utils": "8.44.1",
+ "@typescript-eslint/utils": "8.44.1",
+ "@typescript-eslint/visitor-keys": "8.44.1",
+ "graphemer": "^1.4.0",
+ "ignore": "^7.0.0",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.44.1",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.44.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz",
+ "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.44.1",
+ "@typescript-eslint/types": "8.44.1",
+ "@typescript-eslint/typescript-estree": "8.44.1",
+ "@typescript-eslint/visitor-keys": "8.44.1",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.44.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz",
+ "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.44.1",
+ "@typescript-eslint/types": "^8.44.1",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.44.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz",
+ "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.44.1",
+ "@typescript-eslint/visitor-keys": "8.44.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.44.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz",
+ "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.44.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz",
+ "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.44.1",
+ "@typescript-eslint/typescript-estree": "8.44.1",
+ "@typescript-eslint/utils": "8.44.1",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.44.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz",
+ "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.44.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz",
+ "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.44.1",
+ "@typescript-eslint/tsconfig-utils": "8.44.1",
+ "@typescript-eslint/types": "8.44.1",
+ "@typescript-eslint/visitor-keys": "8.44.1",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.44.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz",
+ "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.44.1",
+ "@typescript-eslint/types": "8.44.1",
+ "@typescript-eslint/typescript-estree": "8.44.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.44.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz",
+ "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.44.1",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "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,
+ "license": "Python-2.0",
+ "peer": true
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.36.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz",
+ "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.0",
+ "@eslint/config-helpers": "^0.3.1",
+ "@eslint/core": "^0.15.2",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.36.0",
+ "@eslint/plugin-kit": "^0.3.5",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-vue": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.5.0.tgz",
+ "integrity": "sha512-7BZHsG3kC2vei8F2W8hnfDi9RK+cv5eKPMvzBdrl8Vuc0hR5odGQRli8VVzUkrmUHkxFEm4Iio1r5HOKslO0Aw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.1.1",
+ "postcss-selector-parser": "^6.0.15",
+ "semver": "^7.6.3",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0",
+ "@typescript-eslint/parser": "^7.0.0 || ^8.0.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "vue-eslint-parser": "^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@stylistic/eslint-plugin": {
+ "optional": true
+ },
+ "@typescript-eslint/parser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "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.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/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,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": 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,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": 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"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "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"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.5.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+ "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.44.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.1.tgz",
+ "integrity": "sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.44.1",
+ "@typescript-eslint/parser": "8.44.1",
+ "@typescript-eslint/typescript-estree": "8.44.1",
+ "@typescript-eslint/utils": "8.44.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vue-eslint-parser": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz",
+ "integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "debug": "^4.4.0",
+ "eslint-scope": "^8.2.0",
+ "eslint-visitor-keys": "^4.2.0",
+ "espree": "^10.3.0",
+ "esquery": "^1.6.0",
+ "semver": "^7.6.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/slider/node_modules/@eslint-community/eslint-utils/LICENSE b/slider/node_modules/@eslint-community/eslint-utils/LICENSE
new file mode 100644
index 0000000..d77398f
--- /dev/null
+++ b/slider/node_modules/@eslint-community/eslint-utils/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Toru Nagashima
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/slider/node_modules/@eslint-community/eslint-utils/README.md b/slider/node_modules/@eslint-community/eslint-utils/README.md
new file mode 100644
index 0000000..53e146a
--- /dev/null
+++ b/slider/node_modules/@eslint-community/eslint-utils/README.md
@@ -0,0 +1,37 @@
+# @eslint-community/eslint-utils
+
+[](https://www.npmjs.com/package/@eslint-community/eslint-utils)
+[](http://www.npmtrends.com/@eslint-community/eslint-utils)
+[](https://github.com/eslint-community/eslint-utils/actions)
+[](https://codecov.io/gh/eslint-community/eslint-utils)
+
+## 🏁 Goal
+
+This package provides utility functions and classes for make ESLint custom rules.
+
+For examples:
+
+- [`getStaticValue`](https://eslint-community.github.io/eslint-utils/api/ast-utils.html#getstaticvalue) evaluates static value on AST.
+- [`ReferenceTracker`](https://eslint-community.github.io/eslint-utils/api/scope-utils.html#referencetracker-class) checks the members of modules/globals as handling assignments and destructuring.
+
+## 📖 Usage
+
+See [documentation](https://eslint-community.github.io/eslint-utils).
+
+## 📰 Changelog
+
+See [releases](https://github.com/eslint-community/eslint-utils/releases).
+
+## ❤️ Contributing
+
+Welcome contributing!
+
+Please use GitHub's Issues/PRs.
+
+### Development Tools
+
+- `npm run test-coverage` runs tests and measures coverage.
+- `npm run clean` removes the coverage result of `npm run test-coverage` command.
+- `npm run coverage` shows the coverage result of the last `npm run test-coverage` command.
+- `npm run lint` runs ESLint.
+- `npm run watch` runs tests on each file change.
diff --git a/slider/node_modules/@eslint-community/eslint-utils/index.d.mts b/slider/node_modules/@eslint-community/eslint-utils/index.d.mts
new file mode 100644
index 0000000..700f72b
--- /dev/null
+++ b/slider/node_modules/@eslint-community/eslint-utils/index.d.mts
@@ -0,0 +1,217 @@
+import * as eslint from 'eslint';
+import { Rule, AST } from 'eslint';
+import * as estree from 'estree';
+
+declare const READ: unique symbol;
+declare const CALL: unique symbol;
+declare const CONSTRUCT: unique symbol;
+declare const ESM: unique symbol;
+declare class ReferenceTracker {
+ constructor(globalScope: Scope$2, options?: {
+ mode?: "legacy" | "strict" | undefined;
+ globalObjectNames?: string[] | undefined;
+ } | undefined);
+ private variableStack;
+ private globalScope;
+ private mode;
+ private globalObjectNames;
+ iterateGlobalReferences(traceMap: TraceMap$2): IterableIterator>;
+ iterateCjsReferences(traceMap: TraceMap$2): IterableIterator>;
+ iterateEsmReferences(traceMap: TraceMap$2): IterableIterator>;
+ iteratePropertyReferences(node: Expression, traceMap: TraceMap$2): IterableIterator>;
+ private _iterateVariableReferences;
+ private _iteratePropertyReferences;
+ private _iterateLhsReferences;
+ private _iterateImportReferences;
+}
+declare namespace ReferenceTracker {
+ export { READ };
+ export { CALL };
+ export { CONSTRUCT };
+ export { ESM };
+}
+type Scope$2 = eslint.Scope.Scope;
+type Expression = estree.Expression;
+type TraceMap$2 = TraceMap$1;
+type TrackedReferences$2 = TrackedReferences$1;
+
+type StaticValue$2 = StaticValueProvided$1 | StaticValueOptional$1;
+type StaticValueProvided$1 = {
+ optional?: undefined;
+ value: unknown;
+};
+type StaticValueOptional$1 = {
+ optional?: true;
+ value: undefined;
+};
+type ReferenceTrackerOptions$1 = {
+ globalObjectNames?: string[];
+ mode?: "legacy" | "strict";
+};
+type TraceMap$1 = {
+ [i: string]: TraceMapObject;
+};
+type TraceMapObject = {
+ [i: string]: TraceMapObject;
+ [CALL]?: T;
+ [CONSTRUCT]?: T;
+ [READ]?: T;
+ [ESM]?: boolean;
+};
+type TrackedReferences$1 = {
+ info: T;
+ node: Rule.Node;
+ path: string[];
+ type: typeof CALL | typeof CONSTRUCT | typeof READ;
+};
+type HasSideEffectOptions$1 = {
+ considerGetters?: boolean;
+ considerImplicitTypeConversion?: boolean;
+};
+type PunctuatorToken = AST.Token & {
+ type: "Punctuator";
+ value: Value;
+};
+type ArrowToken$1 = PunctuatorToken<"=>">;
+type CommaToken$1 = PunctuatorToken<",">;
+type SemicolonToken$1 = PunctuatorToken<";">;
+type ColonToken$1 = PunctuatorToken<":">;
+type OpeningParenToken$1 = PunctuatorToken<"(">;
+type ClosingParenToken$1 = PunctuatorToken<")">;
+type OpeningBracketToken$1 = PunctuatorToken<"[">;
+type ClosingBracketToken$1 = PunctuatorToken<"]">;
+type OpeningBraceToken$1 = PunctuatorToken<"{">;
+type ClosingBraceToken$1 = PunctuatorToken<"}">;
+
+declare function findVariable(initialScope: Scope$1, nameOrNode: string | Identifier): Variable | null;
+type Scope$1 = eslint.Scope.Scope;
+type Variable = eslint.Scope.Variable;
+type Identifier = estree.Identifier;
+
+declare function getFunctionHeadLocation(node: FunctionNode$1, sourceCode: SourceCode$2): SourceLocation | null;
+type SourceCode$2 = eslint.SourceCode;
+type FunctionNode$1 = estree.Function;
+type SourceLocation = estree.SourceLocation;
+
+declare function getFunctionNameWithKind(node: FunctionNode, sourceCode?: eslint.SourceCode | undefined): string;
+type FunctionNode = estree.Function;
+
+declare function getInnermostScope(initialScope: Scope, node: Node$4): Scope;
+type Scope = eslint.Scope.Scope;
+type Node$4 = estree.Node;
+
+declare function getPropertyName(node: MemberExpression | MethodDefinition | Property | PropertyDefinition, initialScope?: eslint.Scope.Scope | undefined): string | null | undefined;
+type MemberExpression = estree.MemberExpression;
+type MethodDefinition = estree.MethodDefinition;
+type Property = estree.Property;
+type PropertyDefinition = estree.PropertyDefinition;
+
+declare function getStaticValue(node: Node$3, initialScope?: eslint.Scope.Scope | null | undefined): StaticValue$1 | null;
+type StaticValue$1 = StaticValue$2;
+type Node$3 = estree.Node;
+
+declare function getStringIfConstant(node: Node$2, initialScope?: eslint.Scope.Scope | null | undefined): string | null;
+type Node$2 = estree.Node;
+
+declare function hasSideEffect(node: Node$1, sourceCode: SourceCode$1, options?: HasSideEffectOptions$1 | undefined): boolean;
+type Node$1 = estree.Node;
+type SourceCode$1 = eslint.SourceCode;
+
+declare function isArrowToken(token: CommentOrToken): token is ArrowToken$1;
+declare function isCommaToken(token: CommentOrToken): token is CommaToken$1;
+declare function isSemicolonToken(token: CommentOrToken): token is SemicolonToken$1;
+declare function isColonToken(token: CommentOrToken): token is ColonToken$1;
+declare function isOpeningParenToken(token: CommentOrToken): token is OpeningParenToken$1;
+declare function isClosingParenToken(token: CommentOrToken): token is ClosingParenToken$1;
+declare function isOpeningBracketToken(token: CommentOrToken): token is OpeningBracketToken$1;
+declare function isClosingBracketToken(token: CommentOrToken): token is ClosingBracketToken$1;
+declare function isOpeningBraceToken(token: CommentOrToken): token is OpeningBraceToken$1;
+declare function isClosingBraceToken(token: CommentOrToken): token is ClosingBraceToken$1;
+declare function isCommentToken(token: CommentOrToken): token is estree.Comment;
+declare function isNotArrowToken(arg0: CommentOrToken): boolean;
+declare function isNotCommaToken(arg0: CommentOrToken): boolean;
+declare function isNotSemicolonToken(arg0: CommentOrToken): boolean;
+declare function isNotColonToken(arg0: CommentOrToken): boolean;
+declare function isNotOpeningParenToken(arg0: CommentOrToken): boolean;
+declare function isNotClosingParenToken(arg0: CommentOrToken): boolean;
+declare function isNotOpeningBracketToken(arg0: CommentOrToken): boolean;
+declare function isNotClosingBracketToken(arg0: CommentOrToken): boolean;
+declare function isNotOpeningBraceToken(arg0: CommentOrToken): boolean;
+declare function isNotClosingBraceToken(arg0: CommentOrToken): boolean;
+declare function isNotCommentToken(arg0: CommentOrToken): boolean;
+type Token = eslint.AST.Token;
+type Comment = estree.Comment;
+type CommentOrToken = Comment | Token;
+
+declare function isParenthesized(timesOrNode: Node | number, nodeOrSourceCode: Node | SourceCode, optionalSourceCode?: eslint.SourceCode | undefined): boolean;
+type Node = estree.Node;
+type SourceCode = eslint.SourceCode;
+
+declare class PatternMatcher {
+ constructor(pattern: RegExp, options?: {
+ escaped?: boolean | undefined;
+ } | undefined);
+ execAll(str: string): IterableIterator;
+ test(str: string): boolean;
+ [Symbol.replace](str: string, replacer: string | ((...strs: string[]) => string)): string;
+}
+
+declare namespace _default {
+ export { CALL };
+ export { CONSTRUCT };
+ export { ESM };
+ export { findVariable };
+ export { getFunctionHeadLocation };
+ export { getFunctionNameWithKind };
+ export { getInnermostScope };
+ export { getPropertyName };
+ export { getStaticValue };
+ export { getStringIfConstant };
+ export { hasSideEffect };
+ export { isArrowToken };
+ export { isClosingBraceToken };
+ export { isClosingBracketToken };
+ export { isClosingParenToken };
+ export { isColonToken };
+ export { isCommaToken };
+ export { isCommentToken };
+ export { isNotArrowToken };
+ export { isNotClosingBraceToken };
+ export { isNotClosingBracketToken };
+ export { isNotClosingParenToken };
+ export { isNotColonToken };
+ export { isNotCommaToken };
+ export { isNotCommentToken };
+ export { isNotOpeningBraceToken };
+ export { isNotOpeningBracketToken };
+ export { isNotOpeningParenToken };
+ export { isNotSemicolonToken };
+ export { isOpeningBraceToken };
+ export { isOpeningBracketToken };
+ export { isOpeningParenToken };
+ export { isParenthesized };
+ export { isSemicolonToken };
+ export { PatternMatcher };
+ export { READ };
+ export { ReferenceTracker };
+}
+
+type StaticValue = StaticValue$2;
+type StaticValueOptional = StaticValueOptional$1;
+type StaticValueProvided = StaticValueProvided$1;
+type ReferenceTrackerOptions = ReferenceTrackerOptions$1;
+type TraceMap = TraceMap$1;
+type TrackedReferences = TrackedReferences$1;
+type HasSideEffectOptions = HasSideEffectOptions$1;
+type ArrowToken = ArrowToken$1;
+type CommaToken = CommaToken$1;
+type SemicolonToken = SemicolonToken$1;
+type ColonToken = ColonToken$1;
+type OpeningParenToken = OpeningParenToken$1;
+type ClosingParenToken = ClosingParenToken$1;
+type OpeningBracketToken = OpeningBracketToken$1;
+type ClosingBracketToken = ClosingBracketToken$1;
+type OpeningBraceToken = OpeningBraceToken$1;
+type ClosingBraceToken = ClosingBraceToken$1;
+
+export { ArrowToken, CALL, CONSTRUCT, ClosingBraceToken, ClosingBracketToken, ClosingParenToken, ColonToken, CommaToken, ESM, HasSideEffectOptions, OpeningBraceToken, OpeningBracketToken, OpeningParenToken, PatternMatcher, READ, ReferenceTracker, ReferenceTrackerOptions, SemicolonToken, StaticValue, StaticValueOptional, StaticValueProvided, TraceMap, TrackedReferences, _default as default, findVariable, getFunctionHeadLocation, getFunctionNameWithKind, getInnermostScope, getPropertyName, getStaticValue, getStringIfConstant, hasSideEffect, isArrowToken, isClosingBraceToken, isClosingBracketToken, isClosingParenToken, isColonToken, isCommaToken, isCommentToken, isNotArrowToken, isNotClosingBraceToken, isNotClosingBracketToken, isNotClosingParenToken, isNotColonToken, isNotCommaToken, isNotCommentToken, isNotOpeningBraceToken, isNotOpeningBracketToken, isNotOpeningParenToken, isNotSemicolonToken, isOpeningBraceToken, isOpeningBracketToken, isOpeningParenToken, isParenthesized, isSemicolonToken };
diff --git a/slider/node_modules/@eslint-community/eslint-utils/index.d.ts b/slider/node_modules/@eslint-community/eslint-utils/index.d.ts
new file mode 100644
index 0000000..700f72b
--- /dev/null
+++ b/slider/node_modules/@eslint-community/eslint-utils/index.d.ts
@@ -0,0 +1,217 @@
+import * as eslint from 'eslint';
+import { Rule, AST } from 'eslint';
+import * as estree from 'estree';
+
+declare const READ: unique symbol;
+declare const CALL: unique symbol;
+declare const CONSTRUCT: unique symbol;
+declare const ESM: unique symbol;
+declare class ReferenceTracker {
+ constructor(globalScope: Scope$2, options?: {
+ mode?: "legacy" | "strict" | undefined;
+ globalObjectNames?: string[] | undefined;
+ } | undefined);
+ private variableStack;
+ private globalScope;
+ private mode;
+ private globalObjectNames;
+ iterateGlobalReferences(traceMap: TraceMap$2): IterableIterator>;
+ iterateCjsReferences(traceMap: TraceMap$2): IterableIterator>;
+ iterateEsmReferences(traceMap: TraceMap$2): IterableIterator>;
+ iteratePropertyReferences(node: Expression, traceMap: TraceMap$2): IterableIterator>;
+ private _iterateVariableReferences;
+ private _iteratePropertyReferences;
+ private _iterateLhsReferences;
+ private _iterateImportReferences;
+}
+declare namespace ReferenceTracker {
+ export { READ };
+ export { CALL };
+ export { CONSTRUCT };
+ export { ESM };
+}
+type Scope$2 = eslint.Scope.Scope;
+type Expression = estree.Expression;
+type TraceMap$2 = TraceMap$1;
+type TrackedReferences$2 = TrackedReferences$1;
+
+type StaticValue$2 = StaticValueProvided$1 | StaticValueOptional$1;
+type StaticValueProvided$1 = {
+ optional?: undefined;
+ value: unknown;
+};
+type StaticValueOptional$1 = {
+ optional?: true;
+ value: undefined;
+};
+type ReferenceTrackerOptions$1 = {
+ globalObjectNames?: string[];
+ mode?: "legacy" | "strict";
+};
+type TraceMap$1 = {
+ [i: string]: TraceMapObject;
+};
+type TraceMapObject = {
+ [i: string]: TraceMapObject;
+ [CALL]?: T;
+ [CONSTRUCT]?: T;
+ [READ]?: T;
+ [ESM]?: boolean;
+};
+type TrackedReferences$1 = {
+ info: T;
+ node: Rule.Node;
+ path: string[];
+ type: typeof CALL | typeof CONSTRUCT | typeof READ;
+};
+type HasSideEffectOptions$1 = {
+ considerGetters?: boolean;
+ considerImplicitTypeConversion?: boolean;
+};
+type PunctuatorToken = AST.Token & {
+ type: "Punctuator";
+ value: Value;
+};
+type ArrowToken$1 = PunctuatorToken<"=>">;
+type CommaToken$1 = PunctuatorToken<",">;
+type SemicolonToken$1 = PunctuatorToken<";">;
+type ColonToken$1 = PunctuatorToken<":">;
+type OpeningParenToken$1 = PunctuatorToken<"(">;
+type ClosingParenToken$1 = PunctuatorToken<")">;
+type OpeningBracketToken$1 = PunctuatorToken<"[">;
+type ClosingBracketToken$1 = PunctuatorToken<"]">;
+type OpeningBraceToken$1 = PunctuatorToken<"{">;
+type ClosingBraceToken$1 = PunctuatorToken<"}">;
+
+declare function findVariable(initialScope: Scope$1, nameOrNode: string | Identifier): Variable | null;
+type Scope$1 = eslint.Scope.Scope;
+type Variable = eslint.Scope.Variable;
+type Identifier = estree.Identifier;
+
+declare function getFunctionHeadLocation(node: FunctionNode$1, sourceCode: SourceCode$2): SourceLocation | null;
+type SourceCode$2 = eslint.SourceCode;
+type FunctionNode$1 = estree.Function;
+type SourceLocation = estree.SourceLocation;
+
+declare function getFunctionNameWithKind(node: FunctionNode, sourceCode?: eslint.SourceCode | undefined): string;
+type FunctionNode = estree.Function;
+
+declare function getInnermostScope(initialScope: Scope, node: Node$4): Scope;
+type Scope = eslint.Scope.Scope;
+type Node$4 = estree.Node;
+
+declare function getPropertyName(node: MemberExpression | MethodDefinition | Property | PropertyDefinition, initialScope?: eslint.Scope.Scope | undefined): string | null | undefined;
+type MemberExpression = estree.MemberExpression;
+type MethodDefinition = estree.MethodDefinition;
+type Property = estree.Property;
+type PropertyDefinition = estree.PropertyDefinition;
+
+declare function getStaticValue(node: Node$3, initialScope?: eslint.Scope.Scope | null | undefined): StaticValue$1 | null;
+type StaticValue$1 = StaticValue$2;
+type Node$3 = estree.Node;
+
+declare function getStringIfConstant(node: Node$2, initialScope?: eslint.Scope.Scope | null | undefined): string | null;
+type Node$2 = estree.Node;
+
+declare function hasSideEffect(node: Node$1, sourceCode: SourceCode$1, options?: HasSideEffectOptions$1 | undefined): boolean;
+type Node$1 = estree.Node;
+type SourceCode$1 = eslint.SourceCode;
+
+declare function isArrowToken(token: CommentOrToken): token is ArrowToken$1;
+declare function isCommaToken(token: CommentOrToken): token is CommaToken$1;
+declare function isSemicolonToken(token: CommentOrToken): token is SemicolonToken$1;
+declare function isColonToken(token: CommentOrToken): token is ColonToken$1;
+declare function isOpeningParenToken(token: CommentOrToken): token is OpeningParenToken$1;
+declare function isClosingParenToken(token: CommentOrToken): token is ClosingParenToken$1;
+declare function isOpeningBracketToken(token: CommentOrToken): token is OpeningBracketToken$1;
+declare function isClosingBracketToken(token: CommentOrToken): token is ClosingBracketToken$1;
+declare function isOpeningBraceToken(token: CommentOrToken): token is OpeningBraceToken$1;
+declare function isClosingBraceToken(token: CommentOrToken): token is ClosingBraceToken$1;
+declare function isCommentToken(token: CommentOrToken): token is estree.Comment;
+declare function isNotArrowToken(arg0: CommentOrToken): boolean;
+declare function isNotCommaToken(arg0: CommentOrToken): boolean;
+declare function isNotSemicolonToken(arg0: CommentOrToken): boolean;
+declare function isNotColonToken(arg0: CommentOrToken): boolean;
+declare function isNotOpeningParenToken(arg0: CommentOrToken): boolean;
+declare function isNotClosingParenToken(arg0: CommentOrToken): boolean;
+declare function isNotOpeningBracketToken(arg0: CommentOrToken): boolean;
+declare function isNotClosingBracketToken(arg0: CommentOrToken): boolean;
+declare function isNotOpeningBraceToken(arg0: CommentOrToken): boolean;
+declare function isNotClosingBraceToken(arg0: CommentOrToken): boolean;
+declare function isNotCommentToken(arg0: CommentOrToken): boolean;
+type Token = eslint.AST.Token;
+type Comment = estree.Comment;
+type CommentOrToken = Comment | Token;
+
+declare function isParenthesized(timesOrNode: Node | number, nodeOrSourceCode: Node | SourceCode, optionalSourceCode?: eslint.SourceCode | undefined): boolean;
+type Node = estree.Node;
+type SourceCode = eslint.SourceCode;
+
+declare class PatternMatcher {
+ constructor(pattern: RegExp, options?: {
+ escaped?: boolean | undefined;
+ } | undefined);
+ execAll(str: string): IterableIterator;
+ test(str: string): boolean;
+ [Symbol.replace](str: string, replacer: string | ((...strs: string[]) => string)): string;
+}
+
+declare namespace _default {
+ export { CALL };
+ export { CONSTRUCT };
+ export { ESM };
+ export { findVariable };
+ export { getFunctionHeadLocation };
+ export { getFunctionNameWithKind };
+ export { getInnermostScope };
+ export { getPropertyName };
+ export { getStaticValue };
+ export { getStringIfConstant };
+ export { hasSideEffect };
+ export { isArrowToken };
+ export { isClosingBraceToken };
+ export { isClosingBracketToken };
+ export { isClosingParenToken };
+ export { isColonToken };
+ export { isCommaToken };
+ export { isCommentToken };
+ export { isNotArrowToken };
+ export { isNotClosingBraceToken };
+ export { isNotClosingBracketToken };
+ export { isNotClosingParenToken };
+ export { isNotColonToken };
+ export { isNotCommaToken };
+ export { isNotCommentToken };
+ export { isNotOpeningBraceToken };
+ export { isNotOpeningBracketToken };
+ export { isNotOpeningParenToken };
+ export { isNotSemicolonToken };
+ export { isOpeningBraceToken };
+ export { isOpeningBracketToken };
+ export { isOpeningParenToken };
+ export { isParenthesized };
+ export { isSemicolonToken };
+ export { PatternMatcher };
+ export { READ };
+ export { ReferenceTracker };
+}
+
+type StaticValue = StaticValue$2;
+type StaticValueOptional = StaticValueOptional$1;
+type StaticValueProvided = StaticValueProvided$1;
+type ReferenceTrackerOptions = ReferenceTrackerOptions$1;
+type TraceMap = TraceMap$1;
+type TrackedReferences = TrackedReferences$1;
+type HasSideEffectOptions = HasSideEffectOptions$1;
+type ArrowToken = ArrowToken$1;
+type CommaToken = CommaToken$1;
+type SemicolonToken = SemicolonToken$1;
+type ColonToken = ColonToken$1;
+type OpeningParenToken = OpeningParenToken$1;
+type ClosingParenToken = ClosingParenToken$1;
+type OpeningBracketToken = OpeningBracketToken$1;
+type ClosingBracketToken = ClosingBracketToken$1;
+type OpeningBraceToken = OpeningBraceToken$1;
+type ClosingBraceToken = ClosingBraceToken$1;
+
+export { ArrowToken, CALL, CONSTRUCT, ClosingBraceToken, ClosingBracketToken, ClosingParenToken, ColonToken, CommaToken, ESM, HasSideEffectOptions, OpeningBraceToken, OpeningBracketToken, OpeningParenToken, PatternMatcher, READ, ReferenceTracker, ReferenceTrackerOptions, SemicolonToken, StaticValue, StaticValueOptional, StaticValueProvided, TraceMap, TrackedReferences, _default as default, findVariable, getFunctionHeadLocation, getFunctionNameWithKind, getInnermostScope, getPropertyName, getStaticValue, getStringIfConstant, hasSideEffect, isArrowToken, isClosingBraceToken, isClosingBracketToken, isClosingParenToken, isColonToken, isCommaToken, isCommentToken, isNotArrowToken, isNotClosingBraceToken, isNotClosingBracketToken, isNotClosingParenToken, isNotColonToken, isNotCommaToken, isNotCommentToken, isNotOpeningBraceToken, isNotOpeningBracketToken, isNotOpeningParenToken, isNotSemicolonToken, isOpeningBraceToken, isOpeningBracketToken, isOpeningParenToken, isParenthesized, isSemicolonToken };
diff --git a/slider/node_modules/@eslint-community/eslint-utils/index.js b/slider/node_modules/@eslint-community/eslint-utils/index.js
new file mode 100644
index 0000000..f8e27af
--- /dev/null
+++ b/slider/node_modules/@eslint-community/eslint-utils/index.js
@@ -0,0 +1,2607 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var eslintVisitorKeys = require('eslint-visitor-keys');
+
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("estree").Node} Node */
+
+/**
+ * Get the innermost scope which contains a given location.
+ * @param {Scope} initialScope The initial scope to search.
+ * @param {Node} node The location to search.
+ * @returns {Scope} The innermost scope.
+ */
+function getInnermostScope(initialScope, node) {
+ const location = /** @type {[number, number]} */ (node.range)[0];
+
+ let scope = initialScope;
+ let found = false;
+ do {
+ found = false;
+ for (const childScope of scope.childScopes) {
+ const range = /** @type {[number, number]} */ (
+ childScope.block.range
+ );
+
+ if (range[0] <= location && location < range[1]) {
+ scope = childScope;
+ found = true;
+ break
+ }
+ }
+ } while (found)
+
+ return scope
+}
+
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("eslint").Scope.Variable} Variable */
+/** @typedef {import("estree").Identifier} Identifier */
+
+/**
+ * Find the variable of a given name.
+ * @param {Scope} initialScope The scope to start finding.
+ * @param {string|Identifier} nameOrNode The variable name to find. If this is a Node object then it should be an Identifier node.
+ * @returns {Variable|null} The found variable or null.
+ */
+function findVariable(initialScope, nameOrNode) {
+ let name = "";
+ /** @type {Scope|null} */
+ let scope = initialScope;
+
+ if (typeof nameOrNode === "string") {
+ name = nameOrNode;
+ } else {
+ name = nameOrNode.name;
+ scope = getInnermostScope(scope, nameOrNode);
+ }
+
+ while (scope != null) {
+ const variable = scope.set.get(name);
+ if (variable != null) {
+ return variable
+ }
+ scope = scope.upper;
+ }
+
+ return null
+}
+
+/** @typedef {import("eslint").AST.Token} Token */
+/** @typedef {import("estree").Comment} Comment */
+/** @typedef {import("./types.mjs").ArrowToken} ArrowToken */
+/** @typedef {import("./types.mjs").CommaToken} CommaToken */
+/** @typedef {import("./types.mjs").SemicolonToken} SemicolonToken */
+/** @typedef {import("./types.mjs").ColonToken} ColonToken */
+/** @typedef {import("./types.mjs").OpeningParenToken} OpeningParenToken */
+/** @typedef {import("./types.mjs").ClosingParenToken} ClosingParenToken */
+/** @typedef {import("./types.mjs").OpeningBracketToken} OpeningBracketToken */
+/** @typedef {import("./types.mjs").ClosingBracketToken} ClosingBracketToken */
+/** @typedef {import("./types.mjs").OpeningBraceToken} OpeningBraceToken */
+/** @typedef {import("./types.mjs").ClosingBraceToken} ClosingBraceToken */
+/**
+ * @template {string} Value
+ * @typedef {import("./types.mjs").PunctuatorToken} PunctuatorToken
+ */
+
+/** @typedef {Comment | Token} CommentOrToken */
+
+/**
+ * Creates the negate function of the given function.
+ * @param {function(CommentOrToken):boolean} f - The function to negate.
+ * @returns {function(CommentOrToken):boolean} Negated function.
+ */
+function negate(f) {
+ return (token) => !f(token)
+}
+
+/**
+ * Checks if the given token is a PunctuatorToken with the given value
+ * @template {string} Value
+ * @param {CommentOrToken} token - The token to check.
+ * @param {Value} value - The value to check.
+ * @returns {token is PunctuatorToken} `true` if the token is a PunctuatorToken with the given value.
+ */
+function isPunctuatorTokenWithValue(token, value) {
+ return token.type === "Punctuator" && token.value === value
+}
+
+/**
+ * Checks if the given token is an arrow token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is ArrowToken} `true` if the token is an arrow token.
+ */
+function isArrowToken(token) {
+ return isPunctuatorTokenWithValue(token, "=>")
+}
+
+/**
+ * Checks if the given token is a comma token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is CommaToken} `true` if the token is a comma token.
+ */
+function isCommaToken(token) {
+ return isPunctuatorTokenWithValue(token, ",")
+}
+
+/**
+ * Checks if the given token is a semicolon token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is SemicolonToken} `true` if the token is a semicolon token.
+ */
+function isSemicolonToken(token) {
+ return isPunctuatorTokenWithValue(token, ";")
+}
+
+/**
+ * Checks if the given token is a colon token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is ColonToken} `true` if the token is a colon token.
+ */
+function isColonToken(token) {
+ return isPunctuatorTokenWithValue(token, ":")
+}
+
+/**
+ * Checks if the given token is an opening parenthesis token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is OpeningParenToken} `true` if the token is an opening parenthesis token.
+ */
+function isOpeningParenToken(token) {
+ return isPunctuatorTokenWithValue(token, "(")
+}
+
+/**
+ * Checks if the given token is a closing parenthesis token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is ClosingParenToken} `true` if the token is a closing parenthesis token.
+ */
+function isClosingParenToken(token) {
+ return isPunctuatorTokenWithValue(token, ")")
+}
+
+/**
+ * Checks if the given token is an opening square bracket token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is OpeningBracketToken} `true` if the token is an opening square bracket token.
+ */
+function isOpeningBracketToken(token) {
+ return isPunctuatorTokenWithValue(token, "[")
+}
+
+/**
+ * Checks if the given token is a closing square bracket token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is ClosingBracketToken} `true` if the token is a closing square bracket token.
+ */
+function isClosingBracketToken(token) {
+ return isPunctuatorTokenWithValue(token, "]")
+}
+
+/**
+ * Checks if the given token is an opening brace token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is OpeningBraceToken} `true` if the token is an opening brace token.
+ */
+function isOpeningBraceToken(token) {
+ return isPunctuatorTokenWithValue(token, "{")
+}
+
+/**
+ * Checks if the given token is a closing brace token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is ClosingBraceToken} `true` if the token is a closing brace token.
+ */
+function isClosingBraceToken(token) {
+ return isPunctuatorTokenWithValue(token, "}")
+}
+
+/**
+ * Checks if the given token is a comment token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is Comment} `true` if the token is a comment token.
+ */
+function isCommentToken(token) {
+ return ["Block", "Line", "Shebang"].includes(token.type)
+}
+
+const isNotArrowToken = negate(isArrowToken);
+const isNotCommaToken = negate(isCommaToken);
+const isNotSemicolonToken = negate(isSemicolonToken);
+const isNotColonToken = negate(isColonToken);
+const isNotOpeningParenToken = negate(isOpeningParenToken);
+const isNotClosingParenToken = negate(isClosingParenToken);
+const isNotOpeningBracketToken = negate(isOpeningBracketToken);
+const isNotClosingBracketToken = negate(isClosingBracketToken);
+const isNotOpeningBraceToken = negate(isOpeningBraceToken);
+const isNotClosingBraceToken = negate(isClosingBraceToken);
+const isNotCommentToken = negate(isCommentToken);
+
+/** @typedef {import("eslint").Rule.Node} RuleNode */
+/** @typedef {import("eslint").SourceCode} SourceCode */
+/** @typedef {import("eslint").AST.Token} Token */
+/** @typedef {import("estree").Function} FunctionNode */
+/** @typedef {import("estree").FunctionDeclaration} FunctionDeclaration */
+/** @typedef {import("estree").FunctionExpression} FunctionExpression */
+/** @typedef {import("estree").SourceLocation} SourceLocation */
+/** @typedef {import("estree").Position} Position */
+
+/**
+ * Get the `(` token of the given function node.
+ * @param {FunctionExpression | FunctionDeclaration} node - The function node to get.
+ * @param {SourceCode} sourceCode - The source code object to get tokens.
+ * @returns {Token} `(` token.
+ */
+function getOpeningParenOfParams(node, sourceCode) {
+ return node.id
+ ? /** @type {Token} */ (
+ sourceCode.getTokenAfter(node.id, isOpeningParenToken)
+ )
+ : /** @type {Token} */ (
+ sourceCode.getFirstToken(node, isOpeningParenToken)
+ )
+}
+
+/**
+ * Get the location of the given function node for reporting.
+ * @param {FunctionNode} node - The function node to get.
+ * @param {SourceCode} sourceCode - The source code object to get tokens.
+ * @returns {SourceLocation|null} The location of the function node for reporting.
+ */
+function getFunctionHeadLocation(node, sourceCode) {
+ const parent = /** @type {RuleNode} */ (node).parent;
+
+ /** @type {Position|null} */
+ let start = null;
+ /** @type {Position|null} */
+ let end = null;
+
+ if (node.type === "ArrowFunctionExpression") {
+ const arrowToken = /** @type {Token} */ (
+ sourceCode.getTokenBefore(node.body, isArrowToken)
+ );
+
+ start = arrowToken.loc.start;
+ end = arrowToken.loc.end;
+ } else if (
+ parent.type === "Property" ||
+ parent.type === "MethodDefinition" ||
+ parent.type === "PropertyDefinition"
+ ) {
+ start = /** @type {SourceLocation} */ (parent.loc).start;
+ end = getOpeningParenOfParams(node, sourceCode).loc.start;
+ } else {
+ start = /** @type {SourceLocation} */ (node.loc).start;
+ end = getOpeningParenOfParams(node, sourceCode).loc.start;
+ }
+
+ return {
+ start: { ...start },
+ end: { ...end },
+ }
+}
+
+/* globals globalThis, global, self, window */
+/** @typedef {import("./types.mjs").StaticValue} StaticValue */
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("eslint").Scope.Variable} Variable */
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("@typescript-eslint/types").TSESTree.Node} TSESTreeNode */
+/** @typedef {import("@typescript-eslint/types").TSESTree.AST_NODE_TYPES} TSESTreeNodeTypes */
+/** @typedef {import("@typescript-eslint/types").TSESTree.MemberExpression} MemberExpression */
+/** @typedef {import("@typescript-eslint/types").TSESTree.Property} Property */
+/** @typedef {import("@typescript-eslint/types").TSESTree.RegExpLiteral} RegExpLiteral */
+/** @typedef {import("@typescript-eslint/types").TSESTree.BigIntLiteral} BigIntLiteral */
+/** @typedef {import("@typescript-eslint/types").TSESTree.Literal} Literal */
+
+const globalObject =
+ typeof globalThis !== "undefined"
+ ? globalThis
+ : // @ts-ignore
+ typeof self !== "undefined"
+ ? // @ts-ignore
+ self
+ : // @ts-ignore
+ typeof window !== "undefined"
+ ? // @ts-ignore
+ window
+ : typeof global !== "undefined"
+ ? global
+ : {};
+
+const builtinNames = Object.freeze(
+ new Set([
+ "Array",
+ "ArrayBuffer",
+ "BigInt",
+ "BigInt64Array",
+ "BigUint64Array",
+ "Boolean",
+ "DataView",
+ "Date",
+ "decodeURI",
+ "decodeURIComponent",
+ "encodeURI",
+ "encodeURIComponent",
+ "escape",
+ "Float32Array",
+ "Float64Array",
+ "Function",
+ "Infinity",
+ "Int16Array",
+ "Int32Array",
+ "Int8Array",
+ "isFinite",
+ "isNaN",
+ "isPrototypeOf",
+ "JSON",
+ "Map",
+ "Math",
+ "NaN",
+ "Number",
+ "Object",
+ "parseFloat",
+ "parseInt",
+ "Promise",
+ "Proxy",
+ "Reflect",
+ "RegExp",
+ "Set",
+ "String",
+ "Symbol",
+ "Uint16Array",
+ "Uint32Array",
+ "Uint8Array",
+ "Uint8ClampedArray",
+ "undefined",
+ "unescape",
+ "WeakMap",
+ "WeakSet",
+ ]),
+);
+const callAllowed = new Set(
+ [
+ Array.isArray,
+ Array.of,
+ Array.prototype.at,
+ Array.prototype.concat,
+ Array.prototype.entries,
+ Array.prototype.every,
+ Array.prototype.filter,
+ Array.prototype.find,
+ Array.prototype.findIndex,
+ Array.prototype.flat,
+ Array.prototype.includes,
+ Array.prototype.indexOf,
+ Array.prototype.join,
+ Array.prototype.keys,
+ Array.prototype.lastIndexOf,
+ Array.prototype.slice,
+ Array.prototype.some,
+ Array.prototype.toString,
+ Array.prototype.values,
+ typeof BigInt === "function" ? BigInt : undefined,
+ Boolean,
+ Date,
+ Date.parse,
+ decodeURI,
+ decodeURIComponent,
+ encodeURI,
+ encodeURIComponent,
+ escape,
+ isFinite,
+ isNaN,
+ // @ts-ignore
+ isPrototypeOf,
+ Map,
+ Map.prototype.entries,
+ Map.prototype.get,
+ Map.prototype.has,
+ Map.prototype.keys,
+ Map.prototype.values,
+ .../** @type {(keyof typeof Math)[]} */ (
+ Object.getOwnPropertyNames(Math)
+ )
+ .filter((k) => k !== "random")
+ .map((k) => Math[k])
+ .filter((f) => typeof f === "function"),
+ Number,
+ Number.isFinite,
+ Number.isNaN,
+ Number.parseFloat,
+ Number.parseInt,
+ Number.prototype.toExponential,
+ Number.prototype.toFixed,
+ Number.prototype.toPrecision,
+ Number.prototype.toString,
+ Object,
+ Object.entries,
+ Object.is,
+ Object.isExtensible,
+ Object.isFrozen,
+ Object.isSealed,
+ Object.keys,
+ Object.values,
+ parseFloat,
+ parseInt,
+ RegExp,
+ Set,
+ Set.prototype.entries,
+ Set.prototype.has,
+ Set.prototype.keys,
+ Set.prototype.values,
+ String,
+ String.fromCharCode,
+ String.fromCodePoint,
+ String.raw,
+ String.prototype.at,
+ String.prototype.charAt,
+ String.prototype.charCodeAt,
+ String.prototype.codePointAt,
+ String.prototype.concat,
+ String.prototype.endsWith,
+ String.prototype.includes,
+ String.prototype.indexOf,
+ String.prototype.lastIndexOf,
+ String.prototype.normalize,
+ String.prototype.padEnd,
+ String.prototype.padStart,
+ String.prototype.slice,
+ String.prototype.startsWith,
+ String.prototype.substr,
+ String.prototype.substring,
+ String.prototype.toLowerCase,
+ String.prototype.toString,
+ String.prototype.toUpperCase,
+ String.prototype.trim,
+ String.prototype.trimEnd,
+ String.prototype.trimLeft,
+ String.prototype.trimRight,
+ String.prototype.trimStart,
+ Symbol.for,
+ Symbol.keyFor,
+ unescape,
+ ].filter((f) => typeof f === "function"),
+);
+const callPassThrough = new Set([
+ Object.freeze,
+ Object.preventExtensions,
+ Object.seal,
+]);
+
+/** @type {ReadonlyArray]>} */
+const getterAllowed = [
+ [Map, new Set(["size"])],
+ [
+ RegExp,
+ new Set([
+ "dotAll",
+ "flags",
+ "global",
+ "hasIndices",
+ "ignoreCase",
+ "multiline",
+ "source",
+ "sticky",
+ "unicode",
+ ]),
+ ],
+ [Set, new Set(["size"])],
+];
+
+/**
+ * Get the property descriptor.
+ * @param {object} object The object to get.
+ * @param {string|number|symbol} name The property name to get.
+ */
+function getPropertyDescriptor(object, name) {
+ let x = object;
+ while ((typeof x === "object" || typeof x === "function") && x !== null) {
+ const d = Object.getOwnPropertyDescriptor(x, name);
+ if (d) {
+ return d
+ }
+ x = Object.getPrototypeOf(x);
+ }
+ return null
+}
+
+/**
+ * Check if a property is getter or not.
+ * @param {object} object The object to check.
+ * @param {string|number|symbol} name The property name to check.
+ */
+function isGetter(object, name) {
+ const d = getPropertyDescriptor(object, name);
+ return d != null && d.get != null
+}
+
+/**
+ * Get the element values of a given node list.
+ * @param {(Node|TSESTreeNode|null)[]} nodeList The node list to get values.
+ * @param {Scope|undefined|null} initialScope The initial scope to find variables.
+ * @returns {any[]|null} The value list if all nodes are constant. Otherwise, null.
+ */
+function getElementValues(nodeList, initialScope) {
+ const valueList = [];
+
+ for (let i = 0; i < nodeList.length; ++i) {
+ const elementNode = nodeList[i];
+
+ if (elementNode == null) {
+ valueList.length = i + 1;
+ } else if (elementNode.type === "SpreadElement") {
+ const argument = getStaticValueR(elementNode.argument, initialScope);
+ if (argument == null) {
+ return null
+ }
+ valueList.push(.../** @type {Iterable} */ (argument.value));
+ } else {
+ const element = getStaticValueR(elementNode, initialScope);
+ if (element == null) {
+ return null
+ }
+ valueList.push(element.value);
+ }
+ }
+
+ return valueList
+}
+
+/**
+ * Checks if a variable is a built-in global.
+ * @param {Variable|null} variable The variable to check.
+ * @returns {variable is Variable & {defs:[]}}
+ */
+function isBuiltinGlobal(variable) {
+ return (
+ variable != null &&
+ variable.defs.length === 0 &&
+ builtinNames.has(variable.name) &&
+ variable.name in globalObject
+ )
+}
+
+/**
+ * Checks if a variable can be considered as a constant.
+ * @param {Variable} variable
+ * @returns {variable is Variable & {defs: [import("eslint").Scope.Definition & { type: "Variable" }]}} True if the variable can be considered as a constant.
+ */
+function canBeConsideredConst(variable) {
+ if (variable.defs.length !== 1) {
+ return false
+ }
+ const def = variable.defs[0];
+ return Boolean(
+ def.parent &&
+ def.type === "Variable" &&
+ (def.parent.kind === "const" || isEffectivelyConst(variable)),
+ )
+}
+
+/**
+ * Returns whether the given variable is never written to after initialization.
+ * @param {Variable} variable
+ * @returns {boolean}
+ */
+function isEffectivelyConst(variable) {
+ const refs = variable.references;
+
+ const inits = refs.filter((r) => r.init).length;
+ const reads = refs.filter((r) => r.isReadOnly()).length;
+ if (inits === 1 && reads + inits === refs.length) {
+ // there is only one init and all other references only read
+ return true
+ }
+ return false
+}
+
+/**
+ * Checks if a variable has mutation in its property.
+ * @param {Variable} variable The variable to check.
+ * @param {Scope|null} initialScope The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.
+ * @returns {boolean} True if the variable has mutation in its property.
+ */
+function hasMutationInProperty(variable, initialScope) {
+ for (const ref of variable.references) {
+ let node = /** @type {TSESTreeNode} */ (ref.identifier);
+ while (node && node.parent && node.parent.type === "MemberExpression") {
+ node = node.parent;
+ }
+ if (!node || !node.parent) {
+ continue
+ }
+ if (
+ (node.parent.type === "AssignmentExpression" &&
+ node.parent.left === node) ||
+ (node.parent.type === "UpdateExpression" &&
+ node.parent.argument === node)
+ ) {
+ // This is a mutation.
+ return true
+ }
+ if (
+ node.parent.type === "CallExpression" &&
+ node.parent.callee === node &&
+ node.type === "MemberExpression"
+ ) {
+ const methodName = getStaticPropertyNameValue(node, initialScope);
+ if (isNameOfMutationArrayMethod(methodName)) {
+ // This is a mutation.
+ return true
+ }
+ }
+ }
+ return false
+
+ /**
+ * Checks if a method name is one of the mutation array methods.
+ * @param {StaticValue|null} methodName The method name to check.
+ * @returns {boolean} True if the method name is a mutation array method.
+ */
+ function isNameOfMutationArrayMethod(methodName) {
+ if (methodName == null || methodName.value == null) {
+ return false
+ }
+ const name = methodName.value;
+ return (
+ name === "copyWithin" ||
+ name === "fill" ||
+ name === "pop" ||
+ name === "push" ||
+ name === "reverse" ||
+ name === "shift" ||
+ name === "sort" ||
+ name === "splice" ||
+ name === "unshift"
+ )
+ }
+}
+
+/**
+ * @template {TSESTreeNodeTypes} T
+ * @callback VisitorCallback
+ * @param {TSESTreeNode & { type: T }} node
+ * @param {Scope|undefined|null} initialScope
+ * @returns {StaticValue | null}
+ */
+/**
+ * @typedef { { [K in TSESTreeNodeTypes]?: VisitorCallback } } Operations
+ */
+/**
+ * @type {Operations}
+ */
+const operations = Object.freeze({
+ ArrayExpression(node, initialScope) {
+ const elements = getElementValues(node.elements, initialScope);
+ return elements != null ? { value: elements } : null
+ },
+
+ AssignmentExpression(node, initialScope) {
+ if (node.operator === "=") {
+ return getStaticValueR(node.right, initialScope)
+ }
+ return null
+ },
+
+ //eslint-disable-next-line complexity
+ BinaryExpression(node, initialScope) {
+ if (node.operator === "in" || node.operator === "instanceof") {
+ // Not supported.
+ return null
+ }
+
+ const left = getStaticValueR(node.left, initialScope);
+ const right = getStaticValueR(node.right, initialScope);
+ if (left != null && right != null) {
+ switch (node.operator) {
+ case "==":
+ return { value: left.value == right.value } //eslint-disable-line eqeqeq
+ case "!=":
+ return { value: left.value != right.value } //eslint-disable-line eqeqeq
+ case "===":
+ return { value: left.value === right.value }
+ case "!==":
+ return { value: left.value !== right.value }
+ case "<":
+ return {
+ value:
+ /** @type {any} */ (left.value) <
+ /** @type {any} */ (right.value),
+ }
+ case "<=":
+ return {
+ value:
+ /** @type {any} */ (left.value) <=
+ /** @type {any} */ (right.value),
+ }
+ case ">":
+ return {
+ value:
+ /** @type {any} */ (left.value) >
+ /** @type {any} */ (right.value),
+ }
+ case ">=":
+ return {
+ value:
+ /** @type {any} */ (left.value) >=
+ /** @type {any} */ (right.value),
+ }
+ case "<<":
+ return {
+ value:
+ /** @type {any} */ (left.value) <<
+ /** @type {any} */ (right.value),
+ }
+ case ">>":
+ return {
+ value:
+ /** @type {any} */ (left.value) >>
+ /** @type {any} */ (right.value),
+ }
+ case ">>>":
+ return {
+ value:
+ /** @type {any} */ (left.value) >>>
+ /** @type {any} */ (right.value),
+ }
+ case "+":
+ return {
+ value:
+ /** @type {any} */ (left.value) +
+ /** @type {any} */ (right.value),
+ }
+ case "-":
+ return {
+ value:
+ /** @type {any} */ (left.value) -
+ /** @type {any} */ (right.value),
+ }
+ case "*":
+ return {
+ value:
+ /** @type {any} */ (left.value) *
+ /** @type {any} */ (right.value),
+ }
+ case "/":
+ return {
+ value:
+ /** @type {any} */ (left.value) /
+ /** @type {any} */ (right.value),
+ }
+ case "%":
+ return {
+ value:
+ /** @type {any} */ (left.value) %
+ /** @type {any} */ (right.value),
+ }
+ case "**":
+ return {
+ value:
+ /** @type {any} */ (left.value) **
+ /** @type {any} */ (right.value),
+ }
+ case "|":
+ return {
+ value:
+ /** @type {any} */ (left.value) |
+ /** @type {any} */ (right.value),
+ }
+ case "^":
+ return {
+ value:
+ /** @type {any} */ (left.value) ^
+ /** @type {any} */ (right.value),
+ }
+ case "&":
+ return {
+ value:
+ /** @type {any} */ (left.value) &
+ /** @type {any} */ (right.value),
+ }
+
+ // no default
+ }
+ }
+
+ return null
+ },
+
+ CallExpression(node, initialScope) {
+ const calleeNode = node.callee;
+ const args = getElementValues(node.arguments, initialScope);
+
+ if (args != null) {
+ if (calleeNode.type === "MemberExpression") {
+ if (calleeNode.property.type === "PrivateIdentifier") {
+ return null
+ }
+ const object = getStaticValueR(calleeNode.object, initialScope);
+ if (object != null) {
+ if (
+ object.value == null &&
+ (object.optional || node.optional)
+ ) {
+ return { value: undefined, optional: true }
+ }
+ const property = getStaticPropertyNameValue(
+ calleeNode,
+ initialScope,
+ );
+
+ if (property != null) {
+ const receiver =
+ /** @type {Record any>} */ (
+ object.value
+ );
+ const methodName = /** @type {PropertyKey} */ (
+ property.value
+ );
+ if (callAllowed.has(receiver[methodName])) {
+ return {
+ value: receiver[methodName](...args),
+ }
+ }
+ if (callPassThrough.has(receiver[methodName])) {
+ return { value: args[0] }
+ }
+ }
+ }
+ } else {
+ const callee = getStaticValueR(calleeNode, initialScope);
+ if (callee != null) {
+ if (callee.value == null && node.optional) {
+ return { value: undefined, optional: true }
+ }
+ const func = /** @type {(...args: any[]) => any} */ (
+ callee.value
+ );
+ if (callAllowed.has(func)) {
+ return { value: func(...args) }
+ }
+ if (callPassThrough.has(func)) {
+ return { value: args[0] }
+ }
+ }
+ }
+ }
+
+ return null
+ },
+
+ ConditionalExpression(node, initialScope) {
+ const test = getStaticValueR(node.test, initialScope);
+ if (test != null) {
+ return test.value
+ ? getStaticValueR(node.consequent, initialScope)
+ : getStaticValueR(node.alternate, initialScope)
+ }
+ return null
+ },
+
+ ExpressionStatement(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+
+ Identifier(node, initialScope) {
+ if (initialScope != null) {
+ const variable = findVariable(initialScope, node);
+
+ if (variable != null) {
+ // Built-in globals.
+ if (isBuiltinGlobal(variable)) {
+ return { value: globalObject[variable.name] }
+ }
+
+ // Constants.
+ if (canBeConsideredConst(variable)) {
+ const def = variable.defs[0];
+ if (
+ // TODO(mysticatea): don't support destructuring here.
+ def.node.id.type === "Identifier"
+ ) {
+ const init = getStaticValueR(
+ def.node.init,
+ initialScope,
+ );
+ if (
+ init &&
+ typeof init.value === "object" &&
+ init.value !== null
+ ) {
+ if (hasMutationInProperty(variable, initialScope)) {
+ // This variable has mutation in its property.
+ return null
+ }
+ }
+ return init
+ }
+ }
+ }
+ }
+ return null
+ },
+
+ Literal(node) {
+ const literal =
+ /** @type {Partial & Partial & Partial} */ (
+ node
+ );
+ //istanbul ignore if : this is implementation-specific behavior.
+ if (
+ (literal.regex != null || literal.bigint != null) &&
+ literal.value == null
+ ) {
+ // It was a RegExp/BigInt literal, but Node.js didn't support it.
+ return null
+ }
+ return { value: literal.value }
+ },
+
+ LogicalExpression(node, initialScope) {
+ const left = getStaticValueR(node.left, initialScope);
+ if (left != null) {
+ if (
+ (node.operator === "||" && Boolean(left.value) === true) ||
+ (node.operator === "&&" && Boolean(left.value) === false) ||
+ (node.operator === "??" && left.value != null)
+ ) {
+ return left
+ }
+
+ const right = getStaticValueR(node.right, initialScope);
+ if (right != null) {
+ return right
+ }
+ }
+
+ return null
+ },
+
+ MemberExpression(node, initialScope) {
+ if (node.property.type === "PrivateIdentifier") {
+ return null
+ }
+ const object = getStaticValueR(node.object, initialScope);
+ if (object != null) {
+ if (object.value == null && (object.optional || node.optional)) {
+ return { value: undefined, optional: true }
+ }
+ const property = getStaticPropertyNameValue(node, initialScope);
+
+ if (property != null) {
+ if (
+ !isGetter(
+ /** @type {object} */ (object.value),
+ /** @type {PropertyKey} */ (property.value),
+ )
+ ) {
+ return {
+ value: /** @type {Record} */ (
+ object.value
+ )[/** @type {PropertyKey} */ (property.value)],
+ }
+ }
+
+ for (const [classFn, allowed] of getterAllowed) {
+ if (
+ object.value instanceof classFn &&
+ allowed.has(/** @type {string} */ (property.value))
+ ) {
+ return {
+ value: /** @type {Record} */ (
+ object.value
+ )[/** @type {PropertyKey} */ (property.value)],
+ }
+ }
+ }
+ }
+ }
+ return null
+ },
+
+ ChainExpression(node, initialScope) {
+ const expression = getStaticValueR(node.expression, initialScope);
+ if (expression != null) {
+ return { value: expression.value }
+ }
+ return null
+ },
+
+ NewExpression(node, initialScope) {
+ const callee = getStaticValueR(node.callee, initialScope);
+ const args = getElementValues(node.arguments, initialScope);
+
+ if (callee != null && args != null) {
+ const Func = /** @type {new (...args: any[]) => any} */ (
+ callee.value
+ );
+ if (callAllowed.has(Func)) {
+ return { value: new Func(...args) }
+ }
+ }
+
+ return null
+ },
+
+ ObjectExpression(node, initialScope) {
+ /** @type {Record} */
+ const object = {};
+
+ for (const propertyNode of node.properties) {
+ if (propertyNode.type === "Property") {
+ if (propertyNode.kind !== "init") {
+ return null
+ }
+ const key = getStaticPropertyNameValue(
+ propertyNode,
+ initialScope,
+ );
+ const value = getStaticValueR(propertyNode.value, initialScope);
+ if (key == null || value == null) {
+ return null
+ }
+ object[/** @type {PropertyKey} */ (key.value)] = value.value;
+ } else if (
+ propertyNode.type === "SpreadElement" ||
+ // @ts-expect-error -- Backward compatibility
+ propertyNode.type === "ExperimentalSpreadProperty"
+ ) {
+ const argument = getStaticValueR(
+ propertyNode.argument,
+ initialScope,
+ );
+ if (argument == null) {
+ return null
+ }
+ Object.assign(object, argument.value);
+ } else {
+ return null
+ }
+ }
+
+ return { value: object }
+ },
+
+ SequenceExpression(node, initialScope) {
+ const last = node.expressions[node.expressions.length - 1];
+ return getStaticValueR(last, initialScope)
+ },
+
+ TaggedTemplateExpression(node, initialScope) {
+ const tag = getStaticValueR(node.tag, initialScope);
+ const expressions = getElementValues(
+ node.quasi.expressions,
+ initialScope,
+ );
+
+ if (tag != null && expressions != null) {
+ const func = /** @type {(...args: any[]) => any} */ (tag.value);
+ /** @type {any[] & { raw?: string[] }} */
+ const strings = node.quasi.quasis.map((q) => q.value.cooked);
+ strings.raw = node.quasi.quasis.map((q) => q.value.raw);
+
+ if (func === String.raw) {
+ return { value: func(strings, ...expressions) }
+ }
+ }
+
+ return null
+ },
+
+ TemplateLiteral(node, initialScope) {
+ const expressions = getElementValues(node.expressions, initialScope);
+ if (expressions != null) {
+ let value = node.quasis[0].value.cooked;
+ for (let i = 0; i < expressions.length; ++i) {
+ value += expressions[i];
+ value += /** @type {string} */ (node.quasis[i + 1].value.cooked);
+ }
+ return { value }
+ }
+ return null
+ },
+
+ UnaryExpression(node, initialScope) {
+ if (node.operator === "delete") {
+ // Not supported.
+ return null
+ }
+ if (node.operator === "void") {
+ return { value: undefined }
+ }
+
+ const arg = getStaticValueR(node.argument, initialScope);
+ if (arg != null) {
+ switch (node.operator) {
+ case "-":
+ return { value: -(/** @type {any} */ (arg.value)) }
+ case "+":
+ return { value: +(/** @type {any} */ (arg.value)) } //eslint-disable-line no-implicit-coercion
+ case "!":
+ return { value: !arg.value }
+ case "~":
+ return { value: ~(/** @type {any} */ (arg.value)) }
+ case "typeof":
+ return { value: typeof arg.value }
+
+ // no default
+ }
+ }
+
+ return null
+ },
+ TSAsExpression(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+ TSSatisfiesExpression(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+ TSTypeAssertion(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+ TSNonNullExpression(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+ TSInstantiationExpression(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+});
+
+/**
+ * Get the value of a given node if it's a static value.
+ * @param {Node|TSESTreeNode|null|undefined} node The node to get.
+ * @param {Scope|undefined|null} initialScope The scope to start finding variable.
+ * @returns {StaticValue|null} The static value of the node, or `null`.
+ */
+function getStaticValueR(node, initialScope) {
+ if (node != null && Object.hasOwnProperty.call(operations, node.type)) {
+ return /** @type {VisitorCallback} */ (operations[node.type])(
+ /** @type {TSESTreeNode} */ (node),
+ initialScope,
+ )
+ }
+ return null
+}
+
+/**
+ * Get the static value of property name from a MemberExpression node or a Property node.
+ * @param {MemberExpression|Property} node The node to get.
+ * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.
+ * @returns {StaticValue|null} The static value of the property name of the node, or `null`.
+ */
+function getStaticPropertyNameValue(node, initialScope) {
+ const nameNode = node.type === "Property" ? node.key : node.property;
+
+ if (node.computed) {
+ return getStaticValueR(nameNode, initialScope)
+ }
+
+ if (nameNode.type === "Identifier") {
+ return { value: nameNode.name }
+ }
+
+ if (nameNode.type === "Literal") {
+ if (/** @type {Partial} */ (nameNode).bigint) {
+ return { value: /** @type {BigIntLiteral} */ (nameNode).bigint }
+ }
+ return { value: String(nameNode.value) }
+ }
+
+ return null
+}
+
+/**
+ * Get the value of a given node if it's a static value.
+ * @param {Node} node The node to get.
+ * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If this scope was given, this tries to resolve identifier references which are in the given node as much as possible.
+ * @returns {StaticValue | null} The static value of the node, or `null`.
+ */
+function getStaticValue(node, initialScope = null) {
+ try {
+ return getStaticValueR(node, initialScope)
+ } catch (_error) {
+ return null
+ }
+}
+
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("estree").RegExpLiteral} RegExpLiteral */
+/** @typedef {import("estree").BigIntLiteral} BigIntLiteral */
+/** @typedef {import("estree").SimpleLiteral} SimpleLiteral */
+
+/**
+ * Get the value of a given node if it's a literal or a template literal.
+ * @param {Node} node The node to get.
+ * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If the node is an Identifier node and this scope was given, this checks the variable of the identifier, and returns the value of it if the variable is a constant.
+ * @returns {string|null} The value of the node, or `null`.
+ */
+function getStringIfConstant(node, initialScope = null) {
+ // Handle the literals that the platform doesn't support natively.
+ if (node && node.type === "Literal" && node.value === null) {
+ const literal =
+ /** @type {Partial & Partial & Partial} */ (
+ node
+ );
+ if (literal.regex) {
+ return `/${literal.regex.pattern}/${literal.regex.flags}`
+ }
+ if (literal.bigint) {
+ return literal.bigint
+ }
+ }
+
+ const evaluated = getStaticValue(node, initialScope);
+
+ if (evaluated) {
+ // `String(Symbol.prototype)` throws error
+ try {
+ return String(evaluated.value)
+ } catch {
+ // No op
+ }
+ }
+
+ return null
+}
+
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("estree").MemberExpression} MemberExpression */
+/** @typedef {import("estree").MethodDefinition} MethodDefinition */
+/** @typedef {import("estree").Property} Property */
+/** @typedef {import("estree").PropertyDefinition} PropertyDefinition */
+/** @typedef {import("estree").Identifier} Identifier */
+
+/**
+ * Get the property name from a MemberExpression node or a Property node.
+ * @param {MemberExpression | MethodDefinition | Property | PropertyDefinition} node The node to get.
+ * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.
+ * @returns {string|null|undefined} The property name of the node.
+ */
+function getPropertyName(node, initialScope) {
+ switch (node.type) {
+ case "MemberExpression":
+ if (node.computed) {
+ return getStringIfConstant(node.property, initialScope)
+ }
+ if (node.property.type === "PrivateIdentifier") {
+ return null
+ }
+ return /** @type {Partial} */ (node.property).name
+
+ case "Property":
+ case "MethodDefinition":
+ case "PropertyDefinition":
+ if (node.computed) {
+ return getStringIfConstant(node.key, initialScope)
+ }
+ if (node.key.type === "Literal") {
+ return String(node.key.value)
+ }
+ if (node.key.type === "PrivateIdentifier") {
+ return null
+ }
+ return /** @type {Partial} */ (node.key).name
+ }
+
+ return null
+}
+
+/** @typedef {import("eslint").Rule.Node} RuleNode */
+/** @typedef {import("eslint").SourceCode} SourceCode */
+/** @typedef {import("estree").Function} FunctionNode */
+/** @typedef {import("estree").FunctionDeclaration} FunctionDeclaration */
+/** @typedef {import("estree").FunctionExpression} FunctionExpression */
+/** @typedef {import("estree").Identifier} Identifier */
+
+/**
+ * Get the name and kind of the given function node.
+ * @param {FunctionNode} node - The function node to get.
+ * @param {SourceCode} [sourceCode] The source code object to get the code of computed property keys.
+ * @returns {string} The name and kind of the function node.
+ */
+// eslint-disable-next-line complexity
+function getFunctionNameWithKind(node, sourceCode) {
+ const parent = /** @type {RuleNode} */ (node).parent;
+ const tokens = [];
+ const isObjectMethod = parent.type === "Property" && parent.value === node;
+ const isClassMethod =
+ parent.type === "MethodDefinition" && parent.value === node;
+ const isClassFieldMethod =
+ parent.type === "PropertyDefinition" && parent.value === node;
+
+ // Modifiers.
+ if (isClassMethod || isClassFieldMethod) {
+ if (parent.static) {
+ tokens.push("static");
+ }
+ if (parent.key.type === "PrivateIdentifier") {
+ tokens.push("private");
+ }
+ }
+ if (node.async) {
+ tokens.push("async");
+ }
+ if (node.generator) {
+ tokens.push("generator");
+ }
+
+ // Kinds.
+ if (isObjectMethod || isClassMethod) {
+ if (parent.kind === "constructor") {
+ return "constructor"
+ }
+ if (parent.kind === "get") {
+ tokens.push("getter");
+ } else if (parent.kind === "set") {
+ tokens.push("setter");
+ } else {
+ tokens.push("method");
+ }
+ } else if (isClassFieldMethod) {
+ tokens.push("method");
+ } else {
+ if (node.type === "ArrowFunctionExpression") {
+ tokens.push("arrow");
+ }
+ tokens.push("function");
+ }
+
+ // Names.
+ if (isObjectMethod || isClassMethod || isClassFieldMethod) {
+ if (parent.key.type === "PrivateIdentifier") {
+ tokens.push(`#${parent.key.name}`);
+ } else {
+ const name = getPropertyName(parent);
+ if (name) {
+ tokens.push(`'${name}'`);
+ } else if (sourceCode) {
+ const keyText = sourceCode.getText(parent.key);
+ if (!keyText.includes("\n")) {
+ tokens.push(`[${keyText}]`);
+ }
+ }
+ }
+ } else if (hasId(node)) {
+ tokens.push(`'${node.id.name}'`);
+ } else if (
+ parent.type === "VariableDeclarator" &&
+ parent.id &&
+ parent.id.type === "Identifier"
+ ) {
+ tokens.push(`'${parent.id.name}'`);
+ } else if (
+ (parent.type === "AssignmentExpression" ||
+ parent.type === "AssignmentPattern") &&
+ parent.left &&
+ parent.left.type === "Identifier"
+ ) {
+ tokens.push(`'${parent.left.name}'`);
+ } else if (
+ parent.type === "ExportDefaultDeclaration" &&
+ parent.declaration === node
+ ) {
+ tokens.push("'default'");
+ }
+
+ return tokens.join(" ")
+}
+
+/**
+ * @param {FunctionNode} node
+ * @returns {node is FunctionDeclaration | FunctionExpression & { id: Identifier }}
+ */
+function hasId(node) {
+ return Boolean(
+ /** @type {Partial} */ (node)
+ .id,
+ )
+}
+
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("eslint").SourceCode} SourceCode */
+/** @typedef {import("./types.mjs").HasSideEffectOptions} HasSideEffectOptions */
+/** @typedef {import("estree").BinaryExpression} BinaryExpression */
+/** @typedef {import("estree").MemberExpression} MemberExpression */
+/** @typedef {import("estree").MethodDefinition} MethodDefinition */
+/** @typedef {import("estree").Property} Property */
+/** @typedef {import("estree").PropertyDefinition} PropertyDefinition */
+/** @typedef {import("estree").UnaryExpression} UnaryExpression */
+
+const typeConversionBinaryOps = Object.freeze(
+ new Set([
+ "==",
+ "!=",
+ "<",
+ "<=",
+ ">",
+ ">=",
+ "<<",
+ ">>",
+ ">>>",
+ "+",
+ "-",
+ "*",
+ "/",
+ "%",
+ "|",
+ "^",
+ "&",
+ "in",
+ ]),
+);
+const typeConversionUnaryOps = Object.freeze(new Set(["-", "+", "!", "~"]));
+
+/**
+ * Check whether the given value is an ASTNode or not.
+ * @param {any} x The value to check.
+ * @returns {x is Node} `true` if the value is an ASTNode.
+ */
+function isNode(x) {
+ return x !== null && typeof x === "object" && typeof x.type === "string"
+}
+
+const visitor = Object.freeze(
+ Object.assign(Object.create(null), {
+ /**
+ * @param {Node} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ $visit(node, options, visitorKeys) {
+ const { type } = node;
+
+ if (typeof (/** @type {any} */ (this)[type]) === "function") {
+ return /** @type {any} */ (this)[type](
+ node,
+ options,
+ visitorKeys,
+ )
+ }
+
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+
+ /**
+ * @param {Node} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ $visitChildren(node, options, visitorKeys) {
+ const { type } = node;
+
+ for (const key of /** @type {(keyof Node)[]} */ (
+ visitorKeys[type] || eslintVisitorKeys.getKeys(node)
+ )) {
+ const value = node[key];
+
+ if (Array.isArray(value)) {
+ for (const element of value) {
+ if (
+ isNode(element) &&
+ this.$visit(element, options, visitorKeys)
+ ) {
+ return true
+ }
+ }
+ } else if (
+ isNode(value) &&
+ this.$visit(value, options, visitorKeys)
+ ) {
+ return true
+ }
+ }
+
+ return false
+ },
+
+ ArrowFunctionExpression() {
+ return false
+ },
+ AssignmentExpression() {
+ return true
+ },
+ AwaitExpression() {
+ return true
+ },
+ /**
+ * @param {BinaryExpression} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ BinaryExpression(node, options, visitorKeys) {
+ if (
+ options.considerImplicitTypeConversion &&
+ typeConversionBinaryOps.has(node.operator) &&
+ (node.left.type !== "Literal" || node.right.type !== "Literal")
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ CallExpression() {
+ return true
+ },
+ FunctionExpression() {
+ return false
+ },
+ ImportExpression() {
+ return true
+ },
+ /**
+ * @param {MemberExpression} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ MemberExpression(node, options, visitorKeys) {
+ if (options.considerGetters) {
+ return true
+ }
+ if (
+ options.considerImplicitTypeConversion &&
+ node.computed &&
+ node.property.type !== "Literal"
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ /**
+ * @param {MethodDefinition} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ MethodDefinition(node, options, visitorKeys) {
+ if (
+ options.considerImplicitTypeConversion &&
+ node.computed &&
+ node.key.type !== "Literal"
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ NewExpression() {
+ return true
+ },
+ /**
+ * @param {Property} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ Property(node, options, visitorKeys) {
+ if (
+ options.considerImplicitTypeConversion &&
+ node.computed &&
+ node.key.type !== "Literal"
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ /**
+ * @param {PropertyDefinition} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ PropertyDefinition(node, options, visitorKeys) {
+ if (
+ options.considerImplicitTypeConversion &&
+ node.computed &&
+ node.key.type !== "Literal"
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ /**
+ * @param {UnaryExpression} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ UnaryExpression(node, options, visitorKeys) {
+ if (node.operator === "delete") {
+ return true
+ }
+ if (
+ options.considerImplicitTypeConversion &&
+ typeConversionUnaryOps.has(node.operator) &&
+ node.argument.type !== "Literal"
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ UpdateExpression() {
+ return true
+ },
+ YieldExpression() {
+ return true
+ },
+ }),
+);
+
+/**
+ * Check whether a given node has any side effect or not.
+ * @param {Node} node The node to get.
+ * @param {SourceCode} sourceCode The source code object.
+ * @param {HasSideEffectOptions} [options] The option object.
+ * @returns {boolean} `true` if the node has a certain side effect.
+ */
+function hasSideEffect(node, sourceCode, options = {}) {
+ const { considerGetters = false, considerImplicitTypeConversion = false } =
+ options;
+ return visitor.$visit(
+ node,
+ { considerGetters, considerImplicitTypeConversion },
+ sourceCode.visitorKeys || eslintVisitorKeys.KEYS,
+ )
+}
+
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("@typescript-eslint/types").TSESTree.NewExpression} TSNewExpression */
+/** @typedef {import("@typescript-eslint/types").TSESTree.CallExpression} TSCallExpression */
+/** @typedef {import("eslint").SourceCode} SourceCode */
+/** @typedef {import("eslint").AST.Token} Token */
+/** @typedef {import("eslint").Rule.Node} RuleNode */
+
+/**
+ * Get the left parenthesis of the parent node syntax if it exists.
+ * E.g., `if (a) {}` then the `(`.
+ * @param {Node} node The AST node to check.
+ * @param {SourceCode} sourceCode The source code object to get tokens.
+ * @returns {Token|null} The left parenthesis of the parent node syntax
+ */
+// eslint-disable-next-line complexity
+function getParentSyntaxParen(node, sourceCode) {
+ const parent = /** @type {RuleNode} */ (node).parent;
+
+ switch (parent.type) {
+ case "CallExpression":
+ case "NewExpression":
+ if (parent.arguments.length === 1 && parent.arguments[0] === node) {
+ return sourceCode.getTokenAfter(
+ // @ts-expect-error https://github.com/typescript-eslint/typescript-eslint/pull/5384
+ parent.typeArguments ||
+ /** @type {RuleNode} */ (
+ /** @type {unknown} */ (
+ /** @type {TSNewExpression | TSCallExpression} */ (
+ parent
+ ).typeParameters
+ )
+ ) ||
+ parent.callee,
+ isOpeningParenToken,
+ )
+ }
+ return null
+
+ case "DoWhileStatement":
+ if (parent.test === node) {
+ return sourceCode.getTokenAfter(
+ parent.body,
+ isOpeningParenToken,
+ )
+ }
+ return null
+
+ case "IfStatement":
+ case "WhileStatement":
+ if (parent.test === node) {
+ return sourceCode.getFirstToken(parent, 1)
+ }
+ return null
+
+ case "ImportExpression":
+ if (parent.source === node) {
+ return sourceCode.getFirstToken(parent, 1)
+ }
+ return null
+
+ case "SwitchStatement":
+ if (parent.discriminant === node) {
+ return sourceCode.getFirstToken(parent, 1)
+ }
+ return null
+
+ case "WithStatement":
+ if (parent.object === node) {
+ return sourceCode.getFirstToken(parent, 1)
+ }
+ return null
+
+ default:
+ return null
+ }
+}
+
+/**
+ * Check whether a given node is parenthesized or not.
+ * @param {number} times The number of parantheses.
+ * @param {Node} node The AST node to check.
+ * @param {SourceCode} sourceCode The source code object to get tokens.
+ * @returns {boolean} `true` if the node is parenthesized the given times.
+ */
+/**
+ * Check whether a given node is parenthesized or not.
+ * @param {Node} node The AST node to check.
+ * @param {SourceCode} sourceCode The source code object to get tokens.
+ * @returns {boolean} `true` if the node is parenthesized.
+ */
+/**
+ * Check whether a given node is parenthesized or not.
+ * @param {Node|number} timesOrNode The first parameter.
+ * @param {Node|SourceCode} nodeOrSourceCode The second parameter.
+ * @param {SourceCode} [optionalSourceCode] The third parameter.
+ * @returns {boolean} `true` if the node is parenthesized.
+ */
+function isParenthesized(
+ timesOrNode,
+ nodeOrSourceCode,
+ optionalSourceCode,
+) {
+ /** @type {number} */
+ let times,
+ /** @type {RuleNode} */
+ node,
+ /** @type {SourceCode} */
+ sourceCode,
+ maybeLeftParen,
+ maybeRightParen;
+ if (typeof timesOrNode === "number") {
+ times = timesOrNode | 0;
+ node = /** @type {RuleNode} */ (nodeOrSourceCode);
+ sourceCode = /** @type {SourceCode} */ (optionalSourceCode);
+ if (!(times >= 1)) {
+ throw new TypeError("'times' should be a positive integer.")
+ }
+ } else {
+ times = 1;
+ node = /** @type {RuleNode} */ (timesOrNode);
+ sourceCode = /** @type {SourceCode} */ (nodeOrSourceCode);
+ }
+
+ if (
+ node == null ||
+ // `Program` can't be parenthesized
+ node.parent == null ||
+ // `CatchClause.param` can't be parenthesized, example `try {} catch (error) {}`
+ (node.parent.type === "CatchClause" && node.parent.param === node)
+ ) {
+ return false
+ }
+
+ maybeLeftParen = maybeRightParen = node;
+ do {
+ maybeLeftParen = sourceCode.getTokenBefore(maybeLeftParen);
+ maybeRightParen = sourceCode.getTokenAfter(maybeRightParen);
+ } while (
+ maybeLeftParen != null &&
+ maybeRightParen != null &&
+ isOpeningParenToken(maybeLeftParen) &&
+ isClosingParenToken(maybeRightParen) &&
+ // Avoid false positive such as `if (a) {}`
+ maybeLeftParen !== getParentSyntaxParen(node, sourceCode) &&
+ --times > 0
+ )
+
+ return times === 0
+}
+
+/**
+ * @author Toru Nagashima
+ * See LICENSE file in root directory for full license.
+ */
+
+const placeholder = /\$(?:[$&`']|[1-9][0-9]?)/gu;
+
+/** @type {WeakMap} */
+const internal = new WeakMap();
+
+/**
+ * Check whether a given character is escaped or not.
+ * @param {string} str The string to check.
+ * @param {number} index The location of the character to check.
+ * @returns {boolean} `true` if the character is escaped.
+ */
+function isEscaped(str, index) {
+ let escaped = false;
+ for (let i = index - 1; i >= 0 && str.charCodeAt(i) === 0x5c; --i) {
+ escaped = !escaped;
+ }
+ return escaped
+}
+
+/**
+ * Replace a given string by a given matcher.
+ * @param {PatternMatcher} matcher The pattern matcher.
+ * @param {string} str The string to be replaced.
+ * @param {string} replacement The new substring to replace each matched part.
+ * @returns {string} The replaced string.
+ */
+function replaceS(matcher, str, replacement) {
+ const chunks = [];
+ let index = 0;
+
+ /**
+ * @param {string} key The placeholder.
+ * @param {RegExpExecArray} match The matched information.
+ * @returns {string} The replaced string.
+ */
+ function replacer(key, match) {
+ switch (key) {
+ case "$$":
+ return "$"
+ case "$&":
+ return match[0]
+ case "$`":
+ return str.slice(0, match.index)
+ case "$'":
+ return str.slice(match.index + match[0].length)
+ default: {
+ const i = key.slice(1);
+ if (i in match) {
+ return match[/** @type {any} */ (i)]
+ }
+ return key
+ }
+ }
+ }
+
+ for (const match of matcher.execAll(str)) {
+ chunks.push(str.slice(index, match.index));
+ chunks.push(
+ replacement.replace(placeholder, (key) => replacer(key, match)),
+ );
+ index = match.index + match[0].length;
+ }
+ chunks.push(str.slice(index));
+
+ return chunks.join("")
+}
+
+/**
+ * Replace a given string by a given matcher.
+ * @param {PatternMatcher} matcher The pattern matcher.
+ * @param {string} str The string to be replaced.
+ * @param {(substring: string, ...args: any[]) => string} replace The function to replace each matched part.
+ * @returns {string} The replaced string.
+ */
+function replaceF(matcher, str, replace) {
+ const chunks = [];
+ let index = 0;
+
+ for (const match of matcher.execAll(str)) {
+ chunks.push(str.slice(index, match.index));
+ chunks.push(
+ String(
+ replace(
+ .../** @type {[string, ...string[]]} */ (
+ /** @type {string[]} */ (match)
+ ),
+ match.index,
+ match.input,
+ ),
+ ),
+ );
+ index = match.index + match[0].length;
+ }
+ chunks.push(str.slice(index));
+
+ return chunks.join("")
+}
+
+/**
+ * The class to find patterns as considering escape sequences.
+ */
+class PatternMatcher {
+ /**
+ * Initialize this matcher.
+ * @param {RegExp} pattern The pattern to match.
+ * @param {{escaped?:boolean}} [options] The options.
+ */
+ constructor(pattern, options = {}) {
+ const { escaped = false } = options;
+ if (!(pattern instanceof RegExp)) {
+ throw new TypeError("'pattern' should be a RegExp instance.")
+ }
+ if (!pattern.flags.includes("g")) {
+ throw new Error("'pattern' should contains 'g' flag.")
+ }
+
+ internal.set(this, {
+ pattern: new RegExp(pattern.source, pattern.flags),
+ escaped: Boolean(escaped),
+ });
+ }
+
+ /**
+ * Find the pattern in a given string.
+ * @param {string} str The string to find.
+ * @returns {IterableIterator} The iterator which iterate the matched information.
+ */
+ *execAll(str) {
+ const { pattern, escaped } =
+ /** @type {{pattern:RegExp,escaped:boolean}} */ (internal.get(this));
+ let match = null;
+ let lastIndex = 0;
+
+ pattern.lastIndex = 0;
+ while ((match = pattern.exec(str)) != null) {
+ if (escaped || !isEscaped(str, match.index)) {
+ lastIndex = pattern.lastIndex;
+ yield match;
+ pattern.lastIndex = lastIndex;
+ }
+ }
+ }
+
+ /**
+ * Check whether the pattern is found in a given string.
+ * @param {string} str The string to check.
+ * @returns {boolean} `true` if the pattern was found in the string.
+ */
+ test(str) {
+ const it = this.execAll(str);
+ const ret = it.next();
+ return !ret.done
+ }
+
+ /**
+ * Replace a given string.
+ * @param {string} str The string to be replaced.
+ * @param {(string|((...strs:string[])=>string))} replacer The string or function to replace. This is the same as the 2nd argument of `String.prototype.replace`.
+ * @returns {string} The replaced string.
+ */
+ [Symbol.replace](str, replacer) {
+ return typeof replacer === "function"
+ ? replaceF(this, String(str), replacer)
+ : replaceS(this, String(str), String(replacer))
+ }
+}
+
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("eslint").Scope.Variable} Variable */
+/** @typedef {import("eslint").Rule.Node} RuleNode */
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").Pattern} Pattern */
+/** @typedef {import("estree").Identifier} Identifier */
+/** @typedef {import("estree").SimpleCallExpression} CallExpression */
+/** @typedef {import("estree").Program} Program */
+/** @typedef {import("estree").ImportDeclaration} ImportDeclaration */
+/** @typedef {import("estree").ExportAllDeclaration} ExportAllDeclaration */
+/** @typedef {import("estree").ExportDefaultDeclaration} ExportDefaultDeclaration */
+/** @typedef {import("estree").ExportNamedDeclaration} ExportNamedDeclaration */
+/** @typedef {import("estree").ImportSpecifier} ImportSpecifier */
+/** @typedef {import("estree").ImportDefaultSpecifier} ImportDefaultSpecifier */
+/** @typedef {import("estree").ImportNamespaceSpecifier} ImportNamespaceSpecifier */
+/** @typedef {import("estree").ExportSpecifier} ExportSpecifier */
+/** @typedef {import("estree").Property} Property */
+/** @typedef {import("estree").AssignmentProperty} AssignmentProperty */
+/** @typedef {import("estree").Literal} Literal */
+/** @typedef {import("@typescript-eslint/types").TSESTree.Node} TSESTreeNode */
+/** @typedef {import("./types.mjs").ReferenceTrackerOptions} ReferenceTrackerOptions */
+/**
+ * @template T
+ * @typedef {import("./types.mjs").TraceMap} TraceMap
+ */
+/**
+ * @template T
+ * @typedef {import("./types.mjs").TraceMapObject} TraceMapObject
+ */
+/**
+ * @template T
+ * @typedef {import("./types.mjs").TrackedReferences} TrackedReferences
+ */
+
+const IMPORT_TYPE = /^(?:Import|Export(?:All|Default|Named))Declaration$/u;
+
+/**
+ * Check whether a given node is an import node or not.
+ * @param {Node} node
+ * @returns {node is ImportDeclaration|ExportAllDeclaration|ExportNamedDeclaration&{source: Literal}} `true` if the node is an import node.
+ */
+function isHasSource(node) {
+ return (
+ IMPORT_TYPE.test(node.type) &&
+ /** @type {ImportDeclaration|ExportAllDeclaration|ExportNamedDeclaration} */ (
+ node
+ ).source != null
+ )
+}
+const has =
+ /** @type {(traceMap: TraceMap, v: T) => v is (string extends T ? string : T)} */ (
+ Function.call.bind(Object.hasOwnProperty)
+ );
+
+const READ = Symbol("read");
+const CALL = Symbol("call");
+const CONSTRUCT = Symbol("construct");
+const ESM = Symbol("esm");
+
+const requireCall = { require: { [CALL]: true } };
+
+/**
+ * Check whether a given variable is modified or not.
+ * @param {Variable|undefined} variable The variable to check.
+ * @returns {boolean} `true` if the variable is modified.
+ */
+function isModifiedGlobal(variable) {
+ return (
+ variable == null ||
+ variable.defs.length !== 0 ||
+ variable.references.some((r) => r.isWrite())
+ )
+}
+
+/**
+ * Check if the value of a given node is passed through to the parent syntax as-is.
+ * For example, `a` and `b` in (`a || b` and `c ? a : b`) are passed through.
+ * @param {Node} node A node to check.
+ * @returns {node is RuleNode & {parent: Expression}} `true` if the node is passed through.
+ */
+function isPassThrough(node) {
+ const parent = /** @type {TSESTreeNode} */ (node).parent;
+
+ if (parent) {
+ switch (parent.type) {
+ case "ConditionalExpression":
+ return parent.consequent === node || parent.alternate === node
+ case "LogicalExpression":
+ return true
+ case "SequenceExpression":
+ return (
+ parent.expressions[parent.expressions.length - 1] === node
+ )
+ case "ChainExpression":
+ return true
+ case "TSAsExpression":
+ case "TSSatisfiesExpression":
+ case "TSTypeAssertion":
+ case "TSNonNullExpression":
+ case "TSInstantiationExpression":
+ return true
+
+ default:
+ return false
+ }
+ }
+ return false
+}
+
+/**
+ * The reference tracker.
+ */
+class ReferenceTracker {
+ /**
+ * Initialize this tracker.
+ * @param {Scope} globalScope The global scope.
+ * @param {object} [options] The options.
+ * @param {"legacy"|"strict"} [options.mode="strict"] The mode to determine the ImportDeclaration's behavior for CJS modules.
+ * @param {string[]} [options.globalObjectNames=["global","globalThis","self","window"]] The variable names for Global Object.
+ */
+ constructor(globalScope, options = {}) {
+ const {
+ mode = "strict",
+ globalObjectNames = ["global", "globalThis", "self", "window"],
+ } = options;
+ /** @private @type {Variable[]} */
+ this.variableStack = [];
+ /** @private */
+ this.globalScope = globalScope;
+ /** @private */
+ this.mode = mode;
+ /** @private */
+ this.globalObjectNames = globalObjectNames.slice(0);
+ }
+
+ /**
+ * Iterate the references of global variables.
+ * @template T
+ * @param {TraceMap} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *iterateGlobalReferences(traceMap) {
+ for (const key of Object.keys(traceMap)) {
+ const nextTraceMap = traceMap[key];
+ const path = [key];
+ const variable = this.globalScope.set.get(key);
+
+ if (isModifiedGlobal(variable)) {
+ continue
+ }
+
+ yield* this._iterateVariableReferences(
+ /** @type {Variable} */ (variable),
+ path,
+ nextTraceMap,
+ true,
+ );
+ }
+
+ for (const key of this.globalObjectNames) {
+ /** @type {string[]} */
+ const path = [];
+ const variable = this.globalScope.set.get(key);
+
+ if (isModifiedGlobal(variable)) {
+ continue
+ }
+
+ yield* this._iterateVariableReferences(
+ /** @type {Variable} */ (variable),
+ path,
+ traceMap,
+ false,
+ );
+ }
+ }
+
+ /**
+ * Iterate the references of CommonJS modules.
+ * @template T
+ * @param {TraceMap} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *iterateCjsReferences(traceMap) {
+ for (const { node } of this.iterateGlobalReferences(requireCall)) {
+ const key = getStringIfConstant(
+ /** @type {CallExpression} */ (node).arguments[0],
+ );
+ if (key == null || !has(traceMap, key)) {
+ continue
+ }
+
+ const nextTraceMap = traceMap[key];
+ const path = [key];
+
+ if (nextTraceMap[READ]) {
+ yield {
+ node,
+ path,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+ yield* this._iteratePropertyReferences(
+ /** @type {CallExpression} */ (node),
+ path,
+ nextTraceMap,
+ );
+ }
+ }
+
+ /**
+ * Iterate the references of ES modules.
+ * @template T
+ * @param {TraceMap} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *iterateEsmReferences(traceMap) {
+ const programNode = /** @type {Program} */ (this.globalScope.block);
+
+ for (const node of programNode.body) {
+ if (!isHasSource(node)) {
+ continue
+ }
+ const moduleId = /** @type {string} */ (node.source.value);
+
+ if (!has(traceMap, moduleId)) {
+ continue
+ }
+ const nextTraceMap = traceMap[moduleId];
+ const path = [moduleId];
+
+ if (nextTraceMap[READ]) {
+ yield {
+ // eslint-disable-next-line object-shorthand -- apply type
+ node: /** @type {RuleNode} */ (node),
+ path,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+
+ if (node.type === "ExportAllDeclaration") {
+ for (const key of Object.keys(nextTraceMap)) {
+ const exportTraceMap = nextTraceMap[key];
+ if (exportTraceMap[READ]) {
+ yield {
+ // eslint-disable-next-line object-shorthand -- apply type
+ node: /** @type {RuleNode} */ (node),
+ path: path.concat(key),
+ type: READ,
+ info: exportTraceMap[READ],
+ };
+ }
+ }
+ } else {
+ for (const specifier of node.specifiers) {
+ const esm = has(nextTraceMap, ESM);
+ const it = this._iterateImportReferences(
+ specifier,
+ path,
+ esm
+ ? nextTraceMap
+ : this.mode === "legacy"
+ ? { default: nextTraceMap, ...nextTraceMap }
+ : { default: nextTraceMap },
+ );
+
+ if (esm) {
+ yield* it;
+ } else {
+ for (const report of it) {
+ report.path = report.path.filter(exceptDefault);
+ if (
+ report.path.length >= 2 ||
+ report.type !== READ
+ ) {
+ yield report;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Iterate the property references for a given expression AST node.
+ * @template T
+ * @param {Expression} node The expression AST node to iterate property references.
+ * @param {TraceMap} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate property references.
+ */
+ *iteratePropertyReferences(node, traceMap) {
+ yield* this._iteratePropertyReferences(node, [], traceMap);
+ }
+
+ /**
+ * Iterate the references for a given variable.
+ * @private
+ * @template T
+ * @param {Variable} variable The variable to iterate that references.
+ * @param {string[]} path The current path.
+ * @param {TraceMapObject} traceMap The trace map.
+ * @param {boolean} shouldReport = The flag to report those references.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *_iterateVariableReferences(variable, path, traceMap, shouldReport) {
+ if (this.variableStack.includes(variable)) {
+ return
+ }
+ this.variableStack.push(variable);
+ try {
+ for (const reference of variable.references) {
+ if (!reference.isRead()) {
+ continue
+ }
+ const node = /** @type {RuleNode & Identifier} */ (
+ reference.identifier
+ );
+
+ if (shouldReport && traceMap[READ]) {
+ yield { node, path, type: READ, info: traceMap[READ] };
+ }
+ yield* this._iteratePropertyReferences(node, path, traceMap);
+ }
+ } finally {
+ this.variableStack.pop();
+ }
+ }
+
+ /**
+ * Iterate the references for a given AST node.
+ * @private
+ * @template T
+ * @param {Expression} rootNode The AST node to iterate references.
+ * @param {string[]} path The current path.
+ * @param {TraceMapObject} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ //eslint-disable-next-line complexity
+ *_iteratePropertyReferences(rootNode, path, traceMap) {
+ let node = rootNode;
+ while (isPassThrough(node)) {
+ node = node.parent;
+ }
+
+ const parent = /** @type {RuleNode} */ (node).parent;
+ if (parent.type === "MemberExpression") {
+ if (parent.object === node) {
+ const key = getPropertyName(parent);
+ if (key == null || !has(traceMap, key)) {
+ return
+ }
+
+ path = path.concat(key); //eslint-disable-line no-param-reassign
+ const nextTraceMap = traceMap[key];
+ if (nextTraceMap[READ]) {
+ yield {
+ node: parent,
+ path,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+ yield* this._iteratePropertyReferences(
+ parent,
+ path,
+ nextTraceMap,
+ );
+ }
+ return
+ }
+ if (parent.type === "CallExpression") {
+ if (parent.callee === node && traceMap[CALL]) {
+ yield { node: parent, path, type: CALL, info: traceMap[CALL] };
+ }
+ return
+ }
+ if (parent.type === "NewExpression") {
+ if (parent.callee === node && traceMap[CONSTRUCT]) {
+ yield {
+ node: parent,
+ path,
+ type: CONSTRUCT,
+ info: traceMap[CONSTRUCT],
+ };
+ }
+ return
+ }
+ if (parent.type === "AssignmentExpression") {
+ if (parent.right === node) {
+ yield* this._iterateLhsReferences(parent.left, path, traceMap);
+ yield* this._iteratePropertyReferences(parent, path, traceMap);
+ }
+ return
+ }
+ if (parent.type === "AssignmentPattern") {
+ if (parent.right === node) {
+ yield* this._iterateLhsReferences(parent.left, path, traceMap);
+ }
+ return
+ }
+ if (parent.type === "VariableDeclarator") {
+ if (parent.init === node) {
+ yield* this._iterateLhsReferences(parent.id, path, traceMap);
+ }
+ }
+ }
+
+ /**
+ * Iterate the references for a given Pattern node.
+ * @private
+ * @template T
+ * @param {Pattern} patternNode The Pattern node to iterate references.
+ * @param {string[]} path The current path.
+ * @param {TraceMapObject} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *_iterateLhsReferences(patternNode, path, traceMap) {
+ if (patternNode.type === "Identifier") {
+ const variable = findVariable(this.globalScope, patternNode);
+ if (variable != null) {
+ yield* this._iterateVariableReferences(
+ variable,
+ path,
+ traceMap,
+ false,
+ );
+ }
+ return
+ }
+ if (patternNode.type === "ObjectPattern") {
+ for (const property of patternNode.properties) {
+ const key = getPropertyName(
+ /** @type {AssignmentProperty} */ (property),
+ );
+
+ if (key == null || !has(traceMap, key)) {
+ continue
+ }
+
+ const nextPath = path.concat(key);
+ const nextTraceMap = traceMap[key];
+ if (nextTraceMap[READ]) {
+ yield {
+ node: /** @type {RuleNode} */ (property),
+ path: nextPath,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+ yield* this._iterateLhsReferences(
+ /** @type {AssignmentProperty} */ (property).value,
+ nextPath,
+ nextTraceMap,
+ );
+ }
+ return
+ }
+ if (patternNode.type === "AssignmentPattern") {
+ yield* this._iterateLhsReferences(patternNode.left, path, traceMap);
+ }
+ }
+
+ /**
+ * Iterate the references for a given ModuleSpecifier node.
+ * @private
+ * @template T
+ * @param {ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier} specifierNode The ModuleSpecifier node to iterate references.
+ * @param {string[]} path The current path.
+ * @param {TraceMapObject} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *_iterateImportReferences(specifierNode, path, traceMap) {
+ const type = specifierNode.type;
+
+ if (type === "ImportSpecifier" || type === "ImportDefaultSpecifier") {
+ const key =
+ type === "ImportDefaultSpecifier"
+ ? "default"
+ : specifierNode.imported.type === "Identifier"
+ ? specifierNode.imported.name
+ : specifierNode.imported.value;
+ if (!has(traceMap, key)) {
+ return
+ }
+
+ path = path.concat(key); //eslint-disable-line no-param-reassign
+ const nextTraceMap = traceMap[key];
+ if (nextTraceMap[READ]) {
+ yield {
+ node: /** @type {RuleNode} */ (specifierNode),
+ path,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+ yield* this._iterateVariableReferences(
+ /** @type {Variable} */ (
+ findVariable(this.globalScope, specifierNode.local)
+ ),
+ path,
+ nextTraceMap,
+ false,
+ );
+
+ return
+ }
+
+ if (type === "ImportNamespaceSpecifier") {
+ yield* this._iterateVariableReferences(
+ /** @type {Variable} */ (
+ findVariable(this.globalScope, specifierNode.local)
+ ),
+ path,
+ traceMap,
+ false,
+ );
+ return
+ }
+
+ if (type === "ExportSpecifier") {
+ const key =
+ specifierNode.local.type === "Identifier"
+ ? specifierNode.local.name
+ : specifierNode.local.value;
+ if (!has(traceMap, key)) {
+ return
+ }
+
+ path = path.concat(key); //eslint-disable-line no-param-reassign
+ const nextTraceMap = traceMap[key];
+ if (nextTraceMap[READ]) {
+ yield {
+ node: /** @type {RuleNode} */ (specifierNode),
+ path,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+ }
+ }
+}
+
+ReferenceTracker.READ = READ;
+ReferenceTracker.CALL = CALL;
+ReferenceTracker.CONSTRUCT = CONSTRUCT;
+ReferenceTracker.ESM = ESM;
+
+/**
+ * This is a predicate function for Array#filter.
+ * @param {string} name A name part.
+ * @param {number} index The index of the name.
+ * @returns {boolean} `false` if it's default.
+ */
+function exceptDefault(name, index) {
+ return !(index === 1 && name === "default")
+}
+
+/** @typedef {import("./types.mjs").StaticValue} StaticValue */
+
+var index = {
+ CALL,
+ CONSTRUCT,
+ ESM,
+ findVariable,
+ getFunctionHeadLocation,
+ getFunctionNameWithKind,
+ getInnermostScope,
+ getPropertyName,
+ getStaticValue,
+ getStringIfConstant,
+ hasSideEffect,
+ isArrowToken,
+ isClosingBraceToken,
+ isClosingBracketToken,
+ isClosingParenToken,
+ isColonToken,
+ isCommaToken,
+ isCommentToken,
+ isNotArrowToken,
+ isNotClosingBraceToken,
+ isNotClosingBracketToken,
+ isNotClosingParenToken,
+ isNotColonToken,
+ isNotCommaToken,
+ isNotCommentToken,
+ isNotOpeningBraceToken,
+ isNotOpeningBracketToken,
+ isNotOpeningParenToken,
+ isNotSemicolonToken,
+ isOpeningBraceToken,
+ isOpeningBracketToken,
+ isOpeningParenToken,
+ isParenthesized,
+ isSemicolonToken,
+ PatternMatcher,
+ READ,
+ ReferenceTracker,
+};
+
+exports.CALL = CALL;
+exports.CONSTRUCT = CONSTRUCT;
+exports.ESM = ESM;
+exports.PatternMatcher = PatternMatcher;
+exports.READ = READ;
+exports.ReferenceTracker = ReferenceTracker;
+exports["default"] = index;
+exports.findVariable = findVariable;
+exports.getFunctionHeadLocation = getFunctionHeadLocation;
+exports.getFunctionNameWithKind = getFunctionNameWithKind;
+exports.getInnermostScope = getInnermostScope;
+exports.getPropertyName = getPropertyName;
+exports.getStaticValue = getStaticValue;
+exports.getStringIfConstant = getStringIfConstant;
+exports.hasSideEffect = hasSideEffect;
+exports.isArrowToken = isArrowToken;
+exports.isClosingBraceToken = isClosingBraceToken;
+exports.isClosingBracketToken = isClosingBracketToken;
+exports.isClosingParenToken = isClosingParenToken;
+exports.isColonToken = isColonToken;
+exports.isCommaToken = isCommaToken;
+exports.isCommentToken = isCommentToken;
+exports.isNotArrowToken = isNotArrowToken;
+exports.isNotClosingBraceToken = isNotClosingBraceToken;
+exports.isNotClosingBracketToken = isNotClosingBracketToken;
+exports.isNotClosingParenToken = isNotClosingParenToken;
+exports.isNotColonToken = isNotColonToken;
+exports.isNotCommaToken = isNotCommaToken;
+exports.isNotCommentToken = isNotCommentToken;
+exports.isNotOpeningBraceToken = isNotOpeningBraceToken;
+exports.isNotOpeningBracketToken = isNotOpeningBracketToken;
+exports.isNotOpeningParenToken = isNotOpeningParenToken;
+exports.isNotSemicolonToken = isNotSemicolonToken;
+exports.isOpeningBraceToken = isOpeningBraceToken;
+exports.isOpeningBracketToken = isOpeningBracketToken;
+exports.isOpeningParenToken = isOpeningParenToken;
+exports.isParenthesized = isParenthesized;
+exports.isSemicolonToken = isSemicolonToken;
+//# sourceMappingURL=index.js.map
diff --git a/slider/node_modules/@eslint-community/eslint-utils/index.js.map b/slider/node_modules/@eslint-community/eslint-utils/index.js.map
new file mode 100644
index 0000000..88ef384
--- /dev/null
+++ b/slider/node_modules/@eslint-community/eslint-utils/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["src/get-innermost-scope.mjs","src/find-variable.mjs","src/token-predicate.mjs","src/get-function-head-location.mjs","src/get-static-value.mjs","src/get-string-if-constant.mjs","src/get-property-name.mjs","src/get-function-name-with-kind.mjs","src/has-side-effect.mjs","src/is-parenthesized.mjs","src/pattern-matcher.mjs","src/reference-tracker.mjs","src/index.mjs"],"sourcesContent":["/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"estree\").Node} Node */\n\n/**\n * Get the innermost scope which contains a given location.\n * @param {Scope} initialScope The initial scope to search.\n * @param {Node} node The location to search.\n * @returns {Scope} The innermost scope.\n */\nexport function getInnermostScope(initialScope, node) {\n const location = /** @type {[number, number]} */ (node.range)[0]\n\n let scope = initialScope\n let found = false\n do {\n found = false\n for (const childScope of scope.childScopes) {\n const range = /** @type {[number, number]} */ (\n childScope.block.range\n )\n\n if (range[0] <= location && location < range[1]) {\n scope = childScope\n found = true\n break\n }\n }\n } while (found)\n\n return scope\n}\n","import { getInnermostScope } from \"./get-innermost-scope.mjs\"\n/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"eslint\").Scope.Variable} Variable */\n/** @typedef {import(\"estree\").Identifier} Identifier */\n\n/**\n * Find the variable of a given name.\n * @param {Scope} initialScope The scope to start finding.\n * @param {string|Identifier} nameOrNode The variable name to find. If this is a Node object then it should be an Identifier node.\n * @returns {Variable|null} The found variable or null.\n */\nexport function findVariable(initialScope, nameOrNode) {\n let name = \"\"\n /** @type {Scope|null} */\n let scope = initialScope\n\n if (typeof nameOrNode === \"string\") {\n name = nameOrNode\n } else {\n name = nameOrNode.name\n scope = getInnermostScope(scope, nameOrNode)\n }\n\n while (scope != null) {\n const variable = scope.set.get(name)\n if (variable != null) {\n return variable\n }\n scope = scope.upper\n }\n\n return null\n}\n","/** @typedef {import(\"eslint\").AST.Token} Token */\n/** @typedef {import(\"estree\").Comment} Comment */\n/** @typedef {import(\"./types.mjs\").ArrowToken} ArrowToken */\n/** @typedef {import(\"./types.mjs\").CommaToken} CommaToken */\n/** @typedef {import(\"./types.mjs\").SemicolonToken} SemicolonToken */\n/** @typedef {import(\"./types.mjs\").ColonToken} ColonToken */\n/** @typedef {import(\"./types.mjs\").OpeningParenToken} OpeningParenToken */\n/** @typedef {import(\"./types.mjs\").ClosingParenToken} ClosingParenToken */\n/** @typedef {import(\"./types.mjs\").OpeningBracketToken} OpeningBracketToken */\n/** @typedef {import(\"./types.mjs\").ClosingBracketToken} ClosingBracketToken */\n/** @typedef {import(\"./types.mjs\").OpeningBraceToken} OpeningBraceToken */\n/** @typedef {import(\"./types.mjs\").ClosingBraceToken} ClosingBraceToken */\n/**\n * @template {string} Value\n * @typedef {import(\"./types.mjs\").PunctuatorToken} PunctuatorToken\n */\n\n/** @typedef {Comment | Token} CommentOrToken */\n\n/**\n * Creates the negate function of the given function.\n * @param {function(CommentOrToken):boolean} f - The function to negate.\n * @returns {function(CommentOrToken):boolean} Negated function.\n */\nfunction negate(f) {\n return (token) => !f(token)\n}\n\n/**\n * Checks if the given token is a PunctuatorToken with the given value\n * @template {string} Value\n * @param {CommentOrToken} token - The token to check.\n * @param {Value} value - The value to check.\n * @returns {token is PunctuatorToken} `true` if the token is a PunctuatorToken with the given value.\n */\nfunction isPunctuatorTokenWithValue(token, value) {\n return token.type === \"Punctuator\" && token.value === value\n}\n\n/**\n * Checks if the given token is an arrow token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is ArrowToken} `true` if the token is an arrow token.\n */\nexport function isArrowToken(token) {\n return isPunctuatorTokenWithValue(token, \"=>\")\n}\n\n/**\n * Checks if the given token is a comma token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is CommaToken} `true` if the token is a comma token.\n */\nexport function isCommaToken(token) {\n return isPunctuatorTokenWithValue(token, \",\")\n}\n\n/**\n * Checks if the given token is a semicolon token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is SemicolonToken} `true` if the token is a semicolon token.\n */\nexport function isSemicolonToken(token) {\n return isPunctuatorTokenWithValue(token, \";\")\n}\n\n/**\n * Checks if the given token is a colon token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is ColonToken} `true` if the token is a colon token.\n */\nexport function isColonToken(token) {\n return isPunctuatorTokenWithValue(token, \":\")\n}\n\n/**\n * Checks if the given token is an opening parenthesis token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is OpeningParenToken} `true` if the token is an opening parenthesis token.\n */\nexport function isOpeningParenToken(token) {\n return isPunctuatorTokenWithValue(token, \"(\")\n}\n\n/**\n * Checks if the given token is a closing parenthesis token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is ClosingParenToken} `true` if the token is a closing parenthesis token.\n */\nexport function isClosingParenToken(token) {\n return isPunctuatorTokenWithValue(token, \")\")\n}\n\n/**\n * Checks if the given token is an opening square bracket token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is OpeningBracketToken} `true` if the token is an opening square bracket token.\n */\nexport function isOpeningBracketToken(token) {\n return isPunctuatorTokenWithValue(token, \"[\")\n}\n\n/**\n * Checks if the given token is a closing square bracket token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is ClosingBracketToken} `true` if the token is a closing square bracket token.\n */\nexport function isClosingBracketToken(token) {\n return isPunctuatorTokenWithValue(token, \"]\")\n}\n\n/**\n * Checks if the given token is an opening brace token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is OpeningBraceToken} `true` if the token is an opening brace token.\n */\nexport function isOpeningBraceToken(token) {\n return isPunctuatorTokenWithValue(token, \"{\")\n}\n\n/**\n * Checks if the given token is a closing brace token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is ClosingBraceToken} `true` if the token is a closing brace token.\n */\nexport function isClosingBraceToken(token) {\n return isPunctuatorTokenWithValue(token, \"}\")\n}\n\n/**\n * Checks if the given token is a comment token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is Comment} `true` if the token is a comment token.\n */\nexport function isCommentToken(token) {\n return [\"Block\", \"Line\", \"Shebang\"].includes(token.type)\n}\n\nexport const isNotArrowToken = negate(isArrowToken)\nexport const isNotCommaToken = negate(isCommaToken)\nexport const isNotSemicolonToken = negate(isSemicolonToken)\nexport const isNotColonToken = negate(isColonToken)\nexport const isNotOpeningParenToken = negate(isOpeningParenToken)\nexport const isNotClosingParenToken = negate(isClosingParenToken)\nexport const isNotOpeningBracketToken = negate(isOpeningBracketToken)\nexport const isNotClosingBracketToken = negate(isClosingBracketToken)\nexport const isNotOpeningBraceToken = negate(isOpeningBraceToken)\nexport const isNotClosingBraceToken = negate(isClosingBraceToken)\nexport const isNotCommentToken = negate(isCommentToken)\n","import { isArrowToken, isOpeningParenToken } from \"./token-predicate.mjs\"\n/** @typedef {import(\"eslint\").Rule.Node} RuleNode */\n/** @typedef {import(\"eslint\").SourceCode} SourceCode */\n/** @typedef {import(\"eslint\").AST.Token} Token */\n/** @typedef {import(\"estree\").Function} FunctionNode */\n/** @typedef {import(\"estree\").FunctionDeclaration} FunctionDeclaration */\n/** @typedef {import(\"estree\").FunctionExpression} FunctionExpression */\n/** @typedef {import(\"estree\").SourceLocation} SourceLocation */\n/** @typedef {import(\"estree\").Position} Position */\n\n/**\n * Get the `(` token of the given function node.\n * @param {FunctionExpression | FunctionDeclaration} node - The function node to get.\n * @param {SourceCode} sourceCode - The source code object to get tokens.\n * @returns {Token} `(` token.\n */\nfunction getOpeningParenOfParams(node, sourceCode) {\n return node.id\n ? /** @type {Token} */ (\n sourceCode.getTokenAfter(node.id, isOpeningParenToken)\n )\n : /** @type {Token} */ (\n sourceCode.getFirstToken(node, isOpeningParenToken)\n )\n}\n\n/**\n * Get the location of the given function node for reporting.\n * @param {FunctionNode} node - The function node to get.\n * @param {SourceCode} sourceCode - The source code object to get tokens.\n * @returns {SourceLocation|null} The location of the function node for reporting.\n */\nexport function getFunctionHeadLocation(node, sourceCode) {\n const parent = /** @type {RuleNode} */ (node).parent\n\n /** @type {Position|null} */\n let start = null\n /** @type {Position|null} */\n let end = null\n\n if (node.type === \"ArrowFunctionExpression\") {\n const arrowToken = /** @type {Token} */ (\n sourceCode.getTokenBefore(node.body, isArrowToken)\n )\n\n start = arrowToken.loc.start\n end = arrowToken.loc.end\n } else if (\n parent.type === \"Property\" ||\n parent.type === \"MethodDefinition\" ||\n parent.type === \"PropertyDefinition\"\n ) {\n start = /** @type {SourceLocation} */ (parent.loc).start\n end = getOpeningParenOfParams(node, sourceCode).loc.start\n } else {\n start = /** @type {SourceLocation} */ (node.loc).start\n end = getOpeningParenOfParams(node, sourceCode).loc.start\n }\n\n return {\n start: { ...start },\n end: { ...end },\n }\n}\n","/* globals globalThis, global, self, window */\n\nimport { findVariable } from \"./find-variable.mjs\"\n/** @typedef {import(\"./types.mjs\").StaticValue} StaticValue */\n/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"eslint\").Scope.Variable} Variable */\n/** @typedef {import(\"estree\").Node} Node */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.Node} TSESTreeNode */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.AST_NODE_TYPES} TSESTreeNodeTypes */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.MemberExpression} MemberExpression */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.Property} Property */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.RegExpLiteral} RegExpLiteral */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.BigIntLiteral} BigIntLiteral */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.Literal} Literal */\n\nconst globalObject =\n typeof globalThis !== \"undefined\"\n ? globalThis\n : // @ts-ignore\n typeof self !== \"undefined\"\n ? // @ts-ignore\n self\n : // @ts-ignore\n typeof window !== \"undefined\"\n ? // @ts-ignore\n window\n : typeof global !== \"undefined\"\n ? global\n : {}\n\nconst builtinNames = Object.freeze(\n new Set([\n \"Array\",\n \"ArrayBuffer\",\n \"BigInt\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n \"Boolean\",\n \"DataView\",\n \"Date\",\n \"decodeURI\",\n \"decodeURIComponent\",\n \"encodeURI\",\n \"encodeURIComponent\",\n \"escape\",\n \"Float32Array\",\n \"Float64Array\",\n \"Function\",\n \"Infinity\",\n \"Int16Array\",\n \"Int32Array\",\n \"Int8Array\",\n \"isFinite\",\n \"isNaN\",\n \"isPrototypeOf\",\n \"JSON\",\n \"Map\",\n \"Math\",\n \"NaN\",\n \"Number\",\n \"Object\",\n \"parseFloat\",\n \"parseInt\",\n \"Promise\",\n \"Proxy\",\n \"Reflect\",\n \"RegExp\",\n \"Set\",\n \"String\",\n \"Symbol\",\n \"Uint16Array\",\n \"Uint32Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"undefined\",\n \"unescape\",\n \"WeakMap\",\n \"WeakSet\",\n ]),\n)\nconst callAllowed = new Set(\n [\n Array.isArray,\n Array.of,\n Array.prototype.at,\n Array.prototype.concat,\n Array.prototype.entries,\n Array.prototype.every,\n Array.prototype.filter,\n Array.prototype.find,\n Array.prototype.findIndex,\n Array.prototype.flat,\n Array.prototype.includes,\n Array.prototype.indexOf,\n Array.prototype.join,\n Array.prototype.keys,\n Array.prototype.lastIndexOf,\n Array.prototype.slice,\n Array.prototype.some,\n Array.prototype.toString,\n Array.prototype.values,\n typeof BigInt === \"function\" ? BigInt : undefined,\n Boolean,\n Date,\n Date.parse,\n decodeURI,\n decodeURIComponent,\n encodeURI,\n encodeURIComponent,\n escape,\n isFinite,\n isNaN,\n // @ts-ignore\n isPrototypeOf,\n Map,\n Map.prototype.entries,\n Map.prototype.get,\n Map.prototype.has,\n Map.prototype.keys,\n Map.prototype.values,\n .../** @type {(keyof typeof Math)[]} */ (\n Object.getOwnPropertyNames(Math)\n )\n .filter((k) => k !== \"random\")\n .map((k) => Math[k])\n .filter((f) => typeof f === \"function\"),\n Number,\n Number.isFinite,\n Number.isNaN,\n Number.parseFloat,\n Number.parseInt,\n Number.prototype.toExponential,\n Number.prototype.toFixed,\n Number.prototype.toPrecision,\n Number.prototype.toString,\n Object,\n Object.entries,\n Object.is,\n Object.isExtensible,\n Object.isFrozen,\n Object.isSealed,\n Object.keys,\n Object.values,\n parseFloat,\n parseInt,\n RegExp,\n Set,\n Set.prototype.entries,\n Set.prototype.has,\n Set.prototype.keys,\n Set.prototype.values,\n String,\n String.fromCharCode,\n String.fromCodePoint,\n String.raw,\n String.prototype.at,\n String.prototype.charAt,\n String.prototype.charCodeAt,\n String.prototype.codePointAt,\n String.prototype.concat,\n String.prototype.endsWith,\n String.prototype.includes,\n String.prototype.indexOf,\n String.prototype.lastIndexOf,\n String.prototype.normalize,\n String.prototype.padEnd,\n String.prototype.padStart,\n String.prototype.slice,\n String.prototype.startsWith,\n String.prototype.substr,\n String.prototype.substring,\n String.prototype.toLowerCase,\n String.prototype.toString,\n String.prototype.toUpperCase,\n String.prototype.trim,\n String.prototype.trimEnd,\n String.prototype.trimLeft,\n String.prototype.trimRight,\n String.prototype.trimStart,\n Symbol.for,\n Symbol.keyFor,\n unescape,\n ].filter((f) => typeof f === \"function\"),\n)\nconst callPassThrough = new Set([\n Object.freeze,\n Object.preventExtensions,\n Object.seal,\n])\n\n/** @type {ReadonlyArray]>} */\nconst getterAllowed = [\n [Map, new Set([\"size\"])],\n [\n RegExp,\n new Set([\n \"dotAll\",\n \"flags\",\n \"global\",\n \"hasIndices\",\n \"ignoreCase\",\n \"multiline\",\n \"source\",\n \"sticky\",\n \"unicode\",\n ]),\n ],\n [Set, new Set([\"size\"])],\n]\n\n/**\n * Get the property descriptor.\n * @param {object} object The object to get.\n * @param {string|number|symbol} name The property name to get.\n */\nfunction getPropertyDescriptor(object, name) {\n let x = object\n while ((typeof x === \"object\" || typeof x === \"function\") && x !== null) {\n const d = Object.getOwnPropertyDescriptor(x, name)\n if (d) {\n return d\n }\n x = Object.getPrototypeOf(x)\n }\n return null\n}\n\n/**\n * Check if a property is getter or not.\n * @param {object} object The object to check.\n * @param {string|number|symbol} name The property name to check.\n */\nfunction isGetter(object, name) {\n const d = getPropertyDescriptor(object, name)\n return d != null && d.get != null\n}\n\n/**\n * Get the element values of a given node list.\n * @param {(Node|TSESTreeNode|null)[]} nodeList The node list to get values.\n * @param {Scope|undefined|null} initialScope The initial scope to find variables.\n * @returns {any[]|null} The value list if all nodes are constant. Otherwise, null.\n */\nfunction getElementValues(nodeList, initialScope) {\n const valueList = []\n\n for (let i = 0; i < nodeList.length; ++i) {\n const elementNode = nodeList[i]\n\n if (elementNode == null) {\n valueList.length = i + 1\n } else if (elementNode.type === \"SpreadElement\") {\n const argument = getStaticValueR(elementNode.argument, initialScope)\n if (argument == null) {\n return null\n }\n valueList.push(.../** @type {Iterable} */ (argument.value))\n } else {\n const element = getStaticValueR(elementNode, initialScope)\n if (element == null) {\n return null\n }\n valueList.push(element.value)\n }\n }\n\n return valueList\n}\n\n/**\n * Checks if a variable is a built-in global.\n * @param {Variable|null} variable The variable to check.\n * @returns {variable is Variable & {defs:[]}}\n */\nfunction isBuiltinGlobal(variable) {\n return (\n variable != null &&\n variable.defs.length === 0 &&\n builtinNames.has(variable.name) &&\n variable.name in globalObject\n )\n}\n\n/**\n * Checks if a variable can be considered as a constant.\n * @param {Variable} variable\n * @returns {variable is Variable & {defs: [import(\"eslint\").Scope.Definition & { type: \"Variable\" }]}} True if the variable can be considered as a constant.\n */\nfunction canBeConsideredConst(variable) {\n if (variable.defs.length !== 1) {\n return false\n }\n const def = variable.defs[0]\n return Boolean(\n def.parent &&\n def.type === \"Variable\" &&\n (def.parent.kind === \"const\" || isEffectivelyConst(variable)),\n )\n}\n\n/**\n * Returns whether the given variable is never written to after initialization.\n * @param {Variable} variable\n * @returns {boolean}\n */\nfunction isEffectivelyConst(variable) {\n const refs = variable.references\n\n const inits = refs.filter((r) => r.init).length\n const reads = refs.filter((r) => r.isReadOnly()).length\n if (inits === 1 && reads + inits === refs.length) {\n // there is only one init and all other references only read\n return true\n }\n return false\n}\n\n/**\n * Checks if a variable has mutation in its property.\n * @param {Variable} variable The variable to check.\n * @param {Scope|null} initialScope The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.\n * @returns {boolean} True if the variable has mutation in its property.\n */\nfunction hasMutationInProperty(variable, initialScope) {\n for (const ref of variable.references) {\n let node = /** @type {TSESTreeNode} */ (ref.identifier)\n while (node && node.parent && node.parent.type === \"MemberExpression\") {\n node = node.parent\n }\n if (!node || !node.parent) {\n continue\n }\n if (\n (node.parent.type === \"AssignmentExpression\" &&\n node.parent.left === node) ||\n (node.parent.type === \"UpdateExpression\" &&\n node.parent.argument === node)\n ) {\n // This is a mutation.\n return true\n }\n if (\n node.parent.type === \"CallExpression\" &&\n node.parent.callee === node &&\n node.type === \"MemberExpression\"\n ) {\n const methodName = getStaticPropertyNameValue(node, initialScope)\n if (isNameOfMutationArrayMethod(methodName)) {\n // This is a mutation.\n return true\n }\n }\n }\n return false\n\n /**\n * Checks if a method name is one of the mutation array methods.\n * @param {StaticValue|null} methodName The method name to check.\n * @returns {boolean} True if the method name is a mutation array method.\n */\n function isNameOfMutationArrayMethod(methodName) {\n if (methodName == null || methodName.value == null) {\n return false\n }\n const name = methodName.value\n return (\n name === \"copyWithin\" ||\n name === \"fill\" ||\n name === \"pop\" ||\n name === \"push\" ||\n name === \"reverse\" ||\n name === \"shift\" ||\n name === \"sort\" ||\n name === \"splice\" ||\n name === \"unshift\"\n )\n }\n}\n\n/**\n * @template {TSESTreeNodeTypes} T\n * @callback VisitorCallback\n * @param {TSESTreeNode & { type: T }} node\n * @param {Scope|undefined|null} initialScope\n * @returns {StaticValue | null}\n */\n/**\n * @typedef { { [K in TSESTreeNodeTypes]?: VisitorCallback } } Operations\n */\n/**\n * @type {Operations}\n */\nconst operations = Object.freeze({\n ArrayExpression(node, initialScope) {\n const elements = getElementValues(node.elements, initialScope)\n return elements != null ? { value: elements } : null\n },\n\n AssignmentExpression(node, initialScope) {\n if (node.operator === \"=\") {\n return getStaticValueR(node.right, initialScope)\n }\n return null\n },\n\n //eslint-disable-next-line complexity\n BinaryExpression(node, initialScope) {\n if (node.operator === \"in\" || node.operator === \"instanceof\") {\n // Not supported.\n return null\n }\n\n const left = getStaticValueR(node.left, initialScope)\n const right = getStaticValueR(node.right, initialScope)\n if (left != null && right != null) {\n switch (node.operator) {\n case \"==\":\n return { value: left.value == right.value } //eslint-disable-line eqeqeq\n case \"!=\":\n return { value: left.value != right.value } //eslint-disable-line eqeqeq\n case \"===\":\n return { value: left.value === right.value }\n case \"!==\":\n return { value: left.value !== right.value }\n case \"<\":\n return {\n value:\n /** @type {any} */ (left.value) <\n /** @type {any} */ (right.value),\n }\n case \"<=\":\n return {\n value:\n /** @type {any} */ (left.value) <=\n /** @type {any} */ (right.value),\n }\n case \">\":\n return {\n value:\n /** @type {any} */ (left.value) >\n /** @type {any} */ (right.value),\n }\n case \">=\":\n return {\n value:\n /** @type {any} */ (left.value) >=\n /** @type {any} */ (right.value),\n }\n case \"<<\":\n return {\n value:\n /** @type {any} */ (left.value) <<\n /** @type {any} */ (right.value),\n }\n case \">>\":\n return {\n value:\n /** @type {any} */ (left.value) >>\n /** @type {any} */ (right.value),\n }\n case \">>>\":\n return {\n value:\n /** @type {any} */ (left.value) >>>\n /** @type {any} */ (right.value),\n }\n case \"+\":\n return {\n value:\n /** @type {any} */ (left.value) +\n /** @type {any} */ (right.value),\n }\n case \"-\":\n return {\n value:\n /** @type {any} */ (left.value) -\n /** @type {any} */ (right.value),\n }\n case \"*\":\n return {\n value:\n /** @type {any} */ (left.value) *\n /** @type {any} */ (right.value),\n }\n case \"/\":\n return {\n value:\n /** @type {any} */ (left.value) /\n /** @type {any} */ (right.value),\n }\n case \"%\":\n return {\n value:\n /** @type {any} */ (left.value) %\n /** @type {any} */ (right.value),\n }\n case \"**\":\n return {\n value:\n /** @type {any} */ (left.value) **\n /** @type {any} */ (right.value),\n }\n case \"|\":\n return {\n value:\n /** @type {any} */ (left.value) |\n /** @type {any} */ (right.value),\n }\n case \"^\":\n return {\n value:\n /** @type {any} */ (left.value) ^\n /** @type {any} */ (right.value),\n }\n case \"&\":\n return {\n value:\n /** @type {any} */ (left.value) &\n /** @type {any} */ (right.value),\n }\n\n // no default\n }\n }\n\n return null\n },\n\n CallExpression(node, initialScope) {\n const calleeNode = node.callee\n const args = getElementValues(node.arguments, initialScope)\n\n if (args != null) {\n if (calleeNode.type === \"MemberExpression\") {\n if (calleeNode.property.type === \"PrivateIdentifier\") {\n return null\n }\n const object = getStaticValueR(calleeNode.object, initialScope)\n if (object != null) {\n if (\n object.value == null &&\n (object.optional || node.optional)\n ) {\n return { value: undefined, optional: true }\n }\n const property = getStaticPropertyNameValue(\n calleeNode,\n initialScope,\n )\n\n if (property != null) {\n const receiver =\n /** @type {Record any>} */ (\n object.value\n )\n const methodName = /** @type {PropertyKey} */ (\n property.value\n )\n if (callAllowed.has(receiver[methodName])) {\n return {\n value: receiver[methodName](...args),\n }\n }\n if (callPassThrough.has(receiver[methodName])) {\n return { value: args[0] }\n }\n }\n }\n } else {\n const callee = getStaticValueR(calleeNode, initialScope)\n if (callee != null) {\n if (callee.value == null && node.optional) {\n return { value: undefined, optional: true }\n }\n const func = /** @type {(...args: any[]) => any} */ (\n callee.value\n )\n if (callAllowed.has(func)) {\n return { value: func(...args) }\n }\n if (callPassThrough.has(func)) {\n return { value: args[0] }\n }\n }\n }\n }\n\n return null\n },\n\n ConditionalExpression(node, initialScope) {\n const test = getStaticValueR(node.test, initialScope)\n if (test != null) {\n return test.value\n ? getStaticValueR(node.consequent, initialScope)\n : getStaticValueR(node.alternate, initialScope)\n }\n return null\n },\n\n ExpressionStatement(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n\n Identifier(node, initialScope) {\n if (initialScope != null) {\n const variable = findVariable(initialScope, node)\n\n if (variable != null) {\n // Built-in globals.\n if (isBuiltinGlobal(variable)) {\n return { value: globalObject[variable.name] }\n }\n\n // Constants.\n if (canBeConsideredConst(variable)) {\n const def = variable.defs[0]\n if (\n // TODO(mysticatea): don't support destructuring here.\n def.node.id.type === \"Identifier\"\n ) {\n const init = getStaticValueR(\n def.node.init,\n initialScope,\n )\n if (\n init &&\n typeof init.value === \"object\" &&\n init.value !== null\n ) {\n if (hasMutationInProperty(variable, initialScope)) {\n // This variable has mutation in its property.\n return null\n }\n }\n return init\n }\n }\n }\n }\n return null\n },\n\n Literal(node) {\n const literal =\n /** @type {Partial & Partial & Partial} */ (\n node\n )\n //istanbul ignore if : this is implementation-specific behavior.\n if (\n (literal.regex != null || literal.bigint != null) &&\n literal.value == null\n ) {\n // It was a RegExp/BigInt literal, but Node.js didn't support it.\n return null\n }\n return { value: literal.value }\n },\n\n LogicalExpression(node, initialScope) {\n const left = getStaticValueR(node.left, initialScope)\n if (left != null) {\n if (\n (node.operator === \"||\" && Boolean(left.value) === true) ||\n (node.operator === \"&&\" && Boolean(left.value) === false) ||\n (node.operator === \"??\" && left.value != null)\n ) {\n return left\n }\n\n const right = getStaticValueR(node.right, initialScope)\n if (right != null) {\n return right\n }\n }\n\n return null\n },\n\n MemberExpression(node, initialScope) {\n if (node.property.type === \"PrivateIdentifier\") {\n return null\n }\n const object = getStaticValueR(node.object, initialScope)\n if (object != null) {\n if (object.value == null && (object.optional || node.optional)) {\n return { value: undefined, optional: true }\n }\n const property = getStaticPropertyNameValue(node, initialScope)\n\n if (property != null) {\n if (\n !isGetter(\n /** @type {object} */ (object.value),\n /** @type {PropertyKey} */ (property.value),\n )\n ) {\n return {\n value: /** @type {Record} */ (\n object.value\n )[/** @type {PropertyKey} */ (property.value)],\n }\n }\n\n for (const [classFn, allowed] of getterAllowed) {\n if (\n object.value instanceof classFn &&\n allowed.has(/** @type {string} */ (property.value))\n ) {\n return {\n value: /** @type {Record} */ (\n object.value\n )[/** @type {PropertyKey} */ (property.value)],\n }\n }\n }\n }\n }\n return null\n },\n\n ChainExpression(node, initialScope) {\n const expression = getStaticValueR(node.expression, initialScope)\n if (expression != null) {\n return { value: expression.value }\n }\n return null\n },\n\n NewExpression(node, initialScope) {\n const callee = getStaticValueR(node.callee, initialScope)\n const args = getElementValues(node.arguments, initialScope)\n\n if (callee != null && args != null) {\n const Func = /** @type {new (...args: any[]) => any} */ (\n callee.value\n )\n if (callAllowed.has(Func)) {\n return { value: new Func(...args) }\n }\n }\n\n return null\n },\n\n ObjectExpression(node, initialScope) {\n /** @type {Record} */\n const object = {}\n\n for (const propertyNode of node.properties) {\n if (propertyNode.type === \"Property\") {\n if (propertyNode.kind !== \"init\") {\n return null\n }\n const key = getStaticPropertyNameValue(\n propertyNode,\n initialScope,\n )\n const value = getStaticValueR(propertyNode.value, initialScope)\n if (key == null || value == null) {\n return null\n }\n object[/** @type {PropertyKey} */ (key.value)] = value.value\n } else if (\n propertyNode.type === \"SpreadElement\" ||\n // @ts-expect-error -- Backward compatibility\n propertyNode.type === \"ExperimentalSpreadProperty\"\n ) {\n const argument = getStaticValueR(\n propertyNode.argument,\n initialScope,\n )\n if (argument == null) {\n return null\n }\n Object.assign(object, argument.value)\n } else {\n return null\n }\n }\n\n return { value: object }\n },\n\n SequenceExpression(node, initialScope) {\n const last = node.expressions[node.expressions.length - 1]\n return getStaticValueR(last, initialScope)\n },\n\n TaggedTemplateExpression(node, initialScope) {\n const tag = getStaticValueR(node.tag, initialScope)\n const expressions = getElementValues(\n node.quasi.expressions,\n initialScope,\n )\n\n if (tag != null && expressions != null) {\n const func = /** @type {(...args: any[]) => any} */ (tag.value)\n /** @type {any[] & { raw?: string[] }} */\n const strings = node.quasi.quasis.map((q) => q.value.cooked)\n strings.raw = node.quasi.quasis.map((q) => q.value.raw)\n\n if (func === String.raw) {\n return { value: func(strings, ...expressions) }\n }\n }\n\n return null\n },\n\n TemplateLiteral(node, initialScope) {\n const expressions = getElementValues(node.expressions, initialScope)\n if (expressions != null) {\n let value = node.quasis[0].value.cooked\n for (let i = 0; i < expressions.length; ++i) {\n value += expressions[i]\n value += /** @type {string} */ (node.quasis[i + 1].value.cooked)\n }\n return { value }\n }\n return null\n },\n\n UnaryExpression(node, initialScope) {\n if (node.operator === \"delete\") {\n // Not supported.\n return null\n }\n if (node.operator === \"void\") {\n return { value: undefined }\n }\n\n const arg = getStaticValueR(node.argument, initialScope)\n if (arg != null) {\n switch (node.operator) {\n case \"-\":\n return { value: -(/** @type {any} */ (arg.value)) }\n case \"+\":\n return { value: +(/** @type {any} */ (arg.value)) } //eslint-disable-line no-implicit-coercion\n case \"!\":\n return { value: !arg.value }\n case \"~\":\n return { value: ~(/** @type {any} */ (arg.value)) }\n case \"typeof\":\n return { value: typeof arg.value }\n\n // no default\n }\n }\n\n return null\n },\n TSAsExpression(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n TSSatisfiesExpression(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n TSTypeAssertion(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n TSNonNullExpression(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n TSInstantiationExpression(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n})\n\n/**\n * Get the value of a given node if it's a static value.\n * @param {Node|TSESTreeNode|null|undefined} node The node to get.\n * @param {Scope|undefined|null} initialScope The scope to start finding variable.\n * @returns {StaticValue|null} The static value of the node, or `null`.\n */\nfunction getStaticValueR(node, initialScope) {\n if (node != null && Object.hasOwnProperty.call(operations, node.type)) {\n return /** @type {VisitorCallback} */ (operations[node.type])(\n /** @type {TSESTreeNode} */ (node),\n initialScope,\n )\n }\n return null\n}\n\n/**\n * Get the static value of property name from a MemberExpression node or a Property node.\n * @param {MemberExpression|Property} node The node to get.\n * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.\n * @returns {StaticValue|null} The static value of the property name of the node, or `null`.\n */\nfunction getStaticPropertyNameValue(node, initialScope) {\n const nameNode = node.type === \"Property\" ? node.key : node.property\n\n if (node.computed) {\n return getStaticValueR(nameNode, initialScope)\n }\n\n if (nameNode.type === \"Identifier\") {\n return { value: nameNode.name }\n }\n\n if (nameNode.type === \"Literal\") {\n if (/** @type {Partial} */ (nameNode).bigint) {\n return { value: /** @type {BigIntLiteral} */ (nameNode).bigint }\n }\n return { value: String(nameNode.value) }\n }\n\n return null\n}\n\n/**\n * Get the value of a given node if it's a static value.\n * @param {Node} node The node to get.\n * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If this scope was given, this tries to resolve identifier references which are in the given node as much as possible.\n * @returns {StaticValue | null} The static value of the node, or `null`.\n */\nexport function getStaticValue(node, initialScope = null) {\n try {\n return getStaticValueR(node, initialScope)\n } catch (_error) {\n return null\n }\n}\n","import { getStaticValue } from \"./get-static-value.mjs\"\n/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"estree\").Node} Node */\n/** @typedef {import(\"estree\").RegExpLiteral} RegExpLiteral */\n/** @typedef {import(\"estree\").BigIntLiteral} BigIntLiteral */\n/** @typedef {import(\"estree\").SimpleLiteral} SimpleLiteral */\n\n/**\n * Get the value of a given node if it's a literal or a template literal.\n * @param {Node} node The node to get.\n * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If the node is an Identifier node and this scope was given, this checks the variable of the identifier, and returns the value of it if the variable is a constant.\n * @returns {string|null} The value of the node, or `null`.\n */\nexport function getStringIfConstant(node, initialScope = null) {\n // Handle the literals that the platform doesn't support natively.\n if (node && node.type === \"Literal\" && node.value === null) {\n const literal =\n /** @type {Partial & Partial & Partial} */ (\n node\n )\n if (literal.regex) {\n return `/${literal.regex.pattern}/${literal.regex.flags}`\n }\n if (literal.bigint) {\n return literal.bigint\n }\n }\n\n const evaluated = getStaticValue(node, initialScope)\n\n if (evaluated) {\n // `String(Symbol.prototype)` throws error\n try {\n return String(evaluated.value)\n } catch {\n // No op\n }\n }\n\n return null\n}\n","import { getStringIfConstant } from \"./get-string-if-constant.mjs\"\n/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"estree\").MemberExpression} MemberExpression */\n/** @typedef {import(\"estree\").MethodDefinition} MethodDefinition */\n/** @typedef {import(\"estree\").Property} Property */\n/** @typedef {import(\"estree\").PropertyDefinition} PropertyDefinition */\n/** @typedef {import(\"estree\").Identifier} Identifier */\n\n/**\n * Get the property name from a MemberExpression node or a Property node.\n * @param {MemberExpression | MethodDefinition | Property | PropertyDefinition} node The node to get.\n * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.\n * @returns {string|null|undefined} The property name of the node.\n */\nexport function getPropertyName(node, initialScope) {\n switch (node.type) {\n case \"MemberExpression\":\n if (node.computed) {\n return getStringIfConstant(node.property, initialScope)\n }\n if (node.property.type === \"PrivateIdentifier\") {\n return null\n }\n return /** @type {Partial} */ (node.property).name\n\n case \"Property\":\n case \"MethodDefinition\":\n case \"PropertyDefinition\":\n if (node.computed) {\n return getStringIfConstant(node.key, initialScope)\n }\n if (node.key.type === \"Literal\") {\n return String(node.key.value)\n }\n if (node.key.type === \"PrivateIdentifier\") {\n return null\n }\n return /** @type {Partial} */ (node.key).name\n\n default:\n break\n }\n\n return null\n}\n","import { getPropertyName } from \"./get-property-name.mjs\"\n/** @typedef {import(\"eslint\").Rule.Node} RuleNode */\n/** @typedef {import(\"eslint\").SourceCode} SourceCode */\n/** @typedef {import(\"estree\").Function} FunctionNode */\n/** @typedef {import(\"estree\").FunctionDeclaration} FunctionDeclaration */\n/** @typedef {import(\"estree\").FunctionExpression} FunctionExpression */\n/** @typedef {import(\"estree\").Identifier} Identifier */\n\n/**\n * Get the name and kind of the given function node.\n * @param {FunctionNode} node - The function node to get.\n * @param {SourceCode} [sourceCode] The source code object to get the code of computed property keys.\n * @returns {string} The name and kind of the function node.\n */\n// eslint-disable-next-line complexity\nexport function getFunctionNameWithKind(node, sourceCode) {\n const parent = /** @type {RuleNode} */ (node).parent\n const tokens = []\n const isObjectMethod = parent.type === \"Property\" && parent.value === node\n const isClassMethod =\n parent.type === \"MethodDefinition\" && parent.value === node\n const isClassFieldMethod =\n parent.type === \"PropertyDefinition\" && parent.value === node\n\n // Modifiers.\n if (isClassMethod || isClassFieldMethod) {\n if (parent.static) {\n tokens.push(\"static\")\n }\n if (parent.key.type === \"PrivateIdentifier\") {\n tokens.push(\"private\")\n }\n }\n if (node.async) {\n tokens.push(\"async\")\n }\n if (node.generator) {\n tokens.push(\"generator\")\n }\n\n // Kinds.\n if (isObjectMethod || isClassMethod) {\n if (parent.kind === \"constructor\") {\n return \"constructor\"\n }\n if (parent.kind === \"get\") {\n tokens.push(\"getter\")\n } else if (parent.kind === \"set\") {\n tokens.push(\"setter\")\n } else {\n tokens.push(\"method\")\n }\n } else if (isClassFieldMethod) {\n tokens.push(\"method\")\n } else {\n if (node.type === \"ArrowFunctionExpression\") {\n tokens.push(\"arrow\")\n }\n tokens.push(\"function\")\n }\n\n // Names.\n if (isObjectMethod || isClassMethod || isClassFieldMethod) {\n if (parent.key.type === \"PrivateIdentifier\") {\n tokens.push(`#${parent.key.name}`)\n } else {\n const name = getPropertyName(parent)\n if (name) {\n tokens.push(`'${name}'`)\n } else if (sourceCode) {\n const keyText = sourceCode.getText(parent.key)\n if (!keyText.includes(\"\\n\")) {\n tokens.push(`[${keyText}]`)\n }\n }\n }\n } else if (hasId(node)) {\n tokens.push(`'${node.id.name}'`)\n } else if (\n parent.type === \"VariableDeclarator\" &&\n parent.id &&\n parent.id.type === \"Identifier\"\n ) {\n tokens.push(`'${parent.id.name}'`)\n } else if (\n (parent.type === \"AssignmentExpression\" ||\n parent.type === \"AssignmentPattern\") &&\n parent.left &&\n parent.left.type === \"Identifier\"\n ) {\n tokens.push(`'${parent.left.name}'`)\n } else if (\n parent.type === \"ExportDefaultDeclaration\" &&\n parent.declaration === node\n ) {\n tokens.push(\"'default'\")\n }\n\n return tokens.join(\" \")\n}\n\n/**\n * @param {FunctionNode} node\n * @returns {node is FunctionDeclaration | FunctionExpression & { id: Identifier }}\n */\nfunction hasId(node) {\n return Boolean(\n /** @type {Partial} */ (node)\n .id,\n )\n}\n","import { getKeys, KEYS } from \"eslint-visitor-keys\"\n/** @typedef {import(\"estree\").Node} Node */\n/** @typedef {import(\"eslint\").SourceCode} SourceCode */\n/** @typedef {import(\"./types.mjs\").HasSideEffectOptions} HasSideEffectOptions */\n/** @typedef {import(\"estree\").BinaryExpression} BinaryExpression */\n/** @typedef {import(\"estree\").MemberExpression} MemberExpression */\n/** @typedef {import(\"estree\").MethodDefinition} MethodDefinition */\n/** @typedef {import(\"estree\").Property} Property */\n/** @typedef {import(\"estree\").PropertyDefinition} PropertyDefinition */\n/** @typedef {import(\"estree\").UnaryExpression} UnaryExpression */\n\nconst typeConversionBinaryOps = Object.freeze(\n new Set([\n \"==\",\n \"!=\",\n \"<\",\n \"<=\",\n \">\",\n \">=\",\n \"<<\",\n \">>\",\n \">>>\",\n \"+\",\n \"-\",\n \"*\",\n \"/\",\n \"%\",\n \"|\",\n \"^\",\n \"&\",\n \"in\",\n ]),\n)\nconst typeConversionUnaryOps = Object.freeze(new Set([\"-\", \"+\", \"!\", \"~\"]))\n\n/**\n * Check whether the given value is an ASTNode or not.\n * @param {any} x The value to check.\n * @returns {x is Node} `true` if the value is an ASTNode.\n */\nfunction isNode(x) {\n return x !== null && typeof x === \"object\" && typeof x.type === \"string\"\n}\n\nconst visitor = Object.freeze(\n Object.assign(Object.create(null), {\n /**\n * @param {Node} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n $visit(node, options, visitorKeys) {\n const { type } = node\n\n if (typeof (/** @type {any} */ (this)[type]) === \"function\") {\n return /** @type {any} */ (this)[type](\n node,\n options,\n visitorKeys,\n )\n }\n\n return this.$visitChildren(node, options, visitorKeys)\n },\n\n /**\n * @param {Node} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n $visitChildren(node, options, visitorKeys) {\n const { type } = node\n\n for (const key of /** @type {(keyof Node)[]} */ (\n visitorKeys[type] || getKeys(node)\n )) {\n const value = node[key]\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (\n isNode(element) &&\n this.$visit(element, options, visitorKeys)\n ) {\n return true\n }\n }\n } else if (\n isNode(value) &&\n this.$visit(value, options, visitorKeys)\n ) {\n return true\n }\n }\n\n return false\n },\n\n ArrowFunctionExpression() {\n return false\n },\n AssignmentExpression() {\n return true\n },\n AwaitExpression() {\n return true\n },\n /**\n * @param {BinaryExpression} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n BinaryExpression(node, options, visitorKeys) {\n if (\n options.considerImplicitTypeConversion &&\n typeConversionBinaryOps.has(node.operator) &&\n (node.left.type !== \"Literal\" || node.right.type !== \"Literal\")\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n CallExpression() {\n return true\n },\n FunctionExpression() {\n return false\n },\n ImportExpression() {\n return true\n },\n /**\n * @param {MemberExpression} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n MemberExpression(node, options, visitorKeys) {\n if (options.considerGetters) {\n return true\n }\n if (\n options.considerImplicitTypeConversion &&\n node.computed &&\n node.property.type !== \"Literal\"\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n /**\n * @param {MethodDefinition} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n MethodDefinition(node, options, visitorKeys) {\n if (\n options.considerImplicitTypeConversion &&\n node.computed &&\n node.key.type !== \"Literal\"\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n NewExpression() {\n return true\n },\n /**\n * @param {Property} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n Property(node, options, visitorKeys) {\n if (\n options.considerImplicitTypeConversion &&\n node.computed &&\n node.key.type !== \"Literal\"\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n /**\n * @param {PropertyDefinition} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n PropertyDefinition(node, options, visitorKeys) {\n if (\n options.considerImplicitTypeConversion &&\n node.computed &&\n node.key.type !== \"Literal\"\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n /**\n * @param {UnaryExpression} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n UnaryExpression(node, options, visitorKeys) {\n if (node.operator === \"delete\") {\n return true\n }\n if (\n options.considerImplicitTypeConversion &&\n typeConversionUnaryOps.has(node.operator) &&\n node.argument.type !== \"Literal\"\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n UpdateExpression() {\n return true\n },\n YieldExpression() {\n return true\n },\n }),\n)\n\n/**\n * Check whether a given node has any side effect or not.\n * @param {Node} node The node to get.\n * @param {SourceCode} sourceCode The source code object.\n * @param {HasSideEffectOptions} [options] The option object.\n * @returns {boolean} `true` if the node has a certain side effect.\n */\nexport function hasSideEffect(node, sourceCode, options = {}) {\n const { considerGetters = false, considerImplicitTypeConversion = false } =\n options\n return visitor.$visit(\n node,\n { considerGetters, considerImplicitTypeConversion },\n sourceCode.visitorKeys || KEYS,\n )\n}\n","import { isClosingParenToken, isOpeningParenToken } from \"./token-predicate.mjs\"\n/** @typedef {import(\"estree\").Node} Node */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.NewExpression} TSNewExpression */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.CallExpression} TSCallExpression */\n/** @typedef {import(\"eslint\").SourceCode} SourceCode */\n/** @typedef {import(\"eslint\").AST.Token} Token */\n/** @typedef {import(\"eslint\").Rule.Node} RuleNode */\n\n/**\n * Get the left parenthesis of the parent node syntax if it exists.\n * E.g., `if (a) {}` then the `(`.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {Token|null} The left parenthesis of the parent node syntax\n */\n// eslint-disable-next-line complexity\nfunction getParentSyntaxParen(node, sourceCode) {\n const parent = /** @type {RuleNode} */ (node).parent\n\n switch (parent.type) {\n case \"CallExpression\":\n case \"NewExpression\":\n if (parent.arguments.length === 1 && parent.arguments[0] === node) {\n return sourceCode.getTokenAfter(\n // @ts-expect-error https://github.com/typescript-eslint/typescript-eslint/pull/5384\n parent.typeArguments ||\n /** @type {RuleNode} */ (\n /** @type {unknown} */ (\n /** @type {TSNewExpression | TSCallExpression} */ (\n parent\n ).typeParameters\n )\n ) ||\n parent.callee,\n isOpeningParenToken,\n )\n }\n return null\n\n case \"DoWhileStatement\":\n if (parent.test === node) {\n return sourceCode.getTokenAfter(\n parent.body,\n isOpeningParenToken,\n )\n }\n return null\n\n case \"IfStatement\":\n case \"WhileStatement\":\n if (parent.test === node) {\n return sourceCode.getFirstToken(parent, 1)\n }\n return null\n\n case \"ImportExpression\":\n if (parent.source === node) {\n return sourceCode.getFirstToken(parent, 1)\n }\n return null\n\n case \"SwitchStatement\":\n if (parent.discriminant === node) {\n return sourceCode.getFirstToken(parent, 1)\n }\n return null\n\n case \"WithStatement\":\n if (parent.object === node) {\n return sourceCode.getFirstToken(parent, 1)\n }\n return null\n\n default:\n return null\n }\n}\n\n/**\n * Check whether a given node is parenthesized or not.\n * @param {number} times The number of parantheses.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {boolean} `true` if the node is parenthesized the given times.\n */\n/**\n * Check whether a given node is parenthesized or not.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {boolean} `true` if the node is parenthesized.\n */\n/**\n * Check whether a given node is parenthesized or not.\n * @param {Node|number} timesOrNode The first parameter.\n * @param {Node|SourceCode} nodeOrSourceCode The second parameter.\n * @param {SourceCode} [optionalSourceCode] The third parameter.\n * @returns {boolean} `true` if the node is parenthesized.\n */\nexport function isParenthesized(\n timesOrNode,\n nodeOrSourceCode,\n optionalSourceCode,\n) {\n /** @type {number} */\n let times,\n /** @type {RuleNode} */\n node,\n /** @type {SourceCode} */\n sourceCode,\n maybeLeftParen,\n maybeRightParen\n if (typeof timesOrNode === \"number\") {\n times = timesOrNode | 0\n node = /** @type {RuleNode} */ (nodeOrSourceCode)\n sourceCode = /** @type {SourceCode} */ (optionalSourceCode)\n if (!(times >= 1)) {\n throw new TypeError(\"'times' should be a positive integer.\")\n }\n } else {\n times = 1\n node = /** @type {RuleNode} */ (timesOrNode)\n sourceCode = /** @type {SourceCode} */ (nodeOrSourceCode)\n }\n\n if (\n node == null ||\n // `Program` can't be parenthesized\n node.parent == null ||\n // `CatchClause.param` can't be parenthesized, example `try {} catch (error) {}`\n (node.parent.type === \"CatchClause\" && node.parent.param === node)\n ) {\n return false\n }\n\n maybeLeftParen = maybeRightParen = node\n do {\n maybeLeftParen = sourceCode.getTokenBefore(maybeLeftParen)\n maybeRightParen = sourceCode.getTokenAfter(maybeRightParen)\n } while (\n maybeLeftParen != null &&\n maybeRightParen != null &&\n isOpeningParenToken(maybeLeftParen) &&\n isClosingParenToken(maybeRightParen) &&\n // Avoid false positive such as `if (a) {}`\n maybeLeftParen !== getParentSyntaxParen(node, sourceCode) &&\n --times > 0\n )\n\n return times === 0\n}\n","/**\n * @author Toru Nagashima \n * See LICENSE file in root directory for full license.\n */\n\nconst placeholder = /\\$(?:[$&`']|[1-9][0-9]?)/gu\n\n/** @type {WeakMap} */\nconst internal = new WeakMap()\n\n/**\n * Check whether a given character is escaped or not.\n * @param {string} str The string to check.\n * @param {number} index The location of the character to check.\n * @returns {boolean} `true` if the character is escaped.\n */\nfunction isEscaped(str, index) {\n let escaped = false\n for (let i = index - 1; i >= 0 && str.charCodeAt(i) === 0x5c; --i) {\n escaped = !escaped\n }\n return escaped\n}\n\n/**\n * Replace a given string by a given matcher.\n * @param {PatternMatcher} matcher The pattern matcher.\n * @param {string} str The string to be replaced.\n * @param {string} replacement The new substring to replace each matched part.\n * @returns {string} The replaced string.\n */\nfunction replaceS(matcher, str, replacement) {\n const chunks = []\n let index = 0\n\n /**\n * @param {string} key The placeholder.\n * @param {RegExpExecArray} match The matched information.\n * @returns {string} The replaced string.\n */\n function replacer(key, match) {\n switch (key) {\n case \"$$\":\n return \"$\"\n case \"$&\":\n return match[0]\n case \"$`\":\n return str.slice(0, match.index)\n case \"$'\":\n return str.slice(match.index + match[0].length)\n default: {\n const i = key.slice(1)\n if (i in match) {\n return match[/** @type {any} */ (i)]\n }\n return key\n }\n }\n }\n\n for (const match of matcher.execAll(str)) {\n chunks.push(str.slice(index, match.index))\n chunks.push(\n replacement.replace(placeholder, (key) => replacer(key, match)),\n )\n index = match.index + match[0].length\n }\n chunks.push(str.slice(index))\n\n return chunks.join(\"\")\n}\n\n/**\n * Replace a given string by a given matcher.\n * @param {PatternMatcher} matcher The pattern matcher.\n * @param {string} str The string to be replaced.\n * @param {(substring: string, ...args: any[]) => string} replace The function to replace each matched part.\n * @returns {string} The replaced string.\n */\nfunction replaceF(matcher, str, replace) {\n const chunks = []\n let index = 0\n\n for (const match of matcher.execAll(str)) {\n chunks.push(str.slice(index, match.index))\n chunks.push(\n String(\n replace(\n .../** @type {[string, ...string[]]} */ (\n /** @type {string[]} */ (match)\n ),\n match.index,\n match.input,\n ),\n ),\n )\n index = match.index + match[0].length\n }\n chunks.push(str.slice(index))\n\n return chunks.join(\"\")\n}\n\n/**\n * The class to find patterns as considering escape sequences.\n */\nexport class PatternMatcher {\n /**\n * Initialize this matcher.\n * @param {RegExp} pattern The pattern to match.\n * @param {{escaped?:boolean}} [options] The options.\n */\n constructor(pattern, options = {}) {\n const { escaped = false } = options\n if (!(pattern instanceof RegExp)) {\n throw new TypeError(\"'pattern' should be a RegExp instance.\")\n }\n if (!pattern.flags.includes(\"g\")) {\n throw new Error(\"'pattern' should contains 'g' flag.\")\n }\n\n internal.set(this, {\n pattern: new RegExp(pattern.source, pattern.flags),\n escaped: Boolean(escaped),\n })\n }\n\n /**\n * Find the pattern in a given string.\n * @param {string} str The string to find.\n * @returns {IterableIterator} The iterator which iterate the matched information.\n */\n *execAll(str) {\n const { pattern, escaped } =\n /** @type {{pattern:RegExp,escaped:boolean}} */ (internal.get(this))\n let match = null\n let lastIndex = 0\n\n pattern.lastIndex = 0\n while ((match = pattern.exec(str)) != null) {\n if (escaped || !isEscaped(str, match.index)) {\n lastIndex = pattern.lastIndex\n yield match\n pattern.lastIndex = lastIndex\n }\n }\n }\n\n /**\n * Check whether the pattern is found in a given string.\n * @param {string} str The string to check.\n * @returns {boolean} `true` if the pattern was found in the string.\n */\n test(str) {\n const it = this.execAll(str)\n const ret = it.next()\n return !ret.done\n }\n\n /**\n * Replace a given string.\n * @param {string} str The string to be replaced.\n * @param {(string|((...strs:string[])=>string))} replacer The string or function to replace. This is the same as the 2nd argument of `String.prototype.replace`.\n * @returns {string} The replaced string.\n */\n [Symbol.replace](str, replacer) {\n return typeof replacer === \"function\"\n ? replaceF(this, String(str), replacer)\n : replaceS(this, String(str), String(replacer))\n }\n}\n","import { findVariable } from \"./find-variable.mjs\"\nimport { getPropertyName } from \"./get-property-name.mjs\"\nimport { getStringIfConstant } from \"./get-string-if-constant.mjs\"\n/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"eslint\").Scope.Variable} Variable */\n/** @typedef {import(\"eslint\").Rule.Node} RuleNode */\n/** @typedef {import(\"estree\").Node} Node */\n/** @typedef {import(\"estree\").Expression} Expression */\n/** @typedef {import(\"estree\").Pattern} Pattern */\n/** @typedef {import(\"estree\").Identifier} Identifier */\n/** @typedef {import(\"estree\").SimpleCallExpression} CallExpression */\n/** @typedef {import(\"estree\").Program} Program */\n/** @typedef {import(\"estree\").ImportDeclaration} ImportDeclaration */\n/** @typedef {import(\"estree\").ExportAllDeclaration} ExportAllDeclaration */\n/** @typedef {import(\"estree\").ExportDefaultDeclaration} ExportDefaultDeclaration */\n/** @typedef {import(\"estree\").ExportNamedDeclaration} ExportNamedDeclaration */\n/** @typedef {import(\"estree\").ImportSpecifier} ImportSpecifier */\n/** @typedef {import(\"estree\").ImportDefaultSpecifier} ImportDefaultSpecifier */\n/** @typedef {import(\"estree\").ImportNamespaceSpecifier} ImportNamespaceSpecifier */\n/** @typedef {import(\"estree\").ExportSpecifier} ExportSpecifier */\n/** @typedef {import(\"estree\").Property} Property */\n/** @typedef {import(\"estree\").AssignmentProperty} AssignmentProperty */\n/** @typedef {import(\"estree\").Literal} Literal */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.Node} TSESTreeNode */\n/** @typedef {import(\"./types.mjs\").ReferenceTrackerOptions} ReferenceTrackerOptions */\n/**\n * @template T\n * @typedef {import(\"./types.mjs\").TraceMap} TraceMap\n */\n/**\n * @template T\n * @typedef {import(\"./types.mjs\").TraceMapObject} TraceMapObject\n */\n/**\n * @template T\n * @typedef {import(\"./types.mjs\").TrackedReferences} TrackedReferences\n */\n\nconst IMPORT_TYPE = /^(?:Import|Export(?:All|Default|Named))Declaration$/u\n\n/**\n * Check whether a given node is an import node or not.\n * @param {Node} node\n * @returns {node is ImportDeclaration|ExportAllDeclaration|ExportNamedDeclaration&{source: Literal}} `true` if the node is an import node.\n */\nfunction isHasSource(node) {\n return (\n IMPORT_TYPE.test(node.type) &&\n /** @type {ImportDeclaration|ExportAllDeclaration|ExportNamedDeclaration} */ (\n node\n ).source != null\n )\n}\nconst has =\n /** @type {(traceMap: TraceMap, v: T) => v is (string extends T ? string : T)} */ (\n Function.call.bind(Object.hasOwnProperty)\n )\n\nexport const READ = Symbol(\"read\")\nexport const CALL = Symbol(\"call\")\nexport const CONSTRUCT = Symbol(\"construct\")\nexport const ESM = Symbol(\"esm\")\n\nconst requireCall = { require: { [CALL]: true } }\n\n/**\n * Check whether a given variable is modified or not.\n * @param {Variable|undefined} variable The variable to check.\n * @returns {boolean} `true` if the variable is modified.\n */\nfunction isModifiedGlobal(variable) {\n return (\n variable == null ||\n variable.defs.length !== 0 ||\n variable.references.some((r) => r.isWrite())\n )\n}\n\n/**\n * Check if the value of a given node is passed through to the parent syntax as-is.\n * For example, `a` and `b` in (`a || b` and `c ? a : b`) are passed through.\n * @param {Node} node A node to check.\n * @returns {node is RuleNode & {parent: Expression}} `true` if the node is passed through.\n */\nfunction isPassThrough(node) {\n const parent = /** @type {TSESTreeNode} */ (node).parent\n\n if (parent) {\n switch (parent.type) {\n case \"ConditionalExpression\":\n return parent.consequent === node || parent.alternate === node\n case \"LogicalExpression\":\n return true\n case \"SequenceExpression\":\n return (\n parent.expressions[parent.expressions.length - 1] === node\n )\n case \"ChainExpression\":\n return true\n case \"TSAsExpression\":\n case \"TSSatisfiesExpression\":\n case \"TSTypeAssertion\":\n case \"TSNonNullExpression\":\n case \"TSInstantiationExpression\":\n return true\n\n default:\n return false\n }\n }\n return false\n}\n\n/**\n * The reference tracker.\n */\nexport class ReferenceTracker {\n /**\n * Initialize this tracker.\n * @param {Scope} globalScope The global scope.\n * @param {object} [options] The options.\n * @param {\"legacy\"|\"strict\"} [options.mode=\"strict\"] The mode to determine the ImportDeclaration's behavior for CJS modules.\n * @param {string[]} [options.globalObjectNames=[\"global\",\"globalThis\",\"self\",\"window\"]] The variable names for Global Object.\n */\n constructor(globalScope, options = {}) {\n const {\n mode = \"strict\",\n globalObjectNames = [\"global\", \"globalThis\", \"self\", \"window\"],\n } = options\n /** @private @type {Variable[]} */\n this.variableStack = []\n /** @private */\n this.globalScope = globalScope\n /** @private */\n this.mode = mode\n /** @private */\n this.globalObjectNames = globalObjectNames.slice(0)\n }\n\n /**\n * Iterate the references of global variables.\n * @template T\n * @param {TraceMap} traceMap The trace map.\n * @returns {IterableIterator>} The iterator to iterate references.\n */\n *iterateGlobalReferences(traceMap) {\n for (const key of Object.keys(traceMap)) {\n const nextTraceMap = traceMap[key]\n const path = [key]\n const variable = this.globalScope.set.get(key)\n\n if (isModifiedGlobal(variable)) {\n continue\n }\n\n yield* this._iterateVariableReferences(\n /** @type {Variable} */ (variable),\n path,\n nextTraceMap,\n true,\n )\n }\n\n for (const key of this.globalObjectNames) {\n /** @type {string[]} */\n const path = []\n const variable = this.globalScope.set.get(key)\n\n if (isModifiedGlobal(variable)) {\n continue\n }\n\n yield* this._iterateVariableReferences(\n /** @type {Variable} */ (variable),\n path,\n traceMap,\n false,\n )\n }\n }\n\n /**\n * Iterate the references of CommonJS modules.\n * @template T\n * @param {TraceMap} traceMap The trace map.\n * @returns {IterableIterator>} The iterator to iterate references.\n */\n *iterateCjsReferences(traceMap) {\n for (const { node } of this.iterateGlobalReferences(requireCall)) {\n const key = getStringIfConstant(\n /** @type {CallExpression} */ (node).arguments[0],\n )\n if (key == null || !has(traceMap, key)) {\n continue\n }\n\n const nextTraceMap = traceMap[key]\n const path = [key]\n\n if (nextTraceMap[READ]) {\n yield {\n node,\n path,\n type: READ,\n info: nextTraceMap[READ],\n }\n }\n yield* this._iteratePropertyReferences(\n /** @type {CallExpression} */ (node),\n path,\n nextTraceMap,\n )\n }\n }\n\n /**\n * Iterate the references of ES modules.\n * @template T\n * @param {TraceMap} traceMap The trace map.\n * @returns {IterableIterator>} The iterator to iterate references.\n */\n *iterateEsmReferences(traceMap) {\n const programNode = /** @type {Program} */ (this.globalScope.block)\n\n for (const node of programNode.body) {\n if (!isHasSource(node)) {\n continue\n }\n const moduleId = /** @type {string} */ (node.source.value)\n\n if (!has(traceMap, moduleId)) {\n continue\n }\n const nextTraceMap = traceMap[moduleId]\n const path = [moduleId]\n\n if (nextTraceMap[READ]) {\n yield {\n // eslint-disable-next-line object-shorthand -- apply type\n node: /** @type {RuleNode} */ (node),\n path,\n type: READ,\n info: nextTraceMap[READ],\n }\n }\n\n if (node.type === \"ExportAllDeclaration\") {\n for (const key of Object.keys(nextTraceMap)) {\n const exportTraceMap = nextTraceMap[key]\n if (exportTraceMap[READ]) {\n yield {\n // eslint-disable-next-line object-shorthand -- apply type\n node: /** @type {RuleNode} */ (node),\n path: path.concat(key),\n type: READ,\n info: exportTraceMap[READ],\n }\n }\n }\n } else {\n for (const specifier of node.specifiers) {\n const esm = has(nextTraceMap, ESM)\n const it = this._iterateImportReferences(\n specifier,\n path,\n esm\n ? nextTraceMap\n : this.mode === \"legacy\"\n ? { default: nextTraceMap, ...nextTraceMap }\n : { default: nextTraceMap },\n )\n\n if (esm) {\n yield* it\n } else {\n for (const report of it) {\n report.path = report.path.filter(exceptDefault)\n if (\n report.path.length >= 2 ||\n report.type !== READ\n ) {\n yield report\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Iterate the property references for a given expression AST node.\n * @template T\n * @param {Expression} node The expression AST node to iterate property references.\n * @param {TraceMap} traceMap The trace map.\n * @returns {IterableIterator>} The iterator to iterate property references.\n */\n *iteratePropertyReferences(node, traceMap) {\n yield* this._iteratePropertyReferences(node, [], traceMap)\n }\n\n /**\n * Iterate the references for a given variable.\n * @private\n * @template T\n * @param {Variable} variable The variable to iterate that references.\n * @param {string[]} path The current path.\n * @param {TraceMapObject} traceMap The trace map.\n * @param {boolean} shouldReport = The flag to report those references.\n * @returns {IterableIterator>} The iterator to iterate references.\n */\n *_iterateVariableReferences(variable, path, traceMap, shouldReport) {\n if (this.variableStack.includes(variable)) {\n return\n }\n this.variableStack.push(variable)\n try {\n for (const reference of variable.references) {\n if (!reference.isRead()) {\n continue\n }\n const node = /** @type {RuleNode & Identifier} */ (\n reference.identifier\n )\n\n if (shouldReport && traceMap[READ]) {\n yield { node, path, type: READ, info: traceMap[READ] }\n }\n yield* this._iteratePropertyReferences(node, path, traceMap)\n }\n } finally {\n this.variableStack.pop()\n }\n }\n\n /**\n * Iterate the references for a given AST node.\n * @private\n * @template T\n * @param {Expression} rootNode The AST node to iterate references.\n * @param {string[]} path The current path.\n * @param {TraceMapObject} traceMap The trace map.\n * @returns {IterableIterator>} The iterator to iterate references.\n */\n //eslint-disable-next-line complexity\n *_iteratePropertyReferences(rootNode, path, traceMap) {\n let node = rootNode\n while (isPassThrough(node)) {\n node = node.parent\n }\n\n const parent = /** @type {RuleNode} */ (node).parent\n if (parent.type === \"MemberExpression\") {\n if (parent.object === node) {\n const key = getPropertyName(parent)\n if (key == null || !has(traceMap, key)) {\n return\n }\n\n path = path.concat(key) //eslint-disable-line no-param-reassign\n const nextTraceMap = traceMap[key]\n if (nextTraceMap[READ]) {\n yield {\n node: parent,\n path,\n type: READ,\n info: nextTraceMap[READ],\n }\n }\n yield* this._iteratePropertyReferences(\n parent,\n path,\n nextTraceMap,\n )\n }\n return\n }\n if (parent.type === \"CallExpression\") {\n if (parent.callee === node && traceMap[CALL]) {\n yield { node: parent, path, type: CALL, info: traceMap[CALL] }\n }\n return\n }\n if (parent.type === \"NewExpression\") {\n if (parent.callee === node && traceMap[CONSTRUCT]) {\n yield {\n node: parent,\n path,\n type: CONSTRUCT,\n info: traceMap[CONSTRUCT],\n }\n }\n return\n }\n if (parent.type === \"AssignmentExpression\") {\n if (parent.right === node) {\n yield* this._iterateLhsReferences(parent.left, path, traceMap)\n yield* this._iteratePropertyReferences(parent, path, traceMap)\n }\n return\n }\n if (parent.type === \"AssignmentPattern\") {\n if (parent.right === node) {\n yield* this._iterateLhsReferences(parent.left, path, traceMap)\n }\n return\n }\n if (parent.type === \"VariableDeclarator\") {\n if (parent.init === node) {\n yield* this._iterateLhsReferences(parent.id, path, traceMap)\n }\n }\n }\n\n /**\n * Iterate the references for a given Pattern node.\n * @private\n * @template T\n * @param {Pattern} patternNode The Pattern node to iterate references.\n * @param {string[]} path The current path.\n * @param {TraceMapObject} traceMap The trace map.\n * @returns {IterableIterator>} The iterator to iterate references.\n */\n *_iterateLhsReferences(patternNode, path, traceMap) {\n if (patternNode.type === \"Identifier\") {\n const variable = findVariable(this.globalScope, patternNode)\n if (variable != null) {\n yield* this._iterateVariableReferences(\n variable,\n path,\n traceMap,\n false,\n )\n }\n return\n }\n if (patternNode.type === \"ObjectPattern\") {\n for (const property of patternNode.properties) {\n const key = getPropertyName(\n /** @type {AssignmentProperty} */ (property),\n )\n\n if (key == null || !has(traceMap, key)) {\n continue\n }\n\n const nextPath = path.concat(key)\n const nextTraceMap = traceMap[key]\n if (nextTraceMap[READ]) {\n yield {\n node: /** @type {RuleNode} */ (property),\n path: nextPath,\n type: READ,\n info: nextTraceMap[READ],\n }\n }\n yield* this._iterateLhsReferences(\n /** @type {AssignmentProperty} */ (property).value,\n nextPath,\n nextTraceMap,\n )\n }\n return\n }\n if (patternNode.type === \"AssignmentPattern\") {\n yield* this._iterateLhsReferences(patternNode.left, path, traceMap)\n }\n }\n\n /**\n * Iterate the references for a given ModuleSpecifier node.\n * @private\n * @template T\n * @param {ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier} specifierNode The ModuleSpecifier node to iterate references.\n * @param {string[]} path The current path.\n * @param {TraceMapObject} traceMap The trace map.\n * @returns {IterableIterator>} The iterator to iterate references.\n */\n *_iterateImportReferences(specifierNode, path, traceMap) {\n const type = specifierNode.type\n\n if (type === \"ImportSpecifier\" || type === \"ImportDefaultSpecifier\") {\n const key =\n type === \"ImportDefaultSpecifier\"\n ? \"default\"\n : specifierNode.imported.type === \"Identifier\"\n ? specifierNode.imported.name\n : specifierNode.imported.value\n if (!has(traceMap, key)) {\n return\n }\n\n path = path.concat(key) //eslint-disable-line no-param-reassign\n const nextTraceMap = traceMap[key]\n if (nextTraceMap[READ]) {\n yield {\n node: /** @type {RuleNode} */ (specifierNode),\n path,\n type: READ,\n info: nextTraceMap[READ],\n }\n }\n yield* this._iterateVariableReferences(\n /** @type {Variable} */ (\n findVariable(this.globalScope, specifierNode.local)\n ),\n path,\n nextTraceMap,\n false,\n )\n\n return\n }\n\n if (type === \"ImportNamespaceSpecifier\") {\n yield* this._iterateVariableReferences(\n /** @type {Variable} */ (\n findVariable(this.globalScope, specifierNode.local)\n ),\n path,\n traceMap,\n false,\n )\n return\n }\n\n if (type === \"ExportSpecifier\") {\n const key =\n specifierNode.local.type === \"Identifier\"\n ? specifierNode.local.name\n : specifierNode.local.value\n if (!has(traceMap, key)) {\n return\n }\n\n path = path.concat(key) //eslint-disable-line no-param-reassign\n const nextTraceMap = traceMap[key]\n if (nextTraceMap[READ]) {\n yield {\n node: /** @type {RuleNode} */ (specifierNode),\n path,\n type: READ,\n info: nextTraceMap[READ],\n }\n }\n }\n }\n}\n\nReferenceTracker.READ = READ\nReferenceTracker.CALL = CALL\nReferenceTracker.CONSTRUCT = CONSTRUCT\nReferenceTracker.ESM = ESM\n\n/**\n * This is a predicate function for Array#filter.\n * @param {string} name A name part.\n * @param {number} index The index of the name.\n * @returns {boolean} `false` if it's default.\n */\nfunction exceptDefault(name, index) {\n return !(index === 1 && name === \"default\")\n}\n","/** @typedef {import(\"./types.mjs\").StaticValue} StaticValue */\n/** @typedef {import(\"./types.mjs\").StaticValueOptional} StaticValueOptional */\n/** @typedef {import(\"./types.mjs\").StaticValueProvided} StaticValueProvided */\n/** @typedef {import(\"./types.mjs\").ReferenceTrackerOptions} ReferenceTrackerOptions */\n/**\n * @template T\n * @typedef {import(\"./types.mjs\").TraceMap} TraceMap\n */\n/**\n * @template T\n * @typedef {import(\"./types.mjs\").TrackedReferences} TrackedReferences\n */\n/** @typedef {import(\"./types.mjs\").HasSideEffectOptions} HasSideEffectOptions */\n/** @typedef {import(\"./types.mjs\").ArrowToken} ArrowToken */\n/** @typedef {import(\"./types.mjs\").CommaToken} CommaToken */\n/** @typedef {import(\"./types.mjs\").SemicolonToken} SemicolonToken */\n/** @typedef {import(\"./types.mjs\").ColonToken} ColonToken */\n/** @typedef {import(\"./types.mjs\").OpeningParenToken} OpeningParenToken */\n/** @typedef {import(\"./types.mjs\").ClosingParenToken} ClosingParenToken */\n/** @typedef {import(\"./types.mjs\").OpeningBracketToken} OpeningBracketToken */\n/** @typedef {import(\"./types.mjs\").ClosingBracketToken} ClosingBracketToken */\n/** @typedef {import(\"./types.mjs\").OpeningBraceToken} OpeningBraceToken */\n/** @typedef {import(\"./types.mjs\").ClosingBraceToken} ClosingBraceToken */\n\nimport { findVariable } from \"./find-variable.mjs\"\nimport { getFunctionHeadLocation } from \"./get-function-head-location.mjs\"\nimport { getFunctionNameWithKind } from \"./get-function-name-with-kind.mjs\"\nimport { getInnermostScope } from \"./get-innermost-scope.mjs\"\nimport { getPropertyName } from \"./get-property-name.mjs\"\nimport { getStaticValue } from \"./get-static-value.mjs\"\nimport { getStringIfConstant } from \"./get-string-if-constant.mjs\"\nimport { hasSideEffect } from \"./has-side-effect.mjs\"\nimport { isParenthesized } from \"./is-parenthesized.mjs\"\nimport { PatternMatcher } from \"./pattern-matcher.mjs\"\nimport {\n CALL,\n CONSTRUCT,\n ESM,\n READ,\n ReferenceTracker,\n} from \"./reference-tracker.mjs\"\nimport {\n isArrowToken,\n isClosingBraceToken,\n isClosingBracketToken,\n isClosingParenToken,\n isColonToken,\n isCommaToken,\n isCommentToken,\n isNotArrowToken,\n isNotClosingBraceToken,\n isNotClosingBracketToken,\n isNotClosingParenToken,\n isNotColonToken,\n isNotCommaToken,\n isNotCommentToken,\n isNotOpeningBraceToken,\n isNotOpeningBracketToken,\n isNotOpeningParenToken,\n isNotSemicolonToken,\n isOpeningBraceToken,\n isOpeningBracketToken,\n isOpeningParenToken,\n isSemicolonToken,\n} from \"./token-predicate.mjs\"\n\nexport default {\n CALL,\n CONSTRUCT,\n ESM,\n findVariable,\n getFunctionHeadLocation,\n getFunctionNameWithKind,\n getInnermostScope,\n getPropertyName,\n getStaticValue,\n getStringIfConstant,\n hasSideEffect,\n isArrowToken,\n isClosingBraceToken,\n isClosingBracketToken,\n isClosingParenToken,\n isColonToken,\n isCommaToken,\n isCommentToken,\n isNotArrowToken,\n isNotClosingBraceToken,\n isNotClosingBracketToken,\n isNotClosingParenToken,\n isNotColonToken,\n isNotCommaToken,\n isNotCommentToken,\n isNotOpeningBraceToken,\n isNotOpeningBracketToken,\n isNotOpeningParenToken,\n isNotSemicolonToken,\n isOpeningBraceToken,\n isOpeningBracketToken,\n isOpeningParenToken,\n isParenthesized,\n isSemicolonToken,\n PatternMatcher,\n READ,\n ReferenceTracker,\n}\nexport {\n CALL,\n CONSTRUCT,\n ESM,\n findVariable,\n getFunctionHeadLocation,\n getFunctionNameWithKind,\n getInnermostScope,\n getPropertyName,\n getStaticValue,\n getStringIfConstant,\n hasSideEffect,\n isArrowToken,\n isClosingBraceToken,\n isClosingBracketToken,\n isClosingParenToken,\n isColonToken,\n isCommaToken,\n isCommentToken,\n isNotArrowToken,\n isNotClosingBraceToken,\n isNotClosingBracketToken,\n isNotClosingParenToken,\n isNotColonToken,\n isNotCommaToken,\n isNotCommentToken,\n isNotOpeningBraceToken,\n isNotOpeningBracketToken,\n isNotOpeningParenToken,\n isNotSemicolonToken,\n isOpeningBraceToken,\n isOpeningBracketToken,\n isOpeningParenToken,\n isParenthesized,\n isSemicolonToken,\n PatternMatcher,\n READ,\n ReferenceTracker,\n}\n"],"names":["getKeys","KEYS"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,iBAAiB,CAAC,YAAY,EAAE,IAAI,EAAE;AACtD,IAAI,MAAM,QAAQ,mCAAmC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAC;AACpE;AACA,IAAI,IAAI,KAAK,GAAG,aAAY;AAC5B,IAAI,IAAI,KAAK,GAAG,MAAK;AACrB,IAAI,GAAG;AACP,QAAQ,KAAK,GAAG,MAAK;AACrB,QAAQ,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE;AACpD,YAAY,MAAM,KAAK;AACvB,gBAAgB,UAAU,CAAC,KAAK,CAAC,KAAK;AACtC,cAAa;AACb;AACA,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE;AAC7D,gBAAgB,KAAK,GAAG,WAAU;AAClC,gBAAgB,KAAK,GAAG,KAAI;AAC5B,gBAAgB,KAAK;AACrB,aAAa;AACb,SAAS;AACT,KAAK,QAAQ,KAAK,CAAC;AACnB;AACA,IAAI,OAAO,KAAK;AAChB;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,YAAY,CAAC,YAAY,EAAE,UAAU,EAAE;AACvD,IAAI,IAAI,IAAI,GAAG,GAAE;AACjB;AACA,IAAI,IAAI,KAAK,GAAG,aAAY;AAC5B;AACA,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;AACxC,QAAQ,IAAI,GAAG,WAAU;AACzB,KAAK,MAAM;AACX,QAAQ,IAAI,GAAG,UAAU,CAAC,KAAI;AAC9B,QAAQ,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAC;AACpD,KAAK;AACL;AACA,IAAI,OAAO,KAAK,IAAI,IAAI,EAAE;AAC1B,QAAQ,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAC;AAC5C,QAAQ,IAAI,QAAQ,IAAI,IAAI,EAAE;AAC9B,YAAY,OAAO,QAAQ;AAC3B,SAAS;AACT,QAAQ,KAAK,GAAG,KAAK,CAAC,MAAK;AAC3B,KAAK;AACL;AACA,IAAI,OAAO,IAAI;AACf;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,MAAM,CAAC,CAAC,EAAE;AACnB,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/B,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE;AAClD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK;AAC/D,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,YAAY,CAAC,KAAK,EAAE;AACpC,IAAI,OAAO,0BAA0B,CAAC,KAAK,EAAE,IAAI,CAAC;AAClD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,YAAY,CAAC,KAAK,EAAE;AACpC,IAAI,OAAO,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC;AACjD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,gBAAgB,CAAC,KAAK,EAAE;AACxC,IAAI,OAAO,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC;AACjD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,YAAY,CAAC,KAAK,EAAE;AACpC,IAAI,OAAO,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC;AACjD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,mBAAmB,CAAC,KAAK,EAAE;AAC3C,IAAI,OAAO,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC;AACjD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,mBAAmB,CAAC,KAAK,EAAE;AAC3C,IAAI,OAAO,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC;AACjD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,qBAAqB,CAAC,KAAK,EAAE;AAC7C,IAAI,OAAO,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC;AACjD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,qBAAqB,CAAC,KAAK,EAAE;AAC7C,IAAI,OAAO,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC;AACjD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,mBAAmB,CAAC,KAAK,EAAE;AAC3C,IAAI,OAAO,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC;AACjD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,mBAAmB,CAAC,KAAK,EAAE;AAC3C,IAAI,OAAO,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC;AACjD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,cAAc,CAAC,KAAK,EAAE;AACtC,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;AAC5D,CAAC;AACD;AACY,MAAC,eAAe,GAAG,MAAM,CAAC,YAAY,EAAC;AACvC,MAAC,eAAe,GAAG,MAAM,CAAC,YAAY,EAAC;AACvC,MAAC,mBAAmB,GAAG,MAAM,CAAC,gBAAgB,EAAC;AAC/C,MAAC,eAAe,GAAG,MAAM,CAAC,YAAY,EAAC;AACvC,MAAC,sBAAsB,GAAG,MAAM,CAAC,mBAAmB,EAAC;AACrD,MAAC,sBAAsB,GAAG,MAAM,CAAC,mBAAmB,EAAC;AACrD,MAAC,wBAAwB,GAAG,MAAM,CAAC,qBAAqB,EAAC;AACzD,MAAC,wBAAwB,GAAG,MAAM,CAAC,qBAAqB,EAAC;AACzD,MAAC,sBAAsB,GAAG,MAAM,CAAC,mBAAmB,EAAC;AACrD,MAAC,sBAAsB,GAAG,MAAM,CAAC,mBAAmB,EAAC;AACrD,MAAC,iBAAiB,GAAG,MAAM,CAAC,cAAc;;ACnJtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE;AACnD,IAAI,OAAO,IAAI,CAAC,EAAE;AAClB;AACA,cAAc,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC;AACpE;AACA;AACA,cAAc,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,mBAAmB,CAAC;AACjE,WAAW;AACX,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE;AAC1D,IAAI,MAAM,MAAM,2BAA2B,CAAC,IAAI,EAAE,OAAM;AACxD;AACA;AACA,IAAI,IAAI,KAAK,GAAG,KAAI;AACpB;AACA,IAAI,IAAI,GAAG,GAAG,KAAI;AAClB;AACA,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAyB,EAAE;AACjD,QAAQ,MAAM,UAAU;AACxB,YAAY,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;AAC9D,UAAS;AACT;AACA,QAAQ,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,MAAK;AACpC,QAAQ,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,IAAG;AAChC,KAAK,MAAM;AACX,QAAQ,MAAM,CAAC,IAAI,KAAK,UAAU;AAClC,QAAQ,MAAM,CAAC,IAAI,KAAK,kBAAkB;AAC1C,QAAQ,MAAM,CAAC,IAAI,KAAK,oBAAoB;AAC5C,MAAM;AACN,QAAQ,KAAK,iCAAiC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAK;AAChE,QAAQ,GAAG,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,MAAK;AACjE,KAAK,MAAM;AACX,QAAQ,KAAK,iCAAiC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAK;AAC9D,QAAQ,GAAG,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,MAAK;AACjE,KAAK;AACL;AACA,IAAI,OAAO;AACX,QAAQ,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE;AAC3B,QAAQ,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE;AACvB,KAAK;AACL;;AC/DA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,YAAY;AAClB,IAAI,OAAO,UAAU,KAAK,WAAW;AACrC,UAAU,UAAU;AACpB;AACA,QAAQ,OAAO,IAAI,KAAK,WAAW;AACnC;AACA,UAAU,IAAI;AACd;AACA,QAAQ,OAAO,MAAM,KAAK,WAAW;AACrC;AACA,UAAU,MAAM;AAChB,UAAU,OAAO,MAAM,KAAK,WAAW;AACvC,UAAU,MAAM;AAChB,UAAU,GAAE;AACZ;AACA,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM;AAClC,IAAI,IAAI,GAAG,CAAC;AACZ,QAAQ,OAAO;AACf,QAAQ,aAAa;AACrB,QAAQ,QAAQ;AAChB,QAAQ,eAAe;AACvB,QAAQ,gBAAgB;AACxB,QAAQ,SAAS;AACjB,QAAQ,UAAU;AAClB,QAAQ,MAAM;AACd,QAAQ,WAAW;AACnB,QAAQ,oBAAoB;AAC5B,QAAQ,WAAW;AACnB,QAAQ,oBAAoB;AAC5B,QAAQ,QAAQ;AAChB,QAAQ,cAAc;AACtB,QAAQ,cAAc;AACtB,QAAQ,UAAU;AAClB,QAAQ,UAAU;AAClB,QAAQ,YAAY;AACpB,QAAQ,YAAY;AACpB,QAAQ,WAAW;AACnB,QAAQ,UAAU;AAClB,QAAQ,OAAO;AACf,QAAQ,eAAe;AACvB,QAAQ,MAAM;AACd,QAAQ,KAAK;AACb,QAAQ,MAAM;AACd,QAAQ,KAAK;AACb,QAAQ,QAAQ;AAChB,QAAQ,QAAQ;AAChB,QAAQ,YAAY;AACpB,QAAQ,UAAU;AAClB,QAAQ,SAAS;AACjB,QAAQ,OAAO;AACf,QAAQ,SAAS;AACjB,QAAQ,QAAQ;AAChB,QAAQ,KAAK;AACb,QAAQ,QAAQ;AAChB,QAAQ,QAAQ;AAChB,QAAQ,aAAa;AACrB,QAAQ,aAAa;AACrB,QAAQ,YAAY;AACpB,QAAQ,mBAAmB;AAC3B,QAAQ,WAAW;AACnB,QAAQ,UAAU;AAClB,QAAQ,SAAS;AACjB,QAAQ,SAAS;AACjB,KAAK,CAAC;AACN,EAAC;AACD,MAAM,WAAW,GAAG,IAAI,GAAG;AAC3B,IAAI;AACJ,QAAQ,KAAK,CAAC,OAAO;AACrB,QAAQ,KAAK,CAAC,EAAE;AAChB,QAAQ,KAAK,CAAC,SAAS,CAAC,EAAE;AAC1B,QAAQ,KAAK,CAAC,SAAS,CAAC,MAAM;AAC9B,QAAQ,KAAK,CAAC,SAAS,CAAC,OAAO;AAC/B,QAAQ,KAAK,CAAC,SAAS,CAAC,KAAK;AAC7B,QAAQ,KAAK,CAAC,SAAS,CAAC,MAAM;AAC9B,QAAQ,KAAK,CAAC,SAAS,CAAC,IAAI;AAC5B,QAAQ,KAAK,CAAC,SAAS,CAAC,SAAS;AACjC,QAAQ,KAAK,CAAC,SAAS,CAAC,IAAI;AAC5B,QAAQ,KAAK,CAAC,SAAS,CAAC,QAAQ;AAChC,QAAQ,KAAK,CAAC,SAAS,CAAC,OAAO;AAC/B,QAAQ,KAAK,CAAC,SAAS,CAAC,IAAI;AAC5B,QAAQ,KAAK,CAAC,SAAS,CAAC,IAAI;AAC5B,QAAQ,KAAK,CAAC,SAAS,CAAC,WAAW;AACnC,QAAQ,KAAK,CAAC,SAAS,CAAC,KAAK;AAC7B,QAAQ,KAAK,CAAC,SAAS,CAAC,IAAI;AAC5B,QAAQ,KAAK,CAAC,SAAS,CAAC,QAAQ;AAChC,QAAQ,KAAK,CAAC,SAAS,CAAC,MAAM;AAC9B,QAAQ,OAAO,MAAM,KAAK,UAAU,GAAG,MAAM,GAAG,SAAS;AACzD,QAAQ,OAAO;AACf,QAAQ,IAAI;AACZ,QAAQ,IAAI,CAAC,KAAK;AAClB,QAAQ,SAAS;AACjB,QAAQ,kBAAkB;AAC1B,QAAQ,SAAS;AACjB,QAAQ,kBAAkB;AAC1B,QAAQ,MAAM;AACd,QAAQ,QAAQ;AAChB,QAAQ,KAAK;AACb;AACA,QAAQ,aAAa;AACrB,QAAQ,GAAG;AACX,QAAQ,GAAG,CAAC,SAAS,CAAC,OAAO;AAC7B,QAAQ,GAAG,CAAC,SAAS,CAAC,GAAG;AACzB,QAAQ,GAAG,CAAC,SAAS,CAAC,GAAG;AACzB,QAAQ,GAAG,CAAC,SAAS,CAAC,IAAI;AAC1B,QAAQ,GAAG,CAAC,SAAS,CAAC,MAAM;AAC5B,QAAQ,wCAAwC;AAChD,YAAY,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC;AAC5C;AACA,aAAa,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC;AAC1C,aAAa,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,aAAa,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,UAAU,CAAC;AACnD,QAAQ,MAAM;AACd,QAAQ,MAAM,CAAC,QAAQ;AACvB,QAAQ,MAAM,CAAC,KAAK;AACpB,QAAQ,MAAM,CAAC,UAAU;AACzB,QAAQ,MAAM,CAAC,QAAQ;AACvB,QAAQ,MAAM,CAAC,SAAS,CAAC,aAAa;AACtC,QAAQ,MAAM,CAAC,SAAS,CAAC,OAAO;AAChC,QAAQ,MAAM,CAAC,SAAS,CAAC,WAAW;AACpC,QAAQ,MAAM,CAAC,SAAS,CAAC,QAAQ;AACjC,QAAQ,MAAM;AACd,QAAQ,MAAM,CAAC,OAAO;AACtB,QAAQ,MAAM,CAAC,EAAE;AACjB,QAAQ,MAAM,CAAC,YAAY;AAC3B,QAAQ,MAAM,CAAC,QAAQ;AACvB,QAAQ,MAAM,CAAC,QAAQ;AACvB,QAAQ,MAAM,CAAC,IAAI;AACnB,QAAQ,MAAM,CAAC,MAAM;AACrB,QAAQ,UAAU;AAClB,QAAQ,QAAQ;AAChB,QAAQ,MAAM;AACd,QAAQ,GAAG;AACX,QAAQ,GAAG,CAAC,SAAS,CAAC,OAAO;AAC7B,QAAQ,GAAG,CAAC,SAAS,CAAC,GAAG;AACzB,QAAQ,GAAG,CAAC,SAAS,CAAC,IAAI;AAC1B,QAAQ,GAAG,CAAC,SAAS,CAAC,MAAM;AAC5B,QAAQ,MAAM;AACd,QAAQ,MAAM,CAAC,YAAY;AAC3B,QAAQ,MAAM,CAAC,aAAa;AAC5B,QAAQ,MAAM,CAAC,GAAG;AAClB,QAAQ,MAAM,CAAC,SAAS,CAAC,EAAE;AAC3B,QAAQ,MAAM,CAAC,SAAS,CAAC,MAAM;AAC/B,QAAQ,MAAM,CAAC,SAAS,CAAC,UAAU;AACnC,QAAQ,MAAM,CAAC,SAAS,CAAC,WAAW;AACpC,QAAQ,MAAM,CAAC,SAAS,CAAC,MAAM;AAC/B,QAAQ,MAAM,CAAC,SAAS,CAAC,QAAQ;AACjC,QAAQ,MAAM,CAAC,SAAS,CAAC,QAAQ;AACjC,QAAQ,MAAM,CAAC,SAAS,CAAC,OAAO;AAChC,QAAQ,MAAM,CAAC,SAAS,CAAC,WAAW;AACpC,QAAQ,MAAM,CAAC,SAAS,CAAC,SAAS;AAClC,QAAQ,MAAM,CAAC,SAAS,CAAC,MAAM;AAC/B,QAAQ,MAAM,CAAC,SAAS,CAAC,QAAQ;AACjC,QAAQ,MAAM,CAAC,SAAS,CAAC,KAAK;AAC9B,QAAQ,MAAM,CAAC,SAAS,CAAC,UAAU;AACnC,QAAQ,MAAM,CAAC,SAAS,CAAC,MAAM;AAC/B,QAAQ,MAAM,CAAC,SAAS,CAAC,SAAS;AAClC,QAAQ,MAAM,CAAC,SAAS,CAAC,WAAW;AACpC,QAAQ,MAAM,CAAC,SAAS,CAAC,QAAQ;AACjC,QAAQ,MAAM,CAAC,SAAS,CAAC,WAAW;AACpC,QAAQ,MAAM,CAAC,SAAS,CAAC,IAAI;AAC7B,QAAQ,MAAM,CAAC,SAAS,CAAC,OAAO;AAChC,QAAQ,MAAM,CAAC,SAAS,CAAC,QAAQ;AACjC,QAAQ,MAAM,CAAC,SAAS,CAAC,SAAS;AAClC,QAAQ,MAAM,CAAC,SAAS,CAAC,SAAS;AAClC,QAAQ,MAAM,CAAC,GAAG;AAClB,QAAQ,MAAM,CAAC,MAAM;AACrB,QAAQ,QAAQ;AAChB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,UAAU,CAAC;AAC5C,EAAC;AACD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;AAChC,IAAI,MAAM,CAAC,MAAM;AACjB,IAAI,MAAM,CAAC,iBAAiB;AAC5B,IAAI,MAAM,CAAC,IAAI;AACf,CAAC,EAAC;AACF;AACA;AACA,MAAM,aAAa,GAAG;AACtB,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5B,IAAI;AACJ,QAAQ,MAAM;AACd,QAAQ,IAAI,GAAG,CAAC;AAChB,YAAY,QAAQ;AACpB,YAAY,OAAO;AACnB,YAAY,QAAQ;AACpB,YAAY,YAAY;AACxB,YAAY,YAAY;AACxB,YAAY,WAAW;AACvB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,SAAS,CAAC;AACV,KAAK;AACL,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5B,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE;AAC7C,IAAI,IAAI,CAAC,GAAG,OAAM;AAClB,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,UAAU,KAAK,CAAC,KAAK,IAAI,EAAE;AAC7E,QAAQ,MAAM,CAAC,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAAE,IAAI,EAAC;AAC1D,QAAQ,IAAI,CAAC,EAAE;AACf,YAAY,OAAO,CAAC;AACpB,SAAS;AACT,QAAQ,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,EAAC;AACpC,KAAK;AACL,IAAI,OAAO,IAAI;AACf,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE;AAChC,IAAI,MAAM,CAAC,GAAG,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAC;AACjD,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI;AACrC,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE;AAClD,IAAI,MAAM,SAAS,GAAG,GAAE;AACxB;AACA,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;AAC9C,QAAQ,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,EAAC;AACvC;AACA,QAAQ,IAAI,WAAW,IAAI,IAAI,EAAE;AACjC,YAAY,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,EAAC;AACpC,SAAS,MAAM,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,EAAE;AACzD,YAAY,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAC;AAChF,YAAY,IAAI,QAAQ,IAAI,IAAI,EAAE;AAClC,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY,SAAS,CAAC,IAAI,CAAC,iCAAiC,QAAQ,CAAC,KAAK,CAAC,EAAC;AAC5E,SAAS,MAAM;AACf,YAAY,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,EAAE,YAAY,EAAC;AACtE,YAAY,IAAI,OAAO,IAAI,IAAI,EAAE;AACjC,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAC;AACzC,SAAS;AACT,KAAK;AACL;AACA,IAAI,OAAO,SAAS;AACpB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,eAAe,CAAC,QAAQ,EAAE;AACnC,IAAI;AACJ,QAAQ,QAAQ,IAAI,IAAI;AACxB,QAAQ,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;AAClC,QAAQ,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;AACvC,QAAQ,QAAQ,CAAC,IAAI,IAAI,YAAY;AACrC,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,oBAAoB,CAAC,QAAQ,EAAE;AACxC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACpC,QAAQ,OAAO,KAAK;AACpB,KAAK;AACL,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAC;AAChC,IAAI,OAAO,OAAO;AAClB,QAAQ,GAAG,CAAC,MAAM;AAClB,YAAY,GAAG,CAAC,IAAI,KAAK,UAAU;AACnC,aAAa,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACzE,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,kBAAkB,CAAC,QAAQ,EAAE;AACtC,IAAI,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAU;AACpC;AACA,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,OAAM;AACnD,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,OAAM;AAC3D,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE;AACtD;AACA,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL,IAAI,OAAO,KAAK;AAChB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE;AACvD,IAAI,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE;AAC3C,QAAQ,IAAI,IAAI,gCAAgC,GAAG,CAAC,UAAU,EAAC;AAC/D,QAAQ,OAAO,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE;AAC/E,YAAY,IAAI,GAAG,IAAI,CAAC,OAAM;AAC9B,SAAS;AACT,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACnC,YAAY,QAAQ;AACpB,SAAS;AACT,QAAQ;AACR,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,sBAAsB;AACxD,gBAAgB,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI;AACzC,aAAa,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,kBAAkB;AACpD,gBAAgB,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC;AAC9C,UAAU;AACV;AACA,YAAY,OAAO,IAAI;AACvB,SAAS;AACT,QAAQ;AACR,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,gBAAgB;AACjD,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI;AACvC,YAAY,IAAI,CAAC,IAAI,KAAK,kBAAkB;AAC5C,UAAU;AACV,YAAY,MAAM,UAAU,GAAG,0BAA0B,CAAC,IAAI,EAAE,YAAY,EAAC;AAC7E,YAAY,IAAI,2BAA2B,CAAC,UAAU,CAAC,EAAE;AACzD;AACA,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,SAAS;AACT,KAAK;AACL,IAAI,OAAO,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,2BAA2B,CAAC,UAAU,EAAE;AACrD,QAAQ,IAAI,UAAU,IAAI,IAAI,IAAI,UAAU,CAAC,KAAK,IAAI,IAAI,EAAE;AAC5D,YAAY,OAAO,KAAK;AACxB,SAAS;AACT,QAAQ,MAAM,IAAI,GAAG,UAAU,CAAC,MAAK;AACrC,QAAQ;AACR,YAAY,IAAI,KAAK,YAAY;AACjC,YAAY,IAAI,KAAK,MAAM;AAC3B,YAAY,IAAI,KAAK,KAAK;AAC1B,YAAY,IAAI,KAAK,MAAM;AAC3B,YAAY,IAAI,KAAK,SAAS;AAC9B,YAAY,IAAI,KAAK,OAAO;AAC5B,YAAY,IAAI,KAAK,MAAM;AAC3B,YAAY,IAAI,KAAK,QAAQ;AAC7B,YAAY,IAAI,KAAK,SAAS;AAC9B,SAAS;AACT,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;AACjC,IAAI,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;AACxC,QAAQ,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAC;AACtE,QAAQ,OAAO,QAAQ,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;AAC5D,KAAK;AACL;AACA,IAAI,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE;AAC7C,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE;AACnC,YAAY,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;AAC5D,SAAS;AACT,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;AACA;AACA,IAAI,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE;AACzC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,EAAE;AACtE;AACA,YAAY,OAAO,IAAI;AACvB,SAAS;AACT;AACA,QAAQ,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAC;AAC7D,QAAQ,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAC;AAC/D,QAAQ,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;AAC3C,YAAY,QAAQ,IAAI,CAAC,QAAQ;AACjC,gBAAgB,KAAK,IAAI;AACzB,oBAAoB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/D,gBAAgB,KAAK,IAAI;AACzB,oBAAoB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/D,gBAAgB,KAAK,KAAK;AAC1B,oBAAoB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE;AAChE,gBAAgB,KAAK,KAAK;AAC1B,oBAAoB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE;AAChE,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,IAAI;AACzB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,IAAI;AACzB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,IAAI;AACzB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,IAAI;AACzB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,KAAK;AAC1B,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,IAAI;AACzB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK;AAC7B,+CAA+C,CAAC,IAAI,CAAC,KAAK;AAC1D,gDAAgD,KAAK,CAAC,KAAK,CAAC;AAC5D,qBAAqB;AACrB;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;AACA,IAAI,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE;AACvC,QAAQ,MAAM,UAAU,GAAG,IAAI,CAAC,OAAM;AACtC,QAAQ,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAC;AACnE;AACA,QAAQ,IAAI,IAAI,IAAI,IAAI,EAAE;AAC1B,YAAY,IAAI,UAAU,CAAC,IAAI,KAAK,kBAAkB,EAAE;AACxD,gBAAgB,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,mBAAmB,EAAE;AACtE,oBAAoB,OAAO,IAAI;AAC/B,iBAAiB;AACjB,gBAAgB,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,EAAC;AAC/E,gBAAgB,IAAI,MAAM,IAAI,IAAI,EAAE;AACpC,oBAAoB;AACpB,wBAAwB,MAAM,CAAC,KAAK,IAAI,IAAI;AAC5C,yBAAyB,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;AAC1D,sBAAsB;AACtB,wBAAwB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;AACnE,qBAAqB;AACrB,oBAAoB,MAAM,QAAQ,GAAG,0BAA0B;AAC/D,wBAAwB,UAAU;AAClC,wBAAwB,YAAY;AACpC,sBAAqB;AACrB;AACA,oBAAoB,IAAI,QAAQ,IAAI,IAAI,EAAE;AAC1C,wBAAwB,MAAM,QAAQ;AACtC;AACA,gCAAgC,MAAM,CAAC,KAAK;AAC5C,8BAA6B;AAC7B,wBAAwB,MAAM,UAAU;AACxC,4BAA4B,QAAQ,CAAC,KAAK;AAC1C,0BAAyB;AACzB,wBAAwB,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE;AACnE,4BAA4B,OAAO;AACnC,gCAAgC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC;AACpE,6BAA6B;AAC7B,yBAAyB;AACzB,wBAAwB,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE;AACvE,4BAA4B,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE;AACrD,yBAAyB;AACzB,qBAAqB;AACrB,iBAAiB;AACjB,aAAa,MAAM;AACnB,gBAAgB,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,EAAE,YAAY,EAAC;AACxE,gBAAgB,IAAI,MAAM,IAAI,IAAI,EAAE;AACpC,oBAAoB,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC/D,wBAAwB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;AACnE,qBAAqB;AACrB,oBAAoB,MAAM,IAAI;AAC9B,wBAAwB,MAAM,CAAC,KAAK;AACpC,sBAAqB;AACrB,oBAAoB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC/C,wBAAwB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;AACvD,qBAAqB;AACrB,oBAAoB,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACnD,wBAAwB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE;AACjD,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;AACA,IAAI,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE;AAC9C,QAAQ,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAC;AAC7D,QAAQ,IAAI,IAAI,IAAI,IAAI,EAAE;AAC1B,YAAY,OAAO,IAAI,CAAC,KAAK;AAC7B,kBAAkB,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;AAChE,kBAAkB,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;AAC/D,SAAS;AACT,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;AACA,IAAI,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE;AAC5C,QAAQ,OAAO,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;AAC7D,KAAK;AACL;AACA,IAAI,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE;AACnC,QAAQ,IAAI,YAAY,IAAI,IAAI,EAAE;AAClC,YAAY,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,IAAI,EAAC;AAC7D;AACA,YAAY,IAAI,QAAQ,IAAI,IAAI,EAAE;AAClC;AACA,gBAAgB,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE;AAC/C,oBAAoB,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACjE,iBAAiB;AACjB;AACA;AACA,gBAAgB,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE;AACpD,oBAAoB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAC;AAChD,oBAAoB;AACpB;AACA,wBAAwB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY;AACzD,sBAAsB;AACtB,wBAAwB,MAAM,IAAI,GAAG,eAAe;AACpD,4BAA4B,GAAG,CAAC,IAAI,CAAC,IAAI;AACzC,4BAA4B,YAAY;AACxC,0BAAyB;AACzB,wBAAwB;AACxB,4BAA4B,IAAI;AAChC,4BAA4B,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;AAC1D,4BAA4B,IAAI,CAAC,KAAK,KAAK,IAAI;AAC/C,0BAA0B;AAC1B,4BAA4B,IAAI,qBAAqB,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE;AAC/E;AACA,gCAAgC,OAAO,IAAI;AAC3C,6BAA6B;AAC7B,yBAAyB;AACzB,wBAAwB,OAAO,IAAI;AACnC,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;AACA,IAAI,OAAO,CAAC,IAAI,EAAE;AAClB,QAAQ,MAAM,OAAO;AACrB;AACA,gBAAgB,IAAI;AACpB,cAAa;AACb;AACA,QAAQ;AACR,YAAY,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI;AAC5D,YAAY,OAAO,CAAC,KAAK,IAAI,IAAI;AACjC,UAAU;AACV;AACA,YAAY,OAAO,IAAI;AACvB,SAAS;AACT,QAAQ,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;AACvC,KAAK;AACL;AACA,IAAI,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE;AAC1C,QAAQ,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAC;AAC7D,QAAQ,IAAI,IAAI,IAAI,IAAI,EAAE;AAC1B,YAAY;AACZ,gBAAgB,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI;AACvE,iBAAiB,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;AACzE,iBAAiB,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;AAC9D,cAAc;AACd,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb;AACA,YAAY,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAC;AACnE,YAAY,IAAI,KAAK,IAAI,IAAI,EAAE;AAC/B,gBAAgB,OAAO,KAAK;AAC5B,aAAa;AACb,SAAS;AACT;AACA,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;AACA,IAAI,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE;AACzC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,mBAAmB,EAAE;AACxD,YAAY,OAAO,IAAI;AACvB,SAAS;AACT,QAAQ,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAC;AACjE,QAAQ,IAAI,MAAM,IAAI,IAAI,EAAE;AAC5B,YAAY,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,KAAK,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE;AAC5E,gBAAgB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC3D,aAAa;AACb,YAAY,MAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,EAAE,YAAY,EAAC;AAC3E;AACA,YAAY,IAAI,QAAQ,IAAI,IAAI,EAAE;AAClC,gBAAgB;AAChB,oBAAoB,CAAC,QAAQ;AAC7B,+CAA+C,MAAM,CAAC,KAAK;AAC3D,oDAAoD,QAAQ,CAAC,KAAK;AAClE,qBAAqB;AACrB,kBAAkB;AAClB,oBAAoB,OAAO;AAC3B,wBAAwB,KAAK,8CAA8C;AAC3E,4BAA4B,MAAM,CAAC,KAAK;AACxC,sDAAsD,QAAQ,CAAC,KAAK,EAAE;AACtE,qBAAqB;AACrB,iBAAiB;AACjB;AACA,gBAAgB,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,aAAa,EAAE;AAChE,oBAAoB;AACpB,wBAAwB,MAAM,CAAC,KAAK,YAAY,OAAO;AACvD,wBAAwB,OAAO,CAAC,GAAG,wBAAwB,QAAQ,CAAC,KAAK,EAAE;AAC3E,sBAAsB;AACtB,wBAAwB,OAAO;AAC/B,4BAA4B,KAAK,8CAA8C;AAC/E,gCAAgC,MAAM,CAAC,KAAK;AAC5C,0DAA0D,QAAQ,CAAC,KAAK,EAAE;AAC1E,yBAAyB;AACzB,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;AACA,IAAI,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;AACxC,QAAQ,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAC;AACzE,QAAQ,IAAI,UAAU,IAAI,IAAI,EAAE;AAChC,YAAY,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE;AAC9C,SAAS;AACT,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;AACA,IAAI,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE;AACtC,QAAQ,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAC;AACjE,QAAQ,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAC;AACnE;AACA,QAAQ,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAC5C,YAAY,MAAM,IAAI;AACtB,gBAAgB,MAAM,CAAC,KAAK;AAC5B,cAAa;AACb,YAAY,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACvC,gBAAgB,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;AACnD,aAAa;AACb,SAAS;AACT;AACA,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;AACA,IAAI,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE;AACzC;AACA,QAAQ,MAAM,MAAM,GAAG,GAAE;AACzB;AACA,QAAQ,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE;AACpD,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,UAAU,EAAE;AAClD,gBAAgB,IAAI,YAAY,CAAC,IAAI,KAAK,MAAM,EAAE;AAClD,oBAAoB,OAAO,IAAI;AAC/B,iBAAiB;AACjB,gBAAgB,MAAM,GAAG,GAAG,0BAA0B;AACtD,oBAAoB,YAAY;AAChC,oBAAoB,YAAY;AAChC,kBAAiB;AACjB,gBAAgB,MAAM,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,EAAC;AAC/E,gBAAgB,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;AAClD,oBAAoB,OAAO,IAAI;AAC/B,iBAAiB;AACjB,gBAAgB,MAAM,6BAA6B,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,MAAK;AAC5E,aAAa,MAAM;AACnB,gBAAgB,YAAY,CAAC,IAAI,KAAK,eAAe;AACrD;AACA,gBAAgB,YAAY,CAAC,IAAI,KAAK,4BAA4B;AAClE,cAAc;AACd,gBAAgB,MAAM,QAAQ,GAAG,eAAe;AAChD,oBAAoB,YAAY,CAAC,QAAQ;AACzC,oBAAoB,YAAY;AAChC,kBAAiB;AACjB,gBAAgB,IAAI,QAAQ,IAAI,IAAI,EAAE;AACtC,oBAAoB,OAAO,IAAI;AAC/B,iBAAiB;AACjB,gBAAgB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAC;AACrD,aAAa,MAAM;AACnB,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,SAAS;AACT;AACA,QAAQ,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;AAChC,KAAK;AACL;AACA,IAAI,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE;AAC3C,QAAQ,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAC;AAClE,QAAQ,OAAO,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC;AAClD,KAAK;AACL;AACA,IAAI,wBAAwB,CAAC,IAAI,EAAE,YAAY,EAAE;AACjD,QAAQ,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAC;AAC3D,QAAQ,MAAM,WAAW,GAAG,gBAAgB;AAC5C,YAAY,IAAI,CAAC,KAAK,CAAC,WAAW;AAClC,YAAY,YAAY;AACxB,UAAS;AACT;AACA,QAAQ,IAAI,GAAG,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,EAAE;AAChD,YAAY,MAAM,IAAI,2CAA2C,GAAG,CAAC,KAAK,EAAC;AAC3E;AACA,YAAY,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,EAAC;AACxE,YAAY,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAC;AACnE;AACA,YAAY,IAAI,IAAI,KAAK,MAAM,CAAC,GAAG,EAAE;AACrC,gBAAgB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,EAAE;AAC/D,aAAa;AACb,SAAS;AACT;AACA,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;AACA,IAAI,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;AACxC,QAAQ,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAC;AAC5E,QAAQ,IAAI,WAAW,IAAI,IAAI,EAAE;AACjC,YAAY,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAM;AACnD,YAAY,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;AACzD,gBAAgB,KAAK,IAAI,WAAW,CAAC,CAAC,EAAC;AACvC,gBAAgB,KAAK,2BAA2B,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAC;AAChF,aAAa;AACb,YAAY,OAAO,EAAE,KAAK,EAAE;AAC5B,SAAS;AACT,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;AACA,IAAI,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;AACxC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE;AACxC;AACA,YAAY,OAAO,IAAI;AACvB,SAAS;AACT,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE;AACtC,YAAY,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AACvC,SAAS;AACT;AACA,QAAQ,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAC;AAChE,QAAQ,IAAI,GAAG,IAAI,IAAI,EAAE;AACzB,YAAY,QAAQ,IAAI,CAAC,QAAQ;AACjC,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO,EAAE,KAAK,EAAE,sBAAsB,GAAG,CAAC,KAAK,EAAE,EAAE;AACvE,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO,EAAE,KAAK,EAAE,sBAAsB,GAAG,CAAC,KAAK,EAAE,EAAE;AACvE,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE;AAChD,gBAAgB,KAAK,GAAG;AACxB,oBAAoB,OAAO,EAAE,KAAK,EAAE,sBAAsB,GAAG,CAAC,KAAK,EAAE,EAAE;AACvE,gBAAgB,KAAK,QAAQ;AAC7B,oBAAoB,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,EAAE;AACtD;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL,IAAI,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE;AACvC,QAAQ,OAAO,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;AAC7D,KAAK;AACL,IAAI,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE;AAC9C,QAAQ,OAAO,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;AAC7D,KAAK;AACL,IAAI,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;AACxC,QAAQ,OAAO,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;AAC7D,KAAK;AACL,IAAI,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE;AAC5C,QAAQ,OAAO,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;AAC7D,KAAK;AACL,IAAI,yBAAyB,CAAC,IAAI,EAAE,YAAY,EAAE;AAClD,QAAQ,OAAO,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;AAC7D,KAAK;AACL,CAAC,EAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;AAC7C,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;AAC3E,QAAQ,2CAA2C,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;AACzE,yCAAyC,IAAI;AAC7C,YAAY,YAAY;AACxB,SAAS;AACT,KAAK;AACL,IAAI,OAAO,IAAI;AACf,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,0BAA0B,CAAC,IAAI,EAAE,YAAY,EAAE;AACxD,IAAI,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,UAAU,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,SAAQ;AACxE;AACA,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;AACvB,QAAQ,OAAO,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC;AACtD,KAAK;AACL;AACA,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE;AACxC,QAAQ,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE;AACvC,KAAK;AACL;AACA,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;AACrC,QAAQ,0CAA0C,CAAC,QAAQ,EAAE,MAAM,EAAE;AACrE,YAAY,OAAO,EAAE,KAAK,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC5E,SAAS;AACT,QAAQ,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAChD,KAAK;AACL;AACA,IAAI,OAAO,IAAI;AACf,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE;AAC1D,IAAI,IAAI;AACR,QAAQ,OAAO,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC;AAClD,KAAK,CAAC,OAAO,MAAM,EAAE;AACrB,QAAQ,OAAO,IAAI;AACnB,KAAK;AACL;;AC35BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE;AAC/D;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;AAChE,QAAQ,MAAM,OAAO;AACrB;AACA,gBAAgB,IAAI;AACpB,cAAa;AACb,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE;AAC3B,YAAY,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrE,SAAS;AACT,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE;AAC5B,YAAY,OAAO,OAAO,CAAC,MAAM;AACjC,SAAS;AACT,KAAK;AACL;AACA,IAAI,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,YAAY,EAAC;AACxD;AACA,IAAI,IAAI,SAAS,EAAE;AACnB;AACA,QAAQ,IAAI;AACZ,YAAY,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;AAC1C,SAAS,CAAC,MAAM;AAChB;AACA,SAAS;AACT,KAAK;AACL;AACA,IAAI,OAAO,IAAI;AACf;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;AACpD,IAAI,QAAQ,IAAI,CAAC,IAAI;AACrB,QAAQ,KAAK,kBAAkB;AAC/B,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC/B,gBAAgB,OAAO,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;AACvE,aAAa;AACb,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,mBAAmB,EAAE;AAC5D,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY,0CAA0C,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI;AAC1E;AACA,QAAQ,KAAK,UAAU,CAAC;AACxB,QAAQ,KAAK,kBAAkB,CAAC;AAChC,QAAQ,KAAK,oBAAoB;AACjC,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC/B,gBAAgB,OAAO,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC;AAClE,aAAa;AACb,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE;AAC7C,gBAAgB,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7C,aAAa;AACb,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,mBAAmB,EAAE;AACvD,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY,0CAA0C,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI;AAIrE,KAAK;AACL;AACA,IAAI,OAAO,IAAI;AACf;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE;AAC1D,IAAI,MAAM,MAAM,2BAA2B,CAAC,IAAI,EAAE,OAAM;AACxD,IAAI,MAAM,MAAM,GAAG,GAAE;AACrB,IAAI,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK,KAAK,KAAI;AAC9E,IAAI,MAAM,aAAa;AACvB,QAAQ,MAAM,CAAC,IAAI,KAAK,kBAAkB,IAAI,MAAM,CAAC,KAAK,KAAK,KAAI;AACnE,IAAI,MAAM,kBAAkB;AAC5B,QAAQ,MAAM,CAAC,IAAI,KAAK,oBAAoB,IAAI,MAAM,CAAC,KAAK,KAAK,KAAI;AACrE;AACA;AACA,IAAI,IAAI,aAAa,IAAI,kBAAkB,EAAE;AAC7C,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;AAC3B,YAAY,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAC;AACjC,SAAS;AACT,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,mBAAmB,EAAE;AACrD,YAAY,MAAM,CAAC,IAAI,CAAC,SAAS,EAAC;AAClC,SAAS;AACT,KAAK;AACL,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AACpB,QAAQ,MAAM,CAAC,IAAI,CAAC,OAAO,EAAC;AAC5B,KAAK;AACL,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;AACxB,QAAQ,MAAM,CAAC,IAAI,CAAC,WAAW,EAAC;AAChC,KAAK;AACL;AACA;AACA,IAAI,IAAI,cAAc,IAAI,aAAa,EAAE;AACzC,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE;AAC3C,YAAY,OAAO,aAAa;AAChC,SAAS;AACT,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE;AACnC,YAAY,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAC;AACjC,SAAS,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE;AAC1C,YAAY,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAC;AACjC,SAAS,MAAM;AACf,YAAY,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAC;AACjC,SAAS;AACT,KAAK,MAAM,IAAI,kBAAkB,EAAE;AACnC,QAAQ,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAC;AAC7B,KAAK,MAAM;AACX,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAyB,EAAE;AACrD,YAAY,MAAM,CAAC,IAAI,CAAC,OAAO,EAAC;AAChC,SAAS;AACT,QAAQ,MAAM,CAAC,IAAI,CAAC,UAAU,EAAC;AAC/B,KAAK;AACL;AACA;AACA,IAAI,IAAI,cAAc,IAAI,aAAa,IAAI,kBAAkB,EAAE;AAC/D,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,mBAAmB,EAAE;AACrD,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAC;AAC9C,SAAS,MAAM;AACf,YAAY,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAC;AAChD,YAAY,IAAI,IAAI,EAAE;AACtB,gBAAgB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAC;AACxC,aAAa,MAAM,IAAI,UAAU,EAAE;AACnC,gBAAgB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAC;AAC9D,gBAAgB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC7C,oBAAoB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAC;AAC/C,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE;AAC5B,QAAQ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC;AACxC,KAAK,MAAM;AACX,QAAQ,MAAM,CAAC,IAAI,KAAK,oBAAoB;AAC5C,QAAQ,MAAM,CAAC,EAAE;AACjB,QAAQ,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY;AACvC,MAAM;AACN,QAAQ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC;AAC1C,KAAK,MAAM;AACX,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,sBAAsB;AAC/C,YAAY,MAAM,CAAC,IAAI,KAAK,mBAAmB;AAC/C,QAAQ,MAAM,CAAC,IAAI;AACnB,QAAQ,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY;AACzC,MAAM;AACN,QAAQ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC;AAC5C,KAAK,MAAM;AACX,QAAQ,MAAM,CAAC,IAAI,KAAK,0BAA0B;AAClD,QAAQ,MAAM,CAAC,WAAW,KAAK,IAAI;AACnC,MAAM;AACN,QAAQ,MAAM,CAAC,IAAI,CAAC,WAAW,EAAC;AAChC,KAAK;AACL;AACA,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAC3B,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,SAAS,KAAK,CAAC,IAAI,EAAE;AACrB,IAAI,OAAO,OAAO;AAClB,yEAAyE,CAAC,IAAI;AAC9E,aAAa,EAAE;AACf,KAAK;AACL;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM;AAC7C,IAAI,IAAI,GAAG,CAAC;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,GAAG;AACX,QAAQ,IAAI;AACZ,QAAQ,GAAG;AACX,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,KAAK;AACb,QAAQ,GAAG;AACX,QAAQ,GAAG;AACX,QAAQ,GAAG;AACX,QAAQ,GAAG;AACX,QAAQ,GAAG;AACX,QAAQ,GAAG;AACX,QAAQ,GAAG;AACX,QAAQ,GAAG;AACX,QAAQ,IAAI;AACZ,KAAK,CAAC;AACN,EAAC;AACD,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,MAAM,CAAC,CAAC,EAAE;AACnB,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;AAC5E,CAAC;AACD;AACA,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM;AAC7B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AACvC;AACA;AACA;AACA;AACA;AACA,QAAQ,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;AAC3C,YAAY,MAAM,EAAE,IAAI,EAAE,GAAG,KAAI;AACjC;AACA,YAAY,IAAI,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,EAAE;AACzE,gBAAgB,0BAA0B,CAAC,IAAI,EAAE,IAAI,CAAC;AACtD,oBAAoB,IAAI;AACxB,oBAAoB,OAAO;AAC3B,oBAAoB,WAAW;AAC/B,iBAAiB;AACjB,aAAa;AACb;AACA,YAAY,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;AAClE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;AACnD,YAAY,MAAM,EAAE,IAAI,EAAE,GAAG,KAAI;AACjC;AACA,YAAY,KAAK,MAAM,GAAG;AAC1B,gBAAgB,WAAW,CAAC,IAAI,CAAC,IAAIA,yBAAO,CAAC,IAAI,CAAC;AAClD,eAAe;AACf,gBAAgB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAC;AACvC;AACA,gBAAgB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC1C,oBAAoB,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE;AACjD,wBAAwB;AACxB,4BAA4B,MAAM,CAAC,OAAO,CAAC;AAC3C,4BAA4B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC;AACtE,0BAA0B;AAC1B,4BAA4B,OAAO,IAAI;AACvC,yBAAyB;AACzB,qBAAqB;AACrB,iBAAiB,MAAM;AACvB,oBAAoB,MAAM,CAAC,KAAK,CAAC;AACjC,oBAAoB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC;AAC5D,kBAAkB;AAClB,oBAAoB,OAAO,IAAI;AAC/B,iBAAiB;AACjB,aAAa;AACb;AACA,YAAY,OAAO,KAAK;AACxB,SAAS;AACT;AACA,QAAQ,uBAAuB,GAAG;AAClC,YAAY,OAAO,KAAK;AACxB,SAAS;AACT,QAAQ,oBAAoB,GAAG;AAC/B,YAAY,OAAO,IAAI;AACvB,SAAS;AACT,QAAQ,eAAe,GAAG;AAC1B,YAAY,OAAO,IAAI;AACvB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;AACrD,YAAY;AACZ,gBAAgB,OAAO,CAAC,8BAA8B;AACtD,gBAAgB,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC1D,iBAAiB,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;AAC/E,cAAc;AACd,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;AAClE,SAAS;AACT,QAAQ,cAAc,GAAG;AACzB,YAAY,OAAO,IAAI;AACvB,SAAS;AACT,QAAQ,kBAAkB,GAAG;AAC7B,YAAY,OAAO,KAAK;AACxB,SAAS;AACT,QAAQ,gBAAgB,GAAG;AAC3B,YAAY,OAAO,IAAI;AACvB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;AACrD,YAAY,IAAI,OAAO,CAAC,eAAe,EAAE;AACzC,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY;AACZ,gBAAgB,OAAO,CAAC,8BAA8B;AACtD,gBAAgB,IAAI,CAAC,QAAQ;AAC7B,gBAAgB,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;AAChD,cAAc;AACd,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;AAClE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;AACrD,YAAY;AACZ,gBAAgB,OAAO,CAAC,8BAA8B;AACtD,gBAAgB,IAAI,CAAC,QAAQ;AAC7B,gBAAgB,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS;AAC3C,cAAc;AACd,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;AAClE,SAAS;AACT,QAAQ,aAAa,GAAG;AACxB,YAAY,OAAO,IAAI;AACvB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;AAC7C,YAAY;AACZ,gBAAgB,OAAO,CAAC,8BAA8B;AACtD,gBAAgB,IAAI,CAAC,QAAQ;AAC7B,gBAAgB,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS;AAC3C,cAAc;AACd,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;AAClE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;AACvD,YAAY;AACZ,gBAAgB,OAAO,CAAC,8BAA8B;AACtD,gBAAgB,IAAI,CAAC,QAAQ;AAC7B,gBAAgB,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS;AAC3C,cAAc;AACd,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;AAClE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;AACpD,YAAY,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE;AAC5C,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY;AACZ,gBAAgB,OAAO,CAAC,8BAA8B;AACtD,gBAAgB,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;AACzD,gBAAgB,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;AAChD,cAAc;AACd,gBAAgB,OAAO,IAAI;AAC3B,aAAa;AACb,YAAY,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;AAClE,SAAS;AACT,QAAQ,gBAAgB,GAAG;AAC3B,YAAY,OAAO,IAAI;AACvB,SAAS;AACT,QAAQ,eAAe,GAAG;AAC1B,YAAY,OAAO,IAAI;AACvB,SAAS;AACT,KAAK,CAAC;AACN,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAG,EAAE,EAAE;AAC9D,IAAI,MAAM,EAAE,eAAe,GAAG,KAAK,EAAE,8BAA8B,GAAG,KAAK,EAAE;AAC7E,QAAQ,QAAO;AACf,IAAI,OAAO,OAAO,CAAC,MAAM;AACzB,QAAQ,IAAI;AACZ,QAAQ,EAAE,eAAe,EAAE,8BAA8B,EAAE;AAC3D,QAAQ,UAAU,CAAC,WAAW,IAAIC,sBAAI;AACtC,KAAK;AACL;;AC9OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE;AAChD,IAAI,MAAM,MAAM,2BAA2B,CAAC,IAAI,EAAE,OAAM;AACxD;AACA,IAAI,QAAQ,MAAM,CAAC,IAAI;AACvB,QAAQ,KAAK,gBAAgB,CAAC;AAC9B,QAAQ,KAAK,eAAe;AAC5B,YAAY,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;AAC/E,gBAAgB,OAAO,UAAU,CAAC,aAAa;AAC/C;AACA,oBAAoB,MAAM,CAAC,aAAa;AACxC;AACA;AACA,kFAAkF;AAClF,oCAAoC,MAAM;AAC1C,kCAAkC,cAAc;AAChD;AACA,yBAAyB;AACzB,wBAAwB,MAAM,CAAC,MAAM;AACrC,oBAAoB,mBAAmB;AACvC,iBAAiB;AACjB,aAAa;AACb,YAAY,OAAO,IAAI;AACvB;AACA,QAAQ,KAAK,kBAAkB;AAC/B,YAAY,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;AACtC,gBAAgB,OAAO,UAAU,CAAC,aAAa;AAC/C,oBAAoB,MAAM,CAAC,IAAI;AAC/B,oBAAoB,mBAAmB;AACvC,iBAAiB;AACjB,aAAa;AACb,YAAY,OAAO,IAAI;AACvB;AACA,QAAQ,KAAK,aAAa,CAAC;AAC3B,QAAQ,KAAK,gBAAgB;AAC7B,YAAY,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;AACtC,gBAAgB,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1D,aAAa;AACb,YAAY,OAAO,IAAI;AACvB;AACA,QAAQ,KAAK,kBAAkB;AAC/B,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;AACxC,gBAAgB,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1D,aAAa;AACb,YAAY,OAAO,IAAI;AACvB;AACA,QAAQ,KAAK,iBAAiB;AAC9B,YAAY,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI,EAAE;AAC9C,gBAAgB,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1D,aAAa;AACb,YAAY,OAAO,IAAI;AACvB;AACA,QAAQ,KAAK,eAAe;AAC5B,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;AACxC,gBAAgB,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1D,aAAa;AACb,YAAY,OAAO,IAAI;AACvB;AACA,QAAQ;AACR,YAAY,OAAO,IAAI;AACvB,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,eAAe;AAC/B,IAAI,WAAW;AACf,IAAI,gBAAgB;AACpB,IAAI,kBAAkB;AACtB,EAAE;AACF;AACA,IAAI,IAAI,KAAK;AACb;AACA,QAAQ,IAAI;AACZ;AACA,QAAQ,UAAU;AAClB,QAAQ,cAAc;AACtB,QAAQ,gBAAe;AACvB,IAAI,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;AACzC,QAAQ,KAAK,GAAG,WAAW,GAAG,EAAC;AAC/B,QAAQ,IAAI,4BAA4B,gBAAgB,EAAC;AACzD,QAAQ,UAAU,8BAA8B,kBAAkB,EAAC;AACnE,QAAQ,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE;AAC3B,YAAY,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC;AACxE,SAAS;AACT,KAAK,MAAM;AACX,QAAQ,KAAK,GAAG,EAAC;AACjB,QAAQ,IAAI,4BAA4B,WAAW,EAAC;AACpD,QAAQ,UAAU,8BAA8B,gBAAgB,EAAC;AACjE,KAAK;AACL;AACA,IAAI;AACJ,QAAQ,IAAI,IAAI,IAAI;AACpB;AACA,QAAQ,IAAI,CAAC,MAAM,IAAI,IAAI;AAC3B;AACA,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AAC1E,MAAM;AACN,QAAQ,OAAO,KAAK;AACpB,KAAK;AACL;AACA,IAAI,cAAc,GAAG,eAAe,GAAG,KAAI;AAC3C,IAAI,GAAG;AACP,QAAQ,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,cAAc,EAAC;AAClE,QAAQ,eAAe,GAAG,UAAU,CAAC,aAAa,CAAC,eAAe,EAAC;AACnE,KAAK;AACL,QAAQ,cAAc,IAAI,IAAI;AAC9B,QAAQ,eAAe,IAAI,IAAI;AAC/B,QAAQ,mBAAmB,CAAC,cAAc,CAAC;AAC3C,QAAQ,mBAAmB,CAAC,eAAe,CAAC;AAC5C;AACA,QAAQ,cAAc,KAAK,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC;AACjE,QAAQ,EAAE,KAAK,GAAG,CAAC;AACnB,KAAK;AACL;AACA,IAAI,OAAO,KAAK,KAAK,CAAC;AACtB;;ACrJA;AACA;AACA;AACA;AACA;AACA,MAAM,WAAW,GAAG,6BAA4B;AAChD;AACA;AACA,MAAM,QAAQ,GAAG,IAAI,OAAO,GAAE;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE;AAC/B,IAAI,IAAI,OAAO,GAAG,MAAK;AACvB,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE;AACvE,QAAQ,OAAO,GAAG,CAAC,QAAO;AAC1B,KAAK;AACL,IAAI,OAAO,OAAO;AAClB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE;AAC7C,IAAI,MAAM,MAAM,GAAG,GAAE;AACrB,IAAI,IAAI,KAAK,GAAG,EAAC;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE;AAClC,QAAQ,QAAQ,GAAG;AACnB,YAAY,KAAK,IAAI;AACrB,gBAAgB,OAAO,GAAG;AAC1B,YAAY,KAAK,IAAI;AACrB,gBAAgB,OAAO,KAAK,CAAC,CAAC,CAAC;AAC/B,YAAY,KAAK,IAAI;AACrB,gBAAgB,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;AAChD,YAAY,KAAK,IAAI;AACrB,gBAAgB,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/D,YAAY,SAAS;AACrB,gBAAgB,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAC;AACtC,gBAAgB,IAAI,CAAC,IAAI,KAAK,EAAE;AAChC,oBAAoB,OAAO,KAAK,qBAAqB,CAAC,EAAE;AACxD,iBAAiB;AACjB,gBAAgB,OAAO,GAAG;AAC1B,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA,IAAI,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC9C,QAAQ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAC;AAClD,QAAQ,MAAM,CAAC,IAAI;AACnB,YAAY,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC3E,UAAS;AACT,QAAQ,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAM;AAC7C,KAAK;AACL,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAC;AACjC;AACA,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1B,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;AACzC,IAAI,MAAM,MAAM,GAAG,GAAE;AACrB,IAAI,IAAI,KAAK,GAAG,EAAC;AACjB;AACA,IAAI,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC9C,QAAQ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAC;AAClD,QAAQ,MAAM,CAAC,IAAI;AACnB,YAAY,MAAM;AAClB,gBAAgB,OAAO;AACvB,oBAAoB;AACpB,iDAAiD,KAAK;AACtD,qBAAqB;AACrB,oBAAoB,KAAK,CAAC,KAAK;AAC/B,oBAAoB,KAAK,CAAC,KAAK;AAC/B,iBAAiB;AACjB,aAAa;AACb,UAAS;AACT,QAAQ,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAM;AAC7C,KAAK;AACL,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAC;AACjC;AACA,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1B,CAAC;AACD;AACA;AACA;AACA;AACO,MAAM,cAAc,CAAC;AAC5B;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE;AACvC,QAAQ,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,QAAO;AAC3C,QAAQ,IAAI,EAAE,OAAO,YAAY,MAAM,CAAC,EAAE;AAC1C,YAAY,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC;AACzE,SAAS;AACT,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC1C,YAAY,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC;AAClE,SAAS;AACT;AACA,QAAQ,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE;AAC3B,YAAY,OAAO,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC;AAC9D,YAAY,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;AACrC,SAAS,EAAC;AACV,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AAClB,QAAQ,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;AAClC,6DAA6D,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAC;AAChF,QAAQ,IAAI,KAAK,GAAG,KAAI;AACxB,QAAQ,IAAI,SAAS,GAAG,EAAC;AACzB;AACA,QAAQ,OAAO,CAAC,SAAS,GAAG,EAAC;AAC7B,QAAQ,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;AACpD,YAAY,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;AACzD,gBAAgB,SAAS,GAAG,OAAO,CAAC,UAAS;AAC7C,gBAAgB,MAAM,MAAK;AAC3B,gBAAgB,OAAO,CAAC,SAAS,GAAG,UAAS;AAC7C,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,GAAG,EAAE;AACd,QAAQ,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAC;AACpC,QAAQ,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,GAAE;AAC7B,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI;AACxB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE;AACpC,QAAQ,OAAO,OAAO,QAAQ,KAAK,UAAU;AAC7C,cAAc,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;AACnD,cAAc,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC3D,KAAK;AACL;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,WAAW,GAAG,uDAAsD;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW,CAAC,IAAI,EAAE;AAC3B,IAAI;AACJ,QAAQ,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,qFAAqF;AACrF,YAAY,IAAI;AAChB,UAAU,MAAM,IAAI,IAAI;AACxB,KAAK;AACL,CAAC;AACD,MAAM,GAAG;AACT;AACA,QAAQ,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;AACjD,MAAK;AACL;AACY,MAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAC;AACtB,MAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAC;AACtB,MAAC,SAAS,GAAG,MAAM,CAAC,WAAW,EAAC;AAChC,MAAC,GAAG,GAAG,MAAM,CAAC,KAAK,EAAC;AAChC;AACA,MAAM,WAAW,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,EAAE,GAAE;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,gBAAgB,CAAC,QAAQ,EAAE;AACpC,IAAI;AACJ,QAAQ,QAAQ,IAAI,IAAI;AACxB,QAAQ,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;AAClC,QAAQ,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AACpD,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,IAAI,EAAE;AAC7B,IAAI,MAAM,MAAM,+BAA+B,CAAC,IAAI,EAAE,OAAM;AAC5D;AACA,IAAI,IAAI,MAAM,EAAE;AAChB,QAAQ,QAAQ,MAAM,CAAC,IAAI;AAC3B,YAAY,KAAK,uBAAuB;AACxC,gBAAgB,OAAO,MAAM,CAAC,UAAU,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI;AAC9E,YAAY,KAAK,mBAAmB;AACpC,gBAAgB,OAAO,IAAI;AAC3B,YAAY,KAAK,oBAAoB;AACrC,gBAAgB;AAChB,oBAAoB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;AAC9E,iBAAiB;AACjB,YAAY,KAAK,iBAAiB;AAClC,gBAAgB,OAAO,IAAI;AAC3B,YAAY,KAAK,gBAAgB,CAAC;AAClC,YAAY,KAAK,uBAAuB,CAAC;AACzC,YAAY,KAAK,iBAAiB,CAAC;AACnC,YAAY,KAAK,qBAAqB,CAAC;AACvC,YAAY,KAAK,2BAA2B;AAC5C,gBAAgB,OAAO,IAAI;AAC3B;AACA,YAAY;AACZ,gBAAgB,OAAO,KAAK;AAC5B,SAAS;AACT,KAAK;AACL,IAAI,OAAO,KAAK;AAChB,CAAC;AACD;AACA;AACA;AACA;AACO,MAAM,gBAAgB,CAAC;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,WAAW,EAAE,OAAO,GAAG,EAAE,EAAE;AAC3C,QAAQ,MAAM;AACd,YAAY,IAAI,GAAG,QAAQ;AAC3B,YAAY,iBAAiB,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC;AAC1E,SAAS,GAAG,QAAO;AACnB;AACA,QAAQ,IAAI,CAAC,aAAa,GAAG,GAAE;AAC/B;AACA,QAAQ,IAAI,CAAC,WAAW,GAAG,YAAW;AACtC;AACA,QAAQ,IAAI,CAAC,IAAI,GAAG,KAAI;AACxB;AACA,QAAQ,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAC;AAC3D,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE;AACvC,QAAQ,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACjD,YAAY,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;AAC9C,YAAY,MAAM,IAAI,GAAG,CAAC,GAAG,EAAC;AAC9B,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAC;AAC1D;AACA,YAAY,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE;AAC5C,gBAAgB,QAAQ;AACxB,aAAa;AACb;AACA,YAAY,OAAO,IAAI,CAAC,0BAA0B;AAClD,yCAAyC,QAAQ;AACjD,gBAAgB,IAAI;AACpB,gBAAgB,YAAY;AAC5B,gBAAgB,IAAI;AACpB,cAAa;AACb,SAAS;AACT;AACA,QAAQ,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAClD;AACA,YAAY,MAAM,IAAI,GAAG,GAAE;AAC3B,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAC;AAC1D;AACA,YAAY,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE;AAC5C,gBAAgB,QAAQ;AACxB,aAAa;AACb;AACA,YAAY,OAAO,IAAI,CAAC,0BAA0B;AAClD,yCAAyC,QAAQ;AACjD,gBAAgB,IAAI;AACpB,gBAAgB,QAAQ;AACxB,gBAAgB,KAAK;AACrB,cAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE;AACpC,QAAQ,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE;AAC1E,YAAY,MAAM,GAAG,GAAG,mBAAmB;AAC3C,8CAA8C,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;AACjE,cAAa;AACb,YAAY,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;AACpD,gBAAgB,QAAQ;AACxB,aAAa;AACb;AACA,YAAY,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;AAC9C,YAAY,MAAM,IAAI,GAAG,CAAC,GAAG,EAAC;AAC9B;AACA,YAAY,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;AACpC,gBAAgB,MAAM;AACtB,oBAAoB,IAAI;AACxB,oBAAoB,IAAI;AACxB,oBAAoB,IAAI,EAAE,IAAI;AAC9B,oBAAoB,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;AAC5C,kBAAiB;AACjB,aAAa;AACb,YAAY,OAAO,IAAI,CAAC,0BAA0B;AAClD,+CAA+C,IAAI;AACnD,gBAAgB,IAAI;AACpB,gBAAgB,YAAY;AAC5B,cAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE;AACpC,QAAQ,MAAM,WAAW,2BAA2B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAC;AAC3E;AACA,QAAQ,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE;AAC7C,YAAY,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;AACpC,gBAAgB,QAAQ;AACxB,aAAa;AACb,YAAY,MAAM,QAAQ,0BAA0B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAC;AACtE;AACA,YAAY,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE;AAC1C,gBAAgB,QAAQ;AACxB,aAAa;AACb,YAAY,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAC;AACnD,YAAY,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAC;AACnC;AACA,YAAY,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;AACpC,gBAAgB,MAAM;AACtB;AACA,oBAAoB,IAAI,2BAA2B,IAAI,CAAC;AACxD,oBAAoB,IAAI;AACxB,oBAAoB,IAAI,EAAE,IAAI;AAC9B,oBAAoB,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;AAC5C,kBAAiB;AACjB,aAAa;AACb;AACA,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,sBAAsB,EAAE;AACtD,gBAAgB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;AAC7D,oBAAoB,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,EAAC;AAC5D,oBAAoB,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE;AAC9C,wBAAwB,MAAM;AAC9B;AACA,4BAA4B,IAAI,2BAA2B,IAAI,CAAC;AAChE,4BAA4B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAClD,4BAA4B,IAAI,EAAE,IAAI;AACtC,4BAA4B,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;AACtD,0BAAyB;AACzB,qBAAqB;AACrB,iBAAiB;AACjB,aAAa,MAAM;AACnB,gBAAgB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;AACzD,oBAAoB,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,EAAC;AACtD,oBAAoB,MAAM,EAAE,GAAG,IAAI,CAAC,wBAAwB;AAC5D,wBAAwB,SAAS;AACjC,wBAAwB,IAAI;AAC5B,wBAAwB,GAAG;AAC3B,8BAA8B,YAAY;AAC1C,8BAA8B,IAAI,CAAC,IAAI,KAAK,QAAQ;AACpD,8BAA8B,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE;AACxE,8BAA8B,EAAE,OAAO,EAAE,YAAY,EAAE;AACvD,sBAAqB;AACrB;AACA,oBAAoB,IAAI,GAAG,EAAE;AAC7B,wBAAwB,OAAO,GAAE;AACjC,qBAAqB,MAAM;AAC3B,wBAAwB,KAAK,MAAM,MAAM,IAAI,EAAE,EAAE;AACjD,4BAA4B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAC;AAC3E,4BAA4B;AAC5B,gCAAgC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;AACvD,gCAAgC,MAAM,CAAC,IAAI,KAAK,IAAI;AACpD,8BAA8B;AAC9B,gCAAgC,MAAM,OAAM;AAC5C,6BAA6B;AAC7B,yBAAyB;AACzB,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE;AAC/C,QAAQ,OAAO,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAC;AAClE,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE;AACxE,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACnD,YAAY,MAAM;AAClB,SAAS;AACT,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAC;AACzC,QAAQ,IAAI;AACZ,YAAY,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE;AACzD,gBAAgB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;AACzC,oBAAoB,QAAQ;AAC5B,iBAAiB;AACjB,gBAAgB,MAAM,IAAI;AAC1B,oBAAoB,SAAS,CAAC,UAAU;AACxC,kBAAiB;AACjB;AACA,gBAAgB,IAAI,YAAY,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;AACpD,oBAAoB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAE;AAC1E,iBAAiB;AACjB,gBAAgB,OAAO,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAC;AAC5E,aAAa;AACb,SAAS,SAAS;AAClB,YAAY,IAAI,CAAC,aAAa,CAAC,GAAG,GAAE;AACpC,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC1D,QAAQ,IAAI,IAAI,GAAG,SAAQ;AAC3B,QAAQ,OAAO,aAAa,CAAC,IAAI,CAAC,EAAE;AACpC,YAAY,IAAI,GAAG,IAAI,CAAC,OAAM;AAC9B,SAAS;AACT;AACA,QAAQ,MAAM,MAAM,2BAA2B,CAAC,IAAI,EAAE,OAAM;AAC5D,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE;AAChD,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;AACxC,gBAAgB,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,EAAC;AACnD,gBAAgB,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;AACxD,oBAAoB,MAAM;AAC1B,iBAAiB;AACjB;AACA,gBAAgB,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAC;AACvC,gBAAgB,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;AAClD,gBAAgB,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;AACxC,oBAAoB,MAAM;AAC1B,wBAAwB,IAAI,EAAE,MAAM;AACpC,wBAAwB,IAAI;AAC5B,wBAAwB,IAAI,EAAE,IAAI;AAClC,wBAAwB,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;AAChD,sBAAqB;AACrB,iBAAiB;AACjB,gBAAgB,OAAO,IAAI,CAAC,0BAA0B;AACtD,oBAAoB,MAAM;AAC1B,oBAAoB,IAAI;AACxB,oBAAoB,YAAY;AAChC,kBAAiB;AACjB,aAAa;AACb,YAAY,MAAM;AAClB,SAAS;AACT,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE;AAC9C,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC1D,gBAAgB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAE;AAC9E,aAAa;AACb,YAAY,MAAM;AAClB,SAAS;AACT,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE;AAC7C,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE;AAC/D,gBAAgB,MAAM;AACtB,oBAAoB,IAAI,EAAE,MAAM;AAChC,oBAAoB,IAAI;AACxB,oBAAoB,IAAI,EAAE,SAAS;AACnC,oBAAoB,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC;AAC7C,kBAAiB;AACjB,aAAa;AACb,YAAY,MAAM;AAClB,SAAS;AACT,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB,EAAE;AACpD,YAAY,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;AACvC,gBAAgB,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAC;AAC9E,gBAAgB,OAAO,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAC;AAC9E,aAAa;AACb,YAAY,MAAM;AAClB,SAAS;AACT,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,mBAAmB,EAAE;AACjD,YAAY,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;AACvC,gBAAgB,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAC;AAC9E,aAAa;AACb,YAAY,MAAM;AAClB,SAAS;AACT,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,oBAAoB,EAAE;AAClD,YAAY,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;AACtC,gBAAgB,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAC;AAC5E,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE;AACxD,QAAQ,IAAI,WAAW,CAAC,IAAI,KAAK,YAAY,EAAE;AAC/C,YAAY,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAC;AACxE,YAAY,IAAI,QAAQ,IAAI,IAAI,EAAE;AAClC,gBAAgB,OAAO,IAAI,CAAC,0BAA0B;AACtD,oBAAoB,QAAQ;AAC5B,oBAAoB,IAAI;AACxB,oBAAoB,QAAQ;AAC5B,oBAAoB,KAAK;AACzB,kBAAiB;AACjB,aAAa;AACb,YAAY,MAAM;AAClB,SAAS;AACT,QAAQ,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,EAAE;AAClD,YAAY,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,UAAU,EAAE;AAC3D,gBAAgB,MAAM,GAAG,GAAG,eAAe;AAC3C,uDAAuD,QAAQ;AAC/D,kBAAiB;AACjB;AACA,gBAAgB,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;AACxD,oBAAoB,QAAQ;AAC5B,iBAAiB;AACjB;AACA,gBAAgB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAC;AACjD,gBAAgB,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;AAClD,gBAAgB,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;AACxC,oBAAoB,MAAM;AAC1B,wBAAwB,IAAI,2BAA2B,QAAQ,CAAC;AAChE,wBAAwB,IAAI,EAAE,QAAQ;AACtC,wBAAwB,IAAI,EAAE,IAAI;AAClC,wBAAwB,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;AAChD,sBAAqB;AACrB,iBAAiB;AACjB,gBAAgB,OAAO,IAAI,CAAC,qBAAqB;AACjD,sDAAsD,CAAC,QAAQ,EAAE,KAAK;AACtE,oBAAoB,QAAQ;AAC5B,oBAAoB,YAAY;AAChC,kBAAiB;AACjB,aAAa;AACb,YAAY,MAAM;AAClB,SAAS;AACT,QAAQ,IAAI,WAAW,CAAC,IAAI,KAAK,mBAAmB,EAAE;AACtD,YAAY,OAAO,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAC;AAC/E,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,CAAC,wBAAwB,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC7D,QAAQ,MAAM,IAAI,GAAG,aAAa,CAAC,KAAI;AACvC;AACA,QAAQ,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,wBAAwB,EAAE;AAC7E,YAAY,MAAM,GAAG;AACrB,gBAAgB,IAAI,KAAK,wBAAwB;AACjD,sBAAsB,SAAS;AAC/B,sBAAsB,aAAa,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;AAClE,sBAAsB,aAAa,CAAC,QAAQ,CAAC,IAAI;AACjD,sBAAsB,aAAa,CAAC,QAAQ,CAAC,MAAK;AAClD,YAAY,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;AACrC,gBAAgB,MAAM;AACtB,aAAa;AACb;AACA,YAAY,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAC;AACnC,YAAY,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;AAC9C,YAAY,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;AACpC,gBAAgB,MAAM;AACtB,oBAAoB,IAAI,2BAA2B,aAAa,CAAC;AACjE,oBAAoB,IAAI;AACxB,oBAAoB,IAAI,EAAE,IAAI;AAC9B,oBAAoB,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;AAC5C,kBAAiB;AACjB,aAAa;AACb,YAAY,OAAO,IAAI,CAAC,0BAA0B;AAClD;AACA,oBAAoB,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC;AACvE;AACA,gBAAgB,IAAI;AACpB,gBAAgB,YAAY;AAC5B,gBAAgB,KAAK;AACrB,cAAa;AACb;AACA,YAAY,MAAM;AAClB,SAAS;AACT;AACA,QAAQ,IAAI,IAAI,KAAK,0BAA0B,EAAE;AACjD,YAAY,OAAO,IAAI,CAAC,0BAA0B;AAClD;AACA,oBAAoB,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC;AACvE;AACA,gBAAgB,IAAI;AACpB,gBAAgB,QAAQ;AACxB,gBAAgB,KAAK;AACrB,cAAa;AACb,YAAY,MAAM;AAClB,SAAS;AACT;AACA,QAAQ,IAAI,IAAI,KAAK,iBAAiB,EAAE;AACxC,YAAY,MAAM,GAAG;AACrB,gBAAgB,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY;AACzD,sBAAsB,aAAa,CAAC,KAAK,CAAC,IAAI;AAC9C,sBAAsB,aAAa,CAAC,KAAK,CAAC,MAAK;AAC/C,YAAY,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;AACrC,gBAAgB,MAAM;AACtB,aAAa;AACb;AACA,YAAY,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAC;AACnC,YAAY,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;AAC9C,YAAY,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;AACpC,gBAAgB,MAAM;AACtB,oBAAoB,IAAI,2BAA2B,aAAa,CAAC;AACjE,oBAAoB,IAAI;AACxB,oBAAoB,IAAI,EAAE,IAAI;AAC9B,oBAAoB,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;AAC5C,kBAAiB;AACjB,aAAa;AACb,SAAS;AACT,KAAK;AACL,CAAC;AACD;AACA,gBAAgB,CAAC,IAAI,GAAG,KAAI;AAC5B,gBAAgB,CAAC,IAAI,GAAG,KAAI;AAC5B,gBAAgB,CAAC,SAAS,GAAG,UAAS;AACtC,gBAAgB,CAAC,GAAG,GAAG,IAAG;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE;AACpC,IAAI,OAAO,EAAE,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,SAAS,CAAC;AAC/C;;ACljBA;AAiEA;AACA,YAAe;AACf,IAAI,IAAI;AACR,IAAI,SAAS;AACb,IAAI,GAAG;AACP,IAAI,YAAY;AAChB,IAAI,uBAAuB;AAC3B,IAAI,uBAAuB;AAC3B,IAAI,iBAAiB;AACrB,IAAI,eAAe;AACnB,IAAI,cAAc;AAClB,IAAI,mBAAmB;AACvB,IAAI,aAAa;AACjB,IAAI,YAAY;AAChB,IAAI,mBAAmB;AACvB,IAAI,qBAAqB;AACzB,IAAI,mBAAmB;AACvB,IAAI,YAAY;AAChB,IAAI,YAAY;AAChB,IAAI,cAAc;AAClB,IAAI,eAAe;AACnB,IAAI,sBAAsB;AAC1B,IAAI,wBAAwB;AAC5B,IAAI,sBAAsB;AAC1B,IAAI,eAAe;AACnB,IAAI,eAAe;AACnB,IAAI,iBAAiB;AACrB,IAAI,sBAAsB;AAC1B,IAAI,wBAAwB;AAC5B,IAAI,sBAAsB;AAC1B,IAAI,mBAAmB;AACvB,IAAI,mBAAmB;AACvB,IAAI,qBAAqB;AACzB,IAAI,mBAAmB;AACvB,IAAI,eAAe;AACnB,IAAI,gBAAgB;AACpB,IAAI,cAAc;AAClB,IAAI,IAAI;AACR,IAAI,gBAAgB;AACpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
\ No newline at end of file
diff --git a/slider/node_modules/@eslint-community/eslint-utils/index.mjs b/slider/node_modules/@eslint-community/eslint-utils/index.mjs
new file mode 100644
index 0000000..c062ca7
--- /dev/null
+++ b/slider/node_modules/@eslint-community/eslint-utils/index.mjs
@@ -0,0 +1,2566 @@
+import { getKeys, KEYS } from 'eslint-visitor-keys';
+
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("estree").Node} Node */
+
+/**
+ * Get the innermost scope which contains a given location.
+ * @param {Scope} initialScope The initial scope to search.
+ * @param {Node} node The location to search.
+ * @returns {Scope} The innermost scope.
+ */
+function getInnermostScope(initialScope, node) {
+ const location = /** @type {[number, number]} */ (node.range)[0];
+
+ let scope = initialScope;
+ let found = false;
+ do {
+ found = false;
+ for (const childScope of scope.childScopes) {
+ const range = /** @type {[number, number]} */ (
+ childScope.block.range
+ );
+
+ if (range[0] <= location && location < range[1]) {
+ scope = childScope;
+ found = true;
+ break
+ }
+ }
+ } while (found)
+
+ return scope
+}
+
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("eslint").Scope.Variable} Variable */
+/** @typedef {import("estree").Identifier} Identifier */
+
+/**
+ * Find the variable of a given name.
+ * @param {Scope} initialScope The scope to start finding.
+ * @param {string|Identifier} nameOrNode The variable name to find. If this is a Node object then it should be an Identifier node.
+ * @returns {Variable|null} The found variable or null.
+ */
+function findVariable(initialScope, nameOrNode) {
+ let name = "";
+ /** @type {Scope|null} */
+ let scope = initialScope;
+
+ if (typeof nameOrNode === "string") {
+ name = nameOrNode;
+ } else {
+ name = nameOrNode.name;
+ scope = getInnermostScope(scope, nameOrNode);
+ }
+
+ while (scope != null) {
+ const variable = scope.set.get(name);
+ if (variable != null) {
+ return variable
+ }
+ scope = scope.upper;
+ }
+
+ return null
+}
+
+/** @typedef {import("eslint").AST.Token} Token */
+/** @typedef {import("estree").Comment} Comment */
+/** @typedef {import("./types.mjs").ArrowToken} ArrowToken */
+/** @typedef {import("./types.mjs").CommaToken} CommaToken */
+/** @typedef {import("./types.mjs").SemicolonToken} SemicolonToken */
+/** @typedef {import("./types.mjs").ColonToken} ColonToken */
+/** @typedef {import("./types.mjs").OpeningParenToken} OpeningParenToken */
+/** @typedef {import("./types.mjs").ClosingParenToken} ClosingParenToken */
+/** @typedef {import("./types.mjs").OpeningBracketToken} OpeningBracketToken */
+/** @typedef {import("./types.mjs").ClosingBracketToken} ClosingBracketToken */
+/** @typedef {import("./types.mjs").OpeningBraceToken} OpeningBraceToken */
+/** @typedef {import("./types.mjs").ClosingBraceToken} ClosingBraceToken */
+/**
+ * @template {string} Value
+ * @typedef {import("./types.mjs").PunctuatorToken} PunctuatorToken
+ */
+
+/** @typedef {Comment | Token} CommentOrToken */
+
+/**
+ * Creates the negate function of the given function.
+ * @param {function(CommentOrToken):boolean} f - The function to negate.
+ * @returns {function(CommentOrToken):boolean} Negated function.
+ */
+function negate(f) {
+ return (token) => !f(token)
+}
+
+/**
+ * Checks if the given token is a PunctuatorToken with the given value
+ * @template {string} Value
+ * @param {CommentOrToken} token - The token to check.
+ * @param {Value} value - The value to check.
+ * @returns {token is PunctuatorToken} `true` if the token is a PunctuatorToken with the given value.
+ */
+function isPunctuatorTokenWithValue(token, value) {
+ return token.type === "Punctuator" && token.value === value
+}
+
+/**
+ * Checks if the given token is an arrow token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is ArrowToken} `true` if the token is an arrow token.
+ */
+function isArrowToken(token) {
+ return isPunctuatorTokenWithValue(token, "=>")
+}
+
+/**
+ * Checks if the given token is a comma token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is CommaToken} `true` if the token is a comma token.
+ */
+function isCommaToken(token) {
+ return isPunctuatorTokenWithValue(token, ",")
+}
+
+/**
+ * Checks if the given token is a semicolon token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is SemicolonToken} `true` if the token is a semicolon token.
+ */
+function isSemicolonToken(token) {
+ return isPunctuatorTokenWithValue(token, ";")
+}
+
+/**
+ * Checks if the given token is a colon token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is ColonToken} `true` if the token is a colon token.
+ */
+function isColonToken(token) {
+ return isPunctuatorTokenWithValue(token, ":")
+}
+
+/**
+ * Checks if the given token is an opening parenthesis token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is OpeningParenToken} `true` if the token is an opening parenthesis token.
+ */
+function isOpeningParenToken(token) {
+ return isPunctuatorTokenWithValue(token, "(")
+}
+
+/**
+ * Checks if the given token is a closing parenthesis token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is ClosingParenToken} `true` if the token is a closing parenthesis token.
+ */
+function isClosingParenToken(token) {
+ return isPunctuatorTokenWithValue(token, ")")
+}
+
+/**
+ * Checks if the given token is an opening square bracket token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is OpeningBracketToken} `true` if the token is an opening square bracket token.
+ */
+function isOpeningBracketToken(token) {
+ return isPunctuatorTokenWithValue(token, "[")
+}
+
+/**
+ * Checks if the given token is a closing square bracket token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is ClosingBracketToken} `true` if the token is a closing square bracket token.
+ */
+function isClosingBracketToken(token) {
+ return isPunctuatorTokenWithValue(token, "]")
+}
+
+/**
+ * Checks if the given token is an opening brace token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is OpeningBraceToken} `true` if the token is an opening brace token.
+ */
+function isOpeningBraceToken(token) {
+ return isPunctuatorTokenWithValue(token, "{")
+}
+
+/**
+ * Checks if the given token is a closing brace token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is ClosingBraceToken} `true` if the token is a closing brace token.
+ */
+function isClosingBraceToken(token) {
+ return isPunctuatorTokenWithValue(token, "}")
+}
+
+/**
+ * Checks if the given token is a comment token or not.
+ * @param {CommentOrToken} token - The token to check.
+ * @returns {token is Comment} `true` if the token is a comment token.
+ */
+function isCommentToken(token) {
+ return ["Block", "Line", "Shebang"].includes(token.type)
+}
+
+const isNotArrowToken = negate(isArrowToken);
+const isNotCommaToken = negate(isCommaToken);
+const isNotSemicolonToken = negate(isSemicolonToken);
+const isNotColonToken = negate(isColonToken);
+const isNotOpeningParenToken = negate(isOpeningParenToken);
+const isNotClosingParenToken = negate(isClosingParenToken);
+const isNotOpeningBracketToken = negate(isOpeningBracketToken);
+const isNotClosingBracketToken = negate(isClosingBracketToken);
+const isNotOpeningBraceToken = negate(isOpeningBraceToken);
+const isNotClosingBraceToken = negate(isClosingBraceToken);
+const isNotCommentToken = negate(isCommentToken);
+
+/** @typedef {import("eslint").Rule.Node} RuleNode */
+/** @typedef {import("eslint").SourceCode} SourceCode */
+/** @typedef {import("eslint").AST.Token} Token */
+/** @typedef {import("estree").Function} FunctionNode */
+/** @typedef {import("estree").FunctionDeclaration} FunctionDeclaration */
+/** @typedef {import("estree").FunctionExpression} FunctionExpression */
+/** @typedef {import("estree").SourceLocation} SourceLocation */
+/** @typedef {import("estree").Position} Position */
+
+/**
+ * Get the `(` token of the given function node.
+ * @param {FunctionExpression | FunctionDeclaration} node - The function node to get.
+ * @param {SourceCode} sourceCode - The source code object to get tokens.
+ * @returns {Token} `(` token.
+ */
+function getOpeningParenOfParams(node, sourceCode) {
+ return node.id
+ ? /** @type {Token} */ (
+ sourceCode.getTokenAfter(node.id, isOpeningParenToken)
+ )
+ : /** @type {Token} */ (
+ sourceCode.getFirstToken(node, isOpeningParenToken)
+ )
+}
+
+/**
+ * Get the location of the given function node for reporting.
+ * @param {FunctionNode} node - The function node to get.
+ * @param {SourceCode} sourceCode - The source code object to get tokens.
+ * @returns {SourceLocation|null} The location of the function node for reporting.
+ */
+function getFunctionHeadLocation(node, sourceCode) {
+ const parent = /** @type {RuleNode} */ (node).parent;
+
+ /** @type {Position|null} */
+ let start = null;
+ /** @type {Position|null} */
+ let end = null;
+
+ if (node.type === "ArrowFunctionExpression") {
+ const arrowToken = /** @type {Token} */ (
+ sourceCode.getTokenBefore(node.body, isArrowToken)
+ );
+
+ start = arrowToken.loc.start;
+ end = arrowToken.loc.end;
+ } else if (
+ parent.type === "Property" ||
+ parent.type === "MethodDefinition" ||
+ parent.type === "PropertyDefinition"
+ ) {
+ start = /** @type {SourceLocation} */ (parent.loc).start;
+ end = getOpeningParenOfParams(node, sourceCode).loc.start;
+ } else {
+ start = /** @type {SourceLocation} */ (node.loc).start;
+ end = getOpeningParenOfParams(node, sourceCode).loc.start;
+ }
+
+ return {
+ start: { ...start },
+ end: { ...end },
+ }
+}
+
+/* globals globalThis, global, self, window */
+/** @typedef {import("./types.mjs").StaticValue} StaticValue */
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("eslint").Scope.Variable} Variable */
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("@typescript-eslint/types").TSESTree.Node} TSESTreeNode */
+/** @typedef {import("@typescript-eslint/types").TSESTree.AST_NODE_TYPES} TSESTreeNodeTypes */
+/** @typedef {import("@typescript-eslint/types").TSESTree.MemberExpression} MemberExpression */
+/** @typedef {import("@typescript-eslint/types").TSESTree.Property} Property */
+/** @typedef {import("@typescript-eslint/types").TSESTree.RegExpLiteral} RegExpLiteral */
+/** @typedef {import("@typescript-eslint/types").TSESTree.BigIntLiteral} BigIntLiteral */
+/** @typedef {import("@typescript-eslint/types").TSESTree.Literal} Literal */
+
+const globalObject =
+ typeof globalThis !== "undefined"
+ ? globalThis
+ : // @ts-ignore
+ typeof self !== "undefined"
+ ? // @ts-ignore
+ self
+ : // @ts-ignore
+ typeof window !== "undefined"
+ ? // @ts-ignore
+ window
+ : typeof global !== "undefined"
+ ? global
+ : {};
+
+const builtinNames = Object.freeze(
+ new Set([
+ "Array",
+ "ArrayBuffer",
+ "BigInt",
+ "BigInt64Array",
+ "BigUint64Array",
+ "Boolean",
+ "DataView",
+ "Date",
+ "decodeURI",
+ "decodeURIComponent",
+ "encodeURI",
+ "encodeURIComponent",
+ "escape",
+ "Float32Array",
+ "Float64Array",
+ "Function",
+ "Infinity",
+ "Int16Array",
+ "Int32Array",
+ "Int8Array",
+ "isFinite",
+ "isNaN",
+ "isPrototypeOf",
+ "JSON",
+ "Map",
+ "Math",
+ "NaN",
+ "Number",
+ "Object",
+ "parseFloat",
+ "parseInt",
+ "Promise",
+ "Proxy",
+ "Reflect",
+ "RegExp",
+ "Set",
+ "String",
+ "Symbol",
+ "Uint16Array",
+ "Uint32Array",
+ "Uint8Array",
+ "Uint8ClampedArray",
+ "undefined",
+ "unescape",
+ "WeakMap",
+ "WeakSet",
+ ]),
+);
+const callAllowed = new Set(
+ [
+ Array.isArray,
+ Array.of,
+ Array.prototype.at,
+ Array.prototype.concat,
+ Array.prototype.entries,
+ Array.prototype.every,
+ Array.prototype.filter,
+ Array.prototype.find,
+ Array.prototype.findIndex,
+ Array.prototype.flat,
+ Array.prototype.includes,
+ Array.prototype.indexOf,
+ Array.prototype.join,
+ Array.prototype.keys,
+ Array.prototype.lastIndexOf,
+ Array.prototype.slice,
+ Array.prototype.some,
+ Array.prototype.toString,
+ Array.prototype.values,
+ typeof BigInt === "function" ? BigInt : undefined,
+ Boolean,
+ Date,
+ Date.parse,
+ decodeURI,
+ decodeURIComponent,
+ encodeURI,
+ encodeURIComponent,
+ escape,
+ isFinite,
+ isNaN,
+ // @ts-ignore
+ isPrototypeOf,
+ Map,
+ Map.prototype.entries,
+ Map.prototype.get,
+ Map.prototype.has,
+ Map.prototype.keys,
+ Map.prototype.values,
+ .../** @type {(keyof typeof Math)[]} */ (
+ Object.getOwnPropertyNames(Math)
+ )
+ .filter((k) => k !== "random")
+ .map((k) => Math[k])
+ .filter((f) => typeof f === "function"),
+ Number,
+ Number.isFinite,
+ Number.isNaN,
+ Number.parseFloat,
+ Number.parseInt,
+ Number.prototype.toExponential,
+ Number.prototype.toFixed,
+ Number.prototype.toPrecision,
+ Number.prototype.toString,
+ Object,
+ Object.entries,
+ Object.is,
+ Object.isExtensible,
+ Object.isFrozen,
+ Object.isSealed,
+ Object.keys,
+ Object.values,
+ parseFloat,
+ parseInt,
+ RegExp,
+ Set,
+ Set.prototype.entries,
+ Set.prototype.has,
+ Set.prototype.keys,
+ Set.prototype.values,
+ String,
+ String.fromCharCode,
+ String.fromCodePoint,
+ String.raw,
+ String.prototype.at,
+ String.prototype.charAt,
+ String.prototype.charCodeAt,
+ String.prototype.codePointAt,
+ String.prototype.concat,
+ String.prototype.endsWith,
+ String.prototype.includes,
+ String.prototype.indexOf,
+ String.prototype.lastIndexOf,
+ String.prototype.normalize,
+ String.prototype.padEnd,
+ String.prototype.padStart,
+ String.prototype.slice,
+ String.prototype.startsWith,
+ String.prototype.substr,
+ String.prototype.substring,
+ String.prototype.toLowerCase,
+ String.prototype.toString,
+ String.prototype.toUpperCase,
+ String.prototype.trim,
+ String.prototype.trimEnd,
+ String.prototype.trimLeft,
+ String.prototype.trimRight,
+ String.prototype.trimStart,
+ Symbol.for,
+ Symbol.keyFor,
+ unescape,
+ ].filter((f) => typeof f === "function"),
+);
+const callPassThrough = new Set([
+ Object.freeze,
+ Object.preventExtensions,
+ Object.seal,
+]);
+
+/** @type {ReadonlyArray]>} */
+const getterAllowed = [
+ [Map, new Set(["size"])],
+ [
+ RegExp,
+ new Set([
+ "dotAll",
+ "flags",
+ "global",
+ "hasIndices",
+ "ignoreCase",
+ "multiline",
+ "source",
+ "sticky",
+ "unicode",
+ ]),
+ ],
+ [Set, new Set(["size"])],
+];
+
+/**
+ * Get the property descriptor.
+ * @param {object} object The object to get.
+ * @param {string|number|symbol} name The property name to get.
+ */
+function getPropertyDescriptor(object, name) {
+ let x = object;
+ while ((typeof x === "object" || typeof x === "function") && x !== null) {
+ const d = Object.getOwnPropertyDescriptor(x, name);
+ if (d) {
+ return d
+ }
+ x = Object.getPrototypeOf(x);
+ }
+ return null
+}
+
+/**
+ * Check if a property is getter or not.
+ * @param {object} object The object to check.
+ * @param {string|number|symbol} name The property name to check.
+ */
+function isGetter(object, name) {
+ const d = getPropertyDescriptor(object, name);
+ return d != null && d.get != null
+}
+
+/**
+ * Get the element values of a given node list.
+ * @param {(Node|TSESTreeNode|null)[]} nodeList The node list to get values.
+ * @param {Scope|undefined|null} initialScope The initial scope to find variables.
+ * @returns {any[]|null} The value list if all nodes are constant. Otherwise, null.
+ */
+function getElementValues(nodeList, initialScope) {
+ const valueList = [];
+
+ for (let i = 0; i < nodeList.length; ++i) {
+ const elementNode = nodeList[i];
+
+ if (elementNode == null) {
+ valueList.length = i + 1;
+ } else if (elementNode.type === "SpreadElement") {
+ const argument = getStaticValueR(elementNode.argument, initialScope);
+ if (argument == null) {
+ return null
+ }
+ valueList.push(.../** @type {Iterable} */ (argument.value));
+ } else {
+ const element = getStaticValueR(elementNode, initialScope);
+ if (element == null) {
+ return null
+ }
+ valueList.push(element.value);
+ }
+ }
+
+ return valueList
+}
+
+/**
+ * Checks if a variable is a built-in global.
+ * @param {Variable|null} variable The variable to check.
+ * @returns {variable is Variable & {defs:[]}}
+ */
+function isBuiltinGlobal(variable) {
+ return (
+ variable != null &&
+ variable.defs.length === 0 &&
+ builtinNames.has(variable.name) &&
+ variable.name in globalObject
+ )
+}
+
+/**
+ * Checks if a variable can be considered as a constant.
+ * @param {Variable} variable
+ * @returns {variable is Variable & {defs: [import("eslint").Scope.Definition & { type: "Variable" }]}} True if the variable can be considered as a constant.
+ */
+function canBeConsideredConst(variable) {
+ if (variable.defs.length !== 1) {
+ return false
+ }
+ const def = variable.defs[0];
+ return Boolean(
+ def.parent &&
+ def.type === "Variable" &&
+ (def.parent.kind === "const" || isEffectivelyConst(variable)),
+ )
+}
+
+/**
+ * Returns whether the given variable is never written to after initialization.
+ * @param {Variable} variable
+ * @returns {boolean}
+ */
+function isEffectivelyConst(variable) {
+ const refs = variable.references;
+
+ const inits = refs.filter((r) => r.init).length;
+ const reads = refs.filter((r) => r.isReadOnly()).length;
+ if (inits === 1 && reads + inits === refs.length) {
+ // there is only one init and all other references only read
+ return true
+ }
+ return false
+}
+
+/**
+ * Checks if a variable has mutation in its property.
+ * @param {Variable} variable The variable to check.
+ * @param {Scope|null} initialScope The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.
+ * @returns {boolean} True if the variable has mutation in its property.
+ */
+function hasMutationInProperty(variable, initialScope) {
+ for (const ref of variable.references) {
+ let node = /** @type {TSESTreeNode} */ (ref.identifier);
+ while (node && node.parent && node.parent.type === "MemberExpression") {
+ node = node.parent;
+ }
+ if (!node || !node.parent) {
+ continue
+ }
+ if (
+ (node.parent.type === "AssignmentExpression" &&
+ node.parent.left === node) ||
+ (node.parent.type === "UpdateExpression" &&
+ node.parent.argument === node)
+ ) {
+ // This is a mutation.
+ return true
+ }
+ if (
+ node.parent.type === "CallExpression" &&
+ node.parent.callee === node &&
+ node.type === "MemberExpression"
+ ) {
+ const methodName = getStaticPropertyNameValue(node, initialScope);
+ if (isNameOfMutationArrayMethod(methodName)) {
+ // This is a mutation.
+ return true
+ }
+ }
+ }
+ return false
+
+ /**
+ * Checks if a method name is one of the mutation array methods.
+ * @param {StaticValue|null} methodName The method name to check.
+ * @returns {boolean} True if the method name is a mutation array method.
+ */
+ function isNameOfMutationArrayMethod(methodName) {
+ if (methodName == null || methodName.value == null) {
+ return false
+ }
+ const name = methodName.value;
+ return (
+ name === "copyWithin" ||
+ name === "fill" ||
+ name === "pop" ||
+ name === "push" ||
+ name === "reverse" ||
+ name === "shift" ||
+ name === "sort" ||
+ name === "splice" ||
+ name === "unshift"
+ )
+ }
+}
+
+/**
+ * @template {TSESTreeNodeTypes} T
+ * @callback VisitorCallback
+ * @param {TSESTreeNode & { type: T }} node
+ * @param {Scope|undefined|null} initialScope
+ * @returns {StaticValue | null}
+ */
+/**
+ * @typedef { { [K in TSESTreeNodeTypes]?: VisitorCallback } } Operations
+ */
+/**
+ * @type {Operations}
+ */
+const operations = Object.freeze({
+ ArrayExpression(node, initialScope) {
+ const elements = getElementValues(node.elements, initialScope);
+ return elements != null ? { value: elements } : null
+ },
+
+ AssignmentExpression(node, initialScope) {
+ if (node.operator === "=") {
+ return getStaticValueR(node.right, initialScope)
+ }
+ return null
+ },
+
+ //eslint-disable-next-line complexity
+ BinaryExpression(node, initialScope) {
+ if (node.operator === "in" || node.operator === "instanceof") {
+ // Not supported.
+ return null
+ }
+
+ const left = getStaticValueR(node.left, initialScope);
+ const right = getStaticValueR(node.right, initialScope);
+ if (left != null && right != null) {
+ switch (node.operator) {
+ case "==":
+ return { value: left.value == right.value } //eslint-disable-line eqeqeq
+ case "!=":
+ return { value: left.value != right.value } //eslint-disable-line eqeqeq
+ case "===":
+ return { value: left.value === right.value }
+ case "!==":
+ return { value: left.value !== right.value }
+ case "<":
+ return {
+ value:
+ /** @type {any} */ (left.value) <
+ /** @type {any} */ (right.value),
+ }
+ case "<=":
+ return {
+ value:
+ /** @type {any} */ (left.value) <=
+ /** @type {any} */ (right.value),
+ }
+ case ">":
+ return {
+ value:
+ /** @type {any} */ (left.value) >
+ /** @type {any} */ (right.value),
+ }
+ case ">=":
+ return {
+ value:
+ /** @type {any} */ (left.value) >=
+ /** @type {any} */ (right.value),
+ }
+ case "<<":
+ return {
+ value:
+ /** @type {any} */ (left.value) <<
+ /** @type {any} */ (right.value),
+ }
+ case ">>":
+ return {
+ value:
+ /** @type {any} */ (left.value) >>
+ /** @type {any} */ (right.value),
+ }
+ case ">>>":
+ return {
+ value:
+ /** @type {any} */ (left.value) >>>
+ /** @type {any} */ (right.value),
+ }
+ case "+":
+ return {
+ value:
+ /** @type {any} */ (left.value) +
+ /** @type {any} */ (right.value),
+ }
+ case "-":
+ return {
+ value:
+ /** @type {any} */ (left.value) -
+ /** @type {any} */ (right.value),
+ }
+ case "*":
+ return {
+ value:
+ /** @type {any} */ (left.value) *
+ /** @type {any} */ (right.value),
+ }
+ case "/":
+ return {
+ value:
+ /** @type {any} */ (left.value) /
+ /** @type {any} */ (right.value),
+ }
+ case "%":
+ return {
+ value:
+ /** @type {any} */ (left.value) %
+ /** @type {any} */ (right.value),
+ }
+ case "**":
+ return {
+ value:
+ /** @type {any} */ (left.value) **
+ /** @type {any} */ (right.value),
+ }
+ case "|":
+ return {
+ value:
+ /** @type {any} */ (left.value) |
+ /** @type {any} */ (right.value),
+ }
+ case "^":
+ return {
+ value:
+ /** @type {any} */ (left.value) ^
+ /** @type {any} */ (right.value),
+ }
+ case "&":
+ return {
+ value:
+ /** @type {any} */ (left.value) &
+ /** @type {any} */ (right.value),
+ }
+
+ // no default
+ }
+ }
+
+ return null
+ },
+
+ CallExpression(node, initialScope) {
+ const calleeNode = node.callee;
+ const args = getElementValues(node.arguments, initialScope);
+
+ if (args != null) {
+ if (calleeNode.type === "MemberExpression") {
+ if (calleeNode.property.type === "PrivateIdentifier") {
+ return null
+ }
+ const object = getStaticValueR(calleeNode.object, initialScope);
+ if (object != null) {
+ if (
+ object.value == null &&
+ (object.optional || node.optional)
+ ) {
+ return { value: undefined, optional: true }
+ }
+ const property = getStaticPropertyNameValue(
+ calleeNode,
+ initialScope,
+ );
+
+ if (property != null) {
+ const receiver =
+ /** @type {Record any>} */ (
+ object.value
+ );
+ const methodName = /** @type {PropertyKey} */ (
+ property.value
+ );
+ if (callAllowed.has(receiver[methodName])) {
+ return {
+ value: receiver[methodName](...args),
+ }
+ }
+ if (callPassThrough.has(receiver[methodName])) {
+ return { value: args[0] }
+ }
+ }
+ }
+ } else {
+ const callee = getStaticValueR(calleeNode, initialScope);
+ if (callee != null) {
+ if (callee.value == null && node.optional) {
+ return { value: undefined, optional: true }
+ }
+ const func = /** @type {(...args: any[]) => any} */ (
+ callee.value
+ );
+ if (callAllowed.has(func)) {
+ return { value: func(...args) }
+ }
+ if (callPassThrough.has(func)) {
+ return { value: args[0] }
+ }
+ }
+ }
+ }
+
+ return null
+ },
+
+ ConditionalExpression(node, initialScope) {
+ const test = getStaticValueR(node.test, initialScope);
+ if (test != null) {
+ return test.value
+ ? getStaticValueR(node.consequent, initialScope)
+ : getStaticValueR(node.alternate, initialScope)
+ }
+ return null
+ },
+
+ ExpressionStatement(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+
+ Identifier(node, initialScope) {
+ if (initialScope != null) {
+ const variable = findVariable(initialScope, node);
+
+ if (variable != null) {
+ // Built-in globals.
+ if (isBuiltinGlobal(variable)) {
+ return { value: globalObject[variable.name] }
+ }
+
+ // Constants.
+ if (canBeConsideredConst(variable)) {
+ const def = variable.defs[0];
+ if (
+ // TODO(mysticatea): don't support destructuring here.
+ def.node.id.type === "Identifier"
+ ) {
+ const init = getStaticValueR(
+ def.node.init,
+ initialScope,
+ );
+ if (
+ init &&
+ typeof init.value === "object" &&
+ init.value !== null
+ ) {
+ if (hasMutationInProperty(variable, initialScope)) {
+ // This variable has mutation in its property.
+ return null
+ }
+ }
+ return init
+ }
+ }
+ }
+ }
+ return null
+ },
+
+ Literal(node) {
+ const literal =
+ /** @type {Partial & Partial & Partial} */ (
+ node
+ );
+ //istanbul ignore if : this is implementation-specific behavior.
+ if (
+ (literal.regex != null || literal.bigint != null) &&
+ literal.value == null
+ ) {
+ // It was a RegExp/BigInt literal, but Node.js didn't support it.
+ return null
+ }
+ return { value: literal.value }
+ },
+
+ LogicalExpression(node, initialScope) {
+ const left = getStaticValueR(node.left, initialScope);
+ if (left != null) {
+ if (
+ (node.operator === "||" && Boolean(left.value) === true) ||
+ (node.operator === "&&" && Boolean(left.value) === false) ||
+ (node.operator === "??" && left.value != null)
+ ) {
+ return left
+ }
+
+ const right = getStaticValueR(node.right, initialScope);
+ if (right != null) {
+ return right
+ }
+ }
+
+ return null
+ },
+
+ MemberExpression(node, initialScope) {
+ if (node.property.type === "PrivateIdentifier") {
+ return null
+ }
+ const object = getStaticValueR(node.object, initialScope);
+ if (object != null) {
+ if (object.value == null && (object.optional || node.optional)) {
+ return { value: undefined, optional: true }
+ }
+ const property = getStaticPropertyNameValue(node, initialScope);
+
+ if (property != null) {
+ if (
+ !isGetter(
+ /** @type {object} */ (object.value),
+ /** @type {PropertyKey} */ (property.value),
+ )
+ ) {
+ return {
+ value: /** @type {Record} */ (
+ object.value
+ )[/** @type {PropertyKey} */ (property.value)],
+ }
+ }
+
+ for (const [classFn, allowed] of getterAllowed) {
+ if (
+ object.value instanceof classFn &&
+ allowed.has(/** @type {string} */ (property.value))
+ ) {
+ return {
+ value: /** @type {Record} */ (
+ object.value
+ )[/** @type {PropertyKey} */ (property.value)],
+ }
+ }
+ }
+ }
+ }
+ return null
+ },
+
+ ChainExpression(node, initialScope) {
+ const expression = getStaticValueR(node.expression, initialScope);
+ if (expression != null) {
+ return { value: expression.value }
+ }
+ return null
+ },
+
+ NewExpression(node, initialScope) {
+ const callee = getStaticValueR(node.callee, initialScope);
+ const args = getElementValues(node.arguments, initialScope);
+
+ if (callee != null && args != null) {
+ const Func = /** @type {new (...args: any[]) => any} */ (
+ callee.value
+ );
+ if (callAllowed.has(Func)) {
+ return { value: new Func(...args) }
+ }
+ }
+
+ return null
+ },
+
+ ObjectExpression(node, initialScope) {
+ /** @type {Record} */
+ const object = {};
+
+ for (const propertyNode of node.properties) {
+ if (propertyNode.type === "Property") {
+ if (propertyNode.kind !== "init") {
+ return null
+ }
+ const key = getStaticPropertyNameValue(
+ propertyNode,
+ initialScope,
+ );
+ const value = getStaticValueR(propertyNode.value, initialScope);
+ if (key == null || value == null) {
+ return null
+ }
+ object[/** @type {PropertyKey} */ (key.value)] = value.value;
+ } else if (
+ propertyNode.type === "SpreadElement" ||
+ // @ts-expect-error -- Backward compatibility
+ propertyNode.type === "ExperimentalSpreadProperty"
+ ) {
+ const argument = getStaticValueR(
+ propertyNode.argument,
+ initialScope,
+ );
+ if (argument == null) {
+ return null
+ }
+ Object.assign(object, argument.value);
+ } else {
+ return null
+ }
+ }
+
+ return { value: object }
+ },
+
+ SequenceExpression(node, initialScope) {
+ const last = node.expressions[node.expressions.length - 1];
+ return getStaticValueR(last, initialScope)
+ },
+
+ TaggedTemplateExpression(node, initialScope) {
+ const tag = getStaticValueR(node.tag, initialScope);
+ const expressions = getElementValues(
+ node.quasi.expressions,
+ initialScope,
+ );
+
+ if (tag != null && expressions != null) {
+ const func = /** @type {(...args: any[]) => any} */ (tag.value);
+ /** @type {any[] & { raw?: string[] }} */
+ const strings = node.quasi.quasis.map((q) => q.value.cooked);
+ strings.raw = node.quasi.quasis.map((q) => q.value.raw);
+
+ if (func === String.raw) {
+ return { value: func(strings, ...expressions) }
+ }
+ }
+
+ return null
+ },
+
+ TemplateLiteral(node, initialScope) {
+ const expressions = getElementValues(node.expressions, initialScope);
+ if (expressions != null) {
+ let value = node.quasis[0].value.cooked;
+ for (let i = 0; i < expressions.length; ++i) {
+ value += expressions[i];
+ value += /** @type {string} */ (node.quasis[i + 1].value.cooked);
+ }
+ return { value }
+ }
+ return null
+ },
+
+ UnaryExpression(node, initialScope) {
+ if (node.operator === "delete") {
+ // Not supported.
+ return null
+ }
+ if (node.operator === "void") {
+ return { value: undefined }
+ }
+
+ const arg = getStaticValueR(node.argument, initialScope);
+ if (arg != null) {
+ switch (node.operator) {
+ case "-":
+ return { value: -(/** @type {any} */ (arg.value)) }
+ case "+":
+ return { value: +(/** @type {any} */ (arg.value)) } //eslint-disable-line no-implicit-coercion
+ case "!":
+ return { value: !arg.value }
+ case "~":
+ return { value: ~(/** @type {any} */ (arg.value)) }
+ case "typeof":
+ return { value: typeof arg.value }
+
+ // no default
+ }
+ }
+
+ return null
+ },
+ TSAsExpression(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+ TSSatisfiesExpression(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+ TSTypeAssertion(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+ TSNonNullExpression(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+ TSInstantiationExpression(node, initialScope) {
+ return getStaticValueR(node.expression, initialScope)
+ },
+});
+
+/**
+ * Get the value of a given node if it's a static value.
+ * @param {Node|TSESTreeNode|null|undefined} node The node to get.
+ * @param {Scope|undefined|null} initialScope The scope to start finding variable.
+ * @returns {StaticValue|null} The static value of the node, or `null`.
+ */
+function getStaticValueR(node, initialScope) {
+ if (node != null && Object.hasOwnProperty.call(operations, node.type)) {
+ return /** @type {VisitorCallback} */ (operations[node.type])(
+ /** @type {TSESTreeNode} */ (node),
+ initialScope,
+ )
+ }
+ return null
+}
+
+/**
+ * Get the static value of property name from a MemberExpression node or a Property node.
+ * @param {MemberExpression|Property} node The node to get.
+ * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.
+ * @returns {StaticValue|null} The static value of the property name of the node, or `null`.
+ */
+function getStaticPropertyNameValue(node, initialScope) {
+ const nameNode = node.type === "Property" ? node.key : node.property;
+
+ if (node.computed) {
+ return getStaticValueR(nameNode, initialScope)
+ }
+
+ if (nameNode.type === "Identifier") {
+ return { value: nameNode.name }
+ }
+
+ if (nameNode.type === "Literal") {
+ if (/** @type {Partial} */ (nameNode).bigint) {
+ return { value: /** @type {BigIntLiteral} */ (nameNode).bigint }
+ }
+ return { value: String(nameNode.value) }
+ }
+
+ return null
+}
+
+/**
+ * Get the value of a given node if it's a static value.
+ * @param {Node} node The node to get.
+ * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If this scope was given, this tries to resolve identifier references which are in the given node as much as possible.
+ * @returns {StaticValue | null} The static value of the node, or `null`.
+ */
+function getStaticValue(node, initialScope = null) {
+ try {
+ return getStaticValueR(node, initialScope)
+ } catch (_error) {
+ return null
+ }
+}
+
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("estree").RegExpLiteral} RegExpLiteral */
+/** @typedef {import("estree").BigIntLiteral} BigIntLiteral */
+/** @typedef {import("estree").SimpleLiteral} SimpleLiteral */
+
+/**
+ * Get the value of a given node if it's a literal or a template literal.
+ * @param {Node} node The node to get.
+ * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If the node is an Identifier node and this scope was given, this checks the variable of the identifier, and returns the value of it if the variable is a constant.
+ * @returns {string|null} The value of the node, or `null`.
+ */
+function getStringIfConstant(node, initialScope = null) {
+ // Handle the literals that the platform doesn't support natively.
+ if (node && node.type === "Literal" && node.value === null) {
+ const literal =
+ /** @type {Partial & Partial & Partial} */ (
+ node
+ );
+ if (literal.regex) {
+ return `/${literal.regex.pattern}/${literal.regex.flags}`
+ }
+ if (literal.bigint) {
+ return literal.bigint
+ }
+ }
+
+ const evaluated = getStaticValue(node, initialScope);
+
+ if (evaluated) {
+ // `String(Symbol.prototype)` throws error
+ try {
+ return String(evaluated.value)
+ } catch {
+ // No op
+ }
+ }
+
+ return null
+}
+
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("estree").MemberExpression} MemberExpression */
+/** @typedef {import("estree").MethodDefinition} MethodDefinition */
+/** @typedef {import("estree").Property} Property */
+/** @typedef {import("estree").PropertyDefinition} PropertyDefinition */
+/** @typedef {import("estree").Identifier} Identifier */
+
+/**
+ * Get the property name from a MemberExpression node or a Property node.
+ * @param {MemberExpression | MethodDefinition | Property | PropertyDefinition} node The node to get.
+ * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.
+ * @returns {string|null|undefined} The property name of the node.
+ */
+function getPropertyName(node, initialScope) {
+ switch (node.type) {
+ case "MemberExpression":
+ if (node.computed) {
+ return getStringIfConstant(node.property, initialScope)
+ }
+ if (node.property.type === "PrivateIdentifier") {
+ return null
+ }
+ return /** @type {Partial} */ (node.property).name
+
+ case "Property":
+ case "MethodDefinition":
+ case "PropertyDefinition":
+ if (node.computed) {
+ return getStringIfConstant(node.key, initialScope)
+ }
+ if (node.key.type === "Literal") {
+ return String(node.key.value)
+ }
+ if (node.key.type === "PrivateIdentifier") {
+ return null
+ }
+ return /** @type {Partial} */ (node.key).name
+ }
+
+ return null
+}
+
+/** @typedef {import("eslint").Rule.Node} RuleNode */
+/** @typedef {import("eslint").SourceCode} SourceCode */
+/** @typedef {import("estree").Function} FunctionNode */
+/** @typedef {import("estree").FunctionDeclaration} FunctionDeclaration */
+/** @typedef {import("estree").FunctionExpression} FunctionExpression */
+/** @typedef {import("estree").Identifier} Identifier */
+
+/**
+ * Get the name and kind of the given function node.
+ * @param {FunctionNode} node - The function node to get.
+ * @param {SourceCode} [sourceCode] The source code object to get the code of computed property keys.
+ * @returns {string} The name and kind of the function node.
+ */
+// eslint-disable-next-line complexity
+function getFunctionNameWithKind(node, sourceCode) {
+ const parent = /** @type {RuleNode} */ (node).parent;
+ const tokens = [];
+ const isObjectMethod = parent.type === "Property" && parent.value === node;
+ const isClassMethod =
+ parent.type === "MethodDefinition" && parent.value === node;
+ const isClassFieldMethod =
+ parent.type === "PropertyDefinition" && parent.value === node;
+
+ // Modifiers.
+ if (isClassMethod || isClassFieldMethod) {
+ if (parent.static) {
+ tokens.push("static");
+ }
+ if (parent.key.type === "PrivateIdentifier") {
+ tokens.push("private");
+ }
+ }
+ if (node.async) {
+ tokens.push("async");
+ }
+ if (node.generator) {
+ tokens.push("generator");
+ }
+
+ // Kinds.
+ if (isObjectMethod || isClassMethod) {
+ if (parent.kind === "constructor") {
+ return "constructor"
+ }
+ if (parent.kind === "get") {
+ tokens.push("getter");
+ } else if (parent.kind === "set") {
+ tokens.push("setter");
+ } else {
+ tokens.push("method");
+ }
+ } else if (isClassFieldMethod) {
+ tokens.push("method");
+ } else {
+ if (node.type === "ArrowFunctionExpression") {
+ tokens.push("arrow");
+ }
+ tokens.push("function");
+ }
+
+ // Names.
+ if (isObjectMethod || isClassMethod || isClassFieldMethod) {
+ if (parent.key.type === "PrivateIdentifier") {
+ tokens.push(`#${parent.key.name}`);
+ } else {
+ const name = getPropertyName(parent);
+ if (name) {
+ tokens.push(`'${name}'`);
+ } else if (sourceCode) {
+ const keyText = sourceCode.getText(parent.key);
+ if (!keyText.includes("\n")) {
+ tokens.push(`[${keyText}]`);
+ }
+ }
+ }
+ } else if (hasId(node)) {
+ tokens.push(`'${node.id.name}'`);
+ } else if (
+ parent.type === "VariableDeclarator" &&
+ parent.id &&
+ parent.id.type === "Identifier"
+ ) {
+ tokens.push(`'${parent.id.name}'`);
+ } else if (
+ (parent.type === "AssignmentExpression" ||
+ parent.type === "AssignmentPattern") &&
+ parent.left &&
+ parent.left.type === "Identifier"
+ ) {
+ tokens.push(`'${parent.left.name}'`);
+ } else if (
+ parent.type === "ExportDefaultDeclaration" &&
+ parent.declaration === node
+ ) {
+ tokens.push("'default'");
+ }
+
+ return tokens.join(" ")
+}
+
+/**
+ * @param {FunctionNode} node
+ * @returns {node is FunctionDeclaration | FunctionExpression & { id: Identifier }}
+ */
+function hasId(node) {
+ return Boolean(
+ /** @type {Partial} */ (node)
+ .id,
+ )
+}
+
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("eslint").SourceCode} SourceCode */
+/** @typedef {import("./types.mjs").HasSideEffectOptions} HasSideEffectOptions */
+/** @typedef {import("estree").BinaryExpression} BinaryExpression */
+/** @typedef {import("estree").MemberExpression} MemberExpression */
+/** @typedef {import("estree").MethodDefinition} MethodDefinition */
+/** @typedef {import("estree").Property} Property */
+/** @typedef {import("estree").PropertyDefinition} PropertyDefinition */
+/** @typedef {import("estree").UnaryExpression} UnaryExpression */
+
+const typeConversionBinaryOps = Object.freeze(
+ new Set([
+ "==",
+ "!=",
+ "<",
+ "<=",
+ ">",
+ ">=",
+ "<<",
+ ">>",
+ ">>>",
+ "+",
+ "-",
+ "*",
+ "/",
+ "%",
+ "|",
+ "^",
+ "&",
+ "in",
+ ]),
+);
+const typeConversionUnaryOps = Object.freeze(new Set(["-", "+", "!", "~"]));
+
+/**
+ * Check whether the given value is an ASTNode or not.
+ * @param {any} x The value to check.
+ * @returns {x is Node} `true` if the value is an ASTNode.
+ */
+function isNode(x) {
+ return x !== null && typeof x === "object" && typeof x.type === "string"
+}
+
+const visitor = Object.freeze(
+ Object.assign(Object.create(null), {
+ /**
+ * @param {Node} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ $visit(node, options, visitorKeys) {
+ const { type } = node;
+
+ if (typeof (/** @type {any} */ (this)[type]) === "function") {
+ return /** @type {any} */ (this)[type](
+ node,
+ options,
+ visitorKeys,
+ )
+ }
+
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+
+ /**
+ * @param {Node} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ $visitChildren(node, options, visitorKeys) {
+ const { type } = node;
+
+ for (const key of /** @type {(keyof Node)[]} */ (
+ visitorKeys[type] || getKeys(node)
+ )) {
+ const value = node[key];
+
+ if (Array.isArray(value)) {
+ for (const element of value) {
+ if (
+ isNode(element) &&
+ this.$visit(element, options, visitorKeys)
+ ) {
+ return true
+ }
+ }
+ } else if (
+ isNode(value) &&
+ this.$visit(value, options, visitorKeys)
+ ) {
+ return true
+ }
+ }
+
+ return false
+ },
+
+ ArrowFunctionExpression() {
+ return false
+ },
+ AssignmentExpression() {
+ return true
+ },
+ AwaitExpression() {
+ return true
+ },
+ /**
+ * @param {BinaryExpression} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ BinaryExpression(node, options, visitorKeys) {
+ if (
+ options.considerImplicitTypeConversion &&
+ typeConversionBinaryOps.has(node.operator) &&
+ (node.left.type !== "Literal" || node.right.type !== "Literal")
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ CallExpression() {
+ return true
+ },
+ FunctionExpression() {
+ return false
+ },
+ ImportExpression() {
+ return true
+ },
+ /**
+ * @param {MemberExpression} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ MemberExpression(node, options, visitorKeys) {
+ if (options.considerGetters) {
+ return true
+ }
+ if (
+ options.considerImplicitTypeConversion &&
+ node.computed &&
+ node.property.type !== "Literal"
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ /**
+ * @param {MethodDefinition} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ MethodDefinition(node, options, visitorKeys) {
+ if (
+ options.considerImplicitTypeConversion &&
+ node.computed &&
+ node.key.type !== "Literal"
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ NewExpression() {
+ return true
+ },
+ /**
+ * @param {Property} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ Property(node, options, visitorKeys) {
+ if (
+ options.considerImplicitTypeConversion &&
+ node.computed &&
+ node.key.type !== "Literal"
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ /**
+ * @param {PropertyDefinition} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ PropertyDefinition(node, options, visitorKeys) {
+ if (
+ options.considerImplicitTypeConversion &&
+ node.computed &&
+ node.key.type !== "Literal"
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ /**
+ * @param {UnaryExpression} node
+ * @param {HasSideEffectOptions} options
+ * @param {Record} visitorKeys
+ */
+ UnaryExpression(node, options, visitorKeys) {
+ if (node.operator === "delete") {
+ return true
+ }
+ if (
+ options.considerImplicitTypeConversion &&
+ typeConversionUnaryOps.has(node.operator) &&
+ node.argument.type !== "Literal"
+ ) {
+ return true
+ }
+ return this.$visitChildren(node, options, visitorKeys)
+ },
+ UpdateExpression() {
+ return true
+ },
+ YieldExpression() {
+ return true
+ },
+ }),
+);
+
+/**
+ * Check whether a given node has any side effect or not.
+ * @param {Node} node The node to get.
+ * @param {SourceCode} sourceCode The source code object.
+ * @param {HasSideEffectOptions} [options] The option object.
+ * @returns {boolean} `true` if the node has a certain side effect.
+ */
+function hasSideEffect(node, sourceCode, options = {}) {
+ const { considerGetters = false, considerImplicitTypeConversion = false } =
+ options;
+ return visitor.$visit(
+ node,
+ { considerGetters, considerImplicitTypeConversion },
+ sourceCode.visitorKeys || KEYS,
+ )
+}
+
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("@typescript-eslint/types").TSESTree.NewExpression} TSNewExpression */
+/** @typedef {import("@typescript-eslint/types").TSESTree.CallExpression} TSCallExpression */
+/** @typedef {import("eslint").SourceCode} SourceCode */
+/** @typedef {import("eslint").AST.Token} Token */
+/** @typedef {import("eslint").Rule.Node} RuleNode */
+
+/**
+ * Get the left parenthesis of the parent node syntax if it exists.
+ * E.g., `if (a) {}` then the `(`.
+ * @param {Node} node The AST node to check.
+ * @param {SourceCode} sourceCode The source code object to get tokens.
+ * @returns {Token|null} The left parenthesis of the parent node syntax
+ */
+// eslint-disable-next-line complexity
+function getParentSyntaxParen(node, sourceCode) {
+ const parent = /** @type {RuleNode} */ (node).parent;
+
+ switch (parent.type) {
+ case "CallExpression":
+ case "NewExpression":
+ if (parent.arguments.length === 1 && parent.arguments[0] === node) {
+ return sourceCode.getTokenAfter(
+ // @ts-expect-error https://github.com/typescript-eslint/typescript-eslint/pull/5384
+ parent.typeArguments ||
+ /** @type {RuleNode} */ (
+ /** @type {unknown} */ (
+ /** @type {TSNewExpression | TSCallExpression} */ (
+ parent
+ ).typeParameters
+ )
+ ) ||
+ parent.callee,
+ isOpeningParenToken,
+ )
+ }
+ return null
+
+ case "DoWhileStatement":
+ if (parent.test === node) {
+ return sourceCode.getTokenAfter(
+ parent.body,
+ isOpeningParenToken,
+ )
+ }
+ return null
+
+ case "IfStatement":
+ case "WhileStatement":
+ if (parent.test === node) {
+ return sourceCode.getFirstToken(parent, 1)
+ }
+ return null
+
+ case "ImportExpression":
+ if (parent.source === node) {
+ return sourceCode.getFirstToken(parent, 1)
+ }
+ return null
+
+ case "SwitchStatement":
+ if (parent.discriminant === node) {
+ return sourceCode.getFirstToken(parent, 1)
+ }
+ return null
+
+ case "WithStatement":
+ if (parent.object === node) {
+ return sourceCode.getFirstToken(parent, 1)
+ }
+ return null
+
+ default:
+ return null
+ }
+}
+
+/**
+ * Check whether a given node is parenthesized or not.
+ * @param {number} times The number of parantheses.
+ * @param {Node} node The AST node to check.
+ * @param {SourceCode} sourceCode The source code object to get tokens.
+ * @returns {boolean} `true` if the node is parenthesized the given times.
+ */
+/**
+ * Check whether a given node is parenthesized or not.
+ * @param {Node} node The AST node to check.
+ * @param {SourceCode} sourceCode The source code object to get tokens.
+ * @returns {boolean} `true` if the node is parenthesized.
+ */
+/**
+ * Check whether a given node is parenthesized or not.
+ * @param {Node|number} timesOrNode The first parameter.
+ * @param {Node|SourceCode} nodeOrSourceCode The second parameter.
+ * @param {SourceCode} [optionalSourceCode] The third parameter.
+ * @returns {boolean} `true` if the node is parenthesized.
+ */
+function isParenthesized(
+ timesOrNode,
+ nodeOrSourceCode,
+ optionalSourceCode,
+) {
+ /** @type {number} */
+ let times,
+ /** @type {RuleNode} */
+ node,
+ /** @type {SourceCode} */
+ sourceCode,
+ maybeLeftParen,
+ maybeRightParen;
+ if (typeof timesOrNode === "number") {
+ times = timesOrNode | 0;
+ node = /** @type {RuleNode} */ (nodeOrSourceCode);
+ sourceCode = /** @type {SourceCode} */ (optionalSourceCode);
+ if (!(times >= 1)) {
+ throw new TypeError("'times' should be a positive integer.")
+ }
+ } else {
+ times = 1;
+ node = /** @type {RuleNode} */ (timesOrNode);
+ sourceCode = /** @type {SourceCode} */ (nodeOrSourceCode);
+ }
+
+ if (
+ node == null ||
+ // `Program` can't be parenthesized
+ node.parent == null ||
+ // `CatchClause.param` can't be parenthesized, example `try {} catch (error) {}`
+ (node.parent.type === "CatchClause" && node.parent.param === node)
+ ) {
+ return false
+ }
+
+ maybeLeftParen = maybeRightParen = node;
+ do {
+ maybeLeftParen = sourceCode.getTokenBefore(maybeLeftParen);
+ maybeRightParen = sourceCode.getTokenAfter(maybeRightParen);
+ } while (
+ maybeLeftParen != null &&
+ maybeRightParen != null &&
+ isOpeningParenToken(maybeLeftParen) &&
+ isClosingParenToken(maybeRightParen) &&
+ // Avoid false positive such as `if (a) {}`
+ maybeLeftParen !== getParentSyntaxParen(node, sourceCode) &&
+ --times > 0
+ )
+
+ return times === 0
+}
+
+/**
+ * @author Toru Nagashima
+ * See LICENSE file in root directory for full license.
+ */
+
+const placeholder = /\$(?:[$&`']|[1-9][0-9]?)/gu;
+
+/** @type {WeakMap} */
+const internal = new WeakMap();
+
+/**
+ * Check whether a given character is escaped or not.
+ * @param {string} str The string to check.
+ * @param {number} index The location of the character to check.
+ * @returns {boolean} `true` if the character is escaped.
+ */
+function isEscaped(str, index) {
+ let escaped = false;
+ for (let i = index - 1; i >= 0 && str.charCodeAt(i) === 0x5c; --i) {
+ escaped = !escaped;
+ }
+ return escaped
+}
+
+/**
+ * Replace a given string by a given matcher.
+ * @param {PatternMatcher} matcher The pattern matcher.
+ * @param {string} str The string to be replaced.
+ * @param {string} replacement The new substring to replace each matched part.
+ * @returns {string} The replaced string.
+ */
+function replaceS(matcher, str, replacement) {
+ const chunks = [];
+ let index = 0;
+
+ /**
+ * @param {string} key The placeholder.
+ * @param {RegExpExecArray} match The matched information.
+ * @returns {string} The replaced string.
+ */
+ function replacer(key, match) {
+ switch (key) {
+ case "$$":
+ return "$"
+ case "$&":
+ return match[0]
+ case "$`":
+ return str.slice(0, match.index)
+ case "$'":
+ return str.slice(match.index + match[0].length)
+ default: {
+ const i = key.slice(1);
+ if (i in match) {
+ return match[/** @type {any} */ (i)]
+ }
+ return key
+ }
+ }
+ }
+
+ for (const match of matcher.execAll(str)) {
+ chunks.push(str.slice(index, match.index));
+ chunks.push(
+ replacement.replace(placeholder, (key) => replacer(key, match)),
+ );
+ index = match.index + match[0].length;
+ }
+ chunks.push(str.slice(index));
+
+ return chunks.join("")
+}
+
+/**
+ * Replace a given string by a given matcher.
+ * @param {PatternMatcher} matcher The pattern matcher.
+ * @param {string} str The string to be replaced.
+ * @param {(substring: string, ...args: any[]) => string} replace The function to replace each matched part.
+ * @returns {string} The replaced string.
+ */
+function replaceF(matcher, str, replace) {
+ const chunks = [];
+ let index = 0;
+
+ for (const match of matcher.execAll(str)) {
+ chunks.push(str.slice(index, match.index));
+ chunks.push(
+ String(
+ replace(
+ .../** @type {[string, ...string[]]} */ (
+ /** @type {string[]} */ (match)
+ ),
+ match.index,
+ match.input,
+ ),
+ ),
+ );
+ index = match.index + match[0].length;
+ }
+ chunks.push(str.slice(index));
+
+ return chunks.join("")
+}
+
+/**
+ * The class to find patterns as considering escape sequences.
+ */
+class PatternMatcher {
+ /**
+ * Initialize this matcher.
+ * @param {RegExp} pattern The pattern to match.
+ * @param {{escaped?:boolean}} [options] The options.
+ */
+ constructor(pattern, options = {}) {
+ const { escaped = false } = options;
+ if (!(pattern instanceof RegExp)) {
+ throw new TypeError("'pattern' should be a RegExp instance.")
+ }
+ if (!pattern.flags.includes("g")) {
+ throw new Error("'pattern' should contains 'g' flag.")
+ }
+
+ internal.set(this, {
+ pattern: new RegExp(pattern.source, pattern.flags),
+ escaped: Boolean(escaped),
+ });
+ }
+
+ /**
+ * Find the pattern in a given string.
+ * @param {string} str The string to find.
+ * @returns {IterableIterator} The iterator which iterate the matched information.
+ */
+ *execAll(str) {
+ const { pattern, escaped } =
+ /** @type {{pattern:RegExp,escaped:boolean}} */ (internal.get(this));
+ let match = null;
+ let lastIndex = 0;
+
+ pattern.lastIndex = 0;
+ while ((match = pattern.exec(str)) != null) {
+ if (escaped || !isEscaped(str, match.index)) {
+ lastIndex = pattern.lastIndex;
+ yield match;
+ pattern.lastIndex = lastIndex;
+ }
+ }
+ }
+
+ /**
+ * Check whether the pattern is found in a given string.
+ * @param {string} str The string to check.
+ * @returns {boolean} `true` if the pattern was found in the string.
+ */
+ test(str) {
+ const it = this.execAll(str);
+ const ret = it.next();
+ return !ret.done
+ }
+
+ /**
+ * Replace a given string.
+ * @param {string} str The string to be replaced.
+ * @param {(string|((...strs:string[])=>string))} replacer The string or function to replace. This is the same as the 2nd argument of `String.prototype.replace`.
+ * @returns {string} The replaced string.
+ */
+ [Symbol.replace](str, replacer) {
+ return typeof replacer === "function"
+ ? replaceF(this, String(str), replacer)
+ : replaceS(this, String(str), String(replacer))
+ }
+}
+
+/** @typedef {import("eslint").Scope.Scope} Scope */
+/** @typedef {import("eslint").Scope.Variable} Variable */
+/** @typedef {import("eslint").Rule.Node} RuleNode */
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").Pattern} Pattern */
+/** @typedef {import("estree").Identifier} Identifier */
+/** @typedef {import("estree").SimpleCallExpression} CallExpression */
+/** @typedef {import("estree").Program} Program */
+/** @typedef {import("estree").ImportDeclaration} ImportDeclaration */
+/** @typedef {import("estree").ExportAllDeclaration} ExportAllDeclaration */
+/** @typedef {import("estree").ExportDefaultDeclaration} ExportDefaultDeclaration */
+/** @typedef {import("estree").ExportNamedDeclaration} ExportNamedDeclaration */
+/** @typedef {import("estree").ImportSpecifier} ImportSpecifier */
+/** @typedef {import("estree").ImportDefaultSpecifier} ImportDefaultSpecifier */
+/** @typedef {import("estree").ImportNamespaceSpecifier} ImportNamespaceSpecifier */
+/** @typedef {import("estree").ExportSpecifier} ExportSpecifier */
+/** @typedef {import("estree").Property} Property */
+/** @typedef {import("estree").AssignmentProperty} AssignmentProperty */
+/** @typedef {import("estree").Literal} Literal */
+/** @typedef {import("@typescript-eslint/types").TSESTree.Node} TSESTreeNode */
+/** @typedef {import("./types.mjs").ReferenceTrackerOptions} ReferenceTrackerOptions */
+/**
+ * @template T
+ * @typedef {import("./types.mjs").TraceMap} TraceMap
+ */
+/**
+ * @template T
+ * @typedef {import("./types.mjs").TraceMapObject} TraceMapObject
+ */
+/**
+ * @template T
+ * @typedef {import("./types.mjs").TrackedReferences} TrackedReferences
+ */
+
+const IMPORT_TYPE = /^(?:Import|Export(?:All|Default|Named))Declaration$/u;
+
+/**
+ * Check whether a given node is an import node or not.
+ * @param {Node} node
+ * @returns {node is ImportDeclaration|ExportAllDeclaration|ExportNamedDeclaration&{source: Literal}} `true` if the node is an import node.
+ */
+function isHasSource(node) {
+ return (
+ IMPORT_TYPE.test(node.type) &&
+ /** @type {ImportDeclaration|ExportAllDeclaration|ExportNamedDeclaration} */ (
+ node
+ ).source != null
+ )
+}
+const has =
+ /** @type {(traceMap: TraceMap, v: T) => v is (string extends T ? string : T)} */ (
+ Function.call.bind(Object.hasOwnProperty)
+ );
+
+const READ = Symbol("read");
+const CALL = Symbol("call");
+const CONSTRUCT = Symbol("construct");
+const ESM = Symbol("esm");
+
+const requireCall = { require: { [CALL]: true } };
+
+/**
+ * Check whether a given variable is modified or not.
+ * @param {Variable|undefined} variable The variable to check.
+ * @returns {boolean} `true` if the variable is modified.
+ */
+function isModifiedGlobal(variable) {
+ return (
+ variable == null ||
+ variable.defs.length !== 0 ||
+ variable.references.some((r) => r.isWrite())
+ )
+}
+
+/**
+ * Check if the value of a given node is passed through to the parent syntax as-is.
+ * For example, `a` and `b` in (`a || b` and `c ? a : b`) are passed through.
+ * @param {Node} node A node to check.
+ * @returns {node is RuleNode & {parent: Expression}} `true` if the node is passed through.
+ */
+function isPassThrough(node) {
+ const parent = /** @type {TSESTreeNode} */ (node).parent;
+
+ if (parent) {
+ switch (parent.type) {
+ case "ConditionalExpression":
+ return parent.consequent === node || parent.alternate === node
+ case "LogicalExpression":
+ return true
+ case "SequenceExpression":
+ return (
+ parent.expressions[parent.expressions.length - 1] === node
+ )
+ case "ChainExpression":
+ return true
+ case "TSAsExpression":
+ case "TSSatisfiesExpression":
+ case "TSTypeAssertion":
+ case "TSNonNullExpression":
+ case "TSInstantiationExpression":
+ return true
+
+ default:
+ return false
+ }
+ }
+ return false
+}
+
+/**
+ * The reference tracker.
+ */
+class ReferenceTracker {
+ /**
+ * Initialize this tracker.
+ * @param {Scope} globalScope The global scope.
+ * @param {object} [options] The options.
+ * @param {"legacy"|"strict"} [options.mode="strict"] The mode to determine the ImportDeclaration's behavior for CJS modules.
+ * @param {string[]} [options.globalObjectNames=["global","globalThis","self","window"]] The variable names for Global Object.
+ */
+ constructor(globalScope, options = {}) {
+ const {
+ mode = "strict",
+ globalObjectNames = ["global", "globalThis", "self", "window"],
+ } = options;
+ /** @private @type {Variable[]} */
+ this.variableStack = [];
+ /** @private */
+ this.globalScope = globalScope;
+ /** @private */
+ this.mode = mode;
+ /** @private */
+ this.globalObjectNames = globalObjectNames.slice(0);
+ }
+
+ /**
+ * Iterate the references of global variables.
+ * @template T
+ * @param {TraceMap} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *iterateGlobalReferences(traceMap) {
+ for (const key of Object.keys(traceMap)) {
+ const nextTraceMap = traceMap[key];
+ const path = [key];
+ const variable = this.globalScope.set.get(key);
+
+ if (isModifiedGlobal(variable)) {
+ continue
+ }
+
+ yield* this._iterateVariableReferences(
+ /** @type {Variable} */ (variable),
+ path,
+ nextTraceMap,
+ true,
+ );
+ }
+
+ for (const key of this.globalObjectNames) {
+ /** @type {string[]} */
+ const path = [];
+ const variable = this.globalScope.set.get(key);
+
+ if (isModifiedGlobal(variable)) {
+ continue
+ }
+
+ yield* this._iterateVariableReferences(
+ /** @type {Variable} */ (variable),
+ path,
+ traceMap,
+ false,
+ );
+ }
+ }
+
+ /**
+ * Iterate the references of CommonJS modules.
+ * @template T
+ * @param {TraceMap} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *iterateCjsReferences(traceMap) {
+ for (const { node } of this.iterateGlobalReferences(requireCall)) {
+ const key = getStringIfConstant(
+ /** @type {CallExpression} */ (node).arguments[0],
+ );
+ if (key == null || !has(traceMap, key)) {
+ continue
+ }
+
+ const nextTraceMap = traceMap[key];
+ const path = [key];
+
+ if (nextTraceMap[READ]) {
+ yield {
+ node,
+ path,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+ yield* this._iteratePropertyReferences(
+ /** @type {CallExpression} */ (node),
+ path,
+ nextTraceMap,
+ );
+ }
+ }
+
+ /**
+ * Iterate the references of ES modules.
+ * @template T
+ * @param {TraceMap} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *iterateEsmReferences(traceMap) {
+ const programNode = /** @type {Program} */ (this.globalScope.block);
+
+ for (const node of programNode.body) {
+ if (!isHasSource(node)) {
+ continue
+ }
+ const moduleId = /** @type {string} */ (node.source.value);
+
+ if (!has(traceMap, moduleId)) {
+ continue
+ }
+ const nextTraceMap = traceMap[moduleId];
+ const path = [moduleId];
+
+ if (nextTraceMap[READ]) {
+ yield {
+ // eslint-disable-next-line object-shorthand -- apply type
+ node: /** @type {RuleNode} */ (node),
+ path,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+
+ if (node.type === "ExportAllDeclaration") {
+ for (const key of Object.keys(nextTraceMap)) {
+ const exportTraceMap = nextTraceMap[key];
+ if (exportTraceMap[READ]) {
+ yield {
+ // eslint-disable-next-line object-shorthand -- apply type
+ node: /** @type {RuleNode} */ (node),
+ path: path.concat(key),
+ type: READ,
+ info: exportTraceMap[READ],
+ };
+ }
+ }
+ } else {
+ for (const specifier of node.specifiers) {
+ const esm = has(nextTraceMap, ESM);
+ const it = this._iterateImportReferences(
+ specifier,
+ path,
+ esm
+ ? nextTraceMap
+ : this.mode === "legacy"
+ ? { default: nextTraceMap, ...nextTraceMap }
+ : { default: nextTraceMap },
+ );
+
+ if (esm) {
+ yield* it;
+ } else {
+ for (const report of it) {
+ report.path = report.path.filter(exceptDefault);
+ if (
+ report.path.length >= 2 ||
+ report.type !== READ
+ ) {
+ yield report;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Iterate the property references for a given expression AST node.
+ * @template T
+ * @param {Expression} node The expression AST node to iterate property references.
+ * @param {TraceMap} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate property references.
+ */
+ *iteratePropertyReferences(node, traceMap) {
+ yield* this._iteratePropertyReferences(node, [], traceMap);
+ }
+
+ /**
+ * Iterate the references for a given variable.
+ * @private
+ * @template T
+ * @param {Variable} variable The variable to iterate that references.
+ * @param {string[]} path The current path.
+ * @param {TraceMapObject} traceMap The trace map.
+ * @param {boolean} shouldReport = The flag to report those references.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *_iterateVariableReferences(variable, path, traceMap, shouldReport) {
+ if (this.variableStack.includes(variable)) {
+ return
+ }
+ this.variableStack.push(variable);
+ try {
+ for (const reference of variable.references) {
+ if (!reference.isRead()) {
+ continue
+ }
+ const node = /** @type {RuleNode & Identifier} */ (
+ reference.identifier
+ );
+
+ if (shouldReport && traceMap[READ]) {
+ yield { node, path, type: READ, info: traceMap[READ] };
+ }
+ yield* this._iteratePropertyReferences(node, path, traceMap);
+ }
+ } finally {
+ this.variableStack.pop();
+ }
+ }
+
+ /**
+ * Iterate the references for a given AST node.
+ * @private
+ * @template T
+ * @param {Expression} rootNode The AST node to iterate references.
+ * @param {string[]} path The current path.
+ * @param {TraceMapObject} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ //eslint-disable-next-line complexity
+ *_iteratePropertyReferences(rootNode, path, traceMap) {
+ let node = rootNode;
+ while (isPassThrough(node)) {
+ node = node.parent;
+ }
+
+ const parent = /** @type {RuleNode} */ (node).parent;
+ if (parent.type === "MemberExpression") {
+ if (parent.object === node) {
+ const key = getPropertyName(parent);
+ if (key == null || !has(traceMap, key)) {
+ return
+ }
+
+ path = path.concat(key); //eslint-disable-line no-param-reassign
+ const nextTraceMap = traceMap[key];
+ if (nextTraceMap[READ]) {
+ yield {
+ node: parent,
+ path,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+ yield* this._iteratePropertyReferences(
+ parent,
+ path,
+ nextTraceMap,
+ );
+ }
+ return
+ }
+ if (parent.type === "CallExpression") {
+ if (parent.callee === node && traceMap[CALL]) {
+ yield { node: parent, path, type: CALL, info: traceMap[CALL] };
+ }
+ return
+ }
+ if (parent.type === "NewExpression") {
+ if (parent.callee === node && traceMap[CONSTRUCT]) {
+ yield {
+ node: parent,
+ path,
+ type: CONSTRUCT,
+ info: traceMap[CONSTRUCT],
+ };
+ }
+ return
+ }
+ if (parent.type === "AssignmentExpression") {
+ if (parent.right === node) {
+ yield* this._iterateLhsReferences(parent.left, path, traceMap);
+ yield* this._iteratePropertyReferences(parent, path, traceMap);
+ }
+ return
+ }
+ if (parent.type === "AssignmentPattern") {
+ if (parent.right === node) {
+ yield* this._iterateLhsReferences(parent.left, path, traceMap);
+ }
+ return
+ }
+ if (parent.type === "VariableDeclarator") {
+ if (parent.init === node) {
+ yield* this._iterateLhsReferences(parent.id, path, traceMap);
+ }
+ }
+ }
+
+ /**
+ * Iterate the references for a given Pattern node.
+ * @private
+ * @template T
+ * @param {Pattern} patternNode The Pattern node to iterate references.
+ * @param {string[]} path The current path.
+ * @param {TraceMapObject} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *_iterateLhsReferences(patternNode, path, traceMap) {
+ if (patternNode.type === "Identifier") {
+ const variable = findVariable(this.globalScope, patternNode);
+ if (variable != null) {
+ yield* this._iterateVariableReferences(
+ variable,
+ path,
+ traceMap,
+ false,
+ );
+ }
+ return
+ }
+ if (patternNode.type === "ObjectPattern") {
+ for (const property of patternNode.properties) {
+ const key = getPropertyName(
+ /** @type {AssignmentProperty} */ (property),
+ );
+
+ if (key == null || !has(traceMap, key)) {
+ continue
+ }
+
+ const nextPath = path.concat(key);
+ const nextTraceMap = traceMap[key];
+ if (nextTraceMap[READ]) {
+ yield {
+ node: /** @type {RuleNode} */ (property),
+ path: nextPath,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+ yield* this._iterateLhsReferences(
+ /** @type {AssignmentProperty} */ (property).value,
+ nextPath,
+ nextTraceMap,
+ );
+ }
+ return
+ }
+ if (patternNode.type === "AssignmentPattern") {
+ yield* this._iterateLhsReferences(patternNode.left, path, traceMap);
+ }
+ }
+
+ /**
+ * Iterate the references for a given ModuleSpecifier node.
+ * @private
+ * @template T
+ * @param {ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier} specifierNode The ModuleSpecifier node to iterate references.
+ * @param {string[]} path The current path.
+ * @param {TraceMapObject} traceMap The trace map.
+ * @returns {IterableIterator>} The iterator to iterate references.
+ */
+ *_iterateImportReferences(specifierNode, path, traceMap) {
+ const type = specifierNode.type;
+
+ if (type === "ImportSpecifier" || type === "ImportDefaultSpecifier") {
+ const key =
+ type === "ImportDefaultSpecifier"
+ ? "default"
+ : specifierNode.imported.type === "Identifier"
+ ? specifierNode.imported.name
+ : specifierNode.imported.value;
+ if (!has(traceMap, key)) {
+ return
+ }
+
+ path = path.concat(key); //eslint-disable-line no-param-reassign
+ const nextTraceMap = traceMap[key];
+ if (nextTraceMap[READ]) {
+ yield {
+ node: /** @type {RuleNode} */ (specifierNode),
+ path,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+ yield* this._iterateVariableReferences(
+ /** @type {Variable} */ (
+ findVariable(this.globalScope, specifierNode.local)
+ ),
+ path,
+ nextTraceMap,
+ false,
+ );
+
+ return
+ }
+
+ if (type === "ImportNamespaceSpecifier") {
+ yield* this._iterateVariableReferences(
+ /** @type {Variable} */ (
+ findVariable(this.globalScope, specifierNode.local)
+ ),
+ path,
+ traceMap,
+ false,
+ );
+ return
+ }
+
+ if (type === "ExportSpecifier") {
+ const key =
+ specifierNode.local.type === "Identifier"
+ ? specifierNode.local.name
+ : specifierNode.local.value;
+ if (!has(traceMap, key)) {
+ return
+ }
+
+ path = path.concat(key); //eslint-disable-line no-param-reassign
+ const nextTraceMap = traceMap[key];
+ if (nextTraceMap[READ]) {
+ yield {
+ node: /** @type {RuleNode} */ (specifierNode),
+ path,
+ type: READ,
+ info: nextTraceMap[READ],
+ };
+ }
+ }
+ }
+}
+
+ReferenceTracker.READ = READ;
+ReferenceTracker.CALL = CALL;
+ReferenceTracker.CONSTRUCT = CONSTRUCT;
+ReferenceTracker.ESM = ESM;
+
+/**
+ * This is a predicate function for Array#filter.
+ * @param {string} name A name part.
+ * @param {number} index The index of the name.
+ * @returns {boolean} `false` if it's default.
+ */
+function exceptDefault(name, index) {
+ return !(index === 1 && name === "default")
+}
+
+/** @typedef {import("./types.mjs").StaticValue} StaticValue */
+
+var index = {
+ CALL,
+ CONSTRUCT,
+ ESM,
+ findVariable,
+ getFunctionHeadLocation,
+ getFunctionNameWithKind,
+ getInnermostScope,
+ getPropertyName,
+ getStaticValue,
+ getStringIfConstant,
+ hasSideEffect,
+ isArrowToken,
+ isClosingBraceToken,
+ isClosingBracketToken,
+ isClosingParenToken,
+ isColonToken,
+ isCommaToken,
+ isCommentToken,
+ isNotArrowToken,
+ isNotClosingBraceToken,
+ isNotClosingBracketToken,
+ isNotClosingParenToken,
+ isNotColonToken,
+ isNotCommaToken,
+ isNotCommentToken,
+ isNotOpeningBraceToken,
+ isNotOpeningBracketToken,
+ isNotOpeningParenToken,
+ isNotSemicolonToken,
+ isOpeningBraceToken,
+ isOpeningBracketToken,
+ isOpeningParenToken,
+ isParenthesized,
+ isSemicolonToken,
+ PatternMatcher,
+ READ,
+ ReferenceTracker,
+};
+
+export { CALL, CONSTRUCT, ESM, PatternMatcher, READ, ReferenceTracker, index as default, findVariable, getFunctionHeadLocation, getFunctionNameWithKind, getInnermostScope, getPropertyName, getStaticValue, getStringIfConstant, hasSideEffect, isArrowToken, isClosingBraceToken, isClosingBracketToken, isClosingParenToken, isColonToken, isCommaToken, isCommentToken, isNotArrowToken, isNotClosingBraceToken, isNotClosingBracketToken, isNotClosingParenToken, isNotColonToken, isNotCommaToken, isNotCommentToken, isNotOpeningBraceToken, isNotOpeningBracketToken, isNotOpeningParenToken, isNotSemicolonToken, isOpeningBraceToken, isOpeningBracketToken, isOpeningParenToken, isParenthesized, isSemicolonToken };
+//# sourceMappingURL=index.mjs.map
diff --git a/slider/node_modules/@eslint-community/eslint-utils/index.mjs.map b/slider/node_modules/@eslint-community/eslint-utils/index.mjs.map
new file mode 100644
index 0000000..51eeeb1
--- /dev/null
+++ b/slider/node_modules/@eslint-community/eslint-utils/index.mjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.mjs","sources":["src/get-innermost-scope.mjs","src/find-variable.mjs","src/token-predicate.mjs","src/get-function-head-location.mjs","src/get-static-value.mjs","src/get-string-if-constant.mjs","src/get-property-name.mjs","src/get-function-name-with-kind.mjs","src/has-side-effect.mjs","src/is-parenthesized.mjs","src/pattern-matcher.mjs","src/reference-tracker.mjs","src/index.mjs"],"sourcesContent":["/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"estree\").Node} Node */\n\n/**\n * Get the innermost scope which contains a given location.\n * @param {Scope} initialScope The initial scope to search.\n * @param {Node} node The location to search.\n * @returns {Scope} The innermost scope.\n */\nexport function getInnermostScope(initialScope, node) {\n const location = /** @type {[number, number]} */ (node.range)[0]\n\n let scope = initialScope\n let found = false\n do {\n found = false\n for (const childScope of scope.childScopes) {\n const range = /** @type {[number, number]} */ (\n childScope.block.range\n )\n\n if (range[0] <= location && location < range[1]) {\n scope = childScope\n found = true\n break\n }\n }\n } while (found)\n\n return scope\n}\n","import { getInnermostScope } from \"./get-innermost-scope.mjs\"\n/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"eslint\").Scope.Variable} Variable */\n/** @typedef {import(\"estree\").Identifier} Identifier */\n\n/**\n * Find the variable of a given name.\n * @param {Scope} initialScope The scope to start finding.\n * @param {string|Identifier} nameOrNode The variable name to find. If this is a Node object then it should be an Identifier node.\n * @returns {Variable|null} The found variable or null.\n */\nexport function findVariable(initialScope, nameOrNode) {\n let name = \"\"\n /** @type {Scope|null} */\n let scope = initialScope\n\n if (typeof nameOrNode === \"string\") {\n name = nameOrNode\n } else {\n name = nameOrNode.name\n scope = getInnermostScope(scope, nameOrNode)\n }\n\n while (scope != null) {\n const variable = scope.set.get(name)\n if (variable != null) {\n return variable\n }\n scope = scope.upper\n }\n\n return null\n}\n","/** @typedef {import(\"eslint\").AST.Token} Token */\n/** @typedef {import(\"estree\").Comment} Comment */\n/** @typedef {import(\"./types.mjs\").ArrowToken} ArrowToken */\n/** @typedef {import(\"./types.mjs\").CommaToken} CommaToken */\n/** @typedef {import(\"./types.mjs\").SemicolonToken} SemicolonToken */\n/** @typedef {import(\"./types.mjs\").ColonToken} ColonToken */\n/** @typedef {import(\"./types.mjs\").OpeningParenToken} OpeningParenToken */\n/** @typedef {import(\"./types.mjs\").ClosingParenToken} ClosingParenToken */\n/** @typedef {import(\"./types.mjs\").OpeningBracketToken} OpeningBracketToken */\n/** @typedef {import(\"./types.mjs\").ClosingBracketToken} ClosingBracketToken */\n/** @typedef {import(\"./types.mjs\").OpeningBraceToken} OpeningBraceToken */\n/** @typedef {import(\"./types.mjs\").ClosingBraceToken} ClosingBraceToken */\n/**\n * @template {string} Value\n * @typedef {import(\"./types.mjs\").PunctuatorToken} PunctuatorToken\n */\n\n/** @typedef {Comment | Token} CommentOrToken */\n\n/**\n * Creates the negate function of the given function.\n * @param {function(CommentOrToken):boolean} f - The function to negate.\n * @returns {function(CommentOrToken):boolean} Negated function.\n */\nfunction negate(f) {\n return (token) => !f(token)\n}\n\n/**\n * Checks if the given token is a PunctuatorToken with the given value\n * @template {string} Value\n * @param {CommentOrToken} token - The token to check.\n * @param {Value} value - The value to check.\n * @returns {token is PunctuatorToken} `true` if the token is a PunctuatorToken with the given value.\n */\nfunction isPunctuatorTokenWithValue(token, value) {\n return token.type === \"Punctuator\" && token.value === value\n}\n\n/**\n * Checks if the given token is an arrow token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is ArrowToken} `true` if the token is an arrow token.\n */\nexport function isArrowToken(token) {\n return isPunctuatorTokenWithValue(token, \"=>\")\n}\n\n/**\n * Checks if the given token is a comma token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is CommaToken} `true` if the token is a comma token.\n */\nexport function isCommaToken(token) {\n return isPunctuatorTokenWithValue(token, \",\")\n}\n\n/**\n * Checks if the given token is a semicolon token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is SemicolonToken} `true` if the token is a semicolon token.\n */\nexport function isSemicolonToken(token) {\n return isPunctuatorTokenWithValue(token, \";\")\n}\n\n/**\n * Checks if the given token is a colon token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is ColonToken} `true` if the token is a colon token.\n */\nexport function isColonToken(token) {\n return isPunctuatorTokenWithValue(token, \":\")\n}\n\n/**\n * Checks if the given token is an opening parenthesis token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is OpeningParenToken} `true` if the token is an opening parenthesis token.\n */\nexport function isOpeningParenToken(token) {\n return isPunctuatorTokenWithValue(token, \"(\")\n}\n\n/**\n * Checks if the given token is a closing parenthesis token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is ClosingParenToken} `true` if the token is a closing parenthesis token.\n */\nexport function isClosingParenToken(token) {\n return isPunctuatorTokenWithValue(token, \")\")\n}\n\n/**\n * Checks if the given token is an opening square bracket token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is OpeningBracketToken} `true` if the token is an opening square bracket token.\n */\nexport function isOpeningBracketToken(token) {\n return isPunctuatorTokenWithValue(token, \"[\")\n}\n\n/**\n * Checks if the given token is a closing square bracket token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is ClosingBracketToken} `true` if the token is a closing square bracket token.\n */\nexport function isClosingBracketToken(token) {\n return isPunctuatorTokenWithValue(token, \"]\")\n}\n\n/**\n * Checks if the given token is an opening brace token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is OpeningBraceToken} `true` if the token is an opening brace token.\n */\nexport function isOpeningBraceToken(token) {\n return isPunctuatorTokenWithValue(token, \"{\")\n}\n\n/**\n * Checks if the given token is a closing brace token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is ClosingBraceToken} `true` if the token is a closing brace token.\n */\nexport function isClosingBraceToken(token) {\n return isPunctuatorTokenWithValue(token, \"}\")\n}\n\n/**\n * Checks if the given token is a comment token or not.\n * @param {CommentOrToken} token - The token to check.\n * @returns {token is Comment} `true` if the token is a comment token.\n */\nexport function isCommentToken(token) {\n return [\"Block\", \"Line\", \"Shebang\"].includes(token.type)\n}\n\nexport const isNotArrowToken = negate(isArrowToken)\nexport const isNotCommaToken = negate(isCommaToken)\nexport const isNotSemicolonToken = negate(isSemicolonToken)\nexport const isNotColonToken = negate(isColonToken)\nexport const isNotOpeningParenToken = negate(isOpeningParenToken)\nexport const isNotClosingParenToken = negate(isClosingParenToken)\nexport const isNotOpeningBracketToken = negate(isOpeningBracketToken)\nexport const isNotClosingBracketToken = negate(isClosingBracketToken)\nexport const isNotOpeningBraceToken = negate(isOpeningBraceToken)\nexport const isNotClosingBraceToken = negate(isClosingBraceToken)\nexport const isNotCommentToken = negate(isCommentToken)\n","import { isArrowToken, isOpeningParenToken } from \"./token-predicate.mjs\"\n/** @typedef {import(\"eslint\").Rule.Node} RuleNode */\n/** @typedef {import(\"eslint\").SourceCode} SourceCode */\n/** @typedef {import(\"eslint\").AST.Token} Token */\n/** @typedef {import(\"estree\").Function} FunctionNode */\n/** @typedef {import(\"estree\").FunctionDeclaration} FunctionDeclaration */\n/** @typedef {import(\"estree\").FunctionExpression} FunctionExpression */\n/** @typedef {import(\"estree\").SourceLocation} SourceLocation */\n/** @typedef {import(\"estree\").Position} Position */\n\n/**\n * Get the `(` token of the given function node.\n * @param {FunctionExpression | FunctionDeclaration} node - The function node to get.\n * @param {SourceCode} sourceCode - The source code object to get tokens.\n * @returns {Token} `(` token.\n */\nfunction getOpeningParenOfParams(node, sourceCode) {\n return node.id\n ? /** @type {Token} */ (\n sourceCode.getTokenAfter(node.id, isOpeningParenToken)\n )\n : /** @type {Token} */ (\n sourceCode.getFirstToken(node, isOpeningParenToken)\n )\n}\n\n/**\n * Get the location of the given function node for reporting.\n * @param {FunctionNode} node - The function node to get.\n * @param {SourceCode} sourceCode - The source code object to get tokens.\n * @returns {SourceLocation|null} The location of the function node for reporting.\n */\nexport function getFunctionHeadLocation(node, sourceCode) {\n const parent = /** @type {RuleNode} */ (node).parent\n\n /** @type {Position|null} */\n let start = null\n /** @type {Position|null} */\n let end = null\n\n if (node.type === \"ArrowFunctionExpression\") {\n const arrowToken = /** @type {Token} */ (\n sourceCode.getTokenBefore(node.body, isArrowToken)\n )\n\n start = arrowToken.loc.start\n end = arrowToken.loc.end\n } else if (\n parent.type === \"Property\" ||\n parent.type === \"MethodDefinition\" ||\n parent.type === \"PropertyDefinition\"\n ) {\n start = /** @type {SourceLocation} */ (parent.loc).start\n end = getOpeningParenOfParams(node, sourceCode).loc.start\n } else {\n start = /** @type {SourceLocation} */ (node.loc).start\n end = getOpeningParenOfParams(node, sourceCode).loc.start\n }\n\n return {\n start: { ...start },\n end: { ...end },\n }\n}\n","/* globals globalThis, global, self, window */\n\nimport { findVariable } from \"./find-variable.mjs\"\n/** @typedef {import(\"./types.mjs\").StaticValue} StaticValue */\n/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"eslint\").Scope.Variable} Variable */\n/** @typedef {import(\"estree\").Node} Node */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.Node} TSESTreeNode */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.AST_NODE_TYPES} TSESTreeNodeTypes */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.MemberExpression} MemberExpression */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.Property} Property */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.RegExpLiteral} RegExpLiteral */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.BigIntLiteral} BigIntLiteral */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.Literal} Literal */\n\nconst globalObject =\n typeof globalThis !== \"undefined\"\n ? globalThis\n : // @ts-ignore\n typeof self !== \"undefined\"\n ? // @ts-ignore\n self\n : // @ts-ignore\n typeof window !== \"undefined\"\n ? // @ts-ignore\n window\n : typeof global !== \"undefined\"\n ? global\n : {}\n\nconst builtinNames = Object.freeze(\n new Set([\n \"Array\",\n \"ArrayBuffer\",\n \"BigInt\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n \"Boolean\",\n \"DataView\",\n \"Date\",\n \"decodeURI\",\n \"decodeURIComponent\",\n \"encodeURI\",\n \"encodeURIComponent\",\n \"escape\",\n \"Float32Array\",\n \"Float64Array\",\n \"Function\",\n \"Infinity\",\n \"Int16Array\",\n \"Int32Array\",\n \"Int8Array\",\n \"isFinite\",\n \"isNaN\",\n \"isPrototypeOf\",\n \"JSON\",\n \"Map\",\n \"Math\",\n \"NaN\",\n \"Number\",\n \"Object\",\n \"parseFloat\",\n \"parseInt\",\n \"Promise\",\n \"Proxy\",\n \"Reflect\",\n \"RegExp\",\n \"Set\",\n \"String\",\n \"Symbol\",\n \"Uint16Array\",\n \"Uint32Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"undefined\",\n \"unescape\",\n \"WeakMap\",\n \"WeakSet\",\n ]),\n)\nconst callAllowed = new Set(\n [\n Array.isArray,\n Array.of,\n Array.prototype.at,\n Array.prototype.concat,\n Array.prototype.entries,\n Array.prototype.every,\n Array.prototype.filter,\n Array.prototype.find,\n Array.prototype.findIndex,\n Array.prototype.flat,\n Array.prototype.includes,\n Array.prototype.indexOf,\n Array.prototype.join,\n Array.prototype.keys,\n Array.prototype.lastIndexOf,\n Array.prototype.slice,\n Array.prototype.some,\n Array.prototype.toString,\n Array.prototype.values,\n typeof BigInt === \"function\" ? BigInt : undefined,\n Boolean,\n Date,\n Date.parse,\n decodeURI,\n decodeURIComponent,\n encodeURI,\n encodeURIComponent,\n escape,\n isFinite,\n isNaN,\n // @ts-ignore\n isPrototypeOf,\n Map,\n Map.prototype.entries,\n Map.prototype.get,\n Map.prototype.has,\n Map.prototype.keys,\n Map.prototype.values,\n .../** @type {(keyof typeof Math)[]} */ (\n Object.getOwnPropertyNames(Math)\n )\n .filter((k) => k !== \"random\")\n .map((k) => Math[k])\n .filter((f) => typeof f === \"function\"),\n Number,\n Number.isFinite,\n Number.isNaN,\n Number.parseFloat,\n Number.parseInt,\n Number.prototype.toExponential,\n Number.prototype.toFixed,\n Number.prototype.toPrecision,\n Number.prototype.toString,\n Object,\n Object.entries,\n Object.is,\n Object.isExtensible,\n Object.isFrozen,\n Object.isSealed,\n Object.keys,\n Object.values,\n parseFloat,\n parseInt,\n RegExp,\n Set,\n Set.prototype.entries,\n Set.prototype.has,\n Set.prototype.keys,\n Set.prototype.values,\n String,\n String.fromCharCode,\n String.fromCodePoint,\n String.raw,\n String.prototype.at,\n String.prototype.charAt,\n String.prototype.charCodeAt,\n String.prototype.codePointAt,\n String.prototype.concat,\n String.prototype.endsWith,\n String.prototype.includes,\n String.prototype.indexOf,\n String.prototype.lastIndexOf,\n String.prototype.normalize,\n String.prototype.padEnd,\n String.prototype.padStart,\n String.prototype.slice,\n String.prototype.startsWith,\n String.prototype.substr,\n String.prototype.substring,\n String.prototype.toLowerCase,\n String.prototype.toString,\n String.prototype.toUpperCase,\n String.prototype.trim,\n String.prototype.trimEnd,\n String.prototype.trimLeft,\n String.prototype.trimRight,\n String.prototype.trimStart,\n Symbol.for,\n Symbol.keyFor,\n unescape,\n ].filter((f) => typeof f === \"function\"),\n)\nconst callPassThrough = new Set([\n Object.freeze,\n Object.preventExtensions,\n Object.seal,\n])\n\n/** @type {ReadonlyArray]>} */\nconst getterAllowed = [\n [Map, new Set([\"size\"])],\n [\n RegExp,\n new Set([\n \"dotAll\",\n \"flags\",\n \"global\",\n \"hasIndices\",\n \"ignoreCase\",\n \"multiline\",\n \"source\",\n \"sticky\",\n \"unicode\",\n ]),\n ],\n [Set, new Set([\"size\"])],\n]\n\n/**\n * Get the property descriptor.\n * @param {object} object The object to get.\n * @param {string|number|symbol} name The property name to get.\n */\nfunction getPropertyDescriptor(object, name) {\n let x = object\n while ((typeof x === \"object\" || typeof x === \"function\") && x !== null) {\n const d = Object.getOwnPropertyDescriptor(x, name)\n if (d) {\n return d\n }\n x = Object.getPrototypeOf(x)\n }\n return null\n}\n\n/**\n * Check if a property is getter or not.\n * @param {object} object The object to check.\n * @param {string|number|symbol} name The property name to check.\n */\nfunction isGetter(object, name) {\n const d = getPropertyDescriptor(object, name)\n return d != null && d.get != null\n}\n\n/**\n * Get the element values of a given node list.\n * @param {(Node|TSESTreeNode|null)[]} nodeList The node list to get values.\n * @param {Scope|undefined|null} initialScope The initial scope to find variables.\n * @returns {any[]|null} The value list if all nodes are constant. Otherwise, null.\n */\nfunction getElementValues(nodeList, initialScope) {\n const valueList = []\n\n for (let i = 0; i < nodeList.length; ++i) {\n const elementNode = nodeList[i]\n\n if (elementNode == null) {\n valueList.length = i + 1\n } else if (elementNode.type === \"SpreadElement\") {\n const argument = getStaticValueR(elementNode.argument, initialScope)\n if (argument == null) {\n return null\n }\n valueList.push(.../** @type {Iterable} */ (argument.value))\n } else {\n const element = getStaticValueR(elementNode, initialScope)\n if (element == null) {\n return null\n }\n valueList.push(element.value)\n }\n }\n\n return valueList\n}\n\n/**\n * Checks if a variable is a built-in global.\n * @param {Variable|null} variable The variable to check.\n * @returns {variable is Variable & {defs:[]}}\n */\nfunction isBuiltinGlobal(variable) {\n return (\n variable != null &&\n variable.defs.length === 0 &&\n builtinNames.has(variable.name) &&\n variable.name in globalObject\n )\n}\n\n/**\n * Checks if a variable can be considered as a constant.\n * @param {Variable} variable\n * @returns {variable is Variable & {defs: [import(\"eslint\").Scope.Definition & { type: \"Variable\" }]}} True if the variable can be considered as a constant.\n */\nfunction canBeConsideredConst(variable) {\n if (variable.defs.length !== 1) {\n return false\n }\n const def = variable.defs[0]\n return Boolean(\n def.parent &&\n def.type === \"Variable\" &&\n (def.parent.kind === \"const\" || isEffectivelyConst(variable)),\n )\n}\n\n/**\n * Returns whether the given variable is never written to after initialization.\n * @param {Variable} variable\n * @returns {boolean}\n */\nfunction isEffectivelyConst(variable) {\n const refs = variable.references\n\n const inits = refs.filter((r) => r.init).length\n const reads = refs.filter((r) => r.isReadOnly()).length\n if (inits === 1 && reads + inits === refs.length) {\n // there is only one init and all other references only read\n return true\n }\n return false\n}\n\n/**\n * Checks if a variable has mutation in its property.\n * @param {Variable} variable The variable to check.\n * @param {Scope|null} initialScope The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.\n * @returns {boolean} True if the variable has mutation in its property.\n */\nfunction hasMutationInProperty(variable, initialScope) {\n for (const ref of variable.references) {\n let node = /** @type {TSESTreeNode} */ (ref.identifier)\n while (node && node.parent && node.parent.type === \"MemberExpression\") {\n node = node.parent\n }\n if (!node || !node.parent) {\n continue\n }\n if (\n (node.parent.type === \"AssignmentExpression\" &&\n node.parent.left === node) ||\n (node.parent.type === \"UpdateExpression\" &&\n node.parent.argument === node)\n ) {\n // This is a mutation.\n return true\n }\n if (\n node.parent.type === \"CallExpression\" &&\n node.parent.callee === node &&\n node.type === \"MemberExpression\"\n ) {\n const methodName = getStaticPropertyNameValue(node, initialScope)\n if (isNameOfMutationArrayMethod(methodName)) {\n // This is a mutation.\n return true\n }\n }\n }\n return false\n\n /**\n * Checks if a method name is one of the mutation array methods.\n * @param {StaticValue|null} methodName The method name to check.\n * @returns {boolean} True if the method name is a mutation array method.\n */\n function isNameOfMutationArrayMethod(methodName) {\n if (methodName == null || methodName.value == null) {\n return false\n }\n const name = methodName.value\n return (\n name === \"copyWithin\" ||\n name === \"fill\" ||\n name === \"pop\" ||\n name === \"push\" ||\n name === \"reverse\" ||\n name === \"shift\" ||\n name === \"sort\" ||\n name === \"splice\" ||\n name === \"unshift\"\n )\n }\n}\n\n/**\n * @template {TSESTreeNodeTypes} T\n * @callback VisitorCallback\n * @param {TSESTreeNode & { type: T }} node\n * @param {Scope|undefined|null} initialScope\n * @returns {StaticValue | null}\n */\n/**\n * @typedef { { [K in TSESTreeNodeTypes]?: VisitorCallback } } Operations\n */\n/**\n * @type {Operations}\n */\nconst operations = Object.freeze({\n ArrayExpression(node, initialScope) {\n const elements = getElementValues(node.elements, initialScope)\n return elements != null ? { value: elements } : null\n },\n\n AssignmentExpression(node, initialScope) {\n if (node.operator === \"=\") {\n return getStaticValueR(node.right, initialScope)\n }\n return null\n },\n\n //eslint-disable-next-line complexity\n BinaryExpression(node, initialScope) {\n if (node.operator === \"in\" || node.operator === \"instanceof\") {\n // Not supported.\n return null\n }\n\n const left = getStaticValueR(node.left, initialScope)\n const right = getStaticValueR(node.right, initialScope)\n if (left != null && right != null) {\n switch (node.operator) {\n case \"==\":\n return { value: left.value == right.value } //eslint-disable-line eqeqeq\n case \"!=\":\n return { value: left.value != right.value } //eslint-disable-line eqeqeq\n case \"===\":\n return { value: left.value === right.value }\n case \"!==\":\n return { value: left.value !== right.value }\n case \"<\":\n return {\n value:\n /** @type {any} */ (left.value) <\n /** @type {any} */ (right.value),\n }\n case \"<=\":\n return {\n value:\n /** @type {any} */ (left.value) <=\n /** @type {any} */ (right.value),\n }\n case \">\":\n return {\n value:\n /** @type {any} */ (left.value) >\n /** @type {any} */ (right.value),\n }\n case \">=\":\n return {\n value:\n /** @type {any} */ (left.value) >=\n /** @type {any} */ (right.value),\n }\n case \"<<\":\n return {\n value:\n /** @type {any} */ (left.value) <<\n /** @type {any} */ (right.value),\n }\n case \">>\":\n return {\n value:\n /** @type {any} */ (left.value) >>\n /** @type {any} */ (right.value),\n }\n case \">>>\":\n return {\n value:\n /** @type {any} */ (left.value) >>>\n /** @type {any} */ (right.value),\n }\n case \"+\":\n return {\n value:\n /** @type {any} */ (left.value) +\n /** @type {any} */ (right.value),\n }\n case \"-\":\n return {\n value:\n /** @type {any} */ (left.value) -\n /** @type {any} */ (right.value),\n }\n case \"*\":\n return {\n value:\n /** @type {any} */ (left.value) *\n /** @type {any} */ (right.value),\n }\n case \"/\":\n return {\n value:\n /** @type {any} */ (left.value) /\n /** @type {any} */ (right.value),\n }\n case \"%\":\n return {\n value:\n /** @type {any} */ (left.value) %\n /** @type {any} */ (right.value),\n }\n case \"**\":\n return {\n value:\n /** @type {any} */ (left.value) **\n /** @type {any} */ (right.value),\n }\n case \"|\":\n return {\n value:\n /** @type {any} */ (left.value) |\n /** @type {any} */ (right.value),\n }\n case \"^\":\n return {\n value:\n /** @type {any} */ (left.value) ^\n /** @type {any} */ (right.value),\n }\n case \"&\":\n return {\n value:\n /** @type {any} */ (left.value) &\n /** @type {any} */ (right.value),\n }\n\n // no default\n }\n }\n\n return null\n },\n\n CallExpression(node, initialScope) {\n const calleeNode = node.callee\n const args = getElementValues(node.arguments, initialScope)\n\n if (args != null) {\n if (calleeNode.type === \"MemberExpression\") {\n if (calleeNode.property.type === \"PrivateIdentifier\") {\n return null\n }\n const object = getStaticValueR(calleeNode.object, initialScope)\n if (object != null) {\n if (\n object.value == null &&\n (object.optional || node.optional)\n ) {\n return { value: undefined, optional: true }\n }\n const property = getStaticPropertyNameValue(\n calleeNode,\n initialScope,\n )\n\n if (property != null) {\n const receiver =\n /** @type {Record any>} */ (\n object.value\n )\n const methodName = /** @type {PropertyKey} */ (\n property.value\n )\n if (callAllowed.has(receiver[methodName])) {\n return {\n value: receiver[methodName](...args),\n }\n }\n if (callPassThrough.has(receiver[methodName])) {\n return { value: args[0] }\n }\n }\n }\n } else {\n const callee = getStaticValueR(calleeNode, initialScope)\n if (callee != null) {\n if (callee.value == null && node.optional) {\n return { value: undefined, optional: true }\n }\n const func = /** @type {(...args: any[]) => any} */ (\n callee.value\n )\n if (callAllowed.has(func)) {\n return { value: func(...args) }\n }\n if (callPassThrough.has(func)) {\n return { value: args[0] }\n }\n }\n }\n }\n\n return null\n },\n\n ConditionalExpression(node, initialScope) {\n const test = getStaticValueR(node.test, initialScope)\n if (test != null) {\n return test.value\n ? getStaticValueR(node.consequent, initialScope)\n : getStaticValueR(node.alternate, initialScope)\n }\n return null\n },\n\n ExpressionStatement(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n\n Identifier(node, initialScope) {\n if (initialScope != null) {\n const variable = findVariable(initialScope, node)\n\n if (variable != null) {\n // Built-in globals.\n if (isBuiltinGlobal(variable)) {\n return { value: globalObject[variable.name] }\n }\n\n // Constants.\n if (canBeConsideredConst(variable)) {\n const def = variable.defs[0]\n if (\n // TODO(mysticatea): don't support destructuring here.\n def.node.id.type === \"Identifier\"\n ) {\n const init = getStaticValueR(\n def.node.init,\n initialScope,\n )\n if (\n init &&\n typeof init.value === \"object\" &&\n init.value !== null\n ) {\n if (hasMutationInProperty(variable, initialScope)) {\n // This variable has mutation in its property.\n return null\n }\n }\n return init\n }\n }\n }\n }\n return null\n },\n\n Literal(node) {\n const literal =\n /** @type {Partial & Partial & Partial} */ (\n node\n )\n //istanbul ignore if : this is implementation-specific behavior.\n if (\n (literal.regex != null || literal.bigint != null) &&\n literal.value == null\n ) {\n // It was a RegExp/BigInt literal, but Node.js didn't support it.\n return null\n }\n return { value: literal.value }\n },\n\n LogicalExpression(node, initialScope) {\n const left = getStaticValueR(node.left, initialScope)\n if (left != null) {\n if (\n (node.operator === \"||\" && Boolean(left.value) === true) ||\n (node.operator === \"&&\" && Boolean(left.value) === false) ||\n (node.operator === \"??\" && left.value != null)\n ) {\n return left\n }\n\n const right = getStaticValueR(node.right, initialScope)\n if (right != null) {\n return right\n }\n }\n\n return null\n },\n\n MemberExpression(node, initialScope) {\n if (node.property.type === \"PrivateIdentifier\") {\n return null\n }\n const object = getStaticValueR(node.object, initialScope)\n if (object != null) {\n if (object.value == null && (object.optional || node.optional)) {\n return { value: undefined, optional: true }\n }\n const property = getStaticPropertyNameValue(node, initialScope)\n\n if (property != null) {\n if (\n !isGetter(\n /** @type {object} */ (object.value),\n /** @type {PropertyKey} */ (property.value),\n )\n ) {\n return {\n value: /** @type {Record} */ (\n object.value\n )[/** @type {PropertyKey} */ (property.value)],\n }\n }\n\n for (const [classFn, allowed] of getterAllowed) {\n if (\n object.value instanceof classFn &&\n allowed.has(/** @type {string} */ (property.value))\n ) {\n return {\n value: /** @type {Record} */ (\n object.value\n )[/** @type {PropertyKey} */ (property.value)],\n }\n }\n }\n }\n }\n return null\n },\n\n ChainExpression(node, initialScope) {\n const expression = getStaticValueR(node.expression, initialScope)\n if (expression != null) {\n return { value: expression.value }\n }\n return null\n },\n\n NewExpression(node, initialScope) {\n const callee = getStaticValueR(node.callee, initialScope)\n const args = getElementValues(node.arguments, initialScope)\n\n if (callee != null && args != null) {\n const Func = /** @type {new (...args: any[]) => any} */ (\n callee.value\n )\n if (callAllowed.has(Func)) {\n return { value: new Func(...args) }\n }\n }\n\n return null\n },\n\n ObjectExpression(node, initialScope) {\n /** @type {Record} */\n const object = {}\n\n for (const propertyNode of node.properties) {\n if (propertyNode.type === \"Property\") {\n if (propertyNode.kind !== \"init\") {\n return null\n }\n const key = getStaticPropertyNameValue(\n propertyNode,\n initialScope,\n )\n const value = getStaticValueR(propertyNode.value, initialScope)\n if (key == null || value == null) {\n return null\n }\n object[/** @type {PropertyKey} */ (key.value)] = value.value\n } else if (\n propertyNode.type === \"SpreadElement\" ||\n // @ts-expect-error -- Backward compatibility\n propertyNode.type === \"ExperimentalSpreadProperty\"\n ) {\n const argument = getStaticValueR(\n propertyNode.argument,\n initialScope,\n )\n if (argument == null) {\n return null\n }\n Object.assign(object, argument.value)\n } else {\n return null\n }\n }\n\n return { value: object }\n },\n\n SequenceExpression(node, initialScope) {\n const last = node.expressions[node.expressions.length - 1]\n return getStaticValueR(last, initialScope)\n },\n\n TaggedTemplateExpression(node, initialScope) {\n const tag = getStaticValueR(node.tag, initialScope)\n const expressions = getElementValues(\n node.quasi.expressions,\n initialScope,\n )\n\n if (tag != null && expressions != null) {\n const func = /** @type {(...args: any[]) => any} */ (tag.value)\n /** @type {any[] & { raw?: string[] }} */\n const strings = node.quasi.quasis.map((q) => q.value.cooked)\n strings.raw = node.quasi.quasis.map((q) => q.value.raw)\n\n if (func === String.raw) {\n return { value: func(strings, ...expressions) }\n }\n }\n\n return null\n },\n\n TemplateLiteral(node, initialScope) {\n const expressions = getElementValues(node.expressions, initialScope)\n if (expressions != null) {\n let value = node.quasis[0].value.cooked\n for (let i = 0; i < expressions.length; ++i) {\n value += expressions[i]\n value += /** @type {string} */ (node.quasis[i + 1].value.cooked)\n }\n return { value }\n }\n return null\n },\n\n UnaryExpression(node, initialScope) {\n if (node.operator === \"delete\") {\n // Not supported.\n return null\n }\n if (node.operator === \"void\") {\n return { value: undefined }\n }\n\n const arg = getStaticValueR(node.argument, initialScope)\n if (arg != null) {\n switch (node.operator) {\n case \"-\":\n return { value: -(/** @type {any} */ (arg.value)) }\n case \"+\":\n return { value: +(/** @type {any} */ (arg.value)) } //eslint-disable-line no-implicit-coercion\n case \"!\":\n return { value: !arg.value }\n case \"~\":\n return { value: ~(/** @type {any} */ (arg.value)) }\n case \"typeof\":\n return { value: typeof arg.value }\n\n // no default\n }\n }\n\n return null\n },\n TSAsExpression(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n TSSatisfiesExpression(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n TSTypeAssertion(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n TSNonNullExpression(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n TSInstantiationExpression(node, initialScope) {\n return getStaticValueR(node.expression, initialScope)\n },\n})\n\n/**\n * Get the value of a given node if it's a static value.\n * @param {Node|TSESTreeNode|null|undefined} node The node to get.\n * @param {Scope|undefined|null} initialScope The scope to start finding variable.\n * @returns {StaticValue|null} The static value of the node, or `null`.\n */\nfunction getStaticValueR(node, initialScope) {\n if (node != null && Object.hasOwnProperty.call(operations, node.type)) {\n return /** @type {VisitorCallback} */ (operations[node.type])(\n /** @type {TSESTreeNode} */ (node),\n initialScope,\n )\n }\n return null\n}\n\n/**\n * Get the static value of property name from a MemberExpression node or a Property node.\n * @param {MemberExpression|Property} node The node to get.\n * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.\n * @returns {StaticValue|null} The static value of the property name of the node, or `null`.\n */\nfunction getStaticPropertyNameValue(node, initialScope) {\n const nameNode = node.type === \"Property\" ? node.key : node.property\n\n if (node.computed) {\n return getStaticValueR(nameNode, initialScope)\n }\n\n if (nameNode.type === \"Identifier\") {\n return { value: nameNode.name }\n }\n\n if (nameNode.type === \"Literal\") {\n if (/** @type {Partial} */ (nameNode).bigint) {\n return { value: /** @type {BigIntLiteral} */ (nameNode).bigint }\n }\n return { value: String(nameNode.value) }\n }\n\n return null\n}\n\n/**\n * Get the value of a given node if it's a static value.\n * @param {Node} node The node to get.\n * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If this scope was given, this tries to resolve identifier references which are in the given node as much as possible.\n * @returns {StaticValue | null} The static value of the node, or `null`.\n */\nexport function getStaticValue(node, initialScope = null) {\n try {\n return getStaticValueR(node, initialScope)\n } catch (_error) {\n return null\n }\n}\n","import { getStaticValue } from \"./get-static-value.mjs\"\n/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"estree\").Node} Node */\n/** @typedef {import(\"estree\").RegExpLiteral} RegExpLiteral */\n/** @typedef {import(\"estree\").BigIntLiteral} BigIntLiteral */\n/** @typedef {import(\"estree\").SimpleLiteral} SimpleLiteral */\n\n/**\n * Get the value of a given node if it's a literal or a template literal.\n * @param {Node} node The node to get.\n * @param {Scope|null} [initialScope] The scope to start finding variable. Optional. If the node is an Identifier node and this scope was given, this checks the variable of the identifier, and returns the value of it if the variable is a constant.\n * @returns {string|null} The value of the node, or `null`.\n */\nexport function getStringIfConstant(node, initialScope = null) {\n // Handle the literals that the platform doesn't support natively.\n if (node && node.type === \"Literal\" && node.value === null) {\n const literal =\n /** @type {Partial & Partial & Partial} */ (\n node\n )\n if (literal.regex) {\n return `/${literal.regex.pattern}/${literal.regex.flags}`\n }\n if (literal.bigint) {\n return literal.bigint\n }\n }\n\n const evaluated = getStaticValue(node, initialScope)\n\n if (evaluated) {\n // `String(Symbol.prototype)` throws error\n try {\n return String(evaluated.value)\n } catch {\n // No op\n }\n }\n\n return null\n}\n","import { getStringIfConstant } from \"./get-string-if-constant.mjs\"\n/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"estree\").MemberExpression} MemberExpression */\n/** @typedef {import(\"estree\").MethodDefinition} MethodDefinition */\n/** @typedef {import(\"estree\").Property} Property */\n/** @typedef {import(\"estree\").PropertyDefinition} PropertyDefinition */\n/** @typedef {import(\"estree\").Identifier} Identifier */\n\n/**\n * Get the property name from a MemberExpression node or a Property node.\n * @param {MemberExpression | MethodDefinition | Property | PropertyDefinition} node The node to get.\n * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.\n * @returns {string|null|undefined} The property name of the node.\n */\nexport function getPropertyName(node, initialScope) {\n switch (node.type) {\n case \"MemberExpression\":\n if (node.computed) {\n return getStringIfConstant(node.property, initialScope)\n }\n if (node.property.type === \"PrivateIdentifier\") {\n return null\n }\n return /** @type {Partial} */ (node.property).name\n\n case \"Property\":\n case \"MethodDefinition\":\n case \"PropertyDefinition\":\n if (node.computed) {\n return getStringIfConstant(node.key, initialScope)\n }\n if (node.key.type === \"Literal\") {\n return String(node.key.value)\n }\n if (node.key.type === \"PrivateIdentifier\") {\n return null\n }\n return /** @type {Partial} */ (node.key).name\n\n default:\n break\n }\n\n return null\n}\n","import { getPropertyName } from \"./get-property-name.mjs\"\n/** @typedef {import(\"eslint\").Rule.Node} RuleNode */\n/** @typedef {import(\"eslint\").SourceCode} SourceCode */\n/** @typedef {import(\"estree\").Function} FunctionNode */\n/** @typedef {import(\"estree\").FunctionDeclaration} FunctionDeclaration */\n/** @typedef {import(\"estree\").FunctionExpression} FunctionExpression */\n/** @typedef {import(\"estree\").Identifier} Identifier */\n\n/**\n * Get the name and kind of the given function node.\n * @param {FunctionNode} node - The function node to get.\n * @param {SourceCode} [sourceCode] The source code object to get the code of computed property keys.\n * @returns {string} The name and kind of the function node.\n */\n// eslint-disable-next-line complexity\nexport function getFunctionNameWithKind(node, sourceCode) {\n const parent = /** @type {RuleNode} */ (node).parent\n const tokens = []\n const isObjectMethod = parent.type === \"Property\" && parent.value === node\n const isClassMethod =\n parent.type === \"MethodDefinition\" && parent.value === node\n const isClassFieldMethod =\n parent.type === \"PropertyDefinition\" && parent.value === node\n\n // Modifiers.\n if (isClassMethod || isClassFieldMethod) {\n if (parent.static) {\n tokens.push(\"static\")\n }\n if (parent.key.type === \"PrivateIdentifier\") {\n tokens.push(\"private\")\n }\n }\n if (node.async) {\n tokens.push(\"async\")\n }\n if (node.generator) {\n tokens.push(\"generator\")\n }\n\n // Kinds.\n if (isObjectMethod || isClassMethod) {\n if (parent.kind === \"constructor\") {\n return \"constructor\"\n }\n if (parent.kind === \"get\") {\n tokens.push(\"getter\")\n } else if (parent.kind === \"set\") {\n tokens.push(\"setter\")\n } else {\n tokens.push(\"method\")\n }\n } else if (isClassFieldMethod) {\n tokens.push(\"method\")\n } else {\n if (node.type === \"ArrowFunctionExpression\") {\n tokens.push(\"arrow\")\n }\n tokens.push(\"function\")\n }\n\n // Names.\n if (isObjectMethod || isClassMethod || isClassFieldMethod) {\n if (parent.key.type === \"PrivateIdentifier\") {\n tokens.push(`#${parent.key.name}`)\n } else {\n const name = getPropertyName(parent)\n if (name) {\n tokens.push(`'${name}'`)\n } else if (sourceCode) {\n const keyText = sourceCode.getText(parent.key)\n if (!keyText.includes(\"\\n\")) {\n tokens.push(`[${keyText}]`)\n }\n }\n }\n } else if (hasId(node)) {\n tokens.push(`'${node.id.name}'`)\n } else if (\n parent.type === \"VariableDeclarator\" &&\n parent.id &&\n parent.id.type === \"Identifier\"\n ) {\n tokens.push(`'${parent.id.name}'`)\n } else if (\n (parent.type === \"AssignmentExpression\" ||\n parent.type === \"AssignmentPattern\") &&\n parent.left &&\n parent.left.type === \"Identifier\"\n ) {\n tokens.push(`'${parent.left.name}'`)\n } else if (\n parent.type === \"ExportDefaultDeclaration\" &&\n parent.declaration === node\n ) {\n tokens.push(\"'default'\")\n }\n\n return tokens.join(\" \")\n}\n\n/**\n * @param {FunctionNode} node\n * @returns {node is FunctionDeclaration | FunctionExpression & { id: Identifier }}\n */\nfunction hasId(node) {\n return Boolean(\n /** @type {Partial} */ (node)\n .id,\n )\n}\n","import { getKeys, KEYS } from \"eslint-visitor-keys\"\n/** @typedef {import(\"estree\").Node} Node */\n/** @typedef {import(\"eslint\").SourceCode} SourceCode */\n/** @typedef {import(\"./types.mjs\").HasSideEffectOptions} HasSideEffectOptions */\n/** @typedef {import(\"estree\").BinaryExpression} BinaryExpression */\n/** @typedef {import(\"estree\").MemberExpression} MemberExpression */\n/** @typedef {import(\"estree\").MethodDefinition} MethodDefinition */\n/** @typedef {import(\"estree\").Property} Property */\n/** @typedef {import(\"estree\").PropertyDefinition} PropertyDefinition */\n/** @typedef {import(\"estree\").UnaryExpression} UnaryExpression */\n\nconst typeConversionBinaryOps = Object.freeze(\n new Set([\n \"==\",\n \"!=\",\n \"<\",\n \"<=\",\n \">\",\n \">=\",\n \"<<\",\n \">>\",\n \">>>\",\n \"+\",\n \"-\",\n \"*\",\n \"/\",\n \"%\",\n \"|\",\n \"^\",\n \"&\",\n \"in\",\n ]),\n)\nconst typeConversionUnaryOps = Object.freeze(new Set([\"-\", \"+\", \"!\", \"~\"]))\n\n/**\n * Check whether the given value is an ASTNode or not.\n * @param {any} x The value to check.\n * @returns {x is Node} `true` if the value is an ASTNode.\n */\nfunction isNode(x) {\n return x !== null && typeof x === \"object\" && typeof x.type === \"string\"\n}\n\nconst visitor = Object.freeze(\n Object.assign(Object.create(null), {\n /**\n * @param {Node} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n $visit(node, options, visitorKeys) {\n const { type } = node\n\n if (typeof (/** @type {any} */ (this)[type]) === \"function\") {\n return /** @type {any} */ (this)[type](\n node,\n options,\n visitorKeys,\n )\n }\n\n return this.$visitChildren(node, options, visitorKeys)\n },\n\n /**\n * @param {Node} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n $visitChildren(node, options, visitorKeys) {\n const { type } = node\n\n for (const key of /** @type {(keyof Node)[]} */ (\n visitorKeys[type] || getKeys(node)\n )) {\n const value = node[key]\n\n if (Array.isArray(value)) {\n for (const element of value) {\n if (\n isNode(element) &&\n this.$visit(element, options, visitorKeys)\n ) {\n return true\n }\n }\n } else if (\n isNode(value) &&\n this.$visit(value, options, visitorKeys)\n ) {\n return true\n }\n }\n\n return false\n },\n\n ArrowFunctionExpression() {\n return false\n },\n AssignmentExpression() {\n return true\n },\n AwaitExpression() {\n return true\n },\n /**\n * @param {BinaryExpression} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n BinaryExpression(node, options, visitorKeys) {\n if (\n options.considerImplicitTypeConversion &&\n typeConversionBinaryOps.has(node.operator) &&\n (node.left.type !== \"Literal\" || node.right.type !== \"Literal\")\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n CallExpression() {\n return true\n },\n FunctionExpression() {\n return false\n },\n ImportExpression() {\n return true\n },\n /**\n * @param {MemberExpression} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n MemberExpression(node, options, visitorKeys) {\n if (options.considerGetters) {\n return true\n }\n if (\n options.considerImplicitTypeConversion &&\n node.computed &&\n node.property.type !== \"Literal\"\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n /**\n * @param {MethodDefinition} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n MethodDefinition(node, options, visitorKeys) {\n if (\n options.considerImplicitTypeConversion &&\n node.computed &&\n node.key.type !== \"Literal\"\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n NewExpression() {\n return true\n },\n /**\n * @param {Property} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n Property(node, options, visitorKeys) {\n if (\n options.considerImplicitTypeConversion &&\n node.computed &&\n node.key.type !== \"Literal\"\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n /**\n * @param {PropertyDefinition} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n PropertyDefinition(node, options, visitorKeys) {\n if (\n options.considerImplicitTypeConversion &&\n node.computed &&\n node.key.type !== \"Literal\"\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n /**\n * @param {UnaryExpression} node\n * @param {HasSideEffectOptions} options\n * @param {Record} visitorKeys\n */\n UnaryExpression(node, options, visitorKeys) {\n if (node.operator === \"delete\") {\n return true\n }\n if (\n options.considerImplicitTypeConversion &&\n typeConversionUnaryOps.has(node.operator) &&\n node.argument.type !== \"Literal\"\n ) {\n return true\n }\n return this.$visitChildren(node, options, visitorKeys)\n },\n UpdateExpression() {\n return true\n },\n YieldExpression() {\n return true\n },\n }),\n)\n\n/**\n * Check whether a given node has any side effect or not.\n * @param {Node} node The node to get.\n * @param {SourceCode} sourceCode The source code object.\n * @param {HasSideEffectOptions} [options] The option object.\n * @returns {boolean} `true` if the node has a certain side effect.\n */\nexport function hasSideEffect(node, sourceCode, options = {}) {\n const { considerGetters = false, considerImplicitTypeConversion = false } =\n options\n return visitor.$visit(\n node,\n { considerGetters, considerImplicitTypeConversion },\n sourceCode.visitorKeys || KEYS,\n )\n}\n","import { isClosingParenToken, isOpeningParenToken } from \"./token-predicate.mjs\"\n/** @typedef {import(\"estree\").Node} Node */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.NewExpression} TSNewExpression */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.CallExpression} TSCallExpression */\n/** @typedef {import(\"eslint\").SourceCode} SourceCode */\n/** @typedef {import(\"eslint\").AST.Token} Token */\n/** @typedef {import(\"eslint\").Rule.Node} RuleNode */\n\n/**\n * Get the left parenthesis of the parent node syntax if it exists.\n * E.g., `if (a) {}` then the `(`.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {Token|null} The left parenthesis of the parent node syntax\n */\n// eslint-disable-next-line complexity\nfunction getParentSyntaxParen(node, sourceCode) {\n const parent = /** @type {RuleNode} */ (node).parent\n\n switch (parent.type) {\n case \"CallExpression\":\n case \"NewExpression\":\n if (parent.arguments.length === 1 && parent.arguments[0] === node) {\n return sourceCode.getTokenAfter(\n // @ts-expect-error https://github.com/typescript-eslint/typescript-eslint/pull/5384\n parent.typeArguments ||\n /** @type {RuleNode} */ (\n /** @type {unknown} */ (\n /** @type {TSNewExpression | TSCallExpression} */ (\n parent\n ).typeParameters\n )\n ) ||\n parent.callee,\n isOpeningParenToken,\n )\n }\n return null\n\n case \"DoWhileStatement\":\n if (parent.test === node) {\n return sourceCode.getTokenAfter(\n parent.body,\n isOpeningParenToken,\n )\n }\n return null\n\n case \"IfStatement\":\n case \"WhileStatement\":\n if (parent.test === node) {\n return sourceCode.getFirstToken(parent, 1)\n }\n return null\n\n case \"ImportExpression\":\n if (parent.source === node) {\n return sourceCode.getFirstToken(parent, 1)\n }\n return null\n\n case \"SwitchStatement\":\n if (parent.discriminant === node) {\n return sourceCode.getFirstToken(parent, 1)\n }\n return null\n\n case \"WithStatement\":\n if (parent.object === node) {\n return sourceCode.getFirstToken(parent, 1)\n }\n return null\n\n default:\n return null\n }\n}\n\n/**\n * Check whether a given node is parenthesized or not.\n * @param {number} times The number of parantheses.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {boolean} `true` if the node is parenthesized the given times.\n */\n/**\n * Check whether a given node is parenthesized or not.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {boolean} `true` if the node is parenthesized.\n */\n/**\n * Check whether a given node is parenthesized or not.\n * @param {Node|number} timesOrNode The first parameter.\n * @param {Node|SourceCode} nodeOrSourceCode The second parameter.\n * @param {SourceCode} [optionalSourceCode] The third parameter.\n * @returns {boolean} `true` if the node is parenthesized.\n */\nexport function isParenthesized(\n timesOrNode,\n nodeOrSourceCode,\n optionalSourceCode,\n) {\n /** @type {number} */\n let times,\n /** @type {RuleNode} */\n node,\n /** @type {SourceCode} */\n sourceCode,\n maybeLeftParen,\n maybeRightParen\n if (typeof timesOrNode === \"number\") {\n times = timesOrNode | 0\n node = /** @type {RuleNode} */ (nodeOrSourceCode)\n sourceCode = /** @type {SourceCode} */ (optionalSourceCode)\n if (!(times >= 1)) {\n throw new TypeError(\"'times' should be a positive integer.\")\n }\n } else {\n times = 1\n node = /** @type {RuleNode} */ (timesOrNode)\n sourceCode = /** @type {SourceCode} */ (nodeOrSourceCode)\n }\n\n if (\n node == null ||\n // `Program` can't be parenthesized\n node.parent == null ||\n // `CatchClause.param` can't be parenthesized, example `try {} catch (error) {}`\n (node.parent.type === \"CatchClause\" && node.parent.param === node)\n ) {\n return false\n }\n\n maybeLeftParen = maybeRightParen = node\n do {\n maybeLeftParen = sourceCode.getTokenBefore(maybeLeftParen)\n maybeRightParen = sourceCode.getTokenAfter(maybeRightParen)\n } while (\n maybeLeftParen != null &&\n maybeRightParen != null &&\n isOpeningParenToken(maybeLeftParen) &&\n isClosingParenToken(maybeRightParen) &&\n // Avoid false positive such as `if (a) {}`\n maybeLeftParen !== getParentSyntaxParen(node, sourceCode) &&\n --times > 0\n )\n\n return times === 0\n}\n","/**\n * @author Toru Nagashima \n * See LICENSE file in root directory for full license.\n */\n\nconst placeholder = /\\$(?:[$&`']|[1-9][0-9]?)/gu\n\n/** @type {WeakMap} */\nconst internal = new WeakMap()\n\n/**\n * Check whether a given character is escaped or not.\n * @param {string} str The string to check.\n * @param {number} index The location of the character to check.\n * @returns {boolean} `true` if the character is escaped.\n */\nfunction isEscaped(str, index) {\n let escaped = false\n for (let i = index - 1; i >= 0 && str.charCodeAt(i) === 0x5c; --i) {\n escaped = !escaped\n }\n return escaped\n}\n\n/**\n * Replace a given string by a given matcher.\n * @param {PatternMatcher} matcher The pattern matcher.\n * @param {string} str The string to be replaced.\n * @param {string} replacement The new substring to replace each matched part.\n * @returns {string} The replaced string.\n */\nfunction replaceS(matcher, str, replacement) {\n const chunks = []\n let index = 0\n\n /**\n * @param {string} key The placeholder.\n * @param {RegExpExecArray} match The matched information.\n * @returns {string} The replaced string.\n */\n function replacer(key, match) {\n switch (key) {\n case \"$$\":\n return \"$\"\n case \"$&\":\n return match[0]\n case \"$`\":\n return str.slice(0, match.index)\n case \"$'\":\n return str.slice(match.index + match[0].length)\n default: {\n const i = key.slice(1)\n if (i in match) {\n return match[/** @type {any} */ (i)]\n }\n return key\n }\n }\n }\n\n for (const match of matcher.execAll(str)) {\n chunks.push(str.slice(index, match.index))\n chunks.push(\n replacement.replace(placeholder, (key) => replacer(key, match)),\n )\n index = match.index + match[0].length\n }\n chunks.push(str.slice(index))\n\n return chunks.join(\"\")\n}\n\n/**\n * Replace a given string by a given matcher.\n * @param {PatternMatcher} matcher The pattern matcher.\n * @param {string} str The string to be replaced.\n * @param {(substring: string, ...args: any[]) => string} replace The function to replace each matched part.\n * @returns {string} The replaced string.\n */\nfunction replaceF(matcher, str, replace) {\n const chunks = []\n let index = 0\n\n for (const match of matcher.execAll(str)) {\n chunks.push(str.slice(index, match.index))\n chunks.push(\n String(\n replace(\n .../** @type {[string, ...string[]]} */ (\n /** @type {string[]} */ (match)\n ),\n match.index,\n match.input,\n ),\n ),\n )\n index = match.index + match[0].length\n }\n chunks.push(str.slice(index))\n\n return chunks.join(\"\")\n}\n\n/**\n * The class to find patterns as considering escape sequences.\n */\nexport class PatternMatcher {\n /**\n * Initialize this matcher.\n * @param {RegExp} pattern The pattern to match.\n * @param {{escaped?:boolean}} [options] The options.\n */\n constructor(pattern, options = {}) {\n const { escaped = false } = options\n if (!(pattern instanceof RegExp)) {\n throw new TypeError(\"'pattern' should be a RegExp instance.\")\n }\n if (!pattern.flags.includes(\"g\")) {\n throw new Error(\"'pattern' should contains 'g' flag.\")\n }\n\n internal.set(this, {\n pattern: new RegExp(pattern.source, pattern.flags),\n escaped: Boolean(escaped),\n })\n }\n\n /**\n * Find the pattern in a given string.\n * @param {string} str The string to find.\n * @returns {IterableIterator} The iterator which iterate the matched information.\n */\n *execAll(str) {\n const { pattern, escaped } =\n /** @type {{pattern:RegExp,escaped:boolean}} */ (internal.get(this))\n let match = null\n let lastIndex = 0\n\n pattern.lastIndex = 0\n while ((match = pattern.exec(str)) != null) {\n if (escaped || !isEscaped(str, match.index)) {\n lastIndex = pattern.lastIndex\n yield match\n pattern.lastIndex = lastIndex\n }\n }\n }\n\n /**\n * Check whether the pattern is found in a given string.\n * @param {string} str The string to check.\n * @returns {boolean} `true` if the pattern was found in the string.\n */\n test(str) {\n const it = this.execAll(str)\n const ret = it.next()\n return !ret.done\n }\n\n /**\n * Replace a given string.\n * @param {string} str The string to be replaced.\n * @param {(string|((...strs:string[])=>string))} replacer The string or function to replace. This is the same as the 2nd argument of `String.prototype.replace`.\n * @returns {string} The replaced string.\n */\n [Symbol.replace](str, replacer) {\n return typeof replacer === \"function\"\n ? replaceF(this, String(str), replacer)\n : replaceS(this, String(str), String(replacer))\n }\n}\n","import { findVariable } from \"./find-variable.mjs\"\nimport { getPropertyName } from \"./get-property-name.mjs\"\nimport { getStringIfConstant } from \"./get-string-if-constant.mjs\"\n/** @typedef {import(\"eslint\").Scope.Scope} Scope */\n/** @typedef {import(\"eslint\").Scope.Variable} Variable */\n/** @typedef {import(\"eslint\").Rule.Node} RuleNode */\n/** @typedef {import(\"estree\").Node} Node */\n/** @typedef {import(\"estree\").Expression} Expression */\n/** @typedef {import(\"estree\").Pattern} Pattern */\n/** @typedef {import(\"estree\").Identifier} Identifier */\n/** @typedef {import(\"estree\").SimpleCallExpression} CallExpression */\n/** @typedef {import(\"estree\").Program} Program */\n/** @typedef {import(\"estree\").ImportDeclaration} ImportDeclaration */\n/** @typedef {import(\"estree\").ExportAllDeclaration} ExportAllDeclaration */\n/** @typedef {import(\"estree\").ExportDefaultDeclaration} ExportDefaultDeclaration */\n/** @typedef {import(\"estree\").ExportNamedDeclaration} ExportNamedDeclaration */\n/** @typedef {import(\"estree\").ImportSpecifier} ImportSpecifier */\n/** @typedef {import(\"estree\").ImportDefaultSpecifier} ImportDefaultSpecifier */\n/** @typedef {import(\"estree\").ImportNamespaceSpecifier} ImportNamespaceSpecifier */\n/** @typedef {import(\"estree\").ExportSpecifier} ExportSpecifier */\n/** @typedef {import(\"estree\").Property} Property */\n/** @typedef {import(\"estree\").AssignmentProperty} AssignmentProperty */\n/** @typedef {import(\"estree\").Literal} Literal */\n/** @typedef {import(\"@typescript-eslint/types\").TSESTree.Node} TSESTreeNode */\n/** @typedef {import(\"./types.mjs\").ReferenceTrackerOptions} ReferenceTrackerOptions */\n/**\n * @template T\n * @typedef {import(\"./types.mjs\").TraceMap} TraceMap\n */\n/**\n * @template T\n * @typedef {import(\"./types.mjs\").TraceMapObject} TraceMapObject\n */\n/**\n * @template T\n * @typedef {import(\"./types.mjs\").TrackedReferences} TrackedReferences\n */\n\nconst IMPORT_TYPE = /^(?:Import|Export(?:All|Default|Named))Declaration$/u\n\n/**\n * Check whether a given node is an import node or not.\n * @param {Node} node\n * @returns {node is ImportDeclaration|ExportAllDeclaration|ExportNamedDeclaration&{source: Literal}} `true` if the node is an import node.\n */\nfunction isHasSource(node) {\n return (\n IMPORT_TYPE.test(node.type) &&\n /** @type {ImportDeclaration|ExportAllDeclaration|ExportNamedDeclaration} */ (\n node\n ).source != null\n )\n}\nconst has =\n /** @type {(traceMap: TraceMap, v: T) => v is (string extends T ? string : T)} */ (\n Function.call.bind(Object.hasOwnProperty)\n )\n\nexport const READ = Symbol(\"read\")\nexport const CALL = Symbol(\"call\")\nexport const CONSTRUCT = Symbol(\"construct\")\nexport const ESM = Symbol(\"esm\")\n\nconst requireCall = { require: { [CALL]: true } }\n\n/**\n * Check whether a given variable is modified or not.\n * @param {Variable|undefined} variable The variable to check.\n * @returns {boolean} `true` if the variable is modified.\n */\nfunction isModifiedGlobal(variable) {\n return (\n variable == null ||\n variable.defs.length !== 0 ||\n variable.references.some((r) => r.isWrite())\n )\n}\n\n/**\n * Check if the value of a given node is passed through to the parent syntax as-is.\n * For example, `a` and `b` in (`a || b` and `c ? a : b`) are passed through.\n * @param {Node} node A node to check.\n * @returns {node is RuleNode & {parent: Expression}} `true` if the node is passed through.\n */\nfunction isPassThrough(node) {\n const parent = /** @type {TSESTreeNode} */ (node).parent\n\n if (parent) {\n switch (parent.type) {\n case \"ConditionalExpression\":\n return parent.consequent === node || parent.alternate === node\n case \"LogicalExpression\":\n return true\n case \"SequenceExpression\":\n return (\n parent.expressions[parent.expressions.length - 1] === node\n )\n case \"ChainExpression\":\n return true\n case \"TSAsExpression\":\n case \"TSSatisfiesExpression\":\n case \"TSTypeAssertion\":\n case \"TSNonNullExpression\":\n case \"TSInstantiationExpression\":\n return true\n\n default:\n return false\n }\n }\n return false\n}\n\n/**\n * The reference tracker.\n */\nexport class ReferenceTracker {\n /**\n * Initialize this tracker.\n * @param {Scope} globalScope The global scope.\n * @param {object} [options] The options.\n * @param {\"legacy\"|\"strict\"} [options.mode=\"strict\"] The mode to determine the ImportDeclaration's behavior for CJS modules.\n * @param {string[]} [options.globalObjectNames=[\"global\",\"globalThis\",\"self\",\"window\"]] The variable names for Global Object.\n */\n constructor(globalScope, options = {}) {\n const {\n mode = \"strict\",\n globalObjectNames = [\"global\", \"globalThis\", \"self\", \"window\"],\n } = options\n /** @private @type {Variable[]} */\n this.variableStack = []\n /** @private */\n this.globalScope = globalScope\n /** @private */\n this.mode = mode\n /** @private */\n this.globalObjectNames = globalObjectNames.slice(0)\n }\n\n /**\n * Iterate the references of global variables.\n * @template T\n * @param {TraceMap} traceMap The trace map.\n * @returns {IterableIterator>} The iterator to iterate references.\n */\n *iterateGlobalReferences(traceMap) {\n for (const key of Object.keys(traceMap)) {\n const nextTraceMap = traceMap[key]\n const path = [key]\n const variable = this.globalScope.set.get(key)\n\n if (isModifiedGlobal(variable)) {\n continue\n }\n\n yield* this._iterateVariableReferences(\n /** @type {Variable} */ (variable),\n path,\n nextTraceMap,\n true,\n )\n }\n\n for (const key of this.globalObjectNames) {\n /** @type {string[]} */\n const path = []\n const variable = this.globalScope.set.get(key)\n\n if (isModifiedGlobal(variable)) {\n continue\n }\n\n yield* this._iterateVariableReferences(\n /** @type {Variable} */ (variable),\n path,\n traceMap,\n false,\n )\n }\n }\n\n /**\n * Iterate the references of CommonJS modules.\n * @template T\n * @param {TraceMap} traceMap The trace map.\n * @returns {IterableIterator>} The iterator to iterate references.\n */\n *iterateCjsReferences(traceMap) {\n for (const { node } of this.iterateGlobalReferences(requireCall)) {\n const key = getStringIfConstant(\n /** @type {CallExpression} */ (node).arguments[0],\n )\n if (key == null || !has(traceMap, key)) {\n continue\n }\n\n const nextTraceMap = traceMap[key]\n const path = [key]\n\n if (nextTraceMap[READ]) {\n yield {\n node,\n path,\n type: READ,\n info: nextTraceMap[READ],\n }\n }\n yield* this._iteratePropertyReferences(\n /** @type {CallExpression} */ (node),\n path,\n nextTraceMap,\n )\n }\n }\n\n /**\n * Iterate the references of ES modules.\n * @template T\n * @param {TraceMap} traceMap The trace map.\n * @returns {IterableIterator