diff --git a/.bingo/Variables.mk b/.bingo/Variables.mk
index 606269b18e..cd213c74f2 100644
--- a/.bingo/Variables.mk
+++ b/.bingo/Variables.mk
@@ -29,17 +29,17 @@ $(CONFTEST): $(BINGO_DIR)/conftest.mod
@echo "(re)installing $(GOBIN)/conftest-v0.62.0"
@cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=conftest.mod -o=$(GOBIN)/conftest-v0.62.0 "github.com/open-policy-agent/conftest"
-CONTROLLER_GEN := $(GOBIN)/controller-gen-v0.20.1
+CONTROLLER_GEN := $(GOBIN)/controller-gen-v0.21.0
$(CONTROLLER_GEN): $(BINGO_DIR)/controller-gen.mod
@# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies.
- @echo "(re)installing $(GOBIN)/controller-gen-v0.20.1"
- @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=controller-gen.mod -o=$(GOBIN)/controller-gen-v0.20.1 "sigs.k8s.io/controller-tools/cmd/controller-gen"
+ @echo "(re)installing $(GOBIN)/controller-gen-v0.21.0"
+ @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=controller-gen.mod -o=$(GOBIN)/controller-gen-v0.21.0 "sigs.k8s.io/controller-tools/cmd/controller-gen"
-CRD_DIFF := $(GOBIN)/crd-diff-v0.5.1-0.20260309184313-54162f2e3097
+CRD_DIFF := $(GOBIN)/crd-diff-v0.6.0
$(CRD_DIFF): $(BINGO_DIR)/crd-diff.mod
@# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies.
- @echo "(re)installing $(GOBIN)/crd-diff-v0.5.1-0.20260309184313-54162f2e3097"
- @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=crd-diff.mod -o=$(GOBIN)/crd-diff-v0.5.1-0.20260309184313-54162f2e3097 "sigs.k8s.io/crdify"
+ @echo "(re)installing $(GOBIN)/crd-diff-v0.6.0"
+ @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=crd-diff.mod -o=$(GOBIN)/crd-diff-v0.6.0 "sigs.k8s.io/crdify"
CRD_REF_DOCS := $(GOBIN)/crd-ref-docs-v0.3.0
$(CRD_REF_DOCS): $(BINGO_DIR)/crd-ref-docs.mod
@@ -77,12 +77,6 @@ $(KUBE_SCORE): $(BINGO_DIR)/kube-score.mod
@echo "(re)installing $(GOBIN)/kube-score-v1.20.0"
@cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=kube-score.mod -o=$(GOBIN)/kube-score-v1.20.0 "github.com/zegl/kube-score/cmd/kube-score"
-KUSTOMIZE := $(GOBIN)/kustomize-v5.7.1
-$(KUSTOMIZE): $(BINGO_DIR)/kustomize.mod
- @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies.
- @echo "(re)installing $(GOBIN)/kustomize-v5.7.1"
- @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=kustomize.mod -o=$(GOBIN)/kustomize-v5.7.1 "sigs.k8s.io/kustomize/kustomize/v5"
-
OPERATOR_SDK := $(GOBIN)/operator-sdk-v1.41.1
$(OPERATOR_SDK): $(BINGO_DIR)/operator-sdk.mod
@# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies.
diff --git a/.bingo/controller-gen.mod b/.bingo/controller-gen.mod
index 62af3f7f74..5ba4e2ecff 100644
--- a/.bingo/controller-gen.mod
+++ b/.bingo/controller-gen.mod
@@ -1,5 +1,5 @@
module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT
-go 1.25.0
+go 1.26.0
-require sigs.k8s.io/controller-tools v0.20.1 // cmd/controller-gen
+require sigs.k8s.io/controller-tools v0.21.0 // cmd/controller-gen
diff --git a/.bingo/controller-gen.sum b/.bingo/controller-gen.sum
index b22b093bc0..095c0a4107 100644
--- a/.bingo/controller-gen.sum
+++ b/.bingo/controller-gen.sum
@@ -4,24 +4,58 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w=
+github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE=
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
+github.com/fxamacker/cbor/v2 v2.9.1 h1:2rWm8B193Ll4VdjsJY28jxs70IdDsHRWgQYAI80+rMQ=
+github.com/fxamacker/cbor/v2 v2.9.1/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4=
+github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY=
github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe+pJyVWRdiE=
+github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw=
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-openapi/swag v0.26.0 h1:GVDXCmfvhfu1BxiHo8/FA+BbKmhecHnG3varjON5/RI=
+github.com/go-openapi/swag v0.26.0/go.mod h1:82g3193sZJRbocs7bNCqGfIgq8pkuwVwCfhKIRlEQF0=
+github.com/go-openapi/swag/cmdutils v0.26.0 h1:iowihOcvq7y4egO8cOq0dmfohz6wfeQ63U1EnuhO2TU=
+github.com/go-openapi/swag/cmdutils v0.26.0/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM=
+github.com/go-openapi/swag/conv v0.26.0 h1:5yGGsPYI1ZCva93U0AoKi/iZrNhaJEjr324YVsiD89I=
+github.com/go-openapi/swag/conv v0.26.0/go.mod h1:tpAmIL7X58VPnHHiSO4uE3jBeRamGsFsfdDeDtb5ECE=
+github.com/go-openapi/swag/fileutils v0.26.0 h1:WJoPRvsA7QRiiWluowkLJa9jaYR7FCuxmDvnCgaRRxU=
+github.com/go-openapi/swag/fileutils v0.26.0/go.mod h1:0WDJ7lp67eNjPMO50wAWYlKvhOb6CQ37rzR7wrgI8Tc=
+github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w=
+github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M=
+github.com/go-openapi/swag/jsonutils v0.26.0 h1:FawFML2iAXsPqmERscuMPIHmFsoP1tOqWkxBaKNMsnA=
+github.com/go-openapi/swag/jsonutils v0.26.0/go.mod h1:2VmA0CJlyFqgawOaPI9psnjFDqzyivIqLYN34t9p91E=
+github.com/go-openapi/swag/loading v0.26.0 h1:Apg6zaKhCJurpJer0DCxq99qwmhFddBhaMX7kilDcko=
+github.com/go-openapi/swag/loading v0.26.0/go.mod h1:dBxQ/6V2uBaAQdevN18VELE6xSpJWZxLX4txe12JwDg=
+github.com/go-openapi/swag/mangling v0.26.0 h1:Du2YC4YLA/Y5m/YKQd7AnY5qq0wRKSFZTTt8ktFaXcQ=
+github.com/go-openapi/swag/mangling v0.26.0/go.mod h1:jifS7W9vbg+pw63bT+GI53otluMQL3CeemuyCHKwVx0=
+github.com/go-openapi/swag/netutils v0.26.0 h1:CmZp+ZT7HrmFwrC3GdGsXBq2+42T1bjKBapcqVpIs3c=
+github.com/go-openapi/swag/netutils v0.26.0/go.mod h1:5iK+Ok3ZohWWex1C50BFTPexi03UaPwjW4Oj8kgrpwo=
+github.com/go-openapi/swag/stringutils v0.26.0 h1:qZQngLxs5s7SLijc3N2ZO+fUq2o8LjuWAASSrJuh+xg=
+github.com/go-openapi/swag/stringutils v0.26.0/go.mod h1:sWn5uY+QIIspwPhvgnqJsH8xqFT2ZbYcvbcFanRyhFE=
+github.com/go-openapi/swag/typeutils v0.26.0 h1:2kdEwdiNWy+JJdOvu5MA2IIg2SylWAFuuyQIKYybfq4=
+github.com/go-openapi/swag/typeutils v0.26.0/go.mod h1:oovDuIUvTrEHVMqWilQzKzV4YlSKgyZmFh7AlfABNVE=
+github.com/go-openapi/swag/yamlutils v0.26.0 h1:H7O8l/8NJJQ/oiReEN+oMpnGMyt8G0hl460nRZxhLMQ=
+github.com/go-openapi/swag/yamlutils v0.26.0/go.mod h1:1evKEGAtP37Pkwcc7EWMF0hedX0/x3Rkvei2wtG/TbU=
github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4=
github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
+github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c=
+github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
@@ -39,6 +73,8 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
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=
@@ -75,6 +111,8 @@ go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
+go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
+go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -86,6 +124,8 @@ golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI=
golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg=
+golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM=
+golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -94,6 +134,8 @@ golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
+golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
+golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -101,6 +143,8 @@ golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
+golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
+golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -110,12 +154,16 @@ golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
+golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
+golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
+golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
@@ -124,6 +172,8 @@ golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA=
golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc=
+golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c=
+golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -132,6 +182,8 @@ google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2
google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
+google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI=
+google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
@@ -145,38 +197,54 @@ k8s.io/api v0.34.0 h1:L+JtP2wDbEYPUeNGbeSa/5GwFtIA662EmT2YSLOkAVE=
k8s.io/api v0.34.0/go.mod h1:YzgkIzOOlhl9uwWCZNqpw6RJy9L2FK4dlJeayUoydug=
k8s.io/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY=
k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA=
+k8s.io/api v0.36.0 h1:SgqDhZzHdOtMk40xVSvCXkP9ME0H05hPM3p9AB1kL80=
+k8s.io/api v0.36.0/go.mod h1:m1LVrGPNYax5NBHdO+QuAedXyuzTt4RryI/qnmNvs34=
k8s.io/apiextensions-apiserver v0.34.0 h1:B3hiB32jV7BcyKcMU5fDaDxk882YrJ1KU+ZSkA9Qxoc=
k8s.io/apiextensions-apiserver v0.34.0/go.mod h1:hLI4GxE1BDBy9adJKxUxCEHBGZtGfIg98Q+JmTD7+g0=
k8s.io/apiextensions-apiserver v0.35.0 h1:3xHk2rTOdWXXJM+RDQZJvdx0yEOgC0FgQ1PlJatA5T4=
k8s.io/apiextensions-apiserver v0.35.0/go.mod h1:E1Ahk9SADaLQ4qtzYFkwUqusXTcaV2uw3l14aqpL2LU=
+k8s.io/apiextensions-apiserver v0.36.0 h1:Wt7E8J+VBCbj4FjiBfDTK/neXDDjyJVJc7xfuOHImZ0=
+k8s.io/apiextensions-apiserver v0.36.0/go.mod h1:kGDjH0msuiIB3tgsYRV0kS9GqpMYMUsQ3GHv7TApyug=
k8s.io/apimachinery v0.34.0 h1:eR1WO5fo0HyoQZt1wdISpFDffnWOvFLOOeJ7MgIv4z0=
k8s.io/apimachinery v0.34.0/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw=
k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8=
k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
+k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ=
+k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc=
k8s.io/code-generator v0.34.0 h1:Ze2i1QsvUprIlX3oHiGv09BFQRLCz+StA8qKwwFzees=
k8s.io/code-generator v0.34.0/go.mod h1:Py2+4w2HXItL8CGhks8uI/wS3Y93wPKO/9mBQUYNua0=
k8s.io/code-generator v0.35.0 h1:TvrtfKYZTm9oDF2z+veFKSCcgZE3Igv0svY+ehCmjHQ=
k8s.io/code-generator v0.35.0/go.mod h1:iS1gvVf3c/T71N5DOGYO+Gt3PdJ6B9LYSvIyQ4FHzgc=
+k8s.io/code-generator v0.36.0 h1:XWAkrhnArm0VWMmSFO7kyB+wE2LROwep7hEH0GPGkqA=
+k8s.io/code-generator v0.36.0/go.mod h1:Tr2UhfBRdlyRoadfob9aPCmmGe8PUs5XPK9MEJ2nx+w=
k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f h1:SLb+kxmzfA87x4E4brQzB33VBbT2+x7Zq9ROIHmGn9Q=
k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
k8s.io/gengo/v2 v2.0.0-20250922181213-ec3ebc5fd46b h1:gMplByicHV/TJBizHd9aVEsTYoJBnnUAT5MHlTkbjhQ=
k8s.io/gengo/v2 v2.0.0-20250922181213-ec3ebc5fd46b/go.mod h1:CgujABENc3KuTrcsdpGmrrASjtQsWCT7R99mEV4U/fM=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
+k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
+k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA=
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts=
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE=
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ=
+k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199 h1:sWu4Td5mgJlwunsUydnhKEAfNUHM7hm1wfKEQmD7G5c=
+k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y=
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck=
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM=
+k8s.io/utils v0.0.0-20260319190234-28399d86e0b5/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
sigs.k8s.io/controller-tools v0.19.0 h1:OU7jrPPiZusryu6YK0jYSjPqg8Vhf8cAzluP9XGI5uk=
sigs.k8s.io/controller-tools v0.19.0/go.mod h1:y5HY/iNDFkmFla2CfQoVb2AQXMsBk4ad84iR1PLANB0=
sigs.k8s.io/controller-tools v0.20.0 h1:VWZF71pwSQ2lZZCt7hFGJsOfDc5dVG28/IysjjMWXL8=
sigs.k8s.io/controller-tools v0.20.0/go.mod h1:b4qPmjGU3iZwqn34alUU5tILhNa9+VXK+J3QV0fT/uU=
sigs.k8s.io/controller-tools v0.20.1 h1:gkfMt9YodI0K85oT8rVi80NTXO/kDmabKR5Ajn5GYxs=
sigs.k8s.io/controller-tools v0.20.1/go.mod h1:b4qPmjGU3iZwqn34alUU5tILhNa9+VXK+J3QV0fT/uU=
+sigs.k8s.io/controller-tools v0.21.0 h1:KXDQza3bgjlPY6xLR63tI/40gzjhyUAvkCrwzd2/6cs=
+sigs.k8s.io/controller-tools v0.21.0/go.mod h1:DLIypi3Q2+azVAP8jr/mHXJgveYYHFjhnNOUuBJ10JE=
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
@@ -185,5 +253,7 @@ sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco=
sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
+sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo=
+sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
diff --git a/.bingo/crd-diff.mod b/.bingo/crd-diff.mod
index ada6dbc70b..1522ad795b 100644
--- a/.bingo/crd-diff.mod
+++ b/.bingo/crd-diff.mod
@@ -2,4 +2,4 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT
go 1.24.6
-require sigs.k8s.io/crdify v0.5.1-0.20260309184313-54162f2e3097
+require sigs.k8s.io/crdify v0.6.0
diff --git a/.bingo/crd-diff.sum b/.bingo/crd-diff.sum
index a2a9858c62..0d8957724f 100644
--- a/.bingo/crd-diff.sum
+++ b/.bingo/crd-diff.sum
@@ -253,6 +253,8 @@ sigs.k8s.io/crdify v0.5.0 h1:mrMH9CgXQPTZUpTU6Klqfnlys8bggv/7uvLT2lXSP7A=
sigs.k8s.io/crdify v0.5.0/go.mod h1:ZIFxaYNgKYmFtZCLPysncXQ8oqwnNlHQbRUfxJHZwzU=
sigs.k8s.io/crdify v0.5.1-0.20260309184313-54162f2e3097 h1:gwDRFCc64lhEpxY944IJFW+CrmMFXWH+JjpE0JHp42Y=
sigs.k8s.io/crdify v0.5.1-0.20260309184313-54162f2e3097/go.mod h1:ZIFxaYNgKYmFtZCLPysncXQ8oqwnNlHQbRUfxJHZwzU=
+sigs.k8s.io/crdify v0.6.0 h1:1id5uhODipmEvmMC8jlr7IbpHTnepySWmBNEiwv23WQ=
+sigs.k8s.io/crdify v0.6.0/go.mod h1:ZIFxaYNgKYmFtZCLPysncXQ8oqwnNlHQbRUfxJHZwzU=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
diff --git a/.bingo/kustomize.mod b/.bingo/kustomize.mod
deleted file mode 100644
index 528b75c999..0000000000
--- a/.bingo/kustomize.mod
+++ /dev/null
@@ -1,5 +0,0 @@
-module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT
-
-go 1.24.6
-
-require sigs.k8s.io/kustomize/kustomize/v5 v5.7.1
diff --git a/.bingo/kustomize.sum b/.bingo/kustomize.sum
deleted file mode 100644
index f736ccf08b..0000000000
--- a/.bingo/kustomize.sum
+++ /dev/null
@@ -1,87 +0,0 @@
-github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
-github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
-github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/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/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
-github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
-github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
-github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
-github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
-github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
-github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
-github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
-github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
-github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
-github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw=
-github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw=
-github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
-github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
-github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
-github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
-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/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/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
-github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0=
-github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
-github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
-github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
-github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
-github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
-github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-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/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
-github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
-go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
-go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
-go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
-go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
-golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
-golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
-golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
-google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk=
-google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
-gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
-gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
-gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-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=
-k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 h1:hcha5B1kVACrLujCKLbr8XWMxCxzQx42DY8QKYJrDLg=
-k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7/go.mod h1:GewRfANuJ70iYzvn+i4lezLDAFzvjxZYK1gn1lWcfas=
-sigs.k8s.io/kustomize/api v0.20.1 h1:iWP1Ydh3/lmldBnH/S5RXgT98vWYMaTUL1ADcr+Sv7I=
-sigs.k8s.io/kustomize/api v0.20.1/go.mod h1:t6hUFxO+Ph0VxIk1sKp1WS0dOjbPCtLJ4p8aADLwqjM=
-sigs.k8s.io/kustomize/cmd/config v0.20.1 h1:4APUORmZe2BYrsqgGfEKdd/r7gM6i43egLrUzilpiFo=
-sigs.k8s.io/kustomize/cmd/config v0.20.1/go.mod h1:R7rQ8kxknVlXWVUIbxWtMgu8DCCNVtl8V0KrmeVd/KE=
-sigs.k8s.io/kustomize/kustomize/v5 v5.7.1 h1:sYJsarwy/SDJfjjLMUqwFDGPwzUtMOQ1i1Ed49+XSbw=
-sigs.k8s.io/kustomize/kustomize/v5 v5.7.1/go.mod h1:+5/SrBcJ4agx1SJknGuR/c9thwRSKLxnKoI5BzXFaLU=
-sigs.k8s.io/kustomize/kyaml v0.20.1 h1:PCMnA2mrVbRP3NIB6v9kYCAc38uvFLVs8j/CD567A78=
-sigs.k8s.io/kustomize/kyaml v0.20.1/go.mod h1:0EmkQHRUsJxY8Ug9Niig1pUMSCGHxQ5RklbpV/Ri6po=
-sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
-sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=
diff --git a/.bingo/variables.env b/.bingo/variables.env
index 0c0cdd1b17..05cc4cfb52 100644
--- a/.bingo/variables.env
+++ b/.bingo/variables.env
@@ -12,9 +12,9 @@ BINGO="${GOBIN}/bingo-v0.9.0"
CONFTEST="${GOBIN}/conftest-v0.62.0"
-CONTROLLER_GEN="${GOBIN}/controller-gen-v0.20.1"
+CONTROLLER_GEN="${GOBIN}/controller-gen-v0.21.0"
-CRD_DIFF="${GOBIN}/crd-diff-v0.5.1-0.20260309184313-54162f2e3097"
+CRD_DIFF="${GOBIN}/crd-diff-v0.6.0"
CRD_REF_DOCS="${GOBIN}/crd-ref-docs-v0.3.0"
@@ -28,8 +28,6 @@ KIND="${GOBIN}/kind-v0.32.0"
KUBE_SCORE="${GOBIN}/kube-score-v1.20.0"
-KUSTOMIZE="${GOBIN}/kustomize-v5.7.1"
-
OPERATOR_SDK="${GOBIN}/operator-sdk-v1.41.1"
OPM="${GOBIN}/opm-v1.60.0"
diff --git a/AGENTS.md b/AGENTS.md
index 27fb4d5c1c..9657ef47ca 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -165,7 +165,8 @@ make generate
│ │ ├── base/ # Base manifests & CRDs
│ │ ├── templates/ # Helm templates
│ │ └── values.yaml # Default values
-│ └── prometheus/ # Prometheus monitoring
+├── testdata/
+│ └── prometheus/ # kube-prometheus-stack values for e2e monitoring
├── test/ # Test suites
│ ├── e2e/ # End-to-end tests (see test/e2e/README.md)
│ ├── extension-developer-e2e/ # Extension developer tests
diff --git a/Makefile b/Makefile
index fdd34e7389..0b342e13f2 100644
--- a/Makefile
+++ b/Makefile
@@ -55,7 +55,7 @@ ifeq ($(shell [[ $$HOME == "" || $$HOME == "/" ]] && [[ $$XDG_DATA_HOME == "" ]]
SETUP_ENVTEST_BIN_DIR_OVERRIDE += --bin-dir /tmp/envtest-binaries
endif
-# bingo manages consistent tooling versions for things like kind, kustomize, etc.
+# bingo manages consistent tooling versions for things like kind, etc.
include .bingo/Variables.mk
ifeq ($(origin KIND_CLUSTER_NAME), undefined)
@@ -123,9 +123,8 @@ lint: lint-custom $(GOLANGCI_LINT) #HELP Run golangci linter.
.PHONY: lint-helm
lint-helm: $(HELM) $(CONFTEST) #HELP Run helm linter
- helm lint helm/olmv1
- helm lint helm/prometheus
- (set -euo pipefail; helm template olmv1 helm/olmv1; helm template prometheus helm/prometheus) | $(CONFTEST) test --policy hack/conftest/policy/ --combine -n main -n prometheus -
+ $(HELM) lint helm/olmv1
+ (set -euo pipefail; $(HELM) template olmv1 helm/olmv1) | $(CONFTEST) test --policy hack/conftest/policy/ --combine -n main -
.PHONY: lint-deployed-resources
lint-deployed-resources: $(KUBE_SCORE) #EXHELP Lint deployed resources.
@@ -166,6 +165,10 @@ tidy:
.PHONY: update-crds
update-crds:
hack/tools/update-crds.sh
+ @# Revert CRD files where the only change is the controller-gen version annotation
+ @for f in $$(git diff --name-only -- helm/ hack/tools/crd-generator/testdata/); do \
+ git diff --quiet -I 'controller-gen.kubebuilder.io/version' -- "$$f" && git restore --worktree -- "$$f" || true; \
+ done
# The filename variables can be overridden on the command line if you want to change the set of values files:
# e.g. make "manifests/standard.yaml=helm/cert-manager.yaml my-values-file.yaml" manifests
@@ -188,6 +191,8 @@ $(MANIFESTS): $(HELM) $(CONFTEST)
@mkdir -p $(MANIFEST_HOME)
$(HELM) template olmv1 helm/olmv1 $(addprefix --values ,$($@)) $(addprefix --set ,$(HELM_SETTINGS)) > $@
$(CONFTEST) test --policy hack/conftest/policy/ -n main --combine $@
+ @# Revert manifest if the only change is the controller-gen version annotation
+ @git diff --quiet -I 'controller-gen.kubebuilder.io/version' -- "$@" && git restore --worktree -- "$@" || true
# Generate manifests stored in source-control
.PHONY: manifests
@@ -202,6 +207,10 @@ generate: $(CONTROLLER_GEN) #EXHELP Generate code containing DeepCopy, DeepCopyI
@find api cmd hack internal -name "zz_generated.deepcopy.go" -not -path "*/vendor/*" -delete && rm -rf applyconfigurations
$(CONTROLLER_GEN) --load-build-tags=$(GO_BUILD_TAGS) applyconfiguration:headerFile="hack/boilerplate.go.txt" paths="./api/..."
$(CONTROLLER_GEN) --load-build-tags=$(GO_BUILD_TAGS) object:headerFile="hack/boilerplate.go.txt" paths="./..."
+ @# Revert generated files where the only change is the controller-gen version comment
+ @for f in $$(git diff --name-only); do \
+ git diff --quiet -I 'Code generated by controller-gen' -- "$$f" && git restore --worktree -- "$$f" || true; \
+ done
.PHONY: verify
verify: k8s-pin kind-verify-versions fmt generate manifests update-tls-profiles crd-ref-docs update-registryv1-bundle-schema verify-bingo #HELP Verify all generated code is up-to-date. Runs k8s-pin instead of just tidy.
@@ -328,18 +337,28 @@ test-experimental-e2e: GO_BUILD_EXTRA_FLAGS := -cover
test-experimental-e2e: COVERAGE_NAME := experimental-e2e
test-experimental-e2e: export MANIFEST := $(EXPERIMENTAL_RELEASE_MANIFEST)
test-experimental-e2e: export INSTALL_DEFAULT_CATALOGS := false
-test-experimental-e2e: PROMETHEUS_VALUES := helm/prom_experimental.yaml
+test-experimental-e2e: PROMETHEUS_VALUES := testdata/prometheus/values-experimental.yaml
test-experimental-e2e: E2E_TIMEOUT ?= 25m
test-experimental-e2e: run-internal prometheus e2e e2e-coverage kind-clean #HELP Run experimental e2e test suite on local kind cluster
+CATALOGD_CERT_SECRET = catalogd-service-cert-$(VERSION)
+
.PHONY: prometheus
prometheus: PROMETHEUS_NAMESPACE := olmv1-system
-prometheus: PROMETHEUS_VERSION := v0.83.0
-prometheus: $(KUSTOMIZE) #EXHELP Deploy Prometheus into specified namespace
+prometheus: PROMETHEUS_CHART_VERSION := 86.2.2
+prometheus: $(HELM) #EXHELP Deploy Prometheus into specified namespace
ifeq ($(strip $(E2E_SUMMARY_OUTPUT)),)
@echo "E2E_SUMMARY_OUTPUT unset; skipping prometheus deployment"
else
- ./hack/test/install-prometheus.sh $(PROMETHEUS_NAMESPACE) $(PROMETHEUS_VERSION) $(VERSION) $(PROMETHEUS_VALUES)
+ $(HELM) upgrade --install prometheus oci://ghcr.io/prometheus-community/charts/kube-prometheus-stack \
+ --namespace $(PROMETHEUS_NAMESPACE) --create-namespace \
+ --version $(PROMETHEUS_CHART_VERSION) \
+ -f testdata/prometheus/values.yaml \
+ $(if $(PROMETHEUS_VALUES),-f $(PROMETHEUS_VALUES)) \
+ --set-string 'prometheus.additionalServiceMonitors[1].endpoints[0].tlsConfig.ca.secret.name=$(CATALOGD_CERT_SECRET)' \
+ --set-string 'prometheus.additionalServiceMonitors[1].endpoints[0].tlsConfig.cert.secret.name=$(CATALOGD_CERT_SECRET)' \
+ --set-string 'prometheus.additionalServiceMonitors[1].endpoints[0].tlsConfig.keySecret.name=$(CATALOGD_CERT_SECRET)' \
+ --wait --timeout 5m
endif
.PHONY: test-extension-developer-e2e
diff --git a/api/v1/clustercatalog_types.go b/api/v1/clustercatalog_types.go
index c8690cbaf3..c2e1ec9e36 100644
--- a/api/v1/clustercatalog_types.go
+++ b/api/v1/clustercatalog_types.go
@@ -18,6 +18,7 @@ package v1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
)
// SourceType defines the type of source used for catalogs.
@@ -331,5 +332,8 @@ type ImageSource struct {
}
func init() {
- SchemeBuilder.Register(&ClusterCatalog{}, &ClusterCatalogList{})
+ SchemeBuilder.Register(func(s *runtime.Scheme) error {
+ s.AddKnownTypes(GroupVersion, &ClusterCatalog{}, &ClusterCatalogList{})
+ return nil
+ })
}
diff --git a/api/v1/clusterextension_types.go b/api/v1/clusterextension_types.go
index 12614d1a43..99bc160d74 100644
--- a/api/v1/clusterextension_types.go
+++ b/api/v1/clusterextension_types.go
@@ -19,6 +19,7 @@ package v1
import (
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
)
var ClusterExtensionKind = "ClusterExtension"
@@ -606,5 +607,8 @@ type ClusterExtensionList struct {
}
func init() {
- SchemeBuilder.Register(&ClusterExtension{}, &ClusterExtensionList{})
+ SchemeBuilder.Register(func(s *runtime.Scheme) error {
+ s.AddKnownTypes(GroupVersion, &ClusterExtension{}, &ClusterExtensionList{})
+ return nil
+ })
}
diff --git a/api/v1/clusterobjectset_types.go b/api/v1/clusterobjectset_types.go
index b9aeb96f2c..56fe210bd9 100644
--- a/api/v1/clusterobjectset_types.go
+++ b/api/v1/clusterobjectset_types.go
@@ -19,6 +19,7 @@ package v1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+ "k8s.io/apimachinery/pkg/runtime"
)
const (
@@ -593,5 +594,8 @@ type ClusterObjectSetList struct {
}
func init() {
- SchemeBuilder.Register(&ClusterObjectSet{}, &ClusterObjectSetList{})
+ SchemeBuilder.Register(func(s *runtime.Scheme) error {
+ s.AddKnownTypes(GroupVersion, &ClusterObjectSet{}, &ClusterObjectSetList{})
+ return nil
+ })
}
diff --git a/api/v1/groupversion_info.go b/api/v1/groupversion_info.go
index 39efbee0d3..3e549f8d3b 100644
--- a/api/v1/groupversion_info.go
+++ b/api/v1/groupversion_info.go
@@ -22,8 +22,9 @@ limitations under the License.
package v1
import (
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
- "sigs.k8s.io/controller-runtime/pkg/scheme"
)
var (
@@ -35,7 +36,10 @@ var (
SchemeGroupVersion = GroupVersion
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
- SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
+ SchemeBuilder = runtime.NewSchemeBuilder(func(s *runtime.Scheme) error {
+ metav1.AddToGroupVersion(s, GroupVersion)
+ return nil
+ })
// AddToScheme adds the types in this group-version to the given scheme.
AddToScheme = SchemeBuilder.AddToScheme
diff --git a/api/v1/zz_generated.deepcopy.go b/api/v1/zz_generated.deepcopy.go
index ef6f145b9e..6836216378 100644
--- a/api/v1/zz_generated.deepcopy.go
+++ b/api/v1/zz_generated.deepcopy.go
@@ -22,7 +22,7 @@ package v1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- runtime "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/runtime"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
diff --git a/applyconfigurations/api/v1/clustercatalog.go b/applyconfigurations/api/v1/clustercatalog.go
index 13a50c26b3..3a2f643aaf 100644
--- a/applyconfigurations/api/v1/clustercatalog.go
+++ b/applyconfigurations/api/v1/clustercatalog.go
@@ -13,13 +13,16 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
-// Code generated by controller-gen-v0.20. DO NOT EDIT.
+// Code generated by controller-gen-v0.21. DO NOT EDIT.
package v1
import (
+ apiv1 "github.com/operator-framework/operator-controller/api/v1"
+ internal "github.com/operator-framework/operator-controller/applyconfigurations/internal"
apismetav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
types "k8s.io/apimachinery/pkg/types"
+ managedfields "k8s.io/apimachinery/pkg/util/managedfields"
metav1 "k8s.io/client-go/applyconfigurations/meta/v1"
)
@@ -53,6 +56,46 @@ func ClusterCatalog(name string) *ClusterCatalogApplyConfiguration {
return b
}
+// ExtractClusterCatalogFrom extracts the applied configuration owned by fieldManager from
+// clusterCatalog for the specified subresource. Pass an empty string for subresource to extract
+// the main resource. Common subresources include "status", "scale", etc.
+// clusterCatalog must be a unmodified ClusterCatalog API object that was retrieved from the Kubernetes API.
+// ExtractClusterCatalogFrom provides a way to perform a extract/modify-in-place/apply workflow.
+// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously
+// applied if another fieldManager has updated or force applied any of the previously applied fields.
+func ExtractClusterCatalogFrom(clusterCatalog *apiv1.ClusterCatalog, fieldManager string, subresource string) (*ClusterCatalogApplyConfiguration, error) {
+ b := &ClusterCatalogApplyConfiguration{}
+ err := managedfields.ExtractInto(clusterCatalog, internal.Parser().Type("com.github.operator-framework.operator-controller.api.v1.ClusterCatalog"), fieldManager, b, subresource)
+ if err != nil {
+ return nil, err
+ }
+ b.WithName(clusterCatalog.Name)
+
+ b.WithKind("ClusterCatalog")
+ b.WithAPIVersion("olm.operatorframework.io/v1")
+ return b, nil
+}
+
+// ExtractClusterCatalog extracts the applied configuration owned by fieldManager from
+// clusterCatalog. If no managedFields are found in clusterCatalog for fieldManager, a
+// ClusterCatalogApplyConfiguration is returned with only the Name, Namespace (if applicable),
+// APIVersion and Kind populated. It is possible that no managed fields were found for because other
+// field managers have taken ownership of all the fields previously owned by fieldManager, or because
+// the fieldManager never owned fields any fields.
+// clusterCatalog must be a unmodified ClusterCatalog API object that was retrieved from the Kubernetes API.
+// ExtractClusterCatalog provides a way to perform a extract/modify-in-place/apply workflow.
+// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously
+// applied if another fieldManager has updated or force applied any of the previously applied fields.
+func ExtractClusterCatalog(clusterCatalog *apiv1.ClusterCatalog, fieldManager string) (*ClusterCatalogApplyConfiguration, error) {
+ return ExtractClusterCatalogFrom(clusterCatalog, fieldManager, "")
+}
+
+// ExtractClusterCatalogStatus extracts the applied configuration owned by fieldManager from
+// clusterCatalog for the status subresource.
+func ExtractClusterCatalogStatus(clusterCatalog *apiv1.ClusterCatalog, fieldManager string) (*ClusterCatalogApplyConfiguration, error) {
+ return ExtractClusterCatalogFrom(clusterCatalog, fieldManager, "status")
+}
+
func (b ClusterCatalogApplyConfiguration) IsApplyConfiguration() {}
// WithKind sets the Kind field in the declarative configuration to the given value
diff --git a/applyconfigurations/api/v1/clusterextension.go b/applyconfigurations/api/v1/clusterextension.go
index b5826dd0d9..d195f0fadf 100644
--- a/applyconfigurations/api/v1/clusterextension.go
+++ b/applyconfigurations/api/v1/clusterextension.go
@@ -13,13 +13,16 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
-// Code generated by controller-gen-v0.20. DO NOT EDIT.
+// Code generated by controller-gen-v0.21. DO NOT EDIT.
package v1
import (
+ apiv1 "github.com/operator-framework/operator-controller/api/v1"
+ internal "github.com/operator-framework/operator-controller/applyconfigurations/internal"
apismetav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
types "k8s.io/apimachinery/pkg/types"
+ managedfields "k8s.io/apimachinery/pkg/util/managedfields"
metav1 "k8s.io/client-go/applyconfigurations/meta/v1"
)
@@ -48,6 +51,46 @@ func ClusterExtension(name string) *ClusterExtensionApplyConfiguration {
return b
}
+// ExtractClusterExtensionFrom extracts the applied configuration owned by fieldManager from
+// clusterExtension for the specified subresource. Pass an empty string for subresource to extract
+// the main resource. Common subresources include "status", "scale", etc.
+// clusterExtension must be a unmodified ClusterExtension API object that was retrieved from the Kubernetes API.
+// ExtractClusterExtensionFrom provides a way to perform a extract/modify-in-place/apply workflow.
+// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously
+// applied if another fieldManager has updated or force applied any of the previously applied fields.
+func ExtractClusterExtensionFrom(clusterExtension *apiv1.ClusterExtension, fieldManager string, subresource string) (*ClusterExtensionApplyConfiguration, error) {
+ b := &ClusterExtensionApplyConfiguration{}
+ err := managedfields.ExtractInto(clusterExtension, internal.Parser().Type("com.github.operator-framework.operator-controller.api.v1.ClusterExtension"), fieldManager, b, subresource)
+ if err != nil {
+ return nil, err
+ }
+ b.WithName(clusterExtension.Name)
+
+ b.WithKind("ClusterExtension")
+ b.WithAPIVersion("olm.operatorframework.io/v1")
+ return b, nil
+}
+
+// ExtractClusterExtension extracts the applied configuration owned by fieldManager from
+// clusterExtension. If no managedFields are found in clusterExtension for fieldManager, a
+// ClusterExtensionApplyConfiguration is returned with only the Name, Namespace (if applicable),
+// APIVersion and Kind populated. It is possible that no managed fields were found for because other
+// field managers have taken ownership of all the fields previously owned by fieldManager, or because
+// the fieldManager never owned fields any fields.
+// clusterExtension must be a unmodified ClusterExtension API object that was retrieved from the Kubernetes API.
+// ExtractClusterExtension provides a way to perform a extract/modify-in-place/apply workflow.
+// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously
+// applied if another fieldManager has updated or force applied any of the previously applied fields.
+func ExtractClusterExtension(clusterExtension *apiv1.ClusterExtension, fieldManager string) (*ClusterExtensionApplyConfiguration, error) {
+ return ExtractClusterExtensionFrom(clusterExtension, fieldManager, "")
+}
+
+// ExtractClusterExtensionStatus extracts the applied configuration owned by fieldManager from
+// clusterExtension for the status subresource.
+func ExtractClusterExtensionStatus(clusterExtension *apiv1.ClusterExtension, fieldManager string) (*ClusterExtensionApplyConfiguration, error) {
+ return ExtractClusterExtensionFrom(clusterExtension, fieldManager, "status")
+}
+
func (b ClusterExtensionApplyConfiguration) IsApplyConfiguration() {}
// WithKind sets the Kind field in the declarative configuration to the given value
diff --git a/applyconfigurations/api/v1/clusterobjectset.go b/applyconfigurations/api/v1/clusterobjectset.go
index bea5d16ff1..ae63a811ae 100644
--- a/applyconfigurations/api/v1/clusterobjectset.go
+++ b/applyconfigurations/api/v1/clusterobjectset.go
@@ -13,13 +13,16 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
-// Code generated by controller-gen-v0.20. DO NOT EDIT.
+// Code generated by controller-gen-v0.21. DO NOT EDIT.
package v1
import (
+ apiv1 "github.com/operator-framework/operator-controller/api/v1"
+ internal "github.com/operator-framework/operator-controller/applyconfigurations/internal"
apismetav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
types "k8s.io/apimachinery/pkg/types"
+ managedfields "k8s.io/apimachinery/pkg/util/managedfields"
metav1 "k8s.io/client-go/applyconfigurations/meta/v1"
)
@@ -53,6 +56,46 @@ func ClusterObjectSet(name string) *ClusterObjectSetApplyConfiguration {
return b
}
+// ExtractClusterObjectSetFrom extracts the applied configuration owned by fieldManager from
+// clusterObjectSet for the specified subresource. Pass an empty string for subresource to extract
+// the main resource. Common subresources include "status", "scale", etc.
+// clusterObjectSet must be a unmodified ClusterObjectSet API object that was retrieved from the Kubernetes API.
+// ExtractClusterObjectSetFrom provides a way to perform a extract/modify-in-place/apply workflow.
+// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously
+// applied if another fieldManager has updated or force applied any of the previously applied fields.
+func ExtractClusterObjectSetFrom(clusterObjectSet *apiv1.ClusterObjectSet, fieldManager string, subresource string) (*ClusterObjectSetApplyConfiguration, error) {
+ b := &ClusterObjectSetApplyConfiguration{}
+ err := managedfields.ExtractInto(clusterObjectSet, internal.Parser().Type("com.github.operator-framework.operator-controller.api.v1.ClusterObjectSet"), fieldManager, b, subresource)
+ if err != nil {
+ return nil, err
+ }
+ b.WithName(clusterObjectSet.Name)
+
+ b.WithKind("ClusterObjectSet")
+ b.WithAPIVersion("olm.operatorframework.io/v1")
+ return b, nil
+}
+
+// ExtractClusterObjectSet extracts the applied configuration owned by fieldManager from
+// clusterObjectSet. If no managedFields are found in clusterObjectSet for fieldManager, a
+// ClusterObjectSetApplyConfiguration is returned with only the Name, Namespace (if applicable),
+// APIVersion and Kind populated. It is possible that no managed fields were found for because other
+// field managers have taken ownership of all the fields previously owned by fieldManager, or because
+// the fieldManager never owned fields any fields.
+// clusterObjectSet must be a unmodified ClusterObjectSet API object that was retrieved from the Kubernetes API.
+// ExtractClusterObjectSet provides a way to perform a extract/modify-in-place/apply workflow.
+// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously
+// applied if another fieldManager has updated or force applied any of the previously applied fields.
+func ExtractClusterObjectSet(clusterObjectSet *apiv1.ClusterObjectSet, fieldManager string) (*ClusterObjectSetApplyConfiguration, error) {
+ return ExtractClusterObjectSetFrom(clusterObjectSet, fieldManager, "")
+}
+
+// ExtractClusterObjectSetStatus extracts the applied configuration owned by fieldManager from
+// clusterObjectSet for the status subresource.
+func ExtractClusterObjectSetStatus(clusterObjectSet *apiv1.ClusterObjectSet, fieldManager string) (*ClusterObjectSetApplyConfiguration, error) {
+ return ExtractClusterObjectSetFrom(clusterObjectSet, fieldManager, "status")
+}
+
func (b ClusterObjectSetApplyConfiguration) IsApplyConfiguration() {}
// WithKind sets the Kind field in the declarative configuration to the given value
diff --git a/applyconfigurations/internal/internal.go b/applyconfigurations/internal/internal.go
index a296a1a64f..dde5aaf513 100644
--- a/applyconfigurations/internal/internal.go
+++ b/applyconfigurations/internal/internal.go
@@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
-// Code generated by controller-gen-v0.20. DO NOT EDIT.
+// Code generated by controller-gen-v0.21. DO NOT EDIT.
package internal
@@ -38,6 +38,665 @@ func Parser() *typed.Parser {
var parserOnce sync.Once
var parser *typed.Parser
var schemaYAML = typed.YAMLObject(`types:
+- name: com.github.operator-framework.operator-controller.api.v1.Assertion
+ map:
+ fields:
+ - name: conditionEqual
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ConditionEqualProbe
+ - name: fieldValue
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.FieldValueProbe
+ - name: fieldsEqual
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.FieldsEqualProbe
+ - name: type
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ProbeType
+- name: com.github.operator-framework.operator-controller.api.v1.AvailabilityMode
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.BundleMetadata
+ map:
+ fields:
+ - name: name
+ type:
+ scalar: string
+ - name: release
+ type:
+ scalar: string
+ - name: version
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.CRDUpgradeSafetyEnforcement
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.CRDUpgradeSafetyPreflightConfig
+ map:
+ fields:
+ - name: enforcement
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.CRDUpgradeSafetyEnforcement
+- name: com.github.operator-framework.operator-controller.api.v1.CatalogFilter
+ map:
+ fields:
+ - name: channels
+ type:
+ list:
+ elementType:
+ scalar: string
+ elementRelationship: atomic
+ - name: packageName
+ type:
+ scalar: string
+ - name: selector
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector
+ - name: upgradeConstraintPolicy
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.UpgradeConstraintPolicy
+ default: CatalogProvided
+ - name: version
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.CatalogSource
+ map:
+ fields:
+ - name: image
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ImageSource
+ - name: type
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.SourceType
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterCatalog
+ map:
+ fields:
+ - name: apiVersion
+ type:
+ scalar: string
+ - name: kind
+ type:
+ scalar: string
+ - name: metadata
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta
+ - name: spec
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterCatalogSpec
+ - name: status
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterCatalogStatus
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterCatalogSpec
+ map:
+ fields:
+ - name: availabilityMode
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.AvailabilityMode
+ default: Available
+ - name: priority
+ type:
+ scalar: numeric
+ default: 0
+ - name: source
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.CatalogSource
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterCatalogStatus
+ map:
+ fields:
+ - name: conditions
+ type:
+ list:
+ elementType:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition
+ elementRelationship: associative
+ keys:
+ - type
+ - name: lastUnpacked
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time
+ - name: resolvedSource
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ResolvedCatalogSource
+ - name: urls
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterCatalogURLs
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterCatalogURLs
+ map:
+ fields:
+ - name: base
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterExtension
+ map:
+ fields:
+ - name: apiVersion
+ type:
+ scalar: string
+ - name: kind
+ type:
+ scalar: string
+ - name: metadata
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta
+ - name: spec
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionSpec
+ - name: status
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionStatus
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionConfig
+ map:
+ fields:
+ - name: configType
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionConfigType
+ - name: inline
+ type:
+ namedType: io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionConfigType
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionInstallConfig
+ map:
+ fields:
+ - name: preflight
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.PreflightConfig
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionInstallStatus
+ map:
+ fields:
+ - name: bundle
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.BundleMetadata
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionSpec
+ map:
+ fields:
+ - name: config
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionConfig
+ - name: install
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionInstallConfig
+ - name: namespace
+ type:
+ scalar: string
+ - name: progressDeadlineMinutes
+ type:
+ scalar: numeric
+ - name: serviceAccount
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ServiceAccountReference
+ - name: source
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.SourceConfig
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionStatus
+ map:
+ fields:
+ - name: activeRevisions
+ type:
+ list:
+ elementType:
+ namedType: com.github.operator-framework.operator-controller.api.v1.RevisionStatus
+ elementRelationship: associative
+ keys:
+ - name
+ - name: conditions
+ type:
+ list:
+ elementType:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition
+ elementRelationship: associative
+ keys:
+ - type
+ - name: install
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterExtensionInstallStatus
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterObjectSet
+ map:
+ fields:
+ - name: apiVersion
+ type:
+ scalar: string
+ - name: kind
+ type:
+ scalar: string
+ - name: metadata
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta
+ - name: spec
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterObjectSetSpec
+ - name: status
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterObjectSetStatus
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterObjectSetLifecycleState
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterObjectSetObject
+ map:
+ fields:
+ - name: collisionProtection
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.CollisionProtection
+ - name: object
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.unstructured.Unstructured
+ - name: ref
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ObjectSourceRef
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterObjectSetPhase
+ map:
+ fields:
+ - name: collisionProtection
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.CollisionProtection
+ - name: name
+ type:
+ scalar: string
+ - name: objects
+ type:
+ list:
+ elementType:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterObjectSetObject
+ elementRelationship: atomic
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterObjectSetSpec
+ map:
+ fields:
+ - name: collisionProtection
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.CollisionProtection
+ - name: lifecycleState
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterObjectSetLifecycleState
+ - name: phases
+ type:
+ list:
+ elementType:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ClusterObjectSetPhase
+ elementRelationship: associative
+ keys:
+ - name
+ - name: progressDeadlineMinutes
+ type:
+ scalar: numeric
+ - name: progressionProbes
+ type:
+ list:
+ elementType:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ProgressionProbe
+ elementRelationship: atomic
+ - name: revision
+ type:
+ scalar: numeric
+- name: com.github.operator-framework.operator-controller.api.v1.ClusterObjectSetStatus
+ map:
+ fields:
+ - name: conditions
+ type:
+ list:
+ elementType:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition
+ elementRelationship: associative
+ keys:
+ - type
+ - name: observedPhases
+ type:
+ list:
+ elementType:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ObservedPhase
+ elementRelationship: associative
+ keys:
+ - name
+- name: com.github.operator-framework.operator-controller.api.v1.CollisionProtection
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.ConditionEqualProbe
+ map:
+ fields:
+ - name: status
+ type:
+ scalar: string
+ - name: type
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.FieldValueProbe
+ map:
+ fields:
+ - name: fieldPath
+ type:
+ scalar: string
+ - name: value
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.FieldsEqualProbe
+ map:
+ fields:
+ - name: fieldA
+ type:
+ scalar: string
+ - name: fieldB
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.ImageSource
+ map:
+ fields:
+ - name: pollIntervalMinutes
+ type:
+ scalar: numeric
+ - name: ref
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.ObjectSelector
+ map:
+ fields:
+ - name: groupKind
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.GroupKind
+ - name: label
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector
+ - name: type
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.SelectorType
+- name: com.github.operator-framework.operator-controller.api.v1.ObjectSourceRef
+ map:
+ fields:
+ - name: key
+ type:
+ scalar: string
+ - name: name
+ type:
+ scalar: string
+ - name: namespace
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.ObservedPhase
+ map:
+ fields:
+ - name: digest
+ type:
+ scalar: string
+ - name: name
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.PreflightConfig
+ map:
+ fields:
+ - name: crdUpgradeSafety
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.CRDUpgradeSafetyPreflightConfig
+- name: com.github.operator-framework.operator-controller.api.v1.ProbeType
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.ProgressionProbe
+ map:
+ fields:
+ - name: assertions
+ type:
+ list:
+ elementType:
+ namedType: com.github.operator-framework.operator-controller.api.v1.Assertion
+ elementRelationship: atomic
+ - name: selector
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ObjectSelector
+- name: com.github.operator-framework.operator-controller.api.v1.ResolvedCatalogSource
+ map:
+ fields:
+ - name: image
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.ResolvedImageSource
+ - name: type
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.SourceType
+- name: com.github.operator-framework.operator-controller.api.v1.ResolvedImageSource
+ map:
+ fields:
+ - name: ref
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.RevisionStatus
+ map:
+ fields:
+ - name: conditions
+ type:
+ list:
+ elementType:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition
+ elementRelationship: associative
+ keys:
+ - type
+ - name: name
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.SelectorType
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.ServiceAccountReference
+ map:
+ fields:
+ - name: name
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.SourceConfig
+ map:
+ fields:
+ - name: catalog
+ type:
+ namedType: com.github.operator-framework.operator-controller.api.v1.CatalogFilter
+ - name: sourceType
+ type:
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.SourceType
+ scalar: string
+- name: com.github.operator-framework.operator-controller.api.v1.UpgradeConstraintPolicy
+ scalar: string
+- name: io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON
+ scalar: untyped
+ list:
+ elementType:
+ namedType: __untyped_atomic_
+ elementRelationship: atomic
+ map:
+ elementType:
+ namedType: __untyped_deduced_
+ elementRelationship: separable
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.Condition
+ map:
+ fields:
+ - name: lastTransitionTime
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time
+ - name: message
+ type:
+ scalar: string
+ - name: observedGeneration
+ type:
+ scalar: numeric
+ - name: reason
+ type:
+ scalar: string
+ - name: status
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ConditionStatus
+ - name: type
+ type:
+ scalar: string
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.ConditionStatus
+ scalar: string
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1
+ map:
+ elementType:
+ scalar: untyped
+ list:
+ elementType:
+ namedType: __untyped_atomic_
+ elementRelationship: atomic
+ map:
+ elementType:
+ namedType: __untyped_deduced_
+ elementRelationship: separable
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.GroupKind
+ map:
+ fields:
+ - name: group
+ type:
+ scalar: string
+ - name: kind
+ type:
+ scalar: string
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector
+ map:
+ fields:
+ - name: matchExpressions
+ type:
+ list:
+ elementType:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorRequirement
+ elementRelationship: atomic
+ - name: matchLabels
+ type:
+ map:
+ elementType:
+ scalar: string
+ elementRelationship: atomic
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorOperator
+ scalar: string
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorRequirement
+ map:
+ fields:
+ - name: key
+ type:
+ scalar: string
+ - name: operator
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorOperator
+ - name: values
+ type:
+ list:
+ elementType:
+ scalar: string
+ elementRelationship: atomic
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry
+ map:
+ fields:
+ - name: apiVersion
+ type:
+ scalar: string
+ - name: fieldsType
+ type:
+ scalar: string
+ - name: fieldsV1
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1
+ - name: manager
+ type:
+ scalar: string
+ - name: operation
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsOperationType
+ - name: subresource
+ type:
+ scalar: string
+ - name: time
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsOperationType
+ scalar: string
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta
+ map:
+ fields:
+ - name: annotations
+ type:
+ map:
+ elementType:
+ scalar: string
+ - name: creationTimestamp
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time
+ - name: deletionGracePeriodSeconds
+ type:
+ scalar: numeric
+ - name: deletionTimestamp
+ type:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time
+ - name: finalizers
+ type:
+ list:
+ elementType:
+ scalar: string
+ elementRelationship: associative
+ - name: generateName
+ type:
+ scalar: string
+ - name: generation
+ type:
+ scalar: numeric
+ - name: labels
+ type:
+ map:
+ elementType:
+ scalar: string
+ - name: managedFields
+ type:
+ list:
+ elementType:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry
+ elementRelationship: atomic
+ - name: name
+ type:
+ scalar: string
+ - name: namespace
+ type:
+ scalar: string
+ - name: ownerReferences
+ type:
+ list:
+ elementType:
+ namedType: io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference
+ elementRelationship: associative
+ keys:
+ - uid
+ - name: resourceVersion
+ type:
+ scalar: string
+ - name: selfLink
+ type:
+ scalar: string
+ - name: uid
+ type:
+ namedType: io.k8s.apimachinery.pkg.types.UID
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference
+ map:
+ fields:
+ - name: apiVersion
+ type:
+ scalar: string
+ - name: blockOwnerDeletion
+ type:
+ scalar: boolean
+ - name: controller
+ type:
+ scalar: boolean
+ - name: kind
+ type:
+ scalar: string
+ - name: name
+ type:
+ scalar: string
+ - name: uid
+ type:
+ namedType: io.k8s.apimachinery.pkg.types.UID
+ elementRelationship: atomic
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.Time
+ scalar: untyped
+- name: io.k8s.apimachinery.pkg.apis.meta.v1.unstructured.Unstructured
+ map:
+ elementType:
+ scalar: untyped
+ list:
+ elementType:
+ namedType: __untyped_atomic_
+ elementRelationship: atomic
+ map:
+ elementType:
+ namedType: __untyped_deduced_
+ elementRelationship: separable
+- name: io.k8s.apimachinery.pkg.types.UID
+ scalar: string
- name: __untyped_atomic_
scalar: untyped
list:
diff --git a/go.mod b/go.mod
index 9b5af10a1a..c012a8c24e 100644
--- a/go.mod
+++ b/go.mod
@@ -21,9 +21,9 @@ require (
github.com/klauspost/compress v1.18.6
github.com/opencontainers/go-digest v1.0.0
github.com/opencontainers/image-spec v1.1.1
- github.com/operator-framework/api v0.43.0
+ github.com/operator-framework/api v0.44.0
github.com/operator-framework/helm-operator-plugins v0.9.1
- github.com/operator-framework/operator-registry v1.71.0
+ github.com/operator-framework/operator-registry v1.72.0
github.com/prometheus/client_golang v1.23.2
github.com/prometheus/common v0.67.5
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2
@@ -32,31 +32,31 @@ require (
github.com/stretchr/testify v1.11.1
go.podman.io/image/v5 v5.40.0
golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f
- golang.org/x/mod v0.36.0
- golang.org/x/sync v0.20.0
+ golang.org/x/mod v0.37.0
+ golang.org/x/sync v0.21.0
golang.org/x/tools v0.45.0
helm.sh/helm/v3 v3.21.0
- k8s.io/api v0.35.4
- k8s.io/apiextensions-apiserver v0.35.4
- k8s.io/apimachinery v0.35.4
- k8s.io/apiserver v0.35.4
- k8s.io/cli-runtime v0.35.1
+ k8s.io/api v0.36.1
+ k8s.io/apiextensions-apiserver v0.36.1
+ k8s.io/apimachinery v0.36.1
+ k8s.io/apiserver v0.36.1
+ k8s.io/cli-runtime v0.36.1
k8s.io/client-go v1.5.2
- k8s.io/component-base v0.35.4
+ k8s.io/component-base v0.36.1
k8s.io/klog/v2 v2.140.0
- k8s.io/kubernetes v1.35.0
+ k8s.io/kubernetes v1.36.1
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
pkg.package-operator.run/boxcutter v0.13.1
- sigs.k8s.io/controller-runtime v0.23.3
- sigs.k8s.io/controller-tools v0.20.1
- sigs.k8s.io/crdify v0.5.1-0.20260309184313-54162f2e3097
+ sigs.k8s.io/controller-runtime v0.24.1
+ sigs.k8s.io/controller-tools v0.21.0
+ sigs.k8s.io/crdify v0.6.1-0.20260602124154-bb9957dbf465
sigs.k8s.io/structured-merge-diff/v6 v6.4.0
sigs.k8s.io/yaml v1.6.0
)
require (
- k8s.io/component-helpers v0.35.0 // indirect
- k8s.io/kube-openapi v0.0.0-20260319004828-5883c5ee87b9 // indirect
+ k8s.io/component-helpers v0.36.1 // indirect
+ k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199 // indirect
)
require (
@@ -104,7 +104,7 @@ require (
github.com/emicklei/go-restful/v3 v3.13.0 // indirect
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect
- github.com/fatih/color v1.18.0 // indirect
+ github.com/fatih/color v1.19.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fxamacker/cbor/v2 v2.9.1 // indirect
github.com/go-errors/errors v1.5.1 // indirect
@@ -114,20 +114,20 @@ require (
github.com/go-gorp/gorp/v3 v3.1.0 // indirect
github.com/go-jose/go-jose/v4 v4.1.4 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
- github.com/go-openapi/jsonpointer v0.22.5 // indirect
+ github.com/go-openapi/jsonpointer v0.23.1 // indirect
github.com/go-openapi/jsonreference v0.21.5 // indirect
- github.com/go-openapi/swag v0.25.5 // indirect
- github.com/go-openapi/swag/cmdutils v0.25.5 // indirect
- github.com/go-openapi/swag/conv v0.25.5 // indirect
- github.com/go-openapi/swag/fileutils v0.25.5 // indirect
- github.com/go-openapi/swag/jsonname v0.25.5 // indirect
- github.com/go-openapi/swag/jsonutils v0.25.5 // indirect
- github.com/go-openapi/swag/loading v0.25.5 // indirect
- github.com/go-openapi/swag/mangling v0.25.5 // indirect
- github.com/go-openapi/swag/netutils v0.25.5 // indirect
- github.com/go-openapi/swag/stringutils v0.25.5 // indirect
- github.com/go-openapi/swag/typeutils v0.25.5 // indirect
- github.com/go-openapi/swag/yamlutils v0.25.5 // indirect
+ github.com/go-openapi/swag v0.26.0 // indirect
+ github.com/go-openapi/swag/cmdutils v0.26.0 // indirect
+ github.com/go-openapi/swag/conv v0.26.0 // indirect
+ github.com/go-openapi/swag/fileutils v0.26.0 // indirect
+ github.com/go-openapi/swag/jsonname v0.26.0 // indirect
+ github.com/go-openapi/swag/jsonutils v0.26.0 // indirect
+ github.com/go-openapi/swag/loading v0.26.0 // indirect
+ github.com/go-openapi/swag/mangling v0.26.0 // indirect
+ github.com/go-openapi/swag/netutils v0.26.0 // indirect
+ github.com/go-openapi/swag/stringutils v0.26.0 // indirect
+ github.com/go-openapi/swag/typeutils v0.26.0 // indirect
+ github.com/go-openapi/swag/yamlutils v0.26.0 // indirect
github.com/go-sql-driver/mysql v1.9.2 // indirect
github.com/gobuffalo/flect v1.0.3 // indirect
github.com/gobwas/glob v0.2.3 // indirect
@@ -142,7 +142,6 @@ require (
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
github.com/gosuri/uitable v0.0.4 // indirect
- github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect
github.com/h2non/filetype v1.1.3 // indirect
github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c // indirect
@@ -165,7 +164,7 @@ require (
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.23 // indirect
- github.com/mattn/go-sqlite3 v1.14.44 // indirect
+ github.com/mattn/go-sqlite3 v1.14.45 // indirect
github.com/miekg/pkcs11 v1.1.2 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
@@ -183,7 +182,6 @@ require (
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
- github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
github.com/nxadm/tail v1.4.11 // indirect
github.com/onsi/gomega v1.41.0 // indirect
github.com/opencontainers/runtime-spec v1.3.0 // indirect
@@ -231,24 +229,25 @@ require (
golang.org/x/crypto v0.51.0 // indirect
golang.org/x/net v0.55.0 // indirect
golang.org/x/oauth2 v0.36.0 // indirect
- golang.org/x/sys v0.45.0 // indirect
+ golang.org/x/sys v0.46.0 // indirect
golang.org/x/term v0.43.0 // indirect
- golang.org/x/text v0.37.0 // indirect
+ golang.org/x/text v0.38.0 // indirect
golang.org/x/time v0.15.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
google.golang.org/genproto v0.0.0-20260209200024-4cfbd4190f57 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d // indirect
google.golang.org/grpc v1.81.1 // indirect
- google.golang.org/protobuf v1.36.11 // indirect
+ google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/controller-manager v0.33.2 // indirect
- k8s.io/kubectl v0.35.1 // indirect
- oras.land/oras-go/v2 v2.6.0 // indirect
+ k8s.io/kubectl v0.36.1 // indirect
+ k8s.io/streaming v0.36.1 // indirect
+ oras.land/oras-go/v2 v2.6.1 // indirect
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect
sigs.k8s.io/gateway-api v1.5.0 // indirect
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
@@ -259,62 +258,66 @@ require (
retract v1.5.0 // contains filename with ':' which causes failure creating module zip file
-replace k8s.io/api => k8s.io/api v0.35.0
+replace k8s.io/api => k8s.io/api v0.36.1
-replace k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.35.0
+replace k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.36.1
-replace k8s.io/apimachinery => k8s.io/apimachinery v0.35.0
+replace k8s.io/apimachinery => k8s.io/apimachinery v0.36.1
-replace k8s.io/apiserver => k8s.io/apiserver v0.35.0
+replace k8s.io/apiserver => k8s.io/apiserver v0.36.1
-replace k8s.io/cli-runtime => k8s.io/cli-runtime v0.35.0
+replace k8s.io/cli-runtime => k8s.io/cli-runtime v0.36.1
-replace k8s.io/client-go => k8s.io/client-go v0.35.0
+replace k8s.io/client-go => k8s.io/client-go v0.36.1
-replace k8s.io/cloud-provider => k8s.io/cloud-provider v0.35.0
+replace k8s.io/cloud-provider => k8s.io/cloud-provider v0.36.1
-replace k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.35.0
+replace k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.36.1
-replace k8s.io/code-generator => k8s.io/code-generator v0.35.0
+replace k8s.io/code-generator => k8s.io/code-generator v0.36.1
-replace k8s.io/component-base => k8s.io/component-base v0.35.0
+replace k8s.io/component-base => k8s.io/component-base v0.36.1
-replace k8s.io/component-helpers => k8s.io/component-helpers v0.35.0
+replace k8s.io/component-helpers => k8s.io/component-helpers v0.36.1
-replace k8s.io/controller-manager => k8s.io/controller-manager v0.35.0
+replace k8s.io/controller-manager => k8s.io/controller-manager v0.36.1
-replace k8s.io/cri-api => k8s.io/cri-api v0.35.0
+replace k8s.io/cri-api => k8s.io/cri-api v0.36.1
-replace k8s.io/cri-client => k8s.io/cri-client v0.35.0
+replace k8s.io/cri-client => k8s.io/cri-client v0.36.1
-replace k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.35.0
+replace k8s.io/cri-streaming => k8s.io/cri-streaming v0.36.1
-replace k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.35.0
+replace k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.36.1
-replace k8s.io/endpointslice => k8s.io/endpointslice v0.35.0
+replace k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.36.1
-replace k8s.io/externaljwt => k8s.io/externaljwt v0.35.0
+replace k8s.io/endpointslice => k8s.io/endpointslice v0.36.1
-replace k8s.io/kms => k8s.io/kms v0.35.0
+replace k8s.io/externaljwt => k8s.io/externaljwt v0.36.1
-replace k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.35.0
+replace k8s.io/kms => k8s.io/kms v0.36.1
-replace k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.35.0
+replace k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.36.1
-replace k8s.io/kube-proxy => k8s.io/kube-proxy v0.35.0
+replace k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.36.1
-replace k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.35.0
+replace k8s.io/kube-proxy => k8s.io/kube-proxy v0.36.1
-replace k8s.io/kubectl => k8s.io/kubectl v0.35.0
+replace k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.36.1
-replace k8s.io/kubelet => k8s.io/kubelet v0.35.0
+replace k8s.io/kubectl => k8s.io/kubectl v0.36.1
-replace k8s.io/kubernetes => k8s.io/kubernetes v1.35.0
+replace k8s.io/kubelet => k8s.io/kubelet v0.36.1
-replace k8s.io/metrics => k8s.io/metrics v0.35.0
+replace k8s.io/kubernetes => k8s.io/kubernetes v1.36.1
-replace k8s.io/mount-utils => k8s.io/mount-utils v0.35.0
+replace k8s.io/metrics => k8s.io/metrics v0.36.1
-replace k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.35.0
+replace k8s.io/mount-utils => k8s.io/mount-utils v0.36.1
-replace k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.35.0
+replace k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.36.1
+
+replace k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.36.1
+
+replace k8s.io/streaming => k8s.io/streaming v0.36.1
diff --git a/go.sum b/go.sum
index 0852804bd5..612a9b3d71 100644
--- a/go.sum
+++ b/go.sum
@@ -138,8 +138,8 @@ github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjT
github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4=
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc=
-github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
-github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w=
+github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/foxcpp/go-mockdns v1.2.0 h1:omK3OrHRD1IWJz1FuFBCFquhXslXoF17OvBS6JPzZF0=
@@ -170,40 +170,40 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
-github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA=
-github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0=
+github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4=
+github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY=
github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe+pJyVWRdiE=
github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw=
-github.com/go-openapi/swag v0.25.5 h1:pNkwbUEeGwMtcgxDr+2GBPAk4kT+kJ+AaB+TMKAg+TU=
-github.com/go-openapi/swag v0.25.5/go.mod h1:B3RT6l8q7X803JRxa2e59tHOiZlX1t8viplOcs9CwTA=
-github.com/go-openapi/swag/cmdutils v0.25.5 h1:yh5hHrpgsw4NwM9KAEtaDTXILYzdXh/I8Whhx9hKj7c=
-github.com/go-openapi/swag/cmdutils v0.25.5/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0=
-github.com/go-openapi/swag/conv v0.25.5 h1:wAXBYEXJjoKwE5+vc9YHhpQOFj2JYBMF2DUi+tGu97g=
-github.com/go-openapi/swag/conv v0.25.5/go.mod h1:CuJ1eWvh1c4ORKx7unQnFGyvBbNlRKbnRyAvDvzWA4k=
-github.com/go-openapi/swag/fileutils v0.25.5 h1:B6JTdOcs2c0dBIs9HnkyTW+5gC+8NIhVBUwERkFhMWk=
-github.com/go-openapi/swag/fileutils v0.25.5/go.mod h1:V3cT9UdMQIaH4WiTrUc9EPtVA4txS0TOmRURmhGF4kc=
-github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo=
-github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU=
-github.com/go-openapi/swag/jsonutils v0.25.5 h1:XUZF8awQr75MXeC+/iaw5usY/iM7nXPDwdG3Jbl9vYo=
-github.com/go-openapi/swag/jsonutils v0.25.5/go.mod h1:48FXUaz8YsDAA9s5AnaUvAmry1UcLcNVWUjY42XkrN4=
-github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5 h1:SX6sE4FrGb4sEnnxbFL/25yZBb5Hcg1inLeErd86Y1U=
-github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5/go.mod h1:/2KvOTrKWjVA5Xli3DZWdMCZDzz3uV/T7bXwrKWPquo=
-github.com/go-openapi/swag/loading v0.25.5 h1:odQ/umlIZ1ZVRteI6ckSrvP6e2w9UTF5qgNdemJHjuU=
-github.com/go-openapi/swag/loading v0.25.5/go.mod h1:I8A8RaaQ4DApxhPSWLNYWh9NvmX2YKMoB9nwvv6oW6g=
-github.com/go-openapi/swag/mangling v0.25.5 h1:hyrnvbQRS7vKePQPHHDso+k6CGn5ZBs5232UqWZmJZw=
-github.com/go-openapi/swag/mangling v0.25.5/go.mod h1:6hadXM/o312N/h98RwByLg088U61TPGiltQn71Iw0NY=
-github.com/go-openapi/swag/netutils v0.25.5 h1:LZq2Xc2QI8+7838elRAaPCeqJnHODfSyOa7ZGfxDKlU=
-github.com/go-openapi/swag/netutils v0.25.5/go.mod h1:lHbtmj4m57APG/8H7ZcMMSWzNqIQcu0RFiXrPUara14=
-github.com/go-openapi/swag/stringutils v0.25.5 h1:NVkoDOA8YBgtAR/zvCx5rhJKtZF3IzXcDdwOsYzrB6M=
-github.com/go-openapi/swag/stringutils v0.25.5/go.mod h1:PKK8EZdu4QJq8iezt17HM8RXnLAzY7gW0O1KKarrZII=
-github.com/go-openapi/swag/typeutils v0.25.5 h1:EFJ+PCga2HfHGdo8s8VJXEVbeXRCYwzzr9u4rJk7L7E=
-github.com/go-openapi/swag/typeutils v0.25.5/go.mod h1:itmFmScAYE1bSD8C4rS0W+0InZUBrB2xSPbWt6DLGuc=
-github.com/go-openapi/swag/yamlutils v0.25.5 h1:kASCIS+oIeoc55j28T4o8KwlV2S4ZLPT6G0iq2SSbVQ=
-github.com/go-openapi/swag/yamlutils v0.25.5/go.mod h1:Gek1/SjjfbYvM+Iq4QGwa/2lEXde9n2j4a3wI3pNuOQ=
-github.com/go-openapi/testify/enable/yaml/v2 v2.4.0 h1:7SgOMTvJkM8yWrQlU8Jm18VeDPuAvB/xWrdxFJkoFag=
-github.com/go-openapi/testify/enable/yaml/v2 v2.4.0/go.mod h1:14iV8jyyQlinc9StD7w1xVPW3CO3q1Gj04Jy//Kw4VM=
-github.com/go-openapi/testify/v2 v2.4.0 h1:8nsPrHVCWkQ4p8h1EsRVymA2XABB4OT40gcvAu+voFM=
-github.com/go-openapi/testify/v2 v2.4.0/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=
+github.com/go-openapi/swag v0.26.0 h1:GVDXCmfvhfu1BxiHo8/FA+BbKmhecHnG3varjON5/RI=
+github.com/go-openapi/swag v0.26.0/go.mod h1:82g3193sZJRbocs7bNCqGfIgq8pkuwVwCfhKIRlEQF0=
+github.com/go-openapi/swag/cmdutils v0.26.0 h1:iowihOcvq7y4egO8cOq0dmfohz6wfeQ63U1EnuhO2TU=
+github.com/go-openapi/swag/cmdutils v0.26.0/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM=
+github.com/go-openapi/swag/conv v0.26.0 h1:5yGGsPYI1ZCva93U0AoKi/iZrNhaJEjr324YVsiD89I=
+github.com/go-openapi/swag/conv v0.26.0/go.mod h1:tpAmIL7X58VPnHHiSO4uE3jBeRamGsFsfdDeDtb5ECE=
+github.com/go-openapi/swag/fileutils v0.26.0 h1:WJoPRvsA7QRiiWluowkLJa9jaYR7FCuxmDvnCgaRRxU=
+github.com/go-openapi/swag/fileutils v0.26.0/go.mod h1:0WDJ7lp67eNjPMO50wAWYlKvhOb6CQ37rzR7wrgI8Tc=
+github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w=
+github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M=
+github.com/go-openapi/swag/jsonutils v0.26.0 h1:FawFML2iAXsPqmERscuMPIHmFsoP1tOqWkxBaKNMsnA=
+github.com/go-openapi/swag/jsonutils v0.26.0/go.mod h1:2VmA0CJlyFqgawOaPI9psnjFDqzyivIqLYN34t9p91E=
+github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0 h1:apqeINu/ICHouqiRZbyFvuDge5jCmmLTqGQ9V95EaOM=
+github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0/go.mod h1:AyM6QT8uz5IdKxk5akv0y6u4QvcL9GWERt0Jx/F/R8Y=
+github.com/go-openapi/swag/loading v0.26.0 h1:Apg6zaKhCJurpJer0DCxq99qwmhFddBhaMX7kilDcko=
+github.com/go-openapi/swag/loading v0.26.0/go.mod h1:dBxQ/6V2uBaAQdevN18VELE6xSpJWZxLX4txe12JwDg=
+github.com/go-openapi/swag/mangling v0.26.0 h1:Du2YC4YLA/Y5m/YKQd7AnY5qq0wRKSFZTTt8ktFaXcQ=
+github.com/go-openapi/swag/mangling v0.26.0/go.mod h1:jifS7W9vbg+pw63bT+GI53otluMQL3CeemuyCHKwVx0=
+github.com/go-openapi/swag/netutils v0.26.0 h1:CmZp+ZT7HrmFwrC3GdGsXBq2+42T1bjKBapcqVpIs3c=
+github.com/go-openapi/swag/netutils v0.26.0/go.mod h1:5iK+Ok3ZohWWex1C50BFTPexi03UaPwjW4Oj8kgrpwo=
+github.com/go-openapi/swag/stringutils v0.26.0 h1:qZQngLxs5s7SLijc3N2ZO+fUq2o8LjuWAASSrJuh+xg=
+github.com/go-openapi/swag/stringutils v0.26.0/go.mod h1:sWn5uY+QIIspwPhvgnqJsH8xqFT2ZbYcvbcFanRyhFE=
+github.com/go-openapi/swag/typeutils v0.26.0 h1:2kdEwdiNWy+JJdOvu5MA2IIg2SylWAFuuyQIKYybfq4=
+github.com/go-openapi/swag/typeutils v0.26.0/go.mod h1:oovDuIUvTrEHVMqWilQzKzV4YlSKgyZmFh7AlfABNVE=
+github.com/go-openapi/swag/yamlutils v0.26.0 h1:H7O8l/8NJJQ/oiReEN+oMpnGMyt8G0hl460nRZxhLMQ=
+github.com/go-openapi/swag/yamlutils v0.26.0/go.mod h1:1evKEGAtP37Pkwcc7EWMF0hedX0/x3Rkvei2wtG/TbU=
+github.com/go-openapi/testify/enable/yaml/v2 v2.4.2 h1:5zRca5jw7lzVREKCZVNBpysDNBjj74rBh0N2BGQbSR0=
+github.com/go-openapi/testify/enable/yaml/v2 v2.4.2/go.mod h1:XVevPw5hUXuV+5AkI1u1PeAm27EQVrhXTTCPAF85LmE=
+github.com/go-openapi/testify/v2 v2.4.2 h1:tiByHpvE9uHrrKjOszax7ZvKB7QOgizBWGBLuq0ePx4=
+github.com/go-openapi/testify/v2 v2.4.2/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
@@ -278,10 +278,11 @@ github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY=
github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo=
github.com/graphql-go/graphql v0.8.1 h1:p7/Ou/WpmulocJeEx7wjQy611rtXGQaAcXGqanuMMgc=
github.com/graphql-go/graphql v0.8.1/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ=
-github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
-github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99 h1:JYghRBlGCZyCF2wNUJ8W0cwaQdtpcssJ4CgC406g+WU=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99/go.mod h1:3bDW6wMZJB7tiONtC/1Xpicra6Wp5GgbTbQWCbI5fkc=
+github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI=
+github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 h1:QGLs/O40yoNK9vmy4rhUGBVyMf1lISBGtXRpsu/Qu/o=
+github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0/go.mod h1:hM2alZsMUni80N33RBe6J0e423LB+odMj7d3EMP9l20=
+github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 h1:B+8ClL/kCQkRiU82d9xajRPKYMrB7E0MbtzWVi1K4ns=
+github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3/go.mod h1:NbCUVmiS4foBGBHOYlCT25+YmGpJ32dZPi75pGEUpj4=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c=
github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg=
@@ -355,8 +356,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D
github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw=
github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
-github.com/mattn/go-sqlite3 v1.14.44 h1:3VSe+xafpbzsLbdr2AWlAZk9yRHiBhTBakioXaCKTF8=
-github.com/mattn/go-sqlite3 v1.14.44/go.mod h1:pjEuOr8IwzLJP2MfGeTb0A35jauH+C2kbHKBr7yXKVQ=
+github.com/mattn/go-sqlite3 v1.14.45 h1:6KA/spDguL3KV8rnybG7ezSaE4SeMR3KC9VbUoAQaIk=
+github.com/mattn/go-sqlite3 v1.14.45/go.mod h1:pjEuOr8IwzLJP2MfGeTb0A35jauH+C2kbHKBr7yXKVQ=
github.com/miekg/dns v1.1.72 h1:vhmr+TF2A3tuoGNkLDFK9zi36F2LS+hKTRW0Uf8kbzI=
github.com/miekg/dns v1.1.72/go.mod h1:+EuEPhdHOsfk6Wk5TT2CzssZdqkmFhf8r+aVyDEToIs=
github.com/miekg/pkcs11 v1.1.2 h1:/VxmeAX5qU6Q3EwafypogwWbYryHFmF2RpkJmw3m4MQ=
@@ -397,8 +398,6 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus=
-github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
@@ -413,14 +412,14 @@ github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJw
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
github.com/opencontainers/runtime-spec v1.3.0 h1:YZupQUdctfhpZy3TM39nN9Ika5CBWT5diQ8ibYCRkxg=
github.com/opencontainers/runtime-spec v1.3.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
-github.com/operator-framework/api v0.43.0 h1:ZMXghGPe3+h9dV964eVe+iBARgcxQIOLw+I1aMRwGHg=
-github.com/operator-framework/api v0.43.0/go.mod h1:psXOO7iwROhoer/I+v1FXPYAhuDqYuTgVJgFiL3z1sQ=
+github.com/operator-framework/api v0.44.0 h1:UPPNVVI2HJyfH17cnL/8PADV4DCaNLqfL08e+AyYrO8=
+github.com/operator-framework/api v0.44.0/go.mod h1:H46wpymo4j3kJZraarbuBUPLF5OzTCw4u0n2xb9sMNQ=
github.com/operator-framework/helm-operator-plugins v0.9.1 h1:WSGXhcntMdTmc//s8acU0vnXMzG2raNiRy8jO0ysw+M=
github.com/operator-framework/helm-operator-plugins v0.9.1/go.mod h1:vKg3/yJAadHAXwRkU//uUruvdJaQm9XAIJq0+D5ABTw=
github.com/operator-framework/operator-lib v0.19.0 h1:az6ogYj21rtU0SF9uYctRLyKp2dtlqTsmpfehFy6Ce8=
github.com/operator-framework/operator-lib v0.19.0/go.mod h1:KxycAjFnHt0DBtHmH3Jm7yHcY5sdrshPKTqM/HKAQ08=
-github.com/operator-framework/operator-registry v1.71.0 h1:qJfHj/Rvj68KEExmbBvcFUFLd/yvA576gMgwnDCxlI0=
-github.com/operator-framework/operator-registry v1.71.0/go.mod h1:AEPtWS+v3Bv2osVqk2/+OKsYhgfK41oAcxMPj8JZzg0=
+github.com/operator-framework/operator-registry v1.72.0 h1:Gvnsx3kLykduUga1bw3PEFg+c4u1VJB7ezG5PO5pByQ=
+github.com/operator-framework/operator-registry v1.72.0/go.mod h1:ta17GdpLAXdDfz2RgBxvhKmfHMpetsTYj+To5OcfChc=
github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8=
github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I=
github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs=
@@ -521,12 +520,12 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo=
go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E=
-go.etcd.io/etcd/api/v3 v3.6.5 h1:pMMc42276sgR1j1raO/Qv3QI9Af/AuyQUW6CBAWuntA=
-go.etcd.io/etcd/api/v3 v3.6.5/go.mod h1:ob0/oWA/UQQlT1BmaEkWQzI0sJ1M0Et0mMpaABxguOQ=
-go.etcd.io/etcd/client/pkg/v3 v3.6.5 h1:Duz9fAzIZFhYWgRjp/FgNq2gO1jId9Yae/rLn3RrBP8=
-go.etcd.io/etcd/client/pkg/v3 v3.6.5/go.mod h1:8Wx3eGRPiy0qOFMZT/hfvdos+DjEaPxdIDiCDUv/FQk=
-go.etcd.io/etcd/client/v3 v3.6.5 h1:yRwZNFBx/35VKHTcLDeO7XVLbCBFbPi+XV4OC3QJf2U=
-go.etcd.io/etcd/client/v3 v3.6.5/go.mod h1:ZqwG/7TAFZ0BJ0jXRPoJjKQJtbFo/9NIY8uoFFKcCyo=
+go.etcd.io/etcd/api/v3 v3.6.8 h1:gqb1VN92TAI6G2FiBvWcqKtHiIjr4SU2GdXxTwyexbM=
+go.etcd.io/etcd/api/v3 v3.6.8/go.mod h1:qyQj1HZPUV3B5cbAL8scG62+fyz5dSxxu0w8pn28N6Q=
+go.etcd.io/etcd/client/pkg/v3 v3.6.8 h1:Qs/5C0LNFiqXxYf2GU8MVjYUEXJ6sZaYOz0zEqQgy50=
+go.etcd.io/etcd/client/pkg/v3 v3.6.8/go.mod h1:GsiTRUZE2318PggZkAo6sWb6l8JLVrnckTNfbG8PWtw=
+go.etcd.io/etcd/client/v3 v3.6.8 h1:B3G76t1UykqAOrbio7s/EPatixQDkQBevN8/mwiplrY=
+go.etcd.io/etcd/client/v3 v3.6.8/go.mod h1:MVG4BpSIuumPi+ELF7wYtySETmoTWBHVcDoHdVupwt8=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
@@ -535,8 +534,8 @@ go.opentelemetry.io/contrib/bridges/prometheus v0.67.0 h1:dkBzNEAIKADEaFnuESzcXv
go.opentelemetry.io/contrib/bridges/prometheus v0.67.0/go.mod h1:Z5RIwRkZgauOIfnG5IpidvLpERjhTninpP1dTG2jTl4=
go.opentelemetry.io/contrib/exporters/autoexport v0.67.0 h1:4fnRcNpc6YFtG3zsFw9achKn3XgmxPxuMuqIL5rE8e8=
go.opentelemetry.io/contrib/exporters/autoexport v0.67.0/go.mod h1:qTvIHMFKoxW7HXg02gm6/Wofhq5p3Ib/A/NNt1EoBSQ=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0 h1:XmiuHzgJt067+a6kwyAzkhXooYVv3/TOw9cM2VfJgUM=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0/go.mod h1:KDgtbWKTQs4bM+VPUr6WlL9m/WXcmkCcBlIzqxPGzmI=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo=
go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
@@ -616,8 +615,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
-golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
+golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ=
+golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -650,8 +649,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
-golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
+golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
+golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -669,8 +668,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
-golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
+golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -691,8 +690,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
-golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
-golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
+golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
+golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -748,8 +747,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
-google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
+google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI=
+google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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=
@@ -772,46 +771,48 @@ helm.sh/helm/v3 v3.21.0 h1:9TRbaXQH+BIKLLDYlu++JsyWodS5kBBOLF7C7HY5+cs=
helm.sh/helm/v3 v3.21.0/go.mod h1:5IvU6Ae6ruB/vasVHhnC1IU5RvqFM349vLYS1BiHqeY=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-k8s.io/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY=
-k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA=
-k8s.io/apiextensions-apiserver v0.35.0 h1:3xHk2rTOdWXXJM+RDQZJvdx0yEOgC0FgQ1PlJatA5T4=
-k8s.io/apiextensions-apiserver v0.35.0/go.mod h1:E1Ahk9SADaLQ4qtzYFkwUqusXTcaV2uw3l14aqpL2LU=
-k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8=
-k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
-k8s.io/apiserver v0.35.0 h1:CUGo5o+7hW9GcAEF3x3usT3fX4f9r8xmgQeCBDaOgX4=
-k8s.io/apiserver v0.35.0/go.mod h1:QUy1U4+PrzbJaM3XGu2tQ7U9A4udRRo5cyxkFX0GEds=
-k8s.io/cli-runtime v0.35.0 h1:PEJtYS/Zr4p20PfZSLCbY6YvaoLrfByd6THQzPworUE=
-k8s.io/cli-runtime v0.35.0/go.mod h1:VBRvHzosVAoVdP3XwUQn1Oqkvaa8facnokNkD7jOTMY=
-k8s.io/client-go v0.35.0 h1:IAW0ifFbfQQwQmga0UdoH0yvdqrbwMdq9vIFEhRpxBE=
-k8s.io/client-go v0.35.0/go.mod h1:q2E5AAyqcbeLGPdoRB+Nxe3KYTfPce1Dnu1myQdqz9o=
-k8s.io/component-base v0.35.0 h1:+yBrOhzri2S1BVqyVSvcM3PtPyx5GUxCK2tinZz1G94=
-k8s.io/component-base v0.35.0/go.mod h1:85SCX4UCa6SCFt6p3IKAPej7jSnF3L8EbfSyMZayJR0=
-k8s.io/component-helpers v0.35.0 h1:wcXv7HJRksgVjM4VlXJ1CNFBpyDHruRI99RrBtrJceA=
-k8s.io/component-helpers v0.35.0/go.mod h1:ahX0m/LTYmu7fL3W8zYiIwnQ/5gT28Ex4o2pymF63Co=
-k8s.io/controller-manager v0.35.0 h1:KteodmfVIRzfZ3RDaxhnHb72rswBxEngvdL9vuZOA9A=
-k8s.io/controller-manager v0.35.0/go.mod h1:1bVuPNUG6/dpWpevsJpXioS0E0SJnZ7I/Wqc9Awyzm4=
+k8s.io/api v0.36.1 h1:XbL/EMj8K2aJpJtePmqUyQMsM0D4QI2pvl7YKJ20FTY=
+k8s.io/api v0.36.1/go.mod h1:KOWo4ey3TINlXjeHVuwB3i+tXXnu+UcwFBHlI/9dvEo=
+k8s.io/apiextensions-apiserver v0.36.1 h1:6JfYmPUsuUIHuN+3QxutXYWj492RqF5fBSx67GYK5Ks=
+k8s.io/apiextensions-apiserver v0.36.1/go.mod h1:pLzZin90riwisdzKwv/GoTwENooytoIx5zWJb4Hkby8=
+k8s.io/apimachinery v0.36.1 h1:G63Gjx2W+q0YD+72Vo8oY0nDnePVwnuzTmmy5ENrVSA=
+k8s.io/apimachinery v0.36.1/go.mod h1:ibYOR00vW/I1kzvi5SF0dRuJ52BvKtfvRdOn35GPQ+8=
+k8s.io/apiserver v0.36.1 h1:iMS5V+rPUertv5P9RaqJgmHHTuh4quWpoxchvMUY+JY=
+k8s.io/apiserver v0.36.1/go.mod h1:Cby1PbLWztu0GDOxoO6iFOyyqIsziHNEW+w9zVQ22Kw=
+k8s.io/cli-runtime v0.36.1 h1:yuC/BGnnj1YYPh6D1P+pZnzinCs6DvMq86yAeNqoqzM=
+k8s.io/cli-runtime v0.36.1/go.mod h1:ZQWHGt8xAF7KnviB79vX0lYNyUUqKIpU+LQg7exuFAw=
+k8s.io/client-go v0.36.1 h1:FN/K8QIT2CEDt+2WB2HnWrUANZ50AP5GII43/SP2JR0=
+k8s.io/client-go v0.36.1/go.mod h1:s6rAnCtTGYDQnpNjEhSaISV+2O8jwruZ6m3QOYBFbtU=
+k8s.io/component-base v0.36.1 h1:iG6GsELftXqTNG9HG6kiVjatSgAw1sf5pJ6R5a6N0kA=
+k8s.io/component-base v0.36.1/go.mod h1:nf9XPlntRdqO6WMeEWAA5F93Y4ICZQdeT9GeqLDB3JI=
+k8s.io/component-helpers v0.36.1 h1:BTrr5fzNSm8TkQfXrKT3N9ioWwiC4n2FTIwGTUo/ccg=
+k8s.io/component-helpers v0.36.1/go.mod h1:s38HnzKQRurbUnhI5IV8GwyL/a3lVuNCYZMTd+rITMM=
+k8s.io/controller-manager v0.36.1 h1:d1ifPnAe3FFSnnvcDQiM93bGroFT1lF72GEBKsl+cbg=
+k8s.io/controller-manager v0.36.1/go.mod h1:jeJUuFlgbgohGJWrm59Wdlgo3WqxssWXgD2sU6HG/Vo=
k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
-k8s.io/kube-openapi v0.0.0-20260319004828-5883c5ee87b9 h1:Sztf7ESG9tAXRW/ACJZjrj5jhdOUqS2KFRQT+CTvu78=
-k8s.io/kube-openapi v0.0.0-20260319004828-5883c5ee87b9/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
-k8s.io/kubectl v0.35.0 h1:cL/wJKHDe8E8+rP3G7avnymcMg6bH6JEcR5w5uo06wc=
-k8s.io/kubectl v0.35.0/go.mod h1:VR5/TSkYyxZwrRwY5I5dDq6l5KXmiCb+9w8IKplk3Qo=
-k8s.io/kubernetes v1.35.0 h1:PUOojD8c8E3csMP5NX+nLLne6SGqZjrYCscptyBfWMY=
-k8s.io/kubernetes v1.35.0/go.mod h1:Tzk9Y9W/XUFFFgTUVg+BAowoFe+Pc7koGLuaiLHdcFg=
+k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199 h1:sWu4Td5mgJlwunsUydnhKEAfNUHM7hm1wfKEQmD7G5c=
+k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
+k8s.io/kubectl v0.36.1 h1:96HqS9twIdHM0MlJLTwbo14b9kUKPkOzZ4tlRDLv4qI=
+k8s.io/kubectl v0.36.1/go.mod h1:/DGPAIewKsFWF9VFgGvkPhao2Ev4SNuE3BioZo8yPbk=
+k8s.io/kubernetes v1.36.1 h1:Mt7NKigaZ2KmOmCLhX81lGlH9JU5wjXnYhXnxAun9XA=
+k8s.io/kubernetes v1.36.1/go.mod h1:MLdeJ3qw2CWH9BFml5GvptxQVQckz54fJOZ/WuixpFE=
+k8s.io/streaming v0.36.1 h1:L+K68n4Gg940BGNNYtUBvL1WTLL0YnKT3s+P1MNAmR4=
+k8s.io/streaming v0.36.1/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s=
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM=
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
-oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc=
-oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o=
+oras.land/oras-go/v2 v2.6.1 h1:bonOEkjLfp8tt6qXWRRWP6p1F+9octchOf2EqnWB4Zs=
+oras.land/oras-go/v2 v2.6.1/go.mod h1:dhtFrFOuZuDtAVeZ9FUnaa5zfzplG3ZnFX9/uH1J/Yk=
pkg.package-operator.run/boxcutter v0.13.1 h1:FvrSBnHWuf6Co+HPyxRSw2Y5mHSkUtteW8klXS6L8gk=
pkg.package-operator.run/boxcutter v0.13.1/go.mod h1:rR2jd32uNt2eml7UvlYNCpCAYIpTALDzHxaftMfgkZo=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
-sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80=
-sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0=
-sigs.k8s.io/controller-tools v0.20.1 h1:gkfMt9YodI0K85oT8rVi80NTXO/kDmabKR5Ajn5GYxs=
-sigs.k8s.io/controller-tools v0.20.1/go.mod h1:b4qPmjGU3iZwqn34alUU5tILhNa9+VXK+J3QV0fT/uU=
-sigs.k8s.io/crdify v0.5.1-0.20260309184313-54162f2e3097 h1:gwDRFCc64lhEpxY944IJFW+CrmMFXWH+JjpE0JHp42Y=
-sigs.k8s.io/crdify v0.5.1-0.20260309184313-54162f2e3097/go.mod h1:ZIFxaYNgKYmFtZCLPysncXQ8oqwnNlHQbRUfxJHZwzU=
+sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4=
+sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw=
+sigs.k8s.io/controller-tools v0.21.0 h1:KXDQza3bgjlPY6xLR63tI/40gzjhyUAvkCrwzd2/6cs=
+sigs.k8s.io/controller-tools v0.21.0/go.mod h1:DLIypi3Q2+azVAP8jr/mHXJgveYYHFjhnNOUuBJ10JE=
+sigs.k8s.io/crdify v0.6.1-0.20260602124154-bb9957dbf465 h1:/i/qwIYxowBuOlNUY6d6E5PvNise/KlAqIOi78ma6g4=
+sigs.k8s.io/crdify v0.6.1-0.20260602124154-bb9957dbf465/go.mod h1:ZIFxaYNgKYmFtZCLPysncXQ8oqwnNlHQbRUfxJHZwzU=
sigs.k8s.io/gateway-api v1.5.0 h1:duoo14Ky/fJXpjpmyMISE2RTBGnfCg8zICfTYLTnBJA=
sigs.k8s.io/gateway-api v1.5.0/go.mod h1:GvCETiaMAlLym5CovLxGjS0NysqFk3+Yuq3/rh6QL2o=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
diff --git a/hack/conftest/policy/README.md b/hack/conftest/policy/README.md
index ff1a16bc67..96ed11f5c7 100644
--- a/hack/conftest/policy/README.md
+++ b/hack/conftest/policy/README.md
@@ -20,51 +20,21 @@ Validates core OLM NetworkPolicy requirements:
- Ingress on port 8443 (Prometheus metrics scraping)
- General egress enabled (for pulling bundle images, connecting to catalogd, and Kubernetes API)
-### prometheus-networkpolicies.rego
-
-Package: `prometheus`
-
-Validates Prometheus NetworkPolicy requirements:
-
-- Ensures a NetworkPolicy exists that allows both ingress and egress traffic for prometheus pods
-
## Usage
These policies are automatically run as part of:
-- `make lint-helm` - Validates both helm/olmv1 and helm/prometheus charts (runs `main` and `prometheus` packages)
-- `make manifests` - Generates and validates core OLM manifests using only `main` package policies
- (Prometheus policies are intentionally skipped here, even if manifests include Prometheus resources;
- they are validated via `make lint-helm`)
+- `make lint-helm` - Validates the helm/olmv1 chart (runs `main` package)
+- `make manifests` - Generates and validates core OLM manifests using `main` package policies
### Running manually
```bash
-# Run all policies (main + prometheus namespaces)
-(helm template olmv1 helm/olmv1; helm template prometheus helm/prometheus) | conftest test --policy hack/conftest/policy/ --combine -n main -n prometheus -
-
-# Run only OLM policies
helm template olmv1 helm/olmv1 | conftest test --policy hack/conftest/policy/ --combine -n main -
-
-# Run only prometheus policies
-helm template prometheus helm/prometheus | conftest test --policy hack/conftest/policy/ --combine -n prometheus -
-```
-
-### Excluding policies
-
-Use the `-n` (namespace) flag to selectively run policies:
-
-```bash
-# Skip prometheus policies
-conftest test --policy hack/conftest/policy/ --combine -n main
-
-# Skip OLM policies
-conftest test --policy hack/conftest/policy/ --combine -n prometheus
```
## Adding New Policies
1. Add new rules to an existing `.rego` file or create a new one
2. Use `package main` for policies that should run by default on all manifests
-3. Use a custom package name (e.g., `package prometheus`) for optional policies
-4. Update the Makefile targets if new namespaces need to be included
+3. Update the Makefile targets if new namespaces need to be included
diff --git a/hack/conftest/policy/prometheus-networkpolicies.rego b/hack/conftest/policy/prometheus-networkpolicies.rego
deleted file mode 100644
index c37158250c..0000000000
--- a/hack/conftest/policy/prometheus-networkpolicies.rego
+++ /dev/null
@@ -1,33 +0,0 @@
-package prometheus
-
-import rego.v1
-
-# Check that a NetworkPolicy exists that allows both ingress and egress traffic to prometheus pods
-is_prometheus_policy(policy) if {
- policy.kind == "NetworkPolicy"
- policy.apiVersion == "networking.k8s.io/v1"
-
- # Must target prometheus pods
- policy.spec.podSelector.matchLabels["app.kubernetes.io/name"] == "prometheus"
-
- # Must have both Ingress and Egress policy types
- policy_types := {t | some t in policy.spec.policyTypes}
- policy_types["Ingress"]
- policy_types["Egress"]
-
- # Must have ingress rules defined (allowing traffic)
- policy.spec.ingress
-
- # Must have egress rules defined (allowing traffic)
- policy.spec.egress
-}
-
-has_prometheus_policy if {
- some i in numbers.range(0, count(input) - 1)
- is_prometheus_policy(input[i].contents)
-}
-
-deny contains msg if {
- not has_prometheus_policy
- msg := "No NetworkPolicy found that allows both ingress and egress traffic to prometheus pods. A NetworkPolicy targeting prometheus pods with ingress and egress rules is required."
-}
diff --git a/hack/test/install-prometheus.sh b/hack/test/install-prometheus.sh
deleted file mode 100755
index e2e13c96f7..0000000000
--- a/hack/test/install-prometheus.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/bash
-
-source ".bingo/variables.env"
-
-set -euo pipefail
-
-help="install-prometheus.sh is used to set up prometheus monitoring for e2e testing.
-Usage:
- install-prometheus.sh [PROMETHEUS_NAMESPACE] [PROMETHEUS_VERSION] [GIT_VERSION] [PROMETHEUS_VALUES]
-"
-
-if [[ "$#" -lt 3 || "$#" -gt 4 ]]; then
- echo "Illegal number of arguments passed"
- echo "${help}"
- exit 1
-fi
-
-PROMETHEUS_NAMESPACE="$1"
-PROMETHEUS_VERSION="$2"
-GIT_VERSION="$3"
-PROMETHEUS_VALUES="${4:-}"
-
-if [ -n "${PROMETHEUS_VALUES}" ]; then
- echo "Adding ${PROMETHEUS_VALUES} to templating"
- PROMETHEUS_VALUES="--values ${PROMETHEUS_VALUES}"
-fi
-
-TMPDIR="$(mktemp -d)"
-trap 'echo "Cleaning up $TMPDIR"; rm -rf "$TMPDIR"' EXIT
-
-echo "Downloading Prometheus resources..."
-curl -s "https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/refs/tags/${PROMETHEUS_VERSION}/kustomization.yaml" > "${TMPDIR}/kustomization.yaml"
-curl -s "https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/refs/tags/${PROMETHEUS_VERSION}/bundle.yaml" > "${TMPDIR}/bundle.yaml"
-
-echo "Patching namespace to ${PROMETHEUS_NAMESPACE}..."
-(cd "$TMPDIR" && ${KUSTOMIZE} edit set namespace "$PROMETHEUS_NAMESPACE")
-
-echo "Applying Prometheus base..."
-kubectl apply -k "$TMPDIR" --server-side
-
-echo "Waiting for Prometheus Operator deployment to become available..."
-kubectl wait --for=condition=Available deployment/prometheus-operator -n "$PROMETHEUS_NAMESPACE" --timeout=180s
-
-echo "Waiting for Prometheus Operator pod to become ready..."
-kubectl wait --for=condition=Ready pod -n "$PROMETHEUS_NAMESPACE" -l app.kubernetes.io/name=prometheus-operator --timeout=120s
-
-echo "Applying prometheus Helm chart..."
-${HELM} template prometheus helm/prometheus ${PROMETHEUS_VALUES} | sed "s/cert-git-version/cert-${VERSION}/g" | kubectl apply -f -
-
-echo "Waiting for metrics scraper to become ready..."
-kubectl wait --for=create pods -n "$PROMETHEUS_NAMESPACE" prometheus-prometheus-0 --timeout=60s
-kubectl wait --for=condition=Ready pods -n "$PROMETHEUS_NAMESPACE" prometheus-prometheus-0 --timeout=120s
-
-echo "Prometheus deployment completed successfully."
diff --git a/hack/tools/crd-generator/main_test.go b/hack/tools/crd-generator/main_test.go
index 353707c1d6..aebef0b336 100644
--- a/hack/tools/crd-generator/main_test.go
+++ b/hack/tools/crd-generator/main_test.go
@@ -2,16 +2,16 @@ package main
import (
"fmt"
- "io"
"os"
"path/filepath"
+ "strings"
"testing"
"github.com/stretchr/testify/require"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
)
-const controllerToolsVersion = "v0.20.1"
+const controllerToolsVersion = "v0.21.0"
func TestRunGenerator(t *testing.T) {
here, err := os.Getwd()
@@ -323,31 +323,20 @@ func TestOpconTweaksMapRequiredList(t *testing.T) {
}
func compareFiles(t *testing.T, file1, file2 string) {
- f1, err := os.Open(file1)
+ t.Helper()
+ b1, err := os.ReadFile(file1)
require.NoError(t, err)
- defer func() {
- _ = f1.Close()
- }()
-
- f2, err := os.Open(file2)
+ b2, err := os.ReadFile(file2)
require.NoError(t, err)
- defer func() {
- _ = f2.Close()
- }()
-
- for {
- b1 := make([]byte, 64000)
- b2 := make([]byte, 64000)
- n1, err1 := f1.Read(b1)
- n2, err2 := f2.Read(b2)
+ require.Equal(t, filterVersionAnnotation(string(b1)), filterVersionAnnotation(string(b2)))
+}
- // Success if both have EOF at the same time
- if err1 == io.EOF && err2 == io.EOF {
- return
+func filterVersionAnnotation(s string) string {
+ var filtered []string
+ for _, line := range strings.Split(s, "\n") {
+ if !strings.Contains(line, "controller-gen.kubebuilder.io/version") {
+ filtered = append(filtered, line)
}
- require.NoError(t, err1)
- require.NoError(t, err2)
- require.Equal(t, n1, n2)
- require.Equal(t, b1, b2)
}
+ return strings.Join(filtered, "\n")
}
diff --git a/helm/prom_experimental.yaml b/helm/prom_experimental.yaml
deleted file mode 100644
index ed7d455645..0000000000
--- a/helm/prom_experimental.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-# experimental values for OLMv1 prometheus
-# This is a YAML-formatted file.
-# Declare variables to be passed into your templates.
-# Quote the threshold values to avoid the helm templater interpretting them
-
-# List of options to include
-options:
- operatorController:
- thresholds:
- memoryGrowth: "200_000"
- memoryUsage: "150_000_000"
- catalogd:
- thresholds:
- memoryGrowth: "200_000"
diff --git a/helm/prometheus/Chart.yaml b/helm/prometheus/Chart.yaml
deleted file mode 100644
index 1cd44e76c5..0000000000
--- a/helm/prometheus/Chart.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-apiVersion: v2
-name: prometheus
-description: A Helm chart of Prometheus resources for OLMv1
-icon: https://raw.githubusercontent.com/operator-framework/operator-framework.io/refs/heads/master/static/tile70x70.png
-
-# A chart can be either an 'application' or a 'library' chart.
-#
-# Application charts are a collection of templates that can be packaged into versioned archives
-# to be deployed.
-#
-# Library charts provide useful utilities or functions for the chart developer. They're included as
-# a dependency of application charts to inject those utilities and functions into the rendering
-# pipeline. Library charts do not define any templates and therefore cannot be deployed.
-type: application
-
-# This is the chart version. This version number should be incremented each time you make changes
-# to the chart and its templates, including the app version.
-# Versions are expected to follow Semantic Versioning (https://semver.org/)
-version: 0.1.0
diff --git a/helm/prometheus/templates/clusterrole-prometheus.yml b/helm/prometheus/templates/clusterrole-prometheus.yml
deleted file mode 100644
index d109c2660a..0000000000
--- a/helm/prometheus/templates/clusterrole-prometheus.yml
+++ /dev/null
@@ -1,44 +0,0 @@
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRole
-metadata:
- name: prometheus
-rules:
- - apiGroups:
- - ""
- resources:
- - nodes
- - nodes/metrics
- - services
- - endpoints
- - pods
- verbs:
- - get
- - list
- - watch
- - apiGroups:
- - ""
- resources:
- - configmaps
- verbs:
- - get
- - apiGroups:
- - discovery.k8s.io
- resources:
- - endpointslices
- verbs:
- - get
- - list
- - watch
- - apiGroups:
- - networking.k8s.io
- resources:
- - ingresses
- verbs:
- - get
- - list
- - watch
- - nonResourceURLs:
- - /metrics
- verbs:
- - get
diff --git a/helm/prometheus/templates/clusterrolebinding-prometheus.yml b/helm/prometheus/templates/clusterrolebinding-prometheus.yml
deleted file mode 100644
index eb5b43547c..0000000000
--- a/helm/prometheus/templates/clusterrolebinding-prometheus.yml
+++ /dev/null
@@ -1,13 +0,0 @@
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
- name: prometheus
-roleRef:
- apiGroup: rbac.authorization.k8s.io
- kind: ClusterRole
- name: prometheus
-subjects:
- - kind: ServiceAccount
- name: prometheus
- namespace: {{ .Values.namespaces.olmv1.name }}
diff --git a/helm/prometheus/templates/networkpolicy-prometheus.yml b/helm/prometheus/templates/networkpolicy-prometheus.yml
deleted file mode 100644
index 821e7054b2..0000000000
--- a/helm/prometheus/templates/networkpolicy-prometheus.yml
+++ /dev/null
@@ -1,17 +0,0 @@
----
-apiVersion: networking.k8s.io/v1
-kind: NetworkPolicy
-metadata:
- name: prometheus
- namespace: {{ .Values.namespaces.olmv1.name }}
-spec:
- egress:
- - {}
- ingress:
- - {}
- podSelector:
- matchLabels:
- app.kubernetes.io/name: prometheus
- policyTypes:
- - Egress
- - Ingress
diff --git a/helm/prometheus/templates/prometheus-prometheus.yml b/helm/prometheus/templates/prometheus-prometheus.yml
deleted file mode 100644
index 3b9df82d1f..0000000000
--- a/helm/prometheus/templates/prometheus-prometheus.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-apiVersion: monitoring.coreos.com/v1
-kind: Prometheus
-metadata:
- name: prometheus
- namespace: {{ .Values.namespaces.olmv1.name }}
-spec:
- logLevel: debug
- ruleSelector: {}
- scrapeInterval: 1m
- scrapeTimeout: 30s
- securityContext:
- runAsNonRoot: true
- runAsUser: 65534
- seccompProfile:
- type: RuntimeDefault
- serviceAccountName: prometheus
- serviceDiscoveryRole: EndpointSlice
- serviceMonitorSelector: {}
diff --git a/helm/prometheus/templates/prometheusrule-controller-alerts.yml b/helm/prometheus/templates/prometheusrule-controller-alerts.yml
deleted file mode 100644
index 13db7b3a7d..0000000000
--- a/helm/prometheus/templates/prometheusrule-controller-alerts.yml
+++ /dev/null
@@ -1,72 +0,0 @@
----
-apiVersion: monitoring.coreos.com/v1
-kind: PrometheusRule
-metadata:
- name: controller-alerts
- namespace: {{ .Values.namespaces.olmv1.name }}
-spec:
- groups:
- - name: controller-panic
- rules:
- - alert: reconciler-panic
- annotations:
- description: controller of pod {{`{{ $labels.pod }}`}} experienced panic(s); count={{`{{ $value }}`}}
- expr: controller_runtime_reconcile_panics_total{} > 0
- - alert: webhook-panic
- annotations:
- description: controller webhook of pod {{`{{ $labels.pod }}`}} experienced panic(s); count={{`{{ $value }}`}}
- expr: controller_runtime_webhook_panics_total{} > 0
- - name: resource-usage
- rules:
- - alert: oom-events
- annotations:
- description: container {{`{{ $labels.container }}`}} of pod {{`{{ $labels.pod }}`}} experienced OOM event(s); count={{`{{ $value }}`}}
- expr: container_oom_events_total > 0
- - alert: operator-controller-memory-growth
- annotations:
- description: 'operator-controller pod memory usage growing at a high rate for 5 minutes: {{`{{ $value | humanize }}`}}B/sec'
- expr: deriv(sum(container_memory_working_set_bytes{pod=~"operator-controller.*",container="manager"})[5m:]) > {{ .Values.options.operatorController.thresholds.memoryGrowth }}
- for: 5m
- keep_firing_for: 1d
- - alert: catalogd-memory-growth
- annotations:
- description: 'catalogd pod memory usage growing at a high rate for 5 minutes: {{`{{ $value | humanize }}`}}B/sec'
- expr: deriv(sum(container_memory_working_set_bytes{pod=~"catalogd.*",container="manager"})[5m:]) > {{ .Values.options.catalogd.thresholds.memoryGrowth }}
- for: 5m
- keep_firing_for: 1d
- - alert: operator-controller-memory-usage
- annotations:
- description: 'operator-controller pod using high memory resources for the last 5 minutes: {{`{{ $value | humanize }}`}}B'
- expr: sum(container_memory_working_set_bytes{pod=~"operator-controller.*",container="manager"}) > {{ .Values.options.operatorController.thresholds.memoryUsage }}
- for: 5m
- keep_firing_for: 1d
- - alert: catalogd-memory-usage
- annotations:
- description: 'catalogd pod using high memory resources for the last 5 minutes: {{`{{ $value | humanize }}`}}B'
- expr: sum(container_memory_working_set_bytes{pod=~"catalogd.*",container="manager"}) > {{ .Values.options.catalogd.thresholds.memoryUsage }}
- for: 5m
- keep_firing_for: 1d
- - alert: operator-controller-cpu-usage
- annotations:
- description: 'operator-controller using high cpu resource for 5 minutes: {{`{{ $value | printf "%.2f" }}`}}%'
- expr: rate(container_cpu_usage_seconds_total{pod=~"operator-controller.*",container="manager"}[5m]) * 100 > {{ .Values.options.operatorController.thresholds.cpuUsage }}
- for: 5m
- keep_firing_for: 1d
- - alert: catalogd-cpu-usage
- annotations:
- description: 'catalogd using high cpu resources for 5 minutes: {{`{{ $value | printf "%.2f" }}`}}%'
- expr: rate(container_cpu_usage_seconds_total{pod=~"catalogd.*",container="manager"}[5m]) * 100 > {{ .Values.options.catalogd.thresholds.cpuUsage }}
- for: 5m
- keep_firing_for: 1d
- - alert: operator-controller-api-call-rate
- annotations:
- description: 'operator-controller making excessive API calls for 5 minutes: {{`{{ $value | printf "%.2f" }}`}}/sec'
- expr: sum(rate(rest_client_requests_total{job=~"operator-controller-service"}[5m])) > {{ .Values.options.operatorController.thresholds.apiCallRate }}
- for: 5m
- keep_firing_for: 1d
- - alert: catalogd-api-call-rate
- annotations:
- description: 'catalogd making excessive API calls for 5 minutes: {{`{{ $value | printf "%.2f" }}`}}/sec'
- expr: sum(rate(rest_client_requests_total{job=~"catalogd-service"}[5m])) > {{ .Values.options.catalogd.thresholds.apiCallRate }}
- for: 5m
- keep_firing_for: 1d
diff --git a/helm/prometheus/templates/secret-prometheus-metrics-token.yml b/helm/prometheus/templates/secret-prometheus-metrics-token.yml
deleted file mode 100644
index 9db86fe995..0000000000
--- a/helm/prometheus/templates/secret-prometheus-metrics-token.yml
+++ /dev/null
@@ -1,9 +0,0 @@
----
-apiVersion: v1
-kind: Secret
-metadata:
- annotations:
- kubernetes.io/service-account.name: prometheus
- name: prometheus-metrics-token
- namespace: {{ .Values.namespaces.olmv1.name }}
-type: kubernetes.io/service-account-token
diff --git a/helm/prometheus/templates/service-prometheus-service.yml b/helm/prometheus/templates/service-prometheus-service.yml
deleted file mode 100644
index 11c0555104..0000000000
--- a/helm/prometheus/templates/service-prometheus-service.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-apiVersion: v1
-kind: Service
-metadata:
- name: prometheus-service
- namespace: {{ .Values.namespaces.prometheus.name }}
-spec:
- ports:
- - name: web
- nodePort: 30900
- port: 9090
- protocol: TCP
- targetPort: web
- selector:
- prometheus: prometheus
- type: NodePort
diff --git a/helm/prometheus/templates/serviceaccount-prometheus.yml b/helm/prometheus/templates/serviceaccount-prometheus.yml
deleted file mode 100644
index da68eb7aae..0000000000
--- a/helm/prometheus/templates/serviceaccount-prometheus.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-apiVersion: v1
-kind: ServiceAccount
-metadata:
- name: prometheus
- namespace: {{ .Values.namespaces.olmv1.name }}
diff --git a/helm/prometheus/templates/servicemonitor-catalogd-controller-manager-metrics-monitor.yml b/helm/prometheus/templates/servicemonitor-catalogd-controller-manager-metrics-monitor.yml
deleted file mode 100644
index b3fd498547..0000000000
--- a/helm/prometheus/templates/servicemonitor-catalogd-controller-manager-metrics-monitor.yml
+++ /dev/null
@@ -1,33 +0,0 @@
----
-apiVersion: monitoring.coreos.com/v1
-kind: ServiceMonitor
-metadata:
- name: catalogd-controller-manager-metrics-monitor
- namespace: {{ .Values.namespaces.olmv1.name }}
-spec:
- endpoints:
- - authorization:
- credentials:
- key: token
- name: prometheus-metrics-token
- interval: 10s
- path: /metrics
- port: metrics
- scheme: https
- tlsConfig:
- ca:
- secret:
- key: ca.crt
- name: catalogd-service-cert-git-version
- cert:
- secret:
- key: tls.crt
- name: catalogd-service-cert-git-version
- insecureSkipVerify: false
- keySecret:
- key: tls.key
- name: catalogd-service-cert-git-version
- serverName: catalogd-service.{{ .Values.namespaces.olmv1.name }}.svc
- selector:
- matchLabels:
- app.kubernetes.io/name: catalogd
diff --git a/helm/prometheus/templates/servicemonitor-kubelet.yml b/helm/prometheus/templates/servicemonitor-kubelet.yml
deleted file mode 100644
index 18d078a1f9..0000000000
--- a/helm/prometheus/templates/servicemonitor-kubelet.yml
+++ /dev/null
@@ -1,45 +0,0 @@
----
-apiVersion: monitoring.coreos.com/v1
-kind: ServiceMonitor
-metadata:
- labels:
- k8s-app: kubelet
- name: kubelet
- namespace: {{ .Values.namespaces.olmv1.name }}
-spec:
- endpoints:
- - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
- honorLabels: true
- interval: 10s
- metricRelabelings:
- - action: keep
- regex: (operator-controller|catalogd).*;manager
- sourceLabels:
- - pod
- - container
- path: /metrics
- port: https-metrics
- scheme: https
- tlsConfig:
- insecureSkipVerify: true
- - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
- honorLabels: true
- interval: 10s
- metricRelabelings:
- - action: keep
- regex: (operator-controller|catalogd).*;manager
- sourceLabels:
- - pod
- - container
- path: /metrics/cadvisor
- port: https-metrics
- scheme: https
- tlsConfig:
- insecureSkipVerify: true
- jobLabel: k8s-app
- namespaceSelector:
- matchNames:
- - kube-system
- selector:
- matchLabels:
- k8s-app: kubelet
diff --git a/helm/prometheus/templates/servicemonitor-operator-controller-controller-manager-metrics-monitor.yml b/helm/prometheus/templates/servicemonitor-operator-controller-controller-manager-metrics-monitor.yml
deleted file mode 100644
index b56b06eba9..0000000000
--- a/helm/prometheus/templates/servicemonitor-operator-controller-controller-manager-metrics-monitor.yml
+++ /dev/null
@@ -1,33 +0,0 @@
----
-apiVersion: monitoring.coreos.com/v1
-kind: ServiceMonitor
-metadata:
- name: operator-controller-controller-manager-metrics-monitor
- namespace: {{ .Values.namespaces.olmv1.name }}
-spec:
- endpoints:
- - authorization:
- credentials:
- key: token
- name: prometheus-metrics-token
- interval: 10s
- path: /metrics
- port: metrics
- scheme: https
- tlsConfig:
- ca:
- secret:
- key: ca.crt
- name: operator-controller-cert
- cert:
- secret:
- key: tls.crt
- name: operator-controller-cert
- insecureSkipVerify: false
- keySecret:
- key: tls.key
- name: operator-controller-cert
- serverName: operator-controller-service.{{ .Values.namespaces.olmv1.name }}.svc
- selector:
- matchLabels:
- app.kubernetes.io/name: operator-controller
diff --git a/helm/prometheus/values.yaml b/helm/prometheus/values.yaml
deleted file mode 100644
index b38a255929..0000000000
--- a/helm/prometheus/values.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-# Default values for OLMv1.
-# This is a YAML-formatted file.
-# Declare variables to be passed into your templates.
-# Quote the threshold values to avoid the helm templater interpretting them
-
-# List of components to include
-options:
- operatorController:
- enabled: true
- thresholds:
- memoryGrowth: "100_000"
- memoryUsage: "100_000_000"
- cpuUsage: 20
- apiCallRate: 10
- catalogd:
- enabled: true
- thresholds:
- memoryGrowth: "100_000"
- memoryUsage: "75_000_000"
- cpuUsage: 20
- apiCallRate: 5
-
-# The set of namespaces
-namespaces:
- olmv1:
- name: olmv1-system
- prometheus:
- name: olmv1-system
- certManager:
- name: cert-manager
diff --git a/internal/operator-controller/rukpak/bundle/registryv1bundleconfig.json b/internal/operator-controller/rukpak/bundle/registryv1bundleconfig.json
index 1197f721a3..7ce7b8df3d 100644
--- a/internal/operator-controller/rukpak/bundle/registryv1bundleconfig.json
+++ b/internal/operator-controller/rukpak/bundle/registryv1bundleconfig.json
@@ -2105,7 +2105,7 @@
"$ref": "#/components/schemas/io.k8s.api.core.v1.ImageVolumeSource"
}
],
- "description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33. The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type."
+ "description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33. The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type."
},
"iscsi": {
"allOf": [
@@ -2150,7 +2150,7 @@
"$ref": "#/components/schemas/io.k8s.api.core.v1.PortworxVolumeSource"
}
],
- "description": "portworxVolume represents a portworx volume attached and mounted on kubelets host machine. Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate is on."
+ "description": "portworxVolume represents a portworx volume attached and mounted on kubelets host machine. Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type are redirected to the pxd.portworx.com CSI driver."
},
"projected": {
"allOf": [
diff --git a/internal/operator-controller/rukpak/preflights/crdupgradesafety/crdupgradesafety_test.go b/internal/operator-controller/rukpak/preflights/crdupgradesafety/crdupgradesafety_test.go
index 02f1bd7bd0..82fa203c64 100644
--- a/internal/operator-controller/rukpak/preflights/crdupgradesafety/crdupgradesafety_test.go
+++ b/internal/operator-controller/rukpak/preflights/crdupgradesafety/crdupgradesafety_test.go
@@ -394,17 +394,14 @@ func TestUpgrade(t *testing.T) {
Manifest: getManifestString(t, "crd-complex-breaking-changes-new.json"),
},
// This test verifies detection of multiple breaking changes in a single CRD upgrade:
- // 1. Type changed from "object" to "" - Properly detected by type validator
- // 2. Nullable changed from false to true - Properly detected by nullable validator
- // 3. OneOf constraint added - Reported as "unhandled" (needs crdify support)
- // See: https://github.com/kubernetes-sigs/crdify/issues/25
- // The upgrade is correctly blocked, but OneOf changes need better categorization.
+ // 1. Type changed from "object" to "" - Detected by type validator
+ // 2. Nullable changed from false to true - Detected by nullable validator
+ // 3. OneOf constraint added - Detected by oneOf validator
requireErr: wantErrorMsgs([]string{
`validating upgrade for CRD "services.networking.example.com"`,
`type: type changed`,
`nullable: nullable added`,
- `unhandled: unhandled changes found`,
- `OneOf`,
+ `oneOf: oneOf constraint added`,
}),
},
}
@@ -425,6 +422,38 @@ func TestUpgrade(t *testing.T) {
}
}
+func TestUpgrade_OneOfRemoved(t *testing.T) {
+ t.Run("removing oneOf subschemas should fail", func(t *testing.T) {
+ preflight := newMockPreflight(getCrdFromManifestFile(t, "crd-oneof-removed-old.json"), nil)
+ rel := &release.Release{
+ Name: "test-release",
+ Manifest: getManifestString(t, "crd-oneof-removed-new.json"),
+ }
+ objs, err := applier.HelmReleaseToObjectsConverter{}.GetObjectsFromRelease(rel)
+ require.NoError(t, err)
+ err = preflight.Upgrade(context.Background(), objs)
+ require.Error(t, err)
+ require.ErrorContains(t, err, "oneOf: allowed oneOf schemas removed")
+ })
+}
+
+func TestUpgrade_OneOfAdded(t *testing.T) {
+ t.Run("adding oneOf required constraints to existing property should report oneOf error", func(t *testing.T) {
+ preflight := newMockPreflight(getCrdFromManifestFile(t, "crd-oneof-safe-addition-old.json"), nil)
+ rel := &release.Release{
+ Name: "test-release",
+ Manifest: getManifestString(t, "crd-oneof-safe-addition-new.json"),
+ }
+ objs, err := applier.HelmReleaseToObjectsConverter{}.GetObjectsFromRelease(rel)
+ require.NoError(t, err)
+ err = preflight.Upgrade(context.Background(), objs)
+ require.Error(t, err)
+ require.ErrorContains(t, err, "oneOf: oneOf constraint added")
+ require.NotContains(t, err.Error(), "unhandled", "oneOf changes should be handled by the oneOf validator, not reported as unhandled")
+ require.NotContains(t, err.Error(), "type:", "type should not change when only oneOf constraints are added")
+ })
+}
+
func TestUpgrade_UnhandledChanges_InSpec_DefaultPolicy(t *testing.T) {
t.Run("unhandled spec changes cause error by default", func(t *testing.T) {
preflight := newMockPreflight(getCrdFromManifestFile(t, "crd-unhandled-old.json"), nil)
diff --git a/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-removed-new.json b/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-removed-new.json
new file mode 100644
index 0000000000..553ebc2895
--- /dev/null
+++ b/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-removed-new.json
@@ -0,0 +1,53 @@
+{
+ "apiVersion": "apiextensions.k8s.io/v1",
+ "kind": "CustomResourceDefinition",
+ "metadata": {
+ "name": "services.networking.example.com"
+ },
+ "spec": {
+ "group": "networking.example.com",
+ "versions": [
+ {
+ "name": "v1beta1",
+ "served": true,
+ "storage": true,
+ "schema": {
+ "openAPIV3Schema": {
+ "type": "object",
+ "properties": {
+ "spec": {
+ "type": "object",
+ "properties": {
+ "tls": {
+ "type": "object",
+ "properties": {
+ "credentialName": {
+ "type": "string"
+ },
+ "httpsRedirect": {
+ "type": "boolean"
+ },
+ "mode": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "scope": "Namespaced",
+ "names": {
+ "plural": "services",
+ "singular": "service",
+ "kind": "Service",
+ "shortNames": ["svc"]
+ }
+ },
+ "status": {
+ "storedVersions": ["v1beta1"]
+ }
+}
diff --git a/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-removed-old.json b/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-removed-old.json
new file mode 100644
index 0000000000..6ebb17b1a7
--- /dev/null
+++ b/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-removed-old.json
@@ -0,0 +1,61 @@
+{
+ "apiVersion": "apiextensions.k8s.io/v1",
+ "kind": "CustomResourceDefinition",
+ "metadata": {
+ "name": "services.networking.example.com"
+ },
+ "spec": {
+ "group": "networking.example.com",
+ "versions": [
+ {
+ "name": "v1beta1",
+ "served": true,
+ "storage": true,
+ "schema": {
+ "openAPIV3Schema": {
+ "type": "object",
+ "properties": {
+ "spec": {
+ "type": "object",
+ "properties": {
+ "tls": {
+ "type": "object",
+ "oneOf": [
+ {
+ "required": ["mode", "credentialName"]
+ },
+ {
+ "required": ["httpsRedirect"]
+ }
+ ],
+ "properties": {
+ "credentialName": {
+ "type": "string"
+ },
+ "httpsRedirect": {
+ "type": "boolean"
+ },
+ "mode": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "scope": "Namespaced",
+ "names": {
+ "plural": "services",
+ "singular": "service",
+ "kind": "Service",
+ "shortNames": ["svc"]
+ }
+ },
+ "status": {
+ "storedVersions": ["v1beta1"]
+ }
+}
diff --git a/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-safe-addition-new.json b/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-safe-addition-new.json
new file mode 100644
index 0000000000..3123c4b364
--- /dev/null
+++ b/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-safe-addition-new.json
@@ -0,0 +1,61 @@
+{
+ "apiVersion": "apiextensions.k8s.io/v1",
+ "kind": "CustomResourceDefinition",
+ "metadata": {
+ "name": "services.networking.example.com"
+ },
+ "spec": {
+ "group": "networking.example.com",
+ "versions": [
+ {
+ "name": "v1",
+ "served": true,
+ "storage": true,
+ "schema": {
+ "openAPIV3Schema": {
+ "type": "object",
+ "properties": {
+ "spec": {
+ "type": "object",
+ "properties": {
+ "tls": {
+ "type": "object",
+ "oneOf": [
+ {
+ "required": ["mode", "credentialName"]
+ },
+ {
+ "required": ["httpsRedirect"]
+ }
+ ],
+ "properties": {
+ "credentialName": {
+ "type": "string"
+ },
+ "httpsRedirect": {
+ "type": "boolean"
+ },
+ "mode": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "scope": "Namespaced",
+ "names": {
+ "plural": "services",
+ "singular": "service",
+ "kind": "Service",
+ "shortNames": ["svc"]
+ }
+ },
+ "status": {
+ "storedVersions": ["v1"]
+ }
+}
diff --git a/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-safe-addition-old.json b/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-safe-addition-old.json
new file mode 100644
index 0000000000..ef19b14eae
--- /dev/null
+++ b/internal/operator-controller/rukpak/preflights/crdupgradesafety/testdata/manifests/crd-oneof-safe-addition-old.json
@@ -0,0 +1,53 @@
+{
+ "apiVersion": "apiextensions.k8s.io/v1",
+ "kind": "CustomResourceDefinition",
+ "metadata": {
+ "name": "services.networking.example.com"
+ },
+ "spec": {
+ "group": "networking.example.com",
+ "versions": [
+ {
+ "name": "v1",
+ "served": true,
+ "storage": true,
+ "schema": {
+ "openAPIV3Schema": {
+ "type": "object",
+ "properties": {
+ "spec": {
+ "type": "object",
+ "properties": {
+ "tls": {
+ "type": "object",
+ "properties": {
+ "credentialName": {
+ "type": "string"
+ },
+ "httpsRedirect": {
+ "type": "boolean"
+ },
+ "mode": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "scope": "Namespaced",
+ "names": {
+ "plural": "services",
+ "singular": "service",
+ "kind": "Service",
+ "shortNames": ["svc"]
+ }
+ },
+ "status": {
+ "storedVersions": ["v1"]
+ }
+}
diff --git a/internal/shared/util/image/helm_test.go b/internal/shared/util/image/helm_test.go
index b47162f2e3..0bebc2a4e9 100644
--- a/internal/shared/util/image/helm_test.go
+++ b/internal/shared/util/image/helm_test.go
@@ -607,6 +607,7 @@ func setupChartRegistry(t *testing.T, chart []byte) (reference.NamedTagged, refe
clientOpts := []registry.ClientOption{
registry.ClientOptDebug(true),
registry.ClientOptEnableCache(true),
+ registry.ClientOptPlainHTTP(),
}
client, err := registry.NewClient(clientOpts...)
require.NoError(t, err)
diff --git a/internal/shared/util/test/utils.go b/internal/shared/util/test/utils.go
deleted file mode 100644
index 41128e46f0..0000000000
--- a/internal/shared/util/test/utils.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package test
-
-import (
- "os/exec"
- "testing"
-)
-
-// FindK8sClient returns the first available Kubernetes CLI client from the system,
-// It checks for the existence of each client by running `version --client`.
-// If no suitable client is found, the function terminates the test with a failure.
-func FindK8sClient(t *testing.T) string {
- t.Logf("Finding kubectl client")
- clients := []string{"kubectl", "oc"}
- for _, c := range clients {
- // Would prefer to use `command -v`, but even that may not be installed!
- if err := exec.Command(c, "version", "--client").Run(); err == nil {
- t.Logf("Using %q as k8s client", c)
- return c
- }
- }
- t.Fatal("k8s client not found")
- return ""
-}
diff --git a/internal/shared/util/tlsprofiles/tlsprofiles.go b/internal/shared/util/tlsprofiles/tlsprofiles.go
index b09fd4d125..968ae65b13 100644
--- a/internal/shared/util/tlsprofiles/tlsprofiles.go
+++ b/internal/shared/util/tlsprofiles/tlsprofiles.go
@@ -69,19 +69,24 @@ func cipherSuiteId(name string) uint16 {
// This is primarily so that we don't have to rewrite curve values in mozilla_data.go
const (
- X25519MLKEM768 tls.CurveID = tls.X25519MLKEM768
- X25519 tls.CurveID = tls.X25519
- prime256v1 tls.CurveID = tls.CurveP256
- secp384r1 tls.CurveID = tls.CurveP384
- secp521r1 tls.CurveID = tls.CurveP521
+ X25519MLKEM768 tls.CurveID = tls.X25519MLKEM768
+ X25519 tls.CurveID = tls.X25519
+ prime256v1 tls.CurveID = tls.CurveP256
+ secp384r1 tls.CurveID = tls.CurveP384
+ secp521r1 tls.CurveID = tls.CurveP521
+ SecP256r1MLKEM768 tls.CurveID = tls.SecP256r1MLKEM768
+ SecP384r1MLKEM1024 tls.CurveID = tls.SecP384r1MLKEM1024
)
var curves = map[string]tls.CurveID{
- "X25519MLKEM768": tls.X25519MLKEM768,
- "X25519": tls.X25519,
- "prime256v1": tls.CurveP256,
- "secp384r1": tls.CurveP384,
- "secp521r1": tls.CurveP521,
+ "X25519MLKEM768": tls.X25519MLKEM768,
+ "X25519": tls.X25519,
+ "prime256v1": tls.CurveP256,
+ "secp256r1": tls.CurveP256, // IANA name for prime256v1
+ "secp384r1": tls.CurveP384,
+ "secp521r1": tls.CurveP521,
+ "SecP256r1MLKEM768": tls.SecP256r1MLKEM768,
+ "SecP384r1MLKEM1024": tls.SecP384r1MLKEM1024,
}
// Returns 0 for an invalid curve name
diff --git a/internal/shared/util/tlsprofiles/tlsprofiles_test.go b/internal/shared/util/tlsprofiles/tlsprofiles_test.go
index 9c8075f4b0..d218997867 100644
--- a/internal/shared/util/tlsprofiles/tlsprofiles_test.go
+++ b/internal/shared/util/tlsprofiles/tlsprofiles_test.go
@@ -94,12 +94,15 @@ func TestSetCustomCurves(t *testing.T) {
name string
result bool
}{
- {"X25519MLKEM768", true}, // Post-quantum hybrid curve (Go 1.24+)
+ {"X25519MLKEM768", true}, // Post-quantum hybrid (Go 1.24+)
+ {"SecP256r1MLKEM768", true}, // Post-quantum hybrid (Go 1.26+)
+ {"SecP384r1MLKEM1024", true}, // Post-quantum hybrid (Go 1.26+)
{"X25519", true},
{"prime256v1", true},
+ {"secp256r1", true}, // IANA alias for prime256v1
{"secp384r1", true},
{"secp521r1", true},
- {"unknown-cuve", false},
+ {"unknown-curve", false},
{"X448", false}, // Valid OpenSSL curve, not implemented
{"X25519,prime256v1", true}, // Multiple
}
@@ -115,6 +118,12 @@ func TestSetCustomCurves(t *testing.T) {
}
}
+func TestSecp256r1AliasesPrime256v1(t *testing.T) {
+ require.Equal(t, curveId("prime256v1"), curveId("secp256r1"),
+ "secp256r1 and prime256v1 must resolve to the same tls.CurveID")
+ require.Equal(t, tls.CurveP256, curveId("secp256r1"))
+}
+
func TestSetCustomVersion(t *testing.T) {
var version tlsVersion
diff --git a/openshift/tests-extension/go.mod b/openshift/tests-extension/go.mod
index f02bb402ee..b818412c5f 100644
--- a/openshift/tests-extension/go.mod
+++ b/openshift/tests-extension/go.mod
@@ -5,7 +5,7 @@ go 1.26.3
require (
github.com/blang/semver/v4 v4.0.0
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32
- github.com/onsi/ginkgo/v2 v2.27.2
+ github.com/onsi/ginkgo/v2 v2.27.4
github.com/onsi/gomega v1.41.0
github.com/openshift-eng/openshift-tests-extension v0.0.0-20251105193959-75a0be5d9bd7
github.com/openshift/api v0.0.0-20260318185450-1f2fa3f09f4e
@@ -18,14 +18,14 @@ require (
github.com/tidwall/gjson v1.18.0
github.com/tidwall/pretty v1.2.1
gopkg.in/yaml.v3 v3.0.1
- k8s.io/api v0.35.4
- k8s.io/apiextensions-apiserver v0.35.4
- k8s.io/apimachinery v0.35.4
- k8s.io/apiserver v0.35.4
+ k8s.io/api v0.36.1
+ k8s.io/apiextensions-apiserver v0.36.1
+ k8s.io/apimachinery v0.36.1
+ k8s.io/apiserver v0.36.1
k8s.io/client-go v1.5.2
- k8s.io/kubernetes v1.35.0
+ k8s.io/kubernetes v1.36.1
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
- sigs.k8s.io/controller-runtime v0.23.3
+ sigs.k8s.io/controller-runtime v0.24.1
)
require (
@@ -42,20 +42,20 @@ require (
github.com/fxamacker/cbor/v2 v2.9.1 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
- github.com/go-openapi/jsonpointer v0.22.5 // indirect
+ github.com/go-openapi/jsonpointer v0.23.1 // indirect
github.com/go-openapi/jsonreference v0.21.5 // indirect
- github.com/go-openapi/swag v0.25.5 // indirect
- github.com/go-openapi/swag/cmdutils v0.25.5 // indirect
- github.com/go-openapi/swag/conv v0.25.5 // indirect
- github.com/go-openapi/swag/fileutils v0.25.5 // indirect
- github.com/go-openapi/swag/jsonname v0.25.5 // indirect
- github.com/go-openapi/swag/jsonutils v0.25.5 // indirect
- github.com/go-openapi/swag/loading v0.25.5 // indirect
- github.com/go-openapi/swag/mangling v0.25.5 // indirect
- github.com/go-openapi/swag/netutils v0.25.5 // indirect
- github.com/go-openapi/swag/stringutils v0.25.5 // indirect
- github.com/go-openapi/swag/typeutils v0.25.5 // indirect
- github.com/go-openapi/swag/yamlutils v0.25.5 // indirect
+ github.com/go-openapi/swag v0.26.0 // indirect
+ github.com/go-openapi/swag/cmdutils v0.26.0 // indirect
+ github.com/go-openapi/swag/conv v0.26.0 // indirect
+ github.com/go-openapi/swag/fileutils v0.26.0 // indirect
+ github.com/go-openapi/swag/jsonname v0.26.0 // indirect
+ github.com/go-openapi/swag/jsonutils v0.26.0 // indirect
+ github.com/go-openapi/swag/loading v0.26.0 // indirect
+ github.com/go-openapi/swag/mangling v0.26.0 // indirect
+ github.com/go-openapi/swag/netutils v0.26.0 // indirect
+ github.com/go-openapi/swag/stringutils v0.26.0 // indirect
+ github.com/go-openapi/swag/typeutils v0.26.0 // indirect
+ github.com/go-openapi/swag/yamlutils v0.26.0 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/cel-go v0.28.1 // indirect
@@ -97,25 +97,25 @@ require (
golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f // indirect
golang.org/x/net v0.55.0 // indirect
golang.org/x/oauth2 v0.36.0 // indirect
- golang.org/x/sync v0.20.0 // indirect
- golang.org/x/sys v0.45.0 // indirect
+ golang.org/x/sync v0.21.0 // indirect
+ golang.org/x/sys v0.46.0 // indirect
golang.org/x/term v0.43.0 // indirect
- golang.org/x/text v0.37.0 // indirect
+ golang.org/x/text v0.38.0 // indirect
golang.org/x/time v0.15.0 // indirect
golang.org/x/tools v0.45.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d // indirect
google.golang.org/grpc v1.81.1 // indirect
- google.golang.org/protobuf v1.36.11 // indirect
+ google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
- k8s.io/component-base v0.35.4 // indirect
- k8s.io/component-helpers v0.35.0 // indirect
+ k8s.io/component-base v0.36.1 // indirect
+ k8s.io/component-helpers v0.36.1 // indirect
k8s.io/controller-manager v0.33.2 // indirect
k8s.io/klog/v2 v2.140.0 // indirect
- k8s.io/kube-openapi v0.0.0-20260319004828-5883c5ee87b9 // indirect
- k8s.io/kubectl v0.35.1 // indirect
+ k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199 // indirect
+ k8s.io/kubectl v0.36.1 // indirect
k8s.io/kubelet v0.31.1 // indirect
k8s.io/pod-security-admission v0.33.4 // indirect
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect
diff --git a/openshift/tests-extension/go.sum b/openshift/tests-extension/go.sum
index 3369d509e2..ba2ab61d78 100644
--- a/openshift/tests-extension/go.sum
+++ b/openshift/tests-extension/go.sum
@@ -36,40 +36,40 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
-github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA=
-github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0=
+github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4=
+github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY=
github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe+pJyVWRdiE=
github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw=
-github.com/go-openapi/swag v0.25.5 h1:pNkwbUEeGwMtcgxDr+2GBPAk4kT+kJ+AaB+TMKAg+TU=
-github.com/go-openapi/swag v0.25.5/go.mod h1:B3RT6l8q7X803JRxa2e59tHOiZlX1t8viplOcs9CwTA=
-github.com/go-openapi/swag/cmdutils v0.25.5 h1:yh5hHrpgsw4NwM9KAEtaDTXILYzdXh/I8Whhx9hKj7c=
-github.com/go-openapi/swag/cmdutils v0.25.5/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0=
-github.com/go-openapi/swag/conv v0.25.5 h1:wAXBYEXJjoKwE5+vc9YHhpQOFj2JYBMF2DUi+tGu97g=
-github.com/go-openapi/swag/conv v0.25.5/go.mod h1:CuJ1eWvh1c4ORKx7unQnFGyvBbNlRKbnRyAvDvzWA4k=
-github.com/go-openapi/swag/fileutils v0.25.5 h1:B6JTdOcs2c0dBIs9HnkyTW+5gC+8NIhVBUwERkFhMWk=
-github.com/go-openapi/swag/fileutils v0.25.5/go.mod h1:V3cT9UdMQIaH4WiTrUc9EPtVA4txS0TOmRURmhGF4kc=
-github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo=
-github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU=
-github.com/go-openapi/swag/jsonutils v0.25.5 h1:XUZF8awQr75MXeC+/iaw5usY/iM7nXPDwdG3Jbl9vYo=
-github.com/go-openapi/swag/jsonutils v0.25.5/go.mod h1:48FXUaz8YsDAA9s5AnaUvAmry1UcLcNVWUjY42XkrN4=
-github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5 h1:SX6sE4FrGb4sEnnxbFL/25yZBb5Hcg1inLeErd86Y1U=
-github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5/go.mod h1:/2KvOTrKWjVA5Xli3DZWdMCZDzz3uV/T7bXwrKWPquo=
-github.com/go-openapi/swag/loading v0.25.5 h1:odQ/umlIZ1ZVRteI6ckSrvP6e2w9UTF5qgNdemJHjuU=
-github.com/go-openapi/swag/loading v0.25.5/go.mod h1:I8A8RaaQ4DApxhPSWLNYWh9NvmX2YKMoB9nwvv6oW6g=
-github.com/go-openapi/swag/mangling v0.25.5 h1:hyrnvbQRS7vKePQPHHDso+k6CGn5ZBs5232UqWZmJZw=
-github.com/go-openapi/swag/mangling v0.25.5/go.mod h1:6hadXM/o312N/h98RwByLg088U61TPGiltQn71Iw0NY=
-github.com/go-openapi/swag/netutils v0.25.5 h1:LZq2Xc2QI8+7838elRAaPCeqJnHODfSyOa7ZGfxDKlU=
-github.com/go-openapi/swag/netutils v0.25.5/go.mod h1:lHbtmj4m57APG/8H7ZcMMSWzNqIQcu0RFiXrPUara14=
-github.com/go-openapi/swag/stringutils v0.25.5 h1:NVkoDOA8YBgtAR/zvCx5rhJKtZF3IzXcDdwOsYzrB6M=
-github.com/go-openapi/swag/stringutils v0.25.5/go.mod h1:PKK8EZdu4QJq8iezt17HM8RXnLAzY7gW0O1KKarrZII=
-github.com/go-openapi/swag/typeutils v0.25.5 h1:EFJ+PCga2HfHGdo8s8VJXEVbeXRCYwzzr9u4rJk7L7E=
-github.com/go-openapi/swag/typeutils v0.25.5/go.mod h1:itmFmScAYE1bSD8C4rS0W+0InZUBrB2xSPbWt6DLGuc=
-github.com/go-openapi/swag/yamlutils v0.25.5 h1:kASCIS+oIeoc55j28T4o8KwlV2S4ZLPT6G0iq2SSbVQ=
-github.com/go-openapi/swag/yamlutils v0.25.5/go.mod h1:Gek1/SjjfbYvM+Iq4QGwa/2lEXde9n2j4a3wI3pNuOQ=
-github.com/go-openapi/testify/enable/yaml/v2 v2.4.0 h1:7SgOMTvJkM8yWrQlU8Jm18VeDPuAvB/xWrdxFJkoFag=
-github.com/go-openapi/testify/enable/yaml/v2 v2.4.0/go.mod h1:14iV8jyyQlinc9StD7w1xVPW3CO3q1Gj04Jy//Kw4VM=
-github.com/go-openapi/testify/v2 v2.4.0 h1:8nsPrHVCWkQ4p8h1EsRVymA2XABB4OT40gcvAu+voFM=
-github.com/go-openapi/testify/v2 v2.4.0/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=
+github.com/go-openapi/swag v0.26.0 h1:GVDXCmfvhfu1BxiHo8/FA+BbKmhecHnG3varjON5/RI=
+github.com/go-openapi/swag v0.26.0/go.mod h1:82g3193sZJRbocs7bNCqGfIgq8pkuwVwCfhKIRlEQF0=
+github.com/go-openapi/swag/cmdutils v0.26.0 h1:iowihOcvq7y4egO8cOq0dmfohz6wfeQ63U1EnuhO2TU=
+github.com/go-openapi/swag/cmdutils v0.26.0/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM=
+github.com/go-openapi/swag/conv v0.26.0 h1:5yGGsPYI1ZCva93U0AoKi/iZrNhaJEjr324YVsiD89I=
+github.com/go-openapi/swag/conv v0.26.0/go.mod h1:tpAmIL7X58VPnHHiSO4uE3jBeRamGsFsfdDeDtb5ECE=
+github.com/go-openapi/swag/fileutils v0.26.0 h1:WJoPRvsA7QRiiWluowkLJa9jaYR7FCuxmDvnCgaRRxU=
+github.com/go-openapi/swag/fileutils v0.26.0/go.mod h1:0WDJ7lp67eNjPMO50wAWYlKvhOb6CQ37rzR7wrgI8Tc=
+github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w=
+github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M=
+github.com/go-openapi/swag/jsonutils v0.26.0 h1:FawFML2iAXsPqmERscuMPIHmFsoP1tOqWkxBaKNMsnA=
+github.com/go-openapi/swag/jsonutils v0.26.0/go.mod h1:2VmA0CJlyFqgawOaPI9psnjFDqzyivIqLYN34t9p91E=
+github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0 h1:apqeINu/ICHouqiRZbyFvuDge5jCmmLTqGQ9V95EaOM=
+github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0/go.mod h1:AyM6QT8uz5IdKxk5akv0y6u4QvcL9GWERt0Jx/F/R8Y=
+github.com/go-openapi/swag/loading v0.26.0 h1:Apg6zaKhCJurpJer0DCxq99qwmhFddBhaMX7kilDcko=
+github.com/go-openapi/swag/loading v0.26.0/go.mod h1:dBxQ/6V2uBaAQdevN18VELE6xSpJWZxLX4txe12JwDg=
+github.com/go-openapi/swag/mangling v0.26.0 h1:Du2YC4YLA/Y5m/YKQd7AnY5qq0wRKSFZTTt8ktFaXcQ=
+github.com/go-openapi/swag/mangling v0.26.0/go.mod h1:jifS7W9vbg+pw63bT+GI53otluMQL3CeemuyCHKwVx0=
+github.com/go-openapi/swag/netutils v0.26.0 h1:CmZp+ZT7HrmFwrC3GdGsXBq2+42T1bjKBapcqVpIs3c=
+github.com/go-openapi/swag/netutils v0.26.0/go.mod h1:5iK+Ok3ZohWWex1C50BFTPexi03UaPwjW4Oj8kgrpwo=
+github.com/go-openapi/swag/stringutils v0.26.0 h1:qZQngLxs5s7SLijc3N2ZO+fUq2o8LjuWAASSrJuh+xg=
+github.com/go-openapi/swag/stringutils v0.26.0/go.mod h1:sWn5uY+QIIspwPhvgnqJsH8xqFT2ZbYcvbcFanRyhFE=
+github.com/go-openapi/swag/typeutils v0.26.0 h1:2kdEwdiNWy+JJdOvu5MA2IIg2SylWAFuuyQIKYybfq4=
+github.com/go-openapi/swag/typeutils v0.26.0/go.mod h1:oovDuIUvTrEHVMqWilQzKzV4YlSKgyZmFh7AlfABNVE=
+github.com/go-openapi/swag/yamlutils v0.26.0 h1:H7O8l/8NJJQ/oiReEN+oMpnGMyt8G0hl460nRZxhLMQ=
+github.com/go-openapi/swag/yamlutils v0.26.0/go.mod h1:1evKEGAtP37Pkwcc7EWMF0hedX0/x3Rkvei2wtG/TbU=
+github.com/go-openapi/testify/enable/yaml/v2 v2.4.2 h1:5zRca5jw7lzVREKCZVNBpysDNBjj74rBh0N2BGQbSR0=
+github.com/go-openapi/testify/enable/yaml/v2 v2.4.2/go.mod h1:XVevPw5hUXuV+5AkI1u1PeAm27EQVrhXTTCPAF85LmE=
+github.com/go-openapi/testify/v2 v2.4.2 h1:tiByHpvE9uHrrKjOszax7ZvKB7QOgizBWGBLuq0ePx4=
+github.com/go-openapi/testify/v2 v2.4.2/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
@@ -220,8 +220,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
-go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
+go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
@@ -246,19 +246,19 @@ golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
-golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
+golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
+golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
-golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
+golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4=
golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
-golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
+golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
+golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -279,8 +279,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d h1:
google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ=
google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I=
-google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
-google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
+google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI=
+google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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=
@@ -295,14 +295,14 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
-k8s.io/kube-openapi v0.0.0-20260319004828-5883c5ee87b9 h1:Sztf7ESG9tAXRW/ACJZjrj5jhdOUqS2KFRQT+CTvu78=
-k8s.io/kube-openapi v0.0.0-20260319004828-5883c5ee87b9/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
+k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199 h1:sWu4Td5mgJlwunsUydnhKEAfNUHM7hm1wfKEQmD7G5c=
+k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM=
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
-sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80=
-sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0=
+sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4=
+sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/.cliff.toml b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/.cliff.toml
deleted file mode 100644
index 702629f5dc..0000000000
--- a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/.cliff.toml
+++ /dev/null
@@ -1,181 +0,0 @@
-# git-cliff ~ configuration file
-# https://git-cliff.org/docs/configuration
-
-[changelog]
-header = """
-"""
-
-footer = """
-
------
-
-**[{{ remote.github.repo }}]({{ self::remote_url() }}) license terms**
-
-[![License][license-badge]][license-url]
-
-[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
-[license-url]: {{ self::remote_url() }}/?tab=Apache-2.0-1-ov-file#readme
-
-{%- macro remote_url() -%}
- https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}
-{%- endmacro -%}
-"""
-
-body = """
-{%- if version %}
-## [{{ version | trim_start_matches(pat="v") }}]({{ self::remote_url() }}/tree/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
-{%- else %}
-## [unreleased]
-{%- endif %}
-{%- if message %}
- {%- raw %}\n{% endraw %}
-{{ message }}
- {%- raw %}\n{% endraw %}
-{%- endif %}
-{%- if version %}
- {%- if previous.version %}
-
-**Full Changelog**: <{{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }}>
- {%- endif %}
-{%- else %}
- {%- raw %}\n{% endraw %}
-{%- endif %}
-
-{%- if statistics %}{% if statistics.commit_count %}
- {%- raw %}\n{% endraw %}
-{{ statistics.commit_count }} commits in this release.
- {%- raw %}\n{% endraw %}
-{%- endif %}{% endif %}
------
-
-{%- for group, commits in commits | group_by(attribute="group") %}
- {%- raw %}\n{% endraw %}
-### {{ group | upper_first }}
- {%- raw %}\n{% endraw %}
- {%- for commit in commits %}
- {%- if commit.remote.pr_title %}
- {%- set commit_message = commit.remote.pr_title %}
- {%- else %}
- {%- set commit_message = commit.message %}
- {%- endif %}
-* {{ commit_message | split(pat="\n") | first | trim }}
- {%- if commit.remote.username %}
-{%- raw %} {% endraw %}by [@{{ commit.remote.username }}](https://github.com/{{ commit.remote.username }})
- {%- endif %}
- {%- if commit.remote.pr_number %}
-{%- raw %} {% endraw %}in [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }})
- {%- endif %}
-{%- raw %} {% endraw %}[...]({{ self::remote_url() }}/commit/{{ commit.id }})
- {%- endfor %}
-{%- endfor %}
-
-{%- if github %}
-{%- raw %}\n{% endraw -%}
- {%- set all_contributors = github.contributors | length %}
- {%- if github.contributors | filter(attribute="username", value="dependabot[bot]") | length < all_contributors %}
------
-
-### People who contributed to this release
- {% endif %}
- {%- for contributor in github.contributors | filter(attribute="username") | sort(attribute="username") %}
- {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %}
-* [@{{ contributor.username }}](https://github.com/{{ contributor.username }})
- {%- endif %}
- {%- endfor %}
-
- {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
------
- {%- raw %}\n{% endraw %}
-
-### New Contributors
- {%- endif %}
-
- {%- for contributor in github.contributors | filter(attribute="is_first_time", value=true) %}
- {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %}
-* @{{ contributor.username }} made their first contribution
- {%- if contributor.pr_number %}
- in [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
- {%- endif %}
- {%- endif %}
- {%- endfor %}
-{%- endif %}
-
-{%- raw %}\n{% endraw %}
-
-{%- macro remote_url() -%}
- https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}
-{%- endmacro -%}
-"""
-# Remove leading and trailing whitespaces from the changelog's body.
-trim = true
-# Render body even when there are no releases to process.
-render_always = true
-# An array of regex based postprocessors to modify the changelog.
-postprocessors = [
- # Replace the placeholder with a URL.
- #{ pattern = '', replace = "https://github.com/orhun/git-cliff" },
-]
-# output file path
-# output = "test.md"
-
-[git]
-# Parse commits according to the conventional commits specification.
-# See https://www.conventionalcommits.org
-conventional_commits = false
-# Exclude commits that do not match the conventional commits specification.
-filter_unconventional = false
-# Require all commits to be conventional.
-# Takes precedence over filter_unconventional.
-require_conventional = false
-# Split commits on newlines, treating each line as an individual commit.
-split_commits = false
-# An array of regex based parsers to modify commit messages prior to further processing.
-commit_preprocessors = [
- # Replace issue numbers with link templates to be updated in `changelog.postprocessors`.
- #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"},
- # Check spelling of the commit message using https://github.com/crate-ci/typos.
- # If the spelling is incorrect, it will be fixed automatically.
- #{ pattern = '.*', replace_command = 'typos --write-changes -' }
-]
-# Prevent commits that are breaking from being excluded by commit parsers.
-protect_breaking_commits = false
-# An array of regex based parsers for extracting data from the commit message.
-# Assigns commits to groups.
-# Optionally sets the commit's scope and can decide to exclude commits from further processing.
-commit_parsers = [
- { message = "^[Cc]hore\\([Rr]elease\\): prepare for", skip = true },
- { message = "(^[Mm]erge)|([Mm]erge conflict)", skip = true },
- { field = "author.name", pattern = "dependabot*", group = "Updates" },
- { message = "([Ss]ecurity)|([Vv]uln)", group = "Security" },
- { body = "(.*[Ss]ecurity)|([Vv]uln)", group = "Security" },
- { message = "([Cc]hore\\(lint\\))|(style)|(lint)|(codeql)|(golangci)", group = "Code quality" },
- { message = "(^[Dd]oc)|((?i)readme)|(badge)|(typo)|(documentation)", group = "Documentation" },
- { message = "(^[Ff]eat)|(^[Ee]nhancement)", group = "Implemented enhancements" },
- { message = "(^ci)|(\\(ci\\))|(fixup\\s+ci)|(fix\\s+ci)|(license)|(example)", group = "Miscellaneous tasks" },
- { message = "^test", group = "Testing" },
- { message = "(^fix)|(panic)", group = "Fixed bugs" },
- { message = "(^refact)|(rework)", group = "Refactor" },
- { message = "(^[Pp]erf)|(performance)", group = "Performance" },
- { message = "(^[Cc]hore)", group = "Miscellaneous tasks" },
- { message = "^[Rr]evert", group = "Reverted changes" },
- { message = "(upgrade.*?go)|(go\\s+version)", group = "Updates" },
- { message = ".*", group = "Other" },
-]
-# Exclude commits that are not matched by any commit parser.
-filter_commits = false
-# An array of link parsers for extracting external references, and turning them into URLs, using regex.
-link_parsers = []
-# Include only the tags that belong to the current branch.
-use_branch_tags = false
-# Order releases topologically instead of chronologically.
-topo_order = false
-# Order releases topologically instead of chronologically.
-topo_order_commits = true
-# Order of commits in each group/release within the changelog.
-# Allowed values: newest, oldest
-sort_commits = "newest"
-# Process submodules commits
-recurse_submodules = false
-
-#[remote.github]
-#owner = "go-openapi"
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/.gitignore b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/.gitignore
index 885dc27ab0..d8f4186fe5 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/.gitignore
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/.gitignore
@@ -3,4 +3,3 @@
.idea
.env
.mcp.json
-.claude/
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md
index 2ebebedc15..9990f4a354 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md
@@ -4,11 +4,11 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 12 | 101 |
+| 13 | 111 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
-| @fredbi | 54 | |
+| @fredbi | 63 | |
| @casualjim | 33 | |
| @magodo | 3 | |
| @youyuanwu | 3 | |
@@ -18,7 +18,8 @@
| @ianlancetaylor | 1 | |
| @mfleader | 1 | |
| @Neo2308 | 1 | |
+| @alexandear | 1 | |
| @olivierlemasle | 1 | |
| @testwill | 1 | |
- _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/NOTICE b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/NOTICE
index f3b51939a9..201908d2f0 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/NOTICE
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/NOTICE
@@ -18,7 +18,7 @@ It ships with copies of other software which license terms are recalled below.
The original software was authored on 25-02-2013 by sigu-399 (https://github.com/sigu-399, sigu.399@gmail.com).
-github.com/sigh-399/jsonpointer
+github.com/sigu-399/jsonpointer
===========================
// SPDX-FileCopyrightText: Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/README.md b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/README.md
index c52803e2e8..24fbe1bf68 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/README.md
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/README.md
@@ -16,17 +16,25 @@ An implementation of JSON Pointer for golang, which supports go `struct`.
## Announcements
-* **2025-12-19** : new community chat on discord
- * a new discord community channel is available to be notified of changes and support users
- * our venerable Slack channel remains open, and will be eventually discontinued on **2026-03-31**
-
-You may join the discord community by clicking the invite link on the discord badge (also above). [![Discord Channel][discord-badge]][discord-url]
-
-Or join our Slack channel: [![Slack Channel][slack-logo]![slack-badge]][slack-url]
+* **2026-04-15** : added support for trailing "-" for arrays (v0.23.0)
+ * this brings full support of [RFC6901][RFC6901]
+ * this is supported for types relying on the reflection-based implemented
+ * API semantics remain essentially unaltered. Exception: `Pointer.Set(document any,value any) (document any, err error)`
+ can only perform a best-effort to mutate the input document in place. In the case of adding elements to an array with a
+ trailing "-", either pass a mutable array (`*[]T`) as the input document, or use the returned updated document instead.
+ * types that implement the `JSONSetable` interface may not implement the mutation implied by the trailing "-"
+
+* **2026-04-15** : added support for optional alternate JSON name providers
+ * for struct support the defaults might not suit all situations: there are known limitations
+ when it comes to handle untagged fields or embedded types.
+ * the default name provider in use is not fully aligned with go JSON stdlib
+ * exposed an option (or global setting) to change the provider that resolves a struct into json keys
+ * the default behavior is not altered
+ * a new alternate name provider is added (imported from `go-openapi/swag/jsonname`), aligned with JSON stdlib behavior
## Status
-API is stable.
+API is stable and feature-complete.
## Import this library in your project
@@ -88,7 +96,7 @@ See
-also known as [RFC6901](https://www.rfc-editor.org/rfc/rfc6901)
+also known as [RFC6901][RFC6901].
## Licensing
@@ -99,19 +107,19 @@ on top of which it has been built.
## Limitations
-The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array,
-the reference token MUST contain either...' is not implemented.
-
-That is because our implementation of the JSON pointer only supports explicit references to array elements:
-the provision in the spec to resolve non-existent members as "the last element in the array",
-using the special trailing character "-" is not implemented.
+* [RFC6901][RFC6901] is now fully supported, including trailing "-" semantics for arrays (for `Set` operations).
+* Default behavior: JSON name detection in go `struct`s
+ - Unlike go standard marshaling, untagged fields do not default to the go field name and are ignored.
+ - anonymous fields are not traversed if untagged
+ - the above limitations may be overcome by calling `UseGoNameProvider()` at initialization time.
+ - alternatively, users may inject the desired custom behavior for naming fields as an option.
## Other documentation
* [All-time contributors](./CONTRIBUTORS.md)
-* [Contributing guidelines](.github/CONTRIBUTING.md)
-* [Maintainers documentation](docs/MAINTAINERS.md)
-* [Code style](docs/STYLE.md)
+* [Contributing guidelines][contributing-doc-site]
+* [Maintainers documentation][maintainers-doc-site]
+* [Code style][style-doc-site]
## Cutting a new release
@@ -142,11 +150,8 @@ Maintainers can cut a new release by either:
[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/jsonpointer
[godoc-url]: http://pkg.go.dev/github.com/go-openapi/jsonpointer
-[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png
-[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
-[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
@@ -156,3 +161,8 @@ Maintainers can cut a new release by either:
[goversion-url]: https://github.com/go-openapi/jsonpointer/blob/master/go.mod
[top-badge]: https://img.shields.io/github/languages/top/go-openapi/jsonpointer
[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/jsonpointer/latest
+[RFC6901]: https://www.rfc-editor.org/rfc/rfc6901
+
+[contributing-doc-site]: https://go-openapi.github.io/doc-site/contributing/contributing/index.html
+[maintainers-doc-site]: https://go-openapi.github.io/doc-site/maintainers/index.html
+[style-doc-site]: https://go-openapi.github.io/doc-site/contributing/style/index.html
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/errors.go b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/errors.go
index 8c50dde8bc..8813474d44 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/errors.go
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/errors.go
@@ -16,12 +16,24 @@ const (
ErrPointer pointerError = "JSON pointer error"
// ErrInvalidStart states that a JSON pointer must start with a separator ("/").
- ErrInvalidStart pointerError = `JSON pointer must be empty or start with a "` + pointerSeparator
+ ErrInvalidStart pointerError = `JSON pointer must be empty or start with a "` + pointerSeparator + `"`
// ErrUnsupportedValueType indicates that a value of the wrong type is being set.
ErrUnsupportedValueType pointerError = "only structs, pointers, maps and slices are supported for setting values"
+
+ // ErrDashToken indicates use of the RFC 6901 "-" reference token
+ // in a context where it cannot be resolved.
+ //
+ // Per RFC 6901 §4 the "-" token refers to the (nonexistent) element
+ // after the last array element. It may only be used as the terminal
+ // token of a [Pointer.Set] against a slice, where it means "append".
+ // Any other use (get, offset, intermediate traversal, non-slice target)
+ // is an error condition that wraps this sentinel.
+ ErrDashToken pointerError = `the "-" array token cannot be resolved here` //nolint:gosec // G101 false positive: this is a JSON Pointer reference token, not a credential.
)
+const dashToken = "-"
+
func errNoKey(key string) error {
return fmt.Errorf("object has no key %q: %w", key, ErrPointer)
}
@@ -33,3 +45,15 @@ func errOutOfBounds(length, idx int) error {
func errInvalidReference(token string) error {
return fmt.Errorf("invalid token reference %q: %w", token, ErrPointer)
}
+
+func errDashOnGet() error {
+ return fmt.Errorf("cannot resolve %q token on get: %w: %w", dashToken, ErrDashToken, ErrPointer)
+}
+
+func errDashIntermediate() error {
+ return fmt.Errorf("the %q token may only appear as the terminal token of a pointer: %w: %w", dashToken, ErrDashToken, ErrPointer)
+}
+
+func errDashOnOffset() error {
+ return fmt.Errorf("cannot compute offset for %q token (nonexistent element): %w: %w", dashToken, ErrDashToken, ErrPointer)
+}
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/ifaces.go b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/ifaces.go
new file mode 100644
index 0000000000..1e56ac0442
--- /dev/null
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/ifaces.go
@@ -0,0 +1,47 @@
+// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonpointer
+
+import "reflect"
+
+// JSONPointable is an interface for structs to implement,
+// when they need to customize the json pointer process or want to avoid the use of reflection.
+type JSONPointable interface {
+ // JSONLookup returns a value pointed at this (unescaped) key.
+ JSONLookup(key string) (any, error)
+}
+
+// JSONSetable is an interface for structs to implement,
+// when they need to customize the json pointer process or want to avoid the use of reflection.
+//
+// # Handling of the RFC 6901 "-" token
+//
+// When a type implementing JSONSetable is the terminal parent of a [Pointer.Set]
+// call, the library passes the raw reference token to JSONSet without
+// interpretation. In particular, the RFC 6901 "-" token (which conventionally
+// means "append" for arrays, per RFC 6902) is forwarded verbatim as the key
+// argument. Implementations that model an array-like container are expected
+// to give "-" the append semantics; implementations that do not should return
+// an error wrapping [ErrDashToken] (or [ErrPointer]) for clarity.
+//
+// Implementations are responsible for any in-place mutation: the library does
+// not attempt to rebind the result of JSONSet into a parent container.
+type JSONSetable interface {
+ // JSONSet sets the value pointed at the (unescaped) key.
+ //
+ // The key may be the RFC 6901 "-" token when the pointer targets a
+ // slice-like member; see the interface documentation for details.
+ JSONSet(key string, value any) error
+}
+
+// NameProvider knows how to resolve go struct fields into json names.
+//
+// The default provider is brought by [github.com/go-openapi/swag/jsonname.DefaultJSONNameProvider].
+type NameProvider interface {
+ // GetGoName gets the go name for a json property name
+ GetGoName(subject any, name string) (string, bool)
+
+ // GetGoNameForType gets the go name for a given type for a json property name
+ GetGoNameForType(tpe reflect.Type, name string) (string, bool)
+}
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/options.go b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/options.go
new file mode 100644
index 0000000000..d52caab222
--- /dev/null
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/options.go
@@ -0,0 +1,86 @@
+// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonpointer
+
+import (
+ "sync"
+
+ "github.com/go-openapi/swag/jsonname"
+)
+
+// Option to tune the behavior of a JSON [Pointer].
+type Option func(*options)
+
+var (
+ //nolint:gochecknoglobals // package level defaults are provided as a convenient, backward-compatible way to adopt options.
+ defaultOptions = options{
+ provider: jsonname.DefaultJSONNameProvider,
+ }
+ //nolint:gochecknoglobals // guards defaultOptions against concurrent SetDefaultNameProvider / read races (testing)
+ defaultOptionsMu sync.RWMutex
+)
+
+// SetDefaultNameProvider sets the [NameProvider] as a package-level default.
+//
+// By default, the default provider is [jsonname.DefaultJSONNameProvider].
+//
+// It is safe to call concurrently with [Pointer.Get], [Pointer.Set],
+// [GetForToken] and [SetForToken]. The typical usage is to call it once
+// at initialization time.
+//
+// A nil provider is ignored.
+func SetDefaultNameProvider(provider NameProvider) {
+ if provider == nil {
+ return
+ }
+
+ defaultOptionsMu.Lock()
+ defer defaultOptionsMu.Unlock()
+
+ defaultOptions.provider = provider
+}
+
+// UseGoNameProvider sets the [NameProvider] as a package-level default
+// to the alternative provider [jsonname.GoNameProvider], that covers a few areas
+// not supported by the default name provider.
+//
+// This implementation supports untagged exported fields and embedded types in go struct.
+// It follows strictly the behavior of the JSON standard library regarding field naming conventions.
+//
+// It is safe to call concurrently with [Pointer.Get], [Pointer.Set],
+// [GetForToken] and [SetForToken]. The typical usage is to call it once
+// at initialization time.
+func UseGoNameProvider() {
+ SetDefaultNameProvider(jsonname.NewGoNameProvider())
+}
+
+// DefaultNameProvider returns the current package-level [NameProvider].
+func DefaultNameProvider() NameProvider { //nolint:ireturn // returning the interface is the point — callers pick their own implementation.
+ defaultOptionsMu.RLock()
+ defer defaultOptionsMu.RUnlock()
+
+ return defaultOptions.provider
+}
+
+// WithNameProvider injects a custom [NameProvider] to resolve json names from go struct types.
+func WithNameProvider(provider NameProvider) Option {
+ return func(o *options) {
+ o.provider = provider
+ }
+}
+
+type options struct {
+ provider NameProvider
+}
+
+func optionsWithDefaults(opts []Option) options {
+ var o options
+ o.provider = DefaultNameProvider()
+
+ for _, apply := range opts {
+ apply(&o)
+ }
+
+ return o
+}
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/pointer.go b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/pointer.go
index 7df49af3b9..2369c1827e 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/pointer.go
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/jsonpointer/pointer.go
@@ -11,8 +11,6 @@ import (
"reflect"
"strconv"
"strings"
-
- "github.com/go-openapi/swag/jsonname"
)
const (
@@ -20,20 +18,6 @@ const (
pointerSeparator = `/`
)
-// JSONPointable is an interface for structs to implement,
-// when they need to customize the json pointer process or want to avoid the use of reflection.
-type JSONPointable interface {
- // JSONLookup returns a value pointed at this (unescaped) key.
- JSONLookup(key string) (any, error)
-}
-
-// JSONSetable is an interface for structs to implement,
-// when they need to customize the json pointer process or want to avoid the use of reflection.
-type JSONSetable interface {
- // JSONSet sets the value pointed at the (unescaped) key.
- JSONSet(key string, value any) error
-}
-
// Pointer is a representation of a json pointer.
//
// Use [Pointer.Get] to retrieve a value or [Pointer.Set] to set a value.
@@ -41,7 +25,7 @@ type JSONSetable interface {
// It works with any go type interpreted as a JSON document, which means:
//
// - if a type implements [JSONPointable], its [JSONPointable.JSONLookup] method is used to resolve [Pointer.Get]
-// - if a type implements [JSONSetable], its [JSONPointable.JSONSet] method is used to resolve [Pointer.Set]
+// - if a type implements [JSONSetable], its [JSONSetable.JSONSet] method is used to resolve [Pointer.Set]
// - a go map[K]V is interpreted as an object, with type K assignable to a string
// - a go slice []T is interpreted as an array
// - a go struct is interpreted as an object, with exported fields interpreted as keys
@@ -71,16 +55,35 @@ func New(jsonPointerString string) (Pointer, error) {
// Get uses the pointer to retrieve a value from a JSON document.
//
// It returns the value with its type as a [reflect.Kind] or an error.
-func (p *Pointer) Get(document any) (any, reflect.Kind, error) {
- return p.get(document, jsonname.DefaultJSONNameProvider)
+func (p *Pointer) Get(document any, opts ...Option) (any, reflect.Kind, error) {
+ o := optionsWithDefaults(opts)
+
+ return p.get(document, o.provider)
}
// Set uses the pointer to set a value from a data type
// that represent a JSON document.
//
-// It returns the updated document.
-func (p *Pointer) Set(document any, value any) (any, error) {
- return document, p.set(document, value, jsonname.DefaultJSONNameProvider)
+// # Mutation contract
+//
+// Set mutates the provided document in place whenever Go's type system allows
+// it: when document is a map, a pointer, or when the targeted value is reached
+// through an addressable ancestor (e.g. a struct field traversed via a pointer,
+// a slice element). Callers that rely on this in-place behavior may continue
+// to ignore the returned document.
+//
+// The returned document is only load-bearing when Set cannot mutate in place.
+// This happens in one specific case: appending to a top-level slice passed by
+// value (e.g. document of type []T rather than *[]T) via the RFC 6901 "-"
+// terminal token. reflect.Append produces a new slice header that the library
+// cannot rebind into the caller's variable; the updated document is returned
+// instead. Pass *[]T if you want in-place rebind for that case as well.
+//
+// See [ErrDashToken] for the semantics of the "-" token.
+func (p *Pointer) Set(document any, value any, opts ...Option) (any, error) {
+ o := optionsWithDefaults(opts)
+
+ return p.set(document, value, o.provider)
}
// DecodedTokens returns the decoded (unescaped) tokens of this JSON pointer.
@@ -109,6 +112,46 @@ func (p *Pointer) String() string {
return pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator)
}
+// Offset returns the byte offset, in the raw JSON text of document, of the
+// location referenced by this pointer's terminal token.
+//
+// Unlike [Pointer.Get] and [Pointer.Set], which operate on a decoded Go value,
+// Offset operates directly on the textual JSON source. It drives an
+// [encoding/json.Decoder] over the string and stops at the terminal token,
+// returning the position at which the decoder was about to read that token.
+//
+// It is primarily intended for tooling that needs to map a pointer back to a
+// region of the original source: reporting line/column for validation or
+// parse diagnostics, extracting a sub-document by slicing the raw bytes, or
+// highlighting the referenced span in an editor.
+//
+// # Offset semantics
+//
+// The meaning of the returned offset depends on whether the terminal token
+// addresses an object property or an array element:
+//
+// - Object property: the offset points to the first byte of the key (its
+// opening quote character), not to the associated value. For example,
+// pointer "/foo/bar" against {"foo": {"bar": 21}} returns 9, the index of
+// the opening quote of "bar".
+// - Array element: the offset points to the first byte of the value at that
+// index. For example, pointer "/0/1" against [[1,2], [3,4]] returns 4,
+// the index of the digit 2.
+//
+// # Errors
+//
+// Offset returns an error in any of these cases:
+//
+// - document is not syntactically valid JSON;
+// - the structure of document does not match the pointer (e.g. traversing
+// into a scalar, or a token that is neither a valid key nor a valid
+// numeric index);
+// - a referenced key or index does not exist in document;
+// - the pointer's terminal token is the RFC 6901 "-" array token, which
+// designates a nonexistent element and therefore has no offset in the
+// source. The returned error wraps [ErrDashToken].
+//
+// All errors wrap [ErrPointer].
func (p *Pointer) Offset(document string) (int64, error) {
dec := json.NewDecoder(strings.NewReader(document))
var offset int64
@@ -137,7 +180,35 @@ func (p *Pointer) Offset(document string) (int64, error) {
return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer)
}
}
- return offset, nil
+ return skipJSONSeparator(document, offset), nil
+}
+
+// skipJSONSeparator advances offset past trailing JSON whitespace and at most
+// one value separator (comma) in document, so the result points at the first
+// byte of the next JSON token.
+//
+// The streaming decoder's InputOffset sits right after the most recently
+// consumed token, which between values is the comma (or whitespace) — not
+// the following token. Normalizing here keeps Offset's contract uniform:
+// for both object keys and array elements, and regardless of position within
+// the parent container, the returned offset always points at the first byte
+// of the addressed token.
+func skipJSONSeparator(document string, offset int64) int64 {
+ n := int64(len(document))
+ for offset < n && isJSONWhitespace(document[offset]) {
+ offset++
+ }
+ if offset < n && document[offset] == ',' {
+ offset++
+ }
+ for offset < n && isJSONWhitespace(document[offset]) {
+ offset++
+ }
+ return offset
+}
+
+func isJSONWhitespace(c byte) bool {
+ return c == ' ' || c == '\t' || c == '\n' || c == '\r'
}
// "Constructor", parses the given string JSON pointer.
@@ -157,9 +228,9 @@ func (p *Pointer) parse(jsonPointerString string) error {
return nil
}
-func (p *Pointer) get(node any, nameProvider *jsonname.NameProvider) (any, reflect.Kind, error) {
+func (p *Pointer) get(node any, nameProvider NameProvider) (any, reflect.Kind, error) {
if nameProvider == nil {
- nameProvider = jsonname.DefaultJSONNameProvider
+ nameProvider = defaultOptions.provider
}
kind := reflect.Invalid
@@ -185,50 +256,130 @@ func (p *Pointer) get(node any, nameProvider *jsonname.NameProvider) (any, refle
return node, kind, nil
}
-func (p *Pointer) set(node, data any, nameProvider *jsonname.NameProvider) error {
+func (p *Pointer) set(node, data any, nameProvider NameProvider) (any, error) {
knd := reflect.ValueOf(node).Kind()
if knd != reflect.Pointer && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array {
- return errors.Join(
+ return node, errors.Join(
fmt.Errorf("unexpected type: %T", node), //nolint:err113 // err wrapping is carried out by errors.Join, not fmt.Errorf.
ErrUnsupportedValueType,
ErrPointer,
)
}
- l := len(p.referenceTokens)
-
// full document when empty
- if l == 0 {
- return nil
+ if len(p.referenceTokens) == 0 {
+ return node, nil
}
if nameProvider == nil {
- nameProvider = jsonname.DefaultJSONNameProvider
+ nameProvider = defaultOptions.provider
}
- var decodedToken string
- lastIndex := l - 1
+ return p.setAt(node, p.referenceTokens, data, nameProvider)
+}
- if lastIndex > 0 { // skip if we only have one token in pointer
- for _, token := range p.referenceTokens[:lastIndex] {
- decodedToken = Unescape(token)
- next, err := p.resolveNodeForToken(node, decodedToken, nameProvider)
- if err != nil {
- return err
- }
+// setAt recursively walks the token list, setting the data at the terminal
+// token and rebinding any new child reference (e.g. a slice header returned
+// by an "-" append) into its parent on the way back up.
+//
+// Returning the (possibly new) node at each level is what makes append work
+// at any depth without requiring the caller to pass a pointer to the
+// containing slice: the new slice header propagates up and each parent
+// rebinds it via the appropriate kind-specific setter.
+func (p *Pointer) setAt(node any, tokens []string, data any, nameProvider NameProvider) (any, error) {
+ decodedToken := Unescape(tokens[0])
+
+ if len(tokens) == 1 {
+ return setSingleImpl(node, data, decodedToken, nameProvider)
+ }
- node = next
- }
+ child, err := p.resolveNodeForToken(node, decodedToken, nameProvider)
+ if err != nil {
+ return node, err
+ }
+
+ newChild, err := p.setAt(child, tokens[1:], data, nameProvider)
+ if err != nil {
+ return node, err
}
- // last token
- decodedToken = Unescape(p.referenceTokens[lastIndex])
+ return rebindChild(node, decodedToken, newChild, nameProvider)
+}
+
+// rebindChild writes newChild back into node at decodedToken.
+//
+// For cases where the child was already mutated in place (pointer aliasing,
+// addressable slice elements) the rebind is a safe no-op. For cases where
+// the child was returned by value (map entries holding a slice, slices
+// reached through a non-addressable ancestor), the rebind propagates the
+// new value into the parent.
+//
+// Parents implementing [JSONPointable] are left alone: they took ownership
+// of the child via JSONLookup and did not opt into a JSONSet-based rebind
+// on intermediate tokens.
+func rebindChild(node any, decodedToken string, newChild any, nameProvider NameProvider) (any, error) {
+ if _, ok := node.(JSONPointable); ok {
+ return node, nil
+ }
+
+ rValue := reflect.Indirect(reflect.ValueOf(node))
+
+ switch rValue.Kind() {
+ case reflect.Struct:
+ nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
+ if !ok {
+ return node, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
+ }
+ fld := rValue.FieldByName(nm)
+ if !fld.CanSet() {
+ return node, nil
+ }
+ assignReflectValue(fld, newChild)
+ return node, nil
+
+ case reflect.Map:
+ rValue.SetMapIndex(reflect.ValueOf(decodedToken), reflect.ValueOf(newChild))
+ return node, nil
+
+ case reflect.Slice:
+ if decodedToken == dashToken {
+ return node, errDashIntermediate()
+ }
+ idx, err := strconv.Atoi(decodedToken)
+ if err != nil {
+ return node, errors.Join(err, ErrPointer)
+ }
+ elem := rValue.Index(idx)
+ if !elem.CanSet() {
+ return node, nil
+ }
+ assignReflectValue(elem, newChild)
+ return node, nil
+
+ default:
+ return node, errInvalidReference(decodedToken)
+ }
+}
- return setSingleImpl(node, data, decodedToken, nameProvider)
+// assignReflectValue assigns src into dst, unwrapping a pointer when dst
+// expects the pointee type. This tolerates the pointer-wrapping performed
+// by [typeFromValue] for addressable fields.
+func assignReflectValue(dst reflect.Value, src any) {
+ nv := reflect.ValueOf(src)
+ if !nv.IsValid() {
+ return
+ }
+ if nv.Type().AssignableTo(dst.Type()) {
+ dst.Set(nv)
+ return
+ }
+ if nv.Kind() == reflect.Pointer && nv.Elem().Type().AssignableTo(dst.Type()) {
+ dst.Set(nv.Elem())
+ }
}
-func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvider *jsonname.NameProvider) (next any, err error) {
+func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvider NameProvider) (next any, err error) {
// check for nil during traversal
if isNil(node) {
return nil, fmt.Errorf("cannot traverse through nil value at %q: %w", decodedToken, ErrPointer)
@@ -272,6 +423,9 @@ func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvide
return typeFromValue(mv), nil
case reflect.Slice:
+ if decodedToken == dashToken {
+ return nil, errDashIntermediate()
+ }
tokenIndex, err := strconv.Atoi(decodedToken)
if err != nil {
return nil, errors.Join(err, ErrPointer)
@@ -312,16 +466,23 @@ func typeFromValue(v reflect.Value) any {
}
// GetForToken gets a value for a json pointer token 1 level deep.
-func GetForToken(document any, decodedToken string) (any, reflect.Kind, error) {
- return getSingleImpl(document, decodedToken, jsonname.DefaultJSONNameProvider)
+func GetForToken(document any, decodedToken string, opts ...Option) (any, reflect.Kind, error) {
+ o := optionsWithDefaults(opts)
+
+ return getSingleImpl(document, decodedToken, o.provider)
}
// SetForToken sets a value for a json pointer token 1 level deep.
-func SetForToken(document any, decodedToken string, value any) (any, error) {
- return document, setSingleImpl(document, value, decodedToken, jsonname.DefaultJSONNameProvider)
+//
+// See [Pointer.Set] for the mutation contract, in particular the handling of
+// the RFC 6901 "-" token on slices.
+func SetForToken(document any, decodedToken string, value any, opts ...Option) (any, error) {
+ o := optionsWithDefaults(opts)
+
+ return setSingleImpl(document, value, decodedToken, o.provider)
}
-func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NameProvider) (any, reflect.Kind, error) {
+func getSingleImpl(node any, decodedToken string, nameProvider NameProvider) (any, reflect.Kind, error) {
rValue := reflect.Indirect(reflect.ValueOf(node))
kind := rValue.Kind()
if isNil(node) {
@@ -361,6 +522,9 @@ func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NamePro
return nil, kind, errNoKey(decodedToken)
case reflect.Slice:
+ if decodedToken == dashToken {
+ return nil, kind, errDashOnGet()
+ }
tokenIndex, err := strconv.Atoi(decodedToken)
if err != nil {
return nil, kind, errors.Join(err, ErrPointer)
@@ -378,14 +542,14 @@ func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NamePro
}
}
-func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.NameProvider) error {
+func setSingleImpl(node, data any, decodedToken string, nameProvider NameProvider) (any, error) {
// check for nil to prevent panic when calling rValue.Type()
if isNil(node) {
- return fmt.Errorf("cannot set field %q on nil value: %w", decodedToken, ErrPointer)
+ return node, fmt.Errorf("cannot set field %q on nil value: %w", decodedToken, ErrPointer)
}
if ns, ok := node.(JSONSetable); ok {
- return ns.JSONSet(decodedToken, data)
+ return node, ns.JSONSet(decodedToken, data)
}
rValue := reflect.Indirect(reflect.ValueOf(node))
@@ -394,12 +558,12 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.N
case reflect.Struct:
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
if !ok {
- return fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
+ return node, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
}
fld := rValue.FieldByName(nm)
if !fld.CanSet() {
- return fmt.Errorf("can't set struct field %s to %v: %w", nm, data, ErrPointer)
+ return node, fmt.Errorf("can't set struct field %s to %v: %w", nm, data, ErrPointer)
}
value := reflect.ValueOf(data)
@@ -407,33 +571,51 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.N
assignedType := fld.Type()
if !valueType.AssignableTo(assignedType) {
- return fmt.Errorf("can't set value with type %T to field %s with type %v: %w", data, nm, assignedType, ErrPointer)
+ return node, fmt.Errorf("can't set value with type %T to field %s with type %v: %w", data, nm, assignedType, ErrPointer)
}
fld.Set(value)
- return nil
+ return node, nil
case reflect.Map:
kv := reflect.ValueOf(decodedToken)
rValue.SetMapIndex(kv, reflect.ValueOf(data))
- return nil
+ return node, nil
case reflect.Slice:
+ if decodedToken == dashToken {
+ // RFC 6901 §4 / RFC 6902 append semantics: terminal "-" appends
+ // the value to the slice. We rebind in place when the slice is
+ // reachable via an addressable ancestor; otherwise we return the
+ // new slice header for the parent (or the public Set) to rebind.
+ value := reflect.ValueOf(data)
+ elemType := rValue.Type().Elem()
+ if !value.Type().AssignableTo(elemType) {
+ return node, fmt.Errorf("can't append value of type %T to slice of %v: %w", data, elemType, ErrPointer)
+ }
+ newSlice := reflect.Append(rValue, value)
+ if rValue.CanSet() {
+ rValue.Set(newSlice)
+ return node, nil
+ }
+ return newSlice.Interface(), nil
+ }
+
tokenIndex, err := strconv.Atoi(decodedToken)
if err != nil {
- return errors.Join(err, ErrPointer)
+ return node, errors.Join(err, ErrPointer)
}
sLength := rValue.Len()
if tokenIndex < 0 || tokenIndex >= sLength {
- return errOutOfBounds(sLength, tokenIndex)
+ return node, errOutOfBounds(sLength, tokenIndex)
}
elem := rValue.Index(tokenIndex)
if !elem.CanSet() {
- return fmt.Errorf("can't set slice index %s to %v: %w", decodedToken, data, ErrPointer)
+ return node, fmt.Errorf("can't set slice index %s to %v: %w", decodedToken, data, ErrPointer)
}
value := reflect.ValueOf(data)
@@ -441,15 +623,15 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.N
assignedType := elem.Type()
if !valueType.AssignableTo(assignedType) {
- return fmt.Errorf("can't set value with type %T to slice element %d with type %v: %w", data, tokenIndex, assignedType, ErrPointer)
+ return node, fmt.Errorf("can't set value with type %T to slice element %d with type %v: %w", data, tokenIndex, assignedType, ErrPointer)
}
elem.Set(value)
- return nil
+ return node, nil
default:
- return errInvalidReference(decodedToken)
+ return node, errInvalidReference(decodedToken)
}
}
@@ -460,24 +642,27 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
if err != nil {
return 0, err
}
- switch tk := tk.(type) {
- case json.Delim:
- switch tk {
- case '{':
- if err = drainSingle(dec); err != nil {
- return 0, err
- }
- case '[':
+ key, ok := tk.(string)
+ if !ok {
+ return 0, fmt.Errorf("invalid key token %#v: %w", tk, ErrPointer)
+ }
+ if key == decodedToken {
+ return offset, nil
+ }
+
+ // Consume the associated value. Scalars are fully read by a single
+ // Token() call; composite values must be drained.
+ tk, err = dec.Token()
+ if err != nil {
+ return 0, err
+ }
+ if delim, isDelim := tk.(json.Delim); isDelim {
+ switch delim {
+ case '{', '[':
if err = drainSingle(dec); err != nil {
return 0, err
}
}
- case string:
- if tk == decodedToken {
- return offset, nil
- }
- default:
- return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer)
}
}
@@ -485,6 +670,9 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
}
func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) {
+ if decodedToken == dashToken {
+ return 0, errDashOnOffset()
+ }
idx, err := strconv.Atoi(decodedToken)
if err != nil {
return 0, fmt.Errorf("token reference %q is not a number: %w: %w", decodedToken, err, ErrPointer)
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/swag/.gitignore b/openshift/tests-extension/vendor/github.com/go-openapi/swag/.gitignore
index a0a95a96b3..1680db44c0 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/swag/.gitignore
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/swag/.gitignore
@@ -4,4 +4,3 @@ Godeps
.idea
*.out
.mcp.json
-.claude/
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md b/openshift/tests-extension/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md
index bc76fe820c..286878acff 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md
@@ -4,11 +4,11 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 24 | 235 |
+| 24 | 242 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
-| @fredbi | 105 | |
+| @fredbi | 112 | |
| @casualjim | 98 | |
| @alexandear | 4 | |
| @orisano | 3 | |
@@ -33,4 +33,4 @@
| @davidalpert | 1 | |
| @Xe | 1 | |
- _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/swag/README.md b/openshift/tests-extension/vendor/github.com/go-openapi/swag/README.md
index 834eb2ffb9..64f6671039 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/swag/README.md
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/swag/README.md
@@ -212,7 +212,7 @@ Maintainers can cut a new release by either:
[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/swag/SECURITY.md b/openshift/tests-extension/vendor/github.com/go-openapi/swag/SECURITY.md
index 72296a8313..1fea2c5736 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/swag/SECURITY.md
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/swag/SECURITY.md
@@ -6,14 +6,32 @@ This policy outlines the commitment and practices of the go-openapi maintainers
| Version | Supported |
| ------- | ------------------ |
-| 0.25.x | :white_check_mark: |
+| O.x | :white_check_mark: |
+
+## Vulnerability checks in place
+
+This repository uses automated vulnerability scans, at every merged commit and at least once a week.
+
+We use:
+
+* [`GitHub CodeQL`][codeql-url]
+* [`trivy`][trivy-url]
+* [`govulncheck`][govulncheck-url]
+
+Reports are centralized in github security reports and visible only to the maintainers.
## Reporting a vulnerability
If you become aware of a security vulnerability that affects the current repository,
-please report it privately to the maintainers.
+**please report it privately to the maintainers**
+rather than opening a publicly visible GitHub issue.
+
+Please follow the instructions provided by github to [Privately report a security vulnerability][github-guidance-url].
-Please follow the instructions provided by github to
-[Privately report a security vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability).
+> [!NOTE]
+> On Github, navigate to the project's "Security" tab then click on "Report a vulnerability".
-TL;DR: on Github, navigate to the project's "Security" tab then click on "Report a vulnerability".
+[codeql-url]: https://github.com/github/codeql
+[trivy-url]: https://trivy.dev/docs/latest/getting-started
+[govulncheck-url]: https://go.dev/blog/govulncheck
+[github-guidance-url]: https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/swag/go.work b/openshift/tests-extension/vendor/github.com/go-openapi/swag/go.work
index 1e537f0749..8537cb2a76 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/swag/go.work
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/swag/go.work
@@ -17,4 +17,4 @@ use (
./yamlutils
)
-go 1.24.0
+go 1.25.0
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/swag/jsonname/go_name_provider.go b/openshift/tests-extension/vendor/github.com/go-openapi/swag/jsonname/go_name_provider.go
new file mode 100644
index 0000000000..adc4426873
--- /dev/null
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/swag/jsonname/go_name_provider.go
@@ -0,0 +1,286 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonname
+
+import (
+ "reflect"
+ "strings"
+ "sync"
+)
+
+var _ providerIface = (*GoNameProvider)(nil)
+
+// GoNameProvider resolves json property names to go struct field names following
+// the same rules as the standard library's [encoding/json] package.
+//
+// Contrary to [NameProvider], it considers exported fields without a json tag,
+// and promotes fields from anonymous embedded struct types.
+//
+// Rules (aligned with encoding/json):
+//
+// - unexported fields are ignored;
+// - a field tagged `json:"-"` is ignored;
+// - a field tagged `json:"-,"` is kept under the json name "-" (stdlib quirk);
+// - a field tagged `json:""` or with no json tag at all keeps its Go name as json name;
+// - anonymous struct fields without an explicit json tag have their fields
+// promoted into the parent, following breadth-first depth rules:
+// a shallower field wins over a deeper one; at equal depth, a conflict
+// discards all conflicting fields unless exactly one has an explicit json tag.
+//
+// This type is safe for concurrent use.
+type GoNameProvider struct {
+ lock sync.Mutex
+ index map[reflect.Type]nameIndex
+}
+
+// NewGoNameProvider creates a new [GoNameProvider].
+func NewGoNameProvider() *GoNameProvider {
+ return &GoNameProvider{
+ index: make(map[reflect.Type]nameIndex),
+ }
+}
+
+// GetJSONNames gets all the json property names for a type.
+func (n *GoNameProvider) GetJSONNames(subject any) []string {
+ n.lock.Lock()
+ defer n.lock.Unlock()
+
+ tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
+ names := n.nameIndexFor(tpe)
+
+ res := make([]string, 0, len(names.jsonNames))
+ for k := range names.jsonNames {
+ res = append(res, k)
+ }
+
+ return res
+}
+
+// GetJSONName gets the json name for a go property name.
+func (n *GoNameProvider) GetJSONName(subject any, name string) (string, bool) {
+ tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
+
+ return n.GetJSONNameForType(tpe, name)
+}
+
+// GetJSONNameForType gets the json name for a go property name on a given type.
+func (n *GoNameProvider) GetJSONNameForType(tpe reflect.Type, name string) (string, bool) {
+ n.lock.Lock()
+ defer n.lock.Unlock()
+
+ names := n.nameIndexFor(tpe)
+ nme, ok := names.goNames[name]
+
+ return nme, ok
+}
+
+// GetGoName gets the go name for a json property name.
+func (n *GoNameProvider) GetGoName(subject any, name string) (string, bool) {
+ tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
+
+ return n.GetGoNameForType(tpe, name)
+}
+
+// GetGoNameForType gets the go name for a given type for a json property name.
+func (n *GoNameProvider) GetGoNameForType(tpe reflect.Type, name string) (string, bool) {
+ n.lock.Lock()
+ defer n.lock.Unlock()
+
+ names := n.nameIndexFor(tpe)
+ nme, ok := names.jsonNames[name]
+
+ return nme, ok
+}
+
+func (n *GoNameProvider) nameIndexFor(tpe reflect.Type) nameIndex {
+ if names, ok := n.index[tpe]; ok {
+ return names
+ }
+
+ names := buildGoNameIndex(tpe)
+ n.index[tpe] = names
+
+ return names
+}
+
+// fieldEntry captures a candidate field discovered while walking a struct
+// along with the indirection path from the root type (used to resolve conflicts
+// by depth in the same way encoding/json does).
+type fieldEntry struct {
+ goName string
+ jsonName string
+ index []int
+ tagged bool
+}
+
+func buildGoNameIndex(tpe reflect.Type) nameIndex {
+ fields := collectGoFields(tpe)
+
+ idx := make(map[string]string, len(fields))
+ reverseIdx := make(map[string]string, len(fields))
+ for _, f := range fields {
+ idx[f.jsonName] = f.goName
+ reverseIdx[f.goName] = f.jsonName
+ }
+
+ return nameIndex{jsonNames: idx, goNames: reverseIdx}
+}
+
+// collectGoFields walks tpe breadth-first along anonymous struct fields,
+// reproducing the field selection performed by encoding/json.typeFields.
+func collectGoFields(tpe reflect.Type) []fieldEntry {
+ if tpe.Kind() != reflect.Struct {
+ return nil
+ }
+
+ type queued struct {
+ typ reflect.Type
+ index []int
+ }
+
+ current := []queued{}
+ next := []queued{{typ: tpe}}
+ visited := map[reflect.Type]bool{tpe: true}
+
+ var (
+ candidates []fieldEntry
+ count = map[string]int{}
+ nextCount = map[string]int{}
+ )
+
+ for len(next) > 0 {
+ current, next = next, current[:0]
+ count, nextCount = nextCount, count
+ for k := range nextCount {
+ delete(nextCount, k)
+ }
+
+ for _, q := range current {
+ for i := 0; i < q.typ.NumField(); i++ {
+ sf := q.typ.Field(i)
+
+ if sf.Anonymous {
+ ft := sf.Type
+ if ft.Kind() == reflect.Ptr {
+ ft = ft.Elem()
+ }
+ if !sf.IsExported() && ft.Kind() != reflect.Struct {
+ continue
+ }
+ } else if !sf.IsExported() {
+ continue
+ }
+
+ tag := sf.Tag.Get("json")
+ if tag == "-" {
+ continue
+ }
+ jsonName, _ := parseJSONTag(tag)
+ tagged := jsonName != ""
+
+ ft := sf.Type
+ if ft.Kind() == reflect.Ptr {
+ ft = ft.Elem()
+ }
+
+ if sf.Anonymous && ft.Kind() == reflect.Struct && !tagged {
+ if visited[ft] {
+ continue
+ }
+ visited[ft] = true
+
+ index := make([]int, len(q.index)+1)
+ copy(index, q.index)
+ index[len(q.index)] = i
+ next = append(next, queued{typ: ft, index: index})
+
+ continue
+ }
+
+ name := jsonName
+ if name == "" {
+ name = sf.Name
+ }
+
+ index := make([]int, len(q.index)+1)
+ copy(index, q.index)
+ index[len(q.index)] = i
+
+ candidates = append(candidates, fieldEntry{
+ goName: sf.Name,
+ jsonName: name,
+ index: index,
+ tagged: tagged,
+ })
+ nextCount[name]++
+ }
+ }
+ }
+
+ return dominantFields(candidates)
+}
+
+// dominantFields applies the Go encoding/json conflict resolution rules:
+// at each JSON name, the shallowest field wins; at equal depth, a uniquely
+// tagged candidate wins; otherwise all candidates for that name are dropped.
+func dominantFields(candidates []fieldEntry) []fieldEntry {
+ byName := make(map[string][]fieldEntry, len(candidates))
+ for _, c := range candidates {
+ byName[c.jsonName] = append(byName[c.jsonName], c)
+ }
+
+ out := make([]fieldEntry, 0, len(byName))
+ for _, group := range byName {
+ if len(group) == 1 {
+ out = append(out, group[0])
+
+ continue
+ }
+
+ minDepth := len(group[0].index)
+ for _, c := range group[1:] {
+ if len(c.index) < minDepth {
+ minDepth = len(c.index)
+ }
+ }
+
+ var shallow []fieldEntry
+ for _, c := range group {
+ if len(c.index) == minDepth {
+ shallow = append(shallow, c)
+ }
+ }
+
+ if len(shallow) == 1 {
+ out = append(out, shallow[0])
+
+ continue
+ }
+
+ var tagged []fieldEntry
+ for _, c := range shallow {
+ if c.tagged {
+ tagged = append(tagged, c)
+ }
+ }
+ if len(tagged) == 1 {
+ out = append(out, tagged[0])
+ }
+ }
+
+ return out
+}
+
+// parseJSONTag returns the name component of a json struct tag and whether
+// it carried any non-name option (kept for future-proofing, e.g. "omitempty").
+func parseJSONTag(tag string) (string, string) {
+ if tag == "" {
+ return "", ""
+ }
+ if idx := strings.IndexByte(tag, ','); idx >= 0 {
+ return tag[:idx], tag[idx+1:]
+ }
+
+ return tag, ""
+}
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/swag/jsonname/ifaces.go b/openshift/tests-extension/vendor/github.com/go-openapi/swag/jsonname/ifaces.go
new file mode 100644
index 0000000000..812ace5639
--- /dev/null
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/swag/jsonname/ifaces.go
@@ -0,0 +1,14 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonname
+
+import "reflect"
+
+// providerIface is an unexported compile-time contract that every name provider
+// in this package is expected to satisfy.
+// It mirrors the interface declared by the main consumer of this module: [github.com/go-openapi/jsonpointer.NameProvider].
+type providerIface interface {
+ GetGoName(subject any, name string) (string, bool)
+ GetGoNameForType(tpe reflect.Type, name string) (string, bool)
+}
diff --git a/openshift/tests-extension/vendor/github.com/go-openapi/swag/jsonname/name_provider.go b/openshift/tests-extension/vendor/github.com/go-openapi/swag/jsonname/name_provider.go
index 8eaf1bece8..9f5da7a016 100644
--- a/openshift/tests-extension/vendor/github.com/go-openapi/swag/jsonname/name_provider.go
+++ b/openshift/tests-extension/vendor/github.com/go-openapi/swag/jsonname/name_provider.go
@@ -12,6 +12,8 @@ import (
// DefaultJSONNameProvider is the default cache for types.
var DefaultJSONNameProvider = NewNameProvider()
+var _ providerIface = (*NameProvider)(nil)
+
// NameProvider represents an object capable of translating from go property names
// to json property names.
//
diff --git a/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clustercatalog_types.go b/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clustercatalog_types.go
index c8690cbaf3..c2e1ec9e36 100644
--- a/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clustercatalog_types.go
+++ b/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clustercatalog_types.go
@@ -18,6 +18,7 @@ package v1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
)
// SourceType defines the type of source used for catalogs.
@@ -331,5 +332,8 @@ type ImageSource struct {
}
func init() {
- SchemeBuilder.Register(&ClusterCatalog{}, &ClusterCatalogList{})
+ SchemeBuilder.Register(func(s *runtime.Scheme) error {
+ s.AddKnownTypes(GroupVersion, &ClusterCatalog{}, &ClusterCatalogList{})
+ return nil
+ })
}
diff --git a/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clusterextension_types.go b/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clusterextension_types.go
index 12614d1a43..99bc160d74 100644
--- a/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clusterextension_types.go
+++ b/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clusterextension_types.go
@@ -19,6 +19,7 @@ package v1
import (
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
)
var ClusterExtensionKind = "ClusterExtension"
@@ -606,5 +607,8 @@ type ClusterExtensionList struct {
}
func init() {
- SchemeBuilder.Register(&ClusterExtension{}, &ClusterExtensionList{})
+ SchemeBuilder.Register(func(s *runtime.Scheme) error {
+ s.AddKnownTypes(GroupVersion, &ClusterExtension{}, &ClusterExtensionList{})
+ return nil
+ })
}
diff --git a/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clusterobjectset_types.go b/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clusterobjectset_types.go
index b9aeb96f2c..56fe210bd9 100644
--- a/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clusterobjectset_types.go
+++ b/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/clusterobjectset_types.go
@@ -19,6 +19,7 @@ package v1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+ "k8s.io/apimachinery/pkg/runtime"
)
const (
@@ -593,5 +594,8 @@ type ClusterObjectSetList struct {
}
func init() {
- SchemeBuilder.Register(&ClusterObjectSet{}, &ClusterObjectSetList{})
+ SchemeBuilder.Register(func(s *runtime.Scheme) error {
+ s.AddKnownTypes(GroupVersion, &ClusterObjectSet{}, &ClusterObjectSetList{})
+ return nil
+ })
}
diff --git a/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/groupversion_info.go b/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/groupversion_info.go
index 39efbee0d3..3e549f8d3b 100644
--- a/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/groupversion_info.go
+++ b/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/groupversion_info.go
@@ -22,8 +22,9 @@ limitations under the License.
package v1
import (
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
- "sigs.k8s.io/controller-runtime/pkg/scheme"
)
var (
@@ -35,7 +36,10 @@ var (
SchemeGroupVersion = GroupVersion
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
- SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
+ SchemeBuilder = runtime.NewSchemeBuilder(func(s *runtime.Scheme) error {
+ metav1.AddToGroupVersion(s, GroupVersion)
+ return nil
+ })
// AddToScheme adds the types in this group-version to the given scheme.
AddToScheme = SchemeBuilder.AddToScheme
diff --git a/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/zz_generated.deepcopy.go b/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/zz_generated.deepcopy.go
index ef6f145b9e..6836216378 100644
--- a/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/zz_generated.deepcopy.go
+++ b/openshift/tests-extension/vendor/github.com/operator-framework/operator-controller/api/v1/zz_generated.deepcopy.go
@@ -22,7 +22,7 @@ package v1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- runtime "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/runtime"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
diff --git a/openshift/tests-extension/vendor/golang.org/x/sync/singleflight/singleflight.go b/openshift/tests-extension/vendor/golang.org/x/sync/singleflight/singleflight.go
index 90ca138af3..32e40bdc87 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sync/singleflight/singleflight.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sync/singleflight/singleflight.go
@@ -15,12 +15,12 @@ import (
"sync"
)
-// errGoexit indicates the runtime.Goexit was called in
-// the user given function.
+// errGoexit indicates runtime.Goexit was called in
+// the user-given function.
var errGoexit = errors.New("runtime.Goexit was called")
// A panicError is an arbitrary value recovered from a panic
-// with the stack trace during the execution of given function.
+// with the stack trace during the execution of the given function.
type panicError struct {
value any
stack []byte
@@ -204,7 +204,7 @@ func (g *Group) doCall(c *call, key string, fn func() (any, error)) {
}
}
-// Forget tells the singleflight to forget about a key. Future calls
+// Forget tells the singleflight to forget about a key. Future calls
// to Do for this key will call the function rather than waiting for
// an earlier call to complete.
func (g *Group) Forget(key string) {
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux.go
index d11d5b96a4..526a0d5f43 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux.go
@@ -6397,3 +6397,79 @@ const (
MPOL_PREFERRED_MANY = 0x5
MPOL_WEIGHTED_INTERLEAVE = 0x6
)
+
+const (
+ GPIO_V2_GET_LINEINFO_IOCTL = 0xc100b405
+ GPIO_V2_GET_LINE_IOCTL = 0xc250b407
+ GPIO_V2_LINE_GET_VALUES_IOCTL = 0xc010b40e
+ GPIO_V2_LINE_SET_VALUES_IOCTL = 0xc010b40f
+ GPIO_V2_GET_LINEINFO_WATCH_IOCTL = 0xc100b406
+ GPIO_GET_LINEINFO_UNWATCH_IOCTL = 0xc004b40c
+)
+const (
+ GPIO_V2_LINE_ATTR_ID_FLAGS = 0x1
+ GPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES = 0x2
+ GPIO_V2_LINE_ATTR_ID_DEBOUNCE = 0x3
+ GPIO_V2_LINE_CHANGED_REQUESTED = 0x1
+ GPIO_V2_LINE_CHANGED_RELEASED = 0x2
+ GPIO_V2_LINE_CHANGED_CONFIG = 0x3
+ GPIO_V2_LINE_EVENT_RISING_EDGE = 0x1
+ GPIO_V2_LINE_EVENT_FALLING_EDGE = 0x2
+)
+
+type GPIOChipInfo struct {
+ Name [32]byte
+ Label [32]byte
+ Lines uint32
+}
+type GPIOV2LineValues struct {
+ Bits uint64
+ Mask uint64
+}
+type GPIOV2LineAttribute struct {
+ Id uint32
+ _ uint32
+ Flags uint64
+}
+type GPIOV2LineConfigAttribute struct {
+ Attr GPIOV2LineAttribute
+ Mask uint64
+}
+type GPIOV2LineConfig struct {
+ Flags uint64
+ Num_attrs uint32
+ _ [5]uint32
+ Attrs [10]GPIOV2LineConfigAttribute
+}
+type GPIOV2LineRequest struct {
+ Offsets [64]uint32
+ Consumer [32]byte
+ Config GPIOV2LineConfig
+ Num_lines uint32
+ Event_buffer_size uint32
+ _ [5]uint32
+ Fd int32
+}
+type GPIOV2LineInfo struct {
+ Name [32]byte
+ Consumer [32]byte
+ Offset uint32
+ Num_attrs uint32
+ Flags uint64
+ Attrs [10]GPIOV2LineAttribute
+ _ [4]uint32
+}
+type GPIOV2LineInfoChanged struct {
+ Info GPIOV2LineInfo
+ Timestamp_ns uint64
+ Event_type uint32
+ _ [5]uint32
+}
+type GPIOV2LineEvent struct {
+ Timestamp_ns uint64
+ Id uint32
+ Offset uint32
+ Seqno uint32
+ Line_seqno uint32
+ _ [6]uint32
+}
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
index 97ef790deb..aede1de7f2 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
@@ -711,3 +711,7 @@ type SysvShmDesc struct {
_ uint32
_ uint32
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x8044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
index 90b50da680..bb3bc4dc2c 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
@@ -725,3 +725,7 @@ type SysvShmDesc struct {
_ uint64
_ uint64
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x8044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
index acda136851..1fdf4c5175 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
@@ -705,3 +705,7 @@ type SysvShmDesc struct {
_ uint32
_ uint32
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x8044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
index ef7a99e1f9..063e6f0b41 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
@@ -704,3 +704,7 @@ type SysvShmDesc struct {
_ uint64
_ uint64
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x8044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go
index 966063dfc1..9cf836c708 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go
@@ -705,3 +705,7 @@ type SysvShmDesc struct {
_ uint64
_ uint64
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x8044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
index dc53b20b74..1d222fcb31 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
@@ -710,3 +710,7 @@ type SysvShmDesc struct {
Ctime_high uint16
_ uint16
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x4044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
index 9ad0aa8c31..912cc4ab63 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
@@ -707,3 +707,7 @@ type SysvShmDesc struct {
_ uint64
_ uint64
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x4044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
index 29d55493d5..1e358ef34f 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
@@ -707,3 +707,7 @@ type SysvShmDesc struct {
_ uint64
_ uint64
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x4044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
index a4d9e15848..df59f32f5e 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
@@ -710,3 +710,7 @@ type SysvShmDesc struct {
Ctime_high uint16
_ uint16
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x4044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go
index f8a2977716..29355aa0bf 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go
@@ -718,3 +718,7 @@ type SysvShmDesc struct {
_ uint32
_ [4]byte
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x4044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
index 4158d6c4ee..c6083a15d7 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
@@ -713,3 +713,7 @@ type SysvShmDesc struct {
_ uint64
_ uint64
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x4044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
index 1035af49f7..6321cc7626 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
@@ -713,3 +713,7 @@ type SysvShmDesc struct {
_ uint64
_ uint64
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x4044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go
index 2297125d3c..b44f402feb 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go
@@ -792,3 +792,7 @@ const (
RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE = 0x6
RISCV_HWPROBE_WHICH_CPUS = 0x1
)
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x8044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
index 8481e9bd98..b22c795a64 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
@@ -727,3 +727,7 @@ type SysvShmDesc struct {
_ uint64
_ uint64
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x8044b401
+)
diff --git a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go
index a6828a0310..0b18075b53 100644
--- a/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go
+++ b/openshift/tests-extension/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go
@@ -708,3 +708,7 @@ type SysvShmDesc struct {
_ uint64
_ uint64
}
+
+const (
+ GPIO_GET_CHIPINFO_IOCTL = 0x4044b401
+)
diff --git a/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go b/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go
index 2ef36bbcf9..ec63689e72 100644
--- a/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go
+++ b/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go
@@ -10,6 +10,7 @@ import (
"encoding/binary"
"fmt"
"io"
+ "math"
"google.golang.org/protobuf/encoding/protowire"
"google.golang.org/protobuf/internal/errors"
@@ -117,7 +118,13 @@ func (o UnmarshalOptions) UnmarshalFrom(r Reader, m proto.Message) error {
if maxSize == 0 {
maxSize = defaultMaxSize
}
- if maxSize != -1 && size > uint64(maxSize) {
+ if maxSize == -1 {
+ // No limit specified: Just check that size fits into an integer,
+ // otherwise the make([]byte, size) call below will panic.
+ if size > math.MaxInt {
+ return errors.Wrap(&SizeTooLargeError{Size: size, MaxSize: math.MaxInt}, "")
+ }
+ } else if size > uint64(maxSize) {
return errors.Wrap(&SizeTooLargeError{Size: size, MaxSize: uint64(maxSize)}, "")
}
diff --git a/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protojson/decode.go b/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protojson/decode.go
index 737d6876d5..1d6608dc7d 100644
--- a/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protojson/decode.go
+++ b/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protojson/decode.go
@@ -365,6 +365,10 @@ func unmarshalInt(tok json.Token, bitSize int) (protoreflect.Value, bool) {
if err != nil {
return protoreflect.Value{}, false
}
+ // Ensure there is no non-number content in this string.
+ if next, err := dec.Read(); err != nil || next.Kind() != json.EOF {
+ return protoreflect.Value{}, false
+ }
return getInt(tok, bitSize)
}
return protoreflect.Value{}, false
@@ -397,6 +401,10 @@ func unmarshalUint(tok json.Token, bitSize int) (protoreflect.Value, bool) {
if err != nil {
return protoreflect.Value{}, false
}
+ // Ensure there is no non-number content in this string.
+ if next, err := dec.Read(); err != nil || next.Kind() != json.EOF {
+ return protoreflect.Value{}, false
+ }
return getUint(tok, bitSize)
}
return protoreflect.Value{}, false
@@ -447,6 +455,10 @@ func unmarshalFloat(tok json.Token, bitSize int) (protoreflect.Value, bool) {
if err != nil {
return protoreflect.Value{}, false
}
+ // Ensure there is no non-number content in this string.
+ if next, err := dec.Read(); err != nil || next.Kind() != json.EOF {
+ return protoreflect.Value{}, false
+ }
return getFloat(tok, bitSize)
}
return protoreflect.Value{}, false
diff --git a/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go b/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go
index e9fe103943..d2eab46947 100644
--- a/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go
+++ b/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go
@@ -52,7 +52,10 @@ func wellKnownTypeMarshaler(name protoreflect.FullName) marshalFunc {
case genid.FieldMask_message_name:
return encoder.marshalFieldMask
case genid.Empty_message_name:
- return encoder.marshalEmpty
+ // The spec explicitly specifies that the Empty message
+ // is not considered to have any special JSON mapping:
+ // https://protobuf.dev/programming-guides/json/#any
+ return nil
}
}
return nil
diff --git a/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/prototext/decode.go b/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/prototext/decode.go
index b53805056a..20ec09e194 100644
--- a/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/prototext/decode.go
+++ b/openshift/tests-extension/vendor/google.golang.org/protobuf/encoding/prototext/decode.go
@@ -8,6 +8,7 @@ import (
"fmt"
"unicode/utf8"
+ "google.golang.org/protobuf/encoding/protowire"
"google.golang.org/protobuf/internal/encoding/messageset"
"google.golang.org/protobuf/internal/encoding/text"
"google.golang.org/protobuf/internal/errors"
@@ -49,12 +50,19 @@ type UnmarshalOptions struct {
protoregistry.MessageTypeResolver
protoregistry.ExtensionTypeResolver
}
+
+ // RecursionLimit limits how deeply messages may be nested.
+ // If zero, a default limit is applied.
+ RecursionLimit int
}
// Unmarshal reads the given []byte and populates the given [proto.Message]
// using options in the UnmarshalOptions object.
// The provided message must be mutable (e.g., a non-nil pointer to a message).
func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error {
+ if o.RecursionLimit == 0 {
+ o.RecursionLimit = protowire.DefaultRecursionLimit
+ }
return o.unmarshal(b, m)
}
@@ -102,8 +110,14 @@ func (d decoder) syntaxError(pos int, f string, x ...any) error {
return errors.New(head+f, x...)
}
+var errRecursionDepth = errors.New("exceeded maximum recursion depth")
+
// unmarshalMessage unmarshals into the given protoreflect.Message.
func (d decoder) unmarshalMessage(m protoreflect.Message, checkDelims bool) error {
+ if d.opts.RecursionLimit--; d.opts.RecursionLimit < 0 {
+ return errRecursionDepth
+ }
+
messageDesc := m.Descriptor()
if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) {
return errors.New("no support for proto1 MessageSets")
@@ -437,6 +451,10 @@ func (d decoder) unmarshalList(fd protoreflect.FieldDescriptor, list protoreflec
// unmarshalMap unmarshals into given protoreflect.Map. A map value is a
// textproto message containing {key: , value: }.
func (d decoder) unmarshalMap(fd protoreflect.FieldDescriptor, mmap protoreflect.Map) error {
+ if d.opts.RecursionLimit--; d.opts.RecursionLimit < 0 {
+ return errRecursionDepth
+ }
+
// Determine ahead whether map entry is a scalar type or a message type in
// order to call the appropriate unmarshalMapValue func inside
// unmarshalMapEntry.
diff --git a/openshift/tests-extension/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go b/openshift/tests-extension/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go
index 87e46bd4df..0b0dfacbe5 100644
--- a/openshift/tests-extension/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go
+++ b/openshift/tests-extension/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go
@@ -83,12 +83,13 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string {
case protoreflect.FileImports:
for i := 0; i < vs.Len(); i++ {
var rs records
- rv := reflect.ValueOf(vs.Get(i))
- rs.Append(rv, []methodAndName{
- {rv.MethodByName("Path"), "Path"},
- {rv.MethodByName("Package"), "Package"},
- {rv.MethodByName("IsPublic"), "IsPublic"},
- {rv.MethodByName("IsWeak"), "IsWeak"},
+ fi := vs.Get(i)
+ rv := reflect.ValueOf(fi)
+ rs.Append(rv, []attrAndName{
+ {fi.Path(), "Path"},
+ {fi.Package(), "Package"},
+ {fi.IsPublic, "IsPublic"},
+ {fi.IsWeak, "IsWeak"},
}...)
ss = append(ss, "{"+rs.Join()+"}")
}
@@ -104,9 +105,9 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string {
}
}
-type methodAndName struct {
- method reflect.Value
- name string
+type attrAndName struct {
+ attr any
+ name string
}
func FormatDesc(s fmt.State, r rune, t protoreflect.Descriptor) {
@@ -126,58 +127,58 @@ func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool, record fu
start = rt.Name() + "{"
}
- _, isFile := t.(protoreflect.FileDescriptor)
+ fd, isFile := t.(protoreflect.FileDescriptor)
rs := records{
allowMulti: allowMulti,
record: record,
}
if t.IsPlaceholder() {
if isFile {
- rs.Append(rv, []methodAndName{
- {rv.MethodByName("Path"), "Path"},
- {rv.MethodByName("Package"), "Package"},
- {rv.MethodByName("IsPlaceholder"), "IsPlaceholder"},
+ rs.Append(rv, []attrAndName{
+ {fd.Path(), "Path"},
+ {fd.Package(), "Package"},
+ {fd.IsPlaceholder(), "IsPlaceholder"},
}...)
} else {
- rs.Append(rv, []methodAndName{
- {rv.MethodByName("FullName"), "FullName"},
- {rv.MethodByName("IsPlaceholder"), "IsPlaceholder"},
+ rs.Append(rv, []attrAndName{
+ {t.FullName(), "FullName"},
+ {t.IsPlaceholder(), "IsPlaceholder"},
}...)
}
} else {
switch {
case isFile:
- rs.Append(rv, methodAndName{rv.MethodByName("Syntax"), "Syntax"})
+ rs.Append(rv, attrAndName{fd.Syntax(), "Syntax"})
case isRoot:
- rs.Append(rv, []methodAndName{
- {rv.MethodByName("Syntax"), "Syntax"},
- {rv.MethodByName("FullName"), "FullName"},
+ rs.Append(rv, []attrAndName{
+ {t.Syntax(), "Syntax"},
+ {t.FullName(), "FullName"},
}...)
default:
- rs.Append(rv, methodAndName{rv.MethodByName("Name"), "Name"})
+ rs.Append(rv, attrAndName{t.Name(), "Name"})
}
switch t := t.(type) {
case protoreflect.FieldDescriptor:
- accessors := []methodAndName{
- {rv.MethodByName("Number"), "Number"},
- {rv.MethodByName("Cardinality"), "Cardinality"},
- {rv.MethodByName("Kind"), "Kind"},
- {rv.MethodByName("HasJSONName"), "HasJSONName"},
- {rv.MethodByName("JSONName"), "JSONName"},
- {rv.MethodByName("HasPresence"), "HasPresence"},
- {rv.MethodByName("IsExtension"), "IsExtension"},
- {rv.MethodByName("IsPacked"), "IsPacked"},
- {rv.MethodByName("IsWeak"), "IsWeak"},
- {rv.MethodByName("IsList"), "IsList"},
- {rv.MethodByName("IsMap"), "IsMap"},
- {rv.MethodByName("MapKey"), "MapKey"},
- {rv.MethodByName("MapValue"), "MapValue"},
- {rv.MethodByName("HasDefault"), "HasDefault"},
- {rv.MethodByName("Default"), "Default"},
- {rv.MethodByName("ContainingOneof"), "ContainingOneof"},
- {rv.MethodByName("ContainingMessage"), "ContainingMessage"},
- {rv.MethodByName("Message"), "Message"},
- {rv.MethodByName("Enum"), "Enum"},
+ accessors := []attrAndName{
+ {t.Number(), "Number"},
+ {t.Cardinality(), "Cardinality"},
+ {t.Kind(), "Kind"},
+ {t.HasJSONName(), "HasJSONName"},
+ {t.JSONName(), "JSONName"},
+ {t.HasPresence(), "HasPresence"},
+ {t.IsExtension(), "IsExtension"},
+ {t.IsPacked(), "IsPacked"},
+ {t.IsWeak(), "IsWeak"},
+ {t.IsList(), "IsList"},
+ {t.IsMap(), "IsMap"},
+ {t.MapKey(), "MapKey"},
+ {t.MapValue(), "MapValue"},
+ {t.HasDefault(), "HasDefault"},
+ {t.Default(), "Default"},
+ {t.ContainingOneof(), "ContainingOneof"},
+ {t.ContainingMessage(), "ContainingMessage"},
+ {t.Message(), "Message"},
+ {t.Enum(), "Enum"},
}
for _, s := range accessors {
switch s.name {
@@ -223,58 +224,54 @@ func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool, record fu
}
case protoreflect.FileDescriptor:
- rs.Append(rv, []methodAndName{
- {rv.MethodByName("Path"), "Path"},
- {rv.MethodByName("Package"), "Package"},
- {rv.MethodByName("Imports"), "Imports"},
- {rv.MethodByName("Messages"), "Messages"},
- {rv.MethodByName("Enums"), "Enums"},
- {rv.MethodByName("Extensions"), "Extensions"},
- {rv.MethodByName("Services"), "Services"},
+ rs.Append(rv, []attrAndName{
+ {t.Path(), "Path"},
+ {t.Package(), "Package"},
+ {t.Imports(), "Imports"},
+ {t.Messages(), "Messages"},
+ {t.Enums(), "Enums"},
+ {t.Extensions(), "Extensions"},
+ {t.Services(), "Services"},
}...)
case protoreflect.MessageDescriptor:
- rs.Append(rv, []methodAndName{
- {rv.MethodByName("IsMapEntry"), "IsMapEntry"},
- {rv.MethodByName("Fields"), "Fields"},
- {rv.MethodByName("Oneofs"), "Oneofs"},
- {rv.MethodByName("ReservedNames"), "ReservedNames"},
- {rv.MethodByName("ReservedRanges"), "ReservedRanges"},
- {rv.MethodByName("RequiredNumbers"), "RequiredNumbers"},
- {rv.MethodByName("ExtensionRanges"), "ExtensionRanges"},
- {rv.MethodByName("Messages"), "Messages"},
- {rv.MethodByName("Enums"), "Enums"},
- {rv.MethodByName("Extensions"), "Extensions"},
+ rs.Append(rv, []attrAndName{
+ {t.IsMapEntry(), "IsMapEntry"},
+ {t.Fields(), "Fields"},
+ {t.Oneofs(), "Oneofs"},
+ {t.ReservedNames(), "ReservedNames"},
+ {t.ReservedRanges(), "ReservedRanges"},
+ {t.RequiredNumbers(), "RequiredNumbers"},
+ {t.ExtensionRanges(), "ExtensionRanges"},
+ {t.Messages(), "Messages"},
+ {t.Enums(), "Enums"},
+ {t.Extensions(), "Extensions"},
}...)
case protoreflect.EnumDescriptor:
- rs.Append(rv, []methodAndName{
- {rv.MethodByName("Values"), "Values"},
- {rv.MethodByName("ReservedNames"), "ReservedNames"},
- {rv.MethodByName("ReservedRanges"), "ReservedRanges"},
- {rv.MethodByName("IsClosed"), "IsClosed"},
+ rs.Append(rv, []attrAndName{
+ {t.Values(), "Values"},
+ {t.ReservedNames(), "ReservedNames"},
+ {t.ReservedRanges(), "ReservedRanges"},
+ {t.IsClosed(), "IsClosed"},
}...)
case protoreflect.EnumValueDescriptor:
- rs.Append(rv, []methodAndName{
- {rv.MethodByName("Number"), "Number"},
- }...)
+ rs.Append(rv, attrAndName{t.Number(), "Number"})
case protoreflect.ServiceDescriptor:
- rs.Append(rv, []methodAndName{
- {rv.MethodByName("Methods"), "Methods"},
- }...)
+ rs.Append(rv, attrAndName{t.Methods(), "Methods"})
case protoreflect.MethodDescriptor:
- rs.Append(rv, []methodAndName{
- {rv.MethodByName("Input"), "Input"},
- {rv.MethodByName("Output"), "Output"},
- {rv.MethodByName("IsStreamingClient"), "IsStreamingClient"},
- {rv.MethodByName("IsStreamingServer"), "IsStreamingServer"},
+ rs.Append(rv, []attrAndName{
+ {t.Input(), "Input"},
+ {t.Output(), "Output"},
+ {t.IsStreamingClient(), "IsStreamingClient"},
+ {t.IsStreamingServer(), "IsStreamingServer"},
}...)
}
- if m := rv.MethodByName("GoType"); m.IsValid() {
- rs.Append(rv, methodAndName{m, "GoType"})
+ if m, ok := t.(interface{ GoType() reflect.Type }); ok {
+ rs.Append(rv, attrAndName{m.GoType(), "GoType"})
}
}
return start + rs.Join() + end
@@ -297,68 +294,66 @@ func (rs *records) AppendRecs(fieldName string, newRecs [2]string) {
rs.recs = append(rs.recs, newRecs)
}
-func (rs *records) Append(v reflect.Value, accessors ...methodAndName) {
- for _, a := range accessors {
- if rs.record != nil {
- rs.record(a.name)
- }
- var rv reflect.Value
- if a.method.IsValid() {
- rv = a.method.Call(nil)[0]
- }
- if v.Kind() == reflect.Struct && !rv.IsValid() {
- rv = v.FieldByName(a.name)
- }
- if !rv.IsValid() {
- panic(fmt.Sprintf("unknown accessor: %v.%s", v.Type(), a.name))
- }
- if _, ok := rv.Interface().(protoreflect.Value); ok {
- rv = rv.MethodByName("Interface").Call(nil)[0]
- if !rv.IsNil() {
- rv = rv.Elem()
- }
- }
+func (rs *records) Append(v reflect.Value, results ...attrAndName) {
+ for _, r := range results {
+ rs.appendAttribute(v, r.name, r.attr)
+ }
+}
- // Ignore zero values.
- var isZero bool
- switch rv.Kind() {
- case reflect.Interface, reflect.Slice:
- isZero = rv.IsNil()
- case reflect.Bool:
- isZero = rv.Bool() == false
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- isZero = rv.Int() == 0
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- isZero = rv.Uint() == 0
- case reflect.String:
- isZero = rv.String() == ""
- }
- if n, ok := rv.Interface().(list); ok {
- isZero = n.Len() == 0
- }
- if isZero {
- continue
+func (rs *records) appendAttribute(val reflect.Value, name string, attrVal any) {
+ if rs.record != nil {
+ rs.record(name)
+ }
+ if attrVal == nil {
+ return
+ }
+ rv := reflect.ValueOf(attrVal)
+ if _, ok := rv.Interface().(protoreflect.Value); ok {
+ rv = rv.MethodByName("Interface").Call(nil)[0]
+ if !rv.IsNil() {
+ rv = rv.Elem()
}
+ }
- // Format the value.
- var s string
- v := rv.Interface()
- switch v := v.(type) {
- case list:
- s = formatListOpt(v, false, rs.allowMulti)
- case protoreflect.FieldDescriptor, protoreflect.OneofDescriptor, protoreflect.EnumValueDescriptor, protoreflect.MethodDescriptor:
- s = string(v.(protoreflect.Descriptor).Name())
- case protoreflect.Descriptor:
- s = string(v.FullName())
- case string:
- s = strconv.Quote(v)
- case []byte:
- s = fmt.Sprintf("%q", v)
- default:
- s = fmt.Sprint(v)
- }
- rs.recs = append(rs.recs, [2]string{a.name, s})
+ // Ignore zero values.
+ var isZero bool
+ switch rv.Kind() {
+ case reflect.Interface, reflect.Slice:
+ isZero = rv.IsNil()
+ case reflect.Bool:
+ isZero = rv.Bool() == false
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ isZero = rv.Int() == 0
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ isZero = rv.Uint() == 0
+ case reflect.String:
+ isZero = rv.String() == ""
+ }
+ if n, ok := rv.Interface().(list); ok {
+ isZero = n.Len() == 0
+ }
+ if isZero {
+ return
+ }
+
+ // Format the value.
+ var s string
+ v := rv.Interface()
+ switch v := v.(type) {
+ case list:
+ s = formatListOpt(v, false, rs.allowMulti)
+ case protoreflect.FieldDescriptor, protoreflect.OneofDescriptor, protoreflect.EnumValueDescriptor, protoreflect.MethodDescriptor:
+ s = string(v.(protoreflect.Descriptor).Name())
+ case protoreflect.Descriptor:
+ s = string(v.FullName())
+ case string:
+ s = strconv.Quote(v)
+ case []byte:
+ s = fmt.Sprintf("%q", v)
+ default:
+ s = fmt.Sprint(v)
}
+ rs.recs = append(rs.recs, [2]string{name, s})
}
func (rs *records) Join() string {
diff --git a/openshift/tests-extension/vendor/google.golang.org/protobuf/internal/version/version.go b/openshift/tests-extension/vendor/google.golang.org/protobuf/internal/version/version.go
index 763fd82841..bfb2cfdea5 100644
--- a/openshift/tests-extension/vendor/google.golang.org/protobuf/internal/version/version.go
+++ b/openshift/tests-extension/vendor/google.golang.org/protobuf/internal/version/version.go
@@ -53,7 +53,7 @@ const (
Major = 1
Minor = 36
Patch = 11
- PreRelease = ""
+ PreRelease = "devel"
)
// String formats the version string for this module in semver format.
diff --git a/openshift/tests-extension/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go b/openshift/tests-extension/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go
index c826ad0430..84a3228edb 100644
--- a/openshift/tests-extension/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go
+++ b/openshift/tests-extension/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go
@@ -201,6 +201,7 @@ func (r descsByName) initExtensionDeclarations(xds []*descriptorpb.FieldDescript
return nil, err
}
x.L1.EditionFeatures = mergeEditionFeatures(parent, xd.GetOptions().GetFeatures())
+ x.L2.IsProto3Optional = xd.GetProto3Optional()
if opts := xd.GetOptions(); opts != nil {
opts = proto.Clone(opts).(*descriptorpb.FieldOptions)
x.L2.Options = func() protoreflect.ProtoMessage { return opts }
diff --git a/openshift/tests-extension/vendor/modules.txt b/openshift/tests-extension/vendor/modules.txt
index 0d976d3fbb..0bc1f9d941 100644
--- a/openshift/tests-extension/vendor/modules.txt
+++ b/openshift/tests-extension/vendor/modules.txt
@@ -46,51 +46,51 @@ github.com/go-logr/logr/funcr
# github.com/go-logr/stdr v1.2.2
## explicit; go 1.16
github.com/go-logr/stdr
-# github.com/go-openapi/jsonpointer v0.22.5
-## explicit; go 1.24.0
+# github.com/go-openapi/jsonpointer v0.23.1
+## explicit; go 1.25.0
github.com/go-openapi/jsonpointer
# github.com/go-openapi/jsonreference v0.21.5
## explicit; go 1.24.0
github.com/go-openapi/jsonreference
github.com/go-openapi/jsonreference/internal
-# github.com/go-openapi/swag v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag
-# github.com/go-openapi/swag/cmdutils v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag/cmdutils v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag/cmdutils
-# github.com/go-openapi/swag/conv v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag/conv v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag/conv
-# github.com/go-openapi/swag/fileutils v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag/fileutils v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag/fileutils
-# github.com/go-openapi/swag/jsonname v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag/jsonname v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag/jsonname
-# github.com/go-openapi/swag/jsonutils v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag/jsonutils v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag/jsonutils
github.com/go-openapi/swag/jsonutils/adapters
github.com/go-openapi/swag/jsonutils/adapters/ifaces
github.com/go-openapi/swag/jsonutils/adapters/stdlib/json
-# github.com/go-openapi/swag/loading v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag/loading v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag/loading
-# github.com/go-openapi/swag/mangling v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag/mangling v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag/mangling
-# github.com/go-openapi/swag/netutils v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag/netutils v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag/netutils
-# github.com/go-openapi/swag/stringutils v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag/stringutils v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag/stringutils
-# github.com/go-openapi/swag/typeutils v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag/typeutils v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag/typeutils
-# github.com/go-openapi/swag/yamlutils v0.25.5
-## explicit; go 1.24.0
+# github.com/go-openapi/swag/yamlutils v0.26.0
+## explicit; go 1.25.0
github.com/go-openapi/swag/yamlutils
# github.com/go-task/slim-sprig/v3 v3.0.0
## explicit; go 1.20
@@ -177,7 +177,7 @@ github.com/munnerz/goautoneg
# github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f
## explicit
github.com/mxk/go-flowrate/flowrate
-# github.com/onsi/ginkgo/v2 v2.27.2 => github.com/openshift/onsi-ginkgo/v2 v2.6.1-0.20250416174521-4eb003743b54
+# github.com/onsi/ginkgo/v2 v2.27.4 => github.com/openshift/onsi-ginkgo/v2 v2.6.1-0.20250416174521-4eb003743b54
## explicit; go 1.22.0
github.com/onsi/ginkgo/v2
github.com/onsi/ginkgo/v2/config
@@ -440,10 +440,10 @@ golang.org/x/net/websocket
## explicit; go 1.25.0
golang.org/x/oauth2
golang.org/x/oauth2/internal
-# golang.org/x/sync v0.20.0
+# golang.org/x/sync v0.21.0
## explicit; go 1.25.0
golang.org/x/sync/singleflight
-# golang.org/x/sys v0.45.0
+# golang.org/x/sys v0.46.0
## explicit; go 1.25.0
golang.org/x/sys/cpu
golang.org/x/sys/plan9
@@ -453,7 +453,7 @@ golang.org/x/sys/windows/registry
# golang.org/x/term v0.43.0
## explicit; go 1.25.0
golang.org/x/term
-# golang.org/x/text v0.37.0
+# golang.org/x/text v0.38.0
## explicit; go 1.25.0
golang.org/x/text/encoding
golang.org/x/text/encoding/charmap
@@ -566,7 +566,7 @@ google.golang.org/grpc/serviceconfig
google.golang.org/grpc/stats
google.golang.org/grpc/status
google.golang.org/grpc/tap
-# google.golang.org/protobuf v1.36.11
+# google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af
## explicit; go 1.23
google.golang.org/protobuf/encoding/protodelim
google.golang.org/protobuf/encoding/protojson
@@ -623,7 +623,7 @@ gopkg.in/yaml.v2
# gopkg.in/yaml.v3 v3.0.1
## explicit
gopkg.in/yaml.v3
-# k8s.io/api v0.35.4 => github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20251108023427-891f5bb03061
+# k8s.io/api v0.36.1 => github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20251108023427-891f5bb03061
## explicit; go 1.24.0
k8s.io/api/admission/v1
k8s.io/api/admission/v1beta1
@@ -684,7 +684,7 @@ k8s.io/api/storage/v1
k8s.io/api/storage/v1alpha1
k8s.io/api/storage/v1beta1
k8s.io/api/storagemigration/v1alpha1
-# k8s.io/apiextensions-apiserver v0.35.4 => github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20251108023427-891f5bb03061
+# k8s.io/apiextensions-apiserver v0.36.1 => github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20251108023427-891f5bb03061
## explicit; go 1.24.0
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1
@@ -696,7 +696,7 @@ k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme
k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1
k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1
k8s.io/apiextensions-apiserver/pkg/features
-# k8s.io/apimachinery v0.35.4 => github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20251108023427-891f5bb03061
+# k8s.io/apimachinery v0.36.1 => github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20251108023427-891f5bb03061
## explicit; go 1.24.0
k8s.io/apimachinery/pkg/api/equality
k8s.io/apimachinery/pkg/api/errors
@@ -766,7 +766,7 @@ k8s.io/apimachinery/pkg/watch
k8s.io/apimachinery/third_party/forked/golang/json
k8s.io/apimachinery/third_party/forked/golang/netutil
k8s.io/apimachinery/third_party/forked/golang/reflect
-# k8s.io/apiserver v0.35.4 => github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20251108023427-891f5bb03061
+# k8s.io/apiserver v0.36.1 => github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20251108023427-891f5bb03061
## explicit; go 1.24.0
k8s.io/apiserver/pkg/admission
k8s.io/apiserver/pkg/admission/configuration
@@ -1108,7 +1108,7 @@ k8s.io/client-go/util/homedir
k8s.io/client-go/util/keyutil
k8s.io/client-go/util/retry
k8s.io/client-go/util/workqueue
-# k8s.io/component-base v0.35.4 => github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20251108023427-891f5bb03061
+# k8s.io/component-base v0.36.1 => github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20251108023427-891f5bb03061
## explicit; go 1.24.0
k8s.io/component-base/cli/flag
k8s.io/component-base/compatibility
@@ -1128,7 +1128,7 @@ k8s.io/component-base/tracing
k8s.io/component-base/tracing/api/v1
k8s.io/component-base/version
k8s.io/component-base/zpages/features
-# k8s.io/component-helpers v0.35.0 => github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20251108023427-891f5bb03061
+# k8s.io/component-helpers v0.36.1 => github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20251108023427-891f5bb03061
## explicit; go 1.24.0
k8s.io/component-helpers/node/util/sysctl
k8s.io/component-helpers/resource
@@ -1148,7 +1148,7 @@ k8s.io/klog/v2/internal/severity
k8s.io/klog/v2/internal/sloghandler
k8s.io/klog/v2/internal/verbosity
k8s.io/klog/v2/textlogger
-# k8s.io/kube-openapi v0.0.0-20260319004828-5883c5ee87b9
+# k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199
## explicit; go 1.23.0
k8s.io/kube-openapi/pkg/cached
k8s.io/kube-openapi/pkg/common
@@ -1164,7 +1164,7 @@ k8s.io/kube-openapi/pkg/validation/errors
k8s.io/kube-openapi/pkg/validation/spec
k8s.io/kube-openapi/pkg/validation/strfmt
k8s.io/kube-openapi/pkg/validation/strfmt/bson
-# k8s.io/kubectl v0.35.1 => github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20251108023427-891f5bb03061
+# k8s.io/kubectl v0.36.1 => github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20251108023427-891f5bb03061
## explicit; go 1.24.0
k8s.io/kubectl/pkg/scale
k8s.io/kubectl/pkg/util/podutils
@@ -1172,7 +1172,7 @@ k8s.io/kubectl/pkg/util/podutils
## explicit; go 1.24.0
k8s.io/kubelet/pkg/apis
k8s.io/kubelet/pkg/apis/stats/v1alpha1
-# k8s.io/kubernetes v1.35.0 => github.com/openshift/kubernetes v0.0.0-20251108023427-891f5bb03061
+# k8s.io/kubernetes v1.36.1 => github.com/openshift/kubernetes v0.0.0-20251108023427-891f5bb03061
## explicit; go 1.24.0
k8s.io/kubernetes/pkg/api/legacyscheme
k8s.io/kubernetes/pkg/api/service
@@ -1241,12 +1241,11 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client
sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/metrics
sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/common/metrics
sigs.k8s.io/apiserver-network-proxy/konnectivity-client/proto/client
-# sigs.k8s.io/controller-runtime v0.23.3
-## explicit; go 1.25.0
+# sigs.k8s.io/controller-runtime v0.24.1
+## explicit; go 1.26.0
sigs.k8s.io/controller-runtime/pkg/client
sigs.k8s.io/controller-runtime/pkg/client/apiutil
sigs.k8s.io/controller-runtime/pkg/log
-sigs.k8s.io/controller-runtime/pkg/scheme
# sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730
## explicit; go 1.23
sigs.k8s.io/json
diff --git a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/errors.go b/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/errors.go
index b00e071232..1e21519250 100644
--- a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/errors.go
+++ b/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/errors.go
@@ -34,7 +34,7 @@ type ErrResourceDiscoveryFailed map[schema.GroupVersion]error
// Error implements the error interface.
func (e *ErrResourceDiscoveryFailed) Error() string {
- subErrors := []string{}
+ subErrors := make([]string, 0, len(*e))
for k, v := range *e {
subErrors = append(subErrors, fmt.Sprintf("%s: %v", k, v))
}
@@ -43,7 +43,7 @@ func (e *ErrResourceDiscoveryFailed) Error() string {
}
func (e *ErrResourceDiscoveryFailed) Unwrap() []error {
- subErrors := []error{}
+ subErrors := make([]error, 0, len(*e))
for gv, err := range *e {
if apierrors.IsNotFound(err) {
err = &meta.NoResourceMatchError{PartialResource: gv.WithResource("")}
diff --git a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/restmapper.go b/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/restmapper.go
index 7a7a0d1145..ef5d0fee97 100644
--- a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/restmapper.go
+++ b/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/restmapper.go
@@ -28,7 +28,6 @@ import (
"k8s.io/client-go/discovery"
"k8s.io/client-go/rest"
"k8s.io/client-go/restmapper"
- "k8s.io/utils/ptr"
)
// NewDynamicRESTMapper returns a dynamic RESTMapper for cfg. The dynamic
@@ -197,7 +196,7 @@ func (m *mapper) addKnownGroupAndReload(groupName string, versions ...string) er
}
}
if len(failedGroups) > 0 {
- return ptr.To(ErrResourceDiscoveryFailed(failedGroups))
+ return new(ErrResourceDiscoveryFailed(failedGroups))
}
return nil
}
diff --git a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/applyconfigurations.go b/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/applyconfigurations.go
index 97192050f9..3a1864847d 100644
--- a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/applyconfigurations.go
+++ b/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/applyconfigurations.go
@@ -39,28 +39,6 @@ func ApplyConfigurationFromUnstructured(u *unstructured.Unstructured) runtime.Ap
return &unstructuredApplyConfiguration{Unstructured: u}
}
-type applyconfigurationRuntimeObject struct {
- runtime.ApplyConfiguration
-}
-
-func (a *applyconfigurationRuntimeObject) GetObjectKind() schema.ObjectKind {
- return a
-}
-
-func (a *applyconfigurationRuntimeObject) GroupVersionKind() schema.GroupVersionKind {
- return schema.GroupVersionKind{}
-}
-
-func (a *applyconfigurationRuntimeObject) SetGroupVersionKind(gvk schema.GroupVersionKind) {}
-
-func (a *applyconfigurationRuntimeObject) DeepCopyObject() runtime.Object {
- panic("applyconfigurationRuntimeObject does not support DeepCopyObject")
-}
-
-func runtimeObjectFromApplyConfiguration(ac runtime.ApplyConfiguration) runtime.Object {
- return &applyconfigurationRuntimeObject{ApplyConfiguration: ac}
-}
-
func gvkFromApplyConfiguration(ac applyConfiguration) (schema.GroupVersionKind, error) {
var gvk schema.GroupVersionKind
gv, err := schema.ParseGroupVersion(ptr.Deref(ac.GetAPIVersion(), ""))
diff --git a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/options.go b/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/options.go
index a6b921171a..c5bd9f0b8c 100644
--- a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/options.go
+++ b/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/options.go
@@ -21,7 +21,6 @@ import (
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/selection"
- "k8s.io/utils/ptr"
)
// {{{ "Functional" Option Interfaces
@@ -741,12 +740,12 @@ type UnsafeDisableDeepCopyOption bool
// ApplyToGet applies this configuration to the given an Get options.
func (d UnsafeDisableDeepCopyOption) ApplyToGet(opts *GetOptions) {
- opts.UnsafeDisableDeepCopy = ptr.To(bool(d))
+ opts.UnsafeDisableDeepCopy = new(bool(d))
}
// ApplyToList applies this configuration to the given an List options.
func (d UnsafeDisableDeepCopyOption) ApplyToList(opts *ListOptions) {
- opts.UnsafeDisableDeepCopy = ptr.To(bool(d))
+ opts.UnsafeDisableDeepCopy = new(bool(d))
}
// UnsafeDisableDeepCopy indicates not to deep copy objects during list objects.
@@ -953,19 +952,19 @@ var ForceOwnership = forceOwnership{}
type forceOwnership struct{}
func (forceOwnership) ApplyToPatch(opts *PatchOptions) {
- opts.Force = ptr.To(true)
+ opts.Force = new(true)
}
func (forceOwnership) ApplyToSubResourcePatch(opts *SubResourcePatchOptions) {
- opts.Force = ptr.To(true)
+ opts.Force = new(true)
}
func (forceOwnership) ApplyToApply(opts *ApplyOptions) {
- opts.Force = ptr.To(true)
+ opts.Force = new(true)
}
func (forceOwnership) ApplyToSubResourceApply(opts *SubResourceApplyOptions) {
- opts.Force = ptr.To(true)
+ opts.Force = new(true)
}
// }}}
diff --git a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/typed_client.go b/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/typed_client.go
index 66ae2e4a5c..5a85941725 100644
--- a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/typed_client.go
+++ b/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/client/typed_client.go
@@ -21,6 +21,7 @@ import (
"fmt"
"k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/util/json"
"k8s.io/client-go/util/apply"
)
@@ -146,17 +147,29 @@ func (c *typedClient) Apply(ctx context.Context, obj runtime.ApplyConfiguration,
applyOpts := &ApplyOptions{}
applyOpts.ApplyOptions(opts)
- return req.
+ resp := req.
NamespaceIfScoped(o.namespace, o.isNamespaced()).
Resource(o.resource()).
Name(o.name).
VersionedParams(applyOpts.AsPatchOptions(), c.paramCodec).
- Do(ctx).
- // This is hacky, it is required because `Into` takes a `runtime.Object` and
- // that is not implemented by the ApplyConfigurations. The generated clients
- // don't have this problem because they deserialize into the api type, not the
- // apply configuration: https://github.com/kubernetes/kubernetes/blob/22f5e01a37c0bc6a5f494dec14dd4e3688ee1d55/staging/src/k8s.io/client-go/gentype/type.go#L296-L317
- Into(runtimeObjectFromApplyConfiguration(obj))
+ Do(ctx)
+ if err := resp.Error(); err != nil {
+ return err
+ }
+
+ var contentType string
+ body, err := resp.
+ ContentType(&contentType).
+ Raw()
+ if err != nil {
+ return err
+ }
+
+ if contentType != "application/json" {
+ return fmt.Errorf("unexpected content type %q in apply response, expected application/json", contentType)
+ }
+
+ return json.Unmarshal(body, obj)
}
// Get implements client.Client.
@@ -324,16 +337,28 @@ func (c *typedClient) ApplySubResource(ctx context.Context, obj runtime.ApplyCon
return fmt.Errorf("failed to create apply request: %w", err)
}
- return req.
+ resp := req.
NamespaceIfScoped(o.namespace, o.isNamespaced()).
Resource(o.resource()).
Name(o.name).
SubResource(subResource).
VersionedParams(applyOpts.AsPatchOptions(), c.paramCodec).
- Do(ctx).
- // This is hacky, it is required because `Into` takes a `runtime.Object` and
- // that is not implemented by the ApplyConfigurations. The generated clients
- // don't have this problem because they deserialize into the api type, not the
- // apply configuration: https://github.com/kubernetes/kubernetes/blob/22f5e01a37c0bc6a5f494dec14dd4e3688ee1d55/staging/src/k8s.io/client-go/gentype/type.go#L296-L317
- Into(runtimeObjectFromApplyConfiguration(obj))
+ Do(ctx)
+ if err := resp.Error(); err != nil {
+ return err
+ }
+
+ var contentType string
+ respBody, err := resp.
+ ContentType(&contentType).
+ Raw()
+ if err != nil {
+ return err
+ }
+
+ if contentType != "application/json" {
+ return fmt.Errorf("unexpected content type %q in apply response, expected application/json", contentType)
+ }
+
+ return json.Unmarshal(respBody, obj)
}
diff --git a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/scheme/scheme.go b/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/scheme/scheme.go
deleted file mode 100644
index 55ebe21773..0000000000
--- a/openshift/tests-extension/vendor/sigs.k8s.io/controller-runtime/pkg/scheme/scheme.go
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
-Copyright 2018 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-// Package scheme contains utilities for gradually building Schemes,
-// which contain information associating Go types with Kubernetes
-// groups, versions, and kinds.
-//
-// Each API group should define a utility function
-// called AddToScheme for adding its types to a Scheme:
-//
-// // in package myapigroupv1...
-// var (
-// SchemeGroupVersion = schema.GroupVersion{Group: "my.api.group", Version: "v1"}
-// SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
-// AddToScheme = SchemeBuilder.AddToScheme
-// )
-//
-// func init() {
-// SchemeBuilder.Register(&MyType{}, &MyTypeList)
-// }
-// var (
-// scheme *runtime.Scheme = runtime.NewScheme()
-// )
-//
-// This also true of the built-in Kubernetes types. Then, in the entrypoint for
-// your manager, assemble the scheme containing exactly the types you need,
-// panicing if scheme registration failed. For instance, if our controller needs
-// types from the core/v1 API group (e.g. Pod), plus types from my.api.group/v1:
-//
-// func init() {
-// utilruntime.Must(myapigroupv1.AddToScheme(scheme))
-// utilruntime.Must(kubernetesscheme.AddToScheme(scheme))
-// }
-//
-// func main() {
-// mgr := controllers.NewManager(context.Background(), controllers.GetConfigOrDie(), manager.Options{
-// Scheme: scheme,
-// })
-// // ...
-// }
-package scheme
-
-import (
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/apimachinery/pkg/runtime"
- "k8s.io/apimachinery/pkg/runtime/schema"
-)
-
-// Builder builds a new Scheme for mapping go types to Kubernetes GroupVersionKinds.
-type Builder struct {
- GroupVersion schema.GroupVersion
- runtime.SchemeBuilder
-}
-
-// Register adds one or more objects to the SchemeBuilder so they can be added to a Scheme. Register mutates bld.
-func (bld *Builder) Register(object ...runtime.Object) *Builder {
- bld.SchemeBuilder.Register(func(scheme *runtime.Scheme) error {
- scheme.AddKnownTypes(bld.GroupVersion, object...)
- metav1.AddToGroupVersion(scheme, bld.GroupVersion)
- return nil
- })
- return bld
-}
-
-// RegisterAll registers all types from the Builder argument. RegisterAll mutates bld.
-func (bld *Builder) RegisterAll(b *Builder) *Builder {
- bld.SchemeBuilder = append(bld.SchemeBuilder, b.SchemeBuilder...)
- return bld
-}
-
-// AddToScheme adds all registered types to s.
-func (bld *Builder) AddToScheme(s *runtime.Scheme) error {
- return bld.SchemeBuilder.AddToScheme(s)
-}
-
-// Build returns a new Scheme containing the registered types.
-func (bld *Builder) Build() (*runtime.Scheme, error) {
- s := runtime.NewScheme()
- return s, bld.AddToScheme(s)
-}
diff --git a/requirements.txt b/requirements.txt
index 9e08e44a00..d116ed442d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,7 +6,7 @@ click==8.4.1
colorama==0.4.6
cssselect==1.4.0
ghp-import==2.1.0
-idna==3.16
+idna==3.17
Jinja2==3.1.6
lxml==6.1.1
Markdown==3.10.2
@@ -19,7 +19,7 @@ mkdocs-material-extensions==1.3.1
packaging==26.2
paginate==0.5.7
pathspec==1.1.1
-platformdirs==4.9.6
+platformdirs==4.10.0
Pygments==2.20.0
pymdown-extensions==10.21.3
pyquery==2.0.1
diff --git a/test/e2e/features/tls.feature b/test/e2e/features/tls.feature
index ba43f74141..39b399d17a 100644
--- a/test/e2e/features/tls.feature
+++ b/test/e2e/features/tls.feature
@@ -33,3 +33,15 @@ Feature: TLS profile enforcement on metrics endpoints
Given the "catalogd" deployment is configured with custom TLS version "TLSv1.2", ciphers "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", and curves "prime256v1"
Then the "catalogd" metrics endpoint accepts a TLS 1.2 connection with cipher "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" and curve "prime256v1"
And the "catalogd" metrics endpoint rejects a TLS 1.2 connection with cipher "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" and only curve "secp521r1"
+
+ @TLSProfile
+ Scenario: catalogd metrics endpoint accepts secp256r1 as the IANA name for prime256v1
+ Given the "catalogd" deployment is configured with custom TLS version "TLSv1.2", ciphers "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", and curves "secp256r1"
+ Then the "catalogd" metrics endpoint accepts a TLS 1.2 connection with cipher "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" and curve "secp256r1"
+ And the "catalogd" metrics endpoint rejects a TLS 1.2 connection with cipher "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" and only curve "secp521r1"
+
+ @TLSProfile
+ Scenario: catalogd metrics endpoint accepts connections using post-quantum hybrid curves
+ Given the "catalogd" deployment is configured with custom TLS version "TLSv1.2", ciphers "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", and curves "SecP256r1MLKEM768,secp256r1"
+ Then the "catalogd" metrics endpoint accepts a connection using only curve "SecP256r1MLKEM768"
+ And the "catalogd" metrics endpoint rejects a connection using only curve "secp521r1"
diff --git a/test/e2e/features_test.go b/test/e2e/features_test.go
index 14d19ac9a3..81f1a09342 100644
--- a/test/e2e/features_test.go
+++ b/test/e2e/features_test.go
@@ -10,8 +10,8 @@ import (
"github.com/cucumber/godog/colors"
"github.com/spf13/pflag"
- testutil "github.com/operator-framework/operator-controller/internal/shared/util/test"
"github.com/operator-framework/operator-controller/test/e2e/steps"
+ "github.com/operator-framework/operator-controller/test/internal/summary"
)
var opts = godog.Options{
@@ -47,10 +47,9 @@ func TestMain(m *testing.M) {
if path == "" {
fmt.Println("Note: E2E_SUMMARY_OUTPUT is unset; skipping summary generation")
} else {
- if err := testutil.PrintSummary(path); err != nil {
- // Fail the run if alerts are found
+ if err := summary.PrintSummary(path); err != nil {
+ // Alert but do not fail the run if alerts are found
fmt.Printf("%v", err)
- os.Exit(1)
}
}
return
diff --git a/test/e2e/steps/steps.go b/test/e2e/steps/steps.go
index 3412619fec..00a10ea64f 100644
--- a/test/e2e/steps/steps.go
+++ b/test/e2e/steps/steps.go
@@ -195,6 +195,8 @@ func RegisterSteps(sc *godog.ScenarioContext) {
sc.Step(`^(?i)the "([^"]+)" metrics endpoint rejects a TLS 1\.2 connection offering only cipher "([^"]+)"$`, MetricsEndpointRejectsTLS12ConnectionWithCipher)
sc.Step(`^(?i)the "([^"]+)" metrics endpoint accepts a TLS 1\.2 connection with cipher "([^"]+)" and curve "([^"]+)"$`, MetricsEndpointAcceptsTLS12ConnectionWithCurve)
sc.Step(`^(?i)the "([^"]+)" metrics endpoint rejects a TLS 1\.2 connection with cipher "([^"]+)" and only curve "([^"]+)"$`, MetricsEndpointRejectsTLS12ConnectionWithCurve)
+ sc.Step(`^(?i)the "([^"]+)" metrics endpoint accepts a connection using only curve "([^"]+)"$`, MetricsEndpointAcceptsConnectionUsingCurve)
+ sc.Step(`^(?i)the "([^"]+)" metrics endpoint rejects a connection using only curve "([^"]+)"$`, MetricsEndpointRejectsConnectionUsingOnlyCurve)
// Upgrade-specific steps
sc.Step(`^(?i)the latest stable OLM release is installed$`, LatestStableOLMReleaseIsInstalled)
diff --git a/test/e2e/steps/tls_steps.go b/test/e2e/steps/tls_steps.go
index 4fad45d83e..66c381d59c 100644
--- a/test/e2e/steps/tls_steps.go
+++ b/test/e2e/steps/tls_steps.go
@@ -46,11 +46,14 @@ func tlsCipherSuiteName(id uint16) string {
// curveIDByName maps the curve names used in --tls-custom-curves flags to Go CurveID values.
var curveIDByName = map[string]tls.CurveID{
- "X25519MLKEM768": tls.X25519MLKEM768,
- "X25519": tls.X25519,
- "prime256v1": tls.CurveP256,
- "secp384r1": tls.CurveP384,
- "secp521r1": tls.CurveP521,
+ "X25519MLKEM768": tls.X25519MLKEM768,
+ "SecP256r1MLKEM768": tls.SecP256r1MLKEM768,
+ "SecP384r1MLKEM1024": tls.SecP384r1MLKEM1024,
+ "X25519": tls.X25519,
+ "prime256v1": tls.CurveP256,
+ "secp256r1": tls.CurveP256, // IANA name for prime256v1
+ "secp384r1": tls.CurveP384,
+ "secp521r1": tls.CurveP521,
}
// getMetricsService returns the full Service object for the named component's metrics service.
diff --git a/test/e2e/support-bundle.yaml b/test/e2e/support-bundle.yaml
new file mode 100644
index 0000000000..c0cc0bdbf3
--- /dev/null
+++ b/test/e2e/support-bundle.yaml
@@ -0,0 +1,9 @@
+apiVersion: troubleshoot.sh/v1beta2
+kind: SupportBundle
+metadata:
+ name: e2e-tests
+spec:
+ collectors:
+ - clusterResources: {}
+ - clusterInfo: {}
+ - logs: {}
diff --git a/internal/shared/util/test/artifacts.go b/test/internal/summary/artifacts.go
similarity index 99%
rename from internal/shared/util/test/artifacts.go
rename to test/internal/summary/artifacts.go
index 727b915e71..850e5bbeec 100644
--- a/internal/shared/util/test/artifacts.go
+++ b/test/internal/summary/artifacts.go
@@ -1,4 +1,4 @@
-package test
+package summary
import (
"context"
diff --git a/internal/shared/util/test/summary.go b/test/internal/summary/summary.go
similarity index 93%
rename from internal/shared/util/test/summary.go
rename to test/internal/summary/summary.go
index e5dc4c195c..4eea7006ea 100644
--- a/internal/shared/util/test/summary.go
+++ b/test/internal/summary/summary.go
@@ -1,4 +1,4 @@
-package test
+package summary
import (
"context"
@@ -80,8 +80,8 @@ func (s *githubSummary) PerformanceQuery(title, pod, query, yLabel string, scale
matrix, ok := result.(model.Matrix)
if !ok {
return "", fmt.Errorf("typecast for metrics samples failed; aborting")
- } else if len(matrix) != 1 {
- return "", fmt.Errorf("expected 1 set of results; got: %d", len(matrix))
+ } else if len(matrix) == 0 {
+ return "", fmt.Errorf("expected 1 or more sets of results; got 0")
}
chart := xychart{
Title: title,
@@ -92,10 +92,6 @@ func (s *githubSummary) PerformanceQuery(title, pod, query, yLabel string, scale
formattedData := make([]string, 0)
// matrix does not allow [] access, so we just do one iteration for the single result
for _, metric := range matrix {
- if len(metric.Values) < 2 {
- // A graph with one data point means something with the collection was wrong
- return "", fmt.Errorf("expected at least two data points; got: %d", len(metric.Values))
- }
for _, sample := range metric.Values {
floatSample := float64(sample.Value) * scaler
formattedData = append(formattedData, fmt.Sprintf("%f", floatSample))
@@ -160,7 +156,7 @@ func executeTemplate(templateFile string, obj any) (string, error) {
if err != nil {
return "", fmt.Errorf("failed to get working directory: %w", err)
}
- tmpl, err := template.New(templateFile).ParseGlob(filepath.Join(wd, "../../internal/shared/util/test/templates", templateFile))
+ tmpl, err := template.New(templateFile).ParseGlob(filepath.Join(wd, "../internal/summary/templates", templateFile))
if err != nil {
return "", err
}
diff --git a/internal/shared/util/test/templates/alert.md.tmpl b/test/internal/summary/templates/alert.md.tmpl
similarity index 100%
rename from internal/shared/util/test/templates/alert.md.tmpl
rename to test/internal/summary/templates/alert.md.tmpl
diff --git a/internal/shared/util/test/templates/mermaid_chart.md.tmpl b/test/internal/summary/templates/mermaid_chart.md.tmpl
similarity index 100%
rename from internal/shared/util/test/templates/mermaid_chart.md.tmpl
rename to test/internal/summary/templates/mermaid_chart.md.tmpl
diff --git a/internal/shared/util/test/templates/summary.md.tmpl b/test/internal/summary/templates/summary.md.tmpl
similarity index 100%
rename from internal/shared/util/test/templates/summary.md.tmpl
rename to test/internal/summary/templates/summary.md.tmpl
diff --git a/testdata/prometheus/values-experimental.yaml b/testdata/prometheus/values-experimental.yaml
new file mode 100644
index 0000000000..2a9a3972d1
--- /dev/null
+++ b/testdata/prometheus/values-experimental.yaml
@@ -0,0 +1,66 @@
+# Experimental values override for OLMv1 e2e prometheus monitoring.
+# Overrides only the resource-usage alert thresholds listed below.
+# The controller-panic-alerts key is NOT present here, so Helm preserves
+# it from the base values.yaml unchanged.
+#
+# Changed thresholds vs defaults:
+# operator-controller-memory-growth: 200000 (default: 100000)
+# catalogd-memory-growth: 200000 (default: 100000)
+# operator-controller-memory-usage: 150000000 (default: 100000000)
+additionalPrometheusRulesMap:
+ controller-resource-alerts:
+ groups:
+ - name: resource-usage
+ rules:
+ - alert: oom-events
+ annotations:
+ description: "container {{ $labels.container }} of pod {{ $labels.pod }} experienced OOM event(s); count={{ $value }}"
+ expr: container_oom_events_total > 0
+ - alert: operator-controller-memory-growth
+ annotations:
+ description: 'operator-controller pod memory usage growing at a high rate for 5 minutes: {{ $value | humanize }}B/sec'
+ expr: deriv(sum(container_memory_working_set_bytes{pod=~"operator-controller.*",container="manager"})[5m:]) > 200000
+ for: 5m
+ keep_firing_for: 1d
+ - alert: catalogd-memory-growth
+ annotations:
+ description: 'catalogd pod memory usage growing at a high rate for 5 minutes: {{ $value | humanize }}B/sec'
+ expr: deriv(sum(container_memory_working_set_bytes{pod=~"catalogd.*",container="manager"})[5m:]) > 200000
+ for: 5m
+ keep_firing_for: 1d
+ - alert: operator-controller-memory-usage
+ annotations:
+ description: 'operator-controller pod using high memory resources for the last 5 minutes: {{ $value | humanize }}B'
+ expr: sum(container_memory_working_set_bytes{pod=~"operator-controller.*",container="manager"}) > 150000000
+ for: 5m
+ keep_firing_for: 1d
+ - alert: catalogd-memory-usage
+ annotations:
+ description: 'catalogd pod using high memory resources for the last 5 minutes: {{ $value | humanize }}B'
+ expr: sum(container_memory_working_set_bytes{pod=~"catalogd.*",container="manager"}) > 75000000
+ for: 5m
+ keep_firing_for: 1d
+ - alert: operator-controller-cpu-usage
+ annotations:
+ description: 'operator-controller using high cpu resource for 5 minutes: {{ $value | printf "%.2f" }}%'
+ expr: rate(container_cpu_usage_seconds_total{pod=~"operator-controller.*",container="manager"}[5m]) * 100 > 20
+ for: 5m
+ keep_firing_for: 1d
+ - alert: catalogd-cpu-usage
+ annotations:
+ description: 'catalogd using high cpu resources for 5 minutes: {{ $value | printf "%.2f" }}%'
+ expr: rate(container_cpu_usage_seconds_total{pod=~"catalogd.*",container="manager"}[5m]) * 100 > 20
+ for: 5m
+ keep_firing_for: 1d
+ - alert: operator-controller-api-call-rate
+ annotations:
+ description: 'operator-controller making excessive API calls for 5 minutes: {{ $value | printf "%.2f" }}/sec'
+ expr: sum(rate(rest_client_requests_total{job=~"operator-controller-service"}[5m])) > 10
+ for: 5m
+ keep_firing_for: 1d
+ - alert: catalogd-api-call-rate
+ annotations:
+ description: 'catalogd making excessive API calls for 5 minutes: {{ $value | printf "%.2f" }}/sec'
+ expr: sum(rate(rest_client_requests_total{job=~"catalogd-service"}[5m])) > 5
+ for: 5m
+ keep_firing_for: 1d
diff --git a/testdata/prometheus/values.yaml b/testdata/prometheus/values.yaml
new file mode 100644
index 0000000000..7c2cce1245
--- /dev/null
+++ b/testdata/prometheus/values.yaml
@@ -0,0 +1,191 @@
+# kube-prometheus-stack values for OLMv1 e2e testing.
+# Only prometheus-operator and a Prometheus instance are deployed;
+# all other components (grafana, alertmanager, exporters, default rules) are disabled.
+grafana:
+ enabled: false
+alertmanager:
+ enabled: false
+nodeExporter:
+ enabled: false
+kubeStateMetrics:
+ enabled: false
+kubeApiServer:
+ enabled: false
+kubeControllerManager:
+ enabled: false
+kubeScheduler:
+ enabled: false
+kubeProxy:
+ enabled: false
+kubeEtcd:
+ enabled: false
+coreDns:
+ enabled: false
+defaultRules:
+ create: false
+prometheusOperator:
+ admissionWebhooks:
+ enabled: false
+ tls:
+ enabled: false
+ networkPolicy:
+ enabled: true
+prometheus:
+ prometheusSpec:
+ scrapeInterval: "1m"
+ scrapeTimeout: "30s"
+ logLevel: debug
+ serviceMonitorSelectorNilUsesHelmValues: false
+ ruleSelectorNilUsesHelmValues: false
+ serviceDiscoveryRole: EndpointSlice
+ securityContext:
+ runAsNonRoot: true
+ runAsUser: 65534
+ seccompProfile:
+ type: RuntimeDefault
+ serviceAccount:
+ name: prometheus
+ service:
+ type: NodePort
+ nodePort: 30900
+ networkPolicy:
+ enabled: true
+ egress:
+ - {}
+ ingress:
+ - {}
+ additionalServiceMonitors:
+ - name: operator-controller-controller-manager-metrics-monitor
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: operator-controller
+ endpoints:
+ - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
+ interval: 10s
+ path: /metrics
+ port: metrics
+ scheme: https
+ tlsConfig:
+ ca:
+ secret:
+ key: ca.crt
+ name: operator-controller-cert
+ cert:
+ secret:
+ key: tls.crt
+ name: operator-controller-cert
+ insecureSkipVerify: false
+ keySecret:
+ key: tls.key
+ name: operator-controller-cert
+ serverName: operator-controller-service.olmv1-system.svc
+ - name: catalogd-controller-manager-metrics-monitor
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: catalogd
+ endpoints:
+ - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
+ interval: 10s
+ path: /metrics
+ port: metrics
+ scheme: https
+ tlsConfig:
+ ca:
+ secret:
+ key: ca.crt
+ name: CATALOGD_CERT_PLACEHOLDER
+ cert:
+ secret:
+ key: tls.crt
+ name: CATALOGD_CERT_PLACEHOLDER
+ insecureSkipVerify: false
+ keySecret:
+ key: tls.key
+ name: CATALOGD_CERT_PLACEHOLDER
+ serverName: catalogd-service.olmv1-system.svc
+kubelet:
+ enabled: true
+ namespace: kube-system
+ serviceMonitor:
+ interval: 10s
+ honorLabels: true
+ honorTimestamps: false
+ trackTimestampsStaleness: false
+ kubelet: false
+ cAdvisor: true
+ probes: false
+ resource: false
+ cAdvisorRelabelings: []
+ cAdvisorMetricRelabelings:
+ - sourceLabels: [pod, container]
+ regex: "(operator-controller|catalogd).*;manager"
+ action: keep
+additionalPrometheusRulesMap:
+ controller-panic-alerts:
+ groups:
+ - name: controller-panic
+ rules:
+ - alert: reconciler-panic
+ annotations:
+ description: "controller of pod {{ $labels.pod }} experienced panic(s); count={{ $value }}"
+ expr: controller_runtime_reconcile_panics_total{} > 0
+ - alert: webhook-panic
+ annotations:
+ description: "controller webhook of pod {{ $labels.pod }} experienced panic(s); count={{ $value }}"
+ expr: controller_runtime_webhook_panics_total{} > 0
+ controller-resource-alerts:
+ groups:
+ - name: resource-usage
+ rules:
+ - alert: oom-events
+ annotations:
+ description: "container {{ $labels.container }} of pod {{ $labels.pod }} experienced OOM event(s); count={{ $value }}"
+ expr: container_oom_events_total > 0
+ - alert: operator-controller-memory-growth
+ annotations:
+ description: 'operator-controller pod memory usage growing at a high rate for 5 minutes: {{ $value | humanize }}B/sec'
+ expr: deriv(sum(container_memory_working_set_bytes{pod=~"operator-controller.*",container="manager"})[5m:]) > 100000
+ for: 5m
+ keep_firing_for: 1d
+ - alert: catalogd-memory-growth
+ annotations:
+ description: 'catalogd pod memory usage growing at a high rate for 5 minutes: {{ $value | humanize }}B/sec'
+ expr: deriv(sum(container_memory_working_set_bytes{pod=~"catalogd.*",container="manager"})[5m:]) > 100000
+ for: 5m
+ keep_firing_for: 1d
+ - alert: operator-controller-memory-usage
+ annotations:
+ description: 'operator-controller pod using high memory resources for the last 5 minutes: {{ $value | humanize }}B'
+ expr: sum(container_memory_working_set_bytes{pod=~"operator-controller.*",container="manager"}) > 100000000
+ for: 5m
+ keep_firing_for: 1d
+ - alert: catalogd-memory-usage
+ annotations:
+ description: 'catalogd pod using high memory resources for the last 5 minutes: {{ $value | humanize }}B'
+ expr: sum(container_memory_working_set_bytes{pod=~"catalogd.*",container="manager"}) > 75000000
+ for: 5m
+ keep_firing_for: 1d
+ - alert: operator-controller-cpu-usage
+ annotations:
+ description: 'operator-controller using high cpu resource for 5 minutes: {{ $value | printf "%.2f" }}%'
+ expr: rate(container_cpu_usage_seconds_total{pod=~"operator-controller.*",container="manager"}[5m]) * 100 > 20
+ for: 5m
+ keep_firing_for: 1d
+ - alert: catalogd-cpu-usage
+ annotations:
+ description: 'catalogd using high cpu resources for 5 minutes: {{ $value | printf "%.2f" }}%'
+ expr: rate(container_cpu_usage_seconds_total{pod=~"catalogd.*",container="manager"}[5m]) * 100 > 20
+ for: 5m
+ keep_firing_for: 1d
+ - alert: operator-controller-api-call-rate
+ annotations:
+ description: 'operator-controller making excessive API calls for 5 minutes: {{ $value | printf "%.2f" }}/sec'
+ expr: sum(rate(rest_client_requests_total{job=~"operator-controller-service"}[5m])) > 10
+ for: 5m
+ keep_firing_for: 1d
+ - alert: catalogd-api-call-rate
+ annotations:
+ description: 'catalogd making excessive API calls for 5 minutes: {{ $value | printf "%.2f" }}/sec'
+ expr: sum(rate(rest_client_requests_total{job=~"catalogd-service"}[5m])) > 5
+ for: 5m
+ keep_firing_for: 1d
diff --git a/vendor/github.com/fatih/color/color.go b/vendor/github.com/fatih/color/color.go
index ee39b408e9..d3906bfbd5 100644
--- a/vendor/github.com/fatih/color/color.go
+++ b/vendor/github.com/fatih/color/color.go
@@ -19,15 +19,15 @@ var (
// set (regardless of its value). This is a global option and affects all
// colors. For more control over each color block use the methods
// DisableColor() individually.
- NoColor = noColorIsSet() || os.Getenv("TERM") == "dumb" ||
- (!isatty.IsTerminal(os.Stdout.Fd()) && !isatty.IsCygwinTerminal(os.Stdout.Fd()))
+ NoColor = noColorIsSet() || os.Getenv("TERM") == "dumb" || !stdoutIsTerminal()
// Output defines the standard output of the print functions. By default,
- // os.Stdout is used.
- Output = colorable.NewColorableStdout()
+ // stdOut() is used.
+ Output = stdOut()
- // Error defines a color supporting writer for os.Stderr.
- Error = colorable.NewColorableStderr()
+ // Error defines the standard error of the print functions. By default,
+ // stdErr() is used.
+ Error = stdErr()
// colorsCache is used to reduce the count of created Color objects and
// allows to reuse already created objects with required Attribute.
@@ -40,6 +40,33 @@ func noColorIsSet() bool {
return os.Getenv("NO_COLOR") != ""
}
+// stdoutIsTerminal returns true if os.Stdout is a terminal.
+// Returns false if os.Stdout is nil (e.g., when running as a Windows service).
+func stdoutIsTerminal() bool {
+ if os.Stdout == nil {
+ return false
+ }
+ return isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd())
+}
+
+// stdOut returns a writer for color output.
+// Returns io.Discard if os.Stdout is nil (e.g., when running as a Windows service).
+func stdOut() io.Writer {
+ if os.Stdout == nil {
+ return io.Discard
+ }
+ return colorable.NewColorableStdout()
+}
+
+// stdErr returns a writer for color error output.
+// Returns io.Discard if os.Stderr is nil (e.g., when running as a Windows service).
+func stdErr() io.Writer {
+ if os.Stderr == nil {
+ return io.Discard
+ }
+ return colorable.NewColorableStderr()
+}
+
// Color defines a custom color object which is defined by SGR parameters.
type Color struct {
params []Attribute
@@ -220,26 +247,30 @@ func (c *Color) unset() {
// a low-level function, and users should use the higher-level functions, such
// as color.Fprint, color.Print, etc.
func (c *Color) SetWriter(w io.Writer) *Color {
+ _, _ = c.setWriter(w)
+ return c
+}
+
+func (c *Color) setWriter(w io.Writer) (int, error) {
if c.isNoColorSet() {
- return c
+ return 0, nil
}
- fmt.Fprint(w, c.format())
- return c
+ return fmt.Fprint(w, c.format())
}
// UnsetWriter resets all escape attributes and clears the output with the give
// io.Writer. Usually should be called after SetWriter().
func (c *Color) UnsetWriter(w io.Writer) {
- if c.isNoColorSet() {
- return
- }
+ _, _ = c.unsetWriter(w)
+}
- if NoColor {
- return
+func (c *Color) unsetWriter(w io.Writer) (int, error) {
+ if c.isNoColorSet() {
+ return 0, nil
}
- fmt.Fprintf(w, "%s[%dm", escape, Reset)
+ return fmt.Fprintf(w, "%s[%dm", escape, Reset)
}
// Add is used to chain SGR parameters. Use as many as parameters to combine
@@ -255,10 +286,20 @@ func (c *Color) Add(value ...Attribute) *Color {
// On Windows, users should wrap w with colorable.NewColorable() if w is of
// type *os.File.
func (c *Color) Fprint(w io.Writer, a ...interface{}) (n int, err error) {
- c.SetWriter(w)
- defer c.UnsetWriter(w)
+ n, err = c.setWriter(w)
+ if err != nil {
+ return n, err
+ }
+
+ nn, err := fmt.Fprint(w, a...)
+ n += nn
+ if err != nil {
+ return
+ }
- return fmt.Fprint(w, a...)
+ nn, err = c.unsetWriter(w)
+ n += nn
+ return n, err
}
// Print formats using the default formats for its operands and writes to
@@ -278,10 +319,20 @@ func (c *Color) Print(a ...interface{}) (n int, err error) {
// On Windows, users should wrap w with colorable.NewColorable() if w is of
// type *os.File.
func (c *Color) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {
- c.SetWriter(w)
- defer c.UnsetWriter(w)
+ n, err = c.setWriter(w)
+ if err != nil {
+ return n, err
+ }
+
+ nn, err := fmt.Fprintf(w, format, a...)
+ n += nn
+ if err != nil {
+ return
+ }
- return fmt.Fprintf(w, format, a...)
+ nn, err = c.unsetWriter(w)
+ n += nn
+ return n, err
}
// Printf formats according to a format specifier and writes to standard output.
@@ -475,27 +526,24 @@ func (c *Color) Equals(c2 *Color) bool {
if c == nil || c2 == nil {
return false
}
+
if len(c.params) != len(c2.params) {
return false
}
+ counts := make(map[Attribute]int, len(c.params))
for _, attr := range c.params {
- if !c2.attrExists(attr) {
- return false
- }
+ counts[attr]++
}
- return true
-}
-
-func (c *Color) attrExists(a Attribute) bool {
- for _, attr := range c.params {
- if attr == a {
- return true
+ for _, attr := range c2.params {
+ if counts[attr] == 0 {
+ return false
}
+ counts[attr]--
}
- return false
+ return true
}
func boolPtr(v bool) *bool {
diff --git a/vendor/github.com/fatih/color/color_windows.go b/vendor/github.com/fatih/color/color_windows.go
index be01c558e5..97e5a765a5 100644
--- a/vendor/github.com/fatih/color/color_windows.go
+++ b/vendor/github.com/fatih/color/color_windows.go
@@ -9,6 +9,9 @@ import (
func init() {
// Opt-in for ansi color support for current process.
// https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#output-sequences
+ if os.Stdout == nil {
+ return
+ }
var outMode uint32
out := windows.Handle(os.Stdout.Fd())
if err := windows.GetConsoleMode(out, &outMode); err != nil {
diff --git a/vendor/github.com/go-openapi/jsonpointer/.cliff.toml b/vendor/github.com/go-openapi/jsonpointer/.cliff.toml
deleted file mode 100644
index 702629f5dc..0000000000
--- a/vendor/github.com/go-openapi/jsonpointer/.cliff.toml
+++ /dev/null
@@ -1,181 +0,0 @@
-# git-cliff ~ configuration file
-# https://git-cliff.org/docs/configuration
-
-[changelog]
-header = """
-"""
-
-footer = """
-
------
-
-**[{{ remote.github.repo }}]({{ self::remote_url() }}) license terms**
-
-[![License][license-badge]][license-url]
-
-[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
-[license-url]: {{ self::remote_url() }}/?tab=Apache-2.0-1-ov-file#readme
-
-{%- macro remote_url() -%}
- https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}
-{%- endmacro -%}
-"""
-
-body = """
-{%- if version %}
-## [{{ version | trim_start_matches(pat="v") }}]({{ self::remote_url() }}/tree/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
-{%- else %}
-## [unreleased]
-{%- endif %}
-{%- if message %}
- {%- raw %}\n{% endraw %}
-{{ message }}
- {%- raw %}\n{% endraw %}
-{%- endif %}
-{%- if version %}
- {%- if previous.version %}
-
-**Full Changelog**: <{{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }}>
- {%- endif %}
-{%- else %}
- {%- raw %}\n{% endraw %}
-{%- endif %}
-
-{%- if statistics %}{% if statistics.commit_count %}
- {%- raw %}\n{% endraw %}
-{{ statistics.commit_count }} commits in this release.
- {%- raw %}\n{% endraw %}
-{%- endif %}{% endif %}
------
-
-{%- for group, commits in commits | group_by(attribute="group") %}
- {%- raw %}\n{% endraw %}
-### {{ group | upper_first }}
- {%- raw %}\n{% endraw %}
- {%- for commit in commits %}
- {%- if commit.remote.pr_title %}
- {%- set commit_message = commit.remote.pr_title %}
- {%- else %}
- {%- set commit_message = commit.message %}
- {%- endif %}
-* {{ commit_message | split(pat="\n") | first | trim }}
- {%- if commit.remote.username %}
-{%- raw %} {% endraw %}by [@{{ commit.remote.username }}](https://github.com/{{ commit.remote.username }})
- {%- endif %}
- {%- if commit.remote.pr_number %}
-{%- raw %} {% endraw %}in [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }})
- {%- endif %}
-{%- raw %} {% endraw %}[...]({{ self::remote_url() }}/commit/{{ commit.id }})
- {%- endfor %}
-{%- endfor %}
-
-{%- if github %}
-{%- raw %}\n{% endraw -%}
- {%- set all_contributors = github.contributors | length %}
- {%- if github.contributors | filter(attribute="username", value="dependabot[bot]") | length < all_contributors %}
------
-
-### People who contributed to this release
- {% endif %}
- {%- for contributor in github.contributors | filter(attribute="username") | sort(attribute="username") %}
- {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %}
-* [@{{ contributor.username }}](https://github.com/{{ contributor.username }})
- {%- endif %}
- {%- endfor %}
-
- {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
------
- {%- raw %}\n{% endraw %}
-
-### New Contributors
- {%- endif %}
-
- {%- for contributor in github.contributors | filter(attribute="is_first_time", value=true) %}
- {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %}
-* @{{ contributor.username }} made their first contribution
- {%- if contributor.pr_number %}
- in [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
- {%- endif %}
- {%- endif %}
- {%- endfor %}
-{%- endif %}
-
-{%- raw %}\n{% endraw %}
-
-{%- macro remote_url() -%}
- https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}
-{%- endmacro -%}
-"""
-# Remove leading and trailing whitespaces from the changelog's body.
-trim = true
-# Render body even when there are no releases to process.
-render_always = true
-# An array of regex based postprocessors to modify the changelog.
-postprocessors = [
- # Replace the placeholder with a URL.
- #{ pattern = '', replace = "https://github.com/orhun/git-cliff" },
-]
-# output file path
-# output = "test.md"
-
-[git]
-# Parse commits according to the conventional commits specification.
-# See https://www.conventionalcommits.org
-conventional_commits = false
-# Exclude commits that do not match the conventional commits specification.
-filter_unconventional = false
-# Require all commits to be conventional.
-# Takes precedence over filter_unconventional.
-require_conventional = false
-# Split commits on newlines, treating each line as an individual commit.
-split_commits = false
-# An array of regex based parsers to modify commit messages prior to further processing.
-commit_preprocessors = [
- # Replace issue numbers with link templates to be updated in `changelog.postprocessors`.
- #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"},
- # Check spelling of the commit message using https://github.com/crate-ci/typos.
- # If the spelling is incorrect, it will be fixed automatically.
- #{ pattern = '.*', replace_command = 'typos --write-changes -' }
-]
-# Prevent commits that are breaking from being excluded by commit parsers.
-protect_breaking_commits = false
-# An array of regex based parsers for extracting data from the commit message.
-# Assigns commits to groups.
-# Optionally sets the commit's scope and can decide to exclude commits from further processing.
-commit_parsers = [
- { message = "^[Cc]hore\\([Rr]elease\\): prepare for", skip = true },
- { message = "(^[Mm]erge)|([Mm]erge conflict)", skip = true },
- { field = "author.name", pattern = "dependabot*", group = "Updates" },
- { message = "([Ss]ecurity)|([Vv]uln)", group = "Security" },
- { body = "(.*[Ss]ecurity)|([Vv]uln)", group = "Security" },
- { message = "([Cc]hore\\(lint\\))|(style)|(lint)|(codeql)|(golangci)", group = "Code quality" },
- { message = "(^[Dd]oc)|((?i)readme)|(badge)|(typo)|(documentation)", group = "Documentation" },
- { message = "(^[Ff]eat)|(^[Ee]nhancement)", group = "Implemented enhancements" },
- { message = "(^ci)|(\\(ci\\))|(fixup\\s+ci)|(fix\\s+ci)|(license)|(example)", group = "Miscellaneous tasks" },
- { message = "^test", group = "Testing" },
- { message = "(^fix)|(panic)", group = "Fixed bugs" },
- { message = "(^refact)|(rework)", group = "Refactor" },
- { message = "(^[Pp]erf)|(performance)", group = "Performance" },
- { message = "(^[Cc]hore)", group = "Miscellaneous tasks" },
- { message = "^[Rr]evert", group = "Reverted changes" },
- { message = "(upgrade.*?go)|(go\\s+version)", group = "Updates" },
- { message = ".*", group = "Other" },
-]
-# Exclude commits that are not matched by any commit parser.
-filter_commits = false
-# An array of link parsers for extracting external references, and turning them into URLs, using regex.
-link_parsers = []
-# Include only the tags that belong to the current branch.
-use_branch_tags = false
-# Order releases topologically instead of chronologically.
-topo_order = false
-# Order releases topologically instead of chronologically.
-topo_order_commits = true
-# Order of commits in each group/release within the changelog.
-# Allowed values: newest, oldest
-sort_commits = "newest"
-# Process submodules commits
-recurse_submodules = false
-
-#[remote.github]
-#owner = "go-openapi"
diff --git a/vendor/github.com/go-openapi/jsonpointer/.gitignore b/vendor/github.com/go-openapi/jsonpointer/.gitignore
index 885dc27ab0..d8f4186fe5 100644
--- a/vendor/github.com/go-openapi/jsonpointer/.gitignore
+++ b/vendor/github.com/go-openapi/jsonpointer/.gitignore
@@ -3,4 +3,3 @@
.idea
.env
.mcp.json
-.claude/
diff --git a/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md b/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md
index 2ebebedc15..9990f4a354 100644
--- a/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md
+++ b/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md
@@ -4,11 +4,11 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 12 | 101 |
+| 13 | 111 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
-| @fredbi | 54 | |
+| @fredbi | 63 | |
| @casualjim | 33 | |
| @magodo | 3 | |
| @youyuanwu | 3 | |
@@ -18,7 +18,8 @@
| @ianlancetaylor | 1 | |
| @mfleader | 1 | |
| @Neo2308 | 1 | |
+| @alexandear | 1 | |
| @olivierlemasle | 1 | |
| @testwill | 1 | |
- _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/vendor/github.com/go-openapi/jsonpointer/NOTICE b/vendor/github.com/go-openapi/jsonpointer/NOTICE
index f3b51939a9..201908d2f0 100644
--- a/vendor/github.com/go-openapi/jsonpointer/NOTICE
+++ b/vendor/github.com/go-openapi/jsonpointer/NOTICE
@@ -18,7 +18,7 @@ It ships with copies of other software which license terms are recalled below.
The original software was authored on 25-02-2013 by sigu-399 (https://github.com/sigu-399, sigu.399@gmail.com).
-github.com/sigh-399/jsonpointer
+github.com/sigu-399/jsonpointer
===========================
// SPDX-FileCopyrightText: Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
diff --git a/vendor/github.com/go-openapi/jsonpointer/README.md b/vendor/github.com/go-openapi/jsonpointer/README.md
index c52803e2e8..24fbe1bf68 100644
--- a/vendor/github.com/go-openapi/jsonpointer/README.md
+++ b/vendor/github.com/go-openapi/jsonpointer/README.md
@@ -16,17 +16,25 @@ An implementation of JSON Pointer for golang, which supports go `struct`.
## Announcements
-* **2025-12-19** : new community chat on discord
- * a new discord community channel is available to be notified of changes and support users
- * our venerable Slack channel remains open, and will be eventually discontinued on **2026-03-31**
-
-You may join the discord community by clicking the invite link on the discord badge (also above). [![Discord Channel][discord-badge]][discord-url]
-
-Or join our Slack channel: [![Slack Channel][slack-logo]![slack-badge]][slack-url]
+* **2026-04-15** : added support for trailing "-" for arrays (v0.23.0)
+ * this brings full support of [RFC6901][RFC6901]
+ * this is supported for types relying on the reflection-based implemented
+ * API semantics remain essentially unaltered. Exception: `Pointer.Set(document any,value any) (document any, err error)`
+ can only perform a best-effort to mutate the input document in place. In the case of adding elements to an array with a
+ trailing "-", either pass a mutable array (`*[]T`) as the input document, or use the returned updated document instead.
+ * types that implement the `JSONSetable` interface may not implement the mutation implied by the trailing "-"
+
+* **2026-04-15** : added support for optional alternate JSON name providers
+ * for struct support the defaults might not suit all situations: there are known limitations
+ when it comes to handle untagged fields or embedded types.
+ * the default name provider in use is not fully aligned with go JSON stdlib
+ * exposed an option (or global setting) to change the provider that resolves a struct into json keys
+ * the default behavior is not altered
+ * a new alternate name provider is added (imported from `go-openapi/swag/jsonname`), aligned with JSON stdlib behavior
## Status
-API is stable.
+API is stable and feature-complete.
## Import this library in your project
@@ -88,7 +96,7 @@ See
-also known as [RFC6901](https://www.rfc-editor.org/rfc/rfc6901)
+also known as [RFC6901][RFC6901].
## Licensing
@@ -99,19 +107,19 @@ on top of which it has been built.
## Limitations
-The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array,
-the reference token MUST contain either...' is not implemented.
-
-That is because our implementation of the JSON pointer only supports explicit references to array elements:
-the provision in the spec to resolve non-existent members as "the last element in the array",
-using the special trailing character "-" is not implemented.
+* [RFC6901][RFC6901] is now fully supported, including trailing "-" semantics for arrays (for `Set` operations).
+* Default behavior: JSON name detection in go `struct`s
+ - Unlike go standard marshaling, untagged fields do not default to the go field name and are ignored.
+ - anonymous fields are not traversed if untagged
+ - the above limitations may be overcome by calling `UseGoNameProvider()` at initialization time.
+ - alternatively, users may inject the desired custom behavior for naming fields as an option.
## Other documentation
* [All-time contributors](./CONTRIBUTORS.md)
-* [Contributing guidelines](.github/CONTRIBUTING.md)
-* [Maintainers documentation](docs/MAINTAINERS.md)
-* [Code style](docs/STYLE.md)
+* [Contributing guidelines][contributing-doc-site]
+* [Maintainers documentation][maintainers-doc-site]
+* [Code style][style-doc-site]
## Cutting a new release
@@ -142,11 +150,8 @@ Maintainers can cut a new release by either:
[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/jsonpointer
[godoc-url]: http://pkg.go.dev/github.com/go-openapi/jsonpointer
-[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png
-[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
-[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
@@ -156,3 +161,8 @@ Maintainers can cut a new release by either:
[goversion-url]: https://github.com/go-openapi/jsonpointer/blob/master/go.mod
[top-badge]: https://img.shields.io/github/languages/top/go-openapi/jsonpointer
[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/jsonpointer/latest
+[RFC6901]: https://www.rfc-editor.org/rfc/rfc6901
+
+[contributing-doc-site]: https://go-openapi.github.io/doc-site/contributing/contributing/index.html
+[maintainers-doc-site]: https://go-openapi.github.io/doc-site/maintainers/index.html
+[style-doc-site]: https://go-openapi.github.io/doc-site/contributing/style/index.html
diff --git a/vendor/github.com/go-openapi/jsonpointer/errors.go b/vendor/github.com/go-openapi/jsonpointer/errors.go
index 8c50dde8bc..8813474d44 100644
--- a/vendor/github.com/go-openapi/jsonpointer/errors.go
+++ b/vendor/github.com/go-openapi/jsonpointer/errors.go
@@ -16,12 +16,24 @@ const (
ErrPointer pointerError = "JSON pointer error"
// ErrInvalidStart states that a JSON pointer must start with a separator ("/").
- ErrInvalidStart pointerError = `JSON pointer must be empty or start with a "` + pointerSeparator
+ ErrInvalidStart pointerError = `JSON pointer must be empty or start with a "` + pointerSeparator + `"`
// ErrUnsupportedValueType indicates that a value of the wrong type is being set.
ErrUnsupportedValueType pointerError = "only structs, pointers, maps and slices are supported for setting values"
+
+ // ErrDashToken indicates use of the RFC 6901 "-" reference token
+ // in a context where it cannot be resolved.
+ //
+ // Per RFC 6901 §4 the "-" token refers to the (nonexistent) element
+ // after the last array element. It may only be used as the terminal
+ // token of a [Pointer.Set] against a slice, where it means "append".
+ // Any other use (get, offset, intermediate traversal, non-slice target)
+ // is an error condition that wraps this sentinel.
+ ErrDashToken pointerError = `the "-" array token cannot be resolved here` //nolint:gosec // G101 false positive: this is a JSON Pointer reference token, not a credential.
)
+const dashToken = "-"
+
func errNoKey(key string) error {
return fmt.Errorf("object has no key %q: %w", key, ErrPointer)
}
@@ -33,3 +45,15 @@ func errOutOfBounds(length, idx int) error {
func errInvalidReference(token string) error {
return fmt.Errorf("invalid token reference %q: %w", token, ErrPointer)
}
+
+func errDashOnGet() error {
+ return fmt.Errorf("cannot resolve %q token on get: %w: %w", dashToken, ErrDashToken, ErrPointer)
+}
+
+func errDashIntermediate() error {
+ return fmt.Errorf("the %q token may only appear as the terminal token of a pointer: %w: %w", dashToken, ErrDashToken, ErrPointer)
+}
+
+func errDashOnOffset() error {
+ return fmt.Errorf("cannot compute offset for %q token (nonexistent element): %w: %w", dashToken, ErrDashToken, ErrPointer)
+}
diff --git a/vendor/github.com/go-openapi/jsonpointer/ifaces.go b/vendor/github.com/go-openapi/jsonpointer/ifaces.go
new file mode 100644
index 0000000000..1e56ac0442
--- /dev/null
+++ b/vendor/github.com/go-openapi/jsonpointer/ifaces.go
@@ -0,0 +1,47 @@
+// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonpointer
+
+import "reflect"
+
+// JSONPointable is an interface for structs to implement,
+// when they need to customize the json pointer process or want to avoid the use of reflection.
+type JSONPointable interface {
+ // JSONLookup returns a value pointed at this (unescaped) key.
+ JSONLookup(key string) (any, error)
+}
+
+// JSONSetable is an interface for structs to implement,
+// when they need to customize the json pointer process or want to avoid the use of reflection.
+//
+// # Handling of the RFC 6901 "-" token
+//
+// When a type implementing JSONSetable is the terminal parent of a [Pointer.Set]
+// call, the library passes the raw reference token to JSONSet without
+// interpretation. In particular, the RFC 6901 "-" token (which conventionally
+// means "append" for arrays, per RFC 6902) is forwarded verbatim as the key
+// argument. Implementations that model an array-like container are expected
+// to give "-" the append semantics; implementations that do not should return
+// an error wrapping [ErrDashToken] (or [ErrPointer]) for clarity.
+//
+// Implementations are responsible for any in-place mutation: the library does
+// not attempt to rebind the result of JSONSet into a parent container.
+type JSONSetable interface {
+ // JSONSet sets the value pointed at the (unescaped) key.
+ //
+ // The key may be the RFC 6901 "-" token when the pointer targets a
+ // slice-like member; see the interface documentation for details.
+ JSONSet(key string, value any) error
+}
+
+// NameProvider knows how to resolve go struct fields into json names.
+//
+// The default provider is brought by [github.com/go-openapi/swag/jsonname.DefaultJSONNameProvider].
+type NameProvider interface {
+ // GetGoName gets the go name for a json property name
+ GetGoName(subject any, name string) (string, bool)
+
+ // GetGoNameForType gets the go name for a given type for a json property name
+ GetGoNameForType(tpe reflect.Type, name string) (string, bool)
+}
diff --git a/vendor/github.com/go-openapi/jsonpointer/options.go b/vendor/github.com/go-openapi/jsonpointer/options.go
new file mode 100644
index 0000000000..d52caab222
--- /dev/null
+++ b/vendor/github.com/go-openapi/jsonpointer/options.go
@@ -0,0 +1,86 @@
+// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonpointer
+
+import (
+ "sync"
+
+ "github.com/go-openapi/swag/jsonname"
+)
+
+// Option to tune the behavior of a JSON [Pointer].
+type Option func(*options)
+
+var (
+ //nolint:gochecknoglobals // package level defaults are provided as a convenient, backward-compatible way to adopt options.
+ defaultOptions = options{
+ provider: jsonname.DefaultJSONNameProvider,
+ }
+ //nolint:gochecknoglobals // guards defaultOptions against concurrent SetDefaultNameProvider / read races (testing)
+ defaultOptionsMu sync.RWMutex
+)
+
+// SetDefaultNameProvider sets the [NameProvider] as a package-level default.
+//
+// By default, the default provider is [jsonname.DefaultJSONNameProvider].
+//
+// It is safe to call concurrently with [Pointer.Get], [Pointer.Set],
+// [GetForToken] and [SetForToken]. The typical usage is to call it once
+// at initialization time.
+//
+// A nil provider is ignored.
+func SetDefaultNameProvider(provider NameProvider) {
+ if provider == nil {
+ return
+ }
+
+ defaultOptionsMu.Lock()
+ defer defaultOptionsMu.Unlock()
+
+ defaultOptions.provider = provider
+}
+
+// UseGoNameProvider sets the [NameProvider] as a package-level default
+// to the alternative provider [jsonname.GoNameProvider], that covers a few areas
+// not supported by the default name provider.
+//
+// This implementation supports untagged exported fields and embedded types in go struct.
+// It follows strictly the behavior of the JSON standard library regarding field naming conventions.
+//
+// It is safe to call concurrently with [Pointer.Get], [Pointer.Set],
+// [GetForToken] and [SetForToken]. The typical usage is to call it once
+// at initialization time.
+func UseGoNameProvider() {
+ SetDefaultNameProvider(jsonname.NewGoNameProvider())
+}
+
+// DefaultNameProvider returns the current package-level [NameProvider].
+func DefaultNameProvider() NameProvider { //nolint:ireturn // returning the interface is the point — callers pick their own implementation.
+ defaultOptionsMu.RLock()
+ defer defaultOptionsMu.RUnlock()
+
+ return defaultOptions.provider
+}
+
+// WithNameProvider injects a custom [NameProvider] to resolve json names from go struct types.
+func WithNameProvider(provider NameProvider) Option {
+ return func(o *options) {
+ o.provider = provider
+ }
+}
+
+type options struct {
+ provider NameProvider
+}
+
+func optionsWithDefaults(opts []Option) options {
+ var o options
+ o.provider = DefaultNameProvider()
+
+ for _, apply := range opts {
+ apply(&o)
+ }
+
+ return o
+}
diff --git a/vendor/github.com/go-openapi/jsonpointer/pointer.go b/vendor/github.com/go-openapi/jsonpointer/pointer.go
index 7df49af3b9..2369c1827e 100644
--- a/vendor/github.com/go-openapi/jsonpointer/pointer.go
+++ b/vendor/github.com/go-openapi/jsonpointer/pointer.go
@@ -11,8 +11,6 @@ import (
"reflect"
"strconv"
"strings"
-
- "github.com/go-openapi/swag/jsonname"
)
const (
@@ -20,20 +18,6 @@ const (
pointerSeparator = `/`
)
-// JSONPointable is an interface for structs to implement,
-// when they need to customize the json pointer process or want to avoid the use of reflection.
-type JSONPointable interface {
- // JSONLookup returns a value pointed at this (unescaped) key.
- JSONLookup(key string) (any, error)
-}
-
-// JSONSetable is an interface for structs to implement,
-// when they need to customize the json pointer process or want to avoid the use of reflection.
-type JSONSetable interface {
- // JSONSet sets the value pointed at the (unescaped) key.
- JSONSet(key string, value any) error
-}
-
// Pointer is a representation of a json pointer.
//
// Use [Pointer.Get] to retrieve a value or [Pointer.Set] to set a value.
@@ -41,7 +25,7 @@ type JSONSetable interface {
// It works with any go type interpreted as a JSON document, which means:
//
// - if a type implements [JSONPointable], its [JSONPointable.JSONLookup] method is used to resolve [Pointer.Get]
-// - if a type implements [JSONSetable], its [JSONPointable.JSONSet] method is used to resolve [Pointer.Set]
+// - if a type implements [JSONSetable], its [JSONSetable.JSONSet] method is used to resolve [Pointer.Set]
// - a go map[K]V is interpreted as an object, with type K assignable to a string
// - a go slice []T is interpreted as an array
// - a go struct is interpreted as an object, with exported fields interpreted as keys
@@ -71,16 +55,35 @@ func New(jsonPointerString string) (Pointer, error) {
// Get uses the pointer to retrieve a value from a JSON document.
//
// It returns the value with its type as a [reflect.Kind] or an error.
-func (p *Pointer) Get(document any) (any, reflect.Kind, error) {
- return p.get(document, jsonname.DefaultJSONNameProvider)
+func (p *Pointer) Get(document any, opts ...Option) (any, reflect.Kind, error) {
+ o := optionsWithDefaults(opts)
+
+ return p.get(document, o.provider)
}
// Set uses the pointer to set a value from a data type
// that represent a JSON document.
//
-// It returns the updated document.
-func (p *Pointer) Set(document any, value any) (any, error) {
- return document, p.set(document, value, jsonname.DefaultJSONNameProvider)
+// # Mutation contract
+//
+// Set mutates the provided document in place whenever Go's type system allows
+// it: when document is a map, a pointer, or when the targeted value is reached
+// through an addressable ancestor (e.g. a struct field traversed via a pointer,
+// a slice element). Callers that rely on this in-place behavior may continue
+// to ignore the returned document.
+//
+// The returned document is only load-bearing when Set cannot mutate in place.
+// This happens in one specific case: appending to a top-level slice passed by
+// value (e.g. document of type []T rather than *[]T) via the RFC 6901 "-"
+// terminal token. reflect.Append produces a new slice header that the library
+// cannot rebind into the caller's variable; the updated document is returned
+// instead. Pass *[]T if you want in-place rebind for that case as well.
+//
+// See [ErrDashToken] for the semantics of the "-" token.
+func (p *Pointer) Set(document any, value any, opts ...Option) (any, error) {
+ o := optionsWithDefaults(opts)
+
+ return p.set(document, value, o.provider)
}
// DecodedTokens returns the decoded (unescaped) tokens of this JSON pointer.
@@ -109,6 +112,46 @@ func (p *Pointer) String() string {
return pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator)
}
+// Offset returns the byte offset, in the raw JSON text of document, of the
+// location referenced by this pointer's terminal token.
+//
+// Unlike [Pointer.Get] and [Pointer.Set], which operate on a decoded Go value,
+// Offset operates directly on the textual JSON source. It drives an
+// [encoding/json.Decoder] over the string and stops at the terminal token,
+// returning the position at which the decoder was about to read that token.
+//
+// It is primarily intended for tooling that needs to map a pointer back to a
+// region of the original source: reporting line/column for validation or
+// parse diagnostics, extracting a sub-document by slicing the raw bytes, or
+// highlighting the referenced span in an editor.
+//
+// # Offset semantics
+//
+// The meaning of the returned offset depends on whether the terminal token
+// addresses an object property or an array element:
+//
+// - Object property: the offset points to the first byte of the key (its
+// opening quote character), not to the associated value. For example,
+// pointer "/foo/bar" against {"foo": {"bar": 21}} returns 9, the index of
+// the opening quote of "bar".
+// - Array element: the offset points to the first byte of the value at that
+// index. For example, pointer "/0/1" against [[1,2], [3,4]] returns 4,
+// the index of the digit 2.
+//
+// # Errors
+//
+// Offset returns an error in any of these cases:
+//
+// - document is not syntactically valid JSON;
+// - the structure of document does not match the pointer (e.g. traversing
+// into a scalar, or a token that is neither a valid key nor a valid
+// numeric index);
+// - a referenced key or index does not exist in document;
+// - the pointer's terminal token is the RFC 6901 "-" array token, which
+// designates a nonexistent element and therefore has no offset in the
+// source. The returned error wraps [ErrDashToken].
+//
+// All errors wrap [ErrPointer].
func (p *Pointer) Offset(document string) (int64, error) {
dec := json.NewDecoder(strings.NewReader(document))
var offset int64
@@ -137,7 +180,35 @@ func (p *Pointer) Offset(document string) (int64, error) {
return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer)
}
}
- return offset, nil
+ return skipJSONSeparator(document, offset), nil
+}
+
+// skipJSONSeparator advances offset past trailing JSON whitespace and at most
+// one value separator (comma) in document, so the result points at the first
+// byte of the next JSON token.
+//
+// The streaming decoder's InputOffset sits right after the most recently
+// consumed token, which between values is the comma (or whitespace) — not
+// the following token. Normalizing here keeps Offset's contract uniform:
+// for both object keys and array elements, and regardless of position within
+// the parent container, the returned offset always points at the first byte
+// of the addressed token.
+func skipJSONSeparator(document string, offset int64) int64 {
+ n := int64(len(document))
+ for offset < n && isJSONWhitespace(document[offset]) {
+ offset++
+ }
+ if offset < n && document[offset] == ',' {
+ offset++
+ }
+ for offset < n && isJSONWhitespace(document[offset]) {
+ offset++
+ }
+ return offset
+}
+
+func isJSONWhitespace(c byte) bool {
+ return c == ' ' || c == '\t' || c == '\n' || c == '\r'
}
// "Constructor", parses the given string JSON pointer.
@@ -157,9 +228,9 @@ func (p *Pointer) parse(jsonPointerString string) error {
return nil
}
-func (p *Pointer) get(node any, nameProvider *jsonname.NameProvider) (any, reflect.Kind, error) {
+func (p *Pointer) get(node any, nameProvider NameProvider) (any, reflect.Kind, error) {
if nameProvider == nil {
- nameProvider = jsonname.DefaultJSONNameProvider
+ nameProvider = defaultOptions.provider
}
kind := reflect.Invalid
@@ -185,50 +256,130 @@ func (p *Pointer) get(node any, nameProvider *jsonname.NameProvider) (any, refle
return node, kind, nil
}
-func (p *Pointer) set(node, data any, nameProvider *jsonname.NameProvider) error {
+func (p *Pointer) set(node, data any, nameProvider NameProvider) (any, error) {
knd := reflect.ValueOf(node).Kind()
if knd != reflect.Pointer && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array {
- return errors.Join(
+ return node, errors.Join(
fmt.Errorf("unexpected type: %T", node), //nolint:err113 // err wrapping is carried out by errors.Join, not fmt.Errorf.
ErrUnsupportedValueType,
ErrPointer,
)
}
- l := len(p.referenceTokens)
-
// full document when empty
- if l == 0 {
- return nil
+ if len(p.referenceTokens) == 0 {
+ return node, nil
}
if nameProvider == nil {
- nameProvider = jsonname.DefaultJSONNameProvider
+ nameProvider = defaultOptions.provider
}
- var decodedToken string
- lastIndex := l - 1
+ return p.setAt(node, p.referenceTokens, data, nameProvider)
+}
- if lastIndex > 0 { // skip if we only have one token in pointer
- for _, token := range p.referenceTokens[:lastIndex] {
- decodedToken = Unescape(token)
- next, err := p.resolveNodeForToken(node, decodedToken, nameProvider)
- if err != nil {
- return err
- }
+// setAt recursively walks the token list, setting the data at the terminal
+// token and rebinding any new child reference (e.g. a slice header returned
+// by an "-" append) into its parent on the way back up.
+//
+// Returning the (possibly new) node at each level is what makes append work
+// at any depth without requiring the caller to pass a pointer to the
+// containing slice: the new slice header propagates up and each parent
+// rebinds it via the appropriate kind-specific setter.
+func (p *Pointer) setAt(node any, tokens []string, data any, nameProvider NameProvider) (any, error) {
+ decodedToken := Unescape(tokens[0])
+
+ if len(tokens) == 1 {
+ return setSingleImpl(node, data, decodedToken, nameProvider)
+ }
- node = next
- }
+ child, err := p.resolveNodeForToken(node, decodedToken, nameProvider)
+ if err != nil {
+ return node, err
+ }
+
+ newChild, err := p.setAt(child, tokens[1:], data, nameProvider)
+ if err != nil {
+ return node, err
}
- // last token
- decodedToken = Unescape(p.referenceTokens[lastIndex])
+ return rebindChild(node, decodedToken, newChild, nameProvider)
+}
+
+// rebindChild writes newChild back into node at decodedToken.
+//
+// For cases where the child was already mutated in place (pointer aliasing,
+// addressable slice elements) the rebind is a safe no-op. For cases where
+// the child was returned by value (map entries holding a slice, slices
+// reached through a non-addressable ancestor), the rebind propagates the
+// new value into the parent.
+//
+// Parents implementing [JSONPointable] are left alone: they took ownership
+// of the child via JSONLookup and did not opt into a JSONSet-based rebind
+// on intermediate tokens.
+func rebindChild(node any, decodedToken string, newChild any, nameProvider NameProvider) (any, error) {
+ if _, ok := node.(JSONPointable); ok {
+ return node, nil
+ }
+
+ rValue := reflect.Indirect(reflect.ValueOf(node))
+
+ switch rValue.Kind() {
+ case reflect.Struct:
+ nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
+ if !ok {
+ return node, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
+ }
+ fld := rValue.FieldByName(nm)
+ if !fld.CanSet() {
+ return node, nil
+ }
+ assignReflectValue(fld, newChild)
+ return node, nil
+
+ case reflect.Map:
+ rValue.SetMapIndex(reflect.ValueOf(decodedToken), reflect.ValueOf(newChild))
+ return node, nil
+
+ case reflect.Slice:
+ if decodedToken == dashToken {
+ return node, errDashIntermediate()
+ }
+ idx, err := strconv.Atoi(decodedToken)
+ if err != nil {
+ return node, errors.Join(err, ErrPointer)
+ }
+ elem := rValue.Index(idx)
+ if !elem.CanSet() {
+ return node, nil
+ }
+ assignReflectValue(elem, newChild)
+ return node, nil
+
+ default:
+ return node, errInvalidReference(decodedToken)
+ }
+}
- return setSingleImpl(node, data, decodedToken, nameProvider)
+// assignReflectValue assigns src into dst, unwrapping a pointer when dst
+// expects the pointee type. This tolerates the pointer-wrapping performed
+// by [typeFromValue] for addressable fields.
+func assignReflectValue(dst reflect.Value, src any) {
+ nv := reflect.ValueOf(src)
+ if !nv.IsValid() {
+ return
+ }
+ if nv.Type().AssignableTo(dst.Type()) {
+ dst.Set(nv)
+ return
+ }
+ if nv.Kind() == reflect.Pointer && nv.Elem().Type().AssignableTo(dst.Type()) {
+ dst.Set(nv.Elem())
+ }
}
-func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvider *jsonname.NameProvider) (next any, err error) {
+func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvider NameProvider) (next any, err error) {
// check for nil during traversal
if isNil(node) {
return nil, fmt.Errorf("cannot traverse through nil value at %q: %w", decodedToken, ErrPointer)
@@ -272,6 +423,9 @@ func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvide
return typeFromValue(mv), nil
case reflect.Slice:
+ if decodedToken == dashToken {
+ return nil, errDashIntermediate()
+ }
tokenIndex, err := strconv.Atoi(decodedToken)
if err != nil {
return nil, errors.Join(err, ErrPointer)
@@ -312,16 +466,23 @@ func typeFromValue(v reflect.Value) any {
}
// GetForToken gets a value for a json pointer token 1 level deep.
-func GetForToken(document any, decodedToken string) (any, reflect.Kind, error) {
- return getSingleImpl(document, decodedToken, jsonname.DefaultJSONNameProvider)
+func GetForToken(document any, decodedToken string, opts ...Option) (any, reflect.Kind, error) {
+ o := optionsWithDefaults(opts)
+
+ return getSingleImpl(document, decodedToken, o.provider)
}
// SetForToken sets a value for a json pointer token 1 level deep.
-func SetForToken(document any, decodedToken string, value any) (any, error) {
- return document, setSingleImpl(document, value, decodedToken, jsonname.DefaultJSONNameProvider)
+//
+// See [Pointer.Set] for the mutation contract, in particular the handling of
+// the RFC 6901 "-" token on slices.
+func SetForToken(document any, decodedToken string, value any, opts ...Option) (any, error) {
+ o := optionsWithDefaults(opts)
+
+ return setSingleImpl(document, value, decodedToken, o.provider)
}
-func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NameProvider) (any, reflect.Kind, error) {
+func getSingleImpl(node any, decodedToken string, nameProvider NameProvider) (any, reflect.Kind, error) {
rValue := reflect.Indirect(reflect.ValueOf(node))
kind := rValue.Kind()
if isNil(node) {
@@ -361,6 +522,9 @@ func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NamePro
return nil, kind, errNoKey(decodedToken)
case reflect.Slice:
+ if decodedToken == dashToken {
+ return nil, kind, errDashOnGet()
+ }
tokenIndex, err := strconv.Atoi(decodedToken)
if err != nil {
return nil, kind, errors.Join(err, ErrPointer)
@@ -378,14 +542,14 @@ func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NamePro
}
}
-func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.NameProvider) error {
+func setSingleImpl(node, data any, decodedToken string, nameProvider NameProvider) (any, error) {
// check for nil to prevent panic when calling rValue.Type()
if isNil(node) {
- return fmt.Errorf("cannot set field %q on nil value: %w", decodedToken, ErrPointer)
+ return node, fmt.Errorf("cannot set field %q on nil value: %w", decodedToken, ErrPointer)
}
if ns, ok := node.(JSONSetable); ok {
- return ns.JSONSet(decodedToken, data)
+ return node, ns.JSONSet(decodedToken, data)
}
rValue := reflect.Indirect(reflect.ValueOf(node))
@@ -394,12 +558,12 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.N
case reflect.Struct:
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
if !ok {
- return fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
+ return node, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
}
fld := rValue.FieldByName(nm)
if !fld.CanSet() {
- return fmt.Errorf("can't set struct field %s to %v: %w", nm, data, ErrPointer)
+ return node, fmt.Errorf("can't set struct field %s to %v: %w", nm, data, ErrPointer)
}
value := reflect.ValueOf(data)
@@ -407,33 +571,51 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.N
assignedType := fld.Type()
if !valueType.AssignableTo(assignedType) {
- return fmt.Errorf("can't set value with type %T to field %s with type %v: %w", data, nm, assignedType, ErrPointer)
+ return node, fmt.Errorf("can't set value with type %T to field %s with type %v: %w", data, nm, assignedType, ErrPointer)
}
fld.Set(value)
- return nil
+ return node, nil
case reflect.Map:
kv := reflect.ValueOf(decodedToken)
rValue.SetMapIndex(kv, reflect.ValueOf(data))
- return nil
+ return node, nil
case reflect.Slice:
+ if decodedToken == dashToken {
+ // RFC 6901 §4 / RFC 6902 append semantics: terminal "-" appends
+ // the value to the slice. We rebind in place when the slice is
+ // reachable via an addressable ancestor; otherwise we return the
+ // new slice header for the parent (or the public Set) to rebind.
+ value := reflect.ValueOf(data)
+ elemType := rValue.Type().Elem()
+ if !value.Type().AssignableTo(elemType) {
+ return node, fmt.Errorf("can't append value of type %T to slice of %v: %w", data, elemType, ErrPointer)
+ }
+ newSlice := reflect.Append(rValue, value)
+ if rValue.CanSet() {
+ rValue.Set(newSlice)
+ return node, nil
+ }
+ return newSlice.Interface(), nil
+ }
+
tokenIndex, err := strconv.Atoi(decodedToken)
if err != nil {
- return errors.Join(err, ErrPointer)
+ return node, errors.Join(err, ErrPointer)
}
sLength := rValue.Len()
if tokenIndex < 0 || tokenIndex >= sLength {
- return errOutOfBounds(sLength, tokenIndex)
+ return node, errOutOfBounds(sLength, tokenIndex)
}
elem := rValue.Index(tokenIndex)
if !elem.CanSet() {
- return fmt.Errorf("can't set slice index %s to %v: %w", decodedToken, data, ErrPointer)
+ return node, fmt.Errorf("can't set slice index %s to %v: %w", decodedToken, data, ErrPointer)
}
value := reflect.ValueOf(data)
@@ -441,15 +623,15 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.N
assignedType := elem.Type()
if !valueType.AssignableTo(assignedType) {
- return fmt.Errorf("can't set value with type %T to slice element %d with type %v: %w", data, tokenIndex, assignedType, ErrPointer)
+ return node, fmt.Errorf("can't set value with type %T to slice element %d with type %v: %w", data, tokenIndex, assignedType, ErrPointer)
}
elem.Set(value)
- return nil
+ return node, nil
default:
- return errInvalidReference(decodedToken)
+ return node, errInvalidReference(decodedToken)
}
}
@@ -460,24 +642,27 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
if err != nil {
return 0, err
}
- switch tk := tk.(type) {
- case json.Delim:
- switch tk {
- case '{':
- if err = drainSingle(dec); err != nil {
- return 0, err
- }
- case '[':
+ key, ok := tk.(string)
+ if !ok {
+ return 0, fmt.Errorf("invalid key token %#v: %w", tk, ErrPointer)
+ }
+ if key == decodedToken {
+ return offset, nil
+ }
+
+ // Consume the associated value. Scalars are fully read by a single
+ // Token() call; composite values must be drained.
+ tk, err = dec.Token()
+ if err != nil {
+ return 0, err
+ }
+ if delim, isDelim := tk.(json.Delim); isDelim {
+ switch delim {
+ case '{', '[':
if err = drainSingle(dec); err != nil {
return 0, err
}
}
- case string:
- if tk == decodedToken {
- return offset, nil
- }
- default:
- return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer)
}
}
@@ -485,6 +670,9 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
}
func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) {
+ if decodedToken == dashToken {
+ return 0, errDashOnOffset()
+ }
idx, err := strconv.Atoi(decodedToken)
if err != nil {
return 0, fmt.Errorf("token reference %q is not a number: %w: %w", decodedToken, err, ErrPointer)
diff --git a/vendor/github.com/go-openapi/swag/.gitignore b/vendor/github.com/go-openapi/swag/.gitignore
index a0a95a96b3..1680db44c0 100644
--- a/vendor/github.com/go-openapi/swag/.gitignore
+++ b/vendor/github.com/go-openapi/swag/.gitignore
@@ -4,4 +4,3 @@ Godeps
.idea
*.out
.mcp.json
-.claude/
diff --git a/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md b/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md
index bc76fe820c..286878acff 100644
--- a/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md
+++ b/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md
@@ -4,11 +4,11 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 24 | 235 |
+| 24 | 242 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
-| @fredbi | 105 | |
+| @fredbi | 112 | |
| @casualjim | 98 | |
| @alexandear | 4 | |
| @orisano | 3 | |
@@ -33,4 +33,4 @@
| @davidalpert | 1 | |
| @Xe | 1 | |
- _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/vendor/github.com/go-openapi/swag/README.md b/vendor/github.com/go-openapi/swag/README.md
index 834eb2ffb9..64f6671039 100644
--- a/vendor/github.com/go-openapi/swag/README.md
+++ b/vendor/github.com/go-openapi/swag/README.md
@@ -212,7 +212,7 @@ Maintainers can cut a new release by either:
[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
diff --git a/vendor/github.com/go-openapi/swag/SECURITY.md b/vendor/github.com/go-openapi/swag/SECURITY.md
index 72296a8313..1fea2c5736 100644
--- a/vendor/github.com/go-openapi/swag/SECURITY.md
+++ b/vendor/github.com/go-openapi/swag/SECURITY.md
@@ -6,14 +6,32 @@ This policy outlines the commitment and practices of the go-openapi maintainers
| Version | Supported |
| ------- | ------------------ |
-| 0.25.x | :white_check_mark: |
+| O.x | :white_check_mark: |
+
+## Vulnerability checks in place
+
+This repository uses automated vulnerability scans, at every merged commit and at least once a week.
+
+We use:
+
+* [`GitHub CodeQL`][codeql-url]
+* [`trivy`][trivy-url]
+* [`govulncheck`][govulncheck-url]
+
+Reports are centralized in github security reports and visible only to the maintainers.
## Reporting a vulnerability
If you become aware of a security vulnerability that affects the current repository,
-please report it privately to the maintainers.
+**please report it privately to the maintainers**
+rather than opening a publicly visible GitHub issue.
+
+Please follow the instructions provided by github to [Privately report a security vulnerability][github-guidance-url].
-Please follow the instructions provided by github to
-[Privately report a security vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability).
+> [!NOTE]
+> On Github, navigate to the project's "Security" tab then click on "Report a vulnerability".
-TL;DR: on Github, navigate to the project's "Security" tab then click on "Report a vulnerability".
+[codeql-url]: https://github.com/github/codeql
+[trivy-url]: https://trivy.dev/docs/latest/getting-started
+[govulncheck-url]: https://go.dev/blog/govulncheck
+[github-guidance-url]: https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability
diff --git a/vendor/github.com/go-openapi/swag/go.work b/vendor/github.com/go-openapi/swag/go.work
index 1e537f0749..8537cb2a76 100644
--- a/vendor/github.com/go-openapi/swag/go.work
+++ b/vendor/github.com/go-openapi/swag/go.work
@@ -17,4 +17,4 @@ use (
./yamlutils
)
-go 1.24.0
+go 1.25.0
diff --git a/vendor/github.com/go-openapi/swag/jsonname/go_name_provider.go b/vendor/github.com/go-openapi/swag/jsonname/go_name_provider.go
new file mode 100644
index 0000000000..adc4426873
--- /dev/null
+++ b/vendor/github.com/go-openapi/swag/jsonname/go_name_provider.go
@@ -0,0 +1,286 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonname
+
+import (
+ "reflect"
+ "strings"
+ "sync"
+)
+
+var _ providerIface = (*GoNameProvider)(nil)
+
+// GoNameProvider resolves json property names to go struct field names following
+// the same rules as the standard library's [encoding/json] package.
+//
+// Contrary to [NameProvider], it considers exported fields without a json tag,
+// and promotes fields from anonymous embedded struct types.
+//
+// Rules (aligned with encoding/json):
+//
+// - unexported fields are ignored;
+// - a field tagged `json:"-"` is ignored;
+// - a field tagged `json:"-,"` is kept under the json name "-" (stdlib quirk);
+// - a field tagged `json:""` or with no json tag at all keeps its Go name as json name;
+// - anonymous struct fields without an explicit json tag have their fields
+// promoted into the parent, following breadth-first depth rules:
+// a shallower field wins over a deeper one; at equal depth, a conflict
+// discards all conflicting fields unless exactly one has an explicit json tag.
+//
+// This type is safe for concurrent use.
+type GoNameProvider struct {
+ lock sync.Mutex
+ index map[reflect.Type]nameIndex
+}
+
+// NewGoNameProvider creates a new [GoNameProvider].
+func NewGoNameProvider() *GoNameProvider {
+ return &GoNameProvider{
+ index: make(map[reflect.Type]nameIndex),
+ }
+}
+
+// GetJSONNames gets all the json property names for a type.
+func (n *GoNameProvider) GetJSONNames(subject any) []string {
+ n.lock.Lock()
+ defer n.lock.Unlock()
+
+ tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
+ names := n.nameIndexFor(tpe)
+
+ res := make([]string, 0, len(names.jsonNames))
+ for k := range names.jsonNames {
+ res = append(res, k)
+ }
+
+ return res
+}
+
+// GetJSONName gets the json name for a go property name.
+func (n *GoNameProvider) GetJSONName(subject any, name string) (string, bool) {
+ tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
+
+ return n.GetJSONNameForType(tpe, name)
+}
+
+// GetJSONNameForType gets the json name for a go property name on a given type.
+func (n *GoNameProvider) GetJSONNameForType(tpe reflect.Type, name string) (string, bool) {
+ n.lock.Lock()
+ defer n.lock.Unlock()
+
+ names := n.nameIndexFor(tpe)
+ nme, ok := names.goNames[name]
+
+ return nme, ok
+}
+
+// GetGoName gets the go name for a json property name.
+func (n *GoNameProvider) GetGoName(subject any, name string) (string, bool) {
+ tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
+
+ return n.GetGoNameForType(tpe, name)
+}
+
+// GetGoNameForType gets the go name for a given type for a json property name.
+func (n *GoNameProvider) GetGoNameForType(tpe reflect.Type, name string) (string, bool) {
+ n.lock.Lock()
+ defer n.lock.Unlock()
+
+ names := n.nameIndexFor(tpe)
+ nme, ok := names.jsonNames[name]
+
+ return nme, ok
+}
+
+func (n *GoNameProvider) nameIndexFor(tpe reflect.Type) nameIndex {
+ if names, ok := n.index[tpe]; ok {
+ return names
+ }
+
+ names := buildGoNameIndex(tpe)
+ n.index[tpe] = names
+
+ return names
+}
+
+// fieldEntry captures a candidate field discovered while walking a struct
+// along with the indirection path from the root type (used to resolve conflicts
+// by depth in the same way encoding/json does).
+type fieldEntry struct {
+ goName string
+ jsonName string
+ index []int
+ tagged bool
+}
+
+func buildGoNameIndex(tpe reflect.Type) nameIndex {
+ fields := collectGoFields(tpe)
+
+ idx := make(map[string]string, len(fields))
+ reverseIdx := make(map[string]string, len(fields))
+ for _, f := range fields {
+ idx[f.jsonName] = f.goName
+ reverseIdx[f.goName] = f.jsonName
+ }
+
+ return nameIndex{jsonNames: idx, goNames: reverseIdx}
+}
+
+// collectGoFields walks tpe breadth-first along anonymous struct fields,
+// reproducing the field selection performed by encoding/json.typeFields.
+func collectGoFields(tpe reflect.Type) []fieldEntry {
+ if tpe.Kind() != reflect.Struct {
+ return nil
+ }
+
+ type queued struct {
+ typ reflect.Type
+ index []int
+ }
+
+ current := []queued{}
+ next := []queued{{typ: tpe}}
+ visited := map[reflect.Type]bool{tpe: true}
+
+ var (
+ candidates []fieldEntry
+ count = map[string]int{}
+ nextCount = map[string]int{}
+ )
+
+ for len(next) > 0 {
+ current, next = next, current[:0]
+ count, nextCount = nextCount, count
+ for k := range nextCount {
+ delete(nextCount, k)
+ }
+
+ for _, q := range current {
+ for i := 0; i < q.typ.NumField(); i++ {
+ sf := q.typ.Field(i)
+
+ if sf.Anonymous {
+ ft := sf.Type
+ if ft.Kind() == reflect.Ptr {
+ ft = ft.Elem()
+ }
+ if !sf.IsExported() && ft.Kind() != reflect.Struct {
+ continue
+ }
+ } else if !sf.IsExported() {
+ continue
+ }
+
+ tag := sf.Tag.Get("json")
+ if tag == "-" {
+ continue
+ }
+ jsonName, _ := parseJSONTag(tag)
+ tagged := jsonName != ""
+
+ ft := sf.Type
+ if ft.Kind() == reflect.Ptr {
+ ft = ft.Elem()
+ }
+
+ if sf.Anonymous && ft.Kind() == reflect.Struct && !tagged {
+ if visited[ft] {
+ continue
+ }
+ visited[ft] = true
+
+ index := make([]int, len(q.index)+1)
+ copy(index, q.index)
+ index[len(q.index)] = i
+ next = append(next, queued{typ: ft, index: index})
+
+ continue
+ }
+
+ name := jsonName
+ if name == "" {
+ name = sf.Name
+ }
+
+ index := make([]int, len(q.index)+1)
+ copy(index, q.index)
+ index[len(q.index)] = i
+
+ candidates = append(candidates, fieldEntry{
+ goName: sf.Name,
+ jsonName: name,
+ index: index,
+ tagged: tagged,
+ })
+ nextCount[name]++
+ }
+ }
+ }
+
+ return dominantFields(candidates)
+}
+
+// dominantFields applies the Go encoding/json conflict resolution rules:
+// at each JSON name, the shallowest field wins; at equal depth, a uniquely
+// tagged candidate wins; otherwise all candidates for that name are dropped.
+func dominantFields(candidates []fieldEntry) []fieldEntry {
+ byName := make(map[string][]fieldEntry, len(candidates))
+ for _, c := range candidates {
+ byName[c.jsonName] = append(byName[c.jsonName], c)
+ }
+
+ out := make([]fieldEntry, 0, len(byName))
+ for _, group := range byName {
+ if len(group) == 1 {
+ out = append(out, group[0])
+
+ continue
+ }
+
+ minDepth := len(group[0].index)
+ for _, c := range group[1:] {
+ if len(c.index) < minDepth {
+ minDepth = len(c.index)
+ }
+ }
+
+ var shallow []fieldEntry
+ for _, c := range group {
+ if len(c.index) == minDepth {
+ shallow = append(shallow, c)
+ }
+ }
+
+ if len(shallow) == 1 {
+ out = append(out, shallow[0])
+
+ continue
+ }
+
+ var tagged []fieldEntry
+ for _, c := range shallow {
+ if c.tagged {
+ tagged = append(tagged, c)
+ }
+ }
+ if len(tagged) == 1 {
+ out = append(out, tagged[0])
+ }
+ }
+
+ return out
+}
+
+// parseJSONTag returns the name component of a json struct tag and whether
+// it carried any non-name option (kept for future-proofing, e.g. "omitempty").
+func parseJSONTag(tag string) (string, string) {
+ if tag == "" {
+ return "", ""
+ }
+ if idx := strings.IndexByte(tag, ','); idx >= 0 {
+ return tag[:idx], tag[idx+1:]
+ }
+
+ return tag, ""
+}
diff --git a/vendor/github.com/go-openapi/swag/jsonname/ifaces.go b/vendor/github.com/go-openapi/swag/jsonname/ifaces.go
new file mode 100644
index 0000000000..812ace5639
--- /dev/null
+++ b/vendor/github.com/go-openapi/swag/jsonname/ifaces.go
@@ -0,0 +1,14 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonname
+
+import "reflect"
+
+// providerIface is an unexported compile-time contract that every name provider
+// in this package is expected to satisfy.
+// It mirrors the interface declared by the main consumer of this module: [github.com/go-openapi/jsonpointer.NameProvider].
+type providerIface interface {
+ GetGoName(subject any, name string) (string, bool)
+ GetGoNameForType(tpe reflect.Type, name string) (string, bool)
+}
diff --git a/vendor/github.com/go-openapi/swag/jsonname/name_provider.go b/vendor/github.com/go-openapi/swag/jsonname/name_provider.go
index 8eaf1bece8..9f5da7a016 100644
--- a/vendor/github.com/go-openapi/swag/jsonname/name_provider.go
+++ b/vendor/github.com/go-openapi/swag/jsonname/name_provider.go
@@ -12,6 +12,8 @@ import (
// DefaultJSONNameProvider is the default cache for types.
var DefaultJSONNameProvider = NewNameProvider()
+var _ providerIface = (*NameProvider)(nil)
+
// NameProvider represents an object capable of translating from go property names
// to json property names.
//
diff --git a/vendor/github.com/gregjones/httpcache/.travis.yml b/vendor/github.com/gregjones/httpcache/.travis.yml
deleted file mode 100644
index 597bc9996f..0000000000
--- a/vendor/github.com/gregjones/httpcache/.travis.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-sudo: false
-language: go
-matrix:
- allow_failures:
- - go: master
- fast_finish: true
- include:
- - go: 1.10.x
- - go: 1.11.x
- env: GOFMT=1
- - go: master
-install:
- - # Do nothing. This is needed to prevent default install action "go get -t -v ./..." from happening here (we want it to happen inside script step).
-script:
- - go get -t -v ./...
- - if test -n "${GOFMT}"; then gofmt -w -s . && git diff --exit-code; fi
- - go tool vet .
- - go test -v -race ./...
diff --git a/vendor/github.com/gregjones/httpcache/README.md b/vendor/github.com/gregjones/httpcache/README.md
deleted file mode 100644
index 51e7d23d09..0000000000
--- a/vendor/github.com/gregjones/httpcache/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-httpcache
-=========
-
-[](https://travis-ci.org/gregjones/httpcache) [](https://godoc.org/github.com/gregjones/httpcache)
-
-Package httpcache provides a http.RoundTripper implementation that works as a mostly [RFC 7234](https://tools.ietf.org/html/rfc7234) compliant cache for http responses.
-
-It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client and not for a shared proxy).
-
-This project isn't actively maintained; it works for what I, and seemingly others, want to do with it, and I consider it "done". That said, if you find any issues, please open a Pull Request and I will try to review it. Any changes now that change the public API won't be considered.
-
-Cache Backends
---------------
-
-- The built-in 'memory' cache stores responses in an in-memory map.
-- [`github.com/gregjones/httpcache/diskcache`](https://github.com/gregjones/httpcache/tree/master/diskcache) provides a filesystem-backed cache using the [diskv](https://github.com/peterbourgon/diskv) library.
-- [`github.com/gregjones/httpcache/memcache`](https://github.com/gregjones/httpcache/tree/master/memcache) provides memcache implementations, for both App Engine and 'normal' memcache servers.
-- [`sourcegraph.com/sourcegraph/s3cache`](https://sourcegraph.com/github.com/sourcegraph/s3cache) uses Amazon S3 for storage.
-- [`github.com/gregjones/httpcache/leveldbcache`](https://github.com/gregjones/httpcache/tree/master/leveldbcache) provides a filesystem-backed cache using [leveldb](https://github.com/syndtr/goleveldb/leveldb).
-- [`github.com/die-net/lrucache`](https://github.com/die-net/lrucache) provides an in-memory cache that will evict least-recently used entries.
-- [`github.com/die-net/lrucache/twotier`](https://github.com/die-net/lrucache/tree/master/twotier) allows caches to be combined, for example to use lrucache above with a persistent disk-cache.
-- [`github.com/birkelund/boltdbcache`](https://github.com/birkelund/boltdbcache) provides a BoltDB implementation (based on the [bbolt](https://github.com/coreos/bbolt) fork).
-
-If you implement any other backend and wish it to be linked here, please send a PR editing this file.
-
-License
--------
-
-- [MIT License](LICENSE.txt)
diff --git a/vendor/github.com/mattn/go-sqlite3/README.md b/vendor/github.com/mattn/go-sqlite3/README.md
index aaec188b29..fd2ef5524d 100644
--- a/vendor/github.com/mattn/go-sqlite3/README.md
+++ b/vendor/github.com/mattn/go-sqlite3/README.md
@@ -182,6 +182,7 @@ go build -tags "icu json1 fts5 secure_delete"
| Tracing / Debug | sqlite_trace | Activate trace functions |
| User Authentication | sqlite_userauth | SQLite User Authentication see [User Authentication](#user-authentication) for more information. |
| Virtual Tables | sqlite_vtable | SQLite Virtual Tables see [SQLite Official VTABLE Documentation](https://www.sqlite.org/vtab.html) for more information, and a [full example here](https://github.com/mattn/go-sqlite3/tree/master/_example/vtable) |
+| The DBSTAT Virtual Table | sqlite_dbstat | The DBSTAT virtual table is a read-only virtual table that returns information about the amount of disk space used to store the content of an SQLite database. See [SQLite Official Documentation](https://www.sqlite.org/dbstat.html) for more information. |
# Compilation
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c b/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c
index 97f3008098..28c9106004 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c
@@ -1,7 +1,7 @@
#ifndef USE_LIBSQLITE3
/******************************************************************************
** This file is an amalgamation of many separate C source files from SQLite
-** version 3.53.0. By combining all the individual C code files into this
+** version 3.53.2. By combining all the individual C code files into this
** single large file, the entire code can be compiled as a single translation
** unit. This allows many compilers to do optimizations that would not be
** possible if the files were compiled separately. Performance improvements
@@ -19,7 +19,7 @@
** separate file. This file contains only code for the core SQLite library.
**
** The content in this amalgamation comes from Fossil check-in
-** 4525003a53a7fc63ca75c59b22c79608659c with changes in files:
+** d6e03d8c777cfa2d35e3b60d8ec3e0187f3e with changes in files:
**
**
*/
@@ -468,12 +468,12 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
-#define SQLITE_VERSION "3.53.0"
-#define SQLITE_VERSION_NUMBER 3053000
-#define SQLITE_SOURCE_ID "2026-04-09 11:41:38 4525003a53a7fc63ca75c59b22c79608659ca12f0131f52c18637f829977f20b"
-#define SQLITE_SCM_BRANCH "trunk"
-#define SQLITE_SCM_TAGS "release major-release version-3.53.0"
-#define SQLITE_SCM_DATETIME "2026-04-09T11:41:38.498Z"
+#define SQLITE_VERSION "3.53.2"
+#define SQLITE_VERSION_NUMBER 3053002
+#define SQLITE_SOURCE_ID "2026-06-03 19:12:13 d6e03d8c777cfa2d35e3b60d8ec3e0187f3e9f99d8e2ee9cac695fd6fcdf1a24"
+#define SQLITE_SCM_BRANCH "branch-3.53"
+#define SQLITE_SCM_TAGS "release version-3.53.2"
+#define SQLITE_SCM_DATETIME "2026-06-03T19:12:13.350Z"
/*
** CAPI3REF: Run-Time Library Version Numbers
@@ -13175,11 +13175,23 @@ SQLITE_API int sqlite3changeset_apply_v3(
** database behave as if they were declared with "ON UPDATE NO ACTION ON
** DELETE NO ACTION", even if they are actually CASCADE, RESTRICT, SET NULL
** or SET DEFAULT.
+**
+**
SQLITE_CHANGESETAPPLY_NOUPDATELOOP
+** Sometimes, a changeset contains two or more update statements such that
+** although after applying all updates the database will contain no
+** constraint violations, no single update can be applied before the others.
+** The simplest example of this is a pair of UPDATEs that have "swapped"
+** two column values with a UNIQUE constraint.
+**
+** Usually, sqlite3changeset_apply() and similar functions work hard to try
+** to find a way to apply such a changeset. However, if this flag is set,
+** then all such updates are considered CONSTRAINT conflicts.
*/
#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001
#define SQLITE_CHANGESETAPPLY_INVERT 0x0002
#define SQLITE_CHANGESETAPPLY_IGNORENOOP 0x0004
#define SQLITE_CHANGESETAPPLY_FKNOACTION 0x0008
+#define SQLITE_CHANGESETAPPLY_NOUPDATELOOP 0x0010
/*
** CAPI3REF: Constants Passed To The Conflict Handler
@@ -22449,7 +22461,15 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(void);
SQLITE_PRIVATE void sqlite3AlterRenameTable(Parse*, SrcList*, Token*);
SQLITE_PRIVATE void sqlite3AlterRenameColumn(Parse*, SrcList*, Token*, Token*);
SQLITE_PRIVATE void sqlite3AlterDropConstraint(Parse*,SrcList*,Token*,Token*);
-SQLITE_PRIVATE void sqlite3AlterAddConstraint(Parse*,SrcList*,Token*,Token*,const char*,int);
+SQLITE_PRIVATE void sqlite3AlterAddConstraint(
+ Parse *pParse, /* Parse context */
+ SrcList *pSrc, /* Table to add constraint to */
+ Token *pFirst, /* First token of new constraint */
+ Token *pName, /* Name of new constraint. NULL if name omitted. */
+ const char *zExpr, /* Text of CHECK expression */
+ int nExpr, /* Size of pExpr in bytes */
+ Expr *pExpr /* The parsed CHECK expression */
+);
SQLITE_PRIVATE void sqlite3AlterSetNotNull(Parse*, SrcList*, Token*, Token*);
SQLITE_PRIVATE i64 sqlite3GetToken(const unsigned char *, int *);
SQLITE_PRIVATE void sqlite3NestedParse(Parse*, const char*, ...);
@@ -32514,7 +32534,7 @@ static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){
sqlite3StrAccumSetError(pAccum, SQLITE_TOOBIG);
return 0;
}
- z = sqlite3DbMallocRaw(pAccum->db, n);
+ z = sqlite3_malloc(n);
if( z==0 ){
sqlite3StrAccumSetError(pAccum, SQLITE_NOMEM);
}
@@ -32972,11 +32992,27 @@ SQLITE_API void sqlite3_str_vappendf(
szBufNeeded = MAX(e2,0)+(i64)precision+(i64)width+10;
if( cThousand && e2>0 ) szBufNeeded += (e2+2)/3;
- if( sqlite3StrAccumEnlargeIfNeeded(pAccum, szBufNeeded) ){
- width = length = 0;
- break;
+ if( szBufNeeded + pAccum->nChar >= pAccum->nAlloc ){
+ if( pAccum->mxAlloc==0 && pAccum->accError==0 ){
+ /* Unable to allocate space in pAccum, perhaps because it
+ ** is coming from sqlite3_snprintf() or similar. We'll have
+ ** to render into temporary space and the memcpy() it over. */
+ bufpt = sqlite3_malloc(szBufNeeded);
+ if( bufpt==0 ){
+ sqlite3StrAccumSetError(pAccum, SQLITE_NOMEM);
+ return;
+ }
+ zExtra = bufpt;
+ }else if( sqlite3StrAccumEnlarge(pAccum, szBufNeeded)zText + pAccum->nChar;
+ }
+ }else{
+ bufpt = pAccum->zText + pAccum->nChar;
}
- bufpt = zOut = pAccum->zText + pAccum->nChar;
+ zOut = bufpt;
flag_dp = (precision>0 ?1:0) | flag_alternateform | flag_altform2;
/* The sign in front of the number */
@@ -33077,14 +33113,22 @@ SQLITE_API void sqlite3_str_vappendf(
}
length = width;
}
- pAccum->nChar += length;
- zOut[length] = 0;
- /* Floating point conversions render directly into the output
- ** buffer. Hence, don't just break out of the switch(). Bypass the
- ** output buffer writing that occurs after the switch() by continuing
- ** to the next character in the format string. */
- continue;
+ if( zExtra==0 ){
+ /* The result is being rendered directory into pAccum. This
+ ** is the command and fast case */
+ pAccum->nChar += length;
+ zOut[length] = 0;
+ continue;
+ }else{
+ /* We were unable to render directly into pAccum because we
+ ** couldn't allocate sufficient memory. We need to memcpy()
+ ** the rendering (or some prefix thereof) into the output
+ ** buffer. */
+ bufpt[0] = 0;
+ bufpt = zExtra;
+ break;
+ }
}
case etSIZE:
if( !bArgList ){
@@ -33131,7 +33175,7 @@ SQLITE_API void sqlite3_str_vappendf(
if( sqlite3StrAccumEnlargeIfNeeded(pAccum, nCopyBytes) ){
break;
}
- sqlite3_str_append(pAccum,
+ sqlite3_str_append(pAccum,
&pAccum->zText[pAccum->nChar-nCopyBytes], nCopyBytes);
precision -= nPrior;
nPrior *= 2;
@@ -33234,8 +33278,8 @@ SQLITE_API void sqlite3_str_vappendf(
** all control characters, and for backslash itself.
** For %#Q, do the same but only if there is at least
** one control character. */
- u32 nBack = 0;
- u32 nCtrl = 0;
+ i64 nBack = 0;
+ i64 nCtrl = 0;
for(k=0; k32)))
+#define SQLITE_USE_UINT128
+#endif
+
/*
** Two inputs are multiplied to get a 128-bit result. Write the
** lower 64-bits of the result into *pLo, and return the high-order
** 64 bits.
*/
static u64 sqlite3Multiply128(u64 a, u64 b, u64 *pLo){
-#if (defined(__GNUC__) || defined(__clang__)) \
- && (defined(__x86_64__) || defined(__aarch64__) || defined(__riscv)) \
- && !defined(SQLITE_DISABLE_INTRINSIC)
+#if defined(SQLITE_USE_UINT128)
__uint128_t r = (__uint128_t)a * b;
*pLo = (u64)r;
return (u64)(r>>64);
@@ -36835,9 +36884,7 @@ static u64 sqlite3Multiply128(u64 a, u64 b, u64 *pLo){
** The lower 64 bits of A*B are discarded.
*/
static u64 sqlite3Multiply160(u64 a, u32 aLo, u64 b, u32 *pLo){
-#if (defined(__GNUC__) || defined(__clang__)) \
- && (defined(__x86_64__) || defined(__aarch64__) || defined(__riscv)) \
- && !defined(SQLITE_DISABLE_INTRINSIC)
+#if defined(SQLITE_USE_UINT128)
__uint128_t r = (__uint128_t)a * b;
r += ((__uint128_t)aLo * b) >> 32;
*pLo = (r>>32)&0xffffffff;
@@ -36875,6 +36922,8 @@ static u64 sqlite3Multiply160(u64 a, u32 aLo, u64 b, u32 *pLo){
#endif
}
+#undef SQLITE_USE_UINT128
+
/*
** Return a u64 with the N-th bit set.
*/
@@ -45279,9 +45328,9 @@ static int unixShmMap(
nReqRegion = ((iRegion+nShmPerMap) / nShmPerMap) * nShmPerMap;
if( pShmNode->nRegionszRegion = szRegion;
@@ -45312,7 +45361,7 @@ static int unixShmMap(
*/
else{
static const int pgsz = 4096;
- int iPg;
+ i64 iPg;
/* Write to the last byte of each newly allocated or extended page */
assert( (nByte % pgsz)==0 );
@@ -45338,8 +45387,8 @@ static int unixShmMap(
}
pShmNode->apRegion = apNew;
while( pShmNode->nRegionhShm>=0 ){
pMem = osMmap(0, nMap,
@@ -53313,7 +53362,7 @@ static int winShmMap(
if( pShmNode->nRegion<=iRegion ){
HANDLE hShared = pShmNode->hSharedShm;
struct ShmRegion *apNew; /* New aRegion[] array */
- int nByte = (iRegion+1)*szRegion; /* Minimum required file size */
+ i64 nByte = ((i64)iRegion+1)*(i64)szRegion; /* Minimum file size */
sqlite3_int64 sz; /* Current size of wal-index file */
pShmNode->szRegion = szRegion;
@@ -53344,7 +53393,7 @@ static int winShmMap(
/* Map the requested memory region into this processes address space. */
apNew = (struct ShmRegion*)sqlite3_realloc64(
- pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0])
+ pShmNode->aRegion, ((i64)iRegion+1)*sizeof(apNew[0])
);
if( !apNew ){
rc = SQLITE_IOERR_NOMEM_BKPT;
@@ -53366,15 +53415,14 @@ static int winShmMap(
#elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA
hMap = osCreateFileMappingA(hShared, NULL, protect, 0, nByte, NULL);
#endif
-
- OSTRACE(("SHM-MAP-CREATE pid=%lu, region=%d, size=%d, rc=%s\n",
+ OSTRACE(("SHM-MAP-CREATE pid=%lu, region=%d, size=%lld, rc=%s\n",
osGetCurrentProcessId(), pShmNode->nRegion, nByte,
hMap ? "ok" : "failed"));
if( hMap ){
- int iOffset = pShmNode->nRegion*szRegion;
+ i64 iOffset = pShmNode->nRegion*szRegion;
int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity;
pMap = osMapViewOfFile(hMap, flags,
- 0, iOffset - iOffsetShift, szRegion + iOffsetShift
+ 0, iOffset - iOffsetShift, (i64)szRegion + iOffsetShift
);
OSTRACE(("SHM-MAP-MAP pid=%lu, region=%d, offset=%d, size=%d, rc=%s\n",
osGetCurrentProcessId(), pShmNode->nRegion, iOffset,
@@ -53396,7 +53444,7 @@ static int winShmMap(
shmpage_out:
if( pShmNode->nRegion>iRegion ){
- int iOffset = iRegion*szRegion;
+ i64 iOffset = (i64)iRegion*(i64)szRegion;
int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity;
char *p = (char *)pShmNode->aRegion[iRegion].pMap;
*pp = (void *)&p[iOffsetShift];
@@ -56109,10 +56157,10 @@ SQLITE_API int sqlite3_deserialize(
if( rc ) goto end_deserialize;
db->init.iDb = (u8)iDb;
db->init.reopenMemdb = 1;
- rc = sqlite3_step(pStmt);
+ sqlite3_step(pStmt);
db->init.reopenMemdb = 0;
- if( rc!=SQLITE_DONE ){
- rc = SQLITE_ERROR;
+ rc = sqlite3_finalize(pStmt);
+ if( rc!=SQLITE_OK ){
goto end_deserialize;
}
p = memdbFromDbSchema(db, zSchema);
@@ -56133,7 +56181,6 @@ SQLITE_API int sqlite3_deserialize(
}
end_deserialize:
- sqlite3_finalize(pStmt);
if( pData && (mFlags & SQLITE_DESERIALIZE_FREEONCLOSE)!=0 ){
sqlite3_free(pData);
}
@@ -62125,7 +62172,7 @@ static int pager_delsuper(Pager *pPager, const char *zSuper){
if( rc!=SQLITE_OK ) goto delsuper_out;
nSuperPtr = 1 + (i64)pVfs->mxPathname;
assert( nSuperJournal>=0 && nSuperPtr>0 );
- zFree = sqlite3Malloc(4 + nSuperJournal + nSuperPtr + 2);
+ zFree = sqlite3Malloc(4 + nSuperJournal + 2 + nSuperPtr + 2);
if( !zFree ){
rc = SQLITE_NOMEM_BKPT;
goto delsuper_out;
@@ -62386,10 +62433,10 @@ static int pager_playback(Pager *pPager, int isHot){
**
** TODO: Technically the following is an error because it assumes that
** buffer Pager.pTmpSpace is (mxPathname+1) bytes or larger. i.e. that
- ** (pPager->pageSize >= pPager->pVfs->mxPathname+1). Using os_unix.c,
+ ** ((pPager->pageSize+8) >= pPager->pVfs->mxPathname+1). Using os_unix.c,
** mxPathname is 512, which is the same as the minimum allowable value
- ** for pageSize.
- */
+ ** for pageSize, and so this assumption holds. But it might not for some
+ ** custom VFS. */
zSuper = pPager->pTmpSpace;
rc = readSuperJournal(pPager->jfd, zSuper, 1+(i64)pPager->pVfs->mxPathname);
if( rc==SQLITE_OK && zSuper[0] ){
@@ -78279,7 +78326,9 @@ static int accessPayload(
** means "not yet known" (the cache is lazily populated).
*/
if( (pCur->curFlags & BTCF_ValidOvfl)==0 ){
- int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize;
+ i64 nOvfl = pCur->info.nPayload;
+ testcase( nOvfl - pCur->info.nLocal + ovflSize - 1 > 0xffffffffU );
+ nOvfl = (nOvfl - pCur->info.nLocal + ovflSize-1)/ovflSize;
if( pCur->aOverflow==0
|| nOvfl*(int)sizeof(Pgno) > sqlite3MallocSize(pCur->aOverflow)
){
@@ -78384,6 +78433,12 @@ static int accessPayload(
(eOp==0 ? PAGER_GET_READONLY : 0)
);
if( rc==SQLITE_OK ){
+ if( eOp!=0
+ && (sqlite3PagerPageRefcount(pDbPage)!=1
+ || NEVER(((MemPage*)sqlite3PagerGetExtra(pDbPage))->isInit)) ){
+ sqlite3PagerUnref(pDbPage);
+ return SQLITE_CORRUPT_PAGE(pPage);
+ }
aPayload = sqlite3PagerGetData(pDbPage);
nextPage = get4byte(aPayload);
rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage);
@@ -111072,6 +111127,7 @@ static int lookupName(
pExpr->op = TK_FUNCTION;
pExpr->u.zToken = "coalesce";
pExpr->x.pList = pFJMatch;
+ pExpr->affExpr = SQLITE_AFF_DEFER;
cnt = 1;
goto lookupname_end;
}else{
@@ -111240,6 +111296,26 @@ static int exprProbability(Expr *p){
return (int)(r*134217728.0);
}
+/*
+** Set the EP_SubtArg property on every expression inside of
+** pList. If any subexpression is actually a subquery, then
+** also set the EP_SubtArg property on the first result-set
+** column of that subquery.
+*/
+static SQLITE_NOINLINE void resolveSetExprSubtypeArg(ExprList *pList){
+ int nn, ii;
+ nn = pList ? pList->nExpr : 0;
+ for(ii=0; iia[ii].pExpr;
+ ExprSetProperty(pExpr, EP_SubtArg);
+ if( pExpr->op==TK_SELECT ){
+ assert( ExprUseXSelect(pExpr) );
+ assert( pExpr->x.pSelect!=0 );
+ resolveSetExprSubtypeArg(pExpr->x.pSelect->pEList);
+ }
+ }
+}
+
/*
** This routine is callback for sqlite3WalkExpr().
**
@@ -111484,10 +111560,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
if( (pDef->funcFlags & SQLITE_SUBTYPE)
|| ExprHasProperty(pExpr, EP_SubtArg)
){
- int ii;
- for(ii=0; iia[ii].pExpr, EP_SubtArg);
- }
+ resolveSetExprSubtypeArg(pList);
}
if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){
@@ -116882,7 +116955,16 @@ static void sqlite3ExprCodeIN(
CollSeq *pColl;
int r3 = sqlite3GetTempReg(pParse);
p = sqlite3VectorFieldSubexpr(pLeft, i);
- pColl = sqlite3ExprCollSeq(pParse, p);
+ if( ExprUseXSelect(pExpr) ){
+ Expr *pRhs = pExpr->x.pSelect->pEList->a[i].pExpr;
+ pColl = sqlite3BinaryCompareCollSeq(pParse, p, pRhs);
+ }else{
+ /* If the RHS of the IN(...) expression are scalar expressions, do
+ ** not consider their collation sequences. The documentation says
+ ** "The collating sequence used for expressions of the form "x IN (y, z,
+ ** ...)" is the collating sequence of x.". */
+ pColl = sqlite3ExprCollSeq(pParse, p);
+ }
sqlite3VdbeAddOp3(v, OP_Column, iTab, i, r3);
sqlite3VdbeAddOp4(v, OP_Ne, rLhs+i, destNotNull, r3,
(void*)pColl, P4_COLLSEQ);
@@ -117305,26 +117387,37 @@ static int exprCodeInlineFunction(
}
/*
-** Expression Node callback for sqlite3ExprCanReturnSubtype().
+** Expression Node callback for sqlite3ExprCanReturnSubtype(). If
+** pExpr is able to return a subtype, set pWalker->eCode and abort
+** the search. If pExpr can never return a subtype, prune search.
+**
+** The only expressions that can return a subtype are:
+**
+** 1. A function
+** 2. The no-op "+" operator
+** 3. A CASE...END expression
+** 4. A CAST() expression
+** 5. A "expr COLLATE colseq" expression.
**
-** Only a function call is able to return a subtype. So if the node
-** is not a function call, return WRC_Prune immediately.
+** For any other kind of expression, prune the search.
**
-** A function call is able to return a subtype if it has the
-** SQLITE_RESULT_SUBTYPE property.
+** For case 1, the expression can yield a subtype if the function has
+** the SQLITE_RESULT_SUBTYPE property. Functions can also return
+** a subtype (via sqlite3_result_value()) if any of the arguments can
+** return a subtype.
**
-** Assume that every function is able to pass-through a subtype from
-** one of its argument (using sqlite3_result_value()). Most functions
-** are not this way, but we don't have a mechanism to distinguish those
-** that are from those that are not, so assume they all work this way.
-** That means that if one of its arguments is another function and that
-** other function is able to return a subtype, then this function is
-** able to return a subtype.
+** In all cases 1 through 5, the expression might also return a subtype
+** if any operand can return a subtype.
*/
static int exprNodeCanReturnSubtype(Walker *pWalker, Expr *pExpr){
int n;
FuncDef *pDef;
sqlite3 *db;
+ if( pExpr->op==TK_CASE || pExpr->op==TK_UPLUS
+ || pExpr->op==TK_COLLATE || pExpr->op==TK_CAST
+ ){
+ return WRC_Continue;
+ }
if( pExpr->op!=TK_FUNCTION ){
return WRC_Prune;
}
@@ -117334,7 +117427,7 @@ static int exprNodeCanReturnSubtype(Walker *pWalker, Expr *pExpr){
pDef = sqlite3FindFunction(db, pExpr->u.zToken, n, ENC(db), 0);
if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_RESULT_SUBTYPE)!=0 ){
pWalker->eCode = 1;
- return WRC_Prune;
+ return WRC_Abort;
}
return WRC_Continue;
}
@@ -123123,7 +123216,9 @@ SQLITE_PRIVATE void sqlite3AlterDropConstraint(
if( !pTab ) return;
if( pCons ){
- zArg = sqlite3MPrintf(db, "%.*Q", pCons->n, pCons->z);
+ char *z = sqlite3NameFromToken(db, pCons);
+ zArg = sqlite3MPrintf(db, "%Q", z);
+ sqlite3DbFree(db, z);
}else{
int iCol;
if( alterFindCol(pParse, pTab, pCol, &iCol) ) return;
@@ -123310,19 +123405,31 @@ SQLITE_PRIVATE void sqlite3AlterAddConstraint(
SrcList *pSrc, /* Table to add constraint to */
Token *pFirst, /* First token of new constraint */
Token *pName, /* Name of new constraint. NULL if name omitted. */
- const char *pExpr, /* Text of CHECK expression */
- int nExpr /* Size of pExpr in bytes */
+ const char *zExpr, /* Text of CHECK expression */
+ int nExpr, /* Size of pExpr in bytes */
+ Expr *pExpr /* The parsed CHECK expression */
){
Table *pTab = 0; /* Table identified by pSrc */
int iDb = 0; /* Which schema does pTab live in */
const char *zDb = 0; /* Name of the schema in which pTab lives */
const char *pCons = 0; /* Text of the constraint */
int nCons; /* Bytes of text to use from pCons[] */
+ int rc; /* Result from error checking pExpr */
/* Look up the table being altered. */
assert( pSrc->nSrc==1 );
pTab = alterFindTable(pParse, pSrc, &iDb, &zDb, 1);
- if( !pTab ) return;
+ if( !pTab ){
+ sqlite3ExprDelete(pParse->db, pExpr);
+ return;
+ }
+
+ /* Verify that the new CHECK constraint does not contain any
+ ** internal-use-only function. Forum post 2026-05-10T01:11:28Z
+ */
+ rc = sqlite3ResolveSelfReference(pParse, pTab, NC_IsCheck, pExpr, 0);
+ sqlite3ExprDelete(pParse->db, pExpr);
+ if( rc ) return;
/* If this new constraint has a name, check that it is not a duplicate of
** an existing constraint. It is an error if it is. */
@@ -123343,7 +123450,7 @@ SQLITE_PRIVATE void sqlite3AlterAddConstraint(
sqlite3NestedParse(pParse,
"SELECT sqlite_fail('constraint failed', %d) "
"FROM %Q.%Q WHERE (%.*s) IS NOT TRUE",
- SQLITE_CONSTRAINT, zDb, pTab->zName, nExpr, pExpr
+ SQLITE_CONSTRAINT, zDb, pTab->zName, nExpr, zExpr
);
/* Edit the SQL for the named table. */
@@ -125505,6 +125612,16 @@ static void attachFunc(
** from sqlite3_deserialize() to close database db->init.iDb and
** reopen it as a MemDB */
Btree *pNewBt = 0;
+
+ pNew = &db->aDb[db->init.iDb];
+ assert( pNew->pBt!=0 );
+ if( sqlite3BtreeTxnState(pNew->pBt)!=SQLITE_TXN_NONE
+ || sqlite3BtreeIsInBackup(pNew->pBt)
+ ){
+ rc = SQLITE_BUSY;
+ goto attach_error;
+ }
+
pVfs = sqlite3_vfs_find("memdb");
if( pVfs==0 ) return;
rc = sqlite3BtreeOpen(pVfs, "x\0", db, &pNewBt, 0, SQLITE_OPEN_MAIN_DB);
@@ -125514,8 +125631,7 @@ static void attachFunc(
/* Both the Btree and the new Schema were allocated successfully.
** Close the old db and update the aDb[] slot with the new memdb
** values. */
- pNew = &db->aDb[db->init.iDb];
- if( ALWAYS(pNew->pBt) ) sqlite3BtreeClose(pNew->pBt);
+ sqlite3BtreeClose(pNew->pBt);
pNew->pBt = pNewBt;
pNew->pSchema = pNewSchema;
}else{
@@ -134011,9 +134127,18 @@ static void printfFunc(
sqlite3StrAccumInit(&str, db, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]);
str.printfFlags = SQLITE_PRINTF_SQLFUNC;
sqlite3_str_appendf(&str, zFormat, &x);
- n = str.nChar;
- sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n,
- SQLITE_DYNAMIC);
+ if( str.accError==SQLITE_OK ){
+ n = str.nChar;
+ sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n,
+ SQLITE_DYNAMIC);
+ }else{
+ if( str.accError==SQLITE_NOMEM ){
+ sqlite3_result_error_nomem(context);
+ }else{
+ sqlite3_result_error_toobig(context);
+ }
+ sqlite3_str_reset(&str);
+ }
}
}
@@ -135651,11 +135776,16 @@ static void sumInverse(sqlite3_context *context, int argc, sqlite3_value**argv){
assert( p->cnt>0 );
p->cnt--;
if( !p->approx ){
- if( sqlite3SubInt64(&p->iSum, sqlite3_value_int64(argv[0])) ){
- p->ovrfl = 1;
- p->approx = 1;
+ i64 x = p->iSum;
+ if( sqlite3SubInt64(&x, sqlite3_value_int64(argv[0]))==0 ){
+ p->iSum = x;
+ return;
}
- }else if( type==SQLITE_INTEGER ){
+ p->ovrfl = 1;
+ p->approx = 1;
+ kahanBabuskaNeumaierInit(p, p->iSum);
+ }
+ if( type==SQLITE_INTEGER ){
i64 iVal = sqlite3_value_int64(argv[0]);
if( iVal!=SMALLEST_INT64 ){
kahanBabuskaNeumaierStepInt64(p, -iVal);
@@ -136628,47 +136758,46 @@ static void percentSort(double *a, unsigned int n){
int i; /* Loop counter */
double rPivot; /* The pivot value */
- assert( n>=2 );
- if( a[0]>a[n-1] ){
- SWAP_DOUBLE(a[0],a[n-1])
- }
- if( n==2 ) return;
- iGt = n-1;
- i = n/2;
- if( a[0]>a[i] ){
- SWAP_DOUBLE(a[0],a[i])
- }else if( a[i]>a[iGt] ){
- SWAP_DOUBLE(a[i],a[iGt])
- }
- if( n==3 ) return;
- rPivot = a[i];
- iLt = i = 1;
- do{
- if( a[i]iLt ) SWAP_DOUBLE(a[i],a[iLt])
- iLt++;
- i++;
- }else if( a[i]>rPivot ){
- do{
- iGt--;
- }while( iGt>i && a[iGt]>rPivot );
+ while( n>=2 ){
+ if( a[0]>a[n-1] ){
+ SWAP_DOUBLE(a[0],a[n-1])
+ }
+ if( n==2 ) return;
+ iGt = n-1;
+ i = n/2;
+ if( a[0]>a[i] ){
+ SWAP_DOUBLE(a[0],a[i])
+ }else if( a[i]>a[iGt] ){
SWAP_DOUBLE(a[i],a[iGt])
+ }
+ if( n==3 ) return;
+ rPivot = a[i];
+ iLt = i = 1;
+ do{
+ if( a[i]iLt ) SWAP_DOUBLE(a[i],a[iLt])
+ iLt++;
+ i++;
+ }else if( a[i]>rPivot ){
+ do{
+ iGt--;
+ }while( iGt>i && a[iGt]>rPivot );
+ SWAP_DOUBLE(a[i],a[iGt])
+ }else{
+ i++;
+ }
+ }while( in/2 ){
+ if( n-iGt>=2 ) percentSort(a+iGt, n-iGt);
+ n = iLt;
}else{
- i++;
+ if( iLt>=2 ) percentSort(a, iLt);
+ a += iGt;
+ n -= iGt;
}
- }while( i=2 ) percentSort(a, iLt);
- if( n-iGt>=2 ) percentSort(a+iGt, n-iGt);
-
-/* Uncomment for testing */
-#if 0
- for(i=0; ipSrc!=0)
&& p->pSrc->nSrcpLimit==0 || p->pLimit->pRight==0)
){
if( pWhere->op==TK_AND ){
Expr *pRight = pWhere->pRight;
@@ -156105,7 +156235,6 @@ static SQLITE_NOINLINE void existsToJoin(
sqlite3TreeViewSelect(0, p, 0);
}
#endif
- existsToJoin(pParse, p, pSubWhere);
}
}
}
@@ -156166,8 +156295,11 @@ static int selectCheckOnClausesExpr(Walker *pWalker, Expr *pExpr){
** does not refer to a table to the right of CheckOnCtx.iJoin. */
do {
SrcList *pSrc = pCtx->pSrc;
+ int nSrc = pSrc->nSrc;
int iTab = pExpr->iTable;
- if( iTab>=pSrc->a[0].iCursor && iTab<=pSrc->a[pSrc->nSrc-1].iCursor ){
+ int ii;
+ for(ii=0; iia[ii].iCursor!=iTab; ii++){}
+ if( iiiJoin && iTab>pCtx->iJoin ){
sqlite3ErrorMsg(pWalker->pParse,
"%s references tables to its right",
@@ -165947,7 +166079,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** by this loop in the a[0] slot and all notReady tables in a[1..] slots.
** This becomes the SrcList in the recursive call to sqlite3WhereBegin().
*/
- if( pWInfo->nLevel>1 ){
+ if( pWInfo->nLevel>1 || pTabItem->fg.fromExists ){
int nNotReady; /* The number of notReady tables */
SrcItem *origSrc; /* Original list of tables */
nNotReady = pWInfo->nLevel - iLevel - 1;
@@ -165960,6 +166092,13 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
for(k=1; k<=nNotReady; k++){
memcpy(&pOrTab->a[k], &origSrc[pLevel[k].iFrom], sizeof(pOrTab->a[k]));
}
+
+ /* Clear the fromExists flag on the OR-optimized table entry so that
+ ** the calls to sqlite3WhereEnd() do not code early-exits after the
+ ** first row is visited. The early exit applies to this table's
+ ** overall loop - including the multiple OR branches and any WHERE
+ ** conditions not passed to the sub-loops - not to the sub-loops. */
+ pOrTab->a[0].fg.fromExists = 0;
}else{
pOrTab = pWInfo->pTabList;
}
@@ -166203,7 +166342,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
assert( pLevel->op==OP_Return );
pLevel->p2 = sqlite3VdbeCurrentAddr(v);
- if( pWInfo->nLevel>1 ){ sqlite3DbFreeNN(db, pOrTab); }
+ if( pWInfo->pTabList!=pOrTab ){ sqlite3DbFreeNN(db, pOrTab); }
if( !untestedTerms ) disableTerm(pLevel, pTerm);
}else
#endif /* SQLITE_OMIT_OR_OPTIMIZATION */
@@ -166360,6 +166499,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
WO_EQ|WO_IN|WO_IS, 0);
if( pAlt==0 ) continue;
if( pAlt->wtFlags & (TERM_CODED) ) continue;
+ if( ExprHasProperty(pAlt->pExpr, EP_Collate) ) continue;
if( (pAlt->eOperator & WO_IN)
&& ExprUseXSelect(pAlt->pExpr)
&& (pAlt->pExpr->x.pSelect->pEList->nExpr>1)
@@ -167552,8 +167692,8 @@ static void exprAnalyzeOrTerm(
** 3. Not originating in the ON clause of an OUTER JOIN
** 4. The operator is not IS or else the query does not contain RIGHT JOIN
** 5. The affinities of A and B must be compatible
-** 6a. Both operands use the same collating sequence OR
-** 6b. The overall collating sequence is BINARY
+** 6. Both operands use the same collating sequence, and they must not
+** use explicit COLLATE clauses.
** If this routine returns TRUE, that means that the RHS can be substituted
** for the LHS anyplace else in the WHERE clause where the LHS column occurs.
** This is an optimization. No harm comes from returning 0. But if 1 is
@@ -167561,10 +167701,9 @@ static void exprAnalyzeOrTerm(
*/
static int termIsEquivalence(Parse *pParse, Expr *pExpr, SrcList *pSrc){
char aff1, aff2;
- CollSeq *pColl;
if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0; /* (1) */
if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0; /* (2) */
- if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* (3) */
+ if( ExprHasProperty(pExpr, EP_OuterON|EP_Collate) ) return 0; /* (3) */
assert( pSrc!=0 );
if( pExpr->op==TK_IS
&& pSrc->nSrc>=2
@@ -167579,10 +167718,7 @@ static int termIsEquivalence(Parse *pParse, Expr *pExpr, SrcList *pSrc){
){
return 0; /* (5) */
}
- pColl = sqlite3ExprCompareCollSeq(pParse, pExpr);
- if( !sqlite3IsBinary(pColl)
- && !sqlite3ExprCollSeqMatch(pParse, pExpr->pLeft, pExpr->pRight)
- ){
+ if( !sqlite3ExprCollSeqMatch(pParse, pExpr->pLeft, pExpr->pRight) ){
return 0; /* (6) */
}
return 1;
@@ -167914,7 +168050,7 @@ static void exprAnalyze(
/* Analyze a term that is composed of two or more subterms connected by
** an OR operator.
*/
- else if( pExpr->op==TK_OR ){
+ else if( pExpr->op==TK_OR && !ExprHasProperty(pExpr, EP_Collate) ){
assert( pWC->op==TK_AND );
exprAnalyzeOrTerm(pSrc, pWC, idxTerm);
pTerm = &pWC->a[idxTerm];
@@ -171732,7 +171868,8 @@ static int whereRangeVectorLen(
idxaff = sqlite3TableColumnAffinity(pIdx->pTable, pLhs->iColumn);
if( aff!=idxaff ) break;
- pColl = sqlite3ExprCompareCollSeq(pParse, pTerm->pExpr);
+ if( ExprHasProperty(pTerm->pExpr, EP_Commuted) ) SWAP(Expr*, pRhs, pLhs);
+ pColl = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs);
if( pColl==0 ) break;
if( sqlite3StrICmp(pColl->zName, pIdx->azColl[i+nEq]) ) break;
}
@@ -176128,27 +176265,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
}
#endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */
}
- if( pTabList->a[pLevel->iFrom].fg.fromExists
- && (i==pWInfo->nLevel-1
- || pTabList->a[pWInfo->a[i+1].iFrom].fg.fromExists==0)
- ){
- /* This is an EXISTS-to-JOIN optimization which is either the
- ** inner-most loop, or the inner-most of a group of nested
- ** EXISTS-to-JOIN optimization loops. If this loop sees a successful
- ** row, it should break out of itself as well as other EXISTS-to-JOIN
- ** loops in which is is directly nested. */
- int nOuter = 0; /* Nr of outer EXISTS that this one is nested within */
- while( nOutera[pLevel[-nOuter-1].iFrom].fg.fromExists ) break;
- nOuter++;
- }
- testcase( nOuter>0 );
- sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel[-nOuter].addrBrk);
- if( nOuter ){
- VdbeComment((v, "EXISTS break %d..%d", i-nOuter, i));
- }else{
- VdbeComment((v, "EXISTS break %d", i));
- }
+ if( pTabList->a[pLevel->iFrom].fg.fromExists ){
+ /* This is an EXISTS-to-JOIN optimization loop. If this loop sees a
+ ** successful row, it should break out of itself. */
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrBrk);
+ VdbeComment((v, "EXISTS break %d", i));
}
sqlite3VdbeResolveLabel(v, pLevel->addrCont);
if( pLevel->op!=OP_Noop ){
@@ -184222,9 +184343,11 @@ static YYACTIONTYPE yy_reduce(
ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy14, yymsp[-1].minor.yy454);
yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
if( yymsp[-4].minor.yy454 ){
+ int i;
yymsp[-4].minor.yy454->x.pList = pList;
- if( ALWAYS(pList->nExpr) ){
- yymsp[-4].minor.yy454->flags |= pList->a[0].pExpr->flags & EP_Propagate;
+ for(i=0; inExpr; i++){
+ assert( pList->a[i].pExpr!=0 );
+ yymsp[-4].minor.yy454->flags |= pList->a[i].pExpr->flags & EP_Propagate;
}
}else{
sqlite3ExprListDelete(pParse->db, pList);
@@ -184335,6 +184458,7 @@ static YYACTIONTYPE yy_reduce(
yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy454, 0);
if( yymsp[-4].minor.yy454 ){
yymsp[-4].minor.yy454->x.pList = pList;
+ sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy454);
}else{
sqlite3ExprListDelete(pParse->db, pList);
}
@@ -184691,15 +184815,13 @@ static YYACTIONTYPE yy_reduce(
break;
case 300: /* cmd ::= ALTER TABLE fullname ADD CONSTRAINT nm CHECK LP expr RP onconf */
{
- sqlite3AlterAddConstraint(pParse, yymsp[-8].minor.yy203, &yymsp[-6].minor.yy0, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy0.z+1, (yymsp[-1].minor.yy0.z-yymsp[-3].minor.yy0.z-1));
+ sqlite3AlterAddConstraint(pParse, yymsp[-8].minor.yy203, &yymsp[-6].minor.yy0, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy0.z+1, (yymsp[-1].minor.yy0.z-yymsp[-3].minor.yy0.z-1), yymsp[-2].minor.yy454);
}
- yy_destructor(yypParser,219,&yymsp[-2].minor);
break;
case 301: /* cmd ::= ALTER TABLE fullname ADD CHECK LP expr RP onconf */
{
- sqlite3AlterAddConstraint(pParse, yymsp[-6].minor.yy203, &yymsp[-4].minor.yy0, 0, yymsp[-3].minor.yy0.z+1, (yymsp[-1].minor.yy0.z-yymsp[-3].minor.yy0.z-1));
+ sqlite3AlterAddConstraint(pParse, yymsp[-6].minor.yy203, &yymsp[-4].minor.yy0, 0, yymsp[-3].minor.yy0.z+1, (yymsp[-1].minor.yy0.z-yymsp[-3].minor.yy0.z-1), yymsp[-2].minor.yy454);
}
- yy_destructor(yypParser,219,&yymsp[-2].minor);
break;
case 302: /* cmd ::= create_vtab */
{sqlite3VtabFinishParse(pParse,0);}
@@ -193903,6 +194025,12 @@ SQLITE_PRIVATE int sqlite3Fts3IntegrityCheck(Fts3Table *p, int *pbOk);
SQLITE_EXTENSION_INIT1
#endif
+
+/*
+** Assume any b-tree layer with more levels than this is corrupt.
+*/
+#define FTS3_MAX_BTREE_HEIGHT 48
+
typedef struct Fts3HashWrapper Fts3HashWrapper;
struct Fts3HashWrapper {
Fts3Hash hash; /* Hash table */
@@ -195619,7 +195747,11 @@ static int fts3SelectLeaf(
assert( piLeaf || piLeaf2 );
fts3GetVarint32(zNode, &iHeight);
- rc = fts3ScanInteriorNode(zTerm, nTerm, zNode, nNode, piLeaf, piLeaf2);
+ if( iHeight>FTS3_MAX_BTREE_HEIGHT ){
+ rc = FTS_CORRUPT_VTAB;
+ }else{
+ rc = fts3ScanInteriorNode(zTerm, nTerm, zNode, nNode, piLeaf, piLeaf2);
+ }
assert_fts3_nc( !piLeaf2 || !piLeaf || rc!=SQLITE_OK || (*piLeaf<=*piLeaf2) );
if( rc==SQLITE_OK && iHeight>1 ){
@@ -200148,7 +200280,7 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){
/* State 3. The integer just read is a column number. */
default: assert( eState==3 );
iCol = (int)v;
- if( iCol<1 ){
+ if( iCol<1 || iCol>(pFts3->nColumn+1) ){
rc = SQLITE_CORRUPT_VTAB;
break;
}
@@ -200838,6 +200970,7 @@ static int getNextNode(
assert( nKey==4 );
if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){
nKey += 1+sqlite3Fts3ReadInt(&zInput[nKey+1], &nNear);
+ if( nNear>=1000000000 ) nNear = 1000000000;
}
}
@@ -210701,7 +210834,7 @@ static int fts3ExprLHits(
if( p->flag==FTS3_MATCHINFO_LHITS ){
p->aMatchinfo[iStart + iCol] = (u32)nHit;
}else if( nHit ){
- p->aMatchinfo[iStart + (iCol+1)/32] |= (1 << (iCol&0x1F));
+ p->aMatchinfo[iStart + iCol/32] |= (1U << (iCol&0x1F));
}
}
assert( *pIter==0x00 || *pIter==0x01 );
@@ -213191,7 +213324,7 @@ static void jsonAppendSqlValue(
break;
}
case SQLITE_FLOAT: {
- jsonPrintf(100, p, "%!0.15g", sqlite3_value_double(pValue));
+ jsonPrintf(100, p, "%!0.17g", sqlite3_value_double(pValue));
break;
}
case SQLITE_INTEGER: {
@@ -214505,9 +214638,10 @@ static u32 jsonbPayloadSize(const JsonParse *pParse, u32 i, u32 *pSz){
u8 x;
u32 sz;
u32 n;
- assert( i<=pParse->nBlob );
- x = pParse->aBlob[i]>>4;
- if( x<=11 ){
+ if( i>=pParse->nBlob ){
+ *pSz = 0;
+ return 0;
+ }else if( (x = pParse->aBlob[i]>>4)<=11 ){
sz = x;
n = 1;
}else if( x==12 ){
@@ -217290,11 +217424,9 @@ static void jsonGroupInverse(
UNUSED_PARAMETER(argc);
UNUSED_PARAMETER(argv);
pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
-#ifdef NEVER
/* pStr is always non-NULL since jsonArrayStep() or jsonObjectStep() will
** always have been called to initialize it */
if( NEVER(!pStr) ) return;
-#endif
z = pStr->zBuf;
for(i=1; inUsed && ((c = z[i])!=',' || inStr || nNest); i++){
if( c=='"' ){
@@ -217323,6 +217455,13 @@ static void jsonGroupInverse(
** json_group_obj(NAME,VALUE)
**
** Return a JSON object composed of all names and values in the aggregate.
+**
+** Rows for which NAME is NULL do not result in a new entry. However, we
+** do initially insert a "@" entry into the growing string for each null entry
+** and change the first character of the string to "@" to signal that the
+** string contains null entries. The "@" markers are needed in order to
+** correctly process xInverse() requests. The initial "@" is converted
+** back into "{" and the "@" null values are removed by jsonObjectCompute().
*/
static void jsonObjectStep(
sqlite3_context *ctx,
@@ -217340,7 +217479,7 @@ static void jsonObjectStep(
if( pStr->zBuf==0 ){
jsonStringInit(pStr, ctx);
jsonAppendChar(pStr, '{');
- }else if( pStr->nUsed>1 && z!=0 ){
+ }else if( pStr->nUsed>1 ){
jsonAppendChar(pStr, ',');
}
pStr->pCtx = ctx;
@@ -217348,6 +217487,9 @@ static void jsonObjectStep(
jsonAppendString(pStr, z, n);
jsonAppendChar(pStr, ':');
jsonAppendSqlValue(pStr, argv[1]);
+ }else{
+ pStr->zBuf[0] = '@';
+ jsonAppendRawNZ(pStr, "@", 1);
}
}
}
@@ -217356,20 +217498,64 @@ static void jsonObjectCompute(sqlite3_context *ctx, int isFinal){
int flags = SQLITE_PTR_TO_INT(sqlite3_user_data(ctx));
pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
if( pStr ){
- jsonAppendRawNZ(pStr, "}", 2);
- jsonStringTrimOneChar(pStr);
+ JsonString *pOgStr = pStr;
+ JsonString tmpStr;
+ jsonAppendRawNZ(pOgStr, "}", 2); /* Ensure it is zero-terminated */
+ jsonStringTrimOneChar(pOgStr); /* Remove the zero terminator */
pStr->pCtx = ctx;
if( pStr->eErr ){
jsonReturnString(pStr, 0, 0);
return;
- }else if( flags & JSON_BLOB ){
+ }
+ if( pStr->zBuf[0]!='{' ){
+ /* The string contains null entries that need to be removed */
+ u64 i, j;
+ int inStr = 0;
+ if( !isFinal ){
+ /* Work with a temporary copy of the string if this is not the
+ ** final result */
+ jsonStringInit(&tmpStr, ctx);
+ jsonAppendRawNZ(&tmpStr, pStr->zBuf, pStr->nUsed+1);
+ pStr = &tmpStr;
+ if( pStr->eErr ){
+ jsonReturnString(pStr, 0, 0);
+ return;
+ }
+ jsonStringTrimOneChar(pStr); /* Remove zero terminator */
+ }
+ /* Fix up the string by changing the initial "@" flag back to
+ ** to "{" and removing all subsequence "@" entries, with their
+ ** associated comma delimeters. */
+ pStr->zBuf[0] = '{';
+ for(i=j=1; inUsed; i++){
+ char c = pStr->zBuf[i];
+ if( c=='"' ){
+ inStr = !inStr;
+ pStr->zBuf[j++] = '"';
+ }else if( c=='\\' ){
+ pStr->zBuf[j++] = '\\';
+ pStr->zBuf[j++] = pStr->zBuf[++i];
+ }else if( c=='@' && !inStr ){
+ assert( i+1nUsed );
+ if( pStr->zBuf[i+1]==',' ){
+ i++;
+ }else if( pStr->zBuf[j-1]==',' ){
+ j--;
+ }
+ }else{
+ pStr->zBuf[j++] = c;
+ }
+ }
+ pStr->zBuf[j] = 0; /* Restore zero terminator */
+ pStr->nUsed = j; /* Truncate the string */
+ }
+ if( flags & JSON_BLOB ){
jsonReturnStringAsBlob(pStr);
if( isFinal ){
if( !pStr->bStatic ) sqlite3RCStrUnref(pStr->zBuf);
}else{
- jsonStringTrimOneChar(pStr);
+ jsonStringTrimOneChar(pOgStr);
}
- return;
}else if( isFinal ){
sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed,
pStr->bStatic ? SQLITE_TRANSIENT :
@@ -217377,8 +217563,9 @@ static void jsonObjectCompute(sqlite3_context *ctx, int isFinal){
pStr->bStatic = 1;
}else{
sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT);
- jsonStringTrimOneChar(pStr);
+ jsonStringTrimOneChar(pOgStr);
}
+ if( pStr!=pOgStr ) jsonStringReset(pStr);
}else if( flags & JSON_BLOB ){
static const unsigned char emptyObject = 0x0c;
sqlite3_result_blob(ctx, &emptyObject, 1, SQLITE_STATIC);
@@ -218230,7 +218417,7 @@ struct Rtree {
u8 eCoordType; /* RTREE_COORD_REAL32 or RTREE_COORD_INT32 */
u8 nBytesPerCell; /* Bytes consumed per cell */
u8 inWrTrans; /* True if inside write transaction */
- u8 nAux; /* # of auxiliary columns in %_rowid */
+ u16 nAux; /* # of auxiliary columns in %_rowid */
#ifdef SQLITE_ENABLE_GEOPOLY
u8 nAuxNotNull; /* Number of initial not-null aux columns */
#endif
@@ -219466,7 +219653,7 @@ static int nodeRowidIndex(
){
int ii;
int nCell = NCELL(pNode);
- assert( nCell<200 );
+ assert( nCell<65536 && nCell>=0 );
for(ii=0; iiRTREE_MAXCELLS ){
+ RTREE_IS_CORRUPT(pRtree);
+ return SQLITE_CORRUPT_VTAB;
+ }
pCellData = pNode->zData + (4+pRtree->nBytesPerCell*p->iCell);
while( p->iCellRTREE_MAX_AUX_COLUMN+3 ){
*pzErr = sqlite3_mprintf("%s", aErrMsg[2 + (argc>=6)]);
return SQLITE_ERROR;
@@ -223624,6 +223814,11 @@ static int geopolyInit(
int ii;
(void)pAux;
+ if( argc>=RTREE_MAX_AUX_COLUMN+4 ){
+ *pzErr = sqlite3_mprintf("Too many columns for a geopoly table");
+ return SQLITE_ERROR;
+ }
+
sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1);
sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
@@ -224758,7 +224953,7 @@ static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){
const UChar *zInput; /* Pointer to input string */
UChar *zOutput = 0; /* Pointer to output buffer */
int nInput; /* Size of utf-16 input string in bytes */
- int nOut; /* Size of output buffer in bytes */
+ sqlite3_int64 nOut; /* Size of output buffer in bytes */
int cnt;
int bToUpper; /* True for toupper(), false for tolower() */
UErrorCode status;
@@ -224781,7 +224976,7 @@ static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){
}
for(cnt=0; cnt<2; cnt++){
- UChar *zNew = sqlite3_realloc(zOutput, nOut);
+ UChar *zNew = sqlite3_realloc64(zOutput, nOut);
if( zNew==0 ){
sqlite3_free(zOutput);
sqlite3_result_error_nomem(p);
@@ -224790,9 +224985,9 @@ static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){
zOutput = zNew;
status = U_ZERO_ERROR;
if( bToUpper ){
- nOut = 2*u_strToUpper(zOutput,nOut/2,zInput,nInput/2,zLocale,&status);
+ nOut = 2LL*u_strToUpper(zOutput,nOut/2,zInput,nInput/2,zLocale,&status);
}else{
- nOut = 2*u_strToLower(zOutput,nOut/2,zInput,nInput/2,zLocale,&status);
+ nOut = 2LL*u_strToLower(zOutput,nOut/2,zInput,nInput/2,zLocale,&status);
}
if( U_SUCCESS(status) ){
@@ -232507,12 +232702,13 @@ static int dbpageFilter(
pCsr->szPage = sqlite3BtreeGetPageSize(pBt);
pCsr->mxPgno = sqlite3BtreeLastPage(pBt);
if( idxNum & 1 ){
+ i64 iPg = sqlite3_value_int64(argv[idxNum>>1]);
assert( argc>(idxNum>>1) );
- pCsr->pgno = sqlite3_value_int(argv[idxNum>>1]);
- if( pCsr->pgno<1 || pCsr->pgno>pCsr->mxPgno ){
+ if( iPg<1 || iPg>pCsr->mxPgno ){
pCsr->pgno = 1;
pCsr->mxPgno = 0;
}else{
+ pCsr->pgno = (Pgno)iPg;
pCsr->mxPgno = pCsr->pgno;
}
}else{
@@ -233952,10 +234148,11 @@ static int sessionSerialLen(const u8 *a){
int n;
assert( a!=0 );
e = *a;
- if( e==0 || e==0xFF ) return 1;
- if( e==SQLITE_NULL ) return 1;
if( e==SQLITE_INTEGER || e==SQLITE_FLOAT ) return 9;
- return sessionVarintGet(&a[1], &n) + 1 + n;
+ if( e==SQLITE_TEXT || e==SQLITE_BLOB ){
+ return sessionVarintGet(&a[1], &n) + 1 + n;
+ }
+ return 1;
}
/*
@@ -233978,17 +234175,17 @@ static unsigned int sessionChangeHash(
u8 *a = aRecord; /* Used to iterate through change record */
for(i=0; inCol; i++){
- int eType = *a;
int isPK = pTab->abPK[i];
if( bPkOnly && isPK==0 ) continue;
- assert( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT
- || eType==SQLITE_TEXT || eType==SQLITE_BLOB
- || eType==SQLITE_NULL || eType==0
- );
-
if( isPK ){
- a++;
+ int eType = *a++;
+
+ assert( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT
+ || eType==SQLITE_TEXT || eType==SQLITE_BLOB
+ || eType==SQLITE_NULL || eType==0
+ );
+
h = sessionHashAppendType(h, eType);
if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){
h = sessionHashAppendI64(h, sessionGetI64(a));
@@ -234858,6 +235055,16 @@ static int sessionPrepareDfltStmt(
return rc;
}
+/*
+** Finalize statement pStmt. If (*pRc) is SQLITE_OK when this function is
+** called, set it to the results of the sqlite3_finalize() call. Or, if
+** it is already set to an error code, leave it as is.
+*/
+static void sessionFinalizeStmt(sqlite3_stmt *pStmt, int *pRc){
+ int rc = sqlite3_finalize(pStmt);
+ if( *pRc==SQLITE_OK ) *pRc = rc;
+}
+
/*
** Table pTab has one or more existing change-records with old.* records
** with fewer than pTab->nCol columns. This function updates all such
@@ -234880,9 +235087,8 @@ static int sessionUpdateChanges(sqlite3_session *pSession, SessionTable *pTab){
}
}
+ sessionFinalizeStmt(pStmt, &rc);
pSession->rc = rc;
- rc = sqlite3_finalize(pStmt);
- if( pSession->rc==SQLITE_OK ) pSession->rc = rc;
return pSession->rc;
}
@@ -235450,7 +235656,7 @@ static int sessionDiffFindNew(
rc = SQLITE_NOMEM;
}else{
sqlite3_stmt *pStmt;
- rc = sqlite3_prepare(pSession->db, zStmt, -1, &pStmt, 0);
+ rc = sqlite3_prepare_v2(pSession->db, zStmt, -1, &pStmt, 0);
if( rc==SQLITE_OK ){
SessionDiffCtx *pDiffCtx = (SessionDiffCtx*)pSession->hook.pCtx;
pDiffCtx->pStmt = pStmt;
@@ -235513,7 +235719,7 @@ static int sessionDiffFindModified(
rc = SQLITE_NOMEM;
}else{
sqlite3_stmt *pStmt;
- rc = sqlite3_prepare(pSession->db, zStmt, -1, &pStmt, 0);
+ rc = sqlite3_prepare_v2(pSession->db, zStmt, -1, &pStmt, 0);
if( rc==SQLITE_OK ){
SessionDiffCtx *pDiffCtx = (SessionDiffCtx*)pSession->hook.pCtx;
@@ -236208,11 +236414,11 @@ static int sessionSelectStmt(
);
sessionAppendStr(&cols, "tbl, ?2, stat", &rc);
}else{
- #if 0
+#if 0
if( bRowid ){
sessionAppendStr(&cols, SESSIONS_ROWID, &rc);
}
- #endif
+#endif
for(i=0; iiNext+nByte)>pIn->nData ){
+ if( rc==SQLITE_OK && (pIn->iNext+nByte)>pIn->nData ){
rc = SQLITE_CORRUPT_BKPT;
}
}
@@ -237464,7 +237672,13 @@ static int sessionChangesetInvert(
/* Test for EOF. */
if( (rc = sessionInputBuffer(pInput, 2)) ) goto finished_invert;
- if( pInput->iNext>=pInput->nData ) break;
+ if( pInput->iNext+1>=pInput->nData ){
+ if( pInput->iNext!=pInput->nData ){
+ rc = SQLITE_CORRUPT_BKPT;
+ goto finished_invert;
+ }
+ break;
+ }
eType = pInput->aData[pInput->iNext];
switch( eType ){
@@ -237660,6 +237874,7 @@ struct SessionApplyCtx {
u8 bRebaseStarted; /* If table header is already in rebase */
u8 bRebase; /* True to collect rebase information */
u8 bIgnoreNoop; /* True to ignore no-op conflicts */
+ u8 bNoUpdateLoop; /* No update-loop processing */
int bRowid;
char *zErr; /* Error message, if any */
};
@@ -238233,7 +238448,7 @@ static int sessionConflictHandler(
u8 *aBlob = &pIter->in.aData[pIter->in.iCurrent];
int nBlob = pIter->in.iNext - pIter->in.iCurrent;
sessionAppendBlob(&p->constraints, aBlob, nBlob, &rc);
- return SQLITE_OK;
+ return rc;
}else if( p->bIgnoreNoop==0 || op!=SQLITE_DELETE
|| eType==SQLITE_CHANGESET_CONFLICT
){
@@ -238355,7 +238570,7 @@ static int sessionApplyOneOp(
for(i=0; rc==SQLITE_OK && iabPK[i] || (bPatchset==0 && pOld) ){
+ if( pOld && (p->abPK[i] || bPatchset==0) ){
rc = sessionBindValue(pUp, i*2+2, pOld);
}
if( rc==SQLITE_OK && pNew ){
@@ -238481,7 +238696,264 @@ static int sessionApplyOneWithRetry(
}
/*
-** Retry the changes accumulated in the pApply->constraints buffer.
+** Create an iterator to iterate through the retry buffer pRetry.
+*/
+static int sessionRetryIterInit(
+ SessionBuffer *pRetry, /* Buffer to iterate through */
+ int bPatchset, /* True for patchset, false for changeset */
+ const char *zTab, /* Table name */
+ SessionApplyCtx *pApply, /* Session apply context */
+ sqlite3_changeset_iter **ppIter /* OUT: New iterator */
+){
+ sqlite3_changeset_iter *pRet = 0;
+ int rc = SQLITE_OK;
+
+ rc = sessionChangesetStart(
+ &pRet, 0, 0, pRetry->nBuf, pRetry->aBuf, pApply->bInvertConstraints, 1
+ );
+ if( rc==SQLITE_OK ){
+ size_t nByte = 2*pApply->nCol*sizeof(sqlite3_value*);
+ pRet->bPatchset = bPatchset;
+ pRet->zTab = (char*)zTab;
+ pRet->nCol = pApply->nCol;
+ pRet->abPK = pApply->abPK;
+ sessionBufferGrow(&pRet->tblhdr, nByte, &rc);
+ pRet->apValue = (sqlite3_value**)pRet->tblhdr.aBuf;
+ if( rc==SQLITE_OK ){
+ memset(pRet->apValue, 0, nByte);
+ }else{
+ sqlite3changeset_finalize(pRet);
+ pRet = 0;
+ }
+ }
+
+ *ppIter = pRet;
+ return rc;
+}
+
+/*
+** Attempt to apply all the changes in retry buffer pRetry to the database.
+** Except, if parameter iSkip is greater than or equal to 0, skip change
+** iSkip.
+*/
+static int sessionApplyRetryBuffer(
+ SessionBuffer *pRetry, /* Buffer to apply changes from */
+ int iSkip, /* If >=0, index of change to omit */
+ sqlite3 *db, /* Database handle */
+ int bPatchset, /* True for patchset, false for changeset */
+ const char *zTab, /* Name of table to write to */
+ SessionApplyCtx *pApply, /* Apply context */
+ int(*xConflict)(void*, int, sqlite3_changeset_iter*),
+ void *pCtx /* First argument passed to xConflict */
+){
+ int rc = SQLITE_OK;
+ int rc2 = SQLITE_OK;
+ int ii = 0;
+ sqlite3_changeset_iter *pIter = 0;
+
+ assert( pApply->constraints.nBuf==0 );
+
+ rc = sessionRetryIterInit(pRetry, bPatchset, zTab, pApply, &pIter);
+
+ for(ii=0; rc==SQLITE_OK && SQLITE_ROW==sqlite3changeset_next(pIter); ii++){
+ if( ii!=iSkip ){
+ rc = sessionApplyOneWithRetry(db, pIter, pApply, xConflict, pCtx);
+ }
+ }
+
+ rc2 = sqlite3changeset_finalize(pIter);
+ if( rc==SQLITE_OK ) rc = rc2;
+ assert( pApply->bDeferConstraints || pApply->constraints.nBuf==0 );
+
+ return rc;
+}
+
+/*
+** Check if table zTab in the "main" database of db is a WITHOUT ROWID
+** table.
+**
+** If no error occurs, return SQLITE_OK and set output variable (*pbWR) to
+** true if zTab is a WITHOUT ROWID table, or false otherwise. Or, if an
+** error does occur, return an SQLite error code. The final value of (*pbWR)
+** is undefined in this case.
+*/
+static int sessionTableIsWithoutRowid(sqlite3 *db, const char *zTab, int *pbWR){
+ sqlite3_stmt *pList = 0;
+ char *zSql = 0;
+ int rc = SQLITE_OK;
+
+ zSql = sqlite3_mprintf("PRAGMA table_list = %Q", zTab);
+ if( zSql==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ rc = sqlite3_prepare_v2(db, zSql, -1, &pList, 0);
+ sqlite3_free(zSql);
+ }
+
+ if( rc==SQLITE_OK ){
+ sqlite3_step(pList);
+ *pbWR = sqlite3_column_int(pList, 4);
+ rc = sqlite3_finalize(pList);
+ }
+
+ return rc;
+}
+
+/*
+** Iterator pUp points to an UPDATE change. This function deletes the
+** affected row from the database and creates an INSERT statement that
+** may be used to reinsert the row as it is after the UPDATE change
+** has been applied.
+**
+** If successful, SQLITE_OK is returned and output variable (*ppInsert)
+** is left pointing to a prepared INSERT statement. It is the responsibility
+** of the caller to eventually free this statement using sqlite3_finalize().
+** Or, if an error occurs, an SQLite error code is returned and (*ppInsert)
+** set to NULL. pApply->zErr may be set to an error message in this case.
+*/
+static int sessionUpdateToDeleteInsert(
+ sqlite3 *db, /* Database to write to */
+ const char *zTab, /* Table name */
+ SessionApplyCtx *pApply, /* Apply context */
+ sqlite3_changeset_iter *pUp, /* Iterator pointing to UPDATE change */
+ sqlite3_stmt **ppInsert /* OUT: INSERT statement */
+){
+ sqlite3_stmt *pRet = 0; /* The INSERT statement */
+ sqlite3_stmt *pSelect = 0; /* SELECT to read current values of row */
+ int rc = SQLITE_OK;
+ int bWR = 0;
+
+ rc = sessionTableIsWithoutRowid(db, zTab, &bWR);
+ if( rc==SQLITE_OK ){
+ char *zSelect = 0;
+ char *zInsert = 0;
+ SessionBuffer cols = {0, 0, 0};
+ SessionBuffer insbind = {0, 0, 0};
+ SessionBuffer pkcols = {0, 0, 0};
+ SessionBuffer selbind = {0, 0, 0};
+
+ const char *zComma = "";
+ const char *zComma2 = "";
+ int ii;
+ for(ii=0; iinCol; ii++){
+ sessionAppendStr(&cols, zComma, &rc);
+ sessionAppendIdent(&cols, pApply->azCol[ii], &rc);
+ sessionAppendStr(&insbind, zComma, &rc);
+ sessionAppendStr(&insbind, "?", &rc);
+ zComma = ", ";
+
+ if( pApply->abPK[ii] ){
+ sessionAppendStr(&pkcols, zComma2, &rc);
+ sessionAppendIdent(&pkcols, pApply->azCol[ii], &rc);
+ sessionAppendStr(&selbind, zComma2, &rc);
+ sessionAppendPrintf(&selbind, &rc, "?%d", ii+1);
+ zComma2 = ", ";
+ }
+ }
+ if( bWR==0 ){
+ sessionAppendStr(&cols, zComma, &rc);
+ sessionAppendStr(&cols, SESSIONS_ROWID, &rc);
+ sessionAppendStr(&insbind, zComma, &rc);
+ sessionAppendStr(&insbind, "?", &rc);
+ }
+
+ if( rc==SQLITE_OK ){
+ zSelect = sqlite3_mprintf("SELECT %s FROM %Q WHERE (%s) IS (%s)",
+ cols.aBuf, zTab, pkcols.aBuf, selbind.aBuf
+ );
+ if( zSelect==0 ) rc = SQLITE_NOMEM;
+ }
+ if( rc==SQLITE_OK ){
+ zInsert = sqlite3_mprintf("INSERT INTO %Q(%s) VALUES(%s)",
+ zTab, cols.aBuf, insbind.aBuf
+ );
+ if( zInsert==0 ) rc = SQLITE_NOMEM;
+ }
+
+ if( rc==SQLITE_OK ){
+ rc = sessionPrepare(db, &pSelect, &pApply->zErr, zSelect);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sessionPrepare(db, &pRet, &pApply->zErr, zInsert);
+ }
+
+ sqlite3_free(zSelect);
+ sqlite3_free(zInsert);
+ sqlite3_free(cols.aBuf);
+ sqlite3_free(insbind.aBuf);
+ sqlite3_free(pkcols.aBuf);
+ sqlite3_free(selbind.aBuf);
+ }
+
+ if( rc==SQLITE_OK ){
+ rc = sessionBindRow(
+ pUp, sqlite3changeset_old, pApply->nCol, pApply->abPK, pSelect
+ );
+ }
+
+ if( rc==SQLITE_OK && sqlite3_step(pSelect)==SQLITE_ROW ){
+ int iCol;
+ for(iCol=0; iColnCol; iCol++){
+ sqlite3_value *pVal = pUp->apValue[iCol+pApply->nCol];
+ if( pVal==0 ){
+ pVal = sqlite3_column_value(pSelect, iCol);
+ }
+ rc = sqlite3_bind_value(pRet, iCol+1, pVal);
+ }
+ if( bWR==0 ){
+ sqlite3_bind_int64(pRet, iCol+1, sqlite3_column_int64(pSelect, iCol));
+ }
+ }
+ sessionFinalizeStmt(pSelect, &rc);
+
+ /* Delete the row from the database. */
+ if( rc==SQLITE_OK ){
+ rc = sessionBindRow(
+ pUp, sqlite3changeset_old, pApply->nCol, pApply->abPK, pApply->pDelete
+ );
+ sqlite3_bind_int(pApply->pDelete, pApply->nCol+1, 1);
+ }
+ if( rc==SQLITE_OK ){
+ sqlite3_step(pApply->pDelete);
+ rc = sqlite3_reset(pApply->pDelete);
+ }
+
+ if( rc!=SQLITE_OK ){
+ sqlite3_finalize(pRet);
+ pRet = 0;
+ }
+
+ *ppInsert = pRet;
+ return rc;
+}
+
+/*
+** Retry the changes accumulated in the pApply->constraints buffer. The
+** pApply->constraints buffer contains all changes to table zTab that
+** could not be applied due to SQLITE_CONSTRAINT errors. This function
+** attempts to apply them as follows:
+**
+** 1) It runs through the buffer and attempts to retry each change,
+** removing any that are successfully applied from the buffer. This
+** is repeated until no further progress can be made.
+**
+** 2) For each UPDATE change in the buffer, try the following in a
+** savepoint transaction:
+**
+** a) DELETE the affected row,
+** b) Attempt step (1) with remaining changes,
+** c) Attempt to INSERT a row equivalent to the one that would be
+** created by applying this UPDATE change.
+**
+** If the INSERT in (c) succeeds, the savepoint is committed and all
+** successfully applied changes are removed from the buffer. Step (2)
+** is then repeated.
+**
+** 3) Once step (2) has been attempted for each UPDATE in the change,
+** a final attempt is made to apply each remaining change. This time,
+** if an SQLITE_CONSTRAINT error is encountered, the conflict handler
+** is invoked and the user has to decide whether to omit the change
+** or rollback the entire _apply() operation.
*/
static int sessionRetryConstraints(
sqlite3 *db,
@@ -238492,41 +238964,101 @@ static int sessionRetryConstraints(
void *pCtx /* First argument passed to xConflict */
){
int rc = SQLITE_OK;
+ int iUpdate = 0;
+ /* Step (1) */
while( pApply->constraints.nBuf ){
- sqlite3_changeset_iter *pIter2 = 0;
SessionBuffer cons = pApply->constraints;
memset(&pApply->constraints, 0, sizeof(SessionBuffer));
- rc = sessionChangesetStart(
- &pIter2, 0, 0, cons.nBuf, cons.aBuf, pApply->bInvertConstraints, 1
+ rc = sessionApplyRetryBuffer(
+ &cons, -1, db, bPatchset, zTab, pApply, xConflict, pCtx
+ );
+
+ sqlite3_free(cons.aBuf);
+ if( rc!=SQLITE_OK ) break;
+
+ /* If no progress has been made this round, break out of the loop. */
+ if( pApply->constraints.nBuf>=cons.nBuf ) break;
+ }
+
+ /* Step (2) */
+ while( rc==SQLITE_OK && pApply->constraints.nBuf && !pApply->bNoUpdateLoop ){
+ SessionBuffer cons = {0, 0, 0};
+ sqlite3_changeset_iter *pUp = 0;
+ sqlite3_stmt *pInsert = 0;
+ int iSkip = 0;
+
+ rc = sessionRetryIterInit(
+ &pApply->constraints, bPatchset, zTab, pApply, &pUp
);
if( rc==SQLITE_OK ){
- size_t nByte = 2*pApply->nCol*sizeof(sqlite3_value*);
- int rc2;
- pIter2->bPatchset = bPatchset;
- pIter2->zTab = (char*)zTab;
- pIter2->nCol = pApply->nCol;
- pIter2->abPK = pApply->abPK;
- sessionBufferGrow(&pIter2->tblhdr, nByte, &rc);
- pIter2->apValue = (sqlite3_value**)pIter2->tblhdr.aBuf;
- if( rc==SQLITE_OK ) memset(pIter2->apValue, 0, nByte);
+ int iThis = -1;
+ while( SQLITE_ROW==sqlite3changeset_next(pUp) ){
+ if( pUp->op==SQLITE_UPDATE ) iThis++;
+ if( iThis==iUpdate ) break;
+ iSkip++;
+ }
+ if( iThis==iUpdate ){
+ rc = sqlite3_exec(db, "SAVEPOINT update_op", 0, 0, 0);
+ if( rc==SQLITE_OK ){
+ rc = sessionUpdateToDeleteInsert(db, zTab, pApply, pUp, &pInsert);
+ }
+ }
+ sqlite3changeset_finalize(pUp);
+ if( iThis!=iUpdate ) break;
+ }
+
+ if( rc==SQLITE_OK ){
+ cons = pApply->constraints;
- while( rc==SQLITE_OK && SQLITE_ROW==sqlite3changeset_next(pIter2) ){
- rc = sessionApplyOneWithRetry(db, pIter2, pApply, xConflict, pCtx);
+ while( rc==SQLITE_OK && pApply->constraints.nBuf>0 ){
+ SessionBuffer app = pApply->constraints;
+ memset(&pApply->constraints, 0, sizeof(SessionBuffer));
+ rc = sessionApplyRetryBuffer(
+ &app, iSkip, db, bPatchset, zTab, pApply, xConflict, pCtx
+ );
+ if( app.aBuf!=cons.aBuf ){
+ sqlite3_free(app.aBuf);
+ }
+ if( pApply->constraints.nBuf>=app.nBuf ){
+ break;
+ }
+ iSkip = -1;
}
+ }
- rc2 = sqlite3changeset_finalize(pIter2);
- if( rc==SQLITE_OK ) rc = rc2;
+ iUpdate++;
+ if( rc==SQLITE_OK ){
+ sqlite3_step(pInsert);
+ rc = sqlite3_finalize(pInsert);
+ if( rc==SQLITE_CONSTRAINT ){
+ rc = sqlite3_exec(db, "ROLLBACK TO update_op", 0, 0, 0);
+ sqlite3_free(pApply->constraints.aBuf);
+ pApply->constraints = cons;
+ memset(&cons, 0, sizeof(cons));
+ }else if( rc==SQLITE_OK ){
+ iUpdate = 0;
+ }
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_exec(db, "RELEASE update_op", 0, 0, 0);
+ }
+ }else{
+ sqlite3_finalize(pInsert);
}
- assert( pApply->bDeferConstraints || pApply->constraints.nBuf==0 );
sqlite3_free(cons.aBuf);
- if( rc!=SQLITE_OK ) break;
- if( pApply->constraints.nBuf>=cons.nBuf ){
- /* No progress was made on the last round. */
- pApply->bDeferConstraints = 0;
- }
+ }
+
+ /* Step (3) */
+ if( rc==SQLITE_OK && pApply->constraints.nBuf ){
+ SessionBuffer cons = pApply->constraints;
+ memset(&pApply->constraints, 0, sizeof(SessionBuffer));
+ pApply->bDeferConstraints = 0;
+ rc = sessionApplyRetryBuffer(
+ &cons, -1, db, bPatchset, zTab, pApply, xConflict, pCtx
+ );
+ sqlite3_free(cons.aBuf);
}
return rc;
@@ -238580,6 +239112,7 @@ static int sessionChangesetApply(
sApply.bRebase = (ppRebase && pnRebase);
sApply.bInvertConstraints = !!(flags & SQLITE_CHANGESETAPPLY_INVERT);
sApply.bIgnoreNoop = !!(flags & SQLITE_CHANGESETAPPLY_IGNORENOOP);
+ sApply.bNoUpdateLoop = !!(flags & SQLITE_CHANGESETAPPLY_NOUPDATELOOP);
if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){
rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0);
}
@@ -240391,7 +240924,7 @@ SQLITE_API int sqlite3changegroup_change_blob(
const void *pVal,
int nVal
){
- sqlite3_int64 nByte = 1 + sessionVarintLen(nVal) + nVal;
+ sqlite3_int64 nByte = 1 + sessionVarintLen(nVal) + (i64)nVal;
int rc = SQLITE_OK;
SessionBuffer *pBuf = 0;
@@ -250975,7 +251508,7 @@ static void fts5DataRelease(Fts5Data *pData){
static Fts5Data *fts5LeafRead(Fts5Index *p, i64 iRowid){
Fts5Data *pRet = fts5DataRead(p, iRowid);
if( pRet ){
- if( pRet->nn<4 || pRet->szLeaf>pRet->nn ){
+ if( pRet->szLeaf<4 || pRet->szLeaf>pRet->nn ){
FTS5_CORRUPT_ROWID(p, iRowid);
fts5DataRelease(pRet);
pRet = 0;
@@ -252629,6 +253162,10 @@ static void fts5LeafSeek(
if( nKeepn ){
+ FTS5_CORRUPT_ITER(p, pIter);
+ return;
+ }
assert( nKeep>=nMatch );
if( nKeep==nMatch ){
@@ -253605,8 +254142,7 @@ static void fts5PoslistFilterCallback(
do {
while( ieState ){
fts5BufferSafeAppendBlob(pCtx->pBuf, &pChunk[iStart], i-iStart);
@@ -253755,7 +254291,7 @@ static void fts5IndexExtractColset(
/* Advance pointer p until it points to pEnd or an 0x01 byte that is
** not part of a varint */
while( paiCol[i]==iCurrent ){
@@ -253852,8 +254388,11 @@ static void fts5IterSetOutputs_Col100(Fts5Iter *pIter, Fts5SegIter *pSeg){
assert( pIter->pIndex->pConfig->eDetail==FTS5_DETAIL_COLUMNS );
assert( pIter->pColset );
+ assert( pIter->poslist.nSpace>=pIter->pIndex->pConfig->nCol );
- if( pSeg->iLeafOffset+pSeg->nPos>pSeg->pLeaf->szLeaf ){
+ if( pSeg->iLeafOffset+pSeg->nPos>pSeg->pLeaf->szLeaf
+ || pSeg->nPos>pIter->pIndex->pConfig->nCol
+ ){
fts5IterSetOutputs_Col(pIter, pSeg);
}else{
u8 *a = (u8*)&pSeg->pLeaf->p[pSeg->iLeafOffset];
@@ -255347,6 +255886,11 @@ static void fts5DoSecureDelete(
}else{
iStart = fts5GetU16(&aPg[0]);
}
+ if( iStart>nPg ){
+ FTS5_CORRUPT_IDX(p);
+ sqlite3_free(aIdx);
+ return;
+ }
iSOP = iStart + fts5GetVarint(&aPg[iStart], &iDelta);
assert_nc( iSOP<=pSeg->iLeafOffset );
@@ -263223,7 +263767,7 @@ static void fts5SourceIdFunc(
){
assert( nArg==0 );
UNUSED_PARAM2(nArg, apUnused);
- sqlite3_result_text(pCtx, "fts5: 2026-04-09 11:41:38 4525003a53a7fc63ca75c59b22c79608659ca12f0131f52c18637f829977f20b", -1, SQLITE_TRANSIENT);
+ sqlite3_result_text(pCtx, "fts5: 2026-06-03 19:12:13 d6e03d8c777cfa2d35e3b60d8ec3e0187f3e9f99d8e2ee9cac695fd6fcdf1a24", -1, SQLITE_TRANSIENT);
}
/*
@@ -265617,8 +266161,14 @@ static int fts5PorterCreate(
const char *zBase = "unicode61";
fts5_tokenizer_v2 *pV2 = 0;
- if( nArg>0 ){
- zBase = azArg[0];
+ while( nArg>0 ){
+ if( sqlite3_stricmp(azArg[0],"porter")==0 ){
+ nArg--;
+ azArg++;
+ }else{
+ zBase = azArg[0];
+ break;
+ }
}
pRet = (PorterTokenizer*)sqlite3_malloc64(sizeof(PorterTokenizer));
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h b/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h
index 7ae4e90d36..7ea576038a 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h
@@ -147,12 +147,12 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
-#define SQLITE_VERSION "3.53.0"
-#define SQLITE_VERSION_NUMBER 3053000
-#define SQLITE_SOURCE_ID "2026-04-09 11:41:38 4525003a53a7fc63ca75c59b22c79608659ca12f0131f52c18637f829977f20b"
-#define SQLITE_SCM_BRANCH "trunk"
-#define SQLITE_SCM_TAGS "release major-release version-3.53.0"
-#define SQLITE_SCM_DATETIME "2026-04-09T11:41:38.498Z"
+#define SQLITE_VERSION "3.53.2"
+#define SQLITE_VERSION_NUMBER 3053002
+#define SQLITE_SOURCE_ID "2026-06-03 19:12:13 d6e03d8c777cfa2d35e3b60d8ec3e0187f3e9f99d8e2ee9cac695fd6fcdf1a24"
+#define SQLITE_SCM_BRANCH "branch-3.53"
+#define SQLITE_SCM_TAGS "release version-3.53.2"
+#define SQLITE_SCM_DATETIME "2026-06-03T19:12:13.350Z"
/*
** CAPI3REF: Run-Time Library Version Numbers
@@ -12854,11 +12854,23 @@ SQLITE_API int sqlite3changeset_apply_v3(
** database behave as if they were declared with "ON UPDATE NO ACTION ON
** DELETE NO ACTION", even if they are actually CASCADE, RESTRICT, SET NULL
** or SET DEFAULT.
+**
+**
SQLITE_CHANGESETAPPLY_NOUPDATELOOP
+** Sometimes, a changeset contains two or more update statements such that
+** although after applying all updates the database will contain no
+** constraint violations, no single update can be applied before the others.
+** The simplest example of this is a pair of UPDATEs that have "swapped"
+** two column values with a UNIQUE constraint.
+**
+** Usually, sqlite3changeset_apply() and similar functions work hard to try
+** to find a way to apply such a changeset. However, if this flag is set,
+** then all such updates are considered CONSTRAINT conflicts.
*/
#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001
#define SQLITE_CHANGESETAPPLY_INVERT 0x0002
#define SQLITE_CHANGESETAPPLY_IGNORENOOP 0x0004
#define SQLITE_CHANGESETAPPLY_FKNOACTION 0x0008
+#define SQLITE_CHANGESETAPPLY_NOUPDATELOOP 0x0010
/*
** CAPI3REF: Constants Passed To The Conflict Handler
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3.go b/vendor/github.com/mattn/go-sqlite3/sqlite3.go
index b9deb72aa5..b07bfc7c1f 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3.go
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3.go
@@ -69,13 +69,13 @@ _sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zV
}
static int
-_sqlite3_bind_text(sqlite3_stmt *stmt, int n, char *p, int np) {
- return sqlite3_bind_text(stmt, n, p, np, SQLITE_TRANSIENT);
+_sqlite3_bind_text(sqlite3_stmt *stmt, int n, char *p, sqlite3_uint64 np) {
+ return sqlite3_bind_text64(stmt, n, p, np, SQLITE_TRANSIENT, SQLITE_UTF8);
}
static int
-_sqlite3_bind_blob(sqlite3_stmt *stmt, int n, void *p, int np) {
- return sqlite3_bind_blob(stmt, n, p, np, SQLITE_TRANSIENT);
+_sqlite3_bind_blob(sqlite3_stmt *stmt, int n, void *p, sqlite3_uint64 np) {
+ return sqlite3_bind_blob64(stmt, n, p, np, SQLITE_TRANSIENT);
}
typedef struct {
@@ -2180,9 +2180,9 @@ var placeHolder = []byte{0}
func bindText(s *C.sqlite3_stmt, n C.int, v string) C.int {
if len(v) == 0 {
- return C._sqlite3_bind_text(s, n, (*C.char)(unsafe.Pointer(&placeHolder[0])), C.int(0))
+ return C._sqlite3_bind_text(s, n, (*C.char)(unsafe.Pointer(&placeHolder[0])), C.sqlite3_uint64(0))
}
- return C._sqlite3_bind_text(s, n, (*C.char)(unsafe.Pointer(unsafe.StringData(v))), C.int(len(v)))
+ return C._sqlite3_bind_text(s, n, (*C.char)(unsafe.Pointer(unsafe.StringData(v))), C.sqlite3_uint64(len(v)))
}
func bindValue(s *C.sqlite3_stmt, n C.int, value driver.Value) C.int {
@@ -2208,14 +2208,14 @@ func bindValue(s *C.sqlite3_stmt, n C.int, value driver.Value) C.int {
if ln == 0 {
v = placeHolder
}
- return C._sqlite3_bind_blob(s, n, unsafe.Pointer(&v[0]), C.int(ln))
+ return C._sqlite3_bind_blob(s, n, unsafe.Pointer(&v[0]), C.sqlite3_uint64(ln))
case time.Time:
var buf [64]byte
b := v.AppendFormat(buf[:0], SQLiteTimestampFormats[0])
if len(b) == 0 {
- return C._sqlite3_bind_text(s, n, (*C.char)(unsafe.Pointer(&placeHolder[0])), C.int(0))
+ return C._sqlite3_bind_text(s, n, (*C.char)(unsafe.Pointer(&placeHolder[0])), C.sqlite3_uint64(0))
}
- return C._sqlite3_bind_text(s, n, (*C.char)(unsafe.Pointer(&b[0])), C.int(len(b)))
+ return C._sqlite3_bind_text(s, n, (*C.char)(unsafe.Pointer(&b[0])), C.sqlite3_uint64(len(b)))
default:
return C.SQLITE_MISUSE
}
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3_context.go b/vendor/github.com/mattn/go-sqlite3/sqlite3_context.go
index 7c7431dcce..4436279e9c 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3_context.go
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3_context.go
@@ -28,7 +28,6 @@ import "C"
import (
"math"
- "reflect"
"unsafe"
)
@@ -91,9 +90,15 @@ func (c *SQLiteContext) ResultNull() {
// ResultText sets the result of an SQL function.
// See: sqlite3_result_text, http://sqlite.org/c3ref/result_blob.html
func (c *SQLiteContext) ResultText(s string) {
- h := (*reflect.StringHeader)(unsafe.Pointer(&s))
- cs, l := (*C.char)(unsafe.Pointer(h.Data)), C.int(h.Len)
- C.my_result_text((*C.sqlite3_context)(c), cs, l)
+ if i64 && len(s) > math.MaxInt32 {
+ C.sqlite3_result_error_toobig((*C.sqlite3_context)(c))
+ return
+ }
+ if len(s) == 0 {
+ C.my_result_text((*C.sqlite3_context)(c), (*C.char)(unsafe.Pointer(&placeHolder[0])), 0)
+ return
+ }
+ C.my_result_text((*C.sqlite3_context)(c), (*C.char)(unsafe.Pointer(unsafe.StringData(s))), C.int(len(s)))
}
// ResultZeroblob sets the result of an SQL function.
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_dbstat.go b/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_dbstat.go
new file mode 100644
index 0000000000..d033846144
--- /dev/null
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_dbstat.go
@@ -0,0 +1,15 @@
+// Copyright (C) 2025 Yasuhiro Matsumoto .
+// Copyright (C) 2025 Jakob Borg .
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+//go:build sqlite_dbstat
+// +build sqlite_dbstat
+
+package sqlite3
+
+/*
+#cgo CFLAGS: -DSQLITE_ENABLE_DBSTAT_VTAB
+*/
+import "C"
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go b/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go
index 3ac8050a4a..dddb655da8 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go
@@ -21,6 +21,7 @@ package sqlite3
extern void unlock_notify_callback(void *arg, int argc);
*/
import "C"
+
import (
"fmt"
"math"
@@ -82,7 +83,7 @@ func unlock_notify_wait(db *C.sqlite3) C.int {
h := unt.add(c)
defer unt.remove(h)
- pargv := C.malloc(C.sizeof_uint)
+ pargv := C.malloc(C.size_t(unsafe.Sizeof(uint(0))))
defer C.free(pargv)
argv := (*[1]uint)(pargv)
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_vtable.go b/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_vtable.go
index 9761bf3570..7c2ae58e5d 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_vtable.go
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_vtable.go
@@ -270,7 +270,6 @@ import "C"
import (
"fmt"
"math"
- "reflect"
"unsafe"
)
@@ -329,11 +328,7 @@ type InfoOrderBy struct {
}
func constraints(info *C.sqlite3_index_info) []InfoConstraint {
- slice := *(*[]C.struct_sqlite3_index_constraint)(unsafe.Pointer(&reflect.SliceHeader{
- Data: uintptr(unsafe.Pointer(info.aConstraint)),
- Len: int(info.nConstraint),
- Cap: int(info.nConstraint),
- }))
+ slice := unsafe.Slice(info.aConstraint, int(info.nConstraint))
cst := make([]InfoConstraint, 0, len(slice))
for _, c := range slice {
@@ -351,11 +346,7 @@ func constraints(info *C.sqlite3_index_info) []InfoConstraint {
}
func orderBys(info *C.sqlite3_index_info) []InfoOrderBy {
- slice := *(*[]C.struct_sqlite3_index_orderby)(unsafe.Pointer(&reflect.SliceHeader{
- Data: uintptr(unsafe.Pointer(info.aOrderBy)),
- Len: int(info.nOrderBy),
- Cap: int(info.nOrderBy),
- }))
+ slice := unsafe.Slice(info.aOrderBy, int(info.nOrderBy))
ob := make([]InfoOrderBy, 0, len(slice))
for _, c := range slice {
@@ -400,10 +391,7 @@ func goMInit(db, pClientData unsafe.Pointer, argc C.int, argv **C.char, pzErr **
return 0
}
args := make([]string, argc)
- var A []*C.char
- slice := reflect.SliceHeader{Data: uintptr(unsafe.Pointer(argv)), Len: int(argc), Cap: int(argc)}
- a := reflect.NewAt(reflect.TypeOf(A), unsafe.Pointer(&slice)).Elem().Interface()
- for i, s := range a.([]*C.char) {
+ for i, s := range unsafe.Slice(argv, int(argc)) {
args[i] = C.GoString(s)
}
var vTab VTab
@@ -466,11 +454,7 @@ func goVBestIndex(pVTab unsafe.Pointer, icp unsafe.Pointer) *C.char {
// Get a pointer to constraint_usage struct so we can update in place.
- slice := *(*[]C.struct_sqlite3_index_constraint_usage)(unsafe.Pointer(&reflect.SliceHeader{
- Data: uintptr(unsafe.Pointer(info.aConstraintUsage)),
- Len: int(info.nConstraint),
- Cap: int(info.nConstraint),
- }))
+ slice := unsafe.Slice(info.aConstraintUsage, int(info.nConstraint))
index := 1
for i := range slice {
if res.Used[i] {
@@ -488,11 +472,7 @@ func goVBestIndex(pVTab unsafe.Pointer, icp unsafe.Pointer) *C.char {
}
info.needToFreeIdxStr = C.int(1)
- idxStr := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
- Data: uintptr(unsafe.Pointer(info.idxStr)),
- Len: len(res.IdxStr) + 1,
- Cap: len(res.IdxStr) + 1,
- }))
+ idxStr := unsafe.Slice((*byte)(unsafe.Pointer(info.idxStr)), len(res.IdxStr)+1)
copy(idxStr, res.IdxStr)
idxStr[len(idxStr)-1] = 0 // null-terminated string
diff --git a/vendor/github.com/mxk/go-flowrate/flowrate/flowrate.go b/vendor/github.com/mxk/go-flowrate/flowrate/flowrate.go
deleted file mode 100644
index 1b727721e1..0000000000
--- a/vendor/github.com/mxk/go-flowrate/flowrate/flowrate.go
+++ /dev/null
@@ -1,267 +0,0 @@
-//
-// Written by Maxim Khitrov (November 2012)
-//
-
-// Package flowrate provides the tools for monitoring and limiting the flow rate
-// of an arbitrary data stream.
-package flowrate
-
-import (
- "math"
- "sync"
- "time"
-)
-
-// Monitor monitors and limits the transfer rate of a data stream.
-type Monitor struct {
- mu sync.Mutex // Mutex guarding access to all internal fields
- active bool // Flag indicating an active transfer
- start time.Duration // Transfer start time (clock() value)
- bytes int64 // Total number of bytes transferred
- samples int64 // Total number of samples taken
-
- rSample float64 // Most recent transfer rate sample (bytes per second)
- rEMA float64 // Exponential moving average of rSample
- rPeak float64 // Peak transfer rate (max of all rSamples)
- rWindow float64 // rEMA window (seconds)
-
- sBytes int64 // Number of bytes transferred since sLast
- sLast time.Duration // Most recent sample time (stop time when inactive)
- sRate time.Duration // Sampling rate
-
- tBytes int64 // Number of bytes expected in the current transfer
- tLast time.Duration // Time of the most recent transfer of at least 1 byte
-}
-
-// New creates a new flow control monitor. Instantaneous transfer rate is
-// measured and updated for each sampleRate interval. windowSize determines the
-// weight of each sample in the exponential moving average (EMA) calculation.
-// The exact formulas are:
-//
-// sampleTime = currentTime - prevSampleTime
-// sampleRate = byteCount / sampleTime
-// weight = 1 - exp(-sampleTime/windowSize)
-// newRate = weight*sampleRate + (1-weight)*oldRate
-//
-// The default values for sampleRate and windowSize (if <= 0) are 100ms and 1s,
-// respectively.
-func New(sampleRate, windowSize time.Duration) *Monitor {
- if sampleRate = clockRound(sampleRate); sampleRate <= 0 {
- sampleRate = 5 * clockRate
- }
- if windowSize <= 0 {
- windowSize = 1 * time.Second
- }
- now := clock()
- return &Monitor{
- active: true,
- start: now,
- rWindow: windowSize.Seconds(),
- sLast: now,
- sRate: sampleRate,
- tLast: now,
- }
-}
-
-// Update records the transfer of n bytes and returns n. It should be called
-// after each Read/Write operation, even if n is 0.
-func (m *Monitor) Update(n int) int {
- m.mu.Lock()
- m.update(n)
- m.mu.Unlock()
- return n
-}
-
-// IO is a convenience method intended to wrap io.Reader and io.Writer method
-// execution. It calls m.Update(n) and then returns (n, err) unmodified.
-func (m *Monitor) IO(n int, err error) (int, error) {
- return m.Update(n), err
-}
-
-// Done marks the transfer as finished and prevents any further updates or
-// limiting. Instantaneous and current transfer rates drop to 0. Update, IO, and
-// Limit methods become NOOPs. It returns the total number of bytes transferred.
-func (m *Monitor) Done() int64 {
- m.mu.Lock()
- if now := m.update(0); m.sBytes > 0 {
- m.reset(now)
- }
- m.active = false
- m.tLast = 0
- n := m.bytes
- m.mu.Unlock()
- return n
-}
-
-// timeRemLimit is the maximum Status.TimeRem value.
-const timeRemLimit = 999*time.Hour + 59*time.Minute + 59*time.Second
-
-// Status represents the current Monitor status. All transfer rates are in bytes
-// per second rounded to the nearest byte.
-type Status struct {
- Active bool // Flag indicating an active transfer
- Start time.Time // Transfer start time
- Duration time.Duration // Time period covered by the statistics
- Idle time.Duration // Time since the last transfer of at least 1 byte
- Bytes int64 // Total number of bytes transferred
- Samples int64 // Total number of samples taken
- InstRate int64 // Instantaneous transfer rate
- CurRate int64 // Current transfer rate (EMA of InstRate)
- AvgRate int64 // Average transfer rate (Bytes / Duration)
- PeakRate int64 // Maximum instantaneous transfer rate
- BytesRem int64 // Number of bytes remaining in the transfer
- TimeRem time.Duration // Estimated time to completion
- Progress Percent // Overall transfer progress
-}
-
-// Status returns current transfer status information. The returned value
-// becomes static after a call to Done.
-func (m *Monitor) Status() Status {
- m.mu.Lock()
- now := m.update(0)
- s := Status{
- Active: m.active,
- Start: clockToTime(m.start),
- Duration: m.sLast - m.start,
- Idle: now - m.tLast,
- Bytes: m.bytes,
- Samples: m.samples,
- PeakRate: round(m.rPeak),
- BytesRem: m.tBytes - m.bytes,
- Progress: percentOf(float64(m.bytes), float64(m.tBytes)),
- }
- if s.BytesRem < 0 {
- s.BytesRem = 0
- }
- if s.Duration > 0 {
- rAvg := float64(s.Bytes) / s.Duration.Seconds()
- s.AvgRate = round(rAvg)
- if s.Active {
- s.InstRate = round(m.rSample)
- s.CurRate = round(m.rEMA)
- if s.BytesRem > 0 {
- if tRate := 0.8*m.rEMA + 0.2*rAvg; tRate > 0 {
- ns := float64(s.BytesRem) / tRate * 1e9
- if ns > float64(timeRemLimit) {
- ns = float64(timeRemLimit)
- }
- s.TimeRem = clockRound(time.Duration(ns))
- }
- }
- }
- }
- m.mu.Unlock()
- return s
-}
-
-// Limit restricts the instantaneous (per-sample) data flow to rate bytes per
-// second. It returns the maximum number of bytes (0 <= n <= want) that may be
-// transferred immediately without exceeding the limit. If block == true, the
-// call blocks until n > 0. want is returned unmodified if want < 1, rate < 1,
-// or the transfer is inactive (after a call to Done).
-//
-// At least one byte is always allowed to be transferred in any given sampling
-// period. Thus, if the sampling rate is 100ms, the lowest achievable flow rate
-// is 10 bytes per second.
-//
-// For usage examples, see the implementation of Reader and Writer in io.go.
-func (m *Monitor) Limit(want int, rate int64, block bool) (n int) {
- if want < 1 || rate < 1 {
- return want
- }
- m.mu.Lock()
-
- // Determine the maximum number of bytes that can be sent in one sample
- limit := round(float64(rate) * m.sRate.Seconds())
- if limit <= 0 {
- limit = 1
- }
-
- // If block == true, wait until m.sBytes < limit
- if now := m.update(0); block {
- for m.sBytes >= limit && m.active {
- now = m.waitNextSample(now)
- }
- }
-
- // Make limit <= want (unlimited if the transfer is no longer active)
- if limit -= m.sBytes; limit > int64(want) || !m.active {
- limit = int64(want)
- }
- m.mu.Unlock()
-
- if limit < 0 {
- limit = 0
- }
- return int(limit)
-}
-
-// SetTransferSize specifies the total size of the data transfer, which allows
-// the Monitor to calculate the overall progress and time to completion.
-func (m *Monitor) SetTransferSize(bytes int64) {
- if bytes < 0 {
- bytes = 0
- }
- m.mu.Lock()
- m.tBytes = bytes
- m.mu.Unlock()
-}
-
-// update accumulates the transferred byte count for the current sample until
-// clock() - m.sLast >= m.sRate. The monitor status is updated once the current
-// sample is done.
-func (m *Monitor) update(n int) (now time.Duration) {
- if !m.active {
- return
- }
- if now = clock(); n > 0 {
- m.tLast = now
- }
- m.sBytes += int64(n)
- if sTime := now - m.sLast; sTime >= m.sRate {
- t := sTime.Seconds()
- if m.rSample = float64(m.sBytes) / t; m.rSample > m.rPeak {
- m.rPeak = m.rSample
- }
-
- // Exponential moving average using a method similar to *nix load
- // average calculation. Longer sampling periods carry greater weight.
- if m.samples > 0 {
- w := math.Exp(-t / m.rWindow)
- m.rEMA = m.rSample + w*(m.rEMA-m.rSample)
- } else {
- m.rEMA = m.rSample
- }
- m.reset(now)
- }
- return
-}
-
-// reset clears the current sample state in preparation for the next sample.
-func (m *Monitor) reset(sampleTime time.Duration) {
- m.bytes += m.sBytes
- m.samples++
- m.sBytes = 0
- m.sLast = sampleTime
-}
-
-// waitNextSample sleeps for the remainder of the current sample. The lock is
-// released and reacquired during the actual sleep period, so it's possible for
-// the transfer to be inactive when this method returns.
-func (m *Monitor) waitNextSample(now time.Duration) time.Duration {
- const minWait = 5 * time.Millisecond
- current := m.sLast
-
- // sleep until the last sample time changes (ideally, just one iteration)
- for m.sLast == current && m.active {
- d := current + m.sRate - now
- m.mu.Unlock()
- if d < minWait {
- d = minWait
- }
- time.Sleep(d)
- m.mu.Lock()
- now = m.update(0)
- }
- return now
-}
diff --git a/vendor/github.com/mxk/go-flowrate/flowrate/io.go b/vendor/github.com/mxk/go-flowrate/flowrate/io.go
deleted file mode 100644
index fbe0909725..0000000000
--- a/vendor/github.com/mxk/go-flowrate/flowrate/io.go
+++ /dev/null
@@ -1,133 +0,0 @@
-//
-// Written by Maxim Khitrov (November 2012)
-//
-
-package flowrate
-
-import (
- "errors"
- "io"
-)
-
-// ErrLimit is returned by the Writer when a non-blocking write is short due to
-// the transfer rate limit.
-var ErrLimit = errors.New("flowrate: flow rate limit exceeded")
-
-// Limiter is implemented by the Reader and Writer to provide a consistent
-// interface for monitoring and controlling data transfer.
-type Limiter interface {
- Done() int64
- Status() Status
- SetTransferSize(bytes int64)
- SetLimit(new int64) (old int64)
- SetBlocking(new bool) (old bool)
-}
-
-// Reader implements io.ReadCloser with a restriction on the rate of data
-// transfer.
-type Reader struct {
- io.Reader // Data source
- *Monitor // Flow control monitor
-
- limit int64 // Rate limit in bytes per second (unlimited when <= 0)
- block bool // What to do when no new bytes can be read due to the limit
-}
-
-// NewReader restricts all Read operations on r to limit bytes per second.
-func NewReader(r io.Reader, limit int64) *Reader {
- return &Reader{r, New(0, 0), limit, true}
-}
-
-// Read reads up to len(p) bytes into p without exceeding the current transfer
-// rate limit. It returns (0, nil) immediately if r is non-blocking and no new
-// bytes can be read at this time.
-func (r *Reader) Read(p []byte) (n int, err error) {
- p = p[:r.Limit(len(p), r.limit, r.block)]
- if len(p) > 0 {
- n, err = r.IO(r.Reader.Read(p))
- }
- return
-}
-
-// SetLimit changes the transfer rate limit to new bytes per second and returns
-// the previous setting.
-func (r *Reader) SetLimit(new int64) (old int64) {
- old, r.limit = r.limit, new
- return
-}
-
-// SetBlocking changes the blocking behavior and returns the previous setting. A
-// Read call on a non-blocking reader returns immediately if no additional bytes
-// may be read at this time due to the rate limit.
-func (r *Reader) SetBlocking(new bool) (old bool) {
- old, r.block = r.block, new
- return
-}
-
-// Close closes the underlying reader if it implements the io.Closer interface.
-func (r *Reader) Close() error {
- defer r.Done()
- if c, ok := r.Reader.(io.Closer); ok {
- return c.Close()
- }
- return nil
-}
-
-// Writer implements io.WriteCloser with a restriction on the rate of data
-// transfer.
-type Writer struct {
- io.Writer // Data destination
- *Monitor // Flow control monitor
-
- limit int64 // Rate limit in bytes per second (unlimited when <= 0)
- block bool // What to do when no new bytes can be written due to the limit
-}
-
-// NewWriter restricts all Write operations on w to limit bytes per second. The
-// transfer rate and the default blocking behavior (true) can be changed
-// directly on the returned *Writer.
-func NewWriter(w io.Writer, limit int64) *Writer {
- return &Writer{w, New(0, 0), limit, true}
-}
-
-// Write writes len(p) bytes from p to the underlying data stream without
-// exceeding the current transfer rate limit. It returns (n, ErrLimit) if w is
-// non-blocking and no additional bytes can be written at this time.
-func (w *Writer) Write(p []byte) (n int, err error) {
- var c int
- for len(p) > 0 && err == nil {
- s := p[:w.Limit(len(p), w.limit, w.block)]
- if len(s) > 0 {
- c, err = w.IO(w.Writer.Write(s))
- } else {
- return n, ErrLimit
- }
- p = p[c:]
- n += c
- }
- return
-}
-
-// SetLimit changes the transfer rate limit to new bytes per second and returns
-// the previous setting.
-func (w *Writer) SetLimit(new int64) (old int64) {
- old, w.limit = w.limit, new
- return
-}
-
-// SetBlocking changes the blocking behavior and returns the previous setting. A
-// Write call on a non-blocking writer returns as soon as no additional bytes
-// may be written at this time due to the rate limit.
-func (w *Writer) SetBlocking(new bool) (old bool) {
- old, w.block = w.block, new
- return
-}
-
-// Close closes the underlying writer if it implements the io.Closer interface.
-func (w *Writer) Close() error {
- defer w.Done()
- if c, ok := w.Writer.(io.Closer); ok {
- return c.Close()
- }
- return nil
-}
diff --git a/vendor/github.com/mxk/go-flowrate/flowrate/util.go b/vendor/github.com/mxk/go-flowrate/flowrate/util.go
deleted file mode 100644
index 4caac583fc..0000000000
--- a/vendor/github.com/mxk/go-flowrate/flowrate/util.go
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-// Written by Maxim Khitrov (November 2012)
-//
-
-package flowrate
-
-import (
- "math"
- "strconv"
- "time"
-)
-
-// clockRate is the resolution and precision of clock().
-const clockRate = 20 * time.Millisecond
-
-// czero is the process start time rounded down to the nearest clockRate
-// increment.
-var czero = time.Duration(time.Now().UnixNano()) / clockRate * clockRate
-
-// clock returns a low resolution timestamp relative to the process start time.
-func clock() time.Duration {
- return time.Duration(time.Now().UnixNano())/clockRate*clockRate - czero
-}
-
-// clockToTime converts a clock() timestamp to an absolute time.Time value.
-func clockToTime(c time.Duration) time.Time {
- return time.Unix(0, int64(czero+c))
-}
-
-// clockRound returns d rounded to the nearest clockRate increment.
-func clockRound(d time.Duration) time.Duration {
- return (d + clockRate>>1) / clockRate * clockRate
-}
-
-// round returns x rounded to the nearest int64 (non-negative values only).
-func round(x float64) int64 {
- if _, frac := math.Modf(x); frac >= 0.5 {
- return int64(math.Ceil(x))
- }
- return int64(math.Floor(x))
-}
-
-// Percent represents a percentage in increments of 1/1000th of a percent.
-type Percent uint32
-
-// percentOf calculates what percent of the total is x.
-func percentOf(x, total float64) Percent {
- if x < 0 || total <= 0 {
- return 0
- } else if p := round(x / total * 1e5); p <= math.MaxUint32 {
- return Percent(p)
- }
- return Percent(math.MaxUint32)
-}
-
-func (p Percent) Float() float64 {
- return float64(p) * 1e-3
-}
-
-func (p Percent) String() string {
- var buf [12]byte
- b := strconv.AppendUint(buf[:0], uint64(p)/1000, 10)
- n := len(b)
- b = strconv.AppendUint(b, 1000+uint64(p)%1000, 10)
- b[n] = '.'
- return string(append(b, '%'))
-}
diff --git a/vendor/golang.org/x/mod/modfile/read.go b/vendor/golang.org/x/mod/modfile/read.go
index 504a2f1df6..5b528c718e 100644
--- a/vendor/golang.org/x/mod/modfile/read.go
+++ b/vendor/golang.org/x/mod/modfile/read.go
@@ -9,6 +9,7 @@ import (
"errors"
"fmt"
"os"
+ "slices"
"strconv"
"strings"
"unicode"
@@ -105,8 +106,7 @@ func (x *FileSyntax) addLine(hint Expr, tokens ...string) *Line {
if hint == nil {
// If no hint given, add to the last statement of the given type.
Loop:
- for i := len(x.Stmt) - 1; i >= 0; i-- {
- stmt := x.Stmt[i]
+ for _, stmt := range slices.Backward(x.Stmt) {
switch stmt := stmt.(type) {
case *Line:
if stmt.Token != nil && stmt.Token[0] == tokens[0] {
@@ -718,9 +718,7 @@ func (in *input) assignComments() {
}
// Assign suffix comments to syntax immediately before.
- for i := len(in.post) - 1; i >= 0; i-- {
- x := in.post[i]
-
+ for _, x := range slices.Backward(in.post) {
start, end := x.Span()
if debug {
fmt.Fprintf(os.Stderr, "post %T :%d:%d #%d :%d:%d #%d\n", x, start.Line, start.LineRune, start.Byte, end.Line, end.LineRune, end.Byte)
diff --git a/vendor/golang.org/x/mod/modfile/rule.go b/vendor/golang.org/x/mod/modfile/rule.go
index c5b8305de7..9ab203b562 100644
--- a/vendor/golang.org/x/mod/modfile/rule.go
+++ b/vendor/golang.org/x/mod/modfile/rule.go
@@ -327,6 +327,7 @@ func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (parse
}
var GoVersionRE = lazyregexp.New(`^([1-9][0-9]*)\.(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))?([a-z]+[0-9]+)?$`)
+
var laxGoVersionRE = lazyregexp.New(`^v?(([1-9][0-9]*)\.(0|[1-9][0-9]*))([^0-9].*)$`)
// Toolchains must be named beginning with `go1`,
@@ -1272,6 +1273,17 @@ func (f *File) SetRequire(req []*Require) {
// SetRequireSeparateIndirect will split it into a direct-only and indirect-only
// block. This aids in the transition to separate blocks.
func (f *File) SetRequireSeparateIndirect(req []*Require) {
+ f.setRequireSeparateIndirect(req, false)
+}
+
+// SetRequireAtMostTwo is like SetRequireSeparateIndirect but it aggressively
+// consolidates all requirements into at most two blocks (one direct, one indirect).
+// It ignores existing blocks and comments when deciding where to place requirements.
+func (f *File) SetRequireAtMostTwo(req []*Require) {
+ f.setRequireSeparateIndirect(req, true)
+}
+
+func (f *File) setRequireSeparateIndirect(req []*Require, simplify bool) {
// hasComments returns whether a line or block has comments
// other than "indirect".
hasComments := func(c Comments) bool {
@@ -1304,6 +1316,17 @@ func (f *File) SetRequireSeparateIndirect(req []*Require) {
}
// Examine existing require lines and blocks.
+ need := make(map[string]*Require)
+ for _, r := range req {
+ need[r.Mod.Path] = r
+ }
+ lineIndirect := make(map[*Line]bool)
+ for _, r := range f.Require {
+ if n := need[r.Mod.Path]; n != nil {
+ lineIndirect[r.Syntax] = n.Indirect
+ }
+ }
+
var (
// We may insert new requirements into the last uncommented
// direct-only and indirect-only blocks. We may also move requirements
@@ -1321,7 +1344,9 @@ func (f *File) SetRequireSeparateIndirect(req []*Require) {
// Track the block each requirement belongs to (if any) so we can
// move them later.
- lineToBlock = make(map[*Line]*LineBlock)
+ lineToBlock = make(map[*Line]*LineBlock)
+ directBlockComments []Comment
+ indirectBlockComments []Comment
)
for i, stmt := range f.Syntax.Stmt {
switch stmt := stmt.(type) {
@@ -1364,6 +1389,24 @@ func (f *File) SetRequireSeparateIndirect(req []*Require) {
if allIndirect {
lastIndirectIndex = i
}
+ if simplify {
+ anyDirect := false
+ for _, line := range stmt.Line {
+ if ind, ok := lineIndirect[line]; ok && !ind {
+ anyDirect = true
+ break
+ }
+ }
+ target := &directBlockComments
+ if !anyDirect && len(stmt.Line) > 0 {
+ target = &indirectBlockComments
+ }
+ if len(*target) > 0 && len(stmt.Comments.Before) > 0 {
+ *target = append(*target, Comment{Token: "//"})
+ }
+ *target = append(*target, stmt.Comments.Before...)
+ stmt.Comments.Before = nil
+ }
}
}
@@ -1422,6 +1465,15 @@ func (f *File) SetRequireSeparateIndirect(req []*Require) {
lastIndirectBlock = ensureBlock(lastIndirectIndex)
}
+ if simplify {
+ if len(directBlockComments) > 0 {
+ lastDirectBlock.Comments.Before = append(lastDirectBlock.Comments.Before, directBlockComments...)
+ }
+ if len(indirectBlockComments) > 0 {
+ lastIndirectBlock.Comments.Before = append(lastIndirectBlock.Comments.Before, indirectBlockComments...)
+ }
+ }
+
// Delete requirements we don't want anymore.
// Update versions and indirect comments on requirements we want to keep.
// If a requirement is in last{Direct,Indirect}Block with the wrong
@@ -1430,10 +1482,6 @@ func (f *File) SetRequireSeparateIndirect(req []*Require) {
// correct block.
//
// Some blocks may be empty after this. Cleanup will remove them.
- need := make(map[string]*Require)
- for _, r := range req {
- need[r.Mod.Path] = r
- }
have := make(map[string]*Require)
for _, r := range f.Require {
path := r.Mod.Path
@@ -1446,10 +1494,10 @@ func (f *File) SetRequireSeparateIndirect(req []*Require) {
r.setVersion(need[path].Mod.Version)
r.setIndirect(need[path].Indirect)
if need[path].Indirect &&
- (oneFlatUncommentedBlock || lineToBlock[r.Syntax] == lastDirectBlock) {
+ (simplify || oneFlatUncommentedBlock || lineToBlock[r.Syntax] == lastDirectBlock) {
moveReq(r, lastIndirectBlock)
} else if !need[path].Indirect &&
- (oneFlatUncommentedBlock || lineToBlock[r.Syntax] == lastIndirectBlock) {
+ (simplify || oneFlatUncommentedBlock || lineToBlock[r.Syntax] == lastIndirectBlock) {
moveReq(r, lastDirectBlock)
}
}
@@ -1736,8 +1784,7 @@ func removeDups(syntax *FileSyntax, exclude *[]*Exclude, replace *[]*Replace, to
// Remove duplicate replacements.
// Later replacements take priority over earlier ones.
haveReplace := make(map[module.Version]bool)
- for i := len(*replace) - 1; i >= 0; i-- {
- x := (*replace)[i]
+ for _, x := range slices.Backward(*replace) {
if haveReplace[x.Old] {
kill[x.Syntax] = true
continue
diff --git a/vendor/golang.org/x/net/html/atom/atom.go b/vendor/golang.org/x/net/html/atom/atom.go
deleted file mode 100644
index cd0a8ac154..0000000000
--- a/vendor/golang.org/x/net/html/atom/atom.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package atom provides integer codes (also known as atoms) for a fixed set of
-// frequently occurring HTML strings: tag names and attribute keys such as "p"
-// and "id".
-//
-// Sharing an atom's name between all elements with the same tag can result in
-// fewer string allocations when tokenizing and parsing HTML. Integer
-// comparisons are also generally faster than string comparisons.
-//
-// The value of an atom's particular code is not guaranteed to stay the same
-// between versions of this package. Neither is any ordering guaranteed:
-// whether atom.H1 < atom.H2 may also change. The codes are not guaranteed to
-// be dense. The only guarantees are that e.g. looking up "div" will yield
-// atom.Div, calling atom.Div.String will return "div", and atom.Div != 0.
-package atom // import "golang.org/x/net/html/atom"
-
-// Atom is an integer code for a string. The zero value maps to "".
-type Atom uint32
-
-// String returns the atom's name.
-func (a Atom) String() string {
- start := uint32(a >> 8)
- n := uint32(a & 0xff)
- if start+n > uint32(len(atomText)) {
- return ""
- }
- return atomText[start : start+n]
-}
-
-func (a Atom) string() string {
- return atomText[a>>8 : a>>8+a&0xff]
-}
-
-// fnv computes the FNV hash with an arbitrary starting value h.
-func fnv(h uint32, s []byte) uint32 {
- for i := range s {
- h ^= uint32(s[i])
- h *= 16777619
- }
- return h
-}
-
-func match(s string, t []byte) bool {
- for i, c := range t {
- if s[i] != c {
- return false
- }
- }
- return true
-}
-
-// Lookup returns the atom whose name is s. It returns zero if there is no
-// such atom. The lookup is case sensitive.
-func Lookup(s []byte) Atom {
- if len(s) == 0 || len(s) > maxAtomLen {
- return 0
- }
- h := fnv(hash0, s)
- if a := table[h&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) {
- return a
- }
- if a := table[(h>>16)&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) {
- return a
- }
- return 0
-}
-
-// String returns a string whose contents are equal to s. In that sense, it is
-// equivalent to string(s) but may be more efficient.
-func String(s []byte) string {
- if a := Lookup(s); a != 0 {
- return a.String()
- }
- return string(s)
-}
diff --git a/vendor/golang.org/x/net/html/atom/table.go b/vendor/golang.org/x/net/html/atom/table.go
deleted file mode 100644
index b460e6f722..0000000000
--- a/vendor/golang.org/x/net/html/atom/table.go
+++ /dev/null
@@ -1,785 +0,0 @@
-// Code generated by go generate gen.go; DO NOT EDIT.
-
-//go:generate go run gen.go
-
-package atom
-
-const (
- A Atom = 0x1
- Abbr Atom = 0x4
- Accept Atom = 0x1a06
- AcceptCharset Atom = 0x1a0e
- Accesskey Atom = 0x2c09
- Acronym Atom = 0xaa07
- Action Atom = 0x26506
- Address Atom = 0x6f107
- Align Atom = 0xb105
- Allowfullscreen Atom = 0x3280f
- Allowpaymentrequest Atom = 0xc113
- Allowusermedia Atom = 0xdd0e
- Alt Atom = 0xf303
- Annotation Atom = 0x1c90a
- AnnotationXml Atom = 0x1c90e
- Applet Atom = 0x30806
- Area Atom = 0x35004
- Article Atom = 0x3f607
- As Atom = 0x3c02
- Aside Atom = 0x10705
- Async Atom = 0xff05
- Audio Atom = 0x11505
- Autocomplete Atom = 0x26b0c
- Autofocus Atom = 0x12109
- Autoplay Atom = 0x13c08
- B Atom = 0x101
- Base Atom = 0x3b04
- Basefont Atom = 0x3b08
- Bdi Atom = 0xba03
- Bdo Atom = 0x14b03
- Bgsound Atom = 0x15e07
- Big Atom = 0x17003
- Blink Atom = 0x17305
- Blockquote Atom = 0x1870a
- Body Atom = 0x2804
- Br Atom = 0x202
- Button Atom = 0x19106
- Canvas Atom = 0x10306
- Caption Atom = 0x22407
- Center Atom = 0x21306
- Challenge Atom = 0x28e09
- Charset Atom = 0x2107
- Checked Atom = 0x5b507
- Cite Atom = 0x19c04
- Class Atom = 0x55805
- Code Atom = 0x5ee04
- Col Atom = 0x1ab03
- Colgroup Atom = 0x1ab08
- Color Atom = 0x1bf05
- Cols Atom = 0x1c404
- Colspan Atom = 0x1c407
- Command Atom = 0x1d707
- Content Atom = 0x57b07
- Contenteditable Atom = 0x57b0f
- Contextmenu Atom = 0x37a0b
- Controls Atom = 0x1de08
- Coords Atom = 0x1f006
- Crossorigin Atom = 0x1fa0b
- Data Atom = 0x49904
- Datalist Atom = 0x49908
- Datetime Atom = 0x2ab08
- Dd Atom = 0x2bf02
- Default Atom = 0x10a07
- Defer Atom = 0x5f005
- Del Atom = 0x44c03
- Desc Atom = 0x55504
- Details Atom = 0x7207
- Dfn Atom = 0x8703
- Dialog Atom = 0xbb06
- Dir Atom = 0x9303
- Dirname Atom = 0x9307
- Disabled Atom = 0x16408
- Div Atom = 0x16b03
- Dl Atom = 0x5d602
- Download Atom = 0x45d08
- Draggable Atom = 0x17a09
- Dropzone Atom = 0x3ff08
- Dt Atom = 0x64002
- Em Atom = 0x6e02
- Embed Atom = 0x6e05
- Enctype Atom = 0x28007
- Face Atom = 0x21104
- Fieldset Atom = 0x21908
- Figcaption Atom = 0x2210a
- Figure Atom = 0x23b06
- Font Atom = 0x3f04
- Footer Atom = 0xf606
- For Atom = 0x24703
- ForeignObject Atom = 0x2470d
- Foreignobject Atom = 0x2540d
- Form Atom = 0x26104
- Formaction Atom = 0x2610a
- Formenctype Atom = 0x27c0b
- Formmethod Atom = 0x2970a
- Formnovalidate Atom = 0x2a10e
- Formtarget Atom = 0x2b30a
- Frame Atom = 0x8b05
- Frameset Atom = 0x8b08
- H1 Atom = 0x15c02
- H2 Atom = 0x56102
- H3 Atom = 0x2cd02
- H4 Atom = 0x2fc02
- H5 Atom = 0x33f02
- H6 Atom = 0x34902
- Head Atom = 0x32004
- Header Atom = 0x32006
- Headers Atom = 0x32007
- Height Atom = 0x5206
- Hgroup Atom = 0x64206
- Hidden Atom = 0x2bd06
- High Atom = 0x2ca04
- Hr Atom = 0x15702
- Href Atom = 0x2cf04
- Hreflang Atom = 0x2cf08
- Html Atom = 0x5604
- HttpEquiv Atom = 0x2d70a
- I Atom = 0x601
- Icon Atom = 0x57a04
- Id Atom = 0x10902
- Iframe Atom = 0x2eb06
- Image Atom = 0x2f105
- Img Atom = 0x2f603
- Input Atom = 0x44505
- Inputmode Atom = 0x44509
- Ins Atom = 0x20303
- Integrity Atom = 0x23209
- Is Atom = 0x16502
- Isindex Atom = 0x2fe07
- Ismap Atom = 0x30505
- Itemid Atom = 0x38506
- Itemprop Atom = 0x19d08
- Itemref Atom = 0x3c707
- Itemscope Atom = 0x66f09
- Itemtype Atom = 0x30e08
- Kbd Atom = 0xb903
- Keygen Atom = 0x3206
- Keytype Atom = 0xd607
- Kind Atom = 0x17704
- Label Atom = 0x5905
- Lang Atom = 0x2d304
- Legend Atom = 0x18106
- Li Atom = 0xb202
- Link Atom = 0x17404
- List Atom = 0x49d04
- Listing Atom = 0x49d07
- Loop Atom = 0x5d04
- Low Atom = 0xc303
- Main Atom = 0x1004
- Malignmark Atom = 0xb00a
- Manifest Atom = 0x6d508
- Map Atom = 0x30703
- Mark Atom = 0xb604
- Marquee Atom = 0x31607
- Math Atom = 0x31d04
- Max Atom = 0x33703
- Maxlength Atom = 0x33709
- Media Atom = 0xe605
- Mediagroup Atom = 0xe60a
- Menu Atom = 0x38104
- Menuitem Atom = 0x38108
- Meta Atom = 0x4ac04
- Meter Atom = 0x9805
- Method Atom = 0x29b06
- Mglyph Atom = 0x2f706
- Mi Atom = 0x34102
- Min Atom = 0x34103
- Minlength Atom = 0x34109
- Mn Atom = 0x2a402
- Mo Atom = 0xa402
- Ms Atom = 0x67202
- Mtext Atom = 0x34b05
- Multiple Atom = 0x35908
- Muted Atom = 0x36105
- Name Atom = 0x9604
- Nav Atom = 0x1303
- Nobr Atom = 0x3704
- Noembed Atom = 0x6c07
- Noframes Atom = 0x8908
- Nomodule Atom = 0xa208
- Nonce Atom = 0x1a605
- Noscript Atom = 0x2c208
- Novalidate Atom = 0x2a50a
- Object Atom = 0x25b06
- Ol Atom = 0x13702
- Onabort Atom = 0x19507
- Onafterprint Atom = 0x2290c
- Onautocomplete Atom = 0x2690e
- Onautocompleteerror Atom = 0x26913
- Onauxclick Atom = 0x6140a
- Onbeforeprint Atom = 0x69c0d
- Onbeforeunload Atom = 0x6e50e
- Onblur Atom = 0x1ea06
- Oncancel Atom = 0x11908
- Oncanplay Atom = 0x14d09
- Oncanplaythrough Atom = 0x14d10
- Onchange Atom = 0x41508
- Onclick Atom = 0x2e407
- Onclose Atom = 0x36607
- Oncontextmenu Atom = 0x3780d
- Oncopy Atom = 0x38b06
- Oncuechange Atom = 0x3910b
- Oncut Atom = 0x39c05
- Ondblclick Atom = 0x3a10a
- Ondrag Atom = 0x3ab06
- Ondragend Atom = 0x3ab09
- Ondragenter Atom = 0x3b40b
- Ondragexit Atom = 0x3bf0a
- Ondragleave Atom = 0x3d90b
- Ondragover Atom = 0x3e40a
- Ondragstart Atom = 0x3ee0b
- Ondrop Atom = 0x3fd06
- Ondurationchange Atom = 0x40d10
- Onemptied Atom = 0x40409
- Onended Atom = 0x41d07
- Onerror Atom = 0x42407
- Onfocus Atom = 0x42b07
- Onhashchange Atom = 0x4370c
- Oninput Atom = 0x44307
- Oninvalid Atom = 0x44f09
- Onkeydown Atom = 0x45809
- Onkeypress Atom = 0x4650a
- Onkeyup Atom = 0x47407
- Onlanguagechange Atom = 0x48110
- Onload Atom = 0x49106
- Onloadeddata Atom = 0x4910c
- Onloadedmetadata Atom = 0x4a410
- Onloadend Atom = 0x4ba09
- Onloadstart Atom = 0x4c30b
- Onmessage Atom = 0x4ce09
- Onmessageerror Atom = 0x4ce0e
- Onmousedown Atom = 0x4dc0b
- Onmouseenter Atom = 0x4e70c
- Onmouseleave Atom = 0x4f30c
- Onmousemove Atom = 0x4ff0b
- Onmouseout Atom = 0x50a0a
- Onmouseover Atom = 0x5170b
- Onmouseup Atom = 0x52209
- Onmousewheel Atom = 0x5300c
- Onoffline Atom = 0x53c09
- Ononline Atom = 0x54508
- Onpagehide Atom = 0x54d0a
- Onpageshow Atom = 0x5630a
- Onpaste Atom = 0x56f07
- Onpause Atom = 0x58a07
- Onplay Atom = 0x59406
- Onplaying Atom = 0x59409
- Onpopstate Atom = 0x59d0a
- Onprogress Atom = 0x5a70a
- Onratechange Atom = 0x5bc0c
- Onrejectionhandled Atom = 0x5c812
- Onreset Atom = 0x5da07
- Onresize Atom = 0x5e108
- Onscroll Atom = 0x5f508
- Onsecuritypolicyviolation Atom = 0x5fd19
- Onseeked Atom = 0x61e08
- Onseeking Atom = 0x62609
- Onselect Atom = 0x62f08
- Onshow Atom = 0x63906
- Onsort Atom = 0x64d06
- Onstalled Atom = 0x65709
- Onstorage Atom = 0x66009
- Onsubmit Atom = 0x66908
- Onsuspend Atom = 0x67909
- Ontimeupdate Atom = 0x400c
- Ontoggle Atom = 0x68208
- Onunhandledrejection Atom = 0x68a14
- Onunload Atom = 0x6a908
- Onvolumechange Atom = 0x6b10e
- Onwaiting Atom = 0x6bf09
- Onwheel Atom = 0x6c807
- Open Atom = 0x1a304
- Optgroup Atom = 0x5f08
- Optimum Atom = 0x6cf07
- Option Atom = 0x6e106
- Output Atom = 0x51106
- P Atom = 0xc01
- Param Atom = 0xc05
- Pattern Atom = 0x6607
- Picture Atom = 0x7b07
- Ping Atom = 0xef04
- Placeholder Atom = 0x1310b
- Plaintext Atom = 0x1b209
- Playsinline Atom = 0x1400b
- Poster Atom = 0x64706
- Pre Atom = 0x46a03
- Preload Atom = 0x47a07
- Progress Atom = 0x5a908
- Prompt Atom = 0x52a06
- Public Atom = 0x57606
- Q Atom = 0xcf01
- Radiogroup Atom = 0x30a
- Rb Atom = 0x3a02
- Readonly Atom = 0x35108
- Referrerpolicy Atom = 0x3cb0e
- Rel Atom = 0x47b03
- Required Atom = 0x23f08
- Reversed Atom = 0x8008
- Rows Atom = 0x9c04
- Rowspan Atom = 0x9c07
- Rp Atom = 0x22f02
- Rt Atom = 0x19a02
- Rtc Atom = 0x19a03
- Ruby Atom = 0xfb04
- S Atom = 0x2501
- Samp Atom = 0x7804
- Sandbox Atom = 0x12907
- Scope Atom = 0x67305
- Scoped Atom = 0x67306
- Script Atom = 0x2c406
- Seamless Atom = 0x36b08
- Search Atom = 0x55c06
- Section Atom = 0x1e507
- Select Atom = 0x63106
- Selected Atom = 0x63108
- Shape Atom = 0x1f505
- Size Atom = 0x5e504
- Sizes Atom = 0x5e505
- Slot Atom = 0x20504
- Small Atom = 0x32605
- Sortable Atom = 0x64f08
- Sorted Atom = 0x37206
- Source Atom = 0x43106
- Spacer Atom = 0x46e06
- Span Atom = 0x9f04
- Spellcheck Atom = 0x5b00a
- Src Atom = 0x5e903
- Srcdoc Atom = 0x5e906
- Srclang Atom = 0x6f707
- Srcset Atom = 0x6fe06
- Start Atom = 0x3f405
- Step Atom = 0x57304
- Strike Atom = 0xd206
- Strong Atom = 0x6db06
- Style Atom = 0x70405
- Sub Atom = 0x66b03
- Summary Atom = 0x70907
- Sup Atom = 0x71003
- Svg Atom = 0x71303
- System Atom = 0x71606
- Tabindex Atom = 0x4b208
- Table Atom = 0x58505
- Target Atom = 0x2b706
- Tbody Atom = 0x2705
- Td Atom = 0x9202
- Template Atom = 0x71908
- Textarea Atom = 0x34c08
- Tfoot Atom = 0xf505
- Th Atom = 0x15602
- Thead Atom = 0x31f05
- Time Atom = 0x4204
- Title Atom = 0x11005
- Tr Atom = 0xcc02
- Track Atom = 0x1ba05
- Translate Atom = 0x20809
- Tt Atom = 0x6802
- Type Atom = 0xd904
- Typemustmatch Atom = 0x2830d
- U Atom = 0xb01
- Ul Atom = 0xa702
- Updateviacache Atom = 0x460e
- Usemap Atom = 0x58e06
- Value Atom = 0x1505
- Var Atom = 0x16d03
- Video Atom = 0x2e005
- Wbr Atom = 0x56c03
- Width Atom = 0x63e05
- Workertype Atom = 0x7210a
- Wrap Atom = 0x72b04
- Xmp Atom = 0x12f03
-)
-
-const hash0 = 0x84f70e16
-
-const maxAtomLen = 25
-
-var table = [1 << 9]Atom{
- 0x1: 0x3ff08, // dropzone
- 0x2: 0x3b08, // basefont
- 0x3: 0x23209, // integrity
- 0x4: 0x43106, // source
- 0x5: 0x2c09, // accesskey
- 0x6: 0x1a06, // accept
- 0x7: 0x6c807, // onwheel
- 0xb: 0x47407, // onkeyup
- 0xc: 0x32007, // headers
- 0xd: 0x67306, // scoped
- 0xe: 0x67909, // onsuspend
- 0xf: 0x8908, // noframes
- 0x10: 0x1fa0b, // crossorigin
- 0x11: 0x2e407, // onclick
- 0x12: 0x3f405, // start
- 0x13: 0x37a0b, // contextmenu
- 0x14: 0x5e903, // src
- 0x15: 0x1c404, // cols
- 0x16: 0xbb06, // dialog
- 0x17: 0x47a07, // preload
- 0x18: 0x3c707, // itemref
- 0x1b: 0x2f105, // image
- 0x1d: 0x4ba09, // onloadend
- 0x1e: 0x45d08, // download
- 0x1f: 0x46a03, // pre
- 0x23: 0x2970a, // formmethod
- 0x24: 0x71303, // svg
- 0x25: 0xcf01, // q
- 0x26: 0x64002, // dt
- 0x27: 0x1de08, // controls
- 0x2a: 0x2804, // body
- 0x2b: 0xd206, // strike
- 0x2c: 0x3910b, // oncuechange
- 0x2d: 0x4c30b, // onloadstart
- 0x2e: 0x2fe07, // isindex
- 0x2f: 0xb202, // li
- 0x30: 0x1400b, // playsinline
- 0x31: 0x34102, // mi
- 0x32: 0x30806, // applet
- 0x33: 0x4ce09, // onmessage
- 0x35: 0x13702, // ol
- 0x36: 0x1a304, // open
- 0x39: 0x14d09, // oncanplay
- 0x3a: 0x6bf09, // onwaiting
- 0x3b: 0x11908, // oncancel
- 0x3c: 0x6a908, // onunload
- 0x3e: 0x53c09, // onoffline
- 0x3f: 0x1a0e, // accept-charset
- 0x40: 0x32004, // head
- 0x42: 0x3ab09, // ondragend
- 0x43: 0x1310b, // placeholder
- 0x44: 0x2b30a, // formtarget
- 0x45: 0x2540d, // foreignobject
- 0x47: 0x400c, // ontimeupdate
- 0x48: 0xdd0e, // allowusermedia
- 0x4a: 0x69c0d, // onbeforeprint
- 0x4b: 0x5604, // html
- 0x4c: 0x9f04, // span
- 0x4d: 0x64206, // hgroup
- 0x4e: 0x16408, // disabled
- 0x4f: 0x4204, // time
- 0x51: 0x42b07, // onfocus
- 0x53: 0xb00a, // malignmark
- 0x55: 0x4650a, // onkeypress
- 0x56: 0x55805, // class
- 0x57: 0x1ab08, // colgroup
- 0x58: 0x33709, // maxlength
- 0x59: 0x5a908, // progress
- 0x5b: 0x70405, // style
- 0x5c: 0x2a10e, // formnovalidate
- 0x5e: 0x38b06, // oncopy
- 0x60: 0x26104, // form
- 0x61: 0xf606, // footer
- 0x64: 0x30a, // radiogroup
- 0x66: 0xfb04, // ruby
- 0x67: 0x4ff0b, // onmousemove
- 0x68: 0x19d08, // itemprop
- 0x69: 0x2d70a, // http-equiv
- 0x6a: 0x15602, // th
- 0x6c: 0x6e02, // em
- 0x6d: 0x38108, // menuitem
- 0x6e: 0x63106, // select
- 0x6f: 0x48110, // onlanguagechange
- 0x70: 0x31f05, // thead
- 0x71: 0x15c02, // h1
- 0x72: 0x5e906, // srcdoc
- 0x75: 0x9604, // name
- 0x76: 0x19106, // button
- 0x77: 0x55504, // desc
- 0x78: 0x17704, // kind
- 0x79: 0x1bf05, // color
- 0x7c: 0x58e06, // usemap
- 0x7d: 0x30e08, // itemtype
- 0x7f: 0x6d508, // manifest
- 0x81: 0x5300c, // onmousewheel
- 0x82: 0x4dc0b, // onmousedown
- 0x84: 0xc05, // param
- 0x85: 0x2e005, // video
- 0x86: 0x4910c, // onloadeddata
- 0x87: 0x6f107, // address
- 0x8c: 0xef04, // ping
- 0x8d: 0x24703, // for
- 0x8f: 0x62f08, // onselect
- 0x90: 0x30703, // map
- 0x92: 0xc01, // p
- 0x93: 0x8008, // reversed
- 0x94: 0x54d0a, // onpagehide
- 0x95: 0x3206, // keygen
- 0x96: 0x34109, // minlength
- 0x97: 0x3e40a, // ondragover
- 0x98: 0x42407, // onerror
- 0x9a: 0x2107, // charset
- 0x9b: 0x29b06, // method
- 0x9c: 0x101, // b
- 0x9d: 0x68208, // ontoggle
- 0x9e: 0x2bd06, // hidden
- 0xa0: 0x3f607, // article
- 0xa2: 0x63906, // onshow
- 0xa3: 0x64d06, // onsort
- 0xa5: 0x57b0f, // contenteditable
- 0xa6: 0x66908, // onsubmit
- 0xa8: 0x44f09, // oninvalid
- 0xaa: 0x202, // br
- 0xab: 0x10902, // id
- 0xac: 0x5d04, // loop
- 0xad: 0x5630a, // onpageshow
- 0xb0: 0x2cf04, // href
- 0xb2: 0x2210a, // figcaption
- 0xb3: 0x2690e, // onautocomplete
- 0xb4: 0x49106, // onload
- 0xb6: 0x9c04, // rows
- 0xb7: 0x1a605, // nonce
- 0xb8: 0x68a14, // onunhandledrejection
- 0xbb: 0x21306, // center
- 0xbc: 0x59406, // onplay
- 0xbd: 0x33f02, // h5
- 0xbe: 0x49d07, // listing
- 0xbf: 0x57606, // public
- 0xc2: 0x23b06, // figure
- 0xc3: 0x57a04, // icon
- 0xc4: 0x1ab03, // col
- 0xc5: 0x47b03, // rel
- 0xc6: 0xe605, // media
- 0xc7: 0x12109, // autofocus
- 0xc8: 0x19a02, // rt
- 0xca: 0x2d304, // lang
- 0xcc: 0x49908, // datalist
- 0xce: 0x2eb06, // iframe
- 0xcf: 0x36105, // muted
- 0xd0: 0x6140a, // onauxclick
- 0xd2: 0x3c02, // as
- 0xd6: 0x3fd06, // ondrop
- 0xd7: 0x1c90a, // annotation
- 0xd8: 0x21908, // fieldset
- 0xdb: 0x2cf08, // hreflang
- 0xdc: 0x4e70c, // onmouseenter
- 0xdd: 0x2a402, // mn
- 0xde: 0xe60a, // mediagroup
- 0xdf: 0x9805, // meter
- 0xe0: 0x56c03, // wbr
- 0xe2: 0x63e05, // width
- 0xe3: 0x2290c, // onafterprint
- 0xe4: 0x30505, // ismap
- 0xe5: 0x1505, // value
- 0xe7: 0x1303, // nav
- 0xe8: 0x54508, // ononline
- 0xe9: 0xb604, // mark
- 0xea: 0xc303, // low
- 0xeb: 0x3ee0b, // ondragstart
- 0xef: 0x12f03, // xmp
- 0xf0: 0x22407, // caption
- 0xf1: 0xd904, // type
- 0xf2: 0x70907, // summary
- 0xf3: 0x6802, // tt
- 0xf4: 0x20809, // translate
- 0xf5: 0x1870a, // blockquote
- 0xf8: 0x15702, // hr
- 0xfa: 0x2705, // tbody
- 0xfc: 0x7b07, // picture
- 0xfd: 0x5206, // height
- 0xfe: 0x19c04, // cite
- 0xff: 0x2501, // s
- 0x101: 0xff05, // async
- 0x102: 0x56f07, // onpaste
- 0x103: 0x19507, // onabort
- 0x104: 0x2b706, // target
- 0x105: 0x14b03, // bdo
- 0x106: 0x1f006, // coords
- 0x107: 0x5e108, // onresize
- 0x108: 0x71908, // template
- 0x10a: 0x3a02, // rb
- 0x10b: 0x2a50a, // novalidate
- 0x10c: 0x460e, // updateviacache
- 0x10d: 0x71003, // sup
- 0x10e: 0x6c07, // noembed
- 0x10f: 0x16b03, // div
- 0x110: 0x6f707, // srclang
- 0x111: 0x17a09, // draggable
- 0x112: 0x67305, // scope
- 0x113: 0x5905, // label
- 0x114: 0x22f02, // rp
- 0x115: 0x23f08, // required
- 0x116: 0x3780d, // oncontextmenu
- 0x117: 0x5e504, // size
- 0x118: 0x5b00a, // spellcheck
- 0x119: 0x3f04, // font
- 0x11a: 0x9c07, // rowspan
- 0x11b: 0x10a07, // default
- 0x11d: 0x44307, // oninput
- 0x11e: 0x38506, // itemid
- 0x11f: 0x5ee04, // code
- 0x120: 0xaa07, // acronym
- 0x121: 0x3b04, // base
- 0x125: 0x2470d, // foreignObject
- 0x126: 0x2ca04, // high
- 0x127: 0x3cb0e, // referrerpolicy
- 0x128: 0x33703, // max
- 0x129: 0x59d0a, // onpopstate
- 0x12a: 0x2fc02, // h4
- 0x12b: 0x4ac04, // meta
- 0x12c: 0x17305, // blink
- 0x12e: 0x5f508, // onscroll
- 0x12f: 0x59409, // onplaying
- 0x130: 0xc113, // allowpaymentrequest
- 0x131: 0x19a03, // rtc
- 0x132: 0x72b04, // wrap
- 0x134: 0x8b08, // frameset
- 0x135: 0x32605, // small
- 0x137: 0x32006, // header
- 0x138: 0x40409, // onemptied
- 0x139: 0x34902, // h6
- 0x13a: 0x35908, // multiple
- 0x13c: 0x52a06, // prompt
- 0x13f: 0x28e09, // challenge
- 0x141: 0x4370c, // onhashchange
- 0x142: 0x57b07, // content
- 0x143: 0x1c90e, // annotation-xml
- 0x144: 0x36607, // onclose
- 0x145: 0x14d10, // oncanplaythrough
- 0x148: 0x5170b, // onmouseover
- 0x149: 0x64f08, // sortable
- 0x14a: 0xa402, // mo
- 0x14b: 0x2cd02, // h3
- 0x14c: 0x2c406, // script
- 0x14d: 0x41d07, // onended
- 0x14f: 0x64706, // poster
- 0x150: 0x7210a, // workertype
- 0x153: 0x1f505, // shape
- 0x154: 0x4, // abbr
- 0x155: 0x1, // a
- 0x156: 0x2bf02, // dd
- 0x157: 0x71606, // system
- 0x158: 0x4ce0e, // onmessageerror
- 0x159: 0x36b08, // seamless
- 0x15a: 0x2610a, // formaction
- 0x15b: 0x6e106, // option
- 0x15c: 0x31d04, // math
- 0x15d: 0x62609, // onseeking
- 0x15e: 0x39c05, // oncut
- 0x15f: 0x44c03, // del
- 0x160: 0x11005, // title
- 0x161: 0x11505, // audio
- 0x162: 0x63108, // selected
- 0x165: 0x3b40b, // ondragenter
- 0x166: 0x46e06, // spacer
- 0x167: 0x4a410, // onloadedmetadata
- 0x168: 0x44505, // input
- 0x16a: 0x58505, // table
- 0x16b: 0x41508, // onchange
- 0x16e: 0x5f005, // defer
- 0x171: 0x50a0a, // onmouseout
- 0x172: 0x20504, // slot
- 0x175: 0x3704, // nobr
- 0x177: 0x1d707, // command
- 0x17a: 0x7207, // details
- 0x17b: 0x38104, // menu
- 0x17c: 0xb903, // kbd
- 0x17d: 0x57304, // step
- 0x17e: 0x20303, // ins
- 0x17f: 0x13c08, // autoplay
- 0x182: 0x34103, // min
- 0x183: 0x17404, // link
- 0x185: 0x40d10, // ondurationchange
- 0x186: 0x9202, // td
- 0x187: 0x8b05, // frame
- 0x18a: 0x2ab08, // datetime
- 0x18b: 0x44509, // inputmode
- 0x18c: 0x35108, // readonly
- 0x18d: 0x21104, // face
- 0x18f: 0x5e505, // sizes
- 0x191: 0x4b208, // tabindex
- 0x192: 0x6db06, // strong
- 0x193: 0xba03, // bdi
- 0x194: 0x6fe06, // srcset
- 0x196: 0x67202, // ms
- 0x197: 0x5b507, // checked
- 0x198: 0xb105, // align
- 0x199: 0x1e507, // section
- 0x19b: 0x6e05, // embed
- 0x19d: 0x15e07, // bgsound
- 0x1a2: 0x49d04, // list
- 0x1a3: 0x61e08, // onseeked
- 0x1a4: 0x66009, // onstorage
- 0x1a5: 0x2f603, // img
- 0x1a6: 0xf505, // tfoot
- 0x1a9: 0x26913, // onautocompleteerror
- 0x1aa: 0x5fd19, // onsecuritypolicyviolation
- 0x1ad: 0x9303, // dir
- 0x1ae: 0x9307, // dirname
- 0x1b0: 0x5a70a, // onprogress
- 0x1b2: 0x65709, // onstalled
- 0x1b5: 0x66f09, // itemscope
- 0x1b6: 0x49904, // data
- 0x1b7: 0x3d90b, // ondragleave
- 0x1b8: 0x56102, // h2
- 0x1b9: 0x2f706, // mglyph
- 0x1ba: 0x16502, // is
- 0x1bb: 0x6e50e, // onbeforeunload
- 0x1bc: 0x2830d, // typemustmatch
- 0x1bd: 0x3ab06, // ondrag
- 0x1be: 0x5da07, // onreset
- 0x1c0: 0x51106, // output
- 0x1c1: 0x12907, // sandbox
- 0x1c2: 0x1b209, // plaintext
- 0x1c4: 0x34c08, // textarea
- 0x1c7: 0xd607, // keytype
- 0x1c8: 0x34b05, // mtext
- 0x1c9: 0x6b10e, // onvolumechange
- 0x1ca: 0x1ea06, // onblur
- 0x1cb: 0x58a07, // onpause
- 0x1cd: 0x5bc0c, // onratechange
- 0x1ce: 0x10705, // aside
- 0x1cf: 0x6cf07, // optimum
- 0x1d1: 0x45809, // onkeydown
- 0x1d2: 0x1c407, // colspan
- 0x1d3: 0x1004, // main
- 0x1d4: 0x66b03, // sub
- 0x1d5: 0x25b06, // object
- 0x1d6: 0x55c06, // search
- 0x1d7: 0x37206, // sorted
- 0x1d8: 0x17003, // big
- 0x1d9: 0xb01, // u
- 0x1db: 0x26b0c, // autocomplete
- 0x1dc: 0xcc02, // tr
- 0x1dd: 0xf303, // alt
- 0x1df: 0x7804, // samp
- 0x1e0: 0x5c812, // onrejectionhandled
- 0x1e1: 0x4f30c, // onmouseleave
- 0x1e2: 0x28007, // enctype
- 0x1e3: 0xa208, // nomodule
- 0x1e5: 0x3280f, // allowfullscreen
- 0x1e6: 0x5f08, // optgroup
- 0x1e8: 0x27c0b, // formenctype
- 0x1e9: 0x18106, // legend
- 0x1ea: 0x10306, // canvas
- 0x1eb: 0x6607, // pattern
- 0x1ec: 0x2c208, // noscript
- 0x1ed: 0x601, // i
- 0x1ee: 0x5d602, // dl
- 0x1ef: 0xa702, // ul
- 0x1f2: 0x52209, // onmouseup
- 0x1f4: 0x1ba05, // track
- 0x1f7: 0x3a10a, // ondblclick
- 0x1f8: 0x3bf0a, // ondragexit
- 0x1fa: 0x8703, // dfn
- 0x1fc: 0x26506, // action
- 0x1fd: 0x35004, // area
- 0x1fe: 0x31607, // marquee
- 0x1ff: 0x16d03, // var
-}
-
-const atomText = "abbradiogrouparamainavalueaccept-charsetbodyaccesskeygenobrb" +
- "asefontimeupdateviacacheightmlabelooptgroupatternoembedetail" +
- "sampictureversedfnoframesetdirnameterowspanomoduleacronymali" +
- "gnmarkbdialogallowpaymentrequestrikeytypeallowusermediagroup" +
- "ingaltfooterubyasyncanvasidefaultitleaudioncancelautofocusan" +
- "dboxmplaceholderautoplaysinlinebdoncanplaythrough1bgsoundisa" +
- "bledivarbigblinkindraggablegendblockquotebuttonabortcitempro" +
- "penoncecolgrouplaintextrackcolorcolspannotation-xmlcommandco" +
- "ntrolsectionblurcoordshapecrossoriginslotranslatefacenterfie" +
- "ldsetfigcaptionafterprintegrityfigurequiredforeignObjectfore" +
- "ignobjectformactionautocompleteerrorformenctypemustmatchalle" +
- "ngeformmethodformnovalidatetimeformtargethiddenoscripthigh3h" +
- "reflanghttp-equivideonclickiframeimageimglyph4isindexismappl" +
- "etitemtypemarqueematheadersmallowfullscreenmaxlength5minleng" +
- "th6mtextareadonlymultiplemutedoncloseamlessortedoncontextmen" +
- "uitemidoncopyoncuechangeoncutondblclickondragendondragentero" +
- "ndragexitemreferrerpolicyondragleaveondragoverondragstarticl" +
- "eondropzonemptiedondurationchangeonendedonerroronfocusourceo" +
- "nhashchangeoninputmodeloninvalidonkeydownloadonkeypresspacer" +
- "onkeyupreloadonlanguagechangeonloadeddatalistingonloadedmeta" +
- "databindexonloadendonloadstartonmessageerroronmousedownonmou" +
- "seenteronmouseleaveonmousemoveonmouseoutputonmouseoveronmous" +
- "eupromptonmousewheelonofflineononlineonpagehidesclassearch2o" +
- "npageshowbronpastepublicontenteditableonpausemaponplayingonp" +
- "opstateonprogresspellcheckedonratechangeonrejectionhandledon" +
- "resetonresizesrcdocodeferonscrollonsecuritypolicyviolationau" +
- "xclickonseekedonseekingonselectedonshowidthgrouposteronsorta" +
- "bleonstalledonstorageonsubmitemscopedonsuspendontoggleonunha" +
- "ndledrejectionbeforeprintonunloadonvolumechangeonwaitingonwh" +
- "eeloptimumanifestrongoptionbeforeunloaddressrclangsrcsetstyl" +
- "esummarysupsvgsystemplateworkertypewrap"
diff --git a/vendor/golang.org/x/net/html/const.go b/vendor/golang.org/x/net/html/const.go
deleted file mode 100644
index ff7acf2d5b..0000000000
--- a/vendor/golang.org/x/net/html/const.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package html
-
-// Section 12.2.4.2 of the HTML5 specification says "The following elements
-// have varying levels of special parsing rules".
-// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements
-var isSpecialElementMap = map[string]bool{
- "address": true,
- "applet": true,
- "area": true,
- "article": true,
- "aside": true,
- "base": true,
- "basefont": true,
- "bgsound": true,
- "blockquote": true,
- "body": true,
- "br": true,
- "button": true,
- "caption": true,
- "center": true,
- "col": true,
- "colgroup": true,
- "dd": true,
- "details": true,
- "dir": true,
- "div": true,
- "dl": true,
- "dt": true,
- "embed": true,
- "fieldset": true,
- "figcaption": true,
- "figure": true,
- "footer": true,
- "form": true,
- "frame": true,
- "frameset": true,
- "h1": true,
- "h2": true,
- "h3": true,
- "h4": true,
- "h5": true,
- "h6": true,
- "head": true,
- "header": true,
- "hgroup": true,
- "hr": true,
- "html": true,
- "iframe": true,
- "img": true,
- "input": true,
- "keygen": true, // "keygen" has been removed from the spec, but are kept here for backwards compatibility.
- "li": true,
- "link": true,
- "listing": true,
- "main": true,
- "marquee": true,
- "menu": true,
- "meta": true,
- "nav": true,
- "noembed": true,
- "noframes": true,
- "noscript": true,
- "object": true,
- "ol": true,
- "p": true,
- "param": true,
- "plaintext": true,
- "pre": true,
- "script": true,
- "section": true,
- "select": true,
- "source": true,
- "style": true,
- "summary": true,
- "table": true,
- "tbody": true,
- "td": true,
- "template": true,
- "textarea": true,
- "tfoot": true,
- "th": true,
- "thead": true,
- "title": true,
- "tr": true,
- "track": true,
- "ul": true,
- "wbr": true,
- "xmp": true,
-}
-
-func isSpecialElement(element *Node) bool {
- switch element.Namespace {
- case "", "html":
- return isSpecialElementMap[element.Data]
- case "math":
- switch element.Data {
- case "mi", "mo", "mn", "ms", "mtext", "annotation-xml":
- return true
- }
- case "svg":
- switch element.Data {
- case "foreignObject", "desc", "title":
- return true
- }
- }
- return false
-}
diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go
deleted file mode 100644
index 885c4c5936..0000000000
--- a/vendor/golang.org/x/net/html/doc.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package html implements an HTML5-compliant tokenizer and parser.
-
-Tokenization is done by creating a Tokenizer for an io.Reader r. It is the
-caller's responsibility to ensure that r provides UTF-8 encoded HTML.
-
- z := html.NewTokenizer(r)
-
-Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(),
-which parses the next token and returns its type, or an error:
-
- for {
- tt := z.Next()
- if tt == html.ErrorToken {
- // ...
- return ...
- }
- // Process the current token.
- }
-
-There are two APIs for retrieving the current token. The high-level API is to
-call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs
-allow optionally calling Raw after Next but before Token, Text, TagName, or
-TagAttr. In EBNF notation, the valid call sequence per token is:
-
- Next {Raw} [ Token | Text | TagName {TagAttr} ]
-
-Token returns an independent data structure that completely describes a token.
-Entities (such as "<") are unescaped, tag names and attribute keys are
-lower-cased, and attributes are collected into a []Attribute. For example:
-
- for {
- if z.Next() == html.ErrorToken {
- // Returning io.EOF indicates success.
- return z.Err()
- }
- emitToken(z.Token())
- }
-
-The low-level API performs fewer allocations and copies, but the contents of
-the []byte values returned by Text, TagName and TagAttr may change on the next
-call to Next. For example, to extract an HTML page's anchor text:
-
- depth := 0
- for {
- tt := z.Next()
- switch tt {
- case html.ErrorToken:
- return z.Err()
- case html.TextToken:
- if depth > 0 {
- // emitBytes should copy the []byte it receives,
- // if it doesn't process it immediately.
- emitBytes(z.Text())
- }
- case html.StartTagToken, html.EndTagToken:
- tn, _ := z.TagName()
- if len(tn) == 1 && tn[0] == 'a' {
- if tt == html.StartTagToken {
- depth++
- } else {
- depth--
- }
- }
- }
- }
-
-Parsing is done by calling Parse with an io.Reader, which returns the root of
-the parse tree (the document element) as a *Node. It is the caller's
-responsibility to ensure that the Reader provides UTF-8 encoded HTML. For
-example, to process each anchor node in depth-first order:
-
- doc, err := html.Parse(r)
- if err != nil {
- // ...
- }
- for n := range doc.Descendants() {
- if n.Type == html.ElementNode && n.Data == "a" {
- // Do something with n...
- }
- }
-
-The relevant specifications include:
-https://html.spec.whatwg.org/multipage/syntax.html and
-https://html.spec.whatwg.org/multipage/syntax.html#tokenization
-
-# Security Considerations
-
-Care should be taken when parsing and interpreting HTML, whether full documents
-or fragments, within the framework of the HTML specification, especially with
-regard to untrusted inputs.
-
-This package provides both a tokenizer and a parser, which implement the
-tokenization, and tokenization and tree construction stages of the WHATWG HTML
-parsing specification respectively. While the tokenizer parses and normalizes
-individual HTML tokens, only the parser constructs the DOM tree from the
-tokenized HTML, as described in the tree construction stage of the
-specification, dynamically modifying or extending the document's DOM tree.
-
-If your use case requires semantically well-formed HTML documents, as defined by
-the WHATWG specification, the parser should be used rather than the tokenizer.
-
-In security contexts, if trust decisions are being made using the tokenized or
-parsed content, the input must be re-serialized (for instance by using Render or
-Token.String) in order for those trust decisions to hold, as the process of
-tokenization or parsing may alter the content.
-*/
-package html // import "golang.org/x/net/html"
-
-// The tokenization algorithm implemented by this package is not a line-by-line
-// transliteration of the relatively verbose state-machine in the WHATWG
-// specification. A more direct approach is used instead, where the program
-// counter implies the state, such as whether it is tokenizing a tag or a text
-// node. Specification compliance is verified by checking expected and actual
-// outputs over a test suite rather than aiming for algorithmic fidelity.
-
-// TODO(nigeltao): Does a DOM API belong in this package or a separate one?
-// TODO(nigeltao): How does parsing interact with a JavaScript engine?
diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go
deleted file mode 100644
index bca3ae9a0c..0000000000
--- a/vendor/golang.org/x/net/html/doctype.go
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package html
-
-import (
- "strings"
-)
-
-// parseDoctype parses the data from a DoctypeToken into a name,
-// public identifier, and system identifier. It returns a Node whose Type
-// is DoctypeNode, whose Data is the name, and which has attributes
-// named "system" and "public" for the two identifiers if they were present.
-// quirks is whether the document should be parsed in "quirks mode".
-func parseDoctype(s string) (n *Node, quirks bool) {
- n = &Node{Type: DoctypeNode}
-
- // Find the name.
- space := strings.IndexAny(s, whitespace)
- if space == -1 {
- space = len(s)
- }
- n.Data = s[:space]
- // The comparison to "html" is case-sensitive.
- if n.Data != "html" {
- quirks = true
- }
- n.Data = strings.ToLower(n.Data)
- s = strings.TrimLeft(s[space:], whitespace)
-
- if len(s) < 6 {
- // It can't start with "PUBLIC" or "SYSTEM".
- // Ignore the rest of the string.
- return n, quirks || s != ""
- }
-
- key := strings.ToLower(s[:6])
- s = s[6:]
- for key == "public" || key == "system" {
- s = strings.TrimLeft(s, whitespace)
- if s == "" {
- break
- }
- quote := s[0]
- if quote != '"' && quote != '\'' {
- break
- }
- s = s[1:]
- q := strings.IndexRune(s, rune(quote))
- var id string
- if q == -1 {
- id = s
- s = ""
- } else {
- id = s[:q]
- s = s[q+1:]
- }
- n.Attr = append(n.Attr, Attribute{Key: key, Val: id})
- if key == "public" {
- key = "system"
- } else {
- key = ""
- }
- }
-
- if key != "" || s != "" {
- quirks = true
- } else if len(n.Attr) > 0 {
- if n.Attr[0].Key == "public" {
- public := strings.ToLower(n.Attr[0].Val)
- switch public {
- case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html":
- quirks = true
- default:
- for _, q := range quirkyIDs {
- if strings.HasPrefix(public, q) {
- quirks = true
- break
- }
- }
- }
- // The following two public IDs only cause quirks mode if there is no system ID.
- if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") ||
- strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) {
- quirks = true
- }
- }
- if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" &&
- strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") {
- quirks = true
- }
- }
-
- return n, quirks
-}
-
-// quirkyIDs is a list of public doctype identifiers that cause a document
-// to be interpreted in quirks mode. The identifiers should be in lower case.
-var quirkyIDs = []string{
- "+//silmaril//dtd html pro v0r11 19970101//",
- "-//advasoft ltd//dtd html 3.0 aswedit + extensions//",
- "-//as//dtd html 3.0 aswedit + extensions//",
- "-//ietf//dtd html 2.0 level 1//",
- "-//ietf//dtd html 2.0 level 2//",
- "-//ietf//dtd html 2.0 strict level 1//",
- "-//ietf//dtd html 2.0 strict level 2//",
- "-//ietf//dtd html 2.0 strict//",
- "-//ietf//dtd html 2.0//",
- "-//ietf//dtd html 2.1e//",
- "-//ietf//dtd html 3.0//",
- "-//ietf//dtd html 3.2 final//",
- "-//ietf//dtd html 3.2//",
- "-//ietf//dtd html 3//",
- "-//ietf//dtd html level 0//",
- "-//ietf//dtd html level 1//",
- "-//ietf//dtd html level 2//",
- "-//ietf//dtd html level 3//",
- "-//ietf//dtd html strict level 0//",
- "-//ietf//dtd html strict level 1//",
- "-//ietf//dtd html strict level 2//",
- "-//ietf//dtd html strict level 3//",
- "-//ietf//dtd html strict//",
- "-//ietf//dtd html//",
- "-//metrius//dtd metrius presentational//",
- "-//microsoft//dtd internet explorer 2.0 html strict//",
- "-//microsoft//dtd internet explorer 2.0 html//",
- "-//microsoft//dtd internet explorer 2.0 tables//",
- "-//microsoft//dtd internet explorer 3.0 html strict//",
- "-//microsoft//dtd internet explorer 3.0 html//",
- "-//microsoft//dtd internet explorer 3.0 tables//",
- "-//netscape comm. corp.//dtd html//",
- "-//netscape comm. corp.//dtd strict html//",
- "-//o'reilly and associates//dtd html 2.0//",
- "-//o'reilly and associates//dtd html extended 1.0//",
- "-//o'reilly and associates//dtd html extended relaxed 1.0//",
- "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//",
- "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//",
- "-//spyglass//dtd html 2.0 extended//",
- "-//sq//dtd html 2.0 hotmetal + extensions//",
- "-//sun microsystems corp.//dtd hotjava html//",
- "-//sun microsystems corp.//dtd hotjava strict html//",
- "-//w3c//dtd html 3 1995-03-24//",
- "-//w3c//dtd html 3.2 draft//",
- "-//w3c//dtd html 3.2 final//",
- "-//w3c//dtd html 3.2//",
- "-//w3c//dtd html 3.2s draft//",
- "-//w3c//dtd html 4.0 frameset//",
- "-//w3c//dtd html 4.0 transitional//",
- "-//w3c//dtd html experimental 19960712//",
- "-//w3c//dtd html experimental 970421//",
- "-//w3c//dtd w3 html//",
- "-//w3o//dtd w3 html 3.0//",
- "-//webtechs//dtd mozilla html 2.0//",
- "-//webtechs//dtd mozilla html//",
-}
diff --git a/vendor/golang.org/x/net/html/entity.go b/vendor/golang.org/x/net/html/entity.go
deleted file mode 100644
index b628880a01..0000000000
--- a/vendor/golang.org/x/net/html/entity.go
+++ /dev/null
@@ -1,2253 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package html
-
-// All entities that do not end with ';' are 6 or fewer bytes long.
-const longestEntityWithoutSemicolon = 6
-
-// entity is a map from HTML entity names to their values. The semicolon matters:
-// https://html.spec.whatwg.org/multipage/syntax.html#named-character-references
-// lists both "amp" and "amp;" as two separate entries.
-//
-// Note that the HTML5 list is larger than the HTML4 list at
-// http://www.w3.org/TR/html4/sgml/entities.html
-var entity = map[string]rune{
- "AElig;": '\U000000C6',
- "AMP;": '\U00000026',
- "Aacute;": '\U000000C1',
- "Abreve;": '\U00000102',
- "Acirc;": '\U000000C2',
- "Acy;": '\U00000410',
- "Afr;": '\U0001D504',
- "Agrave;": '\U000000C0',
- "Alpha;": '\U00000391',
- "Amacr;": '\U00000100',
- "And;": '\U00002A53',
- "Aogon;": '\U00000104',
- "Aopf;": '\U0001D538',
- "ApplyFunction;": '\U00002061',
- "Aring;": '\U000000C5',
- "Ascr;": '\U0001D49C',
- "Assign;": '\U00002254',
- "Atilde;": '\U000000C3',
- "Auml;": '\U000000C4',
- "Backslash;": '\U00002216',
- "Barv;": '\U00002AE7',
- "Barwed;": '\U00002306',
- "Bcy;": '\U00000411',
- "Because;": '\U00002235',
- "Bernoullis;": '\U0000212C',
- "Beta;": '\U00000392',
- "Bfr;": '\U0001D505',
- "Bopf;": '\U0001D539',
- "Breve;": '\U000002D8',
- "Bscr;": '\U0000212C',
- "Bumpeq;": '\U0000224E',
- "CHcy;": '\U00000427',
- "COPY;": '\U000000A9',
- "Cacute;": '\U00000106',
- "Cap;": '\U000022D2',
- "CapitalDifferentialD;": '\U00002145',
- "Cayleys;": '\U0000212D',
- "Ccaron;": '\U0000010C',
- "Ccedil;": '\U000000C7',
- "Ccirc;": '\U00000108',
- "Cconint;": '\U00002230',
- "Cdot;": '\U0000010A',
- "Cedilla;": '\U000000B8',
- "CenterDot;": '\U000000B7',
- "Cfr;": '\U0000212D',
- "Chi;": '\U000003A7',
- "CircleDot;": '\U00002299',
- "CircleMinus;": '\U00002296',
- "CirclePlus;": '\U00002295',
- "CircleTimes;": '\U00002297',
- "ClockwiseContourIntegral;": '\U00002232',
- "CloseCurlyDoubleQuote;": '\U0000201D',
- "CloseCurlyQuote;": '\U00002019',
- "Colon;": '\U00002237',
- "Colone;": '\U00002A74',
- "Congruent;": '\U00002261',
- "Conint;": '\U0000222F',
- "ContourIntegral;": '\U0000222E',
- "Copf;": '\U00002102',
- "Coproduct;": '\U00002210',
- "CounterClockwiseContourIntegral;": '\U00002233',
- "Cross;": '\U00002A2F',
- "Cscr;": '\U0001D49E',
- "Cup;": '\U000022D3',
- "CupCap;": '\U0000224D',
- "DD;": '\U00002145',
- "DDotrahd;": '\U00002911',
- "DJcy;": '\U00000402',
- "DScy;": '\U00000405',
- "DZcy;": '\U0000040F',
- "Dagger;": '\U00002021',
- "Darr;": '\U000021A1',
- "Dashv;": '\U00002AE4',
- "Dcaron;": '\U0000010E',
- "Dcy;": '\U00000414',
- "Del;": '\U00002207',
- "Delta;": '\U00000394',
- "Dfr;": '\U0001D507',
- "DiacriticalAcute;": '\U000000B4',
- "DiacriticalDot;": '\U000002D9',
- "DiacriticalDoubleAcute;": '\U000002DD',
- "DiacriticalGrave;": '\U00000060',
- "DiacriticalTilde;": '\U000002DC',
- "Diamond;": '\U000022C4',
- "DifferentialD;": '\U00002146',
- "Dopf;": '\U0001D53B',
- "Dot;": '\U000000A8',
- "DotDot;": '\U000020DC',
- "DotEqual;": '\U00002250',
- "DoubleContourIntegral;": '\U0000222F',
- "DoubleDot;": '\U000000A8',
- "DoubleDownArrow;": '\U000021D3',
- "DoubleLeftArrow;": '\U000021D0',
- "DoubleLeftRightArrow;": '\U000021D4',
- "DoubleLeftTee;": '\U00002AE4',
- "DoubleLongLeftArrow;": '\U000027F8',
- "DoubleLongLeftRightArrow;": '\U000027FA',
- "DoubleLongRightArrow;": '\U000027F9',
- "DoubleRightArrow;": '\U000021D2',
- "DoubleRightTee;": '\U000022A8',
- "DoubleUpArrow;": '\U000021D1',
- "DoubleUpDownArrow;": '\U000021D5',
- "DoubleVerticalBar;": '\U00002225',
- "DownArrow;": '\U00002193',
- "DownArrowBar;": '\U00002913',
- "DownArrowUpArrow;": '\U000021F5',
- "DownBreve;": '\U00000311',
- "DownLeftRightVector;": '\U00002950',
- "DownLeftTeeVector;": '\U0000295E',
- "DownLeftVector;": '\U000021BD',
- "DownLeftVectorBar;": '\U00002956',
- "DownRightTeeVector;": '\U0000295F',
- "DownRightVector;": '\U000021C1',
- "DownRightVectorBar;": '\U00002957',
- "DownTee;": '\U000022A4',
- "DownTeeArrow;": '\U000021A7',
- "Downarrow;": '\U000021D3',
- "Dscr;": '\U0001D49F',
- "Dstrok;": '\U00000110',
- "ENG;": '\U0000014A',
- "ETH;": '\U000000D0',
- "Eacute;": '\U000000C9',
- "Ecaron;": '\U0000011A',
- "Ecirc;": '\U000000CA',
- "Ecy;": '\U0000042D',
- "Edot;": '\U00000116',
- "Efr;": '\U0001D508',
- "Egrave;": '\U000000C8',
- "Element;": '\U00002208',
- "Emacr;": '\U00000112',
- "EmptySmallSquare;": '\U000025FB',
- "EmptyVerySmallSquare;": '\U000025AB',
- "Eogon;": '\U00000118',
- "Eopf;": '\U0001D53C',
- "Epsilon;": '\U00000395',
- "Equal;": '\U00002A75',
- "EqualTilde;": '\U00002242',
- "Equilibrium;": '\U000021CC',
- "Escr;": '\U00002130',
- "Esim;": '\U00002A73',
- "Eta;": '\U00000397',
- "Euml;": '\U000000CB',
- "Exists;": '\U00002203',
- "ExponentialE;": '\U00002147',
- "Fcy;": '\U00000424',
- "Ffr;": '\U0001D509',
- "FilledSmallSquare;": '\U000025FC',
- "FilledVerySmallSquare;": '\U000025AA',
- "Fopf;": '\U0001D53D',
- "ForAll;": '\U00002200',
- "Fouriertrf;": '\U00002131',
- "Fscr;": '\U00002131',
- "GJcy;": '\U00000403',
- "GT;": '\U0000003E',
- "Gamma;": '\U00000393',
- "Gammad;": '\U000003DC',
- "Gbreve;": '\U0000011E',
- "Gcedil;": '\U00000122',
- "Gcirc;": '\U0000011C',
- "Gcy;": '\U00000413',
- "Gdot;": '\U00000120',
- "Gfr;": '\U0001D50A',
- "Gg;": '\U000022D9',
- "Gopf;": '\U0001D53E',
- "GreaterEqual;": '\U00002265',
- "GreaterEqualLess;": '\U000022DB',
- "GreaterFullEqual;": '\U00002267',
- "GreaterGreater;": '\U00002AA2',
- "GreaterLess;": '\U00002277',
- "GreaterSlantEqual;": '\U00002A7E',
- "GreaterTilde;": '\U00002273',
- "Gscr;": '\U0001D4A2',
- "Gt;": '\U0000226B',
- "HARDcy;": '\U0000042A',
- "Hacek;": '\U000002C7',
- "Hat;": '\U0000005E',
- "Hcirc;": '\U00000124',
- "Hfr;": '\U0000210C',
- "HilbertSpace;": '\U0000210B',
- "Hopf;": '\U0000210D',
- "HorizontalLine;": '\U00002500',
- "Hscr;": '\U0000210B',
- "Hstrok;": '\U00000126',
- "HumpDownHump;": '\U0000224E',
- "HumpEqual;": '\U0000224F',
- "IEcy;": '\U00000415',
- "IJlig;": '\U00000132',
- "IOcy;": '\U00000401',
- "Iacute;": '\U000000CD',
- "Icirc;": '\U000000CE',
- "Icy;": '\U00000418',
- "Idot;": '\U00000130',
- "Ifr;": '\U00002111',
- "Igrave;": '\U000000CC',
- "Im;": '\U00002111',
- "Imacr;": '\U0000012A',
- "ImaginaryI;": '\U00002148',
- "Implies;": '\U000021D2',
- "Int;": '\U0000222C',
- "Integral;": '\U0000222B',
- "Intersection;": '\U000022C2',
- "InvisibleComma;": '\U00002063',
- "InvisibleTimes;": '\U00002062',
- "Iogon;": '\U0000012E',
- "Iopf;": '\U0001D540',
- "Iota;": '\U00000399',
- "Iscr;": '\U00002110',
- "Itilde;": '\U00000128',
- "Iukcy;": '\U00000406',
- "Iuml;": '\U000000CF',
- "Jcirc;": '\U00000134',
- "Jcy;": '\U00000419',
- "Jfr;": '\U0001D50D',
- "Jopf;": '\U0001D541',
- "Jscr;": '\U0001D4A5',
- "Jsercy;": '\U00000408',
- "Jukcy;": '\U00000404',
- "KHcy;": '\U00000425',
- "KJcy;": '\U0000040C',
- "Kappa;": '\U0000039A',
- "Kcedil;": '\U00000136',
- "Kcy;": '\U0000041A',
- "Kfr;": '\U0001D50E',
- "Kopf;": '\U0001D542',
- "Kscr;": '\U0001D4A6',
- "LJcy;": '\U00000409',
- "LT;": '\U0000003C',
- "Lacute;": '\U00000139',
- "Lambda;": '\U0000039B',
- "Lang;": '\U000027EA',
- "Laplacetrf;": '\U00002112',
- "Larr;": '\U0000219E',
- "Lcaron;": '\U0000013D',
- "Lcedil;": '\U0000013B',
- "Lcy;": '\U0000041B',
- "LeftAngleBracket;": '\U000027E8',
- "LeftArrow;": '\U00002190',
- "LeftArrowBar;": '\U000021E4',
- "LeftArrowRightArrow;": '\U000021C6',
- "LeftCeiling;": '\U00002308',
- "LeftDoubleBracket;": '\U000027E6',
- "LeftDownTeeVector;": '\U00002961',
- "LeftDownVector;": '\U000021C3',
- "LeftDownVectorBar;": '\U00002959',
- "LeftFloor;": '\U0000230A',
- "LeftRightArrow;": '\U00002194',
- "LeftRightVector;": '\U0000294E',
- "LeftTee;": '\U000022A3',
- "LeftTeeArrow;": '\U000021A4',
- "LeftTeeVector;": '\U0000295A',
- "LeftTriangle;": '\U000022B2',
- "LeftTriangleBar;": '\U000029CF',
- "LeftTriangleEqual;": '\U000022B4',
- "LeftUpDownVector;": '\U00002951',
- "LeftUpTeeVector;": '\U00002960',
- "LeftUpVector;": '\U000021BF',
- "LeftUpVectorBar;": '\U00002958',
- "LeftVector;": '\U000021BC',
- "LeftVectorBar;": '\U00002952',
- "Leftarrow;": '\U000021D0',
- "Leftrightarrow;": '\U000021D4',
- "LessEqualGreater;": '\U000022DA',
- "LessFullEqual;": '\U00002266',
- "LessGreater;": '\U00002276',
- "LessLess;": '\U00002AA1',
- "LessSlantEqual;": '\U00002A7D',
- "LessTilde;": '\U00002272',
- "Lfr;": '\U0001D50F',
- "Ll;": '\U000022D8',
- "Lleftarrow;": '\U000021DA',
- "Lmidot;": '\U0000013F',
- "LongLeftArrow;": '\U000027F5',
- "LongLeftRightArrow;": '\U000027F7',
- "LongRightArrow;": '\U000027F6',
- "Longleftarrow;": '\U000027F8',
- "Longleftrightarrow;": '\U000027FA',
- "Longrightarrow;": '\U000027F9',
- "Lopf;": '\U0001D543',
- "LowerLeftArrow;": '\U00002199',
- "LowerRightArrow;": '\U00002198',
- "Lscr;": '\U00002112',
- "Lsh;": '\U000021B0',
- "Lstrok;": '\U00000141',
- "Lt;": '\U0000226A',
- "Map;": '\U00002905',
- "Mcy;": '\U0000041C',
- "MediumSpace;": '\U0000205F',
- "Mellintrf;": '\U00002133',
- "Mfr;": '\U0001D510',
- "MinusPlus;": '\U00002213',
- "Mopf;": '\U0001D544',
- "Mscr;": '\U00002133',
- "Mu;": '\U0000039C',
- "NJcy;": '\U0000040A',
- "Nacute;": '\U00000143',
- "Ncaron;": '\U00000147',
- "Ncedil;": '\U00000145',
- "Ncy;": '\U0000041D',
- "NegativeMediumSpace;": '\U0000200B',
- "NegativeThickSpace;": '\U0000200B',
- "NegativeThinSpace;": '\U0000200B',
- "NegativeVeryThinSpace;": '\U0000200B',
- "NestedGreaterGreater;": '\U0000226B',
- "NestedLessLess;": '\U0000226A',
- "NewLine;": '\U0000000A',
- "Nfr;": '\U0001D511',
- "NoBreak;": '\U00002060',
- "NonBreakingSpace;": '\U000000A0',
- "Nopf;": '\U00002115',
- "Not;": '\U00002AEC',
- "NotCongruent;": '\U00002262',
- "NotCupCap;": '\U0000226D',
- "NotDoubleVerticalBar;": '\U00002226',
- "NotElement;": '\U00002209',
- "NotEqual;": '\U00002260',
- "NotExists;": '\U00002204',
- "NotGreater;": '\U0000226F',
- "NotGreaterEqual;": '\U00002271',
- "NotGreaterLess;": '\U00002279',
- "NotGreaterTilde;": '\U00002275',
- "NotLeftTriangle;": '\U000022EA',
- "NotLeftTriangleEqual;": '\U000022EC',
- "NotLess;": '\U0000226E',
- "NotLessEqual;": '\U00002270',
- "NotLessGreater;": '\U00002278',
- "NotLessTilde;": '\U00002274',
- "NotPrecedes;": '\U00002280',
- "NotPrecedesSlantEqual;": '\U000022E0',
- "NotReverseElement;": '\U0000220C',
- "NotRightTriangle;": '\U000022EB',
- "NotRightTriangleEqual;": '\U000022ED',
- "NotSquareSubsetEqual;": '\U000022E2',
- "NotSquareSupersetEqual;": '\U000022E3',
- "NotSubsetEqual;": '\U00002288',
- "NotSucceeds;": '\U00002281',
- "NotSucceedsSlantEqual;": '\U000022E1',
- "NotSupersetEqual;": '\U00002289',
- "NotTilde;": '\U00002241',
- "NotTildeEqual;": '\U00002244',
- "NotTildeFullEqual;": '\U00002247',
- "NotTildeTilde;": '\U00002249',
- "NotVerticalBar;": '\U00002224',
- "Nscr;": '\U0001D4A9',
- "Ntilde;": '\U000000D1',
- "Nu;": '\U0000039D',
- "OElig;": '\U00000152',
- "Oacute;": '\U000000D3',
- "Ocirc;": '\U000000D4',
- "Ocy;": '\U0000041E',
- "Odblac;": '\U00000150',
- "Ofr;": '\U0001D512',
- "Ograve;": '\U000000D2',
- "Omacr;": '\U0000014C',
- "Omega;": '\U000003A9',
- "Omicron;": '\U0000039F',
- "Oopf;": '\U0001D546',
- "OpenCurlyDoubleQuote;": '\U0000201C',
- "OpenCurlyQuote;": '\U00002018',
- "Or;": '\U00002A54',
- "Oscr;": '\U0001D4AA',
- "Oslash;": '\U000000D8',
- "Otilde;": '\U000000D5',
- "Otimes;": '\U00002A37',
- "Ouml;": '\U000000D6',
- "OverBar;": '\U0000203E',
- "OverBrace;": '\U000023DE',
- "OverBracket;": '\U000023B4',
- "OverParenthesis;": '\U000023DC',
- "PartialD;": '\U00002202',
- "Pcy;": '\U0000041F',
- "Pfr;": '\U0001D513',
- "Phi;": '\U000003A6',
- "Pi;": '\U000003A0',
- "PlusMinus;": '\U000000B1',
- "Poincareplane;": '\U0000210C',
- "Popf;": '\U00002119',
- "Pr;": '\U00002ABB',
- "Precedes;": '\U0000227A',
- "PrecedesEqual;": '\U00002AAF',
- "PrecedesSlantEqual;": '\U0000227C',
- "PrecedesTilde;": '\U0000227E',
- "Prime;": '\U00002033',
- "Product;": '\U0000220F',
- "Proportion;": '\U00002237',
- "Proportional;": '\U0000221D',
- "Pscr;": '\U0001D4AB',
- "Psi;": '\U000003A8',
- "QUOT;": '\U00000022',
- "Qfr;": '\U0001D514',
- "Qopf;": '\U0000211A',
- "Qscr;": '\U0001D4AC',
- "RBarr;": '\U00002910',
- "REG;": '\U000000AE',
- "Racute;": '\U00000154',
- "Rang;": '\U000027EB',
- "Rarr;": '\U000021A0',
- "Rarrtl;": '\U00002916',
- "Rcaron;": '\U00000158',
- "Rcedil;": '\U00000156',
- "Rcy;": '\U00000420',
- "Re;": '\U0000211C',
- "ReverseElement;": '\U0000220B',
- "ReverseEquilibrium;": '\U000021CB',
- "ReverseUpEquilibrium;": '\U0000296F',
- "Rfr;": '\U0000211C',
- "Rho;": '\U000003A1',
- "RightAngleBracket;": '\U000027E9',
- "RightArrow;": '\U00002192',
- "RightArrowBar;": '\U000021E5',
- "RightArrowLeftArrow;": '\U000021C4',
- "RightCeiling;": '\U00002309',
- "RightDoubleBracket;": '\U000027E7',
- "RightDownTeeVector;": '\U0000295D',
- "RightDownVector;": '\U000021C2',
- "RightDownVectorBar;": '\U00002955',
- "RightFloor;": '\U0000230B',
- "RightTee;": '\U000022A2',
- "RightTeeArrow;": '\U000021A6',
- "RightTeeVector;": '\U0000295B',
- "RightTriangle;": '\U000022B3',
- "RightTriangleBar;": '\U000029D0',
- "RightTriangleEqual;": '\U000022B5',
- "RightUpDownVector;": '\U0000294F',
- "RightUpTeeVector;": '\U0000295C',
- "RightUpVector;": '\U000021BE',
- "RightUpVectorBar;": '\U00002954',
- "RightVector;": '\U000021C0',
- "RightVectorBar;": '\U00002953',
- "Rightarrow;": '\U000021D2',
- "Ropf;": '\U0000211D',
- "RoundImplies;": '\U00002970',
- "Rrightarrow;": '\U000021DB',
- "Rscr;": '\U0000211B',
- "Rsh;": '\U000021B1',
- "RuleDelayed;": '\U000029F4',
- "SHCHcy;": '\U00000429',
- "SHcy;": '\U00000428',
- "SOFTcy;": '\U0000042C',
- "Sacute;": '\U0000015A',
- "Sc;": '\U00002ABC',
- "Scaron;": '\U00000160',
- "Scedil;": '\U0000015E',
- "Scirc;": '\U0000015C',
- "Scy;": '\U00000421',
- "Sfr;": '\U0001D516',
- "ShortDownArrow;": '\U00002193',
- "ShortLeftArrow;": '\U00002190',
- "ShortRightArrow;": '\U00002192',
- "ShortUpArrow;": '\U00002191',
- "Sigma;": '\U000003A3',
- "SmallCircle;": '\U00002218',
- "Sopf;": '\U0001D54A',
- "Sqrt;": '\U0000221A',
- "Square;": '\U000025A1',
- "SquareIntersection;": '\U00002293',
- "SquareSubset;": '\U0000228F',
- "SquareSubsetEqual;": '\U00002291',
- "SquareSuperset;": '\U00002290',
- "SquareSupersetEqual;": '\U00002292',
- "SquareUnion;": '\U00002294',
- "Sscr;": '\U0001D4AE',
- "Star;": '\U000022C6',
- "Sub;": '\U000022D0',
- "Subset;": '\U000022D0',
- "SubsetEqual;": '\U00002286',
- "Succeeds;": '\U0000227B',
- "SucceedsEqual;": '\U00002AB0',
- "SucceedsSlantEqual;": '\U0000227D',
- "SucceedsTilde;": '\U0000227F',
- "SuchThat;": '\U0000220B',
- "Sum;": '\U00002211',
- "Sup;": '\U000022D1',
- "Superset;": '\U00002283',
- "SupersetEqual;": '\U00002287',
- "Supset;": '\U000022D1',
- "THORN;": '\U000000DE',
- "TRADE;": '\U00002122',
- "TSHcy;": '\U0000040B',
- "TScy;": '\U00000426',
- "Tab;": '\U00000009',
- "Tau;": '\U000003A4',
- "Tcaron;": '\U00000164',
- "Tcedil;": '\U00000162',
- "Tcy;": '\U00000422',
- "Tfr;": '\U0001D517',
- "Therefore;": '\U00002234',
- "Theta;": '\U00000398',
- "ThinSpace;": '\U00002009',
- "Tilde;": '\U0000223C',
- "TildeEqual;": '\U00002243',
- "TildeFullEqual;": '\U00002245',
- "TildeTilde;": '\U00002248',
- "Topf;": '\U0001D54B',
- "TripleDot;": '\U000020DB',
- "Tscr;": '\U0001D4AF',
- "Tstrok;": '\U00000166',
- "Uacute;": '\U000000DA',
- "Uarr;": '\U0000219F',
- "Uarrocir;": '\U00002949',
- "Ubrcy;": '\U0000040E',
- "Ubreve;": '\U0000016C',
- "Ucirc;": '\U000000DB',
- "Ucy;": '\U00000423',
- "Udblac;": '\U00000170',
- "Ufr;": '\U0001D518',
- "Ugrave;": '\U000000D9',
- "Umacr;": '\U0000016A',
- "UnderBar;": '\U0000005F',
- "UnderBrace;": '\U000023DF',
- "UnderBracket;": '\U000023B5',
- "UnderParenthesis;": '\U000023DD',
- "Union;": '\U000022C3',
- "UnionPlus;": '\U0000228E',
- "Uogon;": '\U00000172',
- "Uopf;": '\U0001D54C',
- "UpArrow;": '\U00002191',
- "UpArrowBar;": '\U00002912',
- "UpArrowDownArrow;": '\U000021C5',
- "UpDownArrow;": '\U00002195',
- "UpEquilibrium;": '\U0000296E',
- "UpTee;": '\U000022A5',
- "UpTeeArrow;": '\U000021A5',
- "Uparrow;": '\U000021D1',
- "Updownarrow;": '\U000021D5',
- "UpperLeftArrow;": '\U00002196',
- "UpperRightArrow;": '\U00002197',
- "Upsi;": '\U000003D2',
- "Upsilon;": '\U000003A5',
- "Uring;": '\U0000016E',
- "Uscr;": '\U0001D4B0',
- "Utilde;": '\U00000168',
- "Uuml;": '\U000000DC',
- "VDash;": '\U000022AB',
- "Vbar;": '\U00002AEB',
- "Vcy;": '\U00000412',
- "Vdash;": '\U000022A9',
- "Vdashl;": '\U00002AE6',
- "Vee;": '\U000022C1',
- "Verbar;": '\U00002016',
- "Vert;": '\U00002016',
- "VerticalBar;": '\U00002223',
- "VerticalLine;": '\U0000007C',
- "VerticalSeparator;": '\U00002758',
- "VerticalTilde;": '\U00002240',
- "VeryThinSpace;": '\U0000200A',
- "Vfr;": '\U0001D519',
- "Vopf;": '\U0001D54D',
- "Vscr;": '\U0001D4B1',
- "Vvdash;": '\U000022AA',
- "Wcirc;": '\U00000174',
- "Wedge;": '\U000022C0',
- "Wfr;": '\U0001D51A',
- "Wopf;": '\U0001D54E',
- "Wscr;": '\U0001D4B2',
- "Xfr;": '\U0001D51B',
- "Xi;": '\U0000039E',
- "Xopf;": '\U0001D54F',
- "Xscr;": '\U0001D4B3',
- "YAcy;": '\U0000042F',
- "YIcy;": '\U00000407',
- "YUcy;": '\U0000042E',
- "Yacute;": '\U000000DD',
- "Ycirc;": '\U00000176',
- "Ycy;": '\U0000042B',
- "Yfr;": '\U0001D51C',
- "Yopf;": '\U0001D550',
- "Yscr;": '\U0001D4B4',
- "Yuml;": '\U00000178',
- "ZHcy;": '\U00000416',
- "Zacute;": '\U00000179',
- "Zcaron;": '\U0000017D',
- "Zcy;": '\U00000417',
- "Zdot;": '\U0000017B',
- "ZeroWidthSpace;": '\U0000200B',
- "Zeta;": '\U00000396',
- "Zfr;": '\U00002128',
- "Zopf;": '\U00002124',
- "Zscr;": '\U0001D4B5',
- "aacute;": '\U000000E1',
- "abreve;": '\U00000103',
- "ac;": '\U0000223E',
- "acd;": '\U0000223F',
- "acirc;": '\U000000E2',
- "acute;": '\U000000B4',
- "acy;": '\U00000430',
- "aelig;": '\U000000E6',
- "af;": '\U00002061',
- "afr;": '\U0001D51E',
- "agrave;": '\U000000E0',
- "alefsym;": '\U00002135',
- "aleph;": '\U00002135',
- "alpha;": '\U000003B1',
- "amacr;": '\U00000101',
- "amalg;": '\U00002A3F',
- "amp;": '\U00000026',
- "and;": '\U00002227',
- "andand;": '\U00002A55',
- "andd;": '\U00002A5C',
- "andslope;": '\U00002A58',
- "andv;": '\U00002A5A',
- "ang;": '\U00002220',
- "ange;": '\U000029A4',
- "angle;": '\U00002220',
- "angmsd;": '\U00002221',
- "angmsdaa;": '\U000029A8',
- "angmsdab;": '\U000029A9',
- "angmsdac;": '\U000029AA',
- "angmsdad;": '\U000029AB',
- "angmsdae;": '\U000029AC',
- "angmsdaf;": '\U000029AD',
- "angmsdag;": '\U000029AE',
- "angmsdah;": '\U000029AF',
- "angrt;": '\U0000221F',
- "angrtvb;": '\U000022BE',
- "angrtvbd;": '\U0000299D',
- "angsph;": '\U00002222',
- "angst;": '\U000000C5',
- "angzarr;": '\U0000237C',
- "aogon;": '\U00000105',
- "aopf;": '\U0001D552',
- "ap;": '\U00002248',
- "apE;": '\U00002A70',
- "apacir;": '\U00002A6F',
- "ape;": '\U0000224A',
- "apid;": '\U0000224B',
- "apos;": '\U00000027',
- "approx;": '\U00002248',
- "approxeq;": '\U0000224A',
- "aring;": '\U000000E5',
- "ascr;": '\U0001D4B6',
- "ast;": '\U0000002A',
- "asymp;": '\U00002248',
- "asympeq;": '\U0000224D',
- "atilde;": '\U000000E3',
- "auml;": '\U000000E4',
- "awconint;": '\U00002233',
- "awint;": '\U00002A11',
- "bNot;": '\U00002AED',
- "backcong;": '\U0000224C',
- "backepsilon;": '\U000003F6',
- "backprime;": '\U00002035',
- "backsim;": '\U0000223D',
- "backsimeq;": '\U000022CD',
- "barvee;": '\U000022BD',
- "barwed;": '\U00002305',
- "barwedge;": '\U00002305',
- "bbrk;": '\U000023B5',
- "bbrktbrk;": '\U000023B6',
- "bcong;": '\U0000224C',
- "bcy;": '\U00000431',
- "bdquo;": '\U0000201E',
- "becaus;": '\U00002235',
- "because;": '\U00002235',
- "bemptyv;": '\U000029B0',
- "bepsi;": '\U000003F6',
- "bernou;": '\U0000212C',
- "beta;": '\U000003B2',
- "beth;": '\U00002136',
- "between;": '\U0000226C',
- "bfr;": '\U0001D51F',
- "bigcap;": '\U000022C2',
- "bigcirc;": '\U000025EF',
- "bigcup;": '\U000022C3',
- "bigodot;": '\U00002A00',
- "bigoplus;": '\U00002A01',
- "bigotimes;": '\U00002A02',
- "bigsqcup;": '\U00002A06',
- "bigstar;": '\U00002605',
- "bigtriangledown;": '\U000025BD',
- "bigtriangleup;": '\U000025B3',
- "biguplus;": '\U00002A04',
- "bigvee;": '\U000022C1',
- "bigwedge;": '\U000022C0',
- "bkarow;": '\U0000290D',
- "blacklozenge;": '\U000029EB',
- "blacksquare;": '\U000025AA',
- "blacktriangle;": '\U000025B4',
- "blacktriangledown;": '\U000025BE',
- "blacktriangleleft;": '\U000025C2',
- "blacktriangleright;": '\U000025B8',
- "blank;": '\U00002423',
- "blk12;": '\U00002592',
- "blk14;": '\U00002591',
- "blk34;": '\U00002593',
- "block;": '\U00002588',
- "bnot;": '\U00002310',
- "bopf;": '\U0001D553',
- "bot;": '\U000022A5',
- "bottom;": '\U000022A5',
- "bowtie;": '\U000022C8',
- "boxDL;": '\U00002557',
- "boxDR;": '\U00002554',
- "boxDl;": '\U00002556',
- "boxDr;": '\U00002553',
- "boxH;": '\U00002550',
- "boxHD;": '\U00002566',
- "boxHU;": '\U00002569',
- "boxHd;": '\U00002564',
- "boxHu;": '\U00002567',
- "boxUL;": '\U0000255D',
- "boxUR;": '\U0000255A',
- "boxUl;": '\U0000255C',
- "boxUr;": '\U00002559',
- "boxV;": '\U00002551',
- "boxVH;": '\U0000256C',
- "boxVL;": '\U00002563',
- "boxVR;": '\U00002560',
- "boxVh;": '\U0000256B',
- "boxVl;": '\U00002562',
- "boxVr;": '\U0000255F',
- "boxbox;": '\U000029C9',
- "boxdL;": '\U00002555',
- "boxdR;": '\U00002552',
- "boxdl;": '\U00002510',
- "boxdr;": '\U0000250C',
- "boxh;": '\U00002500',
- "boxhD;": '\U00002565',
- "boxhU;": '\U00002568',
- "boxhd;": '\U0000252C',
- "boxhu;": '\U00002534',
- "boxminus;": '\U0000229F',
- "boxplus;": '\U0000229E',
- "boxtimes;": '\U000022A0',
- "boxuL;": '\U0000255B',
- "boxuR;": '\U00002558',
- "boxul;": '\U00002518',
- "boxur;": '\U00002514',
- "boxv;": '\U00002502',
- "boxvH;": '\U0000256A',
- "boxvL;": '\U00002561',
- "boxvR;": '\U0000255E',
- "boxvh;": '\U0000253C',
- "boxvl;": '\U00002524',
- "boxvr;": '\U0000251C',
- "bprime;": '\U00002035',
- "breve;": '\U000002D8',
- "brvbar;": '\U000000A6',
- "bscr;": '\U0001D4B7',
- "bsemi;": '\U0000204F',
- "bsim;": '\U0000223D',
- "bsime;": '\U000022CD',
- "bsol;": '\U0000005C',
- "bsolb;": '\U000029C5',
- "bsolhsub;": '\U000027C8',
- "bull;": '\U00002022',
- "bullet;": '\U00002022',
- "bump;": '\U0000224E',
- "bumpE;": '\U00002AAE',
- "bumpe;": '\U0000224F',
- "bumpeq;": '\U0000224F',
- "cacute;": '\U00000107',
- "cap;": '\U00002229',
- "capand;": '\U00002A44',
- "capbrcup;": '\U00002A49',
- "capcap;": '\U00002A4B',
- "capcup;": '\U00002A47',
- "capdot;": '\U00002A40',
- "caret;": '\U00002041',
- "caron;": '\U000002C7',
- "ccaps;": '\U00002A4D',
- "ccaron;": '\U0000010D',
- "ccedil;": '\U000000E7',
- "ccirc;": '\U00000109',
- "ccups;": '\U00002A4C',
- "ccupssm;": '\U00002A50',
- "cdot;": '\U0000010B',
- "cedil;": '\U000000B8',
- "cemptyv;": '\U000029B2',
- "cent;": '\U000000A2',
- "centerdot;": '\U000000B7',
- "cfr;": '\U0001D520',
- "chcy;": '\U00000447',
- "check;": '\U00002713',
- "checkmark;": '\U00002713',
- "chi;": '\U000003C7',
- "cir;": '\U000025CB',
- "cirE;": '\U000029C3',
- "circ;": '\U000002C6',
- "circeq;": '\U00002257',
- "circlearrowleft;": '\U000021BA',
- "circlearrowright;": '\U000021BB',
- "circledR;": '\U000000AE',
- "circledS;": '\U000024C8',
- "circledast;": '\U0000229B',
- "circledcirc;": '\U0000229A',
- "circleddash;": '\U0000229D',
- "cire;": '\U00002257',
- "cirfnint;": '\U00002A10',
- "cirmid;": '\U00002AEF',
- "cirscir;": '\U000029C2',
- "clubs;": '\U00002663',
- "clubsuit;": '\U00002663',
- "colon;": '\U0000003A',
- "colone;": '\U00002254',
- "coloneq;": '\U00002254',
- "comma;": '\U0000002C',
- "commat;": '\U00000040',
- "comp;": '\U00002201',
- "compfn;": '\U00002218',
- "complement;": '\U00002201',
- "complexes;": '\U00002102',
- "cong;": '\U00002245',
- "congdot;": '\U00002A6D',
- "conint;": '\U0000222E',
- "copf;": '\U0001D554',
- "coprod;": '\U00002210',
- "copy;": '\U000000A9',
- "copysr;": '\U00002117',
- "crarr;": '\U000021B5',
- "cross;": '\U00002717',
- "cscr;": '\U0001D4B8',
- "csub;": '\U00002ACF',
- "csube;": '\U00002AD1',
- "csup;": '\U00002AD0',
- "csupe;": '\U00002AD2',
- "ctdot;": '\U000022EF',
- "cudarrl;": '\U00002938',
- "cudarrr;": '\U00002935',
- "cuepr;": '\U000022DE',
- "cuesc;": '\U000022DF',
- "cularr;": '\U000021B6',
- "cularrp;": '\U0000293D',
- "cup;": '\U0000222A',
- "cupbrcap;": '\U00002A48',
- "cupcap;": '\U00002A46',
- "cupcup;": '\U00002A4A',
- "cupdot;": '\U0000228D',
- "cupor;": '\U00002A45',
- "curarr;": '\U000021B7',
- "curarrm;": '\U0000293C',
- "curlyeqprec;": '\U000022DE',
- "curlyeqsucc;": '\U000022DF',
- "curlyvee;": '\U000022CE',
- "curlywedge;": '\U000022CF',
- "curren;": '\U000000A4',
- "curvearrowleft;": '\U000021B6',
- "curvearrowright;": '\U000021B7',
- "cuvee;": '\U000022CE',
- "cuwed;": '\U000022CF',
- "cwconint;": '\U00002232',
- "cwint;": '\U00002231',
- "cylcty;": '\U0000232D',
- "dArr;": '\U000021D3',
- "dHar;": '\U00002965',
- "dagger;": '\U00002020',
- "daleth;": '\U00002138',
- "darr;": '\U00002193',
- "dash;": '\U00002010',
- "dashv;": '\U000022A3',
- "dbkarow;": '\U0000290F',
- "dblac;": '\U000002DD',
- "dcaron;": '\U0000010F',
- "dcy;": '\U00000434',
- "dd;": '\U00002146',
- "ddagger;": '\U00002021',
- "ddarr;": '\U000021CA',
- "ddotseq;": '\U00002A77',
- "deg;": '\U000000B0',
- "delta;": '\U000003B4',
- "demptyv;": '\U000029B1',
- "dfisht;": '\U0000297F',
- "dfr;": '\U0001D521',
- "dharl;": '\U000021C3',
- "dharr;": '\U000021C2',
- "diam;": '\U000022C4',
- "diamond;": '\U000022C4',
- "diamondsuit;": '\U00002666',
- "diams;": '\U00002666',
- "die;": '\U000000A8',
- "digamma;": '\U000003DD',
- "disin;": '\U000022F2',
- "div;": '\U000000F7',
- "divide;": '\U000000F7',
- "divideontimes;": '\U000022C7',
- "divonx;": '\U000022C7',
- "djcy;": '\U00000452',
- "dlcorn;": '\U0000231E',
- "dlcrop;": '\U0000230D',
- "dollar;": '\U00000024',
- "dopf;": '\U0001D555',
- "dot;": '\U000002D9',
- "doteq;": '\U00002250',
- "doteqdot;": '\U00002251',
- "dotminus;": '\U00002238',
- "dotplus;": '\U00002214',
- "dotsquare;": '\U000022A1',
- "doublebarwedge;": '\U00002306',
- "downarrow;": '\U00002193',
- "downdownarrows;": '\U000021CA',
- "downharpoonleft;": '\U000021C3',
- "downharpoonright;": '\U000021C2',
- "drbkarow;": '\U00002910',
- "drcorn;": '\U0000231F',
- "drcrop;": '\U0000230C',
- "dscr;": '\U0001D4B9',
- "dscy;": '\U00000455',
- "dsol;": '\U000029F6',
- "dstrok;": '\U00000111',
- "dtdot;": '\U000022F1',
- "dtri;": '\U000025BF',
- "dtrif;": '\U000025BE',
- "duarr;": '\U000021F5',
- "duhar;": '\U0000296F',
- "dwangle;": '\U000029A6',
- "dzcy;": '\U0000045F',
- "dzigrarr;": '\U000027FF',
- "eDDot;": '\U00002A77',
- "eDot;": '\U00002251',
- "eacute;": '\U000000E9',
- "easter;": '\U00002A6E',
- "ecaron;": '\U0000011B',
- "ecir;": '\U00002256',
- "ecirc;": '\U000000EA',
- "ecolon;": '\U00002255',
- "ecy;": '\U0000044D',
- "edot;": '\U00000117',
- "ee;": '\U00002147',
- "efDot;": '\U00002252',
- "efr;": '\U0001D522',
- "eg;": '\U00002A9A',
- "egrave;": '\U000000E8',
- "egs;": '\U00002A96',
- "egsdot;": '\U00002A98',
- "el;": '\U00002A99',
- "elinters;": '\U000023E7',
- "ell;": '\U00002113',
- "els;": '\U00002A95',
- "elsdot;": '\U00002A97',
- "emacr;": '\U00000113',
- "empty;": '\U00002205',
- "emptyset;": '\U00002205',
- "emptyv;": '\U00002205',
- "emsp;": '\U00002003',
- "emsp13;": '\U00002004',
- "emsp14;": '\U00002005',
- "eng;": '\U0000014B',
- "ensp;": '\U00002002',
- "eogon;": '\U00000119',
- "eopf;": '\U0001D556',
- "epar;": '\U000022D5',
- "eparsl;": '\U000029E3',
- "eplus;": '\U00002A71',
- "epsi;": '\U000003B5',
- "epsilon;": '\U000003B5',
- "epsiv;": '\U000003F5',
- "eqcirc;": '\U00002256',
- "eqcolon;": '\U00002255',
- "eqsim;": '\U00002242',
- "eqslantgtr;": '\U00002A96',
- "eqslantless;": '\U00002A95',
- "equals;": '\U0000003D',
- "equest;": '\U0000225F',
- "equiv;": '\U00002261',
- "equivDD;": '\U00002A78',
- "eqvparsl;": '\U000029E5',
- "erDot;": '\U00002253',
- "erarr;": '\U00002971',
- "escr;": '\U0000212F',
- "esdot;": '\U00002250',
- "esim;": '\U00002242',
- "eta;": '\U000003B7',
- "eth;": '\U000000F0',
- "euml;": '\U000000EB',
- "euro;": '\U000020AC',
- "excl;": '\U00000021',
- "exist;": '\U00002203',
- "expectation;": '\U00002130',
- "exponentiale;": '\U00002147',
- "fallingdotseq;": '\U00002252',
- "fcy;": '\U00000444',
- "female;": '\U00002640',
- "ffilig;": '\U0000FB03',
- "fflig;": '\U0000FB00',
- "ffllig;": '\U0000FB04',
- "ffr;": '\U0001D523',
- "filig;": '\U0000FB01',
- "flat;": '\U0000266D',
- "fllig;": '\U0000FB02',
- "fltns;": '\U000025B1',
- "fnof;": '\U00000192',
- "fopf;": '\U0001D557',
- "forall;": '\U00002200',
- "fork;": '\U000022D4',
- "forkv;": '\U00002AD9',
- "fpartint;": '\U00002A0D',
- "frac12;": '\U000000BD',
- "frac13;": '\U00002153',
- "frac14;": '\U000000BC',
- "frac15;": '\U00002155',
- "frac16;": '\U00002159',
- "frac18;": '\U0000215B',
- "frac23;": '\U00002154',
- "frac25;": '\U00002156',
- "frac34;": '\U000000BE',
- "frac35;": '\U00002157',
- "frac38;": '\U0000215C',
- "frac45;": '\U00002158',
- "frac56;": '\U0000215A',
- "frac58;": '\U0000215D',
- "frac78;": '\U0000215E',
- "frasl;": '\U00002044',
- "frown;": '\U00002322',
- "fscr;": '\U0001D4BB',
- "gE;": '\U00002267',
- "gEl;": '\U00002A8C',
- "gacute;": '\U000001F5',
- "gamma;": '\U000003B3',
- "gammad;": '\U000003DD',
- "gap;": '\U00002A86',
- "gbreve;": '\U0000011F',
- "gcirc;": '\U0000011D',
- "gcy;": '\U00000433',
- "gdot;": '\U00000121',
- "ge;": '\U00002265',
- "gel;": '\U000022DB',
- "geq;": '\U00002265',
- "geqq;": '\U00002267',
- "geqslant;": '\U00002A7E',
- "ges;": '\U00002A7E',
- "gescc;": '\U00002AA9',
- "gesdot;": '\U00002A80',
- "gesdoto;": '\U00002A82',
- "gesdotol;": '\U00002A84',
- "gesles;": '\U00002A94',
- "gfr;": '\U0001D524',
- "gg;": '\U0000226B',
- "ggg;": '\U000022D9',
- "gimel;": '\U00002137',
- "gjcy;": '\U00000453',
- "gl;": '\U00002277',
- "glE;": '\U00002A92',
- "gla;": '\U00002AA5',
- "glj;": '\U00002AA4',
- "gnE;": '\U00002269',
- "gnap;": '\U00002A8A',
- "gnapprox;": '\U00002A8A',
- "gne;": '\U00002A88',
- "gneq;": '\U00002A88',
- "gneqq;": '\U00002269',
- "gnsim;": '\U000022E7',
- "gopf;": '\U0001D558',
- "grave;": '\U00000060',
- "gscr;": '\U0000210A',
- "gsim;": '\U00002273',
- "gsime;": '\U00002A8E',
- "gsiml;": '\U00002A90',
- "gt;": '\U0000003E',
- "gtcc;": '\U00002AA7',
- "gtcir;": '\U00002A7A',
- "gtdot;": '\U000022D7',
- "gtlPar;": '\U00002995',
- "gtquest;": '\U00002A7C',
- "gtrapprox;": '\U00002A86',
- "gtrarr;": '\U00002978',
- "gtrdot;": '\U000022D7',
- "gtreqless;": '\U000022DB',
- "gtreqqless;": '\U00002A8C',
- "gtrless;": '\U00002277',
- "gtrsim;": '\U00002273',
- "hArr;": '\U000021D4',
- "hairsp;": '\U0000200A',
- "half;": '\U000000BD',
- "hamilt;": '\U0000210B',
- "hardcy;": '\U0000044A',
- "harr;": '\U00002194',
- "harrcir;": '\U00002948',
- "harrw;": '\U000021AD',
- "hbar;": '\U0000210F',
- "hcirc;": '\U00000125',
- "hearts;": '\U00002665',
- "heartsuit;": '\U00002665',
- "hellip;": '\U00002026',
- "hercon;": '\U000022B9',
- "hfr;": '\U0001D525',
- "hksearow;": '\U00002925',
- "hkswarow;": '\U00002926',
- "hoarr;": '\U000021FF',
- "homtht;": '\U0000223B',
- "hookleftarrow;": '\U000021A9',
- "hookrightarrow;": '\U000021AA',
- "hopf;": '\U0001D559',
- "horbar;": '\U00002015',
- "hscr;": '\U0001D4BD',
- "hslash;": '\U0000210F',
- "hstrok;": '\U00000127',
- "hybull;": '\U00002043',
- "hyphen;": '\U00002010',
- "iacute;": '\U000000ED',
- "ic;": '\U00002063',
- "icirc;": '\U000000EE',
- "icy;": '\U00000438',
- "iecy;": '\U00000435',
- "iexcl;": '\U000000A1',
- "iff;": '\U000021D4',
- "ifr;": '\U0001D526',
- "igrave;": '\U000000EC',
- "ii;": '\U00002148',
- "iiiint;": '\U00002A0C',
- "iiint;": '\U0000222D',
- "iinfin;": '\U000029DC',
- "iiota;": '\U00002129',
- "ijlig;": '\U00000133',
- "imacr;": '\U0000012B',
- "image;": '\U00002111',
- "imagline;": '\U00002110',
- "imagpart;": '\U00002111',
- "imath;": '\U00000131',
- "imof;": '\U000022B7',
- "imped;": '\U000001B5',
- "in;": '\U00002208',
- "incare;": '\U00002105',
- "infin;": '\U0000221E',
- "infintie;": '\U000029DD',
- "inodot;": '\U00000131',
- "int;": '\U0000222B',
- "intcal;": '\U000022BA',
- "integers;": '\U00002124',
- "intercal;": '\U000022BA',
- "intlarhk;": '\U00002A17',
- "intprod;": '\U00002A3C',
- "iocy;": '\U00000451',
- "iogon;": '\U0000012F',
- "iopf;": '\U0001D55A',
- "iota;": '\U000003B9',
- "iprod;": '\U00002A3C',
- "iquest;": '\U000000BF',
- "iscr;": '\U0001D4BE',
- "isin;": '\U00002208',
- "isinE;": '\U000022F9',
- "isindot;": '\U000022F5',
- "isins;": '\U000022F4',
- "isinsv;": '\U000022F3',
- "isinv;": '\U00002208',
- "it;": '\U00002062',
- "itilde;": '\U00000129',
- "iukcy;": '\U00000456',
- "iuml;": '\U000000EF',
- "jcirc;": '\U00000135',
- "jcy;": '\U00000439',
- "jfr;": '\U0001D527',
- "jmath;": '\U00000237',
- "jopf;": '\U0001D55B',
- "jscr;": '\U0001D4BF',
- "jsercy;": '\U00000458',
- "jukcy;": '\U00000454',
- "kappa;": '\U000003BA',
- "kappav;": '\U000003F0',
- "kcedil;": '\U00000137',
- "kcy;": '\U0000043A',
- "kfr;": '\U0001D528',
- "kgreen;": '\U00000138',
- "khcy;": '\U00000445',
- "kjcy;": '\U0000045C',
- "kopf;": '\U0001D55C',
- "kscr;": '\U0001D4C0',
- "lAarr;": '\U000021DA',
- "lArr;": '\U000021D0',
- "lAtail;": '\U0000291B',
- "lBarr;": '\U0000290E',
- "lE;": '\U00002266',
- "lEg;": '\U00002A8B',
- "lHar;": '\U00002962',
- "lacute;": '\U0000013A',
- "laemptyv;": '\U000029B4',
- "lagran;": '\U00002112',
- "lambda;": '\U000003BB',
- "lang;": '\U000027E8',
- "langd;": '\U00002991',
- "langle;": '\U000027E8',
- "lap;": '\U00002A85',
- "laquo;": '\U000000AB',
- "larr;": '\U00002190',
- "larrb;": '\U000021E4',
- "larrbfs;": '\U0000291F',
- "larrfs;": '\U0000291D',
- "larrhk;": '\U000021A9',
- "larrlp;": '\U000021AB',
- "larrpl;": '\U00002939',
- "larrsim;": '\U00002973',
- "larrtl;": '\U000021A2',
- "lat;": '\U00002AAB',
- "latail;": '\U00002919',
- "late;": '\U00002AAD',
- "lbarr;": '\U0000290C',
- "lbbrk;": '\U00002772',
- "lbrace;": '\U0000007B',
- "lbrack;": '\U0000005B',
- "lbrke;": '\U0000298B',
- "lbrksld;": '\U0000298F',
- "lbrkslu;": '\U0000298D',
- "lcaron;": '\U0000013E',
- "lcedil;": '\U0000013C',
- "lceil;": '\U00002308',
- "lcub;": '\U0000007B',
- "lcy;": '\U0000043B',
- "ldca;": '\U00002936',
- "ldquo;": '\U0000201C',
- "ldquor;": '\U0000201E',
- "ldrdhar;": '\U00002967',
- "ldrushar;": '\U0000294B',
- "ldsh;": '\U000021B2',
- "le;": '\U00002264',
- "leftarrow;": '\U00002190',
- "leftarrowtail;": '\U000021A2',
- "leftharpoondown;": '\U000021BD',
- "leftharpoonup;": '\U000021BC',
- "leftleftarrows;": '\U000021C7',
- "leftrightarrow;": '\U00002194',
- "leftrightarrows;": '\U000021C6',
- "leftrightharpoons;": '\U000021CB',
- "leftrightsquigarrow;": '\U000021AD',
- "leftthreetimes;": '\U000022CB',
- "leg;": '\U000022DA',
- "leq;": '\U00002264',
- "leqq;": '\U00002266',
- "leqslant;": '\U00002A7D',
- "les;": '\U00002A7D',
- "lescc;": '\U00002AA8',
- "lesdot;": '\U00002A7F',
- "lesdoto;": '\U00002A81',
- "lesdotor;": '\U00002A83',
- "lesges;": '\U00002A93',
- "lessapprox;": '\U00002A85',
- "lessdot;": '\U000022D6',
- "lesseqgtr;": '\U000022DA',
- "lesseqqgtr;": '\U00002A8B',
- "lessgtr;": '\U00002276',
- "lesssim;": '\U00002272',
- "lfisht;": '\U0000297C',
- "lfloor;": '\U0000230A',
- "lfr;": '\U0001D529',
- "lg;": '\U00002276',
- "lgE;": '\U00002A91',
- "lhard;": '\U000021BD',
- "lharu;": '\U000021BC',
- "lharul;": '\U0000296A',
- "lhblk;": '\U00002584',
- "ljcy;": '\U00000459',
- "ll;": '\U0000226A',
- "llarr;": '\U000021C7',
- "llcorner;": '\U0000231E',
- "llhard;": '\U0000296B',
- "lltri;": '\U000025FA',
- "lmidot;": '\U00000140',
- "lmoust;": '\U000023B0',
- "lmoustache;": '\U000023B0',
- "lnE;": '\U00002268',
- "lnap;": '\U00002A89',
- "lnapprox;": '\U00002A89',
- "lne;": '\U00002A87',
- "lneq;": '\U00002A87',
- "lneqq;": '\U00002268',
- "lnsim;": '\U000022E6',
- "loang;": '\U000027EC',
- "loarr;": '\U000021FD',
- "lobrk;": '\U000027E6',
- "longleftarrow;": '\U000027F5',
- "longleftrightarrow;": '\U000027F7',
- "longmapsto;": '\U000027FC',
- "longrightarrow;": '\U000027F6',
- "looparrowleft;": '\U000021AB',
- "looparrowright;": '\U000021AC',
- "lopar;": '\U00002985',
- "lopf;": '\U0001D55D',
- "loplus;": '\U00002A2D',
- "lotimes;": '\U00002A34',
- "lowast;": '\U00002217',
- "lowbar;": '\U0000005F',
- "loz;": '\U000025CA',
- "lozenge;": '\U000025CA',
- "lozf;": '\U000029EB',
- "lpar;": '\U00000028',
- "lparlt;": '\U00002993',
- "lrarr;": '\U000021C6',
- "lrcorner;": '\U0000231F',
- "lrhar;": '\U000021CB',
- "lrhard;": '\U0000296D',
- "lrm;": '\U0000200E',
- "lrtri;": '\U000022BF',
- "lsaquo;": '\U00002039',
- "lscr;": '\U0001D4C1',
- "lsh;": '\U000021B0',
- "lsim;": '\U00002272',
- "lsime;": '\U00002A8D',
- "lsimg;": '\U00002A8F',
- "lsqb;": '\U0000005B',
- "lsquo;": '\U00002018',
- "lsquor;": '\U0000201A',
- "lstrok;": '\U00000142',
- "lt;": '\U0000003C',
- "ltcc;": '\U00002AA6',
- "ltcir;": '\U00002A79',
- "ltdot;": '\U000022D6',
- "lthree;": '\U000022CB',
- "ltimes;": '\U000022C9',
- "ltlarr;": '\U00002976',
- "ltquest;": '\U00002A7B',
- "ltrPar;": '\U00002996',
- "ltri;": '\U000025C3',
- "ltrie;": '\U000022B4',
- "ltrif;": '\U000025C2',
- "lurdshar;": '\U0000294A',
- "luruhar;": '\U00002966',
- "mDDot;": '\U0000223A',
- "macr;": '\U000000AF',
- "male;": '\U00002642',
- "malt;": '\U00002720',
- "maltese;": '\U00002720',
- "map;": '\U000021A6',
- "mapsto;": '\U000021A6',
- "mapstodown;": '\U000021A7',
- "mapstoleft;": '\U000021A4',
- "mapstoup;": '\U000021A5',
- "marker;": '\U000025AE',
- "mcomma;": '\U00002A29',
- "mcy;": '\U0000043C',
- "mdash;": '\U00002014',
- "measuredangle;": '\U00002221',
- "mfr;": '\U0001D52A',
- "mho;": '\U00002127',
- "micro;": '\U000000B5',
- "mid;": '\U00002223',
- "midast;": '\U0000002A',
- "midcir;": '\U00002AF0',
- "middot;": '\U000000B7',
- "minus;": '\U00002212',
- "minusb;": '\U0000229F',
- "minusd;": '\U00002238',
- "minusdu;": '\U00002A2A',
- "mlcp;": '\U00002ADB',
- "mldr;": '\U00002026',
- "mnplus;": '\U00002213',
- "models;": '\U000022A7',
- "mopf;": '\U0001D55E',
- "mp;": '\U00002213',
- "mscr;": '\U0001D4C2',
- "mstpos;": '\U0000223E',
- "mu;": '\U000003BC',
- "multimap;": '\U000022B8',
- "mumap;": '\U000022B8',
- "nLeftarrow;": '\U000021CD',
- "nLeftrightarrow;": '\U000021CE',
- "nRightarrow;": '\U000021CF',
- "nVDash;": '\U000022AF',
- "nVdash;": '\U000022AE',
- "nabla;": '\U00002207',
- "nacute;": '\U00000144',
- "nap;": '\U00002249',
- "napos;": '\U00000149',
- "napprox;": '\U00002249',
- "natur;": '\U0000266E',
- "natural;": '\U0000266E',
- "naturals;": '\U00002115',
- "nbsp;": '\U000000A0',
- "ncap;": '\U00002A43',
- "ncaron;": '\U00000148',
- "ncedil;": '\U00000146',
- "ncong;": '\U00002247',
- "ncup;": '\U00002A42',
- "ncy;": '\U0000043D',
- "ndash;": '\U00002013',
- "ne;": '\U00002260',
- "neArr;": '\U000021D7',
- "nearhk;": '\U00002924',
- "nearr;": '\U00002197',
- "nearrow;": '\U00002197',
- "nequiv;": '\U00002262',
- "nesear;": '\U00002928',
- "nexist;": '\U00002204',
- "nexists;": '\U00002204',
- "nfr;": '\U0001D52B',
- "nge;": '\U00002271',
- "ngeq;": '\U00002271',
- "ngsim;": '\U00002275',
- "ngt;": '\U0000226F',
- "ngtr;": '\U0000226F',
- "nhArr;": '\U000021CE',
- "nharr;": '\U000021AE',
- "nhpar;": '\U00002AF2',
- "ni;": '\U0000220B',
- "nis;": '\U000022FC',
- "nisd;": '\U000022FA',
- "niv;": '\U0000220B',
- "njcy;": '\U0000045A',
- "nlArr;": '\U000021CD',
- "nlarr;": '\U0000219A',
- "nldr;": '\U00002025',
- "nle;": '\U00002270',
- "nleftarrow;": '\U0000219A',
- "nleftrightarrow;": '\U000021AE',
- "nleq;": '\U00002270',
- "nless;": '\U0000226E',
- "nlsim;": '\U00002274',
- "nlt;": '\U0000226E',
- "nltri;": '\U000022EA',
- "nltrie;": '\U000022EC',
- "nmid;": '\U00002224',
- "nopf;": '\U0001D55F',
- "not;": '\U000000AC',
- "notin;": '\U00002209',
- "notinva;": '\U00002209',
- "notinvb;": '\U000022F7',
- "notinvc;": '\U000022F6',
- "notni;": '\U0000220C',
- "notniva;": '\U0000220C',
- "notnivb;": '\U000022FE',
- "notnivc;": '\U000022FD',
- "npar;": '\U00002226',
- "nparallel;": '\U00002226',
- "npolint;": '\U00002A14',
- "npr;": '\U00002280',
- "nprcue;": '\U000022E0',
- "nprec;": '\U00002280',
- "nrArr;": '\U000021CF',
- "nrarr;": '\U0000219B',
- "nrightarrow;": '\U0000219B',
- "nrtri;": '\U000022EB',
- "nrtrie;": '\U000022ED',
- "nsc;": '\U00002281',
- "nsccue;": '\U000022E1',
- "nscr;": '\U0001D4C3',
- "nshortmid;": '\U00002224',
- "nshortparallel;": '\U00002226',
- "nsim;": '\U00002241',
- "nsime;": '\U00002244',
- "nsimeq;": '\U00002244',
- "nsmid;": '\U00002224',
- "nspar;": '\U00002226',
- "nsqsube;": '\U000022E2',
- "nsqsupe;": '\U000022E3',
- "nsub;": '\U00002284',
- "nsube;": '\U00002288',
- "nsubseteq;": '\U00002288',
- "nsucc;": '\U00002281',
- "nsup;": '\U00002285',
- "nsupe;": '\U00002289',
- "nsupseteq;": '\U00002289',
- "ntgl;": '\U00002279',
- "ntilde;": '\U000000F1',
- "ntlg;": '\U00002278',
- "ntriangleleft;": '\U000022EA',
- "ntrianglelefteq;": '\U000022EC',
- "ntriangleright;": '\U000022EB',
- "ntrianglerighteq;": '\U000022ED',
- "nu;": '\U000003BD',
- "num;": '\U00000023',
- "numero;": '\U00002116',
- "numsp;": '\U00002007',
- "nvDash;": '\U000022AD',
- "nvHarr;": '\U00002904',
- "nvdash;": '\U000022AC',
- "nvinfin;": '\U000029DE',
- "nvlArr;": '\U00002902',
- "nvrArr;": '\U00002903',
- "nwArr;": '\U000021D6',
- "nwarhk;": '\U00002923',
- "nwarr;": '\U00002196',
- "nwarrow;": '\U00002196',
- "nwnear;": '\U00002927',
- "oS;": '\U000024C8',
- "oacute;": '\U000000F3',
- "oast;": '\U0000229B',
- "ocir;": '\U0000229A',
- "ocirc;": '\U000000F4',
- "ocy;": '\U0000043E',
- "odash;": '\U0000229D',
- "odblac;": '\U00000151',
- "odiv;": '\U00002A38',
- "odot;": '\U00002299',
- "odsold;": '\U000029BC',
- "oelig;": '\U00000153',
- "ofcir;": '\U000029BF',
- "ofr;": '\U0001D52C',
- "ogon;": '\U000002DB',
- "ograve;": '\U000000F2',
- "ogt;": '\U000029C1',
- "ohbar;": '\U000029B5',
- "ohm;": '\U000003A9',
- "oint;": '\U0000222E',
- "olarr;": '\U000021BA',
- "olcir;": '\U000029BE',
- "olcross;": '\U000029BB',
- "oline;": '\U0000203E',
- "olt;": '\U000029C0',
- "omacr;": '\U0000014D',
- "omega;": '\U000003C9',
- "omicron;": '\U000003BF',
- "omid;": '\U000029B6',
- "ominus;": '\U00002296',
- "oopf;": '\U0001D560',
- "opar;": '\U000029B7',
- "operp;": '\U000029B9',
- "oplus;": '\U00002295',
- "or;": '\U00002228',
- "orarr;": '\U000021BB',
- "ord;": '\U00002A5D',
- "order;": '\U00002134',
- "orderof;": '\U00002134',
- "ordf;": '\U000000AA',
- "ordm;": '\U000000BA',
- "origof;": '\U000022B6',
- "oror;": '\U00002A56',
- "orslope;": '\U00002A57',
- "orv;": '\U00002A5B',
- "oscr;": '\U00002134',
- "oslash;": '\U000000F8',
- "osol;": '\U00002298',
- "otilde;": '\U000000F5',
- "otimes;": '\U00002297',
- "otimesas;": '\U00002A36',
- "ouml;": '\U000000F6',
- "ovbar;": '\U0000233D',
- "par;": '\U00002225',
- "para;": '\U000000B6',
- "parallel;": '\U00002225',
- "parsim;": '\U00002AF3',
- "parsl;": '\U00002AFD',
- "part;": '\U00002202',
- "pcy;": '\U0000043F',
- "percnt;": '\U00000025',
- "period;": '\U0000002E',
- "permil;": '\U00002030',
- "perp;": '\U000022A5',
- "pertenk;": '\U00002031',
- "pfr;": '\U0001D52D',
- "phi;": '\U000003C6',
- "phiv;": '\U000003D5',
- "phmmat;": '\U00002133',
- "phone;": '\U0000260E',
- "pi;": '\U000003C0',
- "pitchfork;": '\U000022D4',
- "piv;": '\U000003D6',
- "planck;": '\U0000210F',
- "planckh;": '\U0000210E',
- "plankv;": '\U0000210F',
- "plus;": '\U0000002B',
- "plusacir;": '\U00002A23',
- "plusb;": '\U0000229E',
- "pluscir;": '\U00002A22',
- "plusdo;": '\U00002214',
- "plusdu;": '\U00002A25',
- "pluse;": '\U00002A72',
- "plusmn;": '\U000000B1',
- "plussim;": '\U00002A26',
- "plustwo;": '\U00002A27',
- "pm;": '\U000000B1',
- "pointint;": '\U00002A15',
- "popf;": '\U0001D561',
- "pound;": '\U000000A3',
- "pr;": '\U0000227A',
- "prE;": '\U00002AB3',
- "prap;": '\U00002AB7',
- "prcue;": '\U0000227C',
- "pre;": '\U00002AAF',
- "prec;": '\U0000227A',
- "precapprox;": '\U00002AB7',
- "preccurlyeq;": '\U0000227C',
- "preceq;": '\U00002AAF',
- "precnapprox;": '\U00002AB9',
- "precneqq;": '\U00002AB5',
- "precnsim;": '\U000022E8',
- "precsim;": '\U0000227E',
- "prime;": '\U00002032',
- "primes;": '\U00002119',
- "prnE;": '\U00002AB5',
- "prnap;": '\U00002AB9',
- "prnsim;": '\U000022E8',
- "prod;": '\U0000220F',
- "profalar;": '\U0000232E',
- "profline;": '\U00002312',
- "profsurf;": '\U00002313',
- "prop;": '\U0000221D',
- "propto;": '\U0000221D',
- "prsim;": '\U0000227E',
- "prurel;": '\U000022B0',
- "pscr;": '\U0001D4C5',
- "psi;": '\U000003C8',
- "puncsp;": '\U00002008',
- "qfr;": '\U0001D52E',
- "qint;": '\U00002A0C',
- "qopf;": '\U0001D562',
- "qprime;": '\U00002057',
- "qscr;": '\U0001D4C6',
- "quaternions;": '\U0000210D',
- "quatint;": '\U00002A16',
- "quest;": '\U0000003F',
- "questeq;": '\U0000225F',
- "quot;": '\U00000022',
- "rAarr;": '\U000021DB',
- "rArr;": '\U000021D2',
- "rAtail;": '\U0000291C',
- "rBarr;": '\U0000290F',
- "rHar;": '\U00002964',
- "racute;": '\U00000155',
- "radic;": '\U0000221A',
- "raemptyv;": '\U000029B3',
- "rang;": '\U000027E9',
- "rangd;": '\U00002992',
- "range;": '\U000029A5',
- "rangle;": '\U000027E9',
- "raquo;": '\U000000BB',
- "rarr;": '\U00002192',
- "rarrap;": '\U00002975',
- "rarrb;": '\U000021E5',
- "rarrbfs;": '\U00002920',
- "rarrc;": '\U00002933',
- "rarrfs;": '\U0000291E',
- "rarrhk;": '\U000021AA',
- "rarrlp;": '\U000021AC',
- "rarrpl;": '\U00002945',
- "rarrsim;": '\U00002974',
- "rarrtl;": '\U000021A3',
- "rarrw;": '\U0000219D',
- "ratail;": '\U0000291A',
- "ratio;": '\U00002236',
- "rationals;": '\U0000211A',
- "rbarr;": '\U0000290D',
- "rbbrk;": '\U00002773',
- "rbrace;": '\U0000007D',
- "rbrack;": '\U0000005D',
- "rbrke;": '\U0000298C',
- "rbrksld;": '\U0000298E',
- "rbrkslu;": '\U00002990',
- "rcaron;": '\U00000159',
- "rcedil;": '\U00000157',
- "rceil;": '\U00002309',
- "rcub;": '\U0000007D',
- "rcy;": '\U00000440',
- "rdca;": '\U00002937',
- "rdldhar;": '\U00002969',
- "rdquo;": '\U0000201D',
- "rdquor;": '\U0000201D',
- "rdsh;": '\U000021B3',
- "real;": '\U0000211C',
- "realine;": '\U0000211B',
- "realpart;": '\U0000211C',
- "reals;": '\U0000211D',
- "rect;": '\U000025AD',
- "reg;": '\U000000AE',
- "rfisht;": '\U0000297D',
- "rfloor;": '\U0000230B',
- "rfr;": '\U0001D52F',
- "rhard;": '\U000021C1',
- "rharu;": '\U000021C0',
- "rharul;": '\U0000296C',
- "rho;": '\U000003C1',
- "rhov;": '\U000003F1',
- "rightarrow;": '\U00002192',
- "rightarrowtail;": '\U000021A3',
- "rightharpoondown;": '\U000021C1',
- "rightharpoonup;": '\U000021C0',
- "rightleftarrows;": '\U000021C4',
- "rightleftharpoons;": '\U000021CC',
- "rightrightarrows;": '\U000021C9',
- "rightsquigarrow;": '\U0000219D',
- "rightthreetimes;": '\U000022CC',
- "ring;": '\U000002DA',
- "risingdotseq;": '\U00002253',
- "rlarr;": '\U000021C4',
- "rlhar;": '\U000021CC',
- "rlm;": '\U0000200F',
- "rmoust;": '\U000023B1',
- "rmoustache;": '\U000023B1',
- "rnmid;": '\U00002AEE',
- "roang;": '\U000027ED',
- "roarr;": '\U000021FE',
- "robrk;": '\U000027E7',
- "ropar;": '\U00002986',
- "ropf;": '\U0001D563',
- "roplus;": '\U00002A2E',
- "rotimes;": '\U00002A35',
- "rpar;": '\U00000029',
- "rpargt;": '\U00002994',
- "rppolint;": '\U00002A12',
- "rrarr;": '\U000021C9',
- "rsaquo;": '\U0000203A',
- "rscr;": '\U0001D4C7',
- "rsh;": '\U000021B1',
- "rsqb;": '\U0000005D',
- "rsquo;": '\U00002019',
- "rsquor;": '\U00002019',
- "rthree;": '\U000022CC',
- "rtimes;": '\U000022CA',
- "rtri;": '\U000025B9',
- "rtrie;": '\U000022B5',
- "rtrif;": '\U000025B8',
- "rtriltri;": '\U000029CE',
- "ruluhar;": '\U00002968',
- "rx;": '\U0000211E',
- "sacute;": '\U0000015B',
- "sbquo;": '\U0000201A',
- "sc;": '\U0000227B',
- "scE;": '\U00002AB4',
- "scap;": '\U00002AB8',
- "scaron;": '\U00000161',
- "sccue;": '\U0000227D',
- "sce;": '\U00002AB0',
- "scedil;": '\U0000015F',
- "scirc;": '\U0000015D',
- "scnE;": '\U00002AB6',
- "scnap;": '\U00002ABA',
- "scnsim;": '\U000022E9',
- "scpolint;": '\U00002A13',
- "scsim;": '\U0000227F',
- "scy;": '\U00000441',
- "sdot;": '\U000022C5',
- "sdotb;": '\U000022A1',
- "sdote;": '\U00002A66',
- "seArr;": '\U000021D8',
- "searhk;": '\U00002925',
- "searr;": '\U00002198',
- "searrow;": '\U00002198',
- "sect;": '\U000000A7',
- "semi;": '\U0000003B',
- "seswar;": '\U00002929',
- "setminus;": '\U00002216',
- "setmn;": '\U00002216',
- "sext;": '\U00002736',
- "sfr;": '\U0001D530',
- "sfrown;": '\U00002322',
- "sharp;": '\U0000266F',
- "shchcy;": '\U00000449',
- "shcy;": '\U00000448',
- "shortmid;": '\U00002223',
- "shortparallel;": '\U00002225',
- "shy;": '\U000000AD',
- "sigma;": '\U000003C3',
- "sigmaf;": '\U000003C2',
- "sigmav;": '\U000003C2',
- "sim;": '\U0000223C',
- "simdot;": '\U00002A6A',
- "sime;": '\U00002243',
- "simeq;": '\U00002243',
- "simg;": '\U00002A9E',
- "simgE;": '\U00002AA0',
- "siml;": '\U00002A9D',
- "simlE;": '\U00002A9F',
- "simne;": '\U00002246',
- "simplus;": '\U00002A24',
- "simrarr;": '\U00002972',
- "slarr;": '\U00002190',
- "smallsetminus;": '\U00002216',
- "smashp;": '\U00002A33',
- "smeparsl;": '\U000029E4',
- "smid;": '\U00002223',
- "smile;": '\U00002323',
- "smt;": '\U00002AAA',
- "smte;": '\U00002AAC',
- "softcy;": '\U0000044C',
- "sol;": '\U0000002F',
- "solb;": '\U000029C4',
- "solbar;": '\U0000233F',
- "sopf;": '\U0001D564',
- "spades;": '\U00002660',
- "spadesuit;": '\U00002660',
- "spar;": '\U00002225',
- "sqcap;": '\U00002293',
- "sqcup;": '\U00002294',
- "sqsub;": '\U0000228F',
- "sqsube;": '\U00002291',
- "sqsubset;": '\U0000228F',
- "sqsubseteq;": '\U00002291',
- "sqsup;": '\U00002290',
- "sqsupe;": '\U00002292',
- "sqsupset;": '\U00002290',
- "sqsupseteq;": '\U00002292',
- "squ;": '\U000025A1',
- "square;": '\U000025A1',
- "squarf;": '\U000025AA',
- "squf;": '\U000025AA',
- "srarr;": '\U00002192',
- "sscr;": '\U0001D4C8',
- "ssetmn;": '\U00002216',
- "ssmile;": '\U00002323',
- "sstarf;": '\U000022C6',
- "star;": '\U00002606',
- "starf;": '\U00002605',
- "straightepsilon;": '\U000003F5',
- "straightphi;": '\U000003D5',
- "strns;": '\U000000AF',
- "sub;": '\U00002282',
- "subE;": '\U00002AC5',
- "subdot;": '\U00002ABD',
- "sube;": '\U00002286',
- "subedot;": '\U00002AC3',
- "submult;": '\U00002AC1',
- "subnE;": '\U00002ACB',
- "subne;": '\U0000228A',
- "subplus;": '\U00002ABF',
- "subrarr;": '\U00002979',
- "subset;": '\U00002282',
- "subseteq;": '\U00002286',
- "subseteqq;": '\U00002AC5',
- "subsetneq;": '\U0000228A',
- "subsetneqq;": '\U00002ACB',
- "subsim;": '\U00002AC7',
- "subsub;": '\U00002AD5',
- "subsup;": '\U00002AD3',
- "succ;": '\U0000227B',
- "succapprox;": '\U00002AB8',
- "succcurlyeq;": '\U0000227D',
- "succeq;": '\U00002AB0',
- "succnapprox;": '\U00002ABA',
- "succneqq;": '\U00002AB6',
- "succnsim;": '\U000022E9',
- "succsim;": '\U0000227F',
- "sum;": '\U00002211',
- "sung;": '\U0000266A',
- "sup;": '\U00002283',
- "sup1;": '\U000000B9',
- "sup2;": '\U000000B2',
- "sup3;": '\U000000B3',
- "supE;": '\U00002AC6',
- "supdot;": '\U00002ABE',
- "supdsub;": '\U00002AD8',
- "supe;": '\U00002287',
- "supedot;": '\U00002AC4',
- "suphsol;": '\U000027C9',
- "suphsub;": '\U00002AD7',
- "suplarr;": '\U0000297B',
- "supmult;": '\U00002AC2',
- "supnE;": '\U00002ACC',
- "supne;": '\U0000228B',
- "supplus;": '\U00002AC0',
- "supset;": '\U00002283',
- "supseteq;": '\U00002287',
- "supseteqq;": '\U00002AC6',
- "supsetneq;": '\U0000228B',
- "supsetneqq;": '\U00002ACC',
- "supsim;": '\U00002AC8',
- "supsub;": '\U00002AD4',
- "supsup;": '\U00002AD6',
- "swArr;": '\U000021D9',
- "swarhk;": '\U00002926',
- "swarr;": '\U00002199',
- "swarrow;": '\U00002199',
- "swnwar;": '\U0000292A',
- "szlig;": '\U000000DF',
- "target;": '\U00002316',
- "tau;": '\U000003C4',
- "tbrk;": '\U000023B4',
- "tcaron;": '\U00000165',
- "tcedil;": '\U00000163',
- "tcy;": '\U00000442',
- "tdot;": '\U000020DB',
- "telrec;": '\U00002315',
- "tfr;": '\U0001D531',
- "there4;": '\U00002234',
- "therefore;": '\U00002234',
- "theta;": '\U000003B8',
- "thetasym;": '\U000003D1',
- "thetav;": '\U000003D1',
- "thickapprox;": '\U00002248',
- "thicksim;": '\U0000223C',
- "thinsp;": '\U00002009',
- "thkap;": '\U00002248',
- "thksim;": '\U0000223C',
- "thorn;": '\U000000FE',
- "tilde;": '\U000002DC',
- "times;": '\U000000D7',
- "timesb;": '\U000022A0',
- "timesbar;": '\U00002A31',
- "timesd;": '\U00002A30',
- "tint;": '\U0000222D',
- "toea;": '\U00002928',
- "top;": '\U000022A4',
- "topbot;": '\U00002336',
- "topcir;": '\U00002AF1',
- "topf;": '\U0001D565',
- "topfork;": '\U00002ADA',
- "tosa;": '\U00002929',
- "tprime;": '\U00002034',
- "trade;": '\U00002122',
- "triangle;": '\U000025B5',
- "triangledown;": '\U000025BF',
- "triangleleft;": '\U000025C3',
- "trianglelefteq;": '\U000022B4',
- "triangleq;": '\U0000225C',
- "triangleright;": '\U000025B9',
- "trianglerighteq;": '\U000022B5',
- "tridot;": '\U000025EC',
- "trie;": '\U0000225C',
- "triminus;": '\U00002A3A',
- "triplus;": '\U00002A39',
- "trisb;": '\U000029CD',
- "tritime;": '\U00002A3B',
- "trpezium;": '\U000023E2',
- "tscr;": '\U0001D4C9',
- "tscy;": '\U00000446',
- "tshcy;": '\U0000045B',
- "tstrok;": '\U00000167',
- "twixt;": '\U0000226C',
- "twoheadleftarrow;": '\U0000219E',
- "twoheadrightarrow;": '\U000021A0',
- "uArr;": '\U000021D1',
- "uHar;": '\U00002963',
- "uacute;": '\U000000FA',
- "uarr;": '\U00002191',
- "ubrcy;": '\U0000045E',
- "ubreve;": '\U0000016D',
- "ucirc;": '\U000000FB',
- "ucy;": '\U00000443',
- "udarr;": '\U000021C5',
- "udblac;": '\U00000171',
- "udhar;": '\U0000296E',
- "ufisht;": '\U0000297E',
- "ufr;": '\U0001D532',
- "ugrave;": '\U000000F9',
- "uharl;": '\U000021BF',
- "uharr;": '\U000021BE',
- "uhblk;": '\U00002580',
- "ulcorn;": '\U0000231C',
- "ulcorner;": '\U0000231C',
- "ulcrop;": '\U0000230F',
- "ultri;": '\U000025F8',
- "umacr;": '\U0000016B',
- "uml;": '\U000000A8',
- "uogon;": '\U00000173',
- "uopf;": '\U0001D566',
- "uparrow;": '\U00002191',
- "updownarrow;": '\U00002195',
- "upharpoonleft;": '\U000021BF',
- "upharpoonright;": '\U000021BE',
- "uplus;": '\U0000228E',
- "upsi;": '\U000003C5',
- "upsih;": '\U000003D2',
- "upsilon;": '\U000003C5',
- "upuparrows;": '\U000021C8',
- "urcorn;": '\U0000231D',
- "urcorner;": '\U0000231D',
- "urcrop;": '\U0000230E',
- "uring;": '\U0000016F',
- "urtri;": '\U000025F9',
- "uscr;": '\U0001D4CA',
- "utdot;": '\U000022F0',
- "utilde;": '\U00000169',
- "utri;": '\U000025B5',
- "utrif;": '\U000025B4',
- "uuarr;": '\U000021C8',
- "uuml;": '\U000000FC',
- "uwangle;": '\U000029A7',
- "vArr;": '\U000021D5',
- "vBar;": '\U00002AE8',
- "vBarv;": '\U00002AE9',
- "vDash;": '\U000022A8',
- "vangrt;": '\U0000299C',
- "varepsilon;": '\U000003F5',
- "varkappa;": '\U000003F0',
- "varnothing;": '\U00002205',
- "varphi;": '\U000003D5',
- "varpi;": '\U000003D6',
- "varpropto;": '\U0000221D',
- "varr;": '\U00002195',
- "varrho;": '\U000003F1',
- "varsigma;": '\U000003C2',
- "vartheta;": '\U000003D1',
- "vartriangleleft;": '\U000022B2',
- "vartriangleright;": '\U000022B3',
- "vcy;": '\U00000432',
- "vdash;": '\U000022A2',
- "vee;": '\U00002228',
- "veebar;": '\U000022BB',
- "veeeq;": '\U0000225A',
- "vellip;": '\U000022EE',
- "verbar;": '\U0000007C',
- "vert;": '\U0000007C',
- "vfr;": '\U0001D533',
- "vltri;": '\U000022B2',
- "vopf;": '\U0001D567',
- "vprop;": '\U0000221D',
- "vrtri;": '\U000022B3',
- "vscr;": '\U0001D4CB',
- "vzigzag;": '\U0000299A',
- "wcirc;": '\U00000175',
- "wedbar;": '\U00002A5F',
- "wedge;": '\U00002227',
- "wedgeq;": '\U00002259',
- "weierp;": '\U00002118',
- "wfr;": '\U0001D534',
- "wopf;": '\U0001D568',
- "wp;": '\U00002118',
- "wr;": '\U00002240',
- "wreath;": '\U00002240',
- "wscr;": '\U0001D4CC',
- "xcap;": '\U000022C2',
- "xcirc;": '\U000025EF',
- "xcup;": '\U000022C3',
- "xdtri;": '\U000025BD',
- "xfr;": '\U0001D535',
- "xhArr;": '\U000027FA',
- "xharr;": '\U000027F7',
- "xi;": '\U000003BE',
- "xlArr;": '\U000027F8',
- "xlarr;": '\U000027F5',
- "xmap;": '\U000027FC',
- "xnis;": '\U000022FB',
- "xodot;": '\U00002A00',
- "xopf;": '\U0001D569',
- "xoplus;": '\U00002A01',
- "xotime;": '\U00002A02',
- "xrArr;": '\U000027F9',
- "xrarr;": '\U000027F6',
- "xscr;": '\U0001D4CD',
- "xsqcup;": '\U00002A06',
- "xuplus;": '\U00002A04',
- "xutri;": '\U000025B3',
- "xvee;": '\U000022C1',
- "xwedge;": '\U000022C0',
- "yacute;": '\U000000FD',
- "yacy;": '\U0000044F',
- "ycirc;": '\U00000177',
- "ycy;": '\U0000044B',
- "yen;": '\U000000A5',
- "yfr;": '\U0001D536',
- "yicy;": '\U00000457',
- "yopf;": '\U0001D56A',
- "yscr;": '\U0001D4CE',
- "yucy;": '\U0000044E',
- "yuml;": '\U000000FF',
- "zacute;": '\U0000017A',
- "zcaron;": '\U0000017E',
- "zcy;": '\U00000437',
- "zdot;": '\U0000017C',
- "zeetrf;": '\U00002128',
- "zeta;": '\U000003B6',
- "zfr;": '\U0001D537',
- "zhcy;": '\U00000436',
- "zigrarr;": '\U000021DD',
- "zopf;": '\U0001D56B',
- "zscr;": '\U0001D4CF',
- "zwj;": '\U0000200D',
- "zwnj;": '\U0000200C',
- "AElig": '\U000000C6',
- "AMP": '\U00000026',
- "Aacute": '\U000000C1',
- "Acirc": '\U000000C2',
- "Agrave": '\U000000C0',
- "Aring": '\U000000C5',
- "Atilde": '\U000000C3',
- "Auml": '\U000000C4',
- "COPY": '\U000000A9',
- "Ccedil": '\U000000C7',
- "ETH": '\U000000D0',
- "Eacute": '\U000000C9',
- "Ecirc": '\U000000CA',
- "Egrave": '\U000000C8',
- "Euml": '\U000000CB',
- "GT": '\U0000003E',
- "Iacute": '\U000000CD',
- "Icirc": '\U000000CE',
- "Igrave": '\U000000CC',
- "Iuml": '\U000000CF',
- "LT": '\U0000003C',
- "Ntilde": '\U000000D1',
- "Oacute": '\U000000D3',
- "Ocirc": '\U000000D4',
- "Ograve": '\U000000D2',
- "Oslash": '\U000000D8',
- "Otilde": '\U000000D5',
- "Ouml": '\U000000D6',
- "QUOT": '\U00000022',
- "REG": '\U000000AE',
- "THORN": '\U000000DE',
- "Uacute": '\U000000DA',
- "Ucirc": '\U000000DB',
- "Ugrave": '\U000000D9',
- "Uuml": '\U000000DC',
- "Yacute": '\U000000DD',
- "aacute": '\U000000E1',
- "acirc": '\U000000E2',
- "acute": '\U000000B4',
- "aelig": '\U000000E6',
- "agrave": '\U000000E0',
- "amp": '\U00000026',
- "aring": '\U000000E5',
- "atilde": '\U000000E3',
- "auml": '\U000000E4',
- "brvbar": '\U000000A6',
- "ccedil": '\U000000E7',
- "cedil": '\U000000B8',
- "cent": '\U000000A2',
- "copy": '\U000000A9',
- "curren": '\U000000A4',
- "deg": '\U000000B0',
- "divide": '\U000000F7',
- "eacute": '\U000000E9',
- "ecirc": '\U000000EA',
- "egrave": '\U000000E8',
- "eth": '\U000000F0',
- "euml": '\U000000EB',
- "frac12": '\U000000BD',
- "frac14": '\U000000BC',
- "frac34": '\U000000BE',
- "gt": '\U0000003E',
- "iacute": '\U000000ED',
- "icirc": '\U000000EE',
- "iexcl": '\U000000A1',
- "igrave": '\U000000EC',
- "iquest": '\U000000BF',
- "iuml": '\U000000EF',
- "laquo": '\U000000AB',
- "lt": '\U0000003C',
- "macr": '\U000000AF',
- "micro": '\U000000B5',
- "middot": '\U000000B7',
- "nbsp": '\U000000A0',
- "not": '\U000000AC',
- "ntilde": '\U000000F1',
- "oacute": '\U000000F3',
- "ocirc": '\U000000F4',
- "ograve": '\U000000F2',
- "ordf": '\U000000AA',
- "ordm": '\U000000BA',
- "oslash": '\U000000F8',
- "otilde": '\U000000F5',
- "ouml": '\U000000F6',
- "para": '\U000000B6',
- "plusmn": '\U000000B1',
- "pound": '\U000000A3',
- "quot": '\U00000022',
- "raquo": '\U000000BB',
- "reg": '\U000000AE',
- "sect": '\U000000A7',
- "shy": '\U000000AD',
- "sup1": '\U000000B9',
- "sup2": '\U000000B2',
- "sup3": '\U000000B3',
- "szlig": '\U000000DF',
- "thorn": '\U000000FE',
- "times": '\U000000D7',
- "uacute": '\U000000FA',
- "ucirc": '\U000000FB',
- "ugrave": '\U000000F9',
- "uml": '\U000000A8',
- "uuml": '\U000000FC',
- "yacute": '\U000000FD',
- "yen": '\U000000A5',
- "yuml": '\U000000FF',
-}
-
-// HTML entities that are two unicode codepoints.
-var entity2 = map[string][2]rune{
- // TODO(nigeltao): Handle replacements that are wider than their names.
- // "nLt;": {'\u226A', '\u20D2'},
- // "nGt;": {'\u226B', '\u20D2'},
- "NotEqualTilde;": {'\u2242', '\u0338'},
- "NotGreaterFullEqual;": {'\u2267', '\u0338'},
- "NotGreaterGreater;": {'\u226B', '\u0338'},
- "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'},
- "NotHumpDownHump;": {'\u224E', '\u0338'},
- "NotHumpEqual;": {'\u224F', '\u0338'},
- "NotLeftTriangleBar;": {'\u29CF', '\u0338'},
- "NotLessLess;": {'\u226A', '\u0338'},
- "NotLessSlantEqual;": {'\u2A7D', '\u0338'},
- "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'},
- "NotNestedLessLess;": {'\u2AA1', '\u0338'},
- "NotPrecedesEqual;": {'\u2AAF', '\u0338'},
- "NotRightTriangleBar;": {'\u29D0', '\u0338'},
- "NotSquareSubset;": {'\u228F', '\u0338'},
- "NotSquareSuperset;": {'\u2290', '\u0338'},
- "NotSubset;": {'\u2282', '\u20D2'},
- "NotSucceedsEqual;": {'\u2AB0', '\u0338'},
- "NotSucceedsTilde;": {'\u227F', '\u0338'},
- "NotSuperset;": {'\u2283', '\u20D2'},
- "ThickSpace;": {'\u205F', '\u200A'},
- "acE;": {'\u223E', '\u0333'},
- "bne;": {'\u003D', '\u20E5'},
- "bnequiv;": {'\u2261', '\u20E5'},
- "caps;": {'\u2229', '\uFE00'},
- "cups;": {'\u222A', '\uFE00'},
- "fjlig;": {'\u0066', '\u006A'},
- "gesl;": {'\u22DB', '\uFE00'},
- "gvertneqq;": {'\u2269', '\uFE00'},
- "gvnE;": {'\u2269', '\uFE00'},
- "lates;": {'\u2AAD', '\uFE00'},
- "lesg;": {'\u22DA', '\uFE00'},
- "lvertneqq;": {'\u2268', '\uFE00'},
- "lvnE;": {'\u2268', '\uFE00'},
- "nGg;": {'\u22D9', '\u0338'},
- "nGtv;": {'\u226B', '\u0338'},
- "nLl;": {'\u22D8', '\u0338'},
- "nLtv;": {'\u226A', '\u0338'},
- "nang;": {'\u2220', '\u20D2'},
- "napE;": {'\u2A70', '\u0338'},
- "napid;": {'\u224B', '\u0338'},
- "nbump;": {'\u224E', '\u0338'},
- "nbumpe;": {'\u224F', '\u0338'},
- "ncongdot;": {'\u2A6D', '\u0338'},
- "nedot;": {'\u2250', '\u0338'},
- "nesim;": {'\u2242', '\u0338'},
- "ngE;": {'\u2267', '\u0338'},
- "ngeqq;": {'\u2267', '\u0338'},
- "ngeqslant;": {'\u2A7E', '\u0338'},
- "nges;": {'\u2A7E', '\u0338'},
- "nlE;": {'\u2266', '\u0338'},
- "nleqq;": {'\u2266', '\u0338'},
- "nleqslant;": {'\u2A7D', '\u0338'},
- "nles;": {'\u2A7D', '\u0338'},
- "notinE;": {'\u22F9', '\u0338'},
- "notindot;": {'\u22F5', '\u0338'},
- "nparsl;": {'\u2AFD', '\u20E5'},
- "npart;": {'\u2202', '\u0338'},
- "npre;": {'\u2AAF', '\u0338'},
- "npreceq;": {'\u2AAF', '\u0338'},
- "nrarrc;": {'\u2933', '\u0338'},
- "nrarrw;": {'\u219D', '\u0338'},
- "nsce;": {'\u2AB0', '\u0338'},
- "nsubE;": {'\u2AC5', '\u0338'},
- "nsubset;": {'\u2282', '\u20D2'},
- "nsubseteqq;": {'\u2AC5', '\u0338'},
- "nsucceq;": {'\u2AB0', '\u0338'},
- "nsupE;": {'\u2AC6', '\u0338'},
- "nsupset;": {'\u2283', '\u20D2'},
- "nsupseteqq;": {'\u2AC6', '\u0338'},
- "nvap;": {'\u224D', '\u20D2'},
- "nvge;": {'\u2265', '\u20D2'},
- "nvgt;": {'\u003E', '\u20D2'},
- "nvle;": {'\u2264', '\u20D2'},
- "nvlt;": {'\u003C', '\u20D2'},
- "nvltrie;": {'\u22B4', '\u20D2'},
- "nvrtrie;": {'\u22B5', '\u20D2'},
- "nvsim;": {'\u223C', '\u20D2'},
- "race;": {'\u223D', '\u0331'},
- "smtes;": {'\u2AAC', '\uFE00'},
- "sqcaps;": {'\u2293', '\uFE00'},
- "sqcups;": {'\u2294', '\uFE00'},
- "varsubsetneq;": {'\u228A', '\uFE00'},
- "varsubsetneqq;": {'\u2ACB', '\uFE00'},
- "varsupsetneq;": {'\u228B', '\uFE00'},
- "varsupsetneqq;": {'\u2ACC', '\uFE00'},
- "vnsub;": {'\u2282', '\u20D2'},
- "vnsup;": {'\u2283', '\u20D2'},
- "vsubnE;": {'\u2ACB', '\uFE00'},
- "vsubne;": {'\u228A', '\uFE00'},
- "vsupnE;": {'\u2ACC', '\uFE00'},
- "vsupne;": {'\u228B', '\uFE00'},
-}
diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go
deleted file mode 100644
index 12f2273706..0000000000
--- a/vendor/golang.org/x/net/html/escape.go
+++ /dev/null
@@ -1,339 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package html
-
-import (
- "bytes"
- "strings"
- "unicode/utf8"
-)
-
-// These replacements permit compatibility with old numeric entities that
-// assumed Windows-1252 encoding.
-// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference
-var replacementTable = [...]rune{
- '\u20AC', // First entry is what 0x80 should be replaced with.
- '\u0081',
- '\u201A',
- '\u0192',
- '\u201E',
- '\u2026',
- '\u2020',
- '\u2021',
- '\u02C6',
- '\u2030',
- '\u0160',
- '\u2039',
- '\u0152',
- '\u008D',
- '\u017D',
- '\u008F',
- '\u0090',
- '\u2018',
- '\u2019',
- '\u201C',
- '\u201D',
- '\u2022',
- '\u2013',
- '\u2014',
- '\u02DC',
- '\u2122',
- '\u0161',
- '\u203A',
- '\u0153',
- '\u009D',
- '\u017E',
- '\u0178', // Last entry is 0x9F.
- // 0x00->'\uFFFD' is handled programmatically.
- // 0x0D->'\u000D' is a no-op.
-}
-
-// unescapeEntity reads an entity like "<" from b[src:] and writes the
-// corresponding "<" to b[dst:], returning the incremented dst and src cursors.
-// Precondition: b[src] == '&' && dst <= src.
-// attribute should be true if parsing an attribute value.
-func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) {
- // https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference
-
- // i starts at 1 because we already know that s[0] == '&'.
- i, s := 1, b[src:]
-
- if len(s) <= 1 {
- b[dst] = b[src]
- return dst + 1, src + 1
- }
-
- if s[i] == '#' {
- if len(s) <= 3 { // We need to have at least ".".
- b[dst] = b[src]
- return dst + 1, src + 1
- }
- i++
- c := s[i]
- hex := false
- if c == 'x' || c == 'X' {
- hex = true
- i++
- }
-
- x := '\x00'
- for i < len(s) {
- c = s[i]
- i++
- if hex {
- if '0' <= c && c <= '9' {
- x = 16*x + rune(c) - '0'
- continue
- } else if 'a' <= c && c <= 'f' {
- x = 16*x + rune(c) - 'a' + 10
- continue
- } else if 'A' <= c && c <= 'F' {
- x = 16*x + rune(c) - 'A' + 10
- continue
- }
- } else if '0' <= c && c <= '9' {
- x = 10*x + rune(c) - '0'
- continue
- }
- if c != ';' {
- i--
- }
- break
- }
-
- if i <= 3 { // No characters matched.
- b[dst] = b[src]
- return dst + 1, src + 1
- }
-
- if 0x80 <= x && x <= 0x9F {
- // Replace characters from Windows-1252 with UTF-8 equivalents.
- x = replacementTable[x-0x80]
- } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF {
- // Replace invalid characters with the replacement character.
- x = '\uFFFD'
- }
-
- return dst + utf8.EncodeRune(b[dst:], x), src + i
- }
-
- // Consume the maximum number of characters possible, with the
- // consumed characters matching one of the named references.
-
- for i < len(s) {
- c := s[i]
- i++
- // Lower-cased characters are more common in entities, so we check for them first.
- if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' {
- continue
- }
- if c != ';' {
- i--
- }
- break
- }
-
- entityName := string(s[1:i])
- if entityName == "" {
- // No-op.
- } else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' {
- // No-op.
- } else if x := entity[entityName]; x != 0 {
- return dst + utf8.EncodeRune(b[dst:], x), src + i
- } else if x := entity2[entityName]; x[0] != 0 {
- dst1 := dst + utf8.EncodeRune(b[dst:], x[0])
- return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i
- } else if !attribute {
- maxLen := len(entityName) - 1
- if maxLen > longestEntityWithoutSemicolon {
- maxLen = longestEntityWithoutSemicolon
- }
- for j := maxLen; j > 1; j-- {
- if x := entity[entityName[:j]]; x != 0 {
- return dst + utf8.EncodeRune(b[dst:], x), src + j + 1
- }
- }
- }
-
- dst1, src1 = dst+i, src+i
- copy(b[dst:dst1], b[src:src1])
- return dst1, src1
-}
-
-// unescape unescapes b's entities in-place, so that "a<b" becomes "a' byte that, per above, we'd like to avoid escaping unless we have to.
-//
-// Studying the summary table (and T actions in its '>' column) closely, we
-// only need to escape in states 43, 44, 49, 51 and 52. State 43 is at the
-// start of the comment data. State 52 is after a '!'. The other three states
-// are after a '-'.
-//
-// Our algorithm is thus to escape every '&' and to escape '>' if and only if:
-// - The '>' is after a '!' or '-' (in the unescaped data) or
-// - The '>' is at the start of the comment data (after the opening ""); err != nil {
- return err
- }
- return nil
- case DoctypeNode:
- if _, err := w.WriteString("')
- case RawNode:
- _, err := w.WriteString(n.Data)
- return err
- default:
- return errors.New("html: unknown node type")
- }
-
- // Render the opening tag.
- if err := w.WriteByte('<'); err != nil {
- return err
- }
- if _, err := w.WriteString(n.Data); err != nil {
- return err
- }
- for _, a := range n.Attr {
- if err := w.WriteByte(' '); err != nil {
- return err
- }
- if a.Namespace != "" {
- if _, err := w.WriteString(a.Namespace); err != nil {
- return err
- }
- if err := w.WriteByte(':'); err != nil {
- return err
- }
- }
- if _, err := w.WriteString(a.Key); err != nil {
- return err
- }
- if _, err := w.WriteString(`="`); err != nil {
- return err
- }
- if err := escape(w, a.Val); err != nil {
- return err
- }
- if err := w.WriteByte('"'); err != nil {
- return err
- }
- }
- if voidElements[n.Data] {
- if n.FirstChild != nil {
- return fmt.Errorf("html: void element <%s> has child nodes", n.Data)
- }
- _, err := w.WriteString("/>")
- return err
- }
- if err := w.WriteByte('>'); err != nil {
- return err
- }
-
- // Add initial newline where there is danger of a newline being ignored.
- if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") {
- switch n.Data {
- case "pre", "listing", "textarea":
- if err := w.WriteByte('\n'); err != nil {
- return err
- }
- }
- }
-
- // Render any child nodes
- if childTextNodesAreLiteral(n) {
- for c := n.FirstChild; c != nil; c = c.NextSibling {
- if c.Type == TextNode {
- if _, err := w.WriteString(c.Data); err != nil {
- return err
- }
- } else {
- if err := render1(w, c); err != nil {
- return err
- }
- }
- }
- if n.Data == "plaintext" {
- // Don't render anything else. must be the
- // last element in the file, with no closing tag.
- return plaintextAbort
- }
- } else {
- for c := n.FirstChild; c != nil; c = c.NextSibling {
- if err := render1(w, c); err != nil {
- return err
- }
- }
- }
-
- // Render the closing tag.
- if _, err := w.WriteString(""); err != nil {
- return err
- }
- if _, err := w.WriteString(n.Data); err != nil {
- return err
- }
- return w.WriteByte('>')
-}
-
-func childTextNodesAreLiteral(n *Node) bool {
- // Per WHATWG HTML 13.3, if the parent of the current node is a style,
- // script, xmp, iframe, noembed, noframes, or plaintext element, and the
- // current node is a text node, append the value of the node's data
- // literally. The specification is not explicit about it, but we only
- // enforce this if we are in the HTML namespace (i.e. when the namespace is
- // "").
- // NOTE: we also always include noscript elements, although the
- // specification states that they should only be rendered as such if
- // scripting is enabled for the node (which is not something we track).
- if n.Namespace != "" {
- return false
- }
-
- switch n.Data {
- case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "xmp":
- // We need to check if n is a node that was fostered from a HTML namespace
- // into a non-HTML namespace (in which case, different rules apply to it).
- // We do this by walking up the tree until we find a node with a non-empty
- // namespace. If we find such a node, we also have to check if it's
- // an HTML integration point. If it isn't, then the node we're currently
- // looking at is foster-parented and we should return false.
- for p := n.Parent; p != nil; p = p.Parent {
- if p.Namespace != "" {
- if !htmlIntegrationPoint(p) {
- return false
- }
- break
- }
- }
-
- return true
- default:
- return false
- }
-}
-
-// writeDoctypeQuoted writes s to w surrounded by quotes. Normally it will use double
-// quotes, but if s contains a double quote, it will use single quotes.
-// If s contains any '>' characters, they are replaced with > in order
-// to prevent triggering an abrupt-doctype-system-identifier parse error.
-// It is used for writing the identifiers in a doctype declaration.
-// In valid HTML, they can't contain both types of quotes.
-func writeDoctypeQuoted(w writer, s string) error {
- var q byte = '"'
- if strings.Contains(s, `"`) {
- // parseDoctype will never produce a Node with both quote types, but a user
- // can construct their own Node that violates this assumption.
- if strings.Contains(s, `'`) {
- return errors.New("doctype contains both quote types, cannot be safely rendered")
- }
- q = '\''
- }
- if err := w.WriteByte(q); err != nil {
- return err
- }
- if _, err := w.WriteString(strings.ReplaceAll(s, ">", ">")); err != nil {
- return err
- }
- if err := w.WriteByte(q); err != nil {
- return err
- }
- return nil
-}
-
-// Section 12.1.2, "Elements", gives this list of void elements. Void elements
-// are those that can't have any contents.
-var voidElements = map[string]bool{
- "area": true,
- "base": true,
- "br": true,
- "col": true,
- "embed": true,
- "hr": true,
- "img": true,
- "input": true,
- "keygen": true, // "keygen" has been removed from the spec, but are kept here for backwards compatibility.
- "link": true,
- "meta": true,
- "param": true,
- "source": true,
- "track": true,
- "wbr": true,
-}
diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go
deleted file mode 100644
index 058dfb2164..0000000000
--- a/vendor/golang.org/x/net/html/token.go
+++ /dev/null
@@ -1,1291 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package html
-
-import (
- "bytes"
- "errors"
- "io"
- "strconv"
- "strings"
-
- "golang.org/x/net/html/atom"
-)
-
-// A TokenType is the type of a Token.
-type TokenType uint32
-
-const (
- // ErrorToken means that an error occurred during tokenization.
- ErrorToken TokenType = iota
- // TextToken means a text node.
- TextToken
- // A StartTagToken looks like .
- StartTagToken
- // An EndTagToken looks like .
- EndTagToken
- // A SelfClosingTagToken tag looks like .
- SelfClosingTagToken
- // A CommentToken looks like .
- CommentToken
- // A DoctypeToken looks like
- DoctypeToken
-)
-
-// ErrBufferExceeded means that the buffering limit was exceeded.
-var ErrBufferExceeded = errors.New("max buffer exceeded")
-
-// String returns a string representation of the TokenType.
-func (t TokenType) String() string {
- switch t {
- case ErrorToken:
- return "Error"
- case TextToken:
- return "Text"
- case StartTagToken:
- return "StartTag"
- case EndTagToken:
- return "EndTag"
- case SelfClosingTagToken:
- return "SelfClosingTag"
- case CommentToken:
- return "Comment"
- case DoctypeToken:
- return "Doctype"
- }
- return "Invalid(" + strconv.Itoa(int(t)) + ")"
-}
-
-// An Attribute is an attribute namespace-key-value triple. Namespace is
-// non-empty for foreign attributes like xlink, Key is alphabetic (and hence
-// does not contain escapable characters like '&', '<' or '>'), and Val is
-// unescaped (it looks like "a"
- case EndTagToken:
- return "" + t.tagString() + ">"
- case SelfClosingTagToken:
- return "<" + t.tagString() + "/>"
- case CommentToken:
- return ""
- case DoctypeToken:
- return ""
- }
- return "Invalid(" + strconv.Itoa(int(t.Type)) + ")"
-}
-
-// span is a range of bytes in a Tokenizer's buffer. The start is inclusive,
-// the end is exclusive.
-type span struct {
- start, end int
-}
-
-// A Tokenizer returns a stream of HTML Tokens.
-type Tokenizer struct {
- // r is the source of the HTML text.
- r io.Reader
- // tt is the TokenType of the current token.
- tt TokenType
- // err is the first error encountered during tokenization. It is possible
- // for tt != Error && err != nil to hold: this means that Next returned a
- // valid token but the subsequent Next call will return an error token.
- // For example, if the HTML text input was just "plain", then the first
- // Next call would set z.err to io.EOF but return a TextToken, and all
- // subsequent Next calls would return an ErrorToken.
- // err is never reset. Once it becomes non-nil, it stays non-nil.
- err error
- // readErr is the error returned by the io.Reader r. It is separate from
- // err because it is valid for an io.Reader to return (n int, err1 error)
- // such that n > 0 && err1 != nil, and callers should always process the
- // n > 0 bytes before considering the error err1.
- readErr error
- // buf[raw.start:raw.end] holds the raw bytes of the current token.
- // buf[raw.end:] is buffered input that will yield future tokens.
- raw span
- buf []byte
- // maxBuf limits the data buffered in buf. A value of 0 means unlimited.
- maxBuf int
- // buf[data.start:data.end] holds the raw bytes of the current token's data:
- // a text token's text, a tag token's tag name, etc.
- data span
- // pendingAttr is the attribute key and value currently being tokenized.
- // When complete, pendingAttr is pushed onto attr. nAttrReturned is
- // incremented on each call to TagAttr.
- pendingAttr [2]span
- attr [][2]span
- attrNames map[string]bool
- nAttrReturned int
- // rawTag is the "script" in "" that closes the next token. If
- // non-empty, the subsequent call to Next will return a raw or RCDATA text
- // token: one that treats "
" as text instead of an element.
- // rawTag's contents are lower-cased.
- rawTag string
- // textIsRaw is whether the current text token's data is not escaped.
- textIsRaw bool
- // convertNUL is whether NUL bytes in the current token's data should
- // be converted into \ufffd replacement characters.
- convertNUL bool
- // allowCDATA is whether CDATA sections are allowed in the current context.
- allowCDATA bool
-}
-
-// AllowCDATA sets whether or not the tokenizer recognizes as
-// the text "foo". The default value is false, which means to recognize it as
-// a bogus comment "" instead.
-//
-// Strictly speaking, an HTML5 compliant tokenizer should allow CDATA if and
-// only if tokenizing foreign content, such as MathML and SVG. However,
-// tracking foreign-contentness is difficult to do purely in the tokenizer,
-// as opposed to the parser, due to HTML integration points: an