From cd20f44d20b39c039406a3349772b9be2399a21a Mon Sep 17 00:00:00 2001 From: Maddie Zhan Date: Thu, 30 Apr 2026 13:53:52 +0800 Subject: [PATCH] Sync PHP backend feature parity: IP detection, database backends, API endpoints, and frontend - IP detection: Cloudflare IPv6, ULA IPv6, proxy header chain, offline GeoIP DB - Database: add SQLite (pure Go, no CGo) and MSSQL backends - API: add JSON result sharing endpoint and ID obfuscation - Frontend: add modern CSS design, design switcher, favicon - Compatibility: ?cors parameter support, human-friendly distance rounding - Update Go to 1.21, add modernc.org/sqlite and maxminddb deps --- README.md | 56 ++-- config/config.go | 8 +- database/database.go | 6 + database/mssql/mssql.go | 81 +++++ database/mssql/telemetry_mssql.sql | 27 ++ database/sqlite/sqlite.go | 95 ++++++ database/sqlite/telemetry_sqlite.sql | 21 ++ go.mod | 37 +- go.sum | 381 +++++---------------- results/idobfuscation.go | 119 +++++++ results/json.go | 102 ++++++ results/telemetry.go | 10 +- settings.toml | 10 +- web/assets/design-switch.js | 45 +++ web/assets/favicon.ico | Bin 0 -> 16958 bytes web/assets/fonts/Inter-latin-ext.woff2 | Bin 0 -> 74328 bytes web/assets/fonts/Inter-latin.woff2 | Bin 0 -> 48444 bytes web/assets/images/background.jpeg | Bin 0 -> 171962 bytes web/assets/images/chevron.svg | 22 ++ web/assets/images/close-button.svg | 14 + web/assets/images/favicon.svg | 19 ++ web/assets/images/logo.svg | 66 ++++ web/assets/index-classic.html | 365 ++++++++++++++++++++ web/assets/index-modern.html | 152 +++++++++ web/assets/index.html | 367 +------------------- web/assets/javascript/index.js | 447 +++++++++++++++++++++++++ web/assets/speedtest.js | 88 ++--- web/assets/speedtest_worker.js | 154 ++++----- web/assets/styling/button.css | 83 +++++ web/assets/styling/colors.css | 36 ++ web/assets/styling/dialog.css | 132 ++++++++ web/assets/styling/fonts.css | 22 ++ web/assets/styling/index.css | 85 +++++ web/assets/styling/main.css | 58 ++++ web/assets/styling/results.css | 260 ++++++++++++++ web/assets/styling/server-selector.css | 171 ++++++++++ web/getip_util.go | 120 +++++++ web/helpers.go | 142 +++++++- web/web.go | 55 ++- 39 files changed, 3005 insertions(+), 851 deletions(-) create mode 100644 database/mssql/mssql.go create mode 100644 database/mssql/telemetry_mssql.sql create mode 100644 database/sqlite/sqlite.go create mode 100644 database/sqlite/telemetry_sqlite.sql create mode 100644 results/idobfuscation.go create mode 100644 results/json.go create mode 100644 web/assets/design-switch.js create mode 100755 web/assets/favicon.ico create mode 100644 web/assets/fonts/Inter-latin-ext.woff2 create mode 100644 web/assets/fonts/Inter-latin.woff2 create mode 100644 web/assets/images/background.jpeg create mode 100644 web/assets/images/chevron.svg create mode 100644 web/assets/images/close-button.svg create mode 100644 web/assets/images/favicon.svg create mode 100644 web/assets/images/logo.svg create mode 100755 web/assets/index-classic.html create mode 100644 web/assets/index-modern.html mode change 100755 => 100644 web/assets/index.html create mode 100644 web/assets/javascript/index.js create mode 100644 web/assets/styling/button.css create mode 100644 web/assets/styling/colors.css create mode 100644 web/assets/styling/dialog.css create mode 100644 web/assets/styling/fonts.css create mode 100644 web/assets/styling/index.css create mode 100644 web/assets/styling/main.css create mode 100644 web/assets/styling/results.css create mode 100644 web/assets/styling/server-selector.css create mode 100644 web/getip_util.go diff --git a/README.md b/README.md index d522713..e1125d7 100644 --- a/README.md +++ b/README.md @@ -20,16 +20,25 @@ Works with mobile versions too. * Jitter * IP Address, ISP, distance from server (optional) * Telemetry (optional) -* Results sharing (optional) +* Results sharing via PNG image and JSON API (optional) * Multiple Points of Test (optional) * Compatible with PHP frontend predefined endpoints (with `.php` suffixes) -* Supports [Proxy Protocol](https://www.haproxy.org/download/2.3/doc/proxy-protocol.txt) (without TLV support yet) +* Supports [Proxy Protocol](https://www.haproxy.org/download/2.3/doc/proxy-protocol.txt) +* Modern and classic UI designs with switchable interface +* ID obfuscation for test result privacy (optional) + +### IP Detection +* Client IP detection with proxy header chain support (X-Forwarded-For, X-Real-IP, Client-IP, CF-Connecting-IPv6) +* ISP and location detection via ipinfo.io API with offline GeoIP database fallback (MaxMind .mmdb) +* Private/special IP detection (including ULA IPv6 and CGNAT) +* Distance calculation with human-friendly rounding ![Screencast](https://speedtest.zzz.cat/speedtest.webp) ## Server requirements -* Any [Go supported platforms](https://github.com/golang/go/wiki/MinimumRequirements) -* BoltDB, PostgreSQL or MySQL database to store test results (optional) +* Any [Go supported platforms](https://github.com/golang/go/wiki/MinimumRequirements) (Go 1.21+) +* SQLite, BoltDB, PostgreSQL, MySQL or MSSQL database to store test results (optional) +* No external dependencies — single binary deployment * A fast! Internet connection ## Installation @@ -47,17 +56,7 @@ Works with mobile versions too. You can use an Ansible role for installing speedtest-go easily. You can find the role on the [Ansible galaxy](https://galaxy.ansible.com/flymia/ansible_speedtest_go). There is a [separate repository](https://github.com/flymia/ansible-speedtest_go) for documentation about the Ansible role. ### Compile from source -You need Go 1.16+ to compile the binary. If you have an older version of Go and don't want to install the tarball -manually, you can install newer version of Go into your `GOPATH`: - -0. Install Go 1.17 - - ``` - $ go get golang.org/dl/go1.17.1 - # Assuming your GOPATH is default (~/go), Go 1.17.1 will be installed in ~/go/bin - $ ~/go/bin/go1.17.1 version - go version go1.17.1 linux/amd64 - ``` +You need Go 1.21+ to compile the binary. 1. Clone this repository: @@ -76,19 +75,21 @@ manually, you can install newer version of Go into your `GOPATH`: 3. Copy the `assets` directory, `settings.toml` file along with the compiled `speedtest` binary into a single directory 4. If you have telemetry enabled, - - For PostgreSQL/MySQL, create database and import the corresponding `.sql` file under `database/{postgresql,mysql}` + - For PostgreSQL/MySQL/MSSQL, create database and import the corresponding `.sql` file under `database/{postgresql,mysql,mssql}` ``` # assume you have already created a database named `speedtest` under current user $ psql speedtest < database/postgresql/telemetry_postgresql.sql ``` - - For embedded BoltDB, make sure to define the `database_file` path in `settings.toml`: + - For embedded databases (BoltDB, SQLite), make sure to define the `database_file` path in `settings.toml`: ``` database_file="speedtest.db" ``` + - SQLite supports WAL mode for better concurrent performance and works out of the box with no additional dependencies. + 5. Put `assets` folder under the same directory as your compiled binary. - Make sure the font files and JavaScripts are in the `assets` directory - You can have multiple HTML pages under `assets` directory. They can be access directly under the server root @@ -119,7 +120,7 @@ manually, you can install newer version of Go into your `GOPATH`: # redact IP addresses redact_ip_addresses=false - # database type for statistics data, currently supports: none, memory, bolt, mysql, postgresql + # database type for statistics data, currently supports: none, memory, bolt, sqlite, mysql, postgresql, mssql # if none is specified, no telemetry/stats will be recorded, and no result PNG will be generated database_type="postgresql" database_hostname="localhost" @@ -127,9 +128,16 @@ manually, you can install newer version of Go into your `GOPATH`: database_username="postgres" database_password="" - # if you use `bolt` as database, set database_file to database file location + # database port (optional, defaults to driver default; only used by mssql) + database_port="" + + # if you use `bolt` or `sqlite` as database, set database_file to database file location database_file="speedtest.db" + # GeoIP offline database (.mmdb format) for ISP detection fallback (optional) + # Leave empty to disable. + # geoip_database_file="country_asn.mmdb" + # TLS and HTTP/2 settings. TLS is required for HTTP/2 enable_tls=false enable_http2=false @@ -141,11 +149,11 @@ manually, you can install newer version of Go into your `GOPATH`: ## Differences between Go and PHP implementation and caveats -- Since there is no CGo-free SQLite implementation available, I've opted to use [BoltDB](https://github.com/etcd-io/bbolt) - instead, as an embedded database alternative to SQLite -- Test IDs are generated ULID, there is no option to change them to plain ID -- You can use the same HTML template from the PHP implementation -- Server location can be defined in settings +- Test IDs are generated as ULID (Universally Unique Lexicographically Sortable Identifier), unlike the PHP version's auto-increment integer IDs +- ID obfuscation is available as an optional feature — when enabled, ULIDs are obfuscated with a per-instance salt +- The Go version ships with two built-in UI designs (classic gauges and modern CSS), switchable via `?design=new` URL parameter +- The modern design (`index-modern.html`) supports multi-server configuration via `server-list.json` placed alongside the binary +- Server location can be defined in settings or auto-detected at startup - There might be a slight delay on program start if your Internet connection is slow. That's because the program will attempt to fetch your current network's ISP info for distance calculation between your network and the speed test client's. This action will only be taken once, and cached for later use. diff --git a/config/config.go b/config/config.go index f092431..bb46b6f 100644 --- a/config/config.go +++ b/config/config.go @@ -14,8 +14,9 @@ type Config struct { ServerLng float64 `mapstructure:"server_lng"` IPInfoAPIKey string `mapstructure:"ipinfo_api_key"` - StatsPassword string `mapstructure:"statistics_password"` - RedactIP bool `mapstructure:"redact_ip_addresses"` + StatsPassword string `mapstructure:"statistics_password"` + RedactIP bool `mapstructure:"redact_ip_addresses"` + EnableIDObfuscation bool `mapstructure:"enable_id_obfuscation"` AssetsPath string `mapstructure:"assets_path"` @@ -26,6 +27,9 @@ type Config struct { DatabasePassword string `mapstructure:"database_password"` DatabaseFile string `mapstructure:"database_file"` + DatabasePort string `mapstructure:"database_port"` + + GeoIPDatabaseFile string `mapstructure:"geoip_database_file"` EnableHTTP2 bool `mapstructure:"enable_http2"` EnableTLS bool `mapstructure:"enable_tls"` diff --git a/database/database.go b/database/database.go index 315b947..cb347bd 100644 --- a/database/database.go +++ b/database/database.go @@ -4,10 +4,12 @@ import ( "github.com/librespeed/speedtest-go/config" "github.com/librespeed/speedtest-go/database/bolt" "github.com/librespeed/speedtest-go/database/memory" + "github.com/librespeed/speedtest-go/database/mssql" "github.com/librespeed/speedtest-go/database/mysql" "github.com/librespeed/speedtest-go/database/none" "github.com/librespeed/speedtest-go/database/postgresql" "github.com/librespeed/speedtest-go/database/schema" + "github.com/librespeed/speedtest-go/database/sqlite" log "github.com/sirupsen/logrus" ) @@ -30,6 +32,10 @@ func SetDBInfo(conf *config.Config) { DB = mysql.Open(conf.DatabaseHostname, conf.DatabaseUsername, conf.DatabasePassword, conf.DatabaseName) case "bolt": DB = bolt.Open(conf.DatabaseFile) + case "sqlite": + DB = sqlite.Open(conf.DatabaseFile) + case "mssql": + DB = mssql.Open(conf.DatabaseHostname, conf.DatabaseUsername, conf.DatabasePassword, conf.DatabaseName, conf.DatabasePort) case "memory": DB = memory.Open("") case "none": diff --git a/database/mssql/mssql.go b/database/mssql/mssql.go new file mode 100644 index 0000000..526b016 --- /dev/null +++ b/database/mssql/mssql.go @@ -0,0 +1,81 @@ +package mssql + +import ( + "database/sql" + "fmt" + "net/url" + + "github.com/librespeed/speedtest-go/database/schema" + + _ "github.com/denisenkom/go-mssqldb" + log "github.com/sirupsen/logrus" +) + +type MSSQL struct { + db *sql.DB +} + +func Open(hostname, username, password, database, port string) *MSSQL { + if port == "" { + port = "1433" + } + + query := url.Values{} + query.Add("database", database) + + connStr := fmt.Sprintf("sqlserver://%s:%s@%s:%s?%s", + url.QueryEscape(username), + url.QueryEscape(password), + hostname, + port, + query.Encode(), + ) + + conn, err := sql.Open("sqlserver", connStr) + if err != nil { + log.Fatalf("Cannot open MSSQL database: %s", err) + } + + return &MSSQL{db: conn} +} + +func (p *MSSQL) Insert(data *schema.TelemetryData) error { + stmt := `INSERT INTO speedtest_users (ip, ispinfo, extra, ua, lang, dl, ul, ping, jitter, log, uuid) + VALUES (@p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11);` + _, err := p.db.Exec(stmt, + data.IPAddress, data.ISPInfo, data.Extra, data.UserAgent, data.Language, + data.Download, data.Upload, data.Ping, data.Jitter, data.Log, data.UUID) + return err +} + +func (p *MSSQL) FetchByUUID(uuid string) (*schema.TelemetryData, error) { + var record schema.TelemetryData + row := p.db.QueryRow(`SELECT * FROM speedtest_users WHERE uuid = @p1`, uuid) + if row != nil { + var id int64 + if err := row.Scan(&id, &record.Timestamp, &record.IPAddress, &record.ISPInfo, &record.Extra, &record.UserAgent, &record.Language, &record.Download, &record.Upload, &record.Ping, &record.Jitter, &record.Log, &record.UUID); err != nil { + return nil, fmt.Errorf("mssql fetch by uuid: %w", err) + } + } + return &record, nil +} + +func (p *MSSQL) FetchLast100() ([]schema.TelemetryData, error) { + var records []schema.TelemetryData + rows, err := p.db.Query(`SELECT TOP 100 * FROM speedtest_users ORDER BY timestamp DESC;`) + if err != nil { + return nil, fmt.Errorf("mssql fetch last 100: %w", err) + } + if rows != nil { + defer rows.Close() + for rows.Next() { + var record schema.TelemetryData + var id int64 + if err := rows.Scan(&id, &record.Timestamp, &record.IPAddress, &record.ISPInfo, &record.Extra, &record.UserAgent, &record.Language, &record.Download, &record.Upload, &record.Ping, &record.Jitter, &record.Log, &record.UUID); err != nil { + return nil, fmt.Errorf("mssql scan row: %w", err) + } + records = append(records, record) + } + } + return records, nil +} diff --git a/database/mssql/telemetry_mssql.sql b/database/mssql/telemetry_mssql.sql new file mode 100644 index 0000000..dd4f455 --- /dev/null +++ b/database/mssql/telemetry_mssql.sql @@ -0,0 +1,27 @@ +-- +-- MSSQL database schema for speedtest telemetry +-- + +CREATE TABLE [dbo].[speedtest_users]( + [id] [bigint] IDENTITY(120,1) NOT NULL, + [timestamp] [datetime] NOT NULL, + [ip] [nvarchar](max) NOT NULL, + [ispinfo] [nvarchar](max) NULL, + [extra] [nvarchar](max) NULL, + [ua] [nvarchar](max) NOT NULL, + [lang] [nvarchar](max) NOT NULL, + [dl] [nvarchar](max) NULL, + [ul] [nvarchar](max) NULL, + [ping] [nvarchar](max) NULL, + [jitter] [nvarchar](max) NULL, + [log] [nvarchar](max) NULL, + [uuid] [nvarchar](max) NULL, + CONSTRAINT [PK_speedtest_users] PRIMARY KEY CLUSTERED +( + [id] ASC +) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] +GO + +ALTER TABLE [dbo].[speedtest_users] ADD CONSTRAINT [DF_speedtest_users_timestamp] DEFAULT (getdate()) FOR [timestamp] +GO diff --git a/database/sqlite/sqlite.go b/database/sqlite/sqlite.go new file mode 100644 index 0000000..15e5136 --- /dev/null +++ b/database/sqlite/sqlite.go @@ -0,0 +1,95 @@ +package sqlite + +import ( + "database/sql" + "fmt" + + "github.com/librespeed/speedtest-go/database/schema" + + _ "modernc.org/sqlite" + log "github.com/sirupsen/logrus" +) + +type SQLite struct { + db *sql.DB +} + +func Open(databaseFile string) *SQLite { + conn, err := sql.Open("sqlite", databaseFile) + if err != nil { + log.Fatalf("Cannot open SQLite database: %s", err) + } + + // Enable WAL mode for better concurrent performance + if _, err := conn.Exec("PRAGMA journal_mode=WAL"); err != nil { + log.Warnf("Failed to set SQLite journal mode to WAL: %s", err) + } + + // Create table if not exists (matching the PHP SQLite auto-creation behavior) + stmt := `CREATE TABLE IF NOT EXISTS speedtest_users ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + ip TEXT NOT NULL, + ispinfo TEXT, + extra TEXT, + ua TEXT NOT NULL, + lang TEXT NOT NULL, + dl TEXT, + ul TEXT, + ping TEXT, + jitter TEXT, + log TEXT, + uuid TEXT + );` + if _, err := conn.Exec(stmt); err != nil { + log.Fatalf("Failed to create speedtest_users table: %s", err) + } + + return &SQLite{db: conn} +} + +func (p *SQLite) Insert(data *schema.TelemetryData) error { + var existingID int + // Check for duplicate UUID first + err := p.db.QueryRow(`SELECT id FROM speedtest_users WHERE uuid = ?`, data.UUID).Scan(&existingID) + if err == nil { + // Record with this UUID already exists - skip insert + return nil + } + + stmt := `INSERT INTO speedtest_users (ip, ispinfo, extra, ua, lang, dl, ul, ping, jitter, log, uuid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);` + _, err = p.db.Exec(stmt, data.IPAddress, data.ISPInfo, data.Extra, data.UserAgent, data.Language, data.Download, data.Upload, data.Ping, data.Jitter, data.Log, data.UUID) + return err +} + +func (p *SQLite) FetchByUUID(uuid string) (*schema.TelemetryData, error) { + var record schema.TelemetryData + row := p.db.QueryRow(`SELECT * FROM speedtest_users WHERE uuid = ?`, uuid) + if row != nil { + var id int + if err := row.Scan(&id, &record.Timestamp, &record.IPAddress, &record.ISPInfo, &record.Extra, &record.UserAgent, &record.Language, &record.Download, &record.Upload, &record.Ping, &record.Jitter, &record.Log, &record.UUID); err != nil { + return nil, fmt.Errorf("sqlite fetch by uuid: %w", err) + } + } + return &record, nil +} + +func (p *SQLite) FetchLast100() ([]schema.TelemetryData, error) { + var records []schema.TelemetryData + rows, err := p.db.Query(`SELECT * FROM speedtest_users ORDER BY timestamp DESC LIMIT 100;`) + if err != nil { + return nil, fmt.Errorf("sqlite fetch last 100: %w", err) + } + if rows != nil { + defer rows.Close() + for rows.Next() { + var record schema.TelemetryData + var id int + if err := rows.Scan(&id, &record.Timestamp, &record.IPAddress, &record.ISPInfo, &record.Extra, &record.UserAgent, &record.Language, &record.Download, &record.Upload, &record.Ping, &record.Jitter, &record.Log, &record.UUID); err != nil { + return nil, fmt.Errorf("sqlite scan row: %w", err) + } + records = append(records, record) + } + } + return records, nil +} diff --git a/database/sqlite/telemetry_sqlite.sql b/database/sqlite/telemetry_sqlite.sql new file mode 100644 index 0000000..212c300 --- /dev/null +++ b/database/sqlite/telemetry_sqlite.sql @@ -0,0 +1,21 @@ +-- +-- SQLite database schema for speedtest telemetry +-- Auto-created by the sqlite backend if it doesn't exist. +-- This file is provided for reference / manual setup. +-- + +CREATE TABLE IF NOT EXISTS `speedtest_users` ( + `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + `timestamp` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `ip` TEXT NOT NULL, + `ispinfo` TEXT, + `extra` TEXT, + `ua` TEXT NOT NULL, + `lang` TEXT NOT NULL, + `dl` TEXT, + `ul` TEXT, + `ping` TEXT, + `jitter` TEXT, + `log` TEXT, + `uuid` TEXT +); diff --git a/go.mod b/go.mod index 90195fe..e4f2a67 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,11 @@ module github.com/librespeed/speedtest-go -go 1.16 +go 1.25.0 require ( github.com/breml/rootcerts v0.2.1 github.com/coreos/go-systemd/v22 v22.4.0 + github.com/denisenkom/go-mssqldb v0.12.3 github.com/go-chi/chi/v5 v5.0.7 github.com/go-chi/cors v1.2.0 github.com/go-chi/render v1.0.1 @@ -14,12 +15,42 @@ require ( github.com/gorilla/sessions v1.2.1 github.com/lib/pq v1.10.4 github.com/oklog/ulid/v2 v2.0.2 + github.com/oschwald/maxminddb-golang v1.13.1 github.com/pires/go-proxyproto v0.6.1 github.com/sirupsen/logrus v1.8.1 - github.com/spf13/afero v1.8.0 // indirect github.com/spf13/viper v1.10.1 github.com/umahmood/haversine v0.0.0-20151105152445-808ab04add26 go.etcd.io/bbolt v1.3.6 golang.org/x/image v0.0.0-20211028202545-6944b10bf410 - golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect + modernc.org/sqlite v1.50.0 +) + +require ( + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/kr/pretty v0.2.0 // indirect + github.com/magiconair/properties v1.8.5 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/ncruces/go-strftime v1.0.0 // indirect + github.com/pelletier/go-toml v1.9.4 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/spf13/afero v1.8.0 // indirect + github.com/spf13/cast v1.4.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.2.0 // indirect + golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/text v0.3.7 // indirect + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect + gopkg.in/ini.v1 v1.66.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + modernc.org/libc v1.72.0 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 1dbc9fb..da55bbb 100644 --- a/go.sum +++ b/go.sum @@ -17,17 +17,6 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb 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= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -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/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= @@ -36,7 +25,6 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= 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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= 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= @@ -48,71 +36,39 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX 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= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/breml/rootcerts v0.2.1 h1:GZMVDXOs945764NFck0vtHSjktKYubOFM0kjf5HAuwc= github.com/breml/rootcerts v0.2.1/go.mod h1:24FDtzYMpqIeYC7QzaE8VPRQaFZU5TIUDlyk8qwjD88= 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/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.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= 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/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-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.4.0 h1:y9YHcjnjynCd/DVbg5j9L/33jQM3MxJlbj/zWskzfGU= github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= 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/denisenkom/go-mssqldb v0.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw= +github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +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/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= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -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.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/cors v1.2.0 h1:tV1g1XENQ8ku4Bq3K9ub2AtgG+p16SmzeMSGTwrOKdE= @@ -122,23 +78,19 @@ github.com/go-chi/render v1.0.1/go.mod h1:pq4Rr7HbnsdaeHagklXub+p6Wd16Af5l9koip1 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-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/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 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= 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/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= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -146,8 +98,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -162,10 +112,6 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -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/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -176,15 +122,10 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 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/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= @@ -195,66 +136,32 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf 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-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/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/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= 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/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +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/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -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/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 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/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -263,78 +170,35 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -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-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -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/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +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/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= +github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= 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/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/oschwald/maxminddb-golang v1.13.1 h1:G3wwjdN9JmIK2o/ermkHM+98oX5fS+k5MbwsmL4MRQE= +github.com/oschwald/maxminddb-golang v1.13.1/go.mod h1:K4pgV9N/GcK694KSTmVSDTODk4IsCNThNdTmnaBZ/F8= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pires/go-proxyproto v0.6.1 h1:EBupykFmo22SDjv4fQVQd2J9NOoLPmyZA/15ldOGkPw= github.com/pires/go-proxyproto v0.6.1/go.mod h1:Odh9VFOZJCf9G8cLW5o435Xf1J95Jw9Gw5rnCjcwzAY= -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/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +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/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -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.8.0 h1:5MmtuhAgYeU6qpa7w7bP0dv6MBYuup0vekhSpSkoq60= github.com/spf13/afero v1.8.0/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= @@ -346,51 +210,38 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= 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/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= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/umahmood/haversine v0.0.0-20151105152445-808ab04add26 h1:UFHFmFfixpmfRBcxuu+LA9l8MdURWVdVNUHxO5n1d2w= github.com/umahmood/haversine v0.0.0-20151105152445-808ab04add26/go.mod h1:IGhd0qMDsUa9acVjsbsT7bu3ktadtGOHI79+idTew/M= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 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-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= 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-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/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 h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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= @@ -416,7 +267,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -427,11 +277,10 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= 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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -439,11 +288,9 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-20190923162816-aa69164e4478/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= @@ -460,16 +307,11 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -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-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -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-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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= @@ -479,14 +321,6 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 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= @@ -497,32 +331,23 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= 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-20181116152217-5ac8a444bdc5/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-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-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-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -541,32 +366,14 @@ 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-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-20210303074136-134d130e1a04/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-20210403161142-5e06dd20ab57/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-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-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-20211007075335-d3039528d8ac/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-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 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= @@ -574,7 +381,6 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -594,7 +400,6 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/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-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/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-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -619,7 +424,6 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -628,14 +432,10 @@ golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4f 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.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= 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= @@ -659,19 +459,6 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= 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= @@ -702,7 +489,6 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -715,33 +501,7 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D 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= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 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= @@ -755,21 +515,9 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -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.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -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= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -780,10 +528,6 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= @@ -791,17 +535,14 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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.4/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.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 h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= 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= @@ -809,6 +550,34 @@ 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= +modernc.org/cc/v4 v4.27.3 h1:uNCgn37E5U09mTv1XgskEVUJ8ADKpmFMPxzGJ0TSo+U= +modernc.org/cc/v4 v4.27.3/go.mod h1:3YjcbCqhoTTHPycJDRl2WZKKFj0nwcOIPBfEZK0Hdk8= +modernc.org/ccgo/v4 v4.32.4 h1:L5OB8rpEX4ZsXEQwGozRfJyJSFHbbNVOoQ59DU9/KuU= +modernc.org/ccgo/v4 v4.32.4/go.mod h1:lY7f+fiTDHfcv6YlRgSkxYfhs+UvOEEzj49jAn2TOx0= +modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= +modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= +modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= +modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/gc/v3 v3.1.2 h1:ZtDCnhonXSZexk/AYsegNRV1lJGgaNZJuKjJSWKyEqo= +modernc.org/gc/v3 v3.1.2/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.72.0 h1:IEu559v9a0XWjw0DPoVKtXpO2qt5NVLAnFaBbjq+n8c= +modernc.org/libc v1.72.0/go.mod h1:tTU8DL8A+XLVkEY3x5E/tO7s2Q/q42EtnNWda/L5QhQ= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.50.0 h1:eMowQSWLK0MeiQTdmz3lqoF5dqclujdlIKeJA11+7oM= +modernc.org/sqlite v1.50.0/go.mod h1:m0w8xhwYUVY3H6pSDwc3gkJ/irZT/0YEXwBlhaxQEew= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/results/idobfuscation.go b/results/idobfuscation.go new file mode 100644 index 0000000..da3d545 --- /dev/null +++ b/results/idobfuscation.go @@ -0,0 +1,119 @@ +package results + +import ( + "crypto/rand" + "encoding/base64" + "encoding/binary" + "fmt" + "os" + "path/filepath" + "sync" + + "github.com/oklog/ulid/v2" + log "github.com/sirupsen/logrus" +) + +// ID obfuscation provides an optional privacy layer for test result URLs. +// When enabled, the telemetry endpoint returns an obfuscated ULID that must +// be deobfuscated before looking up the result. +// +// This is NOT cryptographically secure — it prevents casual ID guessing, +// matching the behavior of the PHP version's idObfuscation.php. + +var ( + obfuscationSalt uint32 + obfuscationSaltOnce sync.Once + obfuscationSaltErr error +) + +const obfuscationSaltFile = "idObfuscation_salt.bin" + +func getOrCreateObfuscationSalt() (uint32, error) { + obfuscationSaltOnce.Do(func() { + data, err := os.ReadFile(obfuscationSaltFile) + if err == nil && len(data) == 4 { + obfuscationSalt = binary.LittleEndian.Uint32(data) + return + } + + saltBytes := make([]byte, 4) + if _, err := rand.Read(saltBytes); err != nil { + obfuscationSaltErr = fmt.Errorf("failed to generate obfuscation salt: %w", err) + return + } + obfuscationSalt = binary.LittleEndian.Uint32(saltBytes) + + dir := filepath.Dir(obfuscationSaltFile) + if dir != "." { + if err := os.MkdirAll(dir, 0755); err != nil { + log.Warnf("Could not create directory for obfuscation salt file: %s", err) + } + } + if err := os.WriteFile(obfuscationSaltFile, saltBytes, 0644); err != nil { + log.Warnf("Could not save obfuscation salt file: %s", err) + } + }) + + return obfuscationSalt, obfuscationSaltErr +} + +// obfuscateBytes applies reversible transform on ULID bytes: +// XOR the first 4 bytes with the salt (simple but effective for casual privacy) +func obfuscateBytes(data []byte) []byte { + salt, err := getOrCreateObfuscationSalt() + if err != nil || len(data) < 4 { + return data + } + result := make([]byte, len(data)) + copy(result, data) + val := binary.LittleEndian.Uint32(result[:4]) + val ^= salt + binary.LittleEndian.PutUint32(result[:4], val) + return result +} + +// deobfuscateBytes reverses obfuscateBytes (XOR is self-inverse) +var deobfuscateBytes = obfuscateBytes + +// ObfuscateULID transforms a ULID string to its obfuscated (base64) form +func ObfuscateULID(id string) string { + parsed, err := ulid.Parse(id) + if err != nil { + return id + } + obfuscated := obfuscateBytes(parsed[:]) + return base64.RawURLEncoding.EncodeToString(obfuscated) +} + +// DeobfuscateULID reverses ULID obfuscation +func DeobfuscateULID(obfuscated string) (string, error) { + data, err := base64.RawURLEncoding.DecodeString(obfuscated) + if err != nil { + return "", fmt.Errorf("invalid obfuscated ID encoding: %w", err) + } + if len(data) != 16 { + return "", fmt.Errorf("invalid obfuscated ID length: %d", len(data)) + } + deobfuscated := deobfuscateBytes(data) + var id ulid.ULID + copy(id[:], deobfuscated) + return id.String(), nil +} + +// ResolveID takes an ID string and returns the database ULID. +// It tries the raw input first, then attempts deobfuscation. +func ResolveID(id string) string { + // First try: use as-is (plain ULID) + if _, err := ulid.Parse(id); err == nil { + return id + } + + // Second try: deobfuscate + if deobfuscated, err := DeobfuscateULID(id); err == nil { + return deobfuscated + } + + return id +} + + diff --git a/results/json.go b/results/json.go new file mode 100644 index 0000000..bd05662 --- /dev/null +++ b/results/json.go @@ -0,0 +1,102 @@ +package results + +import ( + "encoding/json" + "net/http" + "strconv" + "strings" + + "github.com/go-chi/render" + "github.com/librespeed/speedtest-go/config" + "github.com/librespeed/speedtest-go/database" + log "github.com/sirupsen/logrus" +) + +// formatValue formats a numeric string for display, matching PHP behavior: +// - values < 10: 2 decimal places +// - values < 100: 1 decimal place +// - values >= 100: 0 decimal places +func formatValue(d string) string { + val, err := strconv.ParseFloat(d, 64) + if err != nil { + return d + } + if val < 10 { + return strconv.FormatFloat(val, 'f', 2, 64) + } + if val < 100 { + return strconv.FormatFloat(val, 'f', 1, 64) + } + return strconv.FormatFloat(val, 'f', 0, 64) +} + +// extractISPName extracts the ISP name from the processedString format: +// "IP - ISP, Country (distance)" → "ISP" +func extractISPName(processedString string) string { + dash := strings.Index(processedString, "-") + if dash == -1 { + return "" + } + isp := strings.TrimSpace(processedString[dash+1:]) + par := strings.LastIndex(isp, "(") + if par != -1 { + isp = strings.TrimSpace(isp[:par]) + } + return isp +} + +// JSONResponse is the structure returned by the JSON results endpoint +type JSONResponse struct { + Timestamp string `json:"timestamp"` + Download string `json:"download"` + Upload string `json:"upload"` + Ping string `json:"ping"` + Jitter string `json:"jitter"` + ISPInfo string `json:"ispinfo"` +} + +// JSONResult handles GET /results/json?id=X and returns test results as JSON +func JSONResult(w http.ResponseWriter, r *http.Request) { + conf := config.LoadedConfig() + + if conf.DatabaseType == "none" { + render.PlainText(w, r, "Telemetry is disabled") + return + } + + rawID := r.FormValue("id") + if rawID == "" { + w.WriteHeader(http.StatusBadRequest) + render.JSON(w, r, map[string]string{"error": "missing id parameter"}) + return + } + + uuid := ResolveID(rawID) + record, err := database.DB.FetchByUUID(uuid) + if err != nil { + log.Errorf("Error querying database for JSON result: %s", err) + w.WriteHeader(http.StatusNotFound) + render.JSON(w, r, map[string]string{"error": "result not found"}) + return + } + + // Format values for display (matching PHP json.php behavior) + resp := JSONResponse{ + Timestamp: record.Timestamp.Format("2006-01-02 15:04:05"), + Download: formatValue(record.Download), + Upload: formatValue(record.Upload), + Ping: formatValue(record.Ping), + Jitter: formatValue(record.Jitter), + } + + // Extract ISP name from ISP info JSON + var result Result + if err := json.Unmarshal([]byte(record.ISPInfo), &result); err == nil { + resp.ISPInfo = extractISPName(result.ProcessedString) + } + + w.Header().Set("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, s-maxage=0") + w.Header().Add("Cache-Control", "post-check=0, pre-check=0") + w.Header().Set("Pragma", "no-cache") + render.JSON(w, r, resp) +} diff --git a/results/telemetry.go b/results/telemetry.go index 7103a85..566db23 100644 --- a/results/telemetry.go +++ b/results/telemetry.go @@ -201,7 +201,12 @@ func Record(w http.ResponseWriter, r *http.Request) { return } - if _, err := w.Write([]byte("id " + uuid.String())); err != nil { + responseID := uuid.String() + if config.LoadedConfig().EnableIDObfuscation { + responseID = ObfuscateULID(uuid.String()) + } + + if _, err := w.Write([]byte("id " + responseID)); err != nil { log.Errorf("Error writing ID to telemetry request: %s", err) w.WriteHeader(http.StatusInternalServerError) } @@ -214,7 +219,8 @@ func DrawPNG(w http.ResponseWriter, r *http.Request) { return } - uuid := r.FormValue("id") + rawID := r.FormValue("id") + uuid := ResolveID(rawID) record, err := database.DB.FetchByUUID(uuid) if err != nil { log.Errorf("Error querying database: %s", err) diff --git a/settings.toml b/settings.toml index 0f0de1f..4ef8a47 100644 --- a/settings.toml +++ b/settings.toml @@ -20,17 +20,25 @@ statistics_password="PASSWORD" # redact IP addresses redact_ip_addresses=false -# database type for statistics data, currently supports: none, memory, bolt, mysql, postgresql +# database type for statistics data, currently supports: none, memory, bolt, mysql, postgresql, sqlite, mssql # if none is specified, no telemetry/stats will be recorded, and no result PNG will be generated database_type="memory" database_hostname="" database_name="" database_username="" database_password="" +# database port (optional, defaults to driver default) +database_port="" # if you use `bolt` as database, set database_file to database file location +# if you use `sqlite` as database, set database_file to database file location database_file="speedtest.db" +# GeoIP offline database (.mmdb format) for ISP and country detection when ipinfo.io API is not available +# This is used as a fallback, matching the PHP backend behavior. +# Leave empty to disable. +# geoip_database_file="country_asn.mmdb" + # TLS and HTTP/2 settings. TLS is required for HTTP/2 enable_tls=false enable_http2=false diff --git a/web/assets/design-switch.js b/web/assets/design-switch.js new file mode 100644 index 0000000..4469baa --- /dev/null +++ b/web/assets/design-switch.js @@ -0,0 +1,45 @@ +/** + * Feature switch for enabling the new LibreSpeed design + * + * This script checks for: + * 1. URL parameter: ?design=new or ?design=old + * 2. Default behavior: Shows the classic design + * + * Note: This script is only loaded on the root index.html + */ +(function () { + 'use strict'; + + // Don't run this script if we're already on a specific design page + const currentPath = window.location.pathname; + if (currentPath.includes('index-classic.html') || currentPath.includes('index-modern.html')) { + return; + } + + // Check URL parameters first + const urlParams = new URLSearchParams(window.location.search); + const designParam = urlParams.get('design'); + + if (designParam === 'new') { + redirectToNewDesign(); + return; + } + + if (designParam === 'old' || designParam === 'classic') { + redirectToOldDesign(); + return; + } + + // Default to classic design + redirectToOldDesign(); + + function redirectToNewDesign() { + const currentParams = window.location.search; + window.location.href = 'index-modern.html' + currentParams; + } + + function redirectToOldDesign() { + const currentParams = window.location.search; + window.location.href = 'index-classic.html' + currentParams; + } +})(); diff --git a/web/assets/favicon.ico b/web/assets/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..e50e89a3760609dcbbe5e8c019e00779b5a4a677 GIT binary patch literal 16958 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 literal 0 HcmV?d00001 diff --git a/web/assets/fonts/Inter-latin.woff2 b/web/assets/fonts/Inter-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..798d6d9f6cabc933d82f43e47a58b43835e4b631 GIT binary patch literal 48444 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 literal 0 HcmV?d00001 diff --git a/web/assets/images/background.jpeg b/web/assets/images/background.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e0f89164123185c6eda32fc7cce5cdb75267e9b2 GIT binary patch literal 171962 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 z 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 }Ao-gCyaj`i( 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 Strq{gIy;v2{~7rI-vj^@lq+2T literal 0 HcmV?d00001 diff --git a/web/assets/images/chevron.svg b/web/assets/images/chevron.svg new file mode 100644 index 0000000..d520abd --- /dev/null +++ b/web/assets/images/chevron.svg @@ -0,0 +1,22 @@ + + + + + + + + + + \ No newline at end of file diff --git a/web/assets/images/close-button.svg b/web/assets/images/close-button.svg new file mode 100644 index 0000000..befe4e6 --- /dev/null +++ b/web/assets/images/close-button.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/web/assets/images/favicon.svg b/web/assets/images/favicon.svg new file mode 100644 index 0000000..a38e24d --- /dev/null +++ b/web/assets/images/favicon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/assets/images/logo.svg b/web/assets/images/logo.svg new file mode 100644 index 0000000..709aa1c --- /dev/null +++ b/web/assets/images/logo.svg @@ -0,0 +1,66 @@ + \ No newline at end of file diff --git a/web/assets/index-classic.html b/web/assets/index-classic.html new file mode 100755 index 0000000..823ef9f --- /dev/null +++ b/web/assets/index-classic.html @@ -0,0 +1,365 @@ + + + + + + + + + +LibreSpeed Example + + +

LibreSpeed Example

+
+

+ Privacy +
+
+
+
Ping
+
+
ms
+
+
+
Jitter
+
+
ms
+
+
+
+
+
Download
+ +
+
Mbps
+
+
+
Upload
+ +
+
Mbps
+
+
+
+ +
+ +
+ Source code +
+ + + + diff --git a/web/assets/index-modern.html b/web/assets/index-modern.html new file mode 100644 index 0000000..c855f78 --- /dev/null +++ b/web/assets/index-modern.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + LibreSpeed - Free and Open Source Speedtest + + + +
+ LibreSpeed +
+
+

Free and Open Source Speedtest.

+

No Flash, No Java, No Websockets, No Bullsh*t

+ +
+
+
+ select... +
+

current server

+

searching nearest server...

+
+
    + +
    + + + + +
    + + +
    +
    +
    +

    00 Mbps

    +

    Download

    +
    + +
    +
    +
    +

    00 Mbps

    +

    Upload

    +
    + + +
    + + +
    + + + +
    + Close +
    + Test results in graphical form + +
    + + +
    + Close +
    +
    +

    Privacy Policy

    +

    + This HTML5 speed test server is configured with telemetry enabled. +

    + +

    What data we collect

    +

    + At the end of the test, the following data is collected and stored: +

    + +
      +
    • Test ID
    • +
    • Time of testing
    • +
    • Test results (download and upload speed, ping and jitter)
    • +
    • IP address
    • +
    • ISP information
    • +
    • Approximate location (inferred from IP address, not GPS)
    • +
    • User agent and browser locale
    • +
    • Test log (contains no personal information)
    • +
    + +

    How we use the data

    +

    Data collected through this service is used to:

    + +
      +
    • + Allow sharing of test results (sharable image for forums, etc.) +
    • +
    • + To improve the service offered to you (for instance, to detect + problems on our side) +
    • +
    + +

    No personal information is disclosed to third parties.

    + +

    Your consent

    +

    + By starting the test, you consent to the terms of this privacy policy. +

    + +

    Data removal

    +

    + If you want to have your information deleted, you need to provide + either the ID of the test or your IP address. This is the only way to + identify your data, without this information we won't be able to + comply with your request. +

    +

    + Contact this email address for all deletion requests: + TO BE FILLED BY DEVELOPER. +

    +
    + +
    + + + diff --git a/web/assets/index.html b/web/assets/index.html old mode 100755 new mode 100644 index 823ef9f..c7b3620 --- a/web/assets/index.html +++ b/web/assets/index.html @@ -1,365 +1,16 @@ + - - - - - - -LibreSpeed Example + + + + + LibreSpeed + -

    LibreSpeed Example

    -
    -

    - Privacy -
    -
    -
    -
    Ping
    -
    -
    ms
    -
    -
    -
    Jitter
    -
    -
    ms
    -
    -
    -
    -
    -
    Download
    - -
    -
    Mbps
    -
    -
    -
    Upload
    - -
    -
    Mbps
    -
    -
    -
    - -
    - -
    - Source code -
    - - +

    Loading...

    + diff --git a/web/assets/javascript/index.js b/web/assets/javascript/index.js new file mode 100644 index 0000000..ba4eb0e --- /dev/null +++ b/web/assets/javascript/index.js @@ -0,0 +1,447 @@ +/** + * Design by fromScratch Studio - 2022, 2023 (fromscratch.io) + * Implementation in HTML/CSS/JS by Timendus - 2024 (https://github.com/Timendus) + * + * See https://github.com/librespeed/speedtest/issues/585 + */ + +// States the UI can be in +const INITIALIZING = 0; +const READY = 1; +const RUNNING = 2; +const FINISHED = 3; + +// Keep some global state here +const testState = { + state: INITIALIZING, + speedtest: null, + servers: [], + selectedServerDirty: false, + testData: null, + testDataDirty: false, + telemetryEnabled: false, +}; + +// Bootstrap the application when the DOM is ready +window.addEventListener("DOMContentLoaded", async () => { + createSpeedtest(); + hookUpButtons(); + startRenderingLoop(); + applySettingsJSON(); + applyServerListJSON(); +}); + +/** + * Create a new Speedtest and hook it into the global state + */ +function createSpeedtest() { + testState.speedtest = new Speedtest(); + testState.speedtest.onupdate = (data) => { + testState.testData = data; + testState.testDataDirty = true; + }; + testState.speedtest.onend = (aborted) => + (testState.state = aborted ? READY : FINISHED); +} + +/** + * Make all the buttons respond to the right clicks + */ +function hookUpButtons() { + document + .querySelector("#start-button") + .addEventListener("click", startButtonClickHandler); + document + .querySelector("#choose-privacy") + .addEventListener("click", () => + document.querySelector("#privacy").showModal() + ); + document + .querySelector("#share-results") + .addEventListener("click", () => + document.querySelector("#share").showModal() + ); + document + .querySelector("#copy-link") + .addEventListener("click", copyLinkButtonClickHandler); + document + .querySelectorAll(".close-dialog, #close-privacy") + .forEach((element) => { + element.addEventListener("click", () => + document.querySelectorAll("dialog").forEach((modal) => modal.close()) + ); + }); +} + +/** + * Event listener for clicks on the main start button + */ +function startButtonClickHandler() { + switch (testState.state) { + case READY: + case FINISHED: + testState.speedtest.start(); + testState.state = RUNNING; + return; + case RUNNING: + testState.speedtest.abort(); + // testState.state is updated by `onend` handler of speedtest + return; + default: + return; + } +} + +/** + * Event listener for clicks on the "Copy link" button in the modal + */ +async function copyLinkButtonClickHandler() { + const link = document.querySelector("img#results").src; + await navigator.clipboard.writeText(link); + const button = document.querySelector("#copy-link"); + button.classList.add("active"); + button.textContent = "Copied!"; + setTimeout(() => { + button.classList.remove("active"); + button.textContent = "Copy link"; + }, 3000); +} + +/** + * Load settings from settings.json on the server and apply them + */ +async function applySettingsJSON() { + try { + const response = await fetch("settings.json"); + const settings = await response.json(); + if (!settings || typeof settings !== "object") { + return console.error("Settings are empty or malformed"); + } + for (let setting in settings) { + testState.speedtest.setParameter(setting, settings[setting]); + if ( + setting == "telemetry_level" && + settings[setting] && + settings[setting] != "off" && + settings[setting] != "disabled" && + settings[setting] != "false" + ) { + testState.telemetryEnabled = true; + document.querySelector("#privacy-warning").classList.remove("hidden"); + } + } + } catch (error) { + console.error("Failed to fetch settings:", error); + } +} + +/** + * Load server list from the configured source and populate the dropdown + */ +async function applyServerListJSON() { + try { + const serverSource = + typeof globalThis.SPEEDTEST_SERVERS !== "undefined" + ? globalThis.SPEEDTEST_SERVERS + : "server-list.json"; + const servers = Array.isArray(serverSource) + ? serverSource + : await fetch(serverSource).then((response) => response.json()); + if (!servers || !Array.isArray(servers) || servers.length === 0) { + return console.error("Server list is empty or malformed"); + } + + testState.servers = servers; + + // If there's only one server, just show it. No reachability checks needed. + if (servers.length === 1) { + populateDropdown(servers); + return; + } + + // For multiple servers: first run the built-in selection (which pings servers + // and annotates them with pingT). Only then populate the dropdown so that + // dead servers don't appear. + testState.speedtest.addTestPoints(servers); + testState.speedtest.selectServer((bestServer) => { + const aliveServers = testState.servers.filter((s) => { + // Keep servers that responded to ping (pingT !== -1). + if (s.pingT !== -1) return true; + // Also keep protocol-relative servers ("//...") as a defensive fallback. + // LibreSpeed normalizes them to the page protocol before pinging, so they + // are normally treated like any other server and get a real pingT value. + return typeof s.server === "string" && s.server.startsWith("//"); + }); + + // Prefer to show only reachable servers, but if none are reachable, + // fall back to the full list so users can still pick a server manually. + if (aliveServers.length > 0) { + testState.servers = aliveServers; + } + populateDropdown(testState.servers); + + + if (bestServer) { + selectServer(bestServer); + } else { + alert( + "Can't reach any of the speedtest servers! But you're on this page. Something weird is going on with your network." + ); + } + }); + } catch (error) { + console.error("Failed to load server list:", error); + } +} + +/** + * Add all the servers to the server selection dropdown and make it actually + * work. + * @param {Array} servers - an array of server objects + */ +function populateDropdown(servers) { + const serverSelector = document.querySelector("div.server-selector"); + const serverList = serverSelector.querySelector("ul.servers"); + + // Reset previous state (populateDropdown can be called multiple times) + serverSelector.classList.remove("single-server"); + serverSelector.classList.remove("active"); + serverList.classList.remove("active"); + serverList.innerHTML = ""; + + // If we have only a single server, just show it + if (servers.length === 1) { + serverSelector.classList.add("single-server"); + selectServer(servers[0]); + return; + } + serverSelector.classList.add("active"); + + // Make the dropdown open and close (hook only once) + if (serverSelector.dataset.hooked !== "1") { + serverSelector.dataset.hooked = "1"; + + serverSelector.addEventListener("click", () => { + serverList.classList.toggle("active"); + }); + document.addEventListener("click", (e) => { + if (e.target.closest("div.server-selector") !== serverSelector) + serverList.classList.remove("active"); + }); + } + + // Populate the list to choose from + servers.forEach((server) => { + const item = document.createElement("li"); + const link = document.createElement("a"); + link.href = "#"; + link.innerHTML = `${server.name}${ + server.sponsorName ? ` (${server.sponsorName})` : "" + }`; + link.addEventListener("click", () => selectServer(server)); + item.appendChild(link); + serverList.appendChild(item); + }); +} + +/** + * Set the given server as the selected server for the speedtest + * @param {Object} server - a server object + */ +function selectServer(server) { + testState.speedtest.setSelectedServer(server); + testState.selectedServerDirty = true; + testState.state = READY; +} + +/** + * Start the requestAnimationFrame UI rendering loop + */ +function startRenderingLoop() { + // Do these queries once to speed up the rendering itself + const serverSelector = document.querySelector("div.server-selector"); + const selectedServer = serverSelector.querySelector("#selected-server"); + const sponsor = serverSelector.querySelector("#sponsor"); + const startButton = document.querySelector("#start-button"); + const privacyWarning = document.querySelector("#privacy-warning"); + + const gauges = document.querySelectorAll("#download-gauge, #upload-gauge"); + const downloadProgress = document.querySelector("#download-gauge .progress"); + const uploadProgress = document.querySelector("#upload-gauge .progress"); + const downloadGauge = document.querySelector("#download-gauge .speed"); + const uploadGauge = document.querySelector("#upload-gauge .speed"); + const downloadText = document.querySelector("#download-gauge span"); + const uploadText = document.querySelector("#upload-gauge span"); + + const pingAndJitter = document.querySelectorAll(".ping, .jitter"); + const ping = document.querySelector("#ping"); + const jitter = document.querySelector("#jitter"); + const shareResults = document.querySelector("#share-results"); + const copyLink = document.querySelector("#copy-link"); + const resultsImage = document.querySelector("#results"); + + const buttonTexts = { + [INITIALIZING]: "Loading...", + [READY]: "Let's start", + [RUNNING]: "Abort", + [FINISHED]: "Restart", + }; + + // Show copy link button only if navigator.clipboard is available + copyLink.classList.toggle("hidden", !navigator.clipboard); + + function renderUI() { + // Make the main button reflect the current state + startButton.textContent = buttonTexts[testState.state]; + startButton.classList.toggle("disabled", testState.state === INITIALIZING); + startButton.classList.toggle("active", testState.state === RUNNING); + + // Disable the server selector while test is running + serverSelector.classList.toggle("disabled", testState.state === RUNNING); + + // Show selected server + if (testState.selectedServerDirty) { + const server = testState.speedtest.getSelectedServer(); + selectedServer.textContent = server.name; + if (server.sponsorName) { + if (server.sponsorURL) { + sponsor.innerHTML = `Sponsor: ${server.sponsorName}`; + } else { + sponsor.textContent = `Sponsor: ${server.sponsorName}`; + } + } else { + sponsor.innerHTML = " "; + } + testState.selectedServerDirty = false; + } + + // Activate the gauges when test running or finished + gauges.forEach((e) => + e.classList.toggle( + "enabled", + testState.state === RUNNING || testState.state === FINISHED + ) + ); + + // Show ping and jitter if data is available + pingAndJitter.forEach((e) => + e.classList.toggle( + "hidden", + !( + testState.testData && + testState.testData.pingStatus && + testState.testData.jitterStatus + ) + ) + ); + + // Show share button after test if server supports it + shareResults.classList.toggle( + "hidden", + !( + testState.state === FINISHED && + testState.telemetryEnabled && + testState.testData.testId + ) + ); + + if (testState.testDataDirty) { + // Set gauge rotations + downloadProgress.style = `--progress-rotation: ${ + testState.testData.dlProgress * 180 + }deg`; + uploadProgress.style = `--progress-rotation: ${ + testState.testData.ulProgress * 180 + }deg`; + downloadGauge.style = `--speed-rotation: ${mbpsToRotation( + testState.testData.dlStatus, + testState.testData.testState === 1 + )}deg`; + uploadGauge.style = `--speed-rotation: ${mbpsToRotation( + testState.testData.ulStatus, + testState.testData.testState === 3 + )}deg`; + + // Set numeric values + downloadText.textContent = numberToText(testState.testData.dlStatus); + uploadText.textContent = numberToText(testState.testData.ulStatus); + ping.textContent = numberToText(testState.testData.pingStatus); + jitter.textContent = numberToText(testState.testData.jitterStatus); + + // Set user's IP and provider + if (testState.testData.clientIp) { + // Clear previous content + privacyWarning.innerHTML = ''; + + const connectedThrough = document.createElement('span'); + connectedThrough.textContent = 'You are connected through:'; + + const ipAddress = document.createTextNode(testState.testData.clientIp); + + privacyWarning.appendChild(connectedThrough); + privacyWarning.appendChild(document.createElement('br')); + privacyWarning.appendChild(ipAddress); + + privacyWarning.classList.remove("hidden"); + } + + // Set image for sharing results + if (testState.testData.testId) { + resultsImage.src = + window.location.href.substring( + 0, + window.location.href.lastIndexOf("/") + ) + + "/results/?id=" + + testState.testData.testId; + } + + testState.testDataDirty = false; + } + + requestAnimationFrame(renderUI); + } + + renderUI(); +} + +/** + * Convert a speed in Mbits per second to a rotation for the gauge + * @param {string} speed Speed in Mbits + * @param {boolean} oscillate If the gauge should wiggle a bit + * @returns {number} Rotation for the gauge in degrees + */ +function mbpsToRotation(speed, oscillate) { + speed = Number(speed); + if (speed <= 0) return 0; + + const minSpeed = 0; + const maxSpeed = 10000; // 10 Gbps maxes out the gauge + const minRotation = 0; + const maxRotation = 180; + + // Can't do log10 of values less than one, +1 all to keep it fair + const logMinSpeed = Math.log10(minSpeed + 1); + const logMaxSpeed = Math.log10(maxSpeed + 1); + const logSpeed = Math.log10(speed + 1); + + const power = (logSpeed - logMinSpeed) / (logMaxSpeed - logMinSpeed); + const oscillation = oscillate ? 1 + 0.01 * Math.sin(Date.now() / 100) : 1; + const rotation = power * oscillation * maxRotation; + + // Make sure we stay within bounds at all times + return Math.max(Math.min(rotation, maxRotation), minRotation); +} + +/** + * Convert a number to a user friendly version + * @param {string} value Speed, ping or jitter + * @returns {string} A text version with proper decimals + */ +function numberToText(value) { + if (!value) return "00"; + value = Number(value); + if (value < 10) return value.toFixed(2); + if (value < 100) return value.toFixed(1); + return value.toFixed(0); +} diff --git a/web/assets/speedtest.js b/web/assets/speedtest.js index 61d0e77..a938db1 100755 --- a/web/assets/speedtest.js +++ b/web/assets/speedtest.js @@ -6,15 +6,15 @@ */ /* - This is the main interface between your webpage and the speedtest. - It hides the speedtest web worker to the page, and provides many convenient functions to control the test. - + This is the main interface between your webpage and the speed test. + It hides the speed test web worker to the page, and provides many convenient functions to control the test. + The best way to learn how to use this is to look at the basic example, but here's some documentation. - + To initialize the test, create a new Speedtest object: - var s=new Speedtest(); + let s=new Speedtest(); Now you can think of this as a finite state machine. These are the states (use getState() to see them): - - 0: here you can change the speedtest settings (such as test duration) with the setParameter("parameter",value) method. From here you can either start the test using start() (goes to state 3) or you can add multiple test points using addTestPoint(server) or addTestPoints(serverList) (goes to state 1). Additionally, this is the perfect moment to set up callbacks for the onupdate(data) and onend(aborted) events. + - 0: here you can change the speed test settings (such as test duration) with the setParameter("parameter",value) method. From here you can either start the test using start() (goes to state 3) or you can add multiple test points using addTestPoint(server) or addTestPoints(serverList) (goes to state 1). Additionally, this is the perfect moment to set up callbacks for the onupdate(data) and onend(aborted) events. - 1: here you can add test points. You only need to do this if you want to use multiple test points. A server is defined as an object like this: { @@ -27,16 +27,16 @@ } While in state 1, you can only add test points, you cannot change the test settings. When you're done, use selectServer(callback) to select the test point with the lowest ping. This is asynchronous, when it's done, it will call your callback function and move to state 2. Calling setSelectedServer(server) will manually select a server and move to state 2. - 2: test point selected, ready to start the test. Use start() to begin, this will move to state 3 - - 3: test running. Here, your onupdate event calback will be called periodically, with data coming from the worker about speed and progress. A data object will be passed to your onupdate function, with the following items: - - dlStatus: download speed in mbps - - ulStatus: upload speed in mbps + - 3: test running. Here, your onupdate event callback will be called periodically, with data coming from the worker about speed and progress. A data object will be passed to your onupdate function, with the following items: + - dlStatus: download speed in Mbit/s + - ulStatus: upload speed in Mbit/s - pingStatus: ping in ms - jitterStatus: jitter in ms - dlProgress: progress of the download test as a float 0-1 - ulProgress: progress of the upload test as a float 0-1 - pingProgress: progress of the ping/jitter test as a float 0-1 - testState: state of the test (-1=not started, 0=starting, 1=download test, 2=ping+jitter test, 3=upload test, 4=finished, 5=aborted) - - clientIp: IP address of the client performing the test (and optionally ISP and distance) + - clientIp: IP address of the client performing the test (and optionally ISP and distance) At the end of the test, the onend function will be called, with a boolean specifying whether the test was aborted or if it ended normally. The test can be aborted at any time with abort(). At the end of the test, it will move to state 4 @@ -46,10 +46,10 @@ function Speedtest() { this._serverList = []; //when using multiple points of test, this is a list of test points this._selectedServer = null; //when using multiple points of test, this is the selected server - this._settings = {}; //settings for the speedtest worker + this._settings = {}; //settings for the speed test worker this._state = 0; //0=adding settings, 1=adding servers, 2=server selection done, 3=test running, 4=done console.log( - "LibreSpeed by Federico Dossena v5.2.4 - https://github.com/librespeed/speedtest" + "LibreSpeed by Federico Dossena v6.1.0 - https://github.com/librespeed/speedtest" ); } @@ -66,7 +66,7 @@ Speedtest.prototype = { * - parameter: string with the name of the parameter that you want to set * - value: new value for the parameter * - * Invalid values or nonexistant parameters will be ignored by the speedtest worker. + * Invalid values or nonexistant parameters will be ignored by the speed test worker. */ setParameter: function(parameter, value) { if (this._state == 3) @@ -125,7 +125,7 @@ Speedtest.prototype = { * Same as addTestPoint, but you can pass an array of servers */ addTestPoints: function(list) { - for (var i = 0; i < list.length; i++) this.addTestPoint(list[i]); + for (let i = 0; i < list.length; i++) this.addTestPoint(list[i]); }, /** * Load a JSON server list from URL (multiple points of test) @@ -144,11 +144,11 @@ Speedtest.prototype = { if (this._state == 0) this._state = 1; if (this._state != 1) throw "You can't add a server after server selection"; this._settings.mpot = true; - var xhr = new XMLHttpRequest(); + let xhr = new XMLHttpRequest(); xhr.onload = function(){ try{ - var servers=JSON.parse(xhr.responseText); - for(var i=0;i 0 && d < instspd) instspd = d; } catch (e) {} @@ -234,14 +234,14 @@ Speedtest.prototype = { }.bind(this); //this function repeatedly pings a server to get a good estimate of the ping. When it's done, it calls the done function without parameters. At the end of the execution, the server will have a new parameter called pingT, which is either the best ping we got from the server or -1 if something went wrong. - var PINGS = 3, //up to 3 pings are performed, unless the server is down... + const PINGS = 3, //up to 3 pings are performed, unless the server is down... SLOW_THRESHOLD = 500; //...or one of the pings is above this threshold - var checkServer = function(server, done) { - var i = 0; + const checkServer = function(server, done) { + let i = 0; server.pingT = -1; if (server.server.indexOf(location.protocol) == -1) done(); else { - var nextPing = function() { + const nextPing = function() { if (i++ == PINGS) { done(); return; @@ -261,10 +261,10 @@ Speedtest.prototype = { } }.bind(this); //check servers in list, one by one - var i = 0; - var done = function() { - var bestServer = null; - for (var i = 0; i < serverList.length; i++) { + let i = 0; + const done = function() { + let bestServer = null; + for (let i = 0; i < serverList.length; i++) { if ( serverList[i].pingT != -1 && (bestServer == null || serverList[i].pingT < bestServer.pingT) @@ -273,7 +273,7 @@ Speedtest.prototype = { } selected(bestServer); }.bind(this); - var nextServer = function() { + const nextServer = function() { if (i == serverList.length) { done(); return; @@ -284,17 +284,17 @@ Speedtest.prototype = { }.bind(this); //parallel server selection - var CONCURRENCY = 6; - var serverLists = []; - for (var i = 0; i < CONCURRENCY; i++) { + const CONCURRENCY = 6; + let serverLists = []; + for (let i = 0; i < CONCURRENCY; i++) { serverLists[i] = []; } - for (var i = 0; i < this._serverList.length; i++) { + for (let i = 0; i < this._serverList.length; i++) { serverLists[i % CONCURRENCY].push(this._serverList[i]); } - var completed = 0; - var bestServer = null; - for (var i = 0; i < CONCURRENCY; i++) { + let completed = 0; + let bestServer = null; + for (let i = 0; i < CONCURRENCY; i++) { select( serverLists[i], function(server) { @@ -323,14 +323,14 @@ Speedtest.prototype = { this.worker.onmessage = function(e) { if (e.data === this._prevData) return; else this._prevData = e.data; - var data = JSON.parse(e.data); + const data = JSON.parse(e.data); try { if (this.onupdate) this.onupdate(data); } catch (e) { console.error("Speedtest onupdate event threw exception: " + e); } if (data.testState >= 4) { - clearInterval(this.updater); + clearInterval(this.updater); this._state = 4; try { if (this.onend) this.onend(data.testState == 5); diff --git a/web/assets/speedtest_worker.js b/web/assets/speedtest_worker.js index 2899e70..8626b7a 100755 --- a/web/assets/speedtest_worker.js +++ b/web/assets/speedtest_worker.js @@ -6,18 +6,18 @@ */ // data reported to main thread -var testState = -1; // -1=not started, 0=starting, 1=download test, 2=ping+jitter test, 3=upload test, 4=finished, 5=abort -var dlStatus = ""; // download speed in megabit/s with 2 decimal digits -var ulStatus = ""; // upload speed in megabit/s with 2 decimal digits -var pingStatus = ""; // ping in milliseconds with 2 decimal digits -var jitterStatus = ""; // jitter in milliseconds with 2 decimal digits -var clientIp = ""; // client's IP address as reported by getIP.php -var dlProgress = 0; //progress of download test 0-1 -var ulProgress = 0; //progress of upload test 0-1 -var pingProgress = 0; //progress of ping+jitter test 0-1 -var testId = null; //test ID (sent back by telemetry if used, null otherwise) +let testState = -1; // -1=not started, 0=starting, 1=download test, 2=ping+jitter test, 3=upload test, 4=finished, 5=abort +let dlStatus = ""; // download speed in megabit/s with 2 decimal digits +let ulStatus = ""; // upload speed in megabit/s with 2 decimal digits +let pingStatus = ""; // ping in milliseconds with 2 decimal digits +let jitterStatus = ""; // jitter in milliseconds with 2 decimal digits +let clientIp = ""; // client's IP address as reported by getIP.php +let dlProgress = 0; //progress of download test 0-1 +let ulProgress = 0; //progress of upload test 0-1 +let pingProgress = 0; //progress of ping+jitter test 0-1 +let testId = null; //test ID (sent back by telemetry if used, null otherwise) -var log = ""; //telemetry log +let log = ""; //telemetry log function tlog(s) { if (settings.telemetry_level >= 2) { log += Date.now() + ": " + s + "\n"; @@ -36,7 +36,7 @@ function twarn(s) { } // test settings. can be overridden by sending specific values with the start command -var settings = { +let settings = { mpot: false, //set to true when in MPOT mode test_order: "IP_D_U", //order in which tests will be performed as a string. D=Download, U=Upload, P=Ping+Jitter, I=IP, _=1 second delay time_ul_max: 15, // max duration of upload test in seconds @@ -60,17 +60,17 @@ var settings = { garbagePhp_chunkSize: 100, // size of chunks sent by garbage.php (can be different if enable_quirks is active) enable_quirks: true, // enable quirks for specific browsers. currently it overrides settings to optimize for specific browsers, unless they are already being overridden with the start command ping_allowPerformanceApi: true, // if enabled, the ping test will attempt to calculate the ping more precisely using the Performance API. Currently works perfectly in Chrome, badly in Edge, and not at all in Firefox. If Performance API is not supported or the result is obviously wrong, a fallback is provided. - overheadCompensationFactor: 1.06, //can be changed to compensatie for transport overhead. (see doc.md for some other values) + overheadCompensationFactor: 1.06, //can be changed to compensate for transport overhead. (see doc.md for some other values) useMebibits: false, //if set to true, speed will be reported in mebibits/s instead of megabits/s telemetry_level: 0, // 0=disabled, 1=basic (results only), 2=full (results and timing) 3=debug (results+log) url_telemetry: "results/telemetry.php", // path to the script that adds telemetry data to the database telemetry_extra: "", //extra data that can be passed to the telemetry through the settings - forceIE11Workaround: false //when set to true, it will foce the IE11 upload test on all browsers. Debug only + forceIE11Workaround: false //when set to true, it will force the IE11 upload test on all browsers. Debug only }; -var xhr = null; // array of currently active xhr requests -var interval = null; // timer used in tests -var test_pointer = 0; //pointer to the next test to run inside settings.test_order +let xhr = null; // array of currently active xhr requests +let interval = null; // timer used in tests +let test_pointer = 0; //pointer to the next test to run inside settings.test_order /* this function is used on URLs passed in the settings to determine whether we need a ? or an & as a separator @@ -88,7 +88,7 @@ function url_sep(url) { example: start {"time_ul_max":"10", "time_dl_max":"10", "count_ping":"50"} */ this.addEventListener("message", function(e) { - var params = e.data.split(" "); + const params = e.data.split(" "); if (params[0] === "status") { // return status postMessage( @@ -111,19 +111,19 @@ this.addEventListener("message", function(e) { testState = 0; try { // parse settings, if present - var s = {}; + let s = {}; try { - var ss = e.data.substring(5); + const ss = e.data.substring(5); if (ss) s = JSON.parse(ss); } catch (e) { twarn("Error parsing custom settings JSON. Please check your syntax"); } //copy custom settings - for (var key in s) { + for (let key in s) { if (typeof settings[key] !== "undefined") settings[key] = s[key]; else twarn("Unknown setting ignored: " + key); } - var ua = navigator.userAgent; + const ua = navigator.userAgent; // quirks for specific browsers. apply only if not overridden. more may be added in future releases if (settings.enable_quirks || (typeof s.enable_quirks !== "undefined" && s.enable_quirks)) { if (/Firefox.(\d+\.\d+)/i.test(ua)) { @@ -172,11 +172,11 @@ this.addEventListener("message", function(e) { // run the tests tverb(JSON.stringify(settings)); test_pointer = 0; - var iRun = false, + let iRun = false, dRun = false, uRun = false, pRun = false; - var runNextTest = function() { + const runNextTest = function() { if (testState == 5) return; if (test_pointer >= settings.test_order.length) { //test is finished @@ -267,7 +267,7 @@ this.addEventListener("message", function(e) { function clearRequests() { tverb("stopping pending XHRs"); if (xhr) { - for (var i = 0; i < xhr.length; i++) { + for (let i = 0; i < xhr.length; i++) { try { xhr[i].onprogress = null; xhr[i].onload = null; @@ -289,18 +289,18 @@ function clearRequests() { } } // gets client's IP using url_getIp, then calls the done function -var ipCalled = false; // used to prevent multiple accidental calls to getIp -var ispInfo = ""; //used for telemetry +let ipCalled = false; // used to prevent multiple accidental calls to getIp +let ispInfo = ""; //used for telemetry function getIp(done) { tverb("getIp"); if (ipCalled) return; else ipCalled = true; // getIp already called? - var startT = new Date().getTime(); + let startT = new Date().getTime(); xhr = new XMLHttpRequest(); xhr.onload = function() { tlog("IP: " + xhr.responseText + ", took " + (new Date().getTime() - startT) + "ms"); try { - var data = JSON.parse(xhr.responseText); + const data = JSON.parse(xhr.responseText); clientIp = data.processedString; ispInfo = data.rawIspInfo; } catch (e) { @@ -317,25 +317,25 @@ function getIp(done) { xhr.send(); } // download test, calls done function when it's over -var dlCalled = false; // used to prevent multiple accidental calls to dlTest +let dlCalled = false; // used to prevent multiple accidental calls to dlTest function dlTest(done) { tverb("dlTest"); if (dlCalled) return; else dlCalled = true; // dlTest already called? - var totLoaded = 0.0, // total number of loaded bytes + let totLoaded = 0.0, // total number of loaded bytes startT = new Date().getTime(), // timestamp when test was started bonusT = 0, //how many milliseconds the test has been shortened by (higher on faster connections) graceTimeDone = false, //set to true after the grace time is past failed = false; // set to true if a stream fails xhr = []; // function to create a download stream. streams are slightly delayed so that they will not end at the same time - var testStream = function(i, delay) { + const testStream = function(i, delay) { setTimeout( function() { if (testState !== 1) return; // delayed stream ended up starting after the end of the download test tverb("dl test stream started " + i + " " + delay); - var prevLoaded = 0; // number of bytes loaded last time onprogress was called - var x = new XMLHttpRequest(); + let prevLoaded = 0; // number of bytes loaded last time onprogress was called + let x = new XMLHttpRequest(); xhr[i] = x; xhr[i].onprogress = function(event) { tverb("dl stream progress event " + i + " " + event.loaded); @@ -345,7 +345,7 @@ function dlTest(done) { } catch (e) {} } // just in case this XHR is still running after the download test // progress event, add number of new loaded bytes to totLoaded - var loadDiff = event.loaded <= 0 ? 0 : event.loaded - prevLoaded; + const loadDiff = event.loaded <= 0 ? 0 : event.loaded - prevLoaded; if (isNaN(loadDiff) || !isFinite(loadDiff) || loadDiff < 0) return; // just in case totLoaded += loadDiff; prevLoaded = event.loaded; @@ -380,14 +380,14 @@ function dlTest(done) { ); }.bind(this); // open streams - for (var i = 0; i < settings.xhr_dlMultistream; i++) { + for (let i = 0; i < settings.xhr_dlMultistream; i++) { testStream(i, settings.xhr_multistreamDelay * i); } // every 200ms, update dlStatus interval = setInterval( function() { tverb("DL: " + dlStatus + (graceTimeDone ? "" : " (in grace time)")); - var t = new Date().getTime() - startT; + const t = new Date().getTime() - startT; if (graceTimeDone) dlProgress = (t + bonusT) / (settings.time_dl_max * 1000); if (t < 200) return; if (!graceTimeDone) { @@ -401,10 +401,10 @@ function dlTest(done) { graceTimeDone = true; } } else { - var speed = totLoaded / (t / 1000.0); + const speed = totLoaded / (t / 1000.0); if (settings.time_auto) { //decide how much to shorten the test. Every 200ms, the test is shortened by the bonusT calculated here - var bonus = (5.0 * speed) / 100000; + const bonus = (5.0 * speed) / 100000; bonusT += bonus > 400 ? 400 : bonus; } //update status @@ -423,47 +423,47 @@ function dlTest(done) { 200 ); } -// upload test, calls done function whent it's over -var ulCalled = false; // used to prevent multiple accidental calls to ulTest +// upload test, calls done function when it's over +let ulCalled = false; // used to prevent multiple accidental calls to ulTest function ulTest(done) { tverb("ulTest"); if (ulCalled) return; else ulCalled = true; // ulTest already called? // garbage data for upload test - var r = new ArrayBuffer(1048576); - var maxInt = Math.pow(2, 32) - 1; + let r = new ArrayBuffer(1048576); + const maxInt = Math.pow(2, 32) - 1; try { r = new Uint32Array(r); - for (var i = 0; i < r.length; i++) r[i] = Math.random() * maxInt; + for (let i = 0; i < r.length; i++) r[i] = Math.random() * maxInt; } catch (e) {} - var req = []; - var reqsmall = []; - for (var i = 0; i < settings.xhr_ul_blob_megabytes; i++) req.push(r); + let req = []; + let reqsmall = []; + for (let i = 0; i < settings.xhr_ul_blob_megabytes; i++) req.push(r); req = new Blob(req); r = new ArrayBuffer(262144); try { r = new Uint32Array(r); - for (var i = 0; i < r.length; i++) r[i] = Math.random() * maxInt; + for (let i = 0; i < r.length; i++) r[i] = Math.random() * maxInt; } catch (e) {} reqsmall.push(r); reqsmall = new Blob(reqsmall); - var testFunction = function() { - var totLoaded = 0.0, // total number of transmitted bytes + const testFunction = function() { + let totLoaded = 0.0, // total number of transmitted bytes startT = new Date().getTime(), // timestamp when test was started bonusT = 0, //how many milliseconds the test has been shortened by (higher on faster connections) graceTimeDone = false, //set to true after the grace time is past failed = false; // set to true if a stream fails xhr = []; // function to create an upload stream. streams are slightly delayed so that they will not end at the same time - var testStream = function(i, delay) { + const testStream = function(i, delay) { setTimeout( function() { if (testState !== 3) return; // delayed stream ended up starting after the end of the upload test tverb("ul test stream started " + i + " " + delay); - var prevLoaded = 0; // number of bytes transmitted last time onprogress was called - var x = new XMLHttpRequest(); + let prevLoaded = 0; // number of bytes transmitted last time onprogress was called + let x = new XMLHttpRequest(); xhr[i] = x; - var ie11workaround; + let ie11workaround; if (settings.forceIE11Workaround) ie11workaround = true; else { try { @@ -474,7 +474,7 @@ function ulTest(done) { } } if (ie11workaround) { - // IE11 workarond: xhr.upload does not work properly, therefore we send a bunch of small 256k requests and use the onload event as progress. This is not precise, especially on fast connections + // IE11 workaround: xhr.upload does not work properly, therefore we send a bunch of small 256k requests and use the onload event as progress. This is not precise, especially on fast connections xhr[i].onload = xhr[i].onerror = function() { tverb("ul stream progress event (ie11wa)"); totLoaded += reqsmall.size; @@ -496,7 +496,7 @@ function ulTest(done) { } catch (e) {} } // just in case this XHR is still running after the upload test // progress event, add number of new loaded bytes to totLoaded - var loadDiff = event.loaded <= 0 ? 0 : event.loaded - prevLoaded; + const loadDiff = event.loaded <= 0 ? 0 : event.loaded - prevLoaded; if (isNaN(loadDiff) || !isFinite(loadDiff) || loadDiff < 0) return; // just in case totLoaded += loadDiff; prevLoaded = event.loaded; @@ -528,14 +528,14 @@ function ulTest(done) { ); }.bind(this); // open streams - for (var i = 0; i < settings.xhr_ulMultistream; i++) { + for (let i = 0; i < settings.xhr_ulMultistream; i++) { testStream(i, settings.xhr_multistreamDelay * i); } // every 200ms, update ulStatus interval = setInterval( function() { tverb("UL: " + ulStatus + (graceTimeDone ? "" : " (in grace time)")); - var t = new Date().getTime() - startT; + const t = new Date().getTime() - startT; if (graceTimeDone) ulProgress = (t + bonusT) / (settings.time_ul_max * 1000); if (t < 200) return; if (!graceTimeDone) { @@ -549,10 +549,10 @@ function ulTest(done) { graceTimeDone = true; } } else { - var speed = totLoaded / (t / 1000.0); + const speed = totLoaded / (t / 1000.0); if (settings.time_auto) { //decide how much to shorten the test. Every 200ms, the test is shortened by the bonusT calculated here - var bonus = (5.0 * speed) / 100000; + const bonus = (5.0 * speed) / 100000; bonusT += bonus > 400 ? 400 : bonus; } //update status @@ -584,20 +584,20 @@ function ulTest(done) { } else testFunction(); } // ping+jitter test, function done is called when it's over -var ptCalled = false; // used to prevent multiple accidental calls to pingTest +let ptCalled = false; // used to prevent multiple accidental calls to pingTest function pingTest(done) { tverb("pingTest"); if (ptCalled) return; else ptCalled = true; // pingTest already called? - var startT = new Date().getTime(); //when the test was started - var prevT = null; // last time a pong was received - var ping = 0.0; // current ping value - var jitter = 0.0; // current jitter value - var i = 0; // counter of pongs received - var prevInstspd = 0; // last ping time, used for jitter calculation + const startT = new Date().getTime(); //when the test was started + let prevT = null; // last time a pong was received + let ping = 0.0; // current ping value + let jitter = 0.0; // current jitter value + let i = 0; // counter of pongs received + let prevInstspd = 0; // last ping time, used for jitter calculation xhr = []; // ping function - var doPing = function() { + const doPing = function() { tverb("ping"); pingProgress = i / settings.count_ping; prevT = new Date().getTime(); @@ -608,13 +608,13 @@ function pingTest(done) { if (i === 0) { prevT = new Date().getTime(); // first pong } else { - var instspd = new Date().getTime() - prevT; + let instspd = new Date().getTime() - prevT; if (settings.ping_allowPerformanceApi) { try { //try to get accurate performance timing using performance api - var p = performance.getEntries(); + let p = performance.getEntries(); p = p[p.length - 1]; - var d = p.responseStart - p.requestStart; + let d = p.responseStart - p.requestStart; if (d <= 0) d = p.duration; if (d > 0 && d < instspd) instspd = d; } catch (e) { @@ -625,7 +625,7 @@ function pingTest(done) { //noticed that some browsers randomly have 0ms ping if (instspd < 1) instspd = prevInstspd; if (instspd < 1) instspd = 1; - var instjitter = Math.abs(instspd - prevInstspd); + const instjitter = Math.abs(instspd - prevInstspd); if (i === 1) ping = instspd; /* first ping, can't tell jitter yet*/ else { if (instspd < ping) ping = instspd; // update ping, if the instant ping is lower @@ -684,10 +684,10 @@ function sendTelemetry(done) { xhr = new XMLHttpRequest(); xhr.onload = function() { try { - var parts = xhr.responseText.split(" "); + const parts = xhr.responseText.split(" "); if (parts[0] == "id") { try { - var id = parts[1]; + let id = parts[1]; done(id); } catch (e) { done(null); @@ -702,12 +702,12 @@ function sendTelemetry(done) { done(null); }; xhr.open("POST", settings.url_telemetry + url_sep(settings.url_telemetry) + (settings.mpot ? "cors=true&" : "") + "r=" + Math.random(), true); - var telemetryIspInfo = { + const telemetryIspInfo = { processedString: clientIp, rawIspInfo: typeof ispInfo === "object" ? ispInfo : "" }; try { - var fd = new FormData(); + const fd = new FormData(); fd.append("ispinfo", JSON.stringify(telemetryIspInfo)); fd.append("dl", dlStatus); fd.append("ul", ulStatus); @@ -717,7 +717,7 @@ function sendTelemetry(done) { fd.append("extra", settings.telemetry_extra); xhr.send(fd); } catch (ex) { - var postData = "extra=" + encodeURIComponent(settings.telemetry_extra) + "&ispinfo=" + encodeURIComponent(JSON.stringify(telemetryIspInfo)) + "&dl=" + encodeURIComponent(dlStatus) + "&ul=" + encodeURIComponent(ulStatus) + "&ping=" + encodeURIComponent(pingStatus) + "&jitter=" + encodeURIComponent(jitterStatus) + "&log=" + encodeURIComponent(settings.telemetry_level > 1 ? log : ""); + const postData = "extra=" + encodeURIComponent(settings.telemetry_extra) + "&ispinfo=" + encodeURIComponent(JSON.stringify(telemetryIspInfo)) + "&dl=" + encodeURIComponent(dlStatus) + "&ul=" + encodeURIComponent(ulStatus) + "&ping=" + encodeURIComponent(pingStatus) + "&jitter=" + encodeURIComponent(jitterStatus) + "&log=" + encodeURIComponent(settings.telemetry_level > 1 ? log : ""); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(postData); } diff --git a/web/assets/styling/button.css b/web/assets/styling/button.css new file mode 100644 index 0000000..7a25829 --- /dev/null +++ b/web/assets/styling/button.css @@ -0,0 +1,83 @@ +/* The main "start the test" button and the share button */ + +button { + height: 6.8rem; + min-width: 26.4rem; + padding: 0 5rem; + margin: 2.5rem; + border-radius: 3.4rem; + border: 0; + + font-family: "Inter", sans-serif; + font-size: 2rem; + font-weight: 700; + letter-spacing: -0.1rem; + color: var(--button-text-color); + text-transform: uppercase; + cursor: pointer; + box-shadow: 0 0.4rem 1.6rem 0 var(--button-shadow-color); + + will-change: transform; + backface-visibility: hidden; + transform: scale(1) translate3d(0, 0, 0) perspective(1px); + + background: var(--button-gradient-1-color-1); + transition: background-position 0.2s, transform 0.2s; + background-position: 0% 0%; + background: linear-gradient( + 92.97deg, + var(--button-gradient-1-color-1) 0%, + var(--button-gradient-1-color-1) 33%, + var(--button-gradient-1-color-2) 40%, + var(--button-gradient-1-color-3) 66.71%, + var(--button-gradient-1-color-3) 100% + ); + background-size: 300% 100%; + + &.disabled { + cursor: default; + transform: scale(1) translate3d(0, 0, 0) perspective(1px); + background: var(--button-disabled-background-color); + } + &.small { + height: 4.7rem; + min-width: 20.2rem; + text-transform: lowercase; + } + &.inverted { + border: 1px solid var(--button-gradient-1-color-1); + color: transparent; + background-clip: text; + } + &.hidden { + opacity: 0; + pointer-events: none; + } + &:hover { + background-position: 60% 0%; + transform: scale(1.03) translate3d(0, 0, 0) perspective(1px); + } + &.active, + &:active { + background-position: 100% 0%; + animation: pulse 0.7s; + } +} + +@keyframes pulse { + 0% { + transform: scale(1.03) translate3d(0, 0, 0) perspective(1px); + } + 20% { + transform: scale(1.2) translate3d(0, 0, 0) perspective(1px); + } + 40% { + transform: scale(1) translate3d(0, 0, 0) perspective(1px); + } + 60% { + transform: scale(1.1) translate3d(0, 0, 0) perspective(1px); + } + 100% { + transform: scale(1) translate3d(0, 0, 0) perspective(1px); + } +} diff --git a/web/assets/styling/colors.css b/web/assets/styling/colors.css new file mode 100644 index 0000000..6a948d4 --- /dev/null +++ b/web/assets/styling/colors.css @@ -0,0 +1,36 @@ +:root { + --theme-green: #5cf9fd; + --theme-pink: #d63bc6; + + --background-backup-color: #0e0720; + --background-overlay-color: rgb(41 26 70 / 71%); + + --primary-text-color: #ffffff; + --tagline-text-color: var(--theme-green); + --secondary-text-color: #898591; + --primary-text-disabled-color: #888888; + --secondary-text-disabled-color: #2e7d7f; + + --button-text-color: #3e2f50; + --button-gradient-1-color-1: #f5f5f5; + --button-gradient-1-color-2: var(--theme-green); + --button-gradient-1-color-3: var(--theme-pink); + --button-shadow-color: #5cf9fd47; + --button-disabled-background-color: #a2a2a2; + + --server-selector-border-color: #625b6b; + --server-selector-hover-border-color: var(--theme-green); + --server-selector-background-color: #251b32; + --server-selector-hover-background-color: var(--server-selector-border-color); + + --gauge-background-color: #3e2f50; + --gauge-progress-color: #726c7a; + --gauge-pointer-green: #e2fbfc; + --gauge-pointer-pink: #d091ca; + + --ping-and-jitter-primary-text-color: #f5f5f5; + --ping-and-jitter-secondary-text-color: #7b7b7b; + + --popup-background-color: #251b32; + --popup-shadow-color: #000000; +} diff --git a/web/assets/styling/dialog.css b/web/assets/styling/dialog.css new file mode 100644 index 0000000..cfbfe03 --- /dev/null +++ b/web/assets/styling/dialog.css @@ -0,0 +1,132 @@ +/* Styling for the popups */ + +dialog { + flex-direction: column; + align-items: center; + justify-content: center; + width: 70vw; + height: 70vh; + margin: auto; + margin-top: 23rem; + + background: var(--popup-background-color); + border: none; + border-radius: 0.8rem; + + @media screen and (max-width: 800px) { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + max-width: 100vw; /* We need these overrides of browser defaults*/ + max-height: 100vh; + width: auto; + height: auto; + margin: 0; + } + + animation: fade-out 0.3s ease-out; + &[open] { + display: flex; + animation: fade-in 0.3s ease-out; + } + + & > .close-dialog { + display: flex; + align-items: center; + justify-content: center; + width: 4rem; + height: 4rem; + position: absolute; + top: 3rem; + right: 3rem; + + cursor: pointer; + } + + & > section { + max-width: 800px; + overflow-y: auto; + margin: 4rem 2rem 2rem 4rem; + padding: 0 2rem 0 0; + + & h1, + & h2 { + margin: 3rem 0 2rem 0; + font-size: 3.6rem; + font-weight: 400; + letter-spacing: -0.2rem; + color: var(--primary-text-color); + } + & h2 { + margin: 2rem 0 1rem 0; + font-size: 2.5rem; + } + + & p, + & li { + margin: 1rem 0 1rem 0; + font-size: 1.6rem; + line-height: 2.5rem; + font-weight: 400; + letter-spacing: -0.1rem; + color: var(--secondary-text-color); + } + + & ul { + list-style-position: inside; + margin: 1rem; + + & li { + margin: 0.1rem 0; + } + } + + & a { + font-size: 1.6rem; + font-weight: 700; + letter-spacing: -0.1rem; + color: var(--secondary-text-color); + text-underline-offset: 0.3rem; + transition: text-underline-offset 0.2s; + + &:hover { + color: var(--theme-green); + text-underline-offset: 0.5rem; + } + } + } +} + +@keyframes fade-in { + 0% { + opacity: 0; + transform: scale(0.6); + display: none; + } + 0.1% { + display: flex; + } + 100% { + opacity: 1; + transform: scale(1); + display: flex; + } +} + +@keyframes fade-out { + 0% { + opacity: 1; + transform: scale(1); + display: flex; + } + 99.9% { + display: flex; + } + 100% { + opacity: 0; + transform: scale(0.6); + display: none; + } +} diff --git a/web/assets/styling/fonts.css b/web/assets/styling/fonts.css new file mode 100644 index 0000000..abd7203 --- /dev/null +++ b/web/assets/styling/fonts.css @@ -0,0 +1,22 @@ +/* latin-ext */ +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(../fonts/Inter-latin-ext.woff2) format("woff2"); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, + U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +/* latin */ +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(../fonts/Inter-latin.woff2) format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/web/assets/styling/index.css b/web/assets/styling/index.css new file mode 100644 index 0000000..d8abd9c --- /dev/null +++ b/web/assets/styling/index.css @@ -0,0 +1,85 @@ +/** + * Design by fromScratch Studio - 2022, 2023 (fromscratch.io) + * Implementation in HTML/CSS/JS by Timendus - 2024 (https://github.com/Timendus) + * + * See https://github.com/librespeed/speedtest/issues/585 + */ + +@import url("colors.css"); +@import url("fonts.css"); +@import url("main.css"); +@import url("server-selector.css"); +@import url("button.css"); +@import url("results.css"); +@import url("dialog.css"); + +/* Setting up the basic structure */ + +* { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +html, +body { + min-height: 100vh; + width: 100vw; +} + +html { + background-color: var(--background-backup-color); + background-image: url("../images/background.jpeg"); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + font-size: 10px; + + @media screen and (max-width: 800px) { + font-size: 8px; + } +} + +body { + font-family: "Inter", sans-serif; + background-color: var(--background-overlay-color); + color: var(--primary-text-color); + display: flex; + flex-direction: column; +} + +/* Position the logo */ + +header { + padding: 4rem 7rem; + + @media screen and (max-width: 800px) { + padding: 7rem 2rem; + text-align: center; + } +} + +/* Position the source code link */ + +footer { + margin: auto auto 0 auto; + padding: 5rem; + + & > p.source a { + font-size: 1.6rem; + font-weight: 700; + letter-spacing: -0.1rem; + color: var(--theme-green); + text-underline-offset: 0.3rem; + transition: text-underline-offset 0.2s; + + &:hover { + color: var(--theme-pink); + text-underline-offset: 0.5rem; + } + } + + @media screen and (max-width: 800px) { + padding: 4rem; + } +} diff --git a/web/assets/styling/main.css b/web/assets/styling/main.css new file mode 100644 index 0000000..530ed4d --- /dev/null +++ b/web/assets/styling/main.css @@ -0,0 +1,58 @@ +/* Texts on the front page */ + +main { + text-align: center; + padding: 0 2rem; + flex: 1; + + & > h1 { + margin: 0.2rem; + font-size: 3.6rem; + font-weight: 400; + letter-spacing: -0.2rem; + color: var(--primary-text-color); + } + + & p { + margin-top: 8rem; + font-size: 1.6rem; + line-height: 2.5rem; + font-weight: 400; + letter-spacing: -0.1rem; + color: var(--secondary-text-color); + + &#privacy-warning { + min-height: 5.3rem; + + & > span { + font-weight: 700; + color: var(--theme-green); + } + &.hidden { + opacity: 0; + pointer-events: none; + } + } + } + + & > p.tagline { + margin-top: 0; + margin-bottom: 6rem; + font-size: 2rem; + color: var(--tagline-text-color); + } + + & a { + font-size: 1.6rem; + font-weight: 700; + letter-spacing: -0.1rem; + color: var(--secondary-text-color); + text-underline-offset: 0.3rem; + transition: text-underline-offset 0.2s; + + &:hover { + color: var(--theme-green); + text-underline-offset: 0.5rem; + } + } +} diff --git a/web/assets/styling/results.css b/web/assets/styling/results.css new file mode 100644 index 0000000..55a281e --- /dev/null +++ b/web/assets/styling/results.css @@ -0,0 +1,260 @@ +/* Variables */ + +:root { + --gauge-width: 32rem; + --gauge-height: 22rem; + --progress-width: 0.6rem; + --speed-width: 3rem; +} + +/* Layout for the gauges */ + +.gauge-layout { + display: flex; + flex-direction: row; + align-items: start; + justify-content: center; + gap: 5rem; + margin: 5rem auto 3rem auto; + + @media screen and (max-width: 1100px) { + display: grid; + grid-template-areas: + "download upload" + "ping jitter"; + justify-items: center; + justify-content: center; + + --gauge-width: min(40vw, 32rem); + --gauge-height: min(28vw, 22rem); + --progress-width: min(1.2vw, 0.6rem); + --speed-width: min(4vw, 3rem); + } + @media screen and (max-width: 500px) { + gap: 5rem 2rem; + } +} + +/* The download/upload speed gauges */ + +/** + * One thing I should really document here is the weird `transform: scale(1);` + * and `position: fixed` in this code. This is a nasty little trick to allow the + * gauge pointer to break out of the `overflow: hidden` of the .speed element. + * We need the `overflow: hidden` to hide the arc that's rotating into view when + * the value goes up. But we do want to see the full pointer, even when it's at + * zero. This degrades fairly gracefully into showing half of the pointer when + * browsers don't understand this. + * + * Trick taken from this article: + * https://medium.com/@thomas.ryu/css-overriding-the-parents-overflow-hidden-90c75a0e7296 + */ + +div.gauge { + position: relative; + transform: scale(1); + width: var(--gauge-width); + height: var(--gauge-height); + + &.download { + grid-area: download; + } + &.upload { + grid-area: upload; + } + + & > .progress, + & > .speed { + position: absolute; + top: 0; + left: 0; + width: var(--gauge-width); + height: calc(var(--gauge-width) / 2); + overflow: hidden; + + &:after, + &:before { + content: ""; + position: absolute; + box-sizing: border-box; + } + } + + & > .progress { + &:before, + &:after { + top: 0; + left: 0; + width: var(--gauge-width); + height: calc(var(--gauge-width) / 2); + + border-radius: 50% 50% 0 0 / 100% 100% 0 0; + border: var(--progress-width) solid var(--gauge-background-color); + border-bottom: 0; + + transform-origin: bottom center; + transform: rotate(var(--progress-rotation)); + transition: transform 0.2s linear; + } + &:after { + top: calc(var(--gauge-width) / 2); + + border-radius: 0 0 50% 50% / 0 0 100% 100%; + border: var(--progress-width) solid var(--gauge-background-color); + border-top: 0; + + transform-origin: top center; + } + } + + & > .speed { + &:before, + &:after { + transform: rotate(var(--speed-rotation)); + transition: transform 0.2s ease; + transition-timing-function: cubic-bezier(0.56, 0.04, 0.59, 0.91); + } + &:before { + position: fixed; + top: calc(var(--gauge-width) / 2 - var(--speed-width) / 3); + left: var(--progress-width); + width: 0; + height: 0; + + border-top: calc(var(--speed-width) / 3) solid transparent; + border-bottom: calc(var(--speed-width) / 3) solid transparent; + border-right: calc(var(--speed-width) * 0.97) solid + var(--gauge-background-color); + z-index: 1; + + transform-origin: calc(var(--gauge-width) / 2 - var(--progress-width)) + calc(var(--speed-width) / 3); + } + &:after { + top: calc(var(--gauge-width) / 2); + left: calc(var(--progress-width) - 0.1rem); + width: calc(var(--gauge-width) - var(--progress-width) * 2 + 0.2rem); + height: calc(var(--gauge-width) / 2 - var(--progress-width) + 0.1rem); + + border-radius: 0 0 50% 50% / 0 0 100% 100%; + border: var(--speed-width) solid var(--gauge-background-color); + border-top: 0; + + transform-origin: top center; + } + } + + &.enabled { + &.download { + & > .progress:after { + border-color: var(--theme-pink); + } + & > .speed { + &:before { + border-right-color: var(--gauge-pointer-pink); + } + &:after { + border-color: var(--theme-pink); + } + } + } + &.upload { + & > .progress:after { + border-color: var(--theme-green); + } + & > .speed { + &:before { + border-right-color: var(--gauge-pointer-green); + } + &:after { + border-color: var(--theme-green); + } + } + } + & > h1 > span { + color: var(--primary-text-color); + } + } + + & > h1, + & > h2 { + display: block; + position: absolute; + width: 100%; + font-family: "Inter", sans-serif; + font-size: 2.1rem; + letter-spacing: -0.1rem; + color: var(--secondary-text-color); + } + & > h1 { + bottom: calc(var(--gauge-height) - var(--gauge-width) / 2); + font-weight: 300; + + & > span { + font-size: 5.5rem; + font-weight: 200; + display: block; + color: var(--secondary-text-color); + letter-spacing: -0.3rem; + } + } + & > h2 { + bottom: 0; + font-weight: 700; + text-transform: uppercase; + } + + @media screen and (max-width: 500px) { + & > h1 { + font-size: 3vw; + + & > span { + font-size: 8vw; + } + } + + & > h2 { + font-size: 3vw; + } + } +} + +/* Styling for Ping and Jitter */ + +.ping, +.jitter { + grid-area: jitter; + display: flex; + align-items: end; + height: calc(var(--gauge-width) / 2); + width: 13rem; + + font-size: 2.1rem; + letter-spacing: -0.1rem; + font-weight: 300; + color: var(--ping-and-jitter-secondary-text-color); + + & > .label { + font-weight: 700; + } + & > .value { + color: var(--ping-and-jitter-primary-text-color); + } + + &.hidden { + display: none; + } + + @media screen and (max-width: 1100px) { + width: 100%; + height: auto; + justify-content: center !important; + } + @media screen and (max-width: 500px) { + font-size: 1.8rem; + } +} +.ping { + grid-area: ping; + justify-content: end; +} diff --git a/web/assets/styling/server-selector.css b/web/assets/styling/server-selector.css new file mode 100644 index 0000000..e614d63 --- /dev/null +++ b/web/assets/styling/server-selector.css @@ -0,0 +1,171 @@ +/* The server selector fake dropdown */ + +.server-selector { + position: relative; + width: 50rem; + margin: 0rem auto; + display: none; + + &.active { + display: block; + } + + @media screen and (max-width: 500px) { + width: 100%; + } + + & > .chosen { + position: relative; + height: 8.8rem; + + border: 1px solid var(--server-selector-border-color); + border-radius: 0.8rem; + background-color: var(--server-selector-background-color); + cursor: pointer; + transition: border-color 0.2s; + + &:hover { + border-color: var(--server-selector-hover-border-color); + } + + & > div.chevron { + content: ""; + position: absolute; + display: block; + width: 32px; + height: 32px; + right: 1.8rem; + top: 1rem; + } + + & > p { + margin: 0; + position: absolute; + left: 2.4rem; + top: 1.5rem; + font-size: 1.6rem; + font-weight: 400; + letter-spacing: -0.1rem; + color: var(--theme-green); + } + + & > h2 { + position: absolute; + left: 2.4rem; + right: 2.4rem; + bottom: 1rem; + + font-size: 2.4rem; + font-weight: 700; + letter-spacing: -0.2rem; + color: var(--primary-text-color); + text-align: left; + text-transform: uppercase; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + + & span { + font-weight: 400; + } + } + } + + /* Special case for when we have only one server */ + &.single-server { + & > .chosen { + cursor: default; + &:hover { + border-color: var(--server-selector-border-color); + } + & > div.chevron { + display: none; + } + } + } + + /* Overrides for when the test is running and the selector is disabled */ + &.disabled { + pointer-events: none; + + & > .chosen { + cursor: default; + &:hover { + border-color: var(--server-selector-border-color); + } + & > p { + color: var(--secondary-text-disabled-color); + } + & > h2 { + color: var(--primary-text-disabled-color); + } + } + } + + /* Styling for the list of servers that pops out */ + & > ul.servers { + position: absolute; + width: 50rem; + max-height: 70vh; + overflow-y: auto; + z-index: 1; + + border: 1px solid var(--server-selector-border-color); + border-radius: 0.8rem; + background-color: var(--server-selector-background-color); + list-style: none; + + transform: scaleY(0); + transform-origin: top; + transition: transform 0.1s; + + &.active { + transform: scaleY(1); + } + + @media screen and (max-width: 800px) { + width: 100%; + } + + & > li { + &:first-child a { + padding-top: 1.5rem; + } + &:last-child a { + padding-bottom: 1.5rem; + } + + & a { + display: block; + padding: 0.7rem 2.4rem; + + font-size: 2.4rem; + font-weight: 700; + letter-spacing: -0.2rem; + color: var(--sprint-text-color); + text-transform: uppercase; + text-decoration: none; + text-align: left; + cursor: pointer; + + transition: background-color 0.2s; + + & span { + font-weight: 400; + } + &:hover { + background-color: var(--server-selector-hover-background-color); + } + } + } + } + + /* Styling for the sponsor text under the dropdown */ + & > p.sponsor { + margin: 1rem 0 5rem 0; + + & a { + font-weight: 400; + } + } +} diff --git a/web/getip_util.go b/web/getip_util.go new file mode 100644 index 0000000..f988623 --- /dev/null +++ b/web/getip_util.go @@ -0,0 +1,120 @@ +package web + +import ( + "net" + "net/http" + "regexp" + "strings" +) + +// normalizeCandidateIP validates and normalizes an IP address candidate +// from a request header. It trims whitespace, takes the first comma-separated +// token (for XFF-like headers that may contain a chain), and validates. +func normalizeCandidateIP(raw string, ipv6 bool) string { + ip := strings.TrimSpace(raw) + // For XFF-like values, take the first address before a comma + if idx := strings.Index(ip, ","); idx != -1 { + ip = strings.TrimSpace(ip[:idx]) + } + if ip == "" { + return "" + } + if ipv6 { + parsed := net.ParseIP(ip) + if parsed != nil && parsed.To16() != nil && parsed.To4() == nil { + return strings.TrimPrefix(ip, "::ffff:") + } + return "" + } + parsed := net.ParseIP(ip) + if parsed != nil { + return strings.TrimPrefix(ip, "::ffff:") + } + return "" +} + +// getClientIP extracts the real client IP from the request using the following +// priority chain, mirroring the PHP getIP_util.php behavior: +// +// 1. CF-Connecting-IPv6 (Cloudflare, must be a valid IPv6) +// 2. Client-IP +// 3. X-Real-IP +// 4. X-Forwarded-For (first address in the chain) +// 5. RemoteAddr (fallback) +func getClientIP(r *http.Request) string { + // 1. Cloudflare IPv6 header — must be a valid IPv6 address + if cf := r.Header.Get("CF-Connecting-IPv6"); cf != "" { + if ip := normalizeCandidateIP(cf, true); ip != "" { + return strings.TrimPrefix(ip, "::ffff:") + } + } + + // 2–4. Other forwarding / proxy headers — accept any valid IP + for _, header := range []string{"Client-IP", "X-Real-IP", "X-Forwarded-For"} { + if v := r.Header.Get(header); v != "" { + if ip := normalizeCandidateIP(v, false); ip != "" { + return strings.TrimPrefix(ip, "::ffff:") + } + } + } + + // 5. Fallback: RemoteAddr set by the server + ip, _, err := net.SplitHostPort(r.RemoteAddr) + if err != nil { + // RemoteAddr may not have a port in some environments + ip = r.RemoteAddr + } + if parsed := net.ParseIP(ip); parsed != nil { + return strings.TrimPrefix(ip, "::ffff:") + } + + return "" +} + +// classifyPrivateIP returns a human-readable description if the IP is a +// private or special-purpose address, or an empty string otherwise. +// Mirrors the PHP getLocalOrPrivateIpInfo() function. +func classifyPrivateIP(ip string) string { + // Strip IPv4-mapped IPv6 prefix if present + ip = strings.TrimPrefix(ip, "::ffff:") + + switch { + case ip == "::1": + return "localhost IPv6 access" + case strings.HasPrefix(ip, "fe80:"): + return "link-local IPv6 access" + // ULA IPv6 (fc00::/7): fc00:: - fdff:ffff:... + case isULAIPv6(ip): + return "ULA IPv6 access" + case strings.HasPrefix(ip, "127."): + return "localhost IPv4 access" + case strings.HasPrefix(ip, "10."): + return "private IPv4 access" + case mustCompile(`^172\.(1[6-9]|2\d|3[01])\.`).MatchString(ip): + return "private IPv4 access" + case strings.HasPrefix(ip, "192.168"): + return "private IPv4 access" + case strings.HasPrefix(ip, "169.254"): + return "link-local IPv4 access" + case mustCompile(`^100\.([6-9][0-9]|1[0-2][0-7])\.`).MatchString(ip): + return "CGNAT IPv4 access" + } + return "" +} + +// isULAIPv6 checks if an IP is a Unique Local IPv6 Unicast Address (fc00::/7). +func isULAIPv6(ipStr string) bool { + ip := net.ParseIP(ipStr) + if ip == nil || ip.To16() == nil { + return false + } + // fc00::/7 means the first 7 bits are 1111110 + // So the first byte & 0xFE must equal 0xFC + return ip[0]&0xFE == 0xFC +} + +// mustCompile is a helper that compiles a regex and panics on error +// (safe to use for static patterns). +func mustCompile(pattern string) *regexp.Regexp { + return regexp.MustCompile(pattern) +} diff --git a/web/helpers.go b/web/helpers.go index d39a98e..9d187bb 100644 --- a/web/helpers.go +++ b/web/helpers.go @@ -5,10 +5,13 @@ import ( "encoding/json" "fmt" "io/ioutil" + "net" "net/http" + "os" "strconv" "strings" + "github.com/oschwald/maxminddb-golang" log "github.com/sirupsen/logrus" "github.com/umahmood/haversine" @@ -140,16 +143,147 @@ func calculateDistance(clientLocation string, unit string) string { } dist, km := haversine.Distance(clientCoord, serverCoord) - unitString := " mi" switch unit { case "km": dist = km - unitString = " km" + rounded := roundToNearest10(dist) + if dist < 20 { + return "<20 km" + } + return fmt.Sprintf("%.0f km", rounded) case "NM": dist = km * 0.539957 - unitString = " NM" + return fmt.Sprintf("%.2f NM", dist) + default: // miles + distMi := dist + rounded := roundToNearest10(distMi) + if distMi < 15 { + return "<15 mi" + } + return fmt.Sprintf("%.0f mi", rounded) + } +} + +// roundToNearest10 rounds a float64 to the nearest 10, matching PHP round($d, -1) +func roundToNearest10(val float64) float64 { + return float64(int64(val/10+0.5)) * 10 +} + +// GeoIP database holder (lazily opened on first use) +var ( + geoIPReader *maxminddb.Reader + geoIPOpened bool +) + +// getGeoIPData looks up the given IP in the configured GeoIP .mmdb database +// and returns ISP and country information if available. +// It returns nil if GeoIP is not configured or the lookup fails. +func getGeoIPData(ipStr string) *struct { + ASName string + CountryName string +} { + conf := config.LoadedConfig() + if conf.GeoIPDatabaseFile == "" { + return nil } - return fmt.Sprintf("%.2f%s", dist, unitString) + if !geoIPOpened { + geoIPOpened = true + if _, err := os.Stat(conf.GeoIPDatabaseFile); os.IsNotExist(err) { + log.Warnf("GeoIP database file not found: %s", conf.GeoIPDatabaseFile) + return nil + } + reader, err := maxminddb.Open(conf.GeoIPDatabaseFile) + if err != nil { + log.Warnf("Failed to open GeoIP database: %s", err) + return nil + } + geoIPReader = reader + } + + if geoIPReader == nil { + return nil + } + + ip := net.ParseIP(ipStr) + if ip == nil { + return nil + } + + // Try ipinfo.io offline database format first + var ipinfoResult map[string]interface{} + if err := geoIPReader.Lookup(ip, &ipinfoResult); err != nil { + log.Warnf("GeoIP lookup failed: %s", err) + return nil + } + + if len(ipinfoResult) == 0 { + return nil + } + + result := &struct { + ASName string + CountryName string + }{} + + // ipinfo.io offline format uses "as_name" and "country_name" + if v, ok := ipinfoResult["as_name"].(string); ok { + result.ASName = v + } + if v, ok := ipinfoResult["country_name"].(string); ok { + result.CountryName = v + } + + // If ipinfo format fields are empty, try standard MaxMind GeoIP2 format + if result.ASName == "" { + // Try autonomous_system > organization + if as, ok := ipinfoResult["autonomous_system"].(map[string]interface{}); ok { + if v, ok := as["organization"].(string); ok { + result.ASName = v + } + } + } + if result.CountryName == "" { + if country, ok := ipinfoResult["country"].(map[string]interface{}); ok { + if v, ok := country["names"].(map[string]interface{}); ok { + if n, ok := v["en"].(string); ok { + result.CountryName = n + } + } + } + // Fallback: direct "country" string field (as used by some GeoIP DBs) + if result.CountryName == "" { + if v, ok := ipinfoResult["country"].(string); ok { + result.CountryName = v + } + } + } + + if result.ASName == "" && result.CountryName == "" { + return nil + } + + return result +} + +// getISPInfoByPriority tries to fetch ISP info using the ipinfo.io API first, +// then falls back to the configured offline GeoIP database, mirroring PHP behavior. +func getISPInfoByPriority(addr string) results.IPInfoResponse { + // First try: ipinfo.io API + info := getIPInfo(addr) + if info.Organization != "" || info.Country != "" { + return info + } + + // Second try: offline GeoIP database + geo := getGeoIPData(addr) + if geo != nil { + info.Organization = geo.ASName + info.Country = geo.CountryName + return info + } + + // Fallback: empty result (will show IP only) + return info } diff --git a/web/web.go b/web/web.go index 785d7bb..9fcc21f 100644 --- a/web/web.go +++ b/web/web.go @@ -11,7 +11,6 @@ import ( "os" "regexp" "strconv" - "strings" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" @@ -79,6 +78,8 @@ func ListenAndServe(conf *config.Config) error { r.Post(conf.BaseURL+"/backend/results/telemetry", results.Record) r.HandleFunc(conf.BaseURL+"/stats", results.Stats) r.HandleFunc(conf.BaseURL+"/backend/stats", results.Stats) + r.Get(conf.BaseURL+"/results/json", results.JSONResult) + r.Get(conf.BaseURL+"/backend/results/json", results.JSONResult) // PHP frontend default values compatibility r.HandleFunc(conf.BaseURL+"/empty.php", empty) @@ -91,6 +92,8 @@ func ListenAndServe(conf *config.Config) error { r.Post(conf.BaseURL+"/backend/results/telemetry.php", results.Record) r.HandleFunc(conf.BaseURL+"/stats.php", results.Stats) r.HandleFunc(conf.BaseURL+"/backend/stats.php", results.Stats) + r.Get(conf.BaseURL+"/results/json.php", results.JSONResult) + r.Get(conf.BaseURL+"/backend/results/json.php", results.JSONResult) go listenProxyProtocol(conf, r) @@ -132,6 +135,16 @@ func pages(fs http.FileSystem, BaseURL string) http.HandlerFunc { return fn } +// sendPHPCORSHeaders sets CORS headers matching the PHP backend's ?cors parameter behavior. +// This is for API compatibility with the PHP version; the global CORS middleware already handles CORS. +func sendPHPCORSHeaders(w http.ResponseWriter, r *http.Request) { + if r.FormValue("cors") == "true" { + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET, POST") + w.Header().Set("Access-Control-Allow-Headers", "Content-Encoding, Content-Type") + } +} + func empty(w http.ResponseWriter, r *http.Request) { _, err := io.Copy(ioutil.Discard, r.Body) if err != nil { @@ -140,11 +153,13 @@ func empty(w http.ResponseWriter, r *http.Request) { } _ = r.Body.Close() + sendPHPCORSHeaders(w, r) w.Header().Set("Connection", "keep-alive") w.WriteHeader(http.StatusOK) } func garbage(w http.ResponseWriter, r *http.Request) { + sendPHPCORSHeaders(w, r) w.Header().Set("Content-Description", "File Transfer") w.Header().Set("Content-Type", "application/octet-stream") w.Header().Set("Content-Disposition", "attachment; filename=random.dat") @@ -180,37 +195,17 @@ func garbage(w http.ResponseWriter, r *http.Request) { func getIP(w http.ResponseWriter, r *http.Request) { var ret results.Result - clientIP := r.RemoteAddr - clientIP = strings.ReplaceAll(clientIP, "::ffff:", "") + clientIP := getClientIP(r) - ip, _, err := net.SplitHostPort(r.RemoteAddr) - if err == nil { - clientIP = ip - } + // Add anti-cache headers matching PHP behavior + w.Header().Set("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, s-maxage=0") + w.Header().Add("Cache-Control", "post-check=0, pre-check=0") + w.Header().Set("Pragma", "no-cache") - isSpecialIP := true - switch { - case clientIP == "::1": - ret.ProcessedString = clientIP + " - localhost IPv6 access" - case strings.HasPrefix(clientIP, "fe80:"): - ret.ProcessedString = clientIP + " - link-local IPv6 access" - case strings.HasPrefix(clientIP, "127."): - ret.ProcessedString = clientIP + " - localhost IPv4 access" - case strings.HasPrefix(clientIP, "10."): - ret.ProcessedString = clientIP + " - private IPv4 access" - case regexp.MustCompile(`^172\.(1[6-9]|2\d|3[01])\.`).MatchString(clientIP): - ret.ProcessedString = clientIP + " - private IPv4 access" - case strings.HasPrefix(clientIP, "192.168"): - ret.ProcessedString = clientIP + " - private IPv4 access" - case strings.HasPrefix(clientIP, "169.254"): - ret.ProcessedString = clientIP + " - link-local IPv4 access" - case regexp.MustCompile(`^100\.([6-9][0-9]|1[0-2][0-7])\.`).MatchString(clientIP): - ret.ProcessedString = clientIP + " - CGNAT IPv4 access" - default: - isSpecialIP = false - } + sendPHPCORSHeaders(w, r) - if isSpecialIP { + if desc := classifyPrivateIP(clientIP); desc != "" { + ret.ProcessedString = clientIP + " - " + desc b, _ := json.Marshal(&ret) if _, err := w.Write(b); err != nil { log.Errorf("Error writing to client: %s", err) @@ -224,7 +219,7 @@ func getIP(w http.ResponseWriter, r *http.Request) { ret.ProcessedString = clientIP if getISPInfo { - ispInfo := getIPInfo(clientIP) + ispInfo := getISPInfoByPriority(clientIP) ret.RawISPInfo = ispInfo removeRegexp := regexp.MustCompile(`AS\d+\s`)