First commit

This commit is contained in:
cangui 2025-07-27 16:26:30 +02:00
commit 7a965ed7c6
69 changed files with 185784 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/upload/

12
Dockerfile Normal file
View File

@ -0,0 +1,12 @@
FROM golang:1.24
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o shelfy .
CMD ["./shelfy"]

BIN
data/shelfly_db.db Normal file

Binary file not shown.

27
docker-compose.yml Normal file
View File

@ -0,0 +1,27 @@
version: "3.9"
services:
go-app:
image: golang:1.24 # Image officielle Go 1.24, on build en local
container_name: shelfy-go
working_dir: /app
volumes:
- ./:/app # Code source monté pour le dev (remplace par ./build:/app pour de la prod)
- ./upload:/app/upload # Dossier upload persistant, PAS rebuild
- go-modules:/go/pkg/mod # Cache des modules Go
ports:
- "8080:8080" # HTTP
- "2121:2121" # FTP
command: >
sh -c "go mod tidy &&
go build -o shelfy . &&
./shelfy"
labels:
- traefik.http.routers.shelfy.middlewares=webdav-allow-methods@docker
- traefik.http.middlewares.webdav-allow-methods.headers.accesscontrolallowmethods=GET,PUT,POST,DELETE,PROPFIND,OPTIONS,LOCK,UNLOCK,HEAD
- traefik.http.middlewares.webdav-allow-methods.headers.accesscontrolallowheaders=Authorization,Depth,Content-Type,If-Modified-Since,User-Agent,Destination,Overwrite
restart: unless-stopped
volumes:
go-modules:

40
gen/main.go Normal file
View File

@ -0,0 +1,40 @@
package main
import (
"log"
"gorm.io/driver/sqlite"
"gorm.io/gen"
"gorm.io/gorm"
"canguidev/shelfy/internal/models"
)
// Dynamic SQL
type Querier interface {
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
FilterWithNameAndRole(name, role string) ([]gen.T, error)
}
func main() {
g := gen.NewGenerator(gen.Config{
OutPath: "../query",
Mode: gen.WithoutContext|gen.WithDefaultQuery|gen.WithQueryInterface, // generate mode
})
dbName:="../data/shelfly_db.db"
db, err := gorm.Open(sqlite.Open(dbName), &gorm.Config{})
if err != nil {
log.Fatalf("Erreur de connexion à la base de données : %v", err)
}
g.UseDB(db) // reuse your gorm db
// Generate basic type-safe DAO API for struct `model.User` following conventions
g.ApplyBasic(models.User{},models.Files{})
// Generate Type Safe API with Dynamic SQL defined on Querier interface for `model.User` and `model.Company`
g.ApplyInterface(func(Querier){},models.User{},models.Files{},models.LibrarySection{},models.MediaItem{},models.MediaPart{},models.MetadataItem{},models.SectionLocation{},models.Tag{},models.Tagging{},models.PathDownload{})
// Generate the code
g.Execute()
}

62
go.mod Normal file
View File

@ -0,0 +1,62 @@
module canguidev/shelfy
go 1.24.5
require (
github.com/fclairamb/ftpserverlib v0.26.0
github.com/spf13/afero v1.14.0
gorm.io/driver/sqlite v1.6.0
gorm.io/gen v0.3.27
gorm.io/plugin/dbresolver v1.6.2
)
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/fclairamb/go-log v0.6.0 // indirect
github.com/go-sql-driver/mysql v1.9.3 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/kr/pretty v0.3.0 // indirect
github.com/rogpeppe/go-internal v1.8.0 // indirect
golang.org/x/mod v0.26.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/tools v0.35.0 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gorm.io/datatypes v1.2.6 // indirect
gorm.io/driver/mysql v1.6.0 // indirect
gorm.io/hints v1.1.2 // indirect
)
require (
github.com/bytedance/sonic v1.14.0 // indirect
github.com/bytedance/sonic/loader v0.3.0 // indirect
github.com/cloudwego/base64x v0.1.5 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
github.com/gin-contrib/sse v1.1.0 // indirect
github.com/gin-gonic/gin v1.10.1
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.27.0 // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible
github.com/golang-jwt/jwt/v4 v4.5.2
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.29 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.3.0 // indirect
golang.org/x/arch v0.19.0 // indirect
golang.org/x/crypto v0.40.0
golang.org/x/net v0.42.0 // indirect
golang.org/x/sys v0.34.0 // indirect
golang.org/x/text v0.27.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gorm.io/gorm v1.30.1
)

179
go.sum Normal file
View File

@ -0,0 +1,179 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=
github.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=
github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
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/fclairamb/ftpserverlib v0.26.0 h1:86K7qms8rrguRYQ4hxVMVl5HBSymUlqu+enjdk9Ug5A=
github.com/fclairamb/ftpserverlib v0.26.0/go.mod h1:XMm3NdvCvmBtoAVK86oERDVmoYo0GTNS5gdds4f9lpM=
github.com/fclairamb/go-log v0.5.0 h1:Gz9wSamEaA6lta4IU2cjJc2xSq5sV5VYSB5w/SUHhVc=
github.com/fclairamb/go-log v0.5.0/go.mod h1:XoRO1dYezpsGmLLkZE9I+sHqpqY65p8JA+Vqblb7k40=
github.com/fclairamb/go-log v0.6.0 h1:1V7BJ75P2PvanLHRyGBBFjncB6d4AgEmu+BPWKbMkaU=
github.com/fclairamb/go-log v0.6.0/go.mod h1:cyXxOw4aJwO6lrZb8GRELSw+sxO6wwkLJdsjY5xYCWA=
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ=
github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4=
github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
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/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA=
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=
github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/mattn/go-sqlite3 v1.14.29 h1:1O6nRLJKvsi1H2Sj0Hzdfojwt8GiGKm+LOfLaBFaouQ=
github.com/mattn/go-sqlite3 v1.14.29/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA=
github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
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/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/secsy/goftp v0.0.0-20200609142545-aa2de14babf4 h1:PT+ElG/UUFMfqy5HrxJxNzj3QBOf7dZwupeVC+mG1Lo=
github.com/secsy/goftp v0.0.0-20200609142545-aa2de14babf4/go.mod h1:MnkX001NG75g3p8bhFycnyIjeQoOjGL6CEIsdE/nKSY=
github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA=
github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
golang.org/x/arch v0.19.0 h1:LmbDQUodHThXE+htjrnmVD73M//D9GTH6wFZjyDkjyU=
golang.org/x/arch v0.19.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/datatypes v1.2.6 h1:KafLdXvFUhzNeL2ncm03Gl3eTLONQfNKZ+wJ+9Y4Nck=
gorm.io/datatypes v1.2.6/go.mod h1:M2iO+6S3hhi4nAyYe444Pcb0dcIiOMJ7QHaUXxyiNZY=
gorm.io/driver/mysql v1.6.0 h1:eNbLmNTpPpTOVZi8MMxCi2aaIm0ZpInbORNXDwyLGvg=
gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo=
gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U=
gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A=
gorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I=
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
gorm.io/driver/sqlserver v1.6.0 h1:VZOBQVsVhkHU/NzNhRJKoANt5pZGQAS1Bwc6m6dgfnc=
gorm.io/driver/sqlserver v1.6.0/go.mod h1:WQzt4IJo/WHKnckU9jXBLMJIVNMVeTu25dnOzehntWw=
gorm.io/gen v0.3.27 h1:ziocAFLpE7e0g4Rum69pGfB9S6DweTxK8gAun7cU8as=
gorm.io/gen v0.3.27/go.mod h1:9zquz2xD1f3Eb/eHq4oLn2z6vDVvQlCY5S3uMBLv4EA=
gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs=
gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4=
gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
gorm.io/hints v1.1.2 h1:b5j0kwk5p4+3BtDtYqqfY+ATSxjj+6ptPgVveuynn9o=
gorm.io/hints v1.1.2/go.mod h1:/ARdpUHAtyEMCh5NNi3tI7FsGh+Cj/MIUlvNxCNCFWg=
gorm.io/plugin/dbresolver v1.6.0 h1:XvKDeOtTn1EIX6s4SrKpEH82q0gXVemhYjbYZFGFVcw=
gorm.io/plugin/dbresolver v1.6.0/go.mod h1:tctw63jdrOezFR9HmrKnPkmig3m5Edem9fdxk9bQSzM=
gorm.io/plugin/dbresolver v1.6.2 h1:F4b85TenghUeITqe3+epPSUtHH7RIk3fXr5l83DF8Pc=
gorm.io/plugin/dbresolver v1.6.2/go.mod h1:tctw63jdrOezFR9HmrKnPkmig3m5Edem9fdxk9bQSzM=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=

BIN
internal/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,589 @@
package client
import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"io"
"log"
"net/http"
"net/url"
"strings"
"time"
"gorm.io/gorm"
)
const baseURL = "https://debrid-link.com/api/v2/"
type Client struct {
http *http.Client
db *gorm.DB
clientID string
clientSecret string
account *DebridAccount
}
type DebridAccount struct {
ID uint `gorm:"primaryKey"`
Host string `gorm:"column:host" json:"host"`
Username string `gorm:"column:username" json:"username"`
Password string `gorm:"column:password" json:"password"`
IsActive bool `gorm:"column:is_active" json:"is_active"`
AccessToken string `gorm:"column:access_token"`
RefreshToken string `gorm:"column:refresh_token"`
ExpiresAt time.Time `gorm:"column:expires_at"`
CreatedAt time.Time `gorm:"autoCreateTime"`
UpdatedAt time.Time `gorm:"autoUpdateTime"`
}
type TokenResponse struct {
AccessToken string `json:"access_token"`
RefreshToken string `json:"refresh_token"`
ExpiresIn int64 `json:"expires_in"`
}
func NewClient(db *gorm.DB) *Client {
return &Client{
http: &http.Client{Timeout: 15 * time.Second},
db: db,
clientID: "bMs32shaby43qVGVKnkRqw",
clientSecret: "XRMJ8JNJtJZBsRP8gzBnYc6huLK2cqXay3ihKId9mt4",
}
}
func (c *Client) SetAccount(account *DebridAccount) {
c.account = account
}
func (c *Client) refreshAccessToken(ctx context.Context) error {
form := url.Values{}
form.Set("client_id", c.clientID)
form.Set("client_secret", c.clientSecret)
form.Set("grant_type", "refresh_token")
form.Set("refresh_token", c.account.RefreshToken)
req, err := http.NewRequestWithContext(ctx, http.MethodPost, baseURL+"oauth/token", strings.NewReader(form.Encode()))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := c.http.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode >= 400 {
b, _ := io.ReadAll(resp.Body)
return fmt.Errorf("refresh failed: %s", string(b))
}
var tokenResp TokenResponse
if err := json.NewDecoder(resp.Body).Decode(&tokenResp); err != nil {
return err
}
c.account.AccessToken = tokenResp.AccessToken
c.account.RefreshToken = tokenResp.RefreshToken
c.account.ExpiresAt = time.Now().Add(time.Duration(tokenResp.ExpiresIn) * time.Second)
return c.db.Save(c.account).Error
}
func (c *Client) ToggleActiveStatus(ctx context.Context, id uint) error {
if c.db == nil {
return errors.New("la connexion à la base de données est manquante")
}
var account DebridAccount
if err := c.db.First(&account, id).Error; err != nil {
return fmt.Errorf("compte introuvable : %w", err)
}
account.IsActive = !account.IsActive
account.UpdatedAt = time.Now()
if err := c.db.Save(&account).Error; err != nil {
return fmt.Errorf("échec de la mise à jour : %w", err)
}
return nil
}
// ===========================
// CRUD pour DebridAccount
// ===========================
func (c *Client) CreateDebridAccount(ctx context.Context, acc *DebridAccount) error {
return c.db.Create(acc).Error
}
func (c *Client) GetDebridAccount(ctx context.Context, id uint) (*DebridAccount, error) {
var acc DebridAccount
if err := c.db.First(&acc, id).Error; err != nil {
return nil, err
}
return &acc, nil
}
func (c *Client) ListDebridAccounts(ctx context.Context) ([]DebridAccount, error) {
var accounts []DebridAccount
if err := c.db.Order("id desc").Find(&accounts).Error; err != nil {
return nil, err
}
return accounts, nil
}
func (c *Client) UpdateDebridAccount(ctx context.Context, acc *DebridAccount) error {
return c.db.Save(acc).Error
}
func (c *Client) DeleteDebridAccount(ctx context.Context, id uint) error {
return c.db.Delete(&DebridAccount{}, id).Error
}
func (c *Client) RequestDeviceCodeWithCredentials(ctx context.Context, username, password string) (*DeviceCodeResponse, error) {
form := url.Values{}
log.Println("[DEBUG] Envoi device_code avec :")
log.Println("client_id:", c.clientID)
log.Println("username:", username)
log.Println("password (len):", len(password))
log.Println("scope:", form.Get("scope"))
log.Println("URL:", "https://debrid-link.com/api/oauth/device/code")
form.Set("client_id", c.clientID)
form.Set("grant_type", "password") // possible variation
form.Set("username", username)
form.Set("password", password)
form.Set("scope", "get.post.downloader get.post.seedbox get.account get.post.stream")
req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://debrid-link.com/api/oauth/device/code", strings.NewReader(form.Encode()))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := c.http.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode >= 400 {
body, _ := io.ReadAll(resp.Body)
return nil, fmt.Errorf("device code request failed: %s", string(body))
}
var result DeviceCodeResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
return nil, err
}
return &result, nil
}
func (c *Client) RequestDeviceCode(ctx context.Context) (*DeviceCodeResponse, error) {
form := url.Values{}
form.Set("client_id", c.clientID)
form.Set("scope", "get.post.downloader get.post.seedbox get.account")
req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://debrid-link.com/api/oauth/device/code", strings.NewReader(form.Encode()))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := c.http.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode >= 400 {
body, _ := io.ReadAll(resp.Body)
return nil, fmt.Errorf("device code request failed: %s", string(body))
}
var result DeviceCodeResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
return nil, err
}
return &result, nil
}
type DeviceCodeResponse struct {
DeviceCode string `json:"device_code"`
UserCode string `json:"user_code"`
VerificationURL string `json:"verification_url"`
ExpiresIn int `json:"expires_in"`
Interval int `json:"interval"`
}
func (c *Client) PasswordGrant(ctx context.Context, username, password string) (*TokenResponse, error) {
form := url.Values{}
form.Set("client_id", c.clientID)
form.Set("client_secret", c.clientSecret)
form.Set("grant_type", "password")
form.Set("username", username)
form.Set("password", password)
req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://debrid-link.com/api/oauth/token", strings.NewReader(form.Encode()))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := c.http.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode >= 400 {
body, _ := io.ReadAll(resp.Body)
return nil, fmt.Errorf("auth error: %s", string(body))
}
var tokens TokenResponse
if err := json.NewDecoder(resp.Body).Decode(&tokens); err != nil {
return nil, err
}
return &tokens, nil
}
func (c *Client) PollDeviceToken(ctx context.Context, deviceCode string, interval int) (*TokenResponse, error) {
form := url.Values{}
form.Set("client_id", c.clientID)
form.Set("grant_type", "urn:ietf:params:oauth:grant-type:device_code")
form.Set("code", deviceCode)
for {
select {
case <-ctx.Done():
return nil, ctx.Err()
case <-time.After(time.Duration(interval) * time.Second):
req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://debrid-link.com/api/oauth/token", strings.NewReader(form.Encode()))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := c.http.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode == 200 {
var tokens TokenResponse
if err := json.NewDecoder(resp.Body).Decode(&tokens); err != nil {
return nil, err
}
return &tokens, nil
}
body, _ := io.ReadAll(resp.Body)
if strings.Contains(string(body), "authorization_pending") {
continue // Attente de validation utilisateur
}
return nil, fmt.Errorf("device auth failed: %s", string(body))
}
}
}
func (c *Client) doJSON(ctx context.Context, method, path string, params url.Values, body, out interface{}) error {
if c.account == nil {
return errors.New("no active Debrid account")
}
if time.Now().After(c.account.ExpiresAt) {
if err := c.refreshAccessToken(ctx); err != nil {
return err
}
}
urlStr := baseURL + path
if params != nil {
urlStr += "?" + params.Encode()
}
var reqBody io.Reader
if body != nil {
b, err := json.Marshal(body)
if err != nil {
return err
}
reqBody = bytes.NewReader(b)
// 👇 DEBUG : afficher le body
log.Printf("➡️ [API %s] URL: %s\nBody: %s\n", method, urlStr, string(b))
} else {
log.Printf("➡️ [API %s] URL: %s (empty body)", method, urlStr)
}
req, err := http.NewRequestWithContext(ctx, method, urlStr, reqBody)
if err != nil {
return err
}
// 👇 DEBUG : afficher le header Authorization
authHeader := "Bearer " + c.account.AccessToken
log.Printf("➡️ Authorization Header: %s\n", authHeader)
req.Header.Set("Authorization", authHeader)
req.Header.Set("Content-Type", "application/json")
resp, err := c.http.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode >= 400 {
data, _ := io.ReadAll(resp.Body)
return fmt.Errorf("HTTP error %d: %s", resp.StatusCode, string(data))
}
if out != nil {
return json.NewDecoder(resp.Body).Decode(out)
}
return nil
}
// =========================== RSS ===========================
type RSSFeed struct {
ID string `json:"id" gorm:"column:id;primaryKey"`
URL string `json:"url" gorm:"column:url"`
Enabled bool `json:"enabled" gorm:"column:enabled"`
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}
type RSSItem struct {
Title string `json:"title" gorm:"column:title"`
Link string `json:"link" gorm:"column:link"`
PubDate time.Time `json:"pubDate" gorm:"column:pub_date"`
}
func (c *Client) ListRSS(ctx context.Context) ([]RSSFeed, error) {
var feeds []RSSFeed
if err := c.doJSON(ctx, "GET", "rss", nil, nil, &feeds); err != nil {
return nil, err
}
return feeds, nil
}
func (c *Client) AddRSS(ctx context.Context, url string) (*RSSFeed, error) {
var feed RSSFeed
body := map[string]string{"url": url}
if err := c.doJSON(ctx, "POST", "rss", nil, body, &feed); err != nil {
return nil, err
}
return &feed, nil
}
func (c *Client) TestRSS(ctx context.Context, url string) ([]RSSItem, error) {
var items []RSSItem
body := map[string]string{"url": url}
if err := c.doJSON(ctx, "POST", "rss/test", nil, body, &items); err != nil {
return nil, err
}
return items, nil
}
func (c *Client) DeleteRSS(ctx context.Context, id string) error {
return c.doJSON(ctx, "DELETE", fmt.Sprintf("rss/%s", id), nil, nil, nil)
}
// =========================== Seedbox ===========================
type Torrent struct {
ID string `json:"id" gorm:"column:id;primaryKey"`
Name string `json:"name" gorm:"column:name"`
Status string `json:"status" gorm:"column:status"`
Progress int `json:"progress" gorm:"column:progress"`
Added time.Time `json:"added" gorm:"column:added"`
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}
func (c *Client) ListTorrents(ctx context.Context) ([]Torrent, error) {
var torrents []Torrent
if err := c.doJSON(ctx, "GET", "seedbox/torrents", nil, nil, &torrents); err != nil {
return nil, err
}
return torrents, nil
}
func (c *Client) AddTorrent(ctx context.Context, link string) (*Torrent, error) {
var t Torrent
body := map[string]string{"link": link}
if err := c.doJSON(ctx, "POST", "seedbox/torrents", nil, body, &t); err != nil {
return nil, err
}
return &t, nil
}
func (c *Client) RemoveTorrents(ctx context.Context, ids []string) error {
body := map[string][]string{"ids": ids}
return c.doJSON(ctx, "DELETE", "seedbox/torrents", nil, body, nil)
}
// =========================== Downloader ===========================
type Link struct {
ID string `json:"id" gorm:"primaryKey;column:id"`
Name string `json:"name" gorm:"column:name"`
URL string `json:"url" gorm:"column:url"` // Lien d'origine
DownloadURL string `json:"downloadUrl" gorm:"column:download_url"` // Lien débridé direct
Host string `json:"host" gorm:"column:host"` // Nom de l'hébergeur
Size int64 `json:"size" gorm:"column:size"` // Taille en octets
Chunk int `json:"chunk" gorm:"column:chunk"` // Nombre de chunks
Expired bool `json:"expired" gorm:"column:expired"` // Lien expiré ou non
Created int64 `json:"created" gorm:"column:created"` // Timestamp
CreatedAt time.Time `gorm:"autoCreateTime"`
UpdatedAt time.Time `gorm:"autoUpdateTime"`
}
type StreamInfo struct {
ID string `json:"id" gorm:"primaryKey;column:id"`
StreamURL string `json:"streamUrl" gorm:"column:stream_url"`
DownloadURL string `json:"downloadUrl" gorm:"column:download_url"`
Type string `json:"type" gorm:"column:type"` // hls ou mp4
MimeType string `json:"mimetype" gorm:"column:mimetype"` // ex: video/mp4
Domain string `json:"domain" gorm:"column:domain"`
// Champs du fichier lié (ex : nom de la vidéo)
FileID string `json:"-" gorm:"column:file_id"` // lien avec le champ File.ID ci-dessous
FileName string `json:"-" gorm:"column:file_name"` // nom fichier
FileSize int64 `json:"-" gorm:"column:file_size"` // taille fichier
CreatedAt time.Time `gorm:"autoCreateTime"`
UpdatedAt time.Time `gorm:"autoUpdateTime"`
}
func (c *Client) ListLinks(ctx context.Context) ([]Link, error) {
var links []Link
if err := c.doJSON(ctx, "GET", "downloader/links", nil, nil, &links); err != nil {
return nil, err
}
return links, nil
}
func (c *Client) AddLink(ctx context.Context, link string) ([]Link, error) {
var envelope struct {
Success bool `json:"success"`
Value json.RawMessage `json:"value"`
}
body := map[string]string{"url": link}
// Requête brute
if err := c.doJSON(ctx, "POST", "downloader/add", nil, body, &envelope); err != nil {
return nil, err
}
var links []Link
switch envelope.Value[0] {
case '{':
var single Link
if err := json.Unmarshal(envelope.Value, &single); err != nil {
return nil, err
}
links = append(links, single)
case '[':
if err := json.Unmarshal(envelope.Value, &links); err != nil {
return nil, err
}
default:
return nil, errors.New("format de réponse inattendu")
}
return links, nil
}
func (c *Client) RemoveLinks(ctx context.Context, ids []string) error {
body := map[string][]string{"ids": ids}
return c.doJSON(ctx, "DELETE", "downloader/links", nil, body, nil)
}
// =========================== Files ===========================
type File struct {
ID string `json:"id" gorm:"column:id;primaryKey"`
Name string `json:"name" gorm:"column:name"`
Size int64 `json:"size" gorm:"column:size"`
Link string `json:"link" gorm:"column:link"`
ParentID string `json:"parent_id" gorm:"column:parent_id"`
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}
func (c *Client) ListFiles(ctx context.Context, parentID string) ([]File, error) {
var files []File
path := fmt.Sprintf("files/%s", parentID)
if err := c.doJSON(ctx, "GET", path, nil, nil, &files); err != nil {
return nil, err
}
return files, nil
}
// =========================== Stream ===========================
// func (c *Client) CreateTranscode(ctx context.Context, fileID, preset string) (string, error) {
// var resp struct{ TranscodeID string `json:"transcodeId"` }
// body := map[string]string{"fileId": fileID}
// if err := c.doJSON(ctx, "POST", "stream/transcode", nil, body, &resp); err != nil {
// return "", err
// }
// return resp.TranscodeID, nil
// }
func (c *Client) CreateTranscode(ctx context.Context, fileID string) (*StreamInfo, error) {
body := map[string]string{"id": fileID}
var raw struct {
Success bool `json:"success"`
Value struct {
ID string `json:"id"`
StreamURL string `json:"streamUrl"`
DownloadURL string `json:"downloadUrl"`
Type string `json:"type"`
MimeType string `json:"mimetype"`
Domain string `json:"domain"`
File struct {
ID string `json:"id"`
Name string `json:"name"`
Size int64 `json:"size"`
Source string `json:"source"`
} `json:"file"`
} `json:"value"`
}
path := "stream/transcode/add"
if err := c.doJSON(ctx, "POST", path, nil, body, &raw); err != nil {
return nil, err
}
info := &StreamInfo{
ID: raw.Value.ID,
StreamURL: raw.Value.StreamURL,
DownloadURL: raw.Value.DownloadURL,
Type: raw.Value.Type,
MimeType: raw.Value.MimeType,
Domain: raw.Value.Domain,
FileID: raw.Value.File.ID,
FileName: raw.Value.File.Name,
FileSize: raw.Value.File.Size,
}
return info, nil
}

BIN
internal/controllers/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,55 @@
package controllers
import (
"canguidev/shelfy/internal/models"
"fmt"
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
)
func Login(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
var authInput models.User
var user =models.User{}
if err := c.ShouldBindJSON(&authInput); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
d :=db.Where("Email = ?", authInput.Email).First(&user)
if d.Error != nil {
fmt.Println("Erreur lors de la requête :", d.Error)
} else {
// Afficher les données récupérées
fmt.Printf("Utilisateur trouvé : %+v\n", user)
}
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(authInput.Password)); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "failed to generate token"})
// w.WriteHeader(http.StatusUnauthorized)
return
}
generateToken := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"id": user.ID,
"exp": time.Now().Add(time.Hour * 24).Unix(),
})
token, err := generateToken.SignedString([]byte("SECRET"))
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "failed to generate token"})
}
c.JSON(200, gin.H{
"token": token,
})
}}

View File

@ -0,0 +1,90 @@
package controllers
import (
"canguidev/shelfy/internal/client"
"context"
"log"
"net/http"
"time"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
func PostDebridLogin(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
clt := client.NewClient(db)
var creds struct {
Username string `json:"username"`
Password string `json:"password"`
}
if err := c.ShouldBindJSON(&creds); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"})
return
}
deviceResp, err := clt.RequestDeviceCodeWithCredentials(c, creds.Username, creds.Password)
if err != nil {
log.Println("[OAuth2] Erreur device_code:", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "OAuth error: " + err.Error()})
return
}
go func() {
tokens, err := clt.PollDeviceToken(context.Background(), deviceResp.DeviceCode, deviceResp.Interval)
if err != nil {
log.Println("[OAuth2] Polling échoué:", err)
return
}
account := &client.DebridAccount{
Host: "debrid-link.com",
Username: creds.Username,
Password: creds.Password,
IsActive: true,
AccessToken: tokens.AccessToken,
RefreshToken: tokens.RefreshToken,
ExpiresAt: time.Now().Add(time.Duration(tokens.ExpiresIn) * time.Second),
}
if err := db.Create(account).Error; err != nil {
log.Println("[DB] Sauvegarde échouée:", err)
return
}
log.Println("[OAuth2] Compte sauvegardé")
}()
c.JSON(http.StatusOK, gin.H{
"message": "Device code retrieved successfully",
"user_code": deviceResp.UserCode,
"verify_url": deviceResp.VerificationURL,
"polling_delay": deviceResp.Interval,
})
}
}
func GetDebridAccounts(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
clt := client.NewClient(db)
accounts, err := clt.ListDebridAccounts(c)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to list accounts"})
return
}
c.JSON(http.StatusOK, gin.H{
"accounts": accounts,
})
}
}
func GetDebridStatus(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
username := c.Query("username")
var account client.DebridAccount
if err := db.Where("username = ? AND is_active = ?", username, true).First(&account).Error; err != nil {
c.JSON(http.StatusOK, gin.H{"active": false})
return
}
c.JSON(http.StatusOK, gin.H{"active": true})
}
}

View File

@ -0,0 +1,265 @@
package controllers
import (
"canguidev/shelfy/internal/client"
runner "canguidev/shelfy/internal/job"
"canguidev/shelfy/internal/models"
"context"
"log"
"net/http"
"os"
"path/filepath"
"regexp"
"strconv"
"strings"
"sync"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
func sanitizeFileName(name string) string {
return runner.SanitizeFileName(name)
}
var seriesRegex = regexp.MustCompile(`^(.+?)\.S\d{2}E\d{2}`)
var (
jobs = make(map[string]*runner.DownloadJob)
jobsMu sync.Mutex
)
func HandleAddJobsMultiple(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
// 1. Parsing des champs du formulaire
var form struct {
Links string `json:"links" form:"links" binding:"required"`
PathID string `json:"path_id" form:"path_id" binding:"required"`
}
// On tente d'abord le bind JSON
if err := c.ShouldBindJSON(&form); err != nil {
log.Printf("[DEBUG] Reçu links=%q | path_id=%q", form.Links, form.PathID)
// Si JSON échoue, on tente avec form-urlencoded
if err := c.ShouldBind(&form); err != nil {
log.Printf("[DEBUG] Reçu links=%q | path_id=%q", form.Links, form.PathID)
c.JSON(http.StatusBadRequest, gin.H{"error": "Champs requis manquants ou invalides"})
return
}
}
lines := strings.Split(form.Links, "\n")
baseID, err := strconv.ParseInt(form.PathID, 10, 64)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "ID de chemin invalide"})
return
}
// 2. Vérification du dossier principal
var basePath models.PathDownload
if err := db.First(&basePath, baseID).Error; err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Dossier principal introuvable"})
return
}
// 3. Initialisation Debrid-Link
ctx := context.Background()
clt := client.NewClient(db)
account := runner.GetFirstActiveAccount(clt)
if account == nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Aucun compte Debrid-Link actif"})
return
}
clt.SetAccount(account)
// 4. Résultats à retourner
var results []map[string]interface{}
// 5. Itération des liens
for _, link := range lines {
link = strings.TrimSpace(link)
if link == "" {
continue
}
links, err := clt.AddLink(ctx, link)
if err != nil {
log.Printf("Échec débridage de %s: %v", link, err)
results = append(results, gin.H{"link": link, "status": "failed", "error": err.Error()})
continue
}
for _, l := range links {
clean := sanitizeFileName(l.Name)
series := clean
if m := seriesRegex.FindStringSubmatch(clean); len(m) == 2 {
series = m[1]
}
assignID := int(basePath.ID)
if series != "" {
dirPath := filepath.Join(basePath.Path, series)
if err := os.MkdirAll(dirPath, os.ModePerm); err != nil {
log.Printf("Erreur création dossier %s: %v", dirPath, err)
}
var sub models.PathDownload
if err := db.Where("path = ?", dirPath).First(&sub).Error; err != nil {
if err == gorm.ErrRecordNotFound {
sub = models.PathDownload{Path: dirPath, PathName: series}
if err := db.Create(&sub).Error; err != nil {
log.Printf("Erreur création PathDownload: %v", err)
}
} else {
log.Printf("Erreur lecture PathDownload: %v", err)
}
}
assignID = int(sub.ID)
}
// streamInfo, err := clt.CreateTranscode(ctx, l.ID)
// if err != nil {
// log.Printf("Erreur transcode pour %s: %v", l.ID, err)
// }
job := &runner.DownloadJob{
ID: l.ID,
Link: l.DownloadURL,
Name: l.Name,
Status: "waiting",
PathID: assignID,
Size: l.Size,
Host: l.Host,
Progress: 0,
StreamURL: "",
}
// if streamInfo != nil {
// job.StreamURL = streamInfo.StreamURL
// }
if err := runner.RegisterJobWithDB(job, db); err != nil {
log.Printf("Erreur enregistrement job: %v", err)
results = append(results, gin.H{"link": l.URL, "status": "failed", "error": err.Error()})
continue
}
results = append(results, gin.H{"link": l.URL, "status": "added", "name": job.Name})
}
}
// 6. Broadcast au frontend
runner.Broadcast()
c.JSON(http.StatusOK, gin.H{
"message": "Traitement terminé",
"results": results,
})
}
}
func HandleStartJob(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
id := c.Param("id")
log.Printf("[StartJob] ID = %s", id)
// 1. Vérifie si le job est déjà en mémoire
jobsMu.Lock()
job, exists := jobs[id]
jobsMu.Unlock()
// 2. Sinon, récupère depuis la BDD
if !exists {
var j runner.DownloadJob
if err := db.First(&j, "id = ?", id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "Job introuvable"})
return
}
jobCopy := j
jobsMu.Lock()
jobs[id] = &jobCopy
job = &jobCopy
jobsMu.Unlock()
}
clt:= client.NewClient(db)
account := runner.GetFirstActiveAccount(clt)
if account == nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Aucun compte Debrid-Link actif"})
return
}
clt.SetAccount(account)
go runner.StartDownload(job, job.Link, clt, db)
runner.Broadcast()
c.Status(http.StatusNoContent)
}
}
func HandlePauseJob() gin.HandlerFunc {
return func(c *gin.Context) {
id := c.Param("id")
runner.UpdateJobStatus(id, "paused", nil)
runner.Broadcast()
c.Status(http.StatusNoContent)
}
}
func HandleResumeJob(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
id := c.Param("id")
jobsMu.Lock()
job, exists := jobs[id]
jobsMu.Unlock()
if !exists {
var j runner.DownloadJob
if err := db.First(&j, "id = ?", id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "Job introuvable"})
return
}
jobCopy := j
jobsMu.Lock()
jobs[id] = &jobCopy
job = &jobCopy
jobsMu.Unlock()
}
clt := client.NewClient(db)
account := runner.GetFirstActiveAccount(clt)
if account == nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Aucun compte actif"})
return
}
clt.SetAccount(account)
go runner.StartDownload(job, job.Link, clt, db)
runner.Broadcast()
c.Status(http.StatusNoContent)
}
}
func HandleDeleteJob(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
id := c.Param("id")
runner.DeleteJob(id, db)
go runner.Broadcast()
c.Status(http.StatusNoContent)
}
}
func HandleListJobs(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
var jobs []runner.DownloadJob
// Optionnel: filtrage (par user, status, etc.)
if err := db.Find(&jobs).Error; err != nil {
c.JSON(500, gin.H{"error": err.Error()})
return
}
c.JSON(200, gin.H{
"jobs": jobs,
})
}
}

View File

@ -0,0 +1,181 @@
package controllers
import (
"canguidev/shelfy/internal/models"
"net/http"
"net/url"
"os"
"path/filepath"
"strings"
"time"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
type Entry struct {
ID int64 `json:"ID"`
Name, Path string
IsDir bool
ModTime time.Time
Size int64
Children []Entry `json:"Children,omitempty"`
Url string `json:"Url,omitempty"` // <- Ajout ici
}
func listEntries(base, rel string) ([]Entry, error) {
dir := filepath.Join(base, rel)
fis, err := os.ReadDir(dir)
if err != nil {
return nil, err
}
out := make([]Entry, 0, len(fis))
for _, fi := range fis {
info, _ := fi.Info()
out = append(out, Entry{
Name: fi.Name(),
Path: filepath.ToSlash(filepath.Join(rel, fi.Name())),
IsDir: fi.IsDir(),
ModTime: info.ModTime(),
Size: info.Size(),
})
}
return out, nil
}
func StreamHandler(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
base := "upload"
cur := c.Query("path")
// Liste des dossiers du dossier racine
rootEntries, err := listEntries(base, "")
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to list root entries"})
return
}
var dirs []Entry
for _, e := range rootEntries {
if e.IsDir {
var pathDownload models.PathDownload
// Recherche par PathName (== e.Name)
db.Where("path_name = ?", e.Name).First(&pathDownload)
e.ID = pathDownload.ID // 0 si non trouvé
dirs = append(dirs, e)
}
}
// Liste du chemin courant
entries, err := listEntries(base, cur)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to list entries"})
return
}
for i := range entries {
var pathDownload models.PathDownload
db.Where("path_name = ?", entries[i].Name).First(&pathDownload)
entries[i].ID = pathDownload.ID // 0 si non trouvé
}
c.JSON(http.StatusOK, gin.H{
"dirs": dirs,
"entries": entries,
"currentPath": cur,
})
}
}
func DetailHandler() gin.HandlerFunc {
return func(c *gin.Context) {
base := "upload"
rel := c.Query("path")
rel = filepath.Clean("/" + rel)
rel = strings.TrimPrefix(rel, "/") // => chemin relatif à "upload"
absPath := filepath.Join(base, rel)
absPath, err := filepath.Abs(absPath)
if err != nil {
c.JSON(500, gin.H{"error": "Path error"})
return
}
baseAbs, err := filepath.Abs(base)
if err != nil {
c.JSON(500, gin.H{"error": "Base path error"})
return
}
if !strings.HasPrefix(absPath, baseAbs) {
c.JSON(403, gin.H{"error": "Access outside base directory is forbidden"})
return
}
info, err := os.Stat(absPath)
if err != nil {
c.JSON(404, gin.H{"error": "Path not found"})
return
}
type Entry struct {
ID int64 `json:"ID,omitempty"`
Name string `json:"Name"`
Path string `json:"Path"` // <--- Toujours RELATIF à "upload"
IsDir bool `json:"IsDir"`
ModTime time.Time `json:"ModTime"`
Size int64 `json:"Size"`
Children []Entry `json:"Children,omitempty"`
Url string `json:"Url,omitempty"` // <--- Lien d'accès au fichier
}
var buildTree func(absPath, relPath string, fi os.FileInfo) (Entry, error)
buildTree = func(absPath, relPath string, fi os.FileInfo) (Entry, error) {
entry := Entry{
Name: fi.Name(),
Path: relPath, // <-- toujours RELATIF à la racine upload
IsDir: fi.IsDir(),
ModTime: fi.ModTime(),
Size: fi.Size(),
}
if !fi.IsDir() {
entry.Url = "/api/v1/folders/file?path=" + url.QueryEscape(relPath)
}
if fi.IsDir() {
f, err := os.Open(absPath)
if err != nil {
return entry, err
}
defer f.Close()
files, err := f.Readdir(0)
if err != nil {
return entry, err
}
for _, child := range files {
childAbs := filepath.Join(absPath, child.Name())
childRel := filepath.Join(relPath, child.Name())
childEntry, err := buildTree(childAbs, childRel, child)
if err != nil {
continue
}
entry.Children = append(entry.Children, childEntry)
}
}
return entry, nil
}
rootEntry, err := buildTree(absPath, rel, info)
if err != nil {
c.JSON(500, gin.H{"error": "Tree error"})
return
}
c.JSON(200, rootEntry)
}
}

View File

@ -0,0 +1,187 @@
package controllers
import (
"canguidev/shelfy/internal/models"
"errors"
"net/http"
"os"
"strings"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
func CreateSavePath(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Content-Type", "application/json")
var pathDownload models.PathDownload
if err := c.ShouldBindJSON(&pathDownload); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"})
return
}
if pathDownload.PathName == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "PathName cannot be empty"})
return
}
fullPath := "/app/upload/" + pathDownload.PathName
if _, err := os.Stat(fullPath); err == nil {
c.JSON(http.StatusConflict, gin.H{"error": "Path already exists"})
return
}
if err := os.MkdirAll(fullPath, 0755); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create directory"})
return
}
pathDownload.Path = fullPath
if err := db.Create(&pathDownload).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save path"})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "Path created successfully",
"data": pathDownload,
})
}
}
func ReadAllSavePath(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Content-Type", "application/json")
var paths []models.PathDownload
if err := db.Find(&paths).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to retrieve paths"})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "Paths retrieved successfully",
"data": paths,
})
}
}
// UpdateSavePath met à jour un chemin enregistré et renomme le dossier
func UpdateSavePath(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Content-Type", "application/json")
id := c.Param("id")
var pathDownload models.PathDownload
if err := c.ShouldBindJSON(&pathDownload); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"})
return
}
var existingPath models.PathDownload
if err := db.First(&existingPath, "id = ?", id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "Path not found"})
return
}
oldFullPath := "/app/upload/" + existingPath.PathName
newFullPath := "/app/upload/" + pathDownload.PathName
if oldFullPath != newFullPath {
if err := os.Rename(oldFullPath, newFullPath); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to rename directory"})
return
}
}
existingPath.PathName = pathDownload.PathName
existingPath.Path = newFullPath
if err := db.Save(&existingPath).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update path"})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "Path updated successfully",
"data": existingPath,
})
}
}
// DeleteSavePath supprime un chemin et son dossier
func DeleteSavePath(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
id := c.Param("id")
var pathDownload models.PathDownload
if err := db.First(&pathDownload, "id = ?", id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "Path not found"})
return
}
fullPath := "/app/upload/" + pathDownload.PathName
if err := os.RemoveAll(fullPath); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete directory"})
return
}
if err := db.Delete(&pathDownload).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete path"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Path deleted successfully"})
}
}
// IsPathValid vérifie si un chemin est valide (nom et existence)
func IsPathValid(pathName string) error {
if pathName == "" {
return errors.New("PathName cannot be empty")
}
if strings.Contains(pathName, "/") || strings.Contains(pathName, "\\") {
return errors.New("PathName cannot contain '/' or '\\'")
}
fullPath := "/app/upload/" + pathName
if _, err := os.Stat(fullPath); err == nil {
return errors.New("Path already exists")
}
return nil
}
// PathValidationHandler vérifie la validité du chemin (POST uniquement)
func PathValidationHandler(c *gin.Context) {
if c.Request.Method != http.MethodPost {
c.JSON(http.StatusMethodNotAllowed, gin.H{"error": "Invalid request method"})
return
}
var requestBody struct {
PathName string `json:"pathName"`
}
if err := c.ShouldBindJSON(&requestBody); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request body"})
return
}
err := IsPathValid(requestBody.PathName)
response := gin.H{
"pathName": requestBody.PathName,
"status": "valid",
}
if err != nil {
response["status"] = "invalid"
response["error"] = err.Error()
c.JSON(http.StatusBadRequest, response)
return
}
c.JSON(http.StatusOK, response)
}

View File

@ -0,0 +1,16 @@
package controllers
import (
"net/http"
"github.com/gin-gonic/gin"
)
func TestPing()gin.HandlerFunc {
return func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
"service": "shelfy",
"version": "1.0.0", // optionnel
})
}}

View File

@ -0,0 +1,186 @@
package controllers
import (
"canguidev/shelfy/internal/models"
"canguidev/shelfy/query"
"context"
"log"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
)
// CreateUser crée un nouvel utilisateur
func CreateUser(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Content-Type", "application/json")
if c.Request.Body == nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Request body is empty"})
return
}
if c.ContentType() != "application/json" {
c.JSON(http.StatusUnsupportedMediaType, gin.H{"error": "Content-Type must be application/json"})
return
}
var u models.User
if err := c.ShouldBindJSON(&u); err != nil {
log.Printf("Erreur JSON : %v", err)
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"})
return
}
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
if err != nil {
log.Printf("Erreur hachage mot de passe : %v", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to hash password"})
return
}
u.Password = string(hashedPassword)
q := query.Use(db)
if err := q.User.Create(&u); err != nil {
log.Printf("Erreur création utilisateur : %v", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create user"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "User created successfully"})
}
}
// UpdateUser met à jour un utilisateur
func UpdateUser(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Content-Type", "application/json")
if c.Request.Body == nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Request body is empty"})
return
}
if c.ContentType() != "application/json" {
c.JSON(http.StatusUnsupportedMediaType, gin.H{"error": "Content-Type must be application/json"})
return
}
idStr := c.Param("id")
id, err := strconv.Atoi(idStr)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"})
return
}
q := query.Use(db)
u := q.User
ctx := context.Background()
user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First()
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
return
}
var usr models.User
if err := c.ShouldBindJSON(&usr); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"})
return
}
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(usr.Password), bcrypt.DefaultCost)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to hash password"})
return
}
user.Name = usr.Name
user.Username = usr.Username
user.Email = usr.Email
user.Password = string(hashedPassword)
if err := u.Save(user); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update user"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "User updated successfully"})
}
}
// DeleteUser supprime un utilisateur
func DeleteUser(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Content-Type", "application/json")
idStr := c.Param("id")
id, err := strconv.Atoi(idStr)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"})
return
}
q := query.Use(db)
u := q.User
ctx := context.Background()
user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First()
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
return
}
if _,err := u.Delete(user); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete user"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "User deleted successfully"})
}
}
// ReadAllUser retourne tous les utilisateurs
func ReadAllUser(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Content-Type", "application/json")
q := query.Use(db)
users, err := q.User.Find()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch users"})
return
}
c.JSON(http.StatusOK, users)
}
}
// FindUserById retourne un utilisateur par son ID
func FindUserById(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Content-Type", "application/json")
idStr := c.Param("id")
id, err := strconv.Atoi(idStr)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"})
return
}
q := query.Use(db)
u := q.User
ctx := context.Background()
user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First()
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
return
}
c.JSON(http.StatusOK, user)
}
}

78
internal/db/db.go Normal file
View File

@ -0,0 +1,78 @@
package db
import (
"canguidev/shelfy/internal/client"
runner "canguidev/shelfy/internal/job"
"canguidev/shelfy/internal/models"
"fmt"
"log"
"os"
"path/filepath"
"golang.org/x/crypto/bcrypt"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func InitDB() *gorm.DB {
dbPath := "data/shelfly_db.db"
// Crée le dossier parent s'il n'existe pas
if err := os.MkdirAll(filepath.Dir(dbPath), os.ModePerm); err != nil {
panic(fmt.Sprintf("Erreur lors de la création du dossier : %v", err))
}
// Connexion à SQLite
db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
if err != nil {
panic(fmt.Sprintf("Échec de connexion à SQLite : %v", err))
}
// Auto migration
if err := db.AutoMigrate(&models.User{},&models.PathDownload{},&client.DebridAccount{},&runner.DownloadJob{}); err != nil {
panic(fmt.Sprintf("Erreur d'auto-migration : %v", err))
}
InitDefaultAdmin(db)
fmt.Println("✅ SQLite initialisé correctement.")
return db
}
func InitDefaultAdmin(db *gorm.DB) {
const email = "canguijc@gmail.com"
const username = "admin"
const name = "Admin"
const password = "GHT30k7!"
var user models.User
result := db.Where("email = ?", email).First(&user)
if result.Error == gorm.ErrRecordNotFound {
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
log.Fatalf("Erreur lors du hash du mot de passe: %v", err)
}
newUser := models.User{
Email: email,
Username: username,
Name: name,
Password: string(hashedPassword),
}
if err := db.Create(&newUser).Error; err != nil {
log.Fatalf("Erreur lors de la création de l'utilisateur admin: %v", err)
}
log.Println("✅ Utilisateur administrateur créé avec succès")
} else if result.Error != nil {
log.Fatalf("Erreur lors de la vérification de l'utilisateur admin: %v", result.Error)
} else {
log.Println(" L'utilisateur administrateur existe déjà")
}
}

566
internal/job/runner.go Normal file
View File

@ -0,0 +1,566 @@
package runner
import (
"archive/zip"
"canguidev/shelfy/internal/client"
"canguidev/shelfy/internal/models"
"context"
"errors"
"fmt"
"io"
"log"
"net/http"
"os"
"os/exec"
"path/filepath"
"regexp"
"strings"
"sync"
"time"
"gorm.io/gorm"
)
type DownloadJob struct {
ID string `gorm:"primaryKey;column:id"`
Link string `gorm:"column:link"`
Name string `gorm:"column:name"`
Status string `gorm:"column:status"`
PathID int `gorm:"column:path_id"` // 👈 int pas uint
Size int64 `gorm:"column:size"`
Host string `gorm:"column:host"`
Progress int `gorm:"column:progress"` // 👈 int
StreamURL string `gorm:"column:stream_url"`
Speed int `gorm:"column:speed;default:0"` // vitesse en Ko/s
CreatedAt time.Time `gorm:"autoCreateTime"`
UpdatedAt time.Time `gorm:"autoUpdateTime"`
}
var (
jobs = make(map[string]*DownloadJob)
jobsMu sync.Mutex
)
func GetFirstActiveAccount(client *client.Client) *client.DebridAccount {
ctx := context.Background() // ✅ on remplace ici
accounts, err := client.ListDebridAccounts(ctx)
if err != nil {
log.Println("[ERROR] Impossible de récupérer les comptes :", err)
return nil
}
for _, acc := range accounts {
if acc.IsActive {
return &acc
}
}
return nil
}
// Enregistre un job en mémoire et en base
func RegisterJobWithDB(job *DownloadJob, db *gorm.DB) error {
var existing DownloadJob
// On cherche le job existant SANS les soft deletes si jamais ils sont activés par erreur
err := db.Unscoped().First(&existing, "id = ?", job.ID).Error
if err == nil {
// Le job existe déjà, on le met à jour
log.Printf("[INFO] Mise à jour du job existant : %s\n", job.ID)
err = db.Model(&existing).Updates(map[string]interface{}{
"link": job.Link,
"name": job.Name,
"status": job.Status,
"path_id": job.PathID,
"size": job.Size,
"host": job.Host,
"progress": job.Progress,
"stream_url": job.StreamURL,
"updated_at": time.Now(),
}).Error
if err != nil {
log.Printf("[ERROR] Échec de la mise à jour : %v\n", err)
return err
}
} else if errors.Is(err, gorm.ErrRecordNotFound) {
// Le job n'existe pas, on le crée
if err := db.Create(job).Error; err != nil {
log.Printf("[ERROR] Insertion échouée : %v\n", err)
return err
}
log.Printf("[INFO] Nouveau job enregistré : %s\n", job.ID)
} else {
// Une erreur inattendue
log.Printf("[ERROR] Erreur inattendue lors de la recherche du job : %v\n", err)
return err
}
// Mise à jour en mémoire
jobsMu.Lock()
jobs[job.ID] = job
jobsMu.Unlock()
return nil
}
// Charge tous les jobs depuis la base en mémoire (au démarrage)
func InitJobsFromDB(db *gorm.DB) error {
var jobList []DownloadJob
if err := db.Find(&jobList).Error; err != nil {
return err
}
jobsMu.Lock()
defer jobsMu.Unlock()
for _, j := range jobList {
jobCopy := j
jobs[j.ID] = &jobCopy
}
log.Printf("[JOB] %d jobs rechargés depuis la base\n", len(jobs))
return nil
}
// Met à jour le status dun job et le persiste
func UpdateJobStatus(id string, status string, db *gorm.DB) {
jobsMu.Lock()
defer jobsMu.Unlock()
if job, ok := jobs[id]; ok {
job.Status = status
job.UpdatedAt = time.Now()
if db != nil {
_ = db.Save(job)
}
}
Broadcast()
}
// Met à jour la progression dun job et le persiste
func UpdateJobProgress(id string, progress int, db *gorm.DB) {
jobsMu.Lock()
defer jobsMu.Unlock()
if job, ok := jobs[id]; ok {
job.Progress = progress
job.UpdatedAt = time.Now()
if db != nil {
_ = db.Save(job)
}
}
}
// Supprime un job (mémoire uniquement)
func DeleteJob(id string, db *gorm.DB) error {
// Supprime en mémoire
jobsMu.Lock()
delete(jobs, id)
jobsMu.Unlock()
// Supprime en base
if err := db.Delete(&DownloadJob{}, "id = ?", id).Error; err != nil {
log.Printf("[ERROR] Échec de suppression du job en base : %v\n", err)
return err
}
log.Printf("[JOB] Supprimé : %s\n", id)
return nil
}
// Liste tous les jobs
func ListJobs(db *gorm.DB) []*DownloadJob {
var jobsFromDB []*DownloadJob
if err := db.Order("created_at desc").Find(&jobsFromDB).Error; err != nil {
log.Printf("[ERROR] Impossible de charger les jobs depuis la base : %v\n", err)
return []*DownloadJob{}
}
return jobsFromDB
}
func StartDownload(job *DownloadJob, downloadURL string, client *client.Client, db *gorm.DB) {
UpdateJobStatus(job.ID, "downloading", db)
var path models.PathDownload
if err := db.First(&path, job.PathID).Error; err != nil {
UpdateJobStatus(job.ID, "failed", db)
return
}
resp, err := http.Head(downloadURL)
if err != nil || resp.StatusCode != http.StatusOK {
UpdateJobStatus(job.ID, "failed", db)
return
}
size := resp.ContentLength
if size <= 0 {
UpdateJobStatus(job.ID, "failed", db)
return
}
acceptRanges := resp.Header.Get("Accept-Ranges")
if acceptRanges != "bytes" {
log.Println("[INFO] Serveur ne supporte pas Range, fallback single thread")
StartDownloadSingleThread(job, downloadURL, db, path.Path)
return
}
const numSegments = 4
segmentSize := size / numSegments
tmpFiles := make([]string, numSegments)
wg := sync.WaitGroup{}
progressChan := make(chan int64, 100)
done := make(chan bool)
// Progression + Vitesse
var downloaded int64
go func() {
var lastTotal int64 = 0
lastUpdate := time.Now()
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
for {
select {
case n := <-progressChan:
downloaded += n
case <-ticker.C:
elapsed := time.Since(lastUpdate).Seconds()
if elapsed > 0 {
speed := int(float64(downloaded-lastTotal) / elapsed / 1024) // en Ko/s
lastTotal = downloaded
lastUpdate = time.Now()
progress := int((downloaded * 100) / size)
// Update en base
db.Model(&DownloadJob{}).Where("id = ?", job.ID).Updates(map[string]interface{}{
"progress": progress,
"speed": speed,
})
Broadcast()
}
case <-done:
return
}
}
}()
// Téléchargement parallèle
for i := 0; i < numSegments; i++ {
start := int64(i) * segmentSize
end := start + segmentSize - 1
if i == numSegments-1 {
end = size - 1
}
tmpPath := filepath.Join(os.TempDir(), fmt.Sprintf("%s.part%d", job.ID, i))
tmpFiles[i] = tmpPath
wg.Add(1)
go func(start, end int64, tmpPath string) {
defer wg.Done()
err := downloadSegment(downloadURL, start, end, tmpPath, progressChan)
if err != nil {
log.Printf("[ERROR] Segment %d-%d échoué : %v\n", start, end, err)
}
}(start, end, tmpPath)
}
wg.Wait()
close(done)
// Fusion
safeName := SanitizeFileName(job.Name)
finalPath := generateUniqueFilePath(path.Path, safeName)
out, err := os.Create(finalPath)
if err != nil {
UpdateJobStatus(job.ID, "failed", db)
return
}
defer out.Close()
for _, tmpPath := range tmpFiles {
part, err := os.Open(tmpPath)
if err != nil {
UpdateJobStatus(job.ID, "failed", db)
return
}
io.Copy(out, part)
part.Close()
os.Remove(tmpPath)
}
ext := strings.ToLower(filepath.Ext(finalPath))
videoExts := map[string]bool{".mkv": true, ".avi": true, ".mp4": true}
if !videoExts[ext] {
switch ext {
case ".zip":
if err := unzip(finalPath, path.Path); err != nil {
log.Printf("[ERROR] Décompression ZIP échouée : %v\n", err)
UpdateJobStatus(job.ID, "failed", db)
return
}
case ".rar":
if err := unrarExtract(finalPath, path.Path); err != nil {
log.Printf("[ERROR] Décompression RAR échouée : %v\n", err)
UpdateJobStatus(job.ID, "failed", db)
return
}
default:
log.Printf("[INFO] Extension non gérée : %s\n", ext)
}
}
UpdateJobProgress(job.ID, 100, db)
UpdateJobStatus(job.ID, "done", db)
log.Printf("[OK] Fichier téléchargé : %s\n", finalPath)
}
// generateUniqueFilePath ajoute un suffixe si le fichier existe déjà
func generateUniqueFilePath(basePath, fileName string) string {
finalPath := filepath.Join(basePath, fileName)
if _, err := os.Stat(finalPath); os.IsNotExist(err) {
return finalPath
}
base := strings.TrimSuffix(fileName, filepath.Ext(fileName))
ext := filepath.Ext(fileName)
counter := 1
for {
newName := fmt.Sprintf("%s (%d)%s", base, counter, ext)
newPath := filepath.Join(basePath, newName)
if _, err := os.Stat(newPath); os.IsNotExist(err) {
return newPath
}
counter++
}
}
func StartDownloadSingleThread(job *DownloadJob, downloadURL string, db *gorm.DB, basePath string) {
UpdateJobStatus(job.ID, "running", db)
resp, err := http.Get(downloadURL)
if err != nil {
log.Printf("[ERROR] Téléchargement échoué : %v\n", err)
UpdateJobStatus(job.ID, "failed", db)
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
log.Printf("[ERROR] Erreur HTTP : %s\n", resp.Status)
UpdateJobStatus(job.ID, "failed", db)
return
}
// Créer le répertoire si nécessaire
if err := os.MkdirAll(basePath, os.ModePerm); err != nil {
log.Printf("[ERROR] Création du dossier %s échouée : %v\n", basePath, err)
UpdateJobStatus(job.ID, "failed", db)
return
}
destPath := filepath.Join(basePath, SanitizeFileName(job.Name))
outFile, err := os.Create(destPath)
if err != nil {
log.Printf("[ERROR] Impossible de créer le fichier : %v\n", err)
UpdateJobStatus(job.ID, "failed", db)
return
}
defer outFile.Close()
// Calcul taille totale
totalSize := resp.ContentLength
if totalSize <= 0 && job.Size > 0 {
totalSize = job.Size
}
buf := make([]byte, 32*1024) // 32KB
var downloaded int64
lastUpdate := time.Now()
for {
n, err := resp.Body.Read(buf)
if n > 0 {
if _, writeErr := outFile.Write(buf[:n]); writeErr != nil {
log.Printf("[ERROR] Écriture échouée : %v\n", writeErr)
UpdateJobStatus(job.ID, "failed", db)
return
}
downloaded += int64(n)
}
if err != nil {
if err == io.EOF {
break
}
log.Printf("[ERROR] Erreur de lecture : %v\n", err)
UpdateJobStatus(job.ID, "failed", db)
return
}
// Mise à jour de la progression
if time.Since(lastUpdate) > 500*time.Millisecond && totalSize > 0 {
progress := int((downloaded * 100) / totalSize)
UpdateJobProgress(job.ID, progress, db)
lastUpdate = time.Now()
}
}
UpdateJobProgress(job.ID, 100, db)
UpdateJobStatus(job.ID, "done", db)
log.Printf("[OK] Fichier téléchargé (single) : %s\n", destPath)
}
func downloadSegment(url string, start, end int64, dest string, progressChan chan<- int64) error {
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", start, end))
resp, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
out, err := os.Create(dest)
if err != nil {
return err
}
defer out.Close()
buf := make([]byte, 32*1024)
for {
n, err := resp.Body.Read(buf)
if n > 0 {
if _, err := out.Write(buf[:n]); err != nil {
return err
}
progressChan <- int64(n) // ← envoie progression
}
if err != nil {
if err == io.EOF {
break
}
return err
}
}
return nil
}
func SanitizeFileName(name string) string {
re := regexp.MustCompile(`[^\w\-.]`)
return re.ReplaceAllString(name, "_")
}
var (
subscribers = make(map[chan struct{}]struct{})
subscribersMu sync.Mutex
)
// Subscribe renvoie un chan à fermer par le client SSE
func Subscribe() chan struct{} {
ch := make(chan struct{}, 1)
subscribersMu.Lock()
subscribers[ch] = struct{}{}
subscribersMu.Unlock()
return ch
}
// Unsubscribe supprime le chan
func Unsubscribe(ch chan struct{}) {
subscribersMu.Lock()
delete(subscribers, ch)
subscribersMu.Unlock()
close(ch)
}
// Broadcast notifie tous les subscribers
func Broadcast() {
subscribersMu.Lock()
defer subscribersMu.Unlock()
for ch := range subscribers {
select {
case ch <- struct{}{}:
log.Println("Broadcast envoyé à un client")
default:
log.Println("Client bloqué, message ignoré")
}
}
}
func unzip(srcZip, destDir string) error {
r, err := zip.OpenReader(srcZip)
if err != nil {
return err
}
defer r.Close()
for _, f := range r.File {
fpath := filepath.Join(destDir, f.Name)
if f.FileInfo().IsDir() {
os.MkdirAll(fpath, os.ModePerm)
continue
}
if err := os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
return err
}
in, err := f.Open()
if err != nil {
return err
}
defer in.Close()
out, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
return err
}
defer out.Close()
if _, err := io.Copy(out, in); err != nil {
return err
}
}
return nil
}
func unrarExtract(srcRar, destDir string) error {
log.Printf("[DEBUG] Début de lextraction RAR src: %q, dest: %q", srcRar, destDir)
// 1) Tentative avec unrar
cmdUnrar := exec.Command("unrar", "x", "-y", srcRar, destDir)
log.Printf("[DEBUG] Exécution de la commande unrar : %s", strings.Join(cmdUnrar.Args, " "))
outputUnrar, errUnrar := cmdUnrar.CombinedOutput()
log.Printf("[DEBUG] Résultat unrar err: %v, output:\n%s", errUnrar, string(outputUnrar))
if errUnrar == nil {
log.Printf("[INFO] Extraction réussie avec unrar.")
return nil
}
log.Printf("[WARN] Échec de unrar, passage à 7z.")
// 2) Repli sur 7z
cmd7z := exec.Command("7z", "x", srcRar, "-y", "-o"+destDir)
log.Printf("[DEBUG] Exécution de la commande 7z : %s", strings.Join(cmd7z.Args, " "))
output7z, err7z := cmd7z.CombinedOutput()
log.Printf("[DEBUG] Résultat 7z err: %v, output:\n%s", err7z, string(output7z))
if err7z == nil {
log.Printf("[INFO] Extraction réussie avec 7z.")
return nil
}
// 3) Les deux ont échoué
errMsg := fmt.Errorf(
"unrar a échoué : %v\nSortie unrar : %s\n\n7z a échoué : %v\nSortie 7z : %s",
errUnrar, string(outputUnrar),
err7z, string(output7z),
)
log.Printf("[ERROR] %v", errMsg)
return errMsg
}

View File

@ -0,0 +1,77 @@
package middlewares
import (
"canguidev/shelfy/internal/models"
"fmt"
"net/http"
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt/v4"
"gorm.io/gorm"
)
func CheckAuth(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
// 1. Récupère le token (header ou query string)
authHeader := c.GetHeader("Authorization")
var tokenString string
if authHeader != "" {
// Mode classique : Authorization: Bearer xxxxx
authToken := strings.Split(authHeader, " ")
if len(authToken) != 2 || authToken[0] != "Bearer" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token format"})
c.AbortWithStatus(http.StatusUnauthorized)
return
}
tokenString = authToken[1]
} else {
// Mode web: token dans lURL
tokenString = c.Query("token")
if tokenString == "" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header is missing"})
c.AbortWithStatus(http.StatusUnauthorized)
return
}
}
// 2. Vérifie et parse le JWT
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
}
return []byte("SECRET"), nil
})
if err != nil || !token.Valid {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid or expired token"})
c.AbortWithStatus(http.StatusUnauthorized)
return
}
claims, ok := token.Claims.(jwt.MapClaims)
if !ok {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"})
c.Abort()
return
}
if float64(time.Now().Unix()) > claims["exp"].(float64) {
c.JSON(http.StatusUnauthorized, gin.H{"error": "token expired"})
c.AbortWithStatus(http.StatusUnauthorized)
return
}
var user models.User
var id = claims["id"]
result := db.First(&user, id)
if result.RowsAffected == 0 {
c.AbortWithStatus(http.StatusUnauthorized)
return
}
c.Set("currentUser", user)
c.Next()
}
}

97
internal/models/models.go Normal file
View File

@ -0,0 +1,97 @@
package models
type User struct {
ID uint `json:"id" gorm:"primaryKey"`
Username string `json:"username" gorm:"size:255"`
Name string `json:"name" gorm:"size:100"`
Email string `json:"email" gorm:"unique"`
Password string `json:"password" gorm:"size:255"`
}
type PathDownload struct{
ID int64 `db:"id"`
Path string `db:"path"`
PathName string `db:"path_name"`
}
type Files struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:255"`
Comment string `gorm:"type:text"`
Path string `gorm:"type:text"`
}
type LibrarySection struct {
ID int64 `db:"id"`
Name string `db:"name"`
SectionType int64 `db:"section_type"`
Language string `db:"language"`
UUID string `db:"uuid"`
CreatedAt string `db:"created_at"`
UpdatedAt string `db:"updated_at"`
}
type SectionLocation struct {
ID int64 `db:"id"`
LibrarySectionID int64 `db:"library_section_id"`
RootPath string `db:"root_path"`
CreatedAt string `db:"created_at"`
UpdatedAt string `db:"updated_at"`
}
type MetadataItem struct {
ID int64 `db:"id"`
LibrarySectionID int64 `db:"library_section_id"`
ParentID int64 `db:"parent_id"`
MetadataType int64 `db:"metadata_type"`
GUID string `db:"guid"`
Title string `db:"title"`
TitleSort string `db:"title_sort"`
OriginalTitle string `db:"original_title"`
Studio string `db:"studio"`
Rating float64 `db:"rating"`
ContentRating string `db:"content_rating"`
Tagline string `db:"tagline"`
Summary string `db:"summary"`
Index int64 `db:"index"`
Duration int64 `db:"duration"`
ReleaseDate string `db:"release_date"`
CreatedAt string `db:"created_at"`
UpdatedAt string `db:"updated_at"`
UserThumbURL string `db:"user_thumb_url"`
}
type MediaItem struct {
ID int64 `db:"id"`
MetadataItemID int64 `db:"metadata_item_id"`
Duration int64 `db:"duration"`
Bitrate int64 `db:"bitrate"`
Width int64 `db:"width"`
Height int64 `db:"height"`
AspectRatio float64 `db:"aspect_ratio"`
AudioCodec string `db:"audio_codec"`
VideoCodec string `db:"video_codec"`
Container string `db:"container"`
CreatedAt string `db:"created_at"`
UpdatedAt string `db:"updated_at"`
}
type MediaPart struct {
ID int64 `db:"id"`
MediaItemID int64 `db:"media_item_id"`
File string `db:"file"`
Duration int64 `db:"duration"`
Size int64 `db:"size"`
Indexes string `db:"indexes"`
CreatedAt string `db:"created_at"`
UpdatedAt string `db:"updated_at"`
}
type Tag struct {
ID int64 `db:"id"`
Tag string `db:"tag"`
TagType int64 `db:"tag_type"`
}
type Tagging struct {
ID int64 `db:"id"`
MetadataItemID int64 `db:"metadata_item_id"`
TagID int64 `db:"tag_id"`
Index int64 `db:"index"`
}

194
internal/routes/routes.go Normal file
View File

@ -0,0 +1,194 @@
package routes
import (
"canguidev/shelfy/internal/controllers"
"canguidev/shelfy/internal/middlewares"
"io"
"log"
"net/http"
"os"
"path/filepath"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
func AddRoutes(superRoute *gin.RouterGroup,db *gorm.DB) {
userRoutes(superRoute,db)
testAcces(superRoute)
loginRoutes(superRoute,db)
pathRoute(superRoute,db)
folderRoute(superRoute,db)
downloadRoute(superRoute,db)
}
func loginRoutes(superRoute *gin.RouterGroup,db *gorm.DB) {
loginRouter := superRoute.Group("/login")
{
loginRouter.POST("/", controllers.Login(db))
}
}
func userRoutes( superRoute *gin.RouterGroup,db*gorm.DB){
userRoutes := superRoute.Group("/users")
{
userRoutes.POST("/",middlewares.CheckAuth(db),controllers.CreateUser(db))
userRoutes.GET("/", middlewares.CheckAuth(db),controllers.ReadAllUser(db))
userRoutes.GET("/:id", middlewares.CheckAuth(db),controllers.FindUserById(db))
userRoutes.PUT("/:id", middlewares.CheckAuth(db),controllers.UpdateUser(db))
userRoutes.DELETE("/:id", middlewares.CheckAuth(db),controllers.DeleteUser(db))
}
}
func testAcces(superRoute *gin.RouterGroup){
test := superRoute.Group("/test")
{
test.GET("/",controllers.TestPing())
}
}
func pathRoute (superRoute *gin.RouterGroup,db *gorm.DB){
pathRoutes := superRoute.Group("/path")
{
pathRoutes.POST("/save-path", middlewares.CheckAuth(db),controllers.CreateSavePath(db))
pathRoutes.GET("/save-path", middlewares.CheckAuth(db),controllers.ReadAllSavePath(db))
pathRoutes.PUT("/save-path/:id", middlewares.CheckAuth(db),controllers.UpdateSavePath(db))
pathRoutes.DELETE("/save-path/:id", middlewares.CheckAuth(db),controllers.DeleteSavePath(db))
pathRoutes.POST("/save-path/validate", middlewares.CheckAuth(db),controllers.PathValidationHandler)
}
}
func folderRoute (superRoute *gin.RouterGroup,db *gorm.DB){
folderRoutes :=superRoute.Group("/folders")
{
folderRoutes.GET("/",middlewares.CheckAuth(db),controllers.StreamHandler(db))
folderRoutes.GET("/details",middlewares.CheckAuth(db),controllers.DetailHandler())
folderRoutes.GET("/file", middlewares.CheckAuth(db), func(c *gin.Context) {
path := c.Query("path")
filePath := filepath.Join("upload", filepath.Clean("/"+path))
ext := strings.ToLower(filepath.Ext(filePath))
if ext == ".mp4" || ext == ".mkv" || ext == ".webm" || ext == ".mp3" {
streamFile(c, filePath)
} else {
c.File(filePath)
}
})
}
}
func downloadRoute (superRoute *gin.RouterGroup,db *gorm.DB){
downloadRoutes := superRoute.Group("/download")
{
downloadRoutes.GET("/jobs", middlewares.CheckAuth(db), controllers.HandleListJobs(db))
downloadRoutes.GET("/debrid-status",middlewares.CheckAuth(db),controllers.GetDebridStatus(db))
downloadRoutes.POST("/account", middlewares.CheckAuth(db),controllers.PostDebridLogin(db))
downloadRoutes.POST("/add", middlewares.CheckAuth(db),controllers.HandleAddJobsMultiple(db))
downloadRoutes.POST("/jobs/:id/start", middlewares.CheckAuth(db),controllers.HandleStartJob(db))
downloadRoutes.POST("/jobs/:id/pause", middlewares.CheckAuth(db),controllers.HandlePauseJob())
downloadRoutes.POST("/jobs/:id/resume", middlewares.CheckAuth(db),controllers.HandleResumeJob(db))
downloadRoutes.DELETE("/jobs/:id", middlewares.CheckAuth(db),controllers.HandleDeleteJob(db))
}
}
func streamFile(c *gin.Context, filePath string) {
log.Printf("[STREAM] ➡️ Requête streaming sur %s", filePath)
f, err := os.Open(filePath)
if err != nil {
log.Printf("[STREAM][ERREUR] Impossible d'ouvrir: %v", err)
c.Status(http.StatusNotFound)
return
}
defer f.Close()
fileStat, err := f.Stat()
if err != nil {
log.Printf("[STREAM][ERREUR] Stat impossible: %v", err)
c.Status(http.StatusInternalServerError)
return
}
fileSize := fileStat.Size()
log.Printf("[STREAM] Taille du fichier: %d octets", fileSize)
c.Header("Accept-Ranges", "bytes")
c.Header("Content-Type", mimeTypeByExt(filePath))
rangeHeader := c.GetHeader("Range")
log.Printf("[STREAM] Range header reçu: %q", rangeHeader)
if rangeHeader == "" {
// Pas de Range, tout le fichier
c.Header("Content-Length", strconv.FormatInt(fileSize, 10))
log.Printf("[STREAM] 📦 Pas de Range, envoi du fichier complet (200 OK)")
http.ServeContent(c.Writer, c.Request, fileStat.Name(), fileStat.ModTime(), f)
return
}
// Analyse du Range
var start, end int64
start, end = 0, fileSize-1
if strings.HasPrefix(rangeHeader, "bytes=") {
rangeParts := strings.Split(strings.TrimPrefix(rangeHeader, "bytes="), "-")
if len(rangeParts) == 2 {
if s, err := strconv.ParseInt(rangeParts[0], 10, 64); err == nil {
start = s
}
if rangeParts[1] != "" {
if e, err := strconv.ParseInt(rangeParts[1], 10, 64); err == nil {
end = e
}
}
}
}
log.Printf("[STREAM] Parsed range: start=%d, end=%d", start, end)
if start > end || start < 0 || end >= fileSize {
log.Printf("[STREAM][ERREUR] Range invalide: %d-%d sur %d", start, end, fileSize)
c.Status(http.StatusRequestedRangeNotSatisfiable)
return
}
c.Status(http.StatusPartialContent)
c.Header("Content-Range", "bytes "+strconv.FormatInt(start, 10)+"-"+strconv.FormatInt(end, 10)+"/"+strconv.FormatInt(fileSize, 10))
c.Header("Content-Length", strconv.FormatInt(end-start+1, 10))
log.Printf("[STREAM] ▶️ Envoi bytes %d-%d sur %d [%s]", start, end, fileSize, filePath)
f.Seek(start, io.SeekStart)
n, err := io.CopyN(c.Writer, f, end-start+1)
if err != nil {
log.Printf("[STREAM][ERREUR] pendant l'envoi: %v", err)
} else {
log.Printf("[STREAM] ✔️ Fini, envoyé %d octets", n)
}
}
// Helper : extension → Content-Type (très basique)
func mimeTypeByExt(filePath string) string {
ext := strings.ToLower(filepath.Ext(filePath))
switch ext {
case ".mp4":
return "video/mp4"
case ".mkv":
return "video/x-matroska"
case ".webm":
return "video/webm"
case ".mp3":
return "audio/mpeg"
case ".pdf":
return "application/pdf"
default:
return "application/octet-stream"
}
}

38
internal/utils/lib.go Normal file
View File

@ -0,0 +1,38 @@
package utils
import (
"canguidev/shelfy/internal/models"
"fmt"
"os"
"gorm.io/gorm"
"canguidev/shelfy/query"
)
func CreateDefaultFolder(db *gorm.DB) {
folders := []string{"Film", "Série", "Manga","Magazine"}
for _, name := range folders {
path := "upload/" + name
if _, err := os.Stat(path); os.IsNotExist(err) {
err := os.MkdirAll(path, 0755) // MkdirAll au cas où des dossiers parents manquent
if err != nil {
fmt.Printf("Erreur lors de la création du dossier %s : %v\n", path, err)
} else {
pathDownload := models.PathDownload{
Path: path,
PathName: name,
}
q := query.Use(db)
if err := q.PathDownload.Create(&pathDownload); err != nil {
fmt.Printf(`{"error": "Failed to create path %%s\n"}`, err)
return
}
fmt.Printf("Dossier créé : %s\n", path)
}
} else {
fmt.Printf("Dossier déjà existant : %s\n", path)
}
}
}

118
main.go Normal file
View File

@ -0,0 +1,118 @@
package main
import (
"canguidev/shelfy/internal/db"
"canguidev/shelfy/internal/routes"
"canguidev/shelfy/internal/utils"
"crypto/tls"
"errors"
"log"
"os"
"path/filepath"
"strings"
"time"
ftpserverlib "github.com/fclairamb/ftpserverlib"
"github.com/gin-gonic/gin"
"github.com/spf13/afero"
)
// ------------ FTP DRIVER ------------
type ftpMainDriver struct{}
type ftpClientDriver struct {
fs afero.Fs
}
func (d *ftpMainDriver) GetSettings() (*ftpserverlib.Settings, error) {
return &ftpserverlib.Settings{
ListenAddr: ":2121",
IdleTimeout: 300,
ConnectionTimeout: 60,
Banner: "Bienvenue sur le FTP Go!",
}, nil
}
func (d *ftpMainDriver) ClientConnected(cc ftpserverlib.ClientContext) (string, error) {
return "Bienvenue ! utilisateur FTP : test / test", nil
}
func (d *ftpMainDriver) ClientDisconnected(cc ftpserverlib.ClientContext) {}
func (d *ftpMainDriver) GetTLSConfig() (*tls.Config, error) { return nil, nil }
func (d *ftpMainDriver) AuthUser(cc ftpserverlib.ClientContext, user, pass string) (ftpserverlib.ClientDriver, error) {
if user == "test" && pass == "test" {
os.MkdirAll("upload", 0755)
base := filepath.Clean("upload")
fs := afero.NewBasePathFs(afero.NewOsFs(), base)
return &ftpClientDriver{fs: fs}, nil
}
return nil, errors.New("invalid login")}
func (c *ftpClientDriver) Name() string { return "aferofs" }
func (c *ftpClientDriver) Create(name string) (afero.File, error) { return c.fs.Create(name) }
func (c *ftpClientDriver) Mkdir(name string, perm os.FileMode) error { return c.fs.Mkdir(name, perm) }
func (c *ftpClientDriver) MkdirAll(path string, perm os.FileMode) error { return c.fs.MkdirAll(path, perm) }
func (c *ftpClientDriver) Open(name string) (afero.File, error) { return c.fs.Open(name) }
func (c *ftpClientDriver) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) {
return c.fs.OpenFile(name, flag, perm)
}
func (c *ftpClientDriver) Remove(name string) error { return c.fs.Remove(name) }
func (c *ftpClientDriver) RemoveAll(path string) error { return c.fs.RemoveAll(path) }
func (c *ftpClientDriver) Rename(old, new string) error { return c.fs.Rename(old, new) }
func (c *ftpClientDriver) Stat(name string) (os.FileInfo, error) {
return c.fs.Stat(name)
}
func (c *ftpClientDriver) LstatIfPossible(name string) (os.FileInfo, bool, error) {
fi, err := c.fs.Stat(name)
return fi, false, err
}
// Implémentation Chmod pour FTP (utilise l'OS direct, ou ignore si non supporté)
func (c *ftpClientDriver) Chmod(name string, mode os.FileMode) error {
// Essayons d'utiliser OsFs (car BasePathFs ne l'exporte pas)
fullPath := filepath.Join("upload", name)
return os.Chmod(fullPath, mode)
}
// Implémentation Chown pour FTP (non supportée en général)
func (c *ftpClientDriver) Chown(name string, uid, gid int) error {
// Optionnel, non supporté par OsFs sur Windows/Mac
return nil
}
// Implémentation Chtimes pour FTP (utilise l'OS direct)
func (c *ftpClientDriver) Chtimes(name string, atime, mtime time.Time) error {
fullPath := filepath.Join("upload", name)
return os.Chtimes(fullPath, atime, mtime)
}
// ------------ MAIN ------------
func main() {
go func() {
ftpSrv := ftpserverlib.NewFtpServer(&ftpMainDriver{})
log.Println("[FTP] Serveur FTP sur ftp://test:test@localhost:2121 (upload/)")
if err := ftpSrv.ListenAndServe(); err != nil {
log.Fatal("[FTP] Erreur FTP :", err)
}
}()
// Serveur HTTP Gin
bd := db.InitDB()
app := gin.Default()
api := app.Group("/api/v1")
routes.AddRoutes(api, bd)
utils.CreateDefaultFolder(bd)
app.Static("/static", "./web")
app.NoRoute(func(c *gin.Context) {
if strings.HasPrefix(c.Request.URL.Path, "/api/") {
c.JSON(404, gin.H{"error": "Not found"})
return
}
c.File("./web/index.html")
})
log.Println("[HTTP] Serveur Gin sur http://localhost:8080")
app.Run(":8080")
}

417
query/files.gen.go Normal file
View File

@ -0,0 +1,417 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"strings"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"canguidev/shelfy/internal/models"
)
func newFiles(db *gorm.DB, opts ...gen.DOOption) files {
_files := files{}
_files.filesDo.UseDB(db, opts...)
_files.filesDo.UseModel(&models.Files{})
tableName := _files.filesDo.TableName()
_files.ALL = field.NewAsterisk(tableName)
_files.ID = field.NewUint(tableName, "id")
_files.Name = field.NewString(tableName, "name")
_files.Comment = field.NewString(tableName, "comment")
_files.Path = field.NewString(tableName, "path")
_files.fillFieldMap()
return _files
}
type files struct {
filesDo
ALL field.Asterisk
ID field.Uint
Name field.String
Comment field.String
Path field.String
fieldMap map[string]field.Expr
}
func (f files) Table(newTableName string) *files {
f.filesDo.UseTable(newTableName)
return f.updateTableName(newTableName)
}
func (f files) As(alias string) *files {
f.filesDo.DO = *(f.filesDo.As(alias).(*gen.DO))
return f.updateTableName(alias)
}
func (f *files) updateTableName(table string) *files {
f.ALL = field.NewAsterisk(table)
f.ID = field.NewUint(table, "id")
f.Name = field.NewString(table, "name")
f.Comment = field.NewString(table, "comment")
f.Path = field.NewString(table, "path")
f.fillFieldMap()
return f
}
func (f *files) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := f.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (f *files) fillFieldMap() {
f.fieldMap = make(map[string]field.Expr, 4)
f.fieldMap["id"] = f.ID
f.fieldMap["name"] = f.Name
f.fieldMap["comment"] = f.Comment
f.fieldMap["path"] = f.Path
}
func (f files) clone(db *gorm.DB) files {
f.filesDo.ReplaceConnPool(db.Statement.ConnPool)
return f
}
func (f files) replaceDB(db *gorm.DB) files {
f.filesDo.ReplaceDB(db)
return f
}
type filesDo struct{ gen.DO }
type IFilesDo interface {
gen.SubQuery
Debug() IFilesDo
WithContext(ctx context.Context) IFilesDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IFilesDo
WriteDB() IFilesDo
As(alias string) gen.Dao
Session(config *gorm.Session) IFilesDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IFilesDo
Not(conds ...gen.Condition) IFilesDo
Or(conds ...gen.Condition) IFilesDo
Select(conds ...field.Expr) IFilesDo
Where(conds ...gen.Condition) IFilesDo
Order(conds ...field.Expr) IFilesDo
Distinct(cols ...field.Expr) IFilesDo
Omit(cols ...field.Expr) IFilesDo
Join(table schema.Tabler, on ...field.Expr) IFilesDo
LeftJoin(table schema.Tabler, on ...field.Expr) IFilesDo
RightJoin(table schema.Tabler, on ...field.Expr) IFilesDo
Group(cols ...field.Expr) IFilesDo
Having(conds ...gen.Condition) IFilesDo
Limit(limit int) IFilesDo
Offset(offset int) IFilesDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IFilesDo
Unscoped() IFilesDo
Create(values ...*models.Files) error
CreateInBatches(values []*models.Files, batchSize int) error
Save(values ...*models.Files) error
First() (*models.Files, error)
Take() (*models.Files, error)
Last() (*models.Files, error)
Find() ([]*models.Files, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Files, err error)
FindInBatches(result *[]*models.Files, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.Files) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IFilesDo
Assign(attrs ...field.AssignExpr) IFilesDo
Joins(fields ...field.RelationField) IFilesDo
Preload(fields ...field.RelationField) IFilesDo
FirstOrInit() (*models.Files, error)
FirstOrCreate() (*models.Files, error)
FindByPage(offset int, limit int) (result []*models.Files, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Rows() (*sql.Rows, error)
Row() *sql.Row
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IFilesDo
UnderlyingDB() *gorm.DB
schema.Tabler
FilterWithNameAndRole(name string, role string) (result []models.Files, err error)
}
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
func (f filesDo) FilterWithNameAndRole(name string, role string) (result []models.Files, err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, name)
generateSQL.WriteString("SELECT * FROM files WHERE name = ? ")
if role != "" {
params = append(params, role)
generateSQL.WriteString("AND role = ? ")
}
var executeSQL *gorm.DB
executeSQL = f.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
err = executeSQL.Error
return
}
func (f filesDo) Debug() IFilesDo {
return f.withDO(f.DO.Debug())
}
func (f filesDo) WithContext(ctx context.Context) IFilesDo {
return f.withDO(f.DO.WithContext(ctx))
}
func (f filesDo) ReadDB() IFilesDo {
return f.Clauses(dbresolver.Read)
}
func (f filesDo) WriteDB() IFilesDo {
return f.Clauses(dbresolver.Write)
}
func (f filesDo) Session(config *gorm.Session) IFilesDo {
return f.withDO(f.DO.Session(config))
}
func (f filesDo) Clauses(conds ...clause.Expression) IFilesDo {
return f.withDO(f.DO.Clauses(conds...))
}
func (f filesDo) Returning(value interface{}, columns ...string) IFilesDo {
return f.withDO(f.DO.Returning(value, columns...))
}
func (f filesDo) Not(conds ...gen.Condition) IFilesDo {
return f.withDO(f.DO.Not(conds...))
}
func (f filesDo) Or(conds ...gen.Condition) IFilesDo {
return f.withDO(f.DO.Or(conds...))
}
func (f filesDo) Select(conds ...field.Expr) IFilesDo {
return f.withDO(f.DO.Select(conds...))
}
func (f filesDo) Where(conds ...gen.Condition) IFilesDo {
return f.withDO(f.DO.Where(conds...))
}
func (f filesDo) Order(conds ...field.Expr) IFilesDo {
return f.withDO(f.DO.Order(conds...))
}
func (f filesDo) Distinct(cols ...field.Expr) IFilesDo {
return f.withDO(f.DO.Distinct(cols...))
}
func (f filesDo) Omit(cols ...field.Expr) IFilesDo {
return f.withDO(f.DO.Omit(cols...))
}
func (f filesDo) Join(table schema.Tabler, on ...field.Expr) IFilesDo {
return f.withDO(f.DO.Join(table, on...))
}
func (f filesDo) LeftJoin(table schema.Tabler, on ...field.Expr) IFilesDo {
return f.withDO(f.DO.LeftJoin(table, on...))
}
func (f filesDo) RightJoin(table schema.Tabler, on ...field.Expr) IFilesDo {
return f.withDO(f.DO.RightJoin(table, on...))
}
func (f filesDo) Group(cols ...field.Expr) IFilesDo {
return f.withDO(f.DO.Group(cols...))
}
func (f filesDo) Having(conds ...gen.Condition) IFilesDo {
return f.withDO(f.DO.Having(conds...))
}
func (f filesDo) Limit(limit int) IFilesDo {
return f.withDO(f.DO.Limit(limit))
}
func (f filesDo) Offset(offset int) IFilesDo {
return f.withDO(f.DO.Offset(offset))
}
func (f filesDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IFilesDo {
return f.withDO(f.DO.Scopes(funcs...))
}
func (f filesDo) Unscoped() IFilesDo {
return f.withDO(f.DO.Unscoped())
}
func (f filesDo) Create(values ...*models.Files) error {
if len(values) == 0 {
return nil
}
return f.DO.Create(values)
}
func (f filesDo) CreateInBatches(values []*models.Files, batchSize int) error {
return f.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (f filesDo) Save(values ...*models.Files) error {
if len(values) == 0 {
return nil
}
return f.DO.Save(values)
}
func (f filesDo) First() (*models.Files, error) {
if result, err := f.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.Files), nil
}
}
func (f filesDo) Take() (*models.Files, error) {
if result, err := f.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.Files), nil
}
}
func (f filesDo) Last() (*models.Files, error) {
if result, err := f.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.Files), nil
}
}
func (f filesDo) Find() ([]*models.Files, error) {
result, err := f.DO.Find()
return result.([]*models.Files), err
}
func (f filesDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Files, err error) {
buf := make([]*models.Files, 0, batchSize)
err = f.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (f filesDo) FindInBatches(result *[]*models.Files, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return f.DO.FindInBatches(result, batchSize, fc)
}
func (f filesDo) Attrs(attrs ...field.AssignExpr) IFilesDo {
return f.withDO(f.DO.Attrs(attrs...))
}
func (f filesDo) Assign(attrs ...field.AssignExpr) IFilesDo {
return f.withDO(f.DO.Assign(attrs...))
}
func (f filesDo) Joins(fields ...field.RelationField) IFilesDo {
for _, _f := range fields {
f = *f.withDO(f.DO.Joins(_f))
}
return &f
}
func (f filesDo) Preload(fields ...field.RelationField) IFilesDo {
for _, _f := range fields {
f = *f.withDO(f.DO.Preload(_f))
}
return &f
}
func (f filesDo) FirstOrInit() (*models.Files, error) {
if result, err := f.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.Files), nil
}
}
func (f filesDo) FirstOrCreate() (*models.Files, error) {
if result, err := f.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.Files), nil
}
}
func (f filesDo) FindByPage(offset int, limit int) (result []*models.Files, count int64, err error) {
result, err = f.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = f.Offset(-1).Limit(-1).Count()
return
}
func (f filesDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = f.Count()
if err != nil {
return
}
err = f.Offset(offset).Limit(limit).Scan(result)
return
}
func (f filesDo) Scan(result interface{}) (err error) {
return f.DO.Scan(result)
}
func (f filesDo) Delete(models ...*models.Files) (result gen.ResultInfo, err error) {
return f.DO.Delete(models)
}
func (f *filesDo) withDO(do gen.Dao) *filesDo {
f.DO = *do.(*gen.DO)
return f
}

175
query/gen.go Normal file
View File

@ -0,0 +1,175 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"gorm.io/gorm"
"gorm.io/gen"
"gorm.io/plugin/dbresolver"
)
var (
Q = new(Query)
Files *files
LibrarySection *librarySection
MediaItem *mediaItem
MediaPart *mediaPart
MetadataItem *metadataItem
PathDownload *pathDownload
SectionLocation *sectionLocation
Tag *tag
Tagging *tagging
User *user
)
func SetDefault(db *gorm.DB, opts ...gen.DOOption) {
*Q = *Use(db, opts...)
Files = &Q.Files
LibrarySection = &Q.LibrarySection
MediaItem = &Q.MediaItem
MediaPart = &Q.MediaPart
MetadataItem = &Q.MetadataItem
PathDownload = &Q.PathDownload
SectionLocation = &Q.SectionLocation
Tag = &Q.Tag
Tagging = &Q.Tagging
User = &Q.User
}
func Use(db *gorm.DB, opts ...gen.DOOption) *Query {
return &Query{
db: db,
Files: newFiles(db, opts...),
LibrarySection: newLibrarySection(db, opts...),
MediaItem: newMediaItem(db, opts...),
MediaPart: newMediaPart(db, opts...),
MetadataItem: newMetadataItem(db, opts...),
PathDownload: newPathDownload(db, opts...),
SectionLocation: newSectionLocation(db, opts...),
Tag: newTag(db, opts...),
Tagging: newTagging(db, opts...),
User: newUser(db, opts...),
}
}
type Query struct {
db *gorm.DB
Files files
LibrarySection librarySection
MediaItem mediaItem
MediaPart mediaPart
MetadataItem metadataItem
PathDownload pathDownload
SectionLocation sectionLocation
Tag tag
Tagging tagging
User user
}
func (q *Query) Available() bool { return q.db != nil }
func (q *Query) clone(db *gorm.DB) *Query {
return &Query{
db: db,
Files: q.Files.clone(db),
LibrarySection: q.LibrarySection.clone(db),
MediaItem: q.MediaItem.clone(db),
MediaPart: q.MediaPart.clone(db),
MetadataItem: q.MetadataItem.clone(db),
PathDownload: q.PathDownload.clone(db),
SectionLocation: q.SectionLocation.clone(db),
Tag: q.Tag.clone(db),
Tagging: q.Tagging.clone(db),
User: q.User.clone(db),
}
}
func (q *Query) ReadDB() *Query {
return q.ReplaceDB(q.db.Clauses(dbresolver.Read))
}
func (q *Query) WriteDB() *Query {
return q.ReplaceDB(q.db.Clauses(dbresolver.Write))
}
func (q *Query) ReplaceDB(db *gorm.DB) *Query {
return &Query{
db: db,
Files: q.Files.replaceDB(db),
LibrarySection: q.LibrarySection.replaceDB(db),
MediaItem: q.MediaItem.replaceDB(db),
MediaPart: q.MediaPart.replaceDB(db),
MetadataItem: q.MetadataItem.replaceDB(db),
PathDownload: q.PathDownload.replaceDB(db),
SectionLocation: q.SectionLocation.replaceDB(db),
Tag: q.Tag.replaceDB(db),
Tagging: q.Tagging.replaceDB(db),
User: q.User.replaceDB(db),
}
}
type queryCtx struct {
Files IFilesDo
LibrarySection ILibrarySectionDo
MediaItem IMediaItemDo
MediaPart IMediaPartDo
MetadataItem IMetadataItemDo
PathDownload IPathDownloadDo
SectionLocation ISectionLocationDo
Tag ITagDo
Tagging ITaggingDo
User IUserDo
}
func (q *Query) WithContext(ctx context.Context) *queryCtx {
return &queryCtx{
Files: q.Files.WithContext(ctx),
LibrarySection: q.LibrarySection.WithContext(ctx),
MediaItem: q.MediaItem.WithContext(ctx),
MediaPart: q.MediaPart.WithContext(ctx),
MetadataItem: q.MetadataItem.WithContext(ctx),
PathDownload: q.PathDownload.WithContext(ctx),
SectionLocation: q.SectionLocation.WithContext(ctx),
Tag: q.Tag.WithContext(ctx),
Tagging: q.Tagging.WithContext(ctx),
User: q.User.WithContext(ctx),
}
}
func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error {
return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.clone(tx)) }, opts...)
}
func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx {
tx := q.db.Begin(opts...)
return &QueryTx{Query: q.clone(tx), Error: tx.Error}
}
type QueryTx struct {
*Query
Error error
}
func (q *QueryTx) Commit() error {
return q.db.Commit().Error
}
func (q *QueryTx) Rollback() error {
return q.db.Rollback().Error
}
func (q *QueryTx) SavePoint(name string) error {
return q.db.SavePoint(name).Error
}
func (q *QueryTx) RollbackTo(name string) error {
return q.db.RollbackTo(name).Error
}

View File

@ -0,0 +1,429 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"strings"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"canguidev/shelfy/internal/models"
)
func newLibrarySection(db *gorm.DB, opts ...gen.DOOption) librarySection {
_librarySection := librarySection{}
_librarySection.librarySectionDo.UseDB(db, opts...)
_librarySection.librarySectionDo.UseModel(&models.LibrarySection{})
tableName := _librarySection.librarySectionDo.TableName()
_librarySection.ALL = field.NewAsterisk(tableName)
_librarySection.ID = field.NewInt64(tableName, "id")
_librarySection.Name = field.NewString(tableName, "name")
_librarySection.SectionType = field.NewInt64(tableName, "section_type")
_librarySection.Language = field.NewString(tableName, "language")
_librarySection.UUID = field.NewString(tableName, "uuid")
_librarySection.CreatedAt = field.NewString(tableName, "created_at")
_librarySection.UpdatedAt = field.NewString(tableName, "updated_at")
_librarySection.fillFieldMap()
return _librarySection
}
type librarySection struct {
librarySectionDo
ALL field.Asterisk
ID field.Int64
Name field.String
SectionType field.Int64
Language field.String
UUID field.String
CreatedAt field.String
UpdatedAt field.String
fieldMap map[string]field.Expr
}
func (l librarySection) Table(newTableName string) *librarySection {
l.librarySectionDo.UseTable(newTableName)
return l.updateTableName(newTableName)
}
func (l librarySection) As(alias string) *librarySection {
l.librarySectionDo.DO = *(l.librarySectionDo.As(alias).(*gen.DO))
return l.updateTableName(alias)
}
func (l *librarySection) updateTableName(table string) *librarySection {
l.ALL = field.NewAsterisk(table)
l.ID = field.NewInt64(table, "id")
l.Name = field.NewString(table, "name")
l.SectionType = field.NewInt64(table, "section_type")
l.Language = field.NewString(table, "language")
l.UUID = field.NewString(table, "uuid")
l.CreatedAt = field.NewString(table, "created_at")
l.UpdatedAt = field.NewString(table, "updated_at")
l.fillFieldMap()
return l
}
func (l *librarySection) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := l.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (l *librarySection) fillFieldMap() {
l.fieldMap = make(map[string]field.Expr, 7)
l.fieldMap["id"] = l.ID
l.fieldMap["name"] = l.Name
l.fieldMap["section_type"] = l.SectionType
l.fieldMap["language"] = l.Language
l.fieldMap["uuid"] = l.UUID
l.fieldMap["created_at"] = l.CreatedAt
l.fieldMap["updated_at"] = l.UpdatedAt
}
func (l librarySection) clone(db *gorm.DB) librarySection {
l.librarySectionDo.ReplaceConnPool(db.Statement.ConnPool)
return l
}
func (l librarySection) replaceDB(db *gorm.DB) librarySection {
l.librarySectionDo.ReplaceDB(db)
return l
}
type librarySectionDo struct{ gen.DO }
type ILibrarySectionDo interface {
gen.SubQuery
Debug() ILibrarySectionDo
WithContext(ctx context.Context) ILibrarySectionDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() ILibrarySectionDo
WriteDB() ILibrarySectionDo
As(alias string) gen.Dao
Session(config *gorm.Session) ILibrarySectionDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) ILibrarySectionDo
Not(conds ...gen.Condition) ILibrarySectionDo
Or(conds ...gen.Condition) ILibrarySectionDo
Select(conds ...field.Expr) ILibrarySectionDo
Where(conds ...gen.Condition) ILibrarySectionDo
Order(conds ...field.Expr) ILibrarySectionDo
Distinct(cols ...field.Expr) ILibrarySectionDo
Omit(cols ...field.Expr) ILibrarySectionDo
Join(table schema.Tabler, on ...field.Expr) ILibrarySectionDo
LeftJoin(table schema.Tabler, on ...field.Expr) ILibrarySectionDo
RightJoin(table schema.Tabler, on ...field.Expr) ILibrarySectionDo
Group(cols ...field.Expr) ILibrarySectionDo
Having(conds ...gen.Condition) ILibrarySectionDo
Limit(limit int) ILibrarySectionDo
Offset(offset int) ILibrarySectionDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) ILibrarySectionDo
Unscoped() ILibrarySectionDo
Create(values ...*models.LibrarySection) error
CreateInBatches(values []*models.LibrarySection, batchSize int) error
Save(values ...*models.LibrarySection) error
First() (*models.LibrarySection, error)
Take() (*models.LibrarySection, error)
Last() (*models.LibrarySection, error)
Find() ([]*models.LibrarySection, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.LibrarySection, err error)
FindInBatches(result *[]*models.LibrarySection, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.LibrarySection) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) ILibrarySectionDo
Assign(attrs ...field.AssignExpr) ILibrarySectionDo
Joins(fields ...field.RelationField) ILibrarySectionDo
Preload(fields ...field.RelationField) ILibrarySectionDo
FirstOrInit() (*models.LibrarySection, error)
FirstOrCreate() (*models.LibrarySection, error)
FindByPage(offset int, limit int) (result []*models.LibrarySection, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Rows() (*sql.Rows, error)
Row() *sql.Row
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) ILibrarySectionDo
UnderlyingDB() *gorm.DB
schema.Tabler
FilterWithNameAndRole(name string, role string) (result []models.LibrarySection, err error)
}
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
func (l librarySectionDo) FilterWithNameAndRole(name string, role string) (result []models.LibrarySection, err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, name)
generateSQL.WriteString("SELECT * FROM library_sections WHERE name = ? ")
if role != "" {
params = append(params, role)
generateSQL.WriteString("AND role = ? ")
}
var executeSQL *gorm.DB
executeSQL = l.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
err = executeSQL.Error
return
}
func (l librarySectionDo) Debug() ILibrarySectionDo {
return l.withDO(l.DO.Debug())
}
func (l librarySectionDo) WithContext(ctx context.Context) ILibrarySectionDo {
return l.withDO(l.DO.WithContext(ctx))
}
func (l librarySectionDo) ReadDB() ILibrarySectionDo {
return l.Clauses(dbresolver.Read)
}
func (l librarySectionDo) WriteDB() ILibrarySectionDo {
return l.Clauses(dbresolver.Write)
}
func (l librarySectionDo) Session(config *gorm.Session) ILibrarySectionDo {
return l.withDO(l.DO.Session(config))
}
func (l librarySectionDo) Clauses(conds ...clause.Expression) ILibrarySectionDo {
return l.withDO(l.DO.Clauses(conds...))
}
func (l librarySectionDo) Returning(value interface{}, columns ...string) ILibrarySectionDo {
return l.withDO(l.DO.Returning(value, columns...))
}
func (l librarySectionDo) Not(conds ...gen.Condition) ILibrarySectionDo {
return l.withDO(l.DO.Not(conds...))
}
func (l librarySectionDo) Or(conds ...gen.Condition) ILibrarySectionDo {
return l.withDO(l.DO.Or(conds...))
}
func (l librarySectionDo) Select(conds ...field.Expr) ILibrarySectionDo {
return l.withDO(l.DO.Select(conds...))
}
func (l librarySectionDo) Where(conds ...gen.Condition) ILibrarySectionDo {
return l.withDO(l.DO.Where(conds...))
}
func (l librarySectionDo) Order(conds ...field.Expr) ILibrarySectionDo {
return l.withDO(l.DO.Order(conds...))
}
func (l librarySectionDo) Distinct(cols ...field.Expr) ILibrarySectionDo {
return l.withDO(l.DO.Distinct(cols...))
}
func (l librarySectionDo) Omit(cols ...field.Expr) ILibrarySectionDo {
return l.withDO(l.DO.Omit(cols...))
}
func (l librarySectionDo) Join(table schema.Tabler, on ...field.Expr) ILibrarySectionDo {
return l.withDO(l.DO.Join(table, on...))
}
func (l librarySectionDo) LeftJoin(table schema.Tabler, on ...field.Expr) ILibrarySectionDo {
return l.withDO(l.DO.LeftJoin(table, on...))
}
func (l librarySectionDo) RightJoin(table schema.Tabler, on ...field.Expr) ILibrarySectionDo {
return l.withDO(l.DO.RightJoin(table, on...))
}
func (l librarySectionDo) Group(cols ...field.Expr) ILibrarySectionDo {
return l.withDO(l.DO.Group(cols...))
}
func (l librarySectionDo) Having(conds ...gen.Condition) ILibrarySectionDo {
return l.withDO(l.DO.Having(conds...))
}
func (l librarySectionDo) Limit(limit int) ILibrarySectionDo {
return l.withDO(l.DO.Limit(limit))
}
func (l librarySectionDo) Offset(offset int) ILibrarySectionDo {
return l.withDO(l.DO.Offset(offset))
}
func (l librarySectionDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ILibrarySectionDo {
return l.withDO(l.DO.Scopes(funcs...))
}
func (l librarySectionDo) Unscoped() ILibrarySectionDo {
return l.withDO(l.DO.Unscoped())
}
func (l librarySectionDo) Create(values ...*models.LibrarySection) error {
if len(values) == 0 {
return nil
}
return l.DO.Create(values)
}
func (l librarySectionDo) CreateInBatches(values []*models.LibrarySection, batchSize int) error {
return l.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (l librarySectionDo) Save(values ...*models.LibrarySection) error {
if len(values) == 0 {
return nil
}
return l.DO.Save(values)
}
func (l librarySectionDo) First() (*models.LibrarySection, error) {
if result, err := l.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.LibrarySection), nil
}
}
func (l librarySectionDo) Take() (*models.LibrarySection, error) {
if result, err := l.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.LibrarySection), nil
}
}
func (l librarySectionDo) Last() (*models.LibrarySection, error) {
if result, err := l.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.LibrarySection), nil
}
}
func (l librarySectionDo) Find() ([]*models.LibrarySection, error) {
result, err := l.DO.Find()
return result.([]*models.LibrarySection), err
}
func (l librarySectionDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.LibrarySection, err error) {
buf := make([]*models.LibrarySection, 0, batchSize)
err = l.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (l librarySectionDo) FindInBatches(result *[]*models.LibrarySection, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return l.DO.FindInBatches(result, batchSize, fc)
}
func (l librarySectionDo) Attrs(attrs ...field.AssignExpr) ILibrarySectionDo {
return l.withDO(l.DO.Attrs(attrs...))
}
func (l librarySectionDo) Assign(attrs ...field.AssignExpr) ILibrarySectionDo {
return l.withDO(l.DO.Assign(attrs...))
}
func (l librarySectionDo) Joins(fields ...field.RelationField) ILibrarySectionDo {
for _, _f := range fields {
l = *l.withDO(l.DO.Joins(_f))
}
return &l
}
func (l librarySectionDo) Preload(fields ...field.RelationField) ILibrarySectionDo {
for _, _f := range fields {
l = *l.withDO(l.DO.Preload(_f))
}
return &l
}
func (l librarySectionDo) FirstOrInit() (*models.LibrarySection, error) {
if result, err := l.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.LibrarySection), nil
}
}
func (l librarySectionDo) FirstOrCreate() (*models.LibrarySection, error) {
if result, err := l.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.LibrarySection), nil
}
}
func (l librarySectionDo) FindByPage(offset int, limit int) (result []*models.LibrarySection, count int64, err error) {
result, err = l.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = l.Offset(-1).Limit(-1).Count()
return
}
func (l librarySectionDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = l.Count()
if err != nil {
return
}
err = l.Offset(offset).Limit(limit).Scan(result)
return
}
func (l librarySectionDo) Scan(result interface{}) (err error) {
return l.DO.Scan(result)
}
func (l librarySectionDo) Delete(models ...*models.LibrarySection) (result gen.ResultInfo, err error) {
return l.DO.Delete(models)
}
func (l *librarySectionDo) withDO(do gen.Dao) *librarySectionDo {
l.DO = *do.(*gen.DO)
return l
}

449
query/media_items.gen.go Normal file
View File

@ -0,0 +1,449 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"strings"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"canguidev/shelfy/internal/models"
)
func newMediaItem(db *gorm.DB, opts ...gen.DOOption) mediaItem {
_mediaItem := mediaItem{}
_mediaItem.mediaItemDo.UseDB(db, opts...)
_mediaItem.mediaItemDo.UseModel(&models.MediaItem{})
tableName := _mediaItem.mediaItemDo.TableName()
_mediaItem.ALL = field.NewAsterisk(tableName)
_mediaItem.ID = field.NewInt64(tableName, "id")
_mediaItem.MetadataItemID = field.NewInt64(tableName, "metadata_item_id")
_mediaItem.Duration = field.NewInt64(tableName, "duration")
_mediaItem.Bitrate = field.NewInt64(tableName, "bitrate")
_mediaItem.Width = field.NewInt64(tableName, "width")
_mediaItem.Height = field.NewInt64(tableName, "height")
_mediaItem.AspectRatio = field.NewFloat64(tableName, "aspect_ratio")
_mediaItem.AudioCodec = field.NewString(tableName, "audio_codec")
_mediaItem.VideoCodec = field.NewString(tableName, "video_codec")
_mediaItem.Container = field.NewString(tableName, "container")
_mediaItem.CreatedAt = field.NewString(tableName, "created_at")
_mediaItem.UpdatedAt = field.NewString(tableName, "updated_at")
_mediaItem.fillFieldMap()
return _mediaItem
}
type mediaItem struct {
mediaItemDo
ALL field.Asterisk
ID field.Int64
MetadataItemID field.Int64
Duration field.Int64
Bitrate field.Int64
Width field.Int64
Height field.Int64
AspectRatio field.Float64
AudioCodec field.String
VideoCodec field.String
Container field.String
CreatedAt field.String
UpdatedAt field.String
fieldMap map[string]field.Expr
}
func (m mediaItem) Table(newTableName string) *mediaItem {
m.mediaItemDo.UseTable(newTableName)
return m.updateTableName(newTableName)
}
func (m mediaItem) As(alias string) *mediaItem {
m.mediaItemDo.DO = *(m.mediaItemDo.As(alias).(*gen.DO))
return m.updateTableName(alias)
}
func (m *mediaItem) updateTableName(table string) *mediaItem {
m.ALL = field.NewAsterisk(table)
m.ID = field.NewInt64(table, "id")
m.MetadataItemID = field.NewInt64(table, "metadata_item_id")
m.Duration = field.NewInt64(table, "duration")
m.Bitrate = field.NewInt64(table, "bitrate")
m.Width = field.NewInt64(table, "width")
m.Height = field.NewInt64(table, "height")
m.AspectRatio = field.NewFloat64(table, "aspect_ratio")
m.AudioCodec = field.NewString(table, "audio_codec")
m.VideoCodec = field.NewString(table, "video_codec")
m.Container = field.NewString(table, "container")
m.CreatedAt = field.NewString(table, "created_at")
m.UpdatedAt = field.NewString(table, "updated_at")
m.fillFieldMap()
return m
}
func (m *mediaItem) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := m.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (m *mediaItem) fillFieldMap() {
m.fieldMap = make(map[string]field.Expr, 12)
m.fieldMap["id"] = m.ID
m.fieldMap["metadata_item_id"] = m.MetadataItemID
m.fieldMap["duration"] = m.Duration
m.fieldMap["bitrate"] = m.Bitrate
m.fieldMap["width"] = m.Width
m.fieldMap["height"] = m.Height
m.fieldMap["aspect_ratio"] = m.AspectRatio
m.fieldMap["audio_codec"] = m.AudioCodec
m.fieldMap["video_codec"] = m.VideoCodec
m.fieldMap["container"] = m.Container
m.fieldMap["created_at"] = m.CreatedAt
m.fieldMap["updated_at"] = m.UpdatedAt
}
func (m mediaItem) clone(db *gorm.DB) mediaItem {
m.mediaItemDo.ReplaceConnPool(db.Statement.ConnPool)
return m
}
func (m mediaItem) replaceDB(db *gorm.DB) mediaItem {
m.mediaItemDo.ReplaceDB(db)
return m
}
type mediaItemDo struct{ gen.DO }
type IMediaItemDo interface {
gen.SubQuery
Debug() IMediaItemDo
WithContext(ctx context.Context) IMediaItemDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IMediaItemDo
WriteDB() IMediaItemDo
As(alias string) gen.Dao
Session(config *gorm.Session) IMediaItemDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IMediaItemDo
Not(conds ...gen.Condition) IMediaItemDo
Or(conds ...gen.Condition) IMediaItemDo
Select(conds ...field.Expr) IMediaItemDo
Where(conds ...gen.Condition) IMediaItemDo
Order(conds ...field.Expr) IMediaItemDo
Distinct(cols ...field.Expr) IMediaItemDo
Omit(cols ...field.Expr) IMediaItemDo
Join(table schema.Tabler, on ...field.Expr) IMediaItemDo
LeftJoin(table schema.Tabler, on ...field.Expr) IMediaItemDo
RightJoin(table schema.Tabler, on ...field.Expr) IMediaItemDo
Group(cols ...field.Expr) IMediaItemDo
Having(conds ...gen.Condition) IMediaItemDo
Limit(limit int) IMediaItemDo
Offset(offset int) IMediaItemDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IMediaItemDo
Unscoped() IMediaItemDo
Create(values ...*models.MediaItem) error
CreateInBatches(values []*models.MediaItem, batchSize int) error
Save(values ...*models.MediaItem) error
First() (*models.MediaItem, error)
Take() (*models.MediaItem, error)
Last() (*models.MediaItem, error)
Find() ([]*models.MediaItem, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MediaItem, err error)
FindInBatches(result *[]*models.MediaItem, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.MediaItem) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IMediaItemDo
Assign(attrs ...field.AssignExpr) IMediaItemDo
Joins(fields ...field.RelationField) IMediaItemDo
Preload(fields ...field.RelationField) IMediaItemDo
FirstOrInit() (*models.MediaItem, error)
FirstOrCreate() (*models.MediaItem, error)
FindByPage(offset int, limit int) (result []*models.MediaItem, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Rows() (*sql.Rows, error)
Row() *sql.Row
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IMediaItemDo
UnderlyingDB() *gorm.DB
schema.Tabler
FilterWithNameAndRole(name string, role string) (result []models.MediaItem, err error)
}
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
func (m mediaItemDo) FilterWithNameAndRole(name string, role string) (result []models.MediaItem, err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, name)
generateSQL.WriteString("SELECT * FROM media_items WHERE name = ? ")
if role != "" {
params = append(params, role)
generateSQL.WriteString("AND role = ? ")
}
var executeSQL *gorm.DB
executeSQL = m.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
err = executeSQL.Error
return
}
func (m mediaItemDo) Debug() IMediaItemDo {
return m.withDO(m.DO.Debug())
}
func (m mediaItemDo) WithContext(ctx context.Context) IMediaItemDo {
return m.withDO(m.DO.WithContext(ctx))
}
func (m mediaItemDo) ReadDB() IMediaItemDo {
return m.Clauses(dbresolver.Read)
}
func (m mediaItemDo) WriteDB() IMediaItemDo {
return m.Clauses(dbresolver.Write)
}
func (m mediaItemDo) Session(config *gorm.Session) IMediaItemDo {
return m.withDO(m.DO.Session(config))
}
func (m mediaItemDo) Clauses(conds ...clause.Expression) IMediaItemDo {
return m.withDO(m.DO.Clauses(conds...))
}
func (m mediaItemDo) Returning(value interface{}, columns ...string) IMediaItemDo {
return m.withDO(m.DO.Returning(value, columns...))
}
func (m mediaItemDo) Not(conds ...gen.Condition) IMediaItemDo {
return m.withDO(m.DO.Not(conds...))
}
func (m mediaItemDo) Or(conds ...gen.Condition) IMediaItemDo {
return m.withDO(m.DO.Or(conds...))
}
func (m mediaItemDo) Select(conds ...field.Expr) IMediaItemDo {
return m.withDO(m.DO.Select(conds...))
}
func (m mediaItemDo) Where(conds ...gen.Condition) IMediaItemDo {
return m.withDO(m.DO.Where(conds...))
}
func (m mediaItemDo) Order(conds ...field.Expr) IMediaItemDo {
return m.withDO(m.DO.Order(conds...))
}
func (m mediaItemDo) Distinct(cols ...field.Expr) IMediaItemDo {
return m.withDO(m.DO.Distinct(cols...))
}
func (m mediaItemDo) Omit(cols ...field.Expr) IMediaItemDo {
return m.withDO(m.DO.Omit(cols...))
}
func (m mediaItemDo) Join(table schema.Tabler, on ...field.Expr) IMediaItemDo {
return m.withDO(m.DO.Join(table, on...))
}
func (m mediaItemDo) LeftJoin(table schema.Tabler, on ...field.Expr) IMediaItemDo {
return m.withDO(m.DO.LeftJoin(table, on...))
}
func (m mediaItemDo) RightJoin(table schema.Tabler, on ...field.Expr) IMediaItemDo {
return m.withDO(m.DO.RightJoin(table, on...))
}
func (m mediaItemDo) Group(cols ...field.Expr) IMediaItemDo {
return m.withDO(m.DO.Group(cols...))
}
func (m mediaItemDo) Having(conds ...gen.Condition) IMediaItemDo {
return m.withDO(m.DO.Having(conds...))
}
func (m mediaItemDo) Limit(limit int) IMediaItemDo {
return m.withDO(m.DO.Limit(limit))
}
func (m mediaItemDo) Offset(offset int) IMediaItemDo {
return m.withDO(m.DO.Offset(offset))
}
func (m mediaItemDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IMediaItemDo {
return m.withDO(m.DO.Scopes(funcs...))
}
func (m mediaItemDo) Unscoped() IMediaItemDo {
return m.withDO(m.DO.Unscoped())
}
func (m mediaItemDo) Create(values ...*models.MediaItem) error {
if len(values) == 0 {
return nil
}
return m.DO.Create(values)
}
func (m mediaItemDo) CreateInBatches(values []*models.MediaItem, batchSize int) error {
return m.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (m mediaItemDo) Save(values ...*models.MediaItem) error {
if len(values) == 0 {
return nil
}
return m.DO.Save(values)
}
func (m mediaItemDo) First() (*models.MediaItem, error) {
if result, err := m.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.MediaItem), nil
}
}
func (m mediaItemDo) Take() (*models.MediaItem, error) {
if result, err := m.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.MediaItem), nil
}
}
func (m mediaItemDo) Last() (*models.MediaItem, error) {
if result, err := m.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.MediaItem), nil
}
}
func (m mediaItemDo) Find() ([]*models.MediaItem, error) {
result, err := m.DO.Find()
return result.([]*models.MediaItem), err
}
func (m mediaItemDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MediaItem, err error) {
buf := make([]*models.MediaItem, 0, batchSize)
err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (m mediaItemDo) FindInBatches(result *[]*models.MediaItem, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return m.DO.FindInBatches(result, batchSize, fc)
}
func (m mediaItemDo) Attrs(attrs ...field.AssignExpr) IMediaItemDo {
return m.withDO(m.DO.Attrs(attrs...))
}
func (m mediaItemDo) Assign(attrs ...field.AssignExpr) IMediaItemDo {
return m.withDO(m.DO.Assign(attrs...))
}
func (m mediaItemDo) Joins(fields ...field.RelationField) IMediaItemDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Joins(_f))
}
return &m
}
func (m mediaItemDo) Preload(fields ...field.RelationField) IMediaItemDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Preload(_f))
}
return &m
}
func (m mediaItemDo) FirstOrInit() (*models.MediaItem, error) {
if result, err := m.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.MediaItem), nil
}
}
func (m mediaItemDo) FirstOrCreate() (*models.MediaItem, error) {
if result, err := m.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.MediaItem), nil
}
}
func (m mediaItemDo) FindByPage(offset int, limit int) (result []*models.MediaItem, count int64, err error) {
result, err = m.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = m.Offset(-1).Limit(-1).Count()
return
}
func (m mediaItemDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = m.Count()
if err != nil {
return
}
err = m.Offset(offset).Limit(limit).Scan(result)
return
}
func (m mediaItemDo) Scan(result interface{}) (err error) {
return m.DO.Scan(result)
}
func (m mediaItemDo) Delete(models ...*models.MediaItem) (result gen.ResultInfo, err error) {
return m.DO.Delete(models)
}
func (m *mediaItemDo) withDO(do gen.Dao) *mediaItemDo {
m.DO = *do.(*gen.DO)
return m
}

433
query/media_parts.gen.go Normal file
View File

@ -0,0 +1,433 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"strings"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"canguidev/shelfy/internal/models"
)
func newMediaPart(db *gorm.DB, opts ...gen.DOOption) mediaPart {
_mediaPart := mediaPart{}
_mediaPart.mediaPartDo.UseDB(db, opts...)
_mediaPart.mediaPartDo.UseModel(&models.MediaPart{})
tableName := _mediaPart.mediaPartDo.TableName()
_mediaPart.ALL = field.NewAsterisk(tableName)
_mediaPart.ID = field.NewInt64(tableName, "id")
_mediaPart.MediaItemID = field.NewInt64(tableName, "media_item_id")
_mediaPart.File = field.NewString(tableName, "file")
_mediaPart.Duration = field.NewInt64(tableName, "duration")
_mediaPart.Size = field.NewInt64(tableName, "size")
_mediaPart.Indexes = field.NewString(tableName, "indexes")
_mediaPart.CreatedAt = field.NewString(tableName, "created_at")
_mediaPart.UpdatedAt = field.NewString(tableName, "updated_at")
_mediaPart.fillFieldMap()
return _mediaPart
}
type mediaPart struct {
mediaPartDo
ALL field.Asterisk
ID field.Int64
MediaItemID field.Int64
File field.String
Duration field.Int64
Size field.Int64
Indexes field.String
CreatedAt field.String
UpdatedAt field.String
fieldMap map[string]field.Expr
}
func (m mediaPart) Table(newTableName string) *mediaPart {
m.mediaPartDo.UseTable(newTableName)
return m.updateTableName(newTableName)
}
func (m mediaPart) As(alias string) *mediaPart {
m.mediaPartDo.DO = *(m.mediaPartDo.As(alias).(*gen.DO))
return m.updateTableName(alias)
}
func (m *mediaPart) updateTableName(table string) *mediaPart {
m.ALL = field.NewAsterisk(table)
m.ID = field.NewInt64(table, "id")
m.MediaItemID = field.NewInt64(table, "media_item_id")
m.File = field.NewString(table, "file")
m.Duration = field.NewInt64(table, "duration")
m.Size = field.NewInt64(table, "size")
m.Indexes = field.NewString(table, "indexes")
m.CreatedAt = field.NewString(table, "created_at")
m.UpdatedAt = field.NewString(table, "updated_at")
m.fillFieldMap()
return m
}
func (m *mediaPart) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := m.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (m *mediaPart) fillFieldMap() {
m.fieldMap = make(map[string]field.Expr, 8)
m.fieldMap["id"] = m.ID
m.fieldMap["media_item_id"] = m.MediaItemID
m.fieldMap["file"] = m.File
m.fieldMap["duration"] = m.Duration
m.fieldMap["size"] = m.Size
m.fieldMap["indexes"] = m.Indexes
m.fieldMap["created_at"] = m.CreatedAt
m.fieldMap["updated_at"] = m.UpdatedAt
}
func (m mediaPart) clone(db *gorm.DB) mediaPart {
m.mediaPartDo.ReplaceConnPool(db.Statement.ConnPool)
return m
}
func (m mediaPart) replaceDB(db *gorm.DB) mediaPart {
m.mediaPartDo.ReplaceDB(db)
return m
}
type mediaPartDo struct{ gen.DO }
type IMediaPartDo interface {
gen.SubQuery
Debug() IMediaPartDo
WithContext(ctx context.Context) IMediaPartDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IMediaPartDo
WriteDB() IMediaPartDo
As(alias string) gen.Dao
Session(config *gorm.Session) IMediaPartDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IMediaPartDo
Not(conds ...gen.Condition) IMediaPartDo
Or(conds ...gen.Condition) IMediaPartDo
Select(conds ...field.Expr) IMediaPartDo
Where(conds ...gen.Condition) IMediaPartDo
Order(conds ...field.Expr) IMediaPartDo
Distinct(cols ...field.Expr) IMediaPartDo
Omit(cols ...field.Expr) IMediaPartDo
Join(table schema.Tabler, on ...field.Expr) IMediaPartDo
LeftJoin(table schema.Tabler, on ...field.Expr) IMediaPartDo
RightJoin(table schema.Tabler, on ...field.Expr) IMediaPartDo
Group(cols ...field.Expr) IMediaPartDo
Having(conds ...gen.Condition) IMediaPartDo
Limit(limit int) IMediaPartDo
Offset(offset int) IMediaPartDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IMediaPartDo
Unscoped() IMediaPartDo
Create(values ...*models.MediaPart) error
CreateInBatches(values []*models.MediaPart, batchSize int) error
Save(values ...*models.MediaPart) error
First() (*models.MediaPart, error)
Take() (*models.MediaPart, error)
Last() (*models.MediaPart, error)
Find() ([]*models.MediaPart, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MediaPart, err error)
FindInBatches(result *[]*models.MediaPart, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.MediaPart) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IMediaPartDo
Assign(attrs ...field.AssignExpr) IMediaPartDo
Joins(fields ...field.RelationField) IMediaPartDo
Preload(fields ...field.RelationField) IMediaPartDo
FirstOrInit() (*models.MediaPart, error)
FirstOrCreate() (*models.MediaPart, error)
FindByPage(offset int, limit int) (result []*models.MediaPart, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Rows() (*sql.Rows, error)
Row() *sql.Row
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IMediaPartDo
UnderlyingDB() *gorm.DB
schema.Tabler
FilterWithNameAndRole(name string, role string) (result []models.MediaPart, err error)
}
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
func (m mediaPartDo) FilterWithNameAndRole(name string, role string) (result []models.MediaPart, err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, name)
generateSQL.WriteString("SELECT * FROM media_parts WHERE name = ? ")
if role != "" {
params = append(params, role)
generateSQL.WriteString("AND role = ? ")
}
var executeSQL *gorm.DB
executeSQL = m.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
err = executeSQL.Error
return
}
func (m mediaPartDo) Debug() IMediaPartDo {
return m.withDO(m.DO.Debug())
}
func (m mediaPartDo) WithContext(ctx context.Context) IMediaPartDo {
return m.withDO(m.DO.WithContext(ctx))
}
func (m mediaPartDo) ReadDB() IMediaPartDo {
return m.Clauses(dbresolver.Read)
}
func (m mediaPartDo) WriteDB() IMediaPartDo {
return m.Clauses(dbresolver.Write)
}
func (m mediaPartDo) Session(config *gorm.Session) IMediaPartDo {
return m.withDO(m.DO.Session(config))
}
func (m mediaPartDo) Clauses(conds ...clause.Expression) IMediaPartDo {
return m.withDO(m.DO.Clauses(conds...))
}
func (m mediaPartDo) Returning(value interface{}, columns ...string) IMediaPartDo {
return m.withDO(m.DO.Returning(value, columns...))
}
func (m mediaPartDo) Not(conds ...gen.Condition) IMediaPartDo {
return m.withDO(m.DO.Not(conds...))
}
func (m mediaPartDo) Or(conds ...gen.Condition) IMediaPartDo {
return m.withDO(m.DO.Or(conds...))
}
func (m mediaPartDo) Select(conds ...field.Expr) IMediaPartDo {
return m.withDO(m.DO.Select(conds...))
}
func (m mediaPartDo) Where(conds ...gen.Condition) IMediaPartDo {
return m.withDO(m.DO.Where(conds...))
}
func (m mediaPartDo) Order(conds ...field.Expr) IMediaPartDo {
return m.withDO(m.DO.Order(conds...))
}
func (m mediaPartDo) Distinct(cols ...field.Expr) IMediaPartDo {
return m.withDO(m.DO.Distinct(cols...))
}
func (m mediaPartDo) Omit(cols ...field.Expr) IMediaPartDo {
return m.withDO(m.DO.Omit(cols...))
}
func (m mediaPartDo) Join(table schema.Tabler, on ...field.Expr) IMediaPartDo {
return m.withDO(m.DO.Join(table, on...))
}
func (m mediaPartDo) LeftJoin(table schema.Tabler, on ...field.Expr) IMediaPartDo {
return m.withDO(m.DO.LeftJoin(table, on...))
}
func (m mediaPartDo) RightJoin(table schema.Tabler, on ...field.Expr) IMediaPartDo {
return m.withDO(m.DO.RightJoin(table, on...))
}
func (m mediaPartDo) Group(cols ...field.Expr) IMediaPartDo {
return m.withDO(m.DO.Group(cols...))
}
func (m mediaPartDo) Having(conds ...gen.Condition) IMediaPartDo {
return m.withDO(m.DO.Having(conds...))
}
func (m mediaPartDo) Limit(limit int) IMediaPartDo {
return m.withDO(m.DO.Limit(limit))
}
func (m mediaPartDo) Offset(offset int) IMediaPartDo {
return m.withDO(m.DO.Offset(offset))
}
func (m mediaPartDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IMediaPartDo {
return m.withDO(m.DO.Scopes(funcs...))
}
func (m mediaPartDo) Unscoped() IMediaPartDo {
return m.withDO(m.DO.Unscoped())
}
func (m mediaPartDo) Create(values ...*models.MediaPart) error {
if len(values) == 0 {
return nil
}
return m.DO.Create(values)
}
func (m mediaPartDo) CreateInBatches(values []*models.MediaPart, batchSize int) error {
return m.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (m mediaPartDo) Save(values ...*models.MediaPart) error {
if len(values) == 0 {
return nil
}
return m.DO.Save(values)
}
func (m mediaPartDo) First() (*models.MediaPart, error) {
if result, err := m.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.MediaPart), nil
}
}
func (m mediaPartDo) Take() (*models.MediaPart, error) {
if result, err := m.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.MediaPart), nil
}
}
func (m mediaPartDo) Last() (*models.MediaPart, error) {
if result, err := m.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.MediaPart), nil
}
}
func (m mediaPartDo) Find() ([]*models.MediaPart, error) {
result, err := m.DO.Find()
return result.([]*models.MediaPart), err
}
func (m mediaPartDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MediaPart, err error) {
buf := make([]*models.MediaPart, 0, batchSize)
err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (m mediaPartDo) FindInBatches(result *[]*models.MediaPart, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return m.DO.FindInBatches(result, batchSize, fc)
}
func (m mediaPartDo) Attrs(attrs ...field.AssignExpr) IMediaPartDo {
return m.withDO(m.DO.Attrs(attrs...))
}
func (m mediaPartDo) Assign(attrs ...field.AssignExpr) IMediaPartDo {
return m.withDO(m.DO.Assign(attrs...))
}
func (m mediaPartDo) Joins(fields ...field.RelationField) IMediaPartDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Joins(_f))
}
return &m
}
func (m mediaPartDo) Preload(fields ...field.RelationField) IMediaPartDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Preload(_f))
}
return &m
}
func (m mediaPartDo) FirstOrInit() (*models.MediaPart, error) {
if result, err := m.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.MediaPart), nil
}
}
func (m mediaPartDo) FirstOrCreate() (*models.MediaPart, error) {
if result, err := m.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.MediaPart), nil
}
}
func (m mediaPartDo) FindByPage(offset int, limit int) (result []*models.MediaPart, count int64, err error) {
result, err = m.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = m.Offset(-1).Limit(-1).Count()
return
}
func (m mediaPartDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = m.Count()
if err != nil {
return
}
err = m.Offset(offset).Limit(limit).Scan(result)
return
}
func (m mediaPartDo) Scan(result interface{}) (err error) {
return m.DO.Scan(result)
}
func (m mediaPartDo) Delete(models ...*models.MediaPart) (result gen.ResultInfo, err error) {
return m.DO.Delete(models)
}
func (m *mediaPartDo) withDO(do gen.Dao) *mediaPartDo {
m.DO = *do.(*gen.DO)
return m
}

477
query/metadata_items.gen.go Normal file
View File

@ -0,0 +1,477 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"strings"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"canguidev/shelfy/internal/models"
)
func newMetadataItem(db *gorm.DB, opts ...gen.DOOption) metadataItem {
_metadataItem := metadataItem{}
_metadataItem.metadataItemDo.UseDB(db, opts...)
_metadataItem.metadataItemDo.UseModel(&models.MetadataItem{})
tableName := _metadataItem.metadataItemDo.TableName()
_metadataItem.ALL = field.NewAsterisk(tableName)
_metadataItem.ID = field.NewInt64(tableName, "id")
_metadataItem.LibrarySectionID = field.NewInt64(tableName, "library_section_id")
_metadataItem.ParentID = field.NewInt64(tableName, "parent_id")
_metadataItem.MetadataType = field.NewInt64(tableName, "metadata_type")
_metadataItem.GUID = field.NewString(tableName, "guid")
_metadataItem.Title = field.NewString(tableName, "title")
_metadataItem.TitleSort = field.NewString(tableName, "title_sort")
_metadataItem.OriginalTitle = field.NewString(tableName, "original_title")
_metadataItem.Studio = field.NewString(tableName, "studio")
_metadataItem.Rating = field.NewFloat64(tableName, "rating")
_metadataItem.ContentRating = field.NewString(tableName, "content_rating")
_metadataItem.Tagline = field.NewString(tableName, "tagline")
_metadataItem.Summary = field.NewString(tableName, "summary")
_metadataItem.Index = field.NewInt64(tableName, "index")
_metadataItem.Duration = field.NewInt64(tableName, "duration")
_metadataItem.ReleaseDate = field.NewString(tableName, "release_date")
_metadataItem.CreatedAt = field.NewString(tableName, "created_at")
_metadataItem.UpdatedAt = field.NewString(tableName, "updated_at")
_metadataItem.UserThumbURL = field.NewString(tableName, "user_thumb_url")
_metadataItem.fillFieldMap()
return _metadataItem
}
type metadataItem struct {
metadataItemDo
ALL field.Asterisk
ID field.Int64
LibrarySectionID field.Int64
ParentID field.Int64
MetadataType field.Int64
GUID field.String
Title field.String
TitleSort field.String
OriginalTitle field.String
Studio field.String
Rating field.Float64
ContentRating field.String
Tagline field.String
Summary field.String
Index field.Int64
Duration field.Int64
ReleaseDate field.String
CreatedAt field.String
UpdatedAt field.String
UserThumbURL field.String
fieldMap map[string]field.Expr
}
func (m metadataItem) Table(newTableName string) *metadataItem {
m.metadataItemDo.UseTable(newTableName)
return m.updateTableName(newTableName)
}
func (m metadataItem) As(alias string) *metadataItem {
m.metadataItemDo.DO = *(m.metadataItemDo.As(alias).(*gen.DO))
return m.updateTableName(alias)
}
func (m *metadataItem) updateTableName(table string) *metadataItem {
m.ALL = field.NewAsterisk(table)
m.ID = field.NewInt64(table, "id")
m.LibrarySectionID = field.NewInt64(table, "library_section_id")
m.ParentID = field.NewInt64(table, "parent_id")
m.MetadataType = field.NewInt64(table, "metadata_type")
m.GUID = field.NewString(table, "guid")
m.Title = field.NewString(table, "title")
m.TitleSort = field.NewString(table, "title_sort")
m.OriginalTitle = field.NewString(table, "original_title")
m.Studio = field.NewString(table, "studio")
m.Rating = field.NewFloat64(table, "rating")
m.ContentRating = field.NewString(table, "content_rating")
m.Tagline = field.NewString(table, "tagline")
m.Summary = field.NewString(table, "summary")
m.Index = field.NewInt64(table, "index")
m.Duration = field.NewInt64(table, "duration")
m.ReleaseDate = field.NewString(table, "release_date")
m.CreatedAt = field.NewString(table, "created_at")
m.UpdatedAt = field.NewString(table, "updated_at")
m.UserThumbURL = field.NewString(table, "user_thumb_url")
m.fillFieldMap()
return m
}
func (m *metadataItem) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := m.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (m *metadataItem) fillFieldMap() {
m.fieldMap = make(map[string]field.Expr, 19)
m.fieldMap["id"] = m.ID
m.fieldMap["library_section_id"] = m.LibrarySectionID
m.fieldMap["parent_id"] = m.ParentID
m.fieldMap["metadata_type"] = m.MetadataType
m.fieldMap["guid"] = m.GUID
m.fieldMap["title"] = m.Title
m.fieldMap["title_sort"] = m.TitleSort
m.fieldMap["original_title"] = m.OriginalTitle
m.fieldMap["studio"] = m.Studio
m.fieldMap["rating"] = m.Rating
m.fieldMap["content_rating"] = m.ContentRating
m.fieldMap["tagline"] = m.Tagline
m.fieldMap["summary"] = m.Summary
m.fieldMap["index"] = m.Index
m.fieldMap["duration"] = m.Duration
m.fieldMap["release_date"] = m.ReleaseDate
m.fieldMap["created_at"] = m.CreatedAt
m.fieldMap["updated_at"] = m.UpdatedAt
m.fieldMap["user_thumb_url"] = m.UserThumbURL
}
func (m metadataItem) clone(db *gorm.DB) metadataItem {
m.metadataItemDo.ReplaceConnPool(db.Statement.ConnPool)
return m
}
func (m metadataItem) replaceDB(db *gorm.DB) metadataItem {
m.metadataItemDo.ReplaceDB(db)
return m
}
type metadataItemDo struct{ gen.DO }
type IMetadataItemDo interface {
gen.SubQuery
Debug() IMetadataItemDo
WithContext(ctx context.Context) IMetadataItemDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IMetadataItemDo
WriteDB() IMetadataItemDo
As(alias string) gen.Dao
Session(config *gorm.Session) IMetadataItemDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IMetadataItemDo
Not(conds ...gen.Condition) IMetadataItemDo
Or(conds ...gen.Condition) IMetadataItemDo
Select(conds ...field.Expr) IMetadataItemDo
Where(conds ...gen.Condition) IMetadataItemDo
Order(conds ...field.Expr) IMetadataItemDo
Distinct(cols ...field.Expr) IMetadataItemDo
Omit(cols ...field.Expr) IMetadataItemDo
Join(table schema.Tabler, on ...field.Expr) IMetadataItemDo
LeftJoin(table schema.Tabler, on ...field.Expr) IMetadataItemDo
RightJoin(table schema.Tabler, on ...field.Expr) IMetadataItemDo
Group(cols ...field.Expr) IMetadataItemDo
Having(conds ...gen.Condition) IMetadataItemDo
Limit(limit int) IMetadataItemDo
Offset(offset int) IMetadataItemDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IMetadataItemDo
Unscoped() IMetadataItemDo
Create(values ...*models.MetadataItem) error
CreateInBatches(values []*models.MetadataItem, batchSize int) error
Save(values ...*models.MetadataItem) error
First() (*models.MetadataItem, error)
Take() (*models.MetadataItem, error)
Last() (*models.MetadataItem, error)
Find() ([]*models.MetadataItem, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MetadataItem, err error)
FindInBatches(result *[]*models.MetadataItem, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.MetadataItem) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IMetadataItemDo
Assign(attrs ...field.AssignExpr) IMetadataItemDo
Joins(fields ...field.RelationField) IMetadataItemDo
Preload(fields ...field.RelationField) IMetadataItemDo
FirstOrInit() (*models.MetadataItem, error)
FirstOrCreate() (*models.MetadataItem, error)
FindByPage(offset int, limit int) (result []*models.MetadataItem, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Rows() (*sql.Rows, error)
Row() *sql.Row
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IMetadataItemDo
UnderlyingDB() *gorm.DB
schema.Tabler
FilterWithNameAndRole(name string, role string) (result []models.MetadataItem, err error)
}
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
func (m metadataItemDo) FilterWithNameAndRole(name string, role string) (result []models.MetadataItem, err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, name)
generateSQL.WriteString("SELECT * FROM metadata_items WHERE name = ? ")
if role != "" {
params = append(params, role)
generateSQL.WriteString("AND role = ? ")
}
var executeSQL *gorm.DB
executeSQL = m.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
err = executeSQL.Error
return
}
func (m metadataItemDo) Debug() IMetadataItemDo {
return m.withDO(m.DO.Debug())
}
func (m metadataItemDo) WithContext(ctx context.Context) IMetadataItemDo {
return m.withDO(m.DO.WithContext(ctx))
}
func (m metadataItemDo) ReadDB() IMetadataItemDo {
return m.Clauses(dbresolver.Read)
}
func (m metadataItemDo) WriteDB() IMetadataItemDo {
return m.Clauses(dbresolver.Write)
}
func (m metadataItemDo) Session(config *gorm.Session) IMetadataItemDo {
return m.withDO(m.DO.Session(config))
}
func (m metadataItemDo) Clauses(conds ...clause.Expression) IMetadataItemDo {
return m.withDO(m.DO.Clauses(conds...))
}
func (m metadataItemDo) Returning(value interface{}, columns ...string) IMetadataItemDo {
return m.withDO(m.DO.Returning(value, columns...))
}
func (m metadataItemDo) Not(conds ...gen.Condition) IMetadataItemDo {
return m.withDO(m.DO.Not(conds...))
}
func (m metadataItemDo) Or(conds ...gen.Condition) IMetadataItemDo {
return m.withDO(m.DO.Or(conds...))
}
func (m metadataItemDo) Select(conds ...field.Expr) IMetadataItemDo {
return m.withDO(m.DO.Select(conds...))
}
func (m metadataItemDo) Where(conds ...gen.Condition) IMetadataItemDo {
return m.withDO(m.DO.Where(conds...))
}
func (m metadataItemDo) Order(conds ...field.Expr) IMetadataItemDo {
return m.withDO(m.DO.Order(conds...))
}
func (m metadataItemDo) Distinct(cols ...field.Expr) IMetadataItemDo {
return m.withDO(m.DO.Distinct(cols...))
}
func (m metadataItemDo) Omit(cols ...field.Expr) IMetadataItemDo {
return m.withDO(m.DO.Omit(cols...))
}
func (m metadataItemDo) Join(table schema.Tabler, on ...field.Expr) IMetadataItemDo {
return m.withDO(m.DO.Join(table, on...))
}
func (m metadataItemDo) LeftJoin(table schema.Tabler, on ...field.Expr) IMetadataItemDo {
return m.withDO(m.DO.LeftJoin(table, on...))
}
func (m metadataItemDo) RightJoin(table schema.Tabler, on ...field.Expr) IMetadataItemDo {
return m.withDO(m.DO.RightJoin(table, on...))
}
func (m metadataItemDo) Group(cols ...field.Expr) IMetadataItemDo {
return m.withDO(m.DO.Group(cols...))
}
func (m metadataItemDo) Having(conds ...gen.Condition) IMetadataItemDo {
return m.withDO(m.DO.Having(conds...))
}
func (m metadataItemDo) Limit(limit int) IMetadataItemDo {
return m.withDO(m.DO.Limit(limit))
}
func (m metadataItemDo) Offset(offset int) IMetadataItemDo {
return m.withDO(m.DO.Offset(offset))
}
func (m metadataItemDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IMetadataItemDo {
return m.withDO(m.DO.Scopes(funcs...))
}
func (m metadataItemDo) Unscoped() IMetadataItemDo {
return m.withDO(m.DO.Unscoped())
}
func (m metadataItemDo) Create(values ...*models.MetadataItem) error {
if len(values) == 0 {
return nil
}
return m.DO.Create(values)
}
func (m metadataItemDo) CreateInBatches(values []*models.MetadataItem, batchSize int) error {
return m.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (m metadataItemDo) Save(values ...*models.MetadataItem) error {
if len(values) == 0 {
return nil
}
return m.DO.Save(values)
}
func (m metadataItemDo) First() (*models.MetadataItem, error) {
if result, err := m.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.MetadataItem), nil
}
}
func (m metadataItemDo) Take() (*models.MetadataItem, error) {
if result, err := m.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.MetadataItem), nil
}
}
func (m metadataItemDo) Last() (*models.MetadataItem, error) {
if result, err := m.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.MetadataItem), nil
}
}
func (m metadataItemDo) Find() ([]*models.MetadataItem, error) {
result, err := m.DO.Find()
return result.([]*models.MetadataItem), err
}
func (m metadataItemDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MetadataItem, err error) {
buf := make([]*models.MetadataItem, 0, batchSize)
err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (m metadataItemDo) FindInBatches(result *[]*models.MetadataItem, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return m.DO.FindInBatches(result, batchSize, fc)
}
func (m metadataItemDo) Attrs(attrs ...field.AssignExpr) IMetadataItemDo {
return m.withDO(m.DO.Attrs(attrs...))
}
func (m metadataItemDo) Assign(attrs ...field.AssignExpr) IMetadataItemDo {
return m.withDO(m.DO.Assign(attrs...))
}
func (m metadataItemDo) Joins(fields ...field.RelationField) IMetadataItemDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Joins(_f))
}
return &m
}
func (m metadataItemDo) Preload(fields ...field.RelationField) IMetadataItemDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Preload(_f))
}
return &m
}
func (m metadataItemDo) FirstOrInit() (*models.MetadataItem, error) {
if result, err := m.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.MetadataItem), nil
}
}
func (m metadataItemDo) FirstOrCreate() (*models.MetadataItem, error) {
if result, err := m.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.MetadataItem), nil
}
}
func (m metadataItemDo) FindByPage(offset int, limit int) (result []*models.MetadataItem, count int64, err error) {
result, err = m.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = m.Offset(-1).Limit(-1).Count()
return
}
func (m metadataItemDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = m.Count()
if err != nil {
return
}
err = m.Offset(offset).Limit(limit).Scan(result)
return
}
func (m metadataItemDo) Scan(result interface{}) (err error) {
return m.DO.Scan(result)
}
func (m metadataItemDo) Delete(models ...*models.MetadataItem) (result gen.ResultInfo, err error) {
return m.DO.Delete(models)
}
func (m *metadataItemDo) withDO(do gen.Dao) *metadataItemDo {
m.DO = *do.(*gen.DO)
return m
}

413
query/path_downloads.gen.go Normal file
View File

@ -0,0 +1,413 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"strings"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"canguidev/shelfy/internal/models"
)
func newPathDownload(db *gorm.DB, opts ...gen.DOOption) pathDownload {
_pathDownload := pathDownload{}
_pathDownload.pathDownloadDo.UseDB(db, opts...)
_pathDownload.pathDownloadDo.UseModel(&models.PathDownload{})
tableName := _pathDownload.pathDownloadDo.TableName()
_pathDownload.ALL = field.NewAsterisk(tableName)
_pathDownload.ID = field.NewInt64(tableName, "id")
_pathDownload.Path = field.NewString(tableName, "path")
_pathDownload.PathName = field.NewString(tableName, "path_name")
_pathDownload.fillFieldMap()
return _pathDownload
}
type pathDownload struct {
pathDownloadDo
ALL field.Asterisk
ID field.Int64
Path field.String
PathName field.String
fieldMap map[string]field.Expr
}
func (p pathDownload) Table(newTableName string) *pathDownload {
p.pathDownloadDo.UseTable(newTableName)
return p.updateTableName(newTableName)
}
func (p pathDownload) As(alias string) *pathDownload {
p.pathDownloadDo.DO = *(p.pathDownloadDo.As(alias).(*gen.DO))
return p.updateTableName(alias)
}
func (p *pathDownload) updateTableName(table string) *pathDownload {
p.ALL = field.NewAsterisk(table)
p.ID = field.NewInt64(table, "id")
p.Path = field.NewString(table, "path")
p.PathName = field.NewString(table, "path_name")
p.fillFieldMap()
return p
}
func (p *pathDownload) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := p.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (p *pathDownload) fillFieldMap() {
p.fieldMap = make(map[string]field.Expr, 3)
p.fieldMap["id"] = p.ID
p.fieldMap["path"] = p.Path
p.fieldMap["path_name"] = p.PathName
}
func (p pathDownload) clone(db *gorm.DB) pathDownload {
p.pathDownloadDo.ReplaceConnPool(db.Statement.ConnPool)
return p
}
func (p pathDownload) replaceDB(db *gorm.DB) pathDownload {
p.pathDownloadDo.ReplaceDB(db)
return p
}
type pathDownloadDo struct{ gen.DO }
type IPathDownloadDo interface {
gen.SubQuery
Debug() IPathDownloadDo
WithContext(ctx context.Context) IPathDownloadDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IPathDownloadDo
WriteDB() IPathDownloadDo
As(alias string) gen.Dao
Session(config *gorm.Session) IPathDownloadDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IPathDownloadDo
Not(conds ...gen.Condition) IPathDownloadDo
Or(conds ...gen.Condition) IPathDownloadDo
Select(conds ...field.Expr) IPathDownloadDo
Where(conds ...gen.Condition) IPathDownloadDo
Order(conds ...field.Expr) IPathDownloadDo
Distinct(cols ...field.Expr) IPathDownloadDo
Omit(cols ...field.Expr) IPathDownloadDo
Join(table schema.Tabler, on ...field.Expr) IPathDownloadDo
LeftJoin(table schema.Tabler, on ...field.Expr) IPathDownloadDo
RightJoin(table schema.Tabler, on ...field.Expr) IPathDownloadDo
Group(cols ...field.Expr) IPathDownloadDo
Having(conds ...gen.Condition) IPathDownloadDo
Limit(limit int) IPathDownloadDo
Offset(offset int) IPathDownloadDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IPathDownloadDo
Unscoped() IPathDownloadDo
Create(values ...*models.PathDownload) error
CreateInBatches(values []*models.PathDownload, batchSize int) error
Save(values ...*models.PathDownload) error
First() (*models.PathDownload, error)
Take() (*models.PathDownload, error)
Last() (*models.PathDownload, error)
Find() ([]*models.PathDownload, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.PathDownload, err error)
FindInBatches(result *[]*models.PathDownload, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.PathDownload) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IPathDownloadDo
Assign(attrs ...field.AssignExpr) IPathDownloadDo
Joins(fields ...field.RelationField) IPathDownloadDo
Preload(fields ...field.RelationField) IPathDownloadDo
FirstOrInit() (*models.PathDownload, error)
FirstOrCreate() (*models.PathDownload, error)
FindByPage(offset int, limit int) (result []*models.PathDownload, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Rows() (*sql.Rows, error)
Row() *sql.Row
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IPathDownloadDo
UnderlyingDB() *gorm.DB
schema.Tabler
FilterWithNameAndRole(name string, role string) (result []models.PathDownload, err error)
}
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
func (p pathDownloadDo) FilterWithNameAndRole(name string, role string) (result []models.PathDownload, err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, name)
generateSQL.WriteString("SELECT * FROM path_downloads WHERE name = ? ")
if role != "" {
params = append(params, role)
generateSQL.WriteString("AND role = ? ")
}
var executeSQL *gorm.DB
executeSQL = p.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
err = executeSQL.Error
return
}
func (p pathDownloadDo) Debug() IPathDownloadDo {
return p.withDO(p.DO.Debug())
}
func (p pathDownloadDo) WithContext(ctx context.Context) IPathDownloadDo {
return p.withDO(p.DO.WithContext(ctx))
}
func (p pathDownloadDo) ReadDB() IPathDownloadDo {
return p.Clauses(dbresolver.Read)
}
func (p pathDownloadDo) WriteDB() IPathDownloadDo {
return p.Clauses(dbresolver.Write)
}
func (p pathDownloadDo) Session(config *gorm.Session) IPathDownloadDo {
return p.withDO(p.DO.Session(config))
}
func (p pathDownloadDo) Clauses(conds ...clause.Expression) IPathDownloadDo {
return p.withDO(p.DO.Clauses(conds...))
}
func (p pathDownloadDo) Returning(value interface{}, columns ...string) IPathDownloadDo {
return p.withDO(p.DO.Returning(value, columns...))
}
func (p pathDownloadDo) Not(conds ...gen.Condition) IPathDownloadDo {
return p.withDO(p.DO.Not(conds...))
}
func (p pathDownloadDo) Or(conds ...gen.Condition) IPathDownloadDo {
return p.withDO(p.DO.Or(conds...))
}
func (p pathDownloadDo) Select(conds ...field.Expr) IPathDownloadDo {
return p.withDO(p.DO.Select(conds...))
}
func (p pathDownloadDo) Where(conds ...gen.Condition) IPathDownloadDo {
return p.withDO(p.DO.Where(conds...))
}
func (p pathDownloadDo) Order(conds ...field.Expr) IPathDownloadDo {
return p.withDO(p.DO.Order(conds...))
}
func (p pathDownloadDo) Distinct(cols ...field.Expr) IPathDownloadDo {
return p.withDO(p.DO.Distinct(cols...))
}
func (p pathDownloadDo) Omit(cols ...field.Expr) IPathDownloadDo {
return p.withDO(p.DO.Omit(cols...))
}
func (p pathDownloadDo) Join(table schema.Tabler, on ...field.Expr) IPathDownloadDo {
return p.withDO(p.DO.Join(table, on...))
}
func (p pathDownloadDo) LeftJoin(table schema.Tabler, on ...field.Expr) IPathDownloadDo {
return p.withDO(p.DO.LeftJoin(table, on...))
}
func (p pathDownloadDo) RightJoin(table schema.Tabler, on ...field.Expr) IPathDownloadDo {
return p.withDO(p.DO.RightJoin(table, on...))
}
func (p pathDownloadDo) Group(cols ...field.Expr) IPathDownloadDo {
return p.withDO(p.DO.Group(cols...))
}
func (p pathDownloadDo) Having(conds ...gen.Condition) IPathDownloadDo {
return p.withDO(p.DO.Having(conds...))
}
func (p pathDownloadDo) Limit(limit int) IPathDownloadDo {
return p.withDO(p.DO.Limit(limit))
}
func (p pathDownloadDo) Offset(offset int) IPathDownloadDo {
return p.withDO(p.DO.Offset(offset))
}
func (p pathDownloadDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IPathDownloadDo {
return p.withDO(p.DO.Scopes(funcs...))
}
func (p pathDownloadDo) Unscoped() IPathDownloadDo {
return p.withDO(p.DO.Unscoped())
}
func (p pathDownloadDo) Create(values ...*models.PathDownload) error {
if len(values) == 0 {
return nil
}
return p.DO.Create(values)
}
func (p pathDownloadDo) CreateInBatches(values []*models.PathDownload, batchSize int) error {
return p.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (p pathDownloadDo) Save(values ...*models.PathDownload) error {
if len(values) == 0 {
return nil
}
return p.DO.Save(values)
}
func (p pathDownloadDo) First() (*models.PathDownload, error) {
if result, err := p.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.PathDownload), nil
}
}
func (p pathDownloadDo) Take() (*models.PathDownload, error) {
if result, err := p.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.PathDownload), nil
}
}
func (p pathDownloadDo) Last() (*models.PathDownload, error) {
if result, err := p.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.PathDownload), nil
}
}
func (p pathDownloadDo) Find() ([]*models.PathDownload, error) {
result, err := p.DO.Find()
return result.([]*models.PathDownload), err
}
func (p pathDownloadDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.PathDownload, err error) {
buf := make([]*models.PathDownload, 0, batchSize)
err = p.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (p pathDownloadDo) FindInBatches(result *[]*models.PathDownload, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return p.DO.FindInBatches(result, batchSize, fc)
}
func (p pathDownloadDo) Attrs(attrs ...field.AssignExpr) IPathDownloadDo {
return p.withDO(p.DO.Attrs(attrs...))
}
func (p pathDownloadDo) Assign(attrs ...field.AssignExpr) IPathDownloadDo {
return p.withDO(p.DO.Assign(attrs...))
}
func (p pathDownloadDo) Joins(fields ...field.RelationField) IPathDownloadDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Joins(_f))
}
return &p
}
func (p pathDownloadDo) Preload(fields ...field.RelationField) IPathDownloadDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Preload(_f))
}
return &p
}
func (p pathDownloadDo) FirstOrInit() (*models.PathDownload, error) {
if result, err := p.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.PathDownload), nil
}
}
func (p pathDownloadDo) FirstOrCreate() (*models.PathDownload, error) {
if result, err := p.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.PathDownload), nil
}
}
func (p pathDownloadDo) FindByPage(offset int, limit int) (result []*models.PathDownload, count int64, err error) {
result, err = p.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = p.Offset(-1).Limit(-1).Count()
return
}
func (p pathDownloadDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = p.Count()
if err != nil {
return
}
err = p.Offset(offset).Limit(limit).Scan(result)
return
}
func (p pathDownloadDo) Scan(result interface{}) (err error) {
return p.DO.Scan(result)
}
func (p pathDownloadDo) Delete(models ...*models.PathDownload) (result gen.ResultInfo, err error) {
return p.DO.Delete(models)
}
func (p *pathDownloadDo) withDO(do gen.Dao) *pathDownloadDo {
p.DO = *do.(*gen.DO)
return p
}

View File

@ -0,0 +1,421 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"strings"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"canguidev/shelfy/internal/models"
)
func newSectionLocation(db *gorm.DB, opts ...gen.DOOption) sectionLocation {
_sectionLocation := sectionLocation{}
_sectionLocation.sectionLocationDo.UseDB(db, opts...)
_sectionLocation.sectionLocationDo.UseModel(&models.SectionLocation{})
tableName := _sectionLocation.sectionLocationDo.TableName()
_sectionLocation.ALL = field.NewAsterisk(tableName)
_sectionLocation.ID = field.NewInt64(tableName, "id")
_sectionLocation.LibrarySectionID = field.NewInt64(tableName, "library_section_id")
_sectionLocation.RootPath = field.NewString(tableName, "root_path")
_sectionLocation.CreatedAt = field.NewString(tableName, "created_at")
_sectionLocation.UpdatedAt = field.NewString(tableName, "updated_at")
_sectionLocation.fillFieldMap()
return _sectionLocation
}
type sectionLocation struct {
sectionLocationDo
ALL field.Asterisk
ID field.Int64
LibrarySectionID field.Int64
RootPath field.String
CreatedAt field.String
UpdatedAt field.String
fieldMap map[string]field.Expr
}
func (s sectionLocation) Table(newTableName string) *sectionLocation {
s.sectionLocationDo.UseTable(newTableName)
return s.updateTableName(newTableName)
}
func (s sectionLocation) As(alias string) *sectionLocation {
s.sectionLocationDo.DO = *(s.sectionLocationDo.As(alias).(*gen.DO))
return s.updateTableName(alias)
}
func (s *sectionLocation) updateTableName(table string) *sectionLocation {
s.ALL = field.NewAsterisk(table)
s.ID = field.NewInt64(table, "id")
s.LibrarySectionID = field.NewInt64(table, "library_section_id")
s.RootPath = field.NewString(table, "root_path")
s.CreatedAt = field.NewString(table, "created_at")
s.UpdatedAt = field.NewString(table, "updated_at")
s.fillFieldMap()
return s
}
func (s *sectionLocation) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := s.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (s *sectionLocation) fillFieldMap() {
s.fieldMap = make(map[string]field.Expr, 5)
s.fieldMap["id"] = s.ID
s.fieldMap["library_section_id"] = s.LibrarySectionID
s.fieldMap["root_path"] = s.RootPath
s.fieldMap["created_at"] = s.CreatedAt
s.fieldMap["updated_at"] = s.UpdatedAt
}
func (s sectionLocation) clone(db *gorm.DB) sectionLocation {
s.sectionLocationDo.ReplaceConnPool(db.Statement.ConnPool)
return s
}
func (s sectionLocation) replaceDB(db *gorm.DB) sectionLocation {
s.sectionLocationDo.ReplaceDB(db)
return s
}
type sectionLocationDo struct{ gen.DO }
type ISectionLocationDo interface {
gen.SubQuery
Debug() ISectionLocationDo
WithContext(ctx context.Context) ISectionLocationDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() ISectionLocationDo
WriteDB() ISectionLocationDo
As(alias string) gen.Dao
Session(config *gorm.Session) ISectionLocationDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) ISectionLocationDo
Not(conds ...gen.Condition) ISectionLocationDo
Or(conds ...gen.Condition) ISectionLocationDo
Select(conds ...field.Expr) ISectionLocationDo
Where(conds ...gen.Condition) ISectionLocationDo
Order(conds ...field.Expr) ISectionLocationDo
Distinct(cols ...field.Expr) ISectionLocationDo
Omit(cols ...field.Expr) ISectionLocationDo
Join(table schema.Tabler, on ...field.Expr) ISectionLocationDo
LeftJoin(table schema.Tabler, on ...field.Expr) ISectionLocationDo
RightJoin(table schema.Tabler, on ...field.Expr) ISectionLocationDo
Group(cols ...field.Expr) ISectionLocationDo
Having(conds ...gen.Condition) ISectionLocationDo
Limit(limit int) ISectionLocationDo
Offset(offset int) ISectionLocationDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) ISectionLocationDo
Unscoped() ISectionLocationDo
Create(values ...*models.SectionLocation) error
CreateInBatches(values []*models.SectionLocation, batchSize int) error
Save(values ...*models.SectionLocation) error
First() (*models.SectionLocation, error)
Take() (*models.SectionLocation, error)
Last() (*models.SectionLocation, error)
Find() ([]*models.SectionLocation, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.SectionLocation, err error)
FindInBatches(result *[]*models.SectionLocation, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.SectionLocation) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) ISectionLocationDo
Assign(attrs ...field.AssignExpr) ISectionLocationDo
Joins(fields ...field.RelationField) ISectionLocationDo
Preload(fields ...field.RelationField) ISectionLocationDo
FirstOrInit() (*models.SectionLocation, error)
FirstOrCreate() (*models.SectionLocation, error)
FindByPage(offset int, limit int) (result []*models.SectionLocation, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Rows() (*sql.Rows, error)
Row() *sql.Row
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) ISectionLocationDo
UnderlyingDB() *gorm.DB
schema.Tabler
FilterWithNameAndRole(name string, role string) (result []models.SectionLocation, err error)
}
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
func (s sectionLocationDo) FilterWithNameAndRole(name string, role string) (result []models.SectionLocation, err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, name)
generateSQL.WriteString("SELECT * FROM section_locations WHERE name = ? ")
if role != "" {
params = append(params, role)
generateSQL.WriteString("AND role = ? ")
}
var executeSQL *gorm.DB
executeSQL = s.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
err = executeSQL.Error
return
}
func (s sectionLocationDo) Debug() ISectionLocationDo {
return s.withDO(s.DO.Debug())
}
func (s sectionLocationDo) WithContext(ctx context.Context) ISectionLocationDo {
return s.withDO(s.DO.WithContext(ctx))
}
func (s sectionLocationDo) ReadDB() ISectionLocationDo {
return s.Clauses(dbresolver.Read)
}
func (s sectionLocationDo) WriteDB() ISectionLocationDo {
return s.Clauses(dbresolver.Write)
}
func (s sectionLocationDo) Session(config *gorm.Session) ISectionLocationDo {
return s.withDO(s.DO.Session(config))
}
func (s sectionLocationDo) Clauses(conds ...clause.Expression) ISectionLocationDo {
return s.withDO(s.DO.Clauses(conds...))
}
func (s sectionLocationDo) Returning(value interface{}, columns ...string) ISectionLocationDo {
return s.withDO(s.DO.Returning(value, columns...))
}
func (s sectionLocationDo) Not(conds ...gen.Condition) ISectionLocationDo {
return s.withDO(s.DO.Not(conds...))
}
func (s sectionLocationDo) Or(conds ...gen.Condition) ISectionLocationDo {
return s.withDO(s.DO.Or(conds...))
}
func (s sectionLocationDo) Select(conds ...field.Expr) ISectionLocationDo {
return s.withDO(s.DO.Select(conds...))
}
func (s sectionLocationDo) Where(conds ...gen.Condition) ISectionLocationDo {
return s.withDO(s.DO.Where(conds...))
}
func (s sectionLocationDo) Order(conds ...field.Expr) ISectionLocationDo {
return s.withDO(s.DO.Order(conds...))
}
func (s sectionLocationDo) Distinct(cols ...field.Expr) ISectionLocationDo {
return s.withDO(s.DO.Distinct(cols...))
}
func (s sectionLocationDo) Omit(cols ...field.Expr) ISectionLocationDo {
return s.withDO(s.DO.Omit(cols...))
}
func (s sectionLocationDo) Join(table schema.Tabler, on ...field.Expr) ISectionLocationDo {
return s.withDO(s.DO.Join(table, on...))
}
func (s sectionLocationDo) LeftJoin(table schema.Tabler, on ...field.Expr) ISectionLocationDo {
return s.withDO(s.DO.LeftJoin(table, on...))
}
func (s sectionLocationDo) RightJoin(table schema.Tabler, on ...field.Expr) ISectionLocationDo {
return s.withDO(s.DO.RightJoin(table, on...))
}
func (s sectionLocationDo) Group(cols ...field.Expr) ISectionLocationDo {
return s.withDO(s.DO.Group(cols...))
}
func (s sectionLocationDo) Having(conds ...gen.Condition) ISectionLocationDo {
return s.withDO(s.DO.Having(conds...))
}
func (s sectionLocationDo) Limit(limit int) ISectionLocationDo {
return s.withDO(s.DO.Limit(limit))
}
func (s sectionLocationDo) Offset(offset int) ISectionLocationDo {
return s.withDO(s.DO.Offset(offset))
}
func (s sectionLocationDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ISectionLocationDo {
return s.withDO(s.DO.Scopes(funcs...))
}
func (s sectionLocationDo) Unscoped() ISectionLocationDo {
return s.withDO(s.DO.Unscoped())
}
func (s sectionLocationDo) Create(values ...*models.SectionLocation) error {
if len(values) == 0 {
return nil
}
return s.DO.Create(values)
}
func (s sectionLocationDo) CreateInBatches(values []*models.SectionLocation, batchSize int) error {
return s.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (s sectionLocationDo) Save(values ...*models.SectionLocation) error {
if len(values) == 0 {
return nil
}
return s.DO.Save(values)
}
func (s sectionLocationDo) First() (*models.SectionLocation, error) {
if result, err := s.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.SectionLocation), nil
}
}
func (s sectionLocationDo) Take() (*models.SectionLocation, error) {
if result, err := s.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.SectionLocation), nil
}
}
func (s sectionLocationDo) Last() (*models.SectionLocation, error) {
if result, err := s.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.SectionLocation), nil
}
}
func (s sectionLocationDo) Find() ([]*models.SectionLocation, error) {
result, err := s.DO.Find()
return result.([]*models.SectionLocation), err
}
func (s sectionLocationDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.SectionLocation, err error) {
buf := make([]*models.SectionLocation, 0, batchSize)
err = s.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (s sectionLocationDo) FindInBatches(result *[]*models.SectionLocation, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return s.DO.FindInBatches(result, batchSize, fc)
}
func (s sectionLocationDo) Attrs(attrs ...field.AssignExpr) ISectionLocationDo {
return s.withDO(s.DO.Attrs(attrs...))
}
func (s sectionLocationDo) Assign(attrs ...field.AssignExpr) ISectionLocationDo {
return s.withDO(s.DO.Assign(attrs...))
}
func (s sectionLocationDo) Joins(fields ...field.RelationField) ISectionLocationDo {
for _, _f := range fields {
s = *s.withDO(s.DO.Joins(_f))
}
return &s
}
func (s sectionLocationDo) Preload(fields ...field.RelationField) ISectionLocationDo {
for _, _f := range fields {
s = *s.withDO(s.DO.Preload(_f))
}
return &s
}
func (s sectionLocationDo) FirstOrInit() (*models.SectionLocation, error) {
if result, err := s.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.SectionLocation), nil
}
}
func (s sectionLocationDo) FirstOrCreate() (*models.SectionLocation, error) {
if result, err := s.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.SectionLocation), nil
}
}
func (s sectionLocationDo) FindByPage(offset int, limit int) (result []*models.SectionLocation, count int64, err error) {
result, err = s.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = s.Offset(-1).Limit(-1).Count()
return
}
func (s sectionLocationDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = s.Count()
if err != nil {
return
}
err = s.Offset(offset).Limit(limit).Scan(result)
return
}
func (s sectionLocationDo) Scan(result interface{}) (err error) {
return s.DO.Scan(result)
}
func (s sectionLocationDo) Delete(models ...*models.SectionLocation) (result gen.ResultInfo, err error) {
return s.DO.Delete(models)
}
func (s *sectionLocationDo) withDO(do gen.Dao) *sectionLocationDo {
s.DO = *do.(*gen.DO)
return s
}

417
query/taggings.gen.go Normal file
View File

@ -0,0 +1,417 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"strings"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"canguidev/shelfy/internal/models"
)
func newTagging(db *gorm.DB, opts ...gen.DOOption) tagging {
_tagging := tagging{}
_tagging.taggingDo.UseDB(db, opts...)
_tagging.taggingDo.UseModel(&models.Tagging{})
tableName := _tagging.taggingDo.TableName()
_tagging.ALL = field.NewAsterisk(tableName)
_tagging.ID = field.NewInt64(tableName, "id")
_tagging.MetadataItemID = field.NewInt64(tableName, "metadata_item_id")
_tagging.TagID = field.NewInt64(tableName, "tag_id")
_tagging.Index = field.NewInt64(tableName, "index")
_tagging.fillFieldMap()
return _tagging
}
type tagging struct {
taggingDo
ALL field.Asterisk
ID field.Int64
MetadataItemID field.Int64
TagID field.Int64
Index field.Int64
fieldMap map[string]field.Expr
}
func (t tagging) Table(newTableName string) *tagging {
t.taggingDo.UseTable(newTableName)
return t.updateTableName(newTableName)
}
func (t tagging) As(alias string) *tagging {
t.taggingDo.DO = *(t.taggingDo.As(alias).(*gen.DO))
return t.updateTableName(alias)
}
func (t *tagging) updateTableName(table string) *tagging {
t.ALL = field.NewAsterisk(table)
t.ID = field.NewInt64(table, "id")
t.MetadataItemID = field.NewInt64(table, "metadata_item_id")
t.TagID = field.NewInt64(table, "tag_id")
t.Index = field.NewInt64(table, "index")
t.fillFieldMap()
return t
}
func (t *tagging) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := t.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (t *tagging) fillFieldMap() {
t.fieldMap = make(map[string]field.Expr, 4)
t.fieldMap["id"] = t.ID
t.fieldMap["metadata_item_id"] = t.MetadataItemID
t.fieldMap["tag_id"] = t.TagID
t.fieldMap["index"] = t.Index
}
func (t tagging) clone(db *gorm.DB) tagging {
t.taggingDo.ReplaceConnPool(db.Statement.ConnPool)
return t
}
func (t tagging) replaceDB(db *gorm.DB) tagging {
t.taggingDo.ReplaceDB(db)
return t
}
type taggingDo struct{ gen.DO }
type ITaggingDo interface {
gen.SubQuery
Debug() ITaggingDo
WithContext(ctx context.Context) ITaggingDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() ITaggingDo
WriteDB() ITaggingDo
As(alias string) gen.Dao
Session(config *gorm.Session) ITaggingDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) ITaggingDo
Not(conds ...gen.Condition) ITaggingDo
Or(conds ...gen.Condition) ITaggingDo
Select(conds ...field.Expr) ITaggingDo
Where(conds ...gen.Condition) ITaggingDo
Order(conds ...field.Expr) ITaggingDo
Distinct(cols ...field.Expr) ITaggingDo
Omit(cols ...field.Expr) ITaggingDo
Join(table schema.Tabler, on ...field.Expr) ITaggingDo
LeftJoin(table schema.Tabler, on ...field.Expr) ITaggingDo
RightJoin(table schema.Tabler, on ...field.Expr) ITaggingDo
Group(cols ...field.Expr) ITaggingDo
Having(conds ...gen.Condition) ITaggingDo
Limit(limit int) ITaggingDo
Offset(offset int) ITaggingDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) ITaggingDo
Unscoped() ITaggingDo
Create(values ...*models.Tagging) error
CreateInBatches(values []*models.Tagging, batchSize int) error
Save(values ...*models.Tagging) error
First() (*models.Tagging, error)
Take() (*models.Tagging, error)
Last() (*models.Tagging, error)
Find() ([]*models.Tagging, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Tagging, err error)
FindInBatches(result *[]*models.Tagging, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.Tagging) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) ITaggingDo
Assign(attrs ...field.AssignExpr) ITaggingDo
Joins(fields ...field.RelationField) ITaggingDo
Preload(fields ...field.RelationField) ITaggingDo
FirstOrInit() (*models.Tagging, error)
FirstOrCreate() (*models.Tagging, error)
FindByPage(offset int, limit int) (result []*models.Tagging, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Rows() (*sql.Rows, error)
Row() *sql.Row
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) ITaggingDo
UnderlyingDB() *gorm.DB
schema.Tabler
FilterWithNameAndRole(name string, role string) (result []models.Tagging, err error)
}
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
func (t taggingDo) FilterWithNameAndRole(name string, role string) (result []models.Tagging, err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, name)
generateSQL.WriteString("SELECT * FROM taggings WHERE name = ? ")
if role != "" {
params = append(params, role)
generateSQL.WriteString("AND role = ? ")
}
var executeSQL *gorm.DB
executeSQL = t.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
err = executeSQL.Error
return
}
func (t taggingDo) Debug() ITaggingDo {
return t.withDO(t.DO.Debug())
}
func (t taggingDo) WithContext(ctx context.Context) ITaggingDo {
return t.withDO(t.DO.WithContext(ctx))
}
func (t taggingDo) ReadDB() ITaggingDo {
return t.Clauses(dbresolver.Read)
}
func (t taggingDo) WriteDB() ITaggingDo {
return t.Clauses(dbresolver.Write)
}
func (t taggingDo) Session(config *gorm.Session) ITaggingDo {
return t.withDO(t.DO.Session(config))
}
func (t taggingDo) Clauses(conds ...clause.Expression) ITaggingDo {
return t.withDO(t.DO.Clauses(conds...))
}
func (t taggingDo) Returning(value interface{}, columns ...string) ITaggingDo {
return t.withDO(t.DO.Returning(value, columns...))
}
func (t taggingDo) Not(conds ...gen.Condition) ITaggingDo {
return t.withDO(t.DO.Not(conds...))
}
func (t taggingDo) Or(conds ...gen.Condition) ITaggingDo {
return t.withDO(t.DO.Or(conds...))
}
func (t taggingDo) Select(conds ...field.Expr) ITaggingDo {
return t.withDO(t.DO.Select(conds...))
}
func (t taggingDo) Where(conds ...gen.Condition) ITaggingDo {
return t.withDO(t.DO.Where(conds...))
}
func (t taggingDo) Order(conds ...field.Expr) ITaggingDo {
return t.withDO(t.DO.Order(conds...))
}
func (t taggingDo) Distinct(cols ...field.Expr) ITaggingDo {
return t.withDO(t.DO.Distinct(cols...))
}
func (t taggingDo) Omit(cols ...field.Expr) ITaggingDo {
return t.withDO(t.DO.Omit(cols...))
}
func (t taggingDo) Join(table schema.Tabler, on ...field.Expr) ITaggingDo {
return t.withDO(t.DO.Join(table, on...))
}
func (t taggingDo) LeftJoin(table schema.Tabler, on ...field.Expr) ITaggingDo {
return t.withDO(t.DO.LeftJoin(table, on...))
}
func (t taggingDo) RightJoin(table schema.Tabler, on ...field.Expr) ITaggingDo {
return t.withDO(t.DO.RightJoin(table, on...))
}
func (t taggingDo) Group(cols ...field.Expr) ITaggingDo {
return t.withDO(t.DO.Group(cols...))
}
func (t taggingDo) Having(conds ...gen.Condition) ITaggingDo {
return t.withDO(t.DO.Having(conds...))
}
func (t taggingDo) Limit(limit int) ITaggingDo {
return t.withDO(t.DO.Limit(limit))
}
func (t taggingDo) Offset(offset int) ITaggingDo {
return t.withDO(t.DO.Offset(offset))
}
func (t taggingDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ITaggingDo {
return t.withDO(t.DO.Scopes(funcs...))
}
func (t taggingDo) Unscoped() ITaggingDo {
return t.withDO(t.DO.Unscoped())
}
func (t taggingDo) Create(values ...*models.Tagging) error {
if len(values) == 0 {
return nil
}
return t.DO.Create(values)
}
func (t taggingDo) CreateInBatches(values []*models.Tagging, batchSize int) error {
return t.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (t taggingDo) Save(values ...*models.Tagging) error {
if len(values) == 0 {
return nil
}
return t.DO.Save(values)
}
func (t taggingDo) First() (*models.Tagging, error) {
if result, err := t.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.Tagging), nil
}
}
func (t taggingDo) Take() (*models.Tagging, error) {
if result, err := t.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.Tagging), nil
}
}
func (t taggingDo) Last() (*models.Tagging, error) {
if result, err := t.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.Tagging), nil
}
}
func (t taggingDo) Find() ([]*models.Tagging, error) {
result, err := t.DO.Find()
return result.([]*models.Tagging), err
}
func (t taggingDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Tagging, err error) {
buf := make([]*models.Tagging, 0, batchSize)
err = t.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (t taggingDo) FindInBatches(result *[]*models.Tagging, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return t.DO.FindInBatches(result, batchSize, fc)
}
func (t taggingDo) Attrs(attrs ...field.AssignExpr) ITaggingDo {
return t.withDO(t.DO.Attrs(attrs...))
}
func (t taggingDo) Assign(attrs ...field.AssignExpr) ITaggingDo {
return t.withDO(t.DO.Assign(attrs...))
}
func (t taggingDo) Joins(fields ...field.RelationField) ITaggingDo {
for _, _f := range fields {
t = *t.withDO(t.DO.Joins(_f))
}
return &t
}
func (t taggingDo) Preload(fields ...field.RelationField) ITaggingDo {
for _, _f := range fields {
t = *t.withDO(t.DO.Preload(_f))
}
return &t
}
func (t taggingDo) FirstOrInit() (*models.Tagging, error) {
if result, err := t.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.Tagging), nil
}
}
func (t taggingDo) FirstOrCreate() (*models.Tagging, error) {
if result, err := t.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.Tagging), nil
}
}
func (t taggingDo) FindByPage(offset int, limit int) (result []*models.Tagging, count int64, err error) {
result, err = t.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = t.Offset(-1).Limit(-1).Count()
return
}
func (t taggingDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = t.Count()
if err != nil {
return
}
err = t.Offset(offset).Limit(limit).Scan(result)
return
}
func (t taggingDo) Scan(result interface{}) (err error) {
return t.DO.Scan(result)
}
func (t taggingDo) Delete(models ...*models.Tagging) (result gen.ResultInfo, err error) {
return t.DO.Delete(models)
}
func (t *taggingDo) withDO(do gen.Dao) *taggingDo {
t.DO = *do.(*gen.DO)
return t
}

413
query/tags.gen.go Normal file
View File

@ -0,0 +1,413 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"strings"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"canguidev/shelfy/internal/models"
)
func newTag(db *gorm.DB, opts ...gen.DOOption) tag {
_tag := tag{}
_tag.tagDo.UseDB(db, opts...)
_tag.tagDo.UseModel(&models.Tag{})
tableName := _tag.tagDo.TableName()
_tag.ALL = field.NewAsterisk(tableName)
_tag.ID = field.NewInt64(tableName, "id")
_tag.Tag = field.NewString(tableName, "tag")
_tag.TagType = field.NewInt64(tableName, "tag_type")
_tag.fillFieldMap()
return _tag
}
type tag struct {
tagDo
ALL field.Asterisk
ID field.Int64
Tag field.String
TagType field.Int64
fieldMap map[string]field.Expr
}
func (t tag) Table(newTableName string) *tag {
t.tagDo.UseTable(newTableName)
return t.updateTableName(newTableName)
}
func (t tag) As(alias string) *tag {
t.tagDo.DO = *(t.tagDo.As(alias).(*gen.DO))
return t.updateTableName(alias)
}
func (t *tag) updateTableName(table string) *tag {
t.ALL = field.NewAsterisk(table)
t.ID = field.NewInt64(table, "id")
t.Tag = field.NewString(table, "tag")
t.TagType = field.NewInt64(table, "tag_type")
t.fillFieldMap()
return t
}
func (t *tag) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := t.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (t *tag) fillFieldMap() {
t.fieldMap = make(map[string]field.Expr, 3)
t.fieldMap["id"] = t.ID
t.fieldMap["tag"] = t.Tag
t.fieldMap["tag_type"] = t.TagType
}
func (t tag) clone(db *gorm.DB) tag {
t.tagDo.ReplaceConnPool(db.Statement.ConnPool)
return t
}
func (t tag) replaceDB(db *gorm.DB) tag {
t.tagDo.ReplaceDB(db)
return t
}
type tagDo struct{ gen.DO }
type ITagDo interface {
gen.SubQuery
Debug() ITagDo
WithContext(ctx context.Context) ITagDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() ITagDo
WriteDB() ITagDo
As(alias string) gen.Dao
Session(config *gorm.Session) ITagDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) ITagDo
Not(conds ...gen.Condition) ITagDo
Or(conds ...gen.Condition) ITagDo
Select(conds ...field.Expr) ITagDo
Where(conds ...gen.Condition) ITagDo
Order(conds ...field.Expr) ITagDo
Distinct(cols ...field.Expr) ITagDo
Omit(cols ...field.Expr) ITagDo
Join(table schema.Tabler, on ...field.Expr) ITagDo
LeftJoin(table schema.Tabler, on ...field.Expr) ITagDo
RightJoin(table schema.Tabler, on ...field.Expr) ITagDo
Group(cols ...field.Expr) ITagDo
Having(conds ...gen.Condition) ITagDo
Limit(limit int) ITagDo
Offset(offset int) ITagDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) ITagDo
Unscoped() ITagDo
Create(values ...*models.Tag) error
CreateInBatches(values []*models.Tag, batchSize int) error
Save(values ...*models.Tag) error
First() (*models.Tag, error)
Take() (*models.Tag, error)
Last() (*models.Tag, error)
Find() ([]*models.Tag, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Tag, err error)
FindInBatches(result *[]*models.Tag, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.Tag) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) ITagDo
Assign(attrs ...field.AssignExpr) ITagDo
Joins(fields ...field.RelationField) ITagDo
Preload(fields ...field.RelationField) ITagDo
FirstOrInit() (*models.Tag, error)
FirstOrCreate() (*models.Tag, error)
FindByPage(offset int, limit int) (result []*models.Tag, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Rows() (*sql.Rows, error)
Row() *sql.Row
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) ITagDo
UnderlyingDB() *gorm.DB
schema.Tabler
FilterWithNameAndRole(name string, role string) (result []models.Tag, err error)
}
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
func (t tagDo) FilterWithNameAndRole(name string, role string) (result []models.Tag, err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, name)
generateSQL.WriteString("SELECT * FROM tags WHERE name = ? ")
if role != "" {
params = append(params, role)
generateSQL.WriteString("AND role = ? ")
}
var executeSQL *gorm.DB
executeSQL = t.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
err = executeSQL.Error
return
}
func (t tagDo) Debug() ITagDo {
return t.withDO(t.DO.Debug())
}
func (t tagDo) WithContext(ctx context.Context) ITagDo {
return t.withDO(t.DO.WithContext(ctx))
}
func (t tagDo) ReadDB() ITagDo {
return t.Clauses(dbresolver.Read)
}
func (t tagDo) WriteDB() ITagDo {
return t.Clauses(dbresolver.Write)
}
func (t tagDo) Session(config *gorm.Session) ITagDo {
return t.withDO(t.DO.Session(config))
}
func (t tagDo) Clauses(conds ...clause.Expression) ITagDo {
return t.withDO(t.DO.Clauses(conds...))
}
func (t tagDo) Returning(value interface{}, columns ...string) ITagDo {
return t.withDO(t.DO.Returning(value, columns...))
}
func (t tagDo) Not(conds ...gen.Condition) ITagDo {
return t.withDO(t.DO.Not(conds...))
}
func (t tagDo) Or(conds ...gen.Condition) ITagDo {
return t.withDO(t.DO.Or(conds...))
}
func (t tagDo) Select(conds ...field.Expr) ITagDo {
return t.withDO(t.DO.Select(conds...))
}
func (t tagDo) Where(conds ...gen.Condition) ITagDo {
return t.withDO(t.DO.Where(conds...))
}
func (t tagDo) Order(conds ...field.Expr) ITagDo {
return t.withDO(t.DO.Order(conds...))
}
func (t tagDo) Distinct(cols ...field.Expr) ITagDo {
return t.withDO(t.DO.Distinct(cols...))
}
func (t tagDo) Omit(cols ...field.Expr) ITagDo {
return t.withDO(t.DO.Omit(cols...))
}
func (t tagDo) Join(table schema.Tabler, on ...field.Expr) ITagDo {
return t.withDO(t.DO.Join(table, on...))
}
func (t tagDo) LeftJoin(table schema.Tabler, on ...field.Expr) ITagDo {
return t.withDO(t.DO.LeftJoin(table, on...))
}
func (t tagDo) RightJoin(table schema.Tabler, on ...field.Expr) ITagDo {
return t.withDO(t.DO.RightJoin(table, on...))
}
func (t tagDo) Group(cols ...field.Expr) ITagDo {
return t.withDO(t.DO.Group(cols...))
}
func (t tagDo) Having(conds ...gen.Condition) ITagDo {
return t.withDO(t.DO.Having(conds...))
}
func (t tagDo) Limit(limit int) ITagDo {
return t.withDO(t.DO.Limit(limit))
}
func (t tagDo) Offset(offset int) ITagDo {
return t.withDO(t.DO.Offset(offset))
}
func (t tagDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ITagDo {
return t.withDO(t.DO.Scopes(funcs...))
}
func (t tagDo) Unscoped() ITagDo {
return t.withDO(t.DO.Unscoped())
}
func (t tagDo) Create(values ...*models.Tag) error {
if len(values) == 0 {
return nil
}
return t.DO.Create(values)
}
func (t tagDo) CreateInBatches(values []*models.Tag, batchSize int) error {
return t.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (t tagDo) Save(values ...*models.Tag) error {
if len(values) == 0 {
return nil
}
return t.DO.Save(values)
}
func (t tagDo) First() (*models.Tag, error) {
if result, err := t.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.Tag), nil
}
}
func (t tagDo) Take() (*models.Tag, error) {
if result, err := t.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.Tag), nil
}
}
func (t tagDo) Last() (*models.Tag, error) {
if result, err := t.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.Tag), nil
}
}
func (t tagDo) Find() ([]*models.Tag, error) {
result, err := t.DO.Find()
return result.([]*models.Tag), err
}
func (t tagDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Tag, err error) {
buf := make([]*models.Tag, 0, batchSize)
err = t.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (t tagDo) FindInBatches(result *[]*models.Tag, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return t.DO.FindInBatches(result, batchSize, fc)
}
func (t tagDo) Attrs(attrs ...field.AssignExpr) ITagDo {
return t.withDO(t.DO.Attrs(attrs...))
}
func (t tagDo) Assign(attrs ...field.AssignExpr) ITagDo {
return t.withDO(t.DO.Assign(attrs...))
}
func (t tagDo) Joins(fields ...field.RelationField) ITagDo {
for _, _f := range fields {
t = *t.withDO(t.DO.Joins(_f))
}
return &t
}
func (t tagDo) Preload(fields ...field.RelationField) ITagDo {
for _, _f := range fields {
t = *t.withDO(t.DO.Preload(_f))
}
return &t
}
func (t tagDo) FirstOrInit() (*models.Tag, error) {
if result, err := t.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.Tag), nil
}
}
func (t tagDo) FirstOrCreate() (*models.Tag, error) {
if result, err := t.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.Tag), nil
}
}
func (t tagDo) FindByPage(offset int, limit int) (result []*models.Tag, count int64, err error) {
result, err = t.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = t.Offset(-1).Limit(-1).Count()
return
}
func (t tagDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = t.Count()
if err != nil {
return
}
err = t.Offset(offset).Limit(limit).Scan(result)
return
}
func (t tagDo) Scan(result interface{}) (err error) {
return t.DO.Scan(result)
}
func (t tagDo) Delete(models ...*models.Tag) (result gen.ResultInfo, err error) {
return t.DO.Delete(models)
}
func (t *tagDo) withDO(do gen.Dao) *tagDo {
t.DO = *do.(*gen.DO)
return t
}

421
query/users.gen.go Normal file
View File

@ -0,0 +1,421 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"strings"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"canguidev/shelfy/internal/models"
)
func newUser(db *gorm.DB, opts ...gen.DOOption) user {
_user := user{}
_user.userDo.UseDB(db, opts...)
_user.userDo.UseModel(&models.User{})
tableName := _user.userDo.TableName()
_user.ALL = field.NewAsterisk(tableName)
_user.ID = field.NewUint(tableName, "id")
_user.Username = field.NewString(tableName, "username")
_user.Name = field.NewString(tableName, "name")
_user.Email = field.NewString(tableName, "email")
_user.Password = field.NewString(tableName, "password")
_user.fillFieldMap()
return _user
}
type user struct {
userDo
ALL field.Asterisk
ID field.Uint
Username field.String
Name field.String
Email field.String
Password field.String
fieldMap map[string]field.Expr
}
func (u user) Table(newTableName string) *user {
u.userDo.UseTable(newTableName)
return u.updateTableName(newTableName)
}
func (u user) As(alias string) *user {
u.userDo.DO = *(u.userDo.As(alias).(*gen.DO))
return u.updateTableName(alias)
}
func (u *user) updateTableName(table string) *user {
u.ALL = field.NewAsterisk(table)
u.ID = field.NewUint(table, "id")
u.Username = field.NewString(table, "username")
u.Name = field.NewString(table, "name")
u.Email = field.NewString(table, "email")
u.Password = field.NewString(table, "password")
u.fillFieldMap()
return u
}
func (u *user) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := u.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (u *user) fillFieldMap() {
u.fieldMap = make(map[string]field.Expr, 5)
u.fieldMap["id"] = u.ID
u.fieldMap["username"] = u.Username
u.fieldMap["name"] = u.Name
u.fieldMap["email"] = u.Email
u.fieldMap["password"] = u.Password
}
func (u user) clone(db *gorm.DB) user {
u.userDo.ReplaceConnPool(db.Statement.ConnPool)
return u
}
func (u user) replaceDB(db *gorm.DB) user {
u.userDo.ReplaceDB(db)
return u
}
type userDo struct{ gen.DO }
type IUserDo interface {
gen.SubQuery
Debug() IUserDo
WithContext(ctx context.Context) IUserDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IUserDo
WriteDB() IUserDo
As(alias string) gen.Dao
Session(config *gorm.Session) IUserDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IUserDo
Not(conds ...gen.Condition) IUserDo
Or(conds ...gen.Condition) IUserDo
Select(conds ...field.Expr) IUserDo
Where(conds ...gen.Condition) IUserDo
Order(conds ...field.Expr) IUserDo
Distinct(cols ...field.Expr) IUserDo
Omit(cols ...field.Expr) IUserDo
Join(table schema.Tabler, on ...field.Expr) IUserDo
LeftJoin(table schema.Tabler, on ...field.Expr) IUserDo
RightJoin(table schema.Tabler, on ...field.Expr) IUserDo
Group(cols ...field.Expr) IUserDo
Having(conds ...gen.Condition) IUserDo
Limit(limit int) IUserDo
Offset(offset int) IUserDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IUserDo
Unscoped() IUserDo
Create(values ...*models.User) error
CreateInBatches(values []*models.User, batchSize int) error
Save(values ...*models.User) error
First() (*models.User, error)
Take() (*models.User, error)
Last() (*models.User, error)
Find() ([]*models.User, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.User, err error)
FindInBatches(result *[]*models.User, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.User) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IUserDo
Assign(attrs ...field.AssignExpr) IUserDo
Joins(fields ...field.RelationField) IUserDo
Preload(fields ...field.RelationField) IUserDo
FirstOrInit() (*models.User, error)
FirstOrCreate() (*models.User, error)
FindByPage(offset int, limit int) (result []*models.User, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Rows() (*sql.Rows, error)
Row() *sql.Row
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IUserDo
UnderlyingDB() *gorm.DB
schema.Tabler
FilterWithNameAndRole(name string, role string) (result []models.User, err error)
}
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
func (u userDo) FilterWithNameAndRole(name string, role string) (result []models.User, err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, name)
generateSQL.WriteString("SELECT * FROM users WHERE name = ? ")
if role != "" {
params = append(params, role)
generateSQL.WriteString("AND role = ? ")
}
var executeSQL *gorm.DB
executeSQL = u.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
err = executeSQL.Error
return
}
func (u userDo) Debug() IUserDo {
return u.withDO(u.DO.Debug())
}
func (u userDo) WithContext(ctx context.Context) IUserDo {
return u.withDO(u.DO.WithContext(ctx))
}
func (u userDo) ReadDB() IUserDo {
return u.Clauses(dbresolver.Read)
}
func (u userDo) WriteDB() IUserDo {
return u.Clauses(dbresolver.Write)
}
func (u userDo) Session(config *gorm.Session) IUserDo {
return u.withDO(u.DO.Session(config))
}
func (u userDo) Clauses(conds ...clause.Expression) IUserDo {
return u.withDO(u.DO.Clauses(conds...))
}
func (u userDo) Returning(value interface{}, columns ...string) IUserDo {
return u.withDO(u.DO.Returning(value, columns...))
}
func (u userDo) Not(conds ...gen.Condition) IUserDo {
return u.withDO(u.DO.Not(conds...))
}
func (u userDo) Or(conds ...gen.Condition) IUserDo {
return u.withDO(u.DO.Or(conds...))
}
func (u userDo) Select(conds ...field.Expr) IUserDo {
return u.withDO(u.DO.Select(conds...))
}
func (u userDo) Where(conds ...gen.Condition) IUserDo {
return u.withDO(u.DO.Where(conds...))
}
func (u userDo) Order(conds ...field.Expr) IUserDo {
return u.withDO(u.DO.Order(conds...))
}
func (u userDo) Distinct(cols ...field.Expr) IUserDo {
return u.withDO(u.DO.Distinct(cols...))
}
func (u userDo) Omit(cols ...field.Expr) IUserDo {
return u.withDO(u.DO.Omit(cols...))
}
func (u userDo) Join(table schema.Tabler, on ...field.Expr) IUserDo {
return u.withDO(u.DO.Join(table, on...))
}
func (u userDo) LeftJoin(table schema.Tabler, on ...field.Expr) IUserDo {
return u.withDO(u.DO.LeftJoin(table, on...))
}
func (u userDo) RightJoin(table schema.Tabler, on ...field.Expr) IUserDo {
return u.withDO(u.DO.RightJoin(table, on...))
}
func (u userDo) Group(cols ...field.Expr) IUserDo {
return u.withDO(u.DO.Group(cols...))
}
func (u userDo) Having(conds ...gen.Condition) IUserDo {
return u.withDO(u.DO.Having(conds...))
}
func (u userDo) Limit(limit int) IUserDo {
return u.withDO(u.DO.Limit(limit))
}
func (u userDo) Offset(offset int) IUserDo {
return u.withDO(u.DO.Offset(offset))
}
func (u userDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IUserDo {
return u.withDO(u.DO.Scopes(funcs...))
}
func (u userDo) Unscoped() IUserDo {
return u.withDO(u.DO.Unscoped())
}
func (u userDo) Create(values ...*models.User) error {
if len(values) == 0 {
return nil
}
return u.DO.Create(values)
}
func (u userDo) CreateInBatches(values []*models.User, batchSize int) error {
return u.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (u userDo) Save(values ...*models.User) error {
if len(values) == 0 {
return nil
}
return u.DO.Save(values)
}
func (u userDo) First() (*models.User, error) {
if result, err := u.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.User), nil
}
}
func (u userDo) Take() (*models.User, error) {
if result, err := u.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.User), nil
}
}
func (u userDo) Last() (*models.User, error) {
if result, err := u.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.User), nil
}
}
func (u userDo) Find() ([]*models.User, error) {
result, err := u.DO.Find()
return result.([]*models.User), err
}
func (u userDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.User, err error) {
buf := make([]*models.User, 0, batchSize)
err = u.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (u userDo) FindInBatches(result *[]*models.User, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return u.DO.FindInBatches(result, batchSize, fc)
}
func (u userDo) Attrs(attrs ...field.AssignExpr) IUserDo {
return u.withDO(u.DO.Attrs(attrs...))
}
func (u userDo) Assign(attrs ...field.AssignExpr) IUserDo {
return u.withDO(u.DO.Assign(attrs...))
}
func (u userDo) Joins(fields ...field.RelationField) IUserDo {
for _, _f := range fields {
u = *u.withDO(u.DO.Joins(_f))
}
return &u
}
func (u userDo) Preload(fields ...field.RelationField) IUserDo {
for _, _f := range fields {
u = *u.withDO(u.DO.Preload(_f))
}
return &u
}
func (u userDo) FirstOrInit() (*models.User, error) {
if result, err := u.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.User), nil
}
}
func (u userDo) FirstOrCreate() (*models.User, error) {
if result, err := u.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.User), nil
}
}
func (u userDo) FindByPage(offset int, limit int) (result []*models.User, count int64, err error) {
result, err = u.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = u.Offset(-1).Limit(-1).Count()
return
}
func (u userDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = u.Count()
if err != nil {
return
}
err = u.Offset(offset).Limit(limit).Scan(result)
return
}
func (u userDo) Scan(result interface{}) (err error) {
return u.DO.Scan(result)
}
func (u userDo) Delete(models ...*models.User) (result gen.ResultInfo, err error) {
return u.DO.Delete(models)
}
func (u *userDo) withDO(do gen.Dao) *userDo {
u.DO = *do.(*gen.DO)
return u
}

1
web/.last_build_id Normal file
View File

@ -0,0 +1 @@
e81c39b9cd57a0a3f3893af7805594cb

View File

@ -0,0 +1 @@
2packages/cupertino_icons/assets/CupertinoIcons.ttf  asset2packages/cupertino_icons/assets/CupertinoIcons.ttf*packages/media_kit/assets/web/hls1.4.10.js  asset*packages/media_kit/assets/web/hls1.4.10.js)packages/wakelock_plus/assets/no_sleep.js  asset)packages/wakelock_plus/assets/no_sleep.js

View File

@ -0,0 +1 @@
"DQMHMnBhY2thZ2VzL2N1cGVydGlub19pY29ucy9hc3NldHMvQ3VwZXJ0aW5vSWNvbnMudHRmDAENAQcFYXNzZXQHMnBhY2thZ2VzL2N1cGVydGlub19pY29ucy9hc3NldHMvQ3VwZXJ0aW5vSWNvbnMudHRmBypwYWNrYWdlcy9tZWRpYV9raXQvYXNzZXRzL3dlYi9obHMxLjQuMTAuanMMAQ0BBwVhc3NldAcqcGFja2FnZXMvbWVkaWFfa2l0L2Fzc2V0cy93ZWIvaGxzMS40LjEwLmpzBylwYWNrYWdlcy93YWtlbG9ja19wbHVzL2Fzc2V0cy9ub19zbGVlcC5qcwwBDQEHBWFzc2V0BylwYWNrYWdlcy93YWtlbG9ja19wbHVzL2Fzc2V0cy9ub19zbGVlcC5qcw=="

View File

@ -0,0 +1 @@
{"packages/cupertino_icons/assets/CupertinoIcons.ttf":["packages/cupertino_icons/assets/CupertinoIcons.ttf"],"packages/media_kit/assets/web/hls1.4.10.js":["packages/media_kit/assets/web/hls1.4.10.js"],"packages/wakelock_plus/assets/no_sleep.js":["packages/wakelock_plus/assets/no_sleep.js"]}

View File

@ -0,0 +1 @@
[{"family":"MaterialIcons","fonts":[{"asset":"fonts/MaterialIcons-Regular.otf"}]},{"family":"packages/cupertino_icons/CupertinoIcons","fonts":[{"asset":"packages/cupertino_icons/assets/CupertinoIcons.ttf"}]}]

34774
web/assets/NOTICES Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

192
web/canvaskit/canvaskit.js Normal file
View File

@ -0,0 +1,192 @@
var CanvasKitInit = (() => {
var _scriptName = import.meta.url;
return (
function(moduleArg = {}) {
var moduleRtn;
var r=moduleArg,ba,ca,da=new Promise((a,b)=>{ba=a;ca=b}),fa="object"==typeof window,ia="function"==typeof importScripts;
(function(a){a.ce=a.ce||[];a.ce.push(function(){a.MakeSWCanvasSurface=function(b){var c=b,e="undefined"!==typeof OffscreenCanvas&&c instanceof OffscreenCanvas;if(!("undefined"!==typeof HTMLCanvasElement&&c instanceof HTMLCanvasElement||e||(c=document.getElementById(b),c)))throw"Canvas with id "+b+" was not found";if(b=a.MakeSurface(c.width,c.height))b.Ae=c;return b};a.MakeCanvasSurface||(a.MakeCanvasSurface=a.MakeSWCanvasSurface);a.MakeSurface=function(b,c){var e={width:b,height:c,colorType:a.ColorType.RGBA_8888,
alphaType:a.AlphaType.Unpremul,colorSpace:a.ColorSpace.SRGB},f=b*c*4,k=a._malloc(f);if(e=a.Surface._makeRasterDirect(e,k,4*b))e.Ae=null,e.$e=b,e.Xe=c,e.Ye=f,e.He=k,e.getCanvas().clear(a.TRANSPARENT);return e};a.MakeRasterDirectSurface=function(b,c,e){return a.Surface._makeRasterDirect(b,c.byteOffset,e)};a.Surface.prototype.flush=function(b){a.$d(this.Zd);this._flush();if(this.Ae){var c=new Uint8ClampedArray(a.HEAPU8.buffer,this.He,this.Ye);c=new ImageData(c,this.$e,this.Xe);b?this.Ae.getContext("2d").putImageData(c,
0,0,b[0],b[1],b[2]-b[0],b[3]-b[1]):this.Ae.getContext("2d").putImageData(c,0,0)}};a.Surface.prototype.dispose=function(){this.He&&a._free(this.He);this.delete()};a.$d=a.$d||function(){};a.Be=a.Be||function(){return null}})})(r);
(function(a){a.ce=a.ce||[];a.ce.push(function(){function b(l,p,v){return l&&l.hasOwnProperty(p)?l[p]:v}function c(l){var p=ja(ka);ka[p]=l;return p}function e(l){return l.naturalHeight||l.videoHeight||l.displayHeight||l.height}function f(l){return l.naturalWidth||l.videoWidth||l.displayWidth||l.width}function k(l,p,v,w){l.bindTexture(l.TEXTURE_2D,p);w||v.alphaType!==a.AlphaType.Premul||l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0);return p}function n(l,p,v){v||p.alphaType!==a.AlphaType.Premul||
l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1);l.bindTexture(l.TEXTURE_2D,null)}a.GetWebGLContext=function(l,p){if(!l)throw"null canvas passed into makeWebGLContext";var v={alpha:b(p,"alpha",1),depth:b(p,"depth",1),stencil:b(p,"stencil",8),antialias:b(p,"antialias",0),premultipliedAlpha:b(p,"premultipliedAlpha",1),preserveDrawingBuffer:b(p,"preserveDrawingBuffer",0),preferLowPowerToHighPerformance:b(p,"preferLowPowerToHighPerformance",0),failIfMajorPerformanceCaveat:b(p,"failIfMajorPerformanceCaveat",
0),enableExtensionsByDefault:b(p,"enableExtensionsByDefault",1),explicitSwapControl:b(p,"explicitSwapControl",0),renderViaOffscreenBackBuffer:b(p,"renderViaOffscreenBackBuffer",0)};v.majorVersion=p&&p.majorVersion?p.majorVersion:"undefined"!==typeof WebGL2RenderingContext?2:1;if(v.explicitSwapControl)throw"explicitSwapControl is not supported";l=na(l,v);if(!l)return 0;oa(l);z.le.getExtension("WEBGL_debug_renderer_info");return l};a.deleteContext=function(l){z===pa[l]&&(z=null);"object"==typeof JSEvents&&
JSEvents.Af(pa[l].le.canvas);pa[l]&&pa[l].le.canvas&&(pa[l].le.canvas.Ve=void 0);pa[l]=null};a._setTextureCleanup({deleteTexture:function(l,p){var v=ka[p];v&&pa[l].le.deleteTexture(v);ka[p]=null}});a.MakeWebGLContext=function(l){if(!this.$d(l))return null;var p=this._MakeGrContext();if(!p)return null;p.Zd=l;var v=p.delete.bind(p);p["delete"]=function(){a.$d(this.Zd);v()}.bind(p);return z.Je=p};a.MakeGrContext=a.MakeWebGLContext;a.GrDirectContext.prototype.getResourceCacheLimitBytes=function(){a.$d(this.Zd);
this._getResourceCacheLimitBytes()};a.GrDirectContext.prototype.getResourceCacheUsageBytes=function(){a.$d(this.Zd);this._getResourceCacheUsageBytes()};a.GrDirectContext.prototype.releaseResourcesAndAbandonContext=function(){a.$d(this.Zd);this._releaseResourcesAndAbandonContext()};a.GrDirectContext.prototype.setResourceCacheLimitBytes=function(l){a.$d(this.Zd);this._setResourceCacheLimitBytes(l)};a.MakeOnScreenGLSurface=function(l,p,v,w,A,D){if(!this.$d(l.Zd))return null;p=void 0===A||void 0===D?
this._MakeOnScreenGLSurface(l,p,v,w):this._MakeOnScreenGLSurface(l,p,v,w,A,D);if(!p)return null;p.Zd=l.Zd;return p};a.MakeRenderTarget=function(){var l=arguments[0];if(!this.$d(l.Zd))return null;if(3===arguments.length){var p=this._MakeRenderTargetWH(l,arguments[1],arguments[2]);if(!p)return null}else if(2===arguments.length){if(p=this._MakeRenderTargetII(l,arguments[1]),!p)return null}else return null;p.Zd=l.Zd;return p};a.MakeWebGLCanvasSurface=function(l,p,v){p=p||null;var w=l,A="undefined"!==
typeof OffscreenCanvas&&w instanceof OffscreenCanvas;if(!("undefined"!==typeof HTMLCanvasElement&&w instanceof HTMLCanvasElement||A||(w=document.getElementById(l),w)))throw"Canvas with id "+l+" was not found";l=this.GetWebGLContext(w,v);if(!l||0>l)throw"failed to create webgl context: err "+l;l=this.MakeWebGLContext(l);p=this.MakeOnScreenGLSurface(l,w.width,w.height,p);return p?p:(p=w.cloneNode(!0),w.parentNode.replaceChild(p,w),p.classList.add("ck-replaced"),a.MakeSWCanvasSurface(p))};a.MakeCanvasSurface=
a.MakeWebGLCanvasSurface;a.Surface.prototype.makeImageFromTexture=function(l,p){a.$d(this.Zd);l=c(l);if(p=this._makeImageFromTexture(this.Zd,l,p))p.ue=l;return p};a.Surface.prototype.makeImageFromTextureSource=function(l,p,v){p||={height:e(l),width:f(l),colorType:a.ColorType.RGBA_8888,alphaType:v?a.AlphaType.Premul:a.AlphaType.Unpremul};p.colorSpace||(p.colorSpace=a.ColorSpace.SRGB);a.$d(this.Zd);var w=z.le;v=k(w,w.createTexture(),p,v);2===z.version?w.texImage2D(w.TEXTURE_2D,0,w.RGBA,p.width,p.height,
0,w.RGBA,w.UNSIGNED_BYTE,l):w.texImage2D(w.TEXTURE_2D,0,w.RGBA,w.RGBA,w.UNSIGNED_BYTE,l);n(w,p);this._resetContext();return this.makeImageFromTexture(v,p)};a.Surface.prototype.updateTextureFromSource=function(l,p,v){if(l.ue){a.$d(this.Zd);var w=l.getImageInfo(),A=z.le,D=k(A,ka[l.ue],w,v);2===z.version?A.texImage2D(A.TEXTURE_2D,0,A.RGBA,f(p),e(p),0,A.RGBA,A.UNSIGNED_BYTE,p):A.texImage2D(A.TEXTURE_2D,0,A.RGBA,A.RGBA,A.UNSIGNED_BYTE,p);n(A,w,v);this._resetContext();ka[l.ue]=null;l.ue=c(D);w.colorSpace=
l.getColorSpace();p=this._makeImageFromTexture(this.Zd,l.ue,w);v=l.Yd.ae;A=l.Yd.ee;l.Yd.ae=p.Yd.ae;l.Yd.ee=p.Yd.ee;p.Yd.ae=v;p.Yd.ee=A;p.delete();w.colorSpace.delete()}};a.MakeLazyImageFromTextureSource=function(l,p,v){p||={height:e(l),width:f(l),colorType:a.ColorType.RGBA_8888,alphaType:v?a.AlphaType.Premul:a.AlphaType.Unpremul};p.colorSpace||(p.colorSpace=a.ColorSpace.SRGB);var w={makeTexture:function(){var A=z,D=A.le,I=k(D,D.createTexture(),p,v);2===A.version?D.texImage2D(D.TEXTURE_2D,0,D.RGBA,
p.width,p.height,0,D.RGBA,D.UNSIGNED_BYTE,l):D.texImage2D(D.TEXTURE_2D,0,D.RGBA,D.RGBA,D.UNSIGNED_BYTE,l);n(D,p,v);return c(I)},freeSrc:function(){}};"VideoFrame"===l.constructor.name&&(w.freeSrc=function(){l.close()});return a.Image._makeFromGenerator(p,w)};a.$d=function(l){return l?oa(l):!1};a.Be=function(){return z&&z.Je&&!z.Je.isDeleted()?z.Je:null}})})(r);
(function(a){function b(g){return(f(255*g[3])<<24|f(255*g[0])<<16|f(255*g[1])<<8|f(255*g[2])<<0)>>>0}function c(g){if(g&&g._ck)return g;if(g instanceof Float32Array){for(var d=Math.floor(g.length/4),h=new Uint32Array(d),m=0;m<d;m++)h[m]=b(g.slice(4*m,4*(m+1)));return h}if(g instanceof Uint32Array)return g;if(g instanceof Array&&g[0]instanceof Float32Array)return g.map(b)}function e(g){if(void 0===g)return 1;var d=parseFloat(g);return g&&-1!==g.indexOf("%")?d/100:d}function f(g){return Math.round(Math.max(0,
Math.min(g||0,255)))}function k(g,d){d&&d._ck||a._free(g)}function n(g,d,h){if(!g||!g.length)return 0;if(g&&g._ck)return g.byteOffset;var m=a[d].BYTES_PER_ELEMENT;h||=a._malloc(g.length*m);a[d].set(g,h/m);return h}function l(g){var d={he:0,count:g.length,colorType:a.ColorType.RGBA_F32};if(g instanceof Float32Array)d.he=n(g,"HEAPF32"),d.count=g.length/4;else if(g instanceof Uint32Array)d.he=n(g,"HEAPU32"),d.colorType=a.ColorType.RGBA_8888;else if(g instanceof Array){if(g&&g.length){for(var h=a._malloc(16*
g.length),m=0,t=h/4,u=0;u<g.length;u++)for(var x=0;4>x;x++)a.HEAPF32[t+m]=g[u][x],m++;g=h}else g=0;d.he=g}else throw"Invalid argument to copyFlexibleColorArray, Not a color array "+typeof g;return d}function p(g){if(!g)return 0;var d=aa.toTypedArray();if(g.length){if(6===g.length||9===g.length)return n(g,"HEAPF32",P),6===g.length&&a.HEAPF32.set(Vc,6+P/4),P;if(16===g.length)return d[0]=g[0],d[1]=g[1],d[2]=g[3],d[3]=g[4],d[4]=g[5],d[5]=g[7],d[6]=g[12],d[7]=g[13],d[8]=g[15],P;throw"invalid matrix size";
}if(void 0===g.m11)throw"invalid matrix argument";d[0]=g.m11;d[1]=g.m21;d[2]=g.m41;d[3]=g.m12;d[4]=g.m22;d[5]=g.m42;d[6]=g.m14;d[7]=g.m24;d[8]=g.m44;return P}function v(g){if(!g)return 0;var d=X.toTypedArray();if(g.length){if(16!==g.length&&6!==g.length&&9!==g.length)throw"invalid matrix size";if(16===g.length)return n(g,"HEAPF32",la);d.fill(0);d[0]=g[0];d[1]=g[1];d[3]=g[2];d[4]=g[3];d[5]=g[4];d[7]=g[5];d[10]=1;d[12]=g[6];d[13]=g[7];d[15]=g[8];6===g.length&&(d[12]=0,d[13]=0,d[15]=1);return la}if(void 0===
g.m11)throw"invalid matrix argument";d[0]=g.m11;d[1]=g.m21;d[2]=g.m31;d[3]=g.m41;d[4]=g.m12;d[5]=g.m22;d[6]=g.m32;d[7]=g.m42;d[8]=g.m13;d[9]=g.m23;d[10]=g.m33;d[11]=g.m43;d[12]=g.m14;d[13]=g.m24;d[14]=g.m34;d[15]=g.m44;return la}function w(g,d){return n(g,"HEAPF32",d||ha)}function A(g,d,h,m){var t=Ea.toTypedArray();t[0]=g;t[1]=d;t[2]=h;t[3]=m;return ha}function D(g){for(var d=new Float32Array(4),h=0;4>h;h++)d[h]=a.HEAPF32[g/4+h];return d}function I(g,d){return n(g,"HEAPF32",d||V)}function Q(g,d){return n(g,
"HEAPF32",d||tb)}a.Color=function(g,d,h,m){void 0===m&&(m=1);return a.Color4f(f(g)/255,f(d)/255,f(h)/255,m)};a.ColorAsInt=function(g,d,h,m){void 0===m&&(m=255);return(f(m)<<24|f(g)<<16|f(d)<<8|f(h)<<0&268435455)>>>0};a.Color4f=function(g,d,h,m){void 0===m&&(m=1);return Float32Array.of(g,d,h,m)};Object.defineProperty(a,"TRANSPARENT",{get:function(){return a.Color4f(0,0,0,0)}});Object.defineProperty(a,"BLACK",{get:function(){return a.Color4f(0,0,0,1)}});Object.defineProperty(a,"WHITE",{get:function(){return a.Color4f(1,
1,1,1)}});Object.defineProperty(a,"RED",{get:function(){return a.Color4f(1,0,0,1)}});Object.defineProperty(a,"GREEN",{get:function(){return a.Color4f(0,1,0,1)}});Object.defineProperty(a,"BLUE",{get:function(){return a.Color4f(0,0,1,1)}});Object.defineProperty(a,"YELLOW",{get:function(){return a.Color4f(1,1,0,1)}});Object.defineProperty(a,"CYAN",{get:function(){return a.Color4f(0,1,1,1)}});Object.defineProperty(a,"MAGENTA",{get:function(){return a.Color4f(1,0,1,1)}});a.getColorComponents=function(g){return[Math.floor(255*
g[0]),Math.floor(255*g[1]),Math.floor(255*g[2]),g[3]]};a.parseColorString=function(g,d){g=g.toLowerCase();if(g.startsWith("#")){d=255;switch(g.length){case 9:d=parseInt(g.slice(7,9),16);case 7:var h=parseInt(g.slice(1,3),16);var m=parseInt(g.slice(3,5),16);var t=parseInt(g.slice(5,7),16);break;case 5:d=17*parseInt(g.slice(4,5),16);case 4:h=17*parseInt(g.slice(1,2),16),m=17*parseInt(g.slice(2,3),16),t=17*parseInt(g.slice(3,4),16)}return a.Color(h,m,t,d/255)}return g.startsWith("rgba")?(g=g.slice(5,
-1),g=g.split(","),a.Color(+g[0],+g[1],+g[2],e(g[3]))):g.startsWith("rgb")?(g=g.slice(4,-1),g=g.split(","),a.Color(+g[0],+g[1],+g[2],e(g[3]))):g.startsWith("gray(")||g.startsWith("hsl")||!d||(g=d[g],void 0===g)?a.BLACK:g};a.multiplyByAlpha=function(g,d){g=g.slice();g[3]=Math.max(0,Math.min(g[3]*d,1));return g};a.Malloc=function(g,d){var h=a._malloc(d*g.BYTES_PER_ELEMENT);return{_ck:!0,length:d,byteOffset:h,qe:null,subarray:function(m,t){m=this.toTypedArray().subarray(m,t);m._ck=!0;return m},toTypedArray:function(){if(this.qe&&
this.qe.length)return this.qe;this.qe=new g(a.HEAPU8.buffer,h,d);this.qe._ck=!0;return this.qe}}};a.Free=function(g){a._free(g.byteOffset);g.byteOffset=0;g.toTypedArray=null;g.qe=null};var P=0,aa,la=0,X,ha=0,Ea,ea,V=0,Ub,Aa=0,Vb,ub=0,Wb,vb=0,$a,Ma=0,Xb,tb=0,Yb,Zb=0,Vc=Float32Array.of(0,0,1);a.onRuntimeInitialized=function(){function g(d,h,m,t,u,x,C){x||(x=4*t.width,t.colorType===a.ColorType.RGBA_F16?x*=2:t.colorType===a.ColorType.RGBA_F32&&(x*=4));var G=x*t.height;var F=u?u.byteOffset:a._malloc(G);
if(C?!d._readPixels(t,F,x,h,m,C):!d._readPixels(t,F,x,h,m))return u||a._free(F),null;if(u)return u.toTypedArray();switch(t.colorType){case a.ColorType.RGBA_8888:case a.ColorType.RGBA_F16:d=(new Uint8Array(a.HEAPU8.buffer,F,G)).slice();break;case a.ColorType.RGBA_F32:d=(new Float32Array(a.HEAPU8.buffer,F,G)).slice();break;default:return null}a._free(F);return d}Ea=a.Malloc(Float32Array,4);ha=Ea.byteOffset;X=a.Malloc(Float32Array,16);la=X.byteOffset;aa=a.Malloc(Float32Array,9);P=aa.byteOffset;Xb=a.Malloc(Float32Array,
12);tb=Xb.byteOffset;Yb=a.Malloc(Float32Array,12);Zb=Yb.byteOffset;ea=a.Malloc(Float32Array,4);V=ea.byteOffset;Ub=a.Malloc(Float32Array,4);Aa=Ub.byteOffset;Vb=a.Malloc(Float32Array,3);ub=Vb.byteOffset;Wb=a.Malloc(Float32Array,3);vb=Wb.byteOffset;$a=a.Malloc(Int32Array,4);Ma=$a.byteOffset;a.ColorSpace.SRGB=a.ColorSpace._MakeSRGB();a.ColorSpace.DISPLAY_P3=a.ColorSpace._MakeDisplayP3();a.ColorSpace.ADOBE_RGB=a.ColorSpace._MakeAdobeRGB();a.GlyphRunFlags={IsWhiteSpace:a._GlyphRunFlags_isWhiteSpace};a.Path.MakeFromCmds=
function(d){var h=n(d,"HEAPF32"),m=a.Path._MakeFromCmds(h,d.length);k(h,d);return m};a.Path.MakeFromVerbsPointsWeights=function(d,h,m){var t=n(d,"HEAPU8"),u=n(h,"HEAPF32"),x=n(m,"HEAPF32"),C=a.Path._MakeFromVerbsPointsWeights(t,d.length,u,h.length,x,m&&m.length||0);k(t,d);k(u,h);k(x,m);return C};a.Path.prototype.addArc=function(d,h,m){d=I(d);this._addArc(d,h,m);return this};a.Path.prototype.addCircle=function(d,h,m,t){this._addCircle(d,h,m,!!t);return this};a.Path.prototype.addOval=function(d,h,m){void 0===
m&&(m=1);d=I(d);this._addOval(d,!!h,m);return this};a.Path.prototype.addPath=function(){var d=Array.prototype.slice.call(arguments),h=d[0],m=!1;"boolean"===typeof d[d.length-1]&&(m=d.pop());if(1===d.length)this._addPath(h,1,0,0,0,1,0,0,0,1,m);else if(2===d.length)d=d[1],this._addPath(h,d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1,m);else if(7===d.length||10===d.length)this._addPath(h,d[1],d[2],d[3],d[4],d[5],d[6],d[7]||0,d[8]||0,d[9]||1,m);else return null;return this};a.Path.prototype.addPoly=
function(d,h){var m=n(d,"HEAPF32");this._addPoly(m,d.length/2,h);k(m,d);return this};a.Path.prototype.addRect=function(d,h){d=I(d);this._addRect(d,!!h);return this};a.Path.prototype.addRRect=function(d,h){d=Q(d);this._addRRect(d,!!h);return this};a.Path.prototype.addVerbsPointsWeights=function(d,h,m){var t=n(d,"HEAPU8"),u=n(h,"HEAPF32"),x=n(m,"HEAPF32");this._addVerbsPointsWeights(t,d.length,u,h.length,x,m&&m.length||0);k(t,d);k(u,h);k(x,m)};a.Path.prototype.arc=function(d,h,m,t,u,x){d=a.LTRBRect(d-
m,h-m,d+m,h+m);u=(u-t)/Math.PI*180-360*!!x;x=new a.Path;x.addArc(d,t/Math.PI*180,u);this.addPath(x,!0);x.delete();return this};a.Path.prototype.arcToOval=function(d,h,m,t){d=I(d);this._arcToOval(d,h,m,t);return this};a.Path.prototype.arcToRotated=function(d,h,m,t,u,x,C){this._arcToRotated(d,h,m,!!t,!!u,x,C);return this};a.Path.prototype.arcToTangent=function(d,h,m,t,u){this._arcToTangent(d,h,m,t,u);return this};a.Path.prototype.close=function(){this._close();return this};a.Path.prototype.conicTo=
function(d,h,m,t,u){this._conicTo(d,h,m,t,u);return this};a.Path.prototype.computeTightBounds=function(d){this._computeTightBounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.Path.prototype.cubicTo=function(d,h,m,t,u,x){this._cubicTo(d,h,m,t,u,x);return this};a.Path.prototype.dash=function(d,h,m){return this._dash(d,h,m)?this:null};a.Path.prototype.getBounds=function(d){this._getBounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.Path.prototype.lineTo=function(d,
h){this._lineTo(d,h);return this};a.Path.prototype.moveTo=function(d,h){this._moveTo(d,h);return this};a.Path.prototype.offset=function(d,h){this._transform(1,0,d,0,1,h,0,0,1);return this};a.Path.prototype.quadTo=function(d,h,m,t){this._quadTo(d,h,m,t);return this};a.Path.prototype.rArcTo=function(d,h,m,t,u,x,C){this._rArcTo(d,h,m,t,u,x,C);return this};a.Path.prototype.rConicTo=function(d,h,m,t,u){this._rConicTo(d,h,m,t,u);return this};a.Path.prototype.rCubicTo=function(d,h,m,t,u,x){this._rCubicTo(d,
h,m,t,u,x);return this};a.Path.prototype.rLineTo=function(d,h){this._rLineTo(d,h);return this};a.Path.prototype.rMoveTo=function(d,h){this._rMoveTo(d,h);return this};a.Path.prototype.rQuadTo=function(d,h,m,t){this._rQuadTo(d,h,m,t);return this};a.Path.prototype.stroke=function(d){d=d||{};d.width=d.width||1;d.miter_limit=d.miter_limit||4;d.cap=d.cap||a.StrokeCap.Butt;d.join=d.join||a.StrokeJoin.Miter;d.precision=d.precision||1;return this._stroke(d)?this:null};a.Path.prototype.transform=function(){if(1===
arguments.length){var d=arguments[0];this._transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1)}else if(6===arguments.length||9===arguments.length)d=arguments,this._transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1);else throw"transform expected to take 1 or 9 arguments. Got "+arguments.length;return this};a.Path.prototype.trim=function(d,h,m){return this._trim(d,h,!!m)?this:null};a.Image.prototype.encodeToBytes=function(d,h){var m=a.Be();d=d||a.ImageFormat.PNG;h=h||100;
return m?this._encodeToBytes(d,h,m):this._encodeToBytes(d,h)};a.Image.prototype.makeShaderCubic=function(d,h,m,t,u){u=p(u);return this._makeShaderCubic(d,h,m,t,u)};a.Image.prototype.makeShaderOptions=function(d,h,m,t,u){u=p(u);return this._makeShaderOptions(d,h,m,t,u)};a.Image.prototype.readPixels=function(d,h,m,t,u){var x=a.Be();return g(this,d,h,m,t,u,x)};a.Canvas.prototype.clear=function(d){a.$d(this.Zd);d=w(d);this._clear(d)};a.Canvas.prototype.clipRRect=function(d,h,m){a.$d(this.Zd);d=Q(d);this._clipRRect(d,
h,m)};a.Canvas.prototype.clipRect=function(d,h,m){a.$d(this.Zd);d=I(d);this._clipRect(d,h,m)};a.Canvas.prototype.concat=function(d){a.$d(this.Zd);d=v(d);this._concat(d)};a.Canvas.prototype.drawArc=function(d,h,m,t,u){a.$d(this.Zd);d=I(d);this._drawArc(d,h,m,t,u)};a.Canvas.prototype.drawAtlas=function(d,h,m,t,u,x,C){if(d&&t&&h&&m&&h.length===m.length){a.$d(this.Zd);u||(u=a.BlendMode.SrcOver);var G=n(h,"HEAPF32"),F=n(m,"HEAPF32"),S=m.length/4,T=n(c(x),"HEAPU32");if(C&&"B"in C&&"C"in C)this._drawAtlasCubic(d,
F,G,T,S,u,C.B,C.C,t);else{let q=a.FilterMode.Linear,y=a.MipmapMode.None;C&&(q=C.filter,"mipmap"in C&&(y=C.mipmap));this._drawAtlasOptions(d,F,G,T,S,u,q,y,t)}k(G,h);k(F,m);k(T,x)}};a.Canvas.prototype.drawCircle=function(d,h,m,t){a.$d(this.Zd);this._drawCircle(d,h,m,t)};a.Canvas.prototype.drawColor=function(d,h){a.$d(this.Zd);d=w(d);void 0!==h?this._drawColor(d,h):this._drawColor(d)};a.Canvas.prototype.drawColorInt=function(d,h){a.$d(this.Zd);this._drawColorInt(d,h||a.BlendMode.SrcOver)};a.Canvas.prototype.drawColorComponents=
function(d,h,m,t,u){a.$d(this.Zd);d=A(d,h,m,t);void 0!==u?this._drawColor(d,u):this._drawColor(d)};a.Canvas.prototype.drawDRRect=function(d,h,m){a.$d(this.Zd);d=Q(d,tb);h=Q(h,Zb);this._drawDRRect(d,h,m)};a.Canvas.prototype.drawImage=function(d,h,m,t){a.$d(this.Zd);this._drawImage(d,h,m,t||null)};a.Canvas.prototype.drawImageCubic=function(d,h,m,t,u,x){a.$d(this.Zd);this._drawImageCubic(d,h,m,t,u,x||null)};a.Canvas.prototype.drawImageOptions=function(d,h,m,t,u,x){a.$d(this.Zd);this._drawImageOptions(d,
h,m,t,u,x||null)};a.Canvas.prototype.drawImageNine=function(d,h,m,t,u){a.$d(this.Zd);h=n(h,"HEAP32",Ma);m=I(m);this._drawImageNine(d,h,m,t,u||null)};a.Canvas.prototype.drawImageRect=function(d,h,m,t,u){a.$d(this.Zd);I(h,V);I(m,Aa);this._drawImageRect(d,V,Aa,t,!!u)};a.Canvas.prototype.drawImageRectCubic=function(d,h,m,t,u,x){a.$d(this.Zd);I(h,V);I(m,Aa);this._drawImageRectCubic(d,V,Aa,t,u,x||null)};a.Canvas.prototype.drawImageRectOptions=function(d,h,m,t,u,x){a.$d(this.Zd);I(h,V);I(m,Aa);this._drawImageRectOptions(d,
V,Aa,t,u,x||null)};a.Canvas.prototype.drawLine=function(d,h,m,t,u){a.$d(this.Zd);this._drawLine(d,h,m,t,u)};a.Canvas.prototype.drawOval=function(d,h){a.$d(this.Zd);d=I(d);this._drawOval(d,h)};a.Canvas.prototype.drawPaint=function(d){a.$d(this.Zd);this._drawPaint(d)};a.Canvas.prototype.drawParagraph=function(d,h,m){a.$d(this.Zd);this._drawParagraph(d,h,m)};a.Canvas.prototype.drawPatch=function(d,h,m,t,u){if(24>d.length)throw"Need 12 cubic points";if(h&&4>h.length)throw"Need 4 colors";if(m&&8>m.length)throw"Need 4 shader coordinates";
a.$d(this.Zd);const x=n(d,"HEAPF32"),C=h?n(c(h),"HEAPU32"):0,G=m?n(m,"HEAPF32"):0;t||(t=a.BlendMode.Modulate);this._drawPatch(x,C,G,t,u);k(G,m);k(C,h);k(x,d)};a.Canvas.prototype.drawPath=function(d,h){a.$d(this.Zd);this._drawPath(d,h)};a.Canvas.prototype.drawPicture=function(d){a.$d(this.Zd);this._drawPicture(d)};a.Canvas.prototype.drawPoints=function(d,h,m){a.$d(this.Zd);var t=n(h,"HEAPF32");this._drawPoints(d,t,h.length/2,m);k(t,h)};a.Canvas.prototype.drawRRect=function(d,h){a.$d(this.Zd);d=Q(d);
this._drawRRect(d,h)};a.Canvas.prototype.drawRect=function(d,h){a.$d(this.Zd);d=I(d);this._drawRect(d,h)};a.Canvas.prototype.drawRect4f=function(d,h,m,t,u){a.$d(this.Zd);this._drawRect4f(d,h,m,t,u)};a.Canvas.prototype.drawShadow=function(d,h,m,t,u,x,C){a.$d(this.Zd);var G=n(u,"HEAPF32"),F=n(x,"HEAPF32");h=n(h,"HEAPF32",ub);m=n(m,"HEAPF32",vb);this._drawShadow(d,h,m,t,G,F,C);k(G,u);k(F,x)};a.getShadowLocalBounds=function(d,h,m,t,u,x,C){d=p(d);m=n(m,"HEAPF32",ub);t=n(t,"HEAPF32",vb);if(!this._getShadowLocalBounds(d,
h,m,t,u,x,V))return null;h=ea.toTypedArray();return C?(C.set(h),C):h.slice()};a.Canvas.prototype.drawTextBlob=function(d,h,m,t){a.$d(this.Zd);this._drawTextBlob(d,h,m,t)};a.Canvas.prototype.drawVertices=function(d,h,m){a.$d(this.Zd);this._drawVertices(d,h,m)};a.Canvas.prototype.getDeviceClipBounds=function(d){this._getDeviceClipBounds(Ma);var h=$a.toTypedArray();d?d.set(h):d=h.slice();return d};a.Canvas.prototype.quickReject=function(d){d=I(d);return this._quickReject(d)};a.Canvas.prototype.getLocalToDevice=
function(){this._getLocalToDevice(la);for(var d=la,h=Array(16),m=0;16>m;m++)h[m]=a.HEAPF32[d/4+m];return h};a.Canvas.prototype.getTotalMatrix=function(){this._getTotalMatrix(P);for(var d=Array(9),h=0;9>h;h++)d[h]=a.HEAPF32[P/4+h];return d};a.Canvas.prototype.makeSurface=function(d){d=this._makeSurface(d);d.Zd=this.Zd;return d};a.Canvas.prototype.readPixels=function(d,h,m,t,u){a.$d(this.Zd);return g(this,d,h,m,t,u)};a.Canvas.prototype.saveLayer=function(d,h,m,t,u){h=I(h);return this._saveLayer(d||
null,h,m||null,t||0,u||a.TileMode.Clamp)};a.Canvas.prototype.writePixels=function(d,h,m,t,u,x,C,G){if(d.byteLength%(h*m))throw"pixels length must be a multiple of the srcWidth * srcHeight";a.$d(this.Zd);var F=d.byteLength/(h*m);x=x||a.AlphaType.Unpremul;C=C||a.ColorType.RGBA_8888;G=G||a.ColorSpace.SRGB;var S=F*h;F=n(d,"HEAPU8");h=this._writePixels({width:h,height:m,colorType:C,alphaType:x,colorSpace:G},F,S,t,u);k(F,d);return h};a.ColorFilter.MakeBlend=function(d,h,m){d=w(d);m=m||a.ColorSpace.SRGB;
return a.ColorFilter._MakeBlend(d,h,m)};a.ColorFilter.MakeMatrix=function(d){if(!d||20!==d.length)throw"invalid color matrix";var h=n(d,"HEAPF32"),m=a.ColorFilter._makeMatrix(h);k(h,d);return m};a.ContourMeasure.prototype.getPosTan=function(d,h){this._getPosTan(d,V);d=ea.toTypedArray();return h?(h.set(d),h):d.slice()};a.ImageFilter.prototype.getOutputBounds=function(d,h,m){d=I(d,V);h=p(h);this._getOutputBounds(d,h,Ma);h=$a.toTypedArray();return m?(m.set(h),m):h.slice()};a.ImageFilter.MakeDropShadow=
function(d,h,m,t,u,x){u=w(u,ha);return a.ImageFilter._MakeDropShadow(d,h,m,t,u,x)};a.ImageFilter.MakeDropShadowOnly=function(d,h,m,t,u,x){u=w(u,ha);return a.ImageFilter._MakeDropShadowOnly(d,h,m,t,u,x)};a.ImageFilter.MakeImage=function(d,h,m,t){m=I(m,V);t=I(t,Aa);if("B"in h&&"C"in h)return a.ImageFilter._MakeImageCubic(d,h.B,h.C,m,t);const u=h.filter;let x=a.MipmapMode.None;"mipmap"in h&&(x=h.mipmap);return a.ImageFilter._MakeImageOptions(d,u,x,m,t)};a.ImageFilter.MakeMatrixTransform=function(d,h,
m){d=p(d);if("B"in h&&"C"in h)return a.ImageFilter._MakeMatrixTransformCubic(d,h.B,h.C,m);const t=h.filter;let u=a.MipmapMode.None;"mipmap"in h&&(u=h.mipmap);return a.ImageFilter._MakeMatrixTransformOptions(d,t,u,m)};a.Paint.prototype.getColor=function(){this._getColor(ha);return D(ha)};a.Paint.prototype.setColor=function(d,h){h=h||null;d=w(d);this._setColor(d,h)};a.Paint.prototype.setColorComponents=function(d,h,m,t,u){u=u||null;d=A(d,h,m,t);this._setColor(d,u)};a.Path.prototype.getPoint=function(d,
h){this._getPoint(d,V);d=ea.toTypedArray();return h?(h[0]=d[0],h[1]=d[1],h):d.slice(0,2)};a.Picture.prototype.makeShader=function(d,h,m,t,u){t=p(t);u=I(u);return this._makeShader(d,h,m,t,u)};a.Picture.prototype.cullRect=function(d){this._cullRect(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.PictureRecorder.prototype.beginRecording=function(d,h){d=I(d);return this._beginRecording(d,!!h)};a.Surface.prototype.getCanvas=function(){var d=this._getCanvas();d.Zd=this.Zd;return d};a.Surface.prototype.makeImageSnapshot=
function(d){a.$d(this.Zd);d=n(d,"HEAP32",Ma);return this._makeImageSnapshot(d)};a.Surface.prototype.makeSurface=function(d){a.$d(this.Zd);d=this._makeSurface(d);d.Zd=this.Zd;return d};a.Surface.prototype.Ze=function(d,h){this.te||(this.te=this.getCanvas());return requestAnimationFrame(function(){a.$d(this.Zd);d(this.te);this.flush(h)}.bind(this))};a.Surface.prototype.requestAnimationFrame||(a.Surface.prototype.requestAnimationFrame=a.Surface.prototype.Ze);a.Surface.prototype.We=function(d,h){this.te||
(this.te=this.getCanvas());requestAnimationFrame(function(){a.$d(this.Zd);d(this.te);this.flush(h);this.dispose()}.bind(this))};a.Surface.prototype.drawOnce||(a.Surface.prototype.drawOnce=a.Surface.prototype.We);a.PathEffect.MakeDash=function(d,h){h||=0;if(!d.length||1===d.length%2)throw"Intervals array must have even length";var m=n(d,"HEAPF32");h=a.PathEffect._MakeDash(m,d.length,h);k(m,d);return h};a.PathEffect.MakeLine2D=function(d,h){h=p(h);return a.PathEffect._MakeLine2D(d,h)};a.PathEffect.MakePath2D=
function(d,h){d=p(d);return a.PathEffect._MakePath2D(d,h)};a.Shader.MakeColor=function(d,h){h=h||null;d=w(d);return a.Shader._MakeColor(d,h)};a.Shader.Blend=a.Shader.MakeBlend;a.Shader.Color=a.Shader.MakeColor;a.Shader.MakeLinearGradient=function(d,h,m,t,u,x,C,G){G=G||null;var F=l(m),S=n(t,"HEAPF32");C=C||0;x=p(x);var T=ea.toTypedArray();T.set(d);T.set(h,2);d=a.Shader._MakeLinearGradient(V,F.he,F.colorType,S,F.count,u,C,x,G);k(F.he,m);t&&k(S,t);return d};a.Shader.MakeRadialGradient=function(d,h,m,
t,u,x,C,G){G=G||null;var F=l(m),S=n(t,"HEAPF32");C=C||0;x=p(x);d=a.Shader._MakeRadialGradient(d[0],d[1],h,F.he,F.colorType,S,F.count,u,C,x,G);k(F.he,m);t&&k(S,t);return d};a.Shader.MakeSweepGradient=function(d,h,m,t,u,x,C,G,F,S){S=S||null;var T=l(m),q=n(t,"HEAPF32");C=C||0;G=G||0;F=F||360;x=p(x);d=a.Shader._MakeSweepGradient(d,h,T.he,T.colorType,q,T.count,u,G,F,C,x,S);k(T.he,m);t&&k(q,t);return d};a.Shader.MakeTwoPointConicalGradient=function(d,h,m,t,u,x,C,G,F,S){S=S||null;var T=l(u),q=n(x,"HEAPF32");
F=F||0;G=p(G);var y=ea.toTypedArray();y.set(d);y.set(m,2);d=a.Shader._MakeTwoPointConicalGradient(V,h,t,T.he,T.colorType,q,T.count,C,F,G,S);k(T.he,u);x&&k(q,x);return d};a.Vertices.prototype.bounds=function(d){this._bounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.ce&&a.ce.forEach(function(d){d()})};a.computeTonalColors=function(g){var d=n(g.ambient,"HEAPF32"),h=n(g.spot,"HEAPF32");this._computeTonalColors(d,h);var m={ambient:D(d),spot:D(h)};k(d,g.ambient);k(h,g.spot);return m};
a.LTRBRect=function(g,d,h,m){return Float32Array.of(g,d,h,m)};a.XYWHRect=function(g,d,h,m){return Float32Array.of(g,d,g+h,d+m)};a.LTRBiRect=function(g,d,h,m){return Int32Array.of(g,d,h,m)};a.XYWHiRect=function(g,d,h,m){return Int32Array.of(g,d,g+h,d+m)};a.RRectXY=function(g,d,h){return Float32Array.of(g[0],g[1],g[2],g[3],d,h,d,h,d,h,d,h)};a.MakeAnimatedImageFromEncoded=function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._decodeAnimatedImage(d,g.byteLength))?
g:null};a.MakeImageFromEncoded=function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._decodeImage(d,g.byteLength))?g:null};var ab=null;a.MakeImageFromCanvasImageSource=function(g){var d=g.width,h=g.height;ab||=document.createElement("canvas");ab.width=d;ab.height=h;var m=ab.getContext("2d",{willReadFrequently:!0});m.drawImage(g,0,0);g=m.getImageData(0,0,d,h);return a.MakeImage({width:d,height:h,alphaType:a.AlphaType.Unpremul,colorType:a.ColorType.RGBA_8888,colorSpace:a.ColorSpace.SRGB},
g.data,4*d)};a.MakeImage=function(g,d,h){var m=a._malloc(d.length);a.HEAPU8.set(d,m);return a._MakeImage(g,m,d.length,h)};a.MakeVertices=function(g,d,h,m,t,u){var x=t&&t.length||0,C=0;h&&h.length&&(C|=1);m&&m.length&&(C|=2);void 0===u||u||(C|=4);g=new a._VerticesBuilder(g,d.length/2,x,C);n(d,"HEAPF32",g.positions());g.texCoords()&&n(h,"HEAPF32",g.texCoords());g.colors()&&n(c(m),"HEAPU32",g.colors());g.indices()&&n(t,"HEAPU16",g.indices());return g.detach()};(function(g){g.ce=g.ce||[];g.ce.push(function(){function d(q){q&&
(q.dir=0===q.dir?g.TextDirection.RTL:g.TextDirection.LTR);return q}function h(q){if(!q||!q.length)return[];for(var y=[],M=0;M<q.length;M+=5){var W=g.LTRBRect(q[M],q[M+1],q[M+2],q[M+3]),wa=g.TextDirection.LTR;0===q[M+4]&&(wa=g.TextDirection.RTL);y.push({rect:W,dir:wa})}g._free(q.byteOffset);return y}function m(q){q=q||{};void 0===q.weight&&(q.weight=g.FontWeight.Normal);q.width=q.width||g.FontWidth.Normal;q.slant=q.slant||g.FontSlant.Upright;return q}function t(q){if(!q||!q.length)return 0;for(var y=
[],M=0;M<q.length;M++){var W=u(q[M]);y.push(W)}return n(y,"HEAPU32")}function u(q){if(G[q])return G[q];var y=qa(q)+1,M=g._malloc(y);ra(q,M,y);return G[q]=M}function x(q){q._colorPtr=w(q.color);q._foregroundColorPtr=0;q._backgroundColorPtr=0;q._decorationColorPtr=0;q.foregroundColor&&(q._foregroundColorPtr=w(q.foregroundColor,F));q.backgroundColor&&(q._backgroundColorPtr=w(q.backgroundColor,S));q.decorationColor&&(q._decorationColorPtr=w(q.decorationColor,T));Array.isArray(q.fontFamilies)&&q.fontFamilies.length?
(q._fontFamiliesPtr=t(q.fontFamilies),q._fontFamiliesLen=q.fontFamilies.length):(q._fontFamiliesPtr=0,q._fontFamiliesLen=0);if(q.locale){var y=q.locale;q._localePtr=u(y);q._localeLen=qa(y)}else q._localePtr=0,q._localeLen=0;if(Array.isArray(q.shadows)&&q.shadows.length){y=q.shadows;var M=y.map(function(ma){return ma.color||g.BLACK}),W=y.map(function(ma){return ma.blurRadius||0});q._shadowLen=y.length;for(var wa=g._malloc(8*y.length),wb=wa/4,xb=0;xb<y.length;xb++){var $b=y[xb].offset||[0,0];g.HEAPF32[wb]=
$b[0];g.HEAPF32[wb+1]=$b[1];wb+=2}q._shadowColorsPtr=l(M).he;q._shadowOffsetsPtr=wa;q._shadowBlurRadiiPtr=n(W,"HEAPF32")}else q._shadowLen=0,q._shadowColorsPtr=0,q._shadowOffsetsPtr=0,q._shadowBlurRadiiPtr=0;Array.isArray(q.fontFeatures)&&q.fontFeatures.length?(y=q.fontFeatures,M=y.map(function(ma){return ma.name}),W=y.map(function(ma){return ma.value}),q._fontFeatureLen=y.length,q._fontFeatureNamesPtr=t(M),q._fontFeatureValuesPtr=n(W,"HEAPU32")):(q._fontFeatureLen=0,q._fontFeatureNamesPtr=0,q._fontFeatureValuesPtr=
0);Array.isArray(q.fontVariations)&&q.fontVariations.length?(y=q.fontVariations,M=y.map(function(ma){return ma.axis}),W=y.map(function(ma){return ma.value}),q._fontVariationLen=y.length,q._fontVariationAxesPtr=t(M),q._fontVariationValuesPtr=n(W,"HEAPF32")):(q._fontVariationLen=0,q._fontVariationAxesPtr=0,q._fontVariationValuesPtr=0)}function C(q){g._free(q._fontFamiliesPtr);g._free(q._shadowColorsPtr);g._free(q._shadowOffsetsPtr);g._free(q._shadowBlurRadiiPtr);g._free(q._fontFeatureNamesPtr);g._free(q._fontFeatureValuesPtr);
g._free(q._fontVariationAxesPtr);g._free(q._fontVariationValuesPtr)}g.Paragraph.prototype.getRectsForRange=function(q,y,M,W){q=this._getRectsForRange(q,y,M,W);return h(q)};g.Paragraph.prototype.getRectsForPlaceholders=function(){var q=this._getRectsForPlaceholders();return h(q)};g.Paragraph.prototype.getGlyphInfoAt=function(q){return d(this._getGlyphInfoAt(q))};g.Paragraph.prototype.getClosestGlyphInfoAtCoordinate=function(q,y){return d(this._getClosestGlyphInfoAtCoordinate(q,y))};g.TypefaceFontProvider.prototype.registerFont=
function(q,y){q=g.Typeface.MakeTypefaceFromData(q);if(!q)return null;y=u(y);this._registerFont(q,y);q.delete()};g.ParagraphStyle=function(q){q.disableHinting=q.disableHinting||!1;if(q.ellipsis){var y=q.ellipsis;q._ellipsisPtr=u(y);q._ellipsisLen=qa(y)}else q._ellipsisPtr=0,q._ellipsisLen=0;null==q.heightMultiplier&&(q.heightMultiplier=-1);q.maxLines=q.maxLines||0;q.replaceTabCharacters=q.replaceTabCharacters||!1;y=(y=q.strutStyle)||{};y.strutEnabled=y.strutEnabled||!1;y.strutEnabled&&Array.isArray(y.fontFamilies)&&
y.fontFamilies.length?(y._fontFamiliesPtr=t(y.fontFamilies),y._fontFamiliesLen=y.fontFamilies.length):(y._fontFamiliesPtr=0,y._fontFamiliesLen=0);y.fontStyle=m(y.fontStyle);null==y.fontSize&&(y.fontSize=-1);null==y.heightMultiplier&&(y.heightMultiplier=-1);y.halfLeading=y.halfLeading||!1;y.leading=y.leading||0;y.forceStrutHeight=y.forceStrutHeight||!1;q.strutStyle=y;q.textAlign=q.textAlign||g.TextAlign.Start;q.textDirection=q.textDirection||g.TextDirection.LTR;q.textHeightBehavior=q.textHeightBehavior||
g.TextHeightBehavior.All;q.textStyle=g.TextStyle(q.textStyle);q.applyRoundingHack=!1!==q.applyRoundingHack;return q};g.TextStyle=function(q){q.color||(q.color=g.BLACK);q.decoration=q.decoration||0;q.decorationThickness=q.decorationThickness||0;q.decorationStyle=q.decorationStyle||g.DecorationStyle.Solid;q.textBaseline=q.textBaseline||g.TextBaseline.Alphabetic;null==q.fontSize&&(q.fontSize=-1);q.letterSpacing=q.letterSpacing||0;q.wordSpacing=q.wordSpacing||0;null==q.heightMultiplier&&(q.heightMultiplier=
-1);q.halfLeading=q.halfLeading||!1;q.fontStyle=m(q.fontStyle);return q};var G={},F=g._malloc(16),S=g._malloc(16),T=g._malloc(16);g.ParagraphBuilder.Make=function(q,y){x(q.textStyle);y=g.ParagraphBuilder._Make(q,y);C(q.textStyle);return y};g.ParagraphBuilder.MakeFromFontProvider=function(q,y){x(q.textStyle);y=g.ParagraphBuilder._MakeFromFontProvider(q,y);C(q.textStyle);return y};g.ParagraphBuilder.MakeFromFontCollection=function(q,y){x(q.textStyle);y=g.ParagraphBuilder._MakeFromFontCollection(q,y);
C(q.textStyle);return y};g.ParagraphBuilder.ShapeText=function(q,y,M){let W=0;for(const wa of y)W+=wa.length;if(W!==q.length)throw"Accumulated block lengths must equal text.length";return g.ParagraphBuilder._ShapeText(q,y,M)};g.ParagraphBuilder.prototype.pushStyle=function(q){x(q);this._pushStyle(q);C(q)};g.ParagraphBuilder.prototype.pushPaintStyle=function(q,y,M){x(q);this._pushPaintStyle(q,y,M);C(q)};g.ParagraphBuilder.prototype.addPlaceholder=function(q,y,M,W,wa){M=M||g.PlaceholderAlignment.Baseline;
W=W||g.TextBaseline.Alphabetic;this._addPlaceholder(q||0,y||0,M,W,wa||0)};g.ParagraphBuilder.prototype.setWordsUtf8=function(q){var y=n(q,"HEAPU32");this._setWordsUtf8(y,q&&q.length||0);k(y,q)};g.ParagraphBuilder.prototype.setWordsUtf16=function(q){var y=n(q,"HEAPU32");this._setWordsUtf16(y,q&&q.length||0);k(y,q)};g.ParagraphBuilder.prototype.setGraphemeBreaksUtf8=function(q){var y=n(q,"HEAPU32");this._setGraphemeBreaksUtf8(y,q&&q.length||0);k(y,q)};g.ParagraphBuilder.prototype.setGraphemeBreaksUtf16=
function(q){var y=n(q,"HEAPU32");this._setGraphemeBreaksUtf16(y,q&&q.length||0);k(y,q)};g.ParagraphBuilder.prototype.setLineBreaksUtf8=function(q){var y=n(q,"HEAPU32");this._setLineBreaksUtf8(y,q&&q.length||0);k(y,q)};g.ParagraphBuilder.prototype.setLineBreaksUtf16=function(q){var y=n(q,"HEAPU32");this._setLineBreaksUtf16(y,q&&q.length||0);k(y,q)}})})(r);a.ce=a.ce||[];a.ce.push(function(){a.Path.prototype.op=function(g,d){return this._op(g,d)?this:null};a.Path.prototype.simplify=function(){return this._simplify()?
this:null}});a.ce=a.ce||[];a.ce.push(function(){a.Canvas.prototype.drawText=function(g,d,h,m,t){var u=qa(g),x=a._malloc(u+1);ra(g,x,u+1);this._drawSimpleText(x,u,d,h,t,m);a._free(x)};a.Canvas.prototype.drawGlyphs=function(g,d,h,m,t,u){if(!(2*g.length<=d.length))throw"Not enough positions for the array of gyphs";a.$d(this.Zd);const x=n(g,"HEAPU16"),C=n(d,"HEAPF32");this._drawGlyphs(g.length,x,C,h,m,t,u);k(C,d);k(x,g)};a.Font.prototype.getGlyphBounds=function(g,d,h){var m=n(g,"HEAPU16"),t=a._malloc(16*
g.length);this._getGlyphWidthBounds(m,g.length,0,t,d||null);d=new Float32Array(a.HEAPU8.buffer,t,4*g.length);k(m,g);if(h)return h.set(d),a._free(t),h;g=Float32Array.from(d);a._free(t);return g};a.Font.prototype.getGlyphIDs=function(g,d,h){d||(d=g.length);var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=a._malloc(2*d);d=this._getGlyphIDs(t,m-1,d,g);a._free(t);if(0>d)return a._free(g),null;t=new Uint16Array(a.HEAPU8.buffer,g,d);if(h)return h.set(t),a._free(g),h;h=Uint16Array.from(t);a._free(g);return h};a.Font.prototype.getGlyphIntercepts=
function(g,d,h,m){var t=n(g,"HEAPU16"),u=n(d,"HEAPF32");return this._getGlyphIntercepts(t,g.length,!(g&&g._ck),u,d.length,!(d&&d._ck),h,m)};a.Font.prototype.getGlyphWidths=function(g,d,h){var m=n(g,"HEAPU16"),t=a._malloc(4*g.length);this._getGlyphWidthBounds(m,g.length,t,0,d||null);d=new Float32Array(a.HEAPU8.buffer,t,g.length);k(m,g);if(h)return h.set(d),a._free(t),h;g=Float32Array.from(d);a._free(t);return g};a.FontMgr.FromData=function(){if(!arguments.length)return null;var g=arguments;1===g.length&&
Array.isArray(g[0])&&(g=arguments[0]);if(!g.length)return null;for(var d=[],h=[],m=0;m<g.length;m++){var t=new Uint8Array(g[m]),u=n(t,"HEAPU8");d.push(u);h.push(t.byteLength)}d=n(d,"HEAPU32");h=n(h,"HEAPU32");g=a.FontMgr._fromData(d,h,g.length);a._free(d);a._free(h);return g};a.Typeface.MakeTypefaceFromData=function(g){g=new Uint8Array(g);var d=n(g,"HEAPU8");return(g=a.Typeface._MakeTypefaceFromData(d,g.byteLength))?g:null};a.Typeface.MakeFreeTypeFaceFromData=a.Typeface.MakeTypefaceFromData;a.Typeface.prototype.getGlyphIDs=
function(g,d,h){d||(d=g.length);var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=a._malloc(2*d);d=this._getGlyphIDs(t,m-1,d,g);a._free(t);if(0>d)return a._free(g),null;t=new Uint16Array(a.HEAPU8.buffer,g,d);if(h)return h.set(t),a._free(g),h;h=Uint16Array.from(t);a._free(g);return h};a.TextBlob.MakeOnPath=function(g,d,h,m){if(g&&g.length&&d&&d.countPoints()){if(1===d.countPoints())return this.MakeFromText(g,h);m||=0;var t=h.getGlyphIDs(g);t=h.getGlyphWidths(t);var u=[];d=new a.ContourMeasureIter(d,!1,1);for(var x=
d.next(),C=new Float32Array(4),G=0;G<g.length&&x;G++){var F=t[G];m+=F/2;if(m>x.length()){x.delete();x=d.next();if(!x){g=g.substring(0,G);break}m=F/2}x.getPosTan(m,C);var S=C[2],T=C[3];u.push(S,T,C[0]-F/2*S,C[1]-F/2*T);m+=F/2}g=this.MakeFromRSXform(g,u,h);x&&x.delete();d.delete();return g}};a.TextBlob.MakeFromRSXform=function(g,d,h){var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=n(d,"HEAPF32");h=a.TextBlob._MakeFromRSXform(t,m-1,g,h);a._free(t);return h?h:null};a.TextBlob.MakeFromRSXformGlyphs=function(g,
d,h){var m=n(g,"HEAPU16");d=n(d,"HEAPF32");h=a.TextBlob._MakeFromRSXformGlyphs(m,2*g.length,d,h);k(m,g);return h?h:null};a.TextBlob.MakeFromGlyphs=function(g,d){var h=n(g,"HEAPU16");d=a.TextBlob._MakeFromGlyphs(h,2*g.length,d);k(h,g);return d?d:null};a.TextBlob.MakeFromText=function(g,d){var h=qa(g)+1,m=a._malloc(h);ra(g,m,h);g=a.TextBlob._MakeFromText(m,h-1,d);a._free(m);return g?g:null};a.MallocGlyphIDs=function(g){return a.Malloc(Uint16Array,g)}});a.ce=a.ce||[];a.ce.push(function(){a.MakePicture=
function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._MakePicture(d,g.byteLength))?g:null}});a.ce=a.ce||[];a.ce.push(function(){a.RuntimeEffect.Make=function(g,d){return a.RuntimeEffect._Make(g,{onError:d||function(h){console.log("RuntimeEffect error",h)}})};a.RuntimeEffect.MakeForBlender=function(g,d){return a.RuntimeEffect._MakeForBlender(g,{onError:d||function(h){console.log("RuntimeEffect error",h)}})};a.RuntimeEffect.prototype.makeShader=function(g,d){var h=
!g._ck,m=n(g,"HEAPF32");d=p(d);return this._makeShader(m,4*g.length,h,d)};a.RuntimeEffect.prototype.makeShaderWithChildren=function(g,d,h){var m=!g._ck,t=n(g,"HEAPF32");h=p(h);for(var u=[],x=0;x<d.length;x++)u.push(d[x].Yd.ae);d=n(u,"HEAPU32");return this._makeShaderWithChildren(t,4*g.length,m,d,u.length,h)};a.RuntimeEffect.prototype.makeBlender=function(g){var d=!g._ck,h=n(g,"HEAPF32");return this._makeBlender(h,4*g.length,d)}})})(r);var sa=Object.assign({},r),ta="",ua,va;
if(fa||ia)ia?ta=self.location.href:"undefined"!=typeof document&&document.currentScript&&(ta=document.currentScript.src),_scriptName&&(ta=_scriptName),ta.startsWith("blob:")?ta="":ta=ta.substr(0,ta.replace(/[?#].*/,"").lastIndexOf("/")+1),ia&&(va=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),ua=a=>fetch(a,{credentials:"same-origin"}).then(b=>b.ok?b.arrayBuffer():Promise.reject(Error(b.status+" : "+b.url)));
var xa=console.log.bind(console),ya=console.error.bind(console);Object.assign(r,sa);sa=null;var za,Ba=!1,Ca,B,Da,Fa,E,H,J,Ga;function Ha(){var a=za.buffer;r.HEAP8=Ca=new Int8Array(a);r.HEAP16=Da=new Int16Array(a);r.HEAPU8=B=new Uint8Array(a);r.HEAPU16=Fa=new Uint16Array(a);r.HEAP32=E=new Int32Array(a);r.HEAPU32=H=new Uint32Array(a);r.HEAPF32=J=new Float32Array(a);r.HEAPF64=Ga=new Float64Array(a)}var Ia=[],Ja=[],Ka=[],La=0,Na=null,Oa=null;
function Pa(a){a="Aborted("+a+")";ya(a);Ba=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");ca(a);throw a;}var Qa=a=>a.startsWith("data:application/octet-stream;base64,"),Ra;function Sa(a){return ua(a).then(b=>new Uint8Array(b),()=>{if(va)var b=va(a);else throw"both async and sync fetching of the wasm failed";return b})}function Ta(a,b,c){return Sa(a).then(e=>WebAssembly.instantiate(e,b)).then(c,e=>{ya(`failed to asynchronously prepare wasm: ${e}`);Pa(e)})}
function Ua(a,b){var c=Ra;return"function"!=typeof WebAssembly.instantiateStreaming||Qa(c)||"function"!=typeof fetch?Ta(c,a,b):fetch(c,{credentials:"same-origin"}).then(e=>WebAssembly.instantiateStreaming(e,a).then(b,function(f){ya(`wasm streaming compile failed: ${f}`);ya("falling back to ArrayBuffer instantiation");return Ta(c,a,b)}))}function Va(a){this.name="ExitStatus";this.message=`Program terminated with exit(${a})`;this.status=a}var Wa=a=>{a.forEach(b=>b(r))},Xa=r.noExitRuntime||!0;
class Ya{constructor(a){this.ae=a-24}}
var Za=0,bb=0,cb="undefined"!=typeof TextDecoder?new TextDecoder:void 0,db=(a,b=0,c=NaN)=>{var e=b+c;for(c=b;a[c]&&!(c>=e);)++c;if(16<c-b&&a.buffer&&cb)return cb.decode(a.subarray(b,c));for(e="";b<c;){var f=a[b++];if(f&128){var k=a[b++]&63;if(192==(f&224))e+=String.fromCharCode((f&31)<<6|k);else{var n=a[b++]&63;f=224==(f&240)?(f&15)<<12|k<<6|n:(f&7)<<18|k<<12|n<<6|a[b++]&63;65536>f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}return e},
eb={},fb=a=>{for(;a.length;){var b=a.pop();a.pop()(b)}};function gb(a){return this.fromWireType(H[a>>2])}
var hb={},ib={},jb={},kb,mb=(a,b,c)=>{function e(l){l=c(l);if(l.length!==a.length)throw new kb("Mismatched type converter count");for(var p=0;p<a.length;++p)lb(a[p],l[p])}a.forEach(l=>jb[l]=b);var f=Array(b.length),k=[],n=0;b.forEach((l,p)=>{ib.hasOwnProperty(l)?f[p]=ib[l]:(k.push(l),hb.hasOwnProperty(l)||(hb[l]=[]),hb[l].push(()=>{f[p]=ib[l];++n;n===k.length&&e(f)}))});0===k.length&&e(f)},nb,K=a=>{for(var b="";B[a];)b+=nb[B[a++]];return b},L;
function ob(a,b,c={}){var e=b.name;if(!a)throw new L(`type "${e}" must have a positive integer typeid pointer`);if(ib.hasOwnProperty(a)){if(c.lf)return;throw new L(`Cannot register type '${e}' twice`);}ib[a]=b;delete jb[a];hb.hasOwnProperty(a)&&(b=hb[a],delete hb[a],b.forEach(f=>f()))}function lb(a,b,c={}){return ob(a,b,c)}
var pb=a=>{throw new L(a.Yd.de.be.name+" instance already deleted");},qb=!1,rb=()=>{},sb=(a,b,c)=>{if(b===c)return a;if(void 0===c.ge)return null;a=sb(a,b,c.ge);return null===a?null:c.cf(a)},yb={},zb={},Ab=(a,b)=>{if(void 0===b)throw new L("ptr should not be undefined");for(;a.ge;)b=a.ye(b),a=a.ge;return zb[b]},Cb=(a,b)=>{if(!b.de||!b.ae)throw new kb("makeClassHandle requires ptr and ptrType");if(!!b.ie!==!!b.ee)throw new kb("Both smartPtrType and smartPtr must be specified");b.count={value:1};return Bb(Object.create(a,
{Yd:{value:b,writable:!0}}))},Bb=a=>{if("undefined"===typeof FinalizationRegistry)return Bb=b=>b,a;qb=new FinalizationRegistry(b=>{b=b.Yd;--b.count.value;0===b.count.value&&(b.ee?b.ie.ne(b.ee):b.de.be.ne(b.ae))});Bb=b=>{var c=b.Yd;c.ee&&qb.register(b,{Yd:c},b);return b};rb=b=>{qb.unregister(b)};return Bb(a)},Db=[];function Eb(){}
var Fb=(a,b)=>Object.defineProperty(b,"name",{value:a}),Gb=(a,b,c)=>{if(void 0===a[b].fe){var e=a[b];a[b]=function(...f){if(!a[b].fe.hasOwnProperty(f.length))throw new L(`Function '${c}' called with an invalid number of arguments (${f.length}) - expects one of (${a[b].fe})!`);return a[b].fe[f.length].apply(this,f)};a[b].fe=[];a[b].fe[e.oe]=e}},Hb=(a,b,c)=>{if(r.hasOwnProperty(a)){if(void 0===c||void 0!==r[a].fe&&void 0!==r[a].fe[c])throw new L(`Cannot register public name '${a}' twice`);Gb(r,a,a);
if(r[a].fe.hasOwnProperty(c))throw new L(`Cannot register multiple overloads of a function with the same number of arguments (${c})!`);r[a].fe[c]=b}else r[a]=b,r[a].oe=c},Ib=a=>{a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?`_${a}`:a};function Jb(a,b,c,e,f,k,n,l){this.name=a;this.constructor=b;this.se=c;this.ne=e;this.ge=f;this.ff=k;this.ye=n;this.cf=l;this.pf=[]}
var Kb=(a,b,c)=>{for(;b!==c;){if(!b.ye)throw new L(`Expected null or instance of ${c.name}, got an instance of ${b.name}`);a=b.ye(a);b=b.ge}return a};function Lb(a,b){if(null===b){if(this.Ke)throw new L(`null is not a valid ${this.name}`);return 0}if(!b.Yd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Yd.ae)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);return Kb(b.Yd.ae,b.Yd.de.be,this.be)}
function Nb(a,b){if(null===b){if(this.Ke)throw new L(`null is not a valid ${this.name}`);if(this.De){var c=this.Le();null!==a&&a.push(this.ne,c);return c}return 0}if(!b||!b.Yd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Yd.ae)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);if(!this.Ce&&b.Yd.de.Ce)throw new L(`Cannot convert argument of type ${b.Yd.ie?b.Yd.ie.name:b.Yd.de.name} to parameter type ${this.name}`);c=Kb(b.Yd.ae,b.Yd.de.be,this.be);if(this.De){if(void 0===
b.Yd.ee)throw new L("Passing raw pointer to smart pointer is illegal");switch(this.uf){case 0:if(b.Yd.ie===this)c=b.Yd.ee;else throw new L(`Cannot convert argument of type ${b.Yd.ie?b.Yd.ie.name:b.Yd.de.name} to parameter type ${this.name}`);break;case 1:c=b.Yd.ee;break;case 2:if(b.Yd.ie===this)c=b.Yd.ee;else{var e=b.clone();c=this.qf(c,Ob(()=>e["delete"]()));null!==a&&a.push(this.ne,c)}break;default:throw new L("Unsupporting sharing policy");}}return c}
function Pb(a,b){if(null===b){if(this.Ke)throw new L(`null is not a valid ${this.name}`);return 0}if(!b.Yd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Yd.ae)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);if(b.Yd.de.Ce)throw new L(`Cannot convert argument of type ${b.Yd.de.name} to parameter type ${this.name}`);return Kb(b.Yd.ae,b.Yd.de.be,this.be)}
function Qb(a,b,c,e,f,k,n,l,p,v,w){this.name=a;this.be=b;this.Ke=c;this.Ce=e;this.De=f;this.nf=k;this.uf=n;this.Se=l;this.Le=p;this.qf=v;this.ne=w;f||void 0!==b.ge?this.toWireType=Nb:(this.toWireType=e?Lb:Pb,this.ke=null)}
var Rb=(a,b,c)=>{if(!r.hasOwnProperty(a))throw new kb("Replacing nonexistent public symbol");void 0!==r[a].fe&&void 0!==c?r[a].fe[c]=b:(r[a]=b,r[a].oe=c)},N,Sb=(a,b,c=[])=>{a.includes("j")?(a=a.replace(/p/g,"i"),b=(0,r["dynCall_"+a])(b,...c)):b=N.get(b)(...c);return b},Tb=(a,b)=>(...c)=>Sb(a,b,c),O=(a,b)=>{a=K(a);var c=a.includes("j")?Tb(a,b):N.get(b);if("function"!=typeof c)throw new L(`unknown function pointer with signature ${a}: ${b}`);return c},ac,dc=a=>{a=bc(a);var b=K(a);cc(a);return b},ec=
(a,b)=>{function c(k){f[k]||ib[k]||(jb[k]?jb[k].forEach(c):(e.push(k),f[k]=!0))}var e=[],f={};b.forEach(c);throw new ac(`${a}: `+e.map(dc).join([", "]));};function fc(a){for(var b=1;b<a.length;++b)if(null!==a[b]&&void 0===a[b].ke)return!0;return!1}
function gc(a,b,c,e,f){var k=b.length;if(2>k)throw new L("argTypes array size mismatch! Must at least get return value and 'this' types!");var n=null!==b[1]&&null!==c,l=fc(b),p="void"!==b[0].name,v=k-2,w=Array(v),A=[],D=[];return Fb(a,function(...I){D.length=0;A.length=n?2:1;A[0]=f;if(n){var Q=b[1].toWireType(D,this);A[1]=Q}for(var P=0;P<v;++P)w[P]=b[P+2].toWireType(D,I[P]),A.push(w[P]);I=e(...A);if(l)fb(D);else for(P=n?1:2;P<b.length;P++){var aa=1===P?Q:w[P-2];null!==b[P].ke&&b[P].ke(aa)}Q=p?b[0].fromWireType(I):
void 0;return Q})}
var hc=(a,b)=>{for(var c=[],e=0;e<a;e++)c.push(H[b+4*e>>2]);return c},ic=a=>{a=a.trim();const b=a.indexOf("(");return-1!==b?a.substr(0,b):a},jc=[],kc=[],lc=a=>{9<a&&0===--kc[a+1]&&(kc[a]=void 0,jc.push(a))},mc=a=>{if(!a)throw new L("Cannot use deleted val. handle = "+a);return kc[a]},Ob=a=>{switch(a){case void 0:return 2;case null:return 4;case !0:return 6;case !1:return 8;default:const b=jc.pop()||kc.length;kc[b]=a;kc[b+1]=1;return b}},nc={name:"emscripten::val",fromWireType:a=>{var b=mc(a);lc(a);
return b},toWireType:(a,b)=>Ob(b),je:8,readValueFromPointer:gb,ke:null},oc=(a,b,c)=>{switch(b){case 1:return c?function(e){return this.fromWireType(Ca[e])}:function(e){return this.fromWireType(B[e])};case 2:return c?function(e){return this.fromWireType(Da[e>>1])}:function(e){return this.fromWireType(Fa[e>>1])};case 4:return c?function(e){return this.fromWireType(E[e>>2])}:function(e){return this.fromWireType(H[e>>2])};default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},pc=(a,b)=>
{var c=ib[a];if(void 0===c)throw a=`${b} has unknown type ${dc(a)}`,new L(a);return c},Mb=a=>{if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a},qc=(a,b)=>{switch(b){case 4:return function(c){return this.fromWireType(J[c>>2])};case 8:return function(c){return this.fromWireType(Ga[c>>3])};default:throw new TypeError(`invalid float width (${b}): ${a}`);}},rc=(a,b,c)=>{switch(b){case 1:return c?e=>Ca[e]:e=>B[e];case 2:return c?e=>Da[e>>1]:e=>Fa[e>>
1];case 4:return c?e=>E[e>>2]:e=>H[e>>2];default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},ra=(a,b,c)=>{var e=B;if(!(0<c))return 0;var f=b;c=b+c-1;for(var k=0;k<a.length;++k){var n=a.charCodeAt(k);if(55296<=n&&57343>=n){var l=a.charCodeAt(++k);n=65536+((n&1023)<<10)|l&1023}if(127>=n){if(b>=c)break;e[b++]=n}else{if(2047>=n){if(b+1>=c)break;e[b++]=192|n>>6}else{if(65535>=n){if(b+2>=c)break;e[b++]=224|n>>12}else{if(b+3>=c)break;e[b++]=240|n>>18;e[b++]=128|n>>12&63}e[b++]=128|n>>6&
63}e[b++]=128|n&63}}e[b]=0;return b-f},qa=a=>{for(var b=0,c=0;c<a.length;++c){var e=a.charCodeAt(c);127>=e?b++:2047>=e?b+=2:55296<=e&&57343>=e?(b+=4,++c):b+=3}return b},sc="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0,tc=(a,b)=>{var c=a>>1;for(var e=c+b/2;!(c>=e)&&Fa[c];)++c;c<<=1;if(32<c-a&&sc)return sc.decode(B.subarray(a,c));c="";for(e=0;!(e>=b/2);++e){var f=Da[a+2*e>>1];if(0==f)break;c+=String.fromCharCode(f)}return c},uc=(a,b,c)=>{c??=2147483647;if(2>c)return 0;c-=2;var e=
b;c=c<2*a.length?c/2:a.length;for(var f=0;f<c;++f)Da[b>>1]=a.charCodeAt(f),b+=2;Da[b>>1]=0;return b-e},vc=a=>2*a.length,wc=(a,b)=>{for(var c=0,e="";!(c>=b/4);){var f=E[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e},xc=(a,b,c)=>{c??=2147483647;if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f<a.length;++f){var k=a.charCodeAt(f);if(55296<=k&&57343>=k){var n=a.charCodeAt(++f);k=65536+((k&1023)<<10)|n&1023}E[b>>2]=k;b+=
4;if(b+4>c)break}E[b>>2]=0;return b-e},yc=a=>{for(var b=0,c=0;c<a.length;++c){var e=a.charCodeAt(c);55296<=e&&57343>=e&&++c;b+=4}return b},zc=(a,b,c)=>{var e=[];a=a.toWireType(e,c);e.length&&(H[b>>2]=Ob(e));return a},Ac=[],Bc={},Cc=a=>{var b=Bc[a];return void 0===b?K(a):b},Dc=()=>{function a(b){b.$$$embind_global$$$=b;var c="object"==typeof $$$embind_global$$$&&b.$$$embind_global$$$==b;c||delete b.$$$embind_global$$$;return c}if("object"==typeof globalThis)return globalThis;if("object"==typeof $$$embind_global$$$)return $$$embind_global$$$;
"object"==typeof global&&a(global)?$$$embind_global$$$=global:"object"==typeof self&&a(self)&&($$$embind_global$$$=self);if("object"==typeof $$$embind_global$$$)return $$$embind_global$$$;throw Error("unable to get global object.");},Ec=a=>{var b=Ac.length;Ac.push(a);return b},Fc=(a,b)=>{for(var c=Array(a),e=0;e<a;++e)c[e]=pc(H[b+4*e>>2],"parameter "+e);return c},Gc=Reflect.construct,R,Hc=a=>{var b=a.getExtension("ANGLE_instanced_arrays");b&&(a.vertexAttribDivisor=(c,e)=>b.vertexAttribDivisorANGLE(c,
e),a.drawArraysInstanced=(c,e,f,k)=>b.drawArraysInstancedANGLE(c,e,f,k),a.drawElementsInstanced=(c,e,f,k,n)=>b.drawElementsInstancedANGLE(c,e,f,k,n))},Ic=a=>{var b=a.getExtension("OES_vertex_array_object");b&&(a.createVertexArray=()=>b.createVertexArrayOES(),a.deleteVertexArray=c=>b.deleteVertexArrayOES(c),a.bindVertexArray=c=>b.bindVertexArrayOES(c),a.isVertexArray=c=>b.isVertexArrayOES(c))},Jc=a=>{var b=a.getExtension("WEBGL_draw_buffers");b&&(a.drawBuffers=(c,e)=>b.drawBuffersWEBGL(c,e))},Kc=a=>
{var b="ANGLE_instanced_arrays EXT_blend_minmax EXT_disjoint_timer_query EXT_frag_depth EXT_shader_texture_lod EXT_sRGB OES_element_index_uint OES_fbo_render_mipmap OES_standard_derivatives OES_texture_float OES_texture_half_float OES_texture_half_float_linear OES_vertex_array_object WEBGL_color_buffer_float WEBGL_depth_texture WEBGL_draw_buffers EXT_color_buffer_float EXT_conservative_depth EXT_disjoint_timer_query_webgl2 EXT_texture_norm16 NV_shader_noperspective_interpolation WEBGL_clip_cull_distance EXT_clip_control EXT_color_buffer_half_float EXT_depth_clamp EXT_float_blend EXT_polygon_offset_clamp EXT_texture_compression_bptc EXT_texture_compression_rgtc EXT_texture_filter_anisotropic KHR_parallel_shader_compile OES_texture_float_linear WEBGL_blend_func_extended WEBGL_compressed_texture_astc WEBGL_compressed_texture_etc WEBGL_compressed_texture_etc1 WEBGL_compressed_texture_s3tc WEBGL_compressed_texture_s3tc_srgb WEBGL_debug_renderer_info WEBGL_debug_shaders WEBGL_lose_context WEBGL_multi_draw WEBGL_polygon_mode".split(" ");
return(a.getSupportedExtensions()||[]).filter(c=>b.includes(c))},Lc=1,Mc=[],Nc=[],Oc=[],Pc=[],ka=[],Qc=[],Rc=[],pa=[],Sc=[],Tc=[],Uc=[],Wc={},Xc={},Yc=4,Zc=0,ja=a=>{for(var b=Lc++,c=a.length;c<b;c++)a[c]=null;return b},$c=(a,b,c,e)=>{for(var f=0;f<a;f++){var k=R[c](),n=k&&ja(e);k?(k.name=n,e[n]=k):U||=1282;E[b+4*f>>2]=n}},na=(a,b)=>{a.Ne||(a.Ne=a.getContext,a.getContext=function(e,f){f=a.Ne(e,f);return"webgl"==e==f instanceof WebGLRenderingContext?f:null});var c=1<b.majorVersion?a.getContext("webgl2",
b):a.getContext("webgl",b);return c?ad(c,b):0},ad=(a,b)=>{var c=ja(pa),e={handle:c,attributes:b,version:b.majorVersion,le:a};a.canvas&&(a.canvas.Ve=e);pa[c]=e;("undefined"==typeof b.df||b.df)&&bd(e);return c},oa=a=>{z=pa[a];r.vf=R=z?.le;return!(a&&!R)},bd=a=>{a||=z;if(!a.mf){a.mf=!0;var b=a.le;b.zf=b.getExtension("WEBGL_multi_draw");b.xf=b.getExtension("EXT_polygon_offset_clamp");b.wf=b.getExtension("EXT_clip_control");b.Bf=b.getExtension("WEBGL_polygon_mode");Hc(b);Ic(b);Jc(b);b.Pe=b.getExtension("WEBGL_draw_instanced_base_vertex_base_instance");
b.Re=b.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance");2<=a.version&&(b.me=b.getExtension("EXT_disjoint_timer_query_webgl2"));if(2>a.version||!b.me)b.me=b.getExtension("EXT_disjoint_timer_query");Kc(b).forEach(c=>{c.includes("lose_context")||c.includes("debug")||b.getExtension(c)})}},z,U,cd=(a,b)=>{R.bindFramebuffer(a,Oc[b])},dd=a=>{R.bindVertexArray(Rc[a])},ed=a=>R.clear(a),fd=(a,b,c,e)=>R.clearColor(a,b,c,e),gd=a=>R.clearStencil(a),hd=(a,b)=>{for(var c=0;c<a;c++){var e=E[b+
4*c>>2];R.deleteVertexArray(Rc[e]);Rc[e]=null}},jd=[],kd=(a,b)=>{$c(a,b,"createVertexArray",Rc)};function ld(){var a=Kc(R);return a=a.concat(a.map(b=>"GL_"+b))}
var md=(a,b,c)=>{if(b){var e=void 0;switch(a){case 36346:e=1;break;case 36344:0!=c&&1!=c&&(U||=1280);return;case 34814:case 36345:e=0;break;case 34466:var f=R.getParameter(34467);e=f?f.length:0;break;case 33309:if(2>z.version){U||=1282;return}e=ld().length;break;case 33307:case 33308:if(2>z.version){U||=1280;return}e=33307==a?3:0}if(void 0===e)switch(f=R.getParameter(a),typeof f){case "number":e=f;break;case "boolean":e=f?1:0;break;case "string":U||=1280;return;case "object":if(null===f)switch(a){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:e=
0;break;default:U||=1280;return}else{if(f instanceof Float32Array||f instanceof Uint32Array||f instanceof Int32Array||f instanceof Array){for(a=0;a<f.length;++a)switch(c){case 0:E[b+4*a>>2]=f[a];break;case 2:J[b+4*a>>2]=f[a];break;case 4:Ca[b+a]=f[a]?1:0}return}try{e=f.name|0}catch(k){U||=1280;ya(`GL_INVALID_ENUM in glGet${c}v: Unknown object returned from WebGL getParameter(${a})! (error: ${k})`);return}}break;default:U||=1280;ya(`GL_INVALID_ENUM in glGet${c}v: Native code calling glGet${c}v(${a}) and it returns ${f} of type ${typeof f}!`);
return}switch(c){case 1:c=e;H[b>>2]=c;H[b+4>>2]=(c-H[b>>2])/4294967296;break;case 0:E[b>>2]=e;break;case 2:J[b>>2]=e;break;case 4:Ca[b]=e?1:0}}else U||=1281},nd=(a,b)=>md(a,b,0),od=(a,b,c)=>{if(c){a=Sc[a];b=2>z.version?R.me.getQueryObjectEXT(a,b):R.getQueryParameter(a,b);var e;"boolean"==typeof b?e=b?1:0:e=b;H[c>>2]=e;H[c+4>>2]=(e-H[c>>2])/4294967296}else U||=1281},qd=a=>{var b=qa(a)+1,c=pd(b);c&&ra(a,c,b);return c},rd=a=>{var b=Wc[a];if(!b){switch(a){case 7939:b=qd(ld().join(" "));break;case 7936:case 7937:case 37445:case 37446:(b=
R.getParameter(a))||(U||=1280);b=b?qd(b):0;break;case 7938:b=R.getParameter(7938);var c=`OpenGL ES 2.0 (${b})`;2<=z.version&&(c=`OpenGL ES 3.0 (${b})`);b=qd(c);break;case 35724:b=R.getParameter(35724);c=b.match(/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/);null!==c&&(3==c[1].length&&(c[1]+="0"),b=`OpenGL ES GLSL ES ${c[1]} (${b})`);b=qd(b);break;default:U||=1280}Wc[a]=b}return b},sd=(a,b)=>{if(2>z.version)return U||=1282,0;var c=Xc[a];if(c)return 0>b||b>=c.length?(U||=1281,0):c[b];switch(a){case 7939:return c=
ld().map(qd),c=Xc[a]=c,0>b||b>=c.length?(U||=1281,0):c[b];default:return U||=1280,0}},td=a=>"]"==a.slice(-1)&&a.lastIndexOf("["),ud=a=>{a-=5120;return 0==a?Ca:1==a?B:2==a?Da:4==a?E:6==a?J:5==a||28922==a||28520==a||30779==a||30782==a?H:Fa},vd=(a,b,c,e,f)=>{a=ud(a);b=e*((Zc||c)*({5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4}[b-6402]||1)*a.BYTES_PER_ELEMENT+Yc-1&-Yc);return a.subarray(f>>>31-Math.clz32(a.BYTES_PER_ELEMENT),f+b>>>31-Math.clz32(a.BYTES_PER_ELEMENT))},Y=a=>{var b=R.bf;if(b){var c=
b.xe[a];"number"==typeof c&&(b.xe[a]=c=R.getUniformLocation(b,b.Te[a]+(0<c?`[${c}]`:"")));return c}U||=1282},wd=[],xd=[],yd={},Ad=()=>{if(!zd){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"},b;for(b in yd)void 0===yd[b]?delete a[b]:a[b]=yd[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);zd=c}return zd},zd,Bd=[null,[],[]];
kb=r.InternalError=class extends Error{constructor(a){super(a);this.name="InternalError"}};for(var Cd=Array(256),Dd=0;256>Dd;++Dd)Cd[Dd]=String.fromCharCode(Dd);nb=Cd;L=r.BindingError=class extends Error{constructor(a){super(a);this.name="BindingError"}};
Object.assign(Eb.prototype,{isAliasOf:function(a){if(!(this instanceof Eb&&a instanceof Eb))return!1;var b=this.Yd.de.be,c=this.Yd.ae;a.Yd=a.Yd;var e=a.Yd.de.be;for(a=a.Yd.ae;b.ge;)c=b.ye(c),b=b.ge;for(;e.ge;)a=e.ye(a),e=e.ge;return b===e&&c===a},clone:function(){this.Yd.ae||pb(this);if(this.Yd.we)return this.Yd.count.value+=1,this;var a=Bb,b=Object,c=b.create,e=Object.getPrototypeOf(this),f=this.Yd;a=a(c.call(b,e,{Yd:{value:{count:f.count,ve:f.ve,we:f.we,ae:f.ae,de:f.de,ee:f.ee,ie:f.ie}}}));a.Yd.count.value+=
1;a.Yd.ve=!1;return a},["delete"](){this.Yd.ae||pb(this);if(this.Yd.ve&&!this.Yd.we)throw new L("Object already scheduled for deletion");rb(this);var a=this.Yd;--a.count.value;0===a.count.value&&(a.ee?a.ie.ne(a.ee):a.de.be.ne(a.ae));this.Yd.we||(this.Yd.ee=void 0,this.Yd.ae=void 0)},isDeleted:function(){return!this.Yd.ae},deleteLater:function(){this.Yd.ae||pb(this);if(this.Yd.ve&&!this.Yd.we)throw new L("Object already scheduled for deletion");Db.push(this);this.Yd.ve=!0;return this}});
Object.assign(Qb.prototype,{gf(a){this.Se&&(a=this.Se(a));return a},Oe(a){this.ne?.(a)},je:8,readValueFromPointer:gb,fromWireType:function(a){function b(){return this.De?Cb(this.be.se,{de:this.nf,ae:c,ie:this,ee:a}):Cb(this.be.se,{de:this,ae:a})}var c=this.gf(a);if(!c)return this.Oe(a),null;var e=Ab(this.be,c);if(void 0!==e){if(0===e.Yd.count.value)return e.Yd.ae=c,e.Yd.ee=a,e.clone();e=e.clone();this.Oe(a);return e}e=this.be.ff(c);e=yb[e];if(!e)return b.call(this);e=this.Ce?e.af:e.pointerType;var f=
sb(c,this.be,e.be);return null===f?b.call(this):this.De?Cb(e.be.se,{de:e,ae:f,ie:this,ee:a}):Cb(e.be.se,{de:e,ae:f})}});ac=r.UnboundTypeError=((a,b)=>{var c=Fb(b,function(e){this.name=b;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(a.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:`${this.name}: ${this.message}`};return c})(Error,"UnboundTypeError");
kc.push(0,1,void 0,1,null,1,!0,1,!1,1);r.count_emval_handles=()=>kc.length/2-5-jc.length;for(var Ed=0;32>Ed;++Ed)jd.push(Array(Ed));var Fd=new Float32Array(288);for(Ed=0;288>=Ed;++Ed)wd[Ed]=Fd.subarray(0,Ed);var Gd=new Int32Array(288);for(Ed=0;288>=Ed;++Ed)xd[Ed]=Gd.subarray(0,Ed);
var Vd={F:(a,b,c)=>{var e=new Ya(a);H[e.ae+16>>2]=0;H[e.ae+4>>2]=b;H[e.ae+8>>2]=c;Za=a;bb++;throw Za;},V:function(){return 0},vd:()=>{},ud:function(){return 0},td:()=>{},sd:()=>{},U:function(){},rd:()=>{},nd:()=>{Pa("")},B:a=>{var b=eb[a];delete eb[a];var c=b.Le,e=b.ne,f=b.Qe,k=f.map(n=>n.kf).concat(f.map(n=>n.sf));mb([a],k,n=>{var l={};f.forEach((p,v)=>{var w=n[v],A=p.hf,D=p.jf,I=n[v+f.length],Q=p.rf,P=p.tf;l[p.ef]={read:aa=>w.fromWireType(A(D,aa)),write:(aa,la)=>{var X=[];Q(P,aa,I.toWireType(X,
la));fb(X)}}});return[{name:b.name,fromWireType:p=>{var v={},w;for(w in l)v[w]=l[w].read(p);e(p);return v},toWireType:(p,v)=>{for(var w in l)if(!(w in v))throw new TypeError(`Missing field: "${w}"`);var A=c();for(w in l)l[w].write(A,v[w]);null!==p&&p.push(e,A);return A},je:8,readValueFromPointer:gb,ke:e}]})},Y:()=>{},md:(a,b,c,e)=>{b=K(b);lb(a,{name:b,fromWireType:function(f){return!!f},toWireType:function(f,k){return k?c:e},je:8,readValueFromPointer:function(f){return this.fromWireType(B[f])},ke:null})},
k:(a,b,c,e,f,k,n,l,p,v,w,A,D)=>{w=K(w);k=O(f,k);l&&=O(n,l);v&&=O(p,v);D=O(A,D);var I=Ib(w);Hb(I,function(){ec(`Cannot construct ${w} due to unbound types`,[e])});mb([a,b,c],e?[e]:[],Q=>{Q=Q[0];if(e){var P=Q.be;var aa=P.se}else aa=Eb.prototype;Q=Fb(w,function(...Ea){if(Object.getPrototypeOf(this)!==la)throw new L("Use 'new' to construct "+w);if(void 0===X.pe)throw new L(w+" has no accessible constructor");var ea=X.pe[Ea.length];if(void 0===ea)throw new L(`Tried to invoke ctor of ${w} with invalid number of parameters (${Ea.length}) - expected (${Object.keys(X.pe).toString()}) parameters instead!`);
return ea.apply(this,Ea)});var la=Object.create(aa,{constructor:{value:Q}});Q.prototype=la;var X=new Jb(w,Q,la,D,P,k,l,v);if(X.ge){var ha;(ha=X.ge).ze??(ha.ze=[]);X.ge.ze.push(X)}P=new Qb(w,X,!0,!1,!1);ha=new Qb(w+"*",X,!1,!1,!1);aa=new Qb(w+" const*",X,!1,!0,!1);yb[a]={pointerType:ha,af:aa};Rb(I,Q);return[P,ha,aa]})},e:(a,b,c,e,f,k,n)=>{var l=hc(c,e);b=K(b);b=ic(b);k=O(f,k);mb([],[a],p=>{function v(){ec(`Cannot call ${w} due to unbound types`,l)}p=p[0];var w=`${p.name}.${b}`;b.startsWith("@@")&&
(b=Symbol[b.substring(2)]);var A=p.be.constructor;void 0===A[b]?(v.oe=c-1,A[b]=v):(Gb(A,b,w),A[b].fe[c-1]=v);mb([],l,D=>{D=[D[0],null].concat(D.slice(1));D=gc(w,D,null,k,n);void 0===A[b].fe?(D.oe=c-1,A[b]=D):A[b].fe[c-1]=D;if(p.be.ze)for(const I of p.be.ze)I.constructor.hasOwnProperty(b)||(I.constructor[b]=D);return[]});return[]})},z:(a,b,c,e,f,k)=>{var n=hc(b,c);f=O(e,f);mb([],[a],l=>{l=l[0];var p=`constructor ${l.name}`;void 0===l.be.pe&&(l.be.pe=[]);if(void 0!==l.be.pe[b-1])throw new L(`Cannot register multiple constructors with identical number of parameters (${b-
1}) for class '${l.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);l.be.pe[b-1]=()=>{ec(`Cannot construct ${l.name} due to unbound types`,n)};mb([],n,v=>{v.splice(1,0,null);l.be.pe[b-1]=gc(p,v,null,f,k);return[]});return[]})},a:(a,b,c,e,f,k,n,l)=>{var p=hc(c,e);b=K(b);b=ic(b);k=O(f,k);mb([],[a],v=>{function w(){ec(`Cannot call ${A} due to unbound types`,p)}v=v[0];var A=`${v.name}.${b}`;b.startsWith("@@")&&(b=Symbol[b.substring(2)]);l&&v.be.pf.push(b);
var D=v.be.se,I=D[b];void 0===I||void 0===I.fe&&I.className!==v.name&&I.oe===c-2?(w.oe=c-2,w.className=v.name,D[b]=w):(Gb(D,b,A),D[b].fe[c-2]=w);mb([],p,Q=>{Q=gc(A,Q,v,k,n);void 0===D[b].fe?(Q.oe=c-2,D[b]=Q):D[b].fe[c-2]=Q;return[]});return[]})},q:(a,b,c)=>{a=K(a);mb([],[b],e=>{e=e[0];r[a]=e.fromWireType(c);return[]})},ld:a=>lb(a,nc),i:(a,b,c,e)=>{function f(){}b=K(b);f.values={};lb(a,{name:b,constructor:f,fromWireType:function(k){return this.constructor.values[k]},toWireType:(k,n)=>n.value,je:8,
readValueFromPointer:oc(b,c,e),ke:null});Hb(b,f)},b:(a,b,c)=>{var e=pc(a,"enum");b=K(b);a=e.constructor;e=Object.create(e.constructor.prototype,{value:{value:c},constructor:{value:Fb(`${e.name}_${b}`,function(){})}});a.values[c]=e;a[b]=e},S:(a,b,c)=>{b=K(b);lb(a,{name:b,fromWireType:e=>e,toWireType:(e,f)=>f,je:8,readValueFromPointer:qc(b,c),ke:null})},w:(a,b,c,e,f,k)=>{var n=hc(b,c);a=K(a);a=ic(a);f=O(e,f);Hb(a,function(){ec(`Cannot call ${a} due to unbound types`,n)},b-1);mb([],n,l=>{l=[l[0],null].concat(l.slice(1));
Rb(a,gc(a,l,null,f,k),b-1);return[]})},C:(a,b,c,e,f)=>{b=K(b);-1===f&&(f=4294967295);f=l=>l;if(0===e){var k=32-8*c;f=l=>l<<k>>>k}var n=b.includes("unsigned")?function(l,p){return p>>>0}:function(l,p){return p};lb(a,{name:b,fromWireType:f,toWireType:n,je:8,readValueFromPointer:rc(b,c,0!==e),ke:null})},p:(a,b,c)=>{function e(k){return new f(Ca.buffer,H[k+4>>2],H[k>>2])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=K(c);lb(a,{name:c,fromWireType:e,
je:8,readValueFromPointer:e},{lf:!0})},o:(a,b,c,e,f,k,n,l,p,v,w,A)=>{c=K(c);k=O(f,k);l=O(n,l);v=O(p,v);A=O(w,A);mb([a],[b],D=>{D=D[0];return[new Qb(c,D.be,!1,!1,!0,D,e,k,l,v,A)]})},R:(a,b)=>{b=K(b);var c="std::string"===b;lb(a,{name:b,fromWireType:function(e){var f=H[e>>2],k=e+4;if(c)for(var n=k,l=0;l<=f;++l){var p=k+l;if(l==f||0==B[p]){n=n?db(B,n,p-n):"";if(void 0===v)var v=n;else v+=String.fromCharCode(0),v+=n;n=p+1}}else{v=Array(f);for(l=0;l<f;++l)v[l]=String.fromCharCode(B[k+l]);v=v.join("")}cc(e);
return v},toWireType:function(e,f){f instanceof ArrayBuffer&&(f=new Uint8Array(f));var k="string"==typeof f;if(!(k||f instanceof Uint8Array||f instanceof Uint8ClampedArray||f instanceof Int8Array))throw new L("Cannot pass non-string to std::string");var n=c&&k?qa(f):f.length;var l=pd(4+n+1),p=l+4;H[l>>2]=n;if(c&&k)ra(f,p,n+1);else if(k)for(k=0;k<n;++k){var v=f.charCodeAt(k);if(255<v)throw cc(p),new L("String has UTF-16 code units that do not fit in 8 bits");B[p+k]=v}else for(k=0;k<n;++k)B[p+k]=f[k];
null!==e&&e.push(cc,l);return l},je:8,readValueFromPointer:gb,ke(e){cc(e)}})},M:(a,b,c)=>{c=K(c);if(2===b){var e=tc;var f=uc;var k=vc;var n=l=>Fa[l>>1]}else 4===b&&(e=wc,f=xc,k=yc,n=l=>H[l>>2]);lb(a,{name:c,fromWireType:l=>{for(var p=H[l>>2],v,w=l+4,A=0;A<=p;++A){var D=l+4+A*b;if(A==p||0==n(D))w=e(w,D-w),void 0===v?v=w:(v+=String.fromCharCode(0),v+=w),w=D+b}cc(l);return v},toWireType:(l,p)=>{if("string"!=typeof p)throw new L(`Cannot pass non-string to C++ string type ${c}`);var v=k(p),w=pd(4+v+b);
H[w>>2]=v/b;f(p,w+4,v+b);null!==l&&l.push(cc,w);return w},je:8,readValueFromPointer:gb,ke(l){cc(l)}})},A:(a,b,c,e,f,k)=>{eb[a]={name:K(b),Le:O(c,e),ne:O(f,k),Qe:[]}},d:(a,b,c,e,f,k,n,l,p,v)=>{eb[a].Qe.push({ef:K(b),kf:c,hf:O(e,f),jf:k,sf:n,rf:O(l,p),tf:v})},kd:(a,b)=>{b=K(b);lb(a,{yf:!0,name:b,je:0,fromWireType:()=>{},toWireType:()=>{}})},jd:()=>1,id:()=>{throw Infinity;},E:(a,b,c)=>{a=mc(a);b=pc(b,"emval::as");return zc(b,c,a)},L:(a,b,c,e)=>{a=Ac[a];b=mc(b);return a(null,b,c,e)},t:(a,b,c,e,f)=>{a=
Ac[a];b=mc(b);c=Cc(c);return a(b,b[c],e,f)},c:lc,K:a=>{if(0===a)return Ob(Dc());a=Cc(a);return Ob(Dc()[a])},n:(a,b,c)=>{var e=Fc(a,b),f=e.shift();a--;var k=Array(a);b=`methodCaller<(${e.map(n=>n.name).join(", ")}) => ${f.name}>`;return Ec(Fb(b,(n,l,p,v)=>{for(var w=0,A=0;A<a;++A)k[A]=e[A].readValueFromPointer(v+w),w+=e[A].je;n=1===c?Gc(l,k):l.apply(n,k);return zc(f,p,n)}))},y:(a,b)=>{a=mc(a);b=mc(b);return Ob(a[b])},H:a=>{9<a&&(kc[a+1]+=1)},G:()=>Ob([]),f:a=>Ob(Cc(a)),D:()=>Ob({}),hd:a=>{a=mc(a);
return!a},l:a=>{var b=mc(a);fb(b);lc(a)},h:(a,b,c)=>{a=mc(a);b=mc(b);c=mc(c);a[b]=c},g:(a,b)=>{a=pc(a,"_emval_take_value");a=a.readValueFromPointer(b);return Ob(a)},X:function(){return-52},W:function(){},gd:(a,b,c,e)=>{var f=(new Date).getFullYear(),k=(new Date(f,0,1)).getTimezoneOffset();f=(new Date(f,6,1)).getTimezoneOffset();H[a>>2]=60*Math.max(k,f);E[b>>2]=Number(k!=f);b=n=>{var l=Math.abs(n);return`UTC${0<=n?"-":"+"}${String(Math.floor(l/60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};
a=b(k);b=b(f);f<k?(ra(a,c,17),ra(b,e,17)):(ra(a,e,17),ra(b,c,17))},fd:()=>performance.now(),ed:a=>R.activeTexture(a),dd:(a,b)=>{R.attachShader(Nc[a],Qc[b])},cd:(a,b)=>{R.beginQuery(a,Sc[b])},bd:(a,b)=>{R.me.beginQueryEXT(a,Sc[b])},ad:(a,b,c)=>{R.bindAttribLocation(Nc[a],b,c?db(B,c):"")},$c:(a,b)=>{35051==a?R.Ie=b:35052==a&&(R.re=b);R.bindBuffer(a,Mc[b])},_c:cd,Zc:(a,b)=>{R.bindRenderbuffer(a,Pc[b])},Yc:(a,b)=>{R.bindSampler(a,Tc[b])},Xc:(a,b)=>{R.bindTexture(a,ka[b])},Wc:dd,Vc:dd,Uc:(a,b,c,e)=>R.blendColor(a,
b,c,e),Tc:a=>R.blendEquation(a),Sc:(a,b)=>R.blendFunc(a,b),Rc:(a,b,c,e,f,k,n,l,p,v)=>R.blitFramebuffer(a,b,c,e,f,k,n,l,p,v),Qc:(a,b,c,e)=>{2<=z.version?c&&b?R.bufferData(a,B,e,c,b):R.bufferData(a,b,e):R.bufferData(a,c?B.subarray(c,c+b):b,e)},Pc:(a,b,c,e)=>{2<=z.version?c&&R.bufferSubData(a,b,B,e,c):R.bufferSubData(a,b,B.subarray(e,e+c))},Oc:a=>R.checkFramebufferStatus(a),Nc:ed,Mc:fd,Lc:gd,Kc:(a,b,c,e)=>R.clientWaitSync(Uc[a],b,(c>>>0)+4294967296*e),Jc:(a,b,c,e)=>{R.colorMask(!!a,!!b,!!c,!!e)},Ic:a=>
{R.compileShader(Qc[a])},Hc:(a,b,c,e,f,k,n,l)=>{2<=z.version?R.re||!n?R.compressedTexImage2D(a,b,c,e,f,k,n,l):R.compressedTexImage2D(a,b,c,e,f,k,B,l,n):R.compressedTexImage2D(a,b,c,e,f,k,B.subarray(l,l+n))},Gc:(a,b,c,e,f,k,n,l,p)=>{2<=z.version?R.re||!l?R.compressedTexSubImage2D(a,b,c,e,f,k,n,l,p):R.compressedTexSubImage2D(a,b,c,e,f,k,n,B,p,l):R.compressedTexSubImage2D(a,b,c,e,f,k,n,B.subarray(p,p+l))},Fc:(a,b,c,e,f)=>R.copyBufferSubData(a,b,c,e,f),Ec:(a,b,c,e,f,k,n,l)=>R.copyTexSubImage2D(a,b,c,
e,f,k,n,l),Dc:()=>{var a=ja(Nc),b=R.createProgram();b.name=a;b.Ge=b.Ee=b.Fe=0;b.Me=1;Nc[a]=b;return a},Cc:a=>{var b=ja(Qc);Qc[b]=R.createShader(a);return b},Bc:a=>R.cullFace(a),Ac:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Mc[e];f&&(R.deleteBuffer(f),f.name=0,Mc[e]=null,e==R.Ie&&(R.Ie=0),e==R.re&&(R.re=0))}},zc:(a,b)=>{for(var c=0;c<a;++c){var e=E[b+4*c>>2],f=Oc[e];f&&(R.deleteFramebuffer(f),f.name=0,Oc[e]=null)}},yc:a=>{if(a){var b=Nc[a];b?(R.deleteProgram(b),b.name=0,Nc[a]=null):U||=1281}},
xc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Sc[e];f&&(R.deleteQuery(f),Sc[e]=null)}},wc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Sc[e];f&&(R.me.deleteQueryEXT(f),Sc[e]=null)}},vc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Pc[e];f&&(R.deleteRenderbuffer(f),f.name=0,Pc[e]=null)}},uc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Tc[e];f&&(R.deleteSampler(f),f.name=0,Tc[e]=null)}},tc:a=>{if(a){var b=Qc[a];b?(R.deleteShader(b),Qc[a]=null):U||=1281}},sc:a=>{if(a){var b=Uc[a];b?
(R.deleteSync(b),b.name=0,Uc[a]=null):U||=1281}},rc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=ka[e];f&&(R.deleteTexture(f),f.name=0,ka[e]=null)}},qc:hd,pc:hd,oc:a=>{R.depthMask(!!a)},nc:a=>R.disable(a),mc:a=>{R.disableVertexAttribArray(a)},lc:(a,b,c)=>{R.drawArrays(a,b,c)},kc:(a,b,c,e)=>{R.drawArraysInstanced(a,b,c,e)},jc:(a,b,c,e,f)=>{R.Pe.drawArraysInstancedBaseInstanceWEBGL(a,b,c,e,f)},ic:(a,b)=>{for(var c=jd[a],e=0;e<a;e++)c[e]=E[b+4*e>>2];R.drawBuffers(c)},hc:(a,b,c,e)=>{R.drawElements(a,
b,c,e)},gc:(a,b,c,e,f)=>{R.drawElementsInstanced(a,b,c,e,f)},fc:(a,b,c,e,f,k,n)=>{R.Pe.drawElementsInstancedBaseVertexBaseInstanceWEBGL(a,b,c,e,f,k,n)},ec:(a,b,c,e,f,k)=>{R.drawElements(a,e,f,k)},dc:a=>R.enable(a),cc:a=>{R.enableVertexAttribArray(a)},bc:a=>R.endQuery(a),ac:a=>{R.me.endQueryEXT(a)},$b:(a,b)=>(a=R.fenceSync(a,b))?(b=ja(Uc),a.name=b,Uc[b]=a,b):0,_b:()=>R.finish(),Zb:()=>R.flush(),Yb:(a,b,c,e)=>{R.framebufferRenderbuffer(a,b,c,Pc[e])},Xb:(a,b,c,e,f)=>{R.framebufferTexture2D(a,b,c,ka[e],
f)},Wb:a=>R.frontFace(a),Vb:(a,b)=>{$c(a,b,"createBuffer",Mc)},Ub:(a,b)=>{$c(a,b,"createFramebuffer",Oc)},Tb:(a,b)=>{$c(a,b,"createQuery",Sc)},Sb:(a,b)=>{for(var c=0;c<a;c++){var e=R.me.createQueryEXT();if(!e){for(U||=1282;c<a;)E[b+4*c++>>2]=0;break}var f=ja(Sc);e.name=f;Sc[f]=e;E[b+4*c>>2]=f}},Rb:(a,b)=>{$c(a,b,"createRenderbuffer",Pc)},Qb:(a,b)=>{$c(a,b,"createSampler",Tc)},Pb:(a,b)=>{$c(a,b,"createTexture",ka)},Ob:kd,Nb:kd,Mb:a=>R.generateMipmap(a),Lb:(a,b,c)=>{c?E[c>>2]=R.getBufferParameter(a,
b):U||=1281},Kb:()=>{var a=R.getError()||U;U=0;return a},Jb:(a,b)=>md(a,b,2),Ib:(a,b,c,e)=>{a=R.getFramebufferAttachmentParameter(a,b,c);if(a instanceof WebGLRenderbuffer||a instanceof WebGLTexture)a=a.name|0;E[e>>2]=a},Hb:nd,Gb:(a,b,c,e)=>{a=R.getProgramInfoLog(Nc[a]);null===a&&(a="(unknown error)");b=0<b&&e?ra(a,e,b):0;c&&(E[c>>2]=b)},Fb:(a,b,c)=>{if(c)if(a>=Lc)U||=1281;else if(a=Nc[a],35716==b)a=R.getProgramInfoLog(a),null===a&&(a="(unknown error)"),E[c>>2]=a.length+1;else if(35719==b){if(!a.Ge){var e=
R.getProgramParameter(a,35718);for(b=0;b<e;++b)a.Ge=Math.max(a.Ge,R.getActiveUniform(a,b).name.length+1)}E[c>>2]=a.Ge}else if(35722==b){if(!a.Ee)for(e=R.getProgramParameter(a,35721),b=0;b<e;++b)a.Ee=Math.max(a.Ee,R.getActiveAttrib(a,b).name.length+1);E[c>>2]=a.Ee}else if(35381==b){if(!a.Fe)for(e=R.getProgramParameter(a,35382),b=0;b<e;++b)a.Fe=Math.max(a.Fe,R.getActiveUniformBlockName(a,b).length+1);E[c>>2]=a.Fe}else E[c>>2]=R.getProgramParameter(a,b);else U||=1281},Eb:od,Db:od,Cb:(a,b,c)=>{if(c){a=
R.getQueryParameter(Sc[a],b);var e;"boolean"==typeof a?e=a?1:0:e=a;E[c>>2]=e}else U||=1281},Bb:(a,b,c)=>{if(c){a=R.me.getQueryObjectEXT(Sc[a],b);var e;"boolean"==typeof a?e=a?1:0:e=a;E[c>>2]=e}else U||=1281},Ab:(a,b,c)=>{c?E[c>>2]=R.getQuery(a,b):U||=1281},zb:(a,b,c)=>{c?E[c>>2]=R.me.getQueryEXT(a,b):U||=1281},yb:(a,b,c)=>{c?E[c>>2]=R.getRenderbufferParameter(a,b):U||=1281},xb:(a,b,c,e)=>{a=R.getShaderInfoLog(Qc[a]);null===a&&(a="(unknown error)");b=0<b&&e?ra(a,e,b):0;c&&(E[c>>2]=b)},wb:(a,b,c,e)=>
{a=R.getShaderPrecisionFormat(a,b);E[c>>2]=a.rangeMin;E[c+4>>2]=a.rangeMax;E[e>>2]=a.precision},vb:(a,b,c)=>{c?35716==b?(a=R.getShaderInfoLog(Qc[a]),null===a&&(a="(unknown error)"),E[c>>2]=a?a.length+1:0):35720==b?(a=R.getShaderSource(Qc[a]),E[c>>2]=a?a.length+1:0):E[c>>2]=R.getShaderParameter(Qc[a],b):U||=1281},ub:rd,tb:sd,sb:(a,b)=>{b=b?db(B,b):"";if(a=Nc[a]){var c=a,e=c.xe,f=c.Ue,k;if(!e){c.xe=e={};c.Te={};var n=R.getProgramParameter(c,35718);for(k=0;k<n;++k){var l=R.getActiveUniform(c,k);var p=
l.name;l=l.size;var v=td(p);v=0<v?p.slice(0,v):p;var w=c.Me;c.Me+=l;f[v]=[l,w];for(p=0;p<l;++p)e[w]=p,c.Te[w++]=v}}c=a.xe;e=0;f=b;k=td(b);0<k&&(e=parseInt(b.slice(k+1))>>>0,f=b.slice(0,k));if((f=a.Ue[f])&&e<f[0]&&(e+=f[1],c[e]=c[e]||R.getUniformLocation(a,b)))return e}else U||=1281;return-1},rb:(a,b,c)=>{for(var e=jd[b],f=0;f<b;f++)e[f]=E[c+4*f>>2];R.invalidateFramebuffer(a,e)},qb:(a,b,c,e,f,k,n)=>{for(var l=jd[b],p=0;p<b;p++)l[p]=E[c+4*p>>2];R.invalidateSubFramebuffer(a,l,e,f,k,n)},pb:a=>R.isSync(Uc[a]),
ob:a=>(a=ka[a])?R.isTexture(a):0,nb:a=>R.lineWidth(a),mb:a=>{a=Nc[a];R.linkProgram(a);a.xe=0;a.Ue={}},lb:(a,b,c,e,f,k)=>{R.Re.multiDrawArraysInstancedBaseInstanceWEBGL(a,E,b>>2,E,c>>2,E,e>>2,H,f>>2,k)},kb:(a,b,c,e,f,k,n,l)=>{R.Re.multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL(a,E,b>>2,c,E,e>>2,E,f>>2,E,k>>2,H,n>>2,l)},jb:(a,b)=>{3317==a?Yc=b:3314==a&&(Zc=b);R.pixelStorei(a,b)},ib:(a,b)=>{R.me.queryCounterEXT(Sc[a],b)},hb:a=>R.readBuffer(a),gb:(a,b,c,e,f,k,n)=>{if(2<=z.version)if(R.Ie)R.readPixels(a,
b,c,e,f,k,n);else{var l=ud(k);n>>>=31-Math.clz32(l.BYTES_PER_ELEMENT);R.readPixels(a,b,c,e,f,k,l,n)}else(l=vd(k,f,c,e,n))?R.readPixels(a,b,c,e,f,k,l):U||=1280},fb:(a,b,c,e)=>R.renderbufferStorage(a,b,c,e),eb:(a,b,c,e,f)=>R.renderbufferStorageMultisample(a,b,c,e,f),db:(a,b,c)=>{R.samplerParameterf(Tc[a],b,c)},cb:(a,b,c)=>{R.samplerParameteri(Tc[a],b,c)},bb:(a,b,c)=>{R.samplerParameteri(Tc[a],b,E[c>>2])},ab:(a,b,c,e)=>R.scissor(a,b,c,e),$a:(a,b,c,e)=>{for(var f="",k=0;k<b;++k){var n=(n=H[c+4*k>>2])?
db(B,n,e?H[e+4*k>>2]:void 0):"";f+=n}R.shaderSource(Qc[a],f)},_a:(a,b,c)=>R.stencilFunc(a,b,c),Za:(a,b,c,e)=>R.stencilFuncSeparate(a,b,c,e),Ya:a=>R.stencilMask(a),Xa:(a,b)=>R.stencilMaskSeparate(a,b),Wa:(a,b,c)=>R.stencilOp(a,b,c),Va:(a,b,c,e)=>R.stencilOpSeparate(a,b,c,e),Ua:(a,b,c,e,f,k,n,l,p)=>{if(2<=z.version){if(R.re){R.texImage2D(a,b,c,e,f,k,n,l,p);return}if(p){var v=ud(l);p>>>=31-Math.clz32(v.BYTES_PER_ELEMENT);R.texImage2D(a,b,c,e,f,k,n,l,v,p);return}}v=p?vd(l,n,e,f,p):null;R.texImage2D(a,
b,c,e,f,k,n,l,v)},Ta:(a,b,c)=>R.texParameterf(a,b,c),Sa:(a,b,c)=>{R.texParameterf(a,b,J[c>>2])},Ra:(a,b,c)=>R.texParameteri(a,b,c),Qa:(a,b,c)=>{R.texParameteri(a,b,E[c>>2])},Pa:(a,b,c,e,f)=>R.texStorage2D(a,b,c,e,f),Oa:(a,b,c,e,f,k,n,l,p)=>{if(2<=z.version){if(R.re){R.texSubImage2D(a,b,c,e,f,k,n,l,p);return}if(p){var v=ud(l);R.texSubImage2D(a,b,c,e,f,k,n,l,v,p>>>31-Math.clz32(v.BYTES_PER_ELEMENT));return}}p=p?vd(l,n,f,k,p):null;R.texSubImage2D(a,b,c,e,f,k,n,l,p)},Na:(a,b)=>{R.uniform1f(Y(a),b)},Ma:(a,
b,c)=>{if(2<=z.version)b&&R.uniform1fv(Y(a),J,c>>2,b);else{if(288>=b)for(var e=wd[b],f=0;f<b;++f)e[f]=J[c+4*f>>2];else e=J.subarray(c>>2,c+4*b>>2);R.uniform1fv(Y(a),e)}},La:(a,b)=>{R.uniform1i(Y(a),b)},Ka:(a,b,c)=>{if(2<=z.version)b&&R.uniform1iv(Y(a),E,c>>2,b);else{if(288>=b)for(var e=xd[b],f=0;f<b;++f)e[f]=E[c+4*f>>2];else e=E.subarray(c>>2,c+4*b>>2);R.uniform1iv(Y(a),e)}},Ja:(a,b,c)=>{R.uniform2f(Y(a),b,c)},Ia:(a,b,c)=>{if(2<=z.version)b&&R.uniform2fv(Y(a),J,c>>2,2*b);else{if(144>=b){b*=2;for(var e=
wd[b],f=0;f<b;f+=2)e[f]=J[c+4*f>>2],e[f+1]=J[c+(4*f+4)>>2]}else e=J.subarray(c>>2,c+8*b>>2);R.uniform2fv(Y(a),e)}},Ha:(a,b,c)=>{R.uniform2i(Y(a),b,c)},Ga:(a,b,c)=>{if(2<=z.version)b&&R.uniform2iv(Y(a),E,c>>2,2*b);else{if(144>=b){b*=2;for(var e=xd[b],f=0;f<b;f+=2)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2]}else e=E.subarray(c>>2,c+8*b>>2);R.uniform2iv(Y(a),e)}},Fa:(a,b,c,e)=>{R.uniform3f(Y(a),b,c,e)},Ea:(a,b,c)=>{if(2<=z.version)b&&R.uniform3fv(Y(a),J,c>>2,3*b);else{if(96>=b){b*=3;for(var e=wd[b],f=0;f<
b;f+=3)e[f]=J[c+4*f>>2],e[f+1]=J[c+(4*f+4)>>2],e[f+2]=J[c+(4*f+8)>>2]}else e=J.subarray(c>>2,c+12*b>>2);R.uniform3fv(Y(a),e)}},Da:(a,b,c,e)=>{R.uniform3i(Y(a),b,c,e)},Ca:(a,b,c)=>{if(2<=z.version)b&&R.uniform3iv(Y(a),E,c>>2,3*b);else{if(96>=b){b*=3;for(var e=xd[b],f=0;f<b;f+=3)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2],e[f+2]=E[c+(4*f+8)>>2]}else e=E.subarray(c>>2,c+12*b>>2);R.uniform3iv(Y(a),e)}},Ba:(a,b,c,e,f)=>{R.uniform4f(Y(a),b,c,e,f)},Aa:(a,b,c)=>{if(2<=z.version)b&&R.uniform4fv(Y(a),J,c>>2,4*
b);else{if(72>=b){var e=wd[4*b],f=J;c>>=2;b*=4;for(var k=0;k<b;k+=4){var n=c+k;e[k]=f[n];e[k+1]=f[n+1];e[k+2]=f[n+2];e[k+3]=f[n+3]}}else e=J.subarray(c>>2,c+16*b>>2);R.uniform4fv(Y(a),e)}},za:(a,b,c,e,f)=>{R.uniform4i(Y(a),b,c,e,f)},ya:(a,b,c)=>{if(2<=z.version)b&&R.uniform4iv(Y(a),E,c>>2,4*b);else{if(72>=b){b*=4;for(var e=xd[b],f=0;f<b;f+=4)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2],e[f+2]=E[c+(4*f+8)>>2],e[f+3]=E[c+(4*f+12)>>2]}else e=E.subarray(c>>2,c+16*b>>2);R.uniform4iv(Y(a),e)}},xa:(a,b,c,e)=>
{if(2<=z.version)b&&R.uniformMatrix2fv(Y(a),!!c,J,e>>2,4*b);else{if(72>=b){b*=4;for(var f=wd[b],k=0;k<b;k+=4)f[k]=J[e+4*k>>2],f[k+1]=J[e+(4*k+4)>>2],f[k+2]=J[e+(4*k+8)>>2],f[k+3]=J[e+(4*k+12)>>2]}else f=J.subarray(e>>2,e+16*b>>2);R.uniformMatrix2fv(Y(a),!!c,f)}},wa:(a,b,c,e)=>{if(2<=z.version)b&&R.uniformMatrix3fv(Y(a),!!c,J,e>>2,9*b);else{if(32>=b){b*=9;for(var f=wd[b],k=0;k<b;k+=9)f[k]=J[e+4*k>>2],f[k+1]=J[e+(4*k+4)>>2],f[k+2]=J[e+(4*k+8)>>2],f[k+3]=J[e+(4*k+12)>>2],f[k+4]=J[e+(4*k+16)>>2],f[k+
5]=J[e+(4*k+20)>>2],f[k+6]=J[e+(4*k+24)>>2],f[k+7]=J[e+(4*k+28)>>2],f[k+8]=J[e+(4*k+32)>>2]}else f=J.subarray(e>>2,e+36*b>>2);R.uniformMatrix3fv(Y(a),!!c,f)}},va:(a,b,c,e)=>{if(2<=z.version)b&&R.uniformMatrix4fv(Y(a),!!c,J,e>>2,16*b);else{if(18>=b){var f=wd[16*b],k=J;e>>=2;b*=16;for(var n=0;n<b;n+=16){var l=e+n;f[n]=k[l];f[n+1]=k[l+1];f[n+2]=k[l+2];f[n+3]=k[l+3];f[n+4]=k[l+4];f[n+5]=k[l+5];f[n+6]=k[l+6];f[n+7]=k[l+7];f[n+8]=k[l+8];f[n+9]=k[l+9];f[n+10]=k[l+10];f[n+11]=k[l+11];f[n+12]=k[l+12];f[n+
13]=k[l+13];f[n+14]=k[l+14];f[n+15]=k[l+15]}}else f=J.subarray(e>>2,e+64*b>>2);R.uniformMatrix4fv(Y(a),!!c,f)}},ua:a=>{a=Nc[a];R.useProgram(a);R.bf=a},ta:(a,b)=>R.vertexAttrib1f(a,b),sa:(a,b)=>{R.vertexAttrib2f(a,J[b>>2],J[b+4>>2])},ra:(a,b)=>{R.vertexAttrib3f(a,J[b>>2],J[b+4>>2],J[b+8>>2])},qa:(a,b)=>{R.vertexAttrib4f(a,J[b>>2],J[b+4>>2],J[b+8>>2],J[b+12>>2])},pa:(a,b)=>{R.vertexAttribDivisor(a,b)},oa:(a,b,c,e,f)=>{R.vertexAttribIPointer(a,b,c,e,f)},na:(a,b,c,e,f,k)=>{R.vertexAttribPointer(a,b,c,
!!e,f,k)},ma:(a,b,c,e)=>R.viewport(a,b,c,e),la:(a,b,c,e)=>{R.waitSync(Uc[a],b,(c>>>0)+4294967296*e)},ka:a=>{var b=B.length;a>>>=0;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var e=b*(1+1/c);e=Math.min(e,a+100663296);a:{e=(Math.min(2147483648,65536*Math.ceil(Math.max(a,e)/65536))-za.buffer.byteLength+65535)/65536|0;try{za.grow(e);Ha();var f=1;break a}catch(k){}f=void 0}if(f)return!0}return!1},ja:()=>z?z.handle:0,qd:(a,b)=>{var c=0;Ad().forEach((e,f)=>{var k=b+c;f=H[a+4*f>>2]=k;for(k=0;k<e.length;++k)Ca[f++]=
e.charCodeAt(k);Ca[f]=0;c+=e.length+1});return 0},pd:(a,b)=>{var c=Ad();H[a>>2]=c.length;var e=0;c.forEach(f=>e+=f.length+1);H[b>>2]=e;return 0},ia:a=>{Xa||(Ba=!0);throw new Va(a);},N:()=>52,_:function(){return 52},od:()=>52,Z:function(){return 70},T:(a,b,c,e)=>{for(var f=0,k=0;k<c;k++){var n=H[b>>2],l=H[b+4>>2];b+=8;for(var p=0;p<l;p++){var v=B[n+p],w=Bd[a];0===v||10===v?((1===a?xa:ya)(db(w)),w.length=0):w.push(v)}f+=l}H[e>>2]=f;return 0},ha:cd,ga:ed,fa:fd,ea:gd,J:nd,Q:rd,da:sd,j:Hd,v:Id,m:Jd,I:Kd,
ca:Ld,P:Md,O:Nd,s:Od,x:Pd,r:Qd,u:Rd,ba:Sd,aa:Td,$:Ud},Z=function(){function a(c){Z=c.exports;za=Z.wd;Ha();N=Z.zd;Ja.unshift(Z.xd);La--;0==La&&(null!==Na&&(clearInterval(Na),Na=null),Oa&&(c=Oa,Oa=null,c()));return Z}var b={a:Vd};La++;if(r.instantiateWasm)try{return r.instantiateWasm(b,a)}catch(c){ya(`Module.instantiateWasm callback failed with error: ${c}`),ca(c)}Ra??=r.locateFile?Qa("canvaskit.wasm")?"canvaskit.wasm":ta+"canvaskit.wasm":(new URL("canvaskit.wasm",import.meta.url)).href;
Ua(b,function(c){a(c.instance)}).catch(ca);return{}}(),bc=a=>(bc=Z.yd)(a),pd=r._malloc=a=>(pd=r._malloc=Z.Ad)(a),cc=r._free=a=>(cc=r._free=Z.Bd)(a),Wd=(a,b)=>(Wd=Z.Cd)(a,b),Xd=a=>(Xd=Z.Dd)(a),Yd=()=>(Yd=Z.Ed)();r.dynCall_viji=(a,b,c,e,f)=>(r.dynCall_viji=Z.Fd)(a,b,c,e,f);r.dynCall_vijiii=(a,b,c,e,f,k,n)=>(r.dynCall_vijiii=Z.Gd)(a,b,c,e,f,k,n);r.dynCall_viiiiij=(a,b,c,e,f,k,n,l)=>(r.dynCall_viiiiij=Z.Hd)(a,b,c,e,f,k,n,l);r.dynCall_iiiji=(a,b,c,e,f,k)=>(r.dynCall_iiiji=Z.Id)(a,b,c,e,f,k);
r.dynCall_jii=(a,b,c)=>(r.dynCall_jii=Z.Jd)(a,b,c);r.dynCall_vij=(a,b,c,e)=>(r.dynCall_vij=Z.Kd)(a,b,c,e);r.dynCall_jiiiiii=(a,b,c,e,f,k,n)=>(r.dynCall_jiiiiii=Z.Ld)(a,b,c,e,f,k,n);r.dynCall_jiiiiji=(a,b,c,e,f,k,n,l)=>(r.dynCall_jiiiiji=Z.Md)(a,b,c,e,f,k,n,l);r.dynCall_ji=(a,b)=>(r.dynCall_ji=Z.Nd)(a,b);r.dynCall_iijj=(a,b,c,e,f,k)=>(r.dynCall_iijj=Z.Od)(a,b,c,e,f,k);r.dynCall_iiji=(a,b,c,e,f)=>(r.dynCall_iiji=Z.Pd)(a,b,c,e,f);
r.dynCall_iijjiii=(a,b,c,e,f,k,n,l,p)=>(r.dynCall_iijjiii=Z.Qd)(a,b,c,e,f,k,n,l,p);r.dynCall_iij=(a,b,c,e)=>(r.dynCall_iij=Z.Rd)(a,b,c,e);r.dynCall_vijjjii=(a,b,c,e,f,k,n,l,p,v)=>(r.dynCall_vijjjii=Z.Sd)(a,b,c,e,f,k,n,l,p,v);r.dynCall_jiji=(a,b,c,e,f)=>(r.dynCall_jiji=Z.Td)(a,b,c,e,f);r.dynCall_viijii=(a,b,c,e,f,k,n)=>(r.dynCall_viijii=Z.Ud)(a,b,c,e,f,k,n);r.dynCall_iiiiij=(a,b,c,e,f,k,n)=>(r.dynCall_iiiiij=Z.Vd)(a,b,c,e,f,k,n);
r.dynCall_iiiiijj=(a,b,c,e,f,k,n,l,p)=>(r.dynCall_iiiiijj=Z.Wd)(a,b,c,e,f,k,n,l,p);r.dynCall_iiiiiijj=(a,b,c,e,f,k,n,l,p,v)=>(r.dynCall_iiiiiijj=Z.Xd)(a,b,c,e,f,k,n,l,p,v);function Rd(a,b,c,e,f){var k=Yd();try{N.get(a)(b,c,e,f)}catch(n){Xd(k);if(n!==n+0)throw n;Wd(1,0)}}function Id(a,b,c){var e=Yd();try{return N.get(a)(b,c)}catch(f){Xd(e);if(f!==f+0)throw f;Wd(1,0)}}function Pd(a,b,c){var e=Yd();try{N.get(a)(b,c)}catch(f){Xd(e);if(f!==f+0)throw f;Wd(1,0)}}
function Hd(a,b){var c=Yd();try{return N.get(a)(b)}catch(e){Xd(c);if(e!==e+0)throw e;Wd(1,0)}}function Od(a,b){var c=Yd();try{N.get(a)(b)}catch(e){Xd(c);if(e!==e+0)throw e;Wd(1,0)}}function Jd(a,b,c,e){var f=Yd();try{return N.get(a)(b,c,e)}catch(k){Xd(f);if(k!==k+0)throw k;Wd(1,0)}}function Ud(a,b,c,e,f,k,n,l,p,v){var w=Yd();try{N.get(a)(b,c,e,f,k,n,l,p,v)}catch(A){Xd(w);if(A!==A+0)throw A;Wd(1,0)}}function Qd(a,b,c,e){var f=Yd();try{N.get(a)(b,c,e)}catch(k){Xd(f);if(k!==k+0)throw k;Wd(1,0)}}
function Td(a,b,c,e,f,k,n){var l=Yd();try{N.get(a)(b,c,e,f,k,n)}catch(p){Xd(l);if(p!==p+0)throw p;Wd(1,0)}}function Md(a,b,c,e,f,k,n,l){var p=Yd();try{return N.get(a)(b,c,e,f,k,n,l)}catch(v){Xd(p);if(v!==v+0)throw v;Wd(1,0)}}function Sd(a,b,c,e,f,k){var n=Yd();try{N.get(a)(b,c,e,f,k)}catch(l){Xd(n);if(l!==l+0)throw l;Wd(1,0)}}function Kd(a,b,c,e,f){var k=Yd();try{return N.get(a)(b,c,e,f)}catch(n){Xd(k);if(n!==n+0)throw n;Wd(1,0)}}
function Nd(a,b,c,e,f,k,n,l,p,v){var w=Yd();try{return N.get(a)(b,c,e,f,k,n,l,p,v)}catch(A){Xd(w);if(A!==A+0)throw A;Wd(1,0)}}function Ld(a,b,c,e,f,k,n){var l=Yd();try{return N.get(a)(b,c,e,f,k,n)}catch(p){Xd(l);if(p!==p+0)throw p;Wd(1,0)}}var Zd,$d;Oa=function ae(){Zd||be();Zd||(Oa=ae)};function be(){if(!(0<La)){if(!$d&&($d=1,Wa(Ia),0<La))return;Zd||(Zd=1,r.calledRun=1,Ba||(Wa(Ja),ba(r),r.onRuntimeInitialized?.(),Wa(Ka)))}}be();moduleRtn=da;
return moduleRtn;
}
);
})();
export default CanvasKitInit;

File diff suppressed because one or more lines are too long

BIN
web/canvaskit/canvaskit.wasm Executable file

Binary file not shown.

View File

@ -0,0 +1,192 @@
var CanvasKitInit = (() => {
var _scriptName = import.meta.url;
return (
function(moduleArg = {}) {
var moduleRtn;
var r=moduleArg,ba,ca,da=new Promise((a,b)=>{ba=a;ca=b}),fa="object"==typeof window,ia="function"==typeof importScripts;
(function(a){a.Xd=a.Xd||[];a.Xd.push(function(){a.MakeSWCanvasSurface=function(b){var c=b,e="undefined"!==typeof OffscreenCanvas&&c instanceof OffscreenCanvas;if(!("undefined"!==typeof HTMLCanvasElement&&c instanceof HTMLCanvasElement||e||(c=document.getElementById(b),c)))throw"Canvas with id "+b+" was not found";if(b=a.MakeSurface(c.width,c.height))b.ue=c;return b};a.MakeCanvasSurface||(a.MakeCanvasSurface=a.MakeSWCanvasSurface);a.MakeSurface=function(b,c){var e={width:b,height:c,colorType:a.ColorType.RGBA_8888,
alphaType:a.AlphaType.Unpremul,colorSpace:a.ColorSpace.SRGB},f=b*c*4,k=a._malloc(f);if(e=a.Surface._makeRasterDirect(e,k,4*b))e.ue=null,e.Ue=b,e.Re=c,e.Se=f,e.Be=k,e.getCanvas().clear(a.TRANSPARENT);return e};a.MakeRasterDirectSurface=function(b,c,e){return a.Surface._makeRasterDirect(b,c.byteOffset,e)};a.Surface.prototype.flush=function(b){a.Ud(this.Td);this._flush();if(this.ue){var c=new Uint8ClampedArray(a.HEAPU8.buffer,this.Be,this.Se);c=new ImageData(c,this.Ue,this.Re);b?this.ue.getContext("2d").putImageData(c,
0,0,b[0],b[1],b[2]-b[0],b[3]-b[1]):this.ue.getContext("2d").putImageData(c,0,0)}};a.Surface.prototype.dispose=function(){this.Be&&a._free(this.Be);this.delete()};a.Ud=a.Ud||function(){};a.ve=a.ve||function(){return null}})})(r);
(function(a){a.Xd=a.Xd||[];a.Xd.push(function(){function b(l,q,v){return l&&l.hasOwnProperty(q)?l[q]:v}function c(l){var q=ja(ka);ka[q]=l;return q}function e(l){return l.naturalHeight||l.videoHeight||l.displayHeight||l.height}function f(l){return l.naturalWidth||l.videoWidth||l.displayWidth||l.width}function k(l,q,v,w){l.bindTexture(l.TEXTURE_2D,q);w||v.alphaType!==a.AlphaType.Premul||l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0);return q}function n(l,q,v){v||q.alphaType!==a.AlphaType.Premul||
l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1);l.bindTexture(l.TEXTURE_2D,null)}a.GetWebGLContext=function(l,q){if(!l)throw"null canvas passed into makeWebGLContext";var v={alpha:b(q,"alpha",1),depth:b(q,"depth",1),stencil:b(q,"stencil",8),antialias:b(q,"antialias",0),premultipliedAlpha:b(q,"premultipliedAlpha",1),preserveDrawingBuffer:b(q,"preserveDrawingBuffer",0),preferLowPowerToHighPerformance:b(q,"preferLowPowerToHighPerformance",0),failIfMajorPerformanceCaveat:b(q,"failIfMajorPerformanceCaveat",
0),enableExtensionsByDefault:b(q,"enableExtensionsByDefault",1),explicitSwapControl:b(q,"explicitSwapControl",0),renderViaOffscreenBackBuffer:b(q,"renderViaOffscreenBackBuffer",0)};v.majorVersion=q&&q.majorVersion?q.majorVersion:"undefined"!==typeof WebGL2RenderingContext?2:1;if(v.explicitSwapControl)throw"explicitSwapControl is not supported";l=na(l,v);if(!l)return 0;oa(l);z.fe.getExtension("WEBGL_debug_renderer_info");return l};a.deleteContext=function(l){z===pa[l]&&(z=null);"object"==typeof JSEvents&&
JSEvents.uf(pa[l].fe.canvas);pa[l]&&pa[l].fe.canvas&&(pa[l].fe.canvas.Pe=void 0);pa[l]=null};a._setTextureCleanup({deleteTexture:function(l,q){var v=ka[q];v&&pa[l].fe.deleteTexture(v);ka[q]=null}});a.MakeWebGLContext=function(l){if(!this.Ud(l))return null;var q=this._MakeGrContext();if(!q)return null;q.Td=l;var v=q.delete.bind(q);q["delete"]=function(){a.Ud(this.Td);v()}.bind(q);return z.De=q};a.MakeGrContext=a.MakeWebGLContext;a.GrDirectContext.prototype.getResourceCacheLimitBytes=function(){a.Ud(this.Td);
this._getResourceCacheLimitBytes()};a.GrDirectContext.prototype.getResourceCacheUsageBytes=function(){a.Ud(this.Td);this._getResourceCacheUsageBytes()};a.GrDirectContext.prototype.releaseResourcesAndAbandonContext=function(){a.Ud(this.Td);this._releaseResourcesAndAbandonContext()};a.GrDirectContext.prototype.setResourceCacheLimitBytes=function(l){a.Ud(this.Td);this._setResourceCacheLimitBytes(l)};a.MakeOnScreenGLSurface=function(l,q,v,w,A,D){if(!this.Ud(l.Td))return null;q=void 0===A||void 0===D?
this._MakeOnScreenGLSurface(l,q,v,w):this._MakeOnScreenGLSurface(l,q,v,w,A,D);if(!q)return null;q.Td=l.Td;return q};a.MakeRenderTarget=function(){var l=arguments[0];if(!this.Ud(l.Td))return null;if(3===arguments.length){var q=this._MakeRenderTargetWH(l,arguments[1],arguments[2]);if(!q)return null}else if(2===arguments.length){if(q=this._MakeRenderTargetII(l,arguments[1]),!q)return null}else return null;q.Td=l.Td;return q};a.MakeWebGLCanvasSurface=function(l,q,v){q=q||null;var w=l,A="undefined"!==
typeof OffscreenCanvas&&w instanceof OffscreenCanvas;if(!("undefined"!==typeof HTMLCanvasElement&&w instanceof HTMLCanvasElement||A||(w=document.getElementById(l),w)))throw"Canvas with id "+l+" was not found";l=this.GetWebGLContext(w,v);if(!l||0>l)throw"failed to create webgl context: err "+l;l=this.MakeWebGLContext(l);q=this.MakeOnScreenGLSurface(l,w.width,w.height,q);return q?q:(q=w.cloneNode(!0),w.parentNode.replaceChild(q,w),q.classList.add("ck-replaced"),a.MakeSWCanvasSurface(q))};a.MakeCanvasSurface=
a.MakeWebGLCanvasSurface;a.Surface.prototype.makeImageFromTexture=function(l,q){a.Ud(this.Td);l=c(l);if(q=this._makeImageFromTexture(this.Td,l,q))q.oe=l;return q};a.Surface.prototype.makeImageFromTextureSource=function(l,q,v){q||={height:e(l),width:f(l),colorType:a.ColorType.RGBA_8888,alphaType:v?a.AlphaType.Premul:a.AlphaType.Unpremul};q.colorSpace||(q.colorSpace=a.ColorSpace.SRGB);a.Ud(this.Td);var w=z.fe;v=k(w,w.createTexture(),q,v);2===z.version?w.texImage2D(w.TEXTURE_2D,0,w.RGBA,q.width,q.height,
0,w.RGBA,w.UNSIGNED_BYTE,l):w.texImage2D(w.TEXTURE_2D,0,w.RGBA,w.RGBA,w.UNSIGNED_BYTE,l);n(w,q);this._resetContext();return this.makeImageFromTexture(v,q)};a.Surface.prototype.updateTextureFromSource=function(l,q,v){if(l.oe){a.Ud(this.Td);var w=l.getImageInfo(),A=z.fe,D=k(A,ka[l.oe],w,v);2===z.version?A.texImage2D(A.TEXTURE_2D,0,A.RGBA,f(q),e(q),0,A.RGBA,A.UNSIGNED_BYTE,q):A.texImage2D(A.TEXTURE_2D,0,A.RGBA,A.RGBA,A.UNSIGNED_BYTE,q);n(A,w,v);this._resetContext();ka[l.oe]=null;l.oe=c(D);w.colorSpace=
l.getColorSpace();q=this._makeImageFromTexture(this.Td,l.oe,w);v=l.Sd.Vd;A=l.Sd.Zd;l.Sd.Vd=q.Sd.Vd;l.Sd.Zd=q.Sd.Zd;q.Sd.Vd=v;q.Sd.Zd=A;q.delete();w.colorSpace.delete()}};a.MakeLazyImageFromTextureSource=function(l,q,v){q||={height:e(l),width:f(l),colorType:a.ColorType.RGBA_8888,alphaType:v?a.AlphaType.Premul:a.AlphaType.Unpremul};q.colorSpace||(q.colorSpace=a.ColorSpace.SRGB);var w={makeTexture:function(){var A=z,D=A.fe,I=k(D,D.createTexture(),q,v);2===A.version?D.texImage2D(D.TEXTURE_2D,0,D.RGBA,
q.width,q.height,0,D.RGBA,D.UNSIGNED_BYTE,l):D.texImage2D(D.TEXTURE_2D,0,D.RGBA,D.RGBA,D.UNSIGNED_BYTE,l);n(D,q,v);return c(I)},freeSrc:function(){}};"VideoFrame"===l.constructor.name&&(w.freeSrc=function(){l.close()});return a.Image._makeFromGenerator(q,w)};a.Ud=function(l){return l?oa(l):!1};a.ve=function(){return z&&z.De&&!z.De.isDeleted()?z.De:null}})})(r);
(function(a){function b(g){return(f(255*g[3])<<24|f(255*g[0])<<16|f(255*g[1])<<8|f(255*g[2])<<0)>>>0}function c(g){if(g&&g._ck)return g;if(g instanceof Float32Array){for(var d=Math.floor(g.length/4),h=new Uint32Array(d),m=0;m<d;m++)h[m]=b(g.slice(4*m,4*(m+1)));return h}if(g instanceof Uint32Array)return g;if(g instanceof Array&&g[0]instanceof Float32Array)return g.map(b)}function e(g){if(void 0===g)return 1;var d=parseFloat(g);return g&&-1!==g.indexOf("%")?d/100:d}function f(g){return Math.round(Math.max(0,
Math.min(g||0,255)))}function k(g,d){d&&d._ck||a._free(g)}function n(g,d,h){if(!g||!g.length)return 0;if(g&&g._ck)return g.byteOffset;var m=a[d].BYTES_PER_ELEMENT;h||=a._malloc(g.length*m);a[d].set(g,h/m);return h}function l(g){var d={be:0,count:g.length,colorType:a.ColorType.RGBA_F32};if(g instanceof Float32Array)d.be=n(g,"HEAPF32"),d.count=g.length/4;else if(g instanceof Uint32Array)d.be=n(g,"HEAPU32"),d.colorType=a.ColorType.RGBA_8888;else if(g instanceof Array){if(g&&g.length){for(var h=a._malloc(16*
g.length),m=0,t=h/4,u=0;u<g.length;u++)for(var x=0;4>x;x++)a.HEAPF32[t+m]=g[u][x],m++;g=h}else g=0;d.be=g}else throw"Invalid argument to copyFlexibleColorArray, Not a color array "+typeof g;return d}function q(g){if(!g)return 0;var d=aa.toTypedArray();if(g.length){if(6===g.length||9===g.length)return n(g,"HEAPF32",O),6===g.length&&a.HEAPF32.set(Vc,6+O/4),O;if(16===g.length)return d[0]=g[0],d[1]=g[1],d[2]=g[3],d[3]=g[4],d[4]=g[5],d[5]=g[7],d[6]=g[12],d[7]=g[13],d[8]=g[15],O;throw"invalid matrix size";
}if(void 0===g.m11)throw"invalid matrix argument";d[0]=g.m11;d[1]=g.m21;d[2]=g.m41;d[3]=g.m12;d[4]=g.m22;d[5]=g.m42;d[6]=g.m14;d[7]=g.m24;d[8]=g.m44;return O}function v(g){if(!g)return 0;var d=X.toTypedArray();if(g.length){if(16!==g.length&&6!==g.length&&9!==g.length)throw"invalid matrix size";if(16===g.length)return n(g,"HEAPF32",la);d.fill(0);d[0]=g[0];d[1]=g[1];d[3]=g[2];d[4]=g[3];d[5]=g[4];d[7]=g[5];d[10]=1;d[12]=g[6];d[13]=g[7];d[15]=g[8];6===g.length&&(d[12]=0,d[13]=0,d[15]=1);return la}if(void 0===
g.m11)throw"invalid matrix argument";d[0]=g.m11;d[1]=g.m21;d[2]=g.m31;d[3]=g.m41;d[4]=g.m12;d[5]=g.m22;d[6]=g.m32;d[7]=g.m42;d[8]=g.m13;d[9]=g.m23;d[10]=g.m33;d[11]=g.m43;d[12]=g.m14;d[13]=g.m24;d[14]=g.m34;d[15]=g.m44;return la}function w(g,d){return n(g,"HEAPF32",d||ha)}function A(g,d,h,m){var t=Ea.toTypedArray();t[0]=g;t[1]=d;t[2]=h;t[3]=m;return ha}function D(g){for(var d=new Float32Array(4),h=0;4>h;h++)d[h]=a.HEAPF32[g/4+h];return d}function I(g,d){return n(g,"HEAPF32",d||V)}function P(g,d){return n(g,
"HEAPF32",d||tb)}a.Color=function(g,d,h,m){void 0===m&&(m=1);return a.Color4f(f(g)/255,f(d)/255,f(h)/255,m)};a.ColorAsInt=function(g,d,h,m){void 0===m&&(m=255);return(f(m)<<24|f(g)<<16|f(d)<<8|f(h)<<0&268435455)>>>0};a.Color4f=function(g,d,h,m){void 0===m&&(m=1);return Float32Array.of(g,d,h,m)};Object.defineProperty(a,"TRANSPARENT",{get:function(){return a.Color4f(0,0,0,0)}});Object.defineProperty(a,"BLACK",{get:function(){return a.Color4f(0,0,0,1)}});Object.defineProperty(a,"WHITE",{get:function(){return a.Color4f(1,
1,1,1)}});Object.defineProperty(a,"RED",{get:function(){return a.Color4f(1,0,0,1)}});Object.defineProperty(a,"GREEN",{get:function(){return a.Color4f(0,1,0,1)}});Object.defineProperty(a,"BLUE",{get:function(){return a.Color4f(0,0,1,1)}});Object.defineProperty(a,"YELLOW",{get:function(){return a.Color4f(1,1,0,1)}});Object.defineProperty(a,"CYAN",{get:function(){return a.Color4f(0,1,1,1)}});Object.defineProperty(a,"MAGENTA",{get:function(){return a.Color4f(1,0,1,1)}});a.getColorComponents=function(g){return[Math.floor(255*
g[0]),Math.floor(255*g[1]),Math.floor(255*g[2]),g[3]]};a.parseColorString=function(g,d){g=g.toLowerCase();if(g.startsWith("#")){d=255;switch(g.length){case 9:d=parseInt(g.slice(7,9),16);case 7:var h=parseInt(g.slice(1,3),16);var m=parseInt(g.slice(3,5),16);var t=parseInt(g.slice(5,7),16);break;case 5:d=17*parseInt(g.slice(4,5),16);case 4:h=17*parseInt(g.slice(1,2),16),m=17*parseInt(g.slice(2,3),16),t=17*parseInt(g.slice(3,4),16)}return a.Color(h,m,t,d/255)}return g.startsWith("rgba")?(g=g.slice(5,
-1),g=g.split(","),a.Color(+g[0],+g[1],+g[2],e(g[3]))):g.startsWith("rgb")?(g=g.slice(4,-1),g=g.split(","),a.Color(+g[0],+g[1],+g[2],e(g[3]))):g.startsWith("gray(")||g.startsWith("hsl")||!d||(g=d[g],void 0===g)?a.BLACK:g};a.multiplyByAlpha=function(g,d){g=g.slice();g[3]=Math.max(0,Math.min(g[3]*d,1));return g};a.Malloc=function(g,d){var h=a._malloc(d*g.BYTES_PER_ELEMENT);return{_ck:!0,length:d,byteOffset:h,ke:null,subarray:function(m,t){m=this.toTypedArray().subarray(m,t);m._ck=!0;return m},toTypedArray:function(){if(this.ke&&
this.ke.length)return this.ke;this.ke=new g(a.HEAPU8.buffer,h,d);this.ke._ck=!0;return this.ke}}};a.Free=function(g){a._free(g.byteOffset);g.byteOffset=0;g.toTypedArray=null;g.ke=null};var O=0,aa,la=0,X,ha=0,Ea,ea,V=0,Ub,Aa=0,Vb,ub=0,Wb,vb=0,$a,Ma=0,Xb,tb=0,Yb,Zb=0,Vc=Float32Array.of(0,0,1);a.onRuntimeInitialized=function(){function g(d,h,m,t,u,x,C){x||(x=4*t.width,t.colorType===a.ColorType.RGBA_F16?x*=2:t.colorType===a.ColorType.RGBA_F32&&(x*=4));var G=x*t.height;var F=u?u.byteOffset:a._malloc(G);
if(C?!d._readPixels(t,F,x,h,m,C):!d._readPixels(t,F,x,h,m))return u||a._free(F),null;if(u)return u.toTypedArray();switch(t.colorType){case a.ColorType.RGBA_8888:case a.ColorType.RGBA_F16:d=(new Uint8Array(a.HEAPU8.buffer,F,G)).slice();break;case a.ColorType.RGBA_F32:d=(new Float32Array(a.HEAPU8.buffer,F,G)).slice();break;default:return null}a._free(F);return d}Ea=a.Malloc(Float32Array,4);ha=Ea.byteOffset;X=a.Malloc(Float32Array,16);la=X.byteOffset;aa=a.Malloc(Float32Array,9);O=aa.byteOffset;Xb=a.Malloc(Float32Array,
12);tb=Xb.byteOffset;Yb=a.Malloc(Float32Array,12);Zb=Yb.byteOffset;ea=a.Malloc(Float32Array,4);V=ea.byteOffset;Ub=a.Malloc(Float32Array,4);Aa=Ub.byteOffset;Vb=a.Malloc(Float32Array,3);ub=Vb.byteOffset;Wb=a.Malloc(Float32Array,3);vb=Wb.byteOffset;$a=a.Malloc(Int32Array,4);Ma=$a.byteOffset;a.ColorSpace.SRGB=a.ColorSpace._MakeSRGB();a.ColorSpace.DISPLAY_P3=a.ColorSpace._MakeDisplayP3();a.ColorSpace.ADOBE_RGB=a.ColorSpace._MakeAdobeRGB();a.GlyphRunFlags={IsWhiteSpace:a._GlyphRunFlags_isWhiteSpace};a.Path.MakeFromCmds=
function(d){var h=n(d,"HEAPF32"),m=a.Path._MakeFromCmds(h,d.length);k(h,d);return m};a.Path.MakeFromVerbsPointsWeights=function(d,h,m){var t=n(d,"HEAPU8"),u=n(h,"HEAPF32"),x=n(m,"HEAPF32"),C=a.Path._MakeFromVerbsPointsWeights(t,d.length,u,h.length,x,m&&m.length||0);k(t,d);k(u,h);k(x,m);return C};a.Path.prototype.addArc=function(d,h,m){d=I(d);this._addArc(d,h,m);return this};a.Path.prototype.addCircle=function(d,h,m,t){this._addCircle(d,h,m,!!t);return this};a.Path.prototype.addOval=function(d,h,m){void 0===
m&&(m=1);d=I(d);this._addOval(d,!!h,m);return this};a.Path.prototype.addPath=function(){var d=Array.prototype.slice.call(arguments),h=d[0],m=!1;"boolean"===typeof d[d.length-1]&&(m=d.pop());if(1===d.length)this._addPath(h,1,0,0,0,1,0,0,0,1,m);else if(2===d.length)d=d[1],this._addPath(h,d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1,m);else if(7===d.length||10===d.length)this._addPath(h,d[1],d[2],d[3],d[4],d[5],d[6],d[7]||0,d[8]||0,d[9]||1,m);else return null;return this};a.Path.prototype.addPoly=
function(d,h){var m=n(d,"HEAPF32");this._addPoly(m,d.length/2,h);k(m,d);return this};a.Path.prototype.addRect=function(d,h){d=I(d);this._addRect(d,!!h);return this};a.Path.prototype.addRRect=function(d,h){d=P(d);this._addRRect(d,!!h);return this};a.Path.prototype.addVerbsPointsWeights=function(d,h,m){var t=n(d,"HEAPU8"),u=n(h,"HEAPF32"),x=n(m,"HEAPF32");this._addVerbsPointsWeights(t,d.length,u,h.length,x,m&&m.length||0);k(t,d);k(u,h);k(x,m)};a.Path.prototype.arc=function(d,h,m,t,u,x){d=a.LTRBRect(d-
m,h-m,d+m,h+m);u=(u-t)/Math.PI*180-360*!!x;x=new a.Path;x.addArc(d,t/Math.PI*180,u);this.addPath(x,!0);x.delete();return this};a.Path.prototype.arcToOval=function(d,h,m,t){d=I(d);this._arcToOval(d,h,m,t);return this};a.Path.prototype.arcToRotated=function(d,h,m,t,u,x,C){this._arcToRotated(d,h,m,!!t,!!u,x,C);return this};a.Path.prototype.arcToTangent=function(d,h,m,t,u){this._arcToTangent(d,h,m,t,u);return this};a.Path.prototype.close=function(){this._close();return this};a.Path.prototype.conicTo=
function(d,h,m,t,u){this._conicTo(d,h,m,t,u);return this};a.Path.prototype.computeTightBounds=function(d){this._computeTightBounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.Path.prototype.cubicTo=function(d,h,m,t,u,x){this._cubicTo(d,h,m,t,u,x);return this};a.Path.prototype.dash=function(d,h,m){return this._dash(d,h,m)?this:null};a.Path.prototype.getBounds=function(d){this._getBounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.Path.prototype.lineTo=function(d,
h){this._lineTo(d,h);return this};a.Path.prototype.moveTo=function(d,h){this._moveTo(d,h);return this};a.Path.prototype.offset=function(d,h){this._transform(1,0,d,0,1,h,0,0,1);return this};a.Path.prototype.quadTo=function(d,h,m,t){this._quadTo(d,h,m,t);return this};a.Path.prototype.rArcTo=function(d,h,m,t,u,x,C){this._rArcTo(d,h,m,t,u,x,C);return this};a.Path.prototype.rConicTo=function(d,h,m,t,u){this._rConicTo(d,h,m,t,u);return this};a.Path.prototype.rCubicTo=function(d,h,m,t,u,x){this._rCubicTo(d,
h,m,t,u,x);return this};a.Path.prototype.rLineTo=function(d,h){this._rLineTo(d,h);return this};a.Path.prototype.rMoveTo=function(d,h){this._rMoveTo(d,h);return this};a.Path.prototype.rQuadTo=function(d,h,m,t){this._rQuadTo(d,h,m,t);return this};a.Path.prototype.stroke=function(d){d=d||{};d.width=d.width||1;d.miter_limit=d.miter_limit||4;d.cap=d.cap||a.StrokeCap.Butt;d.join=d.join||a.StrokeJoin.Miter;d.precision=d.precision||1;return this._stroke(d)?this:null};a.Path.prototype.transform=function(){if(1===
arguments.length){var d=arguments[0];this._transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1)}else if(6===arguments.length||9===arguments.length)d=arguments,this._transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1);else throw"transform expected to take 1 or 9 arguments. Got "+arguments.length;return this};a.Path.prototype.trim=function(d,h,m){return this._trim(d,h,!!m)?this:null};a.Image.prototype.encodeToBytes=function(d,h){var m=a.ve();d=d||a.ImageFormat.PNG;h=h||100;
return m?this._encodeToBytes(d,h,m):this._encodeToBytes(d,h)};a.Image.prototype.makeShaderCubic=function(d,h,m,t,u){u=q(u);return this._makeShaderCubic(d,h,m,t,u)};a.Image.prototype.makeShaderOptions=function(d,h,m,t,u){u=q(u);return this._makeShaderOptions(d,h,m,t,u)};a.Image.prototype.readPixels=function(d,h,m,t,u){var x=a.ve();return g(this,d,h,m,t,u,x)};a.Canvas.prototype.clear=function(d){a.Ud(this.Td);d=w(d);this._clear(d)};a.Canvas.prototype.clipRRect=function(d,h,m){a.Ud(this.Td);d=P(d);this._clipRRect(d,
h,m)};a.Canvas.prototype.clipRect=function(d,h,m){a.Ud(this.Td);d=I(d);this._clipRect(d,h,m)};a.Canvas.prototype.concat=function(d){a.Ud(this.Td);d=v(d);this._concat(d)};a.Canvas.prototype.drawArc=function(d,h,m,t,u){a.Ud(this.Td);d=I(d);this._drawArc(d,h,m,t,u)};a.Canvas.prototype.drawAtlas=function(d,h,m,t,u,x,C){if(d&&t&&h&&m&&h.length===m.length){a.Ud(this.Td);u||(u=a.BlendMode.SrcOver);var G=n(h,"HEAPF32"),F=n(m,"HEAPF32"),S=m.length/4,T=n(c(x),"HEAPU32");if(C&&"B"in C&&"C"in C)this._drawAtlasCubic(d,
F,G,T,S,u,C.B,C.C,t);else{let p=a.FilterMode.Linear,y=a.MipmapMode.None;C&&(p=C.filter,"mipmap"in C&&(y=C.mipmap));this._drawAtlasOptions(d,F,G,T,S,u,p,y,t)}k(G,h);k(F,m);k(T,x)}};a.Canvas.prototype.drawCircle=function(d,h,m,t){a.Ud(this.Td);this._drawCircle(d,h,m,t)};a.Canvas.prototype.drawColor=function(d,h){a.Ud(this.Td);d=w(d);void 0!==h?this._drawColor(d,h):this._drawColor(d)};a.Canvas.prototype.drawColorInt=function(d,h){a.Ud(this.Td);this._drawColorInt(d,h||a.BlendMode.SrcOver)};a.Canvas.prototype.drawColorComponents=
function(d,h,m,t,u){a.Ud(this.Td);d=A(d,h,m,t);void 0!==u?this._drawColor(d,u):this._drawColor(d)};a.Canvas.prototype.drawDRRect=function(d,h,m){a.Ud(this.Td);d=P(d,tb);h=P(h,Zb);this._drawDRRect(d,h,m)};a.Canvas.prototype.drawImage=function(d,h,m,t){a.Ud(this.Td);this._drawImage(d,h,m,t||null)};a.Canvas.prototype.drawImageCubic=function(d,h,m,t,u,x){a.Ud(this.Td);this._drawImageCubic(d,h,m,t,u,x||null)};a.Canvas.prototype.drawImageOptions=function(d,h,m,t,u,x){a.Ud(this.Td);this._drawImageOptions(d,
h,m,t,u,x||null)};a.Canvas.prototype.drawImageNine=function(d,h,m,t,u){a.Ud(this.Td);h=n(h,"HEAP32",Ma);m=I(m);this._drawImageNine(d,h,m,t,u||null)};a.Canvas.prototype.drawImageRect=function(d,h,m,t,u){a.Ud(this.Td);I(h,V);I(m,Aa);this._drawImageRect(d,V,Aa,t,!!u)};a.Canvas.prototype.drawImageRectCubic=function(d,h,m,t,u,x){a.Ud(this.Td);I(h,V);I(m,Aa);this._drawImageRectCubic(d,V,Aa,t,u,x||null)};a.Canvas.prototype.drawImageRectOptions=function(d,h,m,t,u,x){a.Ud(this.Td);I(h,V);I(m,Aa);this._drawImageRectOptions(d,
V,Aa,t,u,x||null)};a.Canvas.prototype.drawLine=function(d,h,m,t,u){a.Ud(this.Td);this._drawLine(d,h,m,t,u)};a.Canvas.prototype.drawOval=function(d,h){a.Ud(this.Td);d=I(d);this._drawOval(d,h)};a.Canvas.prototype.drawPaint=function(d){a.Ud(this.Td);this._drawPaint(d)};a.Canvas.prototype.drawParagraph=function(d,h,m){a.Ud(this.Td);this._drawParagraph(d,h,m)};a.Canvas.prototype.drawPatch=function(d,h,m,t,u){if(24>d.length)throw"Need 12 cubic points";if(h&&4>h.length)throw"Need 4 colors";if(m&&8>m.length)throw"Need 4 shader coordinates";
a.Ud(this.Td);const x=n(d,"HEAPF32"),C=h?n(c(h),"HEAPU32"):0,G=m?n(m,"HEAPF32"):0;t||(t=a.BlendMode.Modulate);this._drawPatch(x,C,G,t,u);k(G,m);k(C,h);k(x,d)};a.Canvas.prototype.drawPath=function(d,h){a.Ud(this.Td);this._drawPath(d,h)};a.Canvas.prototype.drawPicture=function(d){a.Ud(this.Td);this._drawPicture(d)};a.Canvas.prototype.drawPoints=function(d,h,m){a.Ud(this.Td);var t=n(h,"HEAPF32");this._drawPoints(d,t,h.length/2,m);k(t,h)};a.Canvas.prototype.drawRRect=function(d,h){a.Ud(this.Td);d=P(d);
this._drawRRect(d,h)};a.Canvas.prototype.drawRect=function(d,h){a.Ud(this.Td);d=I(d);this._drawRect(d,h)};a.Canvas.prototype.drawRect4f=function(d,h,m,t,u){a.Ud(this.Td);this._drawRect4f(d,h,m,t,u)};a.Canvas.prototype.drawShadow=function(d,h,m,t,u,x,C){a.Ud(this.Td);var G=n(u,"HEAPF32"),F=n(x,"HEAPF32");h=n(h,"HEAPF32",ub);m=n(m,"HEAPF32",vb);this._drawShadow(d,h,m,t,G,F,C);k(G,u);k(F,x)};a.getShadowLocalBounds=function(d,h,m,t,u,x,C){d=q(d);m=n(m,"HEAPF32",ub);t=n(t,"HEAPF32",vb);if(!this._getShadowLocalBounds(d,
h,m,t,u,x,V))return null;h=ea.toTypedArray();return C?(C.set(h),C):h.slice()};a.Canvas.prototype.drawTextBlob=function(d,h,m,t){a.Ud(this.Td);this._drawTextBlob(d,h,m,t)};a.Canvas.prototype.drawVertices=function(d,h,m){a.Ud(this.Td);this._drawVertices(d,h,m)};a.Canvas.prototype.getDeviceClipBounds=function(d){this._getDeviceClipBounds(Ma);var h=$a.toTypedArray();d?d.set(h):d=h.slice();return d};a.Canvas.prototype.quickReject=function(d){d=I(d);return this._quickReject(d)};a.Canvas.prototype.getLocalToDevice=
function(){this._getLocalToDevice(la);for(var d=la,h=Array(16),m=0;16>m;m++)h[m]=a.HEAPF32[d/4+m];return h};a.Canvas.prototype.getTotalMatrix=function(){this._getTotalMatrix(O);for(var d=Array(9),h=0;9>h;h++)d[h]=a.HEAPF32[O/4+h];return d};a.Canvas.prototype.makeSurface=function(d){d=this._makeSurface(d);d.Td=this.Td;return d};a.Canvas.prototype.readPixels=function(d,h,m,t,u){a.Ud(this.Td);return g(this,d,h,m,t,u)};a.Canvas.prototype.saveLayer=function(d,h,m,t,u){h=I(h);return this._saveLayer(d||
null,h,m||null,t||0,u||a.TileMode.Clamp)};a.Canvas.prototype.writePixels=function(d,h,m,t,u,x,C,G){if(d.byteLength%(h*m))throw"pixels length must be a multiple of the srcWidth * srcHeight";a.Ud(this.Td);var F=d.byteLength/(h*m);x=x||a.AlphaType.Unpremul;C=C||a.ColorType.RGBA_8888;G=G||a.ColorSpace.SRGB;var S=F*h;F=n(d,"HEAPU8");h=this._writePixels({width:h,height:m,colorType:C,alphaType:x,colorSpace:G},F,S,t,u);k(F,d);return h};a.ColorFilter.MakeBlend=function(d,h,m){d=w(d);m=m||a.ColorSpace.SRGB;
return a.ColorFilter._MakeBlend(d,h,m)};a.ColorFilter.MakeMatrix=function(d){if(!d||20!==d.length)throw"invalid color matrix";var h=n(d,"HEAPF32"),m=a.ColorFilter._makeMatrix(h);k(h,d);return m};a.ContourMeasure.prototype.getPosTan=function(d,h){this._getPosTan(d,V);d=ea.toTypedArray();return h?(h.set(d),h):d.slice()};a.ImageFilter.prototype.getOutputBounds=function(d,h,m){d=I(d,V);h=q(h);this._getOutputBounds(d,h,Ma);h=$a.toTypedArray();return m?(m.set(h),m):h.slice()};a.ImageFilter.MakeDropShadow=
function(d,h,m,t,u,x){u=w(u,ha);return a.ImageFilter._MakeDropShadow(d,h,m,t,u,x)};a.ImageFilter.MakeDropShadowOnly=function(d,h,m,t,u,x){u=w(u,ha);return a.ImageFilter._MakeDropShadowOnly(d,h,m,t,u,x)};a.ImageFilter.MakeImage=function(d,h,m,t){m=I(m,V);t=I(t,Aa);if("B"in h&&"C"in h)return a.ImageFilter._MakeImageCubic(d,h.B,h.C,m,t);const u=h.filter;let x=a.MipmapMode.None;"mipmap"in h&&(x=h.mipmap);return a.ImageFilter._MakeImageOptions(d,u,x,m,t)};a.ImageFilter.MakeMatrixTransform=function(d,h,
m){d=q(d);if("B"in h&&"C"in h)return a.ImageFilter._MakeMatrixTransformCubic(d,h.B,h.C,m);const t=h.filter;let u=a.MipmapMode.None;"mipmap"in h&&(u=h.mipmap);return a.ImageFilter._MakeMatrixTransformOptions(d,t,u,m)};a.Paint.prototype.getColor=function(){this._getColor(ha);return D(ha)};a.Paint.prototype.setColor=function(d,h){h=h||null;d=w(d);this._setColor(d,h)};a.Paint.prototype.setColorComponents=function(d,h,m,t,u){u=u||null;d=A(d,h,m,t);this._setColor(d,u)};a.Path.prototype.getPoint=function(d,
h){this._getPoint(d,V);d=ea.toTypedArray();return h?(h[0]=d[0],h[1]=d[1],h):d.slice(0,2)};a.Picture.prototype.makeShader=function(d,h,m,t,u){t=q(t);u=I(u);return this._makeShader(d,h,m,t,u)};a.Picture.prototype.cullRect=function(d){this._cullRect(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.PictureRecorder.prototype.beginRecording=function(d,h){d=I(d);return this._beginRecording(d,!!h)};a.Surface.prototype.getCanvas=function(){var d=this._getCanvas();d.Td=this.Td;return d};a.Surface.prototype.makeImageSnapshot=
function(d){a.Ud(this.Td);d=n(d,"HEAP32",Ma);return this._makeImageSnapshot(d)};a.Surface.prototype.makeSurface=function(d){a.Ud(this.Td);d=this._makeSurface(d);d.Td=this.Td;return d};a.Surface.prototype.Te=function(d,h){this.ne||(this.ne=this.getCanvas());return requestAnimationFrame(function(){a.Ud(this.Td);d(this.ne);this.flush(h)}.bind(this))};a.Surface.prototype.requestAnimationFrame||(a.Surface.prototype.requestAnimationFrame=a.Surface.prototype.Te);a.Surface.prototype.Qe=function(d,h){this.ne||
(this.ne=this.getCanvas());requestAnimationFrame(function(){a.Ud(this.Td);d(this.ne);this.flush(h);this.dispose()}.bind(this))};a.Surface.prototype.drawOnce||(a.Surface.prototype.drawOnce=a.Surface.prototype.Qe);a.PathEffect.MakeDash=function(d,h){h||=0;if(!d.length||1===d.length%2)throw"Intervals array must have even length";var m=n(d,"HEAPF32");h=a.PathEffect._MakeDash(m,d.length,h);k(m,d);return h};a.PathEffect.MakeLine2D=function(d,h){h=q(h);return a.PathEffect._MakeLine2D(d,h)};a.PathEffect.MakePath2D=
function(d,h){d=q(d);return a.PathEffect._MakePath2D(d,h)};a.Shader.MakeColor=function(d,h){h=h||null;d=w(d);return a.Shader._MakeColor(d,h)};a.Shader.Blend=a.Shader.MakeBlend;a.Shader.Color=a.Shader.MakeColor;a.Shader.MakeLinearGradient=function(d,h,m,t,u,x,C,G){G=G||null;var F=l(m),S=n(t,"HEAPF32");C=C||0;x=q(x);var T=ea.toTypedArray();T.set(d);T.set(h,2);d=a.Shader._MakeLinearGradient(V,F.be,F.colorType,S,F.count,u,C,x,G);k(F.be,m);t&&k(S,t);return d};a.Shader.MakeRadialGradient=function(d,h,m,
t,u,x,C,G){G=G||null;var F=l(m),S=n(t,"HEAPF32");C=C||0;x=q(x);d=a.Shader._MakeRadialGradient(d[0],d[1],h,F.be,F.colorType,S,F.count,u,C,x,G);k(F.be,m);t&&k(S,t);return d};a.Shader.MakeSweepGradient=function(d,h,m,t,u,x,C,G,F,S){S=S||null;var T=l(m),p=n(t,"HEAPF32");C=C||0;G=G||0;F=F||360;x=q(x);d=a.Shader._MakeSweepGradient(d,h,T.be,T.colorType,p,T.count,u,G,F,C,x,S);k(T.be,m);t&&k(p,t);return d};a.Shader.MakeTwoPointConicalGradient=function(d,h,m,t,u,x,C,G,F,S){S=S||null;var T=l(u),p=n(x,"HEAPF32");
F=F||0;G=q(G);var y=ea.toTypedArray();y.set(d);y.set(m,2);d=a.Shader._MakeTwoPointConicalGradient(V,h,t,T.be,T.colorType,p,T.count,C,F,G,S);k(T.be,u);x&&k(p,x);return d};a.Vertices.prototype.bounds=function(d){this._bounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.Xd&&a.Xd.forEach(function(d){d()})};a.computeTonalColors=function(g){var d=n(g.ambient,"HEAPF32"),h=n(g.spot,"HEAPF32");this._computeTonalColors(d,h);var m={ambient:D(d),spot:D(h)};k(d,g.ambient);k(h,g.spot);return m};
a.LTRBRect=function(g,d,h,m){return Float32Array.of(g,d,h,m)};a.XYWHRect=function(g,d,h,m){return Float32Array.of(g,d,g+h,d+m)};a.LTRBiRect=function(g,d,h,m){return Int32Array.of(g,d,h,m)};a.XYWHiRect=function(g,d,h,m){return Int32Array.of(g,d,g+h,d+m)};a.RRectXY=function(g,d,h){return Float32Array.of(g[0],g[1],g[2],g[3],d,h,d,h,d,h,d,h)};a.MakeAnimatedImageFromEncoded=function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._decodeAnimatedImage(d,g.byteLength))?
g:null};a.MakeImageFromEncoded=function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._decodeImage(d,g.byteLength))?g:null};var ab=null;a.MakeImageFromCanvasImageSource=function(g){var d=g.width,h=g.height;ab||=document.createElement("canvas");ab.width=d;ab.height=h;var m=ab.getContext("2d",{willReadFrequently:!0});m.drawImage(g,0,0);g=m.getImageData(0,0,d,h);return a.MakeImage({width:d,height:h,alphaType:a.AlphaType.Unpremul,colorType:a.ColorType.RGBA_8888,colorSpace:a.ColorSpace.SRGB},
g.data,4*d)};a.MakeImage=function(g,d,h){var m=a._malloc(d.length);a.HEAPU8.set(d,m);return a._MakeImage(g,m,d.length,h)};a.MakeVertices=function(g,d,h,m,t,u){var x=t&&t.length||0,C=0;h&&h.length&&(C|=1);m&&m.length&&(C|=2);void 0===u||u||(C|=4);g=new a._VerticesBuilder(g,d.length/2,x,C);n(d,"HEAPF32",g.positions());g.texCoords()&&n(h,"HEAPF32",g.texCoords());g.colors()&&n(c(m),"HEAPU32",g.colors());g.indices()&&n(t,"HEAPU16",g.indices());return g.detach()};(function(g){g.Xd=g.Xd||[];g.Xd.push(function(){function d(p){p&&
(p.dir=0===p.dir?g.TextDirection.RTL:g.TextDirection.LTR);return p}function h(p){if(!p||!p.length)return[];for(var y=[],M=0;M<p.length;M+=5){var W=g.LTRBRect(p[M],p[M+1],p[M+2],p[M+3]),wa=g.TextDirection.LTR;0===p[M+4]&&(wa=g.TextDirection.RTL);y.push({rect:W,dir:wa})}g._free(p.byteOffset);return y}function m(p){p=p||{};void 0===p.weight&&(p.weight=g.FontWeight.Normal);p.width=p.width||g.FontWidth.Normal;p.slant=p.slant||g.FontSlant.Upright;return p}function t(p){if(!p||!p.length)return 0;for(var y=
[],M=0;M<p.length;M++){var W=u(p[M]);y.push(W)}return n(y,"HEAPU32")}function u(p){if(G[p])return G[p];var y=qa(p)+1,M=g._malloc(y);ra(p,M,y);return G[p]=M}function x(p){p._colorPtr=w(p.color);p._foregroundColorPtr=0;p._backgroundColorPtr=0;p._decorationColorPtr=0;p.foregroundColor&&(p._foregroundColorPtr=w(p.foregroundColor,F));p.backgroundColor&&(p._backgroundColorPtr=w(p.backgroundColor,S));p.decorationColor&&(p._decorationColorPtr=w(p.decorationColor,T));Array.isArray(p.fontFamilies)&&p.fontFamilies.length?
(p._fontFamiliesPtr=t(p.fontFamilies),p._fontFamiliesLen=p.fontFamilies.length):(p._fontFamiliesPtr=0,p._fontFamiliesLen=0);if(p.locale){var y=p.locale;p._localePtr=u(y);p._localeLen=qa(y)}else p._localePtr=0,p._localeLen=0;if(Array.isArray(p.shadows)&&p.shadows.length){y=p.shadows;var M=y.map(function(ma){return ma.color||g.BLACK}),W=y.map(function(ma){return ma.blurRadius||0});p._shadowLen=y.length;for(var wa=g._malloc(8*y.length),wb=wa/4,xb=0;xb<y.length;xb++){var $b=y[xb].offset||[0,0];g.HEAPF32[wb]=
$b[0];g.HEAPF32[wb+1]=$b[1];wb+=2}p._shadowColorsPtr=l(M).be;p._shadowOffsetsPtr=wa;p._shadowBlurRadiiPtr=n(W,"HEAPF32")}else p._shadowLen=0,p._shadowColorsPtr=0,p._shadowOffsetsPtr=0,p._shadowBlurRadiiPtr=0;Array.isArray(p.fontFeatures)&&p.fontFeatures.length?(y=p.fontFeatures,M=y.map(function(ma){return ma.name}),W=y.map(function(ma){return ma.value}),p._fontFeatureLen=y.length,p._fontFeatureNamesPtr=t(M),p._fontFeatureValuesPtr=n(W,"HEAPU32")):(p._fontFeatureLen=0,p._fontFeatureNamesPtr=0,p._fontFeatureValuesPtr=
0);Array.isArray(p.fontVariations)&&p.fontVariations.length?(y=p.fontVariations,M=y.map(function(ma){return ma.axis}),W=y.map(function(ma){return ma.value}),p._fontVariationLen=y.length,p._fontVariationAxesPtr=t(M),p._fontVariationValuesPtr=n(W,"HEAPF32")):(p._fontVariationLen=0,p._fontVariationAxesPtr=0,p._fontVariationValuesPtr=0)}function C(p){g._free(p._fontFamiliesPtr);g._free(p._shadowColorsPtr);g._free(p._shadowOffsetsPtr);g._free(p._shadowBlurRadiiPtr);g._free(p._fontFeatureNamesPtr);g._free(p._fontFeatureValuesPtr);
g._free(p._fontVariationAxesPtr);g._free(p._fontVariationValuesPtr)}g.Paragraph.prototype.getRectsForRange=function(p,y,M,W){p=this._getRectsForRange(p,y,M,W);return h(p)};g.Paragraph.prototype.getRectsForPlaceholders=function(){var p=this._getRectsForPlaceholders();return h(p)};g.Paragraph.prototype.getGlyphInfoAt=function(p){return d(this._getGlyphInfoAt(p))};g.Paragraph.prototype.getClosestGlyphInfoAtCoordinate=function(p,y){return d(this._getClosestGlyphInfoAtCoordinate(p,y))};g.TypefaceFontProvider.prototype.registerFont=
function(p,y){p=g.Typeface.MakeTypefaceFromData(p);if(!p)return null;y=u(y);this._registerFont(p,y);p.delete()};g.ParagraphStyle=function(p){p.disableHinting=p.disableHinting||!1;if(p.ellipsis){var y=p.ellipsis;p._ellipsisPtr=u(y);p._ellipsisLen=qa(y)}else p._ellipsisPtr=0,p._ellipsisLen=0;null==p.heightMultiplier&&(p.heightMultiplier=-1);p.maxLines=p.maxLines||0;p.replaceTabCharacters=p.replaceTabCharacters||!1;y=(y=p.strutStyle)||{};y.strutEnabled=y.strutEnabled||!1;y.strutEnabled&&Array.isArray(y.fontFamilies)&&
y.fontFamilies.length?(y._fontFamiliesPtr=t(y.fontFamilies),y._fontFamiliesLen=y.fontFamilies.length):(y._fontFamiliesPtr=0,y._fontFamiliesLen=0);y.fontStyle=m(y.fontStyle);null==y.fontSize&&(y.fontSize=-1);null==y.heightMultiplier&&(y.heightMultiplier=-1);y.halfLeading=y.halfLeading||!1;y.leading=y.leading||0;y.forceStrutHeight=y.forceStrutHeight||!1;p.strutStyle=y;p.textAlign=p.textAlign||g.TextAlign.Start;p.textDirection=p.textDirection||g.TextDirection.LTR;p.textHeightBehavior=p.textHeightBehavior||
g.TextHeightBehavior.All;p.textStyle=g.TextStyle(p.textStyle);p.applyRoundingHack=!1!==p.applyRoundingHack;return p};g.TextStyle=function(p){p.color||(p.color=g.BLACK);p.decoration=p.decoration||0;p.decorationThickness=p.decorationThickness||0;p.decorationStyle=p.decorationStyle||g.DecorationStyle.Solid;p.textBaseline=p.textBaseline||g.TextBaseline.Alphabetic;null==p.fontSize&&(p.fontSize=-1);p.letterSpacing=p.letterSpacing||0;p.wordSpacing=p.wordSpacing||0;null==p.heightMultiplier&&(p.heightMultiplier=
-1);p.halfLeading=p.halfLeading||!1;p.fontStyle=m(p.fontStyle);return p};var G={},F=g._malloc(16),S=g._malloc(16),T=g._malloc(16);g.ParagraphBuilder.Make=function(p,y){x(p.textStyle);y=g.ParagraphBuilder._Make(p,y);C(p.textStyle);return y};g.ParagraphBuilder.MakeFromFontProvider=function(p,y){x(p.textStyle);y=g.ParagraphBuilder._MakeFromFontProvider(p,y);C(p.textStyle);return y};g.ParagraphBuilder.MakeFromFontCollection=function(p,y){x(p.textStyle);y=g.ParagraphBuilder._MakeFromFontCollection(p,y);
C(p.textStyle);return y};g.ParagraphBuilder.ShapeText=function(p,y,M){let W=0;for(const wa of y)W+=wa.length;if(W!==p.length)throw"Accumulated block lengths must equal text.length";return g.ParagraphBuilder._ShapeText(p,y,M)};g.ParagraphBuilder.prototype.pushStyle=function(p){x(p);this._pushStyle(p);C(p)};g.ParagraphBuilder.prototype.pushPaintStyle=function(p,y,M){x(p);this._pushPaintStyle(p,y,M);C(p)};g.ParagraphBuilder.prototype.addPlaceholder=function(p,y,M,W,wa){M=M||g.PlaceholderAlignment.Baseline;
W=W||g.TextBaseline.Alphabetic;this._addPlaceholder(p||0,y||0,M,W,wa||0)};g.ParagraphBuilder.prototype.setWordsUtf8=function(p){var y=n(p,"HEAPU32");this._setWordsUtf8(y,p&&p.length||0);k(y,p)};g.ParagraphBuilder.prototype.setWordsUtf16=function(p){var y=n(p,"HEAPU32");this._setWordsUtf16(y,p&&p.length||0);k(y,p)};g.ParagraphBuilder.prototype.setGraphemeBreaksUtf8=function(p){var y=n(p,"HEAPU32");this._setGraphemeBreaksUtf8(y,p&&p.length||0);k(y,p)};g.ParagraphBuilder.prototype.setGraphemeBreaksUtf16=
function(p){var y=n(p,"HEAPU32");this._setGraphemeBreaksUtf16(y,p&&p.length||0);k(y,p)};g.ParagraphBuilder.prototype.setLineBreaksUtf8=function(p){var y=n(p,"HEAPU32");this._setLineBreaksUtf8(y,p&&p.length||0);k(y,p)};g.ParagraphBuilder.prototype.setLineBreaksUtf16=function(p){var y=n(p,"HEAPU32");this._setLineBreaksUtf16(y,p&&p.length||0);k(y,p)}})})(r);a.Xd=a.Xd||[];a.Xd.push(function(){a.Path.prototype.op=function(g,d){return this._op(g,d)?this:null};a.Path.prototype.simplify=function(){return this._simplify()?
this:null}});a.Xd=a.Xd||[];a.Xd.push(function(){a.Canvas.prototype.drawText=function(g,d,h,m,t){var u=qa(g),x=a._malloc(u+1);ra(g,x,u+1);this._drawSimpleText(x,u,d,h,t,m);a._free(x)};a.Canvas.prototype.drawGlyphs=function(g,d,h,m,t,u){if(!(2*g.length<=d.length))throw"Not enough positions for the array of gyphs";a.Ud(this.Td);const x=n(g,"HEAPU16"),C=n(d,"HEAPF32");this._drawGlyphs(g.length,x,C,h,m,t,u);k(C,d);k(x,g)};a.Font.prototype.getGlyphBounds=function(g,d,h){var m=n(g,"HEAPU16"),t=a._malloc(16*
g.length);this._getGlyphWidthBounds(m,g.length,0,t,d||null);d=new Float32Array(a.HEAPU8.buffer,t,4*g.length);k(m,g);if(h)return h.set(d),a._free(t),h;g=Float32Array.from(d);a._free(t);return g};a.Font.prototype.getGlyphIDs=function(g,d,h){d||(d=g.length);var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=a._malloc(2*d);d=this._getGlyphIDs(t,m-1,d,g);a._free(t);if(0>d)return a._free(g),null;t=new Uint16Array(a.HEAPU8.buffer,g,d);if(h)return h.set(t),a._free(g),h;h=Uint16Array.from(t);a._free(g);return h};a.Font.prototype.getGlyphIntercepts=
function(g,d,h,m){var t=n(g,"HEAPU16"),u=n(d,"HEAPF32");return this._getGlyphIntercepts(t,g.length,!(g&&g._ck),u,d.length,!(d&&d._ck),h,m)};a.Font.prototype.getGlyphWidths=function(g,d,h){var m=n(g,"HEAPU16"),t=a._malloc(4*g.length);this._getGlyphWidthBounds(m,g.length,t,0,d||null);d=new Float32Array(a.HEAPU8.buffer,t,g.length);k(m,g);if(h)return h.set(d),a._free(t),h;g=Float32Array.from(d);a._free(t);return g};a.FontMgr.FromData=function(){if(!arguments.length)return null;var g=arguments;1===g.length&&
Array.isArray(g[0])&&(g=arguments[0]);if(!g.length)return null;for(var d=[],h=[],m=0;m<g.length;m++){var t=new Uint8Array(g[m]),u=n(t,"HEAPU8");d.push(u);h.push(t.byteLength)}d=n(d,"HEAPU32");h=n(h,"HEAPU32");g=a.FontMgr._fromData(d,h,g.length);a._free(d);a._free(h);return g};a.Typeface.MakeTypefaceFromData=function(g){g=new Uint8Array(g);var d=n(g,"HEAPU8");return(g=a.Typeface._MakeTypefaceFromData(d,g.byteLength))?g:null};a.Typeface.MakeFreeTypeFaceFromData=a.Typeface.MakeTypefaceFromData;a.Typeface.prototype.getGlyphIDs=
function(g,d,h){d||(d=g.length);var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=a._malloc(2*d);d=this._getGlyphIDs(t,m-1,d,g);a._free(t);if(0>d)return a._free(g),null;t=new Uint16Array(a.HEAPU8.buffer,g,d);if(h)return h.set(t),a._free(g),h;h=Uint16Array.from(t);a._free(g);return h};a.TextBlob.MakeOnPath=function(g,d,h,m){if(g&&g.length&&d&&d.countPoints()){if(1===d.countPoints())return this.MakeFromText(g,h);m||=0;var t=h.getGlyphIDs(g);t=h.getGlyphWidths(t);var u=[];d=new a.ContourMeasureIter(d,!1,1);for(var x=
d.next(),C=new Float32Array(4),G=0;G<g.length&&x;G++){var F=t[G];m+=F/2;if(m>x.length()){x.delete();x=d.next();if(!x){g=g.substring(0,G);break}m=F/2}x.getPosTan(m,C);var S=C[2],T=C[3];u.push(S,T,C[0]-F/2*S,C[1]-F/2*T);m+=F/2}g=this.MakeFromRSXform(g,u,h);x&&x.delete();d.delete();return g}};a.TextBlob.MakeFromRSXform=function(g,d,h){var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=n(d,"HEAPF32");h=a.TextBlob._MakeFromRSXform(t,m-1,g,h);a._free(t);return h?h:null};a.TextBlob.MakeFromRSXformGlyphs=function(g,
d,h){var m=n(g,"HEAPU16");d=n(d,"HEAPF32");h=a.TextBlob._MakeFromRSXformGlyphs(m,2*g.length,d,h);k(m,g);return h?h:null};a.TextBlob.MakeFromGlyphs=function(g,d){var h=n(g,"HEAPU16");d=a.TextBlob._MakeFromGlyphs(h,2*g.length,d);k(h,g);return d?d:null};a.TextBlob.MakeFromText=function(g,d){var h=qa(g)+1,m=a._malloc(h);ra(g,m,h);g=a.TextBlob._MakeFromText(m,h-1,d);a._free(m);return g?g:null};a.MallocGlyphIDs=function(g){return a.Malloc(Uint16Array,g)}});a.Xd=a.Xd||[];a.Xd.push(function(){a.MakePicture=
function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._MakePicture(d,g.byteLength))?g:null}});a.Xd=a.Xd||[];a.Xd.push(function(){a.RuntimeEffect.Make=function(g,d){return a.RuntimeEffect._Make(g,{onError:d||function(h){console.log("RuntimeEffect error",h)}})};a.RuntimeEffect.MakeForBlender=function(g,d){return a.RuntimeEffect._MakeForBlender(g,{onError:d||function(h){console.log("RuntimeEffect error",h)}})};a.RuntimeEffect.prototype.makeShader=function(g,d){var h=
!g._ck,m=n(g,"HEAPF32");d=q(d);return this._makeShader(m,4*g.length,h,d)};a.RuntimeEffect.prototype.makeShaderWithChildren=function(g,d,h){var m=!g._ck,t=n(g,"HEAPF32");h=q(h);for(var u=[],x=0;x<d.length;x++)u.push(d[x].Sd.Vd);d=n(u,"HEAPU32");return this._makeShaderWithChildren(t,4*g.length,m,d,u.length,h)};a.RuntimeEffect.prototype.makeBlender=function(g){var d=!g._ck,h=n(g,"HEAPF32");return this._makeBlender(h,4*g.length,d)}})})(r);var sa=Object.assign({},r),ta="",ua,va;
if(fa||ia)ia?ta=self.location.href:"undefined"!=typeof document&&document.currentScript&&(ta=document.currentScript.src),_scriptName&&(ta=_scriptName),ta.startsWith("blob:")?ta="":ta=ta.substr(0,ta.replace(/[?#].*/,"").lastIndexOf("/")+1),ia&&(va=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),ua=a=>fetch(a,{credentials:"same-origin"}).then(b=>b.ok?b.arrayBuffer():Promise.reject(Error(b.status+" : "+b.url)));
var xa=console.log.bind(console),ya=console.error.bind(console);Object.assign(r,sa);sa=null;var za,Ba=!1,Ca,B,Da,Fa,E,H,J,Ga;function Ha(){var a=za.buffer;r.HEAP8=Ca=new Int8Array(a);r.HEAP16=Da=new Int16Array(a);r.HEAPU8=B=new Uint8Array(a);r.HEAPU16=Fa=new Uint16Array(a);r.HEAP32=E=new Int32Array(a);r.HEAPU32=H=new Uint32Array(a);r.HEAPF32=J=new Float32Array(a);r.HEAPF64=Ga=new Float64Array(a)}var Ia=[],Ja=[],Ka=[],La=0,Na=null,Oa=null;
function Pa(a){a="Aborted("+a+")";ya(a);Ba=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");ca(a);throw a;}var Qa=a=>a.startsWith("data:application/octet-stream;base64,"),Ra;function Sa(a){return ua(a).then(b=>new Uint8Array(b),()=>{if(va)var b=va(a);else throw"both async and sync fetching of the wasm failed";return b})}function Ta(a,b,c){return Sa(a).then(e=>WebAssembly.instantiate(e,b)).then(c,e=>{ya(`failed to asynchronously prepare wasm: ${e}`);Pa(e)})}
function Ua(a,b){var c=Ra;return"function"!=typeof WebAssembly.instantiateStreaming||Qa(c)||"function"!=typeof fetch?Ta(c,a,b):fetch(c,{credentials:"same-origin"}).then(e=>WebAssembly.instantiateStreaming(e,a).then(b,function(f){ya(`wasm streaming compile failed: ${f}`);ya("falling back to ArrayBuffer instantiation");return Ta(c,a,b)}))}function Va(a){this.name="ExitStatus";this.message=`Program terminated with exit(${a})`;this.status=a}var Wa=a=>{a.forEach(b=>b(r))},Xa=r.noExitRuntime||!0;
class Ya{constructor(a){this.Vd=a-24}}
var Za=0,bb=0,cb="undefined"!=typeof TextDecoder?new TextDecoder:void 0,db=(a,b=0,c=NaN)=>{var e=b+c;for(c=b;a[c]&&!(c>=e);)++c;if(16<c-b&&a.buffer&&cb)return cb.decode(a.subarray(b,c));for(e="";b<c;){var f=a[b++];if(f&128){var k=a[b++]&63;if(192==(f&224))e+=String.fromCharCode((f&31)<<6|k);else{var n=a[b++]&63;f=224==(f&240)?(f&15)<<12|k<<6|n:(f&7)<<18|k<<12|n<<6|a[b++]&63;65536>f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}return e},
eb={},fb=a=>{for(;a.length;){var b=a.pop();a.pop()(b)}};function gb(a){return this.fromWireType(H[a>>2])}
var hb={},ib={},jb={},kb,mb=(a,b,c)=>{function e(l){l=c(l);if(l.length!==a.length)throw new kb("Mismatched type converter count");for(var q=0;q<a.length;++q)lb(a[q],l[q])}a.forEach(l=>jb[l]=b);var f=Array(b.length),k=[],n=0;b.forEach((l,q)=>{ib.hasOwnProperty(l)?f[q]=ib[l]:(k.push(l),hb.hasOwnProperty(l)||(hb[l]=[]),hb[l].push(()=>{f[q]=ib[l];++n;n===k.length&&e(f)}))});0===k.length&&e(f)},nb,K=a=>{for(var b="";B[a];)b+=nb[B[a++]];return b},L;
function ob(a,b,c={}){var e=b.name;if(!a)throw new L(`type "${e}" must have a positive integer typeid pointer`);if(ib.hasOwnProperty(a)){if(c.ef)return;throw new L(`Cannot register type '${e}' twice`);}ib[a]=b;delete jb[a];hb.hasOwnProperty(a)&&(b=hb[a],delete hb[a],b.forEach(f=>f()))}function lb(a,b,c={}){return ob(a,b,c)}
var pb=a=>{throw new L(a.Sd.Yd.Wd.name+" instance already deleted");},qb=!1,rb=()=>{},sb=(a,b,c)=>{if(b===c)return a;if(void 0===c.ae)return null;a=sb(a,b,c.ae);return null===a?null:c.Xe(a)},yb={},zb={},Ab=(a,b)=>{if(void 0===b)throw new L("ptr should not be undefined");for(;a.ae;)b=a.se(b),a=a.ae;return zb[b]},Cb=(a,b)=>{if(!b.Yd||!b.Vd)throw new kb("makeClassHandle requires ptr and ptrType");if(!!b.ce!==!!b.Zd)throw new kb("Both smartPtrType and smartPtr must be specified");b.count={value:1};return Bb(Object.create(a,
{Sd:{value:b,writable:!0}}))},Bb=a=>{if("undefined"===typeof FinalizationRegistry)return Bb=b=>b,a;qb=new FinalizationRegistry(b=>{b=b.Sd;--b.count.value;0===b.count.value&&(b.Zd?b.ce.he(b.Zd):b.Yd.Wd.he(b.Vd))});Bb=b=>{var c=b.Sd;c.Zd&&qb.register(b,{Sd:c},b);return b};rb=b=>{qb.unregister(b)};return Bb(a)},Db=[];function Eb(){}
var Fb=(a,b)=>Object.defineProperty(b,"name",{value:a}),Gb=(a,b,c)=>{if(void 0===a[b].$d){var e=a[b];a[b]=function(...f){if(!a[b].$d.hasOwnProperty(f.length))throw new L(`Function '${c}' called with an invalid number of arguments (${f.length}) - expects one of (${a[b].$d})!`);return a[b].$d[f.length].apply(this,f)};a[b].$d=[];a[b].$d[e.ie]=e}},Hb=(a,b,c)=>{if(r.hasOwnProperty(a)){if(void 0===c||void 0!==r[a].$d&&void 0!==r[a].$d[c])throw new L(`Cannot register public name '${a}' twice`);Gb(r,a,a);
if(r[a].$d.hasOwnProperty(c))throw new L(`Cannot register multiple overloads of a function with the same number of arguments (${c})!`);r[a].$d[c]=b}else r[a]=b,r[a].ie=c},Ib=a=>{a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?`_${a}`:a};function Jb(a,b,c,e,f,k,n,l){this.name=a;this.constructor=b;this.me=c;this.he=e;this.ae=f;this.$e=k;this.se=n;this.Xe=l;this.hf=[]}
var Kb=(a,b,c)=>{for(;b!==c;){if(!b.se)throw new L(`Expected null or instance of ${c.name}, got an instance of ${b.name}`);a=b.se(a);b=b.ae}return a};function Lb(a,b){if(null===b){if(this.Ee)throw new L(`null is not a valid ${this.name}`);return 0}if(!b.Sd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Sd.Vd)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);return Kb(b.Sd.Vd,b.Sd.Yd.Wd,this.Wd)}
function Nb(a,b){if(null===b){if(this.Ee)throw new L(`null is not a valid ${this.name}`);if(this.xe){var c=this.Fe();null!==a&&a.push(this.he,c);return c}return 0}if(!b||!b.Sd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Sd.Vd)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);if(!this.we&&b.Sd.Yd.we)throw new L(`Cannot convert argument of type ${b.Sd.ce?b.Sd.ce.name:b.Sd.Yd.name} to parameter type ${this.name}`);c=Kb(b.Sd.Vd,b.Sd.Yd.Wd,this.Wd);if(this.xe){if(void 0===
b.Sd.Zd)throw new L("Passing raw pointer to smart pointer is illegal");switch(this.nf){case 0:if(b.Sd.ce===this)c=b.Sd.Zd;else throw new L(`Cannot convert argument of type ${b.Sd.ce?b.Sd.ce.name:b.Sd.Yd.name} to parameter type ${this.name}`);break;case 1:c=b.Sd.Zd;break;case 2:if(b.Sd.ce===this)c=b.Sd.Zd;else{var e=b.clone();c=this.jf(c,Ob(()=>e["delete"]()));null!==a&&a.push(this.he,c)}break;default:throw new L("Unsupporting sharing policy");}}return c}
function Pb(a,b){if(null===b){if(this.Ee)throw new L(`null is not a valid ${this.name}`);return 0}if(!b.Sd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Sd.Vd)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);if(b.Sd.Yd.we)throw new L(`Cannot convert argument of type ${b.Sd.Yd.name} to parameter type ${this.name}`);return Kb(b.Sd.Vd,b.Sd.Yd.Wd,this.Wd)}
function Qb(a,b,c,e,f,k,n,l,q,v,w){this.name=a;this.Wd=b;this.Ee=c;this.we=e;this.xe=f;this.gf=k;this.nf=n;this.Me=l;this.Fe=q;this.jf=v;this.he=w;f||void 0!==b.ae?this.toWireType=Nb:(this.toWireType=e?Lb:Pb,this.ee=null)}
var Rb=(a,b,c)=>{if(!r.hasOwnProperty(a))throw new kb("Replacing nonexistent public symbol");void 0!==r[a].$d&&void 0!==c?r[a].$d[c]=b:(r[a]=b,r[a].ie=c)},N,Sb=(a,b,c=[])=>{a.includes("j")?(a=a.replace(/p/g,"i"),b=(0,r["dynCall_"+a])(b,...c)):b=N.get(b)(...c);return b},Tb=(a,b)=>(...c)=>Sb(a,b,c),Q=(a,b)=>{a=K(a);var c=a.includes("j")?Tb(a,b):N.get(b);if("function"!=typeof c)throw new L(`unknown function pointer with signature ${a}: ${b}`);return c},ac,dc=a=>{a=bc(a);var b=K(a);cc(a);return b},ec=
(a,b)=>{function c(k){f[k]||ib[k]||(jb[k]?jb[k].forEach(c):(e.push(k),f[k]=!0))}var e=[],f={};b.forEach(c);throw new ac(`${a}: `+e.map(dc).join([", "]));};function fc(a){for(var b=1;b<a.length;++b)if(null!==a[b]&&void 0===a[b].ee)return!0;return!1}
function gc(a,b,c,e,f){var k=b.length;if(2>k)throw new L("argTypes array size mismatch! Must at least get return value and 'this' types!");var n=null!==b[1]&&null!==c,l=fc(b),q="void"!==b[0].name,v=k-2,w=Array(v),A=[],D=[];return Fb(a,function(...I){D.length=0;A.length=n?2:1;A[0]=f;if(n){var P=b[1].toWireType(D,this);A[1]=P}for(var O=0;O<v;++O)w[O]=b[O+2].toWireType(D,I[O]),A.push(w[O]);I=e(...A);if(l)fb(D);else for(O=n?1:2;O<b.length;O++){var aa=1===O?P:w[O-2];null!==b[O].ee&&b[O].ee(aa)}P=q?b[0].fromWireType(I):
void 0;return P})}
var hc=(a,b)=>{for(var c=[],e=0;e<a;e++)c.push(H[b+4*e>>2]);return c},ic=a=>{a=a.trim();const b=a.indexOf("(");return-1!==b?a.substr(0,b):a},jc=[],kc=[],lc=a=>{9<a&&0===--kc[a+1]&&(kc[a]=void 0,jc.push(a))},mc=a=>{if(!a)throw new L("Cannot use deleted val. handle = "+a);return kc[a]},Ob=a=>{switch(a){case void 0:return 2;case null:return 4;case !0:return 6;case !1:return 8;default:const b=jc.pop()||kc.length;kc[b]=a;kc[b+1]=1;return b}},nc={name:"emscripten::val",fromWireType:a=>{var b=mc(a);lc(a);
return b},toWireType:(a,b)=>Ob(b),de:8,readValueFromPointer:gb,ee:null},oc=(a,b,c)=>{switch(b){case 1:return c?function(e){return this.fromWireType(Ca[e])}:function(e){return this.fromWireType(B[e])};case 2:return c?function(e){return this.fromWireType(Da[e>>1])}:function(e){return this.fromWireType(Fa[e>>1])};case 4:return c?function(e){return this.fromWireType(E[e>>2])}:function(e){return this.fromWireType(H[e>>2])};default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},pc=(a,b)=>
{var c=ib[a];if(void 0===c)throw a=`${b} has unknown type ${dc(a)}`,new L(a);return c},Mb=a=>{if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a},qc=(a,b)=>{switch(b){case 4:return function(c){return this.fromWireType(J[c>>2])};case 8:return function(c){return this.fromWireType(Ga[c>>3])};default:throw new TypeError(`invalid float width (${b}): ${a}`);}},rc=(a,b,c)=>{switch(b){case 1:return c?e=>Ca[e]:e=>B[e];case 2:return c?e=>Da[e>>1]:e=>Fa[e>>
1];case 4:return c?e=>E[e>>2]:e=>H[e>>2];default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},ra=(a,b,c)=>{var e=B;if(!(0<c))return 0;var f=b;c=b+c-1;for(var k=0;k<a.length;++k){var n=a.charCodeAt(k);if(55296<=n&&57343>=n){var l=a.charCodeAt(++k);n=65536+((n&1023)<<10)|l&1023}if(127>=n){if(b>=c)break;e[b++]=n}else{if(2047>=n){if(b+1>=c)break;e[b++]=192|n>>6}else{if(65535>=n){if(b+2>=c)break;e[b++]=224|n>>12}else{if(b+3>=c)break;e[b++]=240|n>>18;e[b++]=128|n>>12&63}e[b++]=128|n>>6&
63}e[b++]=128|n&63}}e[b]=0;return b-f},qa=a=>{for(var b=0,c=0;c<a.length;++c){var e=a.charCodeAt(c);127>=e?b++:2047>=e?b+=2:55296<=e&&57343>=e?(b+=4,++c):b+=3}return b},sc="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0,tc=(a,b)=>{var c=a>>1;for(var e=c+b/2;!(c>=e)&&Fa[c];)++c;c<<=1;if(32<c-a&&sc)return sc.decode(B.subarray(a,c));c="";for(e=0;!(e>=b/2);++e){var f=Da[a+2*e>>1];if(0==f)break;c+=String.fromCharCode(f)}return c},uc=(a,b,c)=>{c??=2147483647;if(2>c)return 0;c-=2;var e=
b;c=c<2*a.length?c/2:a.length;for(var f=0;f<c;++f)Da[b>>1]=a.charCodeAt(f),b+=2;Da[b>>1]=0;return b-e},vc=a=>2*a.length,wc=(a,b)=>{for(var c=0,e="";!(c>=b/4);){var f=E[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e},xc=(a,b,c)=>{c??=2147483647;if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f<a.length;++f){var k=a.charCodeAt(f);if(55296<=k&&57343>=k){var n=a.charCodeAt(++f);k=65536+((k&1023)<<10)|n&1023}E[b>>2]=k;b+=
4;if(b+4>c)break}E[b>>2]=0;return b-e},yc=a=>{for(var b=0,c=0;c<a.length;++c){var e=a.charCodeAt(c);55296<=e&&57343>=e&&++c;b+=4}return b},zc=(a,b,c)=>{var e=[];a=a.toWireType(e,c);e.length&&(H[b>>2]=Ob(e));return a},Ac=[],Bc={},Cc=a=>{var b=Bc[a];return void 0===b?K(a):b},Dc=()=>{function a(b){b.$$$embind_global$$$=b;var c="object"==typeof $$$embind_global$$$&&b.$$$embind_global$$$==b;c||delete b.$$$embind_global$$$;return c}if("object"==typeof globalThis)return globalThis;if("object"==typeof $$$embind_global$$$)return $$$embind_global$$$;
"object"==typeof global&&a(global)?$$$embind_global$$$=global:"object"==typeof self&&a(self)&&($$$embind_global$$$=self);if("object"==typeof $$$embind_global$$$)return $$$embind_global$$$;throw Error("unable to get global object.");},Ec=a=>{var b=Ac.length;Ac.push(a);return b},Fc=(a,b)=>{for(var c=Array(a),e=0;e<a;++e)c[e]=pc(H[b+4*e>>2],"parameter "+e);return c},Gc=Reflect.construct,R,Hc=a=>{var b=a.getExtension("ANGLE_instanced_arrays");b&&(a.vertexAttribDivisor=(c,e)=>b.vertexAttribDivisorANGLE(c,
e),a.drawArraysInstanced=(c,e,f,k)=>b.drawArraysInstancedANGLE(c,e,f,k),a.drawElementsInstanced=(c,e,f,k,n)=>b.drawElementsInstancedANGLE(c,e,f,k,n))},Ic=a=>{var b=a.getExtension("OES_vertex_array_object");b&&(a.createVertexArray=()=>b.createVertexArrayOES(),a.deleteVertexArray=c=>b.deleteVertexArrayOES(c),a.bindVertexArray=c=>b.bindVertexArrayOES(c),a.isVertexArray=c=>b.isVertexArrayOES(c))},Jc=a=>{var b=a.getExtension("WEBGL_draw_buffers");b&&(a.drawBuffers=(c,e)=>b.drawBuffersWEBGL(c,e))},Kc=a=>
{var b="ANGLE_instanced_arrays EXT_blend_minmax EXT_disjoint_timer_query EXT_frag_depth EXT_shader_texture_lod EXT_sRGB OES_element_index_uint OES_fbo_render_mipmap OES_standard_derivatives OES_texture_float OES_texture_half_float OES_texture_half_float_linear OES_vertex_array_object WEBGL_color_buffer_float WEBGL_depth_texture WEBGL_draw_buffers EXT_color_buffer_float EXT_conservative_depth EXT_disjoint_timer_query_webgl2 EXT_texture_norm16 NV_shader_noperspective_interpolation WEBGL_clip_cull_distance EXT_clip_control EXT_color_buffer_half_float EXT_depth_clamp EXT_float_blend EXT_polygon_offset_clamp EXT_texture_compression_bptc EXT_texture_compression_rgtc EXT_texture_filter_anisotropic KHR_parallel_shader_compile OES_texture_float_linear WEBGL_blend_func_extended WEBGL_compressed_texture_astc WEBGL_compressed_texture_etc WEBGL_compressed_texture_etc1 WEBGL_compressed_texture_s3tc WEBGL_compressed_texture_s3tc_srgb WEBGL_debug_renderer_info WEBGL_debug_shaders WEBGL_lose_context WEBGL_multi_draw WEBGL_polygon_mode".split(" ");
return(a.getSupportedExtensions()||[]).filter(c=>b.includes(c))},Lc=1,Mc=[],Nc=[],Oc=[],Pc=[],ka=[],Qc=[],Rc=[],pa=[],Sc=[],Tc=[],Uc=[],Wc={},Xc={},Yc=4,Zc=0,ja=a=>{for(var b=Lc++,c=a.length;c<b;c++)a[c]=null;return b},$c=(a,b,c,e)=>{for(var f=0;f<a;f++){var k=R[c](),n=k&&ja(e);k?(k.name=n,e[n]=k):U||=1282;E[b+4*f>>2]=n}},na=(a,b)=>{a.He||(a.He=a.getContext,a.getContext=function(e,f){f=a.He(e,f);return"webgl"==e==f instanceof WebGLRenderingContext?f:null});var c=1<b.majorVersion?a.getContext("webgl2",
b):a.getContext("webgl",b);return c?ad(c,b):0},ad=(a,b)=>{var c=ja(pa),e={handle:c,attributes:b,version:b.majorVersion,fe:a};a.canvas&&(a.canvas.Pe=e);pa[c]=e;("undefined"==typeof b.Ye||b.Ye)&&bd(e);return c},oa=a=>{z=pa[a];r.pf=R=z?.fe;return!(a&&!R)},bd=a=>{a||=z;if(!a.ff){a.ff=!0;var b=a.fe;b.tf=b.getExtension("WEBGL_multi_draw");b.rf=b.getExtension("EXT_polygon_offset_clamp");b.qf=b.getExtension("EXT_clip_control");b.vf=b.getExtension("WEBGL_polygon_mode");Hc(b);Ic(b);Jc(b);b.Je=b.getExtension("WEBGL_draw_instanced_base_vertex_base_instance");
b.Le=b.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance");2<=a.version&&(b.ge=b.getExtension("EXT_disjoint_timer_query_webgl2"));if(2>a.version||!b.ge)b.ge=b.getExtension("EXT_disjoint_timer_query");Kc(b).forEach(c=>{c.includes("lose_context")||c.includes("debug")||b.getExtension(c)})}},z,U,cd=(a,b)=>{R.bindFramebuffer(a,Oc[b])},dd=a=>{R.bindVertexArray(Rc[a])},ed=a=>R.clear(a),fd=(a,b,c,e)=>R.clearColor(a,b,c,e),gd=a=>R.clearStencil(a),hd=(a,b)=>{for(var c=0;c<a;c++){var e=E[b+
4*c>>2];R.deleteVertexArray(Rc[e]);Rc[e]=null}},jd=[],kd=(a,b)=>{$c(a,b,"createVertexArray",Rc)};function ld(){var a=Kc(R);return a=a.concat(a.map(b=>"GL_"+b))}
var md=(a,b,c)=>{if(b){var e=void 0;switch(a){case 36346:e=1;break;case 36344:0!=c&&1!=c&&(U||=1280);return;case 34814:case 36345:e=0;break;case 34466:var f=R.getParameter(34467);e=f?f.length:0;break;case 33309:if(2>z.version){U||=1282;return}e=ld().length;break;case 33307:case 33308:if(2>z.version){U||=1280;return}e=33307==a?3:0}if(void 0===e)switch(f=R.getParameter(a),typeof f){case "number":e=f;break;case "boolean":e=f?1:0;break;case "string":U||=1280;return;case "object":if(null===f)switch(a){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:e=
0;break;default:U||=1280;return}else{if(f instanceof Float32Array||f instanceof Uint32Array||f instanceof Int32Array||f instanceof Array){for(a=0;a<f.length;++a)switch(c){case 0:E[b+4*a>>2]=f[a];break;case 2:J[b+4*a>>2]=f[a];break;case 4:Ca[b+a]=f[a]?1:0}return}try{e=f.name|0}catch(k){U||=1280;ya(`GL_INVALID_ENUM in glGet${c}v: Unknown object returned from WebGL getParameter(${a})! (error: ${k})`);return}}break;default:U||=1280;ya(`GL_INVALID_ENUM in glGet${c}v: Native code calling glGet${c}v(${a}) and it returns ${f} of type ${typeof f}!`);
return}switch(c){case 1:c=e;H[b>>2]=c;H[b+4>>2]=(c-H[b>>2])/4294967296;break;case 0:E[b>>2]=e;break;case 2:J[b>>2]=e;break;case 4:Ca[b]=e?1:0}}else U||=1281},nd=(a,b)=>md(a,b,0),od=(a,b,c)=>{if(c){a=Sc[a];b=2>z.version?R.ge.getQueryObjectEXT(a,b):R.getQueryParameter(a,b);var e;"boolean"==typeof b?e=b?1:0:e=b;H[c>>2]=e;H[c+4>>2]=(e-H[c>>2])/4294967296}else U||=1281},qd=a=>{var b=qa(a)+1,c=pd(b);c&&ra(a,c,b);return c},rd=a=>{var b=Wc[a];if(!b){switch(a){case 7939:b=qd(ld().join(" "));break;case 7936:case 7937:case 37445:case 37446:(b=
R.getParameter(a))||(U||=1280);b=b?qd(b):0;break;case 7938:b=R.getParameter(7938);var c=`OpenGL ES 2.0 (${b})`;2<=z.version&&(c=`OpenGL ES 3.0 (${b})`);b=qd(c);break;case 35724:b=R.getParameter(35724);c=b.match(/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/);null!==c&&(3==c[1].length&&(c[1]+="0"),b=`OpenGL ES GLSL ES ${c[1]} (${b})`);b=qd(b);break;default:U||=1280}Wc[a]=b}return b},sd=(a,b)=>{if(2>z.version)return U||=1282,0;var c=Xc[a];if(c)return 0>b||b>=c.length?(U||=1281,0):c[b];switch(a){case 7939:return c=
ld().map(qd),c=Xc[a]=c,0>b||b>=c.length?(U||=1281,0):c[b];default:return U||=1280,0}},td=a=>"]"==a.slice(-1)&&a.lastIndexOf("["),ud=a=>{a-=5120;return 0==a?Ca:1==a?B:2==a?Da:4==a?E:6==a?J:5==a||28922==a||28520==a||30779==a||30782==a?H:Fa},vd=(a,b,c,e,f)=>{a=ud(a);b=e*((Zc||c)*({5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4}[b-6402]||1)*a.BYTES_PER_ELEMENT+Yc-1&-Yc);return a.subarray(f>>>31-Math.clz32(a.BYTES_PER_ELEMENT),f+b>>>31-Math.clz32(a.BYTES_PER_ELEMENT))},Y=a=>{var b=R.We;if(b){var c=
b.re[a];"number"==typeof c&&(b.re[a]=c=R.getUniformLocation(b,b.Ne[a]+(0<c?`[${c}]`:"")));return c}U||=1282},wd=[],xd=[],yd={},Ad=()=>{if(!zd){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"},b;for(b in yd)void 0===yd[b]?delete a[b]:a[b]=yd[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);zd=c}return zd},zd,Bd=[null,[],[]];
kb=r.InternalError=class extends Error{constructor(a){super(a);this.name="InternalError"}};for(var Cd=Array(256),Dd=0;256>Dd;++Dd)Cd[Dd]=String.fromCharCode(Dd);nb=Cd;L=r.BindingError=class extends Error{constructor(a){super(a);this.name="BindingError"}};
Object.assign(Eb.prototype,{isAliasOf:function(a){if(!(this instanceof Eb&&a instanceof Eb))return!1;var b=this.Sd.Yd.Wd,c=this.Sd.Vd;a.Sd=a.Sd;var e=a.Sd.Yd.Wd;for(a=a.Sd.Vd;b.ae;)c=b.se(c),b=b.ae;for(;e.ae;)a=e.se(a),e=e.ae;return b===e&&c===a},clone:function(){this.Sd.Vd||pb(this);if(this.Sd.qe)return this.Sd.count.value+=1,this;var a=Bb,b=Object,c=b.create,e=Object.getPrototypeOf(this),f=this.Sd;a=a(c.call(b,e,{Sd:{value:{count:f.count,pe:f.pe,qe:f.qe,Vd:f.Vd,Yd:f.Yd,Zd:f.Zd,ce:f.ce}}}));a.Sd.count.value+=
1;a.Sd.pe=!1;return a},["delete"](){this.Sd.Vd||pb(this);if(this.Sd.pe&&!this.Sd.qe)throw new L("Object already scheduled for deletion");rb(this);var a=this.Sd;--a.count.value;0===a.count.value&&(a.Zd?a.ce.he(a.Zd):a.Yd.Wd.he(a.Vd));this.Sd.qe||(this.Sd.Zd=void 0,this.Sd.Vd=void 0)},isDeleted:function(){return!this.Sd.Vd},deleteLater:function(){this.Sd.Vd||pb(this);if(this.Sd.pe&&!this.Sd.qe)throw new L("Object already scheduled for deletion");Db.push(this);this.Sd.pe=!0;return this}});
Object.assign(Qb.prototype,{af(a){this.Me&&(a=this.Me(a));return a},Ie(a){this.he?.(a)},de:8,readValueFromPointer:gb,fromWireType:function(a){function b(){return this.xe?Cb(this.Wd.me,{Yd:this.gf,Vd:c,ce:this,Zd:a}):Cb(this.Wd.me,{Yd:this,Vd:a})}var c=this.af(a);if(!c)return this.Ie(a),null;var e=Ab(this.Wd,c);if(void 0!==e){if(0===e.Sd.count.value)return e.Sd.Vd=c,e.Sd.Zd=a,e.clone();e=e.clone();this.Ie(a);return e}e=this.Wd.$e(c);e=yb[e];if(!e)return b.call(this);e=this.we?e.Ve:e.pointerType;var f=
sb(c,this.Wd,e.Wd);return null===f?b.call(this):this.xe?Cb(e.Wd.me,{Yd:e,Vd:f,ce:this,Zd:a}):Cb(e.Wd.me,{Yd:e,Vd:f})}});ac=r.UnboundTypeError=((a,b)=>{var c=Fb(b,function(e){this.name=b;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(a.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:`${this.name}: ${this.message}`};return c})(Error,"UnboundTypeError");
kc.push(0,1,void 0,1,null,1,!0,1,!1,1);r.count_emval_handles=()=>kc.length/2-5-jc.length;for(var Ed=0;32>Ed;++Ed)jd.push(Array(Ed));var Fd=new Float32Array(288);for(Ed=0;288>=Ed;++Ed)wd[Ed]=Fd.subarray(0,Ed);var Gd=new Int32Array(288);for(Ed=0;288>=Ed;++Ed)xd[Ed]=Gd.subarray(0,Ed);
var Vd={F:(a,b,c)=>{var e=new Ya(a);H[e.Vd+16>>2]=0;H[e.Vd+4>>2]=b;H[e.Vd+8>>2]=c;Za=a;bb++;throw Za;},U:function(){return 0},ud:()=>{},td:function(){return 0},sd:()=>{},rd:function(){},qd:()=>{},md:()=>{Pa("")},B:a=>{var b=eb[a];delete eb[a];var c=b.Fe,e=b.he,f=b.Ke,k=f.map(n=>n.df).concat(f.map(n=>n.lf));mb([a],k,n=>{var l={};f.forEach((q,v)=>{var w=n[v],A=q.bf,D=q.cf,I=n[v+f.length],P=q.kf,O=q.mf;l[q.Ze]={read:aa=>w.fromWireType(A(D,aa)),write:(aa,la)=>{var X=[];P(O,aa,I.toWireType(X,la));fb(X)}}});
return[{name:b.name,fromWireType:q=>{var v={},w;for(w in l)v[w]=l[w].read(q);e(q);return v},toWireType:(q,v)=>{for(var w in l)if(!(w in v))throw new TypeError(`Missing field: "${w}"`);var A=c();for(w in l)l[w].write(A,v[w]);null!==q&&q.push(e,A);return A},de:8,readValueFromPointer:gb,ee:e}]})},X:()=>{},ld:(a,b,c,e)=>{b=K(b);lb(a,{name:b,fromWireType:function(f){return!!f},toWireType:function(f,k){return k?c:e},de:8,readValueFromPointer:function(f){return this.fromWireType(B[f])},ee:null})},k:(a,b,
c,e,f,k,n,l,q,v,w,A,D)=>{w=K(w);k=Q(f,k);l&&=Q(n,l);v&&=Q(q,v);D=Q(A,D);var I=Ib(w);Hb(I,function(){ec(`Cannot construct ${w} due to unbound types`,[e])});mb([a,b,c],e?[e]:[],P=>{P=P[0];if(e){var O=P.Wd;var aa=O.me}else aa=Eb.prototype;P=Fb(w,function(...Ea){if(Object.getPrototypeOf(this)!==la)throw new L("Use 'new' to construct "+w);if(void 0===X.je)throw new L(w+" has no accessible constructor");var ea=X.je[Ea.length];if(void 0===ea)throw new L(`Tried to invoke ctor of ${w} with invalid number of parameters (${Ea.length}) - expected (${Object.keys(X.je).toString()}) parameters instead!`);
return ea.apply(this,Ea)});var la=Object.create(aa,{constructor:{value:P}});P.prototype=la;var X=new Jb(w,P,la,D,O,k,l,v);if(X.ae){var ha;(ha=X.ae).te??(ha.te=[]);X.ae.te.push(X)}O=new Qb(w,X,!0,!1,!1);ha=new Qb(w+"*",X,!1,!1,!1);aa=new Qb(w+" const*",X,!1,!0,!1);yb[a]={pointerType:ha,Ve:aa};Rb(I,P);return[O,ha,aa]})},e:(a,b,c,e,f,k,n)=>{var l=hc(c,e);b=K(b);b=ic(b);k=Q(f,k);mb([],[a],q=>{function v(){ec(`Cannot call ${w} due to unbound types`,l)}q=q[0];var w=`${q.name}.${b}`;b.startsWith("@@")&&
(b=Symbol[b.substring(2)]);var A=q.Wd.constructor;void 0===A[b]?(v.ie=c-1,A[b]=v):(Gb(A,b,w),A[b].$d[c-1]=v);mb([],l,D=>{D=[D[0],null].concat(D.slice(1));D=gc(w,D,null,k,n);void 0===A[b].$d?(D.ie=c-1,A[b]=D):A[b].$d[c-1]=D;if(q.Wd.te)for(const I of q.Wd.te)I.constructor.hasOwnProperty(b)||(I.constructor[b]=D);return[]});return[]})},z:(a,b,c,e,f,k)=>{var n=hc(b,c);f=Q(e,f);mb([],[a],l=>{l=l[0];var q=`constructor ${l.name}`;void 0===l.Wd.je&&(l.Wd.je=[]);if(void 0!==l.Wd.je[b-1])throw new L(`Cannot register multiple constructors with identical number of parameters (${b-
1}) for class '${l.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);l.Wd.je[b-1]=()=>{ec(`Cannot construct ${l.name} due to unbound types`,n)};mb([],n,v=>{v.splice(1,0,null);l.Wd.je[b-1]=gc(q,v,null,f,k);return[]});return[]})},a:(a,b,c,e,f,k,n,l)=>{var q=hc(c,e);b=K(b);b=ic(b);k=Q(f,k);mb([],[a],v=>{function w(){ec(`Cannot call ${A} due to unbound types`,q)}v=v[0];var A=`${v.name}.${b}`;b.startsWith("@@")&&(b=Symbol[b.substring(2)]);l&&v.Wd.hf.push(b);
var D=v.Wd.me,I=D[b];void 0===I||void 0===I.$d&&I.className!==v.name&&I.ie===c-2?(w.ie=c-2,w.className=v.name,D[b]=w):(Gb(D,b,A),D[b].$d[c-2]=w);mb([],q,P=>{P=gc(A,P,v,k,n);void 0===D[b].$d?(P.ie=c-2,D[b]=P):D[b].$d[c-2]=P;return[]});return[]})},q:(a,b,c)=>{a=K(a);mb([],[b],e=>{e=e[0];r[a]=e.fromWireType(c);return[]})},kd:a=>lb(a,nc),i:(a,b,c,e)=>{function f(){}b=K(b);f.values={};lb(a,{name:b,constructor:f,fromWireType:function(k){return this.constructor.values[k]},toWireType:(k,n)=>n.value,de:8,
readValueFromPointer:oc(b,c,e),ee:null});Hb(b,f)},b:(a,b,c)=>{var e=pc(a,"enum");b=K(b);a=e.constructor;e=Object.create(e.constructor.prototype,{value:{value:c},constructor:{value:Fb(`${e.name}_${b}`,function(){})}});a.values[c]=e;a[b]=e},R:(a,b,c)=>{b=K(b);lb(a,{name:b,fromWireType:e=>e,toWireType:(e,f)=>f,de:8,readValueFromPointer:qc(b,c),ee:null})},w:(a,b,c,e,f,k)=>{var n=hc(b,c);a=K(a);a=ic(a);f=Q(e,f);Hb(a,function(){ec(`Cannot call ${a} due to unbound types`,n)},b-1);mb([],n,l=>{l=[l[0],null].concat(l.slice(1));
Rb(a,gc(a,l,null,f,k),b-1);return[]})},C:(a,b,c,e,f)=>{b=K(b);-1===f&&(f=4294967295);f=l=>l;if(0===e){var k=32-8*c;f=l=>l<<k>>>k}var n=b.includes("unsigned")?function(l,q){return q>>>0}:function(l,q){return q};lb(a,{name:b,fromWireType:f,toWireType:n,de:8,readValueFromPointer:rc(b,c,0!==e),ee:null})},p:(a,b,c)=>{function e(k){return new f(Ca.buffer,H[k+4>>2],H[k>>2])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=K(c);lb(a,{name:c,fromWireType:e,
de:8,readValueFromPointer:e},{ef:!0})},o:(a,b,c,e,f,k,n,l,q,v,w,A)=>{c=K(c);k=Q(f,k);l=Q(n,l);v=Q(q,v);A=Q(w,A);mb([a],[b],D=>{D=D[0];return[new Qb(c,D.Wd,!1,!1,!0,D,e,k,l,v,A)]})},Q:(a,b)=>{b=K(b);var c="std::string"===b;lb(a,{name:b,fromWireType:function(e){var f=H[e>>2],k=e+4;if(c)for(var n=k,l=0;l<=f;++l){var q=k+l;if(l==f||0==B[q]){n=n?db(B,n,q-n):"";if(void 0===v)var v=n;else v+=String.fromCharCode(0),v+=n;n=q+1}}else{v=Array(f);for(l=0;l<f;++l)v[l]=String.fromCharCode(B[k+l]);v=v.join("")}cc(e);
return v},toWireType:function(e,f){f instanceof ArrayBuffer&&(f=new Uint8Array(f));var k="string"==typeof f;if(!(k||f instanceof Uint8Array||f instanceof Uint8ClampedArray||f instanceof Int8Array))throw new L("Cannot pass non-string to std::string");var n=c&&k?qa(f):f.length;var l=pd(4+n+1),q=l+4;H[l>>2]=n;if(c&&k)ra(f,q,n+1);else if(k)for(k=0;k<n;++k){var v=f.charCodeAt(k);if(255<v)throw cc(q),new L("String has UTF-16 code units that do not fit in 8 bits");B[q+k]=v}else for(k=0;k<n;++k)B[q+k]=f[k];
null!==e&&e.push(cc,l);return l},de:8,readValueFromPointer:gb,ee(e){cc(e)}})},M:(a,b,c)=>{c=K(c);if(2===b){var e=tc;var f=uc;var k=vc;var n=l=>Fa[l>>1]}else 4===b&&(e=wc,f=xc,k=yc,n=l=>H[l>>2]);lb(a,{name:c,fromWireType:l=>{for(var q=H[l>>2],v,w=l+4,A=0;A<=q;++A){var D=l+4+A*b;if(A==q||0==n(D))w=e(w,D-w),void 0===v?v=w:(v+=String.fromCharCode(0),v+=w),w=D+b}cc(l);return v},toWireType:(l,q)=>{if("string"!=typeof q)throw new L(`Cannot pass non-string to C++ string type ${c}`);var v=k(q),w=pd(4+v+b);
H[w>>2]=v/b;f(q,w+4,v+b);null!==l&&l.push(cc,w);return w},de:8,readValueFromPointer:gb,ee(l){cc(l)}})},A:(a,b,c,e,f,k)=>{eb[a]={name:K(b),Fe:Q(c,e),he:Q(f,k),Ke:[]}},d:(a,b,c,e,f,k,n,l,q,v)=>{eb[a].Ke.push({Ze:K(b),df:c,bf:Q(e,f),cf:k,lf:n,kf:Q(l,q),mf:v})},jd:(a,b)=>{b=K(b);lb(a,{sf:!0,name:b,de:0,fromWireType:()=>{},toWireType:()=>{}})},id:()=>1,hd:()=>{throw Infinity;},E:(a,b,c)=>{a=mc(a);b=pc(b,"emval::as");return zc(b,c,a)},L:(a,b,c,e)=>{a=Ac[a];b=mc(b);return a(null,b,c,e)},t:(a,b,c,e,f)=>{a=
Ac[a];b=mc(b);c=Cc(c);return a(b,b[c],e,f)},c:lc,K:a=>{if(0===a)return Ob(Dc());a=Cc(a);return Ob(Dc()[a])},n:(a,b,c)=>{var e=Fc(a,b),f=e.shift();a--;var k=Array(a);b=`methodCaller<(${e.map(n=>n.name).join(", ")}) => ${f.name}>`;return Ec(Fb(b,(n,l,q,v)=>{for(var w=0,A=0;A<a;++A)k[A]=e[A].readValueFromPointer(v+w),w+=e[A].de;n=1===c?Gc(l,k):l.apply(n,k);return zc(f,q,n)}))},y:(a,b)=>{a=mc(a);b=mc(b);return Ob(a[b])},H:a=>{9<a&&(kc[a+1]+=1)},G:()=>Ob([]),f:a=>Ob(Cc(a)),D:()=>Ob({}),gd:a=>{a=mc(a);
return!a},l:a=>{var b=mc(a);fb(b);lc(a)},h:(a,b,c)=>{a=mc(a);b=mc(b);c=mc(c);a[b]=c},g:(a,b)=>{a=pc(a,"_emval_take_value");a=a.readValueFromPointer(b);return Ob(a)},W:function(){return-52},V:function(){},fd:(a,b,c,e)=>{var f=(new Date).getFullYear(),k=(new Date(f,0,1)).getTimezoneOffset();f=(new Date(f,6,1)).getTimezoneOffset();H[a>>2]=60*Math.max(k,f);E[b>>2]=Number(k!=f);b=n=>{var l=Math.abs(n);return`UTC${0<=n?"-":"+"}${String(Math.floor(l/60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};
a=b(k);b=b(f);f<k?(ra(a,c,17),ra(b,e,17)):(ra(a,e,17),ra(b,c,17))},ed:()=>performance.now(),dd:a=>R.activeTexture(a),cd:(a,b)=>{R.attachShader(Nc[a],Qc[b])},bd:(a,b)=>{R.beginQuery(a,Sc[b])},ad:(a,b)=>{R.ge.beginQueryEXT(a,Sc[b])},$c:(a,b,c)=>{R.bindAttribLocation(Nc[a],b,c?db(B,c):"")},_c:(a,b)=>{35051==a?R.Ce=b:35052==a&&(R.le=b);R.bindBuffer(a,Mc[b])},Zc:cd,Yc:(a,b)=>{R.bindRenderbuffer(a,Pc[b])},Xc:(a,b)=>{R.bindSampler(a,Tc[b])},Wc:(a,b)=>{R.bindTexture(a,ka[b])},Vc:dd,Uc:dd,Tc:(a,b,c,e)=>R.blendColor(a,
b,c,e),Sc:a=>R.blendEquation(a),Rc:(a,b)=>R.blendFunc(a,b),Qc:(a,b,c,e,f,k,n,l,q,v)=>R.blitFramebuffer(a,b,c,e,f,k,n,l,q,v),Pc:(a,b,c,e)=>{2<=z.version?c&&b?R.bufferData(a,B,e,c,b):R.bufferData(a,b,e):R.bufferData(a,c?B.subarray(c,c+b):b,e)},Oc:(a,b,c,e)=>{2<=z.version?c&&R.bufferSubData(a,b,B,e,c):R.bufferSubData(a,b,B.subarray(e,e+c))},Nc:a=>R.checkFramebufferStatus(a),Mc:ed,Lc:fd,Kc:gd,Jc:(a,b,c,e)=>R.clientWaitSync(Uc[a],b,(c>>>0)+4294967296*e),Ic:(a,b,c,e)=>{R.colorMask(!!a,!!b,!!c,!!e)},Hc:a=>
{R.compileShader(Qc[a])},Gc:(a,b,c,e,f,k,n,l)=>{2<=z.version?R.le||!n?R.compressedTexImage2D(a,b,c,e,f,k,n,l):R.compressedTexImage2D(a,b,c,e,f,k,B,l,n):R.compressedTexImage2D(a,b,c,e,f,k,B.subarray(l,l+n))},Fc:(a,b,c,e,f,k,n,l,q)=>{2<=z.version?R.le||!l?R.compressedTexSubImage2D(a,b,c,e,f,k,n,l,q):R.compressedTexSubImage2D(a,b,c,e,f,k,n,B,q,l):R.compressedTexSubImage2D(a,b,c,e,f,k,n,B.subarray(q,q+l))},Ec:(a,b,c,e,f)=>R.copyBufferSubData(a,b,c,e,f),Dc:(a,b,c,e,f,k,n,l)=>R.copyTexSubImage2D(a,b,c,
e,f,k,n,l),Cc:()=>{var a=ja(Nc),b=R.createProgram();b.name=a;b.Ae=b.ye=b.ze=0;b.Ge=1;Nc[a]=b;return a},Bc:a=>{var b=ja(Qc);Qc[b]=R.createShader(a);return b},Ac:a=>R.cullFace(a),zc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Mc[e];f&&(R.deleteBuffer(f),f.name=0,Mc[e]=null,e==R.Ce&&(R.Ce=0),e==R.le&&(R.le=0))}},yc:(a,b)=>{for(var c=0;c<a;++c){var e=E[b+4*c>>2],f=Oc[e];f&&(R.deleteFramebuffer(f),f.name=0,Oc[e]=null)}},xc:a=>{if(a){var b=Nc[a];b?(R.deleteProgram(b),b.name=0,Nc[a]=null):U||=1281}},
wc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Sc[e];f&&(R.deleteQuery(f),Sc[e]=null)}},vc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Sc[e];f&&(R.ge.deleteQueryEXT(f),Sc[e]=null)}},uc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Pc[e];f&&(R.deleteRenderbuffer(f),f.name=0,Pc[e]=null)}},tc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Tc[e];f&&(R.deleteSampler(f),f.name=0,Tc[e]=null)}},sc:a=>{if(a){var b=Qc[a];b?(R.deleteShader(b),Qc[a]=null):U||=1281}},rc:a=>{if(a){var b=Uc[a];b?
(R.deleteSync(b),b.name=0,Uc[a]=null):U||=1281}},qc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=ka[e];f&&(R.deleteTexture(f),f.name=0,ka[e]=null)}},pc:hd,oc:hd,nc:a=>{R.depthMask(!!a)},mc:a=>R.disable(a),lc:a=>{R.disableVertexAttribArray(a)},kc:(a,b,c)=>{R.drawArrays(a,b,c)},jc:(a,b,c,e)=>{R.drawArraysInstanced(a,b,c,e)},ic:(a,b,c,e,f)=>{R.Je.drawArraysInstancedBaseInstanceWEBGL(a,b,c,e,f)},hc:(a,b)=>{for(var c=jd[a],e=0;e<a;e++)c[e]=E[b+4*e>>2];R.drawBuffers(c)},gc:(a,b,c,e)=>{R.drawElements(a,
b,c,e)},fc:(a,b,c,e,f)=>{R.drawElementsInstanced(a,b,c,e,f)},ec:(a,b,c,e,f,k,n)=>{R.Je.drawElementsInstancedBaseVertexBaseInstanceWEBGL(a,b,c,e,f,k,n)},dc:(a,b,c,e,f,k)=>{R.drawElements(a,e,f,k)},cc:a=>R.enable(a),bc:a=>{R.enableVertexAttribArray(a)},ac:a=>R.endQuery(a),$b:a=>{R.ge.endQueryEXT(a)},_b:(a,b)=>(a=R.fenceSync(a,b))?(b=ja(Uc),a.name=b,Uc[b]=a,b):0,Zb:()=>R.finish(),Yb:()=>R.flush(),Xb:(a,b,c,e)=>{R.framebufferRenderbuffer(a,b,c,Pc[e])},Wb:(a,b,c,e,f)=>{R.framebufferTexture2D(a,b,c,ka[e],
f)},Vb:a=>R.frontFace(a),Ub:(a,b)=>{$c(a,b,"createBuffer",Mc)},Tb:(a,b)=>{$c(a,b,"createFramebuffer",Oc)},Sb:(a,b)=>{$c(a,b,"createQuery",Sc)},Rb:(a,b)=>{for(var c=0;c<a;c++){var e=R.ge.createQueryEXT();if(!e){for(U||=1282;c<a;)E[b+4*c++>>2]=0;break}var f=ja(Sc);e.name=f;Sc[f]=e;E[b+4*c>>2]=f}},Qb:(a,b)=>{$c(a,b,"createRenderbuffer",Pc)},Pb:(a,b)=>{$c(a,b,"createSampler",Tc)},Ob:(a,b)=>{$c(a,b,"createTexture",ka)},Nb:kd,Mb:kd,Lb:a=>R.generateMipmap(a),Kb:(a,b,c)=>{c?E[c>>2]=R.getBufferParameter(a,
b):U||=1281},Jb:()=>{var a=R.getError()||U;U=0;return a},Ib:(a,b)=>md(a,b,2),Hb:(a,b,c,e)=>{a=R.getFramebufferAttachmentParameter(a,b,c);if(a instanceof WebGLRenderbuffer||a instanceof WebGLTexture)a=a.name|0;E[e>>2]=a},Gb:nd,Fb:(a,b,c,e)=>{a=R.getProgramInfoLog(Nc[a]);null===a&&(a="(unknown error)");b=0<b&&e?ra(a,e,b):0;c&&(E[c>>2]=b)},Eb:(a,b,c)=>{if(c)if(a>=Lc)U||=1281;else if(a=Nc[a],35716==b)a=R.getProgramInfoLog(a),null===a&&(a="(unknown error)"),E[c>>2]=a.length+1;else if(35719==b){if(!a.Ae){var e=
R.getProgramParameter(a,35718);for(b=0;b<e;++b)a.Ae=Math.max(a.Ae,R.getActiveUniform(a,b).name.length+1)}E[c>>2]=a.Ae}else if(35722==b){if(!a.ye)for(e=R.getProgramParameter(a,35721),b=0;b<e;++b)a.ye=Math.max(a.ye,R.getActiveAttrib(a,b).name.length+1);E[c>>2]=a.ye}else if(35381==b){if(!a.ze)for(e=R.getProgramParameter(a,35382),b=0;b<e;++b)a.ze=Math.max(a.ze,R.getActiveUniformBlockName(a,b).length+1);E[c>>2]=a.ze}else E[c>>2]=R.getProgramParameter(a,b);else U||=1281},Db:od,Cb:od,Bb:(a,b,c)=>{if(c){a=
R.getQueryParameter(Sc[a],b);var e;"boolean"==typeof a?e=a?1:0:e=a;E[c>>2]=e}else U||=1281},Ab:(a,b,c)=>{if(c){a=R.ge.getQueryObjectEXT(Sc[a],b);var e;"boolean"==typeof a?e=a?1:0:e=a;E[c>>2]=e}else U||=1281},zb:(a,b,c)=>{c?E[c>>2]=R.getQuery(a,b):U||=1281},yb:(a,b,c)=>{c?E[c>>2]=R.ge.getQueryEXT(a,b):U||=1281},xb:(a,b,c)=>{c?E[c>>2]=R.getRenderbufferParameter(a,b):U||=1281},wb:(a,b,c,e)=>{a=R.getShaderInfoLog(Qc[a]);null===a&&(a="(unknown error)");b=0<b&&e?ra(a,e,b):0;c&&(E[c>>2]=b)},vb:(a,b,c,e)=>
{a=R.getShaderPrecisionFormat(a,b);E[c>>2]=a.rangeMin;E[c+4>>2]=a.rangeMax;E[e>>2]=a.precision},ub:(a,b,c)=>{c?35716==b?(a=R.getShaderInfoLog(Qc[a]),null===a&&(a="(unknown error)"),E[c>>2]=a?a.length+1:0):35720==b?(a=R.getShaderSource(Qc[a]),E[c>>2]=a?a.length+1:0):E[c>>2]=R.getShaderParameter(Qc[a],b):U||=1281},tb:rd,sb:sd,rb:(a,b)=>{b=b?db(B,b):"";if(a=Nc[a]){var c=a,e=c.re,f=c.Oe,k;if(!e){c.re=e={};c.Ne={};var n=R.getProgramParameter(c,35718);for(k=0;k<n;++k){var l=R.getActiveUniform(c,k);var q=
l.name;l=l.size;var v=td(q);v=0<v?q.slice(0,v):q;var w=c.Ge;c.Ge+=l;f[v]=[l,w];for(q=0;q<l;++q)e[w]=q,c.Ne[w++]=v}}c=a.re;e=0;f=b;k=td(b);0<k&&(e=parseInt(b.slice(k+1))>>>0,f=b.slice(0,k));if((f=a.Oe[f])&&e<f[0]&&(e+=f[1],c[e]=c[e]||R.getUniformLocation(a,b)))return e}else U||=1281;return-1},qb:(a,b,c)=>{for(var e=jd[b],f=0;f<b;f++)e[f]=E[c+4*f>>2];R.invalidateFramebuffer(a,e)},pb:(a,b,c,e,f,k,n)=>{for(var l=jd[b],q=0;q<b;q++)l[q]=E[c+4*q>>2];R.invalidateSubFramebuffer(a,l,e,f,k,n)},ob:a=>R.isSync(Uc[a]),
nb:a=>(a=ka[a])?R.isTexture(a):0,mb:a=>R.lineWidth(a),lb:a=>{a=Nc[a];R.linkProgram(a);a.re=0;a.Oe={}},kb:(a,b,c,e,f,k)=>{R.Le.multiDrawArraysInstancedBaseInstanceWEBGL(a,E,b>>2,E,c>>2,E,e>>2,H,f>>2,k)},jb:(a,b,c,e,f,k,n,l)=>{R.Le.multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL(a,E,b>>2,c,E,e>>2,E,f>>2,E,k>>2,H,n>>2,l)},ib:(a,b)=>{3317==a?Yc=b:3314==a&&(Zc=b);R.pixelStorei(a,b)},hb:(a,b)=>{R.ge.queryCounterEXT(Sc[a],b)},gb:a=>R.readBuffer(a),fb:(a,b,c,e,f,k,n)=>{if(2<=z.version)if(R.Ce)R.readPixels(a,
b,c,e,f,k,n);else{var l=ud(k);n>>>=31-Math.clz32(l.BYTES_PER_ELEMENT);R.readPixels(a,b,c,e,f,k,l,n)}else(l=vd(k,f,c,e,n))?R.readPixels(a,b,c,e,f,k,l):U||=1280},eb:(a,b,c,e)=>R.renderbufferStorage(a,b,c,e),db:(a,b,c,e,f)=>R.renderbufferStorageMultisample(a,b,c,e,f),cb:(a,b,c)=>{R.samplerParameterf(Tc[a],b,c)},bb:(a,b,c)=>{R.samplerParameteri(Tc[a],b,c)},ab:(a,b,c)=>{R.samplerParameteri(Tc[a],b,E[c>>2])},$a:(a,b,c,e)=>R.scissor(a,b,c,e),_a:(a,b,c,e)=>{for(var f="",k=0;k<b;++k){var n=(n=H[c+4*k>>2])?
db(B,n,e?H[e+4*k>>2]:void 0):"";f+=n}R.shaderSource(Qc[a],f)},Za:(a,b,c)=>R.stencilFunc(a,b,c),Ya:(a,b,c,e)=>R.stencilFuncSeparate(a,b,c,e),Xa:a=>R.stencilMask(a),Wa:(a,b)=>R.stencilMaskSeparate(a,b),Va:(a,b,c)=>R.stencilOp(a,b,c),Ua:(a,b,c,e)=>R.stencilOpSeparate(a,b,c,e),Ta:(a,b,c,e,f,k,n,l,q)=>{if(2<=z.version){if(R.le){R.texImage2D(a,b,c,e,f,k,n,l,q);return}if(q){var v=ud(l);q>>>=31-Math.clz32(v.BYTES_PER_ELEMENT);R.texImage2D(a,b,c,e,f,k,n,l,v,q);return}}v=q?vd(l,n,e,f,q):null;R.texImage2D(a,
b,c,e,f,k,n,l,v)},Sa:(a,b,c)=>R.texParameterf(a,b,c),Ra:(a,b,c)=>{R.texParameterf(a,b,J[c>>2])},Qa:(a,b,c)=>R.texParameteri(a,b,c),Pa:(a,b,c)=>{R.texParameteri(a,b,E[c>>2])},Oa:(a,b,c,e,f)=>R.texStorage2D(a,b,c,e,f),Na:(a,b,c,e,f,k,n,l,q)=>{if(2<=z.version){if(R.le){R.texSubImage2D(a,b,c,e,f,k,n,l,q);return}if(q){var v=ud(l);R.texSubImage2D(a,b,c,e,f,k,n,l,v,q>>>31-Math.clz32(v.BYTES_PER_ELEMENT));return}}q=q?vd(l,n,f,k,q):null;R.texSubImage2D(a,b,c,e,f,k,n,l,q)},Ma:(a,b)=>{R.uniform1f(Y(a),b)},La:(a,
b,c)=>{if(2<=z.version)b&&R.uniform1fv(Y(a),J,c>>2,b);else{if(288>=b)for(var e=wd[b],f=0;f<b;++f)e[f]=J[c+4*f>>2];else e=J.subarray(c>>2,c+4*b>>2);R.uniform1fv(Y(a),e)}},Ka:(a,b)=>{R.uniform1i(Y(a),b)},Ja:(a,b,c)=>{if(2<=z.version)b&&R.uniform1iv(Y(a),E,c>>2,b);else{if(288>=b)for(var e=xd[b],f=0;f<b;++f)e[f]=E[c+4*f>>2];else e=E.subarray(c>>2,c+4*b>>2);R.uniform1iv(Y(a),e)}},Ia:(a,b,c)=>{R.uniform2f(Y(a),b,c)},Ha:(a,b,c)=>{if(2<=z.version)b&&R.uniform2fv(Y(a),J,c>>2,2*b);else{if(144>=b){b*=2;for(var e=
wd[b],f=0;f<b;f+=2)e[f]=J[c+4*f>>2],e[f+1]=J[c+(4*f+4)>>2]}else e=J.subarray(c>>2,c+8*b>>2);R.uniform2fv(Y(a),e)}},Ga:(a,b,c)=>{R.uniform2i(Y(a),b,c)},Fa:(a,b,c)=>{if(2<=z.version)b&&R.uniform2iv(Y(a),E,c>>2,2*b);else{if(144>=b){b*=2;for(var e=xd[b],f=0;f<b;f+=2)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2]}else e=E.subarray(c>>2,c+8*b>>2);R.uniform2iv(Y(a),e)}},Ea:(a,b,c,e)=>{R.uniform3f(Y(a),b,c,e)},Da:(a,b,c)=>{if(2<=z.version)b&&R.uniform3fv(Y(a),J,c>>2,3*b);else{if(96>=b){b*=3;for(var e=wd[b],f=0;f<
b;f+=3)e[f]=J[c+4*f>>2],e[f+1]=J[c+(4*f+4)>>2],e[f+2]=J[c+(4*f+8)>>2]}else e=J.subarray(c>>2,c+12*b>>2);R.uniform3fv(Y(a),e)}},Ca:(a,b,c,e)=>{R.uniform3i(Y(a),b,c,e)},Ba:(a,b,c)=>{if(2<=z.version)b&&R.uniform3iv(Y(a),E,c>>2,3*b);else{if(96>=b){b*=3;for(var e=xd[b],f=0;f<b;f+=3)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2],e[f+2]=E[c+(4*f+8)>>2]}else e=E.subarray(c>>2,c+12*b>>2);R.uniform3iv(Y(a),e)}},Aa:(a,b,c,e,f)=>{R.uniform4f(Y(a),b,c,e,f)},za:(a,b,c)=>{if(2<=z.version)b&&R.uniform4fv(Y(a),J,c>>2,4*
b);else{if(72>=b){var e=wd[4*b],f=J;c>>=2;b*=4;for(var k=0;k<b;k+=4){var n=c+k;e[k]=f[n];e[k+1]=f[n+1];e[k+2]=f[n+2];e[k+3]=f[n+3]}}else e=J.subarray(c>>2,c+16*b>>2);R.uniform4fv(Y(a),e)}},ya:(a,b,c,e,f)=>{R.uniform4i(Y(a),b,c,e,f)},xa:(a,b,c)=>{if(2<=z.version)b&&R.uniform4iv(Y(a),E,c>>2,4*b);else{if(72>=b){b*=4;for(var e=xd[b],f=0;f<b;f+=4)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2],e[f+2]=E[c+(4*f+8)>>2],e[f+3]=E[c+(4*f+12)>>2]}else e=E.subarray(c>>2,c+16*b>>2);R.uniform4iv(Y(a),e)}},wa:(a,b,c,e)=>
{if(2<=z.version)b&&R.uniformMatrix2fv(Y(a),!!c,J,e>>2,4*b);else{if(72>=b){b*=4;for(var f=wd[b],k=0;k<b;k+=4)f[k]=J[e+4*k>>2],f[k+1]=J[e+(4*k+4)>>2],f[k+2]=J[e+(4*k+8)>>2],f[k+3]=J[e+(4*k+12)>>2]}else f=J.subarray(e>>2,e+16*b>>2);R.uniformMatrix2fv(Y(a),!!c,f)}},va:(a,b,c,e)=>{if(2<=z.version)b&&R.uniformMatrix3fv(Y(a),!!c,J,e>>2,9*b);else{if(32>=b){b*=9;for(var f=wd[b],k=0;k<b;k+=9)f[k]=J[e+4*k>>2],f[k+1]=J[e+(4*k+4)>>2],f[k+2]=J[e+(4*k+8)>>2],f[k+3]=J[e+(4*k+12)>>2],f[k+4]=J[e+(4*k+16)>>2],f[k+
5]=J[e+(4*k+20)>>2],f[k+6]=J[e+(4*k+24)>>2],f[k+7]=J[e+(4*k+28)>>2],f[k+8]=J[e+(4*k+32)>>2]}else f=J.subarray(e>>2,e+36*b>>2);R.uniformMatrix3fv(Y(a),!!c,f)}},ua:(a,b,c,e)=>{if(2<=z.version)b&&R.uniformMatrix4fv(Y(a),!!c,J,e>>2,16*b);else{if(18>=b){var f=wd[16*b],k=J;e>>=2;b*=16;for(var n=0;n<b;n+=16){var l=e+n;f[n]=k[l];f[n+1]=k[l+1];f[n+2]=k[l+2];f[n+3]=k[l+3];f[n+4]=k[l+4];f[n+5]=k[l+5];f[n+6]=k[l+6];f[n+7]=k[l+7];f[n+8]=k[l+8];f[n+9]=k[l+9];f[n+10]=k[l+10];f[n+11]=k[l+11];f[n+12]=k[l+12];f[n+
13]=k[l+13];f[n+14]=k[l+14];f[n+15]=k[l+15]}}else f=J.subarray(e>>2,e+64*b>>2);R.uniformMatrix4fv(Y(a),!!c,f)}},ta:a=>{a=Nc[a];R.useProgram(a);R.We=a},sa:(a,b)=>R.vertexAttrib1f(a,b),ra:(a,b)=>{R.vertexAttrib2f(a,J[b>>2],J[b+4>>2])},qa:(a,b)=>{R.vertexAttrib3f(a,J[b>>2],J[b+4>>2],J[b+8>>2])},pa:(a,b)=>{R.vertexAttrib4f(a,J[b>>2],J[b+4>>2],J[b+8>>2],J[b+12>>2])},oa:(a,b)=>{R.vertexAttribDivisor(a,b)},na:(a,b,c,e,f)=>{R.vertexAttribIPointer(a,b,c,e,f)},ma:(a,b,c,e,f,k)=>{R.vertexAttribPointer(a,b,c,
!!e,f,k)},la:(a,b,c,e)=>R.viewport(a,b,c,e),ka:(a,b,c,e)=>{R.waitSync(Uc[a],b,(c>>>0)+4294967296*e)},ja:a=>{var b=B.length;a>>>=0;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var e=b*(1+1/c);e=Math.min(e,a+100663296);a:{e=(Math.min(2147483648,65536*Math.ceil(Math.max(a,e)/65536))-za.buffer.byteLength+65535)/65536|0;try{za.grow(e);Ha();var f=1;break a}catch(k){}f=void 0}if(f)return!0}return!1},ia:()=>z?z.handle:0,pd:(a,b)=>{var c=0;Ad().forEach((e,f)=>{var k=b+c;f=H[a+4*f>>2]=k;for(k=0;k<e.length;++k)Ca[f++]=
e.charCodeAt(k);Ca[f]=0;c+=e.length+1});return 0},od:(a,b)=>{var c=Ad();H[a>>2]=c.length;var e=0;c.forEach(f=>e+=f.length+1);H[b>>2]=e;return 0},ha:a=>{Xa||(Ba=!0);throw new Va(a);},T:()=>52,Z:function(){return 52},nd:()=>52,Y:function(){return 70},S:(a,b,c,e)=>{for(var f=0,k=0;k<c;k++){var n=H[b>>2],l=H[b+4>>2];b+=8;for(var q=0;q<l;q++){var v=B[n+q],w=Bd[a];0===v||10===v?((1===a?xa:ya)(db(w)),w.length=0):w.push(v)}f+=l}H[e>>2]=f;return 0},ga:cd,fa:ed,ea:fd,da:gd,J:nd,P:rd,ca:sd,j:Hd,v:Id,m:Jd,I:Kd,
ba:Ld,O:Md,N:Nd,s:Od,x:Pd,r:Qd,u:Rd,aa:Sd,$:Td,_:Ud},Z=function(){function a(c){Z=c.exports;za=Z.vd;Ha();N=Z.yd;Ja.unshift(Z.wd);La--;0==La&&(null!==Na&&(clearInterval(Na),Na=null),Oa&&(c=Oa,Oa=null,c()));return Z}var b={a:Vd};La++;if(r.instantiateWasm)try{return r.instantiateWasm(b,a)}catch(c){ya(`Module.instantiateWasm callback failed with error: ${c}`),ca(c)}Ra??=r.locateFile?Qa("canvaskit.wasm")?"canvaskit.wasm":ta+"canvaskit.wasm":(new URL("canvaskit.wasm",import.meta.url)).href;Ua(b,
function(c){a(c.instance)}).catch(ca);return{}}(),bc=a=>(bc=Z.xd)(a),pd=r._malloc=a=>(pd=r._malloc=Z.zd)(a),cc=r._free=a=>(cc=r._free=Z.Ad)(a),Wd=(a,b)=>(Wd=Z.Bd)(a,b),Xd=a=>(Xd=Z.Cd)(a),Yd=()=>(Yd=Z.Dd)();r.dynCall_viji=(a,b,c,e,f)=>(r.dynCall_viji=Z.Ed)(a,b,c,e,f);r.dynCall_vijiii=(a,b,c,e,f,k,n)=>(r.dynCall_vijiii=Z.Fd)(a,b,c,e,f,k,n);r.dynCall_viiiiij=(a,b,c,e,f,k,n,l)=>(r.dynCall_viiiiij=Z.Gd)(a,b,c,e,f,k,n,l);r.dynCall_jii=(a,b,c)=>(r.dynCall_jii=Z.Hd)(a,b,c);
r.dynCall_vij=(a,b,c,e)=>(r.dynCall_vij=Z.Id)(a,b,c,e);r.dynCall_jiiiiii=(a,b,c,e,f,k,n)=>(r.dynCall_jiiiiii=Z.Jd)(a,b,c,e,f,k,n);r.dynCall_jiiiiji=(a,b,c,e,f,k,n,l)=>(r.dynCall_jiiiiji=Z.Kd)(a,b,c,e,f,k,n,l);r.dynCall_ji=(a,b)=>(r.dynCall_ji=Z.Ld)(a,b);r.dynCall_iijj=(a,b,c,e,f,k)=>(r.dynCall_iijj=Z.Md)(a,b,c,e,f,k);r.dynCall_jiji=(a,b,c,e,f)=>(r.dynCall_jiji=Z.Nd)(a,b,c,e,f);r.dynCall_viijii=(a,b,c,e,f,k,n)=>(r.dynCall_viijii=Z.Od)(a,b,c,e,f,k,n);
r.dynCall_iiiiij=(a,b,c,e,f,k,n)=>(r.dynCall_iiiiij=Z.Pd)(a,b,c,e,f,k,n);r.dynCall_iiiiijj=(a,b,c,e,f,k,n,l,q)=>(r.dynCall_iiiiijj=Z.Qd)(a,b,c,e,f,k,n,l,q);r.dynCall_iiiiiijj=(a,b,c,e,f,k,n,l,q,v)=>(r.dynCall_iiiiiijj=Z.Rd)(a,b,c,e,f,k,n,l,q,v);function Rd(a,b,c,e,f){var k=Yd();try{N.get(a)(b,c,e,f)}catch(n){Xd(k);if(n!==n+0)throw n;Wd(1,0)}}function Id(a,b,c){var e=Yd();try{return N.get(a)(b,c)}catch(f){Xd(e);if(f!==f+0)throw f;Wd(1,0)}}
function Pd(a,b,c){var e=Yd();try{N.get(a)(b,c)}catch(f){Xd(e);if(f!==f+0)throw f;Wd(1,0)}}function Hd(a,b){var c=Yd();try{return N.get(a)(b)}catch(e){Xd(c);if(e!==e+0)throw e;Wd(1,0)}}function Od(a,b){var c=Yd();try{N.get(a)(b)}catch(e){Xd(c);if(e!==e+0)throw e;Wd(1,0)}}function Jd(a,b,c,e){var f=Yd();try{return N.get(a)(b,c,e)}catch(k){Xd(f);if(k!==k+0)throw k;Wd(1,0)}}function Ud(a,b,c,e,f,k,n,l,q,v){var w=Yd();try{N.get(a)(b,c,e,f,k,n,l,q,v)}catch(A){Xd(w);if(A!==A+0)throw A;Wd(1,0)}}
function Qd(a,b,c,e){var f=Yd();try{N.get(a)(b,c,e)}catch(k){Xd(f);if(k!==k+0)throw k;Wd(1,0)}}function Td(a,b,c,e,f,k,n){var l=Yd();try{N.get(a)(b,c,e,f,k,n)}catch(q){Xd(l);if(q!==q+0)throw q;Wd(1,0)}}function Md(a,b,c,e,f,k,n,l){var q=Yd();try{return N.get(a)(b,c,e,f,k,n,l)}catch(v){Xd(q);if(v!==v+0)throw v;Wd(1,0)}}function Sd(a,b,c,e,f,k){var n=Yd();try{N.get(a)(b,c,e,f,k)}catch(l){Xd(n);if(l!==l+0)throw l;Wd(1,0)}}
function Kd(a,b,c,e,f){var k=Yd();try{return N.get(a)(b,c,e,f)}catch(n){Xd(k);if(n!==n+0)throw n;Wd(1,0)}}function Nd(a,b,c,e,f,k,n,l,q,v){var w=Yd();try{return N.get(a)(b,c,e,f,k,n,l,q,v)}catch(A){Xd(w);if(A!==A+0)throw A;Wd(1,0)}}function Ld(a,b,c,e,f,k,n){var l=Yd();try{return N.get(a)(b,c,e,f,k,n)}catch(q){Xd(l);if(q!==q+0)throw q;Wd(1,0)}}var Zd,$d;Oa=function ae(){Zd||be();Zd||(Oa=ae)};
function be(){if(!(0<La)){if(!$d&&($d=1,Wa(Ia),0<La))return;Zd||(Zd=1,r.calledRun=1,Ba||(Wa(Ja),ba(r),r.onRuntimeInitialized?.(),Wa(Ka)))}}be();moduleRtn=da;
return moduleRtn;
}
);
})();
export default CanvasKitInit;

File diff suppressed because one or more lines are too long

Binary file not shown.

137
web/canvaskit/skwasm.js Normal file
View File

@ -0,0 +1,137 @@
var skwasm = (() => {
var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;
return (
function(moduleArg = {}) {
var moduleRtn;
function e(){g.buffer!=k.buffer&&n();return k}function q(){g.buffer!=k.buffer&&n();return aa}function r(){g.buffer!=k.buffer&&n();return ba}function t(){g.buffer!=k.buffer&&n();return ca}function u(){g.buffer!=k.buffer&&n();return da}var w=moduleArg,ea,fa,ha=new Promise((a,b)=>{ea=a;fa=b}),ia="object"==typeof window,ja="function"==typeof importScripts,ka=w.$ww,la=Object.assign({},w),x="";function ma(a){return w.locateFile?w.locateFile(a,x):x+a}var na,oa;
if(ia||ja)ja?x=self.location.href:"undefined"!=typeof document&&document.currentScript&&(x=document.currentScript.src),_scriptName&&(x=_scriptName),x.startsWith("blob:")?x="":x=x.substr(0,x.replace(/[?#].*/,"").lastIndexOf("/")+1),ja&&(oa=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),na=a=>fetch(a,{credentials:"same-origin"}).then(b=>b.ok?b.arrayBuffer():Promise.reject(Error(b.status+" : "+b.url)));
var pa=console.log.bind(console),y=console.error.bind(console);Object.assign(w,la);la=null;var g,qa,ra=!1,sa,k,aa,ta,ua,ba,ca,da;function n(){var a=g.buffer;k=new Int8Array(a);ta=new Int16Array(a);aa=new Uint8Array(a);ua=new Uint16Array(a);ba=new Int32Array(a);ca=new Uint32Array(a);da=new Float32Array(a);new Float64Array(a)}w.wasmMemory?g=w.wasmMemory:g=new WebAssembly.Memory({initial:256,maximum:32768,shared:!0});n();var va=[],wa=[],xa=[];
function ya(){ka?(za=1,Aa(w.sb,w.sz),removeEventListener("message",Ba),Ca=Ca.forEach(Da),addEventListener("message",Da)):Ea(wa)}var z=0,Fa=null,A=null;function Ga(a){a="Aborted("+a+")";y(a);ra=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");fa(a);throw a;}var Ha=a=>a.startsWith("data:application/octet-stream;base64,"),Ia;
function Ja(a){return na(a).then(b=>new Uint8Array(b),()=>{if(oa)var b=oa(a);else throw"both async and sync fetching of the wasm failed";return b})}function Ka(a,b,c){return Ja(a).then(d=>WebAssembly.instantiate(d,b)).then(c,d=>{y(`failed to asynchronously prepare wasm: ${d}`);Ga(d)})}
function La(a,b){var c=Ia;return"function"!=typeof WebAssembly.instantiateStreaming||Ha(c)||"function"!=typeof fetch?Ka(c,a,b):fetch(c,{credentials:"same-origin"}).then(d=>WebAssembly.instantiateStreaming(d,a).then(b,function(f){y(`wasm streaming compile failed: ${f}`);y("falling back to ArrayBuffer instantiation");return Ka(c,a,b)}))}function Ma(a){this.name="ExitStatus";this.message=`Program terminated with exit(${a})`;this.status=a}
var Ca=[],Na=a=>{if(!(a instanceof Ma||"unwind"==a))throw a;},Oa=0,Pa=a=>{sa=a;za||0<Oa||(ra=!0);throw new Ma(a);},Qa=a=>{if(!ra)try{if(a(),!(za||0<Oa))try{sa=a=sa,Pa(a)}catch(b){Na(b)}}catch(b){Na(b)}},B,Da=a=>{let b=a.data,c=b._wsc;c&&Qa(()=>B.get(c)(...b.x))},Ba=a=>{Ca.push(a)},Ea=a=>{a.forEach(b=>b(w))},za=w.noExitRuntime||!0;class Ra{constructor(a){this.s=a-24}}
var Sa=0,Ta=0,Ua="undefined"!=typeof TextDecoder?new TextDecoder:void 0,Va=(a,b=0,c=NaN)=>{var d=b+c;for(c=b;a[c]&&!(c>=d);)++c;if(16<c-b&&a.buffer&&Ua)return Ua.decode(a.slice(b,c));for(d="";b<c;){var f=a[b++];if(f&128){var h=a[b++]&63;if(192==(f&224))d+=String.fromCharCode((f&31)<<6|h);else{var l=a[b++]&63;f=224==(f&240)?(f&15)<<12|h<<6|l:(f&7)<<18|h<<12|l<<6|a[b++]&63;65536>f?d+=String.fromCharCode(f):(f-=65536,d+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else d+=String.fromCharCode(f)}return d},
Wa=(a,b)=>a?Va(q(),a,b):"",C={},Xa=1,D={},E=(a,b,c)=>{var d=q();if(0<c){var f=b;c=b+c-1;for(var h=0;h<a.length;++h){var l=a.charCodeAt(h);if(55296<=l&&57343>=l){var m=a.charCodeAt(++h);l=65536+((l&1023)<<10)|m&1023}if(127>=l){if(b>=c)break;d[b++]=l}else{if(2047>=l){if(b+1>=c)break;d[b++]=192|l>>6}else{if(65535>=l){if(b+2>=c)break;d[b++]=224|l>>12}else{if(b+3>=c)break;d[b++]=240|l>>18;d[b++]=128|l>>12&63}d[b++]=128|l>>6&63}d[b++]=128|l&63}}d[b]=0;a=b-f}else a=0;return a},F,Ya=a=>{var b=a.getExtension("ANGLE_instanced_arrays");
b&&(a.vertexAttribDivisor=(c,d)=>b.vertexAttribDivisorANGLE(c,d),a.drawArraysInstanced=(c,d,f,h)=>b.drawArraysInstancedANGLE(c,d,f,h),a.drawElementsInstanced=(c,d,f,h,l)=>b.drawElementsInstancedANGLE(c,d,f,h,l))},Za=a=>{var b=a.getExtension("OES_vertex_array_object");b&&(a.createVertexArray=()=>b.createVertexArrayOES(),a.deleteVertexArray=c=>b.deleteVertexArrayOES(c),a.bindVertexArray=c=>b.bindVertexArrayOES(c),a.isVertexArray=c=>b.isVertexArrayOES(c))},$a=a=>{var b=a.getExtension("WEBGL_draw_buffers");
b&&(a.drawBuffers=(c,d)=>b.drawBuffersWEBGL(c,d))},ab=a=>{a.H=a.getExtension("WEBGL_draw_instanced_base_vertex_base_instance")},bb=a=>{a.K=a.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance")},cb=a=>{var b="ANGLE_instanced_arrays EXT_blend_minmax EXT_disjoint_timer_query EXT_frag_depth EXT_shader_texture_lod EXT_sRGB OES_element_index_uint OES_fbo_render_mipmap OES_standard_derivatives OES_texture_float OES_texture_half_float OES_texture_half_float_linear OES_vertex_array_object WEBGL_color_buffer_float WEBGL_depth_texture WEBGL_draw_buffers EXT_color_buffer_float EXT_conservative_depth EXT_disjoint_timer_query_webgl2 EXT_texture_norm16 NV_shader_noperspective_interpolation WEBGL_clip_cull_distance EXT_clip_control EXT_color_buffer_half_float EXT_depth_clamp EXT_float_blend EXT_polygon_offset_clamp EXT_texture_compression_bptc EXT_texture_compression_rgtc EXT_texture_filter_anisotropic KHR_parallel_shader_compile OES_texture_float_linear WEBGL_blend_func_extended WEBGL_compressed_texture_astc WEBGL_compressed_texture_etc WEBGL_compressed_texture_etc1 WEBGL_compressed_texture_s3tc WEBGL_compressed_texture_s3tc_srgb WEBGL_debug_renderer_info WEBGL_debug_shaders WEBGL_lose_context WEBGL_multi_draw WEBGL_polygon_mode".split(" ");
return(a.getSupportedExtensions()||[]).filter(c=>b.includes(c))},db=1,eb=[],G=[],fb=[],gb=[],H=[],I=[],hb=[],ib=[],J=[],K=[],L=[],jb={},kb={},lb=4,mb=0,M=a=>{for(var b=db++,c=a.length;c<b;c++)a[c]=null;return b},O=(a,b,c,d)=>{for(var f=0;f<a;f++){var h=F[c](),l=h&&M(d);h?(h.name=l,d[l]=h):N||=1282;r()[b+4*f>>2]=l}},ob=a=>{var b={J:2,alpha:!0,depth:!0,stencil:!0,antialias:!1,premultipliedAlpha:!0,preserveDrawingBuffer:!1,powerPreference:"default",failIfMajorPerformanceCaveat:!1,I:!0};a.s||(a.s=a.getContext,
a.getContext=function(d,f){f=a.s(d,f);return"webgl"==d==f instanceof WebGLRenderingContext?f:null});var c=1<b.J?a.getContext("webgl2",b):a.getContext("webgl",b);return c?nb(c,b):0},nb=(a,b)=>{var c=M(ib),d={handle:c,attributes:b,version:b.J,v:a};a.canvas&&(a.canvas.Z=d);ib[c]=d;("undefined"==typeof b.I||b.I)&&pb(d);return c},pb=a=>{a||=P;if(!a.S){a.S=!0;var b=a.v;b.T=b.getExtension("WEBGL_multi_draw");b.P=b.getExtension("EXT_polygon_offset_clamp");b.O=b.getExtension("EXT_clip_control");b.Y=b.getExtension("WEBGL_polygon_mode");
Ya(b);Za(b);$a(b);ab(b);bb(b);2<=a.version&&(b.g=b.getExtension("EXT_disjoint_timer_query_webgl2"));if(2>a.version||!b.g)b.g=b.getExtension("EXT_disjoint_timer_query");cb(b).forEach(c=>{c.includes("lose_context")||c.includes("debug")||b.getExtension(c)})}},N,P,qb=a=>{F.bindVertexArray(hb[a])},rb=(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=H[d];f&&(F.deleteTexture(f),f.name=0,H[d]=null)}},sb=(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2];F.deleteVertexArray(hb[d]);hb[d]=null}},tb=[],ub=(a,
b)=>{O(a,b,"createVertexArray",hb)},vb=(a,b)=>{t()[a>>2]=b;var c=t()[a>>2];t()[a+4>>2]=(b-c)/4294967296};function wb(){var a=cb(F);return a=a.concat(a.map(b=>"GL_"+b))}
var xb=(a,b,c)=>{if(b){var d=void 0;switch(a){case 36346:d=1;break;case 36344:0!=c&&1!=c&&(N||=1280);return;case 34814:case 36345:d=0;break;case 34466:var f=F.getParameter(34467);d=f?f.length:0;break;case 33309:if(2>P.version){N||=1282;return}d=wb().length;break;case 33307:case 33308:if(2>P.version){N||=1280;return}d=33307==a?3:0}if(void 0===d)switch(f=F.getParameter(a),typeof f){case "number":d=f;break;case "boolean":d=f?1:0;break;case "string":N||=1280;return;case "object":if(null===f)switch(a){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:d=
0;break;default:N||=1280;return}else{if(f instanceof Float32Array||f instanceof Uint32Array||f instanceof Int32Array||f instanceof Array){for(a=0;a<f.length;++a)switch(c){case 0:r()[b+4*a>>2]=f[a];break;case 2:u()[b+4*a>>2]=f[a];break;case 4:e()[b+a]=f[a]?1:0}return}try{d=f.name|0}catch(h){N||=1280;y(`GL_INVALID_ENUM in glGet${c}v: Unknown object returned from WebGL getParameter(${a})! (error: ${h})`);return}}break;default:N||=1280;y(`GL_INVALID_ENUM in glGet${c}v: Native code calling glGet${c}v(${a}) and it returns ${f} of type ${typeof f}!`);
return}switch(c){case 1:vb(b,d);break;case 0:r()[b>>2]=d;break;case 2:u()[b>>2]=d;break;case 4:e()[b]=d?1:0}}else N||=1281},yb=(a,b)=>xb(a,b,0),zb=(a,b,c)=>{if(c){a=J[a];b=2>P.version?F.g.getQueryObjectEXT(a,b):F.getQueryParameter(a,b);var d;"boolean"==typeof b?d=b?1:0:d=b;vb(c,d)}else N||=1281},Bb=a=>{for(var b=0,c=0;c<a.length;++c){var d=a.charCodeAt(c);127>=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}b+=1;(c=Ab(b))&&E(a,c,b);return c},Cb=a=>{var b=jb[a];if(!b){switch(a){case 7939:b=Bb(wb().join(" "));
break;case 7936:case 7937:case 37445:case 37446:(b=F.getParameter(a))||(N||=1280);b=b?Bb(b):0;break;case 7938:b=F.getParameter(7938);var c=`OpenGL ES 2.0 (${b})`;2<=P.version&&(c=`OpenGL ES 3.0 (${b})`);b=Bb(c);break;case 35724:b=F.getParameter(35724);c=b.match(/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/);null!==c&&(3==c[1].length&&(c[1]+="0"),b=`OpenGL ES GLSL ES ${c[1]} (${b})`);b=Bb(b);break;default:N||=1280}jb[a]=b}return b},Db=(a,b)=>{if(2>P.version)return N||=1282,0;var c=kb[a];if(c)return 0>
b||b>=c.length?(N||=1281,0):c[b];switch(a){case 7939:return c=wb().map(Bb),c=kb[a]=c,0>b||b>=c.length?(N||=1281,0):c[b];default:return N||=1280,0}},Eb=a=>"]"==a.slice(-1)&&a.lastIndexOf("["),Fb=a=>{a-=5120;0==a?a=e():1==a?a=q():2==a?(g.buffer!=k.buffer&&n(),a=ta):4==a?a=r():6==a?a=u():5==a||28922==a||28520==a||30779==a||30782==a?a=t():(g.buffer!=k.buffer&&n(),a=ua);return a},Gb=(a,b,c,d,f)=>{a=Fb(a);b=d*((mb||c)*({5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4}[b-6402]||1)*a.BYTES_PER_ELEMENT+
lb-1&-lb);return a.subarray(f>>>31-Math.clz32(a.BYTES_PER_ELEMENT),f+b>>>31-Math.clz32(a.BYTES_PER_ELEMENT))},Q=a=>{var b=F.N;if(b){var c=b.u[a];"number"==typeof c&&(b.u[a]=c=F.getUniformLocation(b,b.L[a]+(0<c?`[${c}]`:"")));return c}N||=1282},R=[],Hb=[],Ib={},Kb=()=>{if(!Jb){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"},b;for(b in Ib)void 0===
Ib[b]?delete a[b]:a[b]=Ib[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);Jb=c}return Jb},Jb,Lb=[null,[],[]];function Mb(){}function Nb(){}function Ob(){}function Pb(){}function Qb(){}function Rb(){}function Sb(){}function Tb(){}function Ub(){}function Vb(){}function Wb(){}function Xb(){}function Yb(){}function Zb(){}function $b(){}function S(){}function ac(){}var U,bc=[],dc=a=>cc(a);w.stackAlloc=dc;ka&&(C[0]=this,addEventListener("message",Ba));for(var V=0;32>V;++V)tb.push(Array(V));var ec=new Float32Array(288);
for(V=0;288>=V;++V)R[V]=ec.subarray(0,V);var fc=new Int32Array(288);for(V=0;288>=V;++V)Hb[V]=fc.subarray(0,V);
(function(){if(w.skwasmSingleThreaded){Xb=function(){return!0};let c;Nb=function(d,f){c=f};Ob=function(){return performance.now()};S=function(d){queueMicrotask(()=>c(d))}}else{Xb=function(){return!1};let c=0;Nb=function(d,f){function h({data:l}){const m=l.h;m&&("syncTimeOrigin"==m?c=performance.timeOrigin-l.timeOrigin:f(l))}d?(C[d].addEventListener("message",h),C[d].postMessage({h:"syncTimeOrigin",timeOrigin:performance.timeOrigin})):addEventListener("message",h)};Ob=function(){return performance.now()+
c};S=function(d,f,h){h?C[h].postMessage(d,{transfer:f}):postMessage(d,{transfer:f})}}const a=new Map,b=new Map;ac=function(c,d,f){S({h:"setAssociatedObject",F:d,object:f},[f],c)};Wb=function(c){return b.get(c)};Pb=function(c){Nb(c,function(d){var f=d.h;if(f)switch(f){case "renderPictures":gc(d.l,d.V,d.U,d.m,Ob());break;case "onRenderComplete":hc(d.l,d.m,{imageBitmaps:d.R,rasterStartMilliseconds:d.X,rasterEndMilliseconds:d.W});break;case "setAssociatedObject":b.set(d.F,d.object);break;case "disposeAssociatedObject":d=
d.F;f=b.get(d);f.close&&f.close();b.delete(d);break;case "disposeSurface":ic(d.l);break;case "rasterizeImage":jc(d.l,d.image,d.format,d.m);break;case "onRasterizeComplete":kc(d.l,d.data,d.m);break;default:console.warn(`unrecognized skwasm message: ${f}`)}})};Ub=function(c,d,f,h,l){S({h:"renderPictures",l:d,V:f,U:h,m:l},[],c)};Rb=function(c,d){c=new OffscreenCanvas(c,d);d=ob(c);a.set(d,c);return d};$b=function(c,d,f){c=a.get(c);c.width=d;c.height=f};Mb=function(c,d){d||=[];c=a.get(c);d.push(c.transferToImageBitmap());
return d};Yb=async function(c,d,f,h){S({h:"onRenderComplete",l:c,m:h,R:d,X:f,W:Ob()},[...d])};Qb=function(c,d,f){const h=P.v,l=h.createTexture();h.bindTexture(h.TEXTURE_2D,l);h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0);h.texImage2D(h.TEXTURE_2D,0,h.RGBA,d,f,0,h.RGBA,h.UNSIGNED_BYTE,c);h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1);h.bindTexture(h.TEXTURE_2D,null);c=M(H);H[c]=l;return c};Vb=function(c,d){S({h:"disposeAssociatedObject",F:d},[],c)};Sb=function(c,d){S({h:"disposeSurface",l:d},
[],c)};Tb=function(c,d,f,h,l){S({h:"rasterizeImage",l:d,image:f,format:h,m:l},[],c)};Zb=function(c,d,f){S({h:"onRasterizeComplete",l:c,data:d,m:f})}})();
var wc={__cxa_throw:(a,b,c)=>{var d=new Ra(a);t()[d.s+16>>2]=0;t()[d.s+4>>2]=b;t()[d.s+8>>2]=c;Sa=a;Ta++;throw Sa;},__syscall_fcntl64:function(){return 0},__syscall_fstat64:()=>{},__syscall_ioctl:function(){return 0},__syscall_openat:function(){},_abort_js:()=>{Ga("")},_emscripten_create_wasm_worker:(a,b)=>{let c=C[Xa]=new Worker(ma("skwasm.ww.js"));c.postMessage({$ww:Xa,wasm:qa,js:w.mainScriptUrlOrBlob||_scriptName,wasmMemory:g,sb:a,sz:b});c.onmessage=Da;return Xa++},_emscripten_get_now_is_monotonic:()=>
1,_emscripten_runtime_keepalive_clear:()=>{za=!1;Oa=0},_emscripten_throw_longjmp:()=>{throw Infinity;},_mmap_js:function(){return-52},_munmap_js:function(){},_setitimer_js:(a,b)=>{D[a]&&(clearTimeout(D[a].id),delete D[a]);if(!b)return 0;var c=setTimeout(()=>{delete D[a];Qa(()=>lc(a,performance.now()))},b);D[a]={id:c,aa:b};return 0},_tzset_js:(a,b,c,d)=>{var f=(new Date).getFullYear(),h=(new Date(f,0,1)).getTimezoneOffset();f=(new Date(f,6,1)).getTimezoneOffset();var l=Math.max(h,f);t()[a>>2]=60*l;
r()[b>>2]=Number(h!=f);b=m=>{var p=Math.abs(m);return`UTC${0<=m?"-":"+"}${String(Math.floor(p/60)).padStart(2,"0")}${String(p%60).padStart(2,"0")}`};a=b(h);b=b(f);f<h?(E(a,c,17),E(b,d,17)):(E(a,d,17),E(b,c,17))},emscripten_get_now:()=>performance.now(),emscripten_glActiveTexture:a=>F.activeTexture(a),emscripten_glAttachShader:(a,b)=>{F.attachShader(G[a],I[b])},emscripten_glBeginQuery:(a,b)=>{F.beginQuery(a,J[b])},emscripten_glBeginQueryEXT:(a,b)=>{F.g.beginQueryEXT(a,J[b])},emscripten_glBindAttribLocation:(a,
b,c)=>{F.bindAttribLocation(G[a],b,Wa(c))},emscripten_glBindBuffer:(a,b)=>{35051==a?F.D=b:35052==a&&(F.o=b);F.bindBuffer(a,eb[b])},emscripten_glBindFramebuffer:(a,b)=>{F.bindFramebuffer(a,fb[b])},emscripten_glBindRenderbuffer:(a,b)=>{F.bindRenderbuffer(a,gb[b])},emscripten_glBindSampler:(a,b)=>{F.bindSampler(a,K[b])},emscripten_glBindTexture:(a,b)=>{F.bindTexture(a,H[b])},emscripten_glBindVertexArray:qb,emscripten_glBindVertexArrayOES:qb,emscripten_glBlendColor:(a,b,c,d)=>F.blendColor(a,b,c,d),emscripten_glBlendEquation:a=>
F.blendEquation(a),emscripten_glBlendFunc:(a,b)=>F.blendFunc(a,b),emscripten_glBlitFramebuffer:(a,b,c,d,f,h,l,m,p,v)=>F.blitFramebuffer(a,b,c,d,f,h,l,m,p,v),emscripten_glBufferData:(a,b,c,d)=>{2<=P.version?c&&b?F.bufferData(a,q(),d,c,b):F.bufferData(a,b,d):F.bufferData(a,c?q().subarray(c,c+b):b,d)},emscripten_glBufferSubData:(a,b,c,d)=>{2<=P.version?c&&F.bufferSubData(a,b,q(),d,c):F.bufferSubData(a,b,q().subarray(d,d+c))},emscripten_glCheckFramebufferStatus:a=>F.checkFramebufferStatus(a),emscripten_glClear:a=>
F.clear(a),emscripten_glClearColor:(a,b,c,d)=>F.clearColor(a,b,c,d),emscripten_glClearStencil:a=>F.clearStencil(a),emscripten_glClientWaitSync:(a,b,c,d)=>F.clientWaitSync(L[a],b,(c>>>0)+4294967296*d),emscripten_glColorMask:(a,b,c,d)=>{F.colorMask(!!a,!!b,!!c,!!d)},emscripten_glCompileShader:a=>{F.compileShader(I[a])},emscripten_glCompressedTexImage2D:(a,b,c,d,f,h,l,m)=>{2<=P.version?F.o||!l?F.compressedTexImage2D(a,b,c,d,f,h,l,m):F.compressedTexImage2D(a,b,c,d,f,h,q(),m,l):F.compressedTexImage2D(a,
b,c,d,f,h,q().subarray(m,m+l))},emscripten_glCompressedTexSubImage2D:(a,b,c,d,f,h,l,m,p)=>{2<=P.version?F.o||!m?F.compressedTexSubImage2D(a,b,c,d,f,h,l,m,p):F.compressedTexSubImage2D(a,b,c,d,f,h,l,q(),p,m):F.compressedTexSubImage2D(a,b,c,d,f,h,l,q().subarray(p,p+m))},emscripten_glCopyBufferSubData:(a,b,c,d,f)=>F.copyBufferSubData(a,b,c,d,f),emscripten_glCopyTexSubImage2D:(a,b,c,d,f,h,l,m)=>F.copyTexSubImage2D(a,b,c,d,f,h,l,m),emscripten_glCreateProgram:()=>{var a=M(G),b=F.createProgram();b.name=a;
b.C=b.A=b.B=0;b.G=1;G[a]=b;return a},emscripten_glCreateShader:a=>{var b=M(I);I[b]=F.createShader(a);return b},emscripten_glCullFace:a=>F.cullFace(a),emscripten_glDeleteBuffers:(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=eb[d];f&&(F.deleteBuffer(f),f.name=0,eb[d]=null,d==F.D&&(F.D=0),d==F.o&&(F.o=0))}},emscripten_glDeleteFramebuffers:(a,b)=>{for(var c=0;c<a;++c){var d=r()[b+4*c>>2],f=fb[d];f&&(F.deleteFramebuffer(f),f.name=0,fb[d]=null)}},emscripten_glDeleteProgram:a=>{if(a){var b=G[a];b?(F.deleteProgram(b),
b.name=0,G[a]=null):N||=1281}},emscripten_glDeleteQueries:(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=J[d];f&&(F.deleteQuery(f),J[d]=null)}},emscripten_glDeleteQueriesEXT:(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=J[d];f&&(F.g.deleteQueryEXT(f),J[d]=null)}},emscripten_glDeleteRenderbuffers:(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=gb[d];f&&(F.deleteRenderbuffer(f),f.name=0,gb[d]=null)}},emscripten_glDeleteSamplers:(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=K[d];f&&
(F.deleteSampler(f),f.name=0,K[d]=null)}},emscripten_glDeleteShader:a=>{if(a){var b=I[a];b?(F.deleteShader(b),I[a]=null):N||=1281}},emscripten_glDeleteSync:a=>{if(a){var b=L[a];b?(F.deleteSync(b),b.name=0,L[a]=null):N||=1281}},emscripten_glDeleteTextures:rb,emscripten_glDeleteVertexArrays:sb,emscripten_glDeleteVertexArraysOES:sb,emscripten_glDepthMask:a=>{F.depthMask(!!a)},emscripten_glDisable:a=>F.disable(a),emscripten_glDisableVertexAttribArray:a=>{F.disableVertexAttribArray(a)},emscripten_glDrawArrays:(a,
b,c)=>{F.drawArrays(a,b,c)},emscripten_glDrawArraysInstanced:(a,b,c,d)=>{F.drawArraysInstanced(a,b,c,d)},emscripten_glDrawArraysInstancedBaseInstanceWEBGL:(a,b,c,d,f)=>{F.H.drawArraysInstancedBaseInstanceWEBGL(a,b,c,d,f)},emscripten_glDrawBuffers:(a,b)=>{for(var c=tb[a],d=0;d<a;d++)c[d]=r()[b+4*d>>2];F.drawBuffers(c)},emscripten_glDrawElements:(a,b,c,d)=>{F.drawElements(a,b,c,d)},emscripten_glDrawElementsInstanced:(a,b,c,d,f)=>{F.drawElementsInstanced(a,b,c,d,f)},emscripten_glDrawElementsInstancedBaseVertexBaseInstanceWEBGL:(a,
b,c,d,f,h,l)=>{F.H.drawElementsInstancedBaseVertexBaseInstanceWEBGL(a,b,c,d,f,h,l)},emscripten_glDrawRangeElements:(a,b,c,d,f,h)=>{F.drawElements(a,d,f,h)},emscripten_glEnable:a=>F.enable(a),emscripten_glEnableVertexAttribArray:a=>{F.enableVertexAttribArray(a)},emscripten_glEndQuery:a=>F.endQuery(a),emscripten_glEndQueryEXT:a=>{F.g.endQueryEXT(a)},emscripten_glFenceSync:(a,b)=>(a=F.fenceSync(a,b))?(b=M(L),a.name=b,L[b]=a,b):0,emscripten_glFinish:()=>F.finish(),emscripten_glFlush:()=>F.flush(),emscripten_glFramebufferRenderbuffer:(a,
b,c,d)=>{F.framebufferRenderbuffer(a,b,c,gb[d])},emscripten_glFramebufferTexture2D:(a,b,c,d,f)=>{F.framebufferTexture2D(a,b,c,H[d],f)},emscripten_glFrontFace:a=>F.frontFace(a),emscripten_glGenBuffers:(a,b)=>{O(a,b,"createBuffer",eb)},emscripten_glGenFramebuffers:(a,b)=>{O(a,b,"createFramebuffer",fb)},emscripten_glGenQueries:(a,b)=>{O(a,b,"createQuery",J)},emscripten_glGenQueriesEXT:(a,b)=>{for(var c=0;c<a;c++){var d=F.g.createQueryEXT();if(!d){for(N||=1282;c<a;)r()[b+4*c++>>2]=0;break}var f=M(J);
d.name=f;J[f]=d;r()[b+4*c>>2]=f}},emscripten_glGenRenderbuffers:(a,b)=>{O(a,b,"createRenderbuffer",gb)},emscripten_glGenSamplers:(a,b)=>{O(a,b,"createSampler",K)},emscripten_glGenTextures:(a,b)=>{O(a,b,"createTexture",H)},emscripten_glGenVertexArrays:ub,emscripten_glGenVertexArraysOES:ub,emscripten_glGenerateMipmap:a=>F.generateMipmap(a),emscripten_glGetBufferParameteriv:(a,b,c)=>{c?r()[c>>2]=F.getBufferParameter(a,b):N||=1281},emscripten_glGetError:()=>{var a=F.getError()||N;N=0;return a},emscripten_glGetFloatv:(a,
b)=>xb(a,b,2),emscripten_glGetFramebufferAttachmentParameteriv:(a,b,c,d)=>{a=F.getFramebufferAttachmentParameter(a,b,c);if(a instanceof WebGLRenderbuffer||a instanceof WebGLTexture)a=a.name|0;r()[d>>2]=a},emscripten_glGetIntegerv:yb,emscripten_glGetProgramInfoLog:(a,b,c,d)=>{a=F.getProgramInfoLog(G[a]);null===a&&(a="(unknown error)");b=0<b&&d?E(a,d,b):0;c&&(r()[c>>2]=b)},emscripten_glGetProgramiv:(a,b,c)=>{if(c)if(a>=db)N||=1281;else if(a=G[a],35716==b)a=F.getProgramInfoLog(a),null===a&&(a="(unknown error)"),
r()[c>>2]=a.length+1;else if(35719==b){if(!a.C){var d=F.getProgramParameter(a,35718);for(b=0;b<d;++b)a.C=Math.max(a.C,F.getActiveUniform(a,b).name.length+1)}r()[c>>2]=a.C}else if(35722==b){if(!a.A)for(d=F.getProgramParameter(a,35721),b=0;b<d;++b)a.A=Math.max(a.A,F.getActiveAttrib(a,b).name.length+1);r()[c>>2]=a.A}else if(35381==b){if(!a.B)for(d=F.getProgramParameter(a,35382),b=0;b<d;++b)a.B=Math.max(a.B,F.getActiveUniformBlockName(a,b).length+1);r()[c>>2]=a.B}else r()[c>>2]=F.getProgramParameter(a,
b);else N||=1281},emscripten_glGetQueryObjecti64vEXT:zb,emscripten_glGetQueryObjectui64vEXT:zb,emscripten_glGetQueryObjectuiv:(a,b,c)=>{if(c){a=F.getQueryParameter(J[a],b);var d;"boolean"==typeof a?d=a?1:0:d=a;r()[c>>2]=d}else N||=1281},emscripten_glGetQueryObjectuivEXT:(a,b,c)=>{if(c){a=F.g.getQueryObjectEXT(J[a],b);var d;"boolean"==typeof a?d=a?1:0:d=a;r()[c>>2]=d}else N||=1281},emscripten_glGetQueryiv:(a,b,c)=>{c?r()[c>>2]=F.getQuery(a,b):N||=1281},emscripten_glGetQueryivEXT:(a,b,c)=>{c?r()[c>>
2]=F.g.getQueryEXT(a,b):N||=1281},emscripten_glGetRenderbufferParameteriv:(a,b,c)=>{c?r()[c>>2]=F.getRenderbufferParameter(a,b):N||=1281},emscripten_glGetShaderInfoLog:(a,b,c,d)=>{a=F.getShaderInfoLog(I[a]);null===a&&(a="(unknown error)");b=0<b&&d?E(a,d,b):0;c&&(r()[c>>2]=b)},emscripten_glGetShaderPrecisionFormat:(a,b,c,d)=>{a=F.getShaderPrecisionFormat(a,b);r()[c>>2]=a.rangeMin;r()[c+4>>2]=a.rangeMax;r()[d>>2]=a.precision},emscripten_glGetShaderiv:(a,b,c)=>{c?35716==b?(a=F.getShaderInfoLog(I[a]),
null===a&&(a="(unknown error)"),a=a?a.length+1:0,r()[c>>2]=a):35720==b?(a=(a=F.getShaderSource(I[a]))?a.length+1:0,r()[c>>2]=a):r()[c>>2]=F.getShaderParameter(I[a],b):N||=1281},emscripten_glGetString:Cb,emscripten_glGetStringi:Db,emscripten_glGetUniformLocation:(a,b)=>{b=Wa(b);if(a=G[a]){var c=a,d=c.u,f=c.M,h;if(!d){c.u=d={};c.L={};var l=F.getProgramParameter(c,35718);for(h=0;h<l;++h){var m=F.getActiveUniform(c,h);var p=m.name;m=m.size;var v=Eb(p);v=0<v?p.slice(0,v):p;var T=c.G;c.G+=m;f[v]=[m,T];
for(p=0;p<m;++p)d[T]=p,c.L[T++]=v}}c=a.u;d=0;f=b;h=Eb(b);0<h&&(d=parseInt(b.slice(h+1))>>>0,f=b.slice(0,h));if((f=a.M[f])&&d<f[0]&&(d+=f[1],c[d]=c[d]||F.getUniformLocation(a,b)))return d}else N||=1281;return-1},emscripten_glInvalidateFramebuffer:(a,b,c)=>{for(var d=tb[b],f=0;f<b;f++)d[f]=r()[c+4*f>>2];F.invalidateFramebuffer(a,d)},emscripten_glInvalidateSubFramebuffer:(a,b,c,d,f,h,l)=>{for(var m=tb[b],p=0;p<b;p++)m[p]=r()[c+4*p>>2];F.invalidateSubFramebuffer(a,m,d,f,h,l)},emscripten_glIsSync:a=>F.isSync(L[a]),
emscripten_glIsTexture:a=>(a=H[a])?F.isTexture(a):0,emscripten_glLineWidth:a=>F.lineWidth(a),emscripten_glLinkProgram:a=>{a=G[a];F.linkProgram(a);a.u=0;a.M={}},emscripten_glMultiDrawArraysInstancedBaseInstanceWEBGL:(a,b,c,d,f,h)=>{F.K.multiDrawArraysInstancedBaseInstanceWEBGL(a,r(),b>>2,r(),c>>2,r(),d>>2,t(),f>>2,h)},emscripten_glMultiDrawElementsInstancedBaseVertexBaseInstanceWEBGL:(a,b,c,d,f,h,l,m)=>{F.K.multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL(a,r(),b>>2,c,r(),d>>2,r(),f>>2,r(),h>>
2,t(),l>>2,m)},emscripten_glPixelStorei:(a,b)=>{3317==a?lb=b:3314==a&&(mb=b);F.pixelStorei(a,b)},emscripten_glQueryCounterEXT:(a,b)=>{F.g.queryCounterEXT(J[a],b)},emscripten_glReadBuffer:a=>F.readBuffer(a),emscripten_glReadPixels:(a,b,c,d,f,h,l)=>{if(2<=P.version)if(F.D)F.readPixels(a,b,c,d,f,h,l);else{var m=Fb(h);l>>>=31-Math.clz32(m.BYTES_PER_ELEMENT);F.readPixels(a,b,c,d,f,h,m,l)}else(m=Gb(h,f,c,d,l))?F.readPixels(a,b,c,d,f,h,m):N||=1280},emscripten_glRenderbufferStorage:(a,b,c,d)=>F.renderbufferStorage(a,
b,c,d),emscripten_glRenderbufferStorageMultisample:(a,b,c,d,f)=>F.renderbufferStorageMultisample(a,b,c,d,f),emscripten_glSamplerParameterf:(a,b,c)=>{F.samplerParameterf(K[a],b,c)},emscripten_glSamplerParameteri:(a,b,c)=>{F.samplerParameteri(K[a],b,c)},emscripten_glSamplerParameteriv:(a,b,c)=>{c=r()[c>>2];F.samplerParameteri(K[a],b,c)},emscripten_glScissor:(a,b,c,d)=>F.scissor(a,b,c,d),emscripten_glShaderSource:(a,b,c,d)=>{for(var f="",h=0;h<b;++h){var l=d?t()[d+4*h>>2]:void 0;f+=Wa(t()[c+4*h>>2],
l)}F.shaderSource(I[a],f)},emscripten_glStencilFunc:(a,b,c)=>F.stencilFunc(a,b,c),emscripten_glStencilFuncSeparate:(a,b,c,d)=>F.stencilFuncSeparate(a,b,c,d),emscripten_glStencilMask:a=>F.stencilMask(a),emscripten_glStencilMaskSeparate:(a,b)=>F.stencilMaskSeparate(a,b),emscripten_glStencilOp:(a,b,c)=>F.stencilOp(a,b,c),emscripten_glStencilOpSeparate:(a,b,c,d)=>F.stencilOpSeparate(a,b,c,d),emscripten_glTexImage2D:(a,b,c,d,f,h,l,m,p)=>{if(2<=P.version){if(F.o){F.texImage2D(a,b,c,d,f,h,l,m,p);return}if(p){var v=
Fb(m);p>>>=31-Math.clz32(v.BYTES_PER_ELEMENT);F.texImage2D(a,b,c,d,f,h,l,m,v,p);return}}v=p?Gb(m,l,d,f,p):null;F.texImage2D(a,b,c,d,f,h,l,m,v)},emscripten_glTexParameterf:(a,b,c)=>F.texParameterf(a,b,c),emscripten_glTexParameterfv:(a,b,c)=>{c=u()[c>>2];F.texParameterf(a,b,c)},emscripten_glTexParameteri:(a,b,c)=>F.texParameteri(a,b,c),emscripten_glTexParameteriv:(a,b,c)=>{c=r()[c>>2];F.texParameteri(a,b,c)},emscripten_glTexStorage2D:(a,b,c,d,f)=>F.texStorage2D(a,b,c,d,f),emscripten_glTexSubImage2D:(a,
b,c,d,f,h,l,m,p)=>{if(2<=P.version){if(F.o){F.texSubImage2D(a,b,c,d,f,h,l,m,p);return}if(p){var v=Fb(m);F.texSubImage2D(a,b,c,d,f,h,l,m,v,p>>>31-Math.clz32(v.BYTES_PER_ELEMENT));return}}p=p?Gb(m,l,f,h,p):null;F.texSubImage2D(a,b,c,d,f,h,l,m,p)},emscripten_glUniform1f:(a,b)=>{F.uniform1f(Q(a),b)},emscripten_glUniform1fv:(a,b,c)=>{if(2<=P.version)b&&F.uniform1fv(Q(a),u(),c>>2,b);else{if(288>=b)for(var d=R[b],f=0;f<b;++f)d[f]=u()[c+4*f>>2];else d=u().subarray(c>>2,c+4*b>>2);F.uniform1fv(Q(a),d)}},emscripten_glUniform1i:(a,
b)=>{F.uniform1i(Q(a),b)},emscripten_glUniform1iv:(a,b,c)=>{if(2<=P.version)b&&F.uniform1iv(Q(a),r(),c>>2,b);else{if(288>=b)for(var d=Hb[b],f=0;f<b;++f)d[f]=r()[c+4*f>>2];else d=r().subarray(c>>2,c+4*b>>2);F.uniform1iv(Q(a),d)}},emscripten_glUniform2f:(a,b,c)=>{F.uniform2f(Q(a),b,c)},emscripten_glUniform2fv:(a,b,c)=>{if(2<=P.version)b&&F.uniform2fv(Q(a),u(),c>>2,2*b);else{if(144>=b){b*=2;for(var d=R[b],f=0;f<b;f+=2)d[f]=u()[c+4*f>>2],d[f+1]=u()[c+(4*f+4)>>2]}else d=u().subarray(c>>2,c+8*b>>2);F.uniform2fv(Q(a),
d)}},emscripten_glUniform2i:(a,b,c)=>{F.uniform2i(Q(a),b,c)},emscripten_glUniform2iv:(a,b,c)=>{if(2<=P.version)b&&F.uniform2iv(Q(a),r(),c>>2,2*b);else{if(144>=b){b*=2;for(var d=Hb[b],f=0;f<b;f+=2)d[f]=r()[c+4*f>>2],d[f+1]=r()[c+(4*f+4)>>2]}else d=r().subarray(c>>2,c+8*b>>2);F.uniform2iv(Q(a),d)}},emscripten_glUniform3f:(a,b,c,d)=>{F.uniform3f(Q(a),b,c,d)},emscripten_glUniform3fv:(a,b,c)=>{if(2<=P.version)b&&F.uniform3fv(Q(a),u(),c>>2,3*b);else{if(96>=b){b*=3;for(var d=R[b],f=0;f<b;f+=3)d[f]=u()[c+
4*f>>2],d[f+1]=u()[c+(4*f+4)>>2],d[f+2]=u()[c+(4*f+8)>>2]}else d=u().subarray(c>>2,c+12*b>>2);F.uniform3fv(Q(a),d)}},emscripten_glUniform3i:(a,b,c,d)=>{F.uniform3i(Q(a),b,c,d)},emscripten_glUniform3iv:(a,b,c)=>{if(2<=P.version)b&&F.uniform3iv(Q(a),r(),c>>2,3*b);else{if(96>=b){b*=3;for(var d=Hb[b],f=0;f<b;f+=3)d[f]=r()[c+4*f>>2],d[f+1]=r()[c+(4*f+4)>>2],d[f+2]=r()[c+(4*f+8)>>2]}else d=r().subarray(c>>2,c+12*b>>2);F.uniform3iv(Q(a),d)}},emscripten_glUniform4f:(a,b,c,d,f)=>{F.uniform4f(Q(a),b,c,d,f)},
emscripten_glUniform4fv:(a,b,c)=>{if(2<=P.version)b&&F.uniform4fv(Q(a),u(),c>>2,4*b);else{if(72>=b){var d=R[4*b],f=u();c>>=2;b*=4;for(var h=0;h<b;h+=4){var l=c+h;d[h]=f[l];d[h+1]=f[l+1];d[h+2]=f[l+2];d[h+3]=f[l+3]}}else d=u().subarray(c>>2,c+16*b>>2);F.uniform4fv(Q(a),d)}},emscripten_glUniform4i:(a,b,c,d,f)=>{F.uniform4i(Q(a),b,c,d,f)},emscripten_glUniform4iv:(a,b,c)=>{if(2<=P.version)b&&F.uniform4iv(Q(a),r(),c>>2,4*b);else{if(72>=b){b*=4;for(var d=Hb[b],f=0;f<b;f+=4)d[f]=r()[c+4*f>>2],d[f+1]=r()[c+
(4*f+4)>>2],d[f+2]=r()[c+(4*f+8)>>2],d[f+3]=r()[c+(4*f+12)>>2]}else d=r().subarray(c>>2,c+16*b>>2);F.uniform4iv(Q(a),d)}},emscripten_glUniformMatrix2fv:(a,b,c,d)=>{if(2<=P.version)b&&F.uniformMatrix2fv(Q(a),!!c,u(),d>>2,4*b);else{if(72>=b){b*=4;for(var f=R[b],h=0;h<b;h+=4)f[h]=u()[d+4*h>>2],f[h+1]=u()[d+(4*h+4)>>2],f[h+2]=u()[d+(4*h+8)>>2],f[h+3]=u()[d+(4*h+12)>>2]}else f=u().subarray(d>>2,d+16*b>>2);F.uniformMatrix2fv(Q(a),!!c,f)}},emscripten_glUniformMatrix3fv:(a,b,c,d)=>{if(2<=P.version)b&&F.uniformMatrix3fv(Q(a),
!!c,u(),d>>2,9*b);else{if(32>=b){b*=9;for(var f=R[b],h=0;h<b;h+=9)f[h]=u()[d+4*h>>2],f[h+1]=u()[d+(4*h+4)>>2],f[h+2]=u()[d+(4*h+8)>>2],f[h+3]=u()[d+(4*h+12)>>2],f[h+4]=u()[d+(4*h+16)>>2],f[h+5]=u()[d+(4*h+20)>>2],f[h+6]=u()[d+(4*h+24)>>2],f[h+7]=u()[d+(4*h+28)>>2],f[h+8]=u()[d+(4*h+32)>>2]}else f=u().subarray(d>>2,d+36*b>>2);F.uniformMatrix3fv(Q(a),!!c,f)}},emscripten_glUniformMatrix4fv:(a,b,c,d)=>{if(2<=P.version)b&&F.uniformMatrix4fv(Q(a),!!c,u(),d>>2,16*b);else{if(18>=b){var f=R[16*b],h=u();d>>=
2;b*=16;for(var l=0;l<b;l+=16){var m=d+l;f[l]=h[m];f[l+1]=h[m+1];f[l+2]=h[m+2];f[l+3]=h[m+3];f[l+4]=h[m+4];f[l+5]=h[m+5];f[l+6]=h[m+6];f[l+7]=h[m+7];f[l+8]=h[m+8];f[l+9]=h[m+9];f[l+10]=h[m+10];f[l+11]=h[m+11];f[l+12]=h[m+12];f[l+13]=h[m+13];f[l+14]=h[m+14];f[l+15]=h[m+15]}}else f=u().subarray(d>>2,d+64*b>>2);F.uniformMatrix4fv(Q(a),!!c,f)}},emscripten_glUseProgram:a=>{a=G[a];F.useProgram(a);F.N=a},emscripten_glVertexAttrib1f:(a,b)=>F.vertexAttrib1f(a,b),emscripten_glVertexAttrib2fv:(a,b)=>{F.vertexAttrib2f(a,
u()[b>>2],u()[b+4>>2])},emscripten_glVertexAttrib3fv:(a,b)=>{F.vertexAttrib3f(a,u()[b>>2],u()[b+4>>2],u()[b+8>>2])},emscripten_glVertexAttrib4fv:(a,b)=>{F.vertexAttrib4f(a,u()[b>>2],u()[b+4>>2],u()[b+8>>2],u()[b+12>>2])},emscripten_glVertexAttribDivisor:(a,b)=>{F.vertexAttribDivisor(a,b)},emscripten_glVertexAttribIPointer:(a,b,c,d,f)=>{F.vertexAttribIPointer(a,b,c,d,f)},emscripten_glVertexAttribPointer:(a,b,c,d,f,h)=>{F.vertexAttribPointer(a,b,c,!!d,f,h)},emscripten_glViewport:(a,b,c,d)=>F.viewport(a,
b,c,d),emscripten_glWaitSync:(a,b,c,d)=>{F.waitSync(L[a],b,(c>>>0)+4294967296*d)},emscripten_resize_heap:a=>{var b=q().length;a>>>=0;if(a<=b||2147483648<a)return!1;for(var c=1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,65536*Math.ceil(Math.max(a,d)/65536))-g.buffer.byteLength+65535)/65536|0;try{g.grow(d);n();var f=1;break a}catch(h){}f=void 0}if(f)return!0}return!1},emscripten_wasm_worker_post_function_v:(a,b)=>{C[a].postMessage({_wsc:b,x:[]})},emscripten_webgl_enable_extension:function(a,
b){a=ib[a];b=Wa(b);b.startsWith("GL_")&&(b=b.substr(3));"ANGLE_instanced_arrays"==b&&Ya(F);"OES_vertex_array_object"==b&&Za(F);"WEBGL_draw_buffers"==b&&$a(F);"WEBGL_draw_instanced_base_vertex_base_instance"==b&&ab(F);"WEBGL_multi_draw_instanced_base_vertex_base_instance"==b&&bb(F);"WEBGL_multi_draw"==b&&(F.T=F.getExtension("WEBGL_multi_draw"));"EXT_polygon_offset_clamp"==b&&(F.P=F.getExtension("EXT_polygon_offset_clamp"));"EXT_clip_control"==b&&(F.O=F.getExtension("EXT_clip_control"));"WEBGL_polygon_mode"==
b&&(F.Y=F.getExtension("WEBGL_polygon_mode"));return!!a.v.getExtension(b)},emscripten_webgl_get_current_context:()=>P?P.handle:0,emscripten_webgl_make_context_current:a=>{P=ib[a];w.$=F=P?.v;return!a||F?0:-5},environ_get:(a,b)=>{var c=0;Kb().forEach((d,f)=>{var h=b+c;f=t()[a+4*f>>2]=h;for(h=0;h<d.length;++h)e()[f++]=d.charCodeAt(h);e()[f]=0;c+=d.length+1});return 0},environ_sizes_get:(a,b)=>{var c=Kb();t()[a>>2]=c.length;var d=0;c.forEach(f=>d+=f.length+1);t()[b>>2]=d;return 0},fd_close:()=>52,fd_pread:function(){return 52},
fd_read:()=>52,fd_seek:function(){return 70},fd_write:(a,b,c,d)=>{for(var f=0,h=0;h<c;h++){var l=t()[b>>2],m=t()[b+4>>2];b+=8;for(var p=0;p<m;p++){var v=q()[l+p],T=Lb[a];0===v||10===v?((1===a?pa:y)(Va(T)),T.length=0):T.push(v)}f+=m}t()[d>>2]=f;return 0},glDeleteTextures:rb,glGetIntegerv:yb,glGetString:Cb,glGetStringi:Db,invoke_ii:mc,invoke_iii:nc,invoke_iiii:oc,invoke_iiiii:pc,invoke_iiiiiii:qc,invoke_vi:rc,invoke_vii:sc,invoke_viii:tc,invoke_viiii:uc,invoke_viiiiiii:vc,memory:g,proc_exit:Pa,skwasm_captureImageBitmap:Mb,
skwasm_connectThread:Pb,skwasm_createGlTextureFromTextureSource:Qb,skwasm_createOffscreenCanvas:Rb,skwasm_dispatchDisposeSurface:Sb,skwasm_dispatchRasterizeImage:Tb,skwasm_dispatchRenderPictures:Ub,skwasm_disposeAssociatedObjectOnThread:Vb,skwasm_getAssociatedObject:Wb,skwasm_isSingleThreaded:Xb,skwasm_postImages:Yb,skwasm_postRasterizeResult:Zb,skwasm_resizeCanvas:$b,skwasm_setAssociatedObjectOnThread:ac},W=function(){function a(c,d){W=c.exports;w.wasmExports=W;B=W.__indirect_function_table;wa.unshift(W.__wasm_call_ctors);
qa=d;z--;0==z&&(null!==Fa&&(clearInterval(Fa),Fa=null),A&&(c=A,A=null,c()));return W}var b={env:wc,wasi_snapshot_preview1:wc};z++;if(w.instantiateWasm)try{return w.instantiateWasm(b,a)}catch(c){y(`Module.instantiateWasm callback failed with error: ${c}`),fa(c)}Ia??=Ha("skwasm.wasm")?"skwasm.wasm":ma("skwasm.wasm");La(b,function(c){a(c.instance,c.module)}).catch(fa);return{}}();w._canvas_saveLayer=(a,b,c,d,f)=>(w._canvas_saveLayer=W.canvas_saveLayer)(a,b,c,d,f);w._canvas_save=a=>(w._canvas_save=W.canvas_save)(a);
w._canvas_restore=a=>(w._canvas_restore=W.canvas_restore)(a);w._canvas_restoreToCount=(a,b)=>(w._canvas_restoreToCount=W.canvas_restoreToCount)(a,b);w._canvas_getSaveCount=a=>(w._canvas_getSaveCount=W.canvas_getSaveCount)(a);w._canvas_translate=(a,b,c)=>(w._canvas_translate=W.canvas_translate)(a,b,c);w._canvas_scale=(a,b,c)=>(w._canvas_scale=W.canvas_scale)(a,b,c);w._canvas_rotate=(a,b)=>(w._canvas_rotate=W.canvas_rotate)(a,b);w._canvas_skew=(a,b,c)=>(w._canvas_skew=W.canvas_skew)(a,b,c);
w._canvas_transform=(a,b)=>(w._canvas_transform=W.canvas_transform)(a,b);w._canvas_clipRect=(a,b,c,d)=>(w._canvas_clipRect=W.canvas_clipRect)(a,b,c,d);w._canvas_clipRRect=(a,b,c)=>(w._canvas_clipRRect=W.canvas_clipRRect)(a,b,c);w._canvas_clipPath=(a,b,c)=>(w._canvas_clipPath=W.canvas_clipPath)(a,b,c);w._canvas_drawColor=(a,b,c)=>(w._canvas_drawColor=W.canvas_drawColor)(a,b,c);w._canvas_drawLine=(a,b,c,d,f,h)=>(w._canvas_drawLine=W.canvas_drawLine)(a,b,c,d,f,h);
w._canvas_drawPaint=(a,b)=>(w._canvas_drawPaint=W.canvas_drawPaint)(a,b);w._canvas_drawRect=(a,b,c)=>(w._canvas_drawRect=W.canvas_drawRect)(a,b,c);w._canvas_drawRRect=(a,b,c)=>(w._canvas_drawRRect=W.canvas_drawRRect)(a,b,c);w._canvas_drawDRRect=(a,b,c,d)=>(w._canvas_drawDRRect=W.canvas_drawDRRect)(a,b,c,d);w._canvas_drawOval=(a,b,c)=>(w._canvas_drawOval=W.canvas_drawOval)(a,b,c);w._canvas_drawCircle=(a,b,c,d,f)=>(w._canvas_drawCircle=W.canvas_drawCircle)(a,b,c,d,f);
w._canvas_drawArc=(a,b,c,d,f,h)=>(w._canvas_drawArc=W.canvas_drawArc)(a,b,c,d,f,h);w._canvas_drawPath=(a,b,c)=>(w._canvas_drawPath=W.canvas_drawPath)(a,b,c);w._canvas_drawShadow=(a,b,c,d,f,h)=>(w._canvas_drawShadow=W.canvas_drawShadow)(a,b,c,d,f,h);w._canvas_drawParagraph=(a,b,c,d)=>(w._canvas_drawParagraph=W.canvas_drawParagraph)(a,b,c,d);w._canvas_drawPicture=(a,b)=>(w._canvas_drawPicture=W.canvas_drawPicture)(a,b);
w._canvas_drawImage=(a,b,c,d,f,h)=>(w._canvas_drawImage=W.canvas_drawImage)(a,b,c,d,f,h);w._canvas_drawImageRect=(a,b,c,d,f,h)=>(w._canvas_drawImageRect=W.canvas_drawImageRect)(a,b,c,d,f,h);w._canvas_drawImageNine=(a,b,c,d,f,h)=>(w._canvas_drawImageNine=W.canvas_drawImageNine)(a,b,c,d,f,h);w._canvas_drawVertices=(a,b,c,d)=>(w._canvas_drawVertices=W.canvas_drawVertices)(a,b,c,d);w._canvas_drawPoints=(a,b,c,d,f)=>(w._canvas_drawPoints=W.canvas_drawPoints)(a,b,c,d,f);
w._canvas_drawAtlas=(a,b,c,d,f,h,l,m,p)=>(w._canvas_drawAtlas=W.canvas_drawAtlas)(a,b,c,d,f,h,l,m,p);w._canvas_getTransform=(a,b)=>(w._canvas_getTransform=W.canvas_getTransform)(a,b);w._canvas_getLocalClipBounds=(a,b)=>(w._canvas_getLocalClipBounds=W.canvas_getLocalClipBounds)(a,b);w._canvas_getDeviceClipBounds=(a,b)=>(w._canvas_getDeviceClipBounds=W.canvas_getDeviceClipBounds)(a,b);w._contourMeasureIter_create=(a,b,c)=>(w._contourMeasureIter_create=W.contourMeasureIter_create)(a,b,c);
w._contourMeasureIter_next=a=>(w._contourMeasureIter_next=W.contourMeasureIter_next)(a);w._contourMeasureIter_dispose=a=>(w._contourMeasureIter_dispose=W.contourMeasureIter_dispose)(a);w._contourMeasure_dispose=a=>(w._contourMeasure_dispose=W.contourMeasure_dispose)(a);w._contourMeasure_length=a=>(w._contourMeasure_length=W.contourMeasure_length)(a);w._contourMeasure_isClosed=a=>(w._contourMeasure_isClosed=W.contourMeasure_isClosed)(a);
w._contourMeasure_getPosTan=(a,b,c,d)=>(w._contourMeasure_getPosTan=W.contourMeasure_getPosTan)(a,b,c,d);w._contourMeasure_getSegment=(a,b,c,d)=>(w._contourMeasure_getSegment=W.contourMeasure_getSegment)(a,b,c,d);w._skData_create=a=>(w._skData_create=W.skData_create)(a);w._skData_getPointer=a=>(w._skData_getPointer=W.skData_getPointer)(a);w._skData_getConstPointer=a=>(w._skData_getConstPointer=W.skData_getConstPointer)(a);w._skData_getSize=a=>(w._skData_getSize=W.skData_getSize)(a);
w._skData_dispose=a=>(w._skData_dispose=W.skData_dispose)(a);w._imageFilter_createBlur=(a,b,c)=>(w._imageFilter_createBlur=W.imageFilter_createBlur)(a,b,c);w._imageFilter_createDilate=(a,b)=>(w._imageFilter_createDilate=W.imageFilter_createDilate)(a,b);w._imageFilter_createErode=(a,b)=>(w._imageFilter_createErode=W.imageFilter_createErode)(a,b);w._imageFilter_createMatrix=(a,b)=>(w._imageFilter_createMatrix=W.imageFilter_createMatrix)(a,b);
w._imageFilter_createFromColorFilter=a=>(w._imageFilter_createFromColorFilter=W.imageFilter_createFromColorFilter)(a);w._imageFilter_compose=(a,b)=>(w._imageFilter_compose=W.imageFilter_compose)(a,b);w._imageFilter_dispose=a=>(w._imageFilter_dispose=W.imageFilter_dispose)(a);w._imageFilter_getFilterBounds=(a,b)=>(w._imageFilter_getFilterBounds=W.imageFilter_getFilterBounds)(a,b);w._colorFilter_createMode=(a,b)=>(w._colorFilter_createMode=W.colorFilter_createMode)(a,b);
w._colorFilter_createMatrix=a=>(w._colorFilter_createMatrix=W.colorFilter_createMatrix)(a);w._colorFilter_createSRGBToLinearGamma=()=>(w._colorFilter_createSRGBToLinearGamma=W.colorFilter_createSRGBToLinearGamma)();w._colorFilter_createLinearToSRGBGamma=()=>(w._colorFilter_createLinearToSRGBGamma=W.colorFilter_createLinearToSRGBGamma)();w._colorFilter_compose=(a,b)=>(w._colorFilter_compose=W.colorFilter_compose)(a,b);w._colorFilter_dispose=a=>(w._colorFilter_dispose=W.colorFilter_dispose)(a);
w._maskFilter_createBlur=(a,b)=>(w._maskFilter_createBlur=W.maskFilter_createBlur)(a,b);w._maskFilter_dispose=a=>(w._maskFilter_dispose=W.maskFilter_dispose)(a);w._fontCollection_create=()=>(w._fontCollection_create=W.fontCollection_create)();w._fontCollection_dispose=a=>(w._fontCollection_dispose=W.fontCollection_dispose)(a);w._typeface_create=a=>(w._typeface_create=W.typeface_create)(a);w._typeface_dispose=a=>(w._typeface_dispose=W.typeface_dispose)(a);
w._typefaces_filterCoveredCodePoints=(a,b,c,d)=>(w._typefaces_filterCoveredCodePoints=W.typefaces_filterCoveredCodePoints)(a,b,c,d);w._fontCollection_registerTypeface=(a,b,c)=>(w._fontCollection_registerTypeface=W.fontCollection_registerTypeface)(a,b,c);w._fontCollection_clearCaches=a=>(w._fontCollection_clearCaches=W.fontCollection_clearCaches)(a);w._image_createFromPicture=(a,b,c)=>(w._image_createFromPicture=W.image_createFromPicture)(a,b,c);
w._image_createFromPixels=(a,b,c,d,f)=>(w._image_createFromPixels=W.image_createFromPixels)(a,b,c,d,f);w._image_createFromTextureSource=(a,b,c,d)=>(w._image_createFromTextureSource=W.image_createFromTextureSource)(a,b,c,d);w._image_ref=a=>(w._image_ref=W.image_ref)(a);w._image_dispose=a=>(w._image_dispose=W.image_dispose)(a);w._image_getWidth=a=>(w._image_getWidth=W.image_getWidth)(a);w._image_getHeight=a=>(w._image_getHeight=W.image_getHeight)(a);
w._paint_create=(a,b,c,d,f,h,l,m)=>(w._paint_create=W.paint_create)(a,b,c,d,f,h,l,m);w._paint_dispose=a=>(w._paint_dispose=W.paint_dispose)(a);w._paint_setShader=(a,b)=>(w._paint_setShader=W.paint_setShader)(a,b);w._paint_setImageFilter=(a,b)=>(w._paint_setImageFilter=W.paint_setImageFilter)(a,b);w._paint_setColorFilter=(a,b)=>(w._paint_setColorFilter=W.paint_setColorFilter)(a,b);w._paint_setMaskFilter=(a,b)=>(w._paint_setMaskFilter=W.paint_setMaskFilter)(a,b);w._path_create=()=>(w._path_create=W.path_create)();
w._path_dispose=a=>(w._path_dispose=W.path_dispose)(a);w._path_copy=a=>(w._path_copy=W.path_copy)(a);w._path_setFillType=(a,b)=>(w._path_setFillType=W.path_setFillType)(a,b);w._path_getFillType=a=>(w._path_getFillType=W.path_getFillType)(a);w._path_moveTo=(a,b,c)=>(w._path_moveTo=W.path_moveTo)(a,b,c);w._path_relativeMoveTo=(a,b,c)=>(w._path_relativeMoveTo=W.path_relativeMoveTo)(a,b,c);w._path_lineTo=(a,b,c)=>(w._path_lineTo=W.path_lineTo)(a,b,c);
w._path_relativeLineTo=(a,b,c)=>(w._path_relativeLineTo=W.path_relativeLineTo)(a,b,c);w._path_quadraticBezierTo=(a,b,c,d,f)=>(w._path_quadraticBezierTo=W.path_quadraticBezierTo)(a,b,c,d,f);w._path_relativeQuadraticBezierTo=(a,b,c,d,f)=>(w._path_relativeQuadraticBezierTo=W.path_relativeQuadraticBezierTo)(a,b,c,d,f);w._path_cubicTo=(a,b,c,d,f,h,l)=>(w._path_cubicTo=W.path_cubicTo)(a,b,c,d,f,h,l);w._path_relativeCubicTo=(a,b,c,d,f,h,l)=>(w._path_relativeCubicTo=W.path_relativeCubicTo)(a,b,c,d,f,h,l);
w._path_conicTo=(a,b,c,d,f,h)=>(w._path_conicTo=W.path_conicTo)(a,b,c,d,f,h);w._path_relativeConicTo=(a,b,c,d,f,h)=>(w._path_relativeConicTo=W.path_relativeConicTo)(a,b,c,d,f,h);w._path_arcToOval=(a,b,c,d,f)=>(w._path_arcToOval=W.path_arcToOval)(a,b,c,d,f);w._path_arcToRotated=(a,b,c,d,f,h,l,m)=>(w._path_arcToRotated=W.path_arcToRotated)(a,b,c,d,f,h,l,m);w._path_relativeArcToRotated=(a,b,c,d,f,h,l,m)=>(w._path_relativeArcToRotated=W.path_relativeArcToRotated)(a,b,c,d,f,h,l,m);
w._path_addRect=(a,b)=>(w._path_addRect=W.path_addRect)(a,b);w._path_addOval=(a,b)=>(w._path_addOval=W.path_addOval)(a,b);w._path_addArc=(a,b,c,d)=>(w._path_addArc=W.path_addArc)(a,b,c,d);w._path_addPolygon=(a,b,c,d)=>(w._path_addPolygon=W.path_addPolygon)(a,b,c,d);w._path_addRRect=(a,b)=>(w._path_addRRect=W.path_addRRect)(a,b);w._path_addPath=(a,b,c,d)=>(w._path_addPath=W.path_addPath)(a,b,c,d);w._path_close=a=>(w._path_close=W.path_close)(a);w._path_reset=a=>(w._path_reset=W.path_reset)(a);
w._path_contains=(a,b,c)=>(w._path_contains=W.path_contains)(a,b,c);w._path_transform=(a,b)=>(w._path_transform=W.path_transform)(a,b);w._path_getBounds=(a,b)=>(w._path_getBounds=W.path_getBounds)(a,b);w._path_combine=(a,b,c)=>(w._path_combine=W.path_combine)(a,b,c);w._path_getSvgString=a=>(w._path_getSvgString=W.path_getSvgString)(a);w._pictureRecorder_create=()=>(w._pictureRecorder_create=W.pictureRecorder_create)();w._pictureRecorder_dispose=a=>(w._pictureRecorder_dispose=W.pictureRecorder_dispose)(a);
w._pictureRecorder_beginRecording=(a,b)=>(w._pictureRecorder_beginRecording=W.pictureRecorder_beginRecording)(a,b);w._pictureRecorder_endRecording=a=>(w._pictureRecorder_endRecording=W.pictureRecorder_endRecording)(a);w._picture_getCullRect=(a,b)=>(w._picture_getCullRect=W.picture_getCullRect)(a,b);w._picture_dispose=a=>(w._picture_dispose=W.picture_dispose)(a);w._picture_approximateBytesUsed=a=>(w._picture_approximateBytesUsed=W.picture_approximateBytesUsed)(a);
w._shader_createLinearGradient=(a,b,c,d,f,h)=>(w._shader_createLinearGradient=W.shader_createLinearGradient)(a,b,c,d,f,h);w._shader_createRadialGradient=(a,b,c,d,f,h,l,m)=>(w._shader_createRadialGradient=W.shader_createRadialGradient)(a,b,c,d,f,h,l,m);w._shader_createConicalGradient=(a,b,c,d,f,h,l,m)=>(w._shader_createConicalGradient=W.shader_createConicalGradient)(a,b,c,d,f,h,l,m);
w._shader_createSweepGradient=(a,b,c,d,f,h,l,m,p)=>(w._shader_createSweepGradient=W.shader_createSweepGradient)(a,b,c,d,f,h,l,m,p);w._shader_dispose=a=>(w._shader_dispose=W.shader_dispose)(a);w._runtimeEffect_create=a=>(w._runtimeEffect_create=W.runtimeEffect_create)(a);w._runtimeEffect_dispose=a=>(w._runtimeEffect_dispose=W.runtimeEffect_dispose)(a);w._runtimeEffect_getUniformSize=a=>(w._runtimeEffect_getUniformSize=W.runtimeEffect_getUniformSize)(a);
w._shader_createRuntimeEffectShader=(a,b,c,d)=>(w._shader_createRuntimeEffectShader=W.shader_createRuntimeEffectShader)(a,b,c,d);w._shader_createFromImage=(a,b,c,d,f)=>(w._shader_createFromImage=W.shader_createFromImage)(a,b,c,d,f);w._skString_allocate=a=>(w._skString_allocate=W.skString_allocate)(a);w._skString_getData=a=>(w._skString_getData=W.skString_getData)(a);w._skString_getLength=a=>(w._skString_getLength=W.skString_getLength)(a);w._skString_free=a=>(w._skString_free=W.skString_free)(a);
w._skString16_allocate=a=>(w._skString16_allocate=W.skString16_allocate)(a);w._skString16_getData=a=>(w._skString16_getData=W.skString16_getData)(a);w._skString16_free=a=>(w._skString16_free=W.skString16_free)(a);w._surface_create=()=>(w._surface_create=W.surface_create)();w._surface_getThreadId=a=>(w._surface_getThreadId=W.surface_getThreadId)(a);w._surface_setCallbackHandler=(a,b)=>(w._surface_setCallbackHandler=W.surface_setCallbackHandler)(a,b);w._surface_destroy=a=>(w._surface_destroy=W.surface_destroy)(a);
var ic=w._surface_dispose=a=>(ic=w._surface_dispose=W.surface_dispose)(a);w._surface_renderPictures=(a,b,c)=>(w._surface_renderPictures=W.surface_renderPictures)(a,b,c);var gc=w._surface_renderPicturesOnWorker=(a,b,c,d,f)=>(gc=w._surface_renderPicturesOnWorker=W.surface_renderPicturesOnWorker)(a,b,c,d,f);w._surface_rasterizeImage=(a,b,c)=>(w._surface_rasterizeImage=W.surface_rasterizeImage)(a,b,c);
var jc=w._surface_rasterizeImageOnWorker=(a,b,c,d)=>(jc=w._surface_rasterizeImageOnWorker=W.surface_rasterizeImageOnWorker)(a,b,c,d),hc=w._surface_onRenderComplete=(a,b,c)=>(hc=w._surface_onRenderComplete=W.surface_onRenderComplete)(a,b,c),kc=w._surface_onRasterizeComplete=(a,b,c)=>(kc=w._surface_onRasterizeComplete=W.surface_onRasterizeComplete)(a,b,c);w._skwasm_isMultiThreaded=()=>(w._skwasm_isMultiThreaded=W.skwasm_isMultiThreaded)();
w._lineMetrics_create=(a,b,c,d,f,h,l,m,p)=>(w._lineMetrics_create=W.lineMetrics_create)(a,b,c,d,f,h,l,m,p);w._lineMetrics_dispose=a=>(w._lineMetrics_dispose=W.lineMetrics_dispose)(a);w._lineMetrics_getHardBreak=a=>(w._lineMetrics_getHardBreak=W.lineMetrics_getHardBreak)(a);w._lineMetrics_getAscent=a=>(w._lineMetrics_getAscent=W.lineMetrics_getAscent)(a);w._lineMetrics_getDescent=a=>(w._lineMetrics_getDescent=W.lineMetrics_getDescent)(a);
w._lineMetrics_getUnscaledAscent=a=>(w._lineMetrics_getUnscaledAscent=W.lineMetrics_getUnscaledAscent)(a);w._lineMetrics_getHeight=a=>(w._lineMetrics_getHeight=W.lineMetrics_getHeight)(a);w._lineMetrics_getWidth=a=>(w._lineMetrics_getWidth=W.lineMetrics_getWidth)(a);w._lineMetrics_getLeft=a=>(w._lineMetrics_getLeft=W.lineMetrics_getLeft)(a);w._lineMetrics_getBaseline=a=>(w._lineMetrics_getBaseline=W.lineMetrics_getBaseline)(a);w._lineMetrics_getLineNumber=a=>(w._lineMetrics_getLineNumber=W.lineMetrics_getLineNumber)(a);
w._lineMetrics_getStartIndex=a=>(w._lineMetrics_getStartIndex=W.lineMetrics_getStartIndex)(a);w._lineMetrics_getEndIndex=a=>(w._lineMetrics_getEndIndex=W.lineMetrics_getEndIndex)(a);w._paragraph_dispose=a=>(w._paragraph_dispose=W.paragraph_dispose)(a);w._paragraph_getWidth=a=>(w._paragraph_getWidth=W.paragraph_getWidth)(a);w._paragraph_getHeight=a=>(w._paragraph_getHeight=W.paragraph_getHeight)(a);w._paragraph_getLongestLine=a=>(w._paragraph_getLongestLine=W.paragraph_getLongestLine)(a);
w._paragraph_getMinIntrinsicWidth=a=>(w._paragraph_getMinIntrinsicWidth=W.paragraph_getMinIntrinsicWidth)(a);w._paragraph_getMaxIntrinsicWidth=a=>(w._paragraph_getMaxIntrinsicWidth=W.paragraph_getMaxIntrinsicWidth)(a);w._paragraph_getAlphabeticBaseline=a=>(w._paragraph_getAlphabeticBaseline=W.paragraph_getAlphabeticBaseline)(a);w._paragraph_getIdeographicBaseline=a=>(w._paragraph_getIdeographicBaseline=W.paragraph_getIdeographicBaseline)(a);
w._paragraph_getDidExceedMaxLines=a=>(w._paragraph_getDidExceedMaxLines=W.paragraph_getDidExceedMaxLines)(a);w._paragraph_layout=(a,b)=>(w._paragraph_layout=W.paragraph_layout)(a,b);w._paragraph_getPositionForOffset=(a,b,c,d)=>(w._paragraph_getPositionForOffset=W.paragraph_getPositionForOffset)(a,b,c,d);w._paragraph_getClosestGlyphInfoAtCoordinate=(a,b,c,d,f,h)=>(w._paragraph_getClosestGlyphInfoAtCoordinate=W.paragraph_getClosestGlyphInfoAtCoordinate)(a,b,c,d,f,h);
w._paragraph_getGlyphInfoAt=(a,b,c,d,f)=>(w._paragraph_getGlyphInfoAt=W.paragraph_getGlyphInfoAt)(a,b,c,d,f);w._paragraph_getWordBoundary=(a,b,c)=>(w._paragraph_getWordBoundary=W.paragraph_getWordBoundary)(a,b,c);w._paragraph_getLineCount=a=>(w._paragraph_getLineCount=W.paragraph_getLineCount)(a);w._paragraph_getLineNumberAt=(a,b)=>(w._paragraph_getLineNumberAt=W.paragraph_getLineNumberAt)(a,b);
w._paragraph_getLineMetricsAtIndex=(a,b)=>(w._paragraph_getLineMetricsAtIndex=W.paragraph_getLineMetricsAtIndex)(a,b);w._textBoxList_dispose=a=>(w._textBoxList_dispose=W.textBoxList_dispose)(a);w._textBoxList_getLength=a=>(w._textBoxList_getLength=W.textBoxList_getLength)(a);w._textBoxList_getBoxAtIndex=(a,b,c)=>(w._textBoxList_getBoxAtIndex=W.textBoxList_getBoxAtIndex)(a,b,c);w._paragraph_getBoxesForRange=(a,b,c,d,f)=>(w._paragraph_getBoxesForRange=W.paragraph_getBoxesForRange)(a,b,c,d,f);
w._paragraph_getBoxesForPlaceholders=a=>(w._paragraph_getBoxesForPlaceholders=W.paragraph_getBoxesForPlaceholders)(a);w._paragraph_getUnresolvedCodePoints=(a,b,c)=>(w._paragraph_getUnresolvedCodePoints=W.paragraph_getUnresolvedCodePoints)(a,b,c);w._paragraphBuilder_create=(a,b)=>(w._paragraphBuilder_create=W.paragraphBuilder_create)(a,b);w._paragraphBuilder_dispose=a=>(w._paragraphBuilder_dispose=W.paragraphBuilder_dispose)(a);
w._paragraphBuilder_addPlaceholder=(a,b,c,d,f,h)=>(w._paragraphBuilder_addPlaceholder=W.paragraphBuilder_addPlaceholder)(a,b,c,d,f,h);w._paragraphBuilder_addText=(a,b)=>(w._paragraphBuilder_addText=W.paragraphBuilder_addText)(a,b);w._paragraphBuilder_getUtf8Text=(a,b)=>(w._paragraphBuilder_getUtf8Text=W.paragraphBuilder_getUtf8Text)(a,b);w._paragraphBuilder_pushStyle=(a,b)=>(w._paragraphBuilder_pushStyle=W.paragraphBuilder_pushStyle)(a,b);w._paragraphBuilder_pop=a=>(w._paragraphBuilder_pop=W.paragraphBuilder_pop)(a);
w._paragraphBuilder_build=a=>(w._paragraphBuilder_build=W.paragraphBuilder_build)(a);w._unicodePositionBuffer_create=a=>(w._unicodePositionBuffer_create=W.unicodePositionBuffer_create)(a);w._unicodePositionBuffer_getDataPointer=a=>(w._unicodePositionBuffer_getDataPointer=W.unicodePositionBuffer_getDataPointer)(a);w._unicodePositionBuffer_free=a=>(w._unicodePositionBuffer_free=W.unicodePositionBuffer_free)(a);w._lineBreakBuffer_create=a=>(w._lineBreakBuffer_create=W.lineBreakBuffer_create)(a);
w._lineBreakBuffer_getDataPointer=a=>(w._lineBreakBuffer_getDataPointer=W.lineBreakBuffer_getDataPointer)(a);w._lineBreakBuffer_free=a=>(w._lineBreakBuffer_free=W.lineBreakBuffer_free)(a);w._paragraphBuilder_setGraphemeBreaksUtf16=(a,b)=>(w._paragraphBuilder_setGraphemeBreaksUtf16=W.paragraphBuilder_setGraphemeBreaksUtf16)(a,b);w._paragraphBuilder_setWordBreaksUtf16=(a,b)=>(w._paragraphBuilder_setWordBreaksUtf16=W.paragraphBuilder_setWordBreaksUtf16)(a,b);
w._paragraphBuilder_setLineBreaksUtf16=(a,b)=>(w._paragraphBuilder_setLineBreaksUtf16=W.paragraphBuilder_setLineBreaksUtf16)(a,b);w._paragraphStyle_create=()=>(w._paragraphStyle_create=W.paragraphStyle_create)();w._paragraphStyle_dispose=a=>(w._paragraphStyle_dispose=W.paragraphStyle_dispose)(a);w._paragraphStyle_setTextAlign=(a,b)=>(w._paragraphStyle_setTextAlign=W.paragraphStyle_setTextAlign)(a,b);
w._paragraphStyle_setTextDirection=(a,b)=>(w._paragraphStyle_setTextDirection=W.paragraphStyle_setTextDirection)(a,b);w._paragraphStyle_setMaxLines=(a,b)=>(w._paragraphStyle_setMaxLines=W.paragraphStyle_setMaxLines)(a,b);w._paragraphStyle_setHeight=(a,b)=>(w._paragraphStyle_setHeight=W.paragraphStyle_setHeight)(a,b);w._paragraphStyle_setTextHeightBehavior=(a,b,c)=>(w._paragraphStyle_setTextHeightBehavior=W.paragraphStyle_setTextHeightBehavior)(a,b,c);
w._paragraphStyle_setEllipsis=(a,b)=>(w._paragraphStyle_setEllipsis=W.paragraphStyle_setEllipsis)(a,b);w._paragraphStyle_setStrutStyle=(a,b)=>(w._paragraphStyle_setStrutStyle=W.paragraphStyle_setStrutStyle)(a,b);w._paragraphStyle_setTextStyle=(a,b)=>(w._paragraphStyle_setTextStyle=W.paragraphStyle_setTextStyle)(a,b);w._paragraphStyle_setApplyRoundingHack=(a,b)=>(w._paragraphStyle_setApplyRoundingHack=W.paragraphStyle_setApplyRoundingHack)(a,b);w._strutStyle_create=()=>(w._strutStyle_create=W.strutStyle_create)();
w._strutStyle_dispose=a=>(w._strutStyle_dispose=W.strutStyle_dispose)(a);w._strutStyle_setFontFamilies=(a,b,c)=>(w._strutStyle_setFontFamilies=W.strutStyle_setFontFamilies)(a,b,c);w._strutStyle_setFontSize=(a,b)=>(w._strutStyle_setFontSize=W.strutStyle_setFontSize)(a,b);w._strutStyle_setHeight=(a,b)=>(w._strutStyle_setHeight=W.strutStyle_setHeight)(a,b);w._strutStyle_setHalfLeading=(a,b)=>(w._strutStyle_setHalfLeading=W.strutStyle_setHalfLeading)(a,b);
w._strutStyle_setLeading=(a,b)=>(w._strutStyle_setLeading=W.strutStyle_setLeading)(a,b);w._strutStyle_setFontStyle=(a,b,c)=>(w._strutStyle_setFontStyle=W.strutStyle_setFontStyle)(a,b,c);w._strutStyle_setForceStrutHeight=(a,b)=>(w._strutStyle_setForceStrutHeight=W.strutStyle_setForceStrutHeight)(a,b);w._textStyle_create=()=>(w._textStyle_create=W.textStyle_create)();w._textStyle_copy=a=>(w._textStyle_copy=W.textStyle_copy)(a);w._textStyle_dispose=a=>(w._textStyle_dispose=W.textStyle_dispose)(a);
w._textStyle_setColor=(a,b)=>(w._textStyle_setColor=W.textStyle_setColor)(a,b);w._textStyle_setDecoration=(a,b)=>(w._textStyle_setDecoration=W.textStyle_setDecoration)(a,b);w._textStyle_setDecorationColor=(a,b)=>(w._textStyle_setDecorationColor=W.textStyle_setDecorationColor)(a,b);w._textStyle_setDecorationStyle=(a,b)=>(w._textStyle_setDecorationStyle=W.textStyle_setDecorationStyle)(a,b);
w._textStyle_setDecorationThickness=(a,b)=>(w._textStyle_setDecorationThickness=W.textStyle_setDecorationThickness)(a,b);w._textStyle_setFontStyle=(a,b,c)=>(w._textStyle_setFontStyle=W.textStyle_setFontStyle)(a,b,c);w._textStyle_setTextBaseline=(a,b)=>(w._textStyle_setTextBaseline=W.textStyle_setTextBaseline)(a,b);w._textStyle_clearFontFamilies=a=>(w._textStyle_clearFontFamilies=W.textStyle_clearFontFamilies)(a);
w._textStyle_addFontFamilies=(a,b,c)=>(w._textStyle_addFontFamilies=W.textStyle_addFontFamilies)(a,b,c);w._textStyle_setFontSize=(a,b)=>(w._textStyle_setFontSize=W.textStyle_setFontSize)(a,b);w._textStyle_setLetterSpacing=(a,b)=>(w._textStyle_setLetterSpacing=W.textStyle_setLetterSpacing)(a,b);w._textStyle_setWordSpacing=(a,b)=>(w._textStyle_setWordSpacing=W.textStyle_setWordSpacing)(a,b);w._textStyle_setHeight=(a,b)=>(w._textStyle_setHeight=W.textStyle_setHeight)(a,b);
w._textStyle_setHalfLeading=(a,b)=>(w._textStyle_setHalfLeading=W.textStyle_setHalfLeading)(a,b);w._textStyle_setLocale=(a,b)=>(w._textStyle_setLocale=W.textStyle_setLocale)(a,b);w._textStyle_setBackground=(a,b)=>(w._textStyle_setBackground=W.textStyle_setBackground)(a,b);w._textStyle_setForeground=(a,b)=>(w._textStyle_setForeground=W.textStyle_setForeground)(a,b);w._textStyle_addShadow=(a,b,c,d,f)=>(w._textStyle_addShadow=W.textStyle_addShadow)(a,b,c,d,f);
w._textStyle_addFontFeature=(a,b,c)=>(w._textStyle_addFontFeature=W.textStyle_addFontFeature)(a,b,c);w._textStyle_setFontVariations=(a,b,c,d)=>(w._textStyle_setFontVariations=W.textStyle_setFontVariations)(a,b,c,d);w._vertices_create=(a,b,c,d,f,h,l)=>(w._vertices_create=W.vertices_create)(a,b,c,d,f,h,l);w._vertices_dispose=a=>(w._vertices_dispose=W.vertices_dispose)(a);
var Ab=a=>(Ab=W.malloc)(a),lc=(a,b)=>(lc=W._emscripten_timeout)(a,b),X=(a,b)=>(X=W.setThrew)(a,b),Y=a=>(Y=W._emscripten_stack_restore)(a),cc=a=>(cc=W._emscripten_stack_alloc)(a),Z=()=>(Z=W.emscripten_stack_get_current)(),Aa=(a,b)=>(Aa=W._emscripten_wasm_worker_initialize)(a,b);function nc(a,b,c){var d=Z();try{return B.get(a)(b,c)}catch(f){Y(d);if(f!==f+0)throw f;X(1,0)}}function sc(a,b,c){var d=Z();try{B.get(a)(b,c)}catch(f){Y(d);if(f!==f+0)throw f;X(1,0)}}
function mc(a,b){var c=Z();try{return B.get(a)(b)}catch(d){Y(c);if(d!==d+0)throw d;X(1,0)}}function tc(a,b,c,d){var f=Z();try{B.get(a)(b,c,d)}catch(h){Y(f);if(h!==h+0)throw h;X(1,0)}}function oc(a,b,c,d){var f=Z();try{return B.get(a)(b,c,d)}catch(h){Y(f);if(h!==h+0)throw h;X(1,0)}}function uc(a,b,c,d,f){var h=Z();try{B.get(a)(b,c,d,f)}catch(l){Y(h);if(l!==l+0)throw l;X(1,0)}}function vc(a,b,c,d,f,h,l,m){var p=Z();try{B.get(a)(b,c,d,f,h,l,m)}catch(v){Y(p);if(v!==v+0)throw v;X(1,0)}}
function rc(a,b){var c=Z();try{B.get(a)(b)}catch(d){Y(c);if(d!==d+0)throw d;X(1,0)}}function qc(a,b,c,d,f,h,l){var m=Z();try{return B.get(a)(b,c,d,f,h,l)}catch(p){Y(m);if(p!==p+0)throw p;X(1,0)}}function pc(a,b,c,d,f){var h=Z();try{return B.get(a)(b,c,d,f)}catch(l){Y(h);if(l!==l+0)throw l;X(1,0)}}w.wasmMemory=g;w.wasmExports=W;w.stackAlloc=dc;
w.addFunction=(a,b)=>{if(!U){U=new WeakMap;var c=B.length;if(U)for(var d=0;d<0+c;d++){var f=B.get(d);f&&U.set(f,d)}}if(c=U.get(a)||0)return c;if(bc.length)c=bc.pop();else{try{B.grow(1)}catch(m){if(!(m instanceof RangeError))throw m;throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.";}c=B.length-1}try{B.set(c,a)}catch(m){if(!(m instanceof TypeError))throw m;if("function"==typeof WebAssembly.Function){d=WebAssembly.Function;f={i:"i32",j:"i64",f:"f32",d:"f64",e:"externref",p:"i32"};for(var h={parameters:[],
results:"v"==b[0]?[]:[f[b[0]]]},l=1;l<b.length;++l)h.parameters.push(f[b[l]]);b=new d(h,a)}else{d=[1];f=b.slice(0,1);b=b.slice(1);h={i:127,p:127,j:126,f:125,d:124,e:111};d.push(96);l=b.length;128>l?d.push(l):d.push(l%128|128,l>>7);for(l=0;l<b.length;++l)d.push(h[b[l]]);"v"==f?d.push(0):d.push(1,h[f]);b=[0,97,115,109,1,0,0,0,1];f=d.length;128>f?b.push(f):b.push(f%128|128,f>>7);b.push(...d);b.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);b=new WebAssembly.Module(new Uint8Array(b));b=(new WebAssembly.Instance(b,
{e:{f:a}})).exports.f}B.set(c,b)}U.set(a,c);return c};var xc,yc;A=function zc(){xc||Ac();xc||(A=zc)};function Ac(){if(!(0<z))if(ka)ea(w),ya();else{if(!yc&&(yc=1,Ea(va),0<z))return;xc||(xc=1,w.calledRun=1,ra||(ya(),ea(w),Ea(xa)))}}Ac();moduleRtn=ha;
return moduleRtn;
}
);
})();
export default skwasm;

File diff suppressed because one or more lines are too long

BIN
web/canvaskit/skwasm.wasm Executable file

Binary file not shown.

BIN
web/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 917 B

32
web/flutter.js Normal file
View File

@ -0,0 +1,32 @@
(()=>{var U=()=>navigator.vendor==="Google Inc."||navigator.agent==="Edg/",E=()=>typeof ImageDecoder>"u"?!1:U(),W=()=>typeof Intl.v8BreakIterator<"u"&&typeof Intl.Segmenter<"u",P=()=>{let s=[0,97,115,109,1,0,0,0,1,5,1,95,1,120,0];return WebAssembly.validate(new Uint8Array(s))},p={hasImageCodecs:E(),hasChromiumBreakIterators:W(),supportsWasmGC:P(),crossOriginIsolated:window.crossOriginIsolated};function l(...s){return new URL(_(...s),document.baseURI).toString()}function _(...s){return s.filter(e=>!!e).map((e,i)=>i===0?C(e):j(C(e))).filter(e=>e.length).join("/")}function j(s){let e=0;for(;e<s.length&&s.charAt(e)==="/";)e++;return s.substring(e)}function C(s){let e=s.length;for(;e>0&&s.charAt(e-1)==="/";)e--;return s.substring(0,e)}function L(s,e){return s.canvasKitBaseUrl?s.canvasKitBaseUrl:e.engineRevision&&!e.useLocalCanvasKit?_("https://www.gstatic.com/flutter-canvaskit",e.engineRevision):"canvaskit"}var h=class{constructor(){this._scriptLoaded=!1}setTrustedTypesPolicy(e){this._ttPolicy=e}async loadEntrypoint(e){let{entrypointUrl:i=l("main.dart.js"),onEntrypointLoaded:r,nonce:t}=e||{};return this._loadJSEntrypoint(i,r,t)}async load(e,i,r,t,n){n??=o=>{o.initializeEngine(r).then(c=>c.runApp())};let{entryPointBaseUrl:a}=r;if(e.compileTarget==="dart2wasm")return this._loadWasmEntrypoint(e,i,a,n);{let o=e.mainJsPath??"main.dart.js",c=l(a,o);return this._loadJSEntrypoint(c,n,t)}}didCreateEngineInitializer(e){typeof this._didCreateEngineInitializerResolve=="function"&&(this._didCreateEngineInitializerResolve(e),this._didCreateEngineInitializerResolve=null,delete _flutter.loader.didCreateEngineInitializer),typeof this._onEntrypointLoaded=="function"&&this._onEntrypointLoaded(e)}_loadJSEntrypoint(e,i,r){let t=typeof i=="function";if(!this._scriptLoaded){this._scriptLoaded=!0;let n=this._createScriptTag(e,r);if(t)console.debug("Injecting <script> tag. Using callback."),this._onEntrypointLoaded=i,document.head.append(n);else return new Promise((a,o)=>{console.debug("Injecting <script> tag. Using Promises. Use the callback approach instead!"),this._didCreateEngineInitializerResolve=a,n.addEventListener("error",o),document.head.append(n)})}}async _loadWasmEntrypoint(e,i,r,t){if(!this._scriptLoaded){this._scriptLoaded=!0,this._onEntrypointLoaded=t;let{mainWasmPath:n,jsSupportRuntimePath:a}=e,o=l(r,n),c=l(r,a);this._ttPolicy!=null&&(c=this._ttPolicy.createScriptURL(c));let d=(await import(c)).compileStreaming(fetch(o)),w;e.renderer==="skwasm"?w=(async()=>{let f=await i.skwasm;return window._flutter_skwasmInstance=f,{skwasm:f.wasmExports,skwasmWrapper:f,ffi:{memory:f.wasmMemory}}})():w=Promise.resolve({}),await(await(await d).instantiate(await w)).invokeMain()}}_createScriptTag(e,i){let r=document.createElement("script");r.type="application/javascript",i&&(r.nonce=i);let t=e;return this._ttPolicy!=null&&(t=this._ttPolicy.createScriptURL(e)),r.src=t,r}};async function T(s,e,i){if(e<0)return s;let r,t=new Promise((n,a)=>{r=setTimeout(()=>{a(new Error(`${i} took more than ${e}ms to resolve. Moving on.`,{cause:T}))},e)});return Promise.race([s,t]).finally(()=>{clearTimeout(r)})}var g=class{setTrustedTypesPolicy(e){this._ttPolicy=e}loadServiceWorker(e){if(!e)return console.debug("Null serviceWorker configuration. Skipping."),Promise.resolve();if(!("serviceWorker"in navigator)){let o="Service Worker API unavailable.";return window.isSecureContext||(o+=`
The current context is NOT secure.`,o+=`
Read more: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts`),Promise.reject(new Error(o))}let{serviceWorkerVersion:i,serviceWorkerUrl:r=l(`flutter_service_worker.js?v=${i}`),timeoutMillis:t=4e3}=e,n=r;this._ttPolicy!=null&&(n=this._ttPolicy.createScriptURL(n));let a=navigator.serviceWorker.register(n).then(o=>this._getNewServiceWorker(o,i)).then(this._waitForServiceWorkerActivation);return T(a,t,"prepareServiceWorker")}async _getNewServiceWorker(e,i){if(!e.active&&(e.installing||e.waiting))return console.debug("Installing/Activating first service worker."),e.installing||e.waiting;if(e.active.scriptURL.endsWith(i))return console.debug("Loading from existing service worker."),e.active;{let r=await e.update();return console.debug("Updating service worker."),r.installing||r.waiting||r.active}}async _waitForServiceWorkerActivation(e){if(!e||e.state==="activated")if(e){console.debug("Service worker already active.");return}else throw new Error("Cannot activate a null service worker!");return new Promise((i,r)=>{e.addEventListener("statechange",()=>{e.state==="activated"&&(console.debug("Activated new service worker."),i())})})}};var y=class{constructor(e,i="flutter-js"){let r=e||[/\.js$/,/\.mjs$/];window.trustedTypes&&(this.policy=trustedTypes.createPolicy(i,{createScriptURL:function(t){if(t.startsWith("blob:"))return t;let n=new URL(t,window.location),a=n.pathname.split("/").pop();if(r.some(c=>c.test(a)))return n.toString();console.error("URL rejected by TrustedTypes policy",i,":",t,"(download prevented)")}}))}};var k=s=>{let e=WebAssembly.compileStreaming(fetch(s));return(i,r)=>((async()=>{let t=await e,n=await WebAssembly.instantiate(t,i);r(n,t)})(),{})};var I=(s,e,i,r)=>(window.flutterCanvasKitLoaded=(async()=>{if(window.flutterCanvasKit)return window.flutterCanvasKit;let t=i.hasChromiumBreakIterators&&i.hasImageCodecs;if(!t&&e.canvasKitVariant=="chromium")throw"Chromium CanvasKit variant specifically requested, but unsupported in this browser";let n=t&&e.canvasKitVariant!=="full",a=r;n&&(a=l(a,"chromium"));let o=l(a,"canvaskit.js");s.flutterTT.policy&&(o=s.flutterTT.policy.createScriptURL(o));let c=k(l(a,"canvaskit.wasm")),u=await import(o);return window.flutterCanvasKit=await u.default({instantiateWasm:c}),window.flutterCanvasKit})(),window.flutterCanvasKitLoaded);var b=async(s,e,i,r)=>{let t=l(r,"skwasm.js"),n=t;s.flutterTT.policy&&(n=s.flutterTT.policy.createScriptURL(n));let a=k(l(r,"skwasm.wasm"));return await(await import(n)).default({skwasmSingleThreaded:!i.crossOriginIsolated||e.forceSingleThreadedSkwasm,instantiateWasm:a,locateFile:(c,u)=>{if(c.endsWith(".ww.js")){let d=l(r,c);return URL.createObjectURL(new Blob([`
"use strict";
let eventListener;
eventListener = (message) => {
const pendingMessages = [];
const data = message.data;
data["instantiateWasm"] = (info,receiveInstance) => {
const instance = new WebAssembly.Instance(data["wasm"], info);
return receiveInstance(instance, data["wasm"])
};
import(data.js).then(async (skwasm) => {
await skwasm.default(data);
removeEventListener("message", eventListener);
for (const message of pendingMessages) {
dispatchEvent(message);
}
});
removeEventListener("message", eventListener);
eventListener = (message) => {
pendingMessages.push(message);
};
addEventListener("message", eventListener);
};
addEventListener("message", eventListener);
`],{type:"application/javascript"}))}return url},mainScriptUrlOrBlob:t})};var S=class{async loadEntrypoint(e){let{serviceWorker:i,...r}=e||{},t=new y,n=new g;n.setTrustedTypesPolicy(t.policy),await n.loadServiceWorker(i).catch(o=>{console.warn("Exception while loading service worker:",o)});let a=new h;return a.setTrustedTypesPolicy(t.policy),this.didCreateEngineInitializer=a.didCreateEngineInitializer.bind(a),a.loadEntrypoint(r)}async load({serviceWorkerSettings:e,onEntrypointLoaded:i,nonce:r,config:t}={}){t??={};let n=_flutter.buildConfig;if(!n)throw"FlutterLoader.load requires _flutter.buildConfig to be set";let a=m=>{switch(m){case"skwasm":return p.hasChromiumBreakIterators&&p.hasImageCodecs&&p.supportsWasmGC;default:return!0}},o=(m,f)=>m.renderer==f,c=m=>m.compileTarget==="dart2wasm"&&!p.supportsWasmGC||t.renderer&&!o(m,t.renderer)?!1:a(m.renderer),u=n.builds.find(c);if(!u)throw"FlutterLoader could not find a build compatible with configuration and environment.";let d={};d.flutterTT=new y,e&&(d.serviceWorkerLoader=new g,d.serviceWorkerLoader.setTrustedTypesPolicy(d.flutterTT.policy),await d.serviceWorkerLoader.loadServiceWorker(e).catch(m=>{console.warn("Exception while loading service worker:",m)}));let w=L(t,n);u.renderer==="canvaskit"?d.canvasKit=I(d,t,p,w):u.renderer==="skwasm"&&(d.skwasm=b(d,t,p,w));let v=new h;return v.setTrustedTypesPolicy(d.flutterTT.policy),this.didCreateEngineInitializer=v.didCreateEngineInitializer.bind(v),v.load(u,d,t,r,i)}};window._flutter||(window._flutter={});window._flutter.loader||(window._flutter.loader=new S);})();
//# sourceMappingURL=flutter.js.map

44
web/flutter_bootstrap.js Normal file
View File

@ -0,0 +1,44 @@
(()=>{var U=()=>navigator.vendor==="Google Inc."||navigator.agent==="Edg/",E=()=>typeof ImageDecoder>"u"?!1:U(),W=()=>typeof Intl.v8BreakIterator<"u"&&typeof Intl.Segmenter<"u",P=()=>{let s=[0,97,115,109,1,0,0,0,1,5,1,95,1,120,0];return WebAssembly.validate(new Uint8Array(s))},p={hasImageCodecs:E(),hasChromiumBreakIterators:W(),supportsWasmGC:P(),crossOriginIsolated:window.crossOriginIsolated};function l(...s){return new URL(_(...s),document.baseURI).toString()}function _(...s){return s.filter(e=>!!e).map((e,i)=>i===0?C(e):j(C(e))).filter(e=>e.length).join("/")}function j(s){let e=0;for(;e<s.length&&s.charAt(e)==="/";)e++;return s.substring(e)}function C(s){let e=s.length;for(;e>0&&s.charAt(e-1)==="/";)e--;return s.substring(0,e)}function L(s,e){return s.canvasKitBaseUrl?s.canvasKitBaseUrl:e.engineRevision&&!e.useLocalCanvasKit?_("https://www.gstatic.com/flutter-canvaskit",e.engineRevision):"canvaskit"}var h=class{constructor(){this._scriptLoaded=!1}setTrustedTypesPolicy(e){this._ttPolicy=e}async loadEntrypoint(e){let{entrypointUrl:i=l("main.dart.js"),onEntrypointLoaded:r,nonce:t}=e||{};return this._loadJSEntrypoint(i,r,t)}async load(e,i,r,t,n){n??=o=>{o.initializeEngine(r).then(c=>c.runApp())};let{entryPointBaseUrl:a}=r;if(e.compileTarget==="dart2wasm")return this._loadWasmEntrypoint(e,i,a,n);{let o=e.mainJsPath??"main.dart.js",c=l(a,o);return this._loadJSEntrypoint(c,n,t)}}didCreateEngineInitializer(e){typeof this._didCreateEngineInitializerResolve=="function"&&(this._didCreateEngineInitializerResolve(e),this._didCreateEngineInitializerResolve=null,delete _flutter.loader.didCreateEngineInitializer),typeof this._onEntrypointLoaded=="function"&&this._onEntrypointLoaded(e)}_loadJSEntrypoint(e,i,r){let t=typeof i=="function";if(!this._scriptLoaded){this._scriptLoaded=!0;let n=this._createScriptTag(e,r);if(t)console.debug("Injecting <script> tag. Using callback."),this._onEntrypointLoaded=i,document.head.append(n);else return new Promise((a,o)=>{console.debug("Injecting <script> tag. Using Promises. Use the callback approach instead!"),this._didCreateEngineInitializerResolve=a,n.addEventListener("error",o),document.head.append(n)})}}async _loadWasmEntrypoint(e,i,r,t){if(!this._scriptLoaded){this._scriptLoaded=!0,this._onEntrypointLoaded=t;let{mainWasmPath:n,jsSupportRuntimePath:a}=e,o=l(r,n),c=l(r,a);this._ttPolicy!=null&&(c=this._ttPolicy.createScriptURL(c));let d=(await import(c)).compileStreaming(fetch(o)),w;e.renderer==="skwasm"?w=(async()=>{let f=await i.skwasm;return window._flutter_skwasmInstance=f,{skwasm:f.wasmExports,skwasmWrapper:f,ffi:{memory:f.wasmMemory}}})():w=Promise.resolve({}),await(await(await d).instantiate(await w)).invokeMain()}}_createScriptTag(e,i){let r=document.createElement("script");r.type="application/javascript",i&&(r.nonce=i);let t=e;return this._ttPolicy!=null&&(t=this._ttPolicy.createScriptURL(e)),r.src=t,r}};async function T(s,e,i){if(e<0)return s;let r,t=new Promise((n,a)=>{r=setTimeout(()=>{a(new Error(`${i} took more than ${e}ms to resolve. Moving on.`,{cause:T}))},e)});return Promise.race([s,t]).finally(()=>{clearTimeout(r)})}var g=class{setTrustedTypesPolicy(e){this._ttPolicy=e}loadServiceWorker(e){if(!e)return console.debug("Null serviceWorker configuration. Skipping."),Promise.resolve();if(!("serviceWorker"in navigator)){let o="Service Worker API unavailable.";return window.isSecureContext||(o+=`
The current context is NOT secure.`,o+=`
Read more: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts`),Promise.reject(new Error(o))}let{serviceWorkerVersion:i,serviceWorkerUrl:r=l(`flutter_service_worker.js?v=${i}`),timeoutMillis:t=4e3}=e,n=r;this._ttPolicy!=null&&(n=this._ttPolicy.createScriptURL(n));let a=navigator.serviceWorker.register(n).then(o=>this._getNewServiceWorker(o,i)).then(this._waitForServiceWorkerActivation);return T(a,t,"prepareServiceWorker")}async _getNewServiceWorker(e,i){if(!e.active&&(e.installing||e.waiting))return console.debug("Installing/Activating first service worker."),e.installing||e.waiting;if(e.active.scriptURL.endsWith(i))return console.debug("Loading from existing service worker."),e.active;{let r=await e.update();return console.debug("Updating service worker."),r.installing||r.waiting||r.active}}async _waitForServiceWorkerActivation(e){if(!e||e.state==="activated")if(e){console.debug("Service worker already active.");return}else throw new Error("Cannot activate a null service worker!");return new Promise((i,r)=>{e.addEventListener("statechange",()=>{e.state==="activated"&&(console.debug("Activated new service worker."),i())})})}};var y=class{constructor(e,i="flutter-js"){let r=e||[/\.js$/,/\.mjs$/];window.trustedTypes&&(this.policy=trustedTypes.createPolicy(i,{createScriptURL:function(t){if(t.startsWith("blob:"))return t;let n=new URL(t,window.location),a=n.pathname.split("/").pop();if(r.some(c=>c.test(a)))return n.toString();console.error("URL rejected by TrustedTypes policy",i,":",t,"(download prevented)")}}))}};var k=s=>{let e=WebAssembly.compileStreaming(fetch(s));return(i,r)=>((async()=>{let t=await e,n=await WebAssembly.instantiate(t,i);r(n,t)})(),{})};var I=(s,e,i,r)=>(window.flutterCanvasKitLoaded=(async()=>{if(window.flutterCanvasKit)return window.flutterCanvasKit;let t=i.hasChromiumBreakIterators&&i.hasImageCodecs;if(!t&&e.canvasKitVariant=="chromium")throw"Chromium CanvasKit variant specifically requested, but unsupported in this browser";let n=t&&e.canvasKitVariant!=="full",a=r;n&&(a=l(a,"chromium"));let o=l(a,"canvaskit.js");s.flutterTT.policy&&(o=s.flutterTT.policy.createScriptURL(o));let c=k(l(a,"canvaskit.wasm")),u=await import(o);return window.flutterCanvasKit=await u.default({instantiateWasm:c}),window.flutterCanvasKit})(),window.flutterCanvasKitLoaded);var b=async(s,e,i,r)=>{let t=l(r,"skwasm.js"),n=t;s.flutterTT.policy&&(n=s.flutterTT.policy.createScriptURL(n));let a=k(l(r,"skwasm.wasm"));return await(await import(n)).default({skwasmSingleThreaded:!i.crossOriginIsolated||e.forceSingleThreadedSkwasm,instantiateWasm:a,locateFile:(c,u)=>{if(c.endsWith(".ww.js")){let d=l(r,c);return URL.createObjectURL(new Blob([`
"use strict";
let eventListener;
eventListener = (message) => {
const pendingMessages = [];
const data = message.data;
data["instantiateWasm"] = (info,receiveInstance) => {
const instance = new WebAssembly.Instance(data["wasm"], info);
return receiveInstance(instance, data["wasm"])
};
import(data.js).then(async (skwasm) => {
await skwasm.default(data);
removeEventListener("message", eventListener);
for (const message of pendingMessages) {
dispatchEvent(message);
}
});
removeEventListener("message", eventListener);
eventListener = (message) => {
pendingMessages.push(message);
};
addEventListener("message", eventListener);
};
addEventListener("message", eventListener);
`],{type:"application/javascript"}))}return url},mainScriptUrlOrBlob:t})};var S=class{async loadEntrypoint(e){let{serviceWorker:i,...r}=e||{},t=new y,n=new g;n.setTrustedTypesPolicy(t.policy),await n.loadServiceWorker(i).catch(o=>{console.warn("Exception while loading service worker:",o)});let a=new h;return a.setTrustedTypesPolicy(t.policy),this.didCreateEngineInitializer=a.didCreateEngineInitializer.bind(a),a.loadEntrypoint(r)}async load({serviceWorkerSettings:e,onEntrypointLoaded:i,nonce:r,config:t}={}){t??={};let n=_flutter.buildConfig;if(!n)throw"FlutterLoader.load requires _flutter.buildConfig to be set";let a=m=>{switch(m){case"skwasm":return p.hasChromiumBreakIterators&&p.hasImageCodecs&&p.supportsWasmGC;default:return!0}},o=(m,f)=>m.renderer==f,c=m=>m.compileTarget==="dart2wasm"&&!p.supportsWasmGC||t.renderer&&!o(m,t.renderer)?!1:a(m.renderer),u=n.builds.find(c);if(!u)throw"FlutterLoader could not find a build compatible with configuration and environment.";let d={};d.flutterTT=new y,e&&(d.serviceWorkerLoader=new g,d.serviceWorkerLoader.setTrustedTypesPolicy(d.flutterTT.policy),await d.serviceWorkerLoader.loadServiceWorker(e).catch(m=>{console.warn("Exception while loading service worker:",m)}));let w=L(t,n);u.renderer==="canvaskit"?d.canvasKit=I(d,t,p,w):u.renderer==="skwasm"&&(d.skwasm=b(d,t,p,w));let v=new h;return v.setTrustedTypesPolicy(d.flutterTT.policy),this.didCreateEngineInitializer=v.didCreateEngineInitializer.bind(v),v.load(u,d,t,r,i)}};window._flutter||(window._flutter={});window._flutter.loader||(window._flutter.loader=new S);})();
//# sourceMappingURL=flutter.js.map
if (!window._flutter) {
window._flutter = {};
}
_flutter.buildConfig = {"engineRevision":"72f2b18bb094f92f62a3113a8075240ebb59affa","builds":[{"compileTarget":"dart2js","renderer":"canvaskit","mainJsPath":"main.dart.js"}]};
_flutter.loader.load({
serviceWorkerSettings: {
serviceWorkerVersion: "3536977589"
}
});

View File

@ -0,0 +1,207 @@
'use strict';
const MANIFEST = 'flutter-app-manifest';
const TEMP = 'flutter-temp-cache';
const CACHE_NAME = 'flutter-app-cache';
const RESOURCES = {"flutter_bootstrap.js": "67ea8e8ba17a037878e97fb97744615b",
"version.json": "2fe62a2512b6ba284732a0255fe16b80",
"folderPage.java": "d41d8cd98f00b204e9800998ecf8427e",
"index.html": "6969d9c82c7a8d15b9cb7ffed40b548e",
"/": "6969d9c82c7a8d15b9cb7ffed40b548e",
"main.dart.js": "b0c18056efb7628500f2acf8770b6b84",
"flutter.js": "83d881c1dbb6d6bcd6b42e274605b69c",
"favicon.png": "5dcef449791fa27946b3d35ad8803796",
"icons/Icon-192.png": "ac9a721a12bbc803b44f645561ecb1e1",
"icons/Icon-maskable-192.png": "c457ef57daa1d16f64b27b786ec2ea3c",
"icons/Icon-maskable-512.png": "301a7604d45b3e739efc881eb04896ea",
"icons/Icon-512.png": "96e752610906ba2a93c65f8abe1645f1",
"manifest.json": "7ecf77d798f49ca9bd7ba8f7385f490d",
"assets/AssetManifest.json": "4fc41e07eb7fb3b22fbcb8eb9b64ee27",
"assets/NOTICES": "75d179303d74b3c43f65c10ba7e200e3",
"assets/FontManifest.json": "dc3d03800ccca4601324923c0b1d6d57",
"assets/AssetManifest.bin.json": "e44bb50a0b122ee5f3666674fa966327",
"assets/packages/cupertino_icons/assets/CupertinoIcons.ttf": "33b7d9392238c04c131b6ce224e13711",
"assets/packages/media_kit/assets/web/hls1.4.10.js": "bd60e2701c42b6bf2c339dcf5d495865",
"assets/packages/wakelock_plus/assets/no_sleep.js": "7748a45cd593f33280669b29c2c8919a",
"assets/shaders/ink_sparkle.frag": "ecc85a2e95f5e9f53123dcaf8cb9b6ce",
"assets/AssetManifest.bin": "1fe78d99099ee4407478e70a08513c6f",
"assets/fonts/MaterialIcons-Regular.otf": "debef29a5f1e1194e350b62af18b4a77",
"canvaskit/skwasm.js": "ea559890a088fe28b4ddf70e17e60052",
"canvaskit/skwasm.js.symbols": "e72c79950c8a8483d826a7f0560573a1",
"canvaskit/canvaskit.js.symbols": "bdcd3835edf8586b6d6edfce8749fb77",
"canvaskit/skwasm.wasm": "39dd80367a4e71582d234948adc521c0",
"canvaskit/chromium/canvaskit.js.symbols": "b61b5f4673c9698029fa0a746a9ad581",
"canvaskit/chromium/canvaskit.js": "8191e843020c832c9cf8852a4b909d4c",
"canvaskit/chromium/canvaskit.wasm": "f504de372e31c8031018a9ec0a9ef5f0",
"canvaskit/canvaskit.js": "728b2d477d9b8c14593d4f9b82b484f3",
"canvaskit/canvaskit.wasm": "7a3f4ae7d65fc1de6a6e7ddd3224bc93"};
// The application shell files that are downloaded before a service worker can
// start.
const CORE = ["main.dart.js",
"index.html",
"flutter_bootstrap.js",
"assets/AssetManifest.bin.json",
"assets/FontManifest.json"];
// During install, the TEMP cache is populated with the application shell files.
self.addEventListener("install", (event) => {
self.skipWaiting();
return event.waitUntil(
caches.open(TEMP).then((cache) => {
return cache.addAll(
CORE.map((value) => new Request(value, {'cache': 'reload'})));
})
);
});
// During activate, the cache is populated with the temp files downloaded in
// install. If this service worker is upgrading from one with a saved
// MANIFEST, then use this to retain unchanged resource files.
self.addEventListener("activate", function(event) {
return event.waitUntil(async function() {
try {
var contentCache = await caches.open(CACHE_NAME);
var tempCache = await caches.open(TEMP);
var manifestCache = await caches.open(MANIFEST);
var manifest = await manifestCache.match('manifest');
// When there is no prior manifest, clear the entire cache.
if (!manifest) {
await caches.delete(CACHE_NAME);
contentCache = await caches.open(CACHE_NAME);
for (var request of await tempCache.keys()) {
var response = await tempCache.match(request);
await contentCache.put(request, response);
}
await caches.delete(TEMP);
// Save the manifest to make future upgrades efficient.
await manifestCache.put('manifest', new Response(JSON.stringify(RESOURCES)));
// Claim client to enable caching on first launch
self.clients.claim();
return;
}
var oldManifest = await manifest.json();
var origin = self.location.origin;
for (var request of await contentCache.keys()) {
var key = request.url.substring(origin.length + 1);
if (key == "") {
key = "/";
}
// If a resource from the old manifest is not in the new cache, or if
// the MD5 sum has changed, delete it. Otherwise the resource is left
// in the cache and can be reused by the new service worker.
if (!RESOURCES[key] || RESOURCES[key] != oldManifest[key]) {
await contentCache.delete(request);
}
}
// Populate the cache with the app shell TEMP files, potentially overwriting
// cache files preserved above.
for (var request of await tempCache.keys()) {
var response = await tempCache.match(request);
await contentCache.put(request, response);
}
await caches.delete(TEMP);
// Save the manifest to make future upgrades efficient.
await manifestCache.put('manifest', new Response(JSON.stringify(RESOURCES)));
// Claim client to enable caching on first launch
self.clients.claim();
return;
} catch (err) {
// On an unhandled exception the state of the cache cannot be guaranteed.
console.error('Failed to upgrade service worker: ' + err);
await caches.delete(CACHE_NAME);
await caches.delete(TEMP);
await caches.delete(MANIFEST);
}
}());
});
// The fetch handler redirects requests for RESOURCE files to the service
// worker cache.
self.addEventListener("fetch", (event) => {
if (event.request.method !== 'GET') {
return;
}
var origin = self.location.origin;
var key = event.request.url.substring(origin.length + 1);
// Redirect URLs to the index.html
if (key.indexOf('?v=') != -1) {
key = key.split('?v=')[0];
}
if (event.request.url == origin || event.request.url.startsWith(origin + '/#') || key == '') {
key = '/';
}
// If the URL is not the RESOURCE list then return to signal that the
// browser should take over.
if (!RESOURCES[key]) {
return;
}
// If the URL is the index.html, perform an online-first request.
if (key == '/') {
return onlineFirst(event);
}
event.respondWith(caches.open(CACHE_NAME)
.then((cache) => {
return cache.match(event.request).then((response) => {
// Either respond with the cached resource, or perform a fetch and
// lazily populate the cache only if the resource was successfully fetched.
return response || fetch(event.request).then((response) => {
if (response && Boolean(response.ok)) {
cache.put(event.request, response.clone());
}
return response;
});
})
})
);
});
self.addEventListener('message', (event) => {
// SkipWaiting can be used to immediately activate a waiting service worker.
// This will also require a page refresh triggered by the main worker.
if (event.data === 'skipWaiting') {
self.skipWaiting();
return;
}
if (event.data === 'downloadOffline') {
downloadOffline();
return;
}
});
// Download offline will check the RESOURCES for all files not in the cache
// and populate them.
async function downloadOffline() {
var resources = [];
var contentCache = await caches.open(CACHE_NAME);
var currentContent = {};
for (var request of await contentCache.keys()) {
var key = request.url.substring(origin.length + 1);
if (key == "") {
key = "/";
}
currentContent[key] = true;
}
for (var resourceKey of Object.keys(RESOURCES)) {
if (!currentContent[resourceKey]) {
resources.push(resourceKey);
}
}
return contentCache.addAll(resources);
}
// Attempt to download the resource online before falling back to
// the offline cache.
function onlineFirst(event) {
return event.respondWith(
fetch(event.request).then((response) => {
return caches.open(CACHE_NAME).then((cache) => {
cache.put(event.request, response.clone());
return response;
});
}).catch((error) => {
return caches.open(CACHE_NAME).then((cache) => {
return cache.match(event.request).then((response) => {
if (response != null) {
return response;
}
throw error;
});
});
})
);
}

0
web/folderPage.java Normal file
View File

BIN
web/icons/Icon-192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
web/icons/Icon-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

48
web/index.html Normal file
View File

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html>
<head>
<!--
If you are serving your web app in a path other than the root, change the
href value below to reflect the base path you are serving from.
The path provided below has to start and end with a slash "/" in order for
it to work correctly.
For more details:
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
This is a placeholder for base href that will be replaced by the value of
the `--base-href` argument provided to `flutter build`.
-->
<base href="/static/">
<meta charset="UTF-8">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<meta name="description" content="Shelfy">
<!-- iOS meta tags & icons -->
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="shelfy_app">
<link rel="apple-touch-icon" href="icons/Icon-192.png">
<!-- Favicon -->
<link rel="icon" type="image/png" href="favicon.png"/>
<title>shelfy_app</title>
<link rel="manifest" href="manifest.json">
</head>
<body>
<script src='https://cdn.jsdelivr.net/npm/pdfjs-dist@4.6.82/build/pdf.min.mjs' type='module'></script>
<script type='module'>
var { pdfjsLib } = globalThis;
pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@4.6.82/build/pdf.worker.mjs';
var pdfRenderOptions = {
cMapUrl: 'https://cdn.jsdelivr.net/npm/pdfjs-dist@4.6.82/cmaps/',
cMapPacked: true,
}
</script>
<script src="flutter_bootstrap.js" async></script>
</body>
</html>

107015
web/main.dart.js Normal file

File diff suppressed because one or more lines are too long

35
web/manifest.json Normal file
View File

@ -0,0 +1,35 @@
{
"name": "shelfy_app",
"short_name": "shelfy_app",
"start_url": ".",
"display": "standalone",
"background_color": "#0175C2",
"theme_color": "#0175C2",
"description": "Shelfy",
"orientation": "portrait-primary",
"prefer_related_applications": false,
"icons": [
{
"src": "icons/Icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "icons/Icon-512.png",
"sizes": "512x512",
"type": "image/png"
},
{
"src": "icons/Icon-maskable-192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "icons/Icon-maskable-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
]
}

1
web/version.json Normal file
View File

@ -0,0 +1 @@
{"app_name":"shelfy_app","version":"1.0.0","build_number":"1","package_name":"shelfy_app"}