{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "rune-icons-codemod",
  "title": "rune-icons-codemod",
  "description": "A Node script that moves a codebase from Tabler, lucide and react-icons (tb, lu) to the rune icons, with the name map it reads.",
  "files": [
    {
      "path": "scripts/rune-icons/codemod.mjs",
      "content": "#!/usr/bin/env node\n/**\n * Moves a codebase from Tabler, lucide and react-icons (tb, lu) to Dwellir's\n * rune icons, using rune-icon-map.json beside this file.\n *\n *   node scripts/rune-icons/codemod.mjs [--import <path>] [--dry-run] <dir|file>...\n *\n * It rewrites the imports and the re-exports, renames each icon where the code\n * uses it (JSX tags, props, lists, types), drops the stroke props a rune does\n * not take, and gives an unsized JSX icon its old library's default size. It\n * touches only the names an icon import binds: never other modules' imports,\n * strings, comments or JSX text. A name with no rune stays with its library;\n * the report lists each one, so a person can draw or choose a rune for it.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst LIBRARIES = {\n  '@tabler/icons-react': 'tabler',\n  'lucide-react': 'lucide',\n  'react-icons/tb': 'react-icons',\n  'react-icons/lu': 'react-icons',\n};\n/** The size each library draws at when the caller sets none. A rune has no default. */\nconst DEFAULT_SIZE = { tabler: '{24}', lucide: '{24}', 'react-icons': '\"1em\"' };\n/** Props that set a stroke width. A rune's stroke is fixed at 1.75. */\nconst DROPPED_PROPS = {\n  tabler: ['stroke', 'strokeWidth'],\n  lucide: ['strokeWidth', 'absoluteStrokeWidth'],\n  'react-icons': ['strokeWidth'],\n};\nconst SIZE_PROPS = new Set(['size', 'width', 'height']);\nconst SIZE_CLASS = /\\b(?:size|h|w)-/;\n// Keep barrel imports: the installed per-icon modules handle route isolation.\nconst DEFAULT_IMPORT = '@/components/brand/rune-icons';\nconst SOURCE_FILE = /\\.(?:[cm]?[jt]sx?)$/;\nconst SKIP_DIRS = new Set(['node_modules', '.git', '.next', 'dist', 'build', 'coverage']);\n\n// These read the masked source (see maskSource), so a comment or a string\n// never looks like an import. Module names survive the mask.\nconst IMPORT =\n  /^[ \\t]*import\\s+(type\\s+)?([\\w$*{][^;]*?)\\s*\\bfrom\\s*(['\"])([^'\"\\n]*)\\3[ \\t]*;?[ \\t]*(?:\\r?\\n)?/gm;\nconst EXPORT_FROM =\n  /^[ \\t]*export\\s+(type\\s+)?(\\*(?:\\s+as\\s+[\\w$]+)?|\\{[^}]*\\})\\s*from\\s*(['\"])([^'\"\\n]*)\\3[ \\t]*;?[ \\t]*(?:\\r?\\n)?/gm;\nconst DEEP_MODULE = /^(?:lucide-react|@tabler\\/icons-react)\\//;\nconst ID_START = /[A-Za-z_$]/;\nconst ID_CHAR = /[\\w$]/;\nconst EXPRESSION_KEYWORDS = new Set([\n  'return',\n  'yield',\n  'await',\n  'case',\n  'default',\n  'else',\n  'do',\n  'in',\n  'of',\n  'typeof',\n  'void',\n  'delete',\n  'new',\n  'throw',\n  'extends',\n  'keyof',\n]);\nconst VALUE_ENDS = new Set([')', ']', 'id', 'num', 'str', 'jsx']);\nconst NOT_JSX = Symbol('not jsx');\n\nconst lineOf = (source, offset) => source.slice(0, offset).split('\\n').length;\n\n/** Splits `type A as B` into its parts. */\nfunction parseSpecifier(raw, declarationIsType) {\n  const text = raw.trim();\n  if (!text) return null;\n  const typeOnly = declarationIsType || /^type\\s/.test(text);\n  const [imported, local = imported] = text.replace(/^type\\s+/, '').split(/\\s+as\\s+/);\n  return { imported, local, typeOnly, text };\n}\n\n/** Every import and re-export the file makes, read from its masked source. */\nfunction readDeclarations(masked) {\n  const declaration = (kind) => (match) => ({\n    kind,\n    start: match.index,\n    end: match.index + match[0].length,\n    semicolon: match[0].includes(';'),\n    typeOnly: Boolean(match[1]),\n    clause: match[2],\n    quote: match[3],\n    module: match[4],\n  });\n  return [\n    ...[...masked.matchAll(IMPORT)].map(declaration('import')),\n    ...[...masked.matchAll(EXPORT_FROM)].map(declaration('export')),\n  ];\n}\n\n/** The named specifiers of a `{ ... }` clause, or null for a default or namespace clause. */\nfunction namedSpecifiers(clause, typeOnly) {\n  const match = /^\\{([^}]*)\\}$/.exec(clause.trim());\n  if (!match) return null;\n  return match[1]\n    .split(',')\n    .map((raw) => parseSpecifier(raw, typeOnly))\n    .filter(Boolean);\n}\n\n/** The local names an import clause binds: its default, its namespace and its named imports. */\nfunction clauseBindings(clause) {\n  const named = /\\{([^}]*)\\}/.exec(clause);\n  const locals = named ? named[1].split(',').map((raw) => parseSpecifier(raw, false)?.local) : [];\n  const head = clause\n    .replace(/\\{[^}]*\\}/, '')\n    .replace(/,/g, ' ')\n    .trim();\n  const namespace = /\\*\\s*as\\s+([\\w$]+)/.exec(head);\n  if (namespace) locals.push(namespace[1]);\n  else if (/^[\\w$]+$/.test(head)) locals.push(head);\n  return locals.filter(Boolean);\n}\n\n/** The icon imports and re-exports, each name with its rune. */\nfunction readIconDeclarations(declarations, map) {\n  return declarations\n    .filter((declaration) => LIBRARIES[declaration.module])\n    .map((declaration) => {\n      const library = LIBRARIES[declaration.module];\n      const specifiers = namedSpecifiers(declaration.clause, declaration.typeOnly)?.map((spec) => ({\n        ...spec,\n        rune: map[library]?.[spec.imported],\n      }));\n      return { ...declaration, library, specifiers };\n    });\n}\n\nconst declares = (masked, name) =>\n  new RegExp(`\\\\b(?:const|let|var|function|class|type|interface|enum)\\\\s+${name}\\\\b`).test(masked);\n\n/** True when the file already binds `name` to something other than the rune part. */\nfunction nameTaken(masked, declarations, name, importPath) {\n  if (declares(masked, name)) return true;\n  return declarations.some(\n    (declaration) =>\n      declaration.kind === 'import' &&\n      declaration.module !== importPath &&\n      clauseBindings(declaration.clause).includes(name),\n  );\n}\n\n/** Decides the local name of each rune: the rune itself, or the old name when the rune name is taken. */\nfunction planRenames({ masked, declarations, icons, importPath }) {\n  const renames = new Map();\n  for (const { kind, library, specifiers } of icons) {\n    if (kind !== 'import' || !specifiers) continue;\n    for (const spec of specifiers) {\n      if (!spec.rune) continue;\n      const aliased =\n        spec.local !== spec.rune && nameTaken(masked, declarations, spec.rune, importPath);\n      renames.set(spec.local, { rune: spec.rune, library, aliased, typeOnly: spec.typeOnly });\n    }\n  }\n  return renames;\n}\n\n/**\n * A small scanner for JS, TS and JSX. It knows strings, templates, comments,\n * regex literals and JSX, so a rename lands only on real identifiers.\n */\nclass Scanner {\n  constructor(text, renames, jsx) {\n    Object.assign(this, { text, renames, jsx, i: 0, last: null, stack: [], edits: [], words: [] });\n    /** Ranges no import can live in: comments, string and template text, regexes, JSX text. */\n    this.inert = [];\n  }\n\n  markInert(start, end) {\n    if (end > start) this.inert.push([start, end]);\n  }\n\n  scan() {\n    this.scanCode(null);\n    return this.edits;\n  }\n\n  peek(offset = 0) {\n    return this.text[this.i + offset] ?? '';\n  }\n\n  indexOrEnd(needle, from) {\n    const found = this.text.indexOf(needle, from);\n    return found === -1 ? this.text.length : found;\n  }\n\n  /** Steps over one space or comment; false when there is none. */\n  skipOneTrivia() {\n    const c = this.peek();\n    const start = this.i;\n    if (/\\s/.test(c)) {\n      this.i++;\n      return true;\n    }\n    if (c === '/' && this.peek(1) === '/') this.i = this.indexOrEnd('\\n', this.i);\n    else if (c === '/' && this.peek(1) === '*') this.i = this.indexOrEnd('*/', this.i + 2) + 2;\n    else return false;\n    this.markInert(start, this.i);\n    return true;\n  }\n\n  skipTrivia() {\n    while (this.skipOneTrivia());\n  }\n\n  nextChar(from) {\n    const saved = this.i;\n    this.i = from;\n    this.skipTrivia();\n    const at = this.i;\n    this.i = saved;\n    return { char: this.text[at], at };\n  }\n\n  /** Steps over a string. A module name (after `from` or `import`) stays live, so imports keep it. */\n  skipString(quote) {\n    const start = ++this.i;\n    while (this.i < this.text.length && this.peek() !== quote)\n      this.i += this.peek() === '\\\\' ? 2 : 1;\n    const word = this.words.at(-1);\n    if (!(this.last === 'id' && (word === 'from' || word === 'import')))\n      this.markInert(start, this.i);\n    this.i++;\n  }\n\n  skipTemplate() {\n    let start = ++this.i;\n    while (this.i < this.text.length && this.peek() !== '`') {\n      if (this.peek() === '\\\\') this.i += 2;\n      else if (this.peek() === '$' && this.peek(1) === '{') {\n        this.markInert(start, this.i);\n        this.i += 2;\n        this.scanCode('}');\n        start = this.i;\n      } else this.i++;\n    }\n    this.markInert(start, this.i);\n    this.i++;\n  }\n\n  skipRegex() {\n    let inClass = false;\n    const start = this.i++;\n    while (this.i < this.text.length && this.peek() !== '\\n') {\n      const c = this.peek();\n      if (c === '/' && !inClass) break;\n      if (c === '[' || c === ']') inClass = c === '[';\n      this.i += c === '\\\\' ? 2 : 1;\n    }\n    this.i++;\n    while (ID_CHAR.test(this.peek())) this.i++;\n    this.markInert(start, this.i);\n  }\n\n  lastIsValue() {\n    return VALUE_ENDS.has(this.last) || this.last === '}';\n  }\n\n  readWhile(pattern) {\n    const start = this.i;\n    while (pattern.test(this.peek())) this.i++;\n    return { word: this.text.slice(start, this.i), start, end: this.i };\n  }\n\n  /** How an identifier is used: a member or key keeps its name; a shorthand or export needs a longer rewrite. */\n  usage(end) {\n    if (this.last === '.' || this.last === '?.') return 'member';\n    const top = this.stack.at(-1);\n    if (top?.char !== '{') return 'reference';\n    const next = this.nextChar(end);\n    if (top.exportClause) return this.text.startsWith('as', next.at) ? 'reference' : 'export';\n    if (this.last !== '{' && this.last !== ',') return 'reference';\n    if (next.char === ':' || this.text.startsWith('?:', next.at)) return 'key';\n    return next.char === ',' || next.char === '}' ? 'shorthand' : 'reference';\n  }\n\n  renameIdentifier({ word, start, end }) {\n    const target = this.renames.get(word);\n    if (!target || target.aliased) return;\n    const replacement = {\n      member: null,\n      key: null,\n      reference: target.rune,\n      shorthand: `${word}: ${target.rune}`,\n      export: `${target.rune} as ${word}`,\n    }[this.usage(end)];\n    if (replacement) this.edits.push({ start, end, text: replacement });\n  }\n\n  scanIdentifier() {\n    const token = this.readWhile(ID_CHAR);\n    this.words.push(token.word);\n    this.renameIdentifier(token);\n    this.last = EXPRESSION_KEYWORDS.has(token.word) ? 'keyword' : 'id';\n  }\n\n  openBracket(c) {\n    const [before, beforeThat] = [this.words.at(-1), this.words.at(-2)];\n    const afterExport = before === 'export' || (before === 'type' && beforeThat === 'export');\n    this.stack.push({ char: c, exportClause: c === '{' && this.last === 'id' && afterExport });\n    this.i++;\n    this.last = c;\n  }\n\n  closeBracket(c) {\n    this.stack.pop();\n    this.i++;\n    this.last = c;\n  }\n\n  scanPunctuation(c) {\n    const two = this.text.slice(this.i, this.i + 2);\n    let token = c;\n    if (this.text.startsWith('...', this.i)) token = '...';\n    else if (['=>', '?.', '&&', '||', '??'].includes(two)) token = two;\n    this.i += token.length;\n    this.last = token;\n  }\n\n  skipLiteral(c) {\n    if (c === '`') this.skipTemplate();\n    else if (c === '/') this.skipRegex();\n    else if (/\\d/.test(c)) this.readWhile(/[\\w.]/);\n    else this.skipString(c);\n    this.last = /\\d/.test(c) ? 'num' : 'str';\n  }\n\n  scanToken(c) {\n    const literal = c === '\"' || c === \"'\" || c === '`' || /\\d/.test(c);\n    if (literal || (c === '/' && !this.lastIsValue())) return this.skipLiteral(c);\n    if (ID_START.test(c)) return this.scanIdentifier();\n    if (c === '<' && this.jsx && !this.lastIsValue() && this.tryJsx()) {\n      this.last = 'jsx';\n      return;\n    }\n    if ('{(['.includes(c)) return this.openBracket(c);\n    if ('})]'.includes(c)) return this.closeBracket(c);\n    this.scanPunctuation(c);\n  }\n\n  /** Scans code until the bracket that closes it; with no stop, to the end. */\n  scanCode(stop) {\n    const outer = { stack: this.stack, last: this.last };\n    this.stack = [];\n    this.last = null;\n    for (;;) {\n      this.skipTrivia();\n      if (this.i >= this.text.length) break;\n      const c = this.peek();\n      if (stop && c === stop && this.stack.length === 0) {\n        this.i++;\n        break;\n      }\n      this.scanToken(c);\n    }\n    Object.assign(this, outer);\n  }\n\n  tryJsx() {\n    const saved = {\n      i: this.i,\n      edits: this.edits.length,\n      words: this.words.length,\n      inert: this.inert.length,\n    };\n    try {\n      this.scanElement();\n      return true;\n    } catch (error) {\n      if (error !== NOT_JSX) throw error;\n      this.i = saved.i;\n      this.edits.length = saved.edits;\n      this.words.length = saved.words;\n      this.inert.length = saved.inert;\n      return false;\n    }\n  }\n\n  readTagName() {\n    if (!ID_START.test(this.peek())) throw NOT_JSX;\n    const { word, start, end } = this.readWhile(/[\\w$.:-]/);\n    return { name: word, start, end };\n  }\n\n  renameTag({ name, start, end }) {\n    const target = this.renames.get(name);\n    if (target && !target.aliased) this.edits.push({ start, end, text: target.rune });\n    return target;\n  }\n\n  scanAttributeValue() {\n    const c = this.peek();\n    if (c === '\"' || c === \"'\") return this.skipString(c);\n    if (c === '<') return this.scanElement();\n    if (c !== '{') throw NOT_JSX;\n    this.i++;\n    this.scanCode('}');\n  }\n\n  scanNamedAttribute(element, removeFrom) {\n    if (!ID_START.test(this.peek())) throw NOT_JSX;\n    const { word: name } = this.readWhile(/[\\w$:-]/);\n    const valueStart = this.i;\n    this.skipTrivia();\n    if (this.peek() === '=') {\n      this.i++;\n      this.skipTrivia();\n      this.scanAttributeValue();\n    } else this.i = valueStart;\n    element.attributes.push({\n      name,\n      removeFrom,\n      end: this.i,\n      value: this.text.slice(valueStart, this.i),\n    });\n  }\n\n  /** Reads one attribute or the end of the tag: 'more', 'self' (/>) or 'open' (>). */\n  scanAttribute(element) {\n    const removeFrom = this.i;\n    this.skipTrivia();\n    if (this.text.startsWith('/>', this.i)) {\n      this.i += 2;\n      return 'self';\n    }\n    if (this.peek() === '>') {\n      this.i++;\n      return 'open';\n    }\n    if (this.peek() === '{') {\n      this.i++;\n      this.scanCode('}');\n      element.attributes.push({ name: '...', removeFrom, end: this.i, value: '' });\n    } else this.scanNamedAttribute(element, removeFrom);\n    return 'more';\n  }\n\n  scanClosingTag() {\n    this.i += 2;\n    this.skipTrivia();\n    if (this.peek() !== '>') this.renameTag(this.readTagName());\n    this.skipTrivia();\n    if (this.peek() !== '>') throw NOT_JSX;\n    this.i++;\n  }\n\n  /** Steps over JSX text, an expression or a child; true at the closing tag. */\n  scanChild() {\n    if (this.i >= this.text.length) throw NOT_JSX;\n    const c = this.peek();\n    if (c === '<' && this.peek(1) === '/') {\n      this.scanClosingTag();\n      return true;\n    }\n    if (c === '<') this.scanElement();\n    else if (c === '{') {\n      this.i++;\n      this.scanCode('}');\n    } else this.skipJsxText();\n    return false;\n  }\n\n  skipJsxText() {\n    const start = this.i;\n    while (this.i < this.text.length && this.peek() !== '<' && this.peek() !== '{') this.i++;\n    this.markInert(start, this.i);\n  }\n\n  scanChildren() {\n    while (!this.scanChild());\n  }\n\n  /** Drops the stroke props and keeps the old library's default size. */\n  fixIconProps(element, target) {\n    for (const attribute of element.attributes) {\n      if (DROPPED_PROPS[target.library].includes(attribute.name)) {\n        this.edits.push({ start: attribute.removeFrom, end: attribute.end, text: '' });\n      }\n    }\n    const sized = element.attributes.some(\n      (a) => SIZE_PROPS.has(a.name) || (a.name === 'className' && SIZE_CLASS.test(a.value)),\n    );\n    if (sized) return;\n    const at = element.tagEnd;\n    this.edits.push({ start: at, end: at, text: ` size=${DEFAULT_SIZE[target.library]}` });\n  }\n\n  scanElement() {\n    this.i++;\n    if (this.peek() === '>') {\n      this.i++;\n      return this.scanChildren();\n    }\n    const tag = this.readTagName();\n    const target = this.renameTag(tag);\n    const element = { tagEnd: tag.end, attributes: [] };\n    let state = 'more';\n    while (state === 'more') state = this.scanAttribute(element);\n    if (target) this.fixIconProps(element, target);\n    if (state === 'open') this.scanChildren();\n  }\n}\n\nfunction applyEdits(text, edits) {\n  let out = text;\n  // Last edit first, so earlier offsets stay valid. At one offset, a removal goes before an insert.\n  const ordered = [...edits].sort((a, b) => b.start - a.start || b.end - a.end);\n  for (const { start, end, text: replacement } of ordered) {\n    out = out.slice(0, start) + replacement + out.slice(end);\n  }\n  return out;\n}\n\nfunction runeSpecifiers(renames) {\n  const byName = new Map();\n  for (const [local, { rune, aliased, typeOnly }] of renames) {\n    const name = aliased ? `${rune} as ${local}` : rune;\n    const seen = byName.get(name);\n    byName.set(name, { name, typeOnly: seen ? seen.typeOnly && typeOnly : typeOnly });\n  }\n  return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nconst statement = (keyword, names, quote, module, semicolon) =>\n  `${keyword} { ${names.join(', ')} } from ${quote}${module}${quote}${semicolon ? ';' : ''}\\n`;\n\n/** Rewrites the icon imports: kept names stay, mapped names move to one rune import. */\nfunction importEdits({ masked, declarations, icons, renames, importPath }) {\n  const imports = icons.filter((icon) => icon.kind === 'import' && icon.specifiers);\n  const edits = imports.map(({ start, end, typeOnly, specifiers, quote, module, semicolon }) => {\n    const kept = specifiers.filter((spec) => !spec.rune).map((spec) => spec.text);\n    const keyword = typeOnly ? 'import type' : 'import';\n    return {\n      start,\n      end,\n      text: kept.length ? statement(keyword, kept, quote, module, semicolon) : '',\n    };\n  });\n  const specifiers = runeSpecifiers(renames);\n  if (!specifiers.length) return edits;\n  const allTypes = specifiers.every((spec) => spec.typeOnly);\n  const names = specifiers.map((spec) =>\n    spec.typeOnly && !allTypes ? `type ${spec.name}` : spec.name,\n  );\n  const existing = declarations.find(\n    (d) => d.kind === 'import' && d.module === importPath && !d.typeOnly && /^\\{/.test(d.clause),\n  );\n  if (existing && !allTypes) {\n    const current = namedSpecifiers(existing.clause, false).map((spec) => spec.text);\n    const merged = [...new Set([...current, ...names])].sort((a, b) =>\n      a.replace(/^type /, '').localeCompare(b.replace(/^type /, '')),\n    );\n    const start = existing.start + masked.slice(existing.start).indexOf('{');\n    const end = start + existing.clause.trim().length;\n    edits.push({ start, end, text: `{ ${merged.join(', ')} }` });\n    return edits;\n  }\n  const [first] = imports;\n  const line = statement(\n    allTypes ? 'import type' : 'import',\n    names,\n    first.quote,\n    importPath,\n    first.semicolon,\n  );\n  edits.push({ start: first.start, end: first.start, text: line });\n  return edits;\n}\n\n/** Moves `export { Check } from 'lucide-react'` to the runes, keeping each public name. */\nfunction reexportEdits({ icons, importPath }) {\n  const reexports = icons.filter((icon) => icon.kind === 'export' && icon.specifiers);\n  return reexports.map(({ start, end, typeOnly, specifiers, quote, module, semicolon }) => {\n    const keyword = typeOnly ? 'export type' : 'export';\n    const moved = specifiers\n      .filter((spec) => spec.rune)\n      .map(({ rune, local, typeOnly: typeSpec }) => {\n        const name = rune === local ? rune : `${rune} as ${local}`;\n        return typeSpec && !typeOnly ? `type ${name}` : name;\n      });\n    const kept = specifiers.filter((spec) => !spec.rune).map((spec) => spec.text);\n    const text = [\n      moved.length ? statement(keyword, moved, quote, importPath, semicolon) : '',\n      kept.length ? statement(keyword, kept, quote, module, semicolon) : '',\n    ].join('');\n    return { start, end, text };\n  });\n}\n\n/** The source with each range blanked to spaces, keeping every offset and line. */\nconst blankRanges = (text, ranges) => {\n  const chars = [...text];\n  for (const [start, end] of ranges) {\n    for (let i = start; i < end; i++) if (chars[i] !== '\\n') chars[i] = ' ';\n  }\n  return chars.join('');\n};\n\n/** The source with comments, string text, regexes and JSX text blanked. Module names stay. */\nfunction maskSource(source, jsx) {\n  const scanner = new Scanner(source, new Map(), jsx);\n  scanner.scan();\n  return blankRanges(source, scanner.inert);\n}\n\n/** A default, namespace or `export *` declaration: the codemod leaves it and reports it. */\nconst wholeModule = ({ kind }) =>\n  kind === 'export' ? '(export *)' : '(default or namespace import)';\n\nfunction report(source, icons, map) {\n  const unmapped = [];\n  const near = [];\n  for (const icon of icons) {\n    const line = lineOf(source, icon.start);\n    const { module, library, specifiers } = icon;\n    if (!specifiers) unmapped.push({ line, module, name: wholeModule(icon) });\n    for (const spec of specifiers ?? []) {\n      const note = map.near?.[`${library}:${spec.imported}`];\n      if (!spec.rune) unmapped.push({ line, module, name: spec.imported });\n      else if (note) near.push({ line, name: spec.imported, rune: spec.rune, note });\n    }\n  }\n  return { unmapped, near };\n}\n\nconst deepImports = (source, declarations) =>\n  declarations\n    .filter((declaration) => DEEP_MODULE.test(declaration.module))\n    .map(({ start, module }) => ({ line: lineOf(source, start), module, name: '(deep import)' }));\n\n/**\n * Rewrites one file's source. Returns the new code, the names left in place\n * and the names mapped to a near match.\n */\nexport function transform(source, { fileName = 'file.tsx', map, importPath = DEFAULT_IMPORT }) {\n  const jsx = !/\\.[cm]?ts$/.test(fileName);\n  const masked = maskSource(source, jsx);\n  const declarations = readDeclarations(masked);\n  const icons = readIconDeclarations(declarations, map);\n  const { unmapped, near } = report(source, icons, map);\n  unmapped.push(...deepImports(source, declarations));\n  const plan = { masked, declarations, icons, importPath };\n  const renames = planRenames(plan);\n  const reexports = reexportEdits(plan);\n  if (\n    !renames.size &&\n    !reexports.some((edit) => edit.text !== source.slice(edit.start, edit.end))\n  ) {\n    return { code: source, changed: false, unmapped, near };\n  }\n  // Imports and re-exports never use a local name, so the rename scan skips them all.\n  const body = blankRanges(\n    source,\n    declarations.map(({ start, end }) => [start, end]),\n  );\n  const code = applyEdits(source, [\n    ...new Scanner(body, renames, jsx).scan(),\n    ...importEdits({ ...plan, renames }),\n    ...reexports,\n  ]);\n  return { code, changed: code !== source, unmapped, near };\n}\n\nfunction* sourceFiles(target) {\n  const stat = fs.statSync(target);\n  if (stat.isFile()) {\n    if (SOURCE_FILE.test(target)) yield target;\n    return;\n  }\n  for (const entry of fs.readdirSync(target, { withFileTypes: true })) {\n    if (entry.isDirectory() && SKIP_DIRS.has(entry.name)) continue;\n    yield* sourceFiles(path.join(target, entry.name));\n  }\n}\n\nfunction parseArgs(argv) {\n  const options = { importPath: DEFAULT_IMPORT, dryRun: false, targets: [], mapFile: null };\n  for (let i = 0; i < argv.length; i++) {\n    const arg = argv[i];\n    if (arg === '--import') options.importPath = argv[++i];\n    else if (arg === '--map') options.mapFile = argv[++i];\n    else if (arg === '--dry-run') options.dryRun = true;\n    else options.targets.push(arg);\n  }\n  return options;\n}\n\n/** Runs the codemod over files and folders; returns what it changed and what it left. */\nexport function run(argv, log = console.log) {\n  const options = parseArgs(argv);\n  const mapFile =\n    options.mapFile ?? fileURLToPath(new URL('./rune-icon-map.json', import.meta.url));\n  const map = JSON.parse(fs.readFileSync(mapFile, 'utf8'));\n  const result = { changed: [], unmapped: [], near: [] };\n  const files = options.targets.flatMap((target) => [...sourceFiles(target)]);\n  for (const file of files) migrateFile(file, { map, options, result });\n  printReport(result, options, log);\n  return result;\n}\n\nfunction migrateFile(file, { map, options, result }) {\n  const source = fs.readFileSync(file, 'utf8');\n  const out = transform(source, { fileName: file, map, importPath: options.importPath });\n  for (const entry of out.unmapped) result.unmapped.push({ file, ...entry });\n  for (const entry of out.near) result.near.push({ file, ...entry });\n  if (!out.changed) return;\n  result.changed.push(file);\n  if (!options.dryRun) fs.writeFileSync(file, out.code);\n}\n\nfunction printReport({ changed, unmapped, near }, { dryRun }, log) {\n  log(`rune-icons codemod: ${changed.length} file(s) ${dryRun ? 'would change' : 'changed'}.`);\n  if (unmapped.length) {\n    log(`\\n${unmapped.length} name(s) have no rune and stay imported from their library:`);\n    for (const { file, line, module, name } of unmapped)\n      log(`  ${file}:${line}  ${module}  ${name}`);\n  }\n  if (near.length) {\n    log(`\\n${near.length} name(s) map to a rune with a different picture. Check each one:`);\n    for (const { file, line, name, rune, note } of near)\n      log(`  ${file}:${line}  ${name} -> ${rune}: ${note}`);\n  }\n}\n\nif (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {\n  run(process.argv.slice(2));\n}\n",
      "type": "registry:file",
      "target": "~/scripts/rune-icons/codemod.mjs"
    },
    {
      "path": "scripts/rune-icons/rune-icon-map.json",
      "content": "{\n  \"$comment\": \"Library icon name -> rune icon name. Keys under \\\"near\\\" mark a name whose picture differs from its rune.\",\n  \"tabler\": {\n    \"Icon\": \"RuneIcon\",\n    \"IconActivity\": \"RuneActivity\",\n    \"IconAlertCircle\": \"RuneAlert\",\n    \"IconAlertOctagon\": \"RuneAlert\",\n    \"IconAlertTriangle\": \"RuneWarning\",\n    \"IconApi\": \"RuneApi\",\n    \"IconAppWindow\": \"RuneWindow\",\n    \"IconArrowBackUp\": \"RuneReset\",\n    \"IconArrowDown\": \"RuneArrowDown\",\n    \"IconArrowDownRight\": \"RuneArrowDownRight\",\n    \"IconArrowLeft\": \"RuneArrowLeft\",\n    \"IconArrowRight\": \"RuneArrowRight\",\n    \"IconArrowsMaximize\": \"RuneMaximize\",\n    \"IconArrowsMinimize\": \"RuneMinimize\",\n    \"IconArrowsSort\": \"RuneArrowUpDown\",\n    \"IconArrowsUpDown\": \"RuneArrowUpDown\",\n    \"IconArrowsVertical\": \"RuneArrowUpDown\",\n    \"IconArrowUp\": \"RuneArrowUp\",\n    \"IconArrowUpRight\": \"RuneArrowUpRight\",\n    \"IconAward\": \"RuneTrophy\",\n    \"IconBeer\": \"RuneBeer\",\n    \"IconBell\": \"RuneBell\",\n    \"IconBellOff\": \"RuneBellOff\",\n    \"IconBolt\": \"RuneBolt\",\n    \"IconBook\": \"RuneDocs\",\n    \"IconBook2\": \"RuneBook\",\n    \"IconBraces\": \"RuneBraces\",\n    \"IconBroadcast\": \"RuneBroadcast\",\n    \"IconBrowser\": \"RuneWindow\",\n    \"IconBuilding\": \"RuneAccount\",\n    \"IconCalculator\": \"RuneCalculator\",\n    \"IconCalendar\": \"RuneCalendar\",\n    \"IconCalendarEvent\": \"RuneCalendarEvent\",\n    \"IconCalendarStats\": \"RuneCalendarStats\",\n    \"IconChartArea\": \"RuneChartArea\",\n    \"IconChartBar\": \"RuneChartBar\",\n    \"IconChartCandle\": \"RuneChartCandle\",\n    \"IconChartLine\": \"RuneChartLine\",\n    \"IconCheck\": \"RuneCheck\",\n    \"IconChevronDown\": \"RuneChevronDown\",\n    \"IconChevronLeft\": \"RuneChevronLeft\",\n    \"IconChevronLeftPipe\": \"RuneChevronFirst\",\n    \"IconChevronRight\": \"RuneChevronRight\",\n    \"IconChevronRightPipe\": \"RuneChevronLast\",\n    \"IconChevronsDown\": \"RuneChevronsDown\",\n    \"IconChevronsLeft\": \"RuneChevronsLeft\",\n    \"IconChevronsRight\": \"RuneChevronsRight\",\n    \"IconChevronsUp\": \"RuneChevronsUp\",\n    \"IconChevronUp\": \"RuneChevronUp\",\n    \"IconCircle\": \"RuneCircle\",\n    \"IconCircleCheck\": \"RuneSuccess\",\n    \"IconCircleCheckFilled\": \"RuneSuccessSolid\",\n    \"IconCircleX\": \"RuneError\",\n    \"IconClock\": \"RuneClock\",\n    \"IconClockX\": \"RuneExpiring\",\n    \"IconCloud\": \"RuneCloud\",\n    \"IconCloudComputing\": \"RuneCloud\",\n    \"IconCloudDownload\": \"RuneCloudDownload\",\n    \"IconCode\": \"RuneCode\",\n    \"IconCoin\": \"RuneBilling\",\n    \"IconCoins\": \"RuneCoins\",\n    \"IconColumns\": \"RuneColumns\",\n    \"IconColumns3\": \"RuneColumns\",\n    \"IconCompass\": \"RuneCompass\",\n    \"IconComponents\": \"RuneComponent\",\n    \"IconCopy\": \"RuneCopy\",\n    \"IconCornerDownLeft\": \"RuneEnter\",\n    \"IconCpu\": \"RuneChip\",\n    \"IconCreditCard\": \"RuneCreditCard\",\n    \"IconCrown\": \"RuneCrown\",\n    \"IconCurrencyDollar\": \"RuneDollar\",\n    \"IconDatabase\": \"RuneDatabase\",\n    \"IconDeviceDesktop\": \"RuneMonitor\",\n    \"IconDeviceFloppy\": \"RuneSave\",\n    \"IconDiscount\": \"RuneDiscount\",\n    \"IconDiscount2\": \"RuneDiscount\",\n    \"IconDots\": \"RuneMore\",\n    \"IconDotsVertical\": \"RuneMoreVertical\",\n    \"IconDownload\": \"RuneDownload\",\n    \"IconEdit\": \"RuneEdit\",\n    \"IconError404\": \"RuneNotFound\",\n    \"IconExclamationCircle\": \"RuneAlert\",\n    \"IconExternalLink\": \"RuneExternalLink\",\n    \"IconEye\": \"RuneEye\",\n    \"IconEyeOff\": \"RuneEyeOff\",\n    \"IconFile\": \"RuneFile\",\n    \"IconFileAnalytics\": \"RuneReport\",\n    \"IconFileCode\": \"RuneFileCode\",\n    \"IconFileDownload\": \"RuneFileDownload\",\n    \"IconFileExport\": \"RuneFileExport\",\n    \"IconFileText\": \"RuneFile\",\n    \"IconFilter\": \"RuneFilter\",\n    \"IconFlame\": \"RuneFlame\",\n    \"IconGasStation\": \"RuneFuel\",\n    \"IconGauge\": \"RuneGauge\",\n    \"IconGripVertical\": \"RuneGrip\",\n    \"IconHandStop\": \"RuneHandStop\",\n    \"IconHash\": \"RuneHash\",\n    \"IconHeadset\": \"RuneHeadset\",\n    \"IconHeart\": \"RuneHeart\",\n    \"IconHelp\": \"RuneHelp\",\n    \"IconHelpCircle\": \"RuneHelp\",\n    \"IconHistory\": \"RuneHistory\",\n    \"IconHome\": \"RuneHome\",\n    \"IconHome2\": \"RuneHome\",\n    \"IconInbox\": \"RuneInbox\",\n    \"IconInfinity\": \"RuneInfinity\",\n    \"IconInfoCircle\": \"RuneInfo\",\n    \"IconKey\": \"RuneKey\",\n    \"IconLayoutDashboard\": \"RuneDashboard\",\n    \"IconLayoutGrid\": \"RuneLayoutGrid\",\n    \"IconLayoutNavbar\": \"RuneWindow\",\n    \"IconLayoutSidebar\": \"RuneSidebar\",\n    \"IconLayoutSidebarLeftCollapse\": \"RuneSidebarCollapse\",\n    \"IconLayoutSidebarLeftExpand\": \"RuneSidebarExpand\",\n    \"IconLifebuoy\": \"RuneLifebuoy\",\n    \"IconLink\": \"RuneLink\",\n    \"IconList\": \"RuneList\",\n    \"IconListCheck\": \"RuneListCheck\",\n    \"IconListNumbers\": \"RuneListOrdered\",\n    \"IconLoader\": \"RuneLoader\",\n    \"IconLoader2\": \"RuneLoader\",\n    \"IconLock\": \"RuneLock\",\n    \"IconLogin\": \"RuneLogin\",\n    \"IconLogin2\": \"RuneLogin\",\n    \"IconLogout\": \"RuneLogout\",\n    \"IconLogout2\": \"RuneLogout\",\n    \"IconLogs\": \"RuneLogs\",\n    \"IconMail\": \"RuneMail\",\n    \"IconMaximize\": \"RuneMaximize\",\n    \"IconMenu\": \"RuneMenu\",\n    \"IconMenu2\": \"RuneMenu\",\n    \"IconMessage\": \"RuneMessage\",\n    \"IconMessageCircle\": \"RuneMessage\",\n    \"IconMinimize\": \"RuneMinimize\",\n    \"IconMinus\": \"RuneMinus\",\n    \"IconMoon\": \"RuneMoon\",\n    \"IconNetwork\": \"RuneNetwork\",\n    \"IconNumber123\": \"RuneNumber\",\n    \"IconNut\": \"RuneNut\",\n    \"IconPencil\": \"RuneEdit\",\n    \"IconPercentage\": \"RunePercent\",\n    \"IconPhone\": \"RunePhone\",\n    \"IconPin\": \"RunePin\",\n    \"IconPlayerPause\": \"RunePause\",\n    \"IconPlayerPlay\": \"RunePlay\",\n    \"IconPlayerStop\": \"RuneStop\",\n    \"IconPlayerStopFilled\": \"RuneStopSolid\",\n    \"IconPlayerTrackPrev\": \"RuneRewind\",\n    \"IconPlug\": \"RunePlug\",\n    \"IconPlugConnected\": \"RunePlug\",\n    \"IconPlus\": \"RunePlus\",\n    \"IconPoint\": \"RuneDot\",\n    \"IconPointFilled\": \"RuneDot\",\n    \"IconPower\": \"RunePower\",\n    \"IconProps\": \"RuneIconProps\",\n    \"IconPuzzle\": \"RunePuzzle\",\n    \"IconReceipt\": \"RuneReceipt\",\n    \"IconRefresh\": \"RuneRefresh\",\n    \"IconRepeat\": \"RuneRepeat\",\n    \"IconRobot\": \"RuneBot\",\n    \"IconRocket\": \"RuneRocket\",\n    \"IconRotate\": \"RuneReset\",\n    \"IconRss\": \"RuneRss\",\n    \"IconSearch\": \"RuneSearch\",\n    \"IconSelector\": \"RuneSelector\",\n    \"IconSend\": \"RuneSend\",\n    \"IconServer\": \"RuneServer\",\n    \"IconServer2\": \"RuneServer\",\n    \"IconServerCog\": \"RuneServerCog\",\n    \"IconSettings\": \"RuneSettings\",\n    \"IconShare\": \"RuneShare\",\n    \"IconShare2\": \"RuneShare\",\n    \"IconShield\": \"RuneShield\",\n    \"IconShieldCheck\": \"RuneShieldCheck\",\n    \"IconShieldExclamation\": \"RuneShieldAlert\",\n    \"IconShieldLock\": \"RuneShieldLock\",\n    \"IconSortAscending\": \"RuneSortAscending\",\n    \"IconSortDescending\": \"RuneSortDescending\",\n    \"IconSparkles\": \"RuneSparkles\",\n    \"IconStack\": \"RuneLayers\",\n    \"IconStack2\": \"RuneLayers\",\n    \"IconStar\": \"RuneStar\",\n    \"IconStopwatch\": \"RuneTimer\",\n    \"IconSun\": \"RuneSun\",\n    \"IconTerminal\": \"RuneTerminal\",\n    \"IconTerminal2\": \"RuneTerminal\",\n    \"IconTool\": \"RuneWrench\",\n    \"IconTrash\": \"RuneTrash\",\n    \"IconTrophy\": \"RuneTrophy\",\n    \"IconUpload\": \"RuneUpload\",\n    \"IconUser\": \"RuneProfile\",\n    \"IconUserPlus\": \"RuneUserPlus\",\n    \"IconUsers\": \"RuneTeam\",\n    \"IconWand\": \"RuneSparkles\",\n    \"IconWaveSine\": \"RuneWaves\",\n    \"IconWebhook\": \"RuneWebhook\",\n    \"IconWorld\": \"RuneWorld\",\n    \"IconX\": \"RuneClose\",\n    \"TablerIcon\": \"RuneIcon\",\n    \"TablerIconsProps\": \"RuneIconProps\"\n  },\n  \"lucide\": {\n    \"Activity\": \"RuneActivity\",\n    \"ActivityIcon\": \"RuneActivity\",\n    \"AlertCircle\": \"RuneAlert\",\n    \"AlertCircleIcon\": \"RuneAlert\",\n    \"AlertTriangle\": \"RuneWarning\",\n    \"AlertTriangleIcon\": \"RuneWarning\",\n    \"AlignJustify\": \"RuneMenu\",\n    \"AlignJustifyIcon\": \"RuneMenu\",\n    \"AppWindow\": \"RuneWindow\",\n    \"AppWindowIcon\": \"RuneWindow\",\n    \"AreaChart\": \"RuneChartArea\",\n    \"AreaChartIcon\": \"RuneChartArea\",\n    \"ArrowDown\": \"RuneArrowDown\",\n    \"ArrowDownIcon\": \"RuneArrowDown\",\n    \"ArrowDownRight\": \"RuneArrowDownRight\",\n    \"ArrowDownRightIcon\": \"RuneArrowDownRight\",\n    \"ArrowDownUp\": \"RuneArrowUpDown\",\n    \"ArrowDownUpIcon\": \"RuneArrowUpDown\",\n    \"ArrowDownWideNarrow\": \"RuneSortDescending\",\n    \"ArrowDownWideNarrowIcon\": \"RuneSortDescending\",\n    \"ArrowLeft\": \"RuneArrowLeft\",\n    \"ArrowLeftIcon\": \"RuneArrowLeft\",\n    \"ArrowRight\": \"RuneArrowRight\",\n    \"ArrowRightIcon\": \"RuneArrowRight\",\n    \"ArrowUp\": \"RuneArrowUp\",\n    \"ArrowUpDown\": \"RuneArrowUpDown\",\n    \"ArrowUpDownIcon\": \"RuneArrowUpDown\",\n    \"ArrowUpIcon\": \"RuneArrowUp\",\n    \"ArrowUpNarrowWide\": \"RuneSortAscending\",\n    \"ArrowUpNarrowWideIcon\": \"RuneSortAscending\",\n    \"ArrowUpRight\": \"RuneArrowUpRight\",\n    \"ArrowUpRightIcon\": \"RuneArrowUpRight\",\n    \"Award\": \"RuneTrophy\",\n    \"AwardIcon\": \"RuneTrophy\",\n    \"BadgeDollarSign\": \"RuneBilling\",\n    \"BadgeDollarSignIcon\": \"RuneBilling\",\n    \"BadgePercent\": \"RuneDiscount\",\n    \"BadgePercentIcon\": \"RuneDiscount\",\n    \"BarChart\": \"RuneChartBar\",\n    \"BarChart3\": \"RuneChartBar\",\n    \"BarChart3Icon\": \"RuneChartBar\",\n    \"BarChartIcon\": \"RuneChartBar\",\n    \"Beer\": \"RuneBeer\",\n    \"BeerIcon\": \"RuneBeer\",\n    \"Bell\": \"RuneBell\",\n    \"BellIcon\": \"RuneBell\",\n    \"BellOff\": \"RuneBellOff\",\n    \"BellOffIcon\": \"RuneBellOff\",\n    \"Bolt\": \"RuneNut\",\n    \"BoltIcon\": \"RuneNut\",\n    \"Book\": \"RuneBook\",\n    \"BookIcon\": \"RuneBook\",\n    \"BookOpen\": \"RuneDocs\",\n    \"BookOpenIcon\": \"RuneDocs\",\n    \"BookOpenText\": \"RuneDocs\",\n    \"BookOpenTextIcon\": \"RuneDocs\",\n    \"BookText\": \"RuneBook\",\n    \"BookTextIcon\": \"RuneBook\",\n    \"Bot\": \"RuneBot\",\n    \"BotIcon\": \"RuneBot\",\n    \"Braces\": \"RuneBraces\",\n    \"BracesIcon\": \"RuneBraces\",\n    \"Building\": \"RuneAccount\",\n    \"BuildingIcon\": \"RuneAccount\",\n    \"Calculator\": \"RuneCalculator\",\n    \"CalculatorIcon\": \"RuneCalculator\",\n    \"Calendar\": \"RuneCalendar\",\n    \"CalendarIcon\": \"RuneCalendar\",\n    \"CandlestickChart\": \"RuneChartCandle\",\n    \"CandlestickChartIcon\": \"RuneChartCandle\",\n    \"ChartArea\": \"RuneChartArea\",\n    \"ChartAreaIcon\": \"RuneChartArea\",\n    \"ChartBar\": \"RuneChartBar\",\n    \"ChartBarIcon\": \"RuneChartBar\",\n    \"ChartCandlestick\": \"RuneChartCandle\",\n    \"ChartCandlestickIcon\": \"RuneChartCandle\",\n    \"ChartColumn\": \"RuneChartBar\",\n    \"ChartColumnBig\": \"RuneChartBar\",\n    \"ChartColumnBigIcon\": \"RuneChartBar\",\n    \"ChartColumnIcon\": \"RuneChartBar\",\n    \"ChartColumnStacked\": \"RuneChartStacked\",\n    \"ChartColumnStackedIcon\": \"RuneChartStacked\",\n    \"ChartLine\": \"RuneChartLine\",\n    \"ChartLineIcon\": \"RuneChartLine\",\n    \"ChartSpline\": \"RuneChartLine\",\n    \"ChartSplineIcon\": \"RuneChartLine\",\n    \"Check\": \"RuneCheck\",\n    \"CheckCircle\": \"RuneSuccess\",\n    \"CheckCircle2\": \"RuneSuccess\",\n    \"CheckCircle2Icon\": \"RuneSuccess\",\n    \"CheckCircleIcon\": \"RuneSuccess\",\n    \"CheckIcon\": \"RuneCheck\",\n    \"ChevronDown\": \"RuneChevronDown\",\n    \"ChevronDownIcon\": \"RuneChevronDown\",\n    \"ChevronFirst\": \"RuneChevronFirst\",\n    \"ChevronFirstIcon\": \"RuneChevronFirst\",\n    \"ChevronLast\": \"RuneChevronLast\",\n    \"ChevronLastIcon\": \"RuneChevronLast\",\n    \"ChevronLeft\": \"RuneChevronLeft\",\n    \"ChevronLeftIcon\": \"RuneChevronLeft\",\n    \"ChevronRight\": \"RuneChevronRight\",\n    \"ChevronRightIcon\": \"RuneChevronRight\",\n    \"ChevronsDown\": \"RuneChevronsDown\",\n    \"ChevronsDownIcon\": \"RuneChevronsDown\",\n    \"ChevronsLeft\": \"RuneChevronsLeft\",\n    \"ChevronsLeftIcon\": \"RuneChevronsLeft\",\n    \"ChevronsRight\": \"RuneChevronsRight\",\n    \"ChevronsRightIcon\": \"RuneChevronsRight\",\n    \"ChevronsUp\": \"RuneChevronsUp\",\n    \"ChevronsUpDown\": \"RuneSelector\",\n    \"ChevronsUpDownIcon\": \"RuneSelector\",\n    \"ChevronsUpIcon\": \"RuneChevronsUp\",\n    \"ChevronUp\": \"RuneChevronUp\",\n    \"ChevronUpIcon\": \"RuneChevronUp\",\n    \"Circle\": \"RuneCircle\",\n    \"CircleAlert\": \"RuneAlert\",\n    \"CircleAlertIcon\": \"RuneAlert\",\n    \"CircleCheck\": \"RuneSuccess\",\n    \"CircleCheckBig\": \"RuneSuccess\",\n    \"CircleCheckBigIcon\": \"RuneSuccess\",\n    \"CircleCheckIcon\": \"RuneSuccess\",\n    \"CircleDollarSign\": \"RuneBilling\",\n    \"CircleDollarSignIcon\": \"RuneBilling\",\n    \"CircleHelp\": \"RuneHelp\",\n    \"CircleHelpIcon\": \"RuneHelp\",\n    \"CircleIcon\": \"RuneCircle\",\n    \"CircleX\": \"RuneError\",\n    \"CircleXIcon\": \"RuneError\",\n    \"Clock\": \"RuneClock\",\n    \"ClockIcon\": \"RuneClock\",\n    \"Cloud\": \"RuneCloud\",\n    \"CloudDownload\": \"RuneCloudDownload\",\n    \"CloudDownloadIcon\": \"RuneCloudDownload\",\n    \"CloudIcon\": \"RuneCloud\",\n    \"Code\": \"RuneCode\",\n    \"Code2\": \"RuneCode\",\n    \"Code2Icon\": \"RuneCode\",\n    \"CodeIcon\": \"RuneCode\",\n    \"CodeXml\": \"RuneCode\",\n    \"CodeXmlIcon\": \"RuneCode\",\n    \"Cog\": \"RuneSettings\",\n    \"CogIcon\": \"RuneSettings\",\n    \"Coins\": \"RuneCoins\",\n    \"CoinsIcon\": \"RuneCoins\",\n    \"Columns\": \"RuneColumns\",\n    \"Columns3\": \"RuneColumns\",\n    \"Columns3Icon\": \"RuneColumns\",\n    \"ColumnsIcon\": \"RuneColumns\",\n    \"Compass\": \"RuneCompass\",\n    \"CompassIcon\": \"RuneCompass\",\n    \"Component\": \"RuneComponent\",\n    \"ComponentIcon\": \"RuneComponent\",\n    \"Copy\": \"RuneCopy\",\n    \"CopyIcon\": \"RuneCopy\",\n    \"CornerDownLeft\": \"RuneEnter\",\n    \"CornerDownLeftIcon\": \"RuneEnter\",\n    \"Cpu\": \"RuneChip\",\n    \"CpuIcon\": \"RuneChip\",\n    \"CreditCard\": \"RuneCreditCard\",\n    \"CreditCardIcon\": \"RuneCreditCard\",\n    \"Crown\": \"RuneCrown\",\n    \"CrownIcon\": \"RuneCrown\",\n    \"Database\": \"RuneDatabase\",\n    \"DatabaseIcon\": \"RuneDatabase\",\n    \"DatabaseZap\": \"RuneDatabase\",\n    \"DatabaseZapIcon\": \"RuneDatabase\",\n    \"DollarSign\": \"RuneDollar\",\n    \"DollarSignIcon\": \"RuneDollar\",\n    \"Dot\": \"RuneDot\",\n    \"DotIcon\": \"RuneDot\",\n    \"Download\": \"RuneDownload\",\n    \"DownloadIcon\": \"RuneDownload\",\n    \"Earth\": \"RuneWorld\",\n    \"EarthIcon\": \"RuneWorld\",\n    \"Edit\": \"RuneEdit\",\n    \"Edit2\": \"RuneEdit\",\n    \"Edit2Icon\": \"RuneEdit\",\n    \"Edit3\": \"RuneEdit\",\n    \"Edit3Icon\": \"RuneEdit\",\n    \"EditIcon\": \"RuneEdit\",\n    \"Ellipsis\": \"RuneMore\",\n    \"EllipsisIcon\": \"RuneMore\",\n    \"EllipsisVertical\": \"RuneMoreVertical\",\n    \"EllipsisVerticalIcon\": \"RuneMoreVertical\",\n    \"Expand\": \"RuneMaximize\",\n    \"ExpandIcon\": \"RuneMaximize\",\n    \"ExternalLink\": \"RuneExternalLink\",\n    \"ExternalLinkIcon\": \"RuneExternalLink\",\n    \"Eye\": \"RuneEye\",\n    \"EyeIcon\": \"RuneEye\",\n    \"EyeOff\": \"RuneEyeOff\",\n    \"EyeOffIcon\": \"RuneEyeOff\",\n    \"File\": \"RuneFile\",\n    \"FileBarChart\": \"RuneReport\",\n    \"FileBarChartIcon\": \"RuneReport\",\n    \"FileChartColumn\": \"RuneReport\",\n    \"FileChartColumnIcon\": \"RuneReport\",\n    \"FileCode\": \"RuneFileCode\",\n    \"FileCodeIcon\": \"RuneFileCode\",\n    \"FileDown\": \"RuneFileDownload\",\n    \"FileDownIcon\": \"RuneFileDownload\",\n    \"FileIcon\": \"RuneFile\",\n    \"FileOutput\": \"RuneFileExport\",\n    \"FileOutputIcon\": \"RuneFileExport\",\n    \"FileText\": \"RuneFile\",\n    \"FileTextIcon\": \"RuneFile\",\n    \"Filter\": \"RuneFilter\",\n    \"FilterIcon\": \"RuneFilter\",\n    \"Flame\": \"RuneFlame\",\n    \"FlameIcon\": \"RuneFlame\",\n    \"Fuel\": \"RuneFuel\",\n    \"FuelIcon\": \"RuneFuel\",\n    \"Fullscreen\": \"RuneMaximize\",\n    \"FullscreenIcon\": \"RuneMaximize\",\n    \"Funnel\": \"RuneFilter\",\n    \"FunnelIcon\": \"RuneFilter\",\n    \"Gauge\": \"RuneGauge\",\n    \"GaugeIcon\": \"RuneGauge\",\n    \"Globe\": \"RuneWorld\",\n    \"Globe2\": \"RuneWorld\",\n    \"Globe2Icon\": \"RuneWorld\",\n    \"GlobeIcon\": \"RuneWorld\",\n    \"GripVertical\": \"RuneGrip\",\n    \"GripVerticalIcon\": \"RuneGrip\",\n    \"Hand\": \"RuneHandStop\",\n    \"HandIcon\": \"RuneHandStop\",\n    \"Hash\": \"RuneHash\",\n    \"HashIcon\": \"RuneHash\",\n    \"Headset\": \"RuneHeadset\",\n    \"HeadsetIcon\": \"RuneHeadset\",\n    \"Heart\": \"RuneHeart\",\n    \"HeartIcon\": \"RuneHeart\",\n    \"HelpCircle\": \"RuneHelp\",\n    \"HelpCircleIcon\": \"RuneHelp\",\n    \"History\": \"RuneHistory\",\n    \"HistoryIcon\": \"RuneHistory\",\n    \"Home\": \"RuneHome\",\n    \"HomeIcon\": \"RuneHome\",\n    \"House\": \"RuneHome\",\n    \"HouseIcon\": \"RuneHome\",\n    \"Inbox\": \"RuneInbox\",\n    \"InboxIcon\": \"RuneInbox\",\n    \"Infinity\": \"RuneInfinity\",\n    \"InfinityIcon\": \"RuneInfinity\",\n    \"Info\": \"RuneInfo\",\n    \"InfoIcon\": \"RuneInfo\",\n    \"Key\": \"RuneKey\",\n    \"KeyIcon\": \"RuneKey\",\n    \"KeyRound\": \"RuneKey\",\n    \"KeyRoundIcon\": \"RuneKey\",\n    \"Layers\": \"RuneLayers\",\n    \"LayersIcon\": \"RuneLayers\",\n    \"LayoutDashboard\": \"RuneDashboard\",\n    \"LayoutDashboardIcon\": \"RuneDashboard\",\n    \"LayoutGrid\": \"RuneLayoutGrid\",\n    \"LayoutGridIcon\": \"RuneLayoutGrid\",\n    \"LifeBuoy\": \"RuneLifebuoy\",\n    \"LifeBuoyIcon\": \"RuneLifebuoy\",\n    \"LineChart\": \"RuneChartLine\",\n    \"LineChartIcon\": \"RuneChartLine\",\n    \"Link\": \"RuneLink\",\n    \"Link2\": \"RuneLink\",\n    \"Link2Icon\": \"RuneLink\",\n    \"LinkIcon\": \"RuneLink\",\n    \"List\": \"RuneList\",\n    \"ListCheck\": \"RuneListCheck\",\n    \"ListCheckIcon\": \"RuneListCheck\",\n    \"ListChecks\": \"RuneListCheck\",\n    \"ListChecksIcon\": \"RuneListCheck\",\n    \"ListFilter\": \"RuneFilter\",\n    \"ListFilterIcon\": \"RuneFilter\",\n    \"ListIcon\": \"RuneList\",\n    \"ListOrdered\": \"RuneListOrdered\",\n    \"ListOrderedIcon\": \"RuneListOrdered\",\n    \"Loader\": \"RuneLoader\",\n    \"Loader2\": \"RuneLoader\",\n    \"Loader2Icon\": \"RuneLoader\",\n    \"LoaderCircle\": \"RuneLoader\",\n    \"LoaderCircleIcon\": \"RuneLoader\",\n    \"LoaderIcon\": \"RuneLoader\",\n    \"Lock\": \"RuneLock\",\n    \"LockIcon\": \"RuneLock\",\n    \"LockKeyhole\": \"RuneLock\",\n    \"LockKeyholeIcon\": \"RuneLock\",\n    \"LogIn\": \"RuneLogin\",\n    \"LogInIcon\": \"RuneLogin\",\n    \"LogOut\": \"RuneLogout\",\n    \"LogOutIcon\": \"RuneLogout\",\n    \"Logs\": \"RuneLogs\",\n    \"LogsIcon\": \"RuneLogs\",\n    \"LucideIcon\": \"RuneIcon\",\n    \"LucideProps\": \"RuneIconProps\",\n    \"Mail\": \"RuneMail\",\n    \"MailIcon\": \"RuneMail\",\n    \"Maximize\": \"RuneMaximize\",\n    \"Maximize2\": \"RuneMaximize\",\n    \"Maximize2Icon\": \"RuneMaximize\",\n    \"MaximizeIcon\": \"RuneMaximize\",\n    \"Menu\": \"RuneMenu\",\n    \"MenuIcon\": \"RuneMenu\",\n    \"MessageCircle\": \"RuneMessage\",\n    \"MessageCircleIcon\": \"RuneMessage\",\n    \"MessageSquare\": \"RuneMessage\",\n    \"MessageSquareIcon\": \"RuneMessage\",\n    \"Minimize\": \"RuneMinimize\",\n    \"Minimize2\": \"RuneMinimize\",\n    \"Minimize2Icon\": \"RuneMinimize\",\n    \"MinimizeIcon\": \"RuneMinimize\",\n    \"Minus\": \"RuneMinus\",\n    \"MinusIcon\": \"RuneMinus\",\n    \"Monitor\": \"RuneMonitor\",\n    \"MonitorIcon\": \"RuneMonitor\",\n    \"Moon\": \"RuneMoon\",\n    \"MoonIcon\": \"RuneMoon\",\n    \"MoreHorizontal\": \"RuneMore\",\n    \"MoreHorizontalIcon\": \"RuneMore\",\n    \"MoreVertical\": \"RuneMoreVertical\",\n    \"MoreVerticalIcon\": \"RuneMoreVertical\",\n    \"MoveDown\": \"RuneArrowDown\",\n    \"MoveDownIcon\": \"RuneArrowDown\",\n    \"MoveDownRight\": \"RuneArrowDownRight\",\n    \"MoveDownRightIcon\": \"RuneArrowDownRight\",\n    \"MoveLeft\": \"RuneArrowLeft\",\n    \"MoveLeftIcon\": \"RuneArrowLeft\",\n    \"MoveRight\": \"RuneArrowRight\",\n    \"MoveRightIcon\": \"RuneArrowRight\",\n    \"MoveUp\": \"RuneArrowUp\",\n    \"MoveUpIcon\": \"RuneArrowUp\",\n    \"MoveUpRight\": \"RuneArrowUpRight\",\n    \"MoveUpRightIcon\": \"RuneArrowUpRight\",\n    \"MoveVertical\": \"RuneArrowUpDown\",\n    \"MoveVerticalIcon\": \"RuneArrowUpDown\",\n    \"Network\": \"RuneNetwork\",\n    \"NetworkIcon\": \"RuneNetwork\",\n    \"OctagonX\": \"RuneError\",\n    \"OctagonXIcon\": \"RuneError\",\n    \"PanelLeft\": \"RuneSidebar\",\n    \"PanelLeftClose\": \"RuneSidebarCollapse\",\n    \"PanelLeftCloseIcon\": \"RuneSidebarCollapse\",\n    \"PanelLeftIcon\": \"RuneSidebar\",\n    \"PanelLeftOpen\": \"RuneSidebarExpand\",\n    \"PanelLeftOpenIcon\": \"RuneSidebarExpand\",\n    \"PanelTop\": \"RuneWindow\",\n    \"PanelTopIcon\": \"RuneWindow\",\n    \"Pause\": \"RunePause\",\n    \"PauseIcon\": \"RunePause\",\n    \"Pen\": \"RuneEdit\",\n    \"Pencil\": \"RuneEdit\",\n    \"PencilIcon\": \"RuneEdit\",\n    \"PencilLine\": \"RuneEdit\",\n    \"PencilLineIcon\": \"RuneEdit\",\n    \"PenIcon\": \"RuneEdit\",\n    \"PenLine\": \"RuneEdit\",\n    \"PenLineIcon\": \"RuneEdit\",\n    \"Percent\": \"RunePercent\",\n    \"PercentIcon\": \"RunePercent\",\n    \"Phone\": \"RunePhone\",\n    \"PhoneIcon\": \"RunePhone\",\n    \"Pin\": \"RunePin\",\n    \"PinIcon\": \"RunePin\",\n    \"Play\": \"RunePlay\",\n    \"PlayIcon\": \"RunePlay\",\n    \"Plug\": \"RunePlug\",\n    \"PlugIcon\": \"RunePlug\",\n    \"PlugZap\": \"RunePlug\",\n    \"PlugZapIcon\": \"RunePlug\",\n    \"Plus\": \"RunePlus\",\n    \"PlusIcon\": \"RunePlus\",\n    \"Power\": \"RunePower\",\n    \"PowerIcon\": \"RunePower\",\n    \"PowerOff\": \"RunePowerOff\",\n    \"PowerOffIcon\": \"RunePowerOff\",\n    \"Puzzle\": \"RunePuzzle\",\n    \"PuzzleIcon\": \"RunePuzzle\",\n    \"Radio\": \"RuneBroadcast\",\n    \"RadioIcon\": \"RuneBroadcast\",\n    \"Receipt\": \"RuneReceipt\",\n    \"ReceiptIcon\": \"RuneReceipt\",\n    \"RefreshCcw\": \"RuneRefresh\",\n    \"RefreshCcwIcon\": \"RuneRefresh\",\n    \"RefreshCw\": \"RuneRefresh\",\n    \"RefreshCwIcon\": \"RuneRefresh\",\n    \"Repeat\": \"RuneRepeat\",\n    \"RepeatIcon\": \"RuneRepeat\",\n    \"Rewind\": \"RuneRewind\",\n    \"RewindIcon\": \"RuneRewind\",\n    \"Rocket\": \"RuneRocket\",\n    \"RocketIcon\": \"RuneRocket\",\n    \"RotateCcw\": \"RuneReset\",\n    \"RotateCcwIcon\": \"RuneReset\",\n    \"RotateCw\": \"RuneRefresh\",\n    \"RotateCwIcon\": \"RuneRefresh\",\n    \"Rss\": \"RuneRss\",\n    \"RssIcon\": \"RuneRss\",\n    \"Save\": \"RuneSave\",\n    \"SaveIcon\": \"RuneSave\",\n    \"ScrollText\": \"RuneLogs\",\n    \"ScrollTextIcon\": \"RuneLogs\",\n    \"Search\": \"RuneSearch\",\n    \"SearchIcon\": \"RuneSearch\",\n    \"Send\": \"RuneSend\",\n    \"SendHorizonal\": \"RuneSend\",\n    \"SendHorizonalIcon\": \"RuneSend\",\n    \"SendHorizontal\": \"RuneSend\",\n    \"SendHorizontalIcon\": \"RuneSend\",\n    \"SendIcon\": \"RuneSend\",\n    \"Server\": \"RuneServer\",\n    \"ServerCog\": \"RuneServerCog\",\n    \"ServerCogIcon\": \"RuneServerCog\",\n    \"ServerIcon\": \"RuneServer\",\n    \"Settings\": \"RuneSettings\",\n    \"Settings2\": \"RuneSettings\",\n    \"Settings2Icon\": \"RuneSettings\",\n    \"SettingsIcon\": \"RuneSettings\",\n    \"Share\": \"RuneShare\",\n    \"Share2\": \"RuneShare\",\n    \"Share2Icon\": \"RuneShare\",\n    \"ShareIcon\": \"RuneShare\",\n    \"Shield\": \"RuneShield\",\n    \"ShieldAlert\": \"RuneShieldAlert\",\n    \"ShieldAlertIcon\": \"RuneShieldAlert\",\n    \"ShieldCheck\": \"RuneShieldCheck\",\n    \"ShieldCheckIcon\": \"RuneShieldCheck\",\n    \"ShieldIcon\": \"RuneShield\",\n    \"Shrink\": \"RuneMinimize\",\n    \"ShrinkIcon\": \"RuneMinimize\",\n    \"Sidebar\": \"RuneSidebar\",\n    \"SidebarClose\": \"RuneSidebarCollapse\",\n    \"SidebarCloseIcon\": \"RuneSidebarCollapse\",\n    \"SidebarIcon\": \"RuneSidebar\",\n    \"SidebarOpen\": \"RuneSidebarExpand\",\n    \"SidebarOpenIcon\": \"RuneSidebarExpand\",\n    \"SortAsc\": \"RuneSortAscending\",\n    \"SortAscIcon\": \"RuneSortAscending\",\n    \"SortDesc\": \"RuneSortDescending\",\n    \"SortDescIcon\": \"RuneSortDescending\",\n    \"Sparkle\": \"RuneSparkles\",\n    \"SparkleIcon\": \"RuneSparkles\",\n    \"Sparkles\": \"RuneSparkles\",\n    \"SparklesIcon\": \"RuneSparkles\",\n    \"Square\": \"RuneStop\",\n    \"SquareArrowOutUpRight\": \"RuneExternalLink\",\n    \"SquareArrowOutUpRightIcon\": \"RuneExternalLink\",\n    \"SquareIcon\": \"RuneStop\",\n    \"SquarePen\": \"RuneEdit\",\n    \"SquarePenIcon\": \"RuneEdit\",\n    \"SquareTerminal\": \"RuneTerminal\",\n    \"SquareTerminalIcon\": \"RuneTerminal\",\n    \"Star\": \"RuneStar\",\n    \"StarIcon\": \"RuneStar\",\n    \"Sun\": \"RuneSun\",\n    \"SunIcon\": \"RuneSun\",\n    \"Terminal\": \"RuneTerminal\",\n    \"TerminalIcon\": \"RuneTerminal\",\n    \"Timer\": \"RuneTimer\",\n    \"TimerIcon\": \"RuneTimer\",\n    \"Trash\": \"RuneTrash\",\n    \"Trash2\": \"RuneTrash\",\n    \"Trash2Icon\": \"RuneTrash\",\n    \"TrashIcon\": \"RuneTrash\",\n    \"TriangleAlert\": \"RuneWarning\",\n    \"TriangleAlertIcon\": \"RuneWarning\",\n    \"Trophy\": \"RuneTrophy\",\n    \"TrophyIcon\": \"RuneTrophy\",\n    \"Undo2\": \"RuneReset\",\n    \"Undo2Icon\": \"RuneReset\",\n    \"Upload\": \"RuneUpload\",\n    \"UploadIcon\": \"RuneUpload\",\n    \"User\": \"RuneProfile\",\n    \"UserIcon\": \"RuneProfile\",\n    \"UserPlus\": \"RuneUserPlus\",\n    \"UserPlusIcon\": \"RuneUserPlus\",\n    \"Users\": \"RuneTeam\",\n    \"UsersIcon\": \"RuneTeam\",\n    \"WandSparkles\": \"RuneSparkles\",\n    \"WandSparklesIcon\": \"RuneSparkles\",\n    \"Waves\": \"RuneWaves\",\n    \"WavesIcon\": \"RuneWaves\",\n    \"Webhook\": \"RuneWebhook\",\n    \"WebhookIcon\": \"RuneWebhook\",\n    \"Wrench\": \"RuneWrench\",\n    \"WrenchIcon\": \"RuneWrench\",\n    \"X\": \"RuneClose\",\n    \"XCircle\": \"RuneError\",\n    \"XCircleIcon\": \"RuneError\",\n    \"XIcon\": \"RuneClose\",\n    \"Zap\": \"RuneBolt\",\n    \"ZapIcon\": \"RuneBolt\"\n  },\n  \"react-icons\": {\n    \"LuActivity\": \"RuneActivity\",\n    \"LuAlertCircle\": \"RuneAlert\",\n    \"LuAlertTriangle\": \"RuneWarning\",\n    \"LuAlignJustify\": \"RuneMenu\",\n    \"LuAppWindow\": \"RuneWindow\",\n    \"LuAreaChart\": \"RuneChartArea\",\n    \"LuArrowDown\": \"RuneArrowDown\",\n    \"LuArrowDownRight\": \"RuneArrowDownRight\",\n    \"LuArrowDownUp\": \"RuneArrowUpDown\",\n    \"LuArrowDownWideNarrow\": \"RuneSortDescending\",\n    \"LuArrowLeft\": \"RuneArrowLeft\",\n    \"LuArrowRight\": \"RuneArrowRight\",\n    \"LuArrowUp\": \"RuneArrowUp\",\n    \"LuArrowUpDown\": \"RuneArrowUpDown\",\n    \"LuArrowUpNarrowWide\": \"RuneSortAscending\",\n    \"LuArrowUpRight\": \"RuneArrowUpRight\",\n    \"LuAward\": \"RuneTrophy\",\n    \"LuBadgeDollarSign\": \"RuneBilling\",\n    \"LuBadgePercent\": \"RuneDiscount\",\n    \"LuBarChart\": \"RuneChartBar\",\n    \"LuBarChart3\": \"RuneChartBar\",\n    \"LuBeer\": \"RuneBeer\",\n    \"LuBell\": \"RuneBell\",\n    \"LuBellOff\": \"RuneBellOff\",\n    \"LuBolt\": \"RuneNut\",\n    \"LuBook\": \"RuneBook\",\n    \"LuBookOpen\": \"RuneDocs\",\n    \"LuBookOpenText\": \"RuneDocs\",\n    \"LuBookText\": \"RuneBook\",\n    \"LuBot\": \"RuneBot\",\n    \"LuBraces\": \"RuneBraces\",\n    \"LuBuilding\": \"RuneAccount\",\n    \"LuCalculator\": \"RuneCalculator\",\n    \"LuCalendar\": \"RuneCalendar\",\n    \"LuCandlestickChart\": \"RuneChartCandle\",\n    \"LuChartArea\": \"RuneChartArea\",\n    \"LuChartBar\": \"RuneChartBar\",\n    \"LuChartCandlestick\": \"RuneChartCandle\",\n    \"LuChartColumn\": \"RuneChartBar\",\n    \"LuChartColumnBig\": \"RuneChartBar\",\n    \"LuChartColumnStacked\": \"RuneChartStacked\",\n    \"LuChartLine\": \"RuneChartLine\",\n    \"LuChartSpline\": \"RuneChartLine\",\n    \"LuCheck\": \"RuneCheck\",\n    \"LuCheckCircle\": \"RuneSuccess\",\n    \"LuCheckCircle2\": \"RuneSuccess\",\n    \"LuChevronDown\": \"RuneChevronDown\",\n    \"LuChevronFirst\": \"RuneChevronFirst\",\n    \"LuChevronLast\": \"RuneChevronLast\",\n    \"LuChevronLeft\": \"RuneChevronLeft\",\n    \"LuChevronRight\": \"RuneChevronRight\",\n    \"LuChevronsDown\": \"RuneChevronsDown\",\n    \"LuChevronsLeft\": \"RuneChevronsLeft\",\n    \"LuChevronsRight\": \"RuneChevronsRight\",\n    \"LuChevronsUp\": \"RuneChevronsUp\",\n    \"LuChevronsUpDown\": \"RuneSelector\",\n    \"LuChevronUp\": \"RuneChevronUp\",\n    \"LuCircle\": \"RuneCircle\",\n    \"LuCircleAlert\": \"RuneAlert\",\n    \"LuCircleCheck\": \"RuneSuccess\",\n    \"LuCircleCheckBig\": \"RuneSuccess\",\n    \"LuCircleDollarSign\": \"RuneBilling\",\n    \"LuCircleHelp\": \"RuneHelp\",\n    \"LuCircleX\": \"RuneError\",\n    \"LuClock\": \"RuneClock\",\n    \"LuCloud\": \"RuneCloud\",\n    \"LuCloudDownload\": \"RuneCloudDownload\",\n    \"LuCode\": \"RuneCode\",\n    \"LuCode2\": \"RuneCode\",\n    \"LuCodeXml\": \"RuneCode\",\n    \"LuCog\": \"RuneSettings\",\n    \"LuCoins\": \"RuneCoins\",\n    \"LuColumns\": \"RuneColumns\",\n    \"LuColumns3\": \"RuneColumns\",\n    \"LuCompass\": \"RuneCompass\",\n    \"LuComponent\": \"RuneComponent\",\n    \"LuCopy\": \"RuneCopy\",\n    \"LuCornerDownLeft\": \"RuneEnter\",\n    \"LuCpu\": \"RuneChip\",\n    \"LuCreditCard\": \"RuneCreditCard\",\n    \"LuCrown\": \"RuneCrown\",\n    \"LuDatabase\": \"RuneDatabase\",\n    \"LuDatabaseZap\": \"RuneDatabase\",\n    \"LuDollarSign\": \"RuneDollar\",\n    \"LuDot\": \"RuneDot\",\n    \"LuDownload\": \"RuneDownload\",\n    \"LuEarth\": \"RuneWorld\",\n    \"LuEdit\": \"RuneEdit\",\n    \"LuEdit2\": \"RuneEdit\",\n    \"LuEdit3\": \"RuneEdit\",\n    \"LuEllipsis\": \"RuneMore\",\n    \"LuEllipsisVertical\": \"RuneMoreVertical\",\n    \"LuExpand\": \"RuneMaximize\",\n    \"LuExternalLink\": \"RuneExternalLink\",\n    \"LuEye\": \"RuneEye\",\n    \"LuEyeOff\": \"RuneEyeOff\",\n    \"LuFile\": \"RuneFile\",\n    \"LuFileBarChart\": \"RuneReport\",\n    \"LuFileChartColumn\": \"RuneReport\",\n    \"LuFileCode\": \"RuneFileCode\",\n    \"LuFileDown\": \"RuneFileDownload\",\n    \"LuFileOutput\": \"RuneFileExport\",\n    \"LuFileText\": \"RuneFile\",\n    \"LuFilter\": \"RuneFilter\",\n    \"LuFlame\": \"RuneFlame\",\n    \"LuFuel\": \"RuneFuel\",\n    \"LuFullscreen\": \"RuneMaximize\",\n    \"LuFunnel\": \"RuneFilter\",\n    \"LuGauge\": \"RuneGauge\",\n    \"LuGlobe\": \"RuneWorld\",\n    \"LuGlobe2\": \"RuneWorld\",\n    \"LuGripVertical\": \"RuneGrip\",\n    \"LuHand\": \"RuneHandStop\",\n    \"LuHash\": \"RuneHash\",\n    \"LuHeadset\": \"RuneHeadset\",\n    \"LuHeart\": \"RuneHeart\",\n    \"LuHelpCircle\": \"RuneHelp\",\n    \"LuHistory\": \"RuneHistory\",\n    \"LuHome\": \"RuneHome\",\n    \"LuHouse\": \"RuneHome\",\n    \"LuInbox\": \"RuneInbox\",\n    \"LuInfinity\": \"RuneInfinity\",\n    \"LuInfo\": \"RuneInfo\",\n    \"LuKey\": \"RuneKey\",\n    \"LuKeyRound\": \"RuneKey\",\n    \"LuLayers\": \"RuneLayers\",\n    \"LuLayoutDashboard\": \"RuneDashboard\",\n    \"LuLayoutGrid\": \"RuneLayoutGrid\",\n    \"LuLifeBuoy\": \"RuneLifebuoy\",\n    \"LuLineChart\": \"RuneChartLine\",\n    \"LuLink\": \"RuneLink\",\n    \"LuLink2\": \"RuneLink\",\n    \"LuList\": \"RuneList\",\n    \"LuListCheck\": \"RuneListCheck\",\n    \"LuListChecks\": \"RuneListCheck\",\n    \"LuListFilter\": \"RuneFilter\",\n    \"LuListOrdered\": \"RuneListOrdered\",\n    \"LuLoader\": \"RuneLoader\",\n    \"LuLoader2\": \"RuneLoader\",\n    \"LuLoaderCircle\": \"RuneLoader\",\n    \"LuLock\": \"RuneLock\",\n    \"LuLockKeyhole\": \"RuneLock\",\n    \"LuLogIn\": \"RuneLogin\",\n    \"LuLogOut\": \"RuneLogout\",\n    \"LuLogs\": \"RuneLogs\",\n    \"LuMail\": \"RuneMail\",\n    \"LuMaximize\": \"RuneMaximize\",\n    \"LuMaximize2\": \"RuneMaximize\",\n    \"LuMenu\": \"RuneMenu\",\n    \"LuMessageCircle\": \"RuneMessage\",\n    \"LuMessageSquare\": \"RuneMessage\",\n    \"LuMinimize\": \"RuneMinimize\",\n    \"LuMinimize2\": \"RuneMinimize\",\n    \"LuMinus\": \"RuneMinus\",\n    \"LuMonitor\": \"RuneMonitor\",\n    \"LuMoon\": \"RuneMoon\",\n    \"LuMoreHorizontal\": \"RuneMore\",\n    \"LuMoreVertical\": \"RuneMoreVertical\",\n    \"LuMoveDown\": \"RuneArrowDown\",\n    \"LuMoveDownRight\": \"RuneArrowDownRight\",\n    \"LuMoveLeft\": \"RuneArrowLeft\",\n    \"LuMoveRight\": \"RuneArrowRight\",\n    \"LuMoveUp\": \"RuneArrowUp\",\n    \"LuMoveUpRight\": \"RuneArrowUpRight\",\n    \"LuMoveVertical\": \"RuneArrowUpDown\",\n    \"LuNetwork\": \"RuneNetwork\",\n    \"LuOctagonX\": \"RuneError\",\n    \"LuPanelLeft\": \"RuneSidebar\",\n    \"LuPanelLeftClose\": \"RuneSidebarCollapse\",\n    \"LuPanelLeftOpen\": \"RuneSidebarExpand\",\n    \"LuPanelTop\": \"RuneWindow\",\n    \"LuPause\": \"RunePause\",\n    \"LuPen\": \"RuneEdit\",\n    \"LuPencil\": \"RuneEdit\",\n    \"LuPencilLine\": \"RuneEdit\",\n    \"LuPenLine\": \"RuneEdit\",\n    \"LuPercent\": \"RunePercent\",\n    \"LuPhone\": \"RunePhone\",\n    \"LuPin\": \"RunePin\",\n    \"LuPlay\": \"RunePlay\",\n    \"LuPlug\": \"RunePlug\",\n    \"LuPlugZap\": \"RunePlug\",\n    \"LuPlus\": \"RunePlus\",\n    \"LuPower\": \"RunePower\",\n    \"LuPowerOff\": \"RunePowerOff\",\n    \"LuPuzzle\": \"RunePuzzle\",\n    \"LuRadio\": \"RuneBroadcast\",\n    \"LuReceipt\": \"RuneReceipt\",\n    \"LuRefreshCcw\": \"RuneRefresh\",\n    \"LuRefreshCw\": \"RuneRefresh\",\n    \"LuRepeat\": \"RuneRepeat\",\n    \"LuRewind\": \"RuneRewind\",\n    \"LuRocket\": \"RuneRocket\",\n    \"LuRotateCcw\": \"RuneReset\",\n    \"LuRotateCw\": \"RuneRefresh\",\n    \"LuRss\": \"RuneRss\",\n    \"LuSave\": \"RuneSave\",\n    \"LuScrollText\": \"RuneLogs\",\n    \"LuSearch\": \"RuneSearch\",\n    \"LuSend\": \"RuneSend\",\n    \"LuSendHorizonal\": \"RuneSend\",\n    \"LuSendHorizontal\": \"RuneSend\",\n    \"LuServer\": \"RuneServer\",\n    \"LuServerCog\": \"RuneServerCog\",\n    \"LuSettings\": \"RuneSettings\",\n    \"LuSettings2\": \"RuneSettings\",\n    \"LuShare\": \"RuneShare\",\n    \"LuShare2\": \"RuneShare\",\n    \"LuShield\": \"RuneShield\",\n    \"LuShieldAlert\": \"RuneShieldAlert\",\n    \"LuShieldCheck\": \"RuneShieldCheck\",\n    \"LuShrink\": \"RuneMinimize\",\n    \"LuSidebar\": \"RuneSidebar\",\n    \"LuSidebarClose\": \"RuneSidebarCollapse\",\n    \"LuSidebarOpen\": \"RuneSidebarExpand\",\n    \"LuSortAsc\": \"RuneSortAscending\",\n    \"LuSortDesc\": \"RuneSortDescending\",\n    \"LuSparkle\": \"RuneSparkles\",\n    \"LuSparkles\": \"RuneSparkles\",\n    \"LuSquare\": \"RuneStop\",\n    \"LuSquareArrowOutUpRight\": \"RuneExternalLink\",\n    \"LuSquarePen\": \"RuneEdit\",\n    \"LuSquareTerminal\": \"RuneTerminal\",\n    \"LuStar\": \"RuneStar\",\n    \"LuSun\": \"RuneSun\",\n    \"LuTerminal\": \"RuneTerminal\",\n    \"LuTimer\": \"RuneTimer\",\n    \"LuTrash\": \"RuneTrash\",\n    \"LuTrash2\": \"RuneTrash\",\n    \"LuTriangleAlert\": \"RuneWarning\",\n    \"LuTrophy\": \"RuneTrophy\",\n    \"LuUndo2\": \"RuneReset\",\n    \"LuUpload\": \"RuneUpload\",\n    \"LuUser\": \"RuneProfile\",\n    \"LuUserPlus\": \"RuneUserPlus\",\n    \"LuUsers\": \"RuneTeam\",\n    \"LuWandSparkles\": \"RuneSparkles\",\n    \"LuWaves\": \"RuneWaves\",\n    \"LuWebhook\": \"RuneWebhook\",\n    \"LuWrench\": \"RuneWrench\",\n    \"LuX\": \"RuneClose\",\n    \"LuXCircle\": \"RuneError\",\n    \"LuZap\": \"RuneBolt\",\n    \"TbActivity\": \"RuneActivity\",\n    \"TbAlertCircle\": \"RuneAlert\",\n    \"TbAlertOctagon\": \"RuneAlert\",\n    \"TbAlertTriangle\": \"RuneWarning\",\n    \"TbApi\": \"RuneApi\",\n    \"TbAppWindow\": \"RuneWindow\",\n    \"TbArrowBackUp\": \"RuneReset\",\n    \"TbArrowDown\": \"RuneArrowDown\",\n    \"TbArrowDownRight\": \"RuneArrowDownRight\",\n    \"TbArrowLeft\": \"RuneArrowLeft\",\n    \"TbArrowRight\": \"RuneArrowRight\",\n    \"TbArrowsMaximize\": \"RuneMaximize\",\n    \"TbArrowsMinimize\": \"RuneMinimize\",\n    \"TbArrowsSort\": \"RuneArrowUpDown\",\n    \"TbArrowsUpDown\": \"RuneArrowUpDown\",\n    \"TbArrowsVertical\": \"RuneArrowUpDown\",\n    \"TbArrowUp\": \"RuneArrowUp\",\n    \"TbArrowUpRight\": \"RuneArrowUpRight\",\n    \"TbAward\": \"RuneTrophy\",\n    \"TbBeer\": \"RuneBeer\",\n    \"TbBell\": \"RuneBell\",\n    \"TbBellOff\": \"RuneBellOff\",\n    \"TbBolt\": \"RuneBolt\",\n    \"TbBook\": \"RuneDocs\",\n    \"TbBook2\": \"RuneBook\",\n    \"TbBraces\": \"RuneBraces\",\n    \"TbBroadcast\": \"RuneBroadcast\",\n    \"TbBrowser\": \"RuneWindow\",\n    \"TbBuilding\": \"RuneAccount\",\n    \"TbCalculator\": \"RuneCalculator\",\n    \"TbCalendar\": \"RuneCalendar\",\n    \"TbCalendarEvent\": \"RuneCalendarEvent\",\n    \"TbCalendarStats\": \"RuneCalendarStats\",\n    \"TbChartArea\": \"RuneChartArea\",\n    \"TbChartBar\": \"RuneChartBar\",\n    \"TbChartCandle\": \"RuneChartCandle\",\n    \"TbChartLine\": \"RuneChartLine\",\n    \"TbCheck\": \"RuneCheck\",\n    \"TbChevronDown\": \"RuneChevronDown\",\n    \"TbChevronLeft\": \"RuneChevronLeft\",\n    \"TbChevronLeftPipe\": \"RuneChevronFirst\",\n    \"TbChevronRight\": \"RuneChevronRight\",\n    \"TbChevronRightPipe\": \"RuneChevronLast\",\n    \"TbChevronsDown\": \"RuneChevronsDown\",\n    \"TbChevronsLeft\": \"RuneChevronsLeft\",\n    \"TbChevronsRight\": \"RuneChevronsRight\",\n    \"TbChevronsUp\": \"RuneChevronsUp\",\n    \"TbChevronUp\": \"RuneChevronUp\",\n    \"TbCircle\": \"RuneCircle\",\n    \"TbCircleCheck\": \"RuneSuccess\",\n    \"TbCircleCheckFilled\": \"RuneSuccessSolid\",\n    \"TbCircleX\": \"RuneError\",\n    \"TbClock\": \"RuneClock\",\n    \"TbClockX\": \"RuneExpiring\",\n    \"TbCloud\": \"RuneCloud\",\n    \"TbCloudComputing\": \"RuneCloud\",\n    \"TbCloudDownload\": \"RuneCloudDownload\",\n    \"TbCode\": \"RuneCode\",\n    \"TbCoin\": \"RuneBilling\",\n    \"TbCoins\": \"RuneCoins\",\n    \"TbColumns\": \"RuneColumns\",\n    \"TbColumns3\": \"RuneColumns\",\n    \"TbCompass\": \"RuneCompass\",\n    \"TbComponents\": \"RuneComponent\",\n    \"TbCopy\": \"RuneCopy\",\n    \"TbCornerDownLeft\": \"RuneEnter\",\n    \"TbCpu\": \"RuneChip\",\n    \"TbCreditCard\": \"RuneCreditCard\",\n    \"TbCrown\": \"RuneCrown\",\n    \"TbCurrencyDollar\": \"RuneDollar\",\n    \"TbDatabase\": \"RuneDatabase\",\n    \"TbDeviceDesktop\": \"RuneMonitor\",\n    \"TbDeviceFloppy\": \"RuneSave\",\n    \"TbDiscount\": \"RuneDiscount\",\n    \"TbDiscount2\": \"RuneDiscount\",\n    \"TbDots\": \"RuneMore\",\n    \"TbDotsVertical\": \"RuneMoreVertical\",\n    \"TbDownload\": \"RuneDownload\",\n    \"TbEdit\": \"RuneEdit\",\n    \"TbError404\": \"RuneNotFound\",\n    \"TbExclamationCircle\": \"RuneAlert\",\n    \"TbExternalLink\": \"RuneExternalLink\",\n    \"TbEye\": \"RuneEye\",\n    \"TbEyeOff\": \"RuneEyeOff\",\n    \"TbFile\": \"RuneFile\",\n    \"TbFileAnalytics\": \"RuneReport\",\n    \"TbFileCode\": \"RuneFileCode\",\n    \"TbFileDownload\": \"RuneFileDownload\",\n    \"TbFileExport\": \"RuneFileExport\",\n    \"TbFileText\": \"RuneFile\",\n    \"TbFilter\": \"RuneFilter\",\n    \"TbFlame\": \"RuneFlame\",\n    \"TbGasStation\": \"RuneFuel\",\n    \"TbGauge\": \"RuneGauge\",\n    \"TbGripVertical\": \"RuneGrip\",\n    \"TbHandStop\": \"RuneHandStop\",\n    \"TbHash\": \"RuneHash\",\n    \"TbHeadset\": \"RuneHeadset\",\n    \"TbHeart\": \"RuneHeart\",\n    \"TbHelp\": \"RuneHelp\",\n    \"TbHelpCircle\": \"RuneHelp\",\n    \"TbHistory\": \"RuneHistory\",\n    \"TbHome\": \"RuneHome\",\n    \"TbHome2\": \"RuneHome\",\n    \"TbInbox\": \"RuneInbox\",\n    \"TbInfinity\": \"RuneInfinity\",\n    \"TbInfoCircle\": \"RuneInfo\",\n    \"TbKey\": \"RuneKey\",\n    \"TbLayoutDashboard\": \"RuneDashboard\",\n    \"TbLayoutGrid\": \"RuneLayoutGrid\",\n    \"TbLayoutNavbar\": \"RuneWindow\",\n    \"TbLayoutSidebar\": \"RuneSidebar\",\n    \"TbLayoutSidebarLeftCollapse\": \"RuneSidebarCollapse\",\n    \"TbLayoutSidebarLeftExpand\": \"RuneSidebarExpand\",\n    \"TbLifebuoy\": \"RuneLifebuoy\",\n    \"TbLink\": \"RuneLink\",\n    \"TbList\": \"RuneList\",\n    \"TbListCheck\": \"RuneListCheck\",\n    \"TbListNumbers\": \"RuneListOrdered\",\n    \"TbLoader\": \"RuneLoader\",\n    \"TbLoader2\": \"RuneLoader\",\n    \"TbLock\": \"RuneLock\",\n    \"TbLogin\": \"RuneLogin\",\n    \"TbLogin2\": \"RuneLogin\",\n    \"TbLogout\": \"RuneLogout\",\n    \"TbLogout2\": \"RuneLogout\",\n    \"TbLogs\": \"RuneLogs\",\n    \"TbMail\": \"RuneMail\",\n    \"TbMaximize\": \"RuneMaximize\",\n    \"TbMenu\": \"RuneMenu\",\n    \"TbMenu2\": \"RuneMenu\",\n    \"TbMessage\": \"RuneMessage\",\n    \"TbMessageCircle\": \"RuneMessage\",\n    \"TbMinimize\": \"RuneMinimize\",\n    \"TbMinus\": \"RuneMinus\",\n    \"TbMoon\": \"RuneMoon\",\n    \"TbNetwork\": \"RuneNetwork\",\n    \"TbNumber123\": \"RuneNumber\",\n    \"TbNut\": \"RuneNut\",\n    \"TbPencil\": \"RuneEdit\",\n    \"TbPercentage\": \"RunePercent\",\n    \"TbPhone\": \"RunePhone\",\n    \"TbPin\": \"RunePin\",\n    \"TbPlayerPause\": \"RunePause\",\n    \"TbPlayerPlay\": \"RunePlay\",\n    \"TbPlayerStop\": \"RuneStop\",\n    \"TbPlayerStopFilled\": \"RuneStopSolid\",\n    \"TbPlayerTrackPrev\": \"RuneRewind\",\n    \"TbPlug\": \"RunePlug\",\n    \"TbPlugConnected\": \"RunePlug\",\n    \"TbPlus\": \"RunePlus\",\n    \"TbPoint\": \"RuneDot\",\n    \"TbPointFilled\": \"RuneDot\",\n    \"TbPower\": \"RunePower\",\n    \"TbPuzzle\": \"RunePuzzle\",\n    \"TbReceipt\": \"RuneReceipt\",\n    \"TbRefresh\": \"RuneRefresh\",\n    \"TbRepeat\": \"RuneRepeat\",\n    \"TbRobot\": \"RuneBot\",\n    \"TbRocket\": \"RuneRocket\",\n    \"TbRotate\": \"RuneReset\",\n    \"TbRss\": \"RuneRss\",\n    \"TbSearch\": \"RuneSearch\",\n    \"TbSelector\": \"RuneSelector\",\n    \"TbSend\": \"RuneSend\",\n    \"TbServer\": \"RuneServer\",\n    \"TbServer2\": \"RuneServer\",\n    \"TbServerCog\": \"RuneServerCog\",\n    \"TbSettings\": \"RuneSettings\",\n    \"TbShare\": \"RuneShare\",\n    \"TbShare2\": \"RuneShare\",\n    \"TbShield\": \"RuneShield\",\n    \"TbShieldCheck\": \"RuneShieldCheck\",\n    \"TbShieldExclamation\": \"RuneShieldAlert\",\n    \"TbShieldLock\": \"RuneShieldLock\",\n    \"TbSortAscending\": \"RuneSortAscending\",\n    \"TbSortDescending\": \"RuneSortDescending\",\n    \"TbSparkles\": \"RuneSparkles\",\n    \"TbStack\": \"RuneLayers\",\n    \"TbStack2\": \"RuneLayers\",\n    \"TbStar\": \"RuneStar\",\n    \"TbStopwatch\": \"RuneTimer\",\n    \"TbSun\": \"RuneSun\",\n    \"TbTerminal\": \"RuneTerminal\",\n    \"TbTerminal2\": \"RuneTerminal\",\n    \"TbTool\": \"RuneWrench\",\n    \"TbTrash\": \"RuneTrash\",\n    \"TbTrophy\": \"RuneTrophy\",\n    \"TbUpload\": \"RuneUpload\",\n    \"TbUser\": \"RuneProfile\",\n    \"TbUserPlus\": \"RuneUserPlus\",\n    \"TbUsers\": \"RuneTeam\",\n    \"TbWand\": \"RuneSparkles\",\n    \"TbWaveSine\": \"RuneWaves\",\n    \"TbWebhook\": \"RuneWebhook\",\n    \"TbWorld\": \"RuneWorld\",\n    \"TbX\": \"RuneClose\"\n  },\n  \"near\": {\n    \"lucide:AlignJustify\": \"justified text lines become the menu\",\n    \"lucide:AlignJustifyIcon\": \"justified text lines become the menu\",\n    \"lucide:Award\": \"a medal becomes a trophy\",\n    \"lucide:AwardIcon\": \"a medal becomes a trophy\",\n    \"lucide:BadgeDollarSign\": \"a badge becomes a coin\",\n    \"lucide:BadgeDollarSignIcon\": \"a badge becomes a coin\",\n    \"lucide:Building\": \"an office block becomes a hall\",\n    \"lucide:BuildingIcon\": \"an office block becomes a hall\",\n    \"lucide:ChartBar\": \"horizontal bars become vertical bars\",\n    \"lucide:ChartBarIcon\": \"horizontal bars become vertical bars\",\n    \"lucide:ChartSpline\": \"a curve becomes a cut line\",\n    \"lucide:ChartSplineIcon\": \"a curve becomes a cut line\",\n    \"lucide:DatabaseZap\": \"the bolt on the drum is dropped\",\n    \"lucide:DatabaseZapIcon\": \"the bolt on the drum is dropped\",\n    \"lucide:Expand\": \"four arrows become two\",\n    \"lucide:ExpandIcon\": \"four arrows become two\",\n    \"lucide:ListFilter\": \"filter lines become a funnel\",\n    \"lucide:ListFilterIcon\": \"filter lines become a funnel\",\n    \"lucide:PanelTop\": \"a panel layout becomes a window\",\n    \"lucide:PanelTopIcon\": \"a panel layout becomes a window\",\n    \"lucide:PlugZap\": \"the bolt by the plug is dropped\",\n    \"lucide:PlugZapIcon\": \"the bolt by the plug is dropped\",\n    \"lucide:RotateCw\": \"one clockwise arrow becomes two refresh arrows\",\n    \"lucide:RotateCwIcon\": \"one clockwise arrow becomes two refresh arrows\",\n    \"lucide:Settings2\": \"lucide draws two sliders; RuneSettings is a cog\",\n    \"lucide:Settings2Icon\": \"lucide draws two sliders; RuneSettings is a cog\",\n    \"lucide:Share\": \"an arrow out of a box becomes three joined nodes\",\n    \"lucide:ShareIcon\": \"an arrow out of a box becomes three joined nodes\",\n    \"lucide:Shrink\": \"four arrows become two\",\n    \"lucide:ShrinkIcon\": \"four arrows become two\",\n    \"lucide:Sparkle\": \"one sparkle becomes several\",\n    \"lucide:SparkleIcon\": \"one sparkle becomes several\",\n    \"lucide:Square\": \"a plain square becomes the stop block\",\n    \"lucide:SquareIcon\": \"a plain square becomes the stop block\",\n    \"lucide:SquarePen\": \"a pen on a square becomes a pencil\",\n    \"lucide:SquarePenIcon\": \"a pen on a square becomes a pencil\",\n    \"lucide:SquareTerminal\": \"the frame round the prompt is dropped\",\n    \"lucide:SquareTerminalIcon\": \"the frame round the prompt is dropped\",\n    \"lucide:Undo2\": \"an undo arrow becomes the reset ring\",\n    \"lucide:Undo2Icon\": \"an undo arrow becomes the reset ring\",\n    \"lucide:WandSparkles\": \"a wand becomes sparkles\",\n    \"lucide:WandSparklesIcon\": \"a wand becomes sparkles\",\n    \"react-icons:LuAlignJustify\": \"justified text lines become the menu\",\n    \"react-icons:LuAward\": \"a medal becomes a trophy\",\n    \"react-icons:LuBadgeDollarSign\": \"a badge becomes a coin\",\n    \"react-icons:LuBuilding\": \"an office block becomes a hall\",\n    \"react-icons:LuChartBar\": \"horizontal bars become vertical bars\",\n    \"react-icons:LuChartSpline\": \"a curve becomes a cut line\",\n    \"react-icons:LuDatabaseZap\": \"the bolt on the drum is dropped\",\n    \"react-icons:LuExpand\": \"four arrows become two\",\n    \"react-icons:LuListFilter\": \"filter lines become a funnel\",\n    \"react-icons:LuPanelTop\": \"a panel layout becomes a window\",\n    \"react-icons:LuPlugZap\": \"the bolt by the plug is dropped\",\n    \"react-icons:LuRotateCw\": \"one clockwise arrow becomes two refresh arrows\",\n    \"react-icons:LuSettings2\": \"lucide draws two sliders; RuneSettings is a cog\",\n    \"react-icons:LuShare\": \"an arrow out of a box becomes three joined nodes\",\n    \"react-icons:LuShrink\": \"four arrows become two\",\n    \"react-icons:LuSparkle\": \"one sparkle becomes several\",\n    \"react-icons:LuSquare\": \"a plain square becomes the stop block\",\n    \"react-icons:LuSquarePen\": \"a pen on a square becomes a pencil\",\n    \"react-icons:LuSquareTerminal\": \"the frame round the prompt is dropped\",\n    \"react-icons:LuUndo2\": \"an undo arrow becomes the reset ring\",\n    \"react-icons:LuWandSparkles\": \"a wand becomes sparkles\",\n    \"react-icons:TbArrowBackUp\": \"an undo arrow becomes the reset ring\",\n    \"react-icons:TbAward\": \"a medal becomes a trophy\",\n    \"react-icons:TbBuilding\": \"an office block becomes a hall\",\n    \"react-icons:TbCloudComputing\": \"the stand under the cloud is dropped\",\n    \"react-icons:TbCoin\": \"a plain coin gains a $\",\n    \"react-icons:TbLayoutNavbar\": \"a panel layout becomes a window\",\n    \"react-icons:TbServer2\": \"the second server style becomes the one server\",\n    \"react-icons:TbShare2\": \"an arrow out of a box becomes three joined nodes\",\n    \"react-icons:TbTerminal2\": \"the frame round the prompt is dropped\",\n    \"react-icons:TbWand\": \"a wand becomes sparkles\",\n    \"tabler:IconArrowBackUp\": \"an undo arrow becomes the reset ring\",\n    \"tabler:IconAward\": \"a medal becomes a trophy\",\n    \"tabler:IconBuilding\": \"an office block becomes a hall\",\n    \"tabler:IconCloudComputing\": \"the stand under the cloud is dropped\",\n    \"tabler:IconCoin\": \"a plain coin gains a $\",\n    \"tabler:IconLayoutNavbar\": \"a panel layout becomes a window\",\n    \"tabler:IconServer2\": \"the second server style becomes the one server\",\n    \"tabler:IconShare2\": \"an arrow out of a box becomes three joined nodes\",\n    \"tabler:IconTerminal2\": \"the frame round the prompt is dropped\",\n    \"tabler:IconWand\": \"a wand becomes sparkles\"\n  }\n}\n",
      "type": "registry:file",
      "target": "~/scripts/rune-icons/rune-icon-map.json"
    }
  ],
  "type": "registry:file"
}