Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ body:
id: gpdf-version
attributes:
label: gpdf Version
placeholder: "v1.0.0"
placeholder: "v1.0.2"
validations:
required: true

Expand Down
17 changes: 15 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/).

## [Unreleased]

## [1.0.2] - 2026-03-23

### Added
- PDF document merging — combine pages from multiple PDFs into one (#11)
- `pdf.MergePDFs()`: Core merge engine with object reference remapping
- `gpdf.Merge()`: High-level facade with `Source`, `PageRange`, `WithMergeMetadata()`
- `pdf.Writer.AddRawPage()`, `PageTreeRef()`: Raw page insertion support
- Merge examples: basic merge, page range extraction, metadata, merge + overlay, issue #11 scenario

## [1.0.0] - 2026-03-20

### Added
- Existing PDF overlay — open, read, and modify existing PDFs
- `pdf.Reader`: PDF parser with XRef table/stream parsing, page tree traversal, object caching
Expand Down Expand Up @@ -91,8 +102,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
- Reed-Solomon coefficient order in QR code encoder
- binary.Write return value handling for errcheck lint

[Unreleased]: https://github.com/gpdf-dev/gpdf/compare/v1.0.0...HEAD
[0.9.0]: https://github.com/gpdf-dev/gpdf/compare/v0.8.0...v1.0.0
[Unreleased]: https://github.com/gpdf-dev/gpdf/compare/v1.0.2...HEAD
[1.0.2]: https://github.com/gpdf-dev/gpdf/compare/v1.0.0...v1.0.2
[1.0.0]: https://github.com/gpdf-dev/gpdf/compare/v0.9.0...v1.0.0
[0.9.0]: https://github.com/gpdf-dev/gpdf/compare/v0.8.0...v0.9.0
[0.8.0]: https://github.com/gpdf-dev/gpdf/compare/v0.5.0...v0.8.0
[0.7.0]: https://github.com/gpdf-dev/gpdf/releases/tag/v0.7.0
[0.6.0]: https://github.com/gpdf-dev/gpdf/releases/tag/v0.6.0
Expand Down
21 changes: 20 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[![Go Reference](https://pkg.go.dev/badge/github.com/gpdf-dev/gpdf.svg)](https://pkg.go.dev/github.com/gpdf-dev/gpdf)
[![CI](https://github.com/gpdf-dev/gpdf/actions/workflows/check-code.yml/badge.svg)](https://github.com/gpdf-dev/gpdf/actions/workflows/check-code.yml)
![coverage](https://img.shields.io/badge/coverage-86.8%25-green)
![coverage](https://img.shields.io/badge/coverage-86.5%25-green)
[![Go Report Card](https://goreportcard.com/badge/github.com/gpdf-dev/gpdf)](https://goreportcard.com/report/github.com/gpdf-dev/gpdf)
[![Go Version](https://img.shields.io/badge/Go-%3E%3D1.22-blue)](https://go.dev/)
[![Website](https://img.shields.io/badge/Website-gpdf.dev-blue)](https://gpdf.dev/)
Expand Down Expand Up @@ -33,6 +33,7 @@ A pure Go, zero-dependency PDF generation library with a layered architecture an
- **Images** — JPEG and PNG embedding with fit options
- **Absolute positioning** — place elements at exact XY coordinates on the page
- **Existing PDF overlay** — open existing PDFs and add text, images, stamps on top
- **PDF merging** — combine multiple PDFs into one with page range selection
- **Document metadata** — title, author, subject, creator
- **Encryption** — AES-256 encryption (ISO 32000-2, Rev 6) with owner/user passwords and permissions
- **PDF/A** — PDF/A-1b and PDF/A-2b conformance with ICC profiles and XMP metadata
Expand Down Expand Up @@ -498,6 +499,22 @@ doc.EachPage(func(i int, p *template.PageBuilder) {
result, _ := doc.Save()
```

### PDF Merging

Combine multiple PDFs into a single document with optional page range selection:

```go
// Merge multiple PDFs
merged, _ := gpdf.Merge(
[]gpdf.Source{
{Data: coverPage},
{Data: report},
{Data: appendix, Pages: gpdf.PageRange{From: 1, To: 3}}, // only first 3 pages
},
gpdf.WithMergeMetadata("My Document", "Author", ""),
)
```

### JSON Schema

Define documents entirely in JSON:
Expand Down Expand Up @@ -780,6 +797,8 @@ doc.Render(f)
| `doc.Overlay(page, fn)` | Add content on top of a specific page |
| `doc.EachPage(fn)` | Apply overlay to every page |
| `doc.Save()` | Save the modified PDF |
| `gpdf.Merge(sources, opts...)` | Merge multiple PDFs into one |
| `WithMergeMetadata(title, author, producer)` | Set metadata on merged output |

### Text Options

Expand Down
19 changes: 19 additions & 0 deletions README_es.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ Biblioteca de generación de PDF en Go puro, sin dependencias externas, con arqu
- **Imágenes** — incrustación de JPEG y PNG con opciones de ajuste
- **Posicionamiento absoluto** — colocar elementos en coordenadas XY exactas en la página
- **Superposición de PDF existente** — abrir PDFs existentes y agregar texto, imágenes, sellos encima
- **Fusión de PDF** — combinar múltiples PDFs en uno con selección de rango de páginas
- **Metadatos del documento** — título, autor, asunto, creador
- **Encriptación** — encriptación AES-256 (ISO 32000-2, Rev 6) con contraseñas de propietario/usuario y permisos
- **PDF/A** — conformidad PDF/A-1b y PDF/A-2b con perfiles ICC y metadatos XMP
Expand Down Expand Up @@ -415,6 +416,22 @@ doc.EachPage(func(i int, p *template.PageBuilder) {
result, _ := doc.Save()
```

### Fusión de PDF

Combine múltiples PDFs en un solo documento con selección opcional de rango de páginas:

```go
// Fusionar múltiples PDFs
merged, _ := gpdf.Merge(
[]gpdf.Source{
{Data: coverPage},
{Data: report},
{Data: appendix, Pages: gpdf.PageRange{From: 1, To: 3}}, // solo las primeras 3 páginas
},
gpdf.WithMergeMetadata("My Document", "Author", ""),
)
```

### Metadatos del documento

```go
Expand Down Expand Up @@ -519,6 +536,8 @@ doc.Render(f)
| `doc.Overlay(page, fn)` | Superponer contenido en una página específica |
| `doc.EachPage(fn)` | Aplicar superposición a todas las páginas |
| `doc.Save()` | Guardar el PDF modificado |
| `gpdf.Merge(sources, opts...)` | Fusionar múltiples PDFs en uno |
| `WithMergeMetadata(title, author, producer)` | Establecer metadatos en la salida fusionada |

### Opciones de texto

Expand Down
19 changes: 19 additions & 0 deletions README_ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
- **画像** — JPEGとPNGの埋め込み(フィットオプション対応)
- **絶対位置指定** — ページ上の任意のXY座標に要素を配置
- **既存PDFオーバーレイ** — 既存PDFを開いてテキスト、画像、スタンプを上に追加
- **PDFマージ** — 複数のPDFをページ範囲指定付きで1つに結合
- **ドキュメントメタデータ** — タイトル、著者、件名、作成者
- **暗号化** — AES-256暗号化(ISO 32000-2, Rev 6)、オーナー/ユーザーパスワードと権限制御
- **PDF/A** — PDF/A-1bおよびPDF/A-2b準拠、ICCプロファイルとXMPメタデータ対応
Expand Down Expand Up @@ -424,6 +425,22 @@ doc.EachPage(func(i int, p *template.PageBuilder) {
result, _ := doc.Save()
```

### PDFマージ

複数のPDFをページ範囲指定付きで1つのドキュメントに結合:

```go
// 複数のPDFを結合
merged, _ := gpdf.Merge(
[]gpdf.Source{
{Data: coverPage},
{Data: report},
{Data: appendix, Pages: gpdf.PageRange{From: 1, To: 3}}, // 最初の3ページのみ
},
gpdf.WithMergeMetadata("My Document", "Author", ""),
)
```

### JSONスキーマ

JSONのみでドキュメントを定義:
Expand Down Expand Up @@ -638,6 +655,8 @@ doc.Render(f)
| `doc.Overlay(page, fn)` | 特定ページにコンテンツを重ねて配置 |
| `doc.EachPage(fn)` | 全ページにオーバーレイを適用 |
| `doc.Save()` | 変更したPDFを保存 |
| `gpdf.Merge(sources, opts...)` | 複数のPDFを1つに結合 |
| `WithMergeMetadata(title, author, producer)` | 結合後のメタデータを設定 |

### テキストオプション

Expand Down
19 changes: 19 additions & 0 deletions README_ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
- **이미지** — JPEG 및 PNG 임베딩 (맞춤 옵션 지원)
- **절대 위치 지정** — 페이지의 정확한 XY 좌표에 요소 배치
- **기존 PDF 오버레이** — 기존 PDF를 열어 텍스트, 이미지, 스탬프를 위에 추가
- **PDF 병합** — 여러 PDF를 페이지 범위 선택으로 하나로 결합
- **문서 메타데이터** — 제목, 저자, 주제, 작성자
- **암호화** — AES-256 암호화 (ISO 32000-2, Rev 6), 소유자/사용자 비밀번호 및 권한 제어
- **PDF/A** — PDF/A-1b 및 PDF/A-2b 준수, ICC 프로파일 및 XMP 메타데이터 포함
Expand Down Expand Up @@ -415,6 +416,22 @@ doc.EachPage(func(i int, p *template.PageBuilder) {
result, _ := doc.Save()
```

### PDF 병합

여러 PDF를 페이지 범위 선택으로 하나의 문서로 결합:

```go
// 여러 PDF 합치기
merged, _ := gpdf.Merge(
[]gpdf.Source{
{Data: coverPage},
{Data: report},
{Data: appendix, Pages: gpdf.PageRange{From: 1, To: 3}}, // 처음 3페이지만
},
gpdf.WithMergeMetadata("My Document", "Author", ""),
)
```

### 문서 메타데이터

```go
Expand Down Expand Up @@ -519,6 +536,8 @@ doc.Render(f)
| `doc.Overlay(page, fn)` | 특정 페이지에 콘텐츠 오버레이 |
| `doc.EachPage(fn)` | 모든 페이지에 오버레이 적용 |
| `doc.Save()` | 수정된 PDF 저장 |
| `gpdf.Merge(sources, opts...)` | 여러 PDF를 하나로 병합 |
| `WithMergeMetadata(title, author, producer)` | 병합된 출력의 메타데이터 설정 |

### 텍스트 옵션

Expand Down
19 changes: 19 additions & 0 deletions README_pt.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ Biblioteca de geração de PDF em Go puro, sem dependências externas, com arqui
- **Imagens** — incorporação de JPEG e PNG com opções de ajuste
- **Posicionamento absoluto** — posicionar elementos em coordenadas XY exatas na página
- **Sobreposição de PDF existente** — abrir PDFs existentes e adicionar texto, imagens, carimbos por cima
- **Fusão de PDF** — combinar múltiplos PDFs em um com seleção de intervalo de páginas
- **Metadados do documento** — título, autor, assunto, criador
- **Criptografia** — criptografia AES-256 (ISO 32000-2, Rev 6) com senhas de proprietário/usuário e permissões
- **PDF/A** — conformidade PDF/A-1b e PDF/A-2b com perfis ICC e metadados XMP
Expand Down Expand Up @@ -466,6 +467,22 @@ doc.EachPage(func(i int, p *template.PageBuilder) {
result, _ := doc.Save()
```

### Fusão de PDF

Combine múltiplos PDFs em um único documento com seleção opcional de intervalo de páginas:

```go
// Fundir múltiplos PDFs
merged, _ := gpdf.Merge(
[]gpdf.Source{
{Data: coverPage},
{Data: report},
{Data: appendix, Pages: gpdf.PageRange{From: 1, To: 3}}, // apenas as primeiras 3 páginas
},
gpdf.WithMergeMetadata("My Document", "Author", ""),
)
```

## Referência API

### Opções do documento
Expand Down Expand Up @@ -519,6 +536,8 @@ result, _ := doc.Save()
| `doc.Overlay(page, fn)` | Sobrepor conteúdo em uma página específica |
| `doc.EachPage(fn)` | Aplicar sobreposição em todas as páginas |
| `doc.Save()` | Salvar o PDF modificado |
| `gpdf.Merge(sources, opts...)` | Fundir múltiplos PDFs em um |
| `WithMergeMetadata(title, author, producer)` | Definir metadados na saída fundida |

### Opções de texto

Expand Down
19 changes: 19 additions & 0 deletions README_zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
- **图片** — JPEG 和 PNG 嵌入(支持缩放选项)
- **绝对定位** — 在页面上以精确 XY 坐标放置元素
- **现有 PDF 叠加** — 打开现有 PDF 并在上面添加文字、图片、印章
- **PDF 合并** — 将多个 PDF 合并为一个,支持页面范围选择
- **文档元数据** — 标题、作者、主题、创建者
- **加密** — AES-256 加密(ISO 32000-2, Rev 6),支持所有者/用户密码和权限控制
- **PDF/A** — PDF/A-1b 和 PDF/A-2b 合规,包含 ICC 配置文件和 XMP 元数据
Expand Down Expand Up @@ -415,6 +416,22 @@ doc.EachPage(func(i int, p *template.PageBuilder) {
result, _ := doc.Save()
```

### PDF 合并

将多个 PDF 合并为一个文档,支持页面范围选择:

```go
// 合并多个 PDF
merged, _ := gpdf.Merge(
[]gpdf.Source{
{Data: coverPage},
{Data: report},
{Data: appendix, Pages: gpdf.PageRange{From: 1, To: 3}}, // 仅前 3 页
},
gpdf.WithMergeMetadata("My Document", "Author", ""),
)
```

### 文档元数据

```go
Expand Down Expand Up @@ -519,6 +536,8 @@ doc.Render(f)
| `doc.Overlay(page, fn)` | 在指定页上叠加内容 |
| `doc.EachPage(fn)` | 对每页应用叠加 |
| `doc.Save()` | 保存修改后的 PDF |
| `gpdf.Merge(sources, opts...)` | 将多个 PDF 合并为一个 |
| `WithMergeMetadata(title, author, producer)` | 设置合并后的元数据 |

### 文本选项

Expand Down
12 changes: 6 additions & 6 deletions _benchmark/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,24 @@ go 1.24
replace github.com/gpdf-dev/gpdf => ../

require (
github.com/go-pdf/fpdf v1.0.0
github.com/go-pdf/fpdf v1.0.2
github.com/johnfercher/maroto/v2 v2.3.3
github.com/gpdf-dev/gpdf v1.0.1
github.com/gpdf-dev/gpdf v1.0.2
github.com/signintech/gopdf v0.36.0
golang.org/x/image v0.18.0
)

require (
github.com/boombuler/barcode v1.0.1 // indirect
github.com/boombuler/barcode v1.0.2 // indirect
github.com/f-amaral/go-async v0.3.0 // indirect
github.com/google/uuid v1.5.0 // indirect
github.com/hhrutter/lzw v1.0.0 // indirect
github.com/hhrutter/tiff v1.0.1 // indirect
github.com/hhrutter/lzw v1.0.2 // indirect
github.com/hhrutter/tiff v1.0.2 // indirect
github.com/johnfercher/go-tree v1.0.5 // indirect
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/pdfcpu/pdfcpu v0.6.0 // indirect
github.com/phpdave11/gofpdf v1.4.3 // indirect
github.com/phpdave11/gofpdi v1.0.15 // indirect
github.com/phpdave11/gofpdi v1.0.25 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
golang.org/x/text v0.22.0 // indirect
Expand Down
30 changes: 15 additions & 15 deletions _benchmark/go.sum
Original file line number Diff line number Diff line change
@@ -1,38 +1,38 @@
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs=
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.0.2/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.0.2 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs=
github.com/boombuler/barcode v1.0.2/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/f-amaral/go-async v0.3.0 h1:h4kLsX7aKfdWaHvV0lf+/EE3OIeCzyeDYJDb/vDZUyg=
github.com/f-amaral/go-async v0.3.0/go.mod h1:Hz5Qr6DAWpbTTUjytnrg1WIsDgS7NtOei5y8SipYS7U=
github.com/go-pdf/fpdf v1.0.0 h1:PPvSaUuo1iMi9KkaAn90NuKi+P4gwMedWPHhj8YlJQw=
github.com/go-pdf/fpdf v1.0.0/go.mod h1:oO8N111TkmKb9D7VvWGLvLJlaZUQVPM+6V42pp3iV4Y=
github.com/go-pdf/fpdf v1.0.2 h1:PPvSaUuo1iMi9KkaAn90NuKi+P4gwMedWPHhj8YlJQw=
github.com/go-pdf/fpdf v1.0.2/go.mod h1:oO8N111TkmKb9D7VvWGLvLJlaZUQVPM+6V42pp3iV4Y=
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hhrutter/lzw v1.0.0 h1:laL89Llp86W3rRs83LvKbwYRx6INE8gDn0XNb1oXtm0=
github.com/hhrutter/lzw v1.0.0/go.mod h1:2HC6DJSn/n6iAZfgM3Pg+cP1KxeWc3ezG8bBqW5+WEo=
github.com/hhrutter/tiff v1.0.1 h1:MIus8caHU5U6823gx7C6jrfoEvfSTGtEFRiM8/LOzC0=
github.com/hhrutter/tiff v1.0.1/go.mod h1:zU/dNgDm0cMIa8y8YwcYBeuEEveI4B0owqHyiPpJPHc=
github.com/hhrutter/lzw v1.0.2 h1:laL89Llp86W3rRs83LvKbwYRx6INE8gDn0XNb1oXtm0=
github.com/hhrutter/lzw v1.0.2/go.mod h1:2HC6DJSn/n6iAZfgM3Pg+cP1KxeWc3ezG8bBqW5+WEo=
github.com/hhrutter/tiff v1.0.2 h1:MIus8caHU5U6823gx7C6jrfoEvfSTGtEFRiM8/LOzC0=
github.com/hhrutter/tiff v1.0.2/go.mod h1:zU/dNgDm0cMIa8y8YwcYBeuEEveI4B0owqHyiPpJPHc=
github.com/johnfercher/go-tree v1.0.5 h1:zpgVhJsChavzhKdxhQiCJJzcSY3VCT9oal2JoA2ZevY=
github.com/johnfercher/go-tree v1.0.5/go.mod h1:DUO6QkXIFh1K7jeGBIkLCZaeUgnkdQAsB64FDSoHswg=
github.com/johnfercher/maroto/v2 v2.3.3 h1:oeXsBnoecaMgRDwN0Cstjoe4rug3lKpOanuxuHKPqQE=
github.com/johnfercher/maroto/v2 v2.3.3/go.mod h1:KNv102TwUrlVgZGukzlIbhkG6l/WaCD6pzu6aWGVjBI=
github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
github.com/jung-kurt/gofpdf v1.0.2/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/pdfcpu/pdfcpu v0.6.0 h1:z4kARP5bcWa39TTYMcN/kjBnm7MvhTWjXgeYmkdAGMI=
github.com/pdfcpu/pdfcpu v0.6.0/go.mod h1:kmpD0rk8YnZj0l3qSeGBlAB+XszHUgNv//ORH/E7EYo=
github.com/phpdave11/gofpdf v1.4.3 h1:M/zHvS8FO3zh9tUd2RCOPEjyuVcs281FCyF22Qlz/IA=
github.com/phpdave11/gofpdf v1.4.3/go.mod h1:MAwzoUIgD3J55u0rxIG2eu37c+XWhBtXSpPAhnQXf/o=
github.com/phpdave11/gofpdi v1.0.14-0.20211212211723-1f10f9844311/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
github.com/phpdave11/gofpdi v1.0.15 h1:iJazY1BQ07I9s7N5EWjBO1YbhmKfHGxNligUv/Rw4Lc=
github.com/phpdave11/gofpdi v1.0.15/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
github.com/phpdave11/gofpdi v1.0.24-0.20211212211723-1f10f9844311/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
github.com/phpdave11/gofpdi v1.0.25 h1:iJazY1BQ07I9s7N5EWjBO1YbhmKfHGxNligUv/Rw4Lc=
github.com/phpdave11/gofpdi v1.0.25/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.2 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
Expand Down
Loading
Loading