├── .gitignore ├── public └── cm-indentation-markers.png ├── dev ├── vite.config.js ├── index.html └── index.ts ├── .replit ├── tsconfig.json ├── pull_request_template.md ├── LICENSE ├── package.json ├── src ├── config.ts ├── utils.ts ├── index.ts └── map.ts ├── README.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .upm 4 | .config 5 | .cache -------------------------------------------------------------------------------- /public/cm-indentation-markers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replit/codemirror-indentation-markers/HEAD/public/cm-indentation-markers.png -------------------------------------------------------------------------------- /dev/vite.config.js: -------------------------------------------------------------------------------- 1 | const isReplit = Boolean(process.env.REPL_SLUG); 2 | 3 | export default { 4 | server: { 5 | host: '0.0.0.0', 6 | 7 | ...(isReplit 8 | ? { 9 | hmr: { 10 | clientPort: 443, 11 | }, 12 | } 13 | : {}), 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /dev/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | CodeMirror Indentation Markers 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.replit: -------------------------------------------------------------------------------- 1 | run="yarn run dev" 2 | 3 | entrypoint = "src/index.ts" 4 | hidden = [".config", "package-lock.json"] 5 | modules = ["nodejs-20:v8-20230920-bd784b9"] 6 | 7 | [nix] 8 | channel = "stable-23_05" 9 | 10 | [gitHubImport] 11 | requiredFiles = [".replit", "replit.nix", "package.json", "package-lock.json"] 12 | 13 | [deployment] 14 | run = ["node", "index.js"] 15 | deploymentTarget = "cloudrun" 16 | ignorePorts = false 17 | 18 | [[ports]] 19 | localPort = 3000 20 | externalPort = 80 21 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": false, 4 | "checkJs": false, 5 | "lib": ["es6", "dom", "scripthost"], 6 | "types": ["mocha"], 7 | "stripInternal": true, 8 | "typeRoots": ["./node_modules/@types"], 9 | "noUnusedLocals": true, 10 | "strict": true, 11 | "target": "es6", 12 | "module": "es2020", 13 | "newLine": "lf", 14 | "moduleResolution": "node", 15 | }, 16 | "include": [ 17 | "src/*.ts" 18 | ] 19 | } -------------------------------------------------------------------------------- /pull_request_template.md: -------------------------------------------------------------------------------- 1 | # Why 2 | 3 | 7 | 8 | # What changed 9 | 10 | 16 | 17 | # Test plan 18 | 19 | 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Replit 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /dev/index.ts: -------------------------------------------------------------------------------- 1 | import { basicSetup } from 'codemirror'; 2 | import { EditorView } from '@codemirror/view'; 3 | import { Compartment, EditorState } from '@codemirror/state'; 4 | import {getIndentUnit, indentUnit} from '@codemirror/language'; 5 | import { python } from '@codemirror/lang-python'; 6 | import { indentationMarkers } from '../src'; 7 | 8 | const doc = ` 9 | def read_file(path): 10 | with open(path, 'r') as file: 11 | 12 | print("opening file") 13 | text = file.read() 14 | 15 | file.close() 16 | 17 | if len(text) > 1000: 18 | print("thats a big file!") 19 | 20 | return text 21 | 22 | def main(): 23 | read_file("notes.txt") 24 | ` 25 | 26 | const indentConf = new Compartment() 27 | 28 | const view = new EditorView({ 29 | state: EditorState.create({ 30 | doc, 31 | 32 | extensions: [ 33 | basicSetup, 34 | python(), 35 | indentConf.of(indentUnit.of(' ')), 36 | indentationMarkers(), 37 | ], 38 | }), 39 | parent: document.getElementById('editor'), 40 | }); 41 | 42 | function toggleIndent() { 43 | const indent = (getIndentUnit(view.state) === 2) ? ' ' : ' ' 44 | view.dispatch({ effects: indentConf.reconfigure(indentUnit.of(indent)) }) 45 | } 46 | 47 | document.getElementById('toggleIndent').addEventListener('click', toggleIndent) -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@replit/codemirror-indentation-markers", 3 | "description": "Render indentation markers in CodeMirror", 4 | "version": "6.5.3", 5 | "author": { 6 | "name": "Sergei Chestakov", 7 | "email": "me@sergei.com" 8 | }, 9 | "type": "module", 10 | "main": "dist/index.cjs", 11 | "exports": { 12 | "import": "./dist/index.js", 13 | "require": "./dist/index.cjs" 14 | }, 15 | "types": "dist/index.d.ts", 16 | "module": "dist/index.js", 17 | "sideEffects": false, 18 | "license": "MIT", 19 | "scripts": { 20 | "dev": "vite ./dev", 21 | "build": "cm-buildhelper src/index.ts", 22 | "test": "cm-runtests", 23 | "prepare": "npm run build" 24 | }, 25 | "peerDependencies": { 26 | "@codemirror/language": "^6.0.0", 27 | "@codemirror/state": "^6.0.0", 28 | "@codemirror/view": "^6.0.0" 29 | }, 30 | "devDependencies": { 31 | "@codemirror/buildhelper": "^0.1.16", 32 | "@codemirror/commands": "^6.0.0", 33 | "@codemirror/lang-css": "^6.0.0", 34 | "@codemirror/lang-python": "^6.1.1", 35 | "@codemirror/language": "^6.0.0", 36 | "@codemirror/state": "^6.0.0", 37 | "@codemirror/view": "^6.0.0", 38 | "codemirror": "^6.0.0", 39 | "vite": "^2.3.8" 40 | }, 41 | "repository": { 42 | "type": "git", 43 | "url": "https://github.com/replit/codemirror-indentation-markers.git" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import { combineConfig, Facet } from '@codemirror/state'; 2 | 3 | export interface IndentationMarkerConfiguration { 4 | /** 5 | * Determines whether active block marker is styled differently. 6 | */ 7 | highlightActiveBlock?: boolean 8 | 9 | /** 10 | * Determines whether markers in the first column are omitted. 11 | */ 12 | hideFirstIndent?: boolean 13 | 14 | /** 15 | * Determines the type of indentation marker. 16 | */ 17 | markerType?: "fullScope" | "codeOnly" 18 | 19 | /** 20 | * Determines the thickness of marker (in pixels). 21 | */ 22 | thickness?: number 23 | 24 | /** 25 | * Determines the thickness of active marker (in pixels). 26 | * 27 | * If undefined or null, then regular thickness will be used. 28 | */ 29 | activeThickness?: number 30 | 31 | /** 32 | * Determines the color of marker. 33 | */ 34 | colors?: { 35 | /** 36 | * Color of inactive indent markers when using a light theme. 37 | */ 38 | light?: string 39 | 40 | /** 41 | * Color of inactive indent markers when using a dark theme. 42 | */ 43 | dark?: string 44 | 45 | /** 46 | * Color of active indent markers when using a light theme. 47 | */ 48 | activeLight?: string 49 | 50 | /** 51 | * Color of active indent markers when using a dark theme. 52 | */ 53 | activeDark?: string 54 | } 55 | } 56 | 57 | export const indentationMarkerConfig = Facet.define>({ 58 | combine(configs) { 59 | return combineConfig(configs, { 60 | highlightActiveBlock: true, 61 | hideFirstIndent: false, 62 | markerType: "fullScope", 63 | thickness: 1, 64 | }); 65 | } 66 | }); 67 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import { EditorState, Line } from '@codemirror/state'; 2 | import { EditorView } from '@codemirror/view'; 3 | 4 | /** 5 | * Gets the visible lines in the editor. Lines will not be repeated. 6 | * 7 | * @param view - The editor view to get the visible lines from. 8 | * @param state - The editor state. Defaults to the view's current one. 9 | */ 10 | export function getVisibleLines(view: EditorView, state = view.state) { 11 | const lines = new Set(); 12 | 13 | for (const { from, to } of view.visibleRanges) { 14 | let pos = from; 15 | 16 | while (pos <= to) { 17 | const line = state.doc.lineAt(pos); 18 | 19 | if (!lines.has(line)) { 20 | lines.add(line); 21 | } 22 | 23 | pos = line.to + 1; 24 | } 25 | } 26 | 27 | return lines; 28 | } 29 | 30 | /** 31 | * Gets the line at the position of the primary cursor. 32 | * 33 | * @param state - The editor state from which to extract the line. 34 | */ 35 | export function getCurrentLine(state: EditorState) { 36 | const currentPos = state.selection.main.head; 37 | return state.doc.lineAt(currentPos); 38 | } 39 | 40 | /** 41 | * Returns the number of columns that a string is indented, controlling for 42 | * tabs. This is useful for determining the indentation level of a line. 43 | * 44 | * Note that this only returns the number of _visible_ columns, not the number 45 | * of whitespace characters at the start of the string. 46 | * 47 | * @param str - The string to check. 48 | * @param tabSize - The size of a tab character. Usually 2 or 4. 49 | */ 50 | export function numColumns(str: string, tabSize: number) { 51 | // as far as I can tell, this is pretty much the fastest way to do this, 52 | // at least involving iteration. `str.length - str.trimStart().length` is 53 | // much faster, but it has some edge cases that are hard to deal with. 54 | 55 | let col = 0; 56 | 57 | // eslint-disable-next-line no-restricted-syntax 58 | loop: for (let i = 0; i < str.length; i++) { 59 | switch (str[i]) { 60 | case ' ': 61 | case '\u00A0': { 62 | col += 1; 63 | continue loop; 64 | } 65 | 66 | case '\t': { 67 | // if the current column is a multiple of the tab size, we can just 68 | // add the tab size to the column. otherwise, we need to add the 69 | // difference between the tab size and the current column. 70 | col += tabSize - (col % tabSize); 71 | continue loop; 72 | } 73 | 74 | case '\r': { 75 | continue loop; 76 | } 77 | 78 | default: { 79 | break loop; 80 | } 81 | } 82 | } 83 | 84 | return col; 85 | } 86 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CodeMirror Indentation Markers 2 | 3 | Run on Replit badge 4 | NPM version badge 5 | 6 | A CodeMirror extension that renders indentation markers using a 7 | heuristic similar to what other popular editors, like Ace and Monaco, use. 8 | 9 | ![Example](public/cm-indentation-markers.png) 10 | 11 | ### Usage 12 | 13 | ```ts 14 | import { basicSetup } from 'codemirror'; 15 | import { EditorState } from '@codemirror/state'; 16 | import { EditorView } from '@codemirror/view'; 17 | import { indentationMarkers } from '@replit/codemirror-indentation-markers'; 18 | 19 | const doc = ` 20 | def max(a, b): 21 | if a > b: 22 | return a 23 | else: 24 | return b 25 | ` 26 | 27 | new EditorView({ 28 | state: EditorState.create({ 29 | doc, 30 | extensions: [basicSetup, indentationMarkers()], 31 | }), 32 | parent: document.querySelector('#editor'), 33 | }); 34 | 35 | ``` 36 | 37 | ### Options 38 | 39 | You can provide an options object to `indentationMarkers()` with the following 40 | optional properties: 41 | 42 | - `highlightActiveBlock` 43 | 44 | Boolean that determines whether the active block marker is styled 45 | differently. Setting this to `false` provides a significant performance 46 | enhancement because it means that markers do not need to be regenerated 47 | when the selection changes. Defaults to `true`. 48 | 49 | - `hideFirstIndent` 50 | 51 | Boolean that determines whether markers in the first column are omitted. 52 | Defaults to `false`. 53 | 54 | - `markerType` 55 | 56 | String that determines how far the indentation markers extend. `"fullScope"` indicates that the markers extend down the full height of a scope. With the `"codeOnly"` option, indentation markers terminate at the last nonempty line in a scope. Defaults to `"fullScope"`. 57 | 58 | - `thickness` 59 | 60 | Integer that determines the thickness in pixels of the indentation markers. Defaults to `1`. 61 | 62 | - `activeThickness` 63 | 64 | Integer that determines the thickness in pixels of the active indentation markers. If `undefined` or `null` then `thickness` will be used. Defaults to `undefined`. 65 | 66 | - `colors` 67 | 68 | Object that determines the colors of the indentation markers. 69 | 70 | - `light` 71 | 72 | String that determines the color of the markers when the editor has a light theme. Defaults to `#F0F1F2`. 73 | 74 | - `dark` 75 | 76 | String that determines the color of the markers when the editor has a dark theme. Defaults to `#2B3245`. 77 | 78 | - `activeLight` 79 | 80 | String that determines the color of the active block marker when the editor has a light theme. Only applies if `highlightActiveBlock` is `true`. Defaults to `#E4E5E6`. 81 | 82 | - `activeDark` 83 | 84 | String that determines the color of the active block marker when the editor has a dark theme. Only applies if `highlightActiveBlock` is `true`. Defaults to `#3C445C`. 85 | 86 | #### Example 87 | 88 | ```ts 89 | new EditorView({ 90 | state: EditorState.create({ 91 | doc, 92 | extensions: [ 93 | basicSetup, 94 | indentationMarkers({ 95 | highlightActiveBlock: false, 96 | hideFirstIndent: true, 97 | markerType: "codeOnly", 98 | thickness: 2, 99 | colors: { 100 | light: 'LightBlue', 101 | dark: 'DarkBlue', 102 | activeLight: 'LightGreen', 103 | activeDark: 'DarkGreen', 104 | } 105 | }) 106 | ], 107 | }), 108 | parent: document.querySelector('#editor'), 109 | }); 110 | ``` 111 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { getIndentUnit } from '@codemirror/language'; 2 | import { EditorState, RangeSetBuilder } from '@codemirror/state'; 3 | import { 4 | Decoration, 5 | ViewPlugin, 6 | DecorationSet, 7 | EditorView, 8 | ViewUpdate, 9 | PluginValue, 10 | } from '@codemirror/view'; 11 | import { getCurrentLine, getVisibleLines } from './utils'; 12 | import { IndentEntry, IndentationMap } from './map'; 13 | import { IndentationMarkerConfiguration, indentationMarkerConfig } from "./config"; 14 | 15 | // CSS classes: 16 | // - .cm-indent-markers 17 | 18 | function indentTheme(colorOptions: IndentationMarkerConfiguration['colors']) { 19 | const defaultColors = { 20 | light: '#F0F1F2', 21 | dark: '#2B3245', 22 | activeLight: '#E4E5E6', 23 | activeDark: '#3C445C', 24 | }; 25 | 26 | let colors = defaultColors; 27 | if (colorOptions) { 28 | colors = {...defaultColors, ...colorOptions}; 29 | } 30 | 31 | return EditorView.baseTheme({ 32 | '&light': { 33 | '--indent-marker-bg-color': colors.light, 34 | '--indent-marker-active-bg-color': colors.activeLight, 35 | }, 36 | 37 | '&dark': { 38 | '--indent-marker-bg-color': colors.dark, 39 | '--indent-marker-active-bg-color': colors.activeDark, 40 | }, 41 | 42 | '.cm-line': { 43 | position: 'relative', 44 | }, 45 | 46 | // this pseudo-element is used to draw the indent markers, 47 | // while still allowing the line to have its own background. 48 | '.cm-indent-markers::before': { 49 | content: '""', 50 | position: 'absolute', 51 | top: 0, 52 | // .cm-line has a padding of 2px 53 | // https://github.com/codemirror/view/blob/1c0a0880fc904714339f059658f3ba3a88bb8e6e/src/theme.ts#L85 54 | left: `2px`, 55 | right: 0, 56 | bottom: 0, 57 | background: 'var(--indent-markers)', 58 | pointerEvents: 'none', 59 | zIndex: '-1', 60 | }, 61 | }); 62 | } 63 | 64 | function createGradient(markerCssProperty: string, thickness: number, indentWidth: number, startOffset: number, columns: number) { 65 | const gradient = `repeating-linear-gradient(to right, var(${markerCssProperty}) 0 ${thickness}px, transparent ${thickness}px ${indentWidth}ch)` 66 | // Subtract one pixel from the background width to get rid of artifacts of pixel rounding 67 | return `${gradient} ${startOffset * indentWidth}.5ch/calc(${indentWidth * columns}ch - 1px) no-repeat` 68 | } 69 | 70 | function makeBackgroundCSS(entry: IndentEntry, indentWidth: number, hideFirstIndent: boolean, thickness: number, activeThickness: number) { 71 | const { level, active } = entry; 72 | activeThickness = activeThickness ?? thickness; 73 | if (hideFirstIndent && level === 0) { 74 | return []; 75 | } 76 | const startAt = hideFirstIndent ? 1 : 0; 77 | const backgrounds = []; 78 | 79 | if (active !== undefined) { 80 | const markersBeforeActive = active - startAt - 1; 81 | if (markersBeforeActive > 0) { 82 | backgrounds.push( 83 | createGradient('--indent-marker-bg-color', thickness, indentWidth, startAt, markersBeforeActive), 84 | ); 85 | } 86 | backgrounds.push( 87 | createGradient('--indent-marker-active-bg-color', activeThickness, indentWidth, active - 1, 1), 88 | ); 89 | if (active !== level) { 90 | backgrounds.push( 91 | createGradient('--indent-marker-bg-color', thickness, indentWidth, active, level - active) 92 | ); 93 | } 94 | } else { 95 | backgrounds.push( 96 | createGradient('--indent-marker-bg-color', thickness, indentWidth, startAt, level - startAt) 97 | ); 98 | } 99 | 100 | return backgrounds.join(','); 101 | } 102 | 103 | class IndentMarkersClass implements PluginValue { 104 | view: EditorView; 105 | decorations!: DecorationSet; 106 | 107 | private unitWidth: number; 108 | private currentLineNumber: number; 109 | 110 | constructor(view: EditorView) { 111 | this.view = view; 112 | this.unitWidth = getIndentUnit(view.state); 113 | this.currentLineNumber = getCurrentLine(view.state).number; 114 | this.generate(view.state); 115 | } 116 | 117 | update(update: ViewUpdate) { 118 | const unitWidth = getIndentUnit(update.state); 119 | const unitWidthChanged = unitWidth !== this.unitWidth; 120 | if (unitWidthChanged) { 121 | this.unitWidth = unitWidth; 122 | } 123 | const lineNumber = getCurrentLine(update.state).number; 124 | const lineNumberChanged = lineNumber !== this.currentLineNumber; 125 | this.currentLineNumber = lineNumber; 126 | const activeBlockUpdateRequired = update.state.facet(indentationMarkerConfig).highlightActiveBlock && lineNumberChanged; 127 | if ( 128 | update.docChanged || 129 | update.viewportChanged || 130 | unitWidthChanged || 131 | activeBlockUpdateRequired 132 | ) { 133 | this.generate(update.state); 134 | } 135 | } 136 | 137 | private generate(state: EditorState) { 138 | const builder = new RangeSetBuilder(); 139 | 140 | const lines = getVisibleLines(this.view, state); 141 | const { hideFirstIndent, markerType, thickness, activeThickness } = state.facet(indentationMarkerConfig); 142 | const map = new IndentationMap(lines, state, this.unitWidth, markerType); 143 | 144 | 145 | for (const line of lines) { 146 | const entry = map.get(line.number); 147 | 148 | if (!entry?.level) { 149 | continue; 150 | } 151 | 152 | const backgrounds = makeBackgroundCSS(entry, this.unitWidth, hideFirstIndent, thickness, activeThickness); 153 | 154 | builder.add( 155 | line.from, 156 | line.from, 157 | Decoration.line({ 158 | class: 'cm-indent-markers', 159 | attributes: { 160 | style: `--indent-markers: ${backgrounds}`, 161 | }, 162 | }), 163 | ); 164 | } 165 | 166 | this.decorations = builder.finish(); 167 | } 168 | } 169 | 170 | export function indentationMarkers(config: IndentationMarkerConfiguration = {}) { 171 | return [ 172 | indentationMarkerConfig.of(config), 173 | indentTheme(config.colors), 174 | ViewPlugin.fromClass(IndentMarkersClass, { 175 | decorations: (v) => v.decorations, 176 | }), 177 | ]; 178 | } 179 | -------------------------------------------------------------------------------- /src/map.ts: -------------------------------------------------------------------------------- 1 | import { EditorState, Line } from '@codemirror/state'; 2 | import { getCurrentLine, numColumns } from './utils'; 3 | import {indentationMarkerConfig} from "./config"; 4 | 5 | export interface IndentEntry { 6 | line: Line; 7 | col: number; 8 | level: number; 9 | empty: boolean; 10 | active?: number; 11 | } 12 | 13 | /** 14 | * Indentation map for a set of lines. 15 | * 16 | * This map will contain the indentation for lines that are not a part of the given set, 17 | * but this is because calculating the indentation for those lines was necessary to 18 | * calculate the indentation for the lines provided to the constructor. 19 | * 20 | * @see {@link IndentEntry} 21 | */ 22 | export class IndentationMap { 23 | /** The {@link EditorState} indentation is derived from. */ 24 | private state: EditorState; 25 | 26 | /** The set of lines that are used as an entrypoint. */ 27 | private lines: Set; 28 | 29 | /** The internal mapping of line numbers to {@link IndentEntry} objects. */ 30 | private map: Map; 31 | 32 | /** The width of the editor's indent unit. */ 33 | private unitWidth: number; 34 | 35 | /** The type of indentation to use (terminate at end of scope vs last non-empty line in scope) */ 36 | private markerType: "fullScope" | "codeOnly"; 37 | 38 | /** 39 | * @param lines - The set of lines to get the indentation map for. 40 | * @param state - The {@link EditorState} to derive the indentation map from. 41 | * @param unitWidth - The width of the editor's indent unit. 42 | * @param markerType - The type of indentation to use (terminate at end of scope vs last line of code in scope) 43 | */ 44 | constructor(lines: Set, state: EditorState, unitWidth: number, markerType: "fullScope" | "codeOnly") { 45 | this.lines = lines; 46 | this.state = state; 47 | this.map = new Map(); 48 | this.unitWidth = unitWidth; 49 | this.markerType = markerType; 50 | 51 | for (const line of this.lines) { 52 | this.add(line); 53 | } 54 | 55 | if (this.state.facet(indentationMarkerConfig).highlightActiveBlock) { 56 | this.findAndSetActiveLines(); 57 | } 58 | } 59 | 60 | /** 61 | * Checks if the indentation map has an entry for the given line. 62 | * 63 | * @param line - The {@link Line} or line number to check for. 64 | */ 65 | has(line: Line | number) { 66 | return this.map.has(typeof line === 'number' ? line : line.number); 67 | } 68 | 69 | /** 70 | * Returns the {@link IndentEntry} for the given line. 71 | * 72 | * Note that this function will throw an error if the line does not exist in the map. 73 | * 74 | * @param line - The {@link Line} or line number to get the entry for. 75 | */ 76 | get(line: Line | number) { 77 | const entry = this.map.get(typeof line === 'number' ? line : line.number); 78 | 79 | if (!entry) { 80 | throw new Error('Line not found in indentation map'); 81 | } 82 | 83 | return entry; 84 | } 85 | 86 | /** 87 | * Sets the {@link IndentEntry} for the given line. 88 | * 89 | * @param line - The {@link Line} to set the entry for. 90 | * @param col - The visual beginning whitespace width of the line. 91 | * @param level - The indentation level of the line. 92 | */ 93 | private set(line: Line, col: number, level: number) { 94 | const empty = !line.text.trim().length; 95 | const entry: IndentEntry = { line, col, level, empty }; 96 | this.map.set(entry.line.number, entry); 97 | 98 | return entry; 99 | } 100 | 101 | /** 102 | * Adds a line to the indentation map. 103 | * 104 | * @param line - The {@link Line} to add to the map. 105 | */ 106 | private add(line: Line) { 107 | if (this.has(line)) { 108 | return this.get(line); 109 | } 110 | 111 | // empty lines continue their indentation from surrounding lines 112 | if (!line.length || !line.text.trim().length) { 113 | // the very first line, if empty, is just ignored and set as a 0 indent level 114 | if (line.number === 1) { 115 | return this.set(line, 0, 0); 116 | } 117 | 118 | // if we're at the end, we'll just use the previous line's indentation 119 | if (line.number === this.state.doc.lines) { 120 | const prev = this.closestNonEmpty(line, -1); 121 | 122 | return this.set(line, 0, prev.level); 123 | } 124 | 125 | const prev = this.closestNonEmpty(line, -1); 126 | const next = this.closestNonEmpty(line, 1); 127 | 128 | // if the next line ends the block and the marker type is not set to codeOnly, 129 | // we'll just use the previous line's indentation 130 | if (prev.level >= next.level && this.markerType !== "codeOnly" ) { 131 | return this.set(line, 0, prev.level); 132 | } 133 | 134 | // having an indent marker that starts from an empty line looks weird 135 | if (prev.empty && prev.level === 0 && next.level !== 0) { 136 | return this.set(line, 0, 0); 137 | } 138 | 139 | // if the next indentation level is greater than the previous, 140 | // we'll only increment up to the next indentation level. this prevents 141 | // a weirdly "backwards propagating" indentation. 142 | if (next.level > prev.level) { 143 | return this.set(line, 0, prev.level + 1); 144 | } 145 | 146 | // else, we default to the next line's indentation 147 | return this.set(line, 0, next.level); 148 | } 149 | 150 | const col = numColumns(line.text, this.state.tabSize); 151 | const level = Math.floor(col / this.unitWidth); 152 | 153 | return this.set(line, col, level); 154 | } 155 | 156 | /** 157 | * Finds the closest non-empty line, starting from the given line. 158 | * 159 | * @param from - The {@link Line} to start from. 160 | * @param dir - The direction to search in. Either `1` or `-1`. 161 | */ 162 | private closestNonEmpty(from: Line, dir: -1 | 1) { 163 | let lineNo = from.number + dir; 164 | 165 | while (dir === -1 ? lineNo >= 1 : lineNo <= this.state.doc.lines) { 166 | if (this.has(lineNo)) { 167 | const entry = this.get(lineNo); 168 | if (!entry.empty) { 169 | return entry; 170 | } 171 | } 172 | 173 | // we can check if the line is empty, if it's not, we can 174 | // just create a new entry for it and return it. 175 | // this prevents us from hitting the beginning/end of the document unnecessarily. 176 | 177 | const line = this.state.doc.line(lineNo); 178 | 179 | if (line.text.trim().length) { 180 | const col = numColumns(line.text, this.state.tabSize); 181 | const level = Math.floor(col / this.unitWidth); 182 | 183 | return this.set(line, col, level); 184 | } 185 | 186 | lineNo += dir; 187 | } 188 | 189 | // if we're here, we didn't find anything. 190 | // that means we're at the beginning/end of the document, 191 | // and the first/last line is empty. 192 | 193 | const line = this.state.doc.line(dir === -1 ? 1 : this.state.doc.lines); 194 | 195 | return this.set(line, 0, 0); 196 | } 197 | 198 | /** 199 | * Finds the state's active block (via the current selection) and sets all 200 | * the active indent level for the lines in the block. 201 | */ 202 | private findAndSetActiveLines() { 203 | const currentLine = getCurrentLine(this.state); 204 | 205 | if (!this.has(currentLine)) { 206 | return; 207 | } 208 | 209 | let current = this.get(currentLine); 210 | 211 | // check if the current line is starting a new block, if yes, we want to 212 | // start from inside the block. 213 | if (this.has(current.line.number + 1)) { 214 | const next = this.get(current.line.number + 1); 215 | if (next.level > current.level) { 216 | current = next; 217 | } 218 | } 219 | 220 | // same, but if the current line is ending a block 221 | if (this.has(current.line.number - 1)) { 222 | const prev = this.get(current.line.number - 1); 223 | if (prev.level > current.level) { 224 | current = prev; 225 | } 226 | } 227 | 228 | if (current.level === 0) { 229 | return; 230 | } 231 | 232 | current.active = current.level; 233 | 234 | let start: number; 235 | let end: number; 236 | 237 | // iterate to the start of the block 238 | for (start = current.line.number; start > 1; start--) { 239 | if (!this.has(start - 1)) { 240 | continue; 241 | } 242 | 243 | const prev = this.get(start - 1); 244 | 245 | if (prev.level < current.level) { 246 | break; 247 | } 248 | 249 | prev.active = current.level; 250 | } 251 | 252 | // iterate to the end of the block 253 | for (end = current.line.number; end < this.state.doc.lines; end++) { 254 | if (!this.has(end + 1)) { 255 | continue; 256 | } 257 | 258 | const next = this.get(end + 1); 259 | 260 | if (next.level < current.level) { 261 | break; 262 | } 263 | 264 | next.active = current.level; 265 | } 266 | } 267 | } 268 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.12.13": 6 | version "7.18.6" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" 8 | integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== 9 | dependencies: 10 | "@babel/highlight" "^7.18.6" 11 | 12 | "@babel/helper-validator-identifier@^7.18.6": 13 | version "7.19.1" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" 15 | integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== 16 | 17 | "@babel/highlight@^7.18.6": 18 | version "7.18.6" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" 20 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.18.6" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.3.2": 27 | version "6.4.0" 28 | resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.4.0.tgz#76ac9a2a411a4cc6e13103014dba5e0fe601da5a" 29 | integrity sha512-HLF2PnZAm1s4kGs30EiqKMgD7XsYaQ0XJnMR0rofEWQ5t5D60SfqpDIkIh1ze5tiEbyUWm8+VJ6W1/erVvBMIA== 30 | dependencies: 31 | "@codemirror/language" "^6.0.0" 32 | "@codemirror/state" "^6.0.0" 33 | "@codemirror/view" "^6.6.0" 34 | "@lezer/common" "^1.0.0" 35 | 36 | "@codemirror/buildhelper@^0.1.16": 37 | version "0.1.16" 38 | resolved "https://registry.yarnpkg.com/@codemirror/buildhelper/-/buildhelper-0.1.16.tgz#bda138522fdade53d63f457c440b64be48c7fa71" 39 | integrity sha512-b88pPVoLoBp3DHe+CK5p/1t/WFGYRGxn69d9Efp/cEP3uF91hXTIKOimaL3IyVhm9q6ILjKzn8q8MFUUy7GvwA== 40 | dependencies: 41 | "@lezer/generator" "^1.0.0" 42 | "@types/mocha" "^9.1.1" 43 | acorn "^8.1.0" 44 | acorn-walk "^8.0.2" 45 | esmoduleserve "^0.2.0" 46 | ist "^1.1.7" 47 | mocha "^10.0.0" 48 | rollup "^2.35.1" 49 | rollup-plugin-dts "^3.0.0" 50 | selenium-webdriver "^4.0.0-beta.3" 51 | serve-static "^1.14.1" 52 | typescript "^4.2.3" 53 | 54 | "@codemirror/commands@^6.0.0": 55 | version "6.2.0" 56 | resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.2.0.tgz#e575b7542406be8bc61efb56f1827c71587bb5f8" 57 | integrity sha512-+00smmZBradoGFEkRjliN7BjqPh/Hx0KCHWOEibUmflUqZz2RwBTU0MrVovEEHozhx3AUSGcO/rl3/5f9e9Biw== 58 | dependencies: 59 | "@codemirror/language" "^6.0.0" 60 | "@codemirror/state" "^6.2.0" 61 | "@codemirror/view" "^6.0.0" 62 | "@lezer/common" "^1.0.0" 63 | 64 | "@codemirror/lang-css@^6.0.0": 65 | version "6.0.2" 66 | resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.0.2.tgz#b286d0226755a751f60599e1e2969d351aebbd4c" 67 | integrity sha512-4V4zmUOl2Glx0GWw0HiO1oGD4zvMlIQ3zx5hXOE6ipCjhohig2bhWRAasrZylH9pRNTcl1VMa59Lsl8lZWlTzw== 68 | dependencies: 69 | "@codemirror/autocomplete" "^6.0.0" 70 | "@codemirror/language" "^6.0.0" 71 | "@codemirror/state" "^6.0.0" 72 | "@lezer/css" "^1.0.0" 73 | 74 | "@codemirror/lang-python@^6.1.1": 75 | version "6.1.1" 76 | resolved "https://registry.yarnpkg.com/@codemirror/lang-python/-/lang-python-6.1.1.tgz#378c69199da41e0b09eaadc56f6d70ad6001fd34" 77 | integrity sha512-AddGMIKUssUAqaDKoxKWA5GAzy/CVE0eSY7/ANgNzdS1GYBkp6N49XKEyMElkuN04UsZ+bTIQdj+tVV75NMwJw== 78 | dependencies: 79 | "@codemirror/autocomplete" "^6.3.2" 80 | "@codemirror/language" "^6.0.0" 81 | "@lezer/python" "^1.0.0" 82 | 83 | "@codemirror/language@^6.0.0": 84 | version "6.5.0" 85 | resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.5.0.tgz#08f4e1599d3c21acb7f78f99aa253c842d308e3c" 86 | integrity sha512-dI+dV/u2klIt0Y9kE3TH9vuBidAB3xuuDPofwzvnW8ZKqJnKTbT3EjyV7DeKcmrRgXMhlPTL7AdH1V5KOCYuHQ== 87 | dependencies: 88 | "@codemirror/state" "^6.0.0" 89 | "@codemirror/view" "^6.0.0" 90 | "@lezer/common" "^1.0.0" 91 | "@lezer/highlight" "^1.0.0" 92 | "@lezer/lr" "^1.0.0" 93 | style-mod "^4.0.0" 94 | 95 | "@codemirror/lint@^6.0.0": 96 | version "6.1.0" 97 | resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.1.0.tgz#f006142d3a580fdb8ffc2faa3361b2232c08e079" 98 | integrity sha512-mdvDQrjRmYPvQ3WrzF6Ewaao+NWERYtpthJvoQ3tK3t/44Ynhk8ZGjTSL9jMEv8CgSMogmt75X8ceOZRDSXHtQ== 99 | dependencies: 100 | "@codemirror/state" "^6.0.0" 101 | "@codemirror/view" "^6.0.0" 102 | crelt "^1.0.5" 103 | 104 | "@codemirror/search@^6.0.0": 105 | version "6.2.3" 106 | resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.2.3.tgz#fab933fef1b1de8ef40cda275c73d9ac7a1ff40f" 107 | integrity sha512-V9n9233lopQhB1dyjsBK2Wc1i+8hcCqxl1wQ46c5HWWLePoe4FluV3TGHoZ04rBRlGjNyz9DTmpJErig8UE4jw== 108 | dependencies: 109 | "@codemirror/state" "^6.0.0" 110 | "@codemirror/view" "^6.0.0" 111 | crelt "^1.0.5" 112 | 113 | "@codemirror/state@^6.0.0", "@codemirror/state@^6.1.4", "@codemirror/state@^6.2.0": 114 | version "6.2.0" 115 | resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.2.0.tgz#a0fb08403ced8c2a68d1d0acee926bd20be922f2" 116 | integrity sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA== 117 | 118 | "@codemirror/view@^6.0.0", "@codemirror/view@^6.6.0": 119 | version "6.8.1" 120 | resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.8.1.tgz#6d4796344edd62670d1f202f9f014959f53242b5" 121 | integrity sha512-bXWs42i1mnBexaktPABaEpYbt4FbJMnlesObDLF0GE8poRiNaRgm7H/2NfXfD5Swas1ULdFgONLLs4ncwHuz8g== 122 | dependencies: 123 | "@codemirror/state" "^6.1.4" 124 | style-mod "^4.0.0" 125 | w3c-keyname "^2.2.4" 126 | 127 | "@esbuild/linux-loong64@0.14.54": 128 | version "0.14.54" 129 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" 130 | integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== 131 | 132 | "@lezer/common@^1.0.0", "@lezer/common@^1.0.2": 133 | version "1.0.2" 134 | resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.0.2.tgz#8fb9b86bdaa2ece57e7d59e5ffbcb37d71815087" 135 | integrity sha512-SVgiGtMnMnW3ActR8SXgsDhw7a0w0ChHSYAyAUxxrOiJ1OqYWEKk/xJd84tTSPo1mo6DXLObAJALNnd0Hrv7Ng== 136 | 137 | "@lezer/css@^1.0.0": 138 | version "1.1.1" 139 | resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.1.tgz#c36dcb0789317cb80c3740767dd3b85e071ad082" 140 | integrity sha512-mSjx+unLLapEqdOYDejnGBokB5+AiJKZVclmud0MKQOKx3DLJ5b5VTCstgDDknR6iIV4gVrN6euzsCnj0A2gQA== 141 | dependencies: 142 | "@lezer/highlight" "^1.0.0" 143 | "@lezer/lr" "^1.0.0" 144 | 145 | "@lezer/generator@^1.0.0": 146 | version "1.2.2" 147 | resolved "https://registry.yarnpkg.com/@lezer/generator/-/generator-1.2.2.tgz#2fa388f607e9d19ae99ba9a4246c1d6ada71903e" 148 | integrity sha512-O//eH9jTPM1GnbZruuD23xU68Pkuragonn1DEIom4Kt/eJN/QFt7Vzvp1YjV/XBmoUKC+2ySPgrA5fMF9FMM2g== 149 | dependencies: 150 | "@lezer/common" "^1.0.2" 151 | "@lezer/lr" "^1.3.0" 152 | 153 | "@lezer/highlight@^1.0.0": 154 | version "1.1.3" 155 | resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.1.3.tgz#bf5a36c2ee227f526d74997ac91f7777e29bd25d" 156 | integrity sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw== 157 | dependencies: 158 | "@lezer/common" "^1.0.0" 159 | 160 | "@lezer/lr@^1.0.0", "@lezer/lr@^1.3.0": 161 | version "1.3.3" 162 | resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.3.3.tgz#0ac6c889f1235874f33c45a1b9785d7054f60708" 163 | integrity sha512-JPQe3mwJlzEVqy67iQiiGozhcngbO8QBgpqZM6oL1Wj/dXckrEexpBLeFkq0edtW5IqnPRFxA24BHJni8Js69w== 164 | dependencies: 165 | "@lezer/common" "^1.0.0" 166 | 167 | "@lezer/python@^1.0.0": 168 | version "1.1.2" 169 | resolved "https://registry.yarnpkg.com/@lezer/python/-/python-1.1.2.tgz#1db9faf182ca04815b2c7e0f1ce37104b2564ec5" 170 | integrity sha512-ukm4VhDasFX7/9BUYHTyUNXH0xQ5B7/QBlZD8P51+dh6GtXRSCQqNxloez5d+MxVb2Sg+31S8E/33qoFREfkpA== 171 | dependencies: 172 | "@lezer/highlight" "^1.0.0" 173 | "@lezer/lr" "^1.0.0" 174 | 175 | "@types/mocha@^9.1.1": 176 | version "9.1.1" 177 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" 178 | integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== 179 | 180 | acorn-walk@^8.0.0, acorn-walk@^8.0.2: 181 | version "8.2.0" 182 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 183 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 184 | 185 | acorn@^8.0.4, acorn@^8.1.0: 186 | version "8.8.2" 187 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" 188 | integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== 189 | 190 | ansi-colors@4.1.1: 191 | version "4.1.1" 192 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 193 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 194 | 195 | ansi-regex@^5.0.1: 196 | version "5.0.1" 197 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 198 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 199 | 200 | ansi-styles@^3.2.1: 201 | version "3.2.1" 202 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 203 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 204 | dependencies: 205 | color-convert "^1.9.0" 206 | 207 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 208 | version "4.3.0" 209 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 210 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 211 | dependencies: 212 | color-convert "^2.0.1" 213 | 214 | anymatch@~3.1.2: 215 | version "3.1.3" 216 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 217 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 218 | dependencies: 219 | normalize-path "^3.0.0" 220 | picomatch "^2.0.4" 221 | 222 | argparse@^2.0.1: 223 | version "2.0.1" 224 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 225 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 226 | 227 | balanced-match@^1.0.0: 228 | version "1.0.2" 229 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 230 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 231 | 232 | binary-extensions@^2.0.0: 233 | version "2.2.0" 234 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 235 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 236 | 237 | brace-expansion@^1.1.7: 238 | version "1.1.11" 239 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 240 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 241 | dependencies: 242 | balanced-match "^1.0.0" 243 | concat-map "0.0.1" 244 | 245 | brace-expansion@^2.0.1: 246 | version "2.0.1" 247 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 248 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 249 | dependencies: 250 | balanced-match "^1.0.0" 251 | 252 | braces@~3.0.2: 253 | version "3.0.2" 254 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 255 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 256 | dependencies: 257 | fill-range "^7.0.1" 258 | 259 | browser-stdout@1.3.1: 260 | version "1.3.1" 261 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 262 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 263 | 264 | camelcase@^6.0.0: 265 | version "6.3.0" 266 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 267 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 268 | 269 | chalk@^2.0.0: 270 | version "2.4.2" 271 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 272 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 273 | dependencies: 274 | ansi-styles "^3.2.1" 275 | escape-string-regexp "^1.0.5" 276 | supports-color "^5.3.0" 277 | 278 | chalk@^4.1.0: 279 | version "4.1.2" 280 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 281 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 282 | dependencies: 283 | ansi-styles "^4.1.0" 284 | supports-color "^7.1.0" 285 | 286 | chokidar@3.5.3: 287 | version "3.5.3" 288 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 289 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 290 | dependencies: 291 | anymatch "~3.1.2" 292 | braces "~3.0.2" 293 | glob-parent "~5.1.2" 294 | is-binary-path "~2.1.0" 295 | is-glob "~4.0.1" 296 | normalize-path "~3.0.0" 297 | readdirp "~3.6.0" 298 | optionalDependencies: 299 | fsevents "~2.3.2" 300 | 301 | cliui@^7.0.2: 302 | version "7.0.4" 303 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 304 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 305 | dependencies: 306 | string-width "^4.2.0" 307 | strip-ansi "^6.0.0" 308 | wrap-ansi "^7.0.0" 309 | 310 | codemirror@^6.0.0: 311 | version "6.0.1" 312 | resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.1.tgz#62b91142d45904547ee3e0e0e4c1a79158035a29" 313 | integrity sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg== 314 | dependencies: 315 | "@codemirror/autocomplete" "^6.0.0" 316 | "@codemirror/commands" "^6.0.0" 317 | "@codemirror/language" "^6.0.0" 318 | "@codemirror/lint" "^6.0.0" 319 | "@codemirror/search" "^6.0.0" 320 | "@codemirror/state" "^6.0.0" 321 | "@codemirror/view" "^6.0.0" 322 | 323 | color-convert@^1.9.0: 324 | version "1.9.3" 325 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 326 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 327 | dependencies: 328 | color-name "1.1.3" 329 | 330 | color-convert@^2.0.1: 331 | version "2.0.1" 332 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 333 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 334 | dependencies: 335 | color-name "~1.1.4" 336 | 337 | color-name@1.1.3: 338 | version "1.1.3" 339 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 340 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 341 | 342 | color-name@~1.1.4: 343 | version "1.1.4" 344 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 345 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 346 | 347 | concat-map@0.0.1: 348 | version "0.0.1" 349 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 350 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 351 | 352 | core-util-is@~1.0.0: 353 | version "1.0.3" 354 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 355 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 356 | 357 | crelt@^1.0.5: 358 | version "1.0.5" 359 | resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" 360 | integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== 361 | 362 | debug@2.6.9: 363 | version "2.6.9" 364 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 365 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 366 | dependencies: 367 | ms "2.0.0" 368 | 369 | debug@4.3.4: 370 | version "4.3.4" 371 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 372 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 373 | dependencies: 374 | ms "2.1.2" 375 | 376 | decamelize@^4.0.0: 377 | version "4.0.0" 378 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 379 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 380 | 381 | depd@2.0.0: 382 | version "2.0.0" 383 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 384 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 385 | 386 | destroy@1.2.0: 387 | version "1.2.0" 388 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 389 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 390 | 391 | diff@5.0.0: 392 | version "5.0.0" 393 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 394 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 395 | 396 | ee-first@1.1.1: 397 | version "1.1.1" 398 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 399 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 400 | 401 | emoji-regex@^8.0.0: 402 | version "8.0.0" 403 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 404 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 405 | 406 | encodeurl@~1.0.2: 407 | version "1.0.2" 408 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 409 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 410 | 411 | esbuild-android-64@0.14.54: 412 | version "0.14.54" 413 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" 414 | integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== 415 | 416 | esbuild-android-arm64@0.14.54: 417 | version "0.14.54" 418 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" 419 | integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== 420 | 421 | esbuild-darwin-64@0.14.54: 422 | version "0.14.54" 423 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" 424 | integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== 425 | 426 | esbuild-darwin-arm64@0.14.54: 427 | version "0.14.54" 428 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" 429 | integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== 430 | 431 | esbuild-freebsd-64@0.14.54: 432 | version "0.14.54" 433 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" 434 | integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== 435 | 436 | esbuild-freebsd-arm64@0.14.54: 437 | version "0.14.54" 438 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" 439 | integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== 440 | 441 | esbuild-linux-32@0.14.54: 442 | version "0.14.54" 443 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" 444 | integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== 445 | 446 | esbuild-linux-64@0.14.54: 447 | version "0.14.54" 448 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" 449 | integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== 450 | 451 | esbuild-linux-arm64@0.14.54: 452 | version "0.14.54" 453 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" 454 | integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== 455 | 456 | esbuild-linux-arm@0.14.54: 457 | version "0.14.54" 458 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" 459 | integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== 460 | 461 | esbuild-linux-mips64le@0.14.54: 462 | version "0.14.54" 463 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" 464 | integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== 465 | 466 | esbuild-linux-ppc64le@0.14.54: 467 | version "0.14.54" 468 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" 469 | integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== 470 | 471 | esbuild-linux-riscv64@0.14.54: 472 | version "0.14.54" 473 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" 474 | integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== 475 | 476 | esbuild-linux-s390x@0.14.54: 477 | version "0.14.54" 478 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" 479 | integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== 480 | 481 | esbuild-netbsd-64@0.14.54: 482 | version "0.14.54" 483 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" 484 | integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== 485 | 486 | esbuild-openbsd-64@0.14.54: 487 | version "0.14.54" 488 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" 489 | integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== 490 | 491 | esbuild-sunos-64@0.14.54: 492 | version "0.14.54" 493 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" 494 | integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== 495 | 496 | esbuild-windows-32@0.14.54: 497 | version "0.14.54" 498 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" 499 | integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== 500 | 501 | esbuild-windows-64@0.14.54: 502 | version "0.14.54" 503 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" 504 | integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== 505 | 506 | esbuild-windows-arm64@0.14.54: 507 | version "0.14.54" 508 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" 509 | integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== 510 | 511 | esbuild@^0.14.27: 512 | version "0.14.54" 513 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" 514 | integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== 515 | optionalDependencies: 516 | "@esbuild/linux-loong64" "0.14.54" 517 | esbuild-android-64 "0.14.54" 518 | esbuild-android-arm64 "0.14.54" 519 | esbuild-darwin-64 "0.14.54" 520 | esbuild-darwin-arm64 "0.14.54" 521 | esbuild-freebsd-64 "0.14.54" 522 | esbuild-freebsd-arm64 "0.14.54" 523 | esbuild-linux-32 "0.14.54" 524 | esbuild-linux-64 "0.14.54" 525 | esbuild-linux-arm "0.14.54" 526 | esbuild-linux-arm64 "0.14.54" 527 | esbuild-linux-mips64le "0.14.54" 528 | esbuild-linux-ppc64le "0.14.54" 529 | esbuild-linux-riscv64 "0.14.54" 530 | esbuild-linux-s390x "0.14.54" 531 | esbuild-netbsd-64 "0.14.54" 532 | esbuild-openbsd-64 "0.14.54" 533 | esbuild-sunos-64 "0.14.54" 534 | esbuild-windows-32 "0.14.54" 535 | esbuild-windows-64 "0.14.54" 536 | esbuild-windows-arm64 "0.14.54" 537 | 538 | escalade@^3.1.1: 539 | version "3.1.1" 540 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 541 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 542 | 543 | escape-html@~1.0.3: 544 | version "1.0.3" 545 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 546 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 547 | 548 | escape-string-regexp@4.0.0: 549 | version "4.0.0" 550 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 551 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 552 | 553 | escape-string-regexp@^1.0.5: 554 | version "1.0.5" 555 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 556 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 557 | 558 | esmoduleserve@^0.2.0: 559 | version "0.2.0" 560 | resolved "https://registry.yarnpkg.com/esmoduleserve/-/esmoduleserve-0.2.0.tgz#01ed56cbee408f624641dab0b2916a54407c891e" 561 | integrity sha512-vg1j7fzKZUFR5TCsYQ3PABfBRMRi6V9K7mxcRh2MftO3gwAHBwYaPHtLHFDsKVSxdHmpu/GgT37lsRT+vezaKQ== 562 | dependencies: 563 | acorn "^8.0.4" 564 | acorn-walk "^8.0.0" 565 | resolve "^1.15.1" 566 | serve-static "^1.14.1" 567 | 568 | etag@~1.8.1: 569 | version "1.8.1" 570 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 571 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 572 | 573 | fill-range@^7.0.1: 574 | version "7.0.1" 575 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 576 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 577 | dependencies: 578 | to-regex-range "^5.0.1" 579 | 580 | find-up@5.0.0: 581 | version "5.0.0" 582 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 583 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 584 | dependencies: 585 | locate-path "^6.0.0" 586 | path-exists "^4.0.0" 587 | 588 | flat@^5.0.2: 589 | version "5.0.2" 590 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 591 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 592 | 593 | fresh@0.5.2: 594 | version "0.5.2" 595 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 596 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 597 | 598 | fs.realpath@^1.0.0: 599 | version "1.0.0" 600 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 601 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 602 | 603 | fsevents@~2.3.2: 604 | version "2.3.2" 605 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 606 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 607 | 608 | function-bind@^1.1.1: 609 | version "1.1.1" 610 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 611 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 612 | 613 | get-caller-file@^2.0.5: 614 | version "2.0.5" 615 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 616 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 617 | 618 | glob-parent@~5.1.2: 619 | version "5.1.2" 620 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 621 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 622 | dependencies: 623 | is-glob "^4.0.1" 624 | 625 | glob@7.2.0: 626 | version "7.2.0" 627 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 628 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 629 | dependencies: 630 | fs.realpath "^1.0.0" 631 | inflight "^1.0.4" 632 | inherits "2" 633 | minimatch "^3.0.4" 634 | once "^1.3.0" 635 | path-is-absolute "^1.0.0" 636 | 637 | glob@^7.1.3: 638 | version "7.2.3" 639 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 640 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 641 | dependencies: 642 | fs.realpath "^1.0.0" 643 | inflight "^1.0.4" 644 | inherits "2" 645 | minimatch "^3.1.1" 646 | once "^1.3.0" 647 | path-is-absolute "^1.0.0" 648 | 649 | has-flag@^3.0.0: 650 | version "3.0.0" 651 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 652 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 653 | 654 | has-flag@^4.0.0: 655 | version "4.0.0" 656 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 657 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 658 | 659 | has@^1.0.3: 660 | version "1.0.3" 661 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 662 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 663 | dependencies: 664 | function-bind "^1.1.1" 665 | 666 | he@1.2.0: 667 | version "1.2.0" 668 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 669 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 670 | 671 | http-errors@2.0.0: 672 | version "2.0.0" 673 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 674 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 675 | dependencies: 676 | depd "2.0.0" 677 | inherits "2.0.4" 678 | setprototypeof "1.2.0" 679 | statuses "2.0.1" 680 | toidentifier "1.0.1" 681 | 682 | immediate@~3.0.5: 683 | version "3.0.6" 684 | resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" 685 | integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== 686 | 687 | inflight@^1.0.4: 688 | version "1.0.6" 689 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 690 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 691 | dependencies: 692 | once "^1.3.0" 693 | wrappy "1" 694 | 695 | inherits@2, inherits@2.0.4, inherits@~2.0.3: 696 | version "2.0.4" 697 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 698 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 699 | 700 | is-binary-path@~2.1.0: 701 | version "2.1.0" 702 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 703 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 704 | dependencies: 705 | binary-extensions "^2.0.0" 706 | 707 | is-core-module@^2.9.0: 708 | version "2.11.0" 709 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" 710 | integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== 711 | dependencies: 712 | has "^1.0.3" 713 | 714 | is-extglob@^2.1.1: 715 | version "2.1.1" 716 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 717 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 718 | 719 | is-fullwidth-code-point@^3.0.0: 720 | version "3.0.0" 721 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 722 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 723 | 724 | is-glob@^4.0.1, is-glob@~4.0.1: 725 | version "4.0.3" 726 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 727 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 728 | dependencies: 729 | is-extglob "^2.1.1" 730 | 731 | is-number@^7.0.0: 732 | version "7.0.0" 733 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 734 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 735 | 736 | is-plain-obj@^2.1.0: 737 | version "2.1.0" 738 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 739 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 740 | 741 | is-unicode-supported@^0.1.0: 742 | version "0.1.0" 743 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 744 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 745 | 746 | isarray@~1.0.0: 747 | version "1.0.0" 748 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 749 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 750 | 751 | ist@^1.1.7: 752 | version "1.1.7" 753 | resolved "https://registry.yarnpkg.com/ist/-/ist-1.1.7.tgz#64161305bca42937d8e05394a2883c3431c5f7ff" 754 | integrity sha512-ex9JyqY+tCjBlxN1pXlqxEgtGGUGp1TG83ll1xpu8SfPgOhfAhEGCuepNHlB+d7Le+hLoBcfCu/G0ZQaFbi9hA== 755 | 756 | js-tokens@^4.0.0: 757 | version "4.0.0" 758 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 759 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 760 | 761 | js-yaml@4.1.0: 762 | version "4.1.0" 763 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 764 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 765 | dependencies: 766 | argparse "^2.0.1" 767 | 768 | jszip@^3.10.0: 769 | version "3.10.1" 770 | resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" 771 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== 772 | dependencies: 773 | lie "~3.3.0" 774 | pako "~1.0.2" 775 | readable-stream "~2.3.6" 776 | setimmediate "^1.0.5" 777 | 778 | lie@~3.3.0: 779 | version "3.3.0" 780 | resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" 781 | integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== 782 | dependencies: 783 | immediate "~3.0.5" 784 | 785 | locate-path@^6.0.0: 786 | version "6.0.0" 787 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 788 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 789 | dependencies: 790 | p-locate "^5.0.0" 791 | 792 | log-symbols@4.1.0: 793 | version "4.1.0" 794 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 795 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 796 | dependencies: 797 | chalk "^4.1.0" 798 | is-unicode-supported "^0.1.0" 799 | 800 | magic-string@^0.25.7: 801 | version "0.25.9" 802 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" 803 | integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== 804 | dependencies: 805 | sourcemap-codec "^1.4.8" 806 | 807 | mime@1.6.0: 808 | version "1.6.0" 809 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 810 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 811 | 812 | minimatch@5.0.1: 813 | version "5.0.1" 814 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" 815 | integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== 816 | dependencies: 817 | brace-expansion "^2.0.1" 818 | 819 | minimatch@^3.0.4, minimatch@^3.1.1: 820 | version "3.1.2" 821 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 822 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 823 | dependencies: 824 | brace-expansion "^1.1.7" 825 | 826 | mocha@^10.0.0: 827 | version "10.2.0" 828 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" 829 | integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== 830 | dependencies: 831 | ansi-colors "4.1.1" 832 | browser-stdout "1.3.1" 833 | chokidar "3.5.3" 834 | debug "4.3.4" 835 | diff "5.0.0" 836 | escape-string-regexp "4.0.0" 837 | find-up "5.0.0" 838 | glob "7.2.0" 839 | he "1.2.0" 840 | js-yaml "4.1.0" 841 | log-symbols "4.1.0" 842 | minimatch "5.0.1" 843 | ms "2.1.3" 844 | nanoid "3.3.3" 845 | serialize-javascript "6.0.0" 846 | strip-json-comments "3.1.1" 847 | supports-color "8.1.1" 848 | workerpool "6.2.1" 849 | yargs "16.2.0" 850 | yargs-parser "20.2.4" 851 | yargs-unparser "2.0.0" 852 | 853 | ms@2.0.0: 854 | version "2.0.0" 855 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 856 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 857 | 858 | ms@2.1.2: 859 | version "2.1.2" 860 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 861 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 862 | 863 | ms@2.1.3: 864 | version "2.1.3" 865 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 866 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 867 | 868 | nanoid@3.3.3: 869 | version "3.3.3" 870 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" 871 | integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== 872 | 873 | nanoid@^3.3.4: 874 | version "3.3.4" 875 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" 876 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 877 | 878 | normalize-path@^3.0.0, normalize-path@~3.0.0: 879 | version "3.0.0" 880 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 881 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 882 | 883 | on-finished@2.4.1: 884 | version "2.4.1" 885 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 886 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 887 | dependencies: 888 | ee-first "1.1.1" 889 | 890 | once@^1.3.0: 891 | version "1.4.0" 892 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 893 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 894 | dependencies: 895 | wrappy "1" 896 | 897 | p-limit@^3.0.2: 898 | version "3.1.0" 899 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 900 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 901 | dependencies: 902 | yocto-queue "^0.1.0" 903 | 904 | p-locate@^5.0.0: 905 | version "5.0.0" 906 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 907 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 908 | dependencies: 909 | p-limit "^3.0.2" 910 | 911 | pako@~1.0.2: 912 | version "1.0.11" 913 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 914 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 915 | 916 | parseurl@~1.3.3: 917 | version "1.3.3" 918 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 919 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 920 | 921 | path-exists@^4.0.0: 922 | version "4.0.0" 923 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 924 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 925 | 926 | path-is-absolute@^1.0.0: 927 | version "1.0.1" 928 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 929 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 930 | 931 | path-parse@^1.0.7: 932 | version "1.0.7" 933 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 934 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 935 | 936 | picocolors@^1.0.0: 937 | version "1.0.0" 938 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 939 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 940 | 941 | picomatch@^2.0.4, picomatch@^2.2.1: 942 | version "2.3.1" 943 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 944 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 945 | 946 | postcss@^8.4.13: 947 | version "8.4.21" 948 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" 949 | integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== 950 | dependencies: 951 | nanoid "^3.3.4" 952 | picocolors "^1.0.0" 953 | source-map-js "^1.0.2" 954 | 955 | process-nextick-args@~2.0.0: 956 | version "2.0.1" 957 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 958 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 959 | 960 | randombytes@^2.1.0: 961 | version "2.1.0" 962 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 963 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 964 | dependencies: 965 | safe-buffer "^5.1.0" 966 | 967 | range-parser@~1.2.1: 968 | version "1.2.1" 969 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 970 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 971 | 972 | readable-stream@~2.3.6: 973 | version "2.3.7" 974 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 975 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 976 | dependencies: 977 | core-util-is "~1.0.0" 978 | inherits "~2.0.3" 979 | isarray "~1.0.0" 980 | process-nextick-args "~2.0.0" 981 | safe-buffer "~5.1.1" 982 | string_decoder "~1.1.1" 983 | util-deprecate "~1.0.1" 984 | 985 | readdirp@~3.6.0: 986 | version "3.6.0" 987 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 988 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 989 | dependencies: 990 | picomatch "^2.2.1" 991 | 992 | require-directory@^2.1.1: 993 | version "2.1.1" 994 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 995 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 996 | 997 | resolve@^1.15.1, resolve@^1.22.0: 998 | version "1.22.1" 999 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 1000 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 1001 | dependencies: 1002 | is-core-module "^2.9.0" 1003 | path-parse "^1.0.7" 1004 | supports-preserve-symlinks-flag "^1.0.0" 1005 | 1006 | rimraf@^3.0.0: 1007 | version "3.0.2" 1008 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1009 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1010 | dependencies: 1011 | glob "^7.1.3" 1012 | 1013 | rollup-plugin-dts@^3.0.0: 1014 | version "3.0.2" 1015 | resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-3.0.2.tgz#2b628d88f864d271d6eaec2e4c2a60ae4e944c5c" 1016 | integrity sha512-hswlsdWu/x7k5pXzaLP6OvKRKcx8Bzprksz9i9mUe72zvt8LvqAb/AZpzs6FkLgmyRaN8B6rUQOVtzA3yEt9Yw== 1017 | dependencies: 1018 | magic-string "^0.25.7" 1019 | optionalDependencies: 1020 | "@babel/code-frame" "^7.12.13" 1021 | 1022 | "rollup@>=2.59.0 <2.78.0": 1023 | version "2.77.3" 1024 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12" 1025 | integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== 1026 | optionalDependencies: 1027 | fsevents "~2.3.2" 1028 | 1029 | rollup@^2.35.1: 1030 | version "2.79.1" 1031 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" 1032 | integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== 1033 | optionalDependencies: 1034 | fsevents "~2.3.2" 1035 | 1036 | safe-buffer@^5.1.0: 1037 | version "5.2.1" 1038 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1039 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1040 | 1041 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1042 | version "5.1.2" 1043 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1044 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1045 | 1046 | selenium-webdriver@^4.0.0-beta.3: 1047 | version "4.8.0" 1048 | resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.8.0.tgz#386d57f23fe8edf5178f5bd06aae9ffaffbcb692" 1049 | integrity sha512-s/HL8WNwy1ggHR244+tAhjhyKMJnZLt1HKJ6Gn7nQgVjB/ybDF+46Uui0qI2J7AjPNJzlUmTncdC/jg/kKkn0A== 1050 | dependencies: 1051 | jszip "^3.10.0" 1052 | tmp "^0.2.1" 1053 | ws ">=8.11.0" 1054 | 1055 | send@0.18.0: 1056 | version "0.18.0" 1057 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 1058 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 1059 | dependencies: 1060 | debug "2.6.9" 1061 | depd "2.0.0" 1062 | destroy "1.2.0" 1063 | encodeurl "~1.0.2" 1064 | escape-html "~1.0.3" 1065 | etag "~1.8.1" 1066 | fresh "0.5.2" 1067 | http-errors "2.0.0" 1068 | mime "1.6.0" 1069 | ms "2.1.3" 1070 | on-finished "2.4.1" 1071 | range-parser "~1.2.1" 1072 | statuses "2.0.1" 1073 | 1074 | serialize-javascript@6.0.0: 1075 | version "6.0.0" 1076 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1077 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1078 | dependencies: 1079 | randombytes "^2.1.0" 1080 | 1081 | serve-static@^1.14.1: 1082 | version "1.15.0" 1083 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 1084 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 1085 | dependencies: 1086 | encodeurl "~1.0.2" 1087 | escape-html "~1.0.3" 1088 | parseurl "~1.3.3" 1089 | send "0.18.0" 1090 | 1091 | setimmediate@^1.0.5: 1092 | version "1.0.5" 1093 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1094 | integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== 1095 | 1096 | setprototypeof@1.2.0: 1097 | version "1.2.0" 1098 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1099 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1100 | 1101 | source-map-js@^1.0.2: 1102 | version "1.0.2" 1103 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1104 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1105 | 1106 | sourcemap-codec@^1.4.8: 1107 | version "1.4.8" 1108 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 1109 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 1110 | 1111 | statuses@2.0.1: 1112 | version "2.0.1" 1113 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1114 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1115 | 1116 | string-width@^4.1.0, string-width@^4.2.0: 1117 | version "4.2.3" 1118 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1119 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1120 | dependencies: 1121 | emoji-regex "^8.0.0" 1122 | is-fullwidth-code-point "^3.0.0" 1123 | strip-ansi "^6.0.1" 1124 | 1125 | string_decoder@~1.1.1: 1126 | version "1.1.1" 1127 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1128 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1129 | dependencies: 1130 | safe-buffer "~5.1.0" 1131 | 1132 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1133 | version "6.0.1" 1134 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1135 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1136 | dependencies: 1137 | ansi-regex "^5.0.1" 1138 | 1139 | strip-json-comments@3.1.1: 1140 | version "3.1.1" 1141 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1142 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1143 | 1144 | style-mod@^4.0.0: 1145 | version "4.0.0" 1146 | resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.0.tgz#97e7c2d68b592975f2ca7a63d0dd6fcacfe35a01" 1147 | integrity sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw== 1148 | 1149 | supports-color@8.1.1: 1150 | version "8.1.1" 1151 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1152 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1153 | dependencies: 1154 | has-flag "^4.0.0" 1155 | 1156 | supports-color@^5.3.0: 1157 | version "5.5.0" 1158 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1159 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1160 | dependencies: 1161 | has-flag "^3.0.0" 1162 | 1163 | supports-color@^7.1.0: 1164 | version "7.2.0" 1165 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1166 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1167 | dependencies: 1168 | has-flag "^4.0.0" 1169 | 1170 | supports-preserve-symlinks-flag@^1.0.0: 1171 | version "1.0.0" 1172 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1173 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1174 | 1175 | tmp@^0.2.1: 1176 | version "0.2.1" 1177 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" 1178 | integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== 1179 | dependencies: 1180 | rimraf "^3.0.0" 1181 | 1182 | to-regex-range@^5.0.1: 1183 | version "5.0.1" 1184 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1185 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1186 | dependencies: 1187 | is-number "^7.0.0" 1188 | 1189 | toidentifier@1.0.1: 1190 | version "1.0.1" 1191 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1192 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1193 | 1194 | typescript@^4.2.3: 1195 | version "4.9.5" 1196 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" 1197 | integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== 1198 | 1199 | util-deprecate@~1.0.1: 1200 | version "1.0.2" 1201 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1202 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1203 | 1204 | vite@^2.3.8: 1205 | version "2.9.16" 1206 | resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.16.tgz#daf7ba50f5cc37a7bf51b118ba06bc36e97898e9" 1207 | integrity sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA== 1208 | dependencies: 1209 | esbuild "^0.14.27" 1210 | postcss "^8.4.13" 1211 | resolve "^1.22.0" 1212 | rollup ">=2.59.0 <2.78.0" 1213 | optionalDependencies: 1214 | fsevents "~2.3.2" 1215 | 1216 | w3c-keyname@^2.2.4: 1217 | version "2.2.6" 1218 | resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz#8412046116bc16c5d73d4e612053ea10a189c85f" 1219 | integrity sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg== 1220 | 1221 | workerpool@6.2.1: 1222 | version "6.2.1" 1223 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" 1224 | integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== 1225 | 1226 | wrap-ansi@^7.0.0: 1227 | version "7.0.0" 1228 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1229 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1230 | dependencies: 1231 | ansi-styles "^4.0.0" 1232 | string-width "^4.1.0" 1233 | strip-ansi "^6.0.0" 1234 | 1235 | wrappy@1: 1236 | version "1.0.2" 1237 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1238 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1239 | 1240 | ws@>=8.11.0: 1241 | version "8.12.0" 1242 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" 1243 | integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== 1244 | 1245 | y18n@^5.0.5: 1246 | version "5.0.8" 1247 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1248 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1249 | 1250 | yargs-parser@20.2.4: 1251 | version "20.2.4" 1252 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1253 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1254 | 1255 | yargs-parser@^20.2.2: 1256 | version "20.2.9" 1257 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1258 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1259 | 1260 | yargs-unparser@2.0.0: 1261 | version "2.0.0" 1262 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1263 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1264 | dependencies: 1265 | camelcase "^6.0.0" 1266 | decamelize "^4.0.0" 1267 | flat "^5.0.2" 1268 | is-plain-obj "^2.1.0" 1269 | 1270 | yargs@16.2.0: 1271 | version "16.2.0" 1272 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1273 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1274 | dependencies: 1275 | cliui "^7.0.2" 1276 | escalade "^3.1.1" 1277 | get-caller-file "^2.0.5" 1278 | require-directory "^2.1.1" 1279 | string-width "^4.2.0" 1280 | y18n "^5.0.5" 1281 | yargs-parser "^20.2.2" 1282 | 1283 | yocto-queue@^0.1.0: 1284 | version "0.1.0" 1285 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1286 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1287 | --------------------------------------------------------------------------------