diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index a418a0fc5fe..d84111647a5 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -30,9 +30,9 @@ jobs:
libc6-dev-arm64-cross \
file
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup Go
- uses: actions/setup-go@v4
+ uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Build ${{ matrix.arch }}
@@ -43,7 +43,7 @@ jobs:
run: |
./build.sh -v $VER -a ${{ matrix.arch }} -s
- name: Archive artifacts
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: dist-linux-${{ matrix.arch }}
path: build/linux/**/*
@@ -60,16 +60,16 @@ jobs:
run: |
brew install coreutils gnu-tar
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup Go
- uses: actions/setup-go@v4
+ uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Build ${{ matrix.arch }}
run: |
./build.sh -v $VER -a ${{ matrix.arch }}
- name: Archive artifacts
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: dist-darwin-${{ matrix.arch }}
path: build/darwin/**/*
@@ -85,7 +85,7 @@ jobs:
run: |
brew install coreutils gnu-tar
- name: Download artifacts
- uses: actions/download-artifact@v3
+ uses: actions/download-artifact@v4
- name: Build universal
run: |
export WORKDIR=$PWD/build/darwin/universal/$VER
@@ -112,7 +112,7 @@ jobs:
ls -alh $WORKDIR/*
sha256sum $WORKDIR/*
- name: Archive artifacts
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: dist-darwin-universal
path: build/darwin/**/*
@@ -125,9 +125,9 @@ jobs:
- name: Install build dependencies
run: choco install zip
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup Go
- uses: actions/setup-go@v4
+ uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Build amd64
@@ -135,7 +135,7 @@ jobs:
run: |
./build.sh -v $VER
- name: Archive artifacts
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: dist-windows
path: build/windows/**/*
@@ -151,7 +151,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Download artifacts
- uses: actions/download-artifact@v3
+ uses: actions/download-artifact@v4
- name: Release
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/v')
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 6d3ac9d9362..b4462790e34 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -31,7 +31,7 @@ jobs:
- 1433:1433
steps:
- name: Install Go
- uses: actions/setup-go@v4
+ uses: actions/setup-go@v5
with:
go-version: stable
- name: Install Packages
@@ -39,7 +39,7 @@ jobs:
sudo apt-get -qq update
sudo apt-get install -y build-essential libicu-dev unixodbc unixodbc-dev
- name: Checkout code
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Unit Tests
run: go test -v ./stmt
- name: Build with all drivers
diff --git a/LICENSE b/LICENSE
index 8f7419d5574..9c3985ece51 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2016-2023 Kenneth Shaw
+Copyright (c) 2016-2024 Kenneth Shaw
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 6658573d6bf..353afc9955d 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
-
+
-
+
-
+
@@ -23,7 +23,8 @@ via a command-line inspired by PostgreSQL's `psql`. `usql` supports most of the
core `psql` features, such as [variables][variables], [backticks][backticks],
[backslash commands][commands] and has additional features that `psql` does
not, such as [multiple database support][databases], [copying between databases][copying],
-[syntax highlighting][highlighting], and [context-based completion][completion].
+[syntax highlighting][highlighting], [context-based completion][completion],
+and [terminal graphics][termgraphics].
Database administrators and developers that would prefer to work with a tool
like `psql` with non-PostgreSQL databases, will find `usql` intuitive,
@@ -49,13 +50,14 @@ for other databases.
## Installing
`usql` can be installed [via Release][], [via Homebrew][], [via AUR][], [via
-Scoop][] or [via Go][]:
+Scoop][], [via Go][], or [via Docker][]:
[via Release]: #installing-via-release
[via Homebrew]: #installing-via-homebrew-macos-and-linux
[via AUR]: #installing-via-aur-arch-linux
[via Scoop]: #installing-via-scoop-windows
[via Go]: #installing-via-go
+[via Docker]: #installing-via-docker
### Installing via Release
@@ -137,6 +139,45 @@ $ go install -tags most github.com/xo/usql@latest
See [below for information](#building) on `usql` build tags.
+### Installing via Docker
+
+An [official container image (`docker.io/usql/usql`)][docker-hub] is maintained
+by the `usql` team, and can be used with Docker, Podman, or other container
+runtime.
+
+[docker-hub]: https://hub.docker.com/r/usql/usql
+
+Install `usql` with Docker, Podman, or other container runtime:
+
+```sh
+# run interactive shell and mount the $PWD/data directory as a volume for use
+# within the container
+$ docker run --rm -it --volume $(pwd)/data:/data docker.io/usql/usql:latest sqlite3://data/test.db
+Trying to pull docker.io/usql/usql:latest...
+Getting image source signatures
+Copying blob af48168d69d8 done |
+Copying blob efc2b5ad9eec skipped: already exists
+Copying config 917ceb411d done |
+Writing manifest to image destination
+Connected with driver sqlite3 (SQLite3 3.45.1)
+Type "help" for help.
+
+sq:data/test.db=> \q
+
+# run postgres locally
+$ docker run --detach --rm --name=postgres --publish=5432:5432 --env=POSTGRES_PASSWORD=P4ssw0rd docker.io/usql/postgres
+
+# connect to local postgres instance
+$ docker run --rm --network host -it docker.io/usql/usql:latest postgres://postgres:P4ssw0rd@localhost
+Connected with driver postgres (PostgreSQL 16.3 (Debian 16.3-1.pgdg120+1))
+Type "help" for help.
+
+pg:postgres@localhost=> \q
+
+# run specific usql version
+$ docker run --rm -it docker.io/usql/usql:0.19.3
+```
+
## Building
When building `usql` out-of-the-box with `go build` or `go install`, only the
@@ -181,7 +222,7 @@ $ go install -tags all github.com/xo/usql@master
`usql` works with all Go standard library compatible SQL drivers supported by
[`github.com/xo/dburl`][dburl].
-The list of drivers that `usql` was built with can be displayed using the
+The list of drivers that `usql` was built with can be displayed with the
[`\drivers` command][commands]:
```sh
@@ -214,8 +255,9 @@ The following are the [Go SQL drivers][go-sql] that `usql` supports, the
associated database, scheme / build tag, and scheme aliases:
+
| Database | Scheme / Tag | Scheme Aliases | Driver Package / Notes |
-|----------------------|-----------------|-------------------------------------------------|-----------------------------------------------------------------------------|
+| -------------------- | --------------- | ----------------------------------------------- | --------------------------------------------------------------------------- |
| PostgreSQL | `postgres` | `pg`, `pgsql`, `postgresql` | [github.com/lib/pq][d-postgres] |
| MySQL | `mysql` | `my`, `maria`, `aurora`, `mariadb`, `percona` | [github.com/go-sql-driver/mysql][d-mysql] |
| Microsoft SQL Server | `sqlserver` | `ms`, `mssql`, `azuresql` | [github.com/microsoft/go-mssqldb][d-sqlserver] |
@@ -233,9 +275,10 @@ associated database, scheme / build tag, and scheme aliases:
| AWS Athena | `athena` | `s3`, `aws`, `awsathena` | [github.com/uber/athenadriver/go][d-athena] |
| Azure CosmosDB | `cosmos` | `cm` | [github.com/btnguyen2k/gocosmos][d-cosmos] |
| Cassandra | `cassandra` | `ca`, `scy`, `scylla`, `datastax`, `cql` | [github.com/MichaelS11/go-cql-driver][d-cassandra] |
+| ChaiSQL | `chai` | `ci`, `genji`, `chaisql` | [github.com/chaisql/chai/driver][d-chai] |
| Couchbase | `couchbase` | `n1`, `n1ql` | [github.com/couchbase/go_n1ql][d-couchbase] |
| Cznic QL | `ql` | `cznic`, `cznicql` | [modernc.org/ql][d-ql] |
-| Databend | `databend` | `dd`, `bend` | [github.com/databendcloud/databend-go][d-databend] |
+| Databend | `databend` | `dd`, `bend` | [github.com/datafuselabs/databend-go][d-databend] |
| Databricks | `databricks` | `br`, `brick`, `bricks`, `databrick` | [github.com/databricks/databricks-sql-go][d-databricks] |
| DuckDB | `duckdb` | `dk`, `ddb`, `duck`, `file` | [github.com/marcboeker/go-duckdb][d-duckdb] [†][f-cgo] |
| DynamoDb | `dynamodb` | `dy`, `dyn`, `dynamo`, `dynamodb` | [github.com/btnguyen2k/godynamo][d-dynamodb] |
@@ -250,6 +293,7 @@ associated database, scheme / build tag, and scheme aliases:
| Netezza | `netezza` | `nz`, `nzgo` | [github.com/IBM/nzgo/v12][d-netezza] |
| PostgreSQL PGX | `pgx` | `px` | [github.com/jackc/pgx/v5/stdlib][d-pgx] |
| Presto | `presto` | `pr`, `prs`, `prestos`, `prestodb`, `prestodbs` | [github.com/prestodb/presto-go-client/presto][d-presto] |
+| RamSQL | `ramsql` | `rm`, `ram` | [github.com/proullon/ramsql/driver][d-ramsql] |
| SAP ASE | `sapase` | `ax`, `ase`, `tds` | [github.com/thda/tds][d-sapase] |
| SAP HANA | `saphana` | `sa`, `sap`, `hana`, `hdb` | [github.com/SAP/go-hdb/driver][d-saphana] |
| Snowflake | `snowflake` | `sf` | [github.com/snowflakedb/gosnowflake][d-snowflake] |
@@ -269,7 +313,6 @@ associated database, scheme / build tag, and scheme aliases:
| Vitess Database | `mysql` | `vt`, `vitess` | [github.com/go-sql-driver/mysql][d-mysql] [‡][f-wire] |
| | | | |
| Apache Impala | `impala` | `im` | [github.com/bippio/go-impala][d-impala] |
-| Genji | `genji` | `gj` | [github.com/genjidb/genji/driver][d-genji] |
| | | | |
| **NO DRIVERS** | `no_base` | | _no base drivers (useful for development)_ |
| **MOST DRIVERS** | `most` | | _all stable drivers_ |
@@ -282,18 +325,18 @@ associated database, scheme / build tag, and scheme aliases:
[d-avatica]: https://github.com/apache/calcite-avatica-go
[d-bigquery]: https://github.com/go-gorm/bigquery
[d-cassandra]: https://github.com/MichaelS11/go-cql-driver
+[d-chai]: https://github.com/chaisql/chai
[d-clickhouse]: https://github.com/ClickHouse/clickhouse-go
[d-cosmos]: https://github.com/btnguyen2k/gocosmos
[d-couchbase]: https://github.com/couchbase/go_n1ql
[d-csvq]: https://github.com/mithrandie/csvq-driver
-[d-databend]: https://github.com/databendcloud/databend-go
+[d-databend]: https://github.com/datafuselabs/databend-go
[d-databricks]: https://github.com/databricks/databricks-sql-go
[d-duckdb]: https://github.com/marcboeker/go-duckdb
[d-dynamodb]: https://github.com/btnguyen2k/godynamo
[d-exasol]: https://github.com/exasol/exasol-driver-go
[d-firebird]: https://github.com/nakagami/firebirdsql
[d-flightsql]: https://github.com/apache/arrow/tree/main/go/arrow/flight/flightsql/driver
-[d-genji]: https://github.com/genjidb/genji
[d-godror]: https://github.com/godror/godror
[d-h2]: https://github.com/jmrobles/h2go
[d-hive]: https://github.com/sql-machine-learning/gohive
@@ -311,6 +354,7 @@ associated database, scheme / build tag, and scheme aliases:
[d-postgres]: https://github.com/lib/pq
[d-presto]: https://github.com/prestodb/presto-go-client
[d-ql]: https://gitlab.com/cznic/ql
+[d-ramsql]: https://github.com/proullon/ramsql
[d-sapase]: https://github.com/thda/tds
[d-saphana]: https://github.com/SAP/go-hdb
[d-snowflake]: https://github.com/snowflakedb/gosnowflake
@@ -321,6 +365,7 @@ associated database, scheme / build tag, and scheme aliases:
[d-vertica]: https://github.com/vertica/vertica-sql-go
[d-voltdb]: https://github.com/VoltDB/voltdb-client-go
[d-ydb]: https://github.com/ydb-platform/ydb-go-sdk
+
[f-cgo]: #f-cgo "Requires CGO"
@@ -333,7 +378,7 @@ associated database, scheme / build tag, and scheme aliases:
-Any of the protocol schemes/aliases shown above can be used in conjunction when
+Any of the protocol schemes/aliases above can be used in conjunction when
connecting to a database via the command-line or with the [`\connect` and
`\copy` commands][commands]:
@@ -375,38 +420,38 @@ $ usql --help
usql, the universal command-line interface for SQL databases
Usage:
- usql [OPTIONS]... [DSN]
+ usql [flags]... [DSN]
Arguments:
- DSN database url
-
-Options:
- -c, --command=COMMAND ... run only single command (SQL or internal) and exit
- -f, --file=FILE ... execute commands from file and exit
- -w, --no-password never prompt for password
- -X, --no-rc do not read start up file
- -o, --out=OUT output file
- -W, --password force password prompt (should happen automatically)
- -1, --single-transaction execute as a single transaction (if non-interactive)
- -v, --set=, --variable=NAME=VALUE ...
- set variable NAME to VALUE
- -P, --pset=VAR[=ARG] ... set printing option VAR to ARG (see \pset command)
- -F, --field-separator=FIELD-SEPARATOR ...
- field separator for unaligned output (default, "|")
- -R, --record-separator=RECORD-SEPARATOR ...
- record separator for unaligned output (default, \n)
- -T, --table-attr=TABLE-ATTR ...
- set HTML table tag attributes (e.g., width, border)
- -A, --no-align unaligned table output mode
- -H, --html HTML table output mode
- -t, --tuples-only print rows only
- -x, --expanded turn on expanded table output
- -z, --field-separator-zero set field separator for unaligned output to zero byte
- -0, --record-separator-zero set record separator for unaligned output to zero byte
- -J, --json JSON output mode
- -C, --csv CSV output mode
- -G, --vertical vertical output mode
- -V, --version display version and exit
+ DSN database url or connection name
+
+Flags:
+ -c, --command COMMAND run only single command (SQL or internal) and exit
+ -f, --file FILE execute commands from file and exit
+ -w, --no-password never prompt for password
+ -X, --no-init do not execute initialization scripts (aliases: --no-rc --no-psqlrc --no-usqlrc)
+ -o, --out FILE output file
+ -W, --password force password prompt (should happen automatically)
+ -1, --single-transaction execute as a single transaction (if non-interactive)
+ -v, --set NAME=VALUE set variable NAME to VALUE (see \set command, aliases: --var --variable)
+ -N, --cset NAME=DSN set named connection NAME to DSN (see \cset command)
+ -P, --pset VAR=ARG set printing option VAR to ARG (see \pset command)
+ -F, --field-separator FIELD-SEPARATOR field separator for unaligned and CSV output (default "|" and ",")
+ -R, --record-separator RECORD-SEPARATOR record separator for unaligned and CSV output (default \n)
+ -T, --table-attr TABLE-ATTR set HTML table tag attributes (e.g., width, border)
+ -A, --no-align unaligned table output mode
+ -H, --html HTML table output mode
+ -t, --tuples-only print rows only
+ -x, --expanded turn on expanded table output
+ -z, --field-separator-zero set field separator for unaligned and CSV output to zero byte
+ -0, --record-separator-zero set record separator for unaligned and CSV output to zero byte
+ -J, --json JSON output mode
+ -C, --csv CSV output mode
+ -G, --vertical vertical output mode
+ -q, --quiet run quietly (no messages, only query output)
+ --config string config file
+ -V, --version output version information, then exit
+ -?, --help show this help, then exit
```
### Connecting to Databases
@@ -417,12 +462,18 @@ connection strings (aka "data source name" or DSNs) have the same parsing rules
as URLs, and can be passed to `usql` via command-line, or to the [`\connect`,
`\c`, and `\copy` commands][commands].
+Database connections can be defined with [the `\cset` command][connection-vars]
+or in [the `config.yaml` configuration file][config].
+
+#### Database Connection Strings
+
Database connection strings look like the following:
```txt
- driver+transport://user:pass@host/dbname?opt1=a&opt2=b
- driver:/path/to/file
- /path/to/file
+ driver+transport://user:pass@host/dbname?opt1=a&opt2=b
+ driver:/path/to/file
+ /path/to/file
+ name
```
Where the above are:
@@ -437,6 +488,7 @@ Where the above are:
| `dbname` [±][f-path] | database name, instance, or service name/ID |
| `?opt1=a&...` | additional database driver options (see respective SQL driver for available options) |
| `/path/to/file` | a path on disk |
+| `name` | a connection name set by [`\cset`][connection-vars] or in [`config.yaml`][config] |
[f-path]: #f-path "URL Paths for Databases"
@@ -475,10 +527,10 @@ If a URL does not have a `driver:` scheme, `usql` will check if it is a path on
disk. If the path exists, `usql` will attempt to use an appropriate database
driver to open the path.
-When the path is a Unix Domain Socket, `usql` will attempt to open it using the
+When the path is a Unix Domain Socket, `usql` will attempt to open it with the
MySQL driver. When the path is a directory, `usql` will attempt to open it
using the PostgreSQL driver. And, lastly, when the path is a regular file,
-`usql` will attempt to open the file using the SQLite3 driver.
+`usql` will attempt to open the file using the SQLite3 or DuckDB drivers.
#### Driver Defaults
@@ -537,8 +589,8 @@ $ usql ca://
# connect to a sqlite database that exists on disk
$ usql dbname.sqlite3
-# Note: when connecting to a SQLite database, if the "://" or
-# ":" scheme/alias is omitted, the file must already exist on disk.
+# Note: when connecting to a SQLite database, if the "driver://" or
+# "driver:" scheme/alias is omitted, the file must already exist on disk.
#
# if the file does not yet exist, the URL must incorporate file:, sq:, sqlite3:,
# or any other recognized sqlite3 driver alias to force usql to create a new,
@@ -551,6 +603,12 @@ $ usql file:/path/to/dbname.sqlite3
$ usql adodb://Microsoft.Jet.OLEDB.4.0/myfile.mdb
$ usql "adodb://Microsoft.ACE.OLEDB.12.0/?Extended+Properties=\"Text;HDR=NO;FMT=Delimited\""
+# connect to a named connection in $HOME/.config/usql/config.yaml
+$ cat $HOME/.config/usql/config.yaml
+connections:
+ my_named_connection: sqlserver://user:pass@localhost/
+$ usql my_named_connection
+
# connect with ODBC driver (requires building with odbc tag)
$ cat /etc/odbcinst.ini
[DB2]
@@ -566,15 +624,19 @@ Setup=libodbcpsqlS.so
Debug=0
CommLog=1
UsageCount=1
-# connect to db2, postgres databases using ODBC
+
+# connect to db2, postgres databases using odbc config above
$ usql odbc+DB2://user:pass@localhost/dbname
$ usql odbc+PostgreSQL+ANSI://user:pass@localhost/dbname?TraceFile=/path/to/trace.log
```
+See the [section on connection variables][connection-vars] for information on
+defining connection names.
+
### Executing Queries and Commands
-The interactive intrepreter reads queries and [meta (`\`) commands][commands],
-sending the query to the connected database:
+The interactive interpreter reads queries and [backslash meta (`\`)
+commands][commands], sending the query to the connected database:
```sh
$ usql sqlite://example.sqlite3
@@ -620,7 +682,16 @@ or `"`. Command parameters [may also be backticked][backticks].
### Backslash Commands
-Currently available commands:
+`usql` supports interleaved backslash (`\`) meta commands to modify or alter
+the way that `usql` interprets queries, formats its output, and changes the
+resulting interactive flow.
+
+```sh
+(not connected)=> \c postgres://user:pass@localhost
+pg:user@localhost=> select * from my_table \G
+```
+
+Available backslash meta commands can be displayed with `\?`:
```sh
$ usql
@@ -640,6 +711,7 @@ Query Execute
\gset [PREFIX] execute query and store results in usql variables
\gx [(OPTIONS)] [FILE] as \g, but forces expanded output mode
\watch [(OPTIONS)] [DURATION] execute query every specified interval
+ \bind [PARAM]... set query parameters
Query Buffer
\e [FILE] [LINE] edit the query buffer (or file) with external editor
@@ -683,8 +755,8 @@ Formatting
\C [STRING] set table title, or unset if none
\f [STRING] show or set field separator for unaligned query output
\H toggle HTML output mode
- \t [on|off] show only rows
\T [STRING] set HTML tag attributes, or unset if none
+ \t [on|off] show only rows
\x [on|off|auto] toggle expanded output
Transaction
@@ -696,61 +768,129 @@ Transaction
Connection
\c DSN connect to database url
\c DRIVER PARAMS... connect to database with driver and parameters
+ \cset [NAME [DSN]] set named connection, or list all if no parameters
+ \cset NAME DRIVER PARAMS... define named connection for database driver
\Z close database connection
\password [USERNAME] change the password for a user
\conninfo display information about the current database connection
Operating System
\cd [DIR] change the current working directory
+ \getenv VARNAME ENVVAR fetch environment variable
\setenv NAME [VALUE] set or unset environment variable
\! [COMMAND] execute command in shell or start interactive shell
\timing [on|off] toggle timing of commands
Variables
- \prompt [-TYPE] [PROMPT] prompt user to set variable
+ \prompt [-TYPE] VAR [PROMPT] prompt user to set variable
\set [NAME [VALUE]] set internal variable, or list all if no parameters
\unset NAME unset (delete) internal variable
```
+Parameters passed to commands [can be backticked][backticks].
+
## Features and Compatibility
-An overview of `usql`'s features, functionality, and compability with `psql`:
+An overview of `usql`'s features, functionality, and compatibility with `psql`:
-- [Variables and Interpolation][variables]
+- [Configuration][config]
+- [Variables][variables]
- [Backticks][backticks]
-- [Passwords][usqlpass]
-- [Runtime Configuration (RC) File][usqlrc]
- [Copying Between Databases][copying]
- [Syntax Highlighting][highlighting]
- [Time Formatting][timefmt]
- [Context Completion][completion]
- [Host Connection Information](#host-connection-information)
+- [Passwords][usqlpass]
+- [Runtime Configuration (RC) File][usqlrc]
The `usql` project's goal is to support as much of `psql`'s core features and
functionality, and aims to be as compatible as possible - [contributions are
always appreciated][contributing]!
-#### Variables and Interpolation
+#### Configuration
+
+During its initialization phase, `usql` reads a standard [YAML configuration][yaml]
+file `config.yaml`. On Windows this is `%AppData%/usql/config.yaml`, on macOS
+this is `$HOME/Library/Application Support/usql/config.yaml`, and on Linux and
+other Unix systems this is normally `$HOME/.config/usql/config.yaml`.
+
+##### `connections:`
+
+[Named connection DSNs][connecting] can be defined under `connections:` as a string
+or as a map:
+
+```yaml
+connections:
+ my_couchbase_conn: couchbase://Administrator:P4ssw0rd@localhost
+ my_clickhouse_conn: clickhouse://clickhouse:P4ssw0rd@localhost
+ my_godror_conn:
+ protocol: godror
+ username: system
+ password: P4ssw0rd
+ hostname: localhost
+ port: 1521
+ database: free
+```
-To see the list of specially treated variables, run the `\? variables` command.
+Defined `connections:` can be used on the command-line with `\connect`, `\c`,
+`\copy`, and [other commands][commands]:
-`usql` supports client-side interpolation of variables that can be `\set` and
-`\unset`:
+```sh
+$ usql my_godror_conn
+Connected with driver godror (Oracle Database 23.0.0.0.0)
+Type "help" for help.
+
+gr:system@localhost/free=>
+```
+
+##### `init:`
+
+An initialization script can be defined as `init:`:
+
+```yaml
+init: |
+ \echo welcome to the jungle `date`
+ \set SYNTAX_HL_STYLE paraiso-dark
+```
+
+The `init:` script is commonly used to set [environment variables][variables]
+or other configuration, and can be disabled on the command-line using the
+`--no-init` / `-X` flag. The script will be executed prior to any `-c` /
+`--command` / `-f` / `--file` flag and before starting the interactive
+interpreter.
+
+##### Other Options
+
+Please see [`contrib/config.yaml`](contrib/config.yaml) for an overview of
+available configuration options.
+
+#### Variables
+
+`usql` supports [runtime][runtime-vars], [connection][connection-vars], and
+[display formatting][print-vars] variables that can be `\set`, `\cset`, or
+`\pset` respectively.
+
+##### Runtime Variables
+
+Runtime variables are managed with the `\set` and `\unset` [commands][commands]:
```sh
-$ usql
-(not connected)=> \set
+(not connected)=> \unset FOO
(not connected)=> \set FOO bar
+```
+
+Runtime variables can be displayed with `\set`:
+
+```sh
(not connected)=> \set
FOO = 'bar'
-(not connected)=> \unset FOO
-(not connected)=> \set
-(not connected)=>
```
-A `\set` variable, `NAME`, will be directly interpolated (by string
-substitution) into the query when prefixed with `:` and optionally surrounded
-by quotation marks (`'` or `"`):
+###### Variable Interpolation
+
+When a runtime variable `NAME` has been `\set`, then `:NAME`, `:'NAME'`, and
+`:"NAME"` will be interpolated into the query buffer:
```sh
pg:booktest@localhost=> \set FOO bar
@@ -761,28 +901,28 @@ pg:booktest@localhost=> select * from authors where name = :'FOO';
(1 rows)
```
-The three forms, `:NAME`, `:'NAME'`, and `:"NAME"`, are used to interpolate a
-variable in parts of a query that may require quoting, such as for a column
-name, or when doing concatenation in a query:
+Where a runtime variable is used as `:'NAME'` or `:"NAME"` the interpolated
+value will be quoted using `'` or `"` respectively:
```sh
pg:booktest@localhost=> \set TBLNAME authors
pg:booktest@localhost=> \set COLNAME name
pg:booktest@localhost=> \set FOO bar
pg:booktest@localhost=> select * from :TBLNAME where :"COLNAME" = :'FOO'
+```
+
+The query buffer and interpolated values can be displayed with `\p` and
+`\print`, or the raw query buffer can be displayed with `\raw`:
+
+```sh
pg:booktest@localhost-> \p
select * from authors where "name" = 'bar'
pg:booktest@localhost-> \raw
select * from :TBLNAME where :"COLNAME" = :'FOO'
-pg:booktest@localhost-> \g
- author_id | name
-+-----------+------+
- 7 | bar
-(1 rows)
-
-pg:booktest@localhost=>
```
+
+
> **Note**
>
> Variables contained within other strings will not be interpolated:
@@ -796,86 +936,85 @@ pg:booktest@localhost=> select ':FOO';
pg:booktest@localhost=> \p
select ':FOO';
-pg:booktest@localhost=>
```
-#### Backticks
+
+
+##### Connection Variables
-[Meta (`\`) commands][commands] support backticks on parameters:
+Connection variables work similarly to runtime variables, and are managed with
+`\cset`. Connection variables can be used with the `\c`, `\connect`, `\copy`,
+or [other commands][commands]:
```sh
-(not connected)=> \echo Welcome `echo $USER` -- 'currently:' "(" `date` ")"
-Welcome ken -- currently: ( Wed Jun 13 12:10:27 WIB 2018 )
-(not connected)=>
+(not connected)=> \cset my_conn postgres://user:pass@localhost
+(not connected)=> \c my_conn
+Connected with driver postgres (PostgreSQL 16.2 (Debian 16.2-1.pgdg120+2))
+pg:postgres@localhost=>
```
-Backticked parameters will be passed to the user's `SHELL`, exactly as written,
-and can be combined with `\set`:
+Connection variables are not interpolated into queries. See the [configuration
+section for information on defining persistent connection variables][config].
+
+Connection variables can be displayed with `\cset`:
```sh
-pg:booktest@localhost=> \set MYVAR `date`
-pg:booktest@localhost=> \set
-MYVAR = 'Wed Jun 13 12:17:11 WIB 2018'
-pg:booktest@localhost=> \echo :MYVAR
-Wed Jun 13 12:17:11 WIB 2018
-pg:booktest@localhost=>
+(not connected)=> \cset
+my_conn = 'postgres://user:pass@localhost'
```
-#### Passwords
+##### Display Formatting (Print) Variables
-`usql` supports reading passwords for databases from a `.usqlpass` file
-contained in the user's `HOME` directory at startup:
+Display formatting variables can be set using `\pset` and [other
+commands][commands]:
```sh
-$ cat $HOME/.usqlpass
-# format is:
-# protocol:host:port:dbname:user:pass
-postgres:*:*:*:booktest:booktest
-$ usql pg://
-Connected with driver postgres (PostgreSQL 9.6.9)
-Type "help" for help.
-
-pg:booktest@=>
+(not connected)=> \pset time Kitchen
+Time display is "Kitchen" ("3:04PM").
+(not connected)=> \a
+Output format is unaligned.
```
-> **Note**
->
-> The `.usqlpass` file cannot be readable by other users, and the permissions
-> should be set accordingly:
+Display formatting variables can be displayed with `\pset`:
```sh
-chmod 0600 ~/.usqlpass
+(not connected)=> \pset
+time Kitchen
```
-#### Runtime Configuration (RC) File
+##### Other Variables
-`usql` supports executing a `.usqlrc` runtime configuration (RC) file contained
-in the user's `HOME` directory:
+Runtime behavior, such as [enabling or disabling syntax
+highlighting][highlighting] can be modified through special variables like
+[`SYNTAX_HL`][highlighting].
+
+Use the `\? variables` [command][commands] to display variable help information
+and to list special variables recognized by `usql`:
```sh
-$ cat $HOME/.usqlrc
-\echo WELCOME TO THE JUNGLE `date`
-\set SYNTAX_HL_STYLE paraiso-dark
-# display color prompt (default is prompt is "%S%m%/%R%#" )
-\set PROMPT1 "\033[32m%S%m%/%R%#\033[0m"
-$ usql
-WELCOME TO THE JUNGLE Thu Jun 14 02:36:53 WIB 2018
-Type "help" for help.
+(not connected)=> \? variables
+```
-(not connected)=> \set
-SYNTAX_HL_STYLE = 'paraiso-dark'
+#### Backticks
+
+[Backslash (`\`) meta commands][commands] support backticks on parameters:
+
+```sh
+(not connected)=> \echo Welcome `echo $USER` -- 'currently:' "(" `date` ")"
+Welcome ken -- currently: ( Wed Jun 13 12:10:27 WIB 2018 )
(not connected)=>
```
-The `.usqlrc` file is read at startup in the same way as a file passed on the
-command-line with `-f` / `--file`. It is commonly used to set startup
-environment variables and settings.
-
-RC-file execution can be temporarily disabled at startup by passing `-X` or
-`--no-rc` on the command-line:
+Backticked parameters will be passed to the user's `SHELL`, exactly as written,
+and can be combined with `\set`:
```sh
-$ usql --no-rc pg://
+pg:booktest@localhost=> \set MYVAR `date`
+pg:booktest@localhost=> \set
+MYVAR = 'Wed Jun 13 12:17:11 WIB 2018'
+pg:booktest@localhost=> \echo :MYVAR
+Wed Jun 13 12:17:11 WIB 2018
+pg:booktest@localhost=>
```
#### Copying Between Databases
@@ -884,23 +1023,38 @@ $ usql --no-rc pg://
and writes to a destination database DSN:
```sh
-$ usql
-(not connected)=> \copy :PGDSN :MYDSN 'select book_id, author_id from books' 'books(id, author_id)'
+(not connected)=> \cset PGDSN postgres://user:pass@localhost
+(not connected)=> \cset MYDSN mysql://user:pass@localhost
+(not connected)=> \copy PGDSN MYDSN 'select book_id, author_id from books' 'books(id, author_id)'
```
+As demonstrated above, the `\copy` command does not require being connected to
+a database, and will not modify or change the current open database connection
+or state.
+
+Any valid URL or DSN name maybe used for the source and destination database:
+
+```sh
+(not connected)=> \cset MYDSN mysql://user:pass@localhost
+(not connected)=> \copy postgres://user:pass@localhost MYDSN 'select book_id, author_id from books' 'books(id, author_id)'
+```
+
+
+
> **Note**
>
> `usql`'s `\copy` is distinct from and does not function like
> `psql`'s `\copy`.
-##### Parameters
+
+
+##### Copy Parameters
The `\copy` command has two parameter forms:
```txt
-SRC DST QUERY TABLE
-
-SRC DST QUERY TABLE(COL1, COL2, ..., COLN)
+\copy SRC DST QUERY TABLE
+\copy SRC DST QUERY TABLE(COL1, COL2, ..., COLN)
```
Where:
@@ -943,7 +1097,7 @@ error: failed to prepare insert query: 2 values for 1 columns
COPY 2
```
-###### Datatype Compatibilty and Casting
+###### Datatype Compatibility and Casting
The `\copy` command does not attempt to perform any kind of datatype
conversion.
@@ -1014,11 +1168,15 @@ sq:booktest.db=> select * from books;
(4 rows)
```
+
+
> **Note**
>
> When importing large datasets (> 1GiB) from one database to another, it is
> better to use a database's native clients and tools.
+
+
###### Reusing Connections with Copy
The `\copy` command (and all `usql` commands) [works with variables][variables].
@@ -1103,7 +1261,7 @@ Command completion can be canceled with ``.
Some databases support time/date columns that [support formatting][go-time]. By
default, `usql` formats time/date columns as [RFC3339Nano][go-time], and can be
-set using `\pset time `:
+set using `\pset time FORMAT`:
```sh
$ usql pg://
@@ -1193,6 +1351,140 @@ Connected with driver postgres (PostgreSQL 9.6.9)
pg:booktest@=>
```
+#### Terminal Graphics
+
+`usql` supports terminal graphics for [Kitty][kitty-graphics], [iTerm][iterm-graphics],
+and [Sixel][sixel-graphics] enabled terminals using the [`github.com/kenshaw/rasterm` package][rasterm].
+Terminal graphics are only available when using the interactive shell.
+
+##### Detection and Support
+
+`usql` will attempt to detect when terminal graphics support is available using
+the `USQL_TERM_GRAPHICS`, `TERM_GRAPHICS` and other environment variables
+unique to various terminals.
+
+When support is available, the logo will be displayed at the start of an
+interactive session:
+
+
+
+
+
+##### Charts and Graphs
+
+The [`\chart` command][chart-command] can be used to display a chart
+directly in the terminal:
+
+
+
+
+
+See [the section on the `\chart` meta command][chart-command] for details.
+
+##### Enabling/Disabling Terminal Graphics
+
+Terminal graphics can be forced enabled or disabled by setting the
+`USQL_TERM_GRAPHICS` or the `TERM_GRAPHICS` environment variable:
+
+```sh
+# disable
+$ USQL_TERM_GRAPHICS=none usql
+
+# force iterm graphics
+$ TERM_GRAPHICS=iterm usql
+```
+
+| Variable | Default | Values | Description |
+| --------------- | ------- | ------------------------------------- | ------------------------------ |
+| `TERM_GRAPHICS` | `` | ``, `kitty`, `iterm`, `sixel`, `none` | enables/disables term graphics |
+
+##### Terminals with Graphics Support
+
+The following terminals have been tested with `usql`:
+
+- [WezTerm][wezterm] is a cross-platform terminal for Windows, macOS, Linux, and
+ many other platforms that supports [iTerm][iterm-graphics] graphics
+
+- [iTerm2][iterm2] is a macOS terminal that supports [iTerm][iterm-graphics]
+ graphics
+
+- [kitty][kitty] is a terminal for Linux, macOS, and various BSDs that supports
+ [Kitty][kitty-graphics] graphics
+
+- [foot][foot] is a Wayland terminal for Linux (and other Wayland hosts) that
+ supports [Sixel][sixel-graphics] graphics
+
+Additional terminals that support [Sixel][sixel-graphics] graphics are
+catalogued on the [Are We Sixel Yet?][arewesixelyet] website.
+
+#### Passwords
+
+`usql` supports reading passwords for databases from a `.usqlpass` file
+contained in the user's `HOME` directory at startup:
+
+```sh
+$ cat $HOME/.usqlpass
+# format is:
+# protocol:host:port:dbname:user:pass
+postgres:*:*:*:booktest:booktest
+$ usql pg://
+Connected with driver postgres (PostgreSQL 9.6.9)
+Type "help" for help.
+
+pg:booktest@=>
+```
+
+While the `.usqlpass` functionality will not be removed, it is recommended to
+[define named connections][connection-vars] preferrably via [the `config.yaml`
+file][config].
+
+
+
+> **Note**
+>
+> The `.usqlpass` file cannot be readable by other users, and the permissions
+> should be set accordingly:
+
+```sh
+chmod 0600 ~/.usqlpass
+```
+
+
+
+#### Runtime Configuration (RC) File
+
+`usql` supports executing a `.usqlrc` runtime configuration (RC) file contained
+in the user's `HOME` directory:
+
+```sh
+$ cat $HOME/.usqlrc
+\echo WELCOME TO THE JUNGLE `date`
+\set SYNTAX_HL_STYLE paraiso-dark
+# display color prompt (default is prompt is "%S%m%/%R%#" )
+\set PROMPT1 "\033[32m%S%m%/%R%#\033[0m"
+$ usql
+WELCOME TO THE JUNGLE Thu Jun 14 02:36:53 WIB 2018
+Type "help" for help.
+
+(not connected)=> \set
+SYNTAX_HL_STYLE = 'paraiso-dark'
+(not connected)=>
+```
+
+The `.usqlrc` file is read at startup in the same way as a file passed on the
+command-line with `-f` / `--file`. It is commonly used to set startup
+environment variables and settings.
+
+RC-file execution can be temporarily disabled at startup by passing `-X` or
+`--no-init` on the command-line:
+
+```sh
+$ usql --no-init pg://
+```
+
+While the `.usqlrc` functionality will not be removed, it is recommended to set
+an `init` script in [the `config.yaml` file][config].
+
## Additional Notes
The following are additional notes and miscellania related to `usql`:
@@ -1200,13 +1492,13 @@ The following are additional notes and miscellania related to `usql`:
### Release Builds
[Release builds][releases] are built with the `most` build tag and with
-additional [SQLite3 build tags (see: `build-release.sh`)](build-release.sh).
+additional [SQLite3 build tags (see: `build.sh`)](build.sh).
### macOS
-The recommended installation method on macOS is [via `brew` (see above)][via Homebrew]
-due to the way libary dependencies for the `sqlite3` driver are done on macOS.
-If the following (or similar) error is encountered when attempting to run `usql`:
+The recommended installation method on macOS is [via `brew`][via Homebrew] due
+to the way library dependencies for the `sqlite3` driver are done on macOS. If
+the following (or similar) error is encountered when attempting to run `usql`:
```sh
$ usql
@@ -1259,13 +1551,29 @@ contributing, see CONTRIBUTING.md](CONTRIBUTING.md).
[yay]: https://github.com/Jguer/yay
[arch-makepkg]: https://wiki.archlinux.org/title/makepkg
[backticks]: #backticks "Backticks"
-[commands]: #backslash-commands "Commands"
+[config]: #configuration "Configuration"
+[commands]: #backslash-commands "Backslash Commands"
[completion]: #context-completion "Context Completion"
[connecting]: #connecting-to-databases "Connecting to Databases"
[contributing]: #contributing "Contributing"
[copying]: #copying-between-databases "Copying Between Databases"
[highlighting]: #syntax-highlighting "Syntax Highlighting"
+[termgraphics]: #terminal-graphics "Terminal Graphics"
[timefmt]: #time-formatting "Time Formatting"
[usqlpass]: #passwords "Passwords"
[usqlrc]: #runtime-configuration-rc-file "Runtime Configuration File"
-[variables]: #variables-and-interpolation "Variable Interpolation"
+[variables]: #variables "Variables"
+[runtime-vars]: #runtime-variables "Runtime Variables"
+[connection-vars]: #connection-variables "Connection Variables"
+[print-vars]: #display-formatting-(print)-variables "Display Formatting (print) Variables"
+[kitty-graphics]: https://sw.kovidgoyal.net/kitty/graphics-protocol.html
+[iterm-graphics]: https://iterm2.com/documentation-images.html
+[sixel-graphics]: https://saitoha.github.io/libsixel/
+[rasterm]: https://github.com/kenshaw/rasterm
+[wezterm]: https://wezfurlong.org/wezterm/
+[iterm2]: https://iterm2.com
+[foot]: https://codeberg.org/dnkl/foot
+[kitty]: https://sw.kovidgoyal.net/kitty/
+[arewesixelyet]: https://www.arewesixelyet.com
+[chart-command]: #chart-command "\\chart meta command"
+[yaml]: https://yaml.org
diff --git a/args.go b/args.go
deleted file mode 100644
index 6eb327655af..00000000000
--- a/args.go
+++ /dev/null
@@ -1,153 +0,0 @@
-package main
-
-import (
- "fmt"
- "io"
- "os"
- "strings"
-
- "github.com/alecthomas/kingpin/v2"
- "github.com/xo/usql/text"
-)
-
-// CommandOrFile is a special type to deal with interspersed -c, -f,
-// command-line options, to ensure proper order execution.
-type CommandOrFile struct {
- Command bool
- Value string
-}
-
-// Args are the command line arguments.
-type Args struct {
- DSN string
- CommandOrFiles []CommandOrFile
- Out string
- ForcePassword bool
- NoPassword bool
- NoRC bool
- SingleTransaction bool
- Variables []string
- PVariables []string
-}
-
-func (args *Args) Next() (string, bool, error) {
- if len(args.CommandOrFiles) == 0 {
- return "", false, io.EOF
- }
- cmd := args.CommandOrFiles[0]
- args.CommandOrFiles = args.CommandOrFiles[1:]
- return cmd.Value, cmd.Command, nil
-}
-
-type commandOrFile struct {
- args *Args
- command bool
-}
-
-func (c commandOrFile) Set(value string) error {
- c.args.CommandOrFiles = append(c.args.CommandOrFiles, CommandOrFile{
- Command: c.command,
- Value: value,
- })
- return nil
-}
-
-func (c commandOrFile) String() string {
- return ""
-}
-
-func (c commandOrFile) IsCumulative() bool {
- return true
-}
-
-// for populating args.PVariables with user-specified options
-type pset struct {
- args *Args
- vals []string
-}
-
-func (p pset) Set(value string) error {
- for i, v := range p.vals {
- if strings.ContainsRune(v, '%') {
- p.vals[i] = fmt.Sprintf(v, value)
- }
- }
- p.args.PVariables = append(p.args.PVariables, p.vals...)
- return nil
-}
-
-func (p pset) String() string {
- return ""
-}
-
-func (p pset) IsCumulative() bool {
- return true
-}
-
-func NewArgs() *Args {
- args := &Args{}
- // set usage template
- kingpin.UsageTemplate(text.UsageTemplate())
- kingpin.Arg("dsn", "database url").StringVar(&args.DSN)
- // command / file flags
- kingpin.Flag("command", "run only single command (SQL or internal) and exit").Short('c').SetValue(commandOrFile{args, true})
- kingpin.Flag("file", "execute commands from file and exit").Short('f').SetValue(commandOrFile{args, false})
- // general flags
- kingpin.Flag("no-password", "never prompt for password").Short('w').BoolVar(&args.NoPassword)
- kingpin.Flag("no-rc", "do not read start up file").Short('X').BoolVar(&args.NoRC)
- kingpin.Flag("out", "output file").Short('o').StringVar(&args.Out)
- kingpin.Flag("password", "force password prompt (should happen automatically)").Short('W').BoolVar(&args.ForcePassword)
- kingpin.Flag("single-transaction", "execute as a single transaction (if non-interactive)").Short('1').BoolVar(&args.SingleTransaction)
- kingpin.Flag("set", "set variable NAME to VALUE").Short('v').PlaceHolder(", --variable=NAME=VALUE").StringsVar(&args.Variables)
- // pset
- kingpin.Flag("pset", `set printing option VAR to ARG (see \pset command)`).Short('P').PlaceHolder("VAR[=ARG]").StringsVar(&args.PVariables)
- // pset flags
- kingpin.Flag("field-separator", `field separator for unaligned and CSV output (default "|" and ",")`).Short('F').SetValue(pset{args, []string{"fieldsep=%q", "csv_fieldsep=%q"}})
- kingpin.Flag("record-separator", `record separator for unaligned and CSV output (default \n)`).Short('R').SetValue(pset{args, []string{"recordsep=%q"}})
- kingpin.Flag("table-attr", "set HTML table tag attributes (e.g., width, border)").Short('T').SetValue(pset{args, []string{"tableattr=%q"}})
- type psetconfig struct {
- long string
- short rune
- help string
- vals []string
- }
- pc := func(long string, r rune, help string, vals ...string) psetconfig {
- return psetconfig{long, r, help, vals}
- }
- for _, c := range []psetconfig{
- pc("no-align", 'A', "unaligned table output mode", "format=unaligned"),
- pc("html", 'H', "HTML table output mode", "format=html"),
- pc("tuples-only", 't', "print rows only", "tuples_only=on"),
- pc("expanded", 'x', "turn on expanded table output", "expanded=on"),
- pc("field-separator-zero", 'z', "set field separator for unaligned and CSV output to zero byte", "fieldsep_zero=on"),
- pc("record-separator-zero", '0', "set record separator for unaligned and CSV output to zero byte", "recordsep_zero=on"),
- pc("json", 'J', "JSON output mode", "format=json"),
- pc("csv", 'C', "CSV output mode", "format=csv"),
- pc("vertical", 'G', "vertical output mode", "format=vertical"),
- } {
- // make copy of values for the callback closure (see https://stackoverflow.com/q/26692844)
- vals := make([]string, len(c.vals))
- copy(vals, c.vals)
- kingpin.Flag(c.long, c.help).Short(c.short).PlaceHolder("TEXT").PreAction(func(*kingpin.ParseContext) error {
- args.PVariables = append(args.PVariables, vals...)
- return nil
- }).Bool()
- }
- kingpin.Flag("quiet", "run quietly (no messages, only query output)").Short('q').PreAction(func(*kingpin.ParseContext) error {
- args.Variables = append(args.Variables, "QUIET=on")
- return nil
- }).Bool()
- // add --set as a hidden alias for --variable
- kingpin.Flag("variable", "set variable NAME to VALUE").Hidden().StringsVar(&args.Variables)
- // add --version flag
- kingpin.Flag("version", "display version and exit").PreAction(func(*kingpin.ParseContext) error {
- fmt.Fprintln(os.Stdout, text.CommandName, text.CommandVersion)
- os.Exit(0)
- return nil
- }).Bool()
- // hide help flag
- kingpin.HelpFlag.Short('h').Hidden()
- // parse
- kingpin.Parse()
- return args
-}
diff --git a/build.sh b/build.sh
index 9f9b5032411..9d68bf98cb8 100755
--- a/build.sh
+++ b/build.sh
@@ -102,7 +102,7 @@ if [[ "$PLATFORM" == "linux" && "$ARCH" != "$GOARCH" ]]; then
esac
LDARCH=$CARCH
if [[ "$ARCH" == "arm" ]]; then
- TAGS+=(no_netezza)
+ TAGS+=(no_netezza no_chai)
if [ -d /usr/arm-linux-$GNUTYPE ]; then
LDARCH=arm
elif [ -d /usr/arm-none-linux-$GNUTYPE ]; then
diff --git a/contrib/charts/area_density_stacked.vl.json b/contrib/charts/area_density_stacked.vl.json
new file mode 100644
index 00000000000..1a3667677be
--- /dev/null
+++ b/contrib/charts/area_density_stacked.vl.json
@@ -0,0 +1,22 @@
+{
+ "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
+ "title": "{{ header }}",
+ "width": 400,
+ "height": 80,
+ "data": {
+ "url": "data/penguins.json"
+ },
+ "mark": "area",
+ "transform": [
+ {
+ "density": "{{ x }}",
+ "groupby": ["Species"],
+ "extent": [2500, 6500]
+ }
+ ],
+ "encoding": {
+ "x": {"field": "value", "type": "quantitative", "title": "{{ title_x }}"},
+ "y": {"field": "density", "type": "quantitative", "stack": "zero"},
+ "color": {"field": "{{ field_x }}", "type": "nominal"}
+ }
+}
diff --git a/contrib/charts/area_density_stacked.vl.json.svg b/contrib/charts/area_density_stacked.vl.json.svg
new file mode 100644
index 00000000000..9b90000f2ad
--- /dev/null
+++ b/contrib/charts/area_density_stacked.vl.json.svg
@@ -0,0 +1 @@
+2,500 3,000 3,500 4,000 4,500 5,000 5,500 6,000 6,500 Body Mass (g) 0.000 0.001 0.002 density Adelie Chinstrap Gentoo Species Distribution of Body Mass of Penguins
\ No newline at end of file
diff --git a/contrib/charts/area_density_stacked.vl.json.svg.export.png b/contrib/charts/area_density_stacked.vl.json.svg.export.png
new file mode 100644
index 00000000000..08fc54b541b
Binary files /dev/null and b/contrib/charts/area_density_stacked.vl.json.svg.export.png differ
diff --git a/contrib/charts/penguins.json b/contrib/charts/penguins.json
new file mode 100644
index 00000000000..517b6d32671
--- /dev/null
+++ b/contrib/charts/penguins.json
@@ -0,0 +1,3098 @@
+[
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 39.1,
+ "Beak Depth (mm)": 18.7,
+ "Flipper Length (mm)": 181,
+ "Body Mass (g)": 3750,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 39.5,
+ "Beak Depth (mm)": 17.4,
+ "Flipper Length (mm)": 186,
+ "Body Mass (g)": 3800,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 40.3,
+ "Beak Depth (mm)": 18,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 3250,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": null,
+ "Beak Depth (mm)": null,
+ "Flipper Length (mm)": null,
+ "Body Mass (g)": null,
+ "Sex": null
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 36.7,
+ "Beak Depth (mm)": 19.3,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3450,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 39.3,
+ "Beak Depth (mm)": 20.6,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3650,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 38.9,
+ "Beak Depth (mm)": 17.8,
+ "Flipper Length (mm)": 181,
+ "Body Mass (g)": 3625,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 39.2,
+ "Beak Depth (mm)": 19.6,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 4675,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 34.1,
+ "Beak Depth (mm)": 18.1,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3475,
+ "Sex": null
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 42,
+ "Beak Depth (mm)": 20.2,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 4250,
+ "Sex": null
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 37.8,
+ "Beak Depth (mm)": 17.1,
+ "Flipper Length (mm)": 186,
+ "Body Mass (g)": 3300,
+ "Sex": null
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 37.8,
+ "Beak Depth (mm)": 17.3,
+ "Flipper Length (mm)": 180,
+ "Body Mass (g)": 3700,
+ "Sex": null
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 41.1,
+ "Beak Depth (mm)": 17.6,
+ "Flipper Length (mm)": 182,
+ "Body Mass (g)": 3200,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 38.6,
+ "Beak Depth (mm)": 21.2,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 3800,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 34.6,
+ "Beak Depth (mm)": 21.1,
+ "Flipper Length (mm)": 198,
+ "Body Mass (g)": 4400,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 36.6,
+ "Beak Depth (mm)": 17.8,
+ "Flipper Length (mm)": 185,
+ "Body Mass (g)": 3700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 38.7,
+ "Beak Depth (mm)": 19,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 3450,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 42.5,
+ "Beak Depth (mm)": 20.7,
+ "Flipper Length (mm)": 197,
+ "Body Mass (g)": 4500,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 34.4,
+ "Beak Depth (mm)": 18.4,
+ "Flipper Length (mm)": 184,
+ "Body Mass (g)": 3325,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 46,
+ "Beak Depth (mm)": 21.5,
+ "Flipper Length (mm)": 194,
+ "Body Mass (g)": 4200,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 37.8,
+ "Beak Depth (mm)": 18.3,
+ "Flipper Length (mm)": 174,
+ "Body Mass (g)": 3400,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 37.7,
+ "Beak Depth (mm)": 18.7,
+ "Flipper Length (mm)": 180,
+ "Body Mass (g)": 3600,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 35.9,
+ "Beak Depth (mm)": 19.2,
+ "Flipper Length (mm)": 189,
+ "Body Mass (g)": 3800,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 38.2,
+ "Beak Depth (mm)": 18.1,
+ "Flipper Length (mm)": 185,
+ "Body Mass (g)": 3950,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 38.8,
+ "Beak Depth (mm)": 17.2,
+ "Flipper Length (mm)": 180,
+ "Body Mass (g)": 3800,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 35.3,
+ "Beak Depth (mm)": 18.9,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3800,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 40.6,
+ "Beak Depth (mm)": 18.6,
+ "Flipper Length (mm)": 183,
+ "Body Mass (g)": 3550,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 40.5,
+ "Beak Depth (mm)": 17.9,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3200,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 37.9,
+ "Beak Depth (mm)": 18.6,
+ "Flipper Length (mm)": 172,
+ "Body Mass (g)": 3150,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 40.5,
+ "Beak Depth (mm)": 18.9,
+ "Flipper Length (mm)": 180,
+ "Body Mass (g)": 3950,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 39.5,
+ "Beak Depth (mm)": 16.7,
+ "Flipper Length (mm)": 178,
+ "Body Mass (g)": 3250,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 37.2,
+ "Beak Depth (mm)": 18.1,
+ "Flipper Length (mm)": 178,
+ "Body Mass (g)": 3900,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 39.5,
+ "Beak Depth (mm)": 17.8,
+ "Flipper Length (mm)": 188,
+ "Body Mass (g)": 3300,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 40.9,
+ "Beak Depth (mm)": 18.9,
+ "Flipper Length (mm)": 184,
+ "Body Mass (g)": 3900,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 36.4,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 3325,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 39.2,
+ "Beak Depth (mm)": 21.1,
+ "Flipper Length (mm)": 196,
+ "Body Mass (g)": 4150,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 38.8,
+ "Beak Depth (mm)": 20,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3950,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 42.2,
+ "Beak Depth (mm)": 18.5,
+ "Flipper Length (mm)": 180,
+ "Body Mass (g)": 3550,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 37.6,
+ "Beak Depth (mm)": 19.3,
+ "Flipper Length (mm)": 181,
+ "Body Mass (g)": 3300,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 39.8,
+ "Beak Depth (mm)": 19.1,
+ "Flipper Length (mm)": 184,
+ "Body Mass (g)": 4650,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 36.5,
+ "Beak Depth (mm)": 18,
+ "Flipper Length (mm)": 182,
+ "Body Mass (g)": 3150,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 40.8,
+ "Beak Depth (mm)": 18.4,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 3900,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 36,
+ "Beak Depth (mm)": 18.5,
+ "Flipper Length (mm)": 186,
+ "Body Mass (g)": 3100,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 44.1,
+ "Beak Depth (mm)": 19.7,
+ "Flipper Length (mm)": 196,
+ "Body Mass (g)": 4400,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 37,
+ "Beak Depth (mm)": 16.9,
+ "Flipper Length (mm)": 185,
+ "Body Mass (g)": 3000,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 39.6,
+ "Beak Depth (mm)": 18.8,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 4600,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 41.1,
+ "Beak Depth (mm)": 19,
+ "Flipper Length (mm)": 182,
+ "Body Mass (g)": 3425,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 37.5,
+ "Beak Depth (mm)": 18.9,
+ "Flipper Length (mm)": 179,
+ "Body Mass (g)": 2975,
+ "Sex": null
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 36,
+ "Beak Depth (mm)": 17.9,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3450,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 42.3,
+ "Beak Depth (mm)": 21.2,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 4150,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 39.6,
+ "Beak Depth (mm)": 17.7,
+ "Flipper Length (mm)": 186,
+ "Body Mass (g)": 3500,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 40.1,
+ "Beak Depth (mm)": 18.9,
+ "Flipper Length (mm)": 188,
+ "Body Mass (g)": 4300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 35,
+ "Beak Depth (mm)": 17.9,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3450,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 42,
+ "Beak Depth (mm)": 19.5,
+ "Flipper Length (mm)": 200,
+ "Body Mass (g)": 4050,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 34.5,
+ "Beak Depth (mm)": 18.1,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 2900,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 41.4,
+ "Beak Depth (mm)": 18.6,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 3700,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 39,
+ "Beak Depth (mm)": 17.5,
+ "Flipper Length (mm)": 186,
+ "Body Mass (g)": 3550,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 40.6,
+ "Beak Depth (mm)": 18.8,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3800,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 36.5,
+ "Beak Depth (mm)": 16.6,
+ "Flipper Length (mm)": 181,
+ "Body Mass (g)": 2850,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 37.6,
+ "Beak Depth (mm)": 19.1,
+ "Flipper Length (mm)": 194,
+ "Body Mass (g)": 3750,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 35.7,
+ "Beak Depth (mm)": 16.9,
+ "Flipper Length (mm)": 185,
+ "Body Mass (g)": 3150,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 41.3,
+ "Beak Depth (mm)": 21.1,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 4400,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 37.6,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 185,
+ "Body Mass (g)": 3600,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 41.1,
+ "Beak Depth (mm)": 18.2,
+ "Flipper Length (mm)": 192,
+ "Body Mass (g)": 4050,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 36.4,
+ "Beak Depth (mm)": 17.1,
+ "Flipper Length (mm)": 184,
+ "Body Mass (g)": 2850,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 41.6,
+ "Beak Depth (mm)": 18,
+ "Flipper Length (mm)": 192,
+ "Body Mass (g)": 3950,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 35.5,
+ "Beak Depth (mm)": 16.2,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 3350,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 41.1,
+ "Beak Depth (mm)": 19.1,
+ "Flipper Length (mm)": 188,
+ "Body Mass (g)": 4100,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 35.9,
+ "Beak Depth (mm)": 16.6,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3050,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 41.8,
+ "Beak Depth (mm)": 19.4,
+ "Flipper Length (mm)": 198,
+ "Body Mass (g)": 4450,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 33.5,
+ "Beak Depth (mm)": 19,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3600,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 39.7,
+ "Beak Depth (mm)": 18.4,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3900,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 39.6,
+ "Beak Depth (mm)": 17.2,
+ "Flipper Length (mm)": 196,
+ "Body Mass (g)": 3550,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 45.8,
+ "Beak Depth (mm)": 18.9,
+ "Flipper Length (mm)": 197,
+ "Body Mass (g)": 4150,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 35.5,
+ "Beak Depth (mm)": 17.5,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 42.8,
+ "Beak Depth (mm)": 18.5,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 4250,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 40.9,
+ "Beak Depth (mm)": 16.8,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 3700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 37.2,
+ "Beak Depth (mm)": 19.4,
+ "Flipper Length (mm)": 184,
+ "Body Mass (g)": 3900,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 36.2,
+ "Beak Depth (mm)": 16.1,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3550,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 42.1,
+ "Beak Depth (mm)": 19.1,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 4000,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 34.6,
+ "Beak Depth (mm)": 17.2,
+ "Flipper Length (mm)": 189,
+ "Body Mass (g)": 3200,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 42.9,
+ "Beak Depth (mm)": 17.6,
+ "Flipper Length (mm)": 196,
+ "Body Mass (g)": 4700,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 36.7,
+ "Beak Depth (mm)": 18.8,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3800,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 35.1,
+ "Beak Depth (mm)": 19.4,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 4200,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 37.3,
+ "Beak Depth (mm)": 17.8,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 3350,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 41.3,
+ "Beak Depth (mm)": 20.3,
+ "Flipper Length (mm)": 194,
+ "Body Mass (g)": 3550,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 36.3,
+ "Beak Depth (mm)": 19.5,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3800,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 36.9,
+ "Beak Depth (mm)": 18.6,
+ "Flipper Length (mm)": 189,
+ "Body Mass (g)": 3500,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 38.3,
+ "Beak Depth (mm)": 19.2,
+ "Flipper Length (mm)": 189,
+ "Body Mass (g)": 3950,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 38.9,
+ "Beak Depth (mm)": 18.8,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3600,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 35.7,
+ "Beak Depth (mm)": 18,
+ "Flipper Length (mm)": 202,
+ "Body Mass (g)": 3550,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 41.1,
+ "Beak Depth (mm)": 18.1,
+ "Flipper Length (mm)": 205,
+ "Body Mass (g)": 4300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 34,
+ "Beak Depth (mm)": 17.1,
+ "Flipper Length (mm)": 185,
+ "Body Mass (g)": 3400,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 39.6,
+ "Beak Depth (mm)": 18.1,
+ "Flipper Length (mm)": 186,
+ "Body Mass (g)": 4450,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 36.2,
+ "Beak Depth (mm)": 17.3,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3300,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 40.8,
+ "Beak Depth (mm)": 18.9,
+ "Flipper Length (mm)": 208,
+ "Body Mass (g)": 4300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 38.1,
+ "Beak Depth (mm)": 18.6,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 40.3,
+ "Beak Depth (mm)": 18.5,
+ "Flipper Length (mm)": 196,
+ "Body Mass (g)": 4350,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 33.1,
+ "Beak Depth (mm)": 16.1,
+ "Flipper Length (mm)": 178,
+ "Body Mass (g)": 2900,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 43.2,
+ "Beak Depth (mm)": 18.5,
+ "Flipper Length (mm)": 192,
+ "Body Mass (g)": 4100,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 35,
+ "Beak Depth (mm)": 17.9,
+ "Flipper Length (mm)": 192,
+ "Body Mass (g)": 3725,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 41,
+ "Beak Depth (mm)": 20,
+ "Flipper Length (mm)": 203,
+ "Body Mass (g)": 4725,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 37.7,
+ "Beak Depth (mm)": 16,
+ "Flipper Length (mm)": 183,
+ "Body Mass (g)": 3075,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 37.8,
+ "Beak Depth (mm)": 20,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 4250,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 37.9,
+ "Beak Depth (mm)": 18.6,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 2925,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 39.7,
+ "Beak Depth (mm)": 18.9,
+ "Flipper Length (mm)": 184,
+ "Body Mass (g)": 3550,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 38.6,
+ "Beak Depth (mm)": 17.2,
+ "Flipper Length (mm)": 199,
+ "Body Mass (g)": 3750,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 38.2,
+ "Beak Depth (mm)": 20,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3900,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 38.1,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 181,
+ "Body Mass (g)": 3175,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 43.2,
+ "Beak Depth (mm)": 19,
+ "Flipper Length (mm)": 197,
+ "Body Mass (g)": 4775,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 38.1,
+ "Beak Depth (mm)": 16.5,
+ "Flipper Length (mm)": 198,
+ "Body Mass (g)": 3825,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.6,
+ "Beak Depth (mm)": 20.3,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 4600,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 39.7,
+ "Beak Depth (mm)": 17.7,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3200,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 42.2,
+ "Beak Depth (mm)": 19.5,
+ "Flipper Length (mm)": 197,
+ "Body Mass (g)": 4275,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 39.6,
+ "Beak Depth (mm)": 20.7,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 3900,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 42.7,
+ "Beak Depth (mm)": 18.3,
+ "Flipper Length (mm)": 196,
+ "Body Mass (g)": 4075,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 38.6,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 188,
+ "Body Mass (g)": 2900,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 37.3,
+ "Beak Depth (mm)": 20.5,
+ "Flipper Length (mm)": 199,
+ "Body Mass (g)": 3775,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 35.7,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 189,
+ "Body Mass (g)": 3350,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 41.1,
+ "Beak Depth (mm)": 18.6,
+ "Flipper Length (mm)": 189,
+ "Body Mass (g)": 3325,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 36.2,
+ "Beak Depth (mm)": 17.2,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3150,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 37.7,
+ "Beak Depth (mm)": 19.8,
+ "Flipper Length (mm)": 198,
+ "Body Mass (g)": 3500,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 40.2,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 176,
+ "Body Mass (g)": 3450,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 41.4,
+ "Beak Depth (mm)": 18.5,
+ "Flipper Length (mm)": 202,
+ "Body Mass (g)": 3875,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 35.2,
+ "Beak Depth (mm)": 15.9,
+ "Flipper Length (mm)": 186,
+ "Body Mass (g)": 3050,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 40.6,
+ "Beak Depth (mm)": 19,
+ "Flipper Length (mm)": 199,
+ "Body Mass (g)": 4000,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 38.8,
+ "Beak Depth (mm)": 17.6,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 3275,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 41.5,
+ "Beak Depth (mm)": 18.3,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 4300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 39,
+ "Beak Depth (mm)": 17.1,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 3050,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 44.1,
+ "Beak Depth (mm)": 18,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4000,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 38.5,
+ "Beak Depth (mm)": 17.9,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3325,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Torgersen",
+ "Beak Length (mm)": 43.1,
+ "Beak Depth (mm)": 19.2,
+ "Flipper Length (mm)": 197,
+ "Body Mass (g)": 3500,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 36.8,
+ "Beak Depth (mm)": 18.5,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3500,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 37.5,
+ "Beak Depth (mm)": 18.5,
+ "Flipper Length (mm)": 199,
+ "Body Mass (g)": 4475,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 38.1,
+ "Beak Depth (mm)": 17.6,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3425,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 41.1,
+ "Beak Depth (mm)": 17.5,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3900,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 35.6,
+ "Beak Depth (mm)": 17.5,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 3175,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 40.2,
+ "Beak Depth (mm)": 20.1,
+ "Flipper Length (mm)": 200,
+ "Body Mass (g)": 3975,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 37,
+ "Beak Depth (mm)": 16.5,
+ "Flipper Length (mm)": 185,
+ "Body Mass (g)": 3400,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 39.7,
+ "Beak Depth (mm)": 17.9,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 4250,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 40.2,
+ "Beak Depth (mm)": 17.1,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3400,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 40.6,
+ "Beak Depth (mm)": 17.2,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3475,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 32.1,
+ "Beak Depth (mm)": 15.5,
+ "Flipper Length (mm)": 188,
+ "Body Mass (g)": 3050,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 40.7,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3725,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 37.3,
+ "Beak Depth (mm)": 16.8,
+ "Flipper Length (mm)": 192,
+ "Body Mass (g)": 3000,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 39,
+ "Beak Depth (mm)": 18.7,
+ "Flipper Length (mm)": 185,
+ "Body Mass (g)": 3650,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 39.2,
+ "Beak Depth (mm)": 18.6,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 4250,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 36.6,
+ "Beak Depth (mm)": 18.4,
+ "Flipper Length (mm)": 184,
+ "Body Mass (g)": 3475,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 36,
+ "Beak Depth (mm)": 17.8,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 3450,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 37.8,
+ "Beak Depth (mm)": 18.1,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3750,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 36,
+ "Beak Depth (mm)": 17.1,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Adelie",
+ "Island": "Dream",
+ "Beak Length (mm)": 41.5,
+ "Beak Depth (mm)": 18.5,
+ "Flipper Length (mm)": 201,
+ "Body Mass (g)": 4000,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 46.5,
+ "Beak Depth (mm)": 17.9,
+ "Flipper Length (mm)": 192,
+ "Body Mass (g)": 3500,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50,
+ "Beak Depth (mm)": 19.5,
+ "Flipper Length (mm)": 196,
+ "Body Mass (g)": 3900,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 51.3,
+ "Beak Depth (mm)": 19.2,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3650,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 45.4,
+ "Beak Depth (mm)": 18.7,
+ "Flipper Length (mm)": 188,
+ "Body Mass (g)": 3525,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 52.7,
+ "Beak Depth (mm)": 19.8,
+ "Flipper Length (mm)": 197,
+ "Body Mass (g)": 3725,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 45.2,
+ "Beak Depth (mm)": 17.8,
+ "Flipper Length (mm)": 198,
+ "Body Mass (g)": 3950,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 46.1,
+ "Beak Depth (mm)": 18.2,
+ "Flipper Length (mm)": 178,
+ "Body Mass (g)": 3250,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 51.3,
+ "Beak Depth (mm)": 18.2,
+ "Flipper Length (mm)": 197,
+ "Body Mass (g)": 3750,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 46,
+ "Beak Depth (mm)": 18.9,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 4150,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 51.3,
+ "Beak Depth (mm)": 19.9,
+ "Flipper Length (mm)": 198,
+ "Body Mass (g)": 3700,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 46.6,
+ "Beak Depth (mm)": 17.8,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3800,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 51.7,
+ "Beak Depth (mm)": 20.3,
+ "Flipper Length (mm)": 194,
+ "Body Mass (g)": 3775,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 47,
+ "Beak Depth (mm)": 17.3,
+ "Flipper Length (mm)": 185,
+ "Body Mass (g)": 3700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 52,
+ "Beak Depth (mm)": 18.1,
+ "Flipper Length (mm)": 201,
+ "Body Mass (g)": 4050,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 45.9,
+ "Beak Depth (mm)": 17.1,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3575,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.5,
+ "Beak Depth (mm)": 19.6,
+ "Flipper Length (mm)": 201,
+ "Body Mass (g)": 4050,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.3,
+ "Beak Depth (mm)": 20,
+ "Flipper Length (mm)": 197,
+ "Body Mass (g)": 3300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 58,
+ "Beak Depth (mm)": 17.8,
+ "Flipper Length (mm)": 181,
+ "Body Mass (g)": 3700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 46.4,
+ "Beak Depth (mm)": 18.6,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3450,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 49.2,
+ "Beak Depth (mm)": 18.2,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 4400,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 42.4,
+ "Beak Depth (mm)": 17.3,
+ "Flipper Length (mm)": 181,
+ "Body Mass (g)": 3600,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 48.5,
+ "Beak Depth (mm)": 17.5,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 3400,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 43.2,
+ "Beak Depth (mm)": 16.6,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 2900,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.6,
+ "Beak Depth (mm)": 19.4,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3800,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 46.7,
+ "Beak Depth (mm)": 17.9,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 3300,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 52,
+ "Beak Depth (mm)": 19,
+ "Flipper Length (mm)": 197,
+ "Body Mass (g)": 4150,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.5,
+ "Beak Depth (mm)": 18.4,
+ "Flipper Length (mm)": 200,
+ "Body Mass (g)": 3400,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 49.5,
+ "Beak Depth (mm)": 19,
+ "Flipper Length (mm)": 200,
+ "Body Mass (g)": 3800,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 46.4,
+ "Beak Depth (mm)": 17.8,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 3700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 52.8,
+ "Beak Depth (mm)": 20,
+ "Flipper Length (mm)": 205,
+ "Body Mass (g)": 4550,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 40.9,
+ "Beak Depth (mm)": 16.6,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3200,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 54.2,
+ "Beak Depth (mm)": 20.8,
+ "Flipper Length (mm)": 201,
+ "Body Mass (g)": 4300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 42.5,
+ "Beak Depth (mm)": 16.7,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3350,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 51,
+ "Beak Depth (mm)": 18.8,
+ "Flipper Length (mm)": 203,
+ "Body Mass (g)": 4100,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 49.7,
+ "Beak Depth (mm)": 18.6,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 3600,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 47.5,
+ "Beak Depth (mm)": 16.8,
+ "Flipper Length (mm)": 199,
+ "Body Mass (g)": 3900,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 47.6,
+ "Beak Depth (mm)": 18.3,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 3850,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 52,
+ "Beak Depth (mm)": 20.7,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4800,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 46.9,
+ "Beak Depth (mm)": 16.6,
+ "Flipper Length (mm)": 192,
+ "Body Mass (g)": 2700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 53.5,
+ "Beak Depth (mm)": 19.9,
+ "Flipper Length (mm)": 205,
+ "Body Mass (g)": 4500,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 49,
+ "Beak Depth (mm)": 19.5,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 3950,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 46.2,
+ "Beak Depth (mm)": 17.5,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3650,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.9,
+ "Beak Depth (mm)": 19.1,
+ "Flipper Length (mm)": 196,
+ "Body Mass (g)": 3550,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 45.5,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 196,
+ "Body Mass (g)": 3500,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.9,
+ "Beak Depth (mm)": 17.9,
+ "Flipper Length (mm)": 196,
+ "Body Mass (g)": 3675,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.8,
+ "Beak Depth (mm)": 18.5,
+ "Flipper Length (mm)": 201,
+ "Body Mass (g)": 4450,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.1,
+ "Beak Depth (mm)": 17.9,
+ "Flipper Length (mm)": 190,
+ "Body Mass (g)": 3400,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 49,
+ "Beak Depth (mm)": 19.6,
+ "Flipper Length (mm)": 212,
+ "Body Mass (g)": 4300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 51.5,
+ "Beak Depth (mm)": 18.7,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3250,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 49.8,
+ "Beak Depth (mm)": 17.3,
+ "Flipper Length (mm)": 198,
+ "Body Mass (g)": 3675,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 48.1,
+ "Beak Depth (mm)": 16.4,
+ "Flipper Length (mm)": 199,
+ "Body Mass (g)": 3325,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 51.4,
+ "Beak Depth (mm)": 19,
+ "Flipper Length (mm)": 201,
+ "Body Mass (g)": 3950,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 45.7,
+ "Beak Depth (mm)": 17.3,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3600,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.7,
+ "Beak Depth (mm)": 19.7,
+ "Flipper Length (mm)": 203,
+ "Body Mass (g)": 4050,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 42.5,
+ "Beak Depth (mm)": 17.3,
+ "Flipper Length (mm)": 187,
+ "Body Mass (g)": 3350,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 52.2,
+ "Beak Depth (mm)": 18.8,
+ "Flipper Length (mm)": 197,
+ "Body Mass (g)": 3450,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 45.2,
+ "Beak Depth (mm)": 16.6,
+ "Flipper Length (mm)": 191,
+ "Body Mass (g)": 3250,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 49.3,
+ "Beak Depth (mm)": 19.9,
+ "Flipper Length (mm)": 203,
+ "Body Mass (g)": 4050,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.2,
+ "Beak Depth (mm)": 18.8,
+ "Flipper Length (mm)": 202,
+ "Body Mass (g)": 3800,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 45.6,
+ "Beak Depth (mm)": 19.4,
+ "Flipper Length (mm)": 194,
+ "Body Mass (g)": 3525,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 51.9,
+ "Beak Depth (mm)": 19.5,
+ "Flipper Length (mm)": 206,
+ "Body Mass (g)": 3950,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 46.8,
+ "Beak Depth (mm)": 16.5,
+ "Flipper Length (mm)": 189,
+ "Body Mass (g)": 3650,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 45.7,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 195,
+ "Body Mass (g)": 3650,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 55.8,
+ "Beak Depth (mm)": 19.8,
+ "Flipper Length (mm)": 207,
+ "Body Mass (g)": 4000,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 43.5,
+ "Beak Depth (mm)": 18.1,
+ "Flipper Length (mm)": 202,
+ "Body Mass (g)": 3400,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 49.6,
+ "Beak Depth (mm)": 18.2,
+ "Flipper Length (mm)": 193,
+ "Body Mass (g)": 3775,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.8,
+ "Beak Depth (mm)": 19,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4100,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Chinstrap",
+ "Island": "Dream",
+ "Beak Length (mm)": 50.2,
+ "Beak Depth (mm)": 18.7,
+ "Flipper Length (mm)": 198,
+ "Body Mass (g)": 3775,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.1,
+ "Beak Depth (mm)": 13.2,
+ "Flipper Length (mm)": 211,
+ "Body Mass (g)": 4500,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50,
+ "Beak Depth (mm)": 16.3,
+ "Flipper Length (mm)": 230,
+ "Body Mass (g)": 5700,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.7,
+ "Beak Depth (mm)": 14.1,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4450,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50,
+ "Beak Depth (mm)": 15.2,
+ "Flipper Length (mm)": 218,
+ "Body Mass (g)": 5700,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 47.6,
+ "Beak Depth (mm)": 14.5,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 5400,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.5,
+ "Beak Depth (mm)": 13.5,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4550,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.4,
+ "Beak Depth (mm)": 14.6,
+ "Flipper Length (mm)": 211,
+ "Body Mass (g)": 4800,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.7,
+ "Beak Depth (mm)": 15.3,
+ "Flipper Length (mm)": 219,
+ "Body Mass (g)": 5200,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 43.3,
+ "Beak Depth (mm)": 13.4,
+ "Flipper Length (mm)": 209,
+ "Body Mass (g)": 4400,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.8,
+ "Beak Depth (mm)": 15.4,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 5150,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 40.9,
+ "Beak Depth (mm)": 13.7,
+ "Flipper Length (mm)": 214,
+ "Body Mass (g)": 4650,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49,
+ "Beak Depth (mm)": 16.1,
+ "Flipper Length (mm)": 216,
+ "Body Mass (g)": 5550,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.5,
+ "Beak Depth (mm)": 13.7,
+ "Flipper Length (mm)": 214,
+ "Body Mass (g)": 4650,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.4,
+ "Beak Depth (mm)": 14.6,
+ "Flipper Length (mm)": 213,
+ "Body Mass (g)": 5850,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.8,
+ "Beak Depth (mm)": 14.6,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4200,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.3,
+ "Beak Depth (mm)": 15.7,
+ "Flipper Length (mm)": 217,
+ "Body Mass (g)": 5850,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 42,
+ "Beak Depth (mm)": 13.5,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4150,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.2,
+ "Beak Depth (mm)": 15.2,
+ "Flipper Length (mm)": 221,
+ "Body Mass (g)": 6300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.2,
+ "Beak Depth (mm)": 14.5,
+ "Flipper Length (mm)": 209,
+ "Body Mass (g)": 4800,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.7,
+ "Beak Depth (mm)": 15.1,
+ "Flipper Length (mm)": 222,
+ "Body Mass (g)": 5350,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50.2,
+ "Beak Depth (mm)": 14.3,
+ "Flipper Length (mm)": 218,
+ "Body Mass (g)": 5700,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.1,
+ "Beak Depth (mm)": 14.5,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 5000,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.5,
+ "Beak Depth (mm)": 14.5,
+ "Flipper Length (mm)": 213,
+ "Body Mass (g)": 4400,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.3,
+ "Beak Depth (mm)": 15.8,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 5050,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 42.9,
+ "Beak Depth (mm)": 13.1,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 5000,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.1,
+ "Beak Depth (mm)": 15.1,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 5100,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 44.5,
+ "Beak Depth (mm)": 14.3,
+ "Flipper Length (mm)": 216,
+ "Body Mass (g)": 4100,
+ "Sex": null
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 47.8,
+ "Beak Depth (mm)": 15,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 5650,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.2,
+ "Beak Depth (mm)": 14.3,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4600,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50,
+ "Beak Depth (mm)": 15.3,
+ "Flipper Length (mm)": 220,
+ "Body Mass (g)": 5550,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 47.3,
+ "Beak Depth (mm)": 15.3,
+ "Flipper Length (mm)": 222,
+ "Body Mass (g)": 5250,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 42.8,
+ "Beak Depth (mm)": 14.2,
+ "Flipper Length (mm)": 209,
+ "Body Mass (g)": 4700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.1,
+ "Beak Depth (mm)": 14.5,
+ "Flipper Length (mm)": 207,
+ "Body Mass (g)": 5050,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 59.6,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 230,
+ "Body Mass (g)": 6050,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.1,
+ "Beak Depth (mm)": 14.8,
+ "Flipper Length (mm)": 220,
+ "Body Mass (g)": 5150,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.4,
+ "Beak Depth (mm)": 16.3,
+ "Flipper Length (mm)": 220,
+ "Body Mass (g)": 5400,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 42.6,
+ "Beak Depth (mm)": 13.7,
+ "Flipper Length (mm)": 213,
+ "Body Mass (g)": 4950,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 44.4,
+ "Beak Depth (mm)": 17.3,
+ "Flipper Length (mm)": 219,
+ "Body Mass (g)": 5250,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 44,
+ "Beak Depth (mm)": 13.6,
+ "Flipper Length (mm)": 208,
+ "Body Mass (g)": 4350,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.7,
+ "Beak Depth (mm)": 15.7,
+ "Flipper Length (mm)": 208,
+ "Body Mass (g)": 5350,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 42.7,
+ "Beak Depth (mm)": 13.7,
+ "Flipper Length (mm)": 208,
+ "Body Mass (g)": 3950,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.6,
+ "Beak Depth (mm)": 16,
+ "Flipper Length (mm)": 225,
+ "Body Mass (g)": 5700,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.3,
+ "Beak Depth (mm)": 13.7,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4300,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.6,
+ "Beak Depth (mm)": 15,
+ "Flipper Length (mm)": 216,
+ "Body Mass (g)": 4750,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50.5,
+ "Beak Depth (mm)": 15.9,
+ "Flipper Length (mm)": 222,
+ "Body Mass (g)": 5550,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 43.6,
+ "Beak Depth (mm)": 13.9,
+ "Flipper Length (mm)": 217,
+ "Body Mass (g)": 4900,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.5,
+ "Beak Depth (mm)": 13.9,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4200,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50.5,
+ "Beak Depth (mm)": 15.9,
+ "Flipper Length (mm)": 225,
+ "Body Mass (g)": 5400,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 44.9,
+ "Beak Depth (mm)": 13.3,
+ "Flipper Length (mm)": 213,
+ "Body Mass (g)": 5100,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.2,
+ "Beak Depth (mm)": 15.8,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 5300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.6,
+ "Beak Depth (mm)": 14.2,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4850,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.5,
+ "Beak Depth (mm)": 14.1,
+ "Flipper Length (mm)": 220,
+ "Body Mass (g)": 5300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.1,
+ "Beak Depth (mm)": 14.4,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4400,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50.1,
+ "Beak Depth (mm)": 15,
+ "Flipper Length (mm)": 225,
+ "Body Mass (g)": 5000,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.5,
+ "Beak Depth (mm)": 14.4,
+ "Flipper Length (mm)": 217,
+ "Body Mass (g)": 4900,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45,
+ "Beak Depth (mm)": 15.4,
+ "Flipper Length (mm)": 220,
+ "Body Mass (g)": 5050,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 43.8,
+ "Beak Depth (mm)": 13.9,
+ "Flipper Length (mm)": 208,
+ "Body Mass (g)": 4300,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.5,
+ "Beak Depth (mm)": 15,
+ "Flipper Length (mm)": 220,
+ "Body Mass (g)": 5000,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 43.2,
+ "Beak Depth (mm)": 14.5,
+ "Flipper Length (mm)": 208,
+ "Body Mass (g)": 4450,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50.4,
+ "Beak Depth (mm)": 15.3,
+ "Flipper Length (mm)": 224,
+ "Body Mass (g)": 5550,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.3,
+ "Beak Depth (mm)": 13.8,
+ "Flipper Length (mm)": 208,
+ "Body Mass (g)": 4200,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.2,
+ "Beak Depth (mm)": 14.9,
+ "Flipper Length (mm)": 221,
+ "Body Mass (g)": 5300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.7,
+ "Beak Depth (mm)": 13.9,
+ "Flipper Length (mm)": 214,
+ "Body Mass (g)": 4400,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 54.3,
+ "Beak Depth (mm)": 15.7,
+ "Flipper Length (mm)": 231,
+ "Body Mass (g)": 5650,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.8,
+ "Beak Depth (mm)": 14.2,
+ "Flipper Length (mm)": 219,
+ "Body Mass (g)": 4700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.8,
+ "Beak Depth (mm)": 16.8,
+ "Flipper Length (mm)": 230,
+ "Body Mass (g)": 5700,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.2,
+ "Beak Depth (mm)": 14.4,
+ "Flipper Length (mm)": 214,
+ "Body Mass (g)": 4650,
+ "Sex": null
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.5,
+ "Beak Depth (mm)": 16.2,
+ "Flipper Length (mm)": 229,
+ "Body Mass (g)": 5800,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 43.5,
+ "Beak Depth (mm)": 14.2,
+ "Flipper Length (mm)": 220,
+ "Body Mass (g)": 4700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50.7,
+ "Beak Depth (mm)": 15,
+ "Flipper Length (mm)": 223,
+ "Body Mass (g)": 5550,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 47.7,
+ "Beak Depth (mm)": 15,
+ "Flipper Length (mm)": 216,
+ "Body Mass (g)": 4750,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.4,
+ "Beak Depth (mm)": 15.6,
+ "Flipper Length (mm)": 221,
+ "Body Mass (g)": 5000,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.2,
+ "Beak Depth (mm)": 15.6,
+ "Flipper Length (mm)": 221,
+ "Body Mass (g)": 5100,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.5,
+ "Beak Depth (mm)": 14.8,
+ "Flipper Length (mm)": 217,
+ "Body Mass (g)": 5200,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.4,
+ "Beak Depth (mm)": 15,
+ "Flipper Length (mm)": 216,
+ "Body Mass (g)": 4700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.6,
+ "Beak Depth (mm)": 16,
+ "Flipper Length (mm)": 230,
+ "Body Mass (g)": 5800,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 47.5,
+ "Beak Depth (mm)": 14.2,
+ "Flipper Length (mm)": 209,
+ "Body Mass (g)": 4600,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 51.1,
+ "Beak Depth (mm)": 16.3,
+ "Flipper Length (mm)": 220,
+ "Body Mass (g)": 6000,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.2,
+ "Beak Depth (mm)": 13.8,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 4750,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.2,
+ "Beak Depth (mm)": 16.4,
+ "Flipper Length (mm)": 223,
+ "Body Mass (g)": 5950,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.1,
+ "Beak Depth (mm)": 14.5,
+ "Flipper Length (mm)": 212,
+ "Body Mass (g)": 4625,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 52.5,
+ "Beak Depth (mm)": 15.6,
+ "Flipper Length (mm)": 221,
+ "Body Mass (g)": 5450,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 47.4,
+ "Beak Depth (mm)": 14.6,
+ "Flipper Length (mm)": 212,
+ "Body Mass (g)": 4725,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50,
+ "Beak Depth (mm)": 15.9,
+ "Flipper Length (mm)": 224,
+ "Body Mass (g)": 5350,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 44.9,
+ "Beak Depth (mm)": 13.8,
+ "Flipper Length (mm)": 212,
+ "Body Mass (g)": 4750,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50.8,
+ "Beak Depth (mm)": 17.3,
+ "Flipper Length (mm)": 228,
+ "Body Mass (g)": 5600,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 43.4,
+ "Beak Depth (mm)": 14.4,
+ "Flipper Length (mm)": 218,
+ "Body Mass (g)": 4600,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 51.3,
+ "Beak Depth (mm)": 14.2,
+ "Flipper Length (mm)": 218,
+ "Body Mass (g)": 5300,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 47.5,
+ "Beak Depth (mm)": 14,
+ "Flipper Length (mm)": 212,
+ "Body Mass (g)": 4875,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 52.1,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 230,
+ "Body Mass (g)": 5550,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 47.5,
+ "Beak Depth (mm)": 15,
+ "Flipper Length (mm)": 218,
+ "Body Mass (g)": 4950,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 52.2,
+ "Beak Depth (mm)": 17.1,
+ "Flipper Length (mm)": 228,
+ "Body Mass (g)": 5400,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.5,
+ "Beak Depth (mm)": 14.5,
+ "Flipper Length (mm)": 212,
+ "Body Mass (g)": 4750,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.5,
+ "Beak Depth (mm)": 16.1,
+ "Flipper Length (mm)": 224,
+ "Body Mass (g)": 5650,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 44.5,
+ "Beak Depth (mm)": 14.7,
+ "Flipper Length (mm)": 214,
+ "Body Mass (g)": 4850,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50.8,
+ "Beak Depth (mm)": 15.7,
+ "Flipper Length (mm)": 226,
+ "Body Mass (g)": 5200,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.4,
+ "Beak Depth (mm)": 15.8,
+ "Flipper Length (mm)": 216,
+ "Body Mass (g)": 4925,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.9,
+ "Beak Depth (mm)": 14.6,
+ "Flipper Length (mm)": 222,
+ "Body Mass (g)": 4875,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.4,
+ "Beak Depth (mm)": 14.4,
+ "Flipper Length (mm)": 203,
+ "Body Mass (g)": 4625,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 51.1,
+ "Beak Depth (mm)": 16.5,
+ "Flipper Length (mm)": 225,
+ "Body Mass (g)": 5250,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.5,
+ "Beak Depth (mm)": 15,
+ "Flipper Length (mm)": 219,
+ "Body Mass (g)": 4850,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 55.9,
+ "Beak Depth (mm)": 17,
+ "Flipper Length (mm)": 228,
+ "Body Mass (g)": 5600,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 47.2,
+ "Beak Depth (mm)": 15.5,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 4975,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.1,
+ "Beak Depth (mm)": 15,
+ "Flipper Length (mm)": 228,
+ "Body Mass (g)": 5500,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 47.3,
+ "Beak Depth (mm)": 13.8,
+ "Flipper Length (mm)": 216,
+ "Body Mass (g)": 4725,
+ "Sex": null
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.8,
+ "Beak Depth (mm)": 16.1,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 5500,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 41.7,
+ "Beak Depth (mm)": 14.7,
+ "Flipper Length (mm)": 210,
+ "Body Mass (g)": 4700,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 53.4,
+ "Beak Depth (mm)": 15.8,
+ "Flipper Length (mm)": 219,
+ "Body Mass (g)": 5500,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 43.3,
+ "Beak Depth (mm)": 14,
+ "Flipper Length (mm)": 208,
+ "Body Mass (g)": 4575,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.1,
+ "Beak Depth (mm)": 15.1,
+ "Flipper Length (mm)": 209,
+ "Body Mass (g)": 5500,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50.5,
+ "Beak Depth (mm)": 15.2,
+ "Flipper Length (mm)": 216,
+ "Body Mass (g)": 5000,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.8,
+ "Beak Depth (mm)": 15.9,
+ "Flipper Length (mm)": 229,
+ "Body Mass (g)": 5950,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 43.5,
+ "Beak Depth (mm)": 15.2,
+ "Flipper Length (mm)": 213,
+ "Body Mass (g)": 4650,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 51.5,
+ "Beak Depth (mm)": 16.3,
+ "Flipper Length (mm)": 230,
+ "Body Mass (g)": 5500,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.2,
+ "Beak Depth (mm)": 14.1,
+ "Flipper Length (mm)": 217,
+ "Body Mass (g)": 4375,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 55.1,
+ "Beak Depth (mm)": 16,
+ "Flipper Length (mm)": 230,
+ "Body Mass (g)": 5850,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 44.5,
+ "Beak Depth (mm)": 15.7,
+ "Flipper Length (mm)": 217,
+ "Body Mass (g)": 4875,
+ "Sex": "."
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 48.8,
+ "Beak Depth (mm)": 16.2,
+ "Flipper Length (mm)": 222,
+ "Body Mass (g)": 6000,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 47.2,
+ "Beak Depth (mm)": 13.7,
+ "Flipper Length (mm)": 214,
+ "Body Mass (g)": 4925,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": null,
+ "Beak Depth (mm)": null,
+ "Flipper Length (mm)": null,
+ "Body Mass (g)": null,
+ "Sex": null
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 46.8,
+ "Beak Depth (mm)": 14.3,
+ "Flipper Length (mm)": 215,
+ "Body Mass (g)": 4850,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 50.4,
+ "Beak Depth (mm)": 15.7,
+ "Flipper Length (mm)": 222,
+ "Body Mass (g)": 5750,
+ "Sex": "MALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 45.2,
+ "Beak Depth (mm)": 14.8,
+ "Flipper Length (mm)": 212,
+ "Body Mass (g)": 5200,
+ "Sex": "FEMALE"
+ },
+ {
+ "Species": "Gentoo",
+ "Island": "Biscoe",
+ "Beak Length (mm)": 49.9,
+ "Beak Depth (mm)": 16.1,
+ "Flipper Length (mm)": 213,
+ "Body Mass (g)": 5400,
+ "Sex": "MALE"
+ }
+]
\ No newline at end of file
diff --git a/contrib/config.yaml b/contrib/config.yaml
new file mode 100644
index 00000000000..40f74a08b9d
--- /dev/null
+++ b/contrib/config.yaml
@@ -0,0 +1,47 @@
+---
+# named connections
+connections:
+ my_couchbase_conn: couchbase://Administrator:P4ssw0rd@localhost
+ my_clickhouse_conn: clickhouse://clickhouse:P4ssw0rd@localhost
+ css: cassandra://cassandra:cassandra@localhost
+ fsl: flightsql://flight_username:P4ssw0rd@localhost
+ gdr:
+ protocol: godror
+ username: system
+ password: P4ssw0rd
+ hostname: localhost
+ port: 1521
+ database: free
+ ign: ignite://ignite:ignite@localhost
+ mss: sqlserver://sa:Adm1nP@ssw0rd@localhost
+ mym: mysql://root:P4ssw0rd@localhost
+ myz: mymysql://root:P4ssw0rd@localhost
+ ora: oracle://system:P4ssw0rd@localhost/free
+ pgs: postgres://postgres:P4ssw0rd@localhost
+ pgx: pgx://postgres:P4ssw0rd@localhost
+ vrt:
+ proto: vertica
+ user: vertica
+ pass: vertica
+ host: localhost
+ sll:
+ file: /path/to/mydb.sqlite3
+ mdc: modernsqlite:test.db
+ dkd: test.duckdb
+ zzz: ["databricks", "token:dapi*****@adb-*************.azuredatabricks.net:443/sql/protocolv1/o/*********/*******"]
+ zz2:
+ proto: mysql
+ user: 'my username'
+ pass: 'my password!'
+ host: localhost
+ opts:
+ opt1: "😀"
+# startup script
+init: |
+ \echo welcome to the jungle `date`
+ \set SYNTAX_HL_STYLE paraiso-dark
+# charts path
+charts_path: charts
+# defined queries
+queries:
+ q1:
diff --git a/contrib/couchbase/README.md b/contrib/couchbase/README.md
index 5ef4ad85142..d083861c49a 100644
--- a/contrib/couchbase/README.md
+++ b/contrib/couchbase/README.md
@@ -1,4 +1,8 @@
-# Setting up Couchbase
+# Couchbase Notes
+
+```sh
+$ podman volume create couchbase-data
+```
After running the docker image, browse to http://127.0.0.1:8091/ui/index.html
and manually configure database.
diff --git a/contrib/couchbase/podman-config b/contrib/couchbase/podman-config
index a6c81274ee1..6fa84850e71 100644
--- a/contrib/couchbase/podman-config
+++ b/contrib/couchbase/podman-config
@@ -1,3 +1,4 @@
NAME=couchbase
IMAGE=docker.io/library/couchbase
PUBLISH=8091-8094:8091-8094
+VOLUME=couchbase-data:/opt/couchbase/var
diff --git a/contrib/couchbase/usql-config b/contrib/couchbase/usql-config
index 1d2fc6b0cb4..359692deecf 100644
--- a/contrib/couchbase/usql-config
+++ b/contrib/couchbase/usql-config
@@ -1,2 +1,3 @@
-DB="couchbase://localhost:8093"
-VSQL="select version() as version;"
+# NOTE: this will only work after setting up a database on http://localhost:8091/
+DB="couchbase://Administrator:P4ssw0rd@localhost"
+VSQL="select raw ds_version() as version;"
diff --git a/contrib/db2/README.md b/contrib/db2/README.md
index 4912c3a903c..c812141c7ed 100644
--- a/contrib/db2/README.md
+++ b/contrib/db2/README.md
@@ -1,4 +1,4 @@
-# Configuring db2
+# db2 Notes
1. Install unixodbc:
diff --git a/contrib/ignite/README.md b/contrib/ignite/README.md
index d0a343f03fd..ad0e105a269 100644
--- a/contrib/ignite/README.md
+++ b/contrib/ignite/README.md
@@ -1,4 +1,4 @@
-# Setting up Ignite
+# Ignite Notes
After starting the database, run `activate.sh`:
diff --git a/contrib/oracle/README.md b/contrib/oracle/README.md
index ab67287dc74..399e07571d6 100644
--- a/contrib/oracle/README.md
+++ b/contrib/oracle/README.md
@@ -1,39 +1,5 @@
# Oracle Notes
-1. Clone:
-
-```sh
-$ mkdir -p ~/src/oracle && cd ~/src/oracle
-$ git clone https://github.com/oracle/docker-images.git
-```
-
-2. Download `LINUX.X64_193000_db_home.zip` -> `~/src/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0/`:
-
-```sh
-$ mv ~/Downloads/LINUX.X64_193000_db_home.zip ~/src/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0/
-```
-3. Build:
-
-```sh
-$ cd ~/src/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles/
-$ ./buildDockerImage.sh -v 19.3.0 -e
-```
-
-4. Fix ["out-of-band" issue][out-of-band-issue] ([see also GitHub issue][out-of-band-github]) by adding `userland-proxy: false` to `/etc/docker/daemon.json`
-
-[out-of-band-issue]: https://medium.com/@FranckPachot/19c-instant-client-and-docker-1566630ab20e
-[out-of-band-github]: https://github.com/oracle/docker-images/issues/1352
-
-5. Create storage directory, and change ownership:
-
-```sh
-$ mkdir -p /media/src/opt/oracle
-$ sudo chown -R 54321:54321 /media/src/opt/oracle
-```
-
-6. Start:
-
```sh
-$ cd $GOPATH/src/github.com/xo/usql/contrib
-$ ./docker-run.sh oracle
+$ podman volume create oracle-data
```
diff --git a/contrib/podman-run.sh b/contrib/podman-run.sh
index 753b509dbe1..08be2fc0ede 100755
--- a/contrib/podman-run.sh
+++ b/contrib/podman-run.sh
@@ -41,6 +41,7 @@ podman_run() {
echo "error: $BASE/podman-config doesn't exist"
exit 1
fi
+
# load parameters from podman-config
unset IMAGE NAME PUBLISH ENV VOLUME NETWORK PRIVILEGED HOSTNAME PARAMS CMD
source $BASE/podman-config
@@ -48,6 +49,7 @@ podman_run() {
echo "error: $BASE/podman-config is invalid"
exit 1
fi
+
# setup params
PARAMS=()
for k in NAME PUBLISH ENV VOLUME NETWORK PRIVILEGED HOSTNAME; do
@@ -59,11 +61,13 @@ podman_run() {
done
fi
done
+
# determine if image exists
EXISTS=$(podman image ls -q $IMAGE)
if [[ "$UPDATE" == "0" && -z "$EXISTS" ]]; then
UPDATE=1
fi
+
# show parameters
echo "-------------------------------------------"
echo "NAME: $NAME $HOSTNAME"
@@ -74,6 +78,8 @@ podman_run() {
echo "NETWORK: $NETWORK"
echo "PRIVILEGED: $PRIVILEGED"
echo "CMD: $CMD"
+ echo
+
# update
if [[ "$UPDATE" == "1" && "$TARGET" != "oracle" ]]; then
if [ ! -f $BASE/Dockerfile ]; then
@@ -95,21 +101,24 @@ podman_run() {
)
fi
fi
- # stop any running images
+
+ # stop and remove
if [ ! -z "$(podman ps -q --filter "name=$NAME")" ]; then
(set -x;
podman stop $NAME
)
fi
-
if [ ! -z "$(podman ps -q -a --filter "name=$NAME")" ]; then
(set -x;
podman rm -f $NAME
)
fi
+
+ # start
(set -ex;
podman run --detach --rm ${PARAMS[@]} $IMAGE $CMD
)
+ echo
}
pushd $SRC &> /dev/null
diff --git a/contrib/usql-test.sh b/contrib/usql-test.sh
index 26d0cfa740b..75dea565b7e 100755
--- a/contrib/usql-test.sh
+++ b/contrib/usql-test.sh
@@ -1,28 +1,25 @@
#!/bin/bash
-SRC=$(realpath $(cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd ))
+SRC=$(realpath $(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd))
USQL=$(which usql)
if [ -f $SRC/../usql ]; then
USQL=$(realpath $SRC/../usql)
fi
+export USQL_SHOW_HOST_INFORMATION=false
for TARGET in $SRC/*/usql-config; do
NAME=$(basename $(dirname $TARGET))
if [[ ! -z "$(podman ps -q --filter "name=$NAME")" || "$NAME" == "duckdb" || "$NAME" == "sqlite3" ]]; then
unset DB VSQL
source $TARGET
- if [ -z "$DB" ]; then
- echo "error: DB not defined in $TARGET/usql-config!"
- exit 1
- fi
- if [ -z "$VSQL" ]; then
- echo "error: VSQL not defined in $TARGET/usql-config!"
- exit 1
+ if [[ -z "$DB" || -z "$VSQL" ]]; then
+ echo -e "ERROR: DB or VSQL not defined in $TARGET!\n"
+ continue
fi
(set -x;
- USQL_SHOW_HOST_INFORMATION=false \
- $USQL "$DB" -X -J -c "$VSQL"
+ $USQL "$DB" -X -J -c "$VSQL"
)
+ echo
fi
done
diff --git a/contrib/usqlpass b/contrib/usqlpass
index 1a364d137d9..17a67d27c68 100644
--- a/contrib/usqlpass
+++ b/contrib/usqlpass
@@ -6,6 +6,7 @@ postgres:*:*:*:postgres:P4ssw0rd
cql:*:*:*:cassandra:cassandra
clickhouse:*:*:*:clickhouse:P4ssw0rd
+couchbase:*:*:*:Administrator:P4ssw0rd
godror:*:*:*:system:P4ssw0rd
ignite:*:*:*:ignite:ignite
mymysql:*:*:*:root:P4ssw0rd
diff --git a/drivers/adodb/adodb.go b/drivers/adodb/adodb.go
index c5c91d99114..d84f8bb40d7 100644
--- a/drivers/adodb/adodb.go
+++ b/drivers/adodb/adodb.go
@@ -8,15 +8,30 @@ package adodb
import (
"database/sql"
+ "regexp"
+ "strings"
_ "github.com/mattn/go-adodb" // DRIVER
+ "github.com/xo/dburl"
"github.com/xo/usql/drivers"
)
func init() {
+ endRE := regexp.MustCompile(`;?\s*$`)
+ endAnchorRE := regexp.MustCompile(`(?i)\send\s*;\s*$`)
drivers.Register("adodb", drivers.Driver{
AllowMultilineComments: true,
AllowCComments: true,
+ Process: func(u *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) {
+ // trim last ; but only when not END;
+ if s := strings.ToLower(u.Query().Get("usql_trim")); s != "" && s != "off" && s != "0" && s != "false" {
+ if !endAnchorRE.MatchString(sqlstr) {
+ sqlstr = endRE.ReplaceAllString(sqlstr, "")
+ }
+ }
+ typ, q := drivers.QueryExecType(prefix, sqlstr)
+ return typ, sqlstr, q, nil
+ },
RowsAffected: func(res sql.Result) (int64, error) {
return 0, nil
},
diff --git a/drivers/athena/athena.go b/drivers/athena/athena.go
index cf4f9083d29..b263bffbfcd 100644
--- a/drivers/athena/athena.go
+++ b/drivers/athena/athena.go
@@ -8,6 +8,7 @@ import (
"regexp"
_ "github.com/uber/athenadriver/go" // DRIVER: awsathena
+ "github.com/xo/dburl"
"github.com/xo/usql/drivers"
)
@@ -15,7 +16,7 @@ func init() {
endRE := regexp.MustCompile(`;?\s*$`)
drivers.Register("awsathena", drivers.Driver{
AllowMultilineComments: true,
- Process: func(prefix string, sqlstr string) (string, string, bool, error) {
+ Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) {
sqlstr = endRE.ReplaceAllString(sqlstr, "")
typ, q := drivers.QueryExecType(prefix, sqlstr)
return typ, sqlstr, q, nil
diff --git a/drivers/chai/chai.go b/drivers/chai/chai.go
new file mode 100644
index 00000000000..cf35e9bc86e
--- /dev/null
+++ b/drivers/chai/chai.go
@@ -0,0 +1,13 @@
+// Package chai defines and registers usql's ChaiSQL driver.
+//
+// See: https://github.com/chaisql/chai
+package chai
+
+import (
+ _ "github.com/chaisql/chai/driver" // DRIVER
+ "github.com/xo/usql/drivers"
+)
+
+func init() {
+ drivers.Register("chai", drivers.Driver{})
+}
diff --git a/drivers/clickhouse/clickhouse_test.go b/drivers/clickhouse/clickhouse_test.go
index 0b72a76abca..d138f186673 100644
--- a/drivers/clickhouse/clickhouse_test.go
+++ b/drivers/clickhouse/clickhouse_test.go
@@ -1,18 +1,25 @@
package clickhouse_test
import (
+ "context"
"database/sql"
"flag"
"fmt"
+ "github.com/xo/dburl"
+ "github.com/xo/usql/drivers"
"log"
"os"
"path/filepath"
"testing"
+ "time"
dt "github.com/ory/dockertest/v3"
"github.com/xo/usql/drivers/clickhouse"
"github.com/xo/usql/drivers/metadata"
"github.com/yookoala/realpath"
+
+ _ "github.com/xo/usql/drivers/csvq"
+ _ "github.com/xo/usql/drivers/moderncsqlite"
)
// db is the database connection.
@@ -59,7 +66,7 @@ func doMain(m *testing.M, cleanup bool) (int, error) {
if cleanup {
defer func() {
if err := pool.Purge(db.res); err != nil {
- fmt.Fprintf(os.Stderr, "error: could not purge resoure: %v\n", err)
+ fmt.Fprintf(os.Stderr, "error: could not purge resource: %v\n", err)
}
}()
}
@@ -85,7 +92,7 @@ func TestSchemas(t *testing.T) {
if err != nil {
t.Fatalf("could not read schemas: %v", err)
}
- checkNames(t, "schema", res, "default", "system", "tutorial", "tutorial_unexpected", "INFORMATION_SCHEMA", "information_schema")
+ checkNames(t, "schema", res, "default", "system", "tutorial", "tutorial_unexpected", "INFORMATION_SCHEMA", "information_schema", "copy_test")
}
func TestTables(t *testing.T) {
@@ -119,6 +126,75 @@ func TestColumns(t *testing.T) {
checkNames(t, "column", res, colNames()...)
}
+func TestCopy(t *testing.T) {
+ // Tests with csvq source DB. That driver doesn't support ScanType()
+ for _, destTableSpec := range []string{
+ "copy_test.dest",
+ "copy_test.dest(StringCol, NumCol)",
+ "insert into copy_test.dest values(?, ?)",
+ } {
+ t.Run("csvq_"+destTableSpec, func(t *testing.T) {
+ testCopy(t, destTableSpec, "csvq:.")
+ })
+ }
+ // Test with a driver that supports ScanType()
+ t.Run("sqlite", func(t *testing.T) {
+ testCopy(t, "copy_test.dest", "moderncsqlite://:memory:")
+ })
+}
+
+func testCopy(t *testing.T, destTableSpec string, sourceDbUrlStr string) {
+ ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
+ defer cancel()
+ _, err := db.db.ExecContext(ctx, "truncate table copy_test.dest")
+ if err != nil {
+ t.Fatalf("could not truncate copy_test table: %v", err)
+ }
+ // Prepare copy destination URL
+ port := db.res.GetPort("9000/tcp")
+ dbUrlStr := fmt.Sprintf("clickhouse://127.0.0.1:%s", port)
+ dbUrl, err := dburl.Parse(dbUrlStr)
+ if err != nil {
+ t.Fatalf("could not parse clickhouse url %s: %v", dbUrlStr, err)
+ }
+ // Prepare source data
+ sourceDbUrl, err := dburl.Parse(sourceDbUrlStr)
+ if err != nil {
+ t.Fatalf("could not parse source DB url %s: %v", sourceDbUrlStr, err)
+ }
+ sourceDb, err := drivers.Open(ctx, sourceDbUrl, nil, nil)
+ if err != nil {
+ t.Fatalf("could not open sourceDb: %v", err)
+ }
+ defer sourceDb.Close()
+ rows, err := sourceDb.QueryContext(ctx, "select 'string', 1")
+ if err != nil {
+ t.Fatalf("could not retrieve source rows: %v", err)
+ }
+ // Do Copy, ignoring copied rows count because clickhouse driver doesn't report RowsAffected
+ _, err = drivers.Copy(ctx, dbUrl, nil, nil, rows, destTableSpec)
+ if err != nil {
+ t.Fatalf("copy failed: %v", err)
+ }
+ rows, err = db.db.QueryContext(ctx, "select StringCol, NumCol from copy_test.dest")
+ if err != nil {
+ t.Fatalf("failed to query: %v", err)
+ }
+ defer rows.Close()
+ var copiedString string
+ var copiedNum int
+ if !rows.Next() {
+ t.Fatalf("nothing copied")
+ }
+ err = rows.Scan(&copiedString, &copiedNum)
+ if err != nil {
+ t.Fatalf("could not read copied data: %v", err)
+ }
+ if copiedString != "string" || copiedNum != 1 {
+ t.Fatalf("copied data differs: %s != string, %d != 1", copiedString, copiedNum)
+ }
+}
+
func checkNames(t *testing.T, typ string, res interface{ Next() bool }, exp ...string) {
n := make(map[string]bool)
for _, s := range exp {
@@ -798,7 +874,6 @@ func funcNames() []string {
"max2",
"maxIntersections",
"maxIntersectionsPosition",
- "maxMap",
"maxMappedArrays",
"meanZTest",
"median",
@@ -818,7 +893,6 @@ func funcNames() []string {
"mid",
"min",
"min2",
- "minMap",
"minMappedArrays",
"minSampleSizeContinous",
"minSampleSizeConversion",
@@ -1143,7 +1217,6 @@ func funcNames() []string {
"sum",
"sumCount",
"sumKahan",
- "sumMap",
"sumMapFiltered",
"sumMapFilteredWithOverflow",
"sumMapWithOverflow",
@@ -1435,6 +1508,7 @@ func colNames() []string {
"CLID",
"ClientEventTime",
"ClientIP",
+ "ClientIP",
"ClientIP6",
"ClientTimeZone",
"CodeVersion",
diff --git a/drivers/clickhouse/testdata/clickhouse.sql b/drivers/clickhouse/testdata/clickhouse.sql
index 78f1870025a..b14a35c6e34 100644
--- a/drivers/clickhouse/testdata/clickhouse.sql
+++ b/drivers/clickhouse/testdata/clickhouse.sql
@@ -340,3 +340,11 @@ CREATE TABLE tutorial_unexpected.hits_v1 (
)
ENGINE = MergeTree()
ORDER BY (Unexpected);
+
+CREATE DATABASE copy_test;
+CREATE TABLE copy_test.dest (
+ StringCol String,
+ NumCol UInt32
+)
+ENGINE = MergeTree()
+ORDER BY (StringCol);
\ No newline at end of file
diff --git a/drivers/completer/completer.go b/drivers/completer/completer.go
index 4294eb00fef..23be68e0943 100644
--- a/drivers/completer/completer.go
+++ b/drivers/completer/completer.go
@@ -122,60 +122,65 @@ func NewDefaultCompleter(opts ...Option) readline.AutoCompleter {
backslashCommands: []string{
`\!`,
`\?`,
+ `\C`,
+ `\H`,
+ `\T`,
+ `\Z`,
`\a`,
`\begin`,
+ `\bind`,
`\c`,
- `\connect`,
- `\C`,
`\cd`,
`\commit`,
+ `\connect`,
`\conninfo`,
- `\copyright`,
`\copy`,
+ `\copyright`,
+ `\cset`,
`\d+`,
+ `\dS+`,
+ `\dS`,
`\da+`,
- `\da`,
`\daS+`,
`\daS`,
+ `\da`,
`\df+`,
- `\df`,
`\dfS+`,
`\dfS`,
+ `\df`,
`\di+`,
- `\di`,
`\diS+`,
`\diS`,
+ `\di`,
`\dm+`,
- `\dm`,
`\dmS+`,
`\dmS`,
+ `\dm`,
`\dn+`,
- `\dn`,
`\dnS+`,
`\dnS`,
+ `\dn`,
`\drivers`,
`\ds+`,
- `\ds`,
- `\dS+`,
- `\dS`,
`\dsS+`,
`\dsS`,
+ `\ds`,
`\dt+`,
- `\dt`,
`\dtS+`,
`\dtS`,
+ `\dt`,
`\dv+`,
- `\dv`,
`\dvS+`,
`\dvS`,
+ `\dv`,
`\e`,
`\echo`,
`\f`,
`\g`,
+ `\getenv`,
`\gexec`,
`\gset`,
`\gx`,
- `\H`,
`\i`,
`\ir`,
`\l+`,
@@ -191,13 +196,11 @@ func NewDefaultCompleter(opts ...Option) readline.AutoCompleter {
`\set`,
`\setenv`,
`\t`,
- `\T`,
`\timing`,
`\unset`,
`\w`,
`\watch`,
`\x`,
- `\Z`,
},
}
for _, o := range opts {
diff --git a/drivers/couchbase/couchbase.go b/drivers/couchbase/couchbase.go
index ff5a218c4d1..4114bc63847 100644
--- a/drivers/couchbase/couchbase.go
+++ b/drivers/couchbase/couchbase.go
@@ -4,6 +4,8 @@
package couchbase
import (
+ "context"
+ "strconv"
"strings"
_ "github.com/couchbase/go_n1ql" // DRIVER: n1ql
@@ -13,6 +15,27 @@ import (
func init() {
drivers.Register("n1ql", drivers.Driver{
AllowMultilineComments: true,
+ Version: func(ctx context.Context, db drivers.DB) (string, error) {
+ ver := ""
+ /*
+ var buf []byte
+ if err := db.QueryRowContext(ctx, `SELECT ds_version() AS version`).Scan(&buf); err == nil {
+ var m map[string]string
+ if err := json.Unmarshal(buf, &m); err == nil {
+ if s, ok := m["version"]; ok {
+ ver = s
+ }
+ }
+ }
+ */
+ var v string
+ if err := db.QueryRowContext(ctx, `SELECT RAW ds_version()`).Scan(&v); err == nil {
+ if s, err := strconv.Unquote(v); err == nil {
+ ver = s
+ }
+ }
+ return "Couchbase " + ver, nil
+ },
Err: func(err error) (string, string) {
return "", strings.TrimPrefix(err.Error(), "N1QL: ")
},
diff --git a/drivers/csvq/csvq.go b/drivers/csvq/csvq.go
index 4493558e025..ba09636608b 100644
--- a/drivers/csvq/csvq.go
+++ b/drivers/csvq/csvq.go
@@ -11,6 +11,7 @@ import (
"github.com/mithrandie/csvq-driver" // DRIVER
"github.com/mithrandie/csvq/lib/query"
+ "github.com/xo/dburl"
"github.com/xo/usql/drivers"
)
@@ -18,7 +19,7 @@ func init() {
csvq.SetStdout(query.NewDiscard())
drivers.Register("csvq", drivers.Driver{
AllowMultilineComments: true,
- Process: func(prefix string, sqlstr string) (string, string, bool, error) {
+ Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) {
typ, q := drivers.QueryExecType(prefix, sqlstr)
if strings.HasPrefix(prefix, "SHOW") {
csvq.SetStdout(os.Stdout)
diff --git a/drivers/databend/databend.go b/drivers/databend/databend.go
index f5437fc3570..18998529826 100644
--- a/drivers/databend/databend.go
+++ b/drivers/databend/databend.go
@@ -1,12 +1,12 @@
// Package databend defines and registers usql's Databend driver.
//
-// See: https://github.com/databendcloud/databend-go
+// See: https://github.com/datafuselabs/databend-go
package databend
import (
"io"
- _ "github.com/databendcloud/databend-go" // DRIVER
+ _ "github.com/datafuselabs/databend-go" // DRIVER
"github.com/xo/usql/drivers"
"github.com/xo/usql/drivers/metadata"
infos "github.com/xo/usql/drivers/metadata/informationschema"
diff --git a/drivers/drivers.go b/drivers/drivers.go
index dc8e21d5f96..2a721a9c0d4 100644
--- a/drivers/drivers.go
+++ b/drivers/drivers.go
@@ -74,7 +74,9 @@ type Driver struct {
// IsPasswordErr will be used by IsPasswordErr if defined.
IsPasswordErr func(error) bool
// Process will be used by Process if defined.
- Process func(string, string) (string, string, bool, error)
+ Process func(*dburl.URL, string, string) (string, string, bool, error)
+ // ColumnTypes is a callback that will be used if
+ ColumnTypes func(*sql.ColumnType) (interface{}, error)
// RowsAffected will be used by RowsAffected if defined.
RowsAffected func(sql.Result) (int64, error)
// Err will be used by Error.Error if defined.
@@ -246,13 +248,18 @@ func User(ctx context.Context, u *dburl.URL, db DB) (string, error) {
// Process processes the sql query for a driver.
func Process(u *dburl.URL, prefix, sqlstr string) (string, string, bool, error) {
if d, ok := drivers[u.Driver]; ok && d.Process != nil {
- a, b, c, err := d.Process(prefix, sqlstr)
+ a, b, c, err := d.Process(u, prefix, sqlstr)
return a, b, c, WrapErr(u.Driver, err)
}
typ, q := QueryExecType(prefix, sqlstr)
return typ, sqlstr, q, nil
}
+// ColumnTypes returns the column types callback for a driver.
+func ColumnTypes(u *dburl.URL) func(*sql.ColumnType) (interface{}, error) {
+ return drivers[u.Driver].ColumnTypes
+}
+
// IsPasswordErr returns true if an err is a password error for a driver.
func IsPasswordErr(u *dburl.URL, err error) bool {
drv := u.Driver
@@ -533,16 +540,12 @@ func CopyWithInsert(placeholder func(int) string) func(ctx context.Context, db *
if !strings.HasPrefix(strings.ToLower(query), "insert into") {
leftParen := strings.IndexRune(table, '(')
if leftParen == -1 {
- colStmt, err := db.PrepareContext(ctx, "SELECT * FROM "+table+" WHERE 1=0")
- if err != nil {
- return 0, fmt.Errorf("failed to prepare query to determine target table columns: %w", err)
- }
- defer colStmt.Close()
- colRows, err := colStmt.QueryContext(ctx)
+ colRows, err := db.QueryContext(ctx, "SELECT * FROM "+table+" WHERE 1=0")
if err != nil {
return 0, fmt.Errorf("failed to execute query to determine target table columns: %w", err)
}
columns, err := colRows.Columns()
+ _ = colRows.Close()
if err != nil {
return 0, fmt.Errorf("failed to fetch target table columns: %w", err)
}
@@ -569,8 +572,11 @@ func CopyWithInsert(placeholder func(int) string) func(ctx context.Context, db *
return 0, fmt.Errorf("failed to fetch source column types: %w", err)
}
values := make([]interface{}, clen)
+ valueRefs := make([]reflect.Value, clen)
+ actuals := make([]interface{}, clen)
for i := 0; i < len(columnTypes); i++ {
- values[i] = reflect.New(columnTypes[i].ScanType()).Interface()
+ valueRefs[i] = reflect.New(columnTypes[i].ScanType())
+ values[i] = valueRefs[i].Interface()
}
var n int64
for rows.Next() {
@@ -578,7 +584,12 @@ func CopyWithInsert(placeholder func(int) string) func(ctx context.Context, db *
if err != nil {
return n, fmt.Errorf("failed to scan row: %w", err)
}
- res, err := stmt.ExecContext(ctx, values...)
+ //We can't use values... in Exec() below, because some drivers
+ //don't accept pointer to an argument instead of the arg itself.
+ for i := range values {
+ actuals[i] = valueRefs[i].Elem().Interface()
+ }
+ res, err := stmt.ExecContext(ctx, actuals...)
if err != nil {
return n, fmt.Errorf("failed to exec insert: %w", err)
}
@@ -597,3 +608,7 @@ func CopyWithInsert(placeholder func(int) string) func(ctx context.Context, db *
return n, rows.Err()
}
}
+
+func init() {
+ dburl.OdbcIgnoreQueryPrefixes = []string{"usql_"}
+}
diff --git a/drivers/drivers_test.go b/drivers/drivers_test.go
index 1ed8cd5e7c3..ead41f786ee 100644
--- a/drivers/drivers_test.go
+++ b/drivers/drivers_test.go
@@ -115,6 +115,10 @@ var (
DSN: "trino://test@localhost:%s/tpch/sf1",
DockerPort: "8080/tcp",
},
+ "csvq": {
+ // go test sets working directory to current package regardless of initial working directory
+ DSN: "csvq://./testdata/csvq",
+ },
}
cleanup bool
)
@@ -144,30 +148,21 @@ func TestMain(m *testing.M) {
}
for dbName, db := range dbs {
- var ok bool
- db.Resource, ok = pool.ContainerByName(db.RunOptions.Name)
- if !ok {
- buildOpts := &dt.BuildOptions{
- ContextDir: "./testdata/docker",
- BuildArgs: db.BuildArgs,
- }
- db.Resource, err = pool.BuildAndRunWithBuildOptions(buildOpts, db.RunOptions)
- if err != nil {
- log.Fatalf("Could not start %s: %s", dbName, err)
- }
- }
-
- hostPort := db.Resource.GetPort(db.DockerPort)
- db.URL, err = dburl.Parse(fmt.Sprintf(db.DSN, hostPort))
+ dsn, hostPort := getConnInfo(dbName, db, pool)
+ db.URL, err = dburl.Parse(dsn)
if err != nil {
log.Fatalf("Failed to parse %s URL %s: %v", dbName, db.DSN, err)
}
if len(db.Exec) != 0 {
+ readyDSN := db.ReadyDSN
if db.ReadyDSN == "" {
- db.ReadyDSN = db.DSN
+ readyDSN = db.DSN
}
- readyURL, err := dburl.Parse(fmt.Sprintf(db.ReadyDSN, hostPort))
+ if hostPort != "" {
+ readyDSN = fmt.Sprintf(db.ReadyDSN, hostPort)
+ }
+ readyURL, err := dburl.Parse(readyDSN)
if err != nil {
log.Fatalf("Failed to parse %s ready URL %s: %v", dbName, db.ReadyDSN, err)
}
@@ -205,8 +200,10 @@ func TestMain(m *testing.M) {
// You can't defer this because os.Exit doesn't care for defer
if cleanup {
for _, db := range dbs {
- if err := pool.Purge(db.Resource); err != nil {
- log.Fatal("Could not purge resource: ", err)
+ if db.Resource != nil {
+ if err := pool.Purge(db.Resource); err != nil {
+ log.Fatal("Could not purge resource: ", err)
+ }
}
}
}
@@ -214,6 +211,35 @@ func TestMain(m *testing.M) {
os.Exit(code)
}
+func getConnInfo(dbName string, db *Database, pool *dt.Pool) (string, string) {
+ if db.RunOptions == nil {
+ return db.DSN, ""
+ }
+
+ var ok bool
+ db.Resource, ok = pool.ContainerByName(db.RunOptions.Name)
+ if ok && !db.Resource.Container.State.Running {
+ err := db.Resource.Close()
+ if err != nil {
+ log.Fatalf("Failed to clean up stale container %s: %s", dbName, err)
+ }
+ ok = false
+ }
+ if !ok {
+ buildOpts := &dt.BuildOptions{
+ ContextDir: "./testdata/docker",
+ BuildArgs: db.BuildArgs,
+ }
+ var err error
+ db.Resource, err = pool.BuildAndRunWithBuildOptions(buildOpts, db.RunOptions)
+ if err != nil {
+ log.Fatalf("Failed to start %s: %s", dbName, err)
+ }
+ }
+ hostPort := db.Resource.GetPort(db.DockerPort)
+ return fmt.Sprintf(db.DSN, hostPort), hostPort
+}
+
func TestWriter(t *testing.T) {
type testFunc struct {
label string
@@ -422,6 +448,15 @@ func TestCopy(t *testing.T) {
src: "select * from staff",
dest: "staff_copy",
},
+ {
+ dbName: "pgsql",
+ setupQueries: []setupQuery{
+ {query: "DROP TABLE staff_copy"},
+ {query: "CREATE TABLE staff_copy AS SELECT * FROM staff WHERE 0=1", check: true},
+ },
+ src: "select * from staff",
+ dest: "public.staff_copy",
+ },
{
dbName: "pgx",
setupQueries: []setupQuery{
@@ -431,6 +466,15 @@ func TestCopy(t *testing.T) {
src: "select * from staff",
dest: "staff_copy",
},
+ {
+ dbName: "pgx",
+ setupQueries: []setupQuery{
+ {query: "DROP TABLE staff_copy"},
+ {query: "CREATE TABLE staff_copy AS SELECT * FROM staff WHERE 0=1", check: true},
+ },
+ src: "select * from staff",
+ dest: "public.staff_copy",
+ },
{
dbName: "mysql",
setupQueries: []setupQuery{
@@ -449,6 +493,14 @@ func TestCopy(t *testing.T) {
src: "select first_name, last_name, address_id, picture, email, store_id, active, username, password, last_update from staff",
dest: "staff_copy(first_name, last_name, address_id, picture, email, store_id, active, username, password, last_update)",
},
+ {
+ dbName: "csvq",
+ setupQueries: []setupQuery{
+ {query: "CREATE TABLE IF NOT EXISTS staff_copy AS SELECT * FROM `staff.csv` WHERE 0=1", check: true},
+ },
+ src: "select first_name, last_name, address_id, email, store_id, active, username, password, last_update from staff",
+ dest: "staff_copy",
+ },
}
for _, test := range testCases {
db, ok := dbs[test.dbName]
@@ -456,30 +508,33 @@ func TestCopy(t *testing.T) {
continue
}
- // TODO test copy from a different DB, maybe csvq?
- // TODO test copy from same DB
+ t.Run(test.dbName, func(t *testing.T) {
- for _, q := range test.setupQueries {
- _, err := db.DB.Exec(q.query)
- if q.check && err != nil {
- log.Fatalf("Failed to run setup query `%s`: %v", q.query, err)
+ // TODO test copy from a different DB, maybe csvq?
+ // TODO test copy from same DB
+
+ for _, q := range test.setupQueries {
+ _, err := db.DB.Exec(q.query)
+ if q.check && err != nil {
+ t.Fatalf("Failed to run setup query `%s`: %v", q.query, err)
+ }
+ }
+ rows, err := pg.DB.Query(test.src)
+ if err != nil {
+ t.Fatalf("Could not get rows to copy: %v", err)
}
- }
- rows, err := pg.DB.Query(test.src)
- if err != nil {
- log.Fatalf("Could not get rows to copy: %v", err)
- }
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- var rlen int64 = 1
- n, err := drivers.Copy(ctx, db.URL, nil, nil, rows, test.dest)
- if err != nil {
- log.Fatalf("Could not copy: %v", err)
- }
- if n != rlen {
- log.Fatalf("Expected to copy %d rows but got %d", rlen, n)
- }
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+ var rlen int64 = 1
+ n, err := drivers.Copy(ctx, db.URL, nil, nil, rows, test.dest)
+ if err != nil {
+ t.Fatalf("Could not copy: %v", err)
+ }
+ if n != rlen {
+ t.Fatalf("Expected to copy %d rows but got %d", rlen, n)
+ }
+ })
}
}
diff --git a/drivers/duckdb/duckdb.go b/drivers/duckdb/duckdb.go
index ddb00bbd950..909dbc22422 100644
--- a/drivers/duckdb/duckdb.go
+++ b/drivers/duckdb/duckdb.go
@@ -5,15 +5,137 @@ package duckdb
import (
"context"
+ "database/sql"
+ "fmt"
"io"
+ "strings"
_ "github.com/marcboeker/go-duckdb" // DRIVER
"github.com/xo/usql/drivers"
"github.com/xo/usql/drivers/metadata"
+ infos "github.com/xo/usql/drivers/metadata/informationschema"
mymeta "github.com/xo/usql/drivers/metadata/mysql"
)
+type metaReader struct {
+ metadata.LoggingReader
+}
+
+var (
+ _ metadata.CatalogReader = &metaReader{}
+ _ metadata.ColumnStatReader = &metaReader{}
+)
+
+func (r metaReader) Catalogs(metadata.Filter) (*metadata.CatalogSet, error) {
+ qstr := `SHOW catalogs`
+ rows, closeRows, err := r.Query(qstr)
+ if err != nil {
+ return nil, err
+ }
+ defer closeRows()
+
+ results := []metadata.Catalog{}
+ for rows.Next() {
+ rec := metadata.Catalog{}
+ err = rows.Scan(&rec.Catalog)
+ if err != nil {
+ return nil, err
+ }
+ results = append(results, rec)
+ }
+ if rows.Err() != nil {
+ return nil, rows.Err()
+ }
+ return metadata.NewCatalogSet(results), nil
+}
+
+func (r metaReader) ColumnStats(f metadata.Filter) (*metadata.ColumnStatSet, error) {
+ names := []string{}
+ if f.Catalog != "" {
+ names = append(names, f.Catalog+".")
+ }
+ if f.Schema != "" {
+ names = append(names, f.Schema+".")
+ }
+ names = append(names, f.Parent)
+ rows, closeRows, err := r.Query(fmt.Sprintf("SHOW STATS FOR %s", strings.Join(names, "")))
+ if err != nil {
+ return nil, err
+ }
+ defer closeRows()
+
+ results := []metadata.ColumnStat{}
+ for rows.Next() {
+ rec := metadata.ColumnStat{Catalog: f.Catalog, Schema: f.Schema, Table: f.Parent}
+ name := sql.NullString{}
+ avgWidth := sql.NullInt32{}
+ numDistinct := sql.NullInt64{}
+ nullFrac := sql.NullFloat64{}
+ numRows := sql.NullInt64{}
+ min := sql.NullString{}
+ max := sql.NullString{}
+ err = rows.Scan(
+ &name,
+ &avgWidth,
+ &numDistinct,
+ &nullFrac,
+ &numRows,
+ &min,
+ &max,
+ )
+ if err != nil {
+ return nil, err
+ }
+ if !name.Valid {
+ continue
+ }
+ rec.Name = name.String
+ if avgWidth.Valid {
+ rec.AvgWidth = int(avgWidth.Int32)
+ }
+ if numDistinct.Valid {
+ rec.NumDistinct = numDistinct.Int64
+ }
+ if nullFrac.Valid {
+ rec.NullFrac = nullFrac.Float64
+ }
+ if min.Valid {
+ rec.Min = min.String
+ }
+ if max.Valid {
+ rec.Max = max.String
+ }
+ results = append(results, rec)
+ }
+ if rows.Err() != nil {
+ return nil, rows.Err()
+ }
+
+ return metadata.NewColumnStatSet(results), nil
+}
+
func init() {
+ newReader := func(db drivers.DB, opts ...metadata.ReaderOption) metadata.Reader {
+ ir := infos.New(
+ infos.WithPlaceholder(func(int) string { return "?" }),
+ infos.WithCustomClauses(map[infos.ClauseName]string{
+ infos.ColumnsColumnSize: "0",
+ infos.ColumnsNumericScale: "0",
+ infos.ColumnsNumericPrecRadix: "0",
+ infos.ColumnsCharOctetLength: "0",
+ }),
+ infos.WithFunctions(false),
+ infos.WithSequences(false),
+ infos.WithIndexes(false),
+ infos.WithConstraints(false),
+ infos.WithColumnPrivileges(false),
+ infos.WithUsagePrivileges(false),
+ )(db, opts...)
+ mr := &metaReader{
+ LoggingReader: metadata.NewLoggingReader(db, opts...),
+ }
+ return metadata.NewPluginReader(ir, mr)
+ }
drivers.Register("duckdb", drivers.Driver{
AllowMultilineComments: true,
Version: func(ctx context.Context, db drivers.DB) (string, error) {
@@ -24,9 +146,9 @@ func init() {
}
return "DuckDB " + ver, nil
},
- NewMetadataReader: mymeta.NewReader,
+ NewMetadataReader: newReader,
NewMetadataWriter: func(db drivers.DB, w io.Writer, opts ...metadata.ReaderOption) metadata.Writer {
- return metadata.NewDefaultWriter(mymeta.NewReader(db, opts...))(db, w)
+ return metadata.NewDefaultWriter(newReader(db, opts...))(db, w)
},
Copy: drivers.CopyWithInsert(func(int) string { return "?" }),
NewCompleter: mymeta.NewCompleter,
diff --git a/drivers/flightsql/flightsql.go b/drivers/flightsql/flightsql.go
index d15dd171d7d..da7e1b4a035 100644
--- a/drivers/flightsql/flightsql.go
+++ b/drivers/flightsql/flightsql.go
@@ -4,7 +4,7 @@
package flightsql
import (
- _ "github.com/apache/arrow/go/v12/arrow/flight/flightsql/driver" // DRIVER
+ _ "github.com/apache/arrow/go/v16/arrow/flight/flightsql/driver" // DRIVER
"github.com/xo/usql/drivers"
)
diff --git a/drivers/genji/genji.go b/drivers/genji/genji.go
deleted file mode 100644
index af9cc352222..00000000000
--- a/drivers/genji/genji.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Package genji defines and registers usql's Genji driver.
-//
-// Group: bad
-// See: https://github.com/genjidb/genji
-package genji
-
-import (
- _ "github.com/genjidb/genji/driver" // DRIVER
- "github.com/xo/usql/drivers"
-)
-
-func init() {
- drivers.Register("genji", drivers.Driver{})
-}
diff --git a/drivers/metadata/informationschema/metadata.go b/drivers/metadata/informationschema/metadata.go
index ea97bfe1f6f..4fdf25f97de 100644
--- a/drivers/metadata/informationschema/metadata.go
+++ b/drivers/metadata/informationschema/metadata.go
@@ -192,7 +192,7 @@ func WithCurrentSchema(expr string) metadata.ReaderOption {
}
}
-// WithDataTypeFormatter function to build updated string represenation of data type
+// WithDataTypeFormatter function to build updated string representation of data type
// from Column
func WithDataTypeFormatter(f func(metadata.Column) string) metadata.ReaderOption {
return func(r metadata.Reader) {
@@ -606,7 +606,7 @@ JOIN information_schema.columns c ON
return metadata.NewIndexColumnSet(results), nil
}
-// Constraintes from selected catalog (or all, if empty), matching schemas and names
+// Constraints from selected catalog (or all, if empty), matching schemas and names
func (s InformationSchema) Constraints(f metadata.Filter) (*metadata.ConstraintSet, error) {
if !s.hasConstraints {
return nil, text.ErrNotSupported
diff --git a/drivers/odbc/odbc.go b/drivers/odbc/odbc.go
index 1f64384d06a..abbe4851e5f 100644
--- a/drivers/odbc/odbc.go
+++ b/drivers/odbc/odbc.go
@@ -6,15 +6,29 @@
package odbc
import (
+ "regexp"
"strings"
"github.com/alexbrainman/odbc" // DRIVER
+ "github.com/xo/dburl"
"github.com/xo/usql/drivers"
)
func init() {
+ endRE := regexp.MustCompile(`;?\s*$`)
+ endAnchorRE := regexp.MustCompile(`(?i)\send\s*;\s*$`)
drivers.Register("odbc", drivers.Driver{
LexerName: "tsql",
+ Process: func(u *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) {
+ // trim last ; but only when not END;
+ if s := strings.ToLower(u.Query().Get("usql_trim")); s != "" && s != "off" && s != "0" && s != "false" {
+ if !endAnchorRE.MatchString(sqlstr) {
+ sqlstr = endRE.ReplaceAllString(sqlstr, "")
+ }
+ }
+ typ, q := drivers.QueryExecType(prefix, sqlstr)
+ return typ, sqlstr, q, nil
+ },
IsPasswordErr: func(err error) bool {
if e, ok := err.(*odbc.Error); ok {
msg := strings.ToLower(e.Error())
diff --git a/drivers/oracle/orshared/orshared.go b/drivers/oracle/orshared/orshared.go
index 4e2161ad422..af5cb4e7307 100644
--- a/drivers/oracle/orshared/orshared.go
+++ b/drivers/oracle/orshared/orshared.go
@@ -55,7 +55,7 @@ func Register(name string, err func(error) (string, string), isPasswordErr func(
},
Err: err,
IsPasswordErr: isPasswordErr,
- Process: func(prefix string, sqlstr string) (string, string, bool, error) {
+ Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) {
if !endAnchorRE.MatchString(sqlstr) {
// trim last ; but only when not END;
sqlstr = endRE.ReplaceAllString(sqlstr, "")
diff --git a/drivers/pgx/pgx.go b/drivers/pgx/pgx.go
index 1f75b8f6348..b847124b88d 100644
--- a/drivers/pgx/pgx.go
+++ b/drivers/pgx/pgx.go
@@ -11,12 +11,14 @@ import (
"io"
"strings"
- "github.com/jackc/pgconn"
"github.com/jackc/pgx/v5"
+ "github.com/jackc/pgx/v5/pgconn"
"github.com/jackc/pgx/v5/stdlib" // DRIVER
+ "github.com/xo/dburl"
"github.com/xo/usql/drivers"
"github.com/xo/usql/drivers/metadata"
pgmeta "github.com/xo/usql/drivers/metadata/postgres"
+ "github.com/xo/usql/text"
)
func init() {
@@ -24,6 +26,33 @@ func init() {
AllowDollar: true,
AllowMultilineComments: true,
LexerName: "postgres",
+ Open: func(ctx context.Context, u *dburl.URL, stdout, stderr func() io.Writer) (func(string, string) (*sql.DB, error), error) {
+ return func(_, dsn string) (*sql.DB, error) {
+ config, err := pgx.ParseConfig(dsn)
+ if err != nil {
+ return nil, err
+ }
+ config.OnNotice = func(_ *pgconn.PgConn, notice *pgconn.Notice) {
+ out := stderr()
+ fmt.Fprintln(out, notice.Severity+": ", notice.Message)
+ if notice.Hint != "" {
+ fmt.Fprintln(out, "HINT: ", notice.Hint)
+ }
+ }
+ config.OnNotification = func(_ *pgconn.PgConn, notification *pgconn.Notification) {
+ var payload string
+ if notification.Payload != "" {
+ payload = fmt.Sprintf(text.NotificationPayload, notification.Payload)
+ }
+ fmt.Fprintln(stdout(), fmt.Sprintf(text.NotificationReceived, notification.Channel, payload, notification.PID))
+ }
+ // NOTE: as opposed to the github.com/lib/pq driver, this
+ // NOTE: driver has a "prefer" mode that is enabled by default.
+ // NOTE: as such there is no logic here to try to reconnect as
+ // NOTE: in the postgres driver.
+ return stdlib.OpenDB(*config), nil
+ }, nil
+ },
Version: func(ctx context.Context, db drivers.DB) (string, error) {
var ver string
err := db.QueryRowContext(ctx, `SHOW server_version`).Scan(&ver)
@@ -93,7 +122,7 @@ func init() {
var n int64
err = conn.Raw(func(driverConn interface{}) error {
conn := driverConn.(*stdlib.Conn).Conn()
- n, err = conn.CopyFrom(ctx, pgx.Identifier{table}, columns, crows)
+ n, err = conn.CopyFrom(ctx, pgx.Identifier(strings.SplitN(table, ".", 2)), columns, crows)
return err
})
return n, err
@@ -112,7 +141,11 @@ func (r *copyRows) Next() bool {
func (r *copyRows) Values() ([]interface{}, error) {
err := r.rows.Scan(r.values...)
- return r.values, err
+ actuals := make([]interface{}, len(r.values))
+ for i, v := range r.values {
+ actuals[i] = *(v.(*interface{}))
+ }
+ return actuals, err
}
func (r *copyRows) Err() error {
diff --git a/drivers/postgres/postgres.go b/drivers/postgres/postgres.go
index 31118b23b53..335fed2fd6c 100644
--- a/drivers/postgres/postgres.go
+++ b/drivers/postgres/postgres.go
@@ -137,7 +137,11 @@ func init() {
if err != nil {
return 0, fmt.Errorf("failed to fetch target table columns: %w", err)
}
- query = pq.CopyIn(table, columns...)
+ if schemaSep := strings.Index(table, "."); schemaSep >= 0 {
+ query = pq.CopyInSchema(table[:schemaSep], table[schemaSep+1:], columns...)
+ } else {
+ query = pq.CopyIn(table, columns...)
+ }
}
tx, err := db.BeginTx(ctx, nil)
if err != nil {
diff --git a/drivers/presto/presto.go b/drivers/presto/presto.go
index 09a4278f6b8..6b2c5d57cd7 100644
--- a/drivers/presto/presto.go
+++ b/drivers/presto/presto.go
@@ -8,6 +8,7 @@ import (
"regexp"
_ "github.com/prestodb/presto-go-client/presto" // DRIVER
+ "github.com/xo/dburl"
"github.com/xo/usql/drivers"
)
@@ -15,7 +16,7 @@ func init() {
endRE := regexp.MustCompile(`;?\s*$`)
drivers.Register("presto", drivers.Driver{
AllowMultilineComments: true,
- Process: func(prefix string, sqlstr string) (string, string, bool, error) {
+ Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) {
sqlstr = endRE.ReplaceAllString(sqlstr, "")
typ, q := drivers.QueryExecType(prefix, sqlstr)
return typ, sqlstr, q, nil
diff --git a/drivers/qtype.go b/drivers/qtype.go
index 77989ed62c4..91b043f5c0c 100644
--- a/drivers/qtype.go
+++ b/drivers/qtype.go
@@ -213,6 +213,34 @@ var execMap = map[string]bool{
"UNLISTEN": true, // stop listening for a notification
"UPDATE": true, // update rows of a table
"VACUUM": true, // garbage-collect and optionally analyze a database
+ // oracle
+ "ADMINISTER KEY MANAGEMENT": true,
+ "ALTER ANALYTIC VIEW": true,
+ "ALTER ATTRIBUTE DIMENSION": true,
+ "ALTER AUDIT POLICY": true,
+ "ALTER CLUSTER": true,
+ "ALTER DATABASE DICTIONARY": true,
+ "ALTER DATABASE LINK": true,
+ "ALTER DIMENSION": true,
+ "ALTER DISKGROUP": true,
+ "ALTER FLASHBACK ARCHIVE": true,
+ "ALTER HEIRARCHY": true,
+ "ALTER INMEMORY JOIN GROUP": true,
+ "ALTER JAVA": true,
+ "ALTER LIBRARY": true,
+ "ALTER LOCKDOWN PROFILE": true,
+ "ALTER MATERIALIZED VIEW LOG": true,
+ "ALTER MATERIALIZED ZONEMAP": true,
+ "ALTER PACKAGE": true,
+ "ALTER PLUGGABLE DATABASE": true,
+ "ALTER PROCEDURE": true,
+ "ALTER PROFILE": true,
+ "ALTER RESOURCE COST": true,
+ "ALTER ROLLBACK SEGMENT": true,
+ "ALTER SESSION": true,
+ "ALTER SYNONYM": true,
+ "ALTER TABLESPACE SET": true,
+ "ASSOCIATE STATISTICS": true,
}
// createIgnore are parts of the query exec type after CREATE to ignore.
diff --git a/drivers/ramsql/ramsql.go b/drivers/ramsql/ramsql.go
new file mode 100644
index 00000000000..a34d816eca8
--- /dev/null
+++ b/drivers/ramsql/ramsql.go
@@ -0,0 +1,13 @@
+// Package ramsql defines and registers usql's RamSQL driver.
+//
+// See: https://github.com/proullon/ramsql
+package ql
+
+import (
+ _ "github.com/proullon/ramsql/driver" // DRIVER
+ "github.com/xo/usql/drivers"
+)
+
+func init() {
+ drivers.Register("ramsql", drivers.Driver{})
+}
diff --git a/drivers/sapase/sapase.go b/drivers/sapase/sapase.go
index 621abdc6d68..f7c96652c20 100644
--- a/drivers/sapase/sapase.go
+++ b/drivers/sapase/sapase.go
@@ -11,6 +11,7 @@ import (
"strings"
"github.com/thda/tds" // DRIVER: tds
+ "github.com/xo/dburl"
"github.com/xo/usql/drivers"
)
@@ -48,7 +49,7 @@ func init() {
IsPasswordErr: func(err error) bool {
return strings.Contains(err.Error(), "Login failed")
},
- Process: func(prefix string, sqlstr string) (string, string, bool, error) {
+ Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) {
sqlstr = endRE.ReplaceAllString(sqlstr, "")
typ, q := drivers.QueryExecType(prefix, sqlstr)
return typ, sqlstr, q, nil
diff --git a/drivers/sqlserver/sqlserver.go b/drivers/sqlserver/sqlserver.go
index e88ffad911e..8371e1446ed 100644
--- a/drivers/sqlserver/sqlserver.go
+++ b/drivers/sqlserver/sqlserver.go
@@ -6,11 +6,13 @@ package sqlserver
import (
"context"
+ "database/sql"
"fmt"
"io"
"strconv"
"strings"
+ mssql "github.com/microsoft/go-mssqldb"
sqlserver "github.com/microsoft/go-mssqldb" // DRIVER
"github.com/xo/usql/drivers"
"github.com/xo/usql/drivers/metadata"
@@ -59,6 +61,16 @@ func init() {
_, err := db.Exec(`ALTER LOGIN ` + user + ` WITH password = '` + newpw + `' old_password = '` + oldpw + `'`)
return err
},
+ ColumnTypes: func(col *sql.ColumnType) (interface{}, error) {
+ switch col.DatabaseTypeName() {
+ case "UNIQUEIDENTIFIER":
+ if nullable, ok := col.Nullable(); ok && nullable {
+ return new(NullUniqueIdentifier), nil
+ }
+ return new(mssql.UniqueIdentifier), nil
+ }
+ return new(interface{}), nil
+ },
Err: func(err error) (string, string) {
if e, ok := err.(sqlserver.Error); ok {
return strconv.Itoa(int(e.Number)), e.Message
@@ -83,3 +95,27 @@ func init() {
func placeholder(n int) string {
return fmt.Sprintf("@p%d", n)
}
+
+type NullUniqueIdentifier struct {
+ ID mssql.UniqueIdentifier
+ Valid bool
+}
+
+func (nui *NullUniqueIdentifier) Scan(v interface{}) error {
+ nui.Valid = false
+ if v == nil {
+ return nil
+ }
+ if err := nui.ID.Scan(v); err != nil {
+ return err
+ }
+ nui.Valid = true
+ return nil
+}
+
+func (nui NullUniqueIdentifier) String() string {
+ if nui.Valid {
+ return nui.ID.String()
+ }
+ return ""
+}
diff --git a/drivers/testdata/csvq/.gitignore b/drivers/testdata/csvq/.gitignore
new file mode 100644
index 00000000000..8ad2a688ce3
--- /dev/null
+++ b/drivers/testdata/csvq/.gitignore
@@ -0,0 +1 @@
+*_copy
diff --git a/drivers/testdata/csvq/staff.csv b/drivers/testdata/csvq/staff.csv
new file mode 100644
index 00000000000..454999dfe7e
--- /dev/null
+++ b/drivers/testdata/csvq/staff.csv
@@ -0,0 +1,2 @@
+first_name,last_name,address_id,email,store_id,active,username,password,last_update
+John,Doe,1,john@invalid.com,1,true,jdoe,abc,2024-05-10T08:12:05.46875Z
diff --git a/drivers/trino/trino.go b/drivers/trino/trino.go
index 088107b899a..d90ff68b994 100644
--- a/drivers/trino/trino.go
+++ b/drivers/trino/trino.go
@@ -9,6 +9,7 @@ import (
"regexp"
_ "github.com/trinodb/trino-go-client/trino" // DRIVER
+ "github.com/xo/dburl"
"github.com/xo/usql/drivers"
"github.com/xo/usql/drivers/metadata"
infos "github.com/xo/usql/drivers/metadata/informationschema"
@@ -39,7 +40,7 @@ func init() {
}
drivers.Register("trino", drivers.Driver{
AllowMultilineComments: true,
- Process: func(prefix string, sqlstr string) (string, string, bool, error) {
+ Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) {
sqlstr = endRE.ReplaceAllString(sqlstr, "")
typ, q := drivers.QueryExecType(prefix, sqlstr)
return typ, sqlstr, q, nil
diff --git a/drivers/vertica/vertica.go b/drivers/vertica/vertica.go
index 3185a99826b..8be41cb0248 100644
--- a/drivers/vertica/vertica.go
+++ b/drivers/vertica/vertica.go
@@ -8,66 +8,25 @@ import (
"crypto/tls"
"crypto/x509"
"database/sql"
- "fmt"
+ "errors"
"io"
"net/url"
"os"
"regexp"
"strings"
- vertigo "github.com/vertica/vertica-sql-go" // DRIVER
+ vertica "github.com/vertica/vertica-sql-go" // DRIVER
"github.com/vertica/vertica-sql-go/logger"
"github.com/xo/dburl"
"github.com/xo/usql/drivers"
)
func init() {
- // List of custom TLS configurations that may be applied via query in connection string.
- customTlsConfig := map[string]func(string, *tls.Config) error{
- "ca_path": func(queryValue string, c *tls.Config) error {
- rootCertPool := x509.NewCertPool()
-
- pem, err := os.ReadFile(queryValue)
- if err != nil {
- return err
- }
-
- if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
- return fmt.Errorf("error: failed to append pem to cert pool")
- }
-
- c.RootCAs = rootCertPool
-
- return nil
- },
- }
-
- hasCustomTlsConfig := func(queries url.Values) bool {
- for key := range customTlsConfig {
- if queries.Has(key) {
- return true
- }
- }
-
- return false
- }
-
- applyCustomTlsConfig := func(queries url.Values, tlsConfig *tls.Config) error {
- for key, configFunction := range customTlsConfig {
- if queries.Has(key) {
- if err := configFunction(queries.Get(key), tlsConfig); err != nil {
- return err
- }
- }
- }
-
- return nil
- }
-
// turn off logging
if os.Getenv("VERTICA_SQL_GO_LOG_LEVEL") == "" {
logger.SetLogLevel(logger.NONE)
}
+
errCodeRE := regexp.MustCompile(`(?i)^\[([0-9a-z]+)\]\s+(.+)`)
drivers.Register("vertica", drivers.Driver{
AllowDollar: true,
@@ -80,42 +39,28 @@ func init() {
return ver, nil
},
Open: func(_ context.Context, u *dburl.URL, stdout, stderr func() io.Writer) (func(string, string) (*sql.DB, error), error) {
- return func(_, _ string) (*sql.DB, error) {
- queries := u.Query()
-
- if hasCustomTlsConfig(queries) {
- if queries.Get("tlsmode") != "server-strict" {
- configNames := []string{}
-
- for key := range customTlsConfig {
- configNames = append(configNames, key)
- }
-
- return nil, fmt.Errorf(fmt.Sprintf("error: when custom tls configurations are set (%s), tlsmode must be set to server-strict", strings.Join(configNames, ",")))
+ return func(driver, dsn string) (*sql.DB, error) {
+ u, err := url.Parse(dsn)
+ if err != nil {
+ return nil, err
+ }
+ q := u.Query()
+ if name := q.Get("ca_path"); name != "" {
+ if q.Get("tlsmode") != "server-strict" {
+ return nil, errors.New("tlsmode must be set to server-strict: ca_path is set")
}
-
- tlsConfig := &tls.Config{ServerName: u.Hostname()}
-
- if err := applyCustomTlsConfig(queries, tlsConfig); err != nil {
+ cfg := &tls.Config{
+ ServerName: u.Hostname(),
+ }
+ if err := addCA(name, cfg); err != nil {
return nil, err
}
-
- if err := vertigo.RegisterTLSConfig("custom_tls_config", tlsConfig); err != nil {
+ if err := vertica.RegisterTLSConfig("custom_tls_config", cfg); err != nil {
return nil, err
}
-
- queries.Set("tlsmode", "custom_tls_config")
- }
-
- dsn := url.URL{
- Scheme: u.Driver,
- User: u.User,
- Host: u.Host,
- Path: u.Path,
- RawQuery: queries.Encode(),
+ q.Set("tlsmode", "custom_tls_config")
}
-
- return sql.Open(u.Driver, dsn.String())
+ return sql.Open(driver, u.String())
}, nil
},
ChangePassword: func(db drivers.DB, user, newpw, _ string) error {
@@ -134,3 +79,16 @@ func init() {
},
})
}
+
+// addCA adds the specified file name as a ca to the tls config.
+func addCA(name string, cfg *tls.Config) error {
+ pool := x509.NewCertPool()
+ switch pem, err := os.ReadFile(name); {
+ case err != nil:
+ return err
+ case !pool.AppendCertsFromPEM(pem):
+ return errors.New("failed to append pem to cert pool")
+ }
+ cfg.RootCAs = pool
+ return nil
+}
diff --git a/env/env.go b/env/env.go
index 50324fe87a5..e3fbe9a5b6c 100644
--- a/env/env.go
+++ b/env/env.go
@@ -15,6 +15,7 @@ import (
"strings"
"unicode/utf8"
+ "github.com/kenshaw/rasterm"
"github.com/xo/dburl/passfile"
"github.com/xo/usql/text"
)
@@ -200,13 +201,13 @@ func Shell(s string) error {
}
// Pipe starts a command and returns its input for writing.
-func Pipe(c string) (io.WriteCloser, *exec.Cmd, error) {
+func Pipe(stdout, stderr io.Writer, c string) (io.WriteCloser, *exec.Cmd, error) {
shell, param := Getshell()
if shell == "" {
return nil, nil, text.ErrNoShellAvailable
}
cmd := exec.Command(shell, param, c)
- cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
+ cmd.Stdout, cmd.Stderr = stdout, stderr
out, err := cmd.StdinPipe()
if err != nil {
return nil, nil, err
@@ -322,3 +323,11 @@ func Unquote(u *user.User, exec bool, v Vars) func(string, bool) (bool, string,
return true, res, nil
}
}
+
+// TermGraphics returns the [rasterm.TermType] based on TERM_GRAPHICS
+// environment variable.
+func TermGraphics() rasterm.TermType {
+ var typ rasterm.TermType
+ _ = typ.UnmarshalText([]byte(Get("TERM_GRAPHICS")))
+ return typ
+}
diff --git a/env/types.go b/env/types.go
index c2f8f851d44..3a5ae72f300 100644
--- a/env/types.go
+++ b/env/types.go
@@ -3,8 +3,11 @@ package env
import (
"fmt"
"io"
+ "os"
"os/exec"
+ "path/filepath"
"regexp"
+ "runtime"
"sort"
"strconv"
"strings"
@@ -14,6 +17,7 @@ import (
syslocale "github.com/jeandeaual/go-locale"
"github.com/xo/terminfo"
"github.com/xo/usql/text"
+ "github.com/yookoala/realpath"
)
type varName struct {
@@ -117,6 +121,10 @@ var pvarNames = []varName{
"time",
`format used to display time/date column values (default "RFC3339Nano")`,
},
+ {
+ "timezone",
+ `the timezone to display dates in (default '')`,
+ },
{
"title",
"set the table title for subsequently printed tables",
@@ -166,7 +174,7 @@ var envVarNames = []varName{
},
{
text.CommandUpper() + "_SSLMODE, SSLMODE",
- "when set to 'retry', allows postgres connections to attempt to reconnect when no ?sslmode= was specified on the url",
+ "when set to 'retry', allows connections to attempt to reconnect when no ?sslmode= was specified on the url",
},
{
"SYNTAX_HL",
@@ -184,6 +192,10 @@ var envVarNames = []varName{
"SYNTAX_HL_OVERRIDE_BG",
"enables overriding the background color of the chroma styles",
},
+ {
+ "TERM_GRAPHICS",
+ `use the specified terminal graphics`,
+ },
{
"SHELL",
"shell used by the \\! command",
@@ -208,7 +220,14 @@ func (v Vars) All() map[string]string {
return map[string]string(v)
}
-var vars, pvars Vars
+// vars are the environment variables.
+var vars Vars
+
+// pvars are the environment printing variables.
+var pvars Vars
+
+// cvars are the environment named connections.
+var cvars map[string][]string
func init() {
cmdNameUpper := strings.ToUpper(text.CommandName)
@@ -254,6 +273,7 @@ func init() {
"SHOW_HOST_INFORMATION": enableHostInformation,
"PAGER": pagerCmd,
"EDITOR": editorCmd,
+ "QUIET": "off",
"ON_ERROR_STOP": "off",
// prompts
"PROMPT1": "%S%N%m%/%R%# ",
@@ -263,6 +283,7 @@ func init() {
"SYNTAX_HL_STYLE": "monokai",
"SYNTAX_HL_OVERRIDE_BG": "true",
"SSLMODE": sslmode,
+ "TERM_GRAPHICS": "none",
}
// determine locale
locale := "en-US"
@@ -288,12 +309,14 @@ func init() {
"recordsep_zero": "off",
"tableattr": "",
"time": "RFC3339Nano",
+ "timezone": "",
"title": "",
"tuples_only": "off",
"unicode_border_linestyle": "single",
"unicode_column_linestyle": "single",
"unicode_header_linestyle": "single",
}
+ cvars = make(map[string][]string)
}
// ValidIdentifier returns an error when n is not a valid identifier.
@@ -470,7 +493,7 @@ func Ptoggle(name, extra string) (string, error) {
pvars[name] = "aligned"
}
case "linestyle":
- case "csv_fieldsep", "fieldsep", "null", "recordsep", "time", "locale":
+ case "csv_fieldsep", "fieldsep", "null", "recordsep", "time", "timezone", "locale":
case "tableattr", "title":
pvars[name] = ""
case "unicode_border_linestyle", "unicode_column_linestyle", "unicode_header_linestyle":
@@ -520,6 +543,11 @@ func Pset(name, value string) (string, error) {
pvars[name] = value
case "csv_fieldsep", "fieldsep", "null", "recordsep", "tableattr", "time", "title", "locale":
pvars[name] = value
+ case "timezone":
+ if _, err := time.LoadLocation(value); err != nil {
+ return "", text.ErrInvalidTimezoneLocation
+ }
+ pvars[name] = value
case "unicode_border_linestyle", "unicode_column_linestyle", "unicode_header_linestyle":
if !borderRE.MatchString(value) {
return "", text.ErrInvalidFormatBorderLineStyle
@@ -531,8 +559,45 @@ func Pset(name, value string) (string, error) {
return pvars[name], nil
}
-// timeConstMap is the time const name to value map.
-var timeConstMap = map[string]string{
+// Cset sets a named connection for the environment.
+func Cset(name string, vals ...string) error {
+ if err := ValidIdentifier(name); err != nil {
+ return err
+ }
+ if _, ok := cvars[name]; len(vals) == 0 || vals[0] == "" && ok {
+ delete(cvars, name)
+ } else {
+ v := make([]string, len(vals))
+ copy(v, vals)
+ cvars[name] = v
+ }
+ return nil
+}
+
+// Cget returns the environment's named connection.
+func Cget(name string) ([]string, bool) {
+ vals, ok := cvars[name]
+ if !ok {
+ return nil, false
+ }
+ v := make([]string, len(vals))
+ copy(v, vals)
+ return v, true
+}
+
+// Call returns all named connections from the environment.
+func Call() map[string][]string {
+ m := make(map[string][]string, len(cvars))
+ for k, vals := range cvars {
+ v := make([]string, len(vals))
+ copy(v, vals)
+ m[k] = v
+ }
+ return m
+}
+
+// timeConsts are well known time consts.
+var timeConsts = map[string]string{
"ANSIC": time.ANSIC,
"UnixDate": time.UnixDate,
"RubyDate": time.RubyDate,
@@ -553,14 +618,14 @@ var timeConstMap = map[string]string{
// GoTime returns the user's time format converted to Go's time.Format value.
func GoTime() string {
tfmt := pvars["time"]
- if s, ok := timeConstMap[tfmt]; ok {
+ if s, ok := timeConsts[tfmt]; ok {
return s
}
return tfmt
}
-// Listing writes the formatted variables listing to w, separated into different
-// sections for all known variables.
+// Listing writes a formatted listing of the special environment variables to
+// w, separated in sections based on variable type.
func Listing(w io.Writer) {
varsWithDesc := make([]string, len(varNames))
for i, v := range varNames {
@@ -570,40 +635,85 @@ func Listing(w io.Writer) {
for i, v := range pvarNames {
pvarsWithDesc[i] = v.String()
}
- envVarsWithDesc := make([]string, len(envVarNames))
- for i, v := range envVarNames {
+
+ // determine config dir name
+ configDir, configExtra := buildConfigDir("config.yaml")
+
+ // environment var names
+ configDesc := configDir
+ if configExtra != "" {
+ configDesc = configExtra
+ }
+ ev := []varName{
+ {
+ text.CommandUpper() + "_CONFIG",
+ fmt.Sprintf(`config file path (default %q)`, configDesc),
+ },
+ }
+ envVarsWithDesc := make([]string, len(envVarNames)+1)
+ for i, v := range append(ev, envVarNames...) {
envVarsWithDesc[i] = v.String()
}
- template := `
-List of specially treated variables
+
+ if configExtra != "" {
+ configExtra = " (" + configExtra + ")"
+ }
+
+ template := `List of specially treated variables
%s variables:
Usage:
- %s --set=NAME=VALUE
- or \set NAME VALUE inside %s
-
-%s
+ %[1]s --set=NAME=VALUE
+ or \set NAME VALUE inside %[1]s
+%[2]s
Display settings:
Usage:
- %s --pset=NAME[=VALUE]
- or \pset NAME [VALUE] inside %s
+ %[1]s --pset=NAME[=VALUE]
+ or \pset NAME [VALUE] inside %[1]s
-%s
+%[3]s
Environment variables:
Usage:
- NAME=VALUE [NAME=VALUE] %s ...
- or \setenv NAME [VALUE] inside %s
+ NAME=VALUE [NAME=VALUE] %[1]s ...
+ or \setenv NAME [VALUE] inside %[1]s
-%s
+%[4]s
+Connection variables:
+Usage:
+ %[1]s --cset NAME[=DSN]
+ or \cset NAME [DSN] inside %[1]s
+ or \cset NAME DRIVER PARAMS... inside %[1]s
+ or define in %[5]s%[6]s
`
fmt.Fprintf(
w, template,
- text.CommandName, text.CommandName, text.CommandName, strings.Join(varsWithDesc, "\n"),
- text.CommandName, text.CommandName, strings.Join(pvarsWithDesc, "\n"),
- text.CommandName, text.CommandName, strings.Join(envVarsWithDesc, "\n"),
+ text.CommandName,
+ strings.TrimRightFunc(strings.Join(varsWithDesc, ""), unicode.IsSpace),
+ strings.TrimRightFunc(strings.Join(pvarsWithDesc, ""), unicode.IsSpace),
+ strings.TrimRightFunc(strings.Join(envVarsWithDesc, ""), unicode.IsSpace),
+ configDir,
+ configExtra,
)
}
+
+func buildConfigDir(configName string) (string, string) {
+ dir := `$HOME/.config/usql`
+ switch runtime.GOOS {
+ case "darwin":
+ dir = `$HOME/Library/Application Support`
+ case "windows":
+ dir = `%AppData%\usql`
+ }
+ configDir, err := os.UserConfigDir()
+ if err != nil {
+ return filepath.Join(dir, configName), ""
+ }
+ if configDir, err = realpath.Realpath(configDir); err != nil {
+ return filepath.Join(dir, configName), ""
+ }
+ return filepath.Join(dir, configName), filepath.Join(configDir, "usql", configName)
+}
diff --git a/go.mod b/go.mod
index 10447d0b93e..efa69f3dc6d 100644
--- a/go.mod
+++ b/go.mod
@@ -1,206 +1,229 @@
module github.com/xo/usql
-go 1.21
+go 1.23
+
+toolchain go1.23rc2
require (
- github.com/ClickHouse/clickhouse-go/v2 v2.16.0
+ github.com/ClickHouse/clickhouse-go/v2 v2.26.0
github.com/IBM/nzgo/v12 v12.0.8
github.com/MichaelS11/go-cql-driver v0.1.1
- github.com/SAP/go-hdb v1.6.3
+ github.com/SAP/go-hdb v1.10.1
github.com/VoltDB/voltdb-client-go v1.0.15
- github.com/alecthomas/chroma/v2 v2.11.1
- github.com/alecthomas/kingpin/v2 v2.4.0
+ github.com/alecthomas/chroma/v2 v2.14.0
github.com/alexbrainman/odbc v0.0.0-20230814102256-1421b829acc9
github.com/aliyun/aliyun-tablestore-go-sql-driver v0.0.0-20220418015234-4d337cb3eed9
github.com/amsokol/ignite-go-client v0.12.2
- github.com/apache/arrow/go/v12 v12.0.1
- github.com/apache/calcite-avatica-go/v5 v5.2.0
+ github.com/apache/arrow/go/v16 v16.1.0
+ github.com/apache/calcite-avatica-go/v5 v5.3.0
github.com/bippio/go-impala v2.1.0+incompatible
- github.com/btnguyen2k/gocosmos v0.3.0
- github.com/btnguyen2k/godynamo v0.4.0
+ github.com/btnguyen2k/gocosmos v1.1.0
+ github.com/btnguyen2k/godynamo v1.3.0
+ github.com/chaisql/chai v0.16.1-0.20240218103834-23e406360fd2
github.com/couchbase/go_n1ql v0.0.0-20220303011133-0ed4bf93e31d
- github.com/databendcloud/databend-go v0.4.6
- github.com/databricks/databricks-sql-go v1.5.2
- github.com/docker/docker v24.0.7+incompatible
- github.com/exasol/exasol-driver-go v1.0.4
- github.com/genjidb/genji v0.15.2
- github.com/go-sql-driver/mysql v1.7.1
+ github.com/databricks/databricks-sql-go v1.5.7
+ github.com/datafuselabs/databend-go v0.6.8
+ github.com/docker/docker v26.1.1+incompatible
+ github.com/exasol/exasol-driver-go v1.0.9
+ github.com/go-git/go-billy/v5 v5.5.0
+ github.com/go-sql-driver/mysql v1.8.1
github.com/gocql/gocql v1.6.0
- github.com/godror/godror v0.40.4
+ github.com/godror/godror v0.44.2
github.com/gohxs/readline v0.0.0-20171011095936-a780388e6e7c
github.com/google/go-cmp v0.6.0
github.com/google/goexpect v0.0.0-20210430020637-ab937bf7fd6f
- github.com/googleapis/go-sql-spanner v1.1.1
- github.com/jackc/pgconn v1.14.1
- github.com/jackc/pgx/v5 v5.5.0
- github.com/jeandeaual/go-locale v0.0.0-20220711133428-7de61946b173
+ github.com/googleapis/go-sql-spanner v1.6.0
+ github.com/jackc/pgx/v5 v5.6.0
+ github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49
github.com/jmrobles/h2go v0.5.0
+ github.com/kenshaw/rasterm v0.1.10
github.com/lib/pq v1.10.9
- github.com/marcboeker/go-duckdb v1.5.4
+ github.com/marcboeker/go-duckdb v1.7.0
github.com/mattn/go-adodb v0.0.1
github.com/mattn/go-isatty v0.0.20
- github.com/mattn/go-sqlite3 v1.14.18
- github.com/microsoft/go-mssqldb v1.6.0
+ github.com/mattn/go-sqlite3 v1.14.22
+ github.com/microsoft/go-mssqldb v1.7.2
github.com/mithrandie/csvq v1.18.1
github.com/mithrandie/csvq-driver v1.7.0
- github.com/nakagami/firebirdsql v0.9.6
+ github.com/nakagami/firebirdsql v0.9.10
github.com/ory/dockertest/v3 v3.10.0
- github.com/prestodb/presto-go-client v0.0.0-20230524183650-a1a0bac0f63e
- github.com/sijms/go-ora/v2 v2.7.24
- github.com/snowflakedb/gosnowflake v1.7.1-0.20231129120718-15fac293e1b8
+ github.com/prestodb/presto-go-client v0.0.0-20240426182841-905ac40a1783
+ github.com/proullon/ramsql v0.1.4
+ github.com/sijms/go-ora/v2 v2.8.19
+ github.com/snowflakedb/gosnowflake v1.10.1
+ github.com/spf13/cobra v1.8.0
+ github.com/spf13/pflag v1.0.5
+ github.com/spf13/viper v1.18.2
github.com/thda/tds v0.1.7
- github.com/trinodb/trino-go-client v0.313.0
- github.com/uber/athenadriver v1.1.14
+ github.com/trinodb/trino-go-client v0.315.0
+ github.com/uber/athenadriver v1.1.15
github.com/vertica/vertica-sql-go v1.3.3
- github.com/xo/dburl v0.19.1
- github.com/xo/tblfmt v0.10.3
+ github.com/xo/chartfmt v0.0.0
+ github.com/xo/dburl v0.23.2
+ github.com/xo/tblfmt v0.13.2
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e
- github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2
+ github.com/ydb-platform/ydb-go-sdk/v3 v3.75.2
github.com/yookoala/realpath v1.0.0
github.com/ziutek/mymysql v1.5.4
+ golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56
gorm.io/driver/bigquery v1.2.0
modernc.org/ql v1.4.7
- modernc.org/sqlite v1.27.0
+ modernc.org/sqlite v1.31.1
sqlflow.org/gohive v0.0.0-20231130013447-c9657f0f21f9
sqlflow.org/gomaxcompute v0.0.0-20210805062559-c14ae028b44c
)
require (
- cloud.google.com/go v0.111.0 // indirect
- cloud.google.com/go/bigquery v1.57.1 // indirect
- cloud.google.com/go/compute v1.23.3 // indirect
- cloud.google.com/go/compute/metadata v0.2.3 // indirect
- cloud.google.com/go/iam v1.1.5 // indirect
- cloud.google.com/go/longrunning v0.5.4 // indirect
- cloud.google.com/go/spanner v1.53.0 // indirect
+ cel.dev/expr v0.15.0 // indirect
+ cloud.google.com/go v0.115.0 // indirect
+ cloud.google.com/go/auth v0.7.2 // indirect
+ cloud.google.com/go/auth/oauth2adapt v0.2.3 // indirect
+ cloud.google.com/go/bigquery v1.62.0 // indirect
+ cloud.google.com/go/compute/metadata v0.5.0 // indirect
+ cloud.google.com/go/iam v1.1.12 // indirect
+ cloud.google.com/go/longrunning v0.5.11 // indirect
+ cloud.google.com/go/spanner v1.64.0 // indirect
+ dario.cat/mergo v1.0.0 // indirect
+ filippo.io/edwards25519 v1.1.0 // indirect
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
github.com/99designs/keyring v1.2.2 // indirect
- github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 // indirect
- github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect
- github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 // indirect
- github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 // indirect
- github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
- github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect
- github.com/BurntSushi/toml v1.3.2 // indirect
- github.com/ClickHouse/ch-go v0.60.0 // indirect
- github.com/DATA-DOG/go-sqlmock v1.5.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.0 // indirect
+ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
+ github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect
+ github.com/BurntSushi/toml v1.4.0 // indirect
+ github.com/ClickHouse/ch-go v0.62.0 // indirect
+ github.com/DATA-DOG/go-sqlmock v1.5.2 // indirect
github.com/DataDog/zstd v1.5.6-0.20230622172052-ea68dcab66c0 // indirect
+ github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect
github.com/IBM/nzgo v11.1.0+incompatible // indirect
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect
github.com/Masterminds/semver v1.5.0 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect
- github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
- github.com/aliyun/aliyun-tablestore-go-sdk v1.7.11 // indirect
- github.com/andybalholm/brotli v1.0.6 // indirect
- github.com/apache/thrift v0.19.0 // indirect
+ github.com/aliyun/aliyun-tablestore-go-sdk v1.7.15 // indirect
+ github.com/andybalholm/brotli v1.1.0 // indirect
+ github.com/apache/arrow/go/v12 v12.0.1 // indirect
+ github.com/apache/arrow/go/v14 v14.0.2 // indirect
+ github.com/apache/arrow/go/v15 v15.0.2 // indirect
+ github.com/apache/thrift v0.20.0 // indirect
github.com/avast/retry-go v3.0.0+incompatible // indirect
- github.com/aws/aws-sdk-go v1.48.8 // indirect
- github.com/aws/aws-sdk-go-v2 v1.23.3 // indirect
- github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.2 // indirect
- github.com/aws/aws-sdk-go-v2/credentials v1.16.7 // indirect
- github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.31 // indirect
- github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.2 // indirect
- github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.6 // indirect
- github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.6 // indirect
- github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.6 // indirect
- github.com/aws/aws-sdk-go-v2/service/dynamodb v1.20.1 // indirect
- github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.15 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.2 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.6 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.29 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.6 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.6 // indirect
- github.com/aws/aws-sdk-go-v2/service/s3 v1.47.0 // indirect
- github.com/aws/smithy-go v1.18.0 // indirect
- github.com/beltran/gohive v1.6.0 // indirect
- github.com/beltran/gosasl v0.0.0-20231124144235-92b2e4f10bb6 // indirect
+ github.com/aws/aws-sdk-go v1.55.3 // indirect
+ github.com/aws/aws-sdk-go-v2 v1.30.3 // indirect
+ github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 // indirect
+ github.com/aws/aws-sdk-go-v2/credentials v1.17.27 // indirect
+ github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.14.10 // indirect
+ github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.9 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15 // indirect
+ github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.4 // indirect
+ github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.3 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.16 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15 // indirect
+ github.com/aws/aws-sdk-go-v2/service/s3 v1.58.2 // indirect
+ github.com/aws/smithy-go v1.20.3 // indirect
+ github.com/beltran/gohive v1.7.0 // indirect
+ github.com/beltran/gosasl v0.0.0-20240525201126-ea45571eeb66 // indirect
github.com/beltran/gssapi v0.0.0-20200324152954-d86554db4bab // indirect
github.com/beorn7/perks v1.0.1 // indirect
- github.com/btnguyen2k/consu/checksum v1.1.0 // indirect
- github.com/btnguyen2k/consu/gjrc v0.2.1 // indirect
+ github.com/bitfield/gotestdox v0.2.2 // indirect
+ github.com/btnguyen2k/consu/checksum v1.1.1 // indirect
+ github.com/btnguyen2k/consu/g18 v0.1.0 // indirect
+ github.com/btnguyen2k/consu/gjrc v0.2.2 // indirect
github.com/btnguyen2k/consu/olaf v0.1.3 // indirect
- github.com/btnguyen2k/consu/reddo v0.1.8 // indirect
+ github.com/btnguyen2k/consu/reddo v0.1.9 // indirect
github.com/btnguyen2k/consu/semita v0.1.5 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
- github.com/cenkalti/backoff/v4 v4.2.1 // indirect
+ github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
- github.com/cespare/xxhash/v2 v2.2.0 // indirect
- github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect
- github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa // indirect
- github.com/cockroachdb/errors v1.10.0 // indirect
+ github.com/cespare/xxhash/v2 v2.3.0 // indirect
+ github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 // indirect
+ github.com/cockroachdb/errors v1.11.3 // indirect
+ github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
- github.com/cockroachdb/pebble v0.0.0-20230718183418-628c4107d05a // indirect
+ github.com/cockroachdb/pebble v1.1.1 // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
- github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6 // indirect
- github.com/containerd/containerd v1.7.7 // indirect
- github.com/containerd/continuity v0.4.2 // indirect
- github.com/coreos/go-oidc/v3 v3.5.0 // indirect
+ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
+ github.com/containerd/containerd v1.7.12 // indirect
+ github.com/containerd/continuity v0.4.3 // indirect
+ github.com/containerd/log v0.1.0 // indirect
+ github.com/coreos/go-oidc/v3 v3.11.0 // indirect
github.com/couchbase/go-couchbase v0.1.1 // indirect
- github.com/couchbase/gomemcached v0.2.1 // indirect
+ github.com/couchbase/gomemcached v0.3.1 // indirect
github.com/couchbase/goutils v0.1.2 // indirect
- github.com/danieljoos/wincred v1.2.0 // indirect
- github.com/davecgh/go-spew v1.1.1 // indirect
- github.com/dlclark/regexp2 v1.10.0 // indirect
+ github.com/cyphar/filepath-securejoin v0.2.4 // indirect
+ github.com/danieljoos/wincred v1.2.2 // indirect
+ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
+ github.com/distribution/reference v0.5.0 // indirect
+ github.com/dlclark/regexp2 v1.11.2 // indirect
github.com/dnephin/pflag v1.0.7 // indirect
- github.com/docker/cli v20.10.17+incompatible // indirect
- github.com/docker/distribution v2.8.2+incompatible // indirect
- github.com/docker/go-connections v0.4.0 // indirect
+ github.com/docker/cli v26.0.1+incompatible // indirect
+ github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
+ github.com/dop251/goja v0.0.0-20240707163329-b1681fb2a2f5 // indirect
+ github.com/dop251/goja_nodejs v0.0.0-20240418154818-2aae10d4cbcf // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
- github.com/dvsekhvalnov/jose2go v1.5.0 // indirect
+ github.com/dvsekhvalnov/jose2go v1.7.0 // indirect
github.com/edsrzf/mmap-go v1.1.0 // indirect
- github.com/elastic/go-sysinfo v1.11.2 // indirect
- github.com/elastic/go-windows v1.0.1 // indirect
- github.com/envoyproxy/go-control-plane v0.11.1 // indirect
- github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect
+ github.com/elastic/go-sysinfo v1.14.0 // indirect
+ github.com/elastic/go-windows v1.0.2 // indirect
+ github.com/envoyproxy/go-control-plane v0.12.0 // indirect
+ github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect
github.com/exasol/error-reporting-go v0.2.0 // indirect
- github.com/fatih/color v1.13.0 // indirect
- github.com/form3tech-oss/jwt-go v3.2.5+incompatible // indirect
- github.com/fsnotify/fsnotify v1.6.0 // indirect
- github.com/gabriel-vasile/mimetype v1.4.3 // indirect
- github.com/getsentry/sentry-go v0.22.0 // indirect
+ github.com/fatih/color v1.17.0 // indirect
+ github.com/felixge/httpsnoop v1.0.4 // indirect
+ github.com/fsnotify/fsnotify v1.7.0 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.4 // indirect
+ github.com/getsentry/sentry-go v0.28.1 // indirect
github.com/go-faster/city v1.0.1 // indirect
- github.com/go-faster/errors v0.7.0 // indirect
- github.com/go-jose/go-jose/v3 v3.0.0 // indirect
+ github.com/go-faster/errors v0.7.1 // indirect
+ github.com/go-jose/go-jose/v4 v4.0.3 // indirect
github.com/go-logfmt/logfmt v0.6.0 // indirect
- github.com/go-logr/logr v1.3.0 // indirect
+ github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
- github.com/go-zookeeper/zk v1.0.3 // indirect
- github.com/goccy/go-json v0.10.2 // indirect
+ github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect
+ github.com/go-zookeeper/zk v1.0.4 // indirect
+ github.com/goccy/go-json v0.10.3 // indirect
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
- github.com/godror/knownpb v0.1.1 // indirect
+ github.com/godror/knownpb v0.1.2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
- github.com/golang-jwt/jwt/v5 v5.1.0 // indirect
+ github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
+ github.com/golang-module/carbon/v2 v2.3.12 // indirect
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
github.com/golang-sql/sqlexp v0.1.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/mock v1.6.0 // indirect
- github.com/golang/protobuf v1.5.3 // indirect
+ github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/flatbuffers/go v0.0.0-20230110200425-62e4d2e5b215 // indirect
- github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f // indirect
- github.com/google/s2a-go v0.1.7 // indirect
+ github.com/google/goterm v0.0.0-20200907032337-555d40f16ae2 // indirect
+ github.com/google/pprof v0.0.0-20240722153945-304e4f0156b8 // indirect
+ github.com/google/s2a-go v0.1.8 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
- github.com/google/uuid v1.4.0 // indirect
+ github.com/google/uuid v1.6.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
- github.com/googleapis/gax-go/v2 v2.12.0 // indirect
- github.com/gorilla/websocket v1.5.1 // indirect
+ github.com/googleapis/gax-go/v2 v2.13.0 // indirect
+ github.com/gorilla/websocket v1.5.3 // indirect
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
- github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
- github.com/hashicorp/go-retryablehttp v0.7.1 // indirect
+ github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
+ github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect
github.com/hashicorp/golang-lru v1.0.2 // indirect
- github.com/icholy/digest v0.1.22 // indirect
- github.com/imdario/mergo v0.3.13 // indirect
- github.com/jackc/chunkreader/v2 v2.0.1 // indirect
- github.com/jackc/pgio v1.0.0 // indirect
+ github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
+ github.com/hashicorp/hcl v1.0.0 // indirect
+ github.com/icholy/digest v0.1.23 // indirect
+ github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
- github.com/jackc/pgproto3/v2 v2.3.2 // indirect
- github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
+ github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/jcmturner/aescts/v2 v2.0.0 // indirect
github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect
@@ -208,117 +231,129 @@ require (
github.com/jcmturner/goidentity/v6 v6.0.1 // indirect
github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect
github.com/jcmturner/rpc/v2 v2.0.3 // indirect
- github.com/jedib0t/go-pretty/v6 v6.4.9 // indirect
+ github.com/jedib0t/go-pretty/v6 v6.5.9 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
- github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect
- github.com/jonboulle/clockwork v0.3.0 // indirect
+ github.com/jonboulle/clockwork v0.4.0 // indirect
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
- github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/klauspost/asmfmt v1.3.2 // indirect
- github.com/klauspost/compress v1.17.4 // indirect
- github.com/klauspost/cpuid/v2 v2.2.6 // indirect
+ github.com/klauspost/compress v1.17.9 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
+ github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
- github.com/mattn/go-runewidth v0.0.15 // indirect
- github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
+ github.com/mattn/go-runewidth v0.0.16 // indirect
+ github.com/mattn/go-sixel v0.0.5 // indirect
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect
- github.com/minio/sio v0.3.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mithrandie/go-file/v2 v2.1.0 // indirect
github.com/mithrandie/go-text v1.6.0 // indirect
github.com/mithrandie/ternary v1.1.1 // indirect
+ github.com/moby/docker-image-spec v1.3.1 // indirect
github.com/moby/patternmatcher v0.6.0 // indirect
github.com/moby/sys/sequential v0.5.0 // indirect
+ github.com/moby/sys/user v0.1.0 // indirect
github.com/moby/term v0.5.0 // indirect
github.com/mtibben/percent v0.2.1 // indirect
+ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/nathan-fiscaletti/consolesize-go v0.0.0-20220204101620-317176b6684d // indirect
+ github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
- github.com/opencontainers/image-spec v1.1.0-rc5 // indirect
- github.com/opencontainers/runc v1.1.5 // indirect
- github.com/paulmach/orb v0.10.0 // indirect
- github.com/pierrec/lz4/v4 v4.1.18 // indirect
- github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
+ github.com/opencontainers/image-spec v1.1.0 // indirect
+ github.com/opencontainers/runc v1.1.12 // indirect
+ github.com/paulmach/orb v0.11.1 // indirect
+ github.com/pelletier/go-toml/v2 v2.1.0 // indirect
+ github.com/pierrec/lz4/v4 v4.1.21 // indirect
+ github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
github.com/pkg/errors v0.9.1 // indirect
- github.com/pmezard/go-difflib v1.0.0 // indirect
- github.com/prometheus/client_golang v1.17.0 // indirect
- github.com/prometheus/client_model v0.5.0 // indirect
- github.com/prometheus/common v0.45.0 // indirect
- github.com/prometheus/procfs v0.12.0 // indirect
+ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
+ github.com/prometheus/client_golang v1.19.1 // indirect
+ github.com/prometheus/client_model v0.6.1 // indirect
+ github.com/prometheus/common v0.55.0 // indirect
+ github.com/prometheus/procfs v0.15.1 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
- github.com/rivo/uniseg v0.4.4 // indirect
- github.com/rogpeppe/go-internal v1.11.0 // indirect
- github.com/rs/zerolog v1.28.0 // indirect
+ github.com/rivo/uniseg v0.4.7 // indirect
+ github.com/rogpeppe/go-internal v1.12.0 // indirect
+ github.com/rs/zerolog v1.33.0 // indirect
+ github.com/sagikazarmark/locafero v0.4.0 // indirect
+ github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/segmentio/asm v1.2.0 // indirect
- github.com/shopspring/decimal v1.3.1 // indirect
+ github.com/shopspring/decimal v1.4.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
+ github.com/soniakeys/quant v1.0.0 // indirect
+ github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
- github.com/stretchr/objx v0.5.1 // indirect
- github.com/stretchr/testify v1.8.4 // indirect
+ github.com/spf13/afero v1.11.0 // indirect
+ github.com/spf13/cast v1.6.0 // indirect
+ github.com/stretchr/objx v0.5.2 // indirect
+ github.com/stretchr/testify v1.9.0 // indirect
+ github.com/subosito/gotenv v1.6.0 // indirect
github.com/twmb/murmur3 v1.1.8 // indirect
- github.com/uber-go/tally v3.5.8+incompatible // indirect
+ github.com/uber-go/tally v3.5.10+incompatible // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
- github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
+ github.com/xo/echartsgoja v0.1.1 // indirect
+ github.com/xo/resvg v0.6.0 // indirect
+ github.com/xo/vegagoja v0.1.0 // indirect
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 // indirect
- github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd // indirect
+ github.com/ydb-platform/ydb-go-genproto v0.0.0-20240528144234-5d5a685e41f7 // indirect
github.com/zeebo/xxh3 v1.0.2 // indirect
gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b // indirect
go.opencensus.io v0.24.0 // indirect
- go.opentelemetry.io/otel v1.21.0 // indirect
- go.opentelemetry.io/otel/metric v1.21.0 // indirect
- go.opentelemetry.io/otel/trace v1.21.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
+ go.opentelemetry.io/otel v1.28.0 // indirect
+ go.opentelemetry.io/otel/metric v1.28.0 // indirect
+ go.opentelemetry.io/otel/trace v1.28.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
- go.uber.org/zap v1.26.0 // indirect
- golang.org/x/crypto v0.16.0 // indirect
- golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect
- golang.org/x/mod v0.14.0 // indirect
- golang.org/x/net v0.19.0 // indirect
- golang.org/x/oauth2 v0.15.0 // indirect
- golang.org/x/sync v0.5.0 // indirect
- golang.org/x/sys v0.15.0 // indirect
- golang.org/x/term v0.15.0 // indirect
- golang.org/x/text v0.14.0 // indirect
+ go.uber.org/zap v1.27.0 // indirect
+ golang.org/x/crypto v0.25.0 // indirect
+ golang.org/x/mod v0.19.0 // indirect
+ golang.org/x/net v0.27.0 // indirect
+ golang.org/x/oauth2 v0.21.0 // indirect
+ golang.org/x/sync v0.7.0 // indirect
+ golang.org/x/sys v0.22.0 // indirect
+ golang.org/x/term v0.22.0 // indirect
+ golang.org/x/text v0.16.0 // indirect
golang.org/x/time v0.5.0 // indirect
- golang.org/x/tools v0.16.0 // indirect
- golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
- google.golang.org/api v0.152.0 // indirect
- google.golang.org/appengine v1.6.8 // indirect
- google.golang.org/genproto v0.0.0-20231127180814-3a041ad873d4 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20231127180814-3a041ad873d4 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect
- google.golang.org/grpc v1.59.0 // indirect
- google.golang.org/protobuf v1.31.0 // indirect
+ golang.org/x/tools v0.23.0 // indirect
+ golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect
+ google.golang.org/api v0.189.0 // indirect
+ google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20240725223205-93522f1f2a9f // indirect
+ google.golang.org/grpc v1.65.0 // indirect
+ google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
+ gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/jcmturner/aescts.v1 v1.0.1 // indirect
gopkg.in/jcmturner/dnsutils.v1 v1.0.1 // indirect
gopkg.in/jcmturner/gokrb5.v6 v6.1.1 // indirect
gopkg.in/jcmturner/rpc.v1 v1.1.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- gotest.tools/gotestsum v1.8.2 // indirect
- howett.net/plist v1.0.0 // indirect
- lukechampine.com/uint128 v1.3.0 // indirect
+ gotest.tools/gotestsum v1.12.0 // indirect
+ howett.net/plist v1.0.1 // indirect
modernc.org/b v1.1.0 // indirect
- modernc.org/cc/v3 v3.41.0 // indirect
- modernc.org/ccgo/v3 v3.16.15 // indirect
modernc.org/db v1.0.10 // indirect
modernc.org/file v1.0.8 // indirect
- modernc.org/fileutil v1.2.0 // indirect
+ modernc.org/fileutil v1.3.0 // indirect
+ modernc.org/gc/v3 v3.0.0-20240722195230-4a140ff9c08e // indirect
modernc.org/golex v1.1.0 // indirect
modernc.org/internal v1.1.0 // indirect
- modernc.org/libc v1.34.11 // indirect
+ modernc.org/libc v1.55.4 // indirect
modernc.org/lldb v1.0.8 // indirect
modernc.org/mathutil v1.6.0 // indirect
- modernc.org/memory v1.7.2 // indirect
- modernc.org/opt v0.1.3 // indirect
+ modernc.org/memory v1.8.0 // indirect
modernc.org/sortutil v1.2.0 // indirect
modernc.org/strutil v1.2.0 // indirect
modernc.org/token v1.1.0 // indirect
modernc.org/zappy v1.1.0 // indirect
)
+
+replace github.com/xo/chartfmt => ../chartfmt
diff --git a/go.sum b/go.sum
index b7829fbd736..fa2563baa5e 100644
--- a/go.sum
+++ b/go.sum
@@ -1,8 +1,11 @@
+cel.dev/expr v0.15.0 h1:O1jzfJCQBfL5BFoYktaxwIhuttaQPsVWerH9/EEKx0w=
+cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
@@ -15,6 +18,7 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
+cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
@@ -26,26 +30,96 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y
cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
+cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U=
cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=
-cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM=
-cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU=
+cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
+cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
+cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
+cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14=
+cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU=
+cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
+cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
+cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E=
+cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o=
+cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE=
+cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM=
+cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ=
cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=
+cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg=
+cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ=
+cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k=
+cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw=
cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4=
+cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M=
+cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE=
+cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE=
+cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk=
+cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc=
+cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8=
+cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc=
+cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04=
+cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8=
+cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY=
+cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM=
+cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc=
+cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU=
+cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI=
+cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8=
+cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno=
+cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak=
+cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84=
+cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A=
+cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E=
cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4=
cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0=
+cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY=
+cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k=
cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ=
cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk=
+cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0=
+cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc=
+cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI=
+cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ=
+cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI=
+cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08=
cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o=
cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s=
+cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0=
+cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ=
+cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY=
+cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo=
+cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg=
+cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw=
cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY=
cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw=
+cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI=
+cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo=
+cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0=
+cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E=
+cloud.google.com/go/auth v0.7.2 h1:uiha352VrCDMXg+yoBtaD0tUF4Kv9vrtrWPYXwutnDE=
+cloud.google.com/go/auth v0.7.2/go.mod h1:VEc4p5NNxycWQTMQEDQF0bd6aTMb6VgYDXEwiJJQAbs=
+cloud.google.com/go/auth/oauth2adapt v0.2.3 h1:MlxF+Pd3OmSudg/b1yZ5lJwoXCEaeedAguodky1PcKI=
+cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I=
cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=
cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=
+cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8=
+cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM=
+cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU=
+cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc=
+cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI=
+cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss=
+cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE=
+cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE=
+cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g=
+cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4=
+cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8=
+cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM=
+cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
@@ -53,14 +127,46 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA=
-cloud.google.com/go/bigquery v1.57.1 h1:FiULdbbzUxWD0Y4ZGPSVCDLvqRSyCIO6zKV7E2nf5uA=
-cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug=
+cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw=
+cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc=
+cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E=
+cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac=
+cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q=
+cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU=
+cloud.google.com/go/bigquery v1.62.0 h1:SYEA2f7fKqbSRRBHb7g0iHTtZvtPSPYdXfmqsjpsBwo=
+cloud.google.com/go/bigquery v1.62.0/go.mod h1:5ee+ZkF1x/ntgCsFQJAQTM3QkAZOecfCmvxhkJsWRSA=
cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY=
cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s=
+cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI=
+cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y=
+cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss=
+cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc=
cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM=
cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI=
+cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0=
+cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk=
+cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q=
+cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg=
+cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590=
+cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8=
+cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk=
+cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk=
+cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE=
+cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU=
+cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U=
+cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA=
+cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M=
+cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg=
+cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s=
+cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM=
+cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk=
+cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA=
cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY=
cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI=
+cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4=
+cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI=
+cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y=
+cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs=
cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
@@ -68,171 +174,498 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz
cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=
-cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk=
-cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI=
+cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
+cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
+cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE=
+cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo=
+cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA=
+cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs=
+cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU=
+cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE=
+cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=
cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
-cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
+cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
+cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY=
+cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY=
+cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=
+cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=
+cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w=
+cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg=
+cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo=
+cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4=
+cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM=
+cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA=
cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=
+cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI=
+cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s=
cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0=
cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs=
cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc=
-cloud.google.com/go/datacatalog v1.19.0 h1:rbYNmHwvAOOwnW2FPXYkaK3Mf1MmGqRzK0mMiIEyLdo=
-cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM=
+cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE=
+cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM=
+cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M=
+cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0=
+cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8=
+cloud.google.com/go/datacatalog v1.20.4 h1:nUR7JBPZezl1+o+86N01VxAQQHY+It/D8tmNipcdVjI=
+cloud.google.com/go/datacatalog v1.20.4/go.mod h1:71PDwywIYkNgSXdUU3H0mkTp3j15aahfYJ1CY3DogtU=
cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM=
cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ=
+cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE=
cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo=
cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE=
+cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0=
+cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA=
+cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE=
+cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38=
+cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w=
+cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8=
cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I=
cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ=
+cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM=
+cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA=
+cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A=
+cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ=
+cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs=
+cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s=
+cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI=
+cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4=
cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo=
cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA=
+cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM=
+cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c=
cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo=
cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ=
+cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g=
+cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4=
+cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs=
+cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww=
+cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c=
+cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s=
+cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI=
+cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ=
cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4=
cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0=
+cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8=
+cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek=
+cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0=
+cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM=
+cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4=
+cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE=
+cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM=
+cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q=
+cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4=
cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU=
cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU=
+cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k=
+cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4=
+cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM=
+cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs=
cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y=
cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg=
+cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE=
cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk=
+cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w=
+cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc=
+cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY=
+cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU=
+cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI=
+cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8=
+cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M=
+cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc=
+cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw=
+cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw=
+cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY=
+cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w=
+cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI=
+cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs=
+cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg=
+cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE=
cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk=
cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg=
+cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY=
+cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08=
+cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw=
+cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA=
+cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c=
cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM=
cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA=
+cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w=
+cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM=
+cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0=
+cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60=
+cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo=
+cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg=
cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o=
cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A=
+cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw=
cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0=
cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0=
+cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E=
+cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw=
+cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA=
+cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI=
+cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y=
cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
+cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM=
+cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o=
+cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo=
+cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c=
cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
-cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI=
-cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8=
+cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc=
+cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg=
+cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE=
+cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY=
+cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY=
+cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0=
+cloud.google.com/go/iam v1.1.12 h1:JixGLimRrNGcxvJEQ8+clfLxPlbeZA6MuRJ+qJNQ5Xw=
+cloud.google.com/go/iam v1.1.12/go.mod h1:9LDX8J7dN5YRyzVHxwQzrQs9opFFqn0Mxs9nAeB+Hhg=
+cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=
+cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=
+cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk=
+cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo=
+cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74=
+cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM=
+cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY=
+cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4=
+cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs=
+cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g=
+cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o=
+cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE=
+cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA=
+cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg=
+cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0=
+cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg=
+cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w=
+cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24=
+cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI=
cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
+cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE=
+cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8=
+cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY=
cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08=
-cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg=
-cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI=
+cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo=
+cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw=
+cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M=
+cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
+cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
+cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo=
+cloud.google.com/go/longrunning v0.5.11 h1:Havn1kGjz3whCfoD8dxMLP73Ph5w+ODyZB9RUsDxtGk=
+cloud.google.com/go/longrunning v0.5.11/go.mod h1:rDn7//lmlfWV1Dx6IB4RatCPenTwwmqXuiP0/RgoEO4=
+cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
+cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
+cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA=
+cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI=
+cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw=
+cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY=
cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4=
cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w=
+cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I=
cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=
cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM=
+cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA=
+cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY=
+cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM=
cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY=
cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s=
+cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8=
+cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI=
+cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo=
+cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk=
+cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4=
+cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w=
+cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw=
cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA=
cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o=
+cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM=
+cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8=
+cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E=
+cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM=
+cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8=
+cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4=
+cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY=
cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ=
cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU=
+cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k=
+cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU=
cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY=
cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34=
+cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA=
+cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0=
+cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE=
+cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ=
+cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4=
+cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs=
+cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI=
+cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA=
+cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk=
+cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ=
+cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE=
+cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc=
+cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc=
cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs=
cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg=
+cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo=
+cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw=
+cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw=
cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E=
cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU=
+cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70=
+cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo=
+cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs=
cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0=
cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA=
+cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk=
+cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg=
+cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE=
+cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw=
+cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc=
cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0=
cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI=
+cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg=
+cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI=
+cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0=
+cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8=
+cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4=
+cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg=
+cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k=
+cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM=
cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4=
cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o=
cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk=
+cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo=
+cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE=
+cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U=
+cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA=
+cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c=
cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg=
cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4=
+cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac=
cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg=
cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c=
+cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs=
+cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70=
+cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ=
cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y=
cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A=
+cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA=
+cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM=
+cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ=
+cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA=
+cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0=
+cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots=
+cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo=
+cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI=
+cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=
+cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=
+cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA=
cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4=
cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY=
+cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc=
+cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y=
+cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14=
+cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do=
+cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo=
+cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM=
+cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg=
cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s=
cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI=
+cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk=
+cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44=
+cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc=
+cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc=
cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA=
+cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4=
+cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4=
+cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU=
cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4=
cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0=
cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU=
+cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q=
+cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA=
+cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8=
+cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0=
cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU=
cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc=
+cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk=
+cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk=
+cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0=
+cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag=
+cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU=
+cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s=
+cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA=
+cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc=
+cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk=
cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs=
cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg=
-cloud.google.com/go/spanner v1.53.0 h1:/NzWQJ1MEhdRcffiutRKbW/AIGVKhcTeivWTDjEyCCo=
-cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws=
+cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4=
+cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U=
+cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY=
+cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s=
+cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco=
+cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo=
+cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc=
+cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4=
+cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E=
+cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU=
+cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec=
+cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA=
+cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4=
+cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw=
+cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A=
+cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=
+cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk=
+cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M=
+cloud.google.com/go/spanner v1.64.0 h1:ltyPbHA/nRAtAhU/o742dXBCI1eNHPeaRY09Ja8B+hM=
+cloud.google.com/go/spanner v1.64.0/go.mod h1:TOFx3pb2UwPsDGlE1gTehW+y6YlU4IFk+VdDHSGQS/M=
cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=
cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=
+cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=
+cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco=
+cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0=
+cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=
-cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM=
-cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E=
+cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
+cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y=
+cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4=
+cloud.google.com/go/storage v1.42.0 h1:4QtGpplCVt1wz6g5o1ifXd656P5z+yNgzdw1tVfp0cU=
+cloud.google.com/go/storage v1.42.0/go.mod h1:HjMXRFq65pGKFn6hxj6x3HCyR41uSB72Z0SO/Vn6JFQ=
+cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w=
+cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I=
+cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4=
+cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw=
cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=
cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g=
+cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM=
+cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA=
+cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c=
+cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8=
+cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4=
+cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc=
+cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ=
+cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg=
+cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM=
+cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28=
+cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y=
+cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA=
+cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk=
+cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs=
+cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg=
+cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0=
+cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos=
+cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos=
+cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk=
+cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw=
+cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg=
+cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk=
+cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ=
+cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ=
cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=
cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4=
+cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M=
+cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU=
+cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU=
cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0=
cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo=
cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo=
+cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY=
+cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E=
+cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY=
+cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0=
+cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE=
+cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g=
+cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc=
+cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY=
+cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208=
+cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8=
+cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY=
+cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w=
+cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8=
+cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes=
cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE=
cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg=
+cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc=
+cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A=
+cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg=
+cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo=
+cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ=
+cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng=
cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0=
cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M=
+cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
+cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
+cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
+dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
+dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-fyne.io/fyne v1.4.2/go.mod h1:xL4c3WmpE/Tvz5CEm5vqsaizU/EeOCm9DYlL2GtTSiM=
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
+gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
+git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs=
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4=
github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0=
github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 h1:fb8kj/Dh4CSwgsOzHeZY4Xh68cFVbzXx+ONXGMY//4w=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0/go.mod h1:uReU2sSxZExRPBAg3qKzmAucSi51+SP1OhohieR821Q=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs=
-github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 h1:d81/ng9rET2YqdVkVwkb6EXeRrLJIwyGnJcAlAWKwhs=
-github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI=
-github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8=
-github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4=
-github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0 h1:yfJe15aSwEQ6Oo6J+gdfdulPNoZ3TEhmbhLIoxZcA+U=
-github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0/go.mod h1:Q28U+75mpCaSCDowNEmhIo/rmgdkqmkmzI7N6TGR4UY=
-github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 h1:T028gtTPiYt/RMUfs8nVsAL7FDQrfLlrm/NnRG/zcC4=
-github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0/go.mod h1:cw4zVQgBby0Z5f2v0itn6se2dDP17nTjbZFXW5uPyHA=
-github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 h1:gggzg0SUMs6SQbEw+3LoSsYf9YMjkupeAnHMX8O9mmY=
-github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0/go.mod h1:+6KLcKIVgxoBDMqMO/Nvy7bZ9a0nbU3I1DtFQK3YvB4=
-github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
-github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
-github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 h1:hVeq+yCyUi+MsoO/CU95yqCIcdzra5ovzk8Q2BBpV2M=
-github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc=
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw=
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY=
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80=
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI=
+github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.0 h1:Be6KInmFEKV81c0pOAEbRYehLMwmmGI1exuFj248AMk=
+github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.0/go.mod h1:WCPBHsOXfBVnivScjs2ypRfimjEW0qPVLGgJkZlrIOA=
+github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
+github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
-github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
+github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/ClickHouse/ch-go v0.60.0 h1:kDZcVIKKHk7jwqSP5RYdTvabrAyUQYvGFRUdtDVkISA=
-github.com/ClickHouse/ch-go v0.60.0/go.mod h1:POJBl0MxEMS91Zd0uTgDDt05KfXEjf5KIwW6lNhje9Y=
-github.com/ClickHouse/clickhouse-go/v2 v2.16.0 h1:rhMfnPewXPnY4Q4lQRGdYuTLRBRKJEIEYHtbUMrzmvI=
-github.com/ClickHouse/clickhouse-go/v2 v2.16.0/go.mod h1:J7SPfIxwR+x4mQ+o8MLSe0oY50NNntEqCIjFe/T1VPM=
+github.com/ClickHouse/ch-go v0.62.0 h1:eXH0hytXeCEEZHgMvOX9IiW7wqBb4w1MJMp9rArbkrc=
+github.com/ClickHouse/ch-go v0.62.0/go.mod h1:uzso52/PD9+gZj7tL6XAo8/EYDrx7CIwNF4c6PnO6S0=
+github.com/ClickHouse/clickhouse-go/v2 v2.26.0 h1:j4/y6NYaCcFkJwN/TU700ebW+nmsIy34RmUAAcZKy9w=
+github.com/ClickHouse/clickhouse-go/v2 v2.26.0/go.mod h1:iDTViXk2Fgvf1jn2dbJd1ys+fBkdD1UMRnXlwmhijhQ=
github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
-github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
-github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
+github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
+github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
github.com/DataDog/zstd v1.5.6-0.20230622172052-ea68dcab66c0 h1:ye3LRgDs6Og7SKC1wBQH8oMaGczhCRpPpnU74l4rma8=
github.com/DataDog/zstd v1.5.6-0.20230622172052-ea68dcab66c0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
+github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 h1:oVLqHXhnYtUwM89y9T1fXGaK9wTkXHgNp8/ZNMQzUxE=
+github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0=
github.com/IBM/nzgo v11.1.0+incompatible h1:CaaDdlBodPo+ZiHuMMWBpfSQlSH88/nxCzsdCnQRbAA=
github.com/IBM/nzgo v11.1.0+incompatible/go.mod h1:n1QK6KJjNa8fe+HQPynW+mJpRpkffLXMO8LR9Nja0JU=
github.com/IBM/nzgo/v12 v12.0.8 h1:unEfHMkLoy3Jpexuh//vJEo1OOzrVoux4lNSsUxbwJA=
github.com/IBM/nzgo/v12 v12.0.8/go.mod h1:8pc57twtekw0e38NedvaxVuf80Hy3JR95ORTKEvUyAQ=
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU=
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
-github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I=
github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
@@ -240,112 +673,112 @@ github.com/MichaelS11/go-cql-driver v0.1.1 h1:ntFKov/39Tl36HckP4tzld3XMeyDYHHO00
github.com/MichaelS11/go-cql-driver v0.1.1/go.mod h1:rMwGk5bMWiYI/If6r6dbqEfZG6nQLvqJHTplv5yTDaw=
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
-github.com/Microsoft/hcsshim v0.11.1 h1:hJ3s7GbWlGK4YVV92sO88BQSyF4ZLVy7/awqOlPxFbA=
-github.com/Microsoft/hcsshim v0.11.1/go.mod h1:nFJmaO4Zr5Y7eADdFOpYswDDlNVbvcIJJNJLECr5JQg=
+github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8=
+github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w=
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/SAP/go-hdb v1.6.3 h1:O2DTMCf4vGYG7W6TjrSIezUz7y0mF5j/E6w6ol1pbho=
-github.com/SAP/go-hdb v1.6.3/go.mod h1:TKQ0SvP6dwcVKCu4q9yisg5mTtWPoAbc3lLzkgrAC5M=
+github.com/SAP/go-hdb v1.10.1 h1:c9dGT5xHZNDwPL3NQcRpnNISn3MchwYaGoMZpCAllUs=
+github.com/SAP/go-hdb v1.10.1/go.mod h1:vxYDca44L2eRudZv5JAI6T+IygOfxb7vOCFh/Kj0pug=
github.com/UNO-SOFT/zlog v0.8.1 h1:TEFkGJHtUfTRgMkLZiAjLSHALjwSBdw6/zByMC5GJt4=
github.com/UNO-SOFT/zlog v0.8.1/go.mod h1:yqFOjn3OhvJ4j7ArJqQNA+9V+u6t9zSAyIZdWdMweWc=
github.com/VoltDB/voltdb-client-go v1.0.15 h1:G7rZxKiemYkaYZLoLamhRnAOGyq5wlyqPefCAAflB/0=
github.com/VoltDB/voltdb-client-go v1.0.15/go.mod h1:mMhb5zwkT46Ef3NvkFqt+kX0j+ltQ2Sdqj9+ICq+Yto=
-github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
-github.com/alecthomas/assert/v2 v2.2.1 h1:XivOgYcduV98QCahG8T5XTezV5bylXe+lBxLG2K2ink=
-github.com/alecthomas/assert/v2 v2.2.1/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=
-github.com/alecthomas/chroma/v2 v2.11.1 h1:m9uUtgcdAwgfFNxuqj7AIG75jD2YmL61BBIJWtdzJPs=
-github.com/alecthomas/chroma/v2 v2.11.1/go.mod h1:4TQu7gdfuPjSh76j78ietmqh9LiurGF0EpseFXdKMBw=
-github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
-github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
-github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk=
-github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
-github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
-github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
+github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA=
+github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k=
+github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
+github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
+github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
+github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
+github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE=
+github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
+github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E=
+github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I=
+github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
+github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/alexbrainman/odbc v0.0.0-20230814102256-1421b829acc9 h1:Evz52dTPsOXCOQr953SIXw7/7FB1jj+Z3NzWVzV54qA=
github.com/alexbrainman/odbc v0.0.0-20230814102256-1421b829acc9/go.mod h1:c5eyz5amZqTKvY3ipqerFO/74a/8CYmXOahSr40c+Ww=
github.com/aliyun/aliyun-tablestore-go-sdk v1.7.3/go.mod h1:PWqq46gZJf7mnYTAuTmxKgx6EwJu3oBpOs1s2V0EZPM=
-github.com/aliyun/aliyun-tablestore-go-sdk v1.7.11 h1:ZFZs0Oa2xuKbn4SvPpO6mEkufz0e+q0WeXqZFhqYRtY=
-github.com/aliyun/aliyun-tablestore-go-sdk v1.7.11/go.mod h1:aVqKjL2cmkgs0JOUf++ayBLI5ChiUdrbRp1vcA77c64=
+github.com/aliyun/aliyun-tablestore-go-sdk v1.7.15 h1:xWsS17q0vSwdO13ZPzQVIAiLGHAgJs/zqPf6bUZpHrQ=
+github.com/aliyun/aliyun-tablestore-go-sdk v1.7.15/go.mod h1:JzOJMpBPGN+4cuYnrGO5wdwphEyqbeGVY2vCaiAcNW8=
github.com/aliyun/aliyun-tablestore-go-sql-driver v0.0.0-20220418015234-4d337cb3eed9 h1:DpsLZRlqHH1b2QyoLDK1/MtUtm7zuiQweA6hsTY97do=
github.com/aliyun/aliyun-tablestore-go-sql-driver v0.0.0-20220418015234-4d337cb3eed9/go.mod h1:4yTI9ZSYNi4eENMKL8VWP22MzoDKeqDT4j7Fd103BVQ=
github.com/amsokol/ignite-go-client v0.12.2 h1:q4Mr+UUiKVnR7ykjR1YARVS5jp+ZU6ekCIs0V4WgFDo=
github.com/amsokol/ignite-go-client v0.12.2/go.mod h1:K3tKJGcLQORFD+ds7f0f9fl88tv0KZcpfuNhzRyuLVE=
-github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI=
-github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
+github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
+github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
+github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0=
+github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI=
github.com/apache/arrow/go/v12 v12.0.1 h1:JsR2+hzYYjgSUkBSaahpqCetqZMr76djX80fF/DiJbg=
github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw=
-github.com/apache/calcite-avatica-go/v5 v5.2.0 h1:9SQf9qz/iUaC39lvRDqFGmVVtoIWtnDB94YNg2Dy+UY=
-github.com/apache/calcite-avatica-go/v5 v5.2.0/go.mod h1:R9YlGqS8pPRnWAW1peGPpVax49XcujI7GLebaz9sOfk=
-github.com/apache/thrift v0.19.0 h1:sOqkWPzMj7w6XaYbJQG7m4sGqVolaW/0D28Ln7yPzMk=
-github.com/apache/thrift v0.19.0/go.mod h1:SUALL216IiaOw2Oy+5Vs9lboJ/t9g40C+G07Dc0QC1I=
+github.com/apache/arrow/go/v14 v14.0.2 h1:N8OkaJEOfI3mEZt07BIkvo4sC6XDbL+48MBPWO5IONw=
+github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY=
+github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE=
+github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA=
+github.com/apache/arrow/go/v16 v16.1.0 h1:dwgfOya6s03CzH9JrjCBx6bkVb4yPD4ma3haj9p7FXI=
+github.com/apache/arrow/go/v16 v16.1.0/go.mod h1:9wnc9mn6vEDTRIm4+27pEjQpRKuTvBaessPoEXQzxWA=
+github.com/apache/calcite-avatica-go/v5 v5.3.0 h1:7Gooh7opt3TObRe7WstTWbQGaA16ERjzoGeB26l3s/w=
+github.com/apache/calcite-avatica-go/v5 v5.3.0/go.mod h1:xgozzeFAHCh2ZZ7NCrD4CHx9waunSMOMXLDZRj9Gn3s=
+github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU=
+github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI=
+github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8=
github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0=
github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
github.com/aws/aws-sdk-go v1.37.32/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
-github.com/aws/aws-sdk-go v1.48.8 h1:KE7PPWWbvU/qvuSCASrKalblCZGsYaiU5JVw6vsGAWI=
-github.com/aws/aws-sdk-go v1.48.8/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
-github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw=
-github.com/aws/aws-sdk-go-v2 v1.23.3 h1:Q98kldotjjQimJumYc7tjJRBWOefARezGhP8nIlnExE=
-github.com/aws/aws-sdk-go-v2 v1.23.3/go.mod h1:6wqGJPusLvL1YYcoxj4vPtACABVl0ydN1sxzBetRcsw=
-github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.2 h1:1oGZAnpWWnJgPPWC07RrXt2Ah0qbfbzP466aruiX8pk=
-github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.2/go.mod h1:XBiFjNGW7x9HG45+j5YGxEcN83ORvTNbzE54kNDJuYo=
-github.com/aws/aws-sdk-go-v2/config v1.25.9 h1:B04q0cjw4nkynqKsKAusTokhlWH2rOt9NsciQuT1UZE=
-github.com/aws/aws-sdk-go-v2/config v1.25.9/go.mod h1:HeYi24CXmvvcFGip8e60q7b0dnrpL6QHn57/eetIW+g=
-github.com/aws/aws-sdk-go-v2/credentials v1.13.27/go.mod h1:syOqAek45ZXZp29HlnRS/BNgMIW6uiRmeuQsz4Qh2UE=
-github.com/aws/aws-sdk-go-v2/credentials v1.16.7 h1:n07M7lmFiEuyefWXkm7OMSFZLit8BDy2qaw+kMEvycw=
-github.com/aws/aws-sdk-go-v2/credentials v1.16.7/go.mod h1:i5yksOJbXOIZVqv10vOFZeT4wgdWFWviM3e9iMuTGlQ=
-github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.31 h1:E8dD+ybAgXQDoXzFdosX8nKBG78yZLZLY83JGtuvyx8=
-github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.31/go.mod h1:KBfz/i2tcY+0H3IOOOMVk9Olw8GRmgFPlKamh4Ro0ts=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5/go.mod h1:Gj7tm95r+QsDoN2Fhuz/3npQvcZbkEf5mL70n3Xfluc=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.7 h1:Uo0l91jAocWBN8bJzAsAeSLE3WBwGBG9+pbE9zVH5dA=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.7/go.mod h1:flStEZ4FT4jfSRGMYaA4gWBU28u5uLJ1CNsSbdhucng=
-github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.2 h1:nW/0hPtPEnwIHv+bYeu8Y3Et2UvlFX0fEbgB/1AaeT4=
-github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.2/go.mod h1:nQKVS2n6oYb6GfOAvURbuBC7gHs5TWtFFq58R61imz4=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.6 h1:i7OAczGP6jELUbKC8p/qS/LwCc0U3OKZqWQbb8lp0CA=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.6/go.mod h1:d8JTl9EfMC8x7cWRUTOBNHTk/GJ9UsqdANQqAAMKo4s=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.6 h1:1oWfl2FGxd7jYqmxbCZHI634v1FOoCWyBLYj9Imj0wM=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.6/go.mod h1:9hhwbyCoH/tgJqXTVj/Ef0nGYJVr7+R/pfOx4OZ99KU=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.6 h1:PwAdPhlij28U62OUi+WmxQ+9bO1efg6coxpE+sk00dg=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.6/go.mod h1:KRa2wmoEt38uXpnNKtORDswczZGl1hQNDrkfE6+LhnM=
-github.com/aws/aws-sdk-go-v2/service/dynamodb v1.20.1 h1:gknY3OHEGXaLamootb1VaJSohtHwcIMGvm23VnZVIzE=
-github.com/aws/aws-sdk-go-v2/service/dynamodb v1.20.1/go.mod h1:iA/evsHrPWhDyMj6cuMa6qlFTqSqYXoKs8LSvIFauTA=
-github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.15 h1:yonnEISVD77M77F813Va41d8wl3A1W6HhfEmrVOcqfM=
-github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.15/go.mod h1:3zUTVwCixtSfFyNFK0P0x92IMkfTZQpuXH7Lk/WbW9g=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.2 h1:/3LHJKFV+VEIEIZi2I3q4K2wgQwNwAW2t0SXnCCEg28=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.2/go.mod h1:IfJeNmXVQIpeR7LviG93t479TtAkBqF92cSnyy5yG1o=
-github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.6 h1:eU9m+2vE8ILkr71WK5RJ2pysYngcKoN1Kv5kThuV6J4=
-github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.6/go.mod h1:W8gOSyIsMgmaFnm+CkRHLz0skCyz9cS5SZlBalHkzII=
-github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.29 h1:gajv/wALzb2KgK9YKq1jW+y2ZgL5o4A+UZmFfZi8lSY=
-github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.29/go.mod h1:SYEgYIjFeLoPSOCIqdFr44QiBwGlnsUIHqMD5OZnsgg=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29/go.mod h1:fDbkK4o7fpPXWn8YAPmTieAMuB9mk/VgvW64uaUqxd4=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.6 h1:8CbUQkqKstwiVI4fz74O7hFfOyQfsA4UuaJtO+X0nX8=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.6/go.mod h1:ssHSTCS9CeO6QDbT5+2e6shPpZhzLNSwI5KvgH9rKdM=
-github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.6 h1:GCW9ULjE7qIwzGPcoOnv4h4htx/XxWDy+WJevY30QcI=
-github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.6/go.mod h1:YqS77Hii1ITov+Tpf0CGkQdBJCm5L9Wo2C7fhask92M=
-github.com/aws/aws-sdk-go-v2/service/s3 v1.47.0 h1:7KZW8jwPTB/94/ghX8j+kw03zl2ftxDv7PGwA0l+6uw=
-github.com/aws/aws-sdk-go-v2/service/s3 v1.47.0/go.mod h1:bL8ey+ugMUesj7F1tF8GJkq14i7qhIsSaCJshRWC3Og=
-github.com/aws/aws-sdk-go-v2/service/sso v1.12.13/go.mod h1:DfX0sWuT46KpcqbMhJ9QWtxAIP1VozkDWf8VAkByjYY=
-github.com/aws/aws-sdk-go-v2/service/sso v1.18.0 h1:JX7BhiMtfBARMib+HHKwBJIT9KOJ1Pd3WCuMTawlFGg=
-github.com/aws/aws-sdk-go-v2/service/sso v1.18.0/go.mod h1:Ue5IlnFHeOoLpNXylq+J3Ue3Fq8MjAcSuh8wCqSHKQ0=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13/go.mod h1:BzqsVVFduubEmzrVtUFQQIQdFqvUItF8XUq2EnS8Wog=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.0 h1:ffOjyqfqEgqZv5zeXfaLaUKofqoSP3znpWxUKkRbBc4=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.0/go.mod h1:FTwjnnqupa0CRANldhsnRVgzaPzhAy/XZYddy06JOLU=
-github.com/aws/aws-sdk-go-v2/service/sts v1.19.3/go.mod h1:yVGZA1CPkmUhBdA039jXNJJG7/6t+G+EBWmFq23xqnY=
-github.com/aws/aws-sdk-go-v2/service/sts v1.26.0 h1:E0i/PbCoOu04ichWZfLoSgidxkHh7HGfC8l9HWdALi8=
-github.com/aws/aws-sdk-go-v2/service/sts v1.26.0/go.mod h1:YHpL2uHCmZtSkDJYc2gG0LSZkeColBGi2TZyCFG8GmE=
-github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
-github.com/aws/smithy-go v1.18.0 h1:uWqjOwPEqjzmQXpwm/8cwUWTmFhT9Ypc8tECXrshDsI=
-github.com/aws/smithy-go v1.18.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE=
-github.com/beltran/gohive v1.6.0 h1:VqKaSeYhae4cY9QHfw8uqWZARq9yJdydiOVsqS63KbE=
-github.com/beltran/gohive v1.6.0/go.mod h1:IgDi0gD1c73aKKQyS+3j1+NWSNn5NUK7rDcg/Rr6mTs=
-github.com/beltran/gosasl v0.0.0-20231124144235-92b2e4f10bb6 h1:OPqfeBd/oCkMl9I4D999xqr8ExmXWA6I2tXIKsGlTLQ=
-github.com/beltran/gosasl v0.0.0-20231124144235-92b2e4f10bb6/go.mod h1:Qx8cW6jkI8riyzmklj80kAIkv+iezFUTBiGU0qHhHes=
+github.com/aws/aws-sdk-go v1.55.3 h1:0B5hOX+mIx7I5XPOrjrHlKSDQV/+ypFZpIHOx5LOk3E=
+github.com/aws/aws-sdk-go v1.55.3/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
+github.com/aws/aws-sdk-go-v2 v1.30.3 h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY=
+github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc=
+github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 h1:tW1/Rkad38LA15X4UQtjXZXNKsCgkshC3EbmcUmghTg=
+github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3/go.mod h1:UbnqO+zjqk3uIt9yCACHJ9IVNhyhOCnYk8yA19SAWrM=
+github.com/aws/aws-sdk-go-v2/config v1.27.27 h1:HdqgGt1OAP0HkEDDShEl0oSYa9ZZBSOmKpdpsDMdO90=
+github.com/aws/aws-sdk-go-v2/config v1.27.27/go.mod h1:MVYamCg76dFNINkZFu4n4RjDixhVr51HLj4ErWzrVwg=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.27 h1:2raNba6gr2IfA0eqqiP2XiQ0UVOpGPgDSi0I9iAP+UI=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.27/go.mod h1:gniiwbGahQByxan6YjQUMcW4Aov6bLC3m+evgcoN4r4=
+github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.14.10 h1:orAIBscNu5aIjDOnKIrjO+IUFPMLKj3Lp0bPf4chiPc=
+github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.14.10/go.mod h1:GNjJ8daGhv10hmQYCnmkV8HuY6xXOXV4vzBssSjEIlU=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 h1:KreluoV8FZDEtI6Co2xuNk/UqI9iwMrOx/87PBNIKqw=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11/go.mod h1:SeSUYBLsMYFoRvHE0Tjvn7kbxaUhl75CJi1sbfhMxkU=
+github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.9 h1:TC2vjvaAv1VNl9A0rm+SeuBjrzXnrlwk6Yop+gKRi38=
+github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.9/go.mod h1:WPv2FRnkIOoDv/8j2gSUsI4qDc7392w5anFB/I89GZ8=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15/go.mod h1:U9ke74k1n2bf+RIgoX1SXFed1HLs51OgUSs+Ph0KJP8=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 h1:C6WHdGnTDIYETAm5iErQUiVNsclNx9qbJVPIt03B6bI=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15/go.mod h1:ZQLZqhcu+JhSrA9/NXRm8SkDvsycE+JkV3WGY41e+IM=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15 h1:Z5r7SycxmSllHYmaAZPpmN8GviDrSGhMS6bldqtXZPw=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15/go.mod h1:CetW7bDE00QoGEmPUoZuRog07SGVAUVW6LFpNP0YfIg=
+github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.4 h1:utG3S4T+X7nONPIpRoi1tVcQdAdJxntiVS2yolPJyXc=
+github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.4/go.mod h1:q9vzW3Xr1KEXa8n4waHiFt1PrppNDlMymlYP+xpsFbY=
+github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.3 h1:r27/FnxLPixKBRIlslsvhqscBuMK8uysCYG9Kfgm098=
+github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.3/go.mod h1:jqOFyN+QSWSoQC+ppyc4weiO8iNQXbzRbxDjQ1ayYd4=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17 h1:YPYe6ZmvUfDDDELqEKtAd6bo8zxhkm+XEFEzQisqUIE=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17/go.mod h1:oBtcnYua/CgzCWYN7NZ5j7PotFDaFSUjCYVTtfyn7vw=
+github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.16 h1:lhAX5f7KpgwyieXjbDnRTjPEUI0l3emSRyxXj1PXP8w=
+github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.16/go.mod h1:AblAlCwvi7Q/SFowvckgN+8M3uFPlopSYeLlbNDArhA=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 h1:HGErhhrxZlQ044RiM+WdoZxp0p+EGM62y3L6pwA4olE=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17/go.mod h1:RkZEx4l0EHYDJpWppMJ3nD9wZJAa8/0lq9aVC+r2UII=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15 h1:246A4lSTXWJw/rmlQI+TT2OcqeDMKBdyjEQrafMaQdA=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15/go.mod h1:haVfg3761/WF7YPuJOER2MP0k4UAXyHaLclKXB6usDg=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.58.2 h1:sZXIzO38GZOU+O0C+INqbH7C2yALwfMWpd64tONS/NE=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.58.2/go.mod h1:Lcxzg5rojyVPU/0eFwLtcyTaek/6Mtic5B1gJo7e/zE=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 h1:BXx0ZIxvrJdSgSvKTZ+yRBeSqqgPM89VPlulEcl37tM=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.4/go.mod h1:ooyCOXjvJEsUw7x+ZDHeISPMhtwI3ZCB7ggFMcFfWLU=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 h1:yiwVzJW2ZxZTurVbYWA7QOrAaCYQR72t0wrSBfoesUE=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4/go.mod h1:0oxfLkpz3rQ/CHlx5hB7H69YUpFiI1tql6Q6Ne+1bCw=
+github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 h1:ZsDKRLXGWHk8WdtyYMoGNO7bTudrvuKpDKgMVRlepGE=
+github.com/aws/aws-sdk-go-v2/service/sts v1.30.3/go.mod h1:zwySh8fpFyXp9yOr/KVzxOl8SRqgf/IDw5aUt9UKFcQ=
+github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE=
+github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
+github.com/beltran/gohive v1.7.0 h1:Jvz6yrWuAAUWZ1Y84+24NjMcWYkUZZBUE7/sTWtLKY0=
+github.com/beltran/gohive v1.7.0/go.mod h1:IgDi0gD1c73aKKQyS+3j1+NWSNn5NUK7rDcg/Rr6mTs=
+github.com/beltran/gosasl v0.0.0-20240525201126-ea45571eeb66 h1:n0oppIiuivyic1ER0KPR6atp3xouMWt1tEtqM4OyvnI=
+github.com/beltran/gosasl v0.0.0-20240525201126-ea45571eeb66/go.mod h1:Qx8cW6jkI8riyzmklj80kAIkv+iezFUTBiGU0qHhHes=
github.com/beltran/gssapi v0.0.0-20200324152954-d86554db4bab h1:ayfcn60tXOSYy5zUN1AMSTQo4nJCf7hrdzAVchpPst4=
github.com/beltran/gssapi v0.0.0-20200324152954-d86554db4bab/go.mod h1:GLe4UoSyvJ3cVG+DVtKen5eAiaD8mAJFuV5PT3Eeg9Q=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@@ -353,140 +786,151 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bippio/go-impala v2.1.0+incompatible h1:H/N1Ms5KhVa2IoRZ6NO9ZzBryfTGhNiLG/zmNXS0CHY=
github.com/bippio/go-impala v2.1.0+incompatible/go.mod h1:lcyV/9s/ri5lFj3zdyyneQwDso8/Fd62fELt05Wts8g=
+github.com/bitfield/gotestdox v0.2.2 h1:x6RcPAbBbErKLnapz1QeAlf3ospg8efBsedU93CDsnE=
+github.com/bitfield/gotestdox v0.2.2/go.mod h1:D+gwtS0urjBrzguAkTM2wodsTQYFHdpx8eqRJ3N+9pY=
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY=
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
-github.com/btnguyen2k/consu/checksum v0.1.2/go.mod h1:/zZ8EXdphDYEkBFua51hK9y3rODCPIkiZYnCDlHT670=
-github.com/btnguyen2k/consu/checksum v1.1.0 h1:1Sqa48s9WJsejwmVUfmSsSBG0z7sPfgSQa8atKCiMqY=
-github.com/btnguyen2k/consu/checksum v1.1.0/go.mod h1:/zZ8EXdphDYEkBFua51hK9y3rODCPIkiZYnCDlHT670=
-github.com/btnguyen2k/consu/gjrc v0.1.1/go.mod h1:jOTI8M8Kkly9fHyeSoBTw3o2Q9ayQEEYTHQfedIEqzE=
-github.com/btnguyen2k/consu/gjrc v0.2.1 h1:RUgbgs1NDpuUDfY7PSyva8AShyui+ds1MOzmi2k0SfM=
-github.com/btnguyen2k/consu/gjrc v0.2.1/go.mod h1:+aPcD9tY5x8gHH5+RdCqBDvEO4hw4kXruUz+lBG01QI=
+github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
+github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
+github.com/btnguyen2k/consu/checksum v1.1.1 h1:kdIJGk3yl83Nn1HxZRk3bXJM0xvlwTcTYUmZ8BiloPU=
+github.com/btnguyen2k/consu/checksum v1.1.1/go.mod h1:/zZ8EXdphDYEkBFua51hK9y3rODCPIkiZYnCDlHT670=
+github.com/btnguyen2k/consu/g18 v0.1.0 h1:IoS5w5QlOfkcrNOHJyICD6PgqLh+J5fIDqy3vRBVcVM=
+github.com/btnguyen2k/consu/g18 v0.1.0/go.mod h1:gTPcr87XdCLDISusRQyDey22/ZOw6bLh6EChxTLx6/c=
+github.com/btnguyen2k/consu/gjrc v0.2.2 h1:CAY8xPgvtWc7EMTE9gxam/BxMgTRRpc4Hs9QEyYxRUc=
+github.com/btnguyen2k/consu/gjrc v0.2.2/go.mod h1:Sc0NehbI0i8V6FAY9qX1we9XXbWNnrMOb9jNpYqGBWk=
github.com/btnguyen2k/consu/olaf v0.1.3 h1:0dWWmN5nOB/9pJdo7o1S3wR2+l3kG7pXHv3Vwki8uNM=
github.com/btnguyen2k/consu/olaf v0.1.3/go.mod h1:6ybEnJcdcK/PNiSfkKnMoxYuKyH2vJPBvHRuuZpPvD8=
-github.com/btnguyen2k/consu/reddo v0.1.4/go.mod h1:6L2l4rRFQlyGWlKxt9SiwYs/wB6SE70oxFcrTo/YLPY=
-github.com/btnguyen2k/consu/reddo v0.1.6/go.mod h1:6L2l4rRFQlyGWlKxt9SiwYs/wB6SE70oxFcrTo/YLPY=
github.com/btnguyen2k/consu/reddo v0.1.7/go.mod h1:pdY5oIVX3noZIaZu3nvoKZ59+seXL/taXNGWh9xJDbg=
-github.com/btnguyen2k/consu/reddo v0.1.8 h1:pEAkB6eadp/q+ONy97/JkAAyj058uIgkSu8b862Fwug=
github.com/btnguyen2k/consu/reddo v0.1.8/go.mod h1:pdY5oIVX3noZIaZu3nvoKZ59+seXL/taXNGWh9xJDbg=
-github.com/btnguyen2k/consu/semita v0.1.4/go.mod h1:EmOAKM4o+iljiR2kShq3MlIvGrzALnUW4IkgI292p10=
+github.com/btnguyen2k/consu/reddo v0.1.9 h1:NZyEzRcDXzksNMnvZVZyJmGN6ZQQmHg4hIPCPbfsCBE=
+github.com/btnguyen2k/consu/reddo v0.1.9/go.mod h1:pdY5oIVX3noZIaZu3nvoKZ59+seXL/taXNGWh9xJDbg=
github.com/btnguyen2k/consu/semita v0.1.5 h1:fu71xNJTbCV8T+6QPJdJu3bxtmLWvTjCepkvujF74+I=
github.com/btnguyen2k/consu/semita v0.1.5/go.mod h1:fksCe3L4kxiJVnKKhUXKI8mcFdB9974mtedwUVVFu1M=
-github.com/btnguyen2k/gocosmos v0.3.0 h1:218OaZpnWRuXoHiLA8DuSf80xL0If7n9Yt8N6t2JWvI=
-github.com/btnguyen2k/gocosmos v0.3.0/go.mod h1:eToVV+1+mpht97WvC/EzTOb+4kHTUc/9Z2zNUSKbCUI=
-github.com/btnguyen2k/godynamo v0.4.0 h1:LRZP+zUJTmjdiiw79nYeROL7DYgOnMfDgQ8HT6TqjYg=
-github.com/btnguyen2k/godynamo v0.4.0/go.mod h1:bSdMy6LEfgRW6X3tOOEKS6xfuQgSmaMYIzFU59NqP2k=
+github.com/btnguyen2k/consu/semver v0.2.1 h1:le0FzrM7u0IOR4MnOyBySHpZ/p3vV4JjofAhPB7edWE=
+github.com/btnguyen2k/consu/semver v0.2.1/go.mod h1:jxK/nwIWTXcWlcWcfkhPfLWq9b5dVzAtJLycySBFHTc=
+github.com/btnguyen2k/gocosmos v1.1.0 h1:16OIhDTAK6ChyjQMjG+yHEO/MGdO8UsCeJ/2xiY9eRE=
+github.com/btnguyen2k/gocosmos v1.1.0/go.mod h1:g599FZ7hAt6XZ108baotFrBr4U/r5xoyyQ8VyAZerL8=
+github.com/btnguyen2k/godynamo v1.3.0 h1:8Ri9gVWMvBWlD5P04AEVrl2QcmMQR7KgC3zSCl/YLWw=
+github.com/btnguyen2k/godynamo v1.3.0/go.mod h1:vNE48BoUAZS4F5ohrZ7suhw61DmCiXSClKrJfr2maTo=
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/cactus/go-statsd-client/statsd v0.0.0-20200423205355-cb0885a1018c/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
-github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
-github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g=
github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E=
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chaisql/chai v0.16.1-0.20240218103834-23e406360fd2 h1:vLtnPMqbTuTQcnfn5EDipZI0PISMSn7AMmz6HhAu+GU=
+github.com/chaisql/chai v0.16.1-0.20240218103834-23e406360fd2/go.mod h1:ix/NVvPO+dv6wsmln8R5H22yJb0iIj6KrGpouHaJmrE=
github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk=
github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ=
-github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM=
-github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
+github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 h1:N+3sFI5GUjRKBi+i0TxYVST9h4Ie192jJWpHvthBBgg=
+github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4=
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
-github.com/cockroachdb/errors v1.10.0 h1:lfxS8zZz1+OjtV4MtNWgboi/W5tyLEB6VQZBXN+0VUU=
-github.com/cockroachdb/errors v1.10.0/go.mod h1:lknhIsEVQ9Ss/qKDBQS/UqFSvPQjOwNq2qyKAxtHRqE=
+github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I=
+github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8=
+github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a h1:f52TdbU4D5nozMAhO9TvTJ2ZMCXtN4VIAmfrrZ0JXQ4=
+github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
-github.com/cockroachdb/pebble v0.0.0-20230718183418-628c4107d05a h1:i6xm42ImQ7wEqCJKrdasK7QXiV8kc6IP2R2hfylniHU=
-github.com/cockroachdb/pebble v0.0.0-20230718183418-628c4107d05a/go.mod h1:FN5O47SBEz5+kO9fG8UTR64g2WS1u5ZFCgTvxGjoSks=
+github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw=
+github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU=
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
-github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6 h1:DJK8W/iB+s/qkTtmXSrHA49lp5O3OsR7E6z4byOLy34=
-github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
-github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
-github.com/containerd/containerd v1.7.7 h1:QOC2K4A42RQpcrZyptP6z9EJZnlHfHJUfZrAAHe15q4=
-github.com/containerd/containerd v1.7.7/go.mod h1:3c4XZv6VeT9qgf9GMTxNTMFxGJrGpI2vz1yk4ye+YY8=
-github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM=
-github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ=
-github.com/coreos/go-oidc/v3 v3.5.0 h1:VxKtbccHZxs8juq7RdJntSqtXFtde9YpNpGn0yqgEHw=
-github.com/coreos/go-oidc/v3 v3.5.0/go.mod h1:ecXRtV4romGPeO6ieExAsUK9cb/3fp9hXNz1tlv8PIM=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
+github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
+github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0=
+github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk=
+github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8=
+github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ=
+github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
+github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
+github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI=
+github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0=
+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/couchbase/go-couchbase v0.1.1 h1:ClFXELcKj/ojyoTYbsY34QUrrYCBi/1G749sXSCkdhk=
github.com/couchbase/go-couchbase v0.1.1/go.mod h1:+/bddYDxXsf9qt0xpDUtRR47A2GjaXmGGAqQ/k3GJ8A=
github.com/couchbase/go_n1ql v0.0.0-20220303011133-0ed4bf93e31d h1:jOxYt3U9z+tj2WDvacvBhXmHXDt+EUR5Hbu56wTw6QY=
github.com/couchbase/go_n1ql v0.0.0-20220303011133-0ed4bf93e31d/go.mod h1:Rn19fO9CVfhJkqyIED9ixL5Kh5XuH7hXgDTxyfGY7hM=
-github.com/couchbase/gomemcached v0.2.1 h1:lDONROGbklo8pOt4Sr4eV436PVEaKDr3o9gUlhv9I2U=
-github.com/couchbase/gomemcached v0.2.1/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo=
+github.com/couchbase/gomemcached v0.3.1 h1:jfspNuQIXgWy+5GUPQrsQ6yC5uJCfMmd/JKvK6C26r8=
+github.com/couchbase/gomemcached v0.3.1/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo=
github.com/couchbase/goutils v0.1.2 h1:gWr8B6XNWPIhfalHNog3qQKfGiYyh4K4VhO3P2o9BCs=
github.com/couchbase/goutils v0.1.2/go.mod h1:h89Ek/tiOxxqjz30nPPlwZdQbdB8BwgnuBxeoUe/ViE=
-github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
+github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
-github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
-github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE=
-github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec=
-github.com/databendcloud/databend-go v0.4.6 h1:WeSXOwtwkYGVtPvDQwwTra9EZi55xICRKf0I2bDW6ss=
-github.com/databendcloud/databend-go v0.4.6/go.mod h1:gc59O5283qi8NyzAJ1le0SEZb5p/SL7nwvrB9p6lxDw=
-github.com/databricks/databricks-sql-go v1.5.2 h1:y7dpPiaZTr2+rDbo72jXjyQjU0uB9rJfXolyKzg96b4=
-github.com/databricks/databricks-sql-go v1.5.2/go.mod h1:8aNP4vhhfBJZhc4n7LcSAvtJsZ+Dc25Q6mGxM1/8WaY=
+github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
+github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
+github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0=
+github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8=
+github.com/databricks/databricks-sql-go v1.5.7 h1:UIbzDhKjmtCc0ia9jg0s7tITjXUnkA3+Nl1ukxXfunk=
+github.com/databricks/databricks-sql-go v1.5.7/go.mod h1:8aNP4vhhfBJZhc4n7LcSAvtJsZ+Dc25Q6mGxM1/8WaY=
+github.com/datafuselabs/databend-go v0.6.8 h1:BiQTCBR1VXREo2MBKzfWRed868DTW/cPxYJ/RkUrK5M=
+github.com/datafuselabs/databend-go v0.6.8/go.mod h1:h/sGUBZs7EqJgqnZ3XB0KHfyUlpGvfNrw2lWcdDJVIw=
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/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0=
-github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
-github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
-github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0=
+github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
+github.com/dlclark/regexp2 v1.11.2 h1:/u628IuisSTwri5/UKloiIsH8+qF2Pu7xEQX+yIKg68=
+github.com/dlclark/regexp2 v1.11.2/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=
github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE=
-github.com/docker/cli v20.10.17+incompatible h1:eO2KS7ZFeov5UJeaDmIs1NFEDRf32PaqRpvoEkKBy5M=
-github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
-github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
-github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
-github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM=
-github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
-github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
-github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/docker/cli v26.0.1+incompatible h1:eZDuplk2jYqgUkNLDYwTBxqmY9cM3yHnmN6OIUEjL3U=
+github.com/docker/cli v26.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
+github.com/docker/docker v26.1.1+incompatible h1:oI+4kkAgIwwb54b9OC7Xc3hSgu1RlJA/Lln/DF72djQ=
+github.com/docker/docker v26.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
+github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/dop251/goja v0.0.0-20240707163329-b1681fb2a2f5 h1:ZRqTaoW9WZ2DqeOQGhK9q73eCb47SEs30GV2IRHT9bo=
+github.com/dop251/goja v0.0.0-20240707163329-b1681fb2a2f5/go.mod h1:o31y53rb/qiIAONF7w3FHJZRqqP3fzHUr1HqanthByw=
+github.com/dop251/goja_nodejs v0.0.0-20240418154818-2aae10d4cbcf h1:2JoVYP9iko8uuIW33BQafzaylDixXbdXCRw/vCoxL+s=
+github.com/dop251/goja_nodejs v0.0.0-20240418154818-2aae10d4cbcf/go.mod h1:bhGPmCgCCTSRfiMYWjpS46IDo9EUZXlsuUaPXSWGbv0=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
-github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM=
-github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU=
+github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo=
+github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU=
github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ=
github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q=
github.com/elastic/go-sysinfo v1.8.1/go.mod h1:JfllUnzoQV/JRYymbH3dO1yggI3mV2oTKSXsDHM+uIM=
-github.com/elastic/go-sysinfo v1.11.2 h1:mcm4OSYVMyws6+n2HIVMGkln5HOpo5Ie1ZmbbNn0jg4=
-github.com/elastic/go-sysinfo v1.11.2/go.mod h1:GKqR8bbMK/1ITnez9NIsIfXQr25aLhRJa7AfT8HpBFQ=
+github.com/elastic/go-sysinfo v1.14.0 h1:dQRtiqLycoOOla7IflZg3aN213vqJmP0lpVpKQ9lUEY=
+github.com/elastic/go-sysinfo v1.14.0/go.mod h1:FKUXnZWhnYI0ueO7jhsGV3uQJ5hiz8OqM5b3oGyaRr8=
github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU=
-github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0=
-github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss=
+github.com/elastic/go-windows v1.0.2 h1:yoLLsAsV5cfg9FLhZ9EXZ2n2sQFKeDYrHenkcivY4vI=
+github.com/elastic/go-windows v1.0.2/go.mod h1:bGcDpBzXgYSqM0Gx3DM4+UxFj300SZLixie9u9ixLM8=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -496,93 +940,112 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
-github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM=
-github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g=
+github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
+github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q=
+github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI=
+github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA=
-github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=
+github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
+github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
+github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss=
+github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A=
+github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew=
github.com/exasol/error-reporting-go v0.2.0 h1:nKIe4zYiTHbYrKJRlSNJcmGjTJCZredDh5akVHfIbRs=
github.com/exasol/error-reporting-go v0.2.0/go.mod h1:lUzRJqKLiSuYpqRUN2LVyj08WeHzhMEC/8Gmgtuqh1Y=
-github.com/exasol/exasol-driver-go v1.0.4 h1:HCkfWztr/Ml43e0OpEgkQ+h1qOa3PoY41gg0Y9infrg=
-github.com/exasol/exasol-driver-go v1.0.4/go.mod h1:TfWZbDQ6cOheE5g8SHfH/sXmnJbbVF/TqbjuXF/Ymos=
-github.com/exasol/exasol-test-setup-abstraction-server/go-client v0.3.4 h1:HlA5nlIu8fZveE9NwsoKH2/5aMMao9GoCnb8X+oCPC4=
-github.com/exasol/exasol-test-setup-abstraction-server/go-client v0.3.4/go.mod h1:cP/zgvSSXK6h15k+GoL6PfaFWGvQN/FU5wRvZnQGbwQ=
-github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
-github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
-github.com/form3tech-oss/jwt-go v3.2.5+incompatible h1:/l4kBbb4/vGSsdtB5nUe8L7B9mImVMaBPw9L/0TBHU8=
-github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
-github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
-github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
-github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
-github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
-github.com/fyne-io/mobile v0.1.2-0.20201127155338-06aeb98410cc/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY=
-github.com/fyne-io/mobile v0.1.2/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY=
-github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
-github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
-github.com/genjidb/genji v0.15.2 h1:5cPRZPvBkLrG+auuCdkiWSg848mz4gVNCZ9gD/ig7lo=
-github.com/genjidb/genji v0.15.2/go.mod h1:cyZtbarUfeyJcywXhuP9kf3HfUqEwl8lv1MsUQl+nWo=
-github.com/getsentry/sentry-go v0.22.0 h1:XNX9zKbv7baSEI65l+H1GEJgSeIC1c7EN5kluWaP6dM=
-github.com/getsentry/sentry-go v0.22.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
+github.com/exasol/exasol-driver-go v1.0.9 h1:+2YdE4U8TVf3ipH0TRRGQnihKmm9pIoxwdsSpihdkWU=
+github.com/exasol/exasol-driver-go v1.0.9/go.mod h1:+9xRz3cv55TWG364piTJEliivmE0M2JaefXx0o+rRW4=
+github.com/exasol/exasol-test-setup-abstraction-server/go-client v0.3.9 h1:vkOiwqum2hOK1WHgBop3TZrRGiygDRTvet8lzxP7Gl4=
+github.com/exasol/exasol-test-setup-abstraction-server/go-client v0.3.9/go.mod h1:g0gO9UJh2LOYlwJIzrw7c1QZJqEBSvYnAaOycu7M5/c=
+github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
+github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
+github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
+github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
+github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
+github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I=
+github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s=
+github.com/getsentry/sentry-go v0.28.1 h1:zzaSm/vHmGllRM6Tpx1492r0YDzauArdBfkJRtY6P5k=
+github.com/getsentry/sentry-go v0.28.1/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw=
github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw=
-github.com/go-faster/errors v0.7.0 h1:UnD/xusnfUgtEYkgRZohqL2AfmPTwv13NAJwwFFaNYc=
-github.com/go-faster/errors v0.7.0/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo=
-github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
+github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg=
+github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo=
+github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
+github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=
+github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
+github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
+github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
+github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
+github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200625191551-73d3c3675aa3/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo=
-github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8=
+github.com/go-gorp/gorp v2.2.0+incompatible h1:xAUh4QgEeqPPhK3vxZN+bzrim1z5Av6q837gtjUlshc=
+github.com/go-gorp/gorp v2.2.0+incompatible/go.mod h1:7IfkAQnO7jfT/9IQ3R9wL1dFhukN6aQxzKTHnkxzA/E=
+github.com/go-jose/go-jose/v4 v4.0.3 h1:o8aphO8Hv6RPmH+GfzVuyf7YXSBibp+8YyHdOoDESGo=
+github.com/go-jose/go-jose/v4 v4.0.3/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc=
+github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=
+github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
-github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
-github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
-github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg=
-github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
-github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
-github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
+github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
+github.com/go-sourcemap/sourcemap v2.1.4+incompatible h1:a+iTbH5auLKxaNwQFg0B+TCYl6lbukKPc7b5x0n1s6Q=
+github.com/go-sourcemap/sourcemap v2.1.4+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
+github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
+github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
+github.com/go-zookeeper/zk v1.0.4 h1:DPzxraQx7OrPyXq2phlGlNSIyWEsAox0RJmjTseMV6I=
+github.com/go-zookeeper/zk v1.0.4/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
+github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
+github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/gocql/gocql v0.0.0-20200815110948-5378c8f664e9/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY=
github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU=
github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8=
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0=
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
-github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/godror/godror v0.40.4 h1:X1e7hUd02GDaLWKZj40Z7L0CP0W9TrGgmPQZw6+anBg=
-github.com/godror/godror v0.40.4/go.mod h1:i8YtVTHUJKfFT3wTat4A9UoqScUtZXiYB9Rf3SVARgc=
-github.com/godror/knownpb v0.1.1 h1:A4J7jdx7jWBhJm18NntafzSC//iZDHkDi1+juwQ5pTI=
-github.com/godror/knownpb v0.1.1/go.mod h1:4nRFbQo1dDuwKnblRXDxrfCFYeT4hjg3GjMqef58eRE=
+github.com/godror/godror v0.44.2 h1:uacQ3BFwbqPisMNBcltqysXSbg6ZUGWkz15lcUBOahE=
+github.com/godror/godror v0.44.2/go.mod h1:nlshc6+MRQqNP5tp9l5du20PXR62qo4SRO1cBYyedTM=
+github.com/godror/knownpb v0.1.2 h1:icMyYsYVpGmzhoVA01xyd0o4EaubR31JPK1UxQWe4kM=
+github.com/godror/knownpb v0.1.2/go.mod h1:zs9hH+lwj7mnPHPnKCcxdOGz38Axa9uT+97Ng+Nnu5s=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/gohxs/readline v0.0.0-20171011095936-a780388e6e7c h1:yE35fKFwcelIte3q5q1/cPiY7pI7vvf5/j/0ddxNCKs=
github.com/gohxs/readline v0.0.0-20171011095936-a780388e6e7c/go.mod h1:9S/fKAutQ6wVHqm1jnp9D9sc5hu689s9AaTWFS92LaU=
-github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
-github.com/golang-jwt/jwt/v5 v5.1.0 h1:UGKbA/IPjtS6zLcdB7i5TyACMgSbOTiR8qzXgw8HWQU=
-github.com/golang-jwt/jwt/v5 v5.1.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
+github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
+github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
+github.com/golang-module/carbon/v2 v2.3.12 h1:VC1DwN1kBwJkh5MjXmTFryjs5g4CWyoM8HAHffZPX/k=
+github.com/golang-module/carbon/v2 v2.3.12/go.mod h1:HNsedGzXGuNciZImYP2OMnpiwq/vhIstR/vn45ib5cI=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=
-github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=
+github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
+github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ=
+github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=
+github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -615,8 +1078,9 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
@@ -625,6 +1089,8 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
+github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
+github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/flatbuffers/go v0.0.0-20230110200425-62e4d2e5b215 h1:HA3/6NDG1q6qLD2sCqDFT/ua/1/wctoLo7leuFcFdSE=
github.com/google/flatbuffers/go v0.0.0-20230110200425-62e4d2e5b215/go.mod h1:qmRCJW6OqZkfBt584Cmq1im0f4367CLrdABrq5lMOWo=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -646,15 +1112,17 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/goexpect v0.0.0-20210430020637-ab937bf7fd6f h1:7MmqygqdeJtziBUpm4Z9ThROFZUaVGaePMfcDnluf1E=
github.com/google/goexpect v0.0.0-20210430020637-ab937bf7fd6f/go.mod h1:n1ej5+FqyEytMt/mugVDZLIiqTMO+vsrgY+kM6ohzN0=
-github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4=
github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4=
+github.com/google/goterm v0.0.0-20200907032337-555d40f16ae2 h1:CVuJwN34x4xM2aT4sIKhmeib40NeBPhRihNjQmpJsA4=
+github.com/google/goterm v0.0.0-20200907032337-555d40f16ae2/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4=
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
-github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw=
github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
+github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=
+github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
@@ -664,26 +1132,29 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
-github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo=
+github.com/google/pprof v0.0.0-20240722153945-304e4f0156b8 h1:ssNFCCVmib/GQSzx3uCWyfMgOamLGWuGqlMS77Y1m3Y=
+github.com/google/pprof v0.0.0-20240722153945-304e4f0156b8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
-github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
+github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
+github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
-github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=
+github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
+github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=
github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
@@ -695,29 +1166,37 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99
github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo=
github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=
-github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas=
-github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=
-github.com/googleapis/go-sql-spanner v1.1.1 h1:Z5kRckvrSNokM/x21BBy23kg9b0e9ikkderuuLVXfGY=
-github.com/googleapis/go-sql-spanner v1.1.1/go.mod h1:e12AKZmltQH/2XGqR/2SAPWPKshc5+WF4W7OGD9YcAw=
+github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=
+github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
+github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
+github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
+github.com/googleapis/go-sql-spanner v1.6.0 h1:AtTZkUNCQamrhj/RPpG/A3qTErtiT+eBjZydWy6tV90=
+github.com/googleapis/go-sql-spanner v1.6.0/go.mod h1:8oVX0dqU+K4tPNlqOiL3EjUNyJ91IwTNkm+G4r99Wcc=
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
+github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ=
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI=
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
-github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
-github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
+github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
+github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU=
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0=
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
-github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
-github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
-github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
-github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ=
-github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
+github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
+github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
+github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
+github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
+github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU=
+github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
@@ -726,58 +1205,27 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
+github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
+github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/icholy/digest v0.1.22 h1:dRIwCjtAcXch57ei+F0HSb5hmprL873+q7PoVojdMzM=
-github.com/icholy/digest v0.1.22/go.mod h1:uLAeDdWKIWNFMH0wqbwchbTQOmJWhzSnL7zmqSPqEEc=
-github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
-github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
-github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
-github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
-github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
-github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
-github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
-github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
-github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
-github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
-github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
-github.com/jackc/pgconn v1.14.1 h1:smbxIaZA08n6YuxEX1sDyjV/qkbtUtkH20qLkR9MUR4=
-github.com/jackc/pgconn v1.14.1/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E=
-github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
-github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
-github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
-github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
-github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc=
-github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
+github.com/icholy/digest v0.1.23 h1:4hX2pIloP0aDx7RJW0JewhPPy3R8kU+vWKdxPsCCGtY=
+github.com/icholy/digest v0.1.23/go.mod h1:QNrsSGQ5v7v9cReDI0+eyjsXGUoRSUZQHeQ5C4XLa0Y=
+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
-github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
-github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
-github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
-github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
-github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
-github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
-github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
-github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0=
-github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
-github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
-github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
-github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
-github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
-github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
-github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
-github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
-github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
-github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
-github.com/jackc/pgx/v5 v5.5.0 h1:NxstgwndsTRy7eq9/kqYc/BZh5w2hHJV86wjvO+1xPw=
-github.com/jackc/pgx/v5 v5.5.0/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
-github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
-github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
+github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
+github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY=
+github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
-github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc=
github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=
github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=
@@ -790,14 +1238,16 @@ github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh6
github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs=
github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=
github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
-github.com/jeandeaual/go-locale v0.0.0-20220711133428-7de61946b173 h1:jOONCXyzHWM+ukp+weX77o//U3pMeOj62CNxChJLxIU=
-github.com/jeandeaual/go-locale v0.0.0-20220711133428-7de61946b173/go.mod h1:uO/uctjf8AcWhNfp5Ili6oPtyFrAoQXEtVY3N798VkQ=
+github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 h1:Po+wkNdMmN+Zj1tDsJQy7mJlPlwGNQd9JZoPjObagf8=
+github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49/go.mod h1:YiutDnxPRLk5DLUFj6Rw4pRBBURZY07GFr54NdV9mQg=
github.com/jedib0t/go-pretty/v6 v6.2.7/go.mod h1:FMkOpgGD3EZ91cW8g/96RfxoV7bdeJyzXPYgz1L1ln0=
-github.com/jedib0t/go-pretty/v6 v6.4.9 h1:vZ6bjGg2eBSrJn365qlxGcaWu09Id+LHtrfDWlB2Usc=
-github.com/jedib0t/go-pretty/v6 v6.4.9/go.mod h1:Ndk3ase2CkQbXLLNf5QDHoYb6J9WtVfmHZu9n8rk2xs=
+github.com/jedib0t/go-pretty/v6 v6.5.9 h1:ACteMBRrrmm1gMsXe9PSTOClQ63IXDUt03H5U+UV8OU=
+github.com/jedib0t/go-pretty/v6 v6.5.9/go.mod h1:zbn98qrYlh95FIhwwsbIip0LYpwSG8SUOScs+v9/t0E=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
@@ -805,79 +1255,78 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/jmrobles/h2go v0.5.0 h1:r+V3J1+8z5tExKHcVc8u0tXJfov391zEffJYALWKhA0=
github.com/jmrobles/h2go v0.5.0/go.mod h1:p7Vjfu/9f7g2RI1CkpwXnwqskV+47HviBg4C4FlW8eI=
-github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4=
github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak=
-github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
-github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
-github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE=
+github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
+github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
+github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
-github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
+github.com/kenshaw/rasterm v0.1.10 h1:cMCTpBHfqmftt/VqeT6B+9Td+mYi+ZtziN+XBdrTQfA=
+github.com/kenshaw/rasterm v0.1.10/go.mod h1:kL4DCN+wOlQ4BPBCxA+itiVwiObRAj0Hkze7SbCyYaw=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE=
github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4=
github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
-github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
-github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
-github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
+github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
+github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
+github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng=
-github.com/marcboeker/go-duckdb v1.5.4 h1:Cv6gzgrzPnmqJKJiTT2CJM3eUqIT5in9DNyxAn+okgA=
-github.com/marcboeker/go-duckdb v1.5.4/go.mod h1:wm91jO2GNKa6iO9NTcjXIRsW+/ykPoJbQcHSXhdAl28=
+github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
+github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
+github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o=
+github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
+github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/marcboeker/go-duckdb v1.7.0 h1:c9DrS13ta+gqVgg9DiEW8I+PZBE85nBMLL/YMooYoUY=
+github.com/marcboeker/go-duckdb v1.7.0/go.mod h1:WtWeqqhZoTke/Nbd7V9lnBx7I2/A/q0SAq/urGzPCMs=
github.com/mattn/go-adodb v0.0.1 h1:g/pk3V8m/WFX2IQRI58wAC24OQUFFXEiNsvs7dQ1WKg=
github.com/mattn/go-adodb v0.0.1/go.mod h1:jaSTRde4bohMuQgYQPxW3xRTPtX/cZKyxPrFVseJULo=
-github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
-github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
-github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
-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/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI=
-github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
-github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
-github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
-github.com/microsoft/go-mssqldb v1.6.0 h1:mM3gYdVwEPFrlg/Dvr2DNVEgYFG7L42l+dGc67NNNpc=
-github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU=
+github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mattn/go-sixel v0.0.5 h1:55w2FR5ncuhKhXrM5ly1eiqMQfZsnAHIpYNGZX03Cv8=
+github.com/mattn/go-sixel v0.0.5/go.mod h1:h2Sss+DiUEHy0pUqcIB6PFXo5Cy8sTQEFr3a9/5ZLNw=
+github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
+github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA=
+github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA=
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs=
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI=
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
-github.com/minio/sio v0.3.1 h1:d59r5RTHb1OsQaSl1EaTWurzMMDRLA5fgNmjzD4eVu4=
-github.com/minio/sio v0.3.1/go.mod h1:S0ovgVgc+sTlQyhiXA1ppBLv7REM7TYi5yyq2qL/Y6o=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
@@ -892,120 +1341,149 @@ github.com/mithrandie/go-text v1.6.0 h1:8gOXTMPbMY8DJbKMTv8kHhADcJlDWXqS/YQH4SyW
github.com/mithrandie/go-text v1.6.0/go.mod h1:xCgj1xiNbI/d4xA9sLVvXkjh5B2tNx2ZT2/3rpmh8to=
github.com/mithrandie/ternary v1.1.1 h1:k/joD6UGVYxHixYmSR8EGgDFNONBMqyD373xT4QRdC4=
github.com/mithrandie/ternary v1.1.1/go.mod h1:0D9Ba3+09K2TdSZO7/bFCC0GjSXetCvYuYq0u8FY/1g=
+github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
+github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk=
github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc=
-github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU=
github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc=
github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo=
+github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg=
+github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
-github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs=
github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns=
-github.com/nakagami/firebirdsql v0.9.6 h1:WF1JyCoKGtQCrkwyRfZVwe526dB9HO6Y6bcm/vZYUDI=
-github.com/nakagami/firebirdsql v0.9.6/go.mod h1:q1YKPKX8lOiGP0slQJgbpde8x4JgVpgEOtQDaQ+lRTo=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/nakagami/firebirdsql v0.9.10 h1:7Y73BiH3j/f8faIaryZvDZ3nEo0L7c6S5pg+qWoZ91c=
+github.com/nakagami/firebirdsql v0.9.10/go.mod h1:ei91eXUYcMkWJOr4rK6Sta+BVmi3K+WvYR4yASlq/kY=
github.com/nathan-fiscaletti/consolesize-go v0.0.0-20220204101620-317176b6684d h1:NqRhLdNVlozULwM1B3VaHhcXYSgrOAv8V5BE65om+1Q=
github.com/nathan-fiscaletti/consolesize-go v0.0.0-20220204101620-317176b6684d/go.mod h1:cxIIfNMTwff8f/ZvRouvWYF6wOoO7nj99neWSx2q/Es=
-github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
-github.com/nicksnyder/go-i18n/v2 v2.1.1/go.mod h1:d++QJC9ZVf7pa48qrsRWhMJ5pSHIPmS3OLqK1niyLxs=
+github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
+github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oklog/ulid/v2 v2.0.2 h1:r4fFzBm+bv0wNKNh5eXTwU7i85y5x+uwkxCUTNVQqLc=
github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOEiwQ68=
+github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
+github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
-github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI=
-github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8=
-github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs=
-github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg=
-github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
-github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
+github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
+github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
+github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss=
+github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8=
github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4=
github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg=
-github.com/paulmach/orb v0.10.0 h1:guVYVqzxHE/CQ1KpfGO077TR0ATHSNjp4s6XGLn3W9s=
-github.com/paulmach/orb v0.10.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU=
+github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU=
+github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU=
github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
-github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
-github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
+github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
+github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=
+github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
+github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
+github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
+github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
-github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
-github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
+github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
+github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
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/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
+github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prestodb/presto-go-client v0.0.0-20230524183650-a1a0bac0f63e h1:7QFNKeWEIpUyue+VSSpiPjh2zXLd632oLnYcOkyPv0E=
-github.com/prestodb/presto-go-client v0.0.0-20230524183650-a1a0bac0f63e/go.mod h1:9mH1KvIoMeUe/OIs6WCJGvrR15FvC0y+SSMkIQQkF3M=
-github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
-github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prestodb/presto-go-client v0.0.0-20240426182841-905ac40a1783 h1:1/uuAh1vatqywFmudA7PHVUc/Iu5W4iFft1r7MVubf8=
+github.com/prestodb/presto-go-client v0.0.0-20240426182841-905ac40a1783/go.mod h1:9mH1KvIoMeUe/OIs6WCJGvrR15FvC0y+SSMkIQQkF3M=
+github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
+github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
-github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
-github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=
-github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
+github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
+github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
+github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
-github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
+github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
+github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/proullon/ramsql v0.1.4 h1:yTFRTn46gFH/kPbzCx+mGjuFlyTBUeDr3h2ldwxddl0=
+github.com/proullon/ramsql v0.1.4/go.mod h1:CFGqeQHQpdRfWqYmWD3yXqPTEaHkF4zgXy1C6qDWc9E=
+github.com/rekby/fixenv v0.6.1 h1:jUFiSPpajT4WY2cYuc++7Y1zWrnCxnovGCIX72PZniM=
+github.com/rekby/fixenv v0.6.1/go.mod h1:/b5LRc06BYJtslRtHKxsPWFT/ySpHV+rWvzTg+XWk4c=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
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=
+github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
+github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
-github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
-github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
-github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
-github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
-github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
-github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
-github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
-github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
+github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
+github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
+github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
+github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
+github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
+github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
+github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
+github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
+github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
-github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
-github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
-github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/sijms/go-ora/v2 v2.7.24 h1:0env7GgMxPHw0K92umvmLQZXRPenUBnIiyNNKJUGyWA=
-github.com/sijms/go-ora/v2 v2.7.24/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk=
-github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
+github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
+github.com/sijms/go-ora/v2 v2.8.19 h1:7LoKZatDYGi18mkpQTR/gQvG9yOdtc7hPAex96Bqisc=
+github.com/sijms/go-ora/v2 v2.8.19/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/snowflakedb/gosnowflake v1.7.1-0.20231129120718-15fac293e1b8 h1:7BgZHyMXUUPcvC7rm+gsOoC23xFI6SgaPGpBA1tMX34=
-github.com/snowflakedb/gosnowflake v1.7.1-0.20231129120718-15fac293e1b8/go.mod h1:JI3eRZL8CpimPek6CJO0aTbDQjDGOt7Rxv9A/ti4f5c=
+github.com/snowflakedb/gosnowflake v1.10.1 h1:VGeQxsQj5s3hP0cRmtNYozhUvs2Y7Reu5Pk5pKuRGpI=
+github.com/snowflakedb/gosnowflake v1.10.1/go.mod h1:hvc58mU03qg78mSz5z17/qnzI56hOdYYK2txWbM0hN0=
+github.com/soniakeys/quant v1.0.0 h1:N1um9ktjbkZVcywBVAAYpZYSHxEfJGzshHCxx/DaI0Y=
+github.com/soniakeys/quant v1.0.0/go.mod h1:HI1k023QuVbD4H8i9YdfZP2munIHU4QpjsImz6Y6zds=
+github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
+github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4=
-github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
+github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
+github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
+github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
+github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
+github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
+github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
+github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
+github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
+github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ=
+github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
-github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0=
-github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0=
+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -1013,32 +1491,30 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
+github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE=
github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU=
github.com/thda/tds v0.1.7 h1:s29kbnJK0agL3ps85A/sb9XS2uxgKF5UJ6AZjbyqXX4=
github.com/thda/tds v0.1.7/go.mod h1:isLIF1oZdXfkqVMJM8RyNrsjlHPlTKnPlnsBs7ngZcM=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
-github.com/trinodb/trino-go-client v0.313.0 h1:lp8N9JKTqMuZ9LlAwLjgUtkwDnJc8fjpJmunpZ3afjk=
-github.com/trinodb/trino-go-client v0.313.0/go.mod h1:YpZf2WAClFhU+n0ZhdkmMbugYaMRM/mjywiQru0wpeQ=
+github.com/trinodb/trino-go-client v0.315.0 h1:9mU+42VGw9Hnp9R1hkhWlIrQp9o+V01Gx1KlHjTkM1c=
+github.com/trinodb/trino-go-client v0.315.0/go.mod h1:ND1s5JuAHWUXnllV3dvt/pYKhlrc0G51l6LvVFD2bJ4=
github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg=
github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ=
github.com/uber-go/tally v3.3.17+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU=
-github.com/uber-go/tally v3.5.8+incompatible h1:Z2vK6ib6G/r6bAGu7lAI/98cLPLUOtdHrY2bBikk4wg=
-github.com/uber-go/tally v3.5.8+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU=
-github.com/uber/athenadriver v1.1.14 h1:dC+wiJWBUUD12rSHnoqdq3Y+KOoOoVePN+Asr/qi/+M=
-github.com/uber/athenadriver v1.1.14/go.mod h1:RnKD7+9Aup8iuFfhK+I26U+z137IXWeoLaEZDepd0Eg=
-github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/uber-go/tally v3.5.10+incompatible h1:PDkAMvnVYOdJtvyCZQURmHtOakCiWAWFVKejrrvOMBo=
+github.com/uber-go/tally v3.5.10+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU=
+github.com/uber/athenadriver v1.1.15 h1:z/hivAcXmGgUCVoXgVvwwIzc4auTeF3TCmwyFTtd8NE=
+github.com/uber/athenadriver v1.1.15/go.mod h1:RnKD7+9Aup8iuFfhK+I26U+z137IXWeoLaEZDepd0Eg=
github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw=
github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4=
-github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
-github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
@@ -1049,21 +1525,25 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
-github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
-github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
-github.com/xo/dburl v0.19.1 h1:z/K2i8zVf6aRwQ8Szz7MGEUw0VC2472D9SlBqdHDQCU=
-github.com/xo/dburl v0.19.1/go.mod h1:B7/G9FGungw6ighV8xJNwWYQPMfn3gsi2sn5SE8Bzco=
+github.com/xo/dburl v0.23.2 h1:Fl88cvayrgE56JA/sqhNMLljCW/b7RmG1mMkKMZUFgA=
+github.com/xo/dburl v0.23.2/go.mod h1:uazlaAQxj4gkshhfuuYyvwCBouOmNnG2aDxTCFZpmL4=
+github.com/xo/echartsgoja v0.1.1 h1:9ZH7rhjovE/caGzWTFw1X5GItCsPw5eFV2Qwfgmjt7M=
+github.com/xo/echartsgoja v0.1.1/go.mod h1:u2iiKyIA1H3URjh9+8Nltj8cP33R19JHasXhSz/tWHI=
+github.com/xo/resvg v0.6.0 h1:GsovErv9JuOnGttOA8RhQcBI7DEEVpEiIEKBuJVRS4g=
+github.com/xo/resvg v0.6.0/go.mod h1:xsIgOmL6UD2xRHIm2Laepjm/b4auoPMxAAqOHkvbSes=
github.com/xo/tblfmt v0.0.0-20190609041254-28c54ec42ce8/go.mod h1:3U5kKQdIhwACye7ml3acccHmjGExY9WmUGU7rnDWgv0=
-github.com/xo/tblfmt v0.10.3 h1:Fb2Le5wvzBjOwA/KFRpP5bZo+iR9cZnzSAN3tULoUPI=
-github.com/xo/tblfmt v0.10.3/go.mod h1:W6oqhxtqDOEMkrS2GPO0zmcww7ozM2E6BRv3kNfXd24=
+github.com/xo/tblfmt v0.13.2 h1:GzHsRYduJxKqwNekczv2ZJwpznsSU89Dr2L+qVyW63Y=
+github.com/xo/tblfmt v0.13.2/go.mod h1:BLPC+dRy68cgSK/mPgQRfFQ/xLg231Fyic178ybjB34=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
+github.com/xo/vegagoja v0.1.0 h1:jnIeXVM6HTzWyt2HHmJMkhgK1zjZMIdhdI+MBFjkF54=
+github.com/xo/vegagoja v0.1.0/go.mod h1:2DGNf2X4fnAw2h5zSVIdF1inbmEpoE+rSbzzYBYjTAY=
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 h1:zzrxE1FKn5ryBNl9eKOeqQ58Y/Qpo3Q9QNxKHX5uzzQ=
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY=
-github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd h1:dzWP1Lu+A40W883dK/Mr3xyDSM/2MggS8GtHT0qgAnE=
-github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I=
-github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2 h1:E0yUuuX7UmPxXm92+yQCjMveLFO3zfvYFIJVuAqsVRA=
-github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2/go.mod h1:fjBLQ2TdQNl4bMjuWl9adoTGBypwUTPoGC+EqYqiIcU=
+github.com/ydb-platform/ydb-go-genproto v0.0.0-20240528144234-5d5a685e41f7 h1:nL8XwD6fSst7xFUirkaWJmE7kM0CdWRYgu6+YQer1d4=
+github.com/ydb-platform/ydb-go-genproto v0.0.0-20240528144234-5d5a685e41f7/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I=
+github.com/ydb-platform/ydb-go-sdk/v3 v3.75.2 h1:thrbvktqKA6LFZTnZrGuQi8LQVel1J2dDfoQFsgvcYs=
+github.com/ydb-platform/ydb-go-sdk/v3 v3.75.2/go.mod h1:QMmT1fMKZnpid73USXLJawh+32bKySSE2WtEnBUIKd8=
github.com/yookoala/realpath v1.0.0 h1:7OA9pj4FZd+oZDsyvXWQvjn5oBdcHRTV44PpdMSuImQ=
github.com/yookoala/realpath v1.0.0/go.mod h1:gJJMA9wuX7AcqLy1+ffPatSCySA1FQ2S8Ya9AIoYBpE=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
@@ -1078,7 +1558,6 @@ github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
-github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
github.com/ziutek/telnet v0.0.0-20180329124119-c3b780dc415b/go.mod h1:IZpXDfkJ6tWD3PhBK5YzgQT+xJWh7OsdwiG8hA2MkO4=
@@ -1094,17 +1573,27 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
-go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=
-go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
-go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=
-go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
-go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=
-go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
-go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=
-go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
+go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
+go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU=
+go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
+go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
+go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=
+go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
+go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
+go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
+go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
+go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
+go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
@@ -1117,55 +1606,71 @@ go.uber.org/fx v1.12.0/go.mod h1:egT3Kyg1JFYQkvKLZ3EsykxkNrZxgXS+gKoKo7abERY=
go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI=
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
-go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
-go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
+go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
-go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
-go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
-golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
-golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
+golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
+golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
+golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No=
-golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
+golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
+golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1189,9 +1694,18 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
+golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
-golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
+golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
+golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1204,7 +1718,6 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -1229,6 +1742,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
@@ -1243,12 +1757,21 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
-golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
+golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
+golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
+golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
-golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
+golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
+golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
+golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1274,9 +1797,12 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri
golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
-golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk=
-golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ=
-golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM=
+golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=
+golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
+golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
+golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
+golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
+golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1290,31 +1816,27 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
-golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1330,7 +1852,6 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1338,29 +1859,27 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1379,23 +1898,40 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
+golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
+golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
+golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
-golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
+golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
+golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
+golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
+golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1406,35 +1942,44 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
+golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190802003818-e9bb7d36c060/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
-golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -1459,7 +2004,6 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200328031815-3db5fc6bac03/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
@@ -1471,22 +2015,29 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
+golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM=
-golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
-golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
+golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
+golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8=
+golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
+golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
+golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
+golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1495,10 +2046,18 @@ golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
-golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU=
-golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
-gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E=
+golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk=
+golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
+gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
+gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
+gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA=
+gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ=
+gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo=
+gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
+gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
+gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=
+gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -1547,8 +2106,17 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ
google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08=
-google.golang.org/api v0.152.0 h1:t0r1vPnfMc260S2Ci+en7kfCZaLOPs5KI0sVV/6jZrY=
-google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY=
+google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=
+google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo=
+google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0=
+google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY=
+google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY=
+google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY=
+google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI=
+google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0=
+google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
+google.golang.org/api v0.189.0 h1:equMo30LypAkdkLMBqfeIqtyAnlyig1JSZArl4XPwdI=
+google.golang.org/api v0.189.0/go.mod h1:FLWGJKb0hb+pU2j+rJqwbnsF+ym+fQs73rbJ+KAUgy8=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -1556,8 +2124,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
-google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -1593,7 +2159,9 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
@@ -1626,6 +2194,7 @@ google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2
google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
+google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
@@ -1656,13 +2225,43 @@ google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar
google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=
google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=
google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U=
+google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
-google.golang.org/genproto v0.0.0-20231127180814-3a041ad873d4 h1:W12Pwm4urIbRdGhMEg2NM9O3TWKjNcxQhs46V0ypf/k=
-google.golang.org/genproto v0.0.0-20231127180814-3a041ad873d4/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=
-google.golang.org/genproto/googleapis/api v0.0.0-20231127180814-3a041ad873d4 h1:ZcOkrmX74HbKFYnpPY8Qsw93fC29TbJXspYKaBkSXDQ=
-google.golang.org/genproto/googleapis/api v0.0.0-20231127180814-3a041ad873d4/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM=
+google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
+google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
+google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo=
+google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE=
+google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA=
+google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
+google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
+google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA=
+google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s=
+google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s=
+google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
+google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
+google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
+google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
+google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f h1:htT2I9bZvGm+110zq8bIErMX+WgBWxCzV3ChwbvnKnc=
+google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:Sk3mLpoDFTAp6R4OvlcUgaG4ISTspKeFsIAXMn9Bm4Y=
+google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f h1:b1Ln/PG8orm0SsBbHZWke8dDp2lrCD4jSmfglFpTZbk=
+google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:AHT0dDg3SoMOgZGnZk29b5xTbPHMoEC8qthmBLJCpys=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240725223205-93522f1f2a9f h1:RARaIm8pxYuxyNPbBQf5igT7XdOyCNtat1qAT2ZxjU4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -1689,6 +2288,7 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD
google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
@@ -1698,8 +2298,13 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu
google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
-google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
-google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
+google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
+google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
+google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
+google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
+google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
+google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
+google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
@@ -1716,8 +2321,10 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
-google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
+google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1726,9 +2333,10 @@ gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw=
gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=
gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM=
@@ -1746,23 +2354,23 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/bigquery v1.2.0 h1:E94oEXErYb4uImcR8oiCjE1SP2VdnrL5f3d78PtFWNk=
gorm.io/driver/bigquery v1.2.0/go.mod h1:/5kcyb6RVIk/seff6YANAjB5aisE4oqY35x0Ix9iwXY=
+gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0=
+gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8=
gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
-gotest.tools/gotestsum v1.8.2 h1:szU3TaSz8wMx/uG+w/A2+4JUPwH903YYaMI9yOOYAyI=
-gotest.tools/gotestsum v1.8.2/go.mod h1:6JHCiN6TEjA7Kaz23q1bH0e2Dc3YJjDUZ0DmctFZf+w=
-gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
-gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A=
-gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
-gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g=
+gorm.io/gorm v1.25.2 h1:gs1o6Vsa+oVKG/a9ElL3XgyGfghFfkKA2SInQaCyMho=
+gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
+gotest.tools/gotestsum v1.12.0 h1:CmwtaGDkHxrZm4Ib0Vob89MTfpc3GrEFMJKovliPwGk=
+gotest.tools/gotestsum v1.12.0/go.mod h1:fAvqkSptospfSbQw26CTYzNwnsE/ztqLeyhP0h67ARY=
+gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
+gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -1770,42 +2378,67 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0=
-howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM=
-howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g=
-lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo=
-lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
+howett.net/plist v1.0.1 h1:37GdZ8tP09Q35o9ych3ehygcsL+HqKSwzctveSlarvM=
+howett.net/plist v1.0.1/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g=
+lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
+lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
modernc.org/b v1.1.0 h1:sFmr2MlofAtx5R0NC0btblNww5dqIHxXyT0SEiaTSIk=
modernc.org/b v1.1.0/go.mod h1:yF+wmBAFjebNdVqZNTeNfmnLaLqq91wozvDLcuXz+ck=
-modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q=
-modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y=
-modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0=
-modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI=
-modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk=
+modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
+modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
+modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
+modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
+modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
+modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc=
+modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw=
+modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
+modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
+modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws=
+modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo=
+modernc.org/ccgo/v4 v4.20.4 h1:3pPOlMcblnu5CBU3w1BFtepwBnLezGjPYTH8xBeYZM8=
+modernc.org/ccgo/v4 v4.20.4/go.mod h1:meYiLeaGpKQmHBw8roW4DXLkDvusG+MD7LJ/kYyAouU=
modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
modernc.org/db v1.0.10 h1:Vy2Db368/WfWxQWzS8MECgEOZ5c0gtUHfVny4JleMsk=
modernc.org/db v1.0.10/go.mod h1:P4R9V+DHFTxL0JYYdGhXkVCxEFS2mA4d7cWzl6Zy7Cs=
modernc.org/file v1.0.8 h1:xt7OV1pn+KNBb46KzV497Igx94wlH+bt4Hb+VR1mto0=
modernc.org/file v1.0.8/go.mod h1:v0ae8/gLTK8QR+eyuV504kYZ/nsoe5JRDcHZFZecfxM=
modernc.org/fileutil v1.1.2/go.mod h1:HdjlliqRHrMAI4nVOvvpYVzVgvRSK7WnoCiG0GUWJNo=
-modernc.org/fileutil v1.2.0 h1:c7fsfzHf9WfUFXvv/RY9sStAr+VAKXYGKiAhBQQNoT4=
-modernc.org/fileutil v1.2.0/go.mod h1:0rLMFc17WSz6Bm/GtHeme7TOX8pNRhFN2NkfBlOZhrQ=
+modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
+modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
+modernc.org/gc/v2 v2.4.3 h1:Ik4ZcMbC7aY4ZDPUhzXVXi7GMub9QcXLTfXn3mWpNw8=
+modernc.org/gc/v2 v2.4.3/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
+modernc.org/gc/v3 v3.0.0-20240722195230-4a140ff9c08e h1:WPC4v0rNIFb2PY+nBBEEKyugPPRHPzUgyN3xZPpGK58=
+modernc.org/gc/v3 v3.0.0-20240722195230-4a140ff9c08e/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
modernc.org/golex v1.1.0 h1:dmSaksHMd+y6NkBsRsCShNPRaSNCNH+abrVm5/gZic8=
modernc.org/golex v1.1.0/go.mod h1:2pVlfqApurXhR1m0N+WDYu6Twnc4QuvO4+U8HnwoiRA=
-modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM=
modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
modernc.org/internal v1.0.8/go.mod h1:km71QBJPWkc1+LUldg2U9TJsKT6Q2QKHIykdEeCy/jw=
modernc.org/internal v1.1.0 h1:hYRxTXjPPzzqxXaFyC9UALxi0+v1jgwZAktvZwwgnTE=
modernc.org/internal v1.1.0/go.mod h1:IFhfxUE81NbN8Riy+oHylA3PIYgAvIQ5eMufNzg7/QU=
-modernc.org/libc v1.34.11 h1:hQDcIUlSG4QAOkXCIQKkaAOV5ptXvkOx4ddbXzgW2JU=
-modernc.org/libc v1.34.11/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE=
+modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
+modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A=
+modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU=
+modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU=
+modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
+modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0=
+modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s=
+modernc.org/libc v1.55.4 h1:iWzZ96v1Iut2Sm4lEp0yzFde20M9zpcI0wY3DFcb+8g=
+modernc.org/libc v1.55.4/go.mod h1:GPuVtbWvXUo590z/xfVIQcOqnugb1WovSfMJWMe0ZfA=
modernc.org/lldb v1.0.8 h1:gM0Lpmgtw0h/ylWQSxABvzJ++TZKhf1Q/uPAGBAM6aU=
modernc.org/lldb v1.0.8/go.mod h1:ybOcsZ/RNZo3q8fiGadQFRnD+1Jc+RWGcTPdeilCnUk=
+modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
-modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E=
-modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E=
+modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
+modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
+modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
+modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
+modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
+modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/ql v1.4.7 h1:dnGGGL5tHmPwVhMAylnLlwrnIrtk8PPb5KRfMvfgJzE=
@@ -1813,20 +2446,23 @@ modernc.org/ql v1.4.7/go.mod h1:I900l6z8ckpPy1y9VR0gu4pZ9hl9AhmQla4F8KERzdc=
modernc.org/sortutil v1.1.1/go.mod h1:DTj/8BqjEBLZFVPYvEGDfFFg94SsfPxQ70R+SQJ98qA=
modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
-modernc.org/sqlite v1.27.0 h1:MpKAHoyYB7xqcwnUwkuD+npwEa0fojF0B5QRbN+auJ8=
-modernc.org/sqlite v1.27.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0=
+modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4=
+modernc.org/sqlite v1.31.1 h1:XVU0VyzxrYHlBhIs1DiEgSl0ZtdnPtbLVy8hSkzxGrs=
+modernc.org/sqlite v1.31.1/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA=
+modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
+modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw=
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
-modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY=
-modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c=
+modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw=
+modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
-modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY=
-modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE=
+modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8=
modernc.org/zappy v1.0.9/go.mod h1:y2c4Hv5jzyBP179SxNmx5H/BM6cVgNIXPQv2bCeR6IM=
modernc.org/zappy v1.1.0 h1:cAf9HrymATNo2hYMc9c37y0tiZJYuKM2xa1ZAP8THUw=
modernc.org/zappy v1.1.0/go.mod h1:cxC0dWAgZuyMsJ+KL3ZBgo3twyKGBB/0By/umSZE2bQ=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
sqlflow.org/gohive v0.0.0-20231130013447-c9657f0f21f9 h1:MJVi9OnD/tKNXdRlw3gNEDPNV72I4xwkaBBQdeHNayo=
diff --git a/handler/errors.go b/handler/errors.go
deleted file mode 100644
index 6b77444da6f..00000000000
--- a/handler/errors.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package handler
-
-// Error wraps handler errors
-type Error struct {
- Buf string
- Err error
-}
-
-// WrapErr wraps an error using the specified driver when err is not nil.
-func WrapErr(buf string, err error) error {
- if err == nil {
- return nil
- }
- // avoid double wrapping error
- if _, ok := err.(*Error); ok {
- return err
- }
- return &Error{buf, err}
-}
-
-// Error satisfies the error interface, returning the original error message
-func (e *Error) Error() string { return e.Err.Error() }
-
-// Unwrap returns the original error
-func (e *Error) Unwrap() error { return e.Err }
diff --git a/handler/handler.go b/handler/handler.go
index 4929d7c5b7c..ba9a24a2fcc 100644
--- a/handler/handler.go
+++ b/handler/handler.go
@@ -28,14 +28,18 @@ import (
"github.com/alecthomas/chroma/v2"
"github.com/alecthomas/chroma/v2/formatters"
"github.com/alecthomas/chroma/v2/styles"
+ "github.com/go-git/go-billy/v5"
"github.com/xo/dburl"
"github.com/xo/dburl/passfile"
+ "github.com/xo/echartsgoja"
+ "github.com/xo/resvg"
"github.com/xo/tblfmt"
"github.com/xo/usql/drivers"
"github.com/xo/usql/drivers/completer"
"github.com/xo/usql/drivers/metadata"
"github.com/xo/usql/env"
"github.com/xo/usql/metacmd"
+ "github.com/xo/usql/metacmd/charts"
"github.com/xo/usql/rline"
"github.com/xo/usql/stmt"
ustyles "github.com/xo/usql/styles"
@@ -53,7 +57,11 @@ import (
type Handler struct {
l rline.IO
user *user.User
- wd string
+ // wd is the working directoyr.
+ wd string
+ // charts is the charts filesystem.
+ charts billy.Filesystem
+ // nopw indicates not asking for password.
nopw bool
// timing of every command executed
timing bool
@@ -68,6 +76,8 @@ type Handler struct {
// batch
batch bool
batchEnd string
+ // bind are bound values for exec statements
+ bind []interface{}
// connection
u *dburl.URL
db *sql.DB
@@ -77,7 +87,7 @@ type Handler struct {
}
// New creates a new input handler.
-func New(l rline.IO, user *user.User, wd string, nopw bool) *Handler {
+func New(l rline.IO, user *user.User, wd string, charts billy.Filesystem, nopw bool) *Handler {
f, iactive := l.Next, l.Interactive()
if iactive {
f = func() ([]rune, error) {
@@ -92,14 +102,16 @@ func New(l rline.IO, user *user.User, wd string, nopw bool) *Handler {
}
}
h := &Handler{
- l: l,
- user: user,
- wd: wd,
- nopw: nopw,
- buf: stmt.New(f),
+ l: l,
+ user: user,
+ wd: wd,
+ charts: charts,
+ nopw: nopw,
+ buf: stmt.New(f),
}
if iactive {
l.SetOutput(h.outputHighlighter)
+ l.Completer(completer.NewDefaultCompleter(completer.WithConnStrings(h.connStrings())))
}
return h
}
@@ -225,9 +237,16 @@ var helpQuitExitRE = regexp.MustCompile(fmt.Sprintf(`(?im)^(%s|%s|%s)\s*$`, text
func (h *Handler) Run() error {
stdout, stderr, iactive := h.l.Stdout(), h.l.Stderr(), h.l.Interactive()
// display welcome info
- if iactive {
- fmt.Fprintln(h.l.Stdout(), text.WelcomeDesc)
- fmt.Fprintln(h.l.Stdout())
+ if iactive && env.Get("QUIET") == "off" {
+ // logo
+ if typ := env.TermGraphics(); typ.Available() {
+ if err := typ.Encode(stdout, text.Logo); err != nil {
+ return err
+ }
+ }
+ // welcome text
+ fmt.Fprintln(stdout, text.WelcomeDesc)
+ fmt.Fprintln(stdout)
}
var lastErr error
for {
@@ -374,7 +393,7 @@ func (h *Handler) Run() error {
out = h.out
}
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
- if err = h.Execute(ctx, out, opt, h.lastPrefix, h.last, forceBatch); err != nil {
+ if err = h.Execute(ctx, out, opt, h.lastPrefix, h.last, forceBatch, h.unbind()...); err != nil {
lastErr = WrapErr(h.last, err)
if env.All()["ON_ERROR_STOP"] == "on" {
if iactive {
@@ -396,7 +415,7 @@ func (h *Handler) Run() error {
}
// Execute executes a query against the connected database.
-func (h *Handler) Execute(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, forceTrans bool) error {
+func (h *Handler) Execute(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, forceTrans bool, bind ...interface{}) error {
if h.db == nil {
return text.ErrNotConnected
}
@@ -411,16 +430,18 @@ func (h *Handler) Execute(ctx context.Context, w io.Writer, opt metacmd.Option,
return err
}
}
- f := h.execSingle
+ f := h.doExecSingle
switch opt.Exec {
case metacmd.ExecExec:
- f = h.execExec
+ f = h.doExecExec
case metacmd.ExecSet:
- f = h.execSet
+ f = h.doExecSet
case metacmd.ExecWatch:
- f = h.execWatch
+ f = h.doExecWatch
+ case metacmd.ExecChart:
+ f = h.doExecChart
}
- if err = drivers.WrapErr(h.u.Driver, f(ctx, w, opt, prefix, sqlstr, qtyp)); err != nil {
+ if err = drivers.WrapErr(h.u.Driver, f(ctx, w, opt, prefix, sqlstr, qtyp, bind)); err != nil {
if forceTrans {
defer h.tx.Rollback()
h.tx = nil
@@ -439,6 +460,18 @@ func (h *Handler) Reset(r []rune) {
h.last, h.lastPrefix, h.lastRaw, h.batch, h.batchEnd = "", "", "", false, ""
}
+// Bind sets the bind parameters for the next query execution.
+func (h *Handler) Bind(bind []interface{}) {
+ h.bind = bind
+}
+
+// unbind returns the bind parameters.
+func (h *Handler) unbind() []interface{} {
+ v := h.bind
+ h.bind = nil
+ return v
+}
+
// Prompt parses a prompt.
//
// NOTE: the documentation below is INCORRECT, as it is just copied from
@@ -711,19 +744,21 @@ func (h *Handler) Highlight(w io.Writer, buf string) error {
// an appropriate driver (mysql, postgres, sqlite3) depending on the type (unix
// domain socket, directory, or regular file, respectively).
func (h *Handler) Open(ctx context.Context, params ...string) error {
- // build a list of all possible connStrings for the completer
- connStrings := h.connStrings()
if len(params) == 0 || params[0] == "" {
- h.l.Completer(completer.NewDefaultCompleter(completer.WithConnStrings(connStrings)))
return nil
}
if h.tx != nil {
return text.ErrPreviousTransactionExists
}
+ if len(params) == 1 {
+ if v, ok := env.Cget(params[0]); ok {
+ params = v
+ }
+ }
if len(params) < 2 {
- urlstr := params[0]
+ dsn := params[0]
// parse dsn
- u, err := dburl.Parse(urlstr)
+ u, err := dburl.Parse(dsn)
if err != nil {
return err
}
@@ -738,7 +773,7 @@ func (h *Handler) Open(ctx context.Context, params ...string) error {
}
// open connection
var err error
- h.db, err = drivers.Open(ctx, h.u, h.GetOutput, h.IO().Stderr)
+ h.db, err = drivers.Open(ctx, h.u, h.GetOutput, h.l.Stderr)
if err != nil && !drivers.IsPasswordErr(h.u, err) {
defer h.Close()
return err
@@ -748,7 +783,6 @@ func (h *Handler) Open(ctx context.Context, params ...string) error {
// force error/check connection
if err == nil {
if err = drivers.Ping(ctx, h.u, h.db); err == nil {
- h.l.Completer(drivers.NewCompleter(ctx, h.u, h.db, readerOpts(), completer.WithConnStrings(connStrings)))
return h.Version(ctx)
}
}
@@ -804,6 +838,9 @@ func (h *Handler) connStrings() []string {
}
names = append(names, fmt.Sprintf("%s://%s%s%s%s", entry.Protocol, user, host, port, dbname))
}
+ for name := range env.Call() {
+ names = append(names, name)
+ }
sort.Strings(names)
return names
}
@@ -830,8 +867,13 @@ func (h *Handler) forceParams(u *dburl.URL) {
// Password collects a password from input, and returns a modified DSN
// including the collected password.
func (h *Handler) Password(dsn string) (string, error) {
- if dsn == "" {
+ switch v, ok := env.Cget(dsn); {
+ case dsn == "":
return "", text.ErrMissingDSN
+ case ok && len(v) < 2:
+ return "", text.ErrNamedConnectionIsNotAURL
+ case ok:
+ dsn = v[0]
}
u, err := dburl.Parse(dsn)
if err != nil {
@@ -954,38 +996,39 @@ func (h *Handler) ChangePassword(user string) (string, error) {
// Version prints the database version information after a successful connection.
func (h *Handler) Version(ctx context.Context) error {
- if env.Get("SHOW_HOST_INFORMATION") != "true" {
+ if env.Get("SHOW_HOST_INFORMATION") != "true" || !h.l.Interactive() {
return nil
}
if h.db == nil {
return text.ErrNotConnected
}
ver, err := drivers.Version(ctx, h.u, h.DB())
- if err != nil {
+ switch {
+ case err != nil:
ver = fmt.Sprintf("", err)
+ case ver == "":
+ ver = ""
}
- if ver != "" {
- h.Print(text.ConnInfo, h.u.Driver, ver)
- }
+ h.Print(text.ConnInfo, h.u.Driver, ver)
return nil
}
// Print formats according to a format specifier and writes to handler's standard output.
-func (h *Handler) Print(format string, a ...interface{}) {
+func (h *Handler) Print(s string, v ...interface{}) {
if env.Get("QUIET") == "on" {
return
}
- fmt.Fprintln(h.l.Stdout(), fmt.Sprintf(format, a...))
+ fmt.Fprintln(h.l.Stdout(), fmt.Sprintf(s, v...))
}
-// execWatch repeatedly executes a query against the database.
-func (h *Handler) execWatch(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, qtyp bool) error {
+// doExecWatch repeatedly executes a query against the database.
+func (h *Handler) doExecWatch(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, qtyp bool, bind []interface{}) error {
for {
- // this is the actual output that psql has: "Mon Jan 2006 3:04:05 PM MST"
+ // the actual output that psql has: "Mon Jan 2006 3:04:05 PM MST" -- which is _slightly_ different than RFC1123
// fmt.Fprintf(w, "%s (every %fs)\n\n", time.Now().Format("Mon Jan 2006 3:04:05 PM MST"), float64(opt.Watch)/float64(time.Second))
fmt.Fprintf(w, "%s (every %v)\n", time.Now().Format(time.RFC1123), opt.Watch)
fmt.Fprintln(w)
- if err := h.execSingle(ctx, w, opt, prefix, sqlstr, qtyp); err != nil {
+ if err := h.doExecSingle(ctx, w, opt, prefix, sqlstr, qtyp, bind); err != nil {
return err
}
select {
@@ -999,21 +1042,111 @@ func (h *Handler) execWatch(ctx context.Context, w io.Writer, opt metacmd.Option
}
}
-// execSingle executes a single query against the database based on its query type.
-func (h *Handler) execSingle(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, qtyp bool) error {
+// doExecChart executes a single query against the database, displaying its output as a chart.
+func (h *Handler) doExecChart(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, qtyp bool, bind []interface{}) error {
+ stdout, _, _ := h.l.Stdout(), h.l.Stderr(), h.l.Interactive()
+ typ := env.TermGraphics()
+ if !typ.Available() {
+ return text.ErrGraphicsNotSupported
+ }
+ if _, ok := opt.Params["help"]; ok {
+ fmt.Fprintln(stdout, text.ChartUsage)
+ return nil
+ }
+ cfg, err := charts.ParseArgs(opt.Params)
+ if err != nil {
+ return err
+ }
+ start := time.Now()
+ // query
+ rows, err := h.DB().QueryContext(ctx, sqlstr, bind...)
+ if err != nil {
+ return err
+ }
+ // get cols
+ cols, err := drivers.Columns(h.u, rows)
+ if err != nil {
+ return err
+ }
+ // process row(s)
+ transposed := make([][]string, len(cols))
+ clen, tfmt := len(cols), env.GoTime()
+ for rows.Next() {
+ row, err := h.scan(rows, clen, tfmt)
+ if err != nil {
+ return err
+ }
+ for i := range row {
+ transposed[i] = append(transposed[i], row[i])
+ }
+ }
+ // display
+ c, err := charts.MakeChart(cfg, cols, transposed)
+ if err != nil {
+ return err
+ }
+ data, err := c.ToEcharts()
+ if err != nil {
+ return err
+ }
+ echarts := echartsgoja.New(echartsgoja.WithWidthHeight(cfg.W, cfg.H))
+ res, err := echarts.RenderOptions(ctx, data)
+ if err != nil {
+ return err
+ }
+ if cfg.File != "" {
+ fmt.Println("writing to", cfg.File)
+ return os.WriteFile(cfg.File, []byte(res), 0o644)
+ }
+ img, err := resvg.Render([]byte(res), resvg.WithBackground(cfg.Background))
+ if err != nil {
+ return err
+ }
+ if err := typ.Encode(stdout, img); err != nil {
+ return err
+ }
+ if h.timing {
+ d := time.Since(start)
+ s := text.TimingDesc
+ v := []interface{}{float64(d.Microseconds()) / 1000}
+ if d > 1*time.Second {
+ s += " (%v)"
+ v = append(v, d.Round(1*time.Millisecond))
+ }
+ fmt.Fprintln(h.l.Stdout(), fmt.Sprintf(s, v...))
+ }
+ return nil
+}
+
+// doExecSingle executes a single query against the database based on its query type.
+func (h *Handler) doExecSingle(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, qtyp bool, bind []interface{}) error {
// exec or query
- f := h.exec
+ f := h.doExec
if qtyp {
- f = h.query
+ f = h.doQuery
}
// exec
- return f(ctx, w, opt, prefix, sqlstr)
+ start := time.Now()
+ if err := f(ctx, w, opt, prefix, sqlstr, bind); err != nil {
+ return err
+ }
+ if h.timing {
+ d := time.Since(start)
+ s := text.TimingDesc
+ v := []interface{}{float64(d.Microseconds()) / 1000}
+ if d > 1*time.Second {
+ s += " (%v)"
+ v = append(v, d.Round(1*time.Millisecond))
+ }
+ fmt.Fprintln(h.l.Stdout(), fmt.Sprintf(s, v...))
+ }
+ return nil
}
-// execSet executes a SQL query, setting all returned columns as variables.
-func (h *Handler) execSet(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, _ bool) error {
+// doExecSet executes a SQL query, setting all returned columns as variables.
+func (h *Handler) doExecSet(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, _ bool, bind []interface{}) error {
// query
- rows, err := h.DB().QueryContext(ctx, sqlstr)
+ rows, err := h.DB().QueryContext(ctx, sqlstr, bind...)
if err != nil {
return err
}
@@ -1049,32 +1182,31 @@ func (h *Handler) execSet(ctx context.Context, w io.Writer, opt metacmd.Option,
return nil
}
-// execExec executes a query and re-executes all columns of all rows as if they
+// doExecExec executes a query and re-executes all columns of all rows as if they
// were their own queries.
-func (h *Handler) execExec(ctx context.Context, w io.Writer, _ metacmd.Option, prefix, sqlstr string, qtyp bool) error {
+func (h *Handler) doExecExec(ctx context.Context, w io.Writer, _ metacmd.Option, prefix, sqlstr string, qtyp bool, bind []interface{}) error {
// query
- rows, err := h.DB().QueryContext(ctx, sqlstr)
+ rows, err := h.DB().QueryContext(ctx, sqlstr, bind...)
if err != nil {
return err
}
- // execRows
- if err := h.execRows(ctx, w, rows); err != nil {
+ // exec resulting rows
+ if err := h.doExecRows(ctx, w, rows); err != nil {
return err
}
// check for additional result sets ...
for rows.NextResultSet() {
- if err := h.execRows(ctx, w, rows); err != nil {
+ if err := h.doExecRows(ctx, w, rows); err != nil {
return err
}
}
return nil
}
-// query executes a query against the database.
-func (h *Handler) query(ctx context.Context, w io.Writer, opt metacmd.Option, typ, sqlstr string) error {
- start := time.Now()
+// doQuery executes a doQuery against the database.
+func (h *Handler) doQuery(ctx context.Context, w io.Writer, opt metacmd.Option, typ, sqlstr string, bind []interface{}) error {
// run query
- rows, err := h.DB().QueryContext(ctx, sqlstr)
+ rows, err := h.DB().QueryContext(ctx, sqlstr, bind...)
if err != nil {
return err
}
@@ -1093,7 +1225,7 @@ func (h *Handler) query(ctx context.Context, w io.Writer, opt metacmd.Option, ty
}
if pipeName != "" {
if pipeName[0] == '|' {
- pipe, cmd, err = env.Pipe(pipeName[1:])
+ pipe, cmd, err = env.Pipe(h.l.Stdout(), h.l.Stderr(), pipeName[1:])
} else {
pipe, err = os.OpenFile(pipeName, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0o644)
}
@@ -1105,25 +1237,28 @@ func (h *Handler) query(ctx context.Context, w io.Writer, opt metacmd.Option, ty
} else if opt.Exec != metacmd.ExecWatch {
params["pager_cmd"] = env.All()["PAGER"]
}
- useColumnTypes := drivers.UseColumnTypes(h.u)
- // wrap query with crosstab
+ // set up column type config
+ var extra []tblfmt.Option
+ switch f := drivers.ColumnTypes(h.u); {
+ case f != nil:
+ extra = append(extra, tblfmt.WithColumnTypesFunc(f))
+ case drivers.UseColumnTypes(h.u):
+ extra = append(extra, tblfmt.WithUseColumnTypes(true))
+ }
resultSet := tblfmt.ResultSet(rows)
+ // wrap query with crosstab
if opt.Exec == metacmd.ExecCrosstab {
var err error
- resultSet, err = tblfmt.NewCrosstabView(rows, tblfmt.WithParams(opt.Crosstab...), tblfmt.WithUseColumnTypes(useColumnTypes))
- if err != nil {
+ if resultSet, err = tblfmt.NewCrosstabView(rows, append(extra, tblfmt.WithParams(opt.Crosstab...))...); err != nil {
return err
}
- useColumnTypes = false
+ extra = nil
}
if drivers.LowerColumnNames(h.u) {
params["lower_column_names"] = "true"
}
- if useColumnTypes {
- params["use_column_types"] = "true"
- }
// encode and handle error conditions
- switch err := tblfmt.EncodeAll(w, resultSet, params); {
+ switch err := tblfmt.EncodeAll(w, resultSet, params, extra...); {
case err != nil && cmd != nil && errors.Is(err, syscall.EPIPE):
// broken pipe means pager quit before consuming all data, which might be expected
return nil
@@ -1136,16 +1271,6 @@ func (h *Handler) query(ctx context.Context, w io.Writer, opt metacmd.Option, ty
case params["format"] == "aligned":
fmt.Fprintln(w)
}
- if h.timing {
- d := time.Since(start)
- format := text.TimingDesc
- v := []interface{}{float64(d.Microseconds()) / 1000}
- if d > 1*time.Second {
- format += " (%v)"
- v = append(v, d.Round(1*time.Millisecond))
- }
- h.Print(format, v...)
- }
if pipe != nil {
pipe.Close()
if cmd != nil {
@@ -1155,8 +1280,8 @@ func (h *Handler) query(ctx context.Context, w io.Writer, opt metacmd.Option, ty
return err
}
-// execRows executes all the columns in the row.
-func (h *Handler) execRows(ctx context.Context, w io.Writer, rows *sql.Rows) error {
+// doExecRows executes all the columns in the row.
+func (h *Handler) doExecRows(ctx context.Context, w io.Writer, rows *sql.Rows) error {
// get columns
cols, err := drivers.Columns(h.u, rows)
if err != nil {
@@ -1237,9 +1362,9 @@ func (h *Handler) scan(rows *sql.Rows, clen int, tfmt string) ([]string, error)
return row, nil
}
-// exec does a database exec.
-func (h *Handler) exec(ctx context.Context, w io.Writer, _ metacmd.Option, typ, sqlstr string) error {
- res, err := h.DB().ExecContext(ctx, sqlstr)
+// doExec does a database exec.
+func (h *Handler) doExec(ctx context.Context, w io.Writer, _ metacmd.Option, typ, sqlstr string, bind []interface{}) error {
+ res, err := h.DB().ExecContext(ctx, sqlstr, bind...)
if err != nil {
_ = env.Set("ROW_COUNT", "0")
return err
@@ -1251,12 +1376,14 @@ func (h *Handler) exec(ctx context.Context, w io.Writer, _ metacmd.Option, typ,
return err
}
// print name
- fmt.Fprint(w, typ)
- // print count
- if count > 0 {
- fmt.Fprint(w, " ", count)
+ if env.Get("QUIET") == "off" {
+ fmt.Fprint(w, typ)
+ // print count
+ if count > 0 {
+ fmt.Fprint(w, " ", count)
+ }
+ fmt.Fprintln(w)
}
- fmt.Fprintln(w)
return env.Set("ROW_COUNT", strconv.FormatInt(count, 10))
}
@@ -1360,7 +1487,7 @@ func (h *Handler) Include(path string, relative bool) error {
Err: h.l.Stderr(),
Pw: h.l.Password,
}
- p := New(l, h.user, filepath.Dir(path), h.nopw)
+ p := New(l, h.user, filepath.Dir(path), h.charts, h.nopw)
p.db, p.u = h.db, h.u
drivers.ConfigStmt(p.u, p.buf)
err = p.Run()
@@ -1392,6 +1519,35 @@ func (h *Handler) SetOutput(o io.WriteCloser) {
h.out = o
}
+// FS is the filesystem interface.
+type FS interface{}
+
+// Error wraps handler errors.
+type Error struct {
+ Buf string
+ Err error
+}
+
+// WrapErr wraps an [error] using the specified driver when err is not nil.
+func WrapErr(buf string, err error) error {
+ if err == nil {
+ return nil
+ }
+ // avoid double wrapping error
+ if _, ok := err.(*Error); ok {
+ return err
+ }
+ return &Error{buf, err}
+}
+
+// Error satisfies the [error] interface, returning the original error message.
+func (e *Error) Error() string {
+ return e.Err.Error()
+}
+
+// Unwrap returns the original error.
+func (e *Error) Unwrap() error { return e.Err }
+
func readerOpts() []metadata.ReaderOption {
var opts []metadata.ReaderOption
envs := env.All()
@@ -1448,3 +1604,27 @@ func grab(r []rune, i, end int) rune {
}
return 0
}
+
+// linetermRE is the end of line terminal.
+var linetermRE = regexp.MustCompile(`(?:\r?\n)+$`)
+
+// empty reports whether s contains at least one printable, non-space character.
+func empty(s string) bool {
+ i := strings.IndexFunc(s, func(r rune) bool {
+ return unicode.IsPrint(r) && !unicode.IsSpace(r)
+ })
+ return i == -1
+}
+
+var ansiRE = regexp.MustCompile(`\x1b[[0-9]+([:;][0-9]+)*m`)
+
+// lastcolor returns the last defined color in s, if any.
+func lastcolor(s string) string {
+ if i := strings.LastIndex(s, "\n"); i != -1 {
+ s = s[:i]
+ }
+ if i := strings.LastIndex(s, "\x1b[0m"); i != -1 {
+ s = s[i+4:]
+ }
+ return strings.Join(ansiRE.FindAllString(s, -1), "")
+}
diff --git a/handler/util.go b/handler/util.go
deleted file mode 100644
index a8bb9e9038b..00000000000
--- a/handler/util.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package handler
-
-import (
- "regexp"
- "strings"
- "unicode"
-)
-
-// linetermRE is the end of line terminal.
-var linetermRE = regexp.MustCompile(`(?:\r?\n)+$`)
-
-// empty reports whether s contains at least one printable, non-space character.
-func empty(s string) bool {
- i := strings.IndexFunc(s, func(r rune) bool {
- return unicode.IsPrint(r) && !unicode.IsSpace(r)
- })
- return i == -1
-}
-
-var ansiRE = regexp.MustCompile(`\x1b[[0-9]+([:;][0-9]+)*m`)
-
-// lastcolor returns the last defined color in s, if any.
-func lastcolor(s string) string {
- if i := strings.LastIndex(s, "\n"); i != -1 {
- s = s[:i]
- }
- if i := strings.LastIndex(s, "\x1b[0m"); i != -1 {
- s = s[i+4:]
- }
- return strings.Join(ansiRE.FindAllString(s, -1), "")
-}
diff --git a/internal/chai.go b/internal/chai.go
new file mode 100644
index 00000000000..e4046188c52
--- /dev/null
+++ b/internal/chai.go
@@ -0,0 +1,9 @@
+//go:build (all || most || chai) && !no_chai
+
+package internal
+
+// Code generated by gen.go. DO NOT EDIT.
+
+import (
+ _ "github.com/xo/usql/drivers/chai" // ChaiSQL driver
+)
diff --git a/internal/genji.go b/internal/genji.go
deleted file mode 100644
index 6ca29185ea9..00000000000
--- a/internal/genji.go
+++ /dev/null
@@ -1,9 +0,0 @@
-//go:build (bad || genji) && !no_genji
-
-package internal
-
-// Code generated by gen.go. DO NOT EDIT.
-
-import (
- _ "github.com/xo/usql/drivers/genji" // Genji driver
-)
diff --git a/internal/internal.go b/internal/internal.go
index 843a9a9ccf4..e73096bd575 100644
--- a/internal/internal.go
+++ b/internal/internal.go
@@ -13,18 +13,18 @@ func KnownBuildTags() map[string]string {
"avatica": "avatica", // github.com/apache/calcite-avatica-go/v5
"bigquery": "bigquery", // gorm.io/driver/bigquery/driver
"cassandra": "cql", // github.com/MichaelS11/go-cql-driver
+ "chai": "chai", // github.com/chaisql/chai/driver
"clickhouse": "clickhouse", // github.com/ClickHouse/clickhouse-go/v2
"cosmos": "cosmos", // github.com/btnguyen2k/gocosmos
"couchbase": "n1ql", // github.com/couchbase/go_n1ql
"csvq": "csvq", // github.com/mithrandie/csvq-driver
- "databend": "databend", // github.com/databendcloud/databend-go
+ "databend": "databend", // github.com/datafuselabs/databend-go
"databricks": "databricks", // github.com/databricks/databricks-sql-go
"duckdb": "duckdb", // github.com/marcboeker/go-duckdb
"dynamodb": "dynamodb", // github.com/btnguyen2k/godynamo
"exasol": "exasol", // github.com/exasol/exasol-driver-go
"firebird": "firebirdsql", // github.com/nakagami/firebirdsql
"flightsql": "flightsql", // github.com/apache/arrow/go/v12/arrow/flight/flightsql/driver
- "genji": "genji", // github.com/genjidb/genji/driver
"godror": "godror", // github.com/godror/godror
"h2": "h2", // github.com/jmrobles/h2go
"hive": "hive", // sqlflow.org/gohive
@@ -42,6 +42,7 @@ func KnownBuildTags() map[string]string {
"postgres": "postgres", // github.com/lib/pq
"presto": "presto", // github.com/prestodb/presto-go-client/presto
"ql": "ql", // modernc.org/ql
+ "ramsql": "ramsql", // github.com/proullon/ramsql/driver
"sapase": "tds", // github.com/thda/tds
"saphana": "hdb", // github.com/SAP/go-hdb/driver
"snowflake": "snowflake", // github.com/snowflakedb/gosnowflake
diff --git a/internal/ramsql.go b/internal/ramsql.go
new file mode 100644
index 00000000000..0039a521a14
--- /dev/null
+++ b/internal/ramsql.go
@@ -0,0 +1,9 @@
+//go:build (all || most || ramsql) && !no_ramsql
+
+package internal
+
+// Code generated by gen.go. DO NOT EDIT.
+
+import (
+ _ "github.com/xo/usql/drivers/ramsql" // RamSQL driver
+)
diff --git a/main.go b/main.go
index c2ab6b4a5f1..41bcbeb6b6b 100644
--- a/main.go
+++ b/main.go
@@ -9,11 +9,9 @@ import (
"fmt"
"io"
"os"
- "os/user"
"strings"
"github.com/xo/usql/drivers"
- "github.com/xo/usql/env"
"github.com/xo/usql/handler"
"github.com/xo/usql/internal"
"github.com/xo/usql/rline"
@@ -35,19 +33,11 @@ func main() {
if _, ok := available[n]; ok {
out = 1
}
- fmt.Fprintf(os.Stdout, "%d", out)
+ fmt.Fprint(os.Stdout, out)
return
}
- // load current user
- cur, err := user.Current()
- if err != nil {
- fmt.Fprintf(os.Stderr, "error: %v\n", err)
- os.Exit(1)
- }
- args := NewArgs()
// run
- err = run(args, cur)
- if err != nil && err != io.EOF && err != rline.ErrInterrupt {
+ if err := New(os.Args).ExecuteContext(context.Background()); err != nil && err != io.EOF && err != rline.ErrInterrupt {
var he *handler.Error
if !errors.As(err, &he) {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
@@ -66,114 +56,16 @@ func main() {
if text.CommandVersion == "0.0.0-dev" || strings.Contains(text.CommandVersion, "-") {
rev = "master"
}
- fmt.Fprintf(os.Stderr, "\ntry:\n\n go install -tags %s github.com/xo/usql@%s\n\n", tag, rev)
- }
- os.Exit(1)
- }
-}
-
-// run processes args, processing args.CommandOrFiles if non-empty, if
-// specified, otherwise launch an interactive readline from stdin.
-func run(args *Args, u *user.User) error {
- // get working directory
- wd, err := os.Getwd()
- if err != nil {
- return err
- }
- // handle variables
- for _, v := range args.Variables {
- if i := strings.Index(v, "="); i != -1 {
- _ = env.Set(v[:i], v[i+1:])
- } else {
- _ = env.Unset(v)
- }
- }
- for _, v := range args.PVariables {
- if i := strings.Index(v, "="); i != -1 {
- vv := v[i+1:]
- if c := vv[0]; c == '\'' || c == '"' {
- var err error
- vv, err = env.Dequote(vv, c)
- if err != nil {
- return err
- }
- }
- if _, err = env.Pset(v[:i], vv); err != nil {
- return err
- }
- } else {
- if _, err = env.Ptoggle(v, ""); err != nil {
- return err
- }
+ fmt.Fprintf(os.Stderr, "\ntry:\n\n go install -tags 'most %s' github.com/xo/usql@%s\n\n", tag, rev)
}
- }
- // create input/output
- l, err := rline.New(len(args.CommandOrFiles) != 0, args.Out, env.HistoryFile(u))
- if err != nil {
- return err
- }
- defer l.Close()
- // create handler
- h := handler.New(l, u, wd, args.NoPassword)
- // force a password ...
- dsn := args.DSN
- if args.ForcePassword {
- dsn, err = h.Password(dsn)
- if err != nil {
- return err
+ switch estr := err.Error(); {
+ case err == text.ErrWrongNumberOfArguments,
+ strings.HasPrefix(estr, "unknown flag:"),
+ strings.HasPrefix(estr, "unknown shorthand flag:"),
+ strings.HasPrefix(estr, "bad flag syntax:"),
+ strings.HasPrefix(estr, "flag needs an argument:"):
+ fmt.Fprintln(os.Stderr, text.CommandHelpHint)
}
- }
- // open dsn
- if err = h.Open(context.Background(), dsn); err != nil {
- return err
- }
- // start transaction
- if args.SingleTransaction {
- if h.IO().Interactive() {
- return text.ErrSingleTransactionCannotBeUsedWithInteractiveMode
- }
- if err = h.BeginTx(context.Background(), nil); err != nil {
- return err
- }
- }
- // rc file
- if rc := env.RCFile(u); !args.NoRC && rc != "" {
- if err = h.Include(rc, false); err != nil && err != text.ErrNoSuchFileOrDirectory {
- return err
- }
- }
- // setup runner
- f := h.Run
- if len(args.CommandOrFiles) != 0 {
- f = runCommandOrFiles(h, args.CommandOrFiles)
- }
- // run
- if err = f(); err != nil {
- return err
- }
- // commit
- if args.SingleTransaction {
- return h.Commit()
- }
- return nil
-}
-
-// runCommandOrFiles processes all the supplied commands or files.
-func runCommandOrFiles(h *handler.Handler, commandsOrFiles []CommandOrFile) func() error {
- return func() error {
- for _, x := range commandsOrFiles {
- h.SetSingleLineMode(x.Command)
- if x.Command {
- h.Reset([]rune(x.Value))
- if err := h.Run(); err != nil {
- return err
- }
- } else {
- if err := h.Include(x.Value, false); err != nil {
- return err
- }
- }
- }
- return nil
+ os.Exit(1)
}
}
diff --git a/metacmd/charts/charts.go b/metacmd/charts/charts.go
new file mode 100644
index 00000000000..734ba4b57fb
--- /dev/null
+++ b/metacmd/charts/charts.go
@@ -0,0 +1,300 @@
+package charts
+
+import (
+ "encoding/json"
+ "fmt"
+ "image/color"
+ "math"
+ "strconv"
+ "strings"
+
+ "github.com/kenshaw/colors"
+ "github.com/xo/usql/text"
+)
+
+type ChartConfig struct {
+ Title string
+ Subtitle string
+ W, H int
+ Background color.Color
+ Type string
+ Prec int
+
+ File string
+}
+
+func ParseArgs(opts map[string]string) (ChartConfig, error) {
+ cfg := ChartConfig{
+ Title: opts["title"],
+ Subtitle: opts["subtitle"],
+ W: 800,
+ H: 600,
+ Background: color.White,
+ Type: opts["type"],
+ }
+ if size, ok := opts["size"]; ok {
+ b, a, ok := strings.Cut(size, "x")
+ if !ok {
+ return ChartConfig{}, fmt.Errorf(text.ChartParseFailed, "size", "provide size as NxN")
+ }
+ var err error
+ cfg.W, err = strconv.Atoi(b)
+ if err != nil {
+ return ChartConfig{}, fmt.Errorf(text.ChartParseFailed, "size", err)
+ }
+ cfg.H, err = strconv.Atoi(a)
+ if err != nil {
+ return ChartConfig{}, fmt.Errorf(text.ChartParseFailed, "size", err)
+ }
+ }
+ if c, ok := opts["bg"]; ok {
+ var err error
+ cfg.Background, err = colors.Parse(c)
+ if err != nil {
+ return ChartConfig{}, fmt.Errorf(text.ChartParseFailed, "bg", err)
+ }
+ }
+ if prec, ok := opts["prec"]; ok {
+ p, err := strconv.Atoi(prec)
+ if err != nil {
+ return ChartConfig{}, fmt.Errorf(text.ChartParseFailed, "prec", err)
+ }
+ cfg.Prec = p
+ }
+ if file, ok := opts["file"]; ok {
+ cfg.File = file
+ }
+ return cfg, nil
+}
+
+type Chart struct {
+ Title string
+ Subtitle string
+ Legend []string
+ XAxis Series
+ YAxis Series
+ Series []Series
+}
+
+type Series struct {
+ Name string
+ Type string
+ Data any
+}
+
+func MakeChart(cfg ChartConfig, cols []string, transposed [][]string) (*Chart, error) {
+ numCols := make([][]float64, len(cols))
+ for i, col := range transposed {
+ for _, v := range col {
+ f, err := parseFloat(v, cfg.Prec)
+ if err != nil {
+ numCols[i] = nil
+ break
+ }
+ if numCols[i] == nil {
+ // don't allocate slice unless we have at least some valid data
+ numCols[i] = make([]float64, 0, len(col))
+ }
+ numCols[i] = append(numCols[i], f)
+ }
+ }
+ firstReg, firstNumeric := -1, -1
+ for i, c := range numCols {
+ if firstReg == -1 && c == nil {
+ firstReg = i
+ }
+ if firstNumeric == -1 && c != nil {
+ firstNumeric = i
+ }
+ }
+ c := &Chart{
+ Title: cfg.Title,
+ Subtitle: cfg.Subtitle,
+ }
+ var x int
+ var chartType string
+ switch {
+ case firstNumeric == -1:
+ return nil, text.ErrNoNumericColumns
+ case firstReg >= 0:
+ x = firstReg
+ chartType = "bar"
+ default:
+ x = firstNumeric
+ chartType = "line"
+ }
+ if cfg.Type != "" {
+ chartType = cfg.Type
+ }
+ c.XAxis = Series{
+ Name: cols[x],
+ Type: "category",
+ Data: transposed[x],
+ }
+ c.YAxis = Series{
+ Type: "value",
+ }
+ for i, col := range cols {
+ if i == x {
+ continue
+ }
+ c.Legend = append(c.Legend, col)
+ c.Series = append(c.Series, Series{
+ Name: col,
+ Type: chartType,
+ Data: numCols[i],
+ })
+ }
+ return c, nil
+}
+
+/* echarts */
+
+type echarts struct {
+ Title *echartsTitle `json:"title,omitempty"`
+ Legend *echartsLegend `json:"legend,omitempty"`
+ XAxis *echartsAxis `json:"xAxis,omitempty"`
+ YAxis *echartsAxis `json:"yAxis,omitempty"`
+ Series []echartsAxis `json:"series,omitempty"`
+}
+
+type echartsTitle struct {
+ Title string `json:"text,omitempty"`
+ Subtext string `json:"subtext,omitempty"`
+}
+
+type echartsLegend struct {
+ Data []string `json:"data,omitempty"`
+}
+
+type echartsAxis struct {
+ Name string `json:"name,omitempty"`
+ Type string `json:"type,omitempty"`
+ Data any `json:"data,omitempty"`
+}
+
+func (c Chart) ToEcharts() (string, error) {
+ ec := echarts{}
+ if c.Title != "" || c.Subtitle != "" {
+ ec.Title = &echartsTitle{c.Title, c.Subtitle}
+ }
+ if len(c.Legend) > 0 {
+ ec.Legend = &echartsLegend{c.Legend}
+ }
+ if c.XAxis.Data != nil || c.YAxis.Type != "" {
+ ec.XAxis = &echartsAxis{
+ Name: c.XAxis.Name,
+ Type: c.XAxis.Type,
+ Data: c.XAxis.Data,
+ }
+ }
+ if c.YAxis.Data != nil || c.YAxis.Type != "" {
+ ec.YAxis = &echartsAxis{
+ Name: c.YAxis.Name,
+ Type: c.YAxis.Type,
+ Data: c.YAxis.Data,
+ }
+ }
+ if len(c.Series) > 0 {
+ ec.Series = make([]echartsAxis, 0, len(c.Series))
+ for _, s := range c.Series {
+ ec.Series = append(ec.Series, echartsAxis{
+ Name: s.Name,
+ Type: s.Type,
+ Data: s.Data,
+ })
+ }
+ }
+ buf, err := json.Marshal(ec)
+ if err != nil {
+ return "", err
+ }
+ return string(buf), nil
+}
+
+func parseFloat(v string, prec int) (f float64, err error) {
+ f, err = strconv.ParseFloat(v, 64)
+ if err != nil || prec == 0 {
+ return
+ }
+ r := math.Pow(10, float64(prec))
+ return math.Round(f*r) / r, nil
+}
+
+const basicBarTemplate = `
+{
+ "title": {
+ "text": {{ printf "%q" .Title }},
+ "subtext": {{ printf "%q" .Subtitle }}
+ },
+ {{- if .Legend }}
+ "legend": {
+ "data": [
+ {{ range .Legend }}{{ printf "%q" . }}{{ end }}
+ ]
+ },
+ {{- end }}
+ "xAxis": [
+ {
+ "type": "category",
+ "data": [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+ ]
+ }
+ ],
+ "yAxis": [
+ {
+ "type": "value"
+ }
+ ],
+ "series": [
+ {
+ "name": "Rainfall",
+ "type": "bar",
+ "data": [
+ 2,
+ 4.9,
+ 7,
+ 23.2,
+ 25.6,
+ 76.7,
+ 135.6,
+ 162.2,
+ 32.6,
+ 20,
+ 6.4,
+ 3.3
+ ],
+ },
+ {
+ "name": "Evaporation",
+ "type": "bar",
+ "data": [
+ 2.6,
+ 5.9,
+ 9,
+ 26.4,
+ 28.7,
+ 70.7,
+ 175.6,
+ 182.2,
+ 48.7,
+ 18.8,
+ 6,
+ 2.3
+ ],
+ }
+ ]
+}
+`
diff --git a/metacmd/cmds.go b/metacmd/cmds.go
index 4bc170c9522..4c6df90d730 100644
--- a/metacmd/cmds.go
+++ b/metacmd/cmds.go
@@ -7,25 +7,24 @@ import (
"fmt"
"io"
"os"
+ "os/exec"
"os/signal"
"sort"
"strconv"
"strings"
"time"
- "github.com/alecthomas/kingpin/v2"
"github.com/xo/dburl"
"github.com/xo/usql/drivers"
"github.com/xo/usql/env"
"github.com/xo/usql/text"
+ "golang.org/x/exp/maps"
)
// Cmd is a command implementation.
type Cmd struct {
Section Section
- Name string
- Desc Desc
- Aliases map[string]Desc
+ Descs []Desc
Process func(*Params) error
}
@@ -42,36 +41,48 @@ func init() {
cmds = []Cmd{
Question: {
Section: SectionHelp,
- Name: "?",
- Desc: Desc{"show help on backslash commands", "[commands]"},
- Aliases: map[string]Desc{
- "?": {"show help on " + text.CommandName + " command-line options", "options"},
- "? ": {"show help on special variables", "variables"},
+ Descs: []Desc{
+ {"?", "[commands]", "show help on backslash commands"},
+ {"?", "options", "show help on " + text.CommandName + " command-line options"},
+ {"?", "variables", "show help on special " + text.CommandName + " variables"},
},
Process: func(p *Params) error {
name, err := p.Get(false)
if err != nil {
return err
}
- switch name {
+ stdout, stderr := p.Handler.IO().Stdout(), p.Handler.IO().Stderr()
+ var cmd *exec.Cmd
+ var wc io.WriteCloser
+ if pager := env.Get("PAGER"); p.Handler.IO().Interactive() && pager != "" {
+ if wc, cmd, err = env.Pipe(stdout, stderr, pager); err != nil {
+ return err
+ }
+ stdout = wc
+ }
+ switch name = strings.TrimSpace(strings.ToLower(name)); {
+ case name == "options":
+ Usage(stdout, true)
+ case name == "variables":
+ env.Listing(stdout)
default:
- Listing(p.Handler.IO().Stdout())
- case "commands":
- Listing(p.Handler.IO().Stdout())
- case "options":
- // FIXME: decouple
- kingpin.Usage()
- case "variables":
- env.Listing(p.Handler.IO().Stdout())
+ Listing(stdout)
+ }
+ if cmd != nil {
+ if err := wc.Close(); err != nil {
+ return err
+ }
+ return cmd.Wait()
}
return nil
},
},
Quit: {
Section: SectionGeneral,
- Name: "q",
- Desc: Desc{"quit " + text.CommandName, ""},
- Aliases: map[string]Desc{"quit": {}},
+ Descs: []Desc{
+ {"q", "", "quit " + text.CommandName},
+ {"quit", "", ""},
+ },
Process: func(p *Params) error {
p.Option.Quit = true
return nil
@@ -79,32 +90,48 @@ func init() {
},
Copyright: {
Section: SectionGeneral,
- Name: "copyright",
- Desc: Desc{"show " + text.CommandName + " usage and distribution terms", ""},
+ Descs: []Desc{
+ {"copyright", "", "show " + text.CommandName + " usage and distribution terms"},
+ },
Process: func(p *Params) error {
- p.Handler.Print(text.Copyright)
+ stdout := p.Handler.IO().Stdout()
+ if typ := env.TermGraphics(); typ.Available() {
+ typ.Encode(stdout, text.Logo)
+ }
+ fmt.Fprintln(stdout, text.Copyright)
return nil
},
},
ConnectionInfo: {
Section: SectionConnection,
- Name: "conninfo",
- Desc: Desc{"display information about the current database connection", ""},
+ Descs: []Desc{
+ {"conninfo", "", "display information about the current database connection"},
+ },
Process: func(p *Params) error {
+ s := text.NotConnected
if db, u := p.Handler.DB(), p.Handler.URL(); db != nil && u != nil {
- p.Handler.Print(text.ConnInfo, u.Driver, u.DSN)
- } else {
- p.Handler.Print(text.NotConnected)
+ s = fmt.Sprintf(text.ConnInfo, u.Driver, u.DSN)
}
+ fmt.Fprintln(p.Handler.IO().Stdout(), s)
return nil
},
},
Drivers: {
Section: SectionGeneral,
- Name: "drivers",
- Desc: Desc{"display information about available database drivers", ""},
+ Descs: []Desc{
+ {"drivers", "", "display information about available database drivers"},
+ },
Process: func(p *Params) error {
- out := p.Handler.IO().Stdout()
+ stdout, stderr := p.Handler.IO().Stdout(), p.Handler.IO().Stderr()
+ var cmd *exec.Cmd
+ var wc io.WriteCloser
+ if pager := env.Get("PAGER"); p.Handler.IO().Interactive() && pager != "" {
+ var err error
+ if wc, cmd, err = env.Pipe(stdout, stderr, pager); err != nil {
+ return err
+ }
+ stdout = wc
+ }
available := drivers.Available()
names := make([]string, len(available))
var z int
@@ -113,7 +140,7 @@ func init() {
z++
}
sort.Strings(names)
- fmt.Fprintln(out, text.AvailableDrivers)
+ fmt.Fprintln(stdout, text.AvailableDrivers)
for _, n := range names {
s := " " + n
driver, aliases := dburl.SchemeDriverAndAliases(n)
@@ -125,18 +152,23 @@ func init() {
s += " [" + strings.Join(aliases, ", ") + "]"
}
}
- fmt.Fprintln(out, s)
+ fmt.Fprintln(stdout, s)
+ }
+ if cmd != nil {
+ if err := wc.Close(); err != nil {
+ return err
+ }
+ return cmd.Wait()
}
return nil
},
},
Connect: {
Section: SectionConnection,
- Name: "c",
- Desc: Desc{"connect to database url", "DSN"},
- Aliases: map[string]Desc{
- "c": {"connect to database with driver and parameters", "DRIVER PARAMS..."},
- "connect": {},
+ Descs: []Desc{
+ {"c", "DSN", "connect to database url"},
+ {"c", "DRIVER PARAMS...", "connect to database with driver and parameters"},
+ {"connect", "", ""},
},
Process: func(p *Params) error {
vals, err := p.GetAll(true)
@@ -148,20 +180,50 @@ func init() {
return p.Handler.Open(ctx, vals...)
},
},
+ SetConnVar: {
+ Section: SectionConnection,
+ Descs: []Desc{
+ {"cset", "[NAME [DSN]]", "set named connection, or list all if no parameters"},
+ {"cset", "NAME DRIVER PARAMS...", "define named connection for database driver"},
+ },
+ Process: func(p *Params) error {
+ ok, n, err := p.GetOK(true)
+ switch {
+ case err != nil:
+ return err
+ case ok:
+ vals, err := p.GetAll(true)
+ if err != nil {
+ return err
+ }
+ return env.Cset(n, vals...)
+ }
+ vals := env.Call()
+ keys := maps.Keys(vals)
+ sort.Strings(keys)
+ out := p.Handler.IO().Stdout()
+ for _, k := range keys {
+ fmt.Fprintln(out, k, "=", "'"+strings.Join(vals[k], " ")+"'")
+ }
+ return nil
+ },
+ },
Disconnect: {
Section: SectionConnection,
- Name: "Z",
- Desc: Desc{"close database connection", ""},
- Aliases: map[string]Desc{"disconnect": {}},
+ Descs: []Desc{
+ {"Z", "", "close database connection"},
+ {"disconnect", "", ""},
+ },
Process: func(p *Params) error {
return p.Handler.Close()
},
},
Password: {
Section: SectionConnection,
- Name: "password",
- Desc: Desc{"change the password for a user", "[USERNAME]"},
- Aliases: map[string]Desc{"passwd": {}},
+ Descs: []Desc{
+ {"password", "[USERNAME]", "change the password for a user"},
+ {"passwd", "", ""},
+ },
Process: func(p *Params) error {
username, err := p.Get(true)
if err != nil {
@@ -180,15 +242,15 @@ func init() {
},
Exec: {
Section: SectionQueryExecute,
- Name: "g",
- Desc: Desc{"execute query (and send results to file or |pipe)", "[(OPTIONS)] [FILE] or ;"},
- Aliases: map[string]Desc{
- "gexec": {"execute query and execute each value of the result", ""},
- "gset": {"execute query and store results in " + text.CommandName + " variables", "[PREFIX]"},
- "gx": {`as \g, but forces expanded output mode`, `[(OPTIONS)] [FILE]`},
- "G": {`as \g, but forces vertical output mode`, `[(OPTIONS)] [FILE]`},
- "crosstabview": {"execute query and display results in crosstab", "[(OPTIONS)] [COLUMNS]"},
- "watch": {"execute query every specified interval", "[(OPTIONS)] [DURATION]"},
+ Descs: []Desc{
+ {"g", "[(OPTIONS)] [FILE] or ;", "execute query (and send results to file or |pipe)"},
+ {"G", "[(OPTIONS)] [FILE]", "as \\g, but forces vertical output mode"},
+ {"gx", "[(OPTIONS)] [FILE]", "as \\g, but forces expanded output mode"},
+ {"gexec", "", "execute query and execute each value of the result"},
+ {"gset", "[PREFIX]", "execute query and store results in " + text.CommandName + " variables"},
+ {"crosstabview", "[(OPTIONS)] [COLUMNS]", "execute query and display results in crosstab"},
+ {"chart", "CHART [(OPTIONS)]", "execute query and display results as a chart"},
+ {"watch", "[(OPTIONS)] [DURATION]", "execute query every specified interval"},
},
Process: func(p *Params) error {
p.Option.Exec = ExecOnly
@@ -234,6 +296,32 @@ func init() {
break
}
}
+ case "chart":
+ p.Option.Exec = ExecChart
+ if p.Option.Params == nil {
+ p.Option.Params = make(map[string]string, 1)
+ }
+ params, err := p.GetAll(true)
+ if err != nil {
+ return err
+ }
+ for i := 0; i < len(params); i++ {
+ param := params[i]
+ if param == "help" {
+ p.Option.Params["help"] = ""
+ return nil
+ }
+ equal := strings.IndexByte(param, '=')
+ switch {
+ case equal == -1 && i >= len(params)-1:
+ return text.ErrWrongNumberOfArguments
+ case equal == -1:
+ i++
+ p.Option.Params[param] = params[i]
+ default:
+ p.Option.Params[param[:equal]] = param[equal+1:]
+ }
+ }
case "watch":
p.Option.Exec = ExecWatch
p.Option.Watch = 2 * time.Second
@@ -257,11 +345,33 @@ func init() {
return nil
},
},
+ Bind: {
+ Section: SectionQueryExecute,
+ Descs: []Desc{
+ {"bind", "[PARAM]...", "set query parameters"},
+ },
+ Process: func(p *Params) error {
+ bind, err := p.GetAll(true)
+ if err != nil {
+ return err
+ }
+ var v []interface{}
+ if n := len(bind); n != 0 {
+ v = make([]interface{}, len(bind))
+ for i := 0; i < n; i++ {
+ v[i] = bind[i]
+ }
+ }
+ p.Handler.Bind(v)
+ return nil
+ },
+ },
Edit: {
Section: SectionQueryBuffer,
- Name: "e",
- Desc: Desc{"edit the query buffer (or file) with external editor", "[FILE] [LINE]"},
- Aliases: map[string]Desc{"edit": {}},
+ Descs: []Desc{
+ {"e", "[FILE] [LINE]", "edit the query buffer (or file) with external editor"},
+ {"edit", "", ""},
+ },
Process: func(p *Params) error {
// get last statement
s, buf := p.Handler.Last(), p.Handler.Buf()
@@ -289,11 +399,10 @@ func init() {
},
Print: {
Section: SectionQueryBuffer,
- Name: "p",
- Desc: Desc{"show the contents of the query buffer", ""},
- Aliases: map[string]Desc{
- "print": {},
- "raw": {"show the raw (non-interpolated) contents of the query buffer", ""},
+ Descs: []Desc{
+ {"p", "", "show the contents of the query buffer"},
+ {"print", "", ""},
+ {"raw", "", "show the raw (non-interpolated) contents of the query buffer"},
},
Process: func(p *Params) error {
// get last statement
@@ -326,56 +435,59 @@ func init() {
},
Reset: {
Section: SectionQueryBuffer,
- Name: "r",
- Desc: Desc{"reset (clear) the query buffer", ""},
- Aliases: map[string]Desc{"reset": {}},
+ Descs: []Desc{
+ {"r", "", "reset (clear) the query buffer"},
+ {"reset", "", ""},
+ },
Process: func(p *Params) error {
p.Handler.Reset(nil)
- fmt.Fprintln(p.Handler.IO().Stdout(), text.QueryBufferReset)
+ p.Handler.Print(text.QueryBufferReset)
return nil
},
},
Echo: {
Section: SectionInputOutput,
- Name: "echo",
- Desc: Desc{"write string to standard output (-n for no newline)", "[-n] [STRING]"},
- Aliases: map[string]Desc{
- "qecho": {"write string to \\o output stream (-n for no newline)", "[-n] [STRING]"},
- "warn": {"write string to standard error (-n for no newline)", "[-n] [STRING]"},
+ Descs: []Desc{
+ {"echo", "[-n] [STRING]", "write string to standard output (-n for no newline)"},
+ {"qecho", "[-n] [STRING]", "write string to \\o output stream (-n for no newline)"},
+ {"warn", "[-n] [STRING]", "write string to standard error (-n for no newline)"},
},
Process: func(p *Params) error {
- nl := "\n"
- var vals []string
ok, n, err := p.GetOptional(true)
if err != nil {
return err
}
- if ok && n == "n" {
- nl = ""
- } else if ok {
+ f := fmt.Fprintln
+ var vals []string
+ switch {
+ case ok && n == "n":
+ f = fmt.Fprint
+ case ok:
vals = append(vals, "-"+n)
- } else {
+ default:
vals = append(vals, n)
}
v, err := p.GetAll(true)
if err != nil {
return err
}
- out := io.Writer(p.Handler.IO().Stdout())
- if o := p.Handler.GetOutput(); p.Name == "qecho" && o != nil {
+ out := p.Handler.IO().Stdout()
+ switch o := p.Handler.GetOutput(); {
+ case p.Name == "qecho" && o != nil:
out = o
- } else if p.Name == "warn" {
+ case p.Name == "warn":
out = p.Handler.IO().Stderr()
}
- fmt.Fprint(out, strings.Join(append(vals, v...), " ")+nl)
+ f(out, strings.Join(append(vals, v...), " "))
return nil
},
},
Write: {
Section: SectionQueryBuffer,
- Name: "w",
- Desc: Desc{"write query buffer to file", "FILE"},
- Aliases: map[string]Desc{"write": {}},
+ Descs: []Desc{
+ {"w", "FILE", "write query buffer to file"},
+ {"write", "", ""},
+ },
Process: func(p *Params) error {
// get last statement
s, buf := p.Handler.Last(), p.Handler.Buf()
@@ -391,8 +503,9 @@ func init() {
},
ChangeDir: {
Section: SectionOperatingSystem,
- Name: "cd",
- Desc: Desc{"change the current working directory", "[DIR]"},
+ Descs: []Desc{
+ {"cd", "[DIR]", "change the current working directory"},
+ },
Process: func(p *Params) error {
dir, err := p.Get(true)
if err != nil {
@@ -401,10 +514,35 @@ func init() {
return env.Chdir(p.Handler.User(), dir)
},
},
+ GetEnv: {
+ Section: SectionOperatingSystem,
+ Descs: []Desc{
+ {"getenv", "VARNAME ENVVAR", "fetch environment variable"},
+ },
+ Process: func(p *Params) error {
+ n, err := p.Get(true)
+ switch {
+ case err != nil:
+ return err
+ case n == "":
+ return text.ErrMissingRequiredArgument
+ }
+ v, err := p.Get(true)
+ switch {
+ case err != nil:
+ return err
+ case v == "":
+ return text.ErrMissingRequiredArgument
+ }
+ value, _ := env.Getenv(v)
+ return env.Set(n, value)
+ },
+ },
SetEnv: {
Section: SectionOperatingSystem,
- Name: "setenv",
- Desc: Desc{"set or unset environment variable", "NAME [VALUE]"},
+ Descs: []Desc{
+ {"setenv", "NAME [VALUE]", "set or unset environment variable"},
+ },
Process: func(p *Params) error {
n, err := p.Get(true)
if err != nil {
@@ -419,8 +557,9 @@ func init() {
},
Timing: {
Section: SectionOperatingSystem,
- Name: "timing",
- Desc: Desc{"toggle timing of commands", "[on|off]"},
+ Descs: []Desc{
+ {"timing", "[on|off]", "toggle timing of commands"},
+ },
Process: func(p *Params) error {
v, err := p.Get(true)
if err != nil {
@@ -451,21 +590,21 @@ func init() {
},
Shell: {
Section: SectionOperatingSystem,
- Name: "!",
- Desc: Desc{"execute command in shell or start interactive shell", "[COMMAND]"},
+ Descs: []Desc{
+ {"!", "[COMMAND]", "execute command in shell or start interactive shell"},
+ },
Process: func(p *Params) error {
return env.Shell(p.GetRaw())
},
},
Out: {
Section: SectionInputOutput,
- Name: "o",
- Desc: Desc{"send all query results to file or |pipe", "[FILE]"},
- Aliases: map[string]Desc{"out": {}},
+ Descs: []Desc{
+ {"o", "[FILE]", "send all query results to file or |pipe"},
+ {"out", "", ""},
+ },
Process: func(p *Params) error {
- if out := p.Handler.GetOutput(); out != nil {
- p.Handler.SetOutput(nil)
- }
+ p.Handler.SetOutput(nil)
params, err := p.GetAll(true)
if err != nil {
return err
@@ -476,7 +615,7 @@ func init() {
}
var out io.WriteCloser
if pipe[0] == '|' {
- out, _, err = env.Pipe(pipe[1:])
+ out, _, err = env.Pipe(p.Handler.IO().Stdout(), p.Handler.IO().Stderr(), pipe[1:])
} else {
out, err = os.OpenFile(pipe, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0o644)
}
@@ -489,12 +628,11 @@ func init() {
},
Include: {
Section: SectionInputOutput,
- Name: "i",
- Desc: Desc{"execute commands from file", "FILE"},
- Aliases: map[string]Desc{
- "ir": {`as \i, but relative to location of current script`, `FILE`},
- "include": {},
- "include_relative": {},
+ Descs: []Desc{
+ {"i", "FILE", "execute commands from file"},
+ {"ir", "FILE", "as \\i, but relative to location of current script"},
+ {"include", "", ""},
+ {"include_relative", "", ""},
},
Process: func(p *Params) error {
path, err := p.Get(true)
@@ -510,13 +648,12 @@ func init() {
},
Transact: {
Section: SectionTransaction,
- Name: "begin",
- Desc: Desc{"begin a transaction", ""},
- Aliases: map[string]Desc{
- "begin": {"begin a transaction with isolation level", "[-read-only] [ISOLATION]"},
- "commit": {"commit current transaction", ""},
- "rollback": {"rollback (abort) current transaction", ""},
- "abort": {},
+ Descs: []Desc{
+ {"begin", "", "begin a transaction"},
+ {"begin", "[-read-only] [ISOLATION]", "begin a transaction with isolation level"},
+ {"commit", "", "commit current transaction"},
+ {"rollback", "", "rollback (abort) current transaction"},
+ {"abort", "", ""},
},
Process: func(p *Params) error {
switch p.Name {
@@ -571,8 +708,9 @@ func init() {
},
Prompt: {
Section: SectionVariables,
- Name: "prompt",
- Desc: Desc{"prompt user to set variable", "[-TYPE] [PROMPT]"},
+ Descs: []Desc{
+ {"prompt", "[-TYPE] VAR [PROMPT]", "prompt user to set variable"},
+ },
Process: func(p *Params) error {
typ := "string"
ok, n, err := p.GetOptional(true)
@@ -605,39 +743,36 @@ func init() {
},
SetVar: {
Section: SectionVariables,
- Name: "set",
- Desc: Desc{"set internal variable, or list all if no parameters", "[NAME [VALUE]]"},
+ Descs: []Desc{
+ {"set", "[NAME [VALUE]]", "set internal variable, or list all if no parameters"},
+ },
Process: func(p *Params) error {
ok, n, err := p.GetOK(true)
- if err != nil {
+ switch {
+ case err != nil:
return err
- }
- if !ok {
- vals := env.All()
- out := p.Handler.IO().Stdout()
- n := make([]string, len(vals))
- var i int
- for k := range vals {
- n[i] = k
- i++
- }
- sort.Strings(n)
- for _, k := range n {
- fmt.Fprintln(out, k, "=", "'"+vals[k]+"'")
+ case ok:
+ vals, err := p.GetAll(true)
+ if err != nil {
+ return err
}
- return nil
+ return env.Set(n, strings.Join(vals, " "))
}
- vals, err := p.GetAll(true)
- if err != nil {
- return err
+ vals := env.All()
+ keys := maps.Keys(vals)
+ sort.Strings(keys)
+ out := p.Handler.IO().Stdout()
+ for _, k := range keys {
+ fmt.Fprintln(out, k, "=", "'"+vals[k]+"'")
}
- return env.Set(n, strings.Join(vals, ""))
+ return nil
},
},
Unset: {
Section: SectionVariables,
- Name: "unset",
- Desc: Desc{"unset (delete) internal variable", "NAME"},
+ Descs: []Desc{
+ {"unset", "NAME", "unset (delete) internal variable"},
+ },
Process: func(p *Params) error {
n, err := p.Get(true)
if err != nil {
@@ -646,18 +781,17 @@ func init() {
return env.Unset(n)
},
},
- SetFormatVar: {
+ SetPrintVar: {
Section: SectionFormatting,
- Name: "pset",
- Desc: Desc{"set table output option", "[NAME [VALUE]]"},
- Aliases: map[string]Desc{
- "a": {"toggle between unaligned and aligned output mode", ""},
- "C": {"set table title, or unset if none", "[STRING]"},
- "f": {"show or set field separator for unaligned query output", "[STRING]"},
- "H": {"toggle HTML output mode", ""},
- "T": {"set HTML tag attributes, or unset if none", "[STRING]"},
- "t": {"show only rows", "[on|off]"},
- "x": {"toggle expanded output", "[on|off|auto]"},
+ Descs: []Desc{
+ {"pset", "[NAME [VALUE]]", "set table output option"},
+ {"a", "", "toggle between unaligned and aligned output mode"},
+ {"C", "[STRING]", "set table title, or unset if none"},
+ {"f", "[STRING]", "show or set field separator for unaligned query output"},
+ {"H", "", "toggle HTML output mode"},
+ {"T", "[STRING]", "set HTML tag attributes, or unset if none"},
+ {"t", "[on|off]", "show only rows"},
+ {"x", "[on|off|auto]", "toggle expanded output"},
},
Process: func(p *Params) error {
var ok bool
@@ -736,19 +870,18 @@ func init() {
},
Describe: {
Section: SectionInformational,
- Name: "d[S+]",
- Desc: Desc{"list tables, views, and sequences or describe table, view, sequence, or index", "[NAME]"},
- Aliases: map[string]Desc{
- "da[S+]": {"list aggregates", "[PATTERN]"},
- "df[S+]": {"list functions", "[PATTERN]"},
- "dm[S+]": {"list materialized views", "[PATTERN]"},
- "dv[S+]": {"list views", "[PATTERN]"},
- "ds[S+]": {"list sequences", "[PATTERN]"},
- "dn[S+]": {"list schemas", "[PATTERN]"},
- "dt[S+]": {"list tables", "[PATTERN]"},
- "di[S+]": {"list indexes", "[PATTERN]"},
- "dp[S]": {"list table, view, and sequence access privileges", "[PATTERN]"},
- "l[+]": {"list databases", ""},
+ Descs: []Desc{
+ {"d[S+]", "[NAME]", "list tables, views, and sequences or describe table, view, sequence, or index"},
+ {"da[S+]", "[PATTERN]", "list aggregates"},
+ {"df[S+]", "[PATTERN]", "list functions"},
+ {"di[S+]", "[PATTERN]", "list indexes"},
+ {"dm[S+]", "[PATTERN]", "list materialized views"},
+ {"dn[S+]", "[PATTERN]", "list schemas"},
+ {"dp[S]", "[PATTERN]", "list table, view, and sequence access privileges"},
+ {"ds[S+]", "[PATTERN]", "list sequences"},
+ {"dt[S+]", "[PATTERN]", "list tables"},
+ {"dv[S+]", "[PATTERN]", "list views"},
+ {"l[+]", "", "list databases"},
},
Process: func(p *Params) error {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
@@ -788,8 +921,9 @@ func init() {
},
Stats: {
Section: SectionInformational,
- Name: "ss[+]",
- Desc: Desc{"show stats for a table or a query", "[TABLE|QUERY] [k]"},
+ Descs: []Desc{
+ {"ss[+]", "[TABLE|QUERY] [k]", "show stats for a table or a query"},
+ },
Process: func(p *Params) error {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
@@ -826,10 +960,9 @@ func init() {
},
Copy: {
Section: SectionInputOutput,
- Name: "copy",
- Desc: Desc{"copy query from source url to table on destination url", "SRC DST QUERY TABLE"},
- Aliases: map[string]Desc{
- "copy": {"copy query from source url to columns of table on destination url", "SRC DST QUERY TABLE(A,...)"},
+ Descs: []Desc{
+ {"copy", "SRC DST QUERY TABLE", "copy query from source url to table on destination url"},
+ {"copy", "SRC DST QUERY TABLE(A,...)", "copy query from source url to columns of table on destination url"},
},
Process: func(p *Params) error {
ctx := context.Background()
@@ -893,7 +1026,7 @@ func init() {
if mc == None {
continue
}
- name := c.Name
+ name := c.Descs[0].Name
if pos := strings.IndexRune(name, '['); pos != -1 {
mods := strings.TrimRight(name[pos+1:], "]")
name = name[:pos]
@@ -905,19 +1038,23 @@ func init() {
}
}
cmdMap[name] = mc
- for alias := range c.Aliases {
- if pos := strings.IndexRune(alias, '['); pos != -1 {
- mods := strings.TrimRight(alias[pos+1:], "]")
- alias = alias[:pos]
- cmdMap[alias+mods] = mc
+ for _, d := range c.Descs {
+ if pos := strings.IndexRune(d.Name, '['); pos != -1 {
+ mods := strings.TrimRight(d.Name[pos+1:], "]")
+ d.Name = d.Name[:pos]
+ cmdMap[d.Name+mods] = mc
if len(mods) > 1 {
for _, r := range mods {
- cmdMap[alias+string(r)] = mc
+ cmdMap[d.Name+string(r)] = mc
}
}
}
- cmdMap[alias] = mc
+ cmdMap[d.Name] = mc
}
sectMap[c.Section] = append(sectMap[c.Section], mc)
}
}
+
+// Usage is used by the [Question] command to display command line options.
+var Usage = func(io.Writer, bool) {
+}
diff --git a/metacmd/metacmd.go b/metacmd/metacmd.go
index 397f3fc8a43..0960260fd3f 100644
--- a/metacmd/metacmd.go
+++ b/metacmd/metacmd.go
@@ -1,4 +1,4 @@
-// Package metacmd contains meta information and implentation for usql's
+// Package metacmd contains meta information and implementation for usql's
// backslash (\) commands.
package metacmd
@@ -40,6 +40,8 @@ const (
Copyright
// Connect is the connect meta command (\c, \connect).
Connect
+ // SetConnVar is the set conn var command (\cset).
+ SetConnVar
// Copy is the copy meta command (\copy).
Copy
// Disconnect is the disconnect meta command (\Z).
@@ -54,6 +56,8 @@ const (
Describe
// Exec is the execute meta command (\g and variants).
Exec
+ // Bind is the bind meta command (\bind).
+ Bind
// Edit is the edit query buffer meta command (\e).
Edit
// Print is the print query buffer meta command (\p, \print, \raw).
@@ -66,6 +70,8 @@ const (
Write
// ChangeDir is the system change directory meta command (\cd).
ChangeDir
+ // GetEnv is the system get environment variable meta command (\getenv).
+ GetEnv
// SetEnv is the system set environment variable meta command (\setenv).
SetEnv
// Shell is the system shell exec meta command (\!).
@@ -82,8 +88,8 @@ const (
SetVar
// Unset is the variable unset meta command (\unset).
Unset
- // SetFormatVar is the set format variable meta commands (\pset, \a, \C, \f, \H, \t, \T, \x).
- SetFormatVar
+ // SetPrintVar is the set print variable meta commands (\pset, \a, \C, \f, \H, \t, \T, \x).
+ SetPrintVar
// Timing is the timing meta command (\timing).
Timing
// Stats is the show stats meta command (\ss and variants).
diff --git a/metacmd/section.go b/metacmd/section.go
index 6c9d743ea54..0fbd7ca6d8f 100644
--- a/metacmd/section.go
+++ b/metacmd/section.go
@@ -3,14 +3,14 @@ package metacmd
import (
"fmt"
"io"
- "sort"
"strings"
)
// Desc holds information about a command or alias description.
type Desc struct {
- Desc string
+ Name string
Params string
+ Desc string
}
// Section is a meta command section.
@@ -39,10 +39,17 @@ func (s Section) String() string {
// SectionOrder is the order of sections to display via Listing.
var SectionOrder = []Section{
- SectionGeneral, SectionQueryExecute, SectionQueryBuffer, SectionHelp,
- SectionInputOutput, SectionInformational, SectionFormatting,
+ SectionGeneral,
+ SectionQueryExecute,
+ SectionQueryBuffer,
+ SectionHelp,
+ SectionInputOutput,
+ SectionInformational,
+ SectionFormatting,
SectionTransaction,
- SectionConnection, SectionOperatingSystem, SectionVariables,
+ SectionConnection,
+ SectionOperatingSystem,
+ SectionVariables,
}
// Listing writes the formatted command listing to w, separated into different
@@ -54,32 +61,24 @@ func Listing(w io.Writer) {
var descs [][]string
for _, c := range sectMap[section] {
cmd := cmds[c]
- s, opts := optText(cmd.Desc)
- descs, plen = add(descs, ` \`+cmd.Name+opts, s, plen)
- // sort aliases
- var aliases []string
- for alias, desc := range cmd.Aliases {
- if desc.Desc == "" && desc.Params == "" {
+ for i, d := range cmd.Descs {
+ if d.Desc == "" && d.Params == "" {
continue
}
- aliases = append(aliases, alias)
- }
- sort.Slice(aliases, func(i, j int) bool {
- return strings.ToLower(aliases[i]) < strings.ToLower(aliases[j])
- })
- for _, alias := range aliases {
- s, opts := optText(cmd.Aliases[alias])
- descs, plen = add(descs, ` \`+strings.TrimSpace(alias)+opts, s, plen)
+ s, opts := optText(cmd.Descs[i])
+ descs, plen = add(descs, ` \`+strings.TrimSpace(d.Name)+opts, s, plen)
}
}
sectionDescs[section] = descs
}
- for _, section := range SectionOrder {
+ for i, section := range SectionOrder {
+ if i != 0 {
+ fmt.Fprintln(w)
+ }
fmt.Fprintln(w, section)
for _, line := range sectionDescs[section] {
fmt.Fprintln(w, rpad(line[0], plen), "", line[1])
}
- fmt.Fprintln(w)
}
}
diff --git a/metacmd/types.go b/metacmd/types.go
index 8c7597cf4a0..2b7d3b1ab79 100644
--- a/metacmd/types.go
+++ b/metacmd/types.go
@@ -35,6 +35,8 @@ type Handler interface {
Buf() *stmt.Stmt
// Reset resets the last and current query buffer.
Reset([]rune)
+ // Bind binds query parameters.
+ Bind([]interface{})
// Open opens a database connection.
Open(context.Context, ...string) error
// Close closes the current database connection.
@@ -97,6 +99,8 @@ const (
ExecExec
// ExecCrosstab indicates execution using crosstabview (\crosstabview).
ExecCrosstab
+ // ExecChart indicates execution using chart (\chart).
+ ExecChart
// ExecWatch indicates repeated execution with a fixed time interval.
ExecWatch
)
diff --git a/rline/rline.go b/rline/rline.go
index 0bb155d3602..334df4c8fd0 100644
--- a/rline/rline.go
+++ b/rline/rline.go
@@ -7,7 +7,6 @@ import (
"os"
"github.com/gohxs/readline"
- isatty "github.com/mattn/go-isatty"
)
var (
@@ -130,10 +129,7 @@ func (l *Rline) SetOutput(f func(string) string) {
}
// New creates a new readline input/output handler.
-func New(forceNonInteractive bool, out, histfile string) (IO, error) {
- // determine if interactive
- interactive := isatty.IsTerminal(os.Stdout.Fd()) && isatty.IsTerminal(os.Stdin.Fd())
- cygwin := isatty.IsCygwinTerminal(os.Stdout.Fd()) && isatty.IsCygwinTerminal(os.Stdin.Fd())
+func New(interactive, cygwin, forceNonInteractive bool, out, histfile string) (IO, error) {
var closers []func() error
// configure stdin
var stdin io.ReadCloser
diff --git a/run.go b/run.go
new file mode 100644
index 00000000000..a6a8472b029
--- /dev/null
+++ b/run.go
@@ -0,0 +1,560 @@
+package main
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "io"
+ "os"
+ "os/user"
+ "path/filepath"
+ "strings"
+
+ "github.com/go-git/go-billy/v5"
+ "github.com/go-git/go-billy/v5/memfs"
+ "github.com/go-git/go-billy/v5/osfs"
+ "github.com/mattn/go-isatty"
+ "github.com/spf13/cobra"
+ "github.com/spf13/pflag"
+ "github.com/spf13/viper"
+ "github.com/xo/dburl"
+ "github.com/xo/usql/env"
+ "github.com/xo/usql/handler"
+ "github.com/xo/usql/metacmd"
+ "github.com/xo/usql/rline"
+ "github.com/xo/usql/text"
+)
+
+// ContextExecutor is the command context.
+type ContextExecutor interface {
+ ExecuteContext(context.Context) error
+}
+
+// New builds the command context.
+func New(cliargs []string) ContextExecutor {
+ args := &Args{}
+ var (
+ bashCompletion bool
+ zshCompletion bool
+ fishCompletion bool
+ powershellCompletion bool
+ noDescriptions bool
+ badHelp bool
+ )
+ v := viper.New()
+ c := &cobra.Command{
+ Use: text.CommandName + " [flags]... [DSN]",
+ Short: text.Short(),
+ Version: text.CommandVersion,
+ SilenceErrors: true,
+ SilenceUsage: true,
+ DisableAutoGenTag: true,
+ DisableSuggestions: true,
+ Args: func(_ *cobra.Command, cliargs []string) error {
+ if len(cliargs) > 1 {
+ return text.ErrWrongNumberOfArguments
+ }
+ return nil
+ },
+ PersistentPreRunE: func(cmd *cobra.Command, _ []string) error {
+ commandUpper := text.CommandUpper()
+ configFile := strings.TrimSpace(os.Getenv(commandUpper + "_CONFIG"))
+ cmd.Flags().VisitAll(func(f *pflag.Flag) {
+ if s := strings.TrimSpace(f.Value.String()); f.Name == "config" && s != "" {
+ configFile = s
+ }
+ })
+ if configFile != "" {
+ v.SetConfigFile(configFile)
+ } else {
+ v.SetConfigName(text.ConfigName)
+ if configDir, err := os.UserConfigDir(); err == nil {
+ v.AddConfigPath(filepath.Join(configDir, text.CommandName))
+ }
+ }
+ if err := v.ReadInConfig(); err != nil {
+ if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
+ return err
+ }
+ }
+ v.SetEnvPrefix(commandUpper)
+ v.AutomaticEnv()
+ cmd.Flags().VisitAll(func(f *pflag.Flag) {
+ if f.Name == "config" {
+ return
+ }
+ _ = v.BindEnv(f.Name, commandUpper+"_"+strings.ToUpper(strings.ReplaceAll(f.Name, "-", "_")))
+ if !f.Changed && v.IsSet(f.Name) {
+ _ = cmd.Flags().Set(f.Name, fmt.Sprintf("%v", v.Get(f.Name)))
+ }
+ })
+ // unhide params
+ switch {
+ case bashCompletion,
+ zshCompletion,
+ fishCompletion,
+ powershellCompletion,
+ cmd.Name() == "__complete":
+ flags := cmd.Root().Flags()
+ for _, name := range []string{"no-psqlrc", "no-usqlrc", "var", "variable"} {
+ flags.Lookup(name).Hidden = false
+ }
+ }
+ return nil
+ },
+ RunE: func(cmd *cobra.Command, cliargs []string) error {
+ // completions and short circuits
+ switch {
+ case bashCompletion:
+ return cmd.GenBashCompletionV2(os.Stdout, !noDescriptions)
+ case zshCompletion:
+ if noDescriptions {
+ return cmd.GenZshCompletionNoDesc(os.Stdout)
+ }
+ return cmd.GenZshCompletion(os.Stdout)
+ case fishCompletion:
+ return cmd.GenFishCompletion(os.Stdout, !noDescriptions)
+ case powershellCompletion:
+ if noDescriptions {
+ return cmd.GenPowerShellCompletion(os.Stdout)
+ }
+ return cmd.GenPowerShellCompletionWithDesc(os.Stdout)
+ case badHelp:
+ return errors.New("unknown shorthand flag: 'h' in -h")
+ }
+ // run
+ if len(cliargs) > 0 {
+ args.DSN = cliargs[0]
+ }
+ // create charts chroot
+ var err error
+ if args.Charts, err = chartsFS(v); err != nil {
+ return err
+ }
+ // fmt.Fprintf(os.Stderr, "\n\n%v\n\n", args.Charts)
+ args.Connections = v.GetStringMap("connections")
+ args.Init = v.GetString("init")
+ return Run(cmd.Context(), args)
+ },
+ }
+
+ c.SetVersionTemplate("{{ .Name }} {{ .Version }}\n")
+ c.SetArgs(cliargs[1:])
+ c.SetUsageTemplate(text.UsageTemplate)
+
+ flags := c.Flags()
+ flags.SortFlags = false
+
+ // completions / short circuits
+ flags.BoolVar(&bashCompletion, "completion-script-bash", false, "output bash completion script and exit")
+ flags.BoolVar(&zshCompletion, "completion-script-zsh", false, "output zsh completion script and exit")
+ flags.BoolVar(&fishCompletion, "completion-script-fish", false, "output fish completion script and exit")
+ flags.BoolVar(&powershellCompletion, "completion-script-powershell", false, "output powershell completion script and exit")
+ flags.BoolVar(&noDescriptions, "no-descriptions", false, "disable descriptions in completion scripts")
+ flags.BoolVarP(&badHelp, "bad-help", "h", false, "bad help")
+
+ // command / file flags
+ flags.VarP(commandOrFile{args, true}, "command", "c", "run only single command (SQL or internal) and exit")
+ flags.VarP(commandOrFile{args, false}, "file", "f", "execute commands from file and exit")
+
+ // general flags
+ flags.BoolVarP(&args.NoPassword, "no-password", "w", false, "never prompt for password")
+ flags.BoolVarP(&args.NoInit, "no-init", "X", false, "do not execute initialization scripts (aliases: --no-rc --no-psqlrc --no-usqlrc)")
+ flags.BoolVar(&args.NoInit, "no-rc", false, "do not read startup file")
+ flags.BoolVar(&args.NoInit, "no-psqlrc", false, "do not read startup file")
+ flags.BoolVar(&args.NoInit, "no-usqlrc", false, "do not read startup file")
+ flags.VarP(filevar{&args.Out}, "out", "o", "output file")
+ flags.BoolVarP(&args.ForcePassword, "password", "W", false, "force password prompt (should happen automatically)")
+ flags.BoolVarP(&args.SingleTransaction, "single-transaction", "1", false, "execute as a single transaction (if non-interactive)")
+
+ ss := func(v *[]string, name, short, usage, placeholder string, vals ...string) {
+ f := flags.VarPF(vs{v, vals, placeholder}, name, short, usage)
+ if placeholder == "" {
+ f.DefValue, f.NoOptDefVal = "true", "true"
+ }
+ }
+ // set
+ ss(&args.Vars, "set", "v", `set variable NAME to VALUE (see \set command, aliases: --var --variable)`, "NAME=VALUE")
+ ss(&args.Vars, "var", "", "set variable NAME to VALUE", "NAME=VALUE")
+ ss(&args.Vars, "variable", "", "set variable NAME to VALUE", "NAME=VALUE")
+ // cset
+ ss(&args.Cvars, "cset", "N", `set named connection NAME to DSN (see \cset command)`, "NAME=DSN")
+ // pset
+ ss(&args.Pvars, "pset", "P", `set printing option VAR to ARG (see \pset command)`, "VAR=ARG")
+ // pset flags
+ ss(&args.Pvars, "field-separator", "F", `field separator for unaligned and CSV output (default "|" and ",")`, "FIELD-SEPARATOR", "fieldsep=%q", "csv_fieldsep=%q")
+ ss(&args.Pvars, "record-separator", "R", `record separator for unaligned and CSV output (default \n)`, "RECORD-SEPARATOR", "recordsep=%q")
+ ss(&args.Pvars, "table-attr", "T", "set HTML table tag attributes (e.g., width, border)", "TABLE-ATTR", "tableattr=%q")
+ // pset bools
+ ss(&args.Pvars, "no-align", "A", "unaligned table output mode", "", "format=unaligned")
+ ss(&args.Pvars, "html", "H", "HTML table output mode", "", "format=html")
+ ss(&args.Pvars, "tuples-only", "t", "print rows only", "", "tuples_only=on")
+ ss(&args.Pvars, "expanded", "x", "turn on expanded table output", "", "expanded=on")
+ ss(&args.Pvars, "field-separator-zero", "z", "set field separator for unaligned and CSV output to zero byte", "", "fieldsep_zero=on")
+ ss(&args.Pvars, "record-separator-zero", "0", "set record separator for unaligned and CSV output to zero byte", "", "recordsep_zero=on")
+ ss(&args.Pvars, "json", "J", "JSON output mode", "", "format=json")
+ ss(&args.Pvars, "csv", "C", "CSV output mode", "", "format=csv")
+ ss(&args.Pvars, "vertical", "G", "vertical output mode", "", "format=vertical")
+ // set bools
+ ss(&args.Vars, "quiet", "q", "run quietly (no messages, only query output)", "", "QUIET=on")
+
+ // app config
+ _ = flags.StringP("config", "", "", "config file")
+
+ // manually set --version, see github.com/spf13/cobra/command.go
+ _ = flags.BoolP("version", "V", false, "output version information, then exit")
+ _ = flags.SetAnnotation("version", cobra.FlagSetByCobraAnnotation, []string{"true"})
+
+ // manually set --help, see github.com/spf13/cobra/command.go
+ _ = flags.BoolP("help", "?", false, "show this help, then exit")
+ _ = c.Flags().SetAnnotation("help", cobra.FlagSetByCobraAnnotation, []string{"true"})
+
+ // mark hidden
+ for _, name := range []string{
+ "no-rc", "no-psqlrc", "no-usqlrc", "var", "variable",
+ "completion-script-bash", "completion-script-zsh", "completion-script-fish",
+ "completion-script-powershell", "no-descriptions",
+ "bad-help",
+ } {
+ flags.Lookup(name).Hidden = true
+ }
+
+ // expose to metacmd
+ metacmd.Usage = func(w io.Writer, banner bool) {
+ s := c.UsageString()
+ if banner {
+ s = text.Short() + "\n\n" + s
+ }
+ _, _ = w.Write([]byte(s))
+ }
+ return c
+}
+
+// Run runs the application.
+func Run(ctx context.Context, args *Args) error {
+ // get user
+ u, err := user.Current()
+ if err != nil {
+ return err
+ }
+ // get working directory
+ wd, err := os.Getwd()
+ if err != nil {
+ return err
+ }
+
+ // determine if interactive
+ interactive := isatty.IsTerminal(os.Stdout.Fd()) && isatty.IsTerminal(os.Stdin.Fd())
+ cygwin := isatty.IsCygwinTerminal(os.Stdout.Fd()) && isatty.IsCygwinTerminal(os.Stdin.Fd())
+ forceNonInteractive := len(args.CommandOrFiles) != 0
+
+ // enable term graphics
+ if !forceNonInteractive && interactive && !cygwin {
+ // NOTE: this is done here and not in the env.init() package, because
+ // NOTE: we need to determine if it is interactive first, otherwise it
+ // NOTE: could mess up the non-interactive output with control characters
+ var typ string
+ if s, _ := env.Getenv(text.CommandUpper()+"_TERM_GRAPHICS", "TERM_GRAPHICS"); s != "" {
+ typ = s
+ }
+ if err := env.Set("TERM_GRAPHICS", typ); err != nil {
+ return err
+ }
+ }
+
+ // configured named connections
+ for name, v := range args.Connections {
+ if err := setConn(name, v); err != nil && !forceNonInteractive && interactive {
+ fmt.Fprintln(os.Stderr, fmt.Sprintf(text.InvalidNamedConnection, name, err))
+ }
+ }
+
+ // fmt.Fprintf(os.Stdout, "VARS: %v\nCVARS: %v\nPVARS: %v\n", args.Vars, args.Cvars, args.Pvars)
+
+ // set vars
+ for _, v := range args.Vars {
+ if i := strings.Index(v, "="); i != -1 {
+ _ = env.Set(v[:i], v[i+1:])
+ } else {
+ _ = env.Unset(v)
+ }
+ }
+ // set cvars
+ for _, v := range args.Cvars {
+ if i := strings.Index(v, "="); i != -1 {
+ s := v[i+1:]
+ if c := s[0]; c == '\'' || c == '"' {
+ if s, err = env.Dequote(s, c); err != nil {
+ return err
+ }
+ }
+ if err = env.Cset(v[:i], s); err != nil {
+ return err
+ }
+ } else {
+ if err = env.Cset(v, ""); err != nil {
+ return err
+ }
+ }
+ }
+ // set pvars
+ for _, v := range args.Pvars {
+ if i := strings.Index(v, "="); i != -1 {
+ s := v[i+1:]
+ if c := s[0]; c == '\'' || c == '"' {
+ if s, err = env.Dequote(s, c); err != nil {
+ return err
+ }
+ }
+ if _, err = env.Pset(v[:i], s); err != nil {
+ return err
+ }
+ } else {
+ if _, err = env.Ptoggle(v, ""); err != nil {
+ return err
+ }
+ }
+ }
+ // create input/output
+ l, err := rline.New(interactive, cygwin, forceNonInteractive, args.Out, env.HistoryFile(u))
+ if err != nil {
+ return err
+ }
+ defer l.Close()
+ // create handler
+ h := handler.New(l, u, wd, args.Charts, args.NoPassword)
+ // force password
+ dsn := args.DSN
+ if args.ForcePassword {
+ if dsn, err = h.Password(dsn); err != nil {
+ return err
+ }
+ }
+ // open dsn
+ if err = h.Open(ctx, dsn); err != nil {
+ return err
+ }
+ // start transaction
+ if args.SingleTransaction {
+ if h.IO().Interactive() {
+ return text.ErrSingleTransactionCannotBeUsedWithInteractiveMode
+ }
+ if err = h.BeginTx(ctx, nil); err != nil {
+ return err
+ }
+ }
+ // init script
+ if !args.NoInit {
+ // rc file
+ if rc := env.RCFile(u); rc != "" {
+ if err = h.Include(rc, false); err != nil && err != text.ErrNoSuchFileOrDirectory {
+ return err
+ }
+ }
+ if s := strings.TrimSpace(args.Init); s != "" {
+ h.Reset([]rune(s + "\n"))
+ }
+ }
+ // setup runner
+ f := h.Run
+ if len(args.CommandOrFiles) != 0 {
+ f = runCommandOrFiles(h, args.CommandOrFiles)
+ }
+ // run
+ if err = f(); err != nil {
+ return err
+ }
+ // commit
+ if args.SingleTransaction {
+ return h.Commit()
+ }
+ return nil
+}
+
+// Args are the command line arguments.
+type Args struct {
+ DSN string
+ CommandOrFiles []CommandOrFile
+ Out string
+ ForcePassword bool
+ NoPassword bool
+ NoInit bool
+ SingleTransaction bool
+ Vars []string
+ Cvars []string
+ Pvars []string
+ Charts billy.Filesystem
+ Connections map[string]interface{}
+ Init string
+}
+
+// CommandOrFile is a special type to deal with interspersed -c, -f,
+// command-line options, to ensure proper order execution.
+type CommandOrFile struct {
+ Command bool
+ Value string
+}
+
+// commandOrFile provides a [pflag.Value] to wrap the command or file value in
+// [Args].
+type commandOrFile struct {
+ args *Args
+ command bool
+}
+
+// Set satisfies the [pflag.Value] interface.
+func (c commandOrFile) Set(value string) error {
+ c.args.CommandOrFiles = append(c.args.CommandOrFiles, CommandOrFile{
+ Command: c.command,
+ Value: value,
+ })
+ return nil
+}
+
+// String satisfies the [pflag.Value] interface.
+func (c commandOrFile) String() string {
+ return ""
+}
+
+// Type satisfies the [pflag.Value] interface.
+func (c commandOrFile) Type() string {
+ if c.command {
+ return "COMMAND"
+ }
+ return "FILE"
+}
+
+// vs handles setting vars with predefined values.
+type vs struct {
+ vars *[]string
+ vals []string
+ typ string
+}
+
+// Set satisfies the [pflag.Value] interface.
+func (p vs) Set(value string) error {
+ if len(p.vals) != 0 {
+ for _, v := range p.vals {
+ if strings.Contains(v, "%") {
+ *p.vars = append(*p.vars, fmt.Sprintf(v, value))
+ } else {
+ *p.vars = append(*p.vars, v)
+ }
+ }
+ } else {
+ *p.vars = append(*p.vars, value)
+ }
+ return nil
+}
+
+// String satisfies the [pflag.Value] interface.
+func (vs) String() string {
+ return ""
+}
+
+// Type satisfies the [pflag.Value] interface.
+func (p vs) Type() string {
+ if p.typ == "" {
+ return "bool"
+ }
+ return p.typ
+}
+
+// filevar is a file var.
+type filevar struct {
+ v *string
+}
+
+// Set satisfies the [pflag.Value] interface.
+func (p filevar) Set(value string) error {
+ *p.v = value
+ return nil
+}
+
+// String satisfies the [pflag.Value] interface.
+func (filevar) String() string {
+ return ""
+}
+
+// Type satisfies the [pflag.Value] interface.
+func (filevar) Type() string {
+ return "FILE"
+}
+
+// chartsFS creates a filesystem for charts.
+func chartsFS(v *viper.Viper) (billy.Filesystem, error) {
+ var configDir string
+ if s := v.ConfigFileUsed(); s != "" {
+ configDir = filepath.Dir(s)
+ } else {
+ var err error
+ if configDir, err = os.UserConfigDir(); err != nil {
+ return nil, err
+ }
+ configDir = filepath.Join(configDir, text.CommandName)
+ }
+ chartsPath := "charts"
+ if s := v.GetString("charts_path"); s != "" {
+ chartsPath = s
+ }
+ fs := osfs.New(configDir, osfs.WithBoundOS())
+ switch fi, err := fs.Stat(chartsPath); {
+ case err != nil && os.IsNotExist(err) && chartsPath == "charts":
+ return memfs.New(), nil
+ case err != nil && os.IsNotExist(err):
+ fmt.Fprintln(os.Stderr, fmt.Sprintf(text.ChartsPathDoesNotExist, chartsPath))
+ return memfs.New(), nil
+ case err != nil:
+ return nil, err
+ case !fi.IsDir():
+ fmt.Fprintln(os.Stderr, fmt.Sprintf(text.ChartsPathIsNotADirectory, chartsPath))
+ return memfs.New(), nil
+ }
+ return fs.Chroot(chartsPath)
+}
+
+// setConn sets a named connection.
+func setConn(name string, v interface{}) error {
+ switch x := v.(type) {
+ case string:
+ return env.Cset(name, x)
+ case []interface{}:
+ return env.Cset(name, convSlice(x)...)
+ case map[string]interface{}:
+ urlstr, err := dburl.BuildURL(x)
+ if err != nil {
+ return err
+ }
+ return env.Cset(name, urlstr)
+ }
+ return text.ErrInvalidConfig
+}
+
+// runCommandOrFiles processes all the supplied commands or files.
+func runCommandOrFiles(h *handler.Handler, commandsOrFiles []CommandOrFile) func() error {
+ return func() error {
+ for _, c := range commandsOrFiles {
+ h.SetSingleLineMode(c.Command)
+ if c.Command {
+ h.Reset([]rune(c.Value))
+ if err := h.Run(); err != nil {
+ return err
+ }
+ } else {
+ if err := h.Include(c.Value, false); err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+ }
+}
+
+// convSlice converts a generic slice to a string slice.
+func convSlice(v []interface{}) []string {
+ s := make([]string, len(v))
+ for i, x := range v {
+ s[i] = fmt.Sprintf("%s", x)
+ }
+ return s
+}
diff --git a/stmt/stmt.go b/stmt/stmt.go
index bee209ebb99..87006644de2 100644
--- a/stmt/stmt.go
+++ b/stmt/stmt.go
@@ -220,7 +220,7 @@ parse:
case c == '\'' || c == '"':
b.quote = c
// start of dollar quoted string literal (postgres)
- case b.allowDollar && c == '$':
+ case b.allowDollar && c == '$' && (next == '$' || next == '_' || unicode.IsLetter(next)):
var id string
id, i, ok = readDollarAndTag(b.r, i, b.rlen)
if ok {
diff --git a/stmt/stmt_test.go b/stmt/stmt_test.go
index 731c8a5fa89..8ab9c1adfd6 100644
--- a/stmt/stmt_test.go
+++ b/stmt/stmt_test.go
@@ -184,6 +184,10 @@ func TestNextResetState(t *testing.T) {
{`select 1\g '\g `, []string{`select 1`}, []string{`\g| '\g `}, "=", nil},
{`select 1\g "\g `, []string{`select 1`}, []string{`\g| "\g `}, "=", nil},
{"select 1\\g `\\g ", []string{`select 1`}, []string{"\\g| `\\g "}, "=", nil},
+ {"select $$\\g$$\\g", []string{`select $$\g$$`}, []string{`\g|`}, "=", nil},
+ {"select $1\\bind a b c\\g", []string{`select $1`}, []string{`\bind| a b c`, `\g|`}, "=", nil},
+ {"select $1 \\bind a b c \\g", []string{`select $1 `}, []string{`\bind| a b c `, `\g|`}, "=", nil},
+ {"select $2, $a$ foo $a$, $1 \\bind a b \\g", []string{`select $2, $a$ foo $a$, $1 `}, []string{`\bind| a b `, `\g|`}, "=", nil},
}
for i, test := range tests {
b := New(sp(test.s, "\n"), WithAllowDollar(true), WithAllowMultilineComments(true), WithAllowCComments(true))
diff --git a/testcli.go b/testcli.go
index 9ac0721eeb6..6900afa24d5 100644
--- a/testcli.go
+++ b/testcli.go
@@ -70,43 +70,43 @@ func cliTests() ([]Test, error) {
{
"complex/postgres",
"./contrib/postgres/test.sql",
- []string{"pgsql://postgres:P4ssw0rd@localhost", "--pset=pager=off"},
+ []string{"pgsql://postgres:P4ssw0rd@localhost", "--set=PAGER=''", "--pset=pager=off"},
env,
},
{
"complex/mysql",
"./contrib/mysql/test.sql",
- []string{"my://root:P4ssw0rd@localhost", "--pset=pager=off"},
+ []string{"my://root:P4ssw0rd@localhost", "--set=PAGER=''", "--pset=pager=off"},
env,
},
{
"complex/sqlite3",
"./contrib/sqlite3/test.sql",
- []string{"sqlite:./testdata/sqlite3_test.db", "--pset=pager=off"},
+ []string{"sqlite:./testdata/sqlite3_test.db", "--set=PAGER=''", "--pset=pager=off"},
env,
},
{
"complex/moderncsqlite",
"./contrib/sqlite3/test.sql",
- []string{"mq:./testdata/moderncsqlite_test.db", "--pset=pager=off"},
+ []string{"mq:./testdata/moderncsqlite_test.db", "--set=PAGER=''", "--pset=pager=off"},
env,
},
{
"complex/sqlserver",
"./contrib/sqlserver/test.sql",
- []string{"sqlserver://sa:Adm1nP@ssw0rd@localhost/", "--pset=pager=off"},
+ []string{"sqlserver://sa:Adm1nP@ssw0rd@localhost/", "--set=PAGER=''", "--pset=pager=off"},
env,
},
{
"complex/cassandra",
"./contrib/cassandra/test.sql",
- []string{"ca://cassandra:cassandra@localhost", "--pset=pager=off"},
+ []string{"ca://cassandra:cassandra@localhost", "--set=PAGER=''", "--pset=pager=off"},
env,
},
{
"copy/a_bit_of_everything",
"./testdata/copy.sql",
- []string{"--pset=pager=off"},
+ []string{"--set=PAGER=''", "--pset=pager=off"},
env,
},
}, nil
@@ -139,7 +139,6 @@ func (test Test) do(ctx context.Context, binpath string, timeout time.Duration)
defer exp.Close()
return err
}
- return exp.Close()
}
type noopWriteCloser struct {
diff --git a/testdata/numbers.sql b/testdata/numbers.sql
new file mode 100644
index 00000000000..23a679df285
--- /dev/null
+++ b/testdata/numbers.sql
@@ -0,0 +1,4 @@
+select '1251258098.1555901285'::numeric;
+select '1251258098.1555901285'::float4;
+select '1251258098.1555901285'::float8;
+select '1251258098.1555901285'::double precision;
diff --git a/text/errors.go b/text/errors.go
index 519b0203e41..832917064c5 100644
--- a/text/errors.go
+++ b/text/errors.go
@@ -55,6 +55,12 @@ var (
ErrInvalidFormatLineStyle = errors.New(`\pset: allowed line styles are ascii, old-ascii, unicode`)
// ErrInvalidFormatBorderLineStyle is the invalid format border line style error.
ErrInvalidFormatBorderLineStyle = errors.New(`\pset: allowed Unicode border line styles are single, double`)
+ // ErrInvalidTimezoneLocation is the invalid timezone location error.
+ ErrInvalidTimezoneLocation = errors.New(`\pset: invalid timezone location`)
+ // ErrGraphicsNotSupported is the graphics not supported error.
+ ErrGraphicsNotSupported = errors.New(`\chart: graphics not supported in terminal`)
+ // ErrNoNumericColumns is the no numeric columns error.
+ ErrNoNumericColumns = errors.New(`\chart: no numeric columns found`)
// ErrInvalidQuotedString is the invalid quoted string error.
ErrInvalidQuotedString = errors.New(`invalid quoted string`)
// ErrInvalidFormatOption is the invalid format option error.
@@ -71,4 +77,8 @@ var (
ErrWrongNumberOfArguments = errors.New("wrong number of arguments")
// ErrUnknownFileType is the unknown file type error.
ErrUnknownFileType = errors.New("unknown file type")
+ // ErrNamedConnectionIsNotAURL is the named connection is not a url error.
+ ErrNamedConnectionIsNotAURL = errors.New("named connection is not a url")
+ // ErrInvalidConfig is the invalid config error.
+ ErrInvalidConfig = errors.New("invalid config")
)
diff --git a/text/license.go b/text/license.go
index b412d3bed3b..b0c6c2ba704 100644
--- a/text/license.go
+++ b/text/license.go
@@ -5,7 +5,7 @@ package text
// License contains the license text for usql.
const License = `The MIT License (MIT)
-Copyright (c) 2016-2023 Kenneth Shaw
+Copyright (c) 2016-2024 Kenneth Shaw
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/text/logo.png b/text/logo.png
new file mode 100644
index 00000000000..b9c9fb22dd9
Binary files /dev/null and b/text/logo.png differ
diff --git a/text/text.go b/text/text.go
index c60eae3eaf3..59154f25b84 100644
--- a/text/text.go
+++ b/text/text.go
@@ -3,6 +3,10 @@
package text
import (
+ "bytes"
+ _ "embed"
+ "image"
+ "image/png"
"regexp"
"strings"
)
@@ -12,7 +16,9 @@ var (
CommandName = `usql`
CommandVersion = `0.0.0-dev`
PassfileName = CommandName + `pass`
+ ConfigName = "config"
Banner = `the universal command-line interface for SQL databases`
+ CommandHelpHint = `hint: try "` + CommandName + ` --help" for more information.`
NotConnected = `(not connected)`
HelpPrefix = `help`
QuitPrefix = `quit`
@@ -34,6 +40,7 @@ var (
ConfirmPassword = `Confirm password: `
PasswordChangeFailed = `\password for %q failed: %v`
CouldNotSetVariable = `could not set variable %q`
+ ChartParseFailed = `\chart: invalid argument for %q: %v`
// PasswordChangeSucceeded = `\password succeeded for %q`
HelpDesc string
HelpDescShort = `Use \? for help or press control-C to clear the input buffer.`
@@ -79,15 +86,40 @@ var (
`tableattr`: `Table attributes unset.`,
`title`: `Title is unset.`,
}
- TimingSet = `Timing is %s.`
- TimingDesc = `Time: %0.3f ms`
- InvalidValue = `invalid -%s value %q: %s`
- NotSupportedByDriver = `%s not supported by %s driver`
- RelationNotFound = `Did not find any relation named "%s".`
- InvalidOption = `invalid option %q`
- NotificationReceived = `Asynchronous notification %q %sreceived from server process with PID %d.`
- NotificationPayload = `with payload %q `
- UnknownShortAlias = `(unk)`
+ TimingSet = `Timing is %s.`
+ TimingDesc = `Time: %0.3f ms`
+ InvalidValue = `invalid -%s value %q: %s`
+ NotSupportedByDriver = `%s not supported by %s driver`
+ RelationNotFound = `Did not find any relation named "%s".`
+ InvalidOption = `invalid option %q`
+ NotificationReceived = `Asynchronous notification %q %sreceived from server process with PID %d.`
+ NotificationPayload = `with payload %q `
+ UnknownShortAlias = `(unk)`
+ InvalidNamedConnection = `warning: named connection %q was not defined: %v`
+ ChartsPathDoesNotExist = `warning: charts_path %q does not exist`
+ ChartsPathIsNotADirectory = `warning: charts_path %q is not a directory`
+ UsageTemplate = `Usage:
+ {{.UseLine}}
+
+Arguments:
+ DSN database url or connection name
+
+Flags:
+{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}
+`
+ ChartUsage = `\chart: create and display charts from SQL data
+usage: \chart [opts]
+
+available options:
+
+help
+title [title] chart title
+subtitle [subtitle] chart subtitle
+size NxN chart size (width x height)
+bg [color] chart background color
+type [bar|line] chart type
+prec [num] data decimal precision
+file [path] write chart to file (svg)`
)
func init() {
@@ -118,18 +150,22 @@ var CommandUpper = func() string {
return strings.ToUpper(Command())
}
-// UsageTemplate returns the usage template.
-var UsageTemplate = func() string {
- n := CommandLower()
- return n + `, ` + Banner + `
+// Short returns the command name and banner.
+var Short = func() string {
+ return Command() + ", " + Banner
+}
-Usage:
- ` + n + ` [OPTIONS]... [DSN]
+// Logo is the logo.
+var Logo image.Image
-Arguments:
- DSN database url
+// LogoPng is the embedded logo.
+//
+//go:embed logo.png
+var LogoPng []byte
-{{if .Context.Flags}}\
-Options:
-{{.Context.Flags|FlagsToTwoColumns|FormatTwoColumns}}{{end}}`
+func init() {
+ var err error
+ if Logo, err = png.Decode(bytes.NewReader(LogoPng)); err != nil {
+ panic(err)
+ }
}