{
  "version": 3,
  "sources": ["../../../src/diagrams/git/gitGraphTypes.ts", "../../../src/diagrams/git/gitGraphAst.ts", "../../../src/diagrams/git/gitGraphParser.ts", "../../../src/diagrams/git/gitGraphRenderer.ts", "../../../src/diagrams/git/styles.js", "../../../src/diagrams/git/gitGraphDiagram.ts"],
  "sourcesContent": ["import type { GitGraphDiagramConfig } from '../../config.type.js';\nimport type { DiagramDBBase } from '../../diagram-api/types.js';\n\nexport const commitType = {\n  NORMAL: 0,\n  REVERSE: 1,\n  HIGHLIGHT: 2,\n  MERGE: 3,\n  CHERRY_PICK: 4,\n} as const;\n\nexport interface CommitDB {\n  msg: string;\n  id: string;\n  type: number;\n  tags?: string[];\n}\n\nexport interface BranchDB {\n  name: string;\n  order: number;\n}\n\nexport interface MergeDB {\n  branch: string;\n  id: string;\n  type?: number;\n  tags?: string[];\n}\n\nexport interface CherryPickDB {\n  id: string;\n  targetId: string;\n  parent: string;\n  tags?: string[];\n}\n\nexport interface Commit {\n  id: string;\n  message: string;\n  seq: number;\n  type: number;\n  tags: string[];\n  parents: string[];\n  branch: string;\n  customType?: number;\n  customId?: boolean;\n}\n\nexport interface GitGraph {\n  statements: Statement[];\n}\n\nexport type Statement = CommitAst | BranchAst | MergeAst | CheckoutAst | CherryPickingAst;\n\nexport interface CommitAst {\n  $type: 'Commit';\n  id: string;\n  message?: string;\n  tags?: string[];\n  type?: 'NORMAL' | 'REVERSE' | 'HIGHLIGHT';\n}\n\nexport interface BranchAst {\n  $type: 'Branch';\n  name: string;\n  order?: number;\n}\n\nexport interface MergeAst {\n  $type: 'Merge';\n  branch: string;\n  id?: string;\n  tags?: string[];\n  type?: 'NORMAL' | 'REVERSE' | 'HIGHLIGHT';\n}\n\nexport interface CheckoutAst {\n  $type: 'Checkout';\n  branch: string;\n}\n\nexport interface CherryPickingAst {\n  $type: 'CherryPicking';\n  id: string;\n  parent: string;\n  tags?: string[];\n}\n\nexport interface GitGraphDB extends DiagramDBBase<GitGraphDiagramConfig> {\n  commitType: typeof commitType;\n  setDirection: (dir: DiagramOrientation) => void;\n  setOptions: (rawOptString: string) => void;\n  getOptions: () => any;\n  commit: (commitDB: CommitDB) => void;\n  branch: (branchDB: BranchDB) => void;\n  merge: (mergeDB: MergeDB) => void;\n  cherryPick: (cherryPickDB: CherryPickDB) => void;\n  checkout: (branch: string) => void;\n  prettyPrint: () => void;\n  clear: () => void;\n  getBranchesAsObjArray: () => { name: string }[];\n  getBranches: () => Map<string, string | null>;\n  getCommits: () => Map<string, Commit>;\n  getCommitsArray: () => Commit[];\n  getCurrentBranch: () => string;\n  getDirection: () => DiagramOrientation;\n  getHead: () => Commit | null;\n}\n\nexport interface GitGraphDBParseProvider extends Partial<GitGraphDB> {\n  commitType: typeof commitType;\n  setDirection: (dir: DiagramOrientation) => void;\n  commit: (commitDB: CommitDB) => void;\n  branch: (branchDB: BranchDB) => void;\n  merge: (mergeDB: MergeDB) => void;\n  cherryPick: (cherryPickDB: CherryPickDB) => void;\n  checkout: (branch: string) => void;\n}\n\nexport interface GitGraphDBRenderProvider extends Partial<GitGraphDB> {\n  prettyPrint: () => void;\n  clear: () => void;\n  getBranchesAsObjArray: () => { name: string }[];\n  getBranches: () => Map<string, string | null>;\n  getCommits: () => Map<string, Commit>;\n  getCommitsArray: () => Commit[];\n  getCurrentBranch: () => string;\n  getDirection: () => DiagramOrientation;\n  getHead: () => Commit | null;\n  getDiagramTitle: () => string;\n}\n\nexport type DiagramOrientation = 'LR' | 'TB' | 'BT';\n", "import { log } from '../../logger.js';\nimport { cleanAndMerge, random } from '../../utils.js';\nimport { getConfig as commonGetConfig } from '../../config.js';\nimport common from '../common/common.js';\nimport {\n  setAccTitle,\n  getAccTitle,\n  getAccDescription,\n  setAccDescription,\n  clear as commonClear,\n  setDiagramTitle,\n  getDiagramTitle,\n} from '../common/commonDb.js';\nimport type {\n  DiagramOrientation,\n  Commit,\n  GitGraphDB,\n  CommitDB,\n  MergeDB,\n  BranchDB,\n  CherryPickDB,\n} from './gitGraphTypes.js';\nimport { commitType } from './gitGraphTypes.js';\nimport { ImperativeState } from '../../utils/imperativeState.js';\n\nimport DEFAULT_CONFIG from '../../defaultConfig.js';\n\nimport type { GitGraphDiagramConfig } from '../../config.type.js';\ninterface GitGraphState {\n  commits: Map<string, Commit>;\n  head: Commit | null;\n  branchConfig: Map<string, { name: string; order: number | undefined }>;\n  branches: Map<string, string | null>;\n  currBranch: string;\n  direction: DiagramOrientation;\n  seq: number;\n  options: any;\n}\n\nconst DEFAULT_GITGRAPH_CONFIG: Required<GitGraphDiagramConfig> = DEFAULT_CONFIG.gitGraph;\nconst getConfig = (): Required<GitGraphDiagramConfig> => {\n  const config = cleanAndMerge({\n    ...DEFAULT_GITGRAPH_CONFIG,\n    ...commonGetConfig().gitGraph,\n  });\n  return config;\n};\n\nconst state = new ImperativeState<GitGraphState>(() => {\n  const config = getConfig();\n  const mainBranchName = config.mainBranchName;\n  const mainBranchOrder = config.mainBranchOrder;\n  return {\n    mainBranchName,\n    commits: new Map(),\n    head: null,\n    branchConfig: new Map([[mainBranchName, { name: mainBranchName, order: mainBranchOrder }]]),\n    branches: new Map([[mainBranchName, null]]),\n    currBranch: mainBranchName,\n    direction: 'LR',\n    seq: 0,\n    options: {},\n  };\n});\n\nfunction getID() {\n  return random({ length: 7 });\n}\n\n/**\n * @param list - list of items\n * @param fn -  function to get the key\n */\nfunction uniqBy(list: any[], fn: (item: any) => any) {\n  const recordMap = Object.create(null);\n  return list.reduce((out, item) => {\n    const key = fn(item);\n    if (!recordMap[key]) {\n      recordMap[key] = true;\n      out.push(item);\n    }\n    return out;\n  }, []);\n}\n\nexport const setDirection = function (dir: DiagramOrientation) {\n  state.records.direction = dir;\n};\n\nexport const setOptions = function (rawOptString: string) {\n  log.debug('options str', rawOptString);\n  rawOptString = rawOptString?.trim();\n  rawOptString = rawOptString || '{}';\n  try {\n    state.records.options = JSON.parse(rawOptString);\n  } catch (e: any) {\n    log.error('error while parsing gitGraph options', e.message);\n  }\n};\n\nexport const getOptions = function () {\n  return state.records.options;\n};\n\nexport const commit = function (commitDB: CommitDB) {\n  let msg = commitDB.msg;\n  let id = commitDB.id;\n  const type = commitDB.type;\n  let tags = commitDB.tags;\n\n  log.info('commit', msg, id, type, tags);\n  log.debug('Entering commit:', msg, id, type, tags);\n  const config = getConfig();\n  id = common.sanitizeText(id, config);\n  msg = common.sanitizeText(msg, config);\n  tags = tags?.map((tag) => common.sanitizeText(tag, config));\n  const newCommit: Commit = {\n    id: id ? id : state.records.seq + '-' + getID(),\n    message: msg,\n    seq: state.records.seq++,\n    type: type ?? commitType.NORMAL,\n    tags: tags ?? [],\n    parents: state.records.head == null ? [] : [state.records.head.id],\n    branch: state.records.currBranch,\n  };\n  state.records.head = newCommit;\n  log.info('main branch', config.mainBranchName);\n  if (state.records.commits.has(newCommit.id)) {\n    log.warn(`Commit ID ${newCommit.id} already exists`);\n  }\n  state.records.commits.set(newCommit.id, newCommit);\n  state.records.branches.set(state.records.currBranch, newCommit.id);\n  log.debug('in pushCommit ' + newCommit.id);\n};\n\nexport const branch = function (branchDB: BranchDB) {\n  let name = branchDB.name;\n  const order = branchDB.order;\n  name = common.sanitizeText(name, getConfig());\n  if (state.records.branches.has(name)) {\n    throw new Error(\n      `Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using \"checkout ${name}\")`\n    );\n  }\n\n  state.records.branches.set(name, state.records.head != null ? state.records.head.id : null);\n  state.records.branchConfig.set(name, { name, order });\n  checkout(name);\n  log.debug('in createBranch');\n};\n\nexport const merge = (mergeDB: MergeDB): void => {\n  let otherBranch = mergeDB.branch;\n  let customId = mergeDB.id;\n  const overrideType = mergeDB.type;\n  const customTags = mergeDB.tags;\n  const config = getConfig();\n  otherBranch = common.sanitizeText(otherBranch, config);\n  if (customId) {\n    customId = common.sanitizeText(customId, config);\n  }\n  const currentBranchCheck = state.records.branches.get(state.records.currBranch);\n  const otherBranchCheck = state.records.branches.get(otherBranch);\n  const currentCommit = currentBranchCheck\n    ? state.records.commits.get(currentBranchCheck)\n    : undefined;\n  const otherCommit: Commit | undefined = otherBranchCheck\n    ? state.records.commits.get(otherBranchCheck)\n    : undefined;\n  if (currentCommit && otherCommit && currentCommit.branch === otherBranch) {\n    throw new Error(`Cannot merge branch '${otherBranch}' into itself.`);\n  }\n  if (state.records.currBranch === otherBranch) {\n    const error: any = new Error('Incorrect usage of \"merge\". Cannot merge a branch to itself');\n    error.hash = {\n      text: `merge ${otherBranch}`,\n      token: `merge ${otherBranch}`,\n      expected: ['branch abc'],\n    };\n    throw error;\n  }\n  if (currentCommit === undefined || !currentCommit) {\n    const error: any = new Error(\n      `Incorrect usage of \"merge\". Current branch (${state.records.currBranch})has no commits`\n    );\n    error.hash = {\n      text: `merge ${otherBranch}`,\n      token: `merge ${otherBranch}`,\n      expected: ['commit'],\n    };\n    throw error;\n  }\n  if (!state.records.branches.has(otherBranch)) {\n    const error: any = new Error(\n      'Incorrect usage of \"merge\". Branch to be merged (' + otherBranch + ') does not exist'\n    );\n    error.hash = {\n      text: `merge ${otherBranch}`,\n      token: `merge ${otherBranch}`,\n      expected: [`branch ${otherBranch}`],\n    };\n    throw error;\n  }\n  if (otherCommit === undefined || !otherCommit) {\n    const error: any = new Error(\n      'Incorrect usage of \"merge\". Branch to be merged (' + otherBranch + ') has no commits'\n    );\n    error.hash = {\n      text: `merge ${otherBranch}`,\n      token: `merge ${otherBranch}`,\n      expected: ['\"commit\"'],\n    };\n    throw error;\n  }\n  if (currentCommit === otherCommit) {\n    const error: any = new Error('Incorrect usage of \"merge\". Both branches have same head');\n    error.hash = {\n      text: `merge ${otherBranch}`,\n      token: `merge ${otherBranch}`,\n      expected: ['branch abc'],\n    };\n    throw error;\n  }\n  if (customId && state.records.commits.has(customId)) {\n    const error: any = new Error(\n      'Incorrect usage of \"merge\". Commit with id:' +\n        customId +\n        ' already exists, use different custom id'\n    );\n    error.hash = {\n      text: `merge ${otherBranch} ${customId} ${overrideType} ${customTags?.join(' ')}`,\n      token: `merge ${otherBranch} ${customId} ${overrideType} ${customTags?.join(' ')}`,\n      expected: [\n        `merge ${otherBranch} ${customId}_UNIQUE ${overrideType} ${customTags?.join(' ')}`,\n      ],\n    };\n\n    throw error;\n  }\n\n  const verifiedBranch: string = otherBranchCheck ? otherBranchCheck : ''; //figure out a cleaner way to do this\n\n  const commit = {\n    id: customId || `${state.records.seq}-${getID()}`,\n    message: `merged branch ${otherBranch} into ${state.records.currBranch}`,\n    seq: state.records.seq++,\n    parents: state.records.head == null ? [] : [state.records.head.id, verifiedBranch],\n    branch: state.records.currBranch,\n    type: commitType.MERGE,\n    customType: overrideType,\n    customId: customId ? true : false,\n    tags: customTags ?? [],\n  } satisfies Commit;\n  state.records.head = commit;\n  state.records.commits.set(commit.id, commit);\n  state.records.branches.set(state.records.currBranch, commit.id);\n  log.debug(state.records.branches);\n  log.debug('in mergeBranch');\n};\n\nexport const cherryPick = function (cherryPickDB: CherryPickDB) {\n  let sourceId = cherryPickDB.id;\n  let targetId = cherryPickDB.targetId;\n  let tags = cherryPickDB.tags;\n  let parentCommitId = cherryPickDB.parent;\n  log.debug('Entering cherryPick:', sourceId, targetId, tags);\n  const config = getConfig();\n  sourceId = common.sanitizeText(sourceId, config);\n  targetId = common.sanitizeText(targetId, config);\n\n  tags = tags?.map((tag) => common.sanitizeText(tag, config));\n\n  parentCommitId = common.sanitizeText(parentCommitId, config);\n\n  if (!sourceId || !state.records.commits.has(sourceId)) {\n    const error: any = new Error(\n      'Incorrect usage of \"cherryPick\". Source commit id should exist and provided'\n    );\n    error.hash = {\n      text: `cherryPick ${sourceId} ${targetId}`,\n      token: `cherryPick ${sourceId} ${targetId}`,\n      expected: ['cherry-pick abc'],\n    };\n    throw error;\n  }\n\n  const sourceCommit = state.records.commits.get(sourceId);\n  if (sourceCommit === undefined || !sourceCommit) {\n    throw new Error('Incorrect usage of \"cherryPick\". Source commit id should exist and provided');\n  }\n  if (\n    parentCommitId &&\n    !(Array.isArray(sourceCommit.parents) && sourceCommit.parents.includes(parentCommitId))\n  ) {\n    const error = new Error(\n      'Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.'\n    );\n    throw error;\n  }\n  const sourceCommitBranch = sourceCommit.branch;\n  if (sourceCommit.type === commitType.MERGE && !parentCommitId) {\n    const error = new Error(\n      'Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.'\n    );\n    throw error;\n  }\n  if (!targetId || !state.records.commits.has(targetId)) {\n    // cherry-pick source commit to current branch\n\n    if (sourceCommitBranch === state.records.currBranch) {\n      const error: any = new Error(\n        'Incorrect usage of \"cherryPick\". Source commit is already on current branch'\n      );\n      error.hash = {\n        text: `cherryPick ${sourceId} ${targetId}`,\n        token: `cherryPick ${sourceId} ${targetId}`,\n        expected: ['cherry-pick abc'],\n      };\n      throw error;\n    }\n    const currentCommitId = state.records.branches.get(state.records.currBranch);\n    if (currentCommitId === undefined || !currentCommitId) {\n      const error: any = new Error(\n        `Incorrect usage of \"cherry-pick\". Current branch (${state.records.currBranch})has no commits`\n      );\n      error.hash = {\n        text: `cherryPick ${sourceId} ${targetId}`,\n        token: `cherryPick ${sourceId} ${targetId}`,\n        expected: ['cherry-pick abc'],\n      };\n      throw error;\n    }\n\n    const currentCommit = state.records.commits.get(currentCommitId);\n    if (currentCommit === undefined || !currentCommit) {\n      const error: any = new Error(\n        `Incorrect usage of \"cherry-pick\". Current branch (${state.records.currBranch})has no commits`\n      );\n      error.hash = {\n        text: `cherryPick ${sourceId} ${targetId}`,\n        token: `cherryPick ${sourceId} ${targetId}`,\n        expected: ['cherry-pick abc'],\n      };\n      throw error;\n    }\n    const commit = {\n      id: state.records.seq + '-' + getID(),\n      message: `cherry-picked ${sourceCommit?.message} into ${state.records.currBranch}`,\n      seq: state.records.seq++,\n      parents: state.records.head == null ? [] : [state.records.head.id, sourceCommit.id],\n      branch: state.records.currBranch,\n      type: commitType.CHERRY_PICK,\n      tags: tags\n        ? tags.filter(Boolean)\n        : [\n            `cherry-pick:${sourceCommit.id}${\n              sourceCommit.type === commitType.MERGE ? `|parent:${parentCommitId}` : ''\n            }`,\n          ],\n    };\n\n    state.records.head = commit;\n    state.records.commits.set(commit.id, commit);\n    state.records.branches.set(state.records.currBranch, commit.id);\n    log.debug(state.records.branches);\n    log.debug('in cherryPick');\n  }\n};\nexport const checkout = function (branch: string) {\n  branch = common.sanitizeText(branch, getConfig());\n  if (!state.records.branches.has(branch)) {\n    const error: any = new Error(\n      `Trying to checkout branch which is not yet created. (Help try using \"branch ${branch}\")`\n    );\n    error.hash = {\n      text: `checkout ${branch}`,\n      token: `checkout ${branch}`,\n      expected: [`branch ${branch}`],\n    };\n    throw error;\n  } else {\n    state.records.currBranch = branch;\n    const id = state.records.branches.get(state.records.currBranch);\n    if (id === undefined || !id) {\n      state.records.head = null;\n    } else {\n      state.records.head = state.records.commits.get(id) ?? null;\n    }\n  }\n};\n\n/**\n * @param arr - array\n * @param key - key\n * @param newVal - new value\n */\nfunction upsert(arr: any[], key: any, newVal: any) {\n  const index = arr.indexOf(key);\n  if (index === -1) {\n    arr.push(newVal);\n  } else {\n    arr.splice(index, 1, newVal);\n  }\n}\n\nfunction prettyPrintCommitHistory(commitArr: Commit[]) {\n  const commit = commitArr.reduce((out, commit) => {\n    if (out.seq > commit.seq) {\n      return out;\n    }\n    return commit;\n  }, commitArr[0]);\n  let line = '';\n  commitArr.forEach(function (c) {\n    if (c === commit) {\n      line += '\\t*';\n    } else {\n      line += '\\t|';\n    }\n  });\n  const label = [line, commit.id, commit.seq];\n  for (const branch in state.records.branches) {\n    if (state.records.branches.get(branch) === commit.id) {\n      label.push(branch);\n    }\n  }\n  log.debug(label.join(' '));\n  if (commit.parents && commit.parents.length == 2 && commit.parents[0] && commit.parents[1]) {\n    const newCommit = state.records.commits.get(commit.parents[0]);\n    upsert(commitArr, commit, newCommit);\n    if (commit.parents[1]) {\n      commitArr.push(state.records.commits.get(commit.parents[1])!);\n    }\n  } else if (commit.parents.length == 0) {\n    return;\n  } else {\n    if (commit.parents[0]) {\n      const newCommit = state.records.commits.get(commit.parents[0]);\n      upsert(commitArr, commit, newCommit);\n    }\n  }\n  commitArr = uniqBy(commitArr, (c) => c.id);\n  prettyPrintCommitHistory(commitArr);\n}\n\nexport const prettyPrint = function () {\n  log.debug(state.records.commits);\n  const node = getCommitsArray()[0];\n  prettyPrintCommitHistory([node]);\n};\n\nexport const clear = function () {\n  state.reset();\n  commonClear();\n};\n\nexport const getBranchesAsObjArray = function () {\n  const branchesArray = [...state.records.branchConfig.values()]\n    .map((branchConfig, i) => {\n      if (branchConfig.order !== null && branchConfig.order !== undefined) {\n        return branchConfig;\n      }\n      return {\n        ...branchConfig,\n        order: parseFloat(`0.${i}`),\n      };\n    })\n    .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n    .map(({ name }) => ({ name }));\n\n  return branchesArray;\n};\n\nexport const getBranches = function () {\n  return state.records.branches;\n};\nexport const getCommits = function () {\n  return state.records.commits;\n};\nexport const getCommitsArray = function () {\n  const commitArr = [...state.records.commits.values()];\n  commitArr.forEach(function (o) {\n    log.debug(o.id);\n  });\n  commitArr.sort((a, b) => a.seq - b.seq);\n  return commitArr;\n};\nexport const getCurrentBranch = function () {\n  return state.records.currBranch;\n};\nexport const getDirection = function () {\n  return state.records.direction;\n};\nexport const getHead = function () {\n  return state.records.head;\n};\n\nexport const db: GitGraphDB = {\n  commitType,\n  getConfig,\n  setDirection,\n  setOptions,\n  getOptions,\n  commit,\n  branch,\n  merge,\n  cherryPick,\n  checkout,\n  //reset,\n  prettyPrint,\n  clear,\n  getBranchesAsObjArray,\n  getBranches,\n  getCommits,\n  getCommitsArray,\n  getCurrentBranch,\n  getDirection,\n  getHead,\n  setAccTitle,\n  getAccTitle,\n  getAccDescription,\n  setAccDescription,\n  setDiagramTitle,\n  getDiagramTitle,\n};\n", "import type { GitGraph } from '@mermaid-js/parser';\nimport { parse } from '@mermaid-js/parser';\nimport type { ParserDefinition } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport { populateCommonDb } from '../common/populateCommonDb.js';\nimport { db } from './gitGraphAst.js';\nimport { commitType } from './gitGraphTypes.js';\nimport type {\n  CheckoutAst,\n  CherryPickingAst,\n  MergeAst,\n  CommitAst,\n  BranchAst,\n  GitGraphDBParseProvider,\n  CommitDB,\n  BranchDB,\n  MergeDB,\n  CherryPickDB,\n} from './gitGraphTypes.js';\n\nconst populate = (ast: GitGraph, db: GitGraphDBParseProvider) => {\n  populateCommonDb(ast, db);\n  // @ts-ignore: this wont exist if the direction is not specified\n  if (ast.dir) {\n    // @ts-ignore: this wont exist if the direction is not specified\n    db.setDirection(ast.dir);\n  }\n  for (const statement of ast.statements) {\n    parseStatement(statement, db);\n  }\n};\n\nconst parseStatement = (statement: any, db: GitGraphDBParseProvider) => {\n  const parsers: Record<string, (stmt: any) => void> = {\n    Commit: (stmt) => db.commit(parseCommit(stmt)),\n    Branch: (stmt) => db.branch(parseBranch(stmt)),\n    Merge: (stmt) => db.merge(parseMerge(stmt)),\n    Checkout: (stmt) => db.checkout(parseCheckout(stmt)),\n    CherryPicking: (stmt) => db.cherryPick(parseCherryPicking(stmt)),\n  };\n\n  const parser = parsers[statement.$type];\n  if (parser) {\n    parser(statement);\n  } else {\n    log.error(`Unknown statement type: ${statement.$type}`);\n  }\n};\n\nconst parseCommit = (commit: CommitAst): CommitDB => {\n  const commitDB: CommitDB = {\n    id: commit.id,\n    msg: commit.message ?? '',\n    type: commit.type !== undefined ? commitType[commit.type] : commitType.NORMAL,\n    tags: commit.tags ?? undefined,\n  };\n  return commitDB;\n};\n\nconst parseBranch = (branch: BranchAst): BranchDB => {\n  const branchDB: BranchDB = {\n    name: branch.name,\n    order: branch.order ?? 0,\n  };\n  return branchDB;\n};\n\nconst parseMerge = (merge: MergeAst): MergeDB => {\n  const mergeDB: MergeDB = {\n    branch: merge.branch,\n    id: merge.id ?? '',\n    type: merge.type !== undefined ? commitType[merge.type] : undefined,\n    tags: merge.tags ?? undefined,\n  };\n  return mergeDB;\n};\n\nconst parseCheckout = (checkout: CheckoutAst): string => {\n  const branch = checkout.branch;\n  return branch;\n};\n\nconst parseCherryPicking = (cherryPicking: CherryPickingAst): CherryPickDB => {\n  const cherryPickDB: CherryPickDB = {\n    id: cherryPicking.id,\n    targetId: '',\n    tags: cherryPicking.tags?.length === 0 ? undefined : cherryPicking.tags,\n    parent: cherryPicking.parent,\n  };\n  return cherryPickDB;\n};\n\nexport const parser: ParserDefinition = {\n  parse: async (input: string): Promise<void> => {\n    const ast: GitGraph = await parse('gitGraph', input);\n    log.debug(ast);\n    populate(ast, db);\n  },\n};\n\nif (import.meta.vitest) {\n  const { it, expect, describe } = import.meta.vitest;\n\n  const mockDB: GitGraphDBParseProvider = {\n    commitType: commitType,\n    setDirection: vi.fn(),\n    commit: vi.fn(),\n    branch: vi.fn(),\n    merge: vi.fn(),\n    cherryPick: vi.fn(),\n    checkout: vi.fn(),\n  };\n\n  describe('GitGraph Parser', () => {\n    it('should parse a commit statement', () => {\n      const commit = {\n        $type: 'Commit',\n        id: '1',\n        message: 'test',\n        tags: ['tag1', 'tag2'],\n        type: 'NORMAL',\n      };\n      parseStatement(commit, mockDB);\n      expect(mockDB.commit).toHaveBeenCalledWith({\n        id: '1',\n        msg: 'test',\n        tags: ['tag1', 'tag2'],\n        type: 0,\n      });\n    });\n    it('should parse a branch statement', () => {\n      const branch = {\n        $type: 'Branch',\n        name: 'newBranch',\n        order: 1,\n      };\n      parseStatement(branch, mockDB);\n      expect(mockDB.branch).toHaveBeenCalledWith({ name: 'newBranch', order: 1 });\n    });\n    it('should parse a checkout statement', () => {\n      const checkout = {\n        $type: 'Checkout',\n        branch: 'newBranch',\n      };\n      parseStatement(checkout, mockDB);\n      expect(mockDB.checkout).toHaveBeenCalledWith('newBranch');\n    });\n    it('should parse a merge statement', () => {\n      const merge = {\n        $type: 'Merge',\n        branch: 'newBranch',\n        id: '1',\n        tags: ['tag1', 'tag2'],\n        type: 'NORMAL',\n      };\n      parseStatement(merge, mockDB);\n      expect(mockDB.merge).toHaveBeenCalledWith({\n        branch: 'newBranch',\n        id: '1',\n        tags: ['tag1', 'tag2'],\n        type: 0,\n      });\n    });\n    it('should parse a cherry picking statement', () => {\n      const cherryPick = {\n        $type: 'CherryPicking',\n        id: '1',\n        tags: ['tag1', 'tag2'],\n        parent: '2',\n      };\n      parseStatement(cherryPick, mockDB);\n      expect(mockDB.cherryPick).toHaveBeenCalledWith({\n        id: '1',\n        targetId: '',\n        parent: '2',\n        tags: ['tag1', 'tag2'],\n      });\n    });\n\n    it('should parse a langium generated gitGraph ast', () => {\n      const dummy: GitGraph = {\n        $type: 'GitGraph',\n        statements: [],\n        accDescr: '',\n        accTitle: '',\n        title: '',\n      };\n      const gitGraphAst: GitGraph = {\n        $type: 'GitGraph',\n        statements: [\n          {\n            $container: dummy,\n            $type: 'Commit',\n            id: '1',\n            message: 'test',\n            tags: ['tag1', 'tag2'],\n            type: 'NORMAL',\n          },\n          {\n            $container: dummy,\n            $type: 'Branch',\n            name: 'newBranch',\n            order: 1,\n          },\n          {\n            $container: dummy,\n            $type: 'Merge',\n            branch: 'newBranch',\n            id: '1',\n            tags: ['tag1', 'tag2'],\n            type: 'NORMAL',\n          },\n          {\n            $container: dummy,\n            $type: 'Checkout',\n            branch: 'newBranch',\n          },\n          {\n            $container: dummy,\n            $type: 'CherryPicking',\n            id: '1',\n            tags: ['tag1', 'tag2'],\n            parent: '2',\n          },\n        ],\n        accDescr: '',\n        accTitle: '',\n        title: '',\n      };\n\n      populate(gitGraphAst, mockDB);\n\n      expect(mockDB.commit).toHaveBeenCalledWith({\n        id: '1',\n        msg: 'test',\n        tags: ['tag1', 'tag2'],\n        type: 0,\n      });\n      expect(mockDB.branch).toHaveBeenCalledWith({ name: 'newBranch', order: 1 });\n      expect(mockDB.merge).toHaveBeenCalledWith({\n        branch: 'newBranch',\n        id: '1',\n        tags: ['tag1', 'tag2'],\n        type: 0,\n      });\n      expect(mockDB.checkout).toHaveBeenCalledWith('newBranch');\n    });\n  });\n}\n", "import { select } from 'd3';\nimport { getConfig, setupGraphViewbox } from '../../diagram-api/diagramAPI.js';\nimport { log } from '../../logger.js';\nimport utils from '../../utils.js';\nimport type { DrawDefinition } from '../../diagram-api/types.js';\nimport type d3 from 'd3';\nimport type { Commit, GitGraphDBRenderProvider, DiagramOrientation } from './gitGraphTypes.js';\nimport { commitType } from './gitGraphTypes.js';\nimport type { GitGraphDiagramConfig } from '../../config.type.js';\n\ninterface BranchPosition {\n  pos: number;\n  index: number;\n}\n\ninterface CommitPosition {\n  x: number;\n  y: number;\n}\n\ninterface CommitPositionOffset extends CommitPosition {\n  posWithOffset: number;\n}\n\nconst LAYOUT_OFFSET = 10;\nconst COMMIT_STEP = 40;\nconst PX = 4;\nconst PY = 2;\n\nconst THEME_COLOR_LIMIT = 8;\n\n/**\n * Themes that use redux-style geometry \u2014 smaller commit bullets, sharper label edges.\n * Note: neo themes are intentionally excluded; they use standard geometry.\n */\nconst REDUX_GEOMETRY_THEMES = new Set(['redux', 'redux-dark', 'redux-color', 'redux-dark-color']);\n\n/** Vertical padding inside the LR branch label rect for redux themes (`drawBranches` `labelPaddingY`). */\nconst REDUX_BRANCH_LABEL_PADDING_Y = 12;\n\n/**\n * Themes that use per-branch color cycling with a non-default first color\n * (avoidDefaultColor logic in calcColorIndex).\n */\nconst COLOR_THEMES = new Set(['redux-color', 'redux-dark-color']);\n\n/** Themes rendered on a dark background. */\nconst DARK_THEMES = new Set(['dark', 'redux-dark', 'redux-dark-color', 'neo-dark']);\n\n/**\n * Map a raw branch index to a CSS color-class index.\n * When avoidMainColor is true (redux-color / redux-dark-color themes only),\n * non-main branches cycle through 1\u2026(limit-1) so color 0 is never reused.\n * For all other themes the plain modulo is used.\n */\nexport const calcColorIndex = (\n  rawIndex: number,\n  limit: number,\n  avoidDefaultColor = false\n): number => {\n  if (avoidDefaultColor && rawIndex > 0) {\n    return ((rawIndex - 1) % (limit - 1)) + 1;\n  }\n  return rawIndex % limit;\n};\nconst branchPos = new Map<string, BranchPosition>();\nconst commitPos = new Map<string, CommitPosition>();\nconst defaultPos = 30;\n\nlet allCommitsDict = new Map();\nlet lanes: number[] = [];\nlet maxPos = 0;\nlet dir: DiagramOrientation = 'LR';\n\nconst clear = () => {\n  branchPos.clear();\n  commitPos.clear();\n  allCommitsDict.clear();\n  maxPos = 0;\n  lanes = [];\n  dir = 'LR';\n};\n\nconst drawText = (txt: string | string[]) => {\n  const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n  const rows = typeof txt === 'string' ? txt.split(/\\\\n|\\n|<br\\s*\\/?>/gi) : txt;\n\n  rows.forEach((row) => {\n    const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n    tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n    tspan.setAttribute('dy', '1em');\n    tspan.setAttribute('x', '0');\n    tspan.setAttribute('class', 'row');\n    tspan.textContent = row.trim();\n    svgLabel.appendChild(tspan);\n  });\n\n  return svgLabel;\n};\n\nconst findClosestParent = (parents: string[]): string | undefined => {\n  let closestParent: string | undefined;\n  let comparisonFunc;\n  let targetPosition: number;\n  if (dir === 'BT') {\n    comparisonFunc = (a: number, b: number) => a <= b;\n    targetPosition = Infinity;\n  } else {\n    comparisonFunc = (a: number, b: number) => a >= b;\n    targetPosition = 0;\n  }\n\n  parents.forEach((parent) => {\n    const parentPosition =\n      dir === 'TB' || dir == 'BT' ? commitPos.get(parent)?.y : commitPos.get(parent)?.x;\n\n    if (parentPosition !== undefined && comparisonFunc(parentPosition, targetPosition)) {\n      closestParent = parent;\n      targetPosition = parentPosition;\n    }\n  });\n\n  return closestParent;\n};\n\nconst findClosestParentBT = (parents: string[]) => {\n  let closestParent = '';\n  let maxPosition = Infinity;\n\n  parents.forEach((parent) => {\n    const parentPosition = commitPos.get(parent)!.y;\n    if (parentPosition <= maxPosition) {\n      closestParent = parent;\n      maxPosition = parentPosition;\n    }\n  });\n  return closestParent || undefined;\n};\n\nconst setParallelBTPos = (\n  sortedKeys: string[],\n  commits: Map<string, Commit>,\n  defaultPos: number\n) => {\n  let curPos = defaultPos;\n  let maxPosition = defaultPos;\n  const roots: Commit[] = [];\n\n  sortedKeys.forEach((key) => {\n    const commit = commits.get(key);\n    if (!commit) {\n      throw new Error(`Commit not found for key ${key}`);\n    }\n\n    if (commit.parents.length) {\n      curPos = calculateCommitPosition(commit);\n      maxPosition = Math.max(curPos, maxPosition);\n    } else {\n      roots.push(commit);\n    }\n    setCommitPosition(commit, curPos);\n  });\n\n  curPos = maxPosition;\n  roots.forEach((commit) => {\n    setRootPosition(commit, curPos, defaultPos);\n  });\n  sortedKeys.forEach((key) => {\n    const commit = commits.get(key);\n\n    if (commit?.parents.length) {\n      const closestParent = findClosestParentBT(commit.parents)!;\n      curPos = commitPos.get(closestParent)!.y - COMMIT_STEP;\n      if (curPos <= maxPosition) {\n        maxPosition = curPos;\n      }\n      const x = branchPos.get(commit.branch)!.pos;\n      const y = curPos - LAYOUT_OFFSET;\n      commitPos.set(commit.id, { x: x, y: y });\n    }\n  });\n};\n\nconst findClosestParentPos = (commit: Commit): number => {\n  const closestParent = findClosestParent(commit.parents.filter((p) => p !== null));\n  if (!closestParent) {\n    throw new Error(`Closest parent not found for commit ${commit.id}`);\n  }\n\n  const closestParentPos = commitPos.get(closestParent)?.y;\n  if (closestParentPos === undefined) {\n    throw new Error(`Closest parent position not found for commit ${commit.id}`);\n  }\n  return closestParentPos;\n};\n\nconst calculateCommitPosition = (commit: Commit): number => {\n  const closestParentPos = findClosestParentPos(commit);\n  return closestParentPos + COMMIT_STEP;\n};\n\nconst setCommitPosition = (commit: Commit, curPos: number): CommitPosition => {\n  const branch = branchPos.get(commit.branch);\n\n  if (!branch) {\n    throw new Error(`Branch not found for commit ${commit.id}`);\n  }\n\n  const x = branch.pos;\n  const y = curPos + LAYOUT_OFFSET;\n  commitPos.set(commit.id, { x, y });\n  return { x, y };\n};\n\nconst setRootPosition = (commit: Commit, curPos: number, defaultPos: number) => {\n  const branch = branchPos.get(commit.branch);\n  if (!branch) {\n    throw new Error(`Branch not found for commit ${commit.id}`);\n  }\n\n  const y = curPos + defaultPos;\n  const x = branch.pos;\n  commitPos.set(commit.id, { x, y });\n};\n\nconst drawCommitBullet = (\n  gBullets: d3.Selection<SVGGElement, unknown, HTMLElement, any>,\n  commit: Commit,\n  commitPosition: CommitPositionOffset,\n  typeClass: string,\n  branchIndex: number,\n  commitSymbolType: number\n) => {\n  const { theme } = getConfig();\n  const useReduxGeometry = REDUX_GEOMETRY_THEMES.has(theme ?? '');\n  const useColorTheme = COLOR_THEMES.has(theme ?? '');\n  const isDark = DARK_THEMES.has(theme ?? '');\n  if (commitSymbolType === commitType.HIGHLIGHT) {\n    gBullets\n      .append('rect')\n      .attr('x', commitPosition.x - 10 + (useReduxGeometry ? 3 : 0))\n      .attr('y', commitPosition.y - 10 + (useReduxGeometry ? 3 : 0))\n      .attr('width', useReduxGeometry ? 14 : 20)\n      .attr('height', useReduxGeometry ? 14 : 20)\n      .attr(\n        'class',\n        `commit ${commit.id} commit-highlight${calcColorIndex(branchIndex, THEME_COLOR_LIMIT, useColorTheme)} ${typeClass}-outer`\n      );\n    gBullets\n      .append('rect')\n      .attr('x', commitPosition.x - 6 + (useReduxGeometry ? 2 : 0))\n      .attr('y', commitPosition.y - 6 + (useReduxGeometry ? 2 : 0))\n      .attr('width', useReduxGeometry ? 8 : 12)\n      .attr('height', useReduxGeometry ? 8 : 12)\n      .attr(\n        'class',\n        `commit ${commit.id} commit${calcColorIndex(branchIndex, THEME_COLOR_LIMIT, useColorTheme)} ${typeClass}-inner`\n      );\n  } else if (commitSymbolType === commitType.CHERRY_PICK) {\n    gBullets\n      .append('circle')\n      .attr('cx', commitPosition.x)\n      .attr('cy', commitPosition.y)\n      .attr('r', useReduxGeometry ? 7 : 10)\n      .attr('class', `commit ${commit.id} ${typeClass}`);\n    gBullets\n      .append('circle')\n      .attr('cx', commitPosition.x - 3)\n      .attr('cy', commitPosition.y + 2)\n      .attr('r', useReduxGeometry ? 2.5 : 2.75)\n      .attr('fill', isDark ? '#000000' : '#fff')\n      .attr('class', `commit ${commit.id} ${typeClass}`);\n    gBullets\n      .append('circle')\n      .attr('cx', commitPosition.x + 3)\n      .attr('cy', commitPosition.y + 2)\n      .attr('r', useReduxGeometry ? 2.5 : 2.75)\n      .attr('fill', isDark ? '#000000' : '#fff')\n      .attr('class', `commit ${commit.id} ${typeClass}`);\n    gBullets\n      .append('line')\n      .attr('x1', commitPosition.x + 3)\n      .attr('y1', commitPosition.y + 1)\n      .attr('x2', commitPosition.x)\n      .attr('y2', commitPosition.y - 5)\n      .attr('stroke', isDark ? '#000000' : '#fff')\n      .attr('class', `commit ${commit.id} ${typeClass}`);\n    gBullets\n      .append('line')\n      .attr('x1', commitPosition.x - 3)\n      .attr('y1', commitPosition.y + 1)\n      .attr('x2', commitPosition.x)\n      .attr('y2', commitPosition.y - 5)\n      .attr('stroke', isDark ? '#000000' : '#fff')\n      .attr('class', `commit ${commit.id} ${typeClass}`);\n  } else {\n    const circle = gBullets.append('circle');\n    circle.attr('cx', commitPosition.x);\n    circle.attr('cy', commitPosition.y);\n    circle.attr('r', useReduxGeometry ? 7 : 10);\n    circle.attr(\n      'class',\n      `commit ${commit.id} commit${calcColorIndex(branchIndex, THEME_COLOR_LIMIT, useColorTheme)}`\n    );\n    if (commitSymbolType === commitType.MERGE) {\n      const circle2 = gBullets.append('circle');\n      circle2.attr('cx', commitPosition.x);\n      circle2.attr('cy', commitPosition.y);\n      circle2.attr('r', useReduxGeometry ? 5 : 6);\n      circle2.attr(\n        'class',\n        `commit ${typeClass} ${commit.id} commit${calcColorIndex(branchIndex, THEME_COLOR_LIMIT, useColorTheme)}`\n      );\n    }\n    if (commitSymbolType === commitType.REVERSE) {\n      const cross = gBullets.append('path');\n      const constValue = useReduxGeometry ? 4 : 5;\n      cross\n        .attr(\n          'd',\n          `M ${commitPosition.x - constValue},${commitPosition.y - constValue}L${commitPosition.x + constValue},${commitPosition.y + constValue}M${commitPosition.x - constValue},${commitPosition.y + constValue}L${commitPosition.x + constValue},${commitPosition.y - constValue}`\n        )\n        .attr(\n          'class',\n          `commit ${typeClass} ${commit.id} commit${calcColorIndex(branchIndex, THEME_COLOR_LIMIT, useColorTheme)}`\n        );\n    }\n  }\n};\n\nconst drawCommitLabel = (\n  gLabels: d3.Selection<SVGGElement, unknown, HTMLElement, any>,\n  commit: Commit,\n  commitPosition: CommitPositionOffset,\n  pos: number,\n  gitGraphConfig: GitGraphDiagramConfig\n) => {\n  if (\n    commit.type !== commitType.CHERRY_PICK &&\n    ((commit.customId && commit.type === commitType.MERGE) || commit.type !== commitType.MERGE) &&\n    gitGraphConfig.showCommitLabel\n  ) {\n    const wrapper = gLabels.append('g');\n    const labelBkg = wrapper.insert('rect').attr('class', 'commit-label-bkg');\n    const text = wrapper\n      .append('text')\n      .attr('x', pos)\n      .attr('y', commitPosition.y + 25)\n      .attr('class', 'commit-label')\n      .text(commit.id);\n    const bbox = text.node()?.getBBox();\n\n    if (bbox) {\n      labelBkg\n        .attr('x', commitPosition.posWithOffset - bbox.width / 2 - PY)\n        .attr('y', commitPosition.y + 13.5)\n        .attr('width', bbox.width + 2 * PY)\n        .attr('height', bbox.height + 2 * PY);\n\n      if (dir === 'TB' || dir === 'BT') {\n        labelBkg\n          .attr('x', commitPosition.x - (bbox.width + 4 * PX + 5))\n          .attr('y', commitPosition.y - 12);\n        text\n          .attr('x', commitPosition.x - (bbox.width + 4 * PX))\n          .attr('y', commitPosition.y + bbox.height - 12);\n      } else {\n        text.attr('x', commitPosition.posWithOffset - bbox.width / 2);\n      }\n\n      if (gitGraphConfig.rotateCommitLabel) {\n        if (dir === 'TB' || dir === 'BT') {\n          text.attr(\n            'transform',\n            'rotate(' + -45 + ', ' + commitPosition.x + ', ' + commitPosition.y + ')'\n          );\n          labelBkg.attr(\n            'transform',\n            'rotate(' + -45 + ', ' + commitPosition.x + ', ' + commitPosition.y + ')'\n          );\n        } else {\n          const r_x = -7.5 - ((bbox.width + 10) / 25) * 9.5;\n          const r_y = 10 + (bbox.width / 25) * 8.5;\n          wrapper.attr(\n            'transform',\n            'translate(' +\n              r_x +\n              ', ' +\n              r_y +\n              ') rotate(' +\n              -45 +\n              ', ' +\n              pos +\n              ', ' +\n              commitPosition.y +\n              ')'\n          );\n        }\n      }\n    }\n  }\n};\n\nconst drawCommitTags = (\n  gLabels: d3.Selection<SVGGElement, unknown, HTMLElement, any>,\n  commit: Commit,\n  commitPosition: CommitPositionOffset,\n  pos: number\n) => {\n  if (commit.tags.length > 0) {\n    let yOffset = 0;\n    let maxTagBboxWidth = 0;\n    let maxTagBboxHeight = 0;\n    const tagElements = [];\n\n    for (const tagValue of commit.tags.reverse()) {\n      const rect = gLabels.insert('polygon');\n      const hole = gLabels.append('circle');\n      const tag = gLabels\n        .append('text')\n        .attr('y', commitPosition.y - 16 - yOffset)\n        .attr('class', 'tag-label')\n        .text(tagValue);\n      const tagBbox = tag.node()?.getBBox();\n      if (!tagBbox) {\n        throw new Error('Tag bbox not found');\n      }\n\n      maxTagBboxWidth = Math.max(maxTagBboxWidth, tagBbox.width);\n      maxTagBboxHeight = Math.max(maxTagBboxHeight, tagBbox.height);\n\n      tag.attr('x', commitPosition.posWithOffset - tagBbox.width / 2);\n\n      tagElements.push({\n        tag,\n        hole,\n        rect,\n        yOffset,\n      });\n\n      yOffset += 20;\n    }\n\n    for (const { tag, hole, rect, yOffset } of tagElements) {\n      const h2 = maxTagBboxHeight / 2;\n      const ly = commitPosition.y - 19.2 - yOffset;\n      rect.attr('class', 'tag-label-bkg').attr(\n        'points',\n        `\n      ${pos - maxTagBboxWidth / 2 - PX / 2},${ly + PY}  \n      ${pos - maxTagBboxWidth / 2 - PX / 2},${ly - PY}\n      ${commitPosition.posWithOffset - maxTagBboxWidth / 2 - PX},${ly - h2 - PY}\n      ${commitPosition.posWithOffset + maxTagBboxWidth / 2 + PX},${ly - h2 - PY}\n      ${commitPosition.posWithOffset + maxTagBboxWidth / 2 + PX},${ly + h2 + PY}\n      ${commitPosition.posWithOffset - maxTagBboxWidth / 2 - PX},${ly + h2 + PY}`\n      );\n\n      hole\n        .attr('cy', ly)\n        .attr('cx', pos - maxTagBboxWidth / 2 + PX / 2)\n        .attr('r', 1.5)\n        .attr('class', 'tag-hole');\n\n      if (dir === 'TB' || dir === 'BT') {\n        const yOrigin = pos + yOffset;\n\n        rect\n          .attr('class', 'tag-label-bkg')\n          .attr(\n            'points',\n            `\n        ${commitPosition.x},${yOrigin + 2}\n        ${commitPosition.x},${yOrigin - 2}\n        ${commitPosition.x + LAYOUT_OFFSET},${yOrigin - h2 - 2}\n        ${commitPosition.x + LAYOUT_OFFSET + maxTagBboxWidth + 4},${yOrigin - h2 - 2}\n        ${commitPosition.x + LAYOUT_OFFSET + maxTagBboxWidth + 4},${yOrigin + h2 + 2}\n        ${commitPosition.x + LAYOUT_OFFSET},${yOrigin + h2 + 2}`\n          )\n          .attr('transform', 'translate(12,12) rotate(45, ' + commitPosition.x + ',' + pos + ')');\n        hole\n          .attr('cx', commitPosition.x + PX / 2)\n          .attr('cy', yOrigin)\n          .attr('transform', 'translate(12,12) rotate(45, ' + commitPosition.x + ',' + pos + ')');\n        tag\n          .attr('x', commitPosition.x + 5)\n          .attr('y', yOrigin + 3)\n          .attr('transform', 'translate(14,14) rotate(45, ' + commitPosition.x + ',' + pos + ')');\n      }\n    }\n  }\n};\n\nconst getCommitClassType = (commit: Commit): string => {\n  const commitSymbolType = commit.customType ?? commit.type;\n  switch (commitSymbolType) {\n    case commitType.NORMAL:\n      return 'commit-normal';\n    case commitType.REVERSE:\n      return 'commit-reverse';\n    case commitType.HIGHLIGHT:\n      return 'commit-highlight';\n    case commitType.MERGE:\n      return 'commit-merge';\n    case commitType.CHERRY_PICK:\n      return 'commit-cherry-pick';\n    default:\n      return 'commit-normal';\n  }\n};\n\nconst calculatePosition = (\n  commit: Commit,\n  dir: string,\n  pos: number,\n  commitPos: Map<string, CommitPosition>\n): number => {\n  const defaultCommitPosition = { x: 0, y: 0 }; // Default position if commit is not found\n\n  if (commit.parents.length > 0) {\n    const closestParent = findClosestParent(commit.parents);\n    if (closestParent) {\n      const parentPosition = commitPos.get(closestParent) ?? defaultCommitPosition;\n\n      if (dir === 'TB') {\n        return parentPosition.y + COMMIT_STEP;\n      } else if (dir === 'BT') {\n        const currentPosition = commitPos.get(commit.id) ?? defaultCommitPosition;\n        return currentPosition.y - COMMIT_STEP;\n      } else {\n        return parentPosition.x + COMMIT_STEP;\n      }\n    }\n  } else {\n    if (dir === 'TB') {\n      return defaultPos;\n    } else if (dir === 'BT') {\n      const currentPosition = commitPos.get(commit.id) ?? defaultCommitPosition;\n      return currentPosition.y - COMMIT_STEP;\n    } else {\n      return 0;\n    }\n  }\n  return 0;\n};\n\nconst getCommitPosition = (\n  commit: Commit,\n  pos: number,\n  isParallelCommits: boolean\n): CommitPositionOffset => {\n  const posWithOffset = dir === 'BT' && isParallelCommits ? pos : pos + LAYOUT_OFFSET;\n  const branchY = branchPos.get(commit.branch)?.pos;\n  const x = dir === 'TB' || dir === 'BT' ? branchPos.get(commit.branch)?.pos : posWithOffset;\n  if (x === undefined || branchY === undefined) {\n    throw new Error(`Position were undefined for commit ${commit.id}`);\n  }\n  const useReduxGeometry = REDUX_GEOMETRY_THEMES.has(getConfig().theme ?? '');\n  const y =\n    dir === 'TB' || dir === 'BT'\n      ? posWithOffset\n      : branchY + (useReduxGeometry ? REDUX_BRANCH_LABEL_PADDING_Y / 2 + 1 : -2);\n  return { x, y, posWithOffset };\n};\n\nconst drawCommits = (\n  svg: d3.Selection<d3.BaseType, unknown, HTMLElement, any>,\n  commits: Map<string, Commit>,\n  modifyGraph: boolean,\n  gitGraphConfig: GitGraphDiagramConfig\n) => {\n  const gBullets = svg.append('g').attr('class', 'commit-bullets');\n  const gLabels = svg.append('g').attr('class', 'commit-labels');\n  let pos = dir === 'TB' || dir === 'BT' ? defaultPos : 0;\n  const keys = [...commits.keys()];\n  const isParallelCommits = gitGraphConfig.parallelCommits ?? false;\n\n  const sortKeys = (a: string, b: string) => {\n    const seqA = commits.get(a)?.seq;\n    const seqB = commits.get(b)?.seq;\n    return seqA !== undefined && seqB !== undefined ? seqA - seqB : 0;\n  };\n\n  let sortedKeys = keys.sort(sortKeys);\n  if (dir === 'BT') {\n    if (isParallelCommits) {\n      setParallelBTPos(sortedKeys, commits, pos);\n    }\n    sortedKeys = sortedKeys.reverse();\n  }\n\n  sortedKeys.forEach((key) => {\n    const commit = commits.get(key);\n    if (!commit) {\n      throw new Error(`Commit not found for key ${key}`);\n    }\n    if (isParallelCommits) {\n      pos = calculatePosition(commit, dir, pos, commitPos);\n    }\n\n    const commitPosition = getCommitPosition(commit, pos, isParallelCommits);\n    // Don't draw the commits now but calculate the positioning which is used by the branch lines etc.\n    if (modifyGraph) {\n      const typeClass = getCommitClassType(commit);\n      const commitSymbolType = commit.customType ?? commit.type;\n      const branchIndex = branchPos.get(commit.branch)?.index ?? 0;\n      drawCommitBullet(gBullets, commit, commitPosition, typeClass, branchIndex, commitSymbolType);\n      drawCommitLabel(gLabels, commit, commitPosition, pos, gitGraphConfig);\n      drawCommitTags(gLabels, commit, commitPosition, pos);\n    }\n    if (dir === 'TB' || dir === 'BT') {\n      commitPos.set(commit.id, { x: commitPosition.x, y: commitPosition.posWithOffset });\n    } else {\n      commitPos.set(commit.id, { x: commitPosition.posWithOffset, y: commitPosition.y });\n    }\n    pos = dir === 'BT' && isParallelCommits ? pos + COMMIT_STEP : pos + COMMIT_STEP + LAYOUT_OFFSET;\n    if (pos > maxPos) {\n      maxPos = pos;\n    }\n  });\n};\n\nconst shouldRerouteArrow = (\n  commitA: Commit,\n  commitB: Commit,\n  p1: CommitPosition,\n  p2: CommitPosition,\n  allCommits: Map<string, Commit>\n) => {\n  const commitBIsFurthest = dir === 'TB' || dir === 'BT' ? p1.x < p2.x : p1.y < p2.y;\n  const branchToGetCurve = commitBIsFurthest ? commitB.branch : commitA.branch;\n  const isOnBranchToGetCurve = (x: Commit) => x.branch === branchToGetCurve;\n  const isBetweenCommits = (x: Commit) => x.seq > commitA.seq && x.seq < commitB.seq;\n  return [...allCommits.values()].some((commitX) => {\n    return isBetweenCommits(commitX) && isOnBranchToGetCurve(commitX);\n  });\n};\n\nconst findLane = (y1: number, y2: number, depth = 0): number => {\n  const candidate = y1 + Math.abs(y1 - y2) / 2;\n  if (depth > 5) {\n    return candidate;\n  }\n\n  const ok = lanes.every((lane) => Math.abs(lane - candidate) >= 10);\n  if (ok) {\n    lanes.push(candidate);\n    return candidate;\n  }\n  const diff = Math.abs(y1 - y2);\n  return findLane(y1, y2 - diff / 5, depth + 1);\n};\n\nconst drawArrow = (\n  svg: d3.Selection<SVGGElement, unknown, HTMLElement, any>,\n  commitA: Commit,\n  commitB: Commit,\n  allCommits: Map<string, Commit>\n) => {\n  const { theme: arrowTheme } = getConfig();\n  const useColorTheme = COLOR_THEMES.has(arrowTheme ?? '');\n  const p1 = commitPos.get(commitA.id); // arrowStart\n  const p2 = commitPos.get(commitB.id); // arrowEnd\n  if (p1 === undefined || p2 === undefined) {\n    throw new Error(`Commit positions not found for commits ${commitA.id} and ${commitB.id}`);\n  }\n  const arrowNeedsRerouting = shouldRerouteArrow(commitA, commitB, p1, p2, allCommits);\n  // log.debug('drawArrow', p1, p2, arrowNeedsRerouting, commitA.id, commitB.id);\n\n  // Lower-right quadrant logic; top-left is 0,0\n\n  let arc = '';\n  let arc2 = '';\n  let radius = 0;\n  let offset = 0;\n\n  let colorClassNum = branchPos.get(commitB.branch)?.index;\n  if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n    colorClassNum = branchPos.get(commitA.branch)?.index;\n  }\n\n  let lineDef;\n  if (arrowNeedsRerouting) {\n    arc = 'A 10 10, 0, 0, 0,';\n    arc2 = 'A 10 10, 0, 0, 1,';\n    radius = 10;\n    offset = 10;\n\n    const lineY = p1.y < p2.y ? findLane(p1.y, p2.y) : findLane(p2.y, p1.y);\n\n    const lineX = p1.x < p2.x ? findLane(p1.x, p2.x) : findLane(p2.x, p1.x);\n\n    if (dir === 'TB') {\n      if (p1.x < p2.x) {\n        // Source commit is on branch position left of destination commit\n        // so render arrow rightward with colour of destination branch\n\n        lineDef = `M ${p1.x} ${p1.y} L ${lineX - radius} ${p1.y} ${arc2} ${lineX} ${\n          p1.y + offset\n        } L ${lineX} ${p2.y - radius} ${arc} ${lineX + offset} ${p2.y} L ${p2.x} ${p2.y}`;\n      } else {\n        // Source commit is on branch position right of destination commit\n        // so render arrow leftward with colour of source branch\n\n        colorClassNum = branchPos.get(commitA.branch)?.index;\n\n        lineDef = `M ${p1.x} ${p1.y} L ${lineX + radius} ${p1.y} ${arc} ${lineX} ${p1.y + offset} L ${lineX} ${p2.y - radius} ${arc2} ${lineX - offset} ${p2.y} L ${p2.x} ${p2.y}`;\n      }\n    } else if (dir === 'BT') {\n      if (p1.x < p2.x) {\n        // Source commit is on branch position left of destination commit\n        // so render arrow rightward with colour of destination branch\n\n        lineDef = `M ${p1.x} ${p1.y} L ${lineX - radius} ${p1.y} ${arc} ${lineX} ${p1.y - offset} L ${lineX} ${p2.y + radius} ${arc2} ${lineX + offset} ${p2.y} L ${p2.x} ${p2.y}`;\n      } else {\n        // Source commit is on branch position right of destination commit\n        // so render arrow leftward with colour of source branch\n\n        colorClassNum = branchPos.get(commitA.branch)?.index;\n\n        lineDef = `M ${p1.x} ${p1.y} L ${lineX + radius} ${p1.y} ${arc2} ${lineX} ${p1.y - offset} L ${lineX} ${p2.y + radius} ${arc} ${lineX - offset} ${p2.y} L ${p2.x} ${p2.y}`;\n      }\n    } else {\n      if (p1.y < p2.y) {\n        // Source commit is on branch positioned above destination commit\n        // so render arrow downward with colour of destination branch\n\n        lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${lineY - radius} ${arc} ${\n          p1.x + offset\n        } ${lineY} L ${p2.x - radius} ${lineY} ${arc2} ${p2.x} ${lineY + offset} L ${p2.x} ${p2.y}`;\n      } else {\n        // Source commit is on branch positioned below destination commit\n        // so render arrow upward with colour of source branch\n\n        colorClassNum = branchPos.get(commitA.branch)?.index;\n\n        lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${lineY + radius} ${arc2} ${\n          p1.x + offset\n        } ${lineY} L ${p2.x - radius} ${lineY} ${arc} ${p2.x} ${lineY - offset} L ${p2.x} ${p2.y}`;\n      }\n    }\n  } else {\n    arc = 'A 20 20, 0, 0, 0,';\n    arc2 = 'A 20 20, 0, 0, 1,';\n    radius = 20;\n    offset = 20;\n\n    if (dir === 'TB') {\n      if (p1.x < p2.x) {\n        if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n          lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - radius} ${arc} ${p1.x + offset} ${\n            p2.y\n          } L ${p2.x} ${p2.y}`;\n        } else {\n          lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc2} ${p2.x} ${\n            p1.y + offset\n          } L ${p2.x} ${p2.y}`;\n        }\n      }\n\n      if (p1.x > p2.x) {\n        arc = 'A 20 20, 0, 0, 0,';\n        arc2 = 'A 20 20, 0, 0, 1,';\n        radius = 20;\n        offset = 20;\n        if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n          lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - radius} ${arc2} ${p1.x - offset} ${\n            p2.y\n          } L ${p2.x} ${p2.y}`;\n        } else {\n          lineDef = `M ${p1.x} ${p1.y} L ${p2.x + radius} ${p1.y} ${arc} ${p2.x} ${\n            p1.y + offset\n          } L ${p2.x} ${p2.y}`;\n        }\n      }\n      if (p1.x === p2.x) {\n        lineDef = `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`;\n      }\n    } else if (dir === 'BT') {\n      if (p1.x < p2.x) {\n        if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n          lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + radius} ${arc2} ${p1.x + offset} ${\n            p2.y\n          } L ${p2.x} ${p2.y}`;\n        } else {\n          lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc} ${p2.x} ${\n            p1.y - offset\n          } L ${p2.x} ${p2.y}`;\n        }\n      }\n      if (p1.x > p2.x) {\n        arc = 'A 20 20, 0, 0, 0,';\n        arc2 = 'A 20 20, 0, 0, 1,';\n        radius = 20;\n        offset = 20;\n\n        if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n          lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + radius} ${arc} ${p1.x - offset} ${\n            p2.y\n          } L ${p2.x} ${p2.y}`;\n        } else {\n          lineDef = `M ${p1.x} ${p1.y} L ${p2.x + radius} ${p1.y} ${arc2} ${p2.x} ${\n            p1.y - offset\n          } L ${p2.x} ${p2.y}`;\n        }\n      }\n\n      if (p1.x === p2.x) {\n        lineDef = `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`;\n      }\n    } else {\n      if (p1.y < p2.y) {\n        if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n          lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc2} ${p2.x} ${\n            p1.y + offset\n          } L ${p2.x} ${p2.y}`;\n        } else {\n          lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - radius} ${arc} ${p1.x + offset} ${\n            p2.y\n          } L ${p2.x} ${p2.y}`;\n        }\n      }\n      if (p1.y > p2.y) {\n        if (commitB.type === commitType.MERGE && commitA.id !== commitB.parents[0]) {\n          lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc} ${p2.x} ${\n            p1.y - offset\n          } L ${p2.x} ${p2.y}`;\n        } else {\n          lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + radius} ${arc2} ${p1.x + offset} ${\n            p2.y\n          } L ${p2.x} ${p2.y}`;\n        }\n      }\n\n      if (p1.y === p2.y) {\n        lineDef = `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`;\n      }\n    }\n  }\n  if (lineDef === undefined) {\n    throw new Error('Line definition not found');\n  }\n  svg\n    .append('path')\n    .attr('d', lineDef)\n    .attr(\n      'class',\n      'arrow arrow' + calcColorIndex(colorClassNum!, THEME_COLOR_LIMIT, useColorTheme)\n    );\n};\n\nconst drawArrows = (\n  svg: d3.Selection<d3.BaseType, unknown, HTMLElement, any>,\n  commits: Map<string, Commit>\n) => {\n  const gArrows = svg.append('g').attr('class', 'commit-arrows');\n  [...commits.keys()].forEach((key) => {\n    const commit = commits.get(key);\n\n    if (commit!.parents && commit!.parents.length > 0) {\n      commit!.parents.forEach((parent) => {\n        drawArrow(gArrows, commits.get(parent)!, commit!, commits);\n      });\n    }\n  });\n};\n\nconst drawBranches = (\n  svg: d3.Selection<d3.BaseType, unknown, HTMLElement, any>,\n  branches: { name: string }[],\n  gitGraphConfig: GitGraphDiagramConfig,\n  id: string\n) => {\n  const { look, theme, themeVariables } = getConfig();\n  const { dropShadow, THEME_COLOR_LIMIT: themeColorLimit } = themeVariables;\n  const useReduxGeometry = REDUX_GEOMETRY_THEMES.has(theme ?? '');\n  const useColorTheme = COLOR_THEMES.has(theme ?? '');\n  const g = svg.append('g');\n  branches.forEach((branch, index) => {\n    const adjustIndexForTheme = calcColorIndex(\n      index,\n      useReduxGeometry ? themeColorLimit : THEME_COLOR_LIMIT,\n      useColorTheme\n    );\n\n    const pos = branchPos.get(branch.name)?.pos;\n    if (pos === undefined) {\n      throw new Error(`Position not found for branch ${branch.name}`);\n    }\n    // LR spine Y: bkg rect center, dotted line, and commits all sit here.\n    // TB/BT use pos directly (their line attrs are overridden below).\n    const spineY =\n      dir === 'TB' || dir === 'BT'\n        ? pos\n        : useReduxGeometry\n          ? pos + REDUX_BRANCH_LABEL_PADDING_Y / 2 + 1\n          : pos - 2;\n    const line = g.append('line');\n    line.attr('x1', 0);\n    line.attr('y1', spineY);\n    line.attr('x2', maxPos);\n    line.attr('y2', spineY);\n    line.attr('class', 'branch branch' + adjustIndexForTheme);\n\n    if (dir === 'TB') {\n      line.attr('y1', defaultPos);\n      line.attr('x1', pos);\n      line.attr('y2', maxPos);\n      line.attr('x2', pos);\n    } else if (dir === 'BT') {\n      line.attr('y1', maxPos);\n      line.attr('x1', pos);\n      line.attr('y2', defaultPos);\n      line.attr('x2', pos);\n    }\n    lanes.push(spineY);\n\n    const name = branch.name;\n\n    // Create the actual text element\n    const labelElement = drawText(name);\n    // Create outer g, edgeLabel, this will be positioned after graph layout\n    const bkg = g.insert('rect');\n    const branchLabel = g.insert('g').attr('class', 'branchLabel');\n\n    // Create inner g, label, this will be positioned now for centering the text\n    const label = branchLabel.insert('g').attr('class', 'label branch-label' + adjustIndexForTheme);\n\n    label.node()!.appendChild(labelElement);\n    const bbox = labelElement.getBBox();\n    const borderRadius = useReduxGeometry ? 0 : 4;\n    const labelPaddingX = useReduxGeometry ? 16 : 0;\n    const labelPaddingY = useReduxGeometry ? REDUX_BRANCH_LABEL_PADDING_Y : 0;\n    if (look === 'neo') {\n      bkg.attr('data-look', `neo`);\n    }\n\n    bkg\n      .attr('class', 'branchLabelBkg label' + adjustIndexForTheme)\n      .attr(\n        'style',\n        look === 'neo' ? `filter:${useReduxGeometry ? `url(#${id}-drop-shadow)` : dropShadow}` : ''\n      )\n      .attr('rx', borderRadius)\n      .attr('ry', borderRadius)\n      .attr('x', -bbox.width - 4 - (gitGraphConfig.rotateCommitLabel === true ? 30 : 0))\n      .attr('y', -bbox.height / 2 + 10)\n      .attr('width', bbox.width + 18 + labelPaddingX)\n      .attr('height', bbox.height + 4 + labelPaddingY);\n    label.attr(\n      'transform',\n      'translate(' +\n        (-bbox.width -\n          14 -\n          (gitGraphConfig.rotateCommitLabel === true ? 30 : 0) +\n          labelPaddingX / 2) +\n        ', ' +\n        (spineY - bbox.height / 2 - 2) +\n        ')'\n    );\n    if (dir === 'TB') {\n      bkg.attr('x', pos - bbox.width / 2 - 10).attr('y', 0);\n      label.attr('transform', 'translate(' + (pos - bbox.width / 2 - 5) + ', ' + 0 + ')');\n      if (useReduxGeometry) {\n        bkg.attr('transform', `translate(${-labelPaddingX / 2 - 3}, ${-labelPaddingY - 10})`);\n        label.attr(\n          'transform',\n          'translate(' + (pos - bbox.width / 2 - 5) + ', ' + (-labelPaddingY * 2 + 7) + ')'\n        );\n      }\n    } else if (dir === 'BT') {\n      bkg.attr('x', pos - bbox.width / 2 - 10).attr('y', maxPos);\n      label.attr('transform', 'translate(' + (pos - bbox.width / 2 - 5) + ', ' + maxPos + ')');\n      if (useReduxGeometry) {\n        bkg.attr('transform', `translate(${-labelPaddingX / 2 - 3}, ${labelPaddingY + 10})`);\n        label.attr(\n          'transform',\n          'translate(' + (pos - bbox.width / 2 - 5) + ', ' + (maxPos + labelPaddingY * 2 + 4) + ')'\n        );\n      }\n    } else {\n      bkg.attr('transform', 'translate(-19, ' + (spineY - 12 - labelPaddingY / 2) + ')');\n    }\n  });\n};\n\nconst setBranchPosition = function (\n  name: string,\n  pos: number,\n  index: number,\n  bbox: DOMRect,\n  rotateCommitLabel: boolean\n): number {\n  branchPos.set(name, { pos, index });\n  pos += 50 + (rotateCommitLabel ? 40 : 0) + (dir === 'TB' || dir === 'BT' ? bbox.width / 2 : 0);\n  return pos;\n};\n\nexport const draw: DrawDefinition = function (txt, id, ver, diagObj) {\n  clear();\n\n  log.debug('in gitgraph renderer', txt + '\\n', 'id:', id, ver);\n  const db = diagObj.db as GitGraphDBRenderProvider;\n  if (!db.getConfig) {\n    log.error('getConfig method is not available on db');\n    return;\n  }\n  const gitGraphConfig = db.getConfig();\n  const rotateCommitLabel = gitGraphConfig.rotateCommitLabel ?? false;\n  allCommitsDict = db.getCommits();\n  const branches = db.getBranchesAsObjArray();\n  dir = db.getDirection();\n  const diagram = select(`[id=\"${id}\"]`);\n\n  // Add linearGradient for neo look \u2014 render.ts does this for layout-based diagrams,\n  // but gitGraph uses its own draw function so we must define it here.\n  const { look, theme, themeVariables } = getConfig();\n  const { useGradient, gradientStart, gradientStop, filterColor } = themeVariables;\n  if (useGradient) {\n    const gradient = diagram\n      .append('defs')\n      .append('linearGradient')\n      .attr('id', id + '-gradient')\n      .attr('gradientUnits', 'objectBoundingBox')\n      .attr('x1', '0%')\n      .attr('y1', '0%')\n      .attr('x2', '100%')\n      .attr('y2', '0%');\n    gradient\n      .append('stop')\n      .attr('offset', '0%')\n      .attr('stop-color', gradientStart)\n      .attr('stop-opacity', 1);\n    gradient\n      .append('stop')\n      .attr('offset', '100%')\n      .attr('stop-color', gradientStop)\n      .attr('stop-opacity', 1);\n  }\n\n  // Add drop-shadow SVG filter for neo+redux look. Defined once on the root <svg>\n  // with a diagram-unique ID to avoid collisions when multiple diagrams share the page.\n  if (look === 'neo' && REDUX_GEOMETRY_THEMES.has(theme ?? '')) {\n    diagram\n      .append('defs')\n      .append('filter')\n      .attr('id', id + '-drop-shadow')\n      .attr('height', '130%')\n      .attr('width', '130%')\n      .append('feDropShadow')\n      .attr('dx', '4')\n      .attr('dy', '4')\n      .attr('stdDeviation', 0)\n      .attr('flood-opacity', '0.06')\n      .attr('flood-color', filterColor);\n  }\n\n  let pos = 0;\n\n  branches.forEach((branch, index) => {\n    const labelElement = drawText(branch.name);\n    const g = diagram.append('g');\n    const branchLabel = g.insert('g').attr('class', 'branchLabel');\n    const label = branchLabel.insert('g').attr('class', 'label branch-label');\n    label.node()?.appendChild(labelElement);\n    const bbox = labelElement.getBBox();\n\n    pos = setBranchPosition(branch.name, pos, index, bbox, rotateCommitLabel);\n    label.remove();\n    branchLabel.remove();\n    g.remove();\n  });\n\n  drawCommits(diagram, allCommitsDict, false, gitGraphConfig);\n  if (gitGraphConfig.showBranches) {\n    drawBranches(diagram, branches, gitGraphConfig, id);\n  }\n  drawArrows(diagram, allCommitsDict);\n  drawCommits(diagram, allCommitsDict, true, gitGraphConfig);\n\n  utils.insertTitle(\n    diagram,\n    'gitTitleText',\n    gitGraphConfig.titleTopMargin ?? 0,\n    db.getDiagramTitle()\n  );\n\n  // Setup the view box and size of the svg element\n  setupGraphViewbox(undefined, diagram, gitGraphConfig.diagramPadding, gitGraphConfig.useMaxWidth);\n};\n\nexport default {\n  draw,\n};\n\nif (import.meta.vitest) {\n  const { it, expect, describe } = import.meta.vitest;\n\n  describe('drawText', () => {\n    it('should drawText', () => {\n      const svgLabel = drawText('main');\n      expect(svgLabel).toBeDefined();\n      expect(svgLabel.children[0].innerHTML).toBe('main');\n    });\n  });\n\n  describe('branchPosition', () => {\n    const bbox: DOMRect = {\n      x: 0,\n      y: 0,\n      width: 10,\n      height: 10,\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      toJSON: () => '',\n    };\n\n    it('should setBranchPositions LR with two branches', () => {\n      dir = 'LR';\n\n      const pos = setBranchPosition('main', 0, 0, bbox, true);\n      expect(pos).toBe(90);\n      expect(branchPos.get('main')).toEqual({ pos: 0, index: 0 });\n      const posNext = setBranchPosition('develop', pos, 1, bbox, true);\n      expect(posNext).toBe(180);\n      expect(branchPos.get('develop')).toEqual({ pos: pos, index: 1 });\n    });\n\n    it('should setBranchPositions TB with two branches', () => {\n      dir = 'TB';\n      bbox.width = 34.9921875;\n\n      const pos = setBranchPosition('main', 0, 0, bbox, true);\n      expect(pos).toBe(107.49609375);\n      expect(branchPos.get('main')).toEqual({ pos: 0, index: 0 });\n\n      bbox.width = 56.421875;\n      const posNext = setBranchPosition('develop', pos, 1, bbox, true);\n      expect(posNext).toBe(225.70703125);\n      expect(branchPos.get('develop')).toEqual({ pos: pos, index: 1 });\n    });\n  });\n\n  describe('commitPosition', () => {\n    const commits = new Map<string, Commit>([\n      [\n        'commitZero',\n        {\n          id: 'ZERO',\n          message: '',\n          seq: 0,\n          type: commitType.NORMAL,\n          tags: [],\n          parents: [],\n          branch: 'main',\n        },\n      ],\n      [\n        'commitA',\n        {\n          id: 'A',\n          message: '',\n          seq: 1,\n          type: commitType.NORMAL,\n          tags: [],\n          parents: ['ZERO'],\n          branch: 'feature',\n        },\n      ],\n      [\n        'commitB',\n        {\n          id: 'B',\n          message: '',\n          seq: 2,\n          type: commitType.NORMAL,\n          tags: [],\n          parents: ['A'],\n          branch: 'feature',\n        },\n      ],\n      [\n        'commitM',\n        {\n          id: 'M',\n          message: 'merged branch feature into main',\n          seq: 3,\n          type: commitType.MERGE,\n          tags: [],\n          parents: ['ZERO', 'B'],\n          branch: 'main',\n          customId: true,\n        },\n      ],\n      [\n        'commitC',\n        {\n          id: 'C',\n          message: '',\n          seq: 4,\n          type: commitType.NORMAL,\n          tags: [],\n          parents: ['ZERO'],\n          branch: 'release',\n        },\n      ],\n      [\n        'commit5_8928ea0',\n        {\n          id: '5-8928ea0',\n          message: 'cherry-picked [object Object] into release',\n          seq: 5,\n          type: commitType.CHERRY_PICK,\n          tags: [],\n          parents: ['C', 'M'],\n          branch: 'release',\n        },\n      ],\n      [\n        'commitD',\n        {\n          id: 'D',\n          message: '',\n          seq: 6,\n          type: commitType.NORMAL,\n          tags: [],\n          parents: ['5-8928ea0'],\n          branch: 'release',\n        },\n      ],\n      [\n        'commit7_ed848ba',\n        {\n          id: '7-ed848ba',\n          message: 'cherry-picked [object Object] into release',\n          seq: 7,\n          type: commitType.CHERRY_PICK,\n          tags: [],\n          parents: ['D', 'M'],\n          branch: 'release',\n        },\n      ],\n    ]);\n    let pos = 0;\n    branchPos.set('main', { pos: 0, index: 0 });\n    branchPos.set('feature', { pos: 107.49609375, index: 1 });\n    branchPos.set('release', { pos: 224.03515625, index: 2 });\n\n    describe('TB', () => {\n      pos = 30;\n      dir = 'TB';\n      const expectedCommitPositionTB = new Map<string, CommitPositionOffset>([\n        ['commitZero', { x: 0, y: 40, posWithOffset: 40 }],\n        ['commitA', { x: 107.49609375, y: 90, posWithOffset: 90 }],\n        ['commitB', { x: 107.49609375, y: 140, posWithOffset: 140 }],\n        ['commitM', { x: 0, y: 190, posWithOffset: 190 }],\n        ['commitC', { x: 224.03515625, y: 240, posWithOffset: 240 }],\n        ['commit5_8928ea0', { x: 224.03515625, y: 290, posWithOffset: 290 }],\n        ['commitD', { x: 224.03515625, y: 340, posWithOffset: 340 }],\n        ['commit7_ed848ba', { x: 224.03515625, y: 390, posWithOffset: 390 }],\n      ]);\n      commits.forEach((commit, key) => {\n        it(`should give the correct position for commit ${key}`, () => {\n          const position = getCommitPosition(commit, pos, false);\n          expect(position).toEqual(expectedCommitPositionTB.get(key));\n          pos += 50;\n        });\n      });\n    });\n    describe('LR', () => {\n      let pos = 30;\n      dir = 'LR';\n      const expectedCommitPositionLR = new Map<string, CommitPositionOffset>([\n        ['commitZero', { x: 0, y: 40, posWithOffset: 40 }],\n        ['commitA', { x: 107.49609375, y: 90, posWithOffset: 90 }],\n        ['commitB', { x: 107.49609375, y: 140, posWithOffset: 140 }],\n        ['commitM', { x: 0, y: 190, posWithOffset: 190 }],\n        ['commitC', { x: 224.03515625, y: 240, posWithOffset: 240 }],\n        ['commit5_8928ea0', { x: 224.03515625, y: 290, posWithOffset: 290 }],\n        ['commitD', { x: 224.03515625, y: 340, posWithOffset: 340 }],\n        ['commit7_ed848ba', { x: 224.03515625, y: 390, posWithOffset: 390 }],\n      ]);\n      commits.forEach((commit, key) => {\n        it(`should give the correct position for commit ${key}`, () => {\n          const position = getCommitPosition(commit, pos, false);\n          expect(position).toEqual(expectedCommitPositionLR.get(key));\n          pos += 50;\n        });\n      });\n    });\n    describe('getCommitClassType', () => {\n      const expectedCommitClassType = new Map<string, string>([\n        ['commitZero', 'commit-normal'],\n        ['commitA', 'commit-normal'],\n        ['commitB', 'commit-normal'],\n        ['commitM', 'commit-merge'],\n        ['commitC', 'commit-normal'],\n        ['commit5_8928ea0', 'commit-cherry-pick'],\n        ['commitD', 'commit-normal'],\n        ['commit7_ed848ba', 'commit-cherry-pick'],\n      ]);\n      commits.forEach((commit, key) => {\n        it(`should give the correct class type for commit ${key}`, () => {\n          const classType = getCommitClassType(commit);\n          expect(classType).toBe(expectedCommitClassType.get(key));\n        });\n      });\n    });\n  });\n  describe('building BT parallel commit diagram', () => {\n    const commits = new Map<string, Commit>([\n      [\n        '1-abcdefg',\n        {\n          id: '1-abcdefg',\n          message: '',\n          seq: 0,\n          type: 0,\n          tags: [],\n          parents: [],\n          branch: 'main',\n        },\n      ],\n      [\n        '2-abcdefg',\n        {\n          id: '2-abcdefg',\n          message: '',\n          seq: 1,\n          type: 0,\n          tags: [],\n          parents: ['1-abcdefg'],\n          branch: 'main',\n        },\n      ],\n      [\n        '3-abcdefg',\n        {\n          id: '3-abcdefg',\n          message: '',\n          seq: 2,\n          type: 0,\n          tags: [],\n          parents: ['2-abcdefg'],\n          branch: 'develop',\n        },\n      ],\n      [\n        '4-abcdefg',\n        {\n          id: '4-abcdefg',\n          message: '',\n          seq: 3,\n          type: 0,\n          tags: [],\n          parents: ['3-abcdefg'],\n          branch: 'develop',\n        },\n      ],\n      [\n        '5-abcdefg',\n        {\n          id: '5-abcdefg',\n          message: '',\n          seq: 4,\n          type: 0,\n          tags: [],\n          parents: ['2-abcdefg'],\n          branch: 'feature',\n        },\n      ],\n      [\n        '6-abcdefg',\n        {\n          id: '6-abcdefg',\n          message: '',\n          seq: 5,\n          type: 0,\n          tags: [],\n          parents: ['5-abcdefg'],\n          branch: 'feature',\n        },\n      ],\n      [\n        '7-abcdefg',\n        {\n          id: '7-abcdefg',\n          message: '',\n          seq: 6,\n          type: 0,\n          tags: [],\n          parents: ['2-abcdefg'],\n          branch: 'main',\n        },\n      ],\n      [\n        '8-abcdefg',\n        {\n          id: '8-abcdefg',\n          message: '',\n          seq: 7,\n          type: 0,\n          tags: [],\n          parents: ['7-abcdefg'],\n          branch: 'main',\n        },\n      ],\n    ]);\n    const expectedCommitPosition = new Map<string, CommitPosition>([\n      ['1-abcdefg', { x: 0, y: 40 }],\n      ['2-abcdefg', { x: 0, y: 90 }],\n      ['3-abcdefg', { x: 107.49609375, y: 140 }],\n      ['4-abcdefg', { x: 107.49609375, y: 190 }],\n      ['5-abcdefg', { x: 225.70703125, y: 140 }],\n      ['6-abcdefg', { x: 225.70703125, y: 190 }],\n      ['7-abcdefg', { x: 0, y: 140 }],\n      ['8-abcdefg', { x: 0, y: 190 }],\n    ]);\n\n    const expectedCommitPositionAfterParallel = new Map<string, CommitPosition>([\n      ['1-abcdefg', { x: 0, y: 210 }],\n      ['2-abcdefg', { x: 0, y: 160 }],\n      ['3-abcdefg', { x: 107.49609375, y: 110 }],\n      ['4-abcdefg', { x: 107.49609375, y: 60 }],\n      ['5-abcdefg', { x: 225.70703125, y: 110 }],\n      ['6-abcdefg', { x: 225.70703125, y: 60 }],\n      ['7-abcdefg', { x: 0, y: 110 }],\n      ['8-abcdefg', { x: 0, y: 60 }],\n    ]);\n\n    const expectedCommitCurrentPosition = new Map<string, number>([\n      ['1-abcdefg', 30],\n      ['2-abcdefg', 80],\n      ['3-abcdefg', 130],\n      ['4-abcdefg', 180],\n      ['5-abcdefg', 130],\n      ['6-abcdefg', 180],\n      ['7-abcdefg', 130],\n      ['8-abcdefg', 180],\n    ]);\n    const sortedKeys = [...expectedCommitPosition.keys()];\n    it('should get the correct commit position and current position', () => {\n      dir = 'BT';\n      let curPos = 30;\n      commitPos.clear();\n      branchPos.clear();\n      branchPos.set('main', { pos: 0, index: 0 });\n      branchPos.set('develop', { pos: 107.49609375, index: 1 });\n      branchPos.set('feature', { pos: 225.70703125, index: 2 });\n      commits.forEach((commit, key) => {\n        if (commit.parents.length > 0) {\n          curPos = calculateCommitPosition(commit);\n        }\n        const position = setCommitPosition(commit, curPos);\n        expect(position).toEqual(expectedCommitPosition.get(key));\n        expect(curPos).toEqual(expectedCommitCurrentPosition.get(key));\n      });\n    });\n\n    it('should get the correct commit position after parallel commits', () => {\n      commitPos.clear();\n      branchPos.clear();\n      dir = 'BT';\n      const curPos = 30;\n      commitPos.clear();\n      branchPos.clear();\n      branchPos.set('main', { pos: 0, index: 0 });\n      branchPos.set('develop', { pos: 107.49609375, index: 1 });\n      branchPos.set('feature', { pos: 225.70703125, index: 2 });\n      setParallelBTPos(sortedKeys, commits, curPos);\n      sortedKeys.forEach((commit) => {\n        const position = commitPos.get(commit);\n        expect(position).toEqual(expectedCommitPositionAfterParallel.get(commit));\n      });\n    });\n  });\n  it('add', () => {\n    commitPos.set('parent1', { x: 1, y: 1 });\n    commitPos.set('parent2', { x: 2, y: 2 });\n    commitPos.set('parent3', { x: 3, y: 3 });\n    dir = 'LR';\n    const parents = ['parent1', 'parent2', 'parent3'];\n    const closestParent = findClosestParent(parents);\n\n    expect(closestParent).toBe('parent3');\n    commitPos.clear();\n  });\n}\n", "import * as configApi from '../../config.js';\nconst GIT_NAMED_COLOR_COUNT = 8;\n\nconst REDUX_GEOMETRY_THEMES = new Set(['redux', 'redux-dark', 'redux-color', 'redux-dark-color']);\nconst COLOR_THEMES = new Set(['redux-color', 'redux-dark-color']);\nconst NEO_THEMES = new Set(['neo', 'neo-dark']);\nconst DARK_THEMES = new Set(['dark', 'redux-dark', 'redux-dark-color', 'neo-dark']);\nconst NEO_COLOR_GEN_THEMES = new Set([\n  'redux',\n  'redux-dark',\n  'redux-color',\n  'redux-dark-color',\n  'neo',\n  'neo-dark',\n]);\n\nconst genGitGraphGradient = (options) => {\n  const { svgId } = options;\n  let sections = '';\n  if (options.useGradient && svgId) {\n    for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) {\n      sections += `\n      .label${i}  { fill: ${options.mainBkg}; stroke: url(${svgId}-gradient); stroke-width: ${options.strokeWidth};}\n             `;\n    }\n  }\n  return sections;\n};\n\nconst genColor = (options) => {\n  const config = configApi.getConfig();\n  const { theme, themeVariables } = config;\n  const { borderColorArray } = themeVariables;\n  const useReduxGeometry = REDUX_GEOMETRY_THEMES.has(theme);\n  if (NEO_THEMES.has(theme)) {\n    let sections = '';\n\n    for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) {\n      if (i === 0) {\n        sections += `\n        .branch-label${i} { fill: ${options.nodeBorder};}\n        .commit${i} { stroke: ${options.nodeBorder};   }\n        .commit-highlight${i} { stroke: ${options.nodeBorder}; fill: ${options.nodeBorder}; }\n        .arrow${i} { stroke: ${options.nodeBorder}; }\n        .commit-bullets { fill: ${options.nodeBorder}; }\n        .commit-cherry-pick${i} { stroke: ${options.nodeBorder}; }\n        ${genGitGraphGradient(options)}`;\n      } else {\n        // Wrap index to stay within the range of defined git color variables (git0..git7).\n        const ci = i % GIT_NAMED_COLOR_COUNT;\n        sections += `\n        .branch-label${i} { fill: ${options['gitBranchLabel' + ci]}; }\n        .commit${i} { stroke: ${options['git' + ci]}; fill: ${options['git' + ci]}; }\n        .commit-highlight${i} { stroke: ${options['gitInv' + ci]}; fill: ${options['gitInv' + ci]}; }\n        .arrow${i} { stroke: ${options['git' + ci]}; }\n        `;\n      }\n    }\n    return sections;\n  } else if (!COLOR_THEMES.has(theme)) {\n    let sections = '';\n\n    for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) {\n      sections += `\n        .branch-label${i} { fill: ${options.nodeBorder}; ${useReduxGeometry ? `font-weight:${options.noteFontWeight}` : ''} }\n        .commit${i} { stroke: ${options.nodeBorder};   }\n        .commit-highlight${i} { stroke: ${options.nodeBorder}; fill: ${options.nodeBorder}; }\n        .label${i}  { fill: ${options.mainBkg}; stroke: ${options.nodeBorder}; stroke-width: ${options.strokeWidth}; ${useReduxGeometry ? `font-weight:${options.noteFontWeight}` : ''}}\n        .arrow${i} { stroke: ${options.nodeBorder}; }\n        .commit-bullets { fill: ${options.nodeBorder}; }\n        .commit-cherry-pick${i} { stroke: ${options.nodeBorder}; }\n        `;\n    }\n    return sections;\n  } else {\n    let sections = '';\n\n    for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) {\n      if (i === 0) {\n        sections += `\n        .branch-label${i} { fill: ${options.nodeBorder}; ${useReduxGeometry ? `font-weight:${options.noteFontWeight}` : ''} }\n        .commit${i} { stroke: ${options.nodeBorder}; }\n        .commit-highlight${i} { stroke: ${options.nodeBorder}; fill: ${options.mainBkg}; }\n        .label${i}  { fill: ${options.mainBkg}; stroke: ${options.nodeBorder}; stroke-width: ${options.strokeWidth}; ${useReduxGeometry ? `font-weight:${options.noteFontWeight}` : ''} }\n        .arrow${i} { stroke: ${options.nodeBorder}; }\n        .commit-bullets { fill: ${options.nodeBorder}; }\n        `;\n      } else {\n        const colorIndex = i % borderColorArray.length;\n        sections += `\n        .branch-label${i} { fill: ${options.nodeBorder}; ${useReduxGeometry ? `font-weight:${options.noteFontWeight}` : ''} }\n        .commit${i} { stroke: ${borderColorArray[colorIndex]}; fill: ${borderColorArray[colorIndex]}; }\n        .commit-highlight${i} { stroke: ${borderColorArray[colorIndex]}; fill: ${borderColorArray[colorIndex]}; }\n        .label${i}  { fill: ${DARK_THEMES.has(theme) ? options.mainBkg : borderColorArray[colorIndex]}; stroke: ${borderColorArray[colorIndex]};  stroke-width: ${options.strokeWidth}; }\n        .arrow${i} { stroke: ${borderColorArray[colorIndex]}; }\n        `;\n      }\n    }\n    return sections;\n  }\n};\n\nconst normalTheme = (options) => {\n  return `${Array.from({ length: options.THEME_COLOR_LIMIT }, (_, i) => i)\n    .map((i) => {\n      // Wrap index to stay within the range of defined git color variables (git0..git7).\n      const ci = i % GIT_NAMED_COLOR_COUNT;\n      return `\n        .branch-label${i} { fill: ${options['gitBranchLabel' + ci]}; }\n        .commit${i} { stroke: ${options['git' + ci]}; fill: ${options['git' + ci]}; }\n        .commit-highlight${i} { stroke: ${options['gitInv' + ci]}; fill: ${options['gitInv' + ci]}; }\n        .label${i}  { fill: ${options['git' + ci]}; }\n        .arrow${i} { stroke: ${options['git' + ci]}; }\n        `;\n    })\n    .join('\\n')}`;\n};\nconst getStyles = (options) => {\n  const config = configApi.getConfig();\n  const { theme } = config;\n  const useNeoColorGen = NEO_COLOR_GEN_THEMES.has(theme);\n\n  return `\n  .commit-id,\n  .commit-msg,\n  .branch-label {\n    fill: lightgrey;\n    color: lightgrey;\n    font-family: 'trebuchet ms', verdana, arial, sans-serif;\n    font-family: var(--mermaid-font-family);\n  }\n  \n  ${useNeoColorGen ? genColor(options) : normalTheme(options)}\n\n  .branch {\n    stroke-width: ${options.strokeWidth};\n    stroke: ${options.commitLineColor ?? options.lineColor};\n    stroke-dasharray:  ${useNeoColorGen ? '4 2' : '2'};\n  }\n  .commit-label { font-size: ${options.commitLabelFontSize}; fill: ${useNeoColorGen ? options.nodeBorder : options.commitLabelColor}; ${useNeoColorGen ? `font-weight:${options.noteFontWeight};` : ''}}\n  .commit-label-bkg { font-size: ${options.commitLabelFontSize}; fill: ${useNeoColorGen ? 'transparent' : options.commitLabelBackground}; opacity: ${useNeoColorGen ? '' : 0.5};  }\n  .tag-label { font-size: ${options.tagLabelFontSize}; fill: ${options.tagLabelColor};}\n  .tag-label-bkg { fill: ${useNeoColorGen ? options.mainBkg : options.tagLabelBackground}; stroke: ${useNeoColorGen ? options.nodeBorder : options.tagLabelBorder}; ${useNeoColorGen ? `filter:${options.dropShadow}` : ''}  }\n  .tag-hole { fill: ${options.textColor}; }\n\n  .commit-merge {\n    stroke: ${useNeoColorGen ? options.mainBkg : options.primaryColor};\n    fill: ${useNeoColorGen ? options.mainBkg : options.primaryColor};\n  }\n  .commit-reverse {\n    stroke: ${useNeoColorGen ? options.mainBkg : options.primaryColor};\n    fill: ${useNeoColorGen ? options.mainBkg : options.primaryColor};\n    stroke-width: ${useNeoColorGen ? options.strokeWidth : 3};\n  }\n  .commit-highlight-outer {\n  }\n  .commit-highlight-inner {\n    stroke: ${useNeoColorGen ? options.mainBkg : options.primaryColor};\n    fill: ${useNeoColorGen ? options.mainBkg : options.primaryColor};\n  }\n\n  .arrow {\n    /* Intentional: neo themes keep the bold 8px arrow (like classic themes); only redux-geometry themes use the thinner options.strokeWidth. */\n    stroke-width: ${REDUX_GEOMETRY_THEMES.has(theme) ? options.strokeWidth : 8};\n    stroke-linecap: round;\n    fill: none\n  }\n  .gitTitleText {\n    text-anchor: middle;\n    font-size: 18px;\n    fill: ${options.textColor};\n  }\n`;\n};\n\nexport default getStyles;\n", "// @ts-ignore: JISON doesn't support types\nimport { parser } from './gitGraphParser.js';\nimport { db } from './gitGraphAst.js';\nimport gitGraphRenderer from './gitGraphRenderer.js';\nimport gitGraphStyles from './styles.js';\nimport type { DiagramDefinition } from '../../diagram-api/types.js';\n\nexport const diagram: DiagramDefinition = {\n  parser,\n  db,\n  renderer: gitGraphRenderer,\n  styles: gitGraphStyles,\n};\n"],
  "mappings": "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",
  "names": ["commitType", "DEFAULT_GITGRAPH_CONFIG", "defaultConfig_default", "getConfig", "__name", "cleanAndMerge", "state", "ImperativeState", "config", "mainBranchName", "mainBranchOrder", "getID", "random", "uniqBy", "list", "fn", "recordMap", "out", "item", "key", "setDirection", "dir", "setOptions", "rawOptString", "log", "e", "getOptions", "commit", "commitDB", "msg", "id", "type", "tags", "common_default", "tag", "newCommit", "commitType", "branch", "branchDB", "name", "order", "checkout", "merge", "mergeDB", "otherBranch", "customId", "overrideType", "customTags", "currentBranchCheck", "otherBranchCheck", "currentCommit", "otherCommit", "error", "verifiedBranch", "cherryPick", "cherryPickDB", "sourceId", "targetId", "parentCommitId", "sourceCommit", "sourceCommitBranch", "currentCommitId", "upsert", "arr", "newVal", "index", "prettyPrintCommitHistory", "commitArr", "line", "c", "label", "prettyPrint", "node", "getCommitsArray", "clear", "getBranchesAsObjArray", "branchConfig", "i", "a", "b", "getBranches", "getCommits", "o", "getCurrentBranch", "getDirection", "getHead", "db", "setAccTitle", "getAccTitle", "getAccDescription", "setAccDescription", "setDiagramTitle", "getDiagramTitle", "populate", "__name", "ast", "db", "populateCommonDb", "statement", "parseStatement", "parser", "stmt", "parseCommit", "parseBranch", "parseMerge", "parseCheckout", "parseCherryPicking", "log", "commit", "commitType", "branch", "merge", "checkout", "cherryPicking", "input", "parse", "LAYOUT_OFFSET", "COMMIT_STEP", "PX", "PY", "THEME_COLOR_LIMIT", "REDUX_GEOMETRY_THEMES", "REDUX_BRANCH_LABEL_PADDING_Y", "COLOR_THEMES", "DARK_THEMES", "calcColorIndex", "__name", "rawIndex", "limit", "avoidDefaultColor", "branchPos", "commitPos", "defaultPos", "allCommitsDict", "lanes", "maxPos", "dir", "clear", "drawText", "txt", "svgLabel", "row", "tspan", "findClosestParent", "parents", "closestParent", "comparisonFunc", "targetPosition", "a", "b", "parent", "parentPosition", "findClosestParentBT", "maxPosition", "setParallelBTPos", "sortedKeys", "commits", "curPos", "roots", "key", "commit", "calculateCommitPosition", "setCommitPosition", "setRootPosition", "x", "y", "findClosestParentPos", "p", "closestParentPos", "branch", "drawCommitBullet", "gBullets", "commitPosition", "typeClass", "branchIndex", "commitSymbolType", "theme", "getConfig", "useReduxGeometry", "useColorTheme", "isDark", "commitType", "circle", "circle2", "cross", "constValue", "drawCommitLabel", "gLabels", "pos", "gitGraphConfig", "wrapper", "labelBkg", "text", "bbox", "r_x", "r_y", "drawCommitTags", "yOffset", "maxTagBboxWidth", "maxTagBboxHeight", "tagElements", "tagValue", "rect", "hole", "tag", "tagBbox", "h2", "ly", "yOrigin", "getCommitClassType", "calculatePosition", "defaultCommitPosition", "getCommitPosition", "isParallelCommits", "posWithOffset", "branchY", "drawCommits", "svg", "modifyGraph", "keys", "sortKeys", "seqA", "seqB", "shouldRerouteArrow", "commitA", "commitB", "p1", "p2", "allCommits", "branchToGetCurve", "isOnBranchToGetCurve", "isBetweenCommits", "commitX", "findLane", "y1", "y2", "depth", "candidate", "lane", "diff", "drawArrow", "arrowTheme", "arrowNeedsRerouting", "arc", "arc2", "radius", "offset", "colorClassNum", "lineDef", "lineY", "lineX", "drawArrows", "gArrows", "drawBranches", "branches", "id", "look", "themeVariables", "dropShadow", "themeColorLimit", "index", "adjustIndexForTheme", "spineY", "line", "name", "labelElement", "bkg", "label", "borderRadius", "labelPaddingX", "labelPaddingY", "setBranchPosition", "rotateCommitLabel", "draw", "ver", "diagObj", "log", "db", "diagram", "select_default", "useGradient", "gradientStart", "gradientStop", "filterColor", "gradient", "g", "branchLabel", "utils_default", "setupGraphViewbox", "gitGraphRenderer_default", "GIT_NAMED_COLOR_COUNT", "REDUX_GEOMETRY_THEMES", "COLOR_THEMES", "NEO_THEMES", "DARK_THEMES", "NEO_COLOR_GEN_THEMES", "genGitGraphGradient", "__name", "options", "svgId", "sections", "i", "genColor", "config", "getConfig", "theme", "themeVariables", "borderColorArray", "useReduxGeometry", "ci", "colorIndex", "normalTheme", "_", "getStyles", "useNeoColorGen", "styles_default", "diagram", "parser", "db", "gitGraphRenderer_default", "styles_default"]
}
